135 lines
3.3 KiB
JavaScript
135 lines
3.3 KiB
JavaScript
import EventEmitter from './EventEmitter.js';
|
|
import * as utils from './utils.js';
|
|
|
|
class ResourceStore extends EventEmitter {
|
|
constructor(data, options = { ns: ['translation'], defaultNS: 'translation' }) {
|
|
super();
|
|
if (utils.isIE10) {
|
|
EventEmitter.call(this); // <=IE10 fix (unable to call parent constructor)
|
|
}
|
|
|
|
this.data = data || {};
|
|
this.options = options;
|
|
if (this.options.keySeparator === undefined) {
|
|
this.options.keySeparator = '.';
|
|
}
|
|
}
|
|
|
|
addNamespaces(ns) {
|
|
if (this.options.ns.indexOf(ns) < 0) {
|
|
this.options.ns.push(ns);
|
|
}
|
|
}
|
|
|
|
removeNamespaces(ns) {
|
|
const index = this.options.ns.indexOf(ns);
|
|
if (index > -1) {
|
|
this.options.ns.splice(index, 1);
|
|
}
|
|
}
|
|
|
|
getResource(lng, ns, key, options = {}) {
|
|
const keySeparator =
|
|
options.keySeparator !== undefined ? options.keySeparator : this.options.keySeparator;
|
|
|
|
let path = [lng, ns];
|
|
if (key && typeof key !== 'string') path = path.concat(key);
|
|
if (key && typeof key === 'string')
|
|
path = path.concat(keySeparator ? key.split(keySeparator) : key);
|
|
|
|
if (lng.indexOf('.') > -1) {
|
|
path = lng.split('.');
|
|
}
|
|
|
|
return utils.getPath(this.data, path);
|
|
}
|
|
|
|
addResource(lng, ns, key, value, options = { silent: false }) {
|
|
let keySeparator = this.options.keySeparator;
|
|
if (keySeparator === undefined) keySeparator = '.';
|
|
|
|
let path = [lng, ns];
|
|
if (key) path = path.concat(keySeparator ? key.split(keySeparator) : key);
|
|
|
|
if (lng.indexOf('.') > -1) {
|
|
path = lng.split('.');
|
|
value = ns;
|
|
ns = path[1];
|
|
}
|
|
|
|
this.addNamespaces(ns);
|
|
|
|
utils.setPath(this.data, path, value);
|
|
|
|
if (!options.silent) this.emit('added', lng, ns, key, value);
|
|
}
|
|
|
|
addResources(lng, ns, resources, options = { silent: false }) {
|
|
/* eslint no-restricted-syntax: 0 */
|
|
for (const m in resources) {
|
|
if (
|
|
typeof resources[m] === 'string' ||
|
|
Object.prototype.toString.apply(resources[m]) === '[object Array]'
|
|
)
|
|
this.addResource(lng, ns, m, resources[m], { silent: true });
|
|
}
|
|
if (!options.silent) this.emit('added', lng, ns, resources);
|
|
}
|
|
|
|
addResourceBundle(lng, ns, resources, deep, overwrite, options = { silent: false }) {
|
|
let path = [lng, ns];
|
|
if (lng.indexOf('.') > -1) {
|
|
path = lng.split('.');
|
|
deep = resources;
|
|
resources = ns;
|
|
ns = path[1];
|
|
}
|
|
|
|
this.addNamespaces(ns);
|
|
|
|
let pack = utils.getPath(this.data, path) || {};
|
|
|
|
if (deep) {
|
|
utils.deepExtend(pack, resources, overwrite);
|
|
} else {
|
|
pack = { ...pack, ...resources };
|
|
}
|
|
|
|
utils.setPath(this.data, path, pack);
|
|
|
|
if (!options.silent) this.emit('added', lng, ns, resources);
|
|
}
|
|
|
|
removeResourceBundle(lng, ns) {
|
|
if (this.hasResourceBundle(lng, ns)) {
|
|
delete this.data[lng][ns];
|
|
}
|
|
this.removeNamespaces(ns);
|
|
|
|
this.emit('removed', lng, ns);
|
|
}
|
|
|
|
hasResourceBundle(lng, ns) {
|
|
return this.getResource(lng, ns) !== undefined;
|
|
}
|
|
|
|
getResourceBundle(lng, ns) {
|
|
if (!ns) ns = this.options.defaultNS;
|
|
|
|
// COMPATIBILITY: remove extend in v2.1.0
|
|
if (this.options.compatibilityAPI === 'v1') return { ...{}, ...this.getResource(lng, ns) };
|
|
|
|
return this.getResource(lng, ns);
|
|
}
|
|
|
|
getDataByLanguage(lng) {
|
|
return this.data[lng];
|
|
}
|
|
|
|
toJSON() {
|
|
return this.data;
|
|
}
|
|
}
|
|
|
|
export default ResourceStore;
|