ui/app/services/user-language.js

70 lines
2.1 KiB
JavaScript

import Ember from 'ember';
import C from 'ui/utils/constants';
import { ajaxPromise } from 'ember-api-store/utils/ajax-promise';
export default Ember.Service.extend({
prefs : Ember.inject.service(),
session : Ember.inject.service(),
intl : Ember.inject.service(),
locales : Ember.computed.alias('app.locales'),
loadedLocales : null,
bootstrap: function() {
this.set('loadedLocales', []);
}.on('init'),
initLanguage() {
const session = this.get('session');
const fromLogin = session.get(C.SESSION.LOGIN_LANGUAGE);
const fromPrefs = this.get(`prefs.${C.PREFS.LANGUAGE}`); // get language from user prefs
const fromSession = session.get(C.SESSION.LANGUAGE); // get local language
let lang = C.LANGUAGE.DEFAULT;
if ( fromLogin ) {
lang = fromLogin;
session.set(C.SESSION.LOGIN_LANGUAGE, undefined);
} else if ( fromPrefs ) {
lang = fromPrefs;
} else if (fromSession) {
lang = fromSession;
}
session.set(C.SESSION.LANGUAGE, lang);
return this.sideLoadLanguage(lang);
},
getLanguage() {
return this.get('intl._locale')[0];
},
setLanguage(lang) {
let session = this.get('session');
lang = lang || session.get(C.SESSION.LANGUAGE);
session.set(C.SESSION.LANGUAGE, lang);
return this.set(`prefs.${C.PREFS.LANGUAGE}`, lang);
},
sideLoadLanguage(language) {
let application = this.get('app');
let loadedLocales = this.get('loadedLocales');
if (loadedLocales.contains(language)) {
this.get('intl').setLocale(language);
return Ember.RSVP.resolve();
} else {
return ajaxPromise({url: `${this.get('app.baseAssets')}translations/${language}.json?${application.version}`,
method: 'GET',
dataType: 'json',
}).then((resp) => {
loadedLocales.push(language);
return this.get('intl').addTranslations(language, resp.xhr.responseJSON).then(() => {
this.get('intl').setLocale(language);
});
});
}
},
getAvailableTranslations() {
return this.get('intl').getLocalesByTranslations();
},
});