Skip to main content
Module

x/i18next/ResourceStore.js

i18next: learn once - translate everywhere
Go to Latest
File
import EventEmitter from './EventEmitter.js';import * as utils from './utils.js';
class ResourceStore extends EventEmitter { constructor(data, options = { ns: ['translation'], defaultNS: 'translation' }) { super();
this.data = data || {}; this.options = options; if (this.options.keySeparator === undefined) { this.options.keySeparator = '.'; } if (this.options.ignoreJSONStructure === undefined) { this.options.ignoreJSONStructure = true; } }
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;
const ignoreJSONStructure = options.ignoreJSONStructure !== undefined ? options.ignoreJSONStructure : this.options.ignoreJSONStructure;
let path; if (lng.indexOf('.') > -1) { path = lng.split('.'); } else { path = [lng, ns]; if (key) { if (Array.isArray(key)) { path.push(...key); } else if (typeof key === 'string' && keySeparator) { path.push(...key.split(keySeparator)); } else { path.push(key); } } }
const result = utils.getPath(this.data, path); if (!result && !ns && !key && lng.indexOf('.') > -1) { lng = path[0]; ns = path[1]; key = path.slice(2).join('.'); } if (result || !ignoreJSONStructure || typeof key !== 'string') return result;
return utils.deepFind(this.data && this.data[lng] && this.data[lng][ns], key, keySeparator); }
addResource(lng, ns, key, value, options = { silent: false }) { const keySeparator = options.keySeparator !== undefined ? options.keySeparator : this.options.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, skipCopy: 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 (!options.skipCopy) resources = JSON.parse(JSON.stringify(resources)); // make a copy to fix #2081
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]; }
hasLanguageSomeTranslations(lng) { const data = this.getDataByLanguage(lng); const n = (data && Object.keys(data)) || []; return !!n.find((v) => data[v] && Object.keys(data[v]).length > 0); }
toJSON() { return this.data; }}
export default ResourceStore;