2018-12-29 01:27:37 +01:00
|
|
|
import { isPresent, isEmpty } from '@ember/utils';
|
2020-01-30 00:23:12 +01:00
|
|
|
import localesMeta from 'croodle/locales/meta';
|
2016-08-21 14:31:39 +02:00
|
|
|
|
2015-11-20 02:18:19 +01:00
|
|
|
export default {
|
|
|
|
name: 'i18n',
|
2016-08-12 20:08:49 +02:00
|
|
|
initialize(appInstance) {
|
2020-01-30 00:23:12 +01:00
|
|
|
let intl = appInstance.lookup('service:intl');
|
2018-12-29 20:35:04 +01:00
|
|
|
let moment = appInstance.lookup('service:moment');
|
2019-01-20 15:20:54 +01:00
|
|
|
let powerCalendar = appInstance.lookup('service:power-calendar');
|
2018-12-29 20:35:04 +01:00
|
|
|
|
2020-01-30 00:23:12 +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
|
|
|
|
2020-01-30 00:23:12 +01:00
|
|
|
intl.set('locale', locale.includes('-') ? [locale, locale.split('-')[0]] : [locale]);
|
2018-12-29 20:35:04 +01:00
|
|
|
moment.changeLocale(locale);
|
2019-01-20 15:20:54 +01:00
|
|
|
powerCalendar.set('local', locale);
|
2015-11-20 02:18:19 +01:00
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
function getLocale(availableLocales) {
|
2017-08-31 14:02:45 +02:00
|
|
|
let methods = [
|
2016-08-21 14:31:39 +02:00
|
|
|
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) => {
|
2016-12-03 20:44:40 +01:00
|
|
|
let preferredLocales = method();
|
|
|
|
let match;
|
|
|
|
|
|
|
|
if (isEmpty(preferredLocales)) {
|
|
|
|
return false;
|
2015-11-20 02:18:19 +01:00
|
|
|
}
|
2016-12-03 20:44:40 +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() {
|
2016-12-03 20:44:40 +01:00
|
|
|
let languages;
|
|
|
|
let { navigator } = window;
|
|
|
|
let primaryLanguage;
|
|
|
|
|
|
|
|
if (isPresent(navigator.languages)) {
|
2017-08-31 14:02:45 +02:00
|
|
|
// 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);
|
2016-12-03 20:44:40 +01:00
|
|
|
} 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
|
|
|
}
|
|
|
|
|
2016-08-21 14:31:39 +02:00
|
|
|
function getSavedLocale() {
|
|
|
|
let { localStorage } = window;
|
2016-12-03 20:44:40 +01:00
|
|
|
let locale;
|
2015-11-20 02:18:19 +01:00
|
|
|
|
2016-08-21 14:31:39 +02:00
|
|
|
// test browser support
|
|
|
|
if (!localStorage) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2016-12-03 20:44:40 +01:00
|
|
|
locale = localStorage.getItem('locale');
|
|
|
|
|
|
|
|
if (isEmpty(locale)) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
return [locale];
|
2016-08-21 14:31:39 +02:00
|
|
|
}
|