argos/dmp-frontend/src/app/utilities/culture/culture-service.ts

77 lines
2.5 KiB
TypeScript
Raw Normal View History

2018-08-30 13:09:36 +02:00
import { Injectable } from '@angular/core';
import { Observable, Subject } from 'rxjs';
import { CultureInfo } from './models/culture-info';
import { registerLocaleData } from '@angular/common';
2018-08-31 10:14:56 +02:00
import { AuthService } from '../../services/auth/auth.service';
2018-08-30 13:09:36 +02:00
const availableCultures: CultureInfo[] = require('../../../assets/resources/available-cultures.json');
@Injectable()
export class CultureService {
2018-10-05 17:00:54 +02:00
private cultureValues = new Map<string, CultureInfo>(); // cultures by name
private cultureChangeSubject = new Subject<CultureInfo>();
private currentCulture: CultureInfo;
2018-08-30 13:09:36 +02:00
2018-10-05 17:00:54 +02:00
constructor(
private authService: AuthService
) {
if (availableCultures) {
this.cultureValues = new Map<string, CultureInfo>();
availableCultures.forEach(culture => {
this.cultureValues.set(culture.name, culture);
});
}
}
2018-08-30 13:09:36 +02:00
2018-10-05 17:00:54 +02:00
getCultureValues(): CultureInfo[] {
const values: CultureInfo[] = [];
this.cultureValues.forEach((value) => values.push(value));
return values;
}
2018-08-30 13:09:36 +02:00
2018-10-05 17:00:54 +02:00
getCultureValue(culture: string): CultureInfo | undefined {
return this.cultureValues.get(culture);
}
2018-08-30 13:09:36 +02:00
2018-10-05 17:00:54 +02:00
cultureSelected(culture: string | CultureInfo) {
let newCultureName: string;
if (typeof culture === 'string') {
if (this.currentCulture && this.currentCulture.name === culture) { return; }
newCultureName = culture;
} else {
if (this.currentCulture && this.currentCulture.name === culture.name) { return; }
newCultureName = culture.name;
}
2018-08-30 13:09:36 +02:00
2018-10-05 17:00:54 +02:00
const newCulture = this.cultureValues.get(newCultureName);
if (!newCulture) {
//console.error(`unsupported culture given: ${newCultureName}`); //TODO: throw error?
2018-10-05 17:00:54 +02:00
return;
}
this.currentCulture = newCulture;
this.cultureChangeSubject.next(newCulture);
2018-08-30 13:09:36 +02:00
2018-10-05 17:00:54 +02:00
// Set angular locale based on user selection.
let locale = newCulture.name;
import(`@angular/common/locales/${locale}.js`).catch(reason => {
//console.warn('Could not load locale: ' + locale);
2018-10-05 17:00:54 +02:00
locale = newCulture.name.split('-')[0];
//console.warn('Will try ' + locale);
2018-10-05 17:00:54 +02:00
return import(`@angular/common/locales/${locale}.js`).catch(resutl => {
//console.error('Could not load locale: ' + locale);
2018-10-05 17:00:54 +02:00
});
}).then(selectedLocale => {
registerLocaleData(selectedLocale.default);
});
}
2018-08-30 13:09:36 +02:00
2018-10-05 17:00:54 +02:00
getCultureChangeObservable(): Observable<CultureInfo> {
return this.cultureChangeSubject.asObservable();
}
2018-08-30 13:09:36 +02:00
2018-10-05 17:00:54 +02:00
getCurrentCulture(): String {
return this.authService.current() && this.authService.current().culture ? this.authService.current().culture : this.currentCulture.name;
}
2018-08-30 13:09:36 +02:00
}