import { Injectable } from '@angular/core'; import { TranslateService } from '@ngx-translate/core'; import { firstValueFrom } from 'rxjs'; import 'dayjs/locale/en'; import 'dayjs/locale/de'; import dayjs, { Dayjs } from 'dayjs'; import { DateAdapter } from '@angular/material/core'; import arraySupport from 'dayjs/plugin/arraySupport'; import localeData from 'dayjs/plugin/localeData'; import { registerLocaleData } from '@angular/common'; import localeDe from '@angular/common/locales/de'; import { BaseUserPreferenceService } from './base-user-preference.service'; dayjs.extend(arraySupport); dayjs.extend(localeData); @Injectable({ providedIn: 'root', }) export class LanguageService { constructor( private readonly _translateService: TranslateService, private readonly _userPreferenceService: BaseUserPreferenceService, private readonly _dateAdapter: DateAdapter, ) { registerLocaleData(localeDe); _translateService.addLangs(['en', 'de']); _translateService.setDefaultLang('en'); } get currentLanguage() { return this._translateService.currentLang; } async set(language: string): Promise { dayjs.locale(language); this._dateAdapter.setLocale(language); await firstValueFrom(this._translateService.use(language)); } isAvailable(language: string): boolean { return this._translateService.getLangs().includes(language); } async setInitialLanguage(): Promise { const defaultLang = this.#getDefaultLanguage(); document.documentElement.lang = defaultLang; this._translateService.setDefaultLang(defaultLang); await this.set(defaultLang); } async change(language: string) { await this._userPreferenceService.saveLanguage(language); document.documentElement.lang = language; await this.set(language); } #getDefaultLanguage() { const preferredLang = this._userPreferenceService.getLanguage(); return this.isAvailable(preferredLang) ? preferredLang : 'en'; } }