core-resource-app-test
Version:
App that contains assets and scripts for the core apps
312 lines (231 loc) • 13.3 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
var _logger = require('./logger.js');
var _logger2 = _interopRequireDefault(_logger);
var _EventEmitter2 = require('./EventEmitter.js');
var _EventEmitter3 = _interopRequireDefault(_EventEmitter2);
var _postProcessor = require('./postProcessor.js');
var _postProcessor2 = _interopRequireDefault(_postProcessor);
var _utils = require('./utils.js');
var utils = _interopRequireWildcard(_utils);
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass); }
var Translator = function (_EventEmitter) {
_inherits(Translator, _EventEmitter);
function Translator(services) {
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
_classCallCheck(this, Translator);
var _this = _possibleConstructorReturn(this, _EventEmitter.call(this));
utils.copy(['resourceStore', 'languageUtils', 'pluralResolver', 'interpolator', 'backendConnector'], services, _this);
_this.options = options;
_this.logger = _logger2.default.create('translator');
return _this;
}
Translator.prototype.changeLanguage = function changeLanguage(lng) {
if (lng) this.language = lng;
};
Translator.prototype.exists = function exists(key) {
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : { interpolation: {} };
var resolved = this.resolve(key, options);
return resolved && resolved.res !== undefined;
};
Translator.prototype.extractFromKey = function extractFromKey(key, options) {
var nsSeparator = options.nsSeparator || this.options.nsSeparator;
if (nsSeparator === undefined) nsSeparator = ':';
var keySeparator = options.keySeparator || this.options.keySeparator || '.';
var namespaces = options.ns || this.options.defaultNS;
if (nsSeparator && key.indexOf(nsSeparator) > -1) {
var parts = key.split(nsSeparator);
if (nsSeparator !== keySeparator || nsSeparator === keySeparator && this.options.ns.indexOf(parts[0]) > -1) namespaces = parts.shift();
key = parts.join(keySeparator);
}
if (typeof namespaces === 'string') namespaces = [namespaces];
return {
key: key,
namespaces: namespaces
};
};
Translator.prototype.translate = function translate(keys) {
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
if ((typeof options === 'undefined' ? 'undefined' : _typeof(options)) !== 'object') {
/* eslint prefer-rest-params: 0 */
options = this.options.overloadTranslationOptionHandler(arguments);
}
// non valid keys handling
if (keys === undefined || keys === null || keys === '') return '';
if (typeof keys === 'number') keys = String(keys);
if (typeof keys === 'string') keys = [keys];
// separators
var keySeparator = options.keySeparator || this.options.keySeparator || '.';
// get namespace(s)
var _extractFromKey = this.extractFromKey(keys[keys.length - 1], options),
key = _extractFromKey.key,
namespaces = _extractFromKey.namespaces;
var namespace = namespaces[namespaces.length - 1];
// return key on CIMode
var lng = options.lng || this.language;
var appendNamespaceToCIMode = options.appendNamespaceToCIMode || this.options.appendNamespaceToCIMode;
if (lng && lng.toLowerCase() === 'cimode') {
if (appendNamespaceToCIMode) {
var nsSeparator = options.nsSeparator || this.options.nsSeparator;
return namespace + nsSeparator + key;
}
return key;
}
// resolve from store
var resolved = this.resolve(keys, options);
var res = resolved && resolved.res;
var usedKey = resolved && resolved.usedKey || key;
var resType = Object.prototype.toString.apply(res);
var noObject = ['[object Number]', '[object Function]', '[object RegExp]'];
var joinArrays = options.joinArrays !== undefined ? options.joinArrays : this.options.joinArrays;
// object
if (res && typeof res !== 'string' && noObject.indexOf(resType) < 0 && !(joinArrays && resType === '[object Array]')) {
if (!options.returnObjects && !this.options.returnObjects) {
this.logger.warn('accessing an object - but returnObjects options is not enabled!');
return this.options.returnedObjectHandler ? this.options.returnedObjectHandler(usedKey, res, options) : 'key \'' + key + ' (' + this.language + ')\' returned an object instead of string.';
}
// if we got a separator we loop over children - else we just return object as is
// as having it set to false means no hierarchy so no lookup for nested values
if (options.keySeparator || this.options.keySeparator) {
var copy = resType === '[object Array]' ? [] : {}; // apply child translation on a copy
/* eslint no-restricted-syntax: 0 */
for (var m in res) {
if (Object.prototype.hasOwnProperty.call(res, m)) {
copy[m] = this.translate('' + usedKey + keySeparator + m, _extends({}, options, { joinArrays: false, ns: namespaces }));
}
}
res = copy;
}
} else if (joinArrays && resType === '[object Array]') {
// array special treatment
res = res.join(joinArrays);
if (res) res = this.extendTranslation(res, keys, options);
} else {
// string, empty or null
var usedDefault = false;
var _usedKey = false;
// fallback value
if (!this.isValidLookup(res) && options.defaultValue !== undefined) {
usedDefault = true;
res = options.defaultValue;
}
if (!this.isValidLookup(res)) {
_usedKey = true;
res = key;
}
// save missing
if (_usedKey || usedDefault) {
this.logger.log('missingKey', lng, namespace, key, res);
var lngs = [];
var fallbackLngs = this.languageUtils.getFallbackCodes(this.options.fallbackLng, options.lng || this.language);
if (this.options.saveMissingTo === 'fallback' && fallbackLngs && fallbackLngs[0]) {
for (var i = 0; i < fallbackLngs.length; i++) {
lngs.push(fallbackLngs[i]);
}
} else if (this.options.saveMissingTo === 'all') {
lngs = this.languageUtils.toResolveHierarchy(options.lng || this.language);
} else {
lngs.push(options.lng || this.language);
}
if (this.options.saveMissing) {
if (this.options.missingKeyHandler) {
this.options.missingKeyHandler(lngs, namespace, key, res);
} else if (this.backendConnector && this.backendConnector.saveMissing) {
this.backendConnector.saveMissing(lngs, namespace, key, res);
}
}
this.emit('missingKey', lngs, namespace, key, res);
}
// extend
res = this.extendTranslation(res, keys, options);
// append namespace if still key
if (_usedKey && res === key && this.options.appendNamespaceToMissingKey) res = namespace + ':' + key;
// parseMissingKeyHandler
if (_usedKey && this.options.parseMissingKeyHandler) res = this.options.parseMissingKeyHandler(res);
}
// return
return res;
};
Translator.prototype.extendTranslation = function extendTranslation(res, key, options) {
var _this2 = this;
if (options.interpolation) this.interpolator.init(_extends({}, options, { interpolation: _extends({}, this.options.interpolation, options.interpolation) }));
// interpolate
var data = options.replace && typeof options.replace !== 'string' ? options.replace : options;
if (this.options.interpolation.defaultVariables) data = _extends({}, this.options.interpolation.defaultVariables, data);
res = this.interpolator.interpolate(res, data, options.lng || this.language);
// nesting
if (options.nest !== false) res = this.interpolator.nest(res, function () {
return _this2.translate.apply(_this2, arguments);
}, options);
if (options.interpolation) this.interpolator.reset();
// post process
var postProcess = options.postProcess || this.options.postProcess;
var postProcessorNames = typeof postProcess === 'string' ? [postProcess] : postProcess;
if (res !== undefined && postProcessorNames && postProcessorNames.length && options.applyPostProcessor !== false) {
res = _postProcessor2.default.handle(postProcessorNames, res, key, options, this);
}
return res;
};
Translator.prototype.resolve = function resolve(keys) {
var _this3 = this;
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var found = void 0;
var usedKey = void 0;
if (typeof keys === 'string') keys = [keys];
// forEach possible key
keys.forEach(function (k) {
if (_this3.isValidLookup(found)) return;
var extracted = _this3.extractFromKey(k, options);
var key = extracted.key;
usedKey = key;
var namespaces = extracted.namespaces;
if (_this3.options.fallbackNS) namespaces = namespaces.concat(_this3.options.fallbackNS);
var needsPluralHandling = options.count !== undefined && typeof options.count !== 'string';
var needsContextHandling = options.context !== undefined && typeof options.context === 'string' && options.context !== '';
var codes = options.lngs ? options.lngs : _this3.languageUtils.toResolveHierarchy(options.lng || _this3.language);
namespaces.forEach(function (ns) {
if (_this3.isValidLookup(found)) return;
codes.forEach(function (code) {
if (_this3.isValidLookup(found)) return;
var finalKey = key;
var finalKeys = [finalKey];
var pluralSuffix = void 0;
if (needsPluralHandling) pluralSuffix = _this3.pluralResolver.getSuffix(code, options.count);
// fallback for plural if context not found
if (needsPluralHandling && needsContextHandling) finalKeys.push(finalKey + pluralSuffix);
// get key for context if needed
if (needsContextHandling) finalKeys.push(finalKey += '' + _this3.options.contextSeparator + options.context);
// get key for plural if needed
if (needsPluralHandling) finalKeys.push(finalKey += pluralSuffix);
// iterate over finalKeys starting with most specific pluralkey (-> contextkey only) -> singularkey only
var possibleKey = void 0;
/* eslint no-cond-assign: 0 */
while (possibleKey = finalKeys.pop()) {
if (!_this3.isValidLookup(found)) {
found = _this3.getResource(code, ns, possibleKey, options);
}
}
});
});
});
return { res: found, usedKey: usedKey };
};
Translator.prototype.isValidLookup = function isValidLookup(res) {
return res !== undefined && !(!this.options.returnNull && res === null) && !(!this.options.returnEmptyString && res === '');
};
Translator.prototype.getResource = function getResource(code, ns, key) {
var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
return this.resourceStore.getResource(code, ns, key, options);
};
return Translator;
}(_EventEmitter3.default);
exports.default = Translator;