/** * @fileoverview * Utility function to detect locale from the browser setting or paramenter on the URL. */ import queryString from 'query-string'; // tw: read language from localStorage export const LANGUAGE_KEY = 'tw:language'; /** * look for language setting in the browser. Check against supported locales. * If there's a parameter in the URL, override the browser setting * @param {Array.string} supportedLocales An array of supported locale codes. * @return {string} the preferred locale */ const detectLocale = supportedLocales => { // tw: read language from localStorage try { const storedLanguage = localStorage.getItem(LANGUAGE_KEY); if (storedLanguage && supportedLocales.includes(storedLanguage)) { return storedLanguage; } } catch (e) { /* ignore */ } let locale = 'en'; // default let browserLocale = window.navigator.userLanguage || window.navigator.language; browserLocale = browserLocale.toLowerCase(); // try to set locale from browserLocale if (supportedLocales.includes(browserLocale)) { locale = browserLocale; } else { browserLocale = browserLocale.split('-')[0]; if (supportedLocales.includes(browserLocale)) { locale = browserLocale; } } const queryParams = queryString.parse(location.search); // Flatten potential arrays and remove falsy values const potentialLocales = [].concat(queryParams.locale, queryParams.lang).filter(l => l); if (!potentialLocales.length) { return locale; } const urlLocale = potentialLocales[0].toLowerCase(); if (supportedLocales.includes(urlLocale)) { return urlLocale; } return locale; }; export { detectLocale };