Merge pull request #69 from ing-bank/feat/load-namespace-locale

Allow custom locale when loading namespaces
This commit is contained in:
Mikhail Bashkirov 2019-06-06 09:08:21 +02:00 committed by GitHub
commit 3b00c68107
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 49 additions and 6 deletions

View file

@ -59,25 +59,25 @@ export class LocalizeManager extends LionSingleton {
this.__namespacePatternsMap.set(pattern, loader); this.__namespacePatternsMap.set(pattern, loader);
} }
loadNamespaces(namespaces) { loadNamespaces(namespaces, { locale } = {}) {
return Promise.all(namespaces.map(namespace => this.loadNamespace(namespace))); return Promise.all(namespaces.map(namespace => this.loadNamespace(namespace, { locale })));
} }
loadNamespace(namespaceObj) { loadNamespace(namespaceObj, { locale = this.locale } = { locale: this.locale }) {
const isDynamicImport = typeof namespaceObj === 'object'; const isDynamicImport = typeof namespaceObj === 'object';
const namespace = isDynamicImport ? Object.keys(namespaceObj)[0] : namespaceObj; const namespace = isDynamicImport ? Object.keys(namespaceObj)[0] : namespaceObj;
if (this._isNamespaceInCache(this.locale, namespace)) { if (this._isNamespaceInCache(locale, namespace)) {
return Promise.resolve(); return Promise.resolve();
} }
const existingLoaderPromise = this._getCachedNamespaceLoaderPromise(this.locale, namespace); const existingLoaderPromise = this._getCachedNamespaceLoaderPromise(locale, namespace);
if (existingLoaderPromise) { if (existingLoaderPromise) {
return existingLoaderPromise; return existingLoaderPromise;
} }
return this._loadNamespaceData(this.locale, namespaceObj, isDynamicImport, namespace); return this._loadNamespaceData(locale, namespaceObj, isDynamicImport, namespace);
} }
msg(keys, vars, opts = {}) { msg(keys, vars, opts = {}) {

View file

@ -116,6 +116,26 @@ describe('LocalizeManager', () => {
}); });
}); });
it('can load a namespace for a different locale', async () => {
setupFakeImport('./my-component/nl-NL.js', { default: { greeting: 'Hello!' } });
const manager = new LocalizeManager();
manager.locale = 'en-US';
await manager.loadNamespace(
{
'my-component': locale => fakeImport(`./my-component/${locale}.js`),
},
{ locale: 'nl-NL' },
);
expect(manager.__storage).to.deep.equal({
'nl-NL': {
'my-component': { greeting: 'Hello!' },
},
});
});
it('loads multiple namespaces via loadNamespaces()', async () => { it('loads multiple namespaces via loadNamespaces()', async () => {
setupFakeImport('./my-defaults/en-GB.js', { default: { submit: 'Submit' } }); setupFakeImport('./my-defaults/en-GB.js', { default: { submit: 'Submit' } });
setupFakeImport('./my-send-button/en-GB.js', { default: { submit: 'Send' } }); setupFakeImport('./my-send-button/en-GB.js', { default: { submit: 'Send' } });
@ -135,6 +155,29 @@ describe('LocalizeManager', () => {
}); });
}); });
it('can load multiple namespaces for a different locale', async () => {
setupFakeImport('./my-defaults/nl-NL.js', { default: { submit: 'Submit' } });
setupFakeImport('./my-send-button/nl-NL.js', { default: { submit: 'Send' } });
const manager = new LocalizeManager();
manager.locale = 'en-US';
await manager.loadNamespaces(
[
{ 'my-defaults': locale => fakeImport(`./my-defaults/${locale}.js`) },
{ 'my-send-button': locale => fakeImport(`./my-send-button/${locale}.js`) },
],
{ locale: 'nl-NL' },
);
expect(manager.__storage).to.deep.equal({
'nl-NL': {
'my-defaults': { submit: 'Submit' },
'my-send-button': { submit: 'Send' },
},
});
});
it('fallbacks to language file if locale file is not found', async () => { it('fallbacks to language file if locale file is not found', async () => {
setupFakeImport('./my-component/en.js', { default: { greeting: 'Hello!' } }); setupFakeImport('./my-component/en.js', { default: { greeting: 'Hello!' } });