From e5dab19844cef1051a0eac187a9f6765f063ccd0 Mon Sep 17 00:00:00 2001 From: Veloman Yunkan Date: Sun, 28 Jan 2024 17:51:50 +0400 Subject: [PATCH] Default UI language is resolved in the frontend This change eliminates any need for defaultUserLanguage in viewer_settings.js. --- static/skin/i18n.js | 24 ++++++++++++++++++++++-- test/server.cpp | 6 +++--- 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/static/skin/i18n.js b/static/skin/i18n.js index e937eda3e..ed92d6f34 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 c22bffe88..74e082c16 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( - +