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