From 2e76ca00b924c0d2e180b72c2a7ef67a4b332955 Mon Sep 17 00:00:00 2001 From: Lars den Bakker Date: Sat, 25 May 2019 14:31:38 +0200 Subject: [PATCH] feat(localize): allow custom locale when loading namespaces --- packages/localize/src/LocalizeManager.js | 12 +++--- .../localize/test/LocalizeManager.test.js | 43 +++++++++++++++++++ 2 files changed, 49 insertions(+), 6 deletions(-) diff --git a/packages/localize/src/LocalizeManager.js b/packages/localize/src/LocalizeManager.js index fce8d9762..67af4ae7f 100644 --- a/packages/localize/src/LocalizeManager.js +++ b/packages/localize/src/LocalizeManager.js @@ -59,25 +59,25 @@ export class LocalizeManager extends LionSingleton { this.__namespacePatternsMap.set(pattern, loader); } - loadNamespaces(namespaces) { - return Promise.all(namespaces.map(namespace => this.loadNamespace(namespace))); + loadNamespaces(namespaces, { locale } = {}) { + 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 namespace = isDynamicImport ? Object.keys(namespaceObj)[0] : namespaceObj; - if (this._isNamespaceInCache(this.locale, namespace)) { + if (this._isNamespaceInCache(locale, namespace)) { return Promise.resolve(); } - const existingLoaderPromise = this._getCachedNamespaceLoaderPromise(this.locale, namespace); + const existingLoaderPromise = this._getCachedNamespaceLoaderPromise(locale, namespace); if (existingLoaderPromise) { return existingLoaderPromise; } - return this._loadNamespaceData(this.locale, namespaceObj, isDynamicImport, namespace); + return this._loadNamespaceData(locale, namespaceObj, isDynamicImport, namespace); } msg(keys, vars, opts = {}) { diff --git a/packages/localize/test/LocalizeManager.test.js b/packages/localize/test/LocalizeManager.test.js index 92ebb01c6..ab262cb0e 100644 --- a/packages/localize/test/LocalizeManager.test.js +++ b/packages/localize/test/LocalizeManager.test.js @@ -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 () => { setupFakeImport('./my-defaults/en-GB.js', { default: { submit: 'Submit' } }); 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 () => { setupFakeImport('./my-component/en.js', { default: { greeting: 'Hello!' } });