diff --git a/modules/util/detect.js b/modules/util/detect.js index a4cf24d7d..1a3928c33 100644 --- a/modules/util/detect.js +++ b/modules/util/detect.js @@ -59,14 +59,34 @@ export function utilDetect(force) { // Added due to incomplete svg style support. See #715 detected.opera = (detected.browser.toLowerCase() === 'opera' && parseFloat(detected.version) < 15 ); - detected.locale = (navigator.languages && navigator.languages.length) - ? navigator.languages[0] : (navigator.language || navigator.userLanguage || 'en-US'); + detected.locale = (navigator.language || navigator.userLanguage || 'en-US'); + detected.language = detected.locale.split('-')[0]; + + // Search `navigator.languages` for a better locale.. Prefer the first language, + // unless the second language is a culture-specific version of the first one, see #3842 + if (navigator.languages && navigator.languages.length > 0) { + var code0 = navigator.languages[0], + parts0 = code0.split('-'); + + detected.locale = code0; + detected.language = parts0[0]; + + if (navigator.languages.length > 1 && parts0.length === 1) { + var code1 = navigator.languages[1], + parts1 = code1.split('-'); + + if (parts1[0] === parts0[0]) { + detected.locale = code1; + } + } + } // Loaded locale is stored in currentLocale // return that instead (except in the situation where 'en' might override 'en-US') var loadedLocale = currentLocale || 'en'; if (loadedLocale !== 'en') { detected.locale = loadedLocale; + detected.language = detected.locale.split('-')[0]; } // detect text direction