Skip to content

Commit

Permalink
Fix Accept-Language detection
Browse files Browse the repository at this point in the history
Bug: ether#6129
Follows-Up: ether#3882
Change-Id: Ie3fcec84948fde36fa12448d5eabaf05f79f1283
  • Loading branch information
winstonsung committed Feb 8, 2024
1 parent b105866 commit cf90b3b
Showing 1 changed file with 50 additions and 11 deletions.
61 changes: 50 additions & 11 deletions src/static/js/vendors/html10n.js
Original file line number Diff line number Diff line change
Expand Up @@ -181,21 +181,60 @@ window.html10n = (function(window, document, undefined) {
return
}

// Issue #6129: Fix exceptions caused by browsers
// Also for fallback, see BCP 47 RFC 4647 section 3.4
function getBcp47LangTag(browserLang) {
var lang = browserLang.toLowerCase();
// Browser => BCP 47
var langCodeMap = {
'zh-cn': 'zh-Hans-CN',
'zh-hk': 'zh-Hant-HK',
'zh-mo': 'zh-Hant-MO',
'zh-my': 'zh-Hans-MY',
'zh-sg': 'zh-Hans-SG',
'zh-tw': 'zh-Hant-TW',
};

return langCodeMap[lang] ?? browserLang;
}

// Issue #6129: Fix exceptions
function getJsonLangCode(bcp47Lang) {
var lang = bcp47Lang.toLowerCase();
// BCP 47 => JSON
var langCodeMap = {
'sr-cyrl': 'sr-ec',
'sr-latn': 'sr-el',
'zh-hant-hk': 'zh-hk',
};

return langCodeMap[lang] ?? lang;
}

// translatewiki.net use all lowercase form by default ('en-gb' insted of 'en-GB')
bcp47LangTag = getBcp47LangTag(lang).toLowerCase();

// Check if lang exists
if (!data[lang]) {
if (!data[getJsonLangCode(bcp47LangTag)]) {
// lang not found
// This may be due to formatting (expected 'ru' but browser sent 'ru-RU')
// Set err msg before mutating lang (we may need this later)
var msg = 'Couldn\'t find translations for ' + lang;

// Check for '-' ('ROOT-VARIANT')
if (lang.indexOf('-') > -1) {
// ROOT-VARIANT formatting detected
lang = lang.split('-')[0]; // set lang to ROOT lang
var msg = 'Couldn\'t find translations for ' + lang +
'(BCP 47 lang tag ' + bcp47LangTag +
', JSON lang code ' + getJsonLangCode(bcp47LangTag) + ')';

// Check for '-' (BCP 47 'ROOT-SCRIPT-REGION-VARIANT') and fallback until found data or ROOT
// - 'ROOT-SCRIPT-REGION': 'zh-Hans-CN'
// - 'ROOT-SCRIPT': 'zh-Hans'
// - 'ROOT-REGION': 'en-GB'
// - 'ROOT-VARIANT': 'be-tarask'
while (!data[getJsonLangCode(lang)] && lang.lastIndexOf('-') > -1) {
// ROOT-SCRIPT-REGION-VARIANT formatting detected
lang = lang.substring(0, lang.lastIndexOf('-')); // set lang to ROOT lang
}

// Check if ROOT lang exists (e.g 'ru')
if (!data[lang]) {
// Check if already found data or ROOT lang exists (e.g 'ru')
if (!data[getJsonLangCode(lang)]) {
// ROOT lang not found. (e.g 'zh')
// Loop through langs data. Maybe we have a variant? e.g (zh-hans)
var l; // langs item. Declare outside of loop
Expand All @@ -204,8 +243,8 @@ window.html10n = (function(window, document, undefined) {
// Is not ROOT?
// And index of ROOT equals 0?
// And is known lang?
if (lang != l && l.indexOf(lang) === 0 && data[l]) {
lang = l; // set lang to ROOT-VARIANT (e.g 'zh-hans')
if (lang != l && l.indexOf(lang) === 0 && data[getJsonLangCode(l)]) {
lang = l; // set lang to ROOT-SCRIPT (e.g 'zh-hans')
break;
}
}
Expand Down

0 comments on commit cf90b3b

Please sign in to comment.