decide.nolog.cz/app/instance-initializers/i18n.js

110 lines
2.7 KiB
JavaScript
Raw Normal View History

2018-12-29 01:27:37 +01:00
import { isPresent, isEmpty } from '@ember/utils';
import localesMeta from 'croodle/locales/meta';
2015-11-20 02:18:19 +01:00
export default {
name: 'i18n',
initialize(appInstance) {
let intl = appInstance.lookup('service:intl');
2018-12-29 20:35:04 +01:00
let moment = appInstance.lookup('service:moment');
let powerCalendar = appInstance.lookup('service:power-calendar');
2018-12-29 20:35:04 +01:00
let availableLocales = Object.keys(localesMeta);
2018-12-29 20:35:04 +01:00
let locale = getLocale(availableLocales);
2015-12-07 22:21:38 +01:00
intl.set('locale', locale.includes('-') ? [locale, locale.split('-')[0]] : [locale]);
2018-12-29 20:35:04 +01:00
moment.changeLocale(locale);
powerCalendar.set('local', locale);
2015-11-20 02:18:19 +01:00
}
};
function getLocale(availableLocales) {
let methods = [
getSavedLocale,
2015-12-07 22:21:38 +01:00
getLocaleByBrowser
2015-11-20 02:18:19 +01:00
];
2016-01-28 23:48:14 +01:00
let locale;
2015-11-20 02:18:19 +01:00
methods.any((method) => {
let preferredLocales = method();
let match;
if (isEmpty(preferredLocales)) {
return false;
2015-11-20 02:18:19 +01:00
}
match = preferredLocales.find((preferredLocale) => {
return availableLocales.indexOf(preferredLocale) !== -1;
});
if (isEmpty(match)) {
return false;
}
locale = match;
return true;
2015-11-20 02:18:19 +01:00
});
if (locale) {
return locale;
} else {
return 'en';
}
}
function getLocaleByBrowser() {
let languages;
let { navigator } = window;
let primaryLanguage;
if (isPresent(navigator.languages)) {
// Prefer experimental NavigatorLanguage.languages property if available.
// NavigatorLanguage.languages returns an array of language codes ordered by preference.
// Need to clone returned array cause otherwise Safari 10.1 throws an
// "Attempted to assign to readonly property" error.
languages = navigator.languages.slice(0);
} else if (isPresent(navigator.language)) {
// navigator.language should be available in most browsers
// but only returns most prefered language
languages = [navigator.language];
} else if (isPresent(navigator.browserLanguage)) {
// work-a-round for Internet Explorer
// navigator.browserLanguage returns current operating system language
languages = [navigator.browserLanguage];
} else {
return;
}
if (languages.length === 1) {
// add primary language if the only available one is a combined language code
primaryLanguage = languages[0].split('-')[0];
if (primaryLanguage !== languages[0]) {
languages.push(primaryLanguage);
}
}
// normalize all language codes to lower case
languages = languages.map((language) => {
return language.toLowerCase();
});
return languages;
2015-11-20 02:18:19 +01:00
}
function getSavedLocale() {
let { localStorage } = window;
let locale;
2015-11-20 02:18:19 +01:00
// test browser support
if (!localStorage) {
return;
}
locale = localStorage.getItem('locale');
if (isEmpty(locale)) {
return;
}
return [locale];
}