From c9dc8f00f9c574b082c6ae63c3f59777764837da Mon Sep 17 00:00:00 2001
From: smitten <everything-cozy@pm.me>
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 <everything-cozy@pm.me>
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('_', '-')