{"version":3,"file":"hslayers-ng-services-language.mjs","sources":["../../../projects/hslayers/services/language/language.service.ts","../../../projects/hslayers/services/language/missing-translation.service.ts","../../../projects/hslayers/services/language/translate.service.ts","../../../projects/hslayers/services/language/hslayers-ng-services-language.ts"],"sourcesContent":["import {Injectable, inject} from '@angular/core';\nimport {lastValueFrom} from 'rxjs';\n\nimport {HsTranslateLoader} from './translate.service';\nimport {HsConfig} from 'hslayers-ng/config';\nimport {HsLogService} from 'hslayers-ng/services/log';\nimport {TranslateService} from '@ngx-translate/core';\n\nconst DEFAULT_LANG = 'en' as const;\n\n@Injectable({\n  providedIn: 'root',\n})\nexport class HsLanguageService {\n  /**\n   * ISO 639-1 code of current language\n   */\n  language: string;\n  /**\n   * Controls whether hs-lang URL param should override other setting or not\n   * Not in case we are syncing langs with Wagtail\n   */\n  langFromCMS: boolean;\n\n  private translationService = inject(TranslateService);\n  private hsConfig = inject(HsConfig);\n  private hsLog = inject(HsLogService);\n\n  constructor() {\n    this.hsConfig.configChanges.subscribe(() => {\n      const translator = this.translationService;\n      if (!translator.getFallbackLang()) {\n        // When config fetched via initializer service this gets in front of core service init method\n        this.initLanguages();\n      }\n      if (this.hsConfig.enabledLanguages) {\n        const langs = this.hsConfig.enabledLanguages.split(',');\n        const langsToAdd = langs.filter(\n          (l) => !translator.getLangs().includes(l),\n        );\n        translator.addLangs(langsToAdd);\n      }\n      if (this.hsConfig.language) {\n        this.setLanguage(this.hsConfig.language);\n      }\n      const currentLoader = translator.currentLoader as HsTranslateLoader;\n      if (\n        this.hsConfig.translationOverrides != undefined &&\n        !currentLoader.loadedViaInitializer.includes(\n          translator.getCurrentLang(),\n        )\n      ) {\n        if (translator?.getCurrentLang()) {\n          translator.reloadLang(translator.getCurrentLang());\n        }\n      }\n    });\n  }\n\n  /**\n   * Set up languages - default, list of allowed, the one to use\n   */\n  initLanguages() {\n    const languages = this.hsConfig.enabledLanguages\n      ? this.hsConfig.enabledLanguages.split(',').map((lang) => lang.trim())\n      : ['en', 'cs', 'sk'];\n    this.translationService.addLangs(languages);\n    this.translationService.setFallbackLang('en');\n    const langToUse = this.getLangToUse();\n    this.setLanguage(langToUse);\n  }\n\n  /**\n   * Set language\n   * @param lang - Language code\n   */\n  setLanguage(lang: string, retryCount = 0): void {\n    this.getTranslator().use(lang);\n    if (this.getTranslator().getCurrentLang() !== lang) {\n      if (retryCount < 5) {\n        this.hsLog.warn(\n          `Setting language to: ${lang} failed. Retrying (${\n            retryCount + 1\n          }/5) after a short while.`,\n        );\n        setTimeout(() => {\n          this.setLanguage(lang, retryCount + 1); // Increase retry count\n        }, 500);\n      } else {\n        this.hsLog.error(\n          `Setting language to: ${lang} failed after 5 attempts.`,\n        );\n      }\n    }\n    this.language = lang;\n  }\n\n  getTranslator(): TranslateService {\n    return this.translationService;\n  }\n\n  /**\n   * Get code of current language\n   * @returns Language code\n   */\n  getCurrentLanguageCode(): string {\n    if (typeof this.language == 'undefined' || this.language == '') {\n      return DEFAULT_LANG;\n    }\n    return this.language.toLowerCase();\n  }\n\n  /**\n   * Get array of available languages based\n   * @returns Available languages\n   */\n  listAvailableLanguages() {\n    const additionalLanguages = this.hsConfig.additionalLanguages;\n    const languageCodeNameMap = {\n      'en': 'English',\n      'cs': 'Česky',\n      'fr': 'Français',\n      'lv': 'Latviski',\n      'nl': 'Nederlands',\n      'sk': 'Slovensky',\n      ...additionalLanguages,\n    };\n    const langs = [{key: 'en', name: 'English'}];\n    for (const lang of this.translationService.getLangs()) {\n      if (\n        languageCodeNameMap.hasOwnProperty(lang) &&\n        langs.filter((l) => l.key == lang).length == 0\n      ) {\n        langs.push({key: lang, name: languageCodeNameMap[lang]});\n      }\n    }\n    return langs;\n  }\n\n  /**\n   * @param str - Identifier of the string to be translated\n   * @param params - Dynamic params included in the translation\n   * @returns Translation\n   */\n  getTranslation(str: string, params?: any): string {\n    return this.translationService.instant(str, params);\n  }\n\n  /**\n   * Async variant of getTranslation function for translations which might\n   * be needed immediately after application init before locales are even loaded\n   */\n  async awaitTranslation(str: string, params?: any): Promise<string> {\n    const translator = this.translationService;\n    const lang = translator.getCurrentLang();\n    const MAX_CONFIG_POLLS = 10;\n    let counter = 0;\n    while (\n      !(translator.currentLoader as HsTranslateLoader).loadedLanguages()[\n        lang\n      ] &&\n      counter++ < MAX_CONFIG_POLLS\n    ) {\n      await new Promise((resolve2) => setTimeout(resolve2, 500));\n    }\n    const value = await lastValueFrom(translator.get(str, params));\n    return value;\n  }\n\n  /**\n   * @param module - Module to look for inside the locales json\n   * @param text - Text that represents the translation\n   * @param params - Dynamic params included in the translation, for example,\n   * \"translation\": \"This is my \\{\\{nr\\}\\} translation\" - params: \\{nr: 'first'\\}\n   * @returns Translation\n   */\n\n  getTranslationIgnoreNonExisting(\n    module: string,\n    text: string,\n    params?: any,\n  ): string {\n    const tmp = this.getTranslation(module + '.' + text, params || undefined);\n    if (tmp.includes(module + '.')) {\n      return text;\n    }\n    return tmp;\n  }\n\n  /**\n   * Parse language code from HTML lang attr\n   * Takes only first part of lang definition in case 'en-us' format is used\n   */\n  private getDocumentLang(): string {\n    let documentLang = document.documentElement?.lang;\n    return (documentLang = documentLang.includes('-')\n      ? documentLang.split('-')[0]\n      : documentLang);\n  }\n\n  /**\n   * If possible sync language with HTML document lang attribute\n   * otherwise use lang used in config or default (en)\n   */\n  private getLangToUse(): string {\n    const documentLang = this.getDocumentLang();\n    const htmlLangInPath = document.location.pathname.includes(\n      `/${documentLang}/`,\n    );\n    this.langFromCMS =\n      htmlLangInPath &&\n      this.translationService.getLangs().includes(documentLang);\n    return this.langFromCMS\n      ? documentLang\n      : this.hsConfig.language || this.translationService.getFallbackLang();\n  }\n}\n","import {Injectable} from '@angular/core';\nimport {\n  MissingTranslationHandler,\n  MissingTranslationHandlerParams,\n} from '@ngx-translate/core';\n\n/**\n * This service handles cases where translation keys are missing from the translation files.\n * It provides fallback behavior by:\n * - Returning the fallbackValue if provided in the interpolation parameters\n * - Logging missing translations for debugging purposes\n * - Returning the translation key as a fallback when no fallbackValue is available\n */\n@Injectable({\n  providedIn: 'root',\n})\nexport class HsMissingTranslationHandler implements MissingTranslationHandler {\n  handle(params: MissingTranslationHandlerParams): string {\n    // If the fallbackValue is provided, return it\n    if (params.interpolateParams?.hasOwnProperty('fallbackValue')) {\n      return (params.interpolateParams as any).fallbackValue;\n    }\n\n    // Return last part of the key (SIDNENAV.PANEL.Info -> Info) or the key itself if single part key\n    return String(params.key).split('.').pop();\n  }\n}\n","import * as merge from 'deepmerge';\nimport {TranslateLoader} from '@ngx-translate/core';\nimport {HsConfig} from 'hslayers-ng/config';\nimport {HsLogService} from 'hslayers-ng/services/log';\nimport {HttpClient} from '@angular/common/http';\nimport {Injectable, signal, inject} from '@angular/core';\nimport {Observable, forkJoin, interval, of, throwError} from 'rxjs';\nimport {catchError, filter, map, switchMap, take} from 'rxjs/operators';\n\n/**\n * Custom loader for translations that works with webpack.\n * It loads translation files from the assets folder and merges them with any overrides.\n */\n@Injectable({\n  providedIn: 'root',\n})\nexport class HsTranslateLoader implements TranslateLoader {\n  /**\n   * Map to keep track of loaded languages\n   */\n  loadedLanguages = signal<Record<string, boolean>>({});\n  /**\n   * List of languages loaded using APP_INITIALIZER token\n   * Considered as fully loaded from the start eg. no reload is necessary to load translation overrides\n   */\n  loadedViaInitializer: string[] = [];\n  private hsConfig = inject(HsConfig);\n  private hsLog = inject(HsLogService);\n  private httpClient = inject(HttpClient);\n\n  /**\n   * Loads the translations for a given language.\n   * @param lang - language code in ISO 639-1 format such as `en`\n   * @returns An Observable of the translation object for the specified language\n   */\n  getTranslation(lang: string): Observable<any> {\n    return this.validateAssetsPath().pipe(\n      switchMap(() => this.loadTranslations(lang)),\n      map((translations) => {\n        this.loadedLanguages.update((languages) => ({\n          ...languages,\n          [lang]: true,\n        }));\n        return translations;\n      }),\n      catchError((error) => {\n        this.hsLog.error('Failed to load translations:', error);\n        return of({});\n      }),\n    );\n  }\n\n  /**\n   * Validates that the assets path is set in the configuration.\n   * Retries up to 10 times with a 100ms interval if the path is not set - basically waits for config update.\n   * @returns An Observable of the assets path or an error if not set after retries\n   */\n  private validateAssetsPath(): Observable<string> {\n    if (this.hsConfig.assetsPath === undefined) {\n      const errorMessage =\n        'AssetsPath not set. Please set HsConfig.assetsPath correctly to enable loading of translation files.';\n      return interval(100).pipe(\n        switchMap((attempt) => {\n          if (attempt >= 10) {\n            return throwError(() => new Error(errorMessage));\n          }\n          return of(this.hsConfig.assetsPath);\n        }),\n        filter((assetsPath) => !!assetsPath),\n        take(1),\n      );\n    }\n    return of(this.hsConfig.assetsPath);\n  }\n\n  /**\n   * Loads translations for a specific language from the assets folder\n   * and merges them with any overrides specified in the configuration.\n   * @param lang - The language code to load translations for\n   * @returns An Observable of the merged translations\n   */\n  private loadTranslations(lang: string): Observable<any> {\n    const requests: Observable<any>[] = [\n      this.httpClient\n        .get(`${this.hsConfig.assetsPath}locales/${lang}.json`)\n        .pipe(catchError((error) => this.handleTranslationError(error, lang))),\n      of(this.hsConfig.translationOverrides?.[lang] ?? {}),\n    ];\n\n    return forkJoin(requests).pipe(map((responses) => merge.all(responses)));\n  }\n\n  /**\n   * Handles errors that occur when loading translation files.\n   * @param error - The error object from the HTTP request\n   * @param lang - The language code for which the error occurred\n   * @returns An Observable of an empty object for 404 errors with additional languages, or throws an error otherwise\n   */\n  private handleTranslationError(error: any, lang: string): Observable<any> {\n    let message = 'Probably an incorrect assetsPath...?';\n    if (error.status === 404 && this.hsConfig.additionalLanguages?.[lang]) {\n      message = 'Additional language not present in [assetsPath]/locales';\n      return of({});\n    }\n    this.hsLog.log(`Locales files cannot be loaded. ${message}`);\n    this.hsLog.error(error);\n    return throwError(() => error);\n  }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}