From 83fb7c5e16ef77fb00a175c3736d828180283731 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Sat, 16 Sep 2023 12:33:46 +0200 Subject: [PATCH] core-app-api: avoid trying to load failed translations again Signed-off-by: Patrik Oldsberg --- .../TranslationApi/I18nextTranslationApi.test.ts | 5 ++++- .../TranslationApi/I18nextTranslationApi.ts | 14 ++++++++++---- 2 files changed, 14 insertions(+), 5 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 425b2d74e2..2b96f4cc4f 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 @@ -255,7 +255,7 @@ describe('I18nextTranslationApi', () => { expect(snapshot.t('bar')).toBe('Bär'); }); - it('should forward loading errors', async () => { + it('should forward loading errors and then ignore them', async () => { const languageApi = AppLanguageSelector.create(); const translationApi = I18nextTranslationApi.create({ languageApi, @@ -270,6 +270,9 @@ describe('I18nextTranslationApi', () => { await expect( waitForNext(translationApi.translation$(plainRef), s => s.ready), ).rejects.toThrow('NOPE'); + + const snapshot = assertReady(translationApi.getTranslation(plainRef)); + expect(snapshot.t('foo')).toBe('Foo'); }); it('should only call the loader once', async () => { 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 b55ef44071..49fb12de46 100644 --- a/packages/core-app-api/src/apis/implementations/TranslationApi/I18nextTranslationApi.ts +++ b/packages/core-app-api/src/apis/implementations/TranslationApi/I18nextTranslationApi.ts @@ -121,10 +121,16 @@ class ResourceLoader { return; } - const load = loader().then(result => { - this.onLoad({ language, namespace, messages: result.messages }); - this.#loaded.add(key); - }); + const load = loader().then( + result => { + this.onLoad({ language, namespace, messages: result.messages }); + this.#loaded.add(key); + }, + error => { + this.#loaded.add(key); // Do not try to load failed resources again + throw error; + }, + ); this.#loading.set(key, load); await load; }