@netgrif/components-core
Version:
Netgrif Application engine frontend core Angular library
116 lines • 16.2 kB
JavaScript
import en from '../../assets/i18n/en.json';
import sk from '../../assets/i18n/sk.json';
import de from '../../assets/i18n/de.json';
import { Injectable } from '@angular/core';
import { Subject } from 'rxjs';
import * as i0 from "@angular/core";
import * as i1 from "@ngx-translate/core";
import * as i2 from "../user/services/user-preference.service";
import * as i3 from "../logger/services/logger.service";
export class LanguageService {
_translate;
_preferenceService;
_logger;
_translations;
_langChange$;
subPreference;
subTranslate;
_defaultLanguage = 'en';
constructor(_translate, _preferenceService, _logger) {
this._translate = _translate;
this._preferenceService = _preferenceService;
this._logger = _logger;
this._translations = [
{ key: 'en', translation: en },
{ key: 'sk', translation: sk },
{ key: 'de', translation: de }
];
this._translate.addLangs(this._translations.map(trans => trans.key));
this._translations.forEach(trans => {
this._translate.setTranslation(trans.key, trans.translation, true);
});
this._translate.setDefaultLang(this._defaultLanguage);
this._langChange$ = new Subject();
this.checkLocalStorage();
setTimeout(() => {
if (this._preferenceService) {
this.subPreference = this._preferenceService.preferencesChanged$.subscribe(() => {
const preferredLang = this._preferenceService.getLocale();
if (preferredLang !== undefined && preferredLang !== this._translate.currentLang) {
this.setLanguage(preferredLang);
}
});
}
});
this.subTranslate = _translate.onLangChange.subscribe((event) => {
this._logger.debug('Language changed to ' + event.lang);
});
}
ngOnDestroy() {
this.subTranslate.unsubscribe();
if (this.subPreference) {
this.subPreference.unsubscribe();
}
}
checkLocalStorage() {
const lang = localStorage.getItem('Language');
if (lang === null) {
const browserLang = this._translate.getBrowserLang();
this.setLanguage(browserLang);
}
else {
this.setLanguage(lang);
}
}
setDefaultLang(lang) {
if (this.checkIfLangExists(lang)) {
this._defaultLanguage = lang;
}
else {
this._logger.error(lang + " Language doesn't exists!");
}
}
setLanguage(lang, saveToPreferences = false) {
this._translate.use(this.checkIfLangExists(lang) ? lang : this._defaultLanguage);
if (saveToPreferences) {
this._preferenceService.setLocale(lang);
}
localStorage.setItem('Language', this.checkIfLangExists(lang) ? lang : this._defaultLanguage);
this._langChange$.next(this.checkIfLangExists(lang) ? lang : this._defaultLanguage);
}
addLanguage(lang, translation) {
this._translate.addLangs([lang]);
this._translate.setTranslation(lang, translation, true);
this._translations.push({ key: lang, translation });
}
removeLanguage(lang) {
const index = this._translations.findIndex(value => value.key === lang);
if (index !== -1) {
if (this._translate.currentLang === lang && this._translate.currentLang !== this._defaultLanguage) {
this.setLanguage(this._defaultLanguage);
}
this._translations.splice(index, 1);
}
}
getTranslations() {
return this._translations;
}
getLanguage() {
return this._translate.currentLang;
}
getLangChange$() {
return this._langChange$.asObservable();
}
checkIfLangExists(lang) {
return this._translations.some(value => value.key === lang);
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: LanguageService, deps: [{ token: i1.TranslateService }, { token: i2.UserPreferenceService }, { token: i3.LoggerService }], target: i0.ɵɵFactoryTarget.Injectable });
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: LanguageService, providedIn: 'root' });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: LanguageService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root'
}]
}], ctorParameters: () => [{ type: i1.TranslateService }, { type: i2.UserPreferenceService }, { type: i3.LoggerService }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGFuZ3VhZ2Uuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25ldGdyaWYtY29tcG9uZW50cy1jb3JlL3NyYy9saWIvdHJhbnNsYXRlL2xhbmd1YWdlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDM0MsT0FBTyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDM0MsT0FBTyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDM0MsT0FBTyxFQUFDLFVBQVUsRUFBWSxNQUFNLGVBQWUsQ0FBQztBQUVwRCxPQUFPLEVBQWEsT0FBTyxFQUFlLE1BQU0sTUFBTSxDQUFDOzs7OztBQVl2RCxNQUFNLE9BQU8sZUFBZTtJQVFGO0lBQ0E7SUFDQTtJQVJaLGFBQWEsQ0FBcUI7SUFDbEMsWUFBWSxDQUFrQjtJQUM5QixhQUFhLENBQWU7SUFDNUIsWUFBWSxDQUFlO0lBQzNCLGdCQUFnQixHQUFXLElBQUksQ0FBQztJQUUxQyxZQUFzQixVQUE0QixFQUM1QixrQkFBeUMsRUFDekMsT0FBc0I7UUFGdEIsZUFBVSxHQUFWLFVBQVUsQ0FBa0I7UUFDNUIsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUF1QjtRQUN6QyxZQUFPLEdBQVAsT0FBTyxDQUFlO1FBQ3hDLElBQUksQ0FBQyxhQUFhLEdBQUc7WUFDakIsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxFQUFFLEVBQUU7WUFDOUIsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxFQUFFLEVBQUU7WUFDOUIsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxFQUFFLEVBQUU7U0FDakMsQ0FBQztRQUNGLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FB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QztJQUVELFdBQVc7UUFDUCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDO0lBQ3ZDLENBQUM7SUFFTSxjQUFjO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUM1QyxDQUFDO0lBRVMsaUJBQWlCLENBQUMsSUFBWTtRQUNwQyxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsS0FBSyxJQUFJLENBQUMsQ0FBQztJQUNoRSxDQUFDO3dHQTFHUSxlQUFlOzRHQUFmLGVBQWUsY0FGWixNQUFNOzs0RkFFVCxlQUFlO2tCQUgzQixVQUFVO21CQUFDO29CQUNSLFVBQVUsRUFBRSxNQUFNO2lCQUNyQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBlbiBmcm9tICcuLi8uLi9hc3NldHMvaTE4bi9lbi5qc29uJztcbmltcG9ydCBzayBmcm9tICcuLi8uLi9hc3NldHMvaTE4bi9zay5qc29uJztcbmltcG9ydCBkZSBmcm9tICcuLi8uLi9hc3NldHMvaTE4bi9kZS5qc29uJztcbmltcG9ydCB7SW5qZWN0YWJsZSwgT25EZXN0cm95fSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7VHJhbnNsYXRlU2VydmljZSwgVHJhbnNsYXRpb25DaGFuZ2VFdmVudH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQge09ic2VydmFibGUsIFN1YmplY3QsIFN1YnNjcmlwdGlvbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQge1VzZXJQcmVmZXJlbmNlU2VydmljZX0gZnJvbSAnLi4vdXNlci9zZXJ2aWNlcy91c2VyLXByZWZlcmVuY2Uuc2VydmljZSc7XG5pbXBvcnQge0xvZ2dlclNlcnZpY2V9IGZyb20gJy4uL2xvZ2dlci9zZXJ2aWNlcy9sb2dnZXIuc2VydmljZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNsYXRpb24ge1xuICAgIGtleTogc3RyaW5nLFxuICAgIHRyYW5zbGF0aW9uOiBhbnlcbn1cblxuQEluamVjdGFibGUoe1xuICAgIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBMYW5ndWFnZVNlcnZpY2UgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuXG4gICAgcHJvdGVjdGVkIF90cmFuc2xhdGlvbnM6IEFycmF5PFRyYW5zbGF0aW9uPjtcbiAgICBwcm90ZWN0ZWQgX2xhbmdDaGFuZ2UkOiBTdWJqZWN0PHN0cmluZz47XG4gICAgcHJvdGVjdGVkIHN1YlByZWZlcmVuY2U6IFN1YnNjcmlwdGlvbjtcbiAgICBwcm90ZWN0ZWQgc3ViVHJhbnNsYXRlOiBTdWJzY3JpcHRpb247XG4gICAgcHJvdGVjdGVkIF9kZWZhdWx0TGFuZ3VhZ2U6IHN0cmluZyA9ICdlbic7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgX3RyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX3ByZWZlcmVuY2VTZXJ2aWNlOiBVc2VyUHJlZmVyZW5jZVNlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJvdGVjdGVkIF9sb2dnZXI6IExvZ2dlclNlcnZpY2UpIHtcbiAgICAgICAgdGhpcy5fdHJhbnNsYXRpb25zID0gW1xuICAgICAgICAgICAgeyBrZXk6ICdlbicsIHRyYW5zbGF0aW9uOiBlbiB9LFxuICAgICAgICAgICAgeyBrZXk6ICdzaycsIHRyYW5zbGF0aW9uOiBzayB9LFxuICAgICAgICAgICAgeyBrZXk6ICdkZScsIHRyYW5zbGF0aW9uOiBkZSB9XG4gICAgICAgIF07XG4gICAgICAgIHRoaXMuX3RyYW5zbGF0ZS5hZGRMYW5ncyh0aGlzLl90cmFuc2xhdGlvbnMubWFwKHRyYW5zID0+IHRyYW5zLmtleSkpO1xuICAgICAgICB0aGlzLl90cmFuc2xhdGlvbnMuZm9yRWFjaCh0cmFucyA9PiB7XG4gICAgICAgICAgICB0aGlzLl90cmFuc2xhdGUuc2V0VHJhbnNsYXRpb24odHJhbnMua2V5LCB0cmFucy50cmFuc2xhdGlvbiwgdHJ1ZSk7XG4gICAgICAgIH0pXG4gICAgICAgIHRoaXMuX3RyYW5zbGF0ZS5zZXREZWZhdWx0TGFuZyh0aGlzLl9kZWZhdWx0TGFuZ3VhZ2UpO1xuICAgICAgICB0aGlzLl9sYW5nQ2hhbmdlJCA9IG5ldyBTdWJqZWN0PHN0cmluZz4oKTtcblxuICAgICAgICB0aGlzLmNoZWNrTG9jYWxTdG9yYWdlKCk7XG5cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5fcHJlZmVyZW5jZVNlcnZpY2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN1YlByZWZlcmVuY2UgPSB0aGlzLl9wcmVmZXJlbmNlU2VydmljZS5wcmVmZXJlbmNlc0NoYW5nZWQkLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHByZWZlcnJlZExhbmcgPSB0aGlzLl9wcmVmZXJlbmNlU2VydmljZS5nZXRMb2NhbGUoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZlcnJlZExhbmcgIT09IHVuZGVmaW5lZCAmJiBwcmVmZXJyZWRMYW5nICE9PSB0aGlzLl90cmFuc2xhdGUuY3VycmVudExhbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0TGFuZ3VhZ2UocHJlZmVycmVkTGFuZyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cblxuICAgICAgICB0aGlzLnN1YlRyYW5zbGF0ZSA9IF90cmFuc2xhdGUub25MYW5nQ2hhbmdlLnN1YnNjcmliZSgoZXZlbnQ6IFRyYW5zbGF0aW9uQ2hhbmdlRXZlbnQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnTGFuZ3VhZ2UgY2hhbmdlZCB0byAnICsgZXZlbnQubGFuZyk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLnN1YlRyYW5zbGF0ZS51bnN1YnNjcmliZSgpO1xuICAgICAgICBpZiAodGhpcy5zdWJQcmVmZXJlbmNlKSB7XG4gICAgICAgICAgICB0aGlzLnN1YlByZWZlcmVuY2UudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBjaGVja0xvY2FsU3RvcmFnZSgpIHtcbiAgICAgICAgY29uc3QgbGFuZyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdMYW5ndWFnZScpO1xuICAgICAgICBpZiAobGFuZyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgYnJvd3NlckxhbmcgPSB0aGlzLl90cmFuc2xhdGUuZ2V0QnJvd3NlckxhbmcoKTtcbiAgICAgICAgICAgIHRoaXMuc2V0TGFuZ3VhZ2UoYnJvd3NlckxhbmcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZXRMYW5ndWFnZShsYW5nKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzZXREZWZhdWx0TGFuZyhsYW5nOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKHRoaXMuY2hlY2tJZkxhbmdFeGlzdHMobGFuZykpIHtcbiAgICAgICAgICAgIHRoaXMuX2RlZmF1bHRMYW5ndWFnZSA9IGxhbmc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IobGFuZyArIFwiIExhbmd1YWdlIGRvZXNuJ3QgZXhpc3RzIVwiKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzZXRMYW5ndWFnZShsYW5nOiBzdHJpbmcsIHNhdmVUb1ByZWZlcmVuY2VzID0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy5fdHJhbnNsYXRlLnVzZSggdGhpcy5jaGVja0lmTGFuZ0V4aXN0cyhsYW5nKSA/IGxhbmcgOiB0aGlzLl9kZWZhdWx0TGFuZ3VhZ2UpO1xuICAgICAgICBpZiAoc2F2ZVRvUHJlZmVyZW5jZXMpIHtcbiAgICAgICAgICAgIHRoaXMuX3ByZWZlcmVuY2VTZXJ2aWNlLnNldExvY2FsZShsYW5nKTtcbiAgICAgICAgfVxuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnTGFuZ3VhZ2UnLCB0aGlzLmNoZWNrSWZMYW5nRXhpc3RzKGxhbmcpID8gbGFuZyA6IHRoaXMuX2RlZmF1bHRMYW5ndWFnZSk7XG4gICAgICAgIHRoaXMuX2xhbmdDaGFuZ2UkLm5leHQodGhpcy5jaGVja0lmTGFuZ0V4aXN0cyhsYW5nKSA/IGxhbmcgOiB0aGlzLl9kZWZhdWx0TGFuZ3VhZ2UpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGRMYW5ndWFnZShsYW5nOiBzdHJpbmcsIHRyYW5zbGF0aW9uOiBPYmplY3QpIHtcbiAgICAgICAgdGhpcy5fdHJhbnNsYXRlLmFkZExhbmdzKFtsYW5nXSk7XG4gICAgICAgIHRoaXMuX3RyYW5zbGF0ZS5zZXRUcmFuc2xhdGlvbihsYW5nLCB0cmFuc2xhdGlvbiwgdHJ1ZSk7XG4gICAgICAgIHRoaXMuX3RyYW5zbGF0aW9ucy5wdXNoKHtrZXk6IGxhbmcsIHRyYW5zbGF0aW9ufSlcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVtb3ZlTGFuZ3VhZ2UobGFuZzogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5fdHJhbnNsYXRpb25zLmZpbmRJbmRleCh2YWx1ZSA9PiB2YWx1ZS5rZXkgPT09IGxhbmcpO1xuICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fdHJhbnNsYXRlLmN1cnJlbnRMYW5nID09PSBsYW5nICYmIHRoaXMuX3RyYW5zbGF0ZS5jdXJyZW50TGFuZyAhPT0gdGhpcy5fZGVmYXVsdExhbmd1YWdlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRMYW5ndWFnZSh0aGlzLl9kZWZhdWx0TGFuZ3VhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fdHJhbnNsYXRpb25zLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0VHJhbnNsYXRpb25zKCk6IEFycmF5PFRyYW5zbGF0aW9uPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl90cmFuc2xhdGlvbnM7XG4gICAgfVxuXG4gICAgZ2V0TGFuZ3VhZ2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90cmFuc2xhdGUuY3VycmVudExhbmc7XG4gICAgfVxuXG4gICAgcHVibGljIGdldExhbmdDaGFuZ2UkKCk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sYW5nQ2hhbmdlJC5hc09ic2VydmFibGUoKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgY2hlY2tJZkxhbmdFeGlzdHMobGFuZzogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl90cmFuc2xhdGlvbnMuc29tZSh2YWx1ZSA9PiB2YWx1ZS5rZXkgPT09IGxhbmcpO1xuICAgIH1cblxuXG59XG4iXX0=