import extension from 'extensionizer'; import promisify from 'pify'; import allLocales from '../../_locales/index.json'; const getPreferredLocales = extension.i18n ? promisify(extension.i18n.getAcceptLanguages, { errorFirst: false }) : async () => []; // mapping some browsers return hyphen instead underscore in locale codes (e.g. zh_TW -> zh-tw) const existingLocaleCodes = {}; allLocales.forEach((locale) => { if (locale && locale.code) { existingLocaleCodes[locale.code.toLowerCase().replace('_', '-')] = locale.code; } }); /** * Returns a preferred language code, based on settings within the user's browser. If we have no translations for the * users preferred locales, 'en' is returned. * * @returns {Promise} Promises a locale code, either one from the user's preferred list that we have a translation for, or 'en' */ export default async function getFirstPreferredLangCode() { let userPreferredLocaleCodes; try { userPreferredLocaleCodes = await getPreferredLocales(); } catch (e) { // Brave currently throws when calling getAcceptLanguages, so this handles that. userPreferredLocaleCodes = []; } // safeguard for Brave Browser until they implement chrome.i18n.getAcceptLanguages // https://github.com/MetaMask/metamask-extension/issues/4270 if (!userPreferredLocaleCodes) { userPreferredLocaleCodes = []; } let firstPreferredLangCode = userPreferredLocaleCodes .map((code) => code.toLowerCase().replace('_', '-')) .find( (code) => existingLocaleCodes[code] !== undefined || existingLocaleCodes[code.split('-')[0]] !== undefined, ); // if we have matched against a code with a '-' present, meaning its a regional // code for which we have a non-regioned locale, we need to set firstPreferredLangCode // to the correct non-regional code. if ( firstPreferredLangCode !== undefined && existingLocaleCodes[firstPreferredLangCode] === undefined ) { firstPreferredLangCode = firstPreferredLangCode.split('-')[0]; } return existingLocaleCodes[firstPreferredLangCode] || 'en'; }