From c22a53038668e85fe7248a244ea050ab328a0271 Mon Sep 17 00:00:00 2001 From: Luke Williams Date: Sun, 19 Apr 2020 21:06:20 +0200 Subject: [PATCH] html10n: do a lax match between the Accept-Language header and available locales Before this change, we simply generated an error. For example: - if the browser sent 'ru-RU', but Etherpad has 'ru' available, select 'ru'; - if the browser sent 'zh', but we have 'zh-hans' available, use 'zh-hans'. Fixes #3882. --- src/static/js/html10n.js | 40 +++++++++++++++++++++++++++++++--------- 1 file changed, 31 insertions(+), 9 deletions(-) diff --git a/src/static/js/html10n.js b/src/static/js/html10n.js index 8fbc6f64344..ee7eec0a77d 100644 --- a/src/static/js/html10n.js +++ b/src/static/js/html10n.js @@ -179,18 +179,40 @@ window.html10n = (function(window, document, undefined) { return } - // dat alng ain't here, man! + // Check if lang exists if (!data[lang]) { - var msg = 'Couldn\'t find translations for '+lang - , l - if(~lang.indexOf('-')) lang = lang.split('-')[0] // then let's try related langs - for(l in data) { - if(lang != l && l.indexOf(lang) === 0 && data[l]) { - lang = l - break; + // 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 + } + + // Check if ROOT lang exists (e.g 'ru') + if (!data[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 + + for (l in data) { + // 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') + break; + } + } + + // Did we find a variant? If not, return err. + if (lang != l) { + return cb(new Error(msg)); } } - if(lang != l) return cb(new Error(msg)) } if ('string' == typeof data[lang]) {