From b18cf9a531037a1b4cd1b48a1a4b563f96c5bb5c Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Fri, 15 Sep 2023 10:41:58 +0200 Subject: [PATCH] core-app-api: switch default message strategy to make all messages available Signed-off-by: Patrik Oldsberg --- .../I18nextTranslationApi.test.ts | 9 ++--- .../TranslationApi/I18nextTranslationApi.ts | 36 +++++++++++-------- 2 files changed, 26 insertions(+), 19 deletions(-) diff --git a/packages/core-app-api/src/apis/implementations/TranslationApi/I18nextTranslationApi.test.ts b/packages/core-app-api/src/apis/implementations/TranslationApi/I18nextTranslationApi.test.ts index 9929bacfd1..00669121d5 100644 --- a/packages/core-app-api/src/apis/implementations/TranslationApi/I18nextTranslationApi.test.ts +++ b/packages/core-app-api/src/apis/implementations/TranslationApi/I18nextTranslationApi.test.ts @@ -121,13 +121,14 @@ describe('I18nextTranslationApi', () => { languageApi, resources: [ createTranslationMessages({ - ref: plainRef, - messages: { foo: 'Bar' }, + ref: resourceRef, + messages: { foo: 'Foo Override' }, }), ], }); - const snapshot = assertReady(translationApi.getTranslation(plainRef)); - expect(snapshot.t('foo')).toBe('Bar'); + const snapshot = assertReady(translationApi.getTranslation(resourceRef)); + expect(snapshot.t('foo')).toBe('Foo Override'); + expect(snapshot.t('bar')).toBe('Bar'); }); it('should create an instance and ignore null overrides', () => { diff --git a/packages/core-app-api/src/apis/implementations/TranslationApi/I18nextTranslationApi.ts b/packages/core-app-api/src/apis/implementations/TranslationApi/I18nextTranslationApi.ts index 2b9c0493b2..dfcfa9081e 100644 --- a/packages/core-app-api/src/apis/implementations/TranslationApi/I18nextTranslationApi.ts +++ b/packages/core-app-api/src/apis/implementations/TranslationApi/I18nextTranslationApi.ts @@ -61,9 +61,6 @@ function removeNulls( * loaded or not, so instead we implement our own resource loader. */ class ResourceLoader { - /** The resources that have been registered */ - #seen = new Set(); - /** Loaded resources by loader key */ #loaded = new Set(); /** Resource loading promises by loader key */ @@ -80,10 +77,6 @@ class ResourceLoader { ) {} addTranslationResource(resource: TranslationResource) { - if (this.#seen.has(resource)) { - return; - } - this.#seen.add(resource); const internalResource = toInternalTranslationResource(resource); for (const entry of internalResource.resources) { const key = this.#getLoaderKey(entry.language, internalResource.id); @@ -205,6 +198,9 @@ export class I18nextTranslationApi implements TranslationApi { #loader: ResourceLoader; #language: string; + /** Keep track of which refs we have registered default resources for */ + #registeredRefs = new Set(); + private constructor(i18n: I18n, loader: ResourceLoader, language: string) { this.#i18n = i18n; this.#loader = loader; @@ -216,7 +212,7 @@ export class I18nextTranslationApi implements TranslationApi { ): TranslationSnapshot { const internalRef = toInternalTranslationRef(translationRef); - this.#registerDefaultResource(internalRef); + this.#registerDefaults(internalRef); return this.#createSnapshot(internalRef); } @@ -226,7 +222,7 @@ export class I18nextTranslationApi implements TranslationApi { ): Observable> { const internalRef = toInternalTranslationRef(translationRef); - this.#registerDefaultResource(internalRef); + this.#registerDefaults(internalRef); return new ObservableImpl>(subscriber => { let loadTicket = {}; // To check for stale loads @@ -299,20 +295,30 @@ export class I18nextTranslationApi implements TranslationApi { } const t = this.#i18n.getFixedT(null, internalRef.id); - const defaultMessages = internalRef.getDefaultMessages() as TMessages; return { ready: true, t: (key, options) => { - return t(key as string, { - ...options, - defaultValue: defaultMessages[key], - }); + return t(key as string, { ...options }); }, }; } - #registerDefaultResource(internalRef: InternalTranslationRef): void { + #registerDefaults(internalRef: InternalTranslationRef): void { + if (this.#registeredRefs.has(internalRef.id)) { + return; + } + this.#registeredRefs.add(internalRef.id); + + const defaultMessages = internalRef.getDefaultMessages(); + this.#i18n.addResourceBundle( + DEFAULT_LANGUAGE, + internalRef.id, + defaultMessages, + true, // merge with existing translations + false, // do not overwrite translations + ); + const defaultResource = internalRef.getDefaultResource(); if (defaultResource) { this.#loader.addTranslationResource(defaultResource);