@uportal/eyebrow-user-info
Version:
Web component to display into eyebrow menu a user information menu with profile picture and more
59 lines (51 loc) • 1.82 kB
JavaScript
import Vue from 'vue';
import VueI18n from 'vue-i18n';
function checkLang(availableLanguages) {
// These window.navigator contain language information
// 1. languages -> Array of preferred languages
// (eg ["en-US", "zh-CN", "ja-JP"]) Firefox^32, Chrome^32
// 2. language -> Preferred language as String
// (eg "en-US") Firefox^5, IE^11, Safari,
// Chrome sends Browser UI language
// 3. browserLanguage -> UI Language of IE
// 4. userLanguage -> Language of Windows Regional Options
// 5. systemLanguage -> UI Language of Windows
const browserLanguagePropertyKeys = [
'languages',
'language',
'browserLanguage',
'userLanguage',
'systemLanguage',
];
const allLangs = browserLanguagePropertyKeys
// merge all values into flattened array
.flatMap((key) => navigator[key])
// Remove undefined values
.filter((v) => v)
// Shorten strings to use two chars (en-US -> en)
.map((v) => v.substring(0, 2))
// Returns unique values
.filter((v, i, a) => a.indexOf(v) === i);
// Returns first language matched in available languages
const detectedLocale = allLangs.find((x) => availableLanguages.includes(x));
// If no locale is detected, fallback to 'en'
return detectedLocale || 'en';
}
function loadLocaleMessages() {
const locales = require.context('./locales', true, /[a-z0-9]+\.json$/i);
const messages = {};
locales.keys().forEach((key) => {
const matched = key.match(/([a-z0-9]+)\./i);
if (matched && matched.length > 1) {
const locale = matched[1];
messages[locale] = locales(key);
}
});
return messages;
}
Vue.use(VueI18n);
export default new VueI18n({
locale: checkLang(['fr', 'en']),
fallbackLocale: 'en',
messages: loadLocaleMessages(),
});