From c9dc8f00f9c574b082c6ae63c3f59777764837da Mon Sep 17 00:00:00 2001 From: smitten Date: Mon, 30 Oct 2023 18:54:07 -0400 Subject: [PATCH 1/2] Use window.navigator.language before interface i18n language --- src/services/locale/locale.service.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/services/locale/locale.service.js b/src/services/locale/locale.service.js index 8cef2522..c4f8ce21 100644 --- a/src/services/locale/locale.service.js +++ b/src/services/locale/locale.service.js @@ -8,7 +8,7 @@ const specialLanguageCodes = { 'zh': 'zh-Hans' } -const internalToBrowserLocale = code => specialLanguageCodes[code] || code +const internalToBrowserLocale = fallbackCode => specialLanguageCodes[fallbackCode] || window.navigator.language || fallbackCode const internalToBackendLocale = code => internalToBrowserLocale(code).replace('_', '-') From 1b28ec3b72fde74265df4150be39295b0ae1a345 Mon Sep 17 00:00:00 2001 From: smitten Date: Wed, 1 Nov 2023 23:10:57 -0400 Subject: [PATCH 2/2] Match UI i18n configuration to browser locales --- src/services/locale/locale.service.js | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/src/services/locale/locale.service.js b/src/services/locale/locale.service.js index c4f8ce21..607cd447 100644 --- a/src/services/locale/locale.service.js +++ b/src/services/locale/locale.service.js @@ -8,7 +8,30 @@ const specialLanguageCodes = { 'zh': 'zh-Hans' } -const internalToBrowserLocale = fallbackCode => specialLanguageCodes[fallbackCode] || window.navigator.language || fallbackCode +// Find a browser language that matches the configured UI language. +// Browser language should match the configured generic short code prefix: +// eg 'en-GB' browser language matches 'en' UI language. +const findBrowserRegionMatch = genericLang => { + for (const blang of window.navigator.languages) { + if (genericLang === blang.split('-')[0]) + return blang; + } + return null; +} + +const internalToBrowserLocale = (() => { + const resolvedBrowserLocales = {} + + return i18nLocale => { + if (resolvedBrowserLocales[i18nLocale]) { + return resolvedBrowserLocales[i18nLocale] + } + const lang = specialLanguageCodes[i18nLocale] || i18nLocale; + const resolved = findBrowserRegionMatch(lang) || lang; + resolvedBrowserLocales[i18nLocale] = resolved + return resolved + } +})() const internalToBackendLocale = code => internalToBrowserLocale(code).replace('_', '-')