diff --git a/src/lib/common-ui.module.ts b/src/lib/common-ui.module.ts index d44854a..2073435 100644 --- a/src/lib/common-ui.module.ts +++ b/src/lib/common-ui.module.ts @@ -4,7 +4,7 @@ import { MatIconModule } from '@angular/material/icon'; import { TranslateModule } from '@ngx-translate/core'; import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; import { SortByPipe } from './sorting'; -import { HumanizePipe } from './utils'; +import { CapitalizePipe, HumanizePipe } from './utils'; import { HiddenActionComponent, LogoComponent, @@ -24,11 +24,9 @@ import { IqserIconsModule } from './icons'; import { IqserButtonsModule } from './buttons'; import { IqserScrollbarModule } from './scrollbar'; import { IqserEmptyStatesModule } from './empty-states'; -import { LogPipe } from './utils/pipes/log.pipe'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { MatButtonModule } from '@angular/material/button'; import { MatDialogModule } from '@angular/material/dialog'; -import { CapitalizePipe } from './utils/pipes/capitalize.pipe'; import { KeycloakAngularModule } from 'keycloak-angular'; import { MatCheckboxModule } from '@angular/material/checkbox'; import { UploadFileComponent } from './upload-file/upload-file.component'; @@ -69,12 +67,12 @@ const components = [ DragDropFileUploadDirective, ]; -const pipes = [SortByPipe, HumanizePipe, CapitalizePipe, LogPipe]; +const pipes = [SortByPipe, HumanizePipe, CapitalizePipe]; @NgModule({ declarations: [...components, ...pipes], imports: [CommonModule, ...matModules, ...modules, FormsModule, ReactiveFormsModule, KeycloakAngularModule, MatProgressBarModule], - exports: [...components, ...pipes, ...modules, LogPipe], + exports: [...components, ...pipes, ...modules], }) export class CommonUiModule { static forRoot(options?: CommonUiOptions): ModuleWithProviders { diff --git a/src/lib/services/index.ts b/src/lib/services/index.ts index c4f13ef..8809cd1 100644 --- a/src/lib/services/index.ts +++ b/src/lib/services/index.ts @@ -6,3 +6,4 @@ export * from './composite-route.guard'; export * from './stats.service'; export * from './entities-map.service'; export * from './base-user-preference.service'; +export * from './language.service'; diff --git a/src/lib/services/language.service.ts b/src/lib/services/language.service.ts new file mode 100644 index 0000000..f6ac9d3 --- /dev/null +++ b/src/lib/services/language.service.ts @@ -0,0 +1,63 @@ +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'; + } +} diff --git a/src/lib/standalone/index.ts b/src/lib/standalone/index.ts new file mode 100644 index 0000000..90b9f50 --- /dev/null +++ b/src/lib/standalone/index.ts @@ -0,0 +1 @@ +export * from './log.pipe'; diff --git a/src/lib/utils/pipes/log.pipe.ts b/src/lib/standalone/log.pipe.ts similarity index 91% rename from src/lib/utils/pipes/log.pipe.ts rename to src/lib/standalone/log.pipe.ts index 9231cb3..8a85372 100644 --- a/src/lib/utils/pipes/log.pipe.ts +++ b/src/lib/standalone/log.pipe.ts @@ -2,6 +2,7 @@ import { Pipe, PipeTransform } from '@angular/core'; @Pipe({ name: 'log', + standalone: true, }) export class LogPipe implements PipeTransform { transform(value: T, message = ''): T { diff --git a/src/lib/utils/index.ts b/src/lib/utils/index.ts index 356df34..3bca7be 100644 --- a/src/lib/utils/index.ts +++ b/src/lib/utils/index.ts @@ -2,6 +2,7 @@ export * from './functions'; export * from './operators'; export * from './auto-unsubscribe.directive'; export * from './pipes/humanize.pipe'; +export * from './pipes/capitalize.pipe'; export * from './types/events.type'; export * from './types/utility-types'; export * from './types/tooltip-positions.type'; diff --git a/test.json b/test.json deleted file mode 100644 index e69de29..0000000