diff --git a/static/skin/i18n.js b/static/skin/i18n.js
index e937eda3..ed92d6f3 100644
--- a/static/skin/i18n.js
+++ b/static/skin/i18n.js
@@ -104,11 +104,31 @@ const DEFAULT_UI_LANGUAGE = 'en';
Translations.load(DEFAULT_UI_LANGUAGE, /*asDefault=*/true);
+// Below function selects the most suitable UI language from the list
+// of preferred languages in browser preferences and available translations.
+// Since, unlike Accept-Language header, navigator.languages doesn't contain
+// qvalues, they are computed using the same algorithm as in Firefox 121
+function getDefaultUserLanguage() {
+ const mostSuitableLang = { code: DEFAULT_UI_LANGUAGE, score: 0 }
+ const n = navigator.languages.length;
+ for (const lang of uiLanguages ) {
+ const rank = navigator.languages.indexOf(lang.iso_code);
+ if ( rank >= 0 ) {
+ const qvalue = Math.round(10*(1 - rank/n))/10;
+ const score = qvalue * lang.translation_count;
+ if ( score > mostSuitableLang.score ) {
+ mostSuitableLang.code = lang.iso_code;
+ mostSuitableLang.score = score;
+ }
+ }
+ }
+ return mostSuitableLang.code;
+}
+
function getUserLanguage() {
return new URLSearchParams(window.location.search).get('userlang')
|| window.localStorage.getItem('userlang')
- || viewerSettings.defaultUserLanguage
- || DEFAULT_UI_LANGUAGE;
+ || getDefaultUserLanguage();
}
function setUserLanguage(lang, callback) {
diff --git a/test/server.cpp b/test/server.cpp
index c22bffe8..74e082c1 100644
--- a/test/server.cpp
+++ b/test/server.cpp
@@ -59,7 +59,7 @@ const ResourceCollection resources200Compressible{
{ DYNAMIC_CONTENT, "/ROOT%23%3F/skin/autoComplete/css/autoComplete.css" },
{ STATIC_CONTENT, "/ROOT%23%3F/skin/autoComplete/css/autoComplete.css?cacheid=ef30cd42" },
{ DYNAMIC_CONTENT, "/ROOT%23%3F/skin/i18n.js" },
- { STATIC_CONTENT, "/ROOT%23%3F/skin/i18n.js?cacheid=0b99e7a9" },
+ { STATIC_CONTENT, "/ROOT%23%3F/skin/i18n.js?cacheid=071abc9a" },
{ DYNAMIC_CONTENT, "/ROOT%23%3F/skin/index.css" },
{ STATIC_CONTENT, "/ROOT%23%3F/skin/index.css?cacheid=1e78e7cf" },
{ DYNAMIC_CONTENT, "/ROOT%23%3F/skin/index.js" },
@@ -285,7 +285,7 @@ R"EXPECTEDRESULT( href="/ROOT%23%3F/skin/kiwix.css?cacheid=2158fad9"
-
+
@@ -318,7 +318,7 @@ R"EXPECTEDRESULT(
-
+