All files / ngx-translate si-translate-ngxt.service.ts

100% Statements 27/27
90.9% Branches 10/11
93.33% Functions 14/15
100% Lines 27/27

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110                                        1x   16x         16x 16x 16x 16x 4x     16x             2x       3x       2x       18x 18x       2x       1x 1x             7x 1x   6x             3x 1x   2x             9x 1x   8x       4x       4x                
/**
 * Copyright (c) Siemens 2016 - 2025
 * SPDX-License-Identifier: MIT
 */
import { Injectable } from '@angular/core';
import {
  MissingTranslationHandler,
  MissingTranslationHandlerParams,
  TranslateService
} from '@ngx-translate/core';
import { SiTranslateService, TranslationResult } from '@siemens/element-translate-ng/translate';
import { merge, Observable, of } from 'rxjs';
import { map } from 'rxjs/operators';
 
/**
 * {@link SiTranslateService} wrapper around ngx-translate
 *
 * @internal
 */
@Injectable()
export class SiTranslateNgxTService extends SiTranslateService {
  private ngxTranslateService: TranslateService;
  private defaultTranslations: Record<string, string> = {};
  private originalMissingHandler: MissingTranslationHandler;
 
  // eslint-disable-next-line @angular-eslint/prefer-inject
  constructor(ngxTranslateService: TranslateService) {
    super();
    this.ngxTranslateService = ngxTranslateService;
    this.originalMissingHandler = ngxTranslateService.missingTranslationHandler;
    ngxTranslateService.missingTranslationHandler = {
      handle: params => this.handleMissingTranslation(params)
    };
 
    this.translationChange$ = merge(
      this.ngxTranslateService.onTranslationChange,
      this.ngxTranslateService.onLangChange
    ).pipe(map(() => {}));
  }
 
  override get currentLanguage(): string {
    return this.ngxTranslateService.currentLang;
  }
 
  override get availableLanguages(): string[] {
    return this.ngxTranslateService.getLangs();
  }
 
  override set availableLanguages(languages: string[]) {
    this.ngxTranslateService.addLangs(languages);
  }
 
  override setCurrentLanguage(lang: string): Observable<void> {
    this.setDocumentLanguage(lang);
    return this.ngxTranslateService.use(lang).pipe(map(() => {}));
  }
 
  override getDefaultLanguage(): string {
    return this.ngxTranslateService.getDefaultLang();
  }
 
  override setDefaultLanguage(lang: string): void {
    this.setDocumentLanguage(lang);
    this.ngxTranslateService.setDefaultLang(lang);
  }
 
  override translate<T extends string | string[]>(
    keys: T,
    params?: Record<string, unknown>
  ): Observable<TranslationResult<T>> | TranslationResult<T> {
    if (Array.isArray(keys) && !keys.length) {
      return of({} as TranslationResult<T>);
    }
    return this.ngxTranslateService.stream(keys, params);
  }
 
  override translateAsync<T extends string | string[]>(
    keys: T,
    params?: Record<string, unknown>
  ): Observable<TranslationResult<T>> {
    if (Array.isArray(keys) && !keys.length) {
      return of({} as TranslationResult<T>);
    }
    return this.ngxTranslateService.stream(keys, params);
  }
 
  override translateSync<T extends string | string[]>(
    keys: T,
    params?: Record<string, unknown>
  ): TranslationResult<T> {
    if (Array.isArray(keys) && !keys.length) {
      return {} as TranslationResult<T>;
    }
    return this.ngxTranslateService.instant(keys, params);
  }
 
  override setTranslation(key: string, value: string): void {
    this.defaultTranslations[key] = value;
  }
 
  private handleMissingTranslation(params: MissingTranslationHandlerParams): string {
    return (
      params.translateService.parser.interpolate(
        this.defaultTranslations[params.key],
        params.interpolateParams
      ) ?? this.originalMissingHandler.handle(params)
    );
  }
}