From cd96ee8456194e4a9557151c63a8bdbbe691c258 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0t=C4=9Bp=C3=A1n=20Gran=C3=A1t?= Date: Fri, 11 Mar 2022 09:02:41 +0100 Subject: [PATCH] fix: Make language stable --- packages/core/src/Properties.test.ts | 13 ++++++++++ packages/core/src/Properties.ts | 38 +++++++++++++++------------- 2 files changed, 34 insertions(+), 17 deletions(-) diff --git a/packages/core/src/Properties.test.ts b/packages/core/src/Properties.test.ts index 5bcee7c8af..20ff08e898 100644 --- a/packages/core/src/Properties.test.ts +++ b/packages/core/src/Properties.test.ts @@ -96,6 +96,19 @@ describe('Properties', () => { expect(properties.currentLanguage).toEqual('cs'); }); + test('language is stored locally and detected only once', () => { + const languageGetter = jest.spyOn(window.navigator, 'language', 'get'); + languageGetter.mockReturnValue('cs'); + Storage.prototype.getItem = jest.fn(); + properties.config = new TolgeeConfig({ + availableLanguages: ['cs', 'en'], + }); + expect(properties.currentLanguage).toEqual('cs'); + expect(properties.currentLanguage).toEqual('cs'); + + expect(languageGetter).toBeCalledTimes(1); + }); + test('available languages derrived from staticData', () => { const languageGetter = jest.spyOn(window.navigator, 'language', 'get'); languageGetter.mockReturnValue('cs'); diff --git a/packages/core/src/Properties.ts b/packages/core/src/Properties.ts index bfefdcfdec..a11a1b099e 100644 --- a/packages/core/src/Properties.ts +++ b/packages/core/src/Properties.ts @@ -15,25 +15,11 @@ export class Properties { return this.config.forceLanguage; } - if (this._currentLanguage) { - return this._currentLanguage; + if (!this._currentLanguage) { + this._currentLanguage = this.getInitialLanguage(); } - if (this.config.enableLanguageStore) { - const storedLanguage = this.getStoredLanguage(); - if (storedLanguage) { - return storedLanguage; - } - } - - if (this.config.enableLanguageDetection) { - const detectedLanguage = this.getLanguageByNavigator(); - if (detectedLanguage) { - return detectedLanguage; - } - } - - return this.config.defaultLanguage; + return this._currentLanguage; } set currentLanguage(language: string) { @@ -63,6 +49,24 @@ export class Properties { ); } + private getInitialLanguage() { + if (this.config.enableLanguageStore) { + const storedLanguage = this.getStoredLanguage(); + if (storedLanguage) { + return storedLanguage; + } + } + + if (this.config.enableLanguageDetection) { + const detectedLanguage = this.getLanguageByNavigator(); + if (detectedLanguage) { + return detectedLanguage; + } + } + + return this.config.defaultLanguage; + } + private getStoredLanguage() { if (typeof localStorage !== 'undefined') { const storedLanguage = localStorage.getItem(