common-ui/src/lib/services/language.service.ts
2022-07-25 22:06:23 +03:00

64 lines
2.1 KiB
TypeScript

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<Dayjs>,
) {
registerLocaleData(localeDe);
_translateService.addLangs(['en', 'de']);
_translateService.setDefaultLang('en');
}
get currentLanguage() {
return this._translateService.currentLang;
}
async set(language: string): Promise<void> {
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<void> {
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';
}
}