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';
function deepFind(obj, path, keySeparator = '.') { if (!obj) return undefined; if (obj[path]) return obj[path]; const paths = path.split(keySeparator); let current = obj; for (let i = 0; i < paths.length; ++i) { if (!current) return undefined; if (typeof current[paths[i]] === 'string' && i + 1 < paths.length) { return undefined; } if (current[paths[i]] === undefined) { let j = 2; let p = paths.slice(i, i + j).join(keySeparator); let mix = current[p]; while (mix === undefined && paths.length > i + j) { j++; p = paths.slice(i, i + j).join(keySeparator); mix = current[p]; } if (mix === undefined) return undefined; if (path.endsWith(p)) { if (typeof mix === 'string') return mix; if (p && typeof mix[p] === 'string') return mix[p]; } const joinedPath = paths.slice(i + j).join(keySeparator); if (joinedPath) return deepFind(mix, joinedPath, keySeparator); return undefined; } current = current[paths[i]]; } return current;}
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 = '.'; } 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 = [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('.'); }
const result = utils.getPath(this.data, path); if (result || !ignoreJSONStructure || typeof key !== 'string') return result;
return deepFind(this.data && this.data[lng] && this.data[lng][ns], key, keySeparator); }
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]; }
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;