rpx-xui-translation 1.1.3-welsh-translation-fix → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { Injectable, ChangeDetectorRef, Pipe, NgModule } from '@angular/core';
2
+ import { Injectable, Pipe, NgModule } from '@angular/core';
3
3
  import Dexie, { liveQuery } from 'dexie';
4
4
  import { DateTime } from 'luxon';
5
5
  import { BehaviorSubject, combineLatest, from, timer, of } from 'rxjs';
@@ -142,7 +142,7 @@ class RpxTranslationService {
142
142
  this.language$ = this.languageSource.asObservable();
143
143
  }
144
144
  getTranslation$(phrase) {
145
- return this.getTranslatedData(phrase.trim()).pipe(map((t) => t.translation));
145
+ return this.getTranslatedData(phrase).pipe(map((t) => t.translation));
146
146
  }
147
147
  getTranslationWithReplacements$(phrase, replacements) {
148
148
  // Split the phrase into components first based on replacements
@@ -274,18 +274,17 @@ class RpxTranslationService {
274
274
  console.log(document.cookie.split(';').find((cookie) => cookie.trim().startsWith(this.languageKey + '='))?.split('=')[1].trim());
275
275
  return document.cookie.split(';').find((cookie) => cookie.trim().startsWith(this.languageKey + '='))?.split('=')[1].trim();
276
276
  }
277
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RpxTranslationService, deps: [{ token: RpxTranslationConfig }, { token: i2.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable }); }
278
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RpxTranslationService }); }
277
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.1", ngImport: i0, type: RpxTranslationService, deps: [{ token: RpxTranslationConfig }, { token: i2.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable }); }
278
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.1", ngImport: i0, type: RpxTranslationService }); }
279
279
  }
280
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RpxTranslationService, decorators: [{
280
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.1", ngImport: i0, type: RpxTranslationService, decorators: [{
281
281
  type: Injectable
282
282
  }], ctorParameters: () => [{ type: RpxTranslationConfig }, { type: i2.HttpClient }] });
283
283
 
284
284
  class RpxTranslatePipe {
285
- constructor(translationService, injector) {
285
+ constructor(translationService, changeDetectorRef) {
286
286
  this.translationService = translationService;
287
- this.injector = injector;
288
- this.asyncPipe = new AsyncPipe(injector.get(ChangeDetectorRef));
287
+ this.asyncPipe = new AsyncPipe(changeDetectorRef);
289
288
  }
290
289
  transform(value, replacements, yesOrNoValue) {
291
290
  if (value && typeof value === 'string' && value.toString().trim()) {
@@ -307,16 +306,17 @@ class RpxTranslatePipe {
307
306
  ngOnDestroy() {
308
307
  this.asyncPipe.ngOnDestroy();
309
308
  }
310
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RpxTranslatePipe, deps: [{ token: RpxTranslationService }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Pipe }); }
311
- static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "18.2.13", ngImport: i0, type: RpxTranslatePipe, name: "rpxTranslate", pure: false }); }
309
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.1", ngImport: i0, type: RpxTranslatePipe, deps: [{ token: RpxTranslationService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Pipe }); }
310
+ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.1", ngImport: i0, type: RpxTranslatePipe, isStandalone: false, name: "rpxTranslate", pure: false }); }
312
311
  }
313
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RpxTranslatePipe, decorators: [{
312
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.1", ngImport: i0, type: RpxTranslatePipe, decorators: [{
314
313
  type: Pipe,
315
314
  args: [{
316
315
  name: 'rpxTranslate',
317
- pure: false
316
+ pure: false,
317
+ standalone: false
318
318
  }]
319
- }], ctorParameters: () => [{ type: RpxTranslationService }, { type: i0.Injector }] });
319
+ }], ctorParameters: () => [{ type: RpxTranslationService }, { type: i0.ChangeDetectorRef }] });
320
320
 
321
321
  class RpxTranslationModule {
322
322
  static forRoot(config) {
@@ -335,11 +335,11 @@ class RpxTranslationModule {
335
335
  ngModule: RpxTranslationModule
336
336
  };
337
337
  }
338
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RpxTranslationModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
339
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.13", ngImport: i0, type: RpxTranslationModule, declarations: [RpxTranslatePipe], exports: [RpxTranslatePipe] }); }
340
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RpxTranslationModule, providers: [provideHttpClient(withInterceptorsFromDi())] }); }
338
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.1", ngImport: i0, type: RpxTranslationModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
339
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.1", ngImport: i0, type: RpxTranslationModule, declarations: [RpxTranslatePipe], exports: [RpxTranslatePipe] }); }
340
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.3.1", ngImport: i0, type: RpxTranslationModule, providers: [provideHttpClient(withInterceptorsFromDi())] }); }
341
341
  }
342
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RpxTranslationModule, decorators: [{
342
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.1", ngImport: i0, type: RpxTranslationModule, decorators: [{
343
343
  type: NgModule,
344
344
  args: [{ declarations: [RpxTranslatePipe],
345
345
  exports: [RpxTranslatePipe], imports: [], providers: [provideHttpClient(withInterceptorsFromDi())] }]
@@ -1 +1 @@
1
- {"version":3,"file":"rpx-xui-translation.mjs","sources":["../../../projects/rpx-xui-translation/src/lib/rpx-language.enum.ts","../../../projects/rpx-xui-translation/src/lib/rpx-translation.config.ts","../../../projects/rpx-xui-translation/src/lib/db.ts","../../../projects/rpx-xui-translation/src/lib/helpers/match-case/match-case.helper.ts","../../../projects/rpx-xui-translation/src/lib/helpers/replace-placeholders/replace-placeholders.helper.ts","../../../projects/rpx-xui-translation/src/lib/rpx-translation.service.ts","../../../projects/rpx-xui-translation/src/lib/rpx-translate.pipe.ts","../../../projects/rpx-xui-translation/src/lib/rpx-translation.module.ts","../../../projects/rpx-xui-translation/src/public-api.ts","../../../projects/rpx-xui-translation/src/rpx-xui-translation.ts"],"sourcesContent":["export type RpxLanguage = 'en' | 'cy';\nexport enum YesOrNoValue {\n YES = 'Yes',\n NO = 'No',\n}\n","export type ValidityDurationSpec = {\n years?: number;\n quarters?: number;\n months?: number;\n weeks?: number;\n days?: number;\n hours?: number;\n minutes?: number;\n seconds?: number;\n milliseconds?: number;\n};\n\nexport class RpxTranslationConfig {\n validity: ValidityDurationSpec;\n baseUrl: string;\n\n debounceTimeMs = 300;\n testMode = false;\n}\n","import Dexie, { Table } from 'dexie';\nimport { DateTime } from 'luxon';\nimport { RpxLanguage } from './rpx-language.enum';\nimport { TranslatedData } from './models/translated-data.model';\n\nexport class Translation {\n id?: number;\n phrase: string;\n lang: RpxLanguage;\n translation: TranslatedData;\n validity: string;\n\n public static create(phrase: string, lang: RpxLanguage, translation: TranslatedData, validity: string): Translation {\n const t = new Translation();\n t.phrase = phrase;\n t.lang = lang;\n t.translation = translation;\n t.validity = validity;\n return t;\n }\n\n isExpired(): boolean {\n return DateTime.fromISO(this.validity) < DateTime.now();\n }\n}\n\nexport class TranslationDB extends Dexie {\n translations: Table<Translation, number>;\n\n constructor() {\n super('RpxTranslations');\n this.version(1).stores({\n translations: '++id, [phrase+lang]'\n });\n this.translations.mapToClass(Translation);\n }\n}\n\nexport const db = new TranslationDB();\n","export const matchCase = (str1: string, str2: string) => {\n if (str1.length === 0 || str2.length === 0) {\n return str2;\n }\n\n if (str1.charAt(0).toUpperCase() === str1.charAt(0)) {\n return `${str2.charAt(0).toUpperCase()}${str2.slice(1)}`;\n }\n return str2.toLowerCase();\n};\n","import { Replacements } from '../../rpx-translation.service';\n\nexport const replacePlaceholders = (input: string, replacements: Replacements) => {\n Object.keys(replacements).forEach((key) => {\n // Ideally use replaceAll here, but that isn't fully compatible with targeted browsers and packaging yet\n const search = `%${key}%`;\n while (input.indexOf(search) !== -1) {\n input = input.replace(search, replacements[key]);\n }\n });\n\n return input;\n};\n\n// Helper method to split the phrase into components, preserving placeholders and text separately\nexport const splitPhraseIntoComponents = (phrase: string, replacements: Record<string, string>): string[] => {\n const result: string[] = [];\n const placeholders = Object.keys(replacements).map((key) => `%${key}%`);\n phrase = phrase.trim();\n\n // Regular expression to match all placeholders in the phrase\n const placeholderRegex = new RegExp(placeholders.join('|'), 'g');\n\n let lastIndex = 0;\n\n // Helper function to split text into spaces and content\n const splitTextIntoComponents = (text: string): string[] => {\n const components: string[] = [];\n const trimmed = text.trim();\n\n if (text.startsWith(' ')) {\n components.push(' ');\n } // Leading space\n if (trimmed) {\n components.push(trimmed);\n } // Content (if any)\n if (text.endsWith(' ')) {\n components.push(' ');\n } // Trailing space\n\n return components;\n };\n\n // Process the phrase by matching placeholders\n phrase.replace(placeholderRegex, (placeholder, offset) => {\n if (offset > lastIndex) {\n // Add text before the placeholder\n result.push(...splitTextIntoComponents(phrase.slice(lastIndex, offset)));\n }\n\n // Add the replacement for the placeholder\n const replacementKey = placeholder.slice(1, -1);\n const replacement = replacements[replacementKey]?.trim();\n if (replacement) {\n result.push(replacement);\n }\n\n lastIndex = offset + placeholder.length; // Update lastIndex\n return ''; // Required by `replace`, but not used here\n });\n\n // Add any remaining text after the last match\n if (lastIndex < phrase.length) {\n result.push(...splitTextIntoComponents(phrase.slice(lastIndex)));\n }\n\n return result;\n};\n\n","import { HttpClient } from '@angular/common/http';\nimport { Injectable } from '@angular/core';\nimport { liveQuery } from 'dexie';\nimport { DateTime } from 'luxon';\nimport { BehaviorSubject, combineLatest, from, Observable, of, Subscription, timer } from 'rxjs';\nimport { catchError, map, tap } from 'rxjs/operators';\nimport { db, Translation } from './db';\nimport { matchCase } from './helpers/match-case/match-case.helper';\nimport { splitPhraseIntoComponents } from './helpers/replace-placeholders/replace-placeholders.helper';\nimport { TranslatedData } from './models/translated-data.model';\nimport { RpxLanguage, YesOrNoValue } from './rpx-language.enum';\nimport { RpxTranslationConfig } from './rpx-translation.config';\n\ninterface TranslationsDTO {\n translations: { [from: string]: string | TranslatedData };\n}\n\nexport type Replacements = { [key: string]: string };\n\n@Injectable()\nexport class RpxTranslationService {\n private currentLanguage: RpxLanguage = 'en';\n private languageKey = 'exui-preferred-language';\n\n private phrases: { [phrase: string]: BehaviorSubject<TranslatedData> } = {};\n private observables: { [phrase: string]: Observable<TranslatedData> } = {};\n private requesting: { [lang: string]: string[] } = {};\n private requestTimerSubscription: Subscription | null;\n private languageSource: BehaviorSubject<RpxLanguage> = new BehaviorSubject<RpxLanguage>(this.currentLanguage);\n public language$: Observable<RpxLanguage>;\n\n public get language(): RpxLanguage {\n return this.currentLanguage;\n }\n\n public set language(lang: RpxLanguage) {\n if (lang !== this.currentLanguage) {\n this.currentLanguage = lang;\n this.persistLanguage();\n this.languageSource.next(lang);\n Object.keys(this.phrases).forEach((phrase) => this.translate(phrase));\n }\n }\n\n constructor(\n private config: RpxTranslationConfig,\n private http: HttpClient\n ) {\n const persistedLanguage = this.getPersistedLanguage();\n if (persistedLanguage) {\n this.language = persistedLanguage;\n } else {\n // no language persisted yet, save default\n this.persistLanguage();\n }\n this.language$ = this.languageSource.asObservable();\n }\n\n public getTranslation$(phrase: string): Observable<string> {\n return this.getTranslatedData(phrase.trim()).pipe(\n map((t) => t.translation)\n );\n }\n\n public getTranslationWithReplacements$(phrase: string, replacements: Replacements): Observable<string> {\n // Split the phrase into components first based on replacements\n const components = splitPhraseIntoComponents(phrase, replacements);\n\n // Translate each component individually using getTranslatedData and then combine them\n const translatedComponents$ = components.map((component) => this.getTranslatedData(component).pipe(\n map((translatedData) => translatedData.translation) // Extract the translated string\n ));\n\n return combineLatest(translatedComponents$).pipe(\n map((values: string[]) => values.join('')) // Join the strings without any separator\n );\n }\n\n public getTranslationWithYesOrNo$(phrase: string, yesOrNoValue: string): Observable<string> {\n const isYes = yesOrNoValue?.toLowerCase() === YesOrNoValue.YES.toLowerCase();\n\n return this.getTranslatedData(phrase).pipe(map((translatedData: TranslatedData) => {\n const yesOrNoTranslated = isYes ? (translatedData.yes || yesOrNoValue)\n : (translatedData.no || yesOrNoValue);\n return matchCase(yesOrNoValue!, yesOrNoTranslated);\n }\n ));\n }\n\n private getTranslatedData(phrase: string): Observable<TranslatedData> {\n if (this.observables.hasOwnProperty(phrase)) {\n return this.observables[phrase];\n }\n\n return this.translate(phrase);\n }\n\n private translate(phrase: string): Observable<TranslatedData> {\n const lang = this.language;\n if (!this.phrases.hasOwnProperty(phrase)) {\n this.phrases[phrase] = new BehaviorSubject<TranslatedData>({ translation: phrase });\n this.observables[phrase] = this.phrases[phrase].asObservable();\n }\n\n if (lang === 'en') {\n this.phrases[phrase].next({ translation: phrase });\n } else {\n from(liveQuery(() => db.translations.where('[phrase+lang]').equals([phrase, lang]).first())).pipe(\n tap((t) => {\n if (t && !t.isExpired()) {\n this.phrases[phrase].next(t.translation);\n } else {\n if (t) {\n // expired, clean up DB\n db.translations.delete(t.id!);\n }\n this.phrases[phrase].next({\n translation: `${phrase} [Translation in progress]`,\n yes: 'Yes [Translation in progress]',\n no: 'No [Translation in progress]'\n });\n this.load(phrase, lang);\n }\n }),\n ).subscribe(() => ({}));\n }\n\n return this.observables[phrase];\n }\n\n private shouldTranslate(phrase: string): boolean {\n if (!/[a-zA-Z]/.test(phrase)) {\n return false;\n }\n\n if (phrase.includes('[Translation in progress]')) {\n return false;\n }\n\n // check if phrase consists of a placeholder only (eg ${key})\n if (/^\\$\\{[^}]+\\}$/.test(phrase.trim())) {\n return false;\n }\n\n return true;\n }\n\n private load(phrase: string, lang: RpxLanguage): void {\n if (lang === 'en' || !this.shouldTranslate(phrase)) {\n this.phrases[phrase].next({\n translation: phrase,\n yes: 'Yes',\n no: 'No'\n });\n return;\n }\n\n if (!this.requesting.hasOwnProperty(lang)) {\n this.requesting[lang] = [];\n }\n\n if (this.requesting[lang].indexOf(phrase) !== -1) {\n return;\n }\n\n // Prevent making a API call with empty array of phrase\n if (phrase.length === 0) {\n return;\n }\n\n this.requesting[lang].push(phrase);\n\n if (this.requestTimerSubscription) {\n this.requestTimerSubscription.unsubscribe();\n }\n\n this.requestTimerSubscription = timer(this.config.debounceTimeMs).subscribe(() => {\n const url = this.config.baseUrl + `/${lang}`;\n const s = this.http.post<TranslationsDTO>(url,\n {\n phrases: this.requesting[lang]\n }\n )\n .pipe(\n map((t) => t.translations),\n map((translations) => {\n const translatedData: { [from: string]: TranslatedData } = {};\n\n Object.keys(translations).forEach((p) => {\n if (typeof(translations[p]) === 'string') {\n translatedData[p] = { translation: translations[p] as string };\n } else {\n translatedData[p] = translations[p] as TranslatedData;\n }\n });\n\n return translatedData;\n }),\n catchError(() => {\n const translations: { [from: string]: TranslatedData } = {};\n this.requesting[lang].forEach((p) => (\n translations[p] = this.config.testMode ? { translation: `[Test translation for ${p}]` } : { translation: p })\n );\n return of(translations);\n })\n ).subscribe((translations: { [from: string]: TranslatedData }) => {\n const toAdd: Translation[] = [];\n Object.keys(translations).forEach((p) => {\n toAdd.push(Translation.create(p, lang, translations[p], DateTime.now().plus(this.config.validity).toISO()));\n this.phrases[p].next(translations[p]);\n });\n db.translations.bulkAdd(toAdd);\n this.requesting[lang] = [];\n this.requestTimerSubscription?.unsubscribe();\n this.requestTimerSubscription = null;\n s.unsubscribe();\n });\n });\n }\n\n private persistLanguage(): void {\n document.cookie = `${this.languageKey}=${this.currentLanguage}; SameSite=Strict;`;\n }\n\n private getPersistedLanguage(): RpxLanguage {\n console.log(document.cookie.split(';').find((cookie) => cookie.trim().startsWith(this.languageKey + '='))?.split('=')[1].trim());\n return document.cookie.split(';').find((cookie) => cookie.trim().startsWith(this.languageKey + '='))?.split('=')[1].trim() as RpxLanguage;\n }\n}\n","import { AsyncPipe } from '@angular/common';\nimport { ChangeDetectorRef, Injector, OnDestroy, Pipe, PipeTransform } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { Replacements, RpxTranslationService } from './rpx-translation.service';\n\n@Pipe({\n name: 'rpxTranslate',\n pure: false\n})\nexport class RpxTranslatePipe implements PipeTransform, OnDestroy {\n private asyncPipe: AsyncPipe;\n\n constructor(\n private translationService: RpxTranslationService,\n private injector: Injector\n ) {\n this.asyncPipe = new AsyncPipe(injector.get(ChangeDetectorRef));\n }\n\n public transform<T = string>(value: T, replacements?: Replacements | null, yesOrNoValue?: string): T | null {\n if (value && typeof value === 'string' && value.toString().trim()) {\n let o: Observable<string>;\n if (replacements) {\n o = this.translationService.getTranslationWithReplacements$(value, replacements);\n } else if (yesOrNoValue) {\n o = this.translationService.getTranslationWithYesOrNo$(value, yesOrNoValue);\n } else {\n o = this.translationService.getTranslation$(value);\n }\n\n const ret = this.asyncPipe.transform<string>(o);\n return ret as unknown as T;\n }\n\n return null;\n }\n\n public ngOnDestroy(): void {\n this.asyncPipe.ngOnDestroy();\n }\n}\n","import { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http';\nimport { ModuleWithProviders, NgModule } from '@angular/core';\nimport { RpxTranslatePipe } from './rpx-translate.pipe';\nimport { RpxTranslationConfig } from './rpx-translation.config';\nimport { RpxTranslationService } from './rpx-translation.service';\n\n@NgModule({ declarations: [RpxTranslatePipe],\n exports: [RpxTranslatePipe], imports: [], providers: [provideHttpClient(withInterceptorsFromDi())] })\nexport class RpxTranslationModule {\n public static forRoot(config: RpxTranslationConfig): ModuleWithProviders<RpxTranslationModule> {\n return {\n ngModule: RpxTranslationModule,\n providers: [\n {\n provide: RpxTranslationConfig, useValue: config\n },\n RpxTranslationService\n ]\n };\n }\n\n public static forChild(): ModuleWithProviders<RpxTranslationModule> {\n return {\n ngModule: RpxTranslationModule\n };\n }\n}\n","/*\n * Public API Surface of rpx-translation\n */\n\nexport * from './lib/rpx-language.enum';\nexport * from './lib/rpx-translation.config';\nexport * from './lib/rpx-translation.service';\nexport * from './lib/rpx-translate.pipe';\nexport * from './lib/rpx-translation.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.RpxTranslationConfig","i1.RpxTranslationService"],"mappings":"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"}
1
+ {"version":3,"file":"rpx-xui-translation.mjs","sources":["../../../projects/rpx-xui-translation/src/lib/rpx-language.enum.ts","../../../projects/rpx-xui-translation/src/lib/rpx-translation.config.ts","../../../projects/rpx-xui-translation/src/lib/db.ts","../../../projects/rpx-xui-translation/src/lib/helpers/match-case/match-case.helper.ts","../../../projects/rpx-xui-translation/src/lib/helpers/replace-placeholders/replace-placeholders.helper.ts","../../../projects/rpx-xui-translation/src/lib/rpx-translation.service.ts","../../../projects/rpx-xui-translation/src/lib/rpx-translate.pipe.ts","../../../projects/rpx-xui-translation/src/lib/rpx-translation.module.ts","../../../projects/rpx-xui-translation/src/public-api.ts","../../../projects/rpx-xui-translation/src/rpx-xui-translation.ts"],"sourcesContent":["export type RpxLanguage = 'en' | 'cy';\nexport enum YesOrNoValue {\n YES = 'Yes',\n NO = 'No',\n}\n","export type ValidityDurationSpec = {\n years?: number;\n quarters?: number;\n months?: number;\n weeks?: number;\n days?: number;\n hours?: number;\n minutes?: number;\n seconds?: number;\n milliseconds?: number;\n};\n\nexport class RpxTranslationConfig {\n validity: ValidityDurationSpec;\n baseUrl: string;\n\n debounceTimeMs = 300;\n testMode = false;\n}\n","import Dexie, { Table } from 'dexie';\nimport { DateTime } from 'luxon';\nimport { RpxLanguage } from './rpx-language.enum';\nimport { TranslatedData } from './models/translated-data.model';\n\nexport class Translation {\n id?: number;\n phrase: string;\n lang: RpxLanguage;\n translation: TranslatedData;\n validity: string;\n\n public static create(phrase: string, lang: RpxLanguage, translation: TranslatedData, validity: string): Translation {\n const t = new Translation();\n t.phrase = phrase;\n t.lang = lang;\n t.translation = translation;\n t.validity = validity;\n return t;\n }\n\n isExpired(): boolean {\n return DateTime.fromISO(this.validity) < DateTime.now();\n }\n}\n\nexport class TranslationDB extends Dexie {\n translations: Table<Translation, number>;\n\n constructor() {\n super('RpxTranslations');\n this.version(1).stores({\n translations: '++id, [phrase+lang]'\n });\n this.translations.mapToClass(Translation);\n }\n}\n\nexport const db = new TranslationDB();\n","export const matchCase = (str1: string, str2: string) => {\n if (str1.length === 0 || str2.length === 0) {\n return str2;\n }\n\n if (str1.charAt(0).toUpperCase() === str1.charAt(0)) {\n return `${str2.charAt(0).toUpperCase()}${str2.slice(1)}`;\n }\n return str2.toLowerCase();\n};\n","import { Replacements } from '../../rpx-translation.service';\n\nexport const replacePlaceholders = (input: string, replacements: Replacements) => {\n Object.keys(replacements).forEach((key) => {\n // Ideally use replaceAll here, but that isn't fully compatible with targeted browsers and packaging yet\n const search = `%${key}%`;\n while (input.indexOf(search) !== -1) {\n input = input.replace(search, replacements[key]);\n }\n });\n\n return input;\n};\n\n// Helper method to split the phrase into components, preserving placeholders and text separately\nexport const splitPhraseIntoComponents = (phrase: string, replacements: Record<string, string>): string[] => {\n const result: string[] = [];\n const placeholders = Object.keys(replacements).map((key) => `%${key}%`);\n phrase = phrase.trim();\n\n // Regular expression to match all placeholders in the phrase\n const placeholderRegex = new RegExp(placeholders.join('|'), 'g');\n\n let lastIndex = 0;\n\n // Helper function to split text into spaces and content\n const splitTextIntoComponents = (text: string): string[] => {\n const components: string[] = [];\n const trimmed = text.trim();\n\n if (text.startsWith(' ')) {\n components.push(' ');\n } // Leading space\n if (trimmed) {\n components.push(trimmed);\n } // Content (if any)\n if (text.endsWith(' ')) {\n components.push(' ');\n } // Trailing space\n\n return components;\n };\n\n // Process the phrase by matching placeholders\n phrase.replace(placeholderRegex, (placeholder, offset) => {\n if (offset > lastIndex) {\n // Add text before the placeholder\n result.push(...splitTextIntoComponents(phrase.slice(lastIndex, offset)));\n }\n\n // Add the replacement for the placeholder\n const replacementKey = placeholder.slice(1, -1);\n const replacement = replacements[replacementKey]?.trim();\n if (replacement) {\n result.push(replacement);\n }\n\n lastIndex = offset + placeholder.length; // Update lastIndex\n return ''; // Required by `replace`, but not used here\n });\n\n // Add any remaining text after the last match\n if (lastIndex < phrase.length) {\n result.push(...splitTextIntoComponents(phrase.slice(lastIndex)));\n }\n\n return result;\n};\n\n","import { HttpClient } from '@angular/common/http';\nimport { Injectable } from '@angular/core';\nimport { liveQuery } from 'dexie';\nimport { DateTime } from 'luxon';\nimport { BehaviorSubject, combineLatest, from, Observable, of, Subscription, timer } from 'rxjs';\nimport { catchError, map, tap } from 'rxjs/operators';\nimport { db, Translation } from './db';\nimport { matchCase } from './helpers/match-case/match-case.helper';\nimport { splitPhraseIntoComponents } from './helpers/replace-placeholders/replace-placeholders.helper';\nimport { TranslatedData } from './models/translated-data.model';\nimport { RpxLanguage, YesOrNoValue } from './rpx-language.enum';\nimport { RpxTranslationConfig } from './rpx-translation.config';\n\ninterface TranslationsDTO {\n translations: { [from: string]: string | TranslatedData };\n}\n\nexport type Replacements = { [key: string]: string };\n\n@Injectable()\nexport class RpxTranslationService {\n private currentLanguage: RpxLanguage = 'en';\n private languageKey = 'exui-preferred-language';\n\n private phrases: { [phrase: string]: BehaviorSubject<TranslatedData> } = {};\n private observables: { [phrase: string]: Observable<TranslatedData> } = {};\n private requesting: { [lang: string]: string[] } = {};\n private requestTimerSubscription: Subscription | null;\n private languageSource: BehaviorSubject<RpxLanguage> = new BehaviorSubject<RpxLanguage>(this.currentLanguage);\n public language$: Observable<RpxLanguage>;\n\n public get language(): RpxLanguage {\n return this.currentLanguage;\n }\n\n public set language(lang: RpxLanguage) {\n if (lang !== this.currentLanguage) {\n this.currentLanguage = lang;\n this.persistLanguage();\n this.languageSource.next(lang);\n Object.keys(this.phrases).forEach((phrase) => this.translate(phrase));\n }\n }\n\n constructor(\n private config: RpxTranslationConfig,\n private http: HttpClient\n ) {\n const persistedLanguage = this.getPersistedLanguage();\n if (persistedLanguage) {\n this.language = persistedLanguage;\n } else {\n // no language persisted yet, save default\n this.persistLanguage();\n }\n this.language$ = this.languageSource.asObservable();\n }\n\n public getTranslation$(phrase: string): Observable<string> {\n return this.getTranslatedData(phrase).pipe(\n map((t) => t.translation)\n );\n }\n\n public getTranslationWithReplacements$(phrase: string, replacements: Replacements): Observable<string> {\n // Split the phrase into components first based on replacements\n const components = splitPhraseIntoComponents(phrase, replacements);\n\n // Translate each component individually using getTranslatedData and then combine them\n const translatedComponents$ = components.map((component) => this.getTranslatedData(component).pipe(\n map((translatedData) => translatedData.translation) // Extract the translated string\n ));\n\n return combineLatest(translatedComponents$).pipe(\n map((values: string[]) => values.join('')) // Join the strings without any separator\n );\n }\n\n public getTranslationWithYesOrNo$(phrase: string, yesOrNoValue: string): Observable<string> {\n const isYes = yesOrNoValue?.toLowerCase() === YesOrNoValue.YES.toLowerCase();\n\n return this.getTranslatedData(phrase).pipe(map((translatedData: TranslatedData) => {\n const yesOrNoTranslated = isYes ? (translatedData.yes || yesOrNoValue)\n : (translatedData.no || yesOrNoValue);\n return matchCase(yesOrNoValue!, yesOrNoTranslated);\n }\n ));\n }\n\n private getTranslatedData(phrase: string): Observable<TranslatedData> {\n if (this.observables.hasOwnProperty(phrase)) {\n return this.observables[phrase];\n }\n\n return this.translate(phrase);\n }\n\n private translate(phrase: string): Observable<TranslatedData> {\n const lang = this.language;\n if (!this.phrases.hasOwnProperty(phrase)) {\n this.phrases[phrase] = new BehaviorSubject<TranslatedData>({ translation: phrase });\n this.observables[phrase] = this.phrases[phrase].asObservable();\n }\n\n if (lang === 'en') {\n this.phrases[phrase].next({ translation: phrase });\n } else {\n from(liveQuery(() => db.translations.where('[phrase+lang]').equals([phrase, lang]).first())).pipe(\n tap((t) => {\n if (t && !t.isExpired()) {\n this.phrases[phrase].next(t.translation);\n } else {\n if (t) {\n // expired, clean up DB\n db.translations.delete(t.id!);\n }\n this.phrases[phrase].next({\n translation: `${phrase} [Translation in progress]`,\n yes: 'Yes [Translation in progress]',\n no: 'No [Translation in progress]'\n });\n this.load(phrase, lang);\n }\n }),\n ).subscribe(() => ({}));\n }\n\n return this.observables[phrase];\n }\n\n private shouldTranslate(phrase: string): boolean {\n if (!/[a-zA-Z]/.test(phrase)) {\n return false;\n }\n\n if (phrase.includes('[Translation in progress]')) {\n return false;\n }\n\n // check if phrase consists of a placeholder only (eg ${key})\n if (/^\\$\\{[^}]+\\}$/.test(phrase.trim())) {\n return false;\n }\n\n return true;\n }\n\n private load(phrase: string, lang: RpxLanguage): void {\n if (lang === 'en' || !this.shouldTranslate(phrase)) {\n this.phrases[phrase].next({\n translation: phrase,\n yes: 'Yes',\n no: 'No'\n });\n return;\n }\n\n if (!this.requesting.hasOwnProperty(lang)) {\n this.requesting[lang] = [];\n }\n\n if (this.requesting[lang].indexOf(phrase) !== -1) {\n return;\n }\n\n // Prevent making a API call with empty array of phrase\n if (phrase.length === 0) {\n return;\n }\n\n this.requesting[lang].push(phrase);\n\n if (this.requestTimerSubscription) {\n this.requestTimerSubscription.unsubscribe();\n }\n\n this.requestTimerSubscription = timer(this.config.debounceTimeMs).subscribe(() => {\n const url = this.config.baseUrl + `/${lang}`;\n const s = this.http.post<TranslationsDTO>(url,\n {\n phrases: this.requesting[lang]\n }\n )\n .pipe(\n map((t) => t.translations),\n map((translations) => {\n const translatedData: { [from: string]: TranslatedData } = {};\n\n Object.keys(translations).forEach((p) => {\n if (typeof(translations[p]) === 'string') {\n translatedData[p] = { translation: translations[p] as string };\n } else {\n translatedData[p] = translations[p] as TranslatedData;\n }\n });\n\n return translatedData;\n }),\n catchError(() => {\n const translations: { [from: string]: TranslatedData } = {};\n this.requesting[lang].forEach((p) => (\n translations[p] = this.config.testMode ? { translation: `[Test translation for ${p}]` } : { translation: p })\n );\n return of(translations);\n })\n ).subscribe((translations: { [from: string]: TranslatedData }) => {\n const toAdd: Translation[] = [];\n Object.keys(translations).forEach((p) => {\n toAdd.push(Translation.create(p, lang, translations[p], DateTime.now().plus(this.config.validity).toISO()));\n this.phrases[p].next(translations[p]);\n });\n db.translations.bulkAdd(toAdd);\n this.requesting[lang] = [];\n this.requestTimerSubscription?.unsubscribe();\n this.requestTimerSubscription = null;\n s.unsubscribe();\n });\n });\n }\n\n private persistLanguage(): void {\n document.cookie = `${this.languageKey}=${this.currentLanguage}; SameSite=Strict;`;\n }\n\n private getPersistedLanguage(): RpxLanguage {\n console.log(document.cookie.split(';').find((cookie) => cookie.trim().startsWith(this.languageKey + '='))?.split('=')[1].trim());\n return document.cookie.split(';').find((cookie) => cookie.trim().startsWith(this.languageKey + '='))?.split('=')[1].trim() as RpxLanguage;\n }\n}\n","import { AsyncPipe } from '@angular/common';\nimport { ChangeDetectorRef, OnDestroy, Pipe, PipeTransform } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { Replacements, RpxTranslationService } from './rpx-translation.service';\n\n@Pipe({\n name: 'rpxTranslate',\n pure: false,\n standalone: false\n})\nexport class RpxTranslatePipe implements PipeTransform, OnDestroy {\n private asyncPipe: AsyncPipe;\n\n constructor(\n private translationService: RpxTranslationService,\n changeDetectorRef: ChangeDetectorRef\n ) {\n this.asyncPipe = new AsyncPipe(changeDetectorRef);\n }\n\n public transform<T = string>(value: T, replacements?: Replacements | null, yesOrNoValue?: string): T | null {\n if (value && typeof value === 'string' && value.toString().trim()) {\n let o: Observable<string>;\n if (replacements) {\n o = this.translationService.getTranslationWithReplacements$(value, replacements);\n } else if (yesOrNoValue) {\n o = this.translationService.getTranslationWithYesOrNo$(value, yesOrNoValue);\n } else {\n o = this.translationService.getTranslation$(value);\n }\n\n const ret = this.asyncPipe.transform<string>(o);\n return ret as unknown as T;\n }\n\n return null;\n }\n\n public ngOnDestroy(): void {\n this.asyncPipe.ngOnDestroy();\n }\n}\n","import { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http';\nimport { ModuleWithProviders, NgModule } from '@angular/core';\nimport { RpxTranslatePipe } from './rpx-translate.pipe';\nimport { RpxTranslationConfig } from './rpx-translation.config';\nimport { RpxTranslationService } from './rpx-translation.service';\n\n@NgModule({ declarations: [RpxTranslatePipe],\n exports: [RpxTranslatePipe], imports: [], providers: [provideHttpClient(withInterceptorsFromDi())] })\nexport class RpxTranslationModule {\n public static forRoot(config: RpxTranslationConfig): ModuleWithProviders<RpxTranslationModule> {\n return {\n ngModule: RpxTranslationModule,\n providers: [\n {\n provide: RpxTranslationConfig, useValue: config\n },\n RpxTranslationService\n ]\n };\n }\n\n public static forChild(): ModuleWithProviders<RpxTranslationModule> {\n return {\n ngModule: RpxTranslationModule\n };\n }\n}\n","/*\n * Public API Surface of rpx-translation\n */\n\nexport * from './lib/rpx-language.enum';\nexport * from './lib/rpx-translation.config';\nexport * from './lib/rpx-translation.service';\nexport * from './lib/rpx-translate.pipe';\nexport * from './lib/rpx-translation.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.RpxTranslationConfig","i1.RpxTranslationService"],"mappings":"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"}
package/index.d.ts CHANGED
@@ -1,5 +1,79 @@
1
- /**
2
- * Generated bundle index. Do not edit.
3
- */
4
- /// <amd-module name="rpx-xui-translation" />
5
- export * from './public-api';
1
+ import { HttpClient } from '@angular/common/http';
2
+ import { Observable } from 'rxjs';
3
+ import * as i0 from '@angular/core';
4
+ import { PipeTransform, OnDestroy, ChangeDetectorRef, ModuleWithProviders } from '@angular/core';
5
+
6
+ type RpxLanguage = 'en' | 'cy';
7
+ declare enum YesOrNoValue {
8
+ YES = "Yes",
9
+ NO = "No"
10
+ }
11
+
12
+ type ValidityDurationSpec = {
13
+ years?: number;
14
+ quarters?: number;
15
+ months?: number;
16
+ weeks?: number;
17
+ days?: number;
18
+ hours?: number;
19
+ minutes?: number;
20
+ seconds?: number;
21
+ milliseconds?: number;
22
+ };
23
+ declare class RpxTranslationConfig {
24
+ validity: ValidityDurationSpec;
25
+ baseUrl: string;
26
+ debounceTimeMs: number;
27
+ testMode: boolean;
28
+ }
29
+
30
+ type Replacements = {
31
+ [key: string]: string;
32
+ };
33
+ declare class RpxTranslationService {
34
+ private config;
35
+ private http;
36
+ private currentLanguage;
37
+ private languageKey;
38
+ private phrases;
39
+ private observables;
40
+ private requesting;
41
+ private requestTimerSubscription;
42
+ private languageSource;
43
+ language$: Observable<RpxLanguage>;
44
+ get language(): RpxLanguage;
45
+ set language(lang: RpxLanguage);
46
+ constructor(config: RpxTranslationConfig, http: HttpClient);
47
+ getTranslation$(phrase: string): Observable<string>;
48
+ getTranslationWithReplacements$(phrase: string, replacements: Replacements): Observable<string>;
49
+ getTranslationWithYesOrNo$(phrase: string, yesOrNoValue: string): Observable<string>;
50
+ private getTranslatedData;
51
+ private translate;
52
+ private shouldTranslate;
53
+ private load;
54
+ private persistLanguage;
55
+ private getPersistedLanguage;
56
+ static ɵfac: i0.ɵɵFactoryDeclaration<RpxTranslationService, never>;
57
+ static ɵprov: i0.ɵɵInjectableDeclaration<RpxTranslationService>;
58
+ }
59
+
60
+ declare class RpxTranslatePipe implements PipeTransform, OnDestroy {
61
+ private translationService;
62
+ private asyncPipe;
63
+ constructor(translationService: RpxTranslationService, changeDetectorRef: ChangeDetectorRef);
64
+ transform<T = string>(value: T, replacements?: Replacements | null, yesOrNoValue?: string): T | null;
65
+ ngOnDestroy(): void;
66
+ static ɵfac: i0.ɵɵFactoryDeclaration<RpxTranslatePipe, never>;
67
+ static ɵpipe: i0.ɵɵPipeDeclaration<RpxTranslatePipe, "rpxTranslate", false>;
68
+ }
69
+
70
+ declare class RpxTranslationModule {
71
+ static forRoot(config: RpxTranslationConfig): ModuleWithProviders<RpxTranslationModule>;
72
+ static forChild(): ModuleWithProviders<RpxTranslationModule>;
73
+ static ɵfac: i0.ɵɵFactoryDeclaration<RpxTranslationModule, never>;
74
+ static ɵmod: i0.ɵɵNgModuleDeclaration<RpxTranslationModule, [typeof RpxTranslatePipe], never, [typeof RpxTranslatePipe]>;
75
+ static ɵinj: i0.ɵɵInjectorDeclaration<RpxTranslationModule>;
76
+ }
77
+
78
+ export { RpxTranslatePipe, RpxTranslationConfig, RpxTranslationModule, RpxTranslationService, YesOrNoValue };
79
+ export type { Replacements, RpxLanguage, ValidityDurationSpec };
package/package.json CHANGED
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "name": "rpx-xui-translation",
3
- "version": "1.1.3-welsh-translation-fix",
3
+ "version": "1.2.0",
4
4
  "peerDependencies": {
5
- "@angular/common": "^18.2.13",
6
- "@angular/core": "^18.2.13"
5
+ "@angular/common": "^20.3.1",
6
+ "@angular/core": "^20.3.1"
7
7
  },
8
8
  "dependencies": {
9
9
  "dexie": "^3.2.2",
@@ -18,8 +18,6 @@
18
18
  },
19
19
  ".": {
20
20
  "types": "./index.d.ts",
21
- "esm2022": "./esm2022/rpx-xui-translation.mjs",
22
- "esm": "./esm2022/rpx-xui-translation.mjs",
23
21
  "default": "./fesm2022/rpx-xui-translation.mjs"
24
22
  }
25
23
  },
@@ -1,26 +0,0 @@
1
- import Dexie from 'dexie';
2
- import { DateTime } from 'luxon';
3
- export class Translation {
4
- static create(phrase, lang, translation, validity) {
5
- const t = new Translation();
6
- t.phrase = phrase;
7
- t.lang = lang;
8
- t.translation = translation;
9
- t.validity = validity;
10
- return t;
11
- }
12
- isExpired() {
13
- return DateTime.fromISO(this.validity) < DateTime.now();
14
- }
15
- }
16
- export class TranslationDB extends Dexie {
17
- constructor() {
18
- super('RpxTranslations');
19
- this.version(1).stores({
20
- translations: '++id, [phrase+lang]'
21
- });
22
- this.translations.mapToClass(Translation);
23
- }
24
- }
25
- export const db = new TranslationDB();
26
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9ycHgteHVpLXRyYW5zbGF0aW9uL3NyYy9saWIvZGIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFnQixNQUFNLE9BQU8sQ0FBQztBQUNyQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBSWpDLE1BQU0sT0FBTyxXQUFXO0lBT2YsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFjLEVBQUUsSUFBaUIsRUFBRSxXQUEyQixFQUFFLFFBQWdCO1FBQ25HLE1BQU0sQ0FBQyxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7UUFDNUIsQ0FBQyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDbEIsQ0FBQyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDZCxDQUFDLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztRQUM1QixDQUFDLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUN0QixPQUFPLENBQUMsQ0FBQztJQUNYLENBQUM7SUFFRCxTQUFTO1FBQ1AsT0FBTyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDMUQsQ0FBQztDQUNGO0FBRUQsTUFBTSxPQUFPLGFBQWMsU0FBUSxLQUFLO0lBR3RDO1FBQ0UsS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDekIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7WUFDckIsWUFBWSxFQUFFLHFCQUFxQjtTQUNwQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUM1QyxDQUFDO0NBQ0Y7QUFFRCxNQUFNLENBQUMsTUFBTSxFQUFFLEdBQUcsSUFBSSxhQUFhLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBEZXhpZSwgeyBUYWJsZSB9IGZyb20gJ2RleGllJztcbmltcG9ydCB7IERhdGVUaW1lIH0gZnJvbSAnbHV4b24nO1xuaW1wb3J0IHsgUnB4TGFuZ3VhZ2UgfSBmcm9tICcuL3JweC1sYW5ndWFnZS5lbnVtJztcbmltcG9ydCB7IFRyYW5zbGF0ZWREYXRhIH0gZnJvbSAnLi9tb2RlbHMvdHJhbnNsYXRlZC1kYXRhLm1vZGVsJztcblxuZXhwb3J0IGNsYXNzIFRyYW5zbGF0aW9uIHtcbiAgaWQ/OiBudW1iZXI7XG4gIHBocmFzZTogc3RyaW5nO1xuICBsYW5nOiBScHhMYW5ndWFnZTtcbiAgdHJhbnNsYXRpb246IFRyYW5zbGF0ZWREYXRhO1xuICB2YWxpZGl0eTogc3RyaW5nO1xuXG4gIHB1YmxpYyBzdGF0aWMgY3JlYXRlKHBocmFzZTogc3RyaW5nLCBsYW5nOiBScHhMYW5ndWFnZSwgdHJhbnNsYXRpb246IFRyYW5zbGF0ZWREYXRhLCB2YWxpZGl0eTogc3RyaW5nKTogVHJhbnNsYXRpb24ge1xuICAgIGNvbnN0IHQgPSBuZXcgVHJhbnNsYXRpb24oKTtcbiAgICB0LnBocmFzZSA9IHBocmFzZTtcbiAgICB0LmxhbmcgPSBsYW5nO1xuICAgIHQudHJhbnNsYXRpb24gPSB0cmFuc2xhdGlvbjtcbiAgICB0LnZhbGlkaXR5ID0gdmFsaWRpdHk7XG4gICAgcmV0dXJuIHQ7XG4gIH1cblxuICBpc0V4cGlyZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIERhdGVUaW1lLmZyb21JU08odGhpcy52YWxpZGl0eSkgPCBEYXRlVGltZS5ub3coKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVHJhbnNsYXRpb25EQiBleHRlbmRzIERleGllIHtcbiAgdHJhbnNsYXRpb25zOiBUYWJsZTxUcmFuc2xhdGlvbiwgbnVtYmVyPjtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcignUnB4VHJhbnNsYXRpb25zJyk7XG4gICAgdGhpcy52ZXJzaW9uKDEpLnN0b3Jlcyh7XG4gICAgICB0cmFuc2xhdGlvbnM6ICcrK2lkLCBbcGhyYXNlK2xhbmddJ1xuICAgIH0pO1xuICAgIHRoaXMudHJhbnNsYXRpb25zLm1hcFRvQ2xhc3MoVHJhbnNsYXRpb24pO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBkYiA9IG5ldyBUcmFuc2xhdGlvbkRCKCk7XG4iXX0=
@@ -1,10 +0,0 @@
1
- export const matchCase = (str1, str2) => {
2
- if (str1.length === 0 || str2.length === 0) {
3
- return str2;
4
- }
5
- if (str1.charAt(0).toUpperCase() === str1.charAt(0)) {
6
- return `${str2.charAt(0).toUpperCase()}${str2.slice(1)}`;
7
- }
8
- return str2.toLowerCase();
9
- };
10
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0Y2gtY2FzZS5oZWxwZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ycHgteHVpLXRyYW5zbGF0aW9uL3NyYy9saWIvaGVscGVycy9tYXRjaC1jYXNlL21hdGNoLWNhc2UuaGVscGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBRyxDQUFDLElBQVksRUFBRSxJQUFZLEVBQUUsRUFBRTtJQUN0RCxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDM0MsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxLQUFLLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNwRCxPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDM0QsQ0FBQztJQUNELE9BQU8sSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0FBQzVCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBtYXRjaENhc2UgPSAoc3RyMTogc3RyaW5nLCBzdHIyOiBzdHJpbmcpID0+IHtcbiAgaWYgKHN0cjEubGVuZ3RoID09PSAwIHx8IHN0cjIubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHN0cjI7XG4gIH1cblxuICBpZiAoc3RyMS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSA9PT0gc3RyMS5jaGFyQXQoMCkpIHtcbiAgICByZXR1cm4gYCR7c3RyMi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKX0ke3N0cjIuc2xpY2UoMSl9YDtcbiAgfVxuICByZXR1cm4gc3RyMi50b0xvd2VyQ2FzZSgpO1xufTtcbiJdfQ==
@@ -1,55 +0,0 @@
1
- export const replacePlaceholders = (input, replacements) => {
2
- Object.keys(replacements).forEach((key) => {
3
- // Ideally use replaceAll here, but that isn't fully compatible with targeted browsers and packaging yet
4
- const search = `%${key}%`;
5
- while (input.indexOf(search) !== -1) {
6
- input = input.replace(search, replacements[key]);
7
- }
8
- });
9
- return input;
10
- };
11
- // Helper method to split the phrase into components, preserving placeholders and text separately
12
- export const splitPhraseIntoComponents = (phrase, replacements) => {
13
- const result = [];
14
- const placeholders = Object.keys(replacements).map((key) => `%${key}%`);
15
- phrase = phrase.trim();
16
- // Regular expression to match all placeholders in the phrase
17
- const placeholderRegex = new RegExp(placeholders.join('|'), 'g');
18
- let lastIndex = 0;
19
- // Helper function to split text into spaces and content
20
- const splitTextIntoComponents = (text) => {
21
- const components = [];
22
- const trimmed = text.trim();
23
- if (text.startsWith(' ')) {
24
- components.push(' ');
25
- } // Leading space
26
- if (trimmed) {
27
- components.push(trimmed);
28
- } // Content (if any)
29
- if (text.endsWith(' ')) {
30
- components.push(' ');
31
- } // Trailing space
32
- return components;
33
- };
34
- // Process the phrase by matching placeholders
35
- phrase.replace(placeholderRegex, (placeholder, offset) => {
36
- if (offset > lastIndex) {
37
- // Add text before the placeholder
38
- result.push(...splitTextIntoComponents(phrase.slice(lastIndex, offset)));
39
- }
40
- // Add the replacement for the placeholder
41
- const replacementKey = placeholder.slice(1, -1);
42
- const replacement = replacements[replacementKey]?.trim();
43
- if (replacement) {
44
- result.push(replacement);
45
- }
46
- lastIndex = offset + placeholder.length; // Update lastIndex
47
- return ''; // Required by `replace`, but not used here
48
- });
49
- // Add any remaining text after the last match
50
- if (lastIndex < phrase.length) {
51
- result.push(...splitTextIntoComponents(phrase.slice(lastIndex)));
52
- }
53
- return result;
54
- };
55
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwbGFjZS1wbGFjZWhvbGRlcnMuaGVscGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcnB4LXh1aS10cmFuc2xhdGlvbi9zcmMvbGliL2hlbHBlcnMvcmVwbGFjZS1wbGFjZWhvbGRlcnMvcmVwbGFjZS1wbGFjZWhvbGRlcnMuaGVscGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLENBQUMsS0FBYSxFQUFFLFlBQTBCLEVBQUUsRUFBRTtJQUMvRSxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1FBQ3hDLHdHQUF3RztRQUN4RyxNQUFNLE1BQU0sR0FBRyxJQUFJLEdBQUcsR0FBRyxDQUFDO1FBQzFCLE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3BDLEtBQUssR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNuRCxDQUFDO0lBQ0gsQ0FBQyxDQUFDLENBQUM7SUFFSCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUMsQ0FBQztBQUVGLGlHQUFpRztBQUNqRyxNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBRyxDQUFDLE1BQWMsRUFBRSxZQUFvQyxFQUFZLEVBQUU7SUFDMUcsTUFBTSxNQUFNLEdBQWEsRUFBRSxDQUFDO0lBQzVCLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7SUFDeEUsTUFBTSxHQUFHLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUV2Qiw2REFBNkQ7SUFDN0QsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLE1BQU0sQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBRWpFLElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQztJQUVsQix3REFBd0Q7SUFDeEQsTUFBTSx1QkFBdUIsR0FBRyxDQUFDLElBQVksRUFBWSxFQUFFO1FBQ3pELE1BQU0sVUFBVSxHQUFhLEVBQUUsQ0FBQztRQUNoQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFFNUIsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDekIsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN2QixDQUFDLENBQUMsZ0JBQWdCO1FBQ2xCLElBQUksT0FBTyxFQUFFLENBQUM7WUFDWixVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzNCLENBQUMsQ0FBQyxtQkFBbUI7UUFDckIsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDdkIsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN2QixDQUFDLENBQUMsaUJBQWlCO1FBRW5CLE9BQU8sVUFBVSxDQUFDO0lBQ3BCLENBQUMsQ0FBQztJQUVGLDhDQUE4QztJQUM5QyxNQUFNLENBQUMsT0FBTyxDQUFDLGdCQUFnQixFQUFFLENBQUMsV0FBVyxFQUFFLE1BQU0sRUFBRSxFQUFFO1FBQ3ZELElBQUksTUFBTSxHQUFHLFNBQVMsRUFBRSxDQUFDO1lBQ3ZCLGtDQUFrQztZQUNsQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsdUJBQXVCLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNFLENBQUM7UUFFRCwwQ0FBMEM7UUFDMUMsTUFBTSxjQUFjLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoRCxNQUFNLFdBQVcsR0FBRyxZQUFZLENBQUMsY0FBYyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFDekQsSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUNoQixNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzNCLENBQUM7UUFFRCxTQUFTLEdBQUcsTUFBTSxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxtQkFBbUI7UUFDNUQsT0FBTyxFQUFFLENBQUMsQ0FBQywyQ0FBMkM7SUFDeEQsQ0FBQyxDQUFDLENBQUM7SUFFSCw4Q0FBOEM7SUFDOUMsSUFBSSxTQUFTLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQzlCLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyx1QkFBdUIsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBRUQsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUmVwbGFjZW1lbnRzIH0gZnJvbSAnLi4vLi4vcnB4LXRyYW5zbGF0aW9uLnNlcnZpY2UnO1xuXG5leHBvcnQgY29uc3QgcmVwbGFjZVBsYWNlaG9sZGVycyA9IChpbnB1dDogc3RyaW5nLCByZXBsYWNlbWVudHM6IFJlcGxhY2VtZW50cykgPT4ge1xuICBPYmplY3Qua2V5cyhyZXBsYWNlbWVudHMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgIC8vIElkZWFsbHkgdXNlIHJlcGxhY2VBbGwgaGVyZSwgYnV0IHRoYXQgaXNuJ3QgZnVsbHkgY29tcGF0aWJsZSB3aXRoIHRhcmdldGVkIGJyb3dzZXJzIGFuZCBwYWNrYWdpbmcgeWV0XG4gICAgY29uc3Qgc2VhcmNoID0gYCUke2tleX0lYDtcbiAgICB3aGlsZSAoaW5wdXQuaW5kZXhPZihzZWFyY2gpICE9PSAtMSkge1xuICAgICAgaW5wdXQgPSBpbnB1dC5yZXBsYWNlKHNlYXJjaCwgcmVwbGFjZW1lbnRzW2tleV0pO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIGlucHV0O1xufTtcblxuLy8gSGVscGVyIG1ldGhvZCB0byBzcGxpdCB0aGUgcGhyYXNlIGludG8gY29tcG9uZW50cywgcHJlc2VydmluZyBwbGFjZWhvbGRlcnMgYW5kIHRleHQgc2VwYXJhdGVseVxuZXhwb3J0IGNvbnN0IHNwbGl0UGhyYXNlSW50b0NvbXBvbmVudHMgPSAocGhyYXNlOiBzdHJpbmcsIHJlcGxhY2VtZW50czogUmVjb3JkPHN0cmluZywgc3RyaW5nPik6IHN0cmluZ1tdID0+IHtcbiAgY29uc3QgcmVzdWx0OiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBwbGFjZWhvbGRlcnMgPSBPYmplY3Qua2V5cyhyZXBsYWNlbWVudHMpLm1hcCgoa2V5KSA9PiBgJSR7a2V5fSVgKTtcbiAgcGhyYXNlID0gcGhyYXNlLnRyaW0oKTtcblxuICAvLyBSZWd1bGFyIGV4cHJlc3Npb24gdG8gbWF0Y2ggYWxsIHBsYWNlaG9sZGVycyBpbiB0aGUgcGhyYXNlXG4gIGNvbnN0IHBsYWNlaG9sZGVyUmVnZXggPSBuZXcgUmVnRXhwKHBsYWNlaG9sZGVycy5qb2luKCd8JyksICdnJyk7XG5cbiAgbGV0IGxhc3RJbmRleCA9IDA7XG5cbiAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIHNwbGl0IHRleHQgaW50byBzcGFjZXMgYW5kIGNvbnRlbnRcbiAgY29uc3Qgc3BsaXRUZXh0SW50b0NvbXBvbmVudHMgPSAodGV4dDogc3RyaW5nKTogc3RyaW5nW10gPT4ge1xuICAgIGNvbnN0IGNvbXBvbmVudHM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgdHJpbW1lZCA9IHRleHQudHJpbSgpO1xuXG4gICAgaWYgKHRleHQuc3RhcnRzV2l0aCgnICcpKSB7XG4gICAgICBjb21wb25lbnRzLnB1c2goJyAnKTtcbiAgICB9IC8vIExlYWRpbmcgc3BhY2VcbiAgICBpZiAodHJpbW1lZCkge1xuICAgICAgY29tcG9uZW50cy5wdXNoKHRyaW1tZWQpO1xuICAgIH0gLy8gQ29udGVudCAoaWYgYW55KVxuICAgIGlmICh0ZXh0LmVuZHNXaXRoKCcgJykpIHtcbiAgICAgIGNvbXBvbmVudHMucHVzaCgnICcpO1xuICAgIH0gLy8gVHJhaWxpbmcgc3BhY2VcblxuICAgIHJldHVybiBjb21wb25lbnRzO1xuICB9O1xuXG4gIC8vIFByb2Nlc3MgdGhlIHBocmFzZSBieSBtYXRjaGluZyBwbGFjZWhvbGRlcnNcbiAgcGhyYXNlLnJlcGxhY2UocGxhY2Vob2xkZXJSZWdleCwgKHBsYWNlaG9sZGVyLCBvZmZzZXQpID0+IHtcbiAgICBpZiAob2Zmc2V0ID4gbGFzdEluZGV4KSB7XG4gICAgICAvLyBBZGQgdGV4dCBiZWZvcmUgdGhlIHBsYWNlaG9sZGVyXG4gICAgICByZXN1bHQucHVzaCguLi5zcGxpdFRleHRJbnRvQ29tcG9uZW50cyhwaHJhc2Uuc2xpY2UobGFzdEluZGV4LCBvZmZzZXQpKSk7XG4gICAgfVxuXG4gICAgLy8gQWRkIHRoZSByZXBsYWNlbWVudCBmb3IgdGhlIHBsYWNlaG9sZGVyXG4gICAgY29uc3QgcmVwbGFjZW1lbnRLZXkgPSBwbGFjZWhvbGRlci5zbGljZSgxLCAtMSk7XG4gICAgY29uc3QgcmVwbGFjZW1lbnQgPSByZXBsYWNlbWVudHNbcmVwbGFjZW1lbnRLZXldPy50cmltKCk7XG4gICAgaWYgKHJlcGxhY2VtZW50KSB7XG4gICAgICByZXN1bHQucHVzaChyZXBsYWNlbWVudCk7XG4gICAgfVxuXG4gICAgbGFzdEluZGV4ID0gb2Zmc2V0ICsgcGxhY2Vob2xkZXIubGVuZ3RoOyAvLyBVcGRhdGUgbGFzdEluZGV4XG4gICAgcmV0dXJuICcnOyAvLyBSZXF1aXJlZCBieSBgcmVwbGFjZWAsIGJ1dCBub3QgdXNlZCBoZXJlXG4gIH0pO1xuXG4gIC8vIEFkZCBhbnkgcmVtYWluaW5nIHRleHQgYWZ0ZXIgdGhlIGxhc3QgbWF0Y2hcbiAgaWYgKGxhc3RJbmRleCA8IHBocmFzZS5sZW5ndGgpIHtcbiAgICByZXN1bHQucHVzaCguLi5zcGxpdFRleHRJbnRvQ29tcG9uZW50cyhwaHJhc2Uuc2xpY2UobGFzdEluZGV4KSkpO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbiJdfQ==
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNsYXRlZC1kYXRhLm1vZGVsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcnB4LXh1aS10cmFuc2xhdGlvbi9zcmMvbGliL21vZGVscy90cmFuc2xhdGVkLWRhdGEubW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBpbnRlcmZhY2UgVHJhbnNsYXRlZERhdGEge1xuICB0cmFuc2xhdGlvbjogc3RyaW5nO1xuICB5ZXNPck5vRmllbGQ/OiBib29sZWFuO1xuICB5ZXM/OiBzdHJpbmc7XG4gIG5vPzogc3RyaW5nO1xufVxuIl19
@@ -1,6 +0,0 @@
1
- export var YesOrNoValue;
2
- (function (YesOrNoValue) {
3
- YesOrNoValue["YES"] = "Yes";
4
- YesOrNoValue["NO"] = "No";
5
- })(YesOrNoValue || (YesOrNoValue = {}));
6
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnB4LWxhbmd1YWdlLmVudW0uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9ycHgteHVpLXRyYW5zbGF0aW9uL3NyYy9saWIvcnB4LWxhbmd1YWdlLmVudW0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsTUFBTSxDQUFOLElBQVksWUFHWDtBQUhELFdBQVksWUFBWTtJQUN0QiwyQkFBVyxDQUFBO0lBQ1gseUJBQVMsQ0FBQTtBQUNYLENBQUMsRUFIVyxZQUFZLEtBQVosWUFBWSxRQUd2QiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIFJweExhbmd1YWdlID0gJ2VuJyB8ICdjeSc7XG5leHBvcnQgZW51bSBZZXNPck5vVmFsdWUge1xuICBZRVMgPSAnWWVzJyxcbiAgTk8gPSAnTm8nLFxufVxuIl19
@@ -1,41 +0,0 @@
1
- import { AsyncPipe } from '@angular/common';
2
- import { ChangeDetectorRef, Pipe } from '@angular/core';
3
- import * as i0 from "@angular/core";
4
- import * as i1 from "./rpx-translation.service";
5
- export class RpxTranslatePipe {
6
- constructor(translationService, injector) {
7
- this.translationService = translationService;
8
- this.injector = injector;
9
- this.asyncPipe = new AsyncPipe(injector.get(ChangeDetectorRef));
10
- }
11
- transform(value, replacements, yesOrNoValue) {
12
- if (value && typeof value === 'string' && value.toString().trim()) {
13
- let o;
14
- if (replacements) {
15
- o = this.translationService.getTranslationWithReplacements$(value, replacements);
16
- }
17
- else if (yesOrNoValue) {
18
- o = this.translationService.getTranslationWithYesOrNo$(value, yesOrNoValue);
19
- }
20
- else {
21
- o = this.translationService.getTranslation$(value);
22
- }
23
- const ret = this.asyncPipe.transform(o);
24
- return ret;
25
- }
26
- return null;
27
- }
28
- ngOnDestroy() {
29
- this.asyncPipe.ngOnDestroy();
30
- }
31
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RpxTranslatePipe, deps: [{ token: i1.RpxTranslationService }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Pipe }); }
32
- static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "18.2.13", ngImport: i0, type: RpxTranslatePipe, name: "rpxTranslate", pure: false }); }
33
- }
34
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RpxTranslatePipe, decorators: [{
35
- type: Pipe,
36
- args: [{
37
- name: 'rpxTranslate',
38
- pure: false
39
- }]
40
- }], ctorParameters: () => [{ type: i1.RpxTranslationService }, { type: i0.Injector }] });
41
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnB4LXRyYW5zbGF0ZS5waXBlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvcnB4LXh1aS10cmFuc2xhdGlvbi9zcmMvbGliL3JweC10cmFuc2xhdGUucGlwZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDNUMsT0FBTyxFQUFFLGlCQUFpQixFQUF1QixJQUFJLEVBQWlCLE1BQU0sZUFBZSxDQUFDOzs7QUFRNUYsTUFBTSxPQUFPLGdCQUFnQjtJQUczQixZQUNVLGtCQUF5QyxFQUN6QyxRQUFrQjtRQURsQix1QkFBa0IsR0FBbEIsa0JBQWtCLENBQXVCO1FBQ3pDLGFBQVEsR0FBUixRQUFRLENBQVU7UUFFMUIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLFNBQVMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBRU0sU0FBUyxDQUFhLEtBQVEsRUFBRSxZQUFrQyxFQUFFLFlBQXFCO1FBQzlGLElBQUksS0FBSyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQztZQUNsRSxJQUFJLENBQXFCLENBQUM7WUFDMUIsSUFBSSxZQUFZLEVBQUUsQ0FBQztnQkFDakIsQ0FBQyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQywrQkFBK0IsQ0FBQyxLQUFLLEVBQUUsWUFBWSxDQUFDLENBQUM7WUFDbkYsQ0FBQztpQkFBTSxJQUFJLFlBQVksRUFBRSxDQUFDO2dCQUN4QixDQUFDLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLDBCQUEwQixDQUFDLEtBQUssRUFBRSxZQUFZLENBQUMsQ0FBQztZQUM5RSxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sQ0FBQyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDckQsQ0FBQztZQUVELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFTLENBQUMsQ0FBQyxDQUFDO1lBQ2hELE9BQU8sR0FBbUIsQ0FBQztRQUM3QixDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRU0sV0FBVztRQUNoQixJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQy9CLENBQUM7K0dBOUJVLGdCQUFnQjs2R0FBaEIsZ0JBQWdCOzs0RkFBaEIsZ0JBQWdCO2tCQUo1QixJQUFJO21CQUFDO29CQUNKLElBQUksRUFBRSxjQUFjO29CQUNwQixJQUFJLEVBQUUsS0FBSztpQkFDWiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFzeW5jUGlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3RvclJlZiwgSW5qZWN0b3IsIE9uRGVzdHJveSwgUGlwZSwgUGlwZVRyYW5zZm9ybSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgUmVwbGFjZW1lbnRzLCBScHhUcmFuc2xhdGlvblNlcnZpY2UgfSBmcm9tICcuL3JweC10cmFuc2xhdGlvbi5zZXJ2aWNlJztcblxuQFBpcGUoe1xuICBuYW1lOiAncnB4VHJhbnNsYXRlJyxcbiAgcHVyZTogZmFsc2Vcbn0pXG5leHBvcnQgY2xhc3MgUnB4VHJhbnNsYXRlUGlwZSBpbXBsZW1lbnRzIFBpcGVUcmFuc2Zvcm0sIE9uRGVzdHJveSB7XG4gIHByaXZhdGUgYXN5bmNQaXBlOiBBc3luY1BpcGU7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSB0cmFuc2xhdGlvblNlcnZpY2U6IFJweFRyYW5zbGF0aW9uU2VydmljZSxcbiAgICBwcml2YXRlIGluamVjdG9yOiBJbmplY3RvclxuICApIHtcbiAgICB0aGlzLmFzeW5jUGlwZSA9IG5ldyBBc3luY1BpcGUoaW5qZWN0b3IuZ2V0KENoYW5nZURldGVjdG9yUmVmKSk7XG4gIH1cblxuICBwdWJsaWMgdHJhbnNmb3JtPFQgPSBzdHJpbmc+KHZhbHVlOiBULCByZXBsYWNlbWVudHM/OiBSZXBsYWNlbWVudHMgfCBudWxsLCB5ZXNPck5vVmFsdWU/OiBzdHJpbmcpOiBUIHwgbnVsbCB7XG4gICAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUudG9TdHJpbmcoKS50cmltKCkpIHtcbiAgICAgIGxldCBvOiBPYnNlcnZhYmxlPHN0cmluZz47XG4gICAgICBpZiAocmVwbGFjZW1lbnRzKSB7XG4gICAgICAgIG8gPSB0aGlzLnRyYW5zbGF0aW9uU2VydmljZS5nZXRUcmFuc2xhdGlvbldpdGhSZXBsYWNlbWVudHMkKHZhbHVlLCByZXBsYWNlbWVudHMpO1xuICAgICAgfSBlbHNlIGlmICh5ZXNPck5vVmFsdWUpIHtcbiAgICAgICAgbyA9IHRoaXMudHJhbnNsYXRpb25TZXJ2aWNlLmdldFRyYW5zbGF0aW9uV2l0aFllc09yTm8kKHZhbHVlLCB5ZXNPck5vVmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbyA9IHRoaXMudHJhbnNsYXRpb25TZXJ2aWNlLmdldFRyYW5zbGF0aW9uJCh2YWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJldCA9IHRoaXMuYXN5bmNQaXBlLnRyYW5zZm9ybTxzdHJpbmc+KG8pO1xuICAgICAgcmV0dXJuIHJldCBhcyB1bmtub3duIGFzIFQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5hc3luY1BpcGUubmdPbkRlc3Ryb3koKTtcbiAgfVxufVxuIl19
@@ -1,7 +0,0 @@
1
- export class RpxTranslationConfig {
2
- constructor() {
3
- this.debounceTimeMs = 300;
4
- this.testMode = false;
5
- }
6
- }
7
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnB4LXRyYW5zbGF0aW9uLmNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3JweC14dWktdHJhbnNsYXRpb24vc3JjL2xpYi9ycHgtdHJhbnNsYXRpb24uY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQVlBLE1BQU0sT0FBTyxvQkFBb0I7SUFBakM7UUFJRSxtQkFBYyxHQUFHLEdBQUcsQ0FBQztRQUNyQixhQUFRLEdBQUcsS0FBSyxDQUFDO0lBQ25CLENBQUM7Q0FBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIFZhbGlkaXR5RHVyYXRpb25TcGVjID0ge1xuICAgIHllYXJzPzogbnVtYmVyO1xuICAgIHF1YXJ0ZXJzPzogbnVtYmVyO1xuICAgIG1vbnRocz86IG51bWJlcjtcbiAgICB3ZWVrcz86IG51bWJlcjtcbiAgICBkYXlzPzogbnVtYmVyO1xuICAgIGhvdXJzPzogbnVtYmVyO1xuICAgIG1pbnV0ZXM/OiBudW1iZXI7XG4gICAgc2Vjb25kcz86IG51bWJlcjtcbiAgICBtaWxsaXNlY29uZHM/OiBudW1iZXI7XG59O1xuXG5leHBvcnQgY2xhc3MgUnB4VHJhbnNsYXRpb25Db25maWcge1xuICB2YWxpZGl0eTogVmFsaWRpdHlEdXJhdGlvblNwZWM7XG4gIGJhc2VVcmw6IHN0cmluZztcblxuICBkZWJvdW5jZVRpbWVNcyA9IDMwMDtcbiAgdGVzdE1vZGUgPSBmYWxzZTtcbn1cbiJdfQ==
@@ -1,33 +0,0 @@
1
- import { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http';
2
- import { NgModule } from '@angular/core';
3
- import { RpxTranslatePipe } from './rpx-translate.pipe';
4
- import { RpxTranslationConfig } from './rpx-translation.config';
5
- import { RpxTranslationService } from './rpx-translation.service';
6
- import * as i0 from "@angular/core";
7
- export class RpxTranslationModule {
8
- static forRoot(config) {
9
- return {
10
- ngModule: RpxTranslationModule,
11
- providers: [
12
- {
13
- provide: RpxTranslationConfig, useValue: config
14
- },
15
- RpxTranslationService
16
- ]
17
- };
18
- }
19
- static forChild() {
20
- return {
21
- ngModule: RpxTranslationModule
22
- };
23
- }
24
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RpxTranslationModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
25
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.13", ngImport: i0, type: RpxTranslationModule, declarations: [RpxTranslatePipe], exports: [RpxTranslatePipe] }); }
26
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RpxTranslationModule, providers: [provideHttpClient(withInterceptorsFromDi())] }); }
27
- }
28
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RpxTranslationModule, decorators: [{
29
- type: NgModule,
30
- args: [{ declarations: [RpxTranslatePipe],
31
- exports: [RpxTranslatePipe], imports: [], providers: [provideHttpClient(withInterceptorsFromDi())] }]
32
- }] });
33
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnB4LXRyYW5zbGF0aW9uLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3JweC14dWktdHJhbnNsYXRpb24vc3JjL2xpYi9ycHgtdHJhbnNsYXRpb24ubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2pGLE9BQU8sRUFBdUIsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzlELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDOztBQUlsRSxNQUFNLE9BQU8sb0JBQW9CO0lBQ3hCLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBNEI7UUFDaEQsT0FBTztZQUNMLFFBQVEsRUFBRSxvQkFBb0I7WUFDOUIsU0FBUyxFQUFFO2dCQUNUO29CQUNFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxRQUFRLEVBQUUsTUFBTTtpQkFDaEQ7Z0JBQ0QscUJBQXFCO2FBQ3RCO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFTSxNQUFNLENBQUMsUUFBUTtRQUNwQixPQUFPO1lBQ0wsUUFBUSxFQUFFLG9CQUFvQjtTQUMvQixDQUFDO0lBQ0osQ0FBQzsrR0FqQlUsb0JBQW9CO2dIQUFwQixvQkFBb0IsaUJBRk4sZ0JBQWdCLGFBQy9CLGdCQUFnQjtnSEFDZixvQkFBb0IsYUFEc0IsQ0FBQyxpQkFBaUIsQ0FBQyxzQkFBc0IsRUFBRSxDQUFDLENBQUM7OzRGQUN2RixvQkFBb0I7a0JBRmhDLFFBQVE7bUJBQUMsRUFBRSxZQUFZLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQztvQkFDMUMsT0FBTyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLHNCQUFzQixFQUFFLENBQUMsQ0FBQyxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcHJvdmlkZUh0dHBDbGllbnQsIHdpdGhJbnRlcmNlcHRvcnNGcm9tRGkgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBNb2R1bGVXaXRoUHJvdmlkZXJzLCBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUnB4VHJhbnNsYXRlUGlwZSB9IGZyb20gJy4vcnB4LXRyYW5zbGF0ZS5waXBlJztcbmltcG9ydCB7IFJweFRyYW5zbGF0aW9uQ29uZmlnIH0gZnJvbSAnLi9ycHgtdHJhbnNsYXRpb24uY29uZmlnJztcbmltcG9ydCB7IFJweFRyYW5zbGF0aW9uU2VydmljZSB9IGZyb20gJy4vcnB4LXRyYW5zbGF0aW9uLnNlcnZpY2UnO1xuXG5ATmdNb2R1bGUoeyBkZWNsYXJhdGlvbnM6IFtScHhUcmFuc2xhdGVQaXBlXSxcbiAgZXhwb3J0czogW1JweFRyYW5zbGF0ZVBpcGVdLCBpbXBvcnRzOiBbXSwgcHJvdmlkZXJzOiBbcHJvdmlkZUh0dHBDbGllbnQod2l0aEludGVyY2VwdG9yc0Zyb21EaSgpKV0gfSlcbmV4cG9ydCBjbGFzcyBScHhUcmFuc2xhdGlvbk1vZHVsZSB7XG4gIHB1YmxpYyBzdGF0aWMgZm9yUm9vdChjb25maWc6IFJweFRyYW5zbGF0aW9uQ29uZmlnKTogTW9kdWxlV2l0aFByb3ZpZGVyczxScHhUcmFuc2xhdGlvbk1vZHVsZT4ge1xuICAgIHJldHVybiB7XG4gICAgICBuZ01vZHVsZTogUnB4VHJhbnNsYXRpb25Nb2R1bGUsXG4gICAgICBwcm92aWRlcnM6IFtcbiAgICAgICAge1xuICAgICAgICAgIHByb3ZpZGU6IFJweFRyYW5zbGF0aW9uQ29uZmlnLCB1c2VWYWx1ZTogY29uZmlnXG4gICAgICAgIH0sXG4gICAgICAgIFJweFRyYW5zbGF0aW9uU2VydmljZVxuICAgICAgXVxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGZvckNoaWxkKCk6IE1vZHVsZVdpdGhQcm92aWRlcnM8UnB4VHJhbnNsYXRpb25Nb2R1bGU+IHtcbiAgICByZXR1cm4ge1xuICAgICAgbmdNb2R1bGU6IFJweFRyYW5zbGF0aW9uTW9kdWxlXG4gICAgfTtcbiAgfVxufVxuIl19
@@ -1,183 +0,0 @@
1
- import { Injectable } from '@angular/core';
2
- import { liveQuery } from 'dexie';
3
- import { DateTime } from 'luxon';
4
- import { BehaviorSubject, combineLatest, from, of, timer } from 'rxjs';
5
- import { catchError, map, tap } from 'rxjs/operators';
6
- import { db, Translation } from './db';
7
- import { matchCase } from './helpers/match-case/match-case.helper';
8
- import { splitPhraseIntoComponents } from './helpers/replace-placeholders/replace-placeholders.helper';
9
- import { YesOrNoValue } from './rpx-language.enum';
10
- import * as i0 from "@angular/core";
11
- import * as i1 from "./rpx-translation.config";
12
- import * as i2 from "@angular/common/http";
13
- export class RpxTranslationService {
14
- get language() {
15
- return this.currentLanguage;
16
- }
17
- set language(lang) {
18
- if (lang !== this.currentLanguage) {
19
- this.currentLanguage = lang;
20
- this.persistLanguage();
21
- this.languageSource.next(lang);
22
- Object.keys(this.phrases).forEach((phrase) => this.translate(phrase));
23
- }
24
- }
25
- constructor(config, http) {
26
- this.config = config;
27
- this.http = http;
28
- this.currentLanguage = 'en';
29
- this.languageKey = 'exui-preferred-language';
30
- this.phrases = {};
31
- this.observables = {};
32
- this.requesting = {};
33
- this.languageSource = new BehaviorSubject(this.currentLanguage);
34
- const persistedLanguage = this.getPersistedLanguage();
35
- if (persistedLanguage) {
36
- this.language = persistedLanguage;
37
- }
38
- else {
39
- // no language persisted yet, save default
40
- this.persistLanguage();
41
- }
42
- this.language$ = this.languageSource.asObservable();
43
- }
44
- getTranslation$(phrase) {
45
- return this.getTranslatedData(phrase.trim()).pipe(map((t) => t.translation));
46
- }
47
- getTranslationWithReplacements$(phrase, replacements) {
48
- // Split the phrase into components first based on replacements
49
- const components = splitPhraseIntoComponents(phrase, replacements);
50
- // Translate each component individually using getTranslatedData and then combine them
51
- const translatedComponents$ = components.map((component) => this.getTranslatedData(component).pipe(map((translatedData) => translatedData.translation) // Extract the translated string
52
- ));
53
- return combineLatest(translatedComponents$).pipe(map((values) => values.join('')) // Join the strings without any separator
54
- );
55
- }
56
- getTranslationWithYesOrNo$(phrase, yesOrNoValue) {
57
- const isYes = yesOrNoValue?.toLowerCase() === YesOrNoValue.YES.toLowerCase();
58
- return this.getTranslatedData(phrase).pipe(map((translatedData) => {
59
- const yesOrNoTranslated = isYes ? (translatedData.yes || yesOrNoValue)
60
- : (translatedData.no || yesOrNoValue);
61
- return matchCase(yesOrNoValue, yesOrNoTranslated);
62
- }));
63
- }
64
- getTranslatedData(phrase) {
65
- if (this.observables.hasOwnProperty(phrase)) {
66
- return this.observables[phrase];
67
- }
68
- return this.translate(phrase);
69
- }
70
- translate(phrase) {
71
- const lang = this.language;
72
- if (!this.phrases.hasOwnProperty(phrase)) {
73
- this.phrases[phrase] = new BehaviorSubject({ translation: phrase });
74
- this.observables[phrase] = this.phrases[phrase].asObservable();
75
- }
76
- if (lang === 'en') {
77
- this.phrases[phrase].next({ translation: phrase });
78
- }
79
- else {
80
- from(liveQuery(() => db.translations.where('[phrase+lang]').equals([phrase, lang]).first())).pipe(tap((t) => {
81
- if (t && !t.isExpired()) {
82
- this.phrases[phrase].next(t.translation);
83
- }
84
- else {
85
- if (t) {
86
- // expired, clean up DB
87
- db.translations.delete(t.id);
88
- }
89
- this.phrases[phrase].next({
90
- translation: `${phrase} [Translation in progress]`,
91
- yes: 'Yes [Translation in progress]',
92
- no: 'No [Translation in progress]'
93
- });
94
- this.load(phrase, lang);
95
- }
96
- })).subscribe(() => ({}));
97
- }
98
- return this.observables[phrase];
99
- }
100
- shouldTranslate(phrase) {
101
- if (!/[a-zA-Z]/.test(phrase)) {
102
- return false;
103
- }
104
- if (phrase.includes('[Translation in progress]')) {
105
- return false;
106
- }
107
- // check if phrase consists of a placeholder only (eg ${key})
108
- if (/^\$\{[^}]+\}$/.test(phrase.trim())) {
109
- return false;
110
- }
111
- return true;
112
- }
113
- load(phrase, lang) {
114
- if (lang === 'en' || !this.shouldTranslate(phrase)) {
115
- this.phrases[phrase].next({
116
- translation: phrase,
117
- yes: 'Yes',
118
- no: 'No'
119
- });
120
- return;
121
- }
122
- if (!this.requesting.hasOwnProperty(lang)) {
123
- this.requesting[lang] = [];
124
- }
125
- if (this.requesting[lang].indexOf(phrase) !== -1) {
126
- return;
127
- }
128
- // Prevent making a API call with empty array of phrase
129
- if (phrase.length === 0) {
130
- return;
131
- }
132
- this.requesting[lang].push(phrase);
133
- if (this.requestTimerSubscription) {
134
- this.requestTimerSubscription.unsubscribe();
135
- }
136
- this.requestTimerSubscription = timer(this.config.debounceTimeMs).subscribe(() => {
137
- const url = this.config.baseUrl + `/${lang}`;
138
- const s = this.http.post(url, {
139
- phrases: this.requesting[lang]
140
- })
141
- .pipe(map((t) => t.translations), map((translations) => {
142
- const translatedData = {};
143
- Object.keys(translations).forEach((p) => {
144
- if (typeof (translations[p]) === 'string') {
145
- translatedData[p] = { translation: translations[p] };
146
- }
147
- else {
148
- translatedData[p] = translations[p];
149
- }
150
- });
151
- return translatedData;
152
- }), catchError(() => {
153
- const translations = {};
154
- this.requesting[lang].forEach((p) => (translations[p] = this.config.testMode ? { translation: `[Test translation for ${p}]` } : { translation: p }));
155
- return of(translations);
156
- })).subscribe((translations) => {
157
- const toAdd = [];
158
- Object.keys(translations).forEach((p) => {
159
- toAdd.push(Translation.create(p, lang, translations[p], DateTime.now().plus(this.config.validity).toISO()));
160
- this.phrases[p].next(translations[p]);
161
- });
162
- db.translations.bulkAdd(toAdd);
163
- this.requesting[lang] = [];
164
- this.requestTimerSubscription?.unsubscribe();
165
- this.requestTimerSubscription = null;
166
- s.unsubscribe();
167
- });
168
- });
169
- }
170
- persistLanguage() {
171
- document.cookie = `${this.languageKey}=${this.currentLanguage}; SameSite=Strict;`;
172
- }
173
- getPersistedLanguage() {
174
- console.log(document.cookie.split(';').find((cookie) => cookie.trim().startsWith(this.languageKey + '='))?.split('=')[1].trim());
175
- return document.cookie.split(';').find((cookie) => cookie.trim().startsWith(this.languageKey + '='))?.split('=')[1].trim();
176
- }
177
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RpxTranslationService, deps: [{ token: i1.RpxTranslationConfig }, { token: i2.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable }); }
178
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RpxTranslationService }); }
179
- }
180
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RpxTranslationService, decorators: [{
181
- type: Injectable
182
- }], ctorParameters: () => [{ type: i1.RpxTranslationConfig }, { type: i2.HttpClient }] });
183
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnB4LXRyYW5zbGF0aW9uLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9ycHgteHVpLXRyYW5zbGF0aW9uL3NyYy9saWIvcnB4LXRyYW5zbGF0aW9uLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQ2xDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDakMsT0FBTyxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFjLEVBQUUsRUFBZ0IsS0FBSyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2pHLE9BQU8sRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxFQUFFLEVBQUUsV0FBVyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUNuRSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSw0REFBNEQsQ0FBQztBQUV2RyxPQUFPLEVBQWUsWUFBWSxFQUFFLE1BQU0scUJBQXFCLENBQUM7Ozs7QUFVaEUsTUFBTSxPQUFPLHFCQUFxQjtJQVdoQyxJQUFXLFFBQVE7UUFDakIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDO0lBQzlCLENBQUM7SUFFRCxJQUFXLFFBQVEsQ0FBQyxJQUFpQjtRQUNuQyxJQUFJLElBQUksS0FBSyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDbEMsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7WUFDNUIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFD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QyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ2pJLE9BQU8sUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxXQUFXLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFpQixDQUFDO0lBQzVJLENBQUM7K0dBL01VLHFCQUFxQjttSEFBckIscUJBQXFCOzs0RkFBckIscUJBQXFCO2tCQURqQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGxpdmVRdWVyeSB9IGZyb20gJ2RleGllJztcbmltcG9ydCB7IERhdGVUaW1lIH0gZnJvbSAnbHV4b24nO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBjb21iaW5lTGF0ZXN0LCBmcm9tLCBPYnNlcnZhYmxlLCBvZiwgU3Vic2NyaXB0aW9uLCB0aW1lciB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgY2F0Y2hFcnJvciwgbWFwLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBkYiwgVHJhbnNsYXRpb24gfSBmcm9tICcuL2RiJztcbmltcG9ydCB7IG1hdGNoQ2FzZSB9IGZyb20gJy4vaGVscGVycy9tYXRjaC1jYXNlL21hdGNoLWNhc2UuaGVscGVyJztcbmltcG9ydCB7IHNwbGl0UGhyYXNlSW50b0NvbXBvbmVudHMgfSBmcm9tICcuL2hlbHBlcnMvcmVwbGFjZS1wbGFjZWhvbGRlcnMvcmVwbGFjZS1wbGFjZWhvbGRlcnMuaGVscGVyJztcbmltcG9ydCB7IFRyYW5zbGF0ZWREYXRhIH0gZnJvbSAnLi9tb2RlbHMvdHJhbnNsYXRlZC1kYXRhLm1vZGVsJztcbmltcG9ydCB7IFJweExhbmd1YWdlLCBZZXNPck5vVmFsdWUgfSBmcm9tICcuL3JweC1sYW5ndWFnZS5lbnVtJztcbmltcG9ydCB7IFJweFRyYW5zbGF0aW9uQ29uZmlnIH0gZnJvbSAnLi9ycHgtdHJhbnNsYXRpb24uY29uZmlnJztcblxuaW50ZXJmYWNlIFRyYW5zbGF0aW9uc0RUTyB7XG4gIHRyYW5zbGF0aW9uczogeyBbZnJvbTogc3RyaW5nXTogc3RyaW5nIHwgVHJhbnNsYXRlZERhdGEgfTtcbn1cblxuZXhwb3J0IHR5cGUgUmVwbGFjZW1lbnRzID0geyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFJweFRyYW5zbGF0aW9uU2VydmljZSB7XG4gIHByaXZhdGUgY3VycmVudExhbmd1YWdlOiBScHhMYW5ndWFnZSA9ICdlbic7XG4gIHByaXZhdGUgbGFuZ3VhZ2VLZXkgPSAnZXh1aS1wcmVmZXJyZWQtbGFuZ3VhZ2UnO1xuXG4gIHByaXZhdGUgcGhyYXNlczogeyBbcGhyYXNlOiBzdHJpbmddOiBCZWhhdmlvclN1YmplY3Q8VHJhbnNsYXRlZERhdGE+IH0gPSB7fTtcbiAgcHJpdmF0ZSBvYnNlcnZhYmxlczogeyBbcGhyYXNlOiBzdHJpbmddOiBPYnNlcnZhYmxlPFRyYW5zbGF0ZWREYXRhPiB9ID0ge307XG4gIHByaXZhdGUgcmVxdWVzdGluZzogeyBbbGFuZzogc3RyaW5nXTogc3RyaW5nW10gfSA9IHt9O1xuICBwcml2YXRlIHJlcXVlc3RUaW1lclN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uIHwgbnVsbDtcbiAgcHJpdmF0ZSBsYW5ndWFnZVNvdXJjZTogQmVoYXZpb3JTdWJqZWN0PFJweExhbmd1YWdlPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8UnB4TGFuZ3VhZ2U+KHRoaXMuY3VycmVudExhbmd1YWdlKTtcbiAgcHVibGljIGxhbmd1YWdlJDogT2JzZXJ2YWJsZTxScHhMYW5ndWFnZT47XG5cbiAgcHVibGljIGdldCBsYW5ndWFnZSgpOiBScHhMYW5ndWFnZSB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudExhbmd1YWdlO1xuICB9XG5cbiAgcHVibGljIHNldCBsYW5ndWFnZShsYW5nOiBScHhMYW5ndWFnZSkge1xuICAgIGlmIChsYW5nICE9PSB0aGlzLmN1cnJlbnRMYW5ndWFnZSkge1xuICAgICAgdGhpcy5jdXJyZW50TGFuZ3VhZ2UgPSBsYW5nO1xuICAgICAgdGhpcy5wZXJzaXN0TGFuZ3VhZ2UoKTtcbiAgICAgIHRoaXMubGFuZ3VhZ2VTb3VyY2UubmV4dChsYW5nKTtcbiAgICAgIE9iamVjdC5rZXlzKHRoaXMucGhyYXNlcykuZm9yRWFjaCgocGhyYXNlKSA9PiB0aGlzLnRyYW5zbGF0ZShwaHJhc2UpKTtcbiAgICB9XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGNvbmZpZzogUnB4VHJhbnNsYXRpb25Db25maWcsXG4gICAgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50XG4gICkge1xuICAgIGNvbnN0IHBlcnNpc3RlZExhbmd1YWdlID0gdGhpcy5nZXRQZXJzaXN0ZWRMYW5ndWFnZSgpO1xuICAgIGlmIChwZXJzaXN0ZWRMYW5ndWFnZSkge1xuICAgICAgdGhpcy5sYW5ndWFnZSA9IHBlcnNpc3RlZExhbmd1YWdlO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBubyBsYW5ndWFnZSBwZXJzaXN0ZWQgeWV0LCBzYXZlIGRlZmF1bHRcbiAgICAgIHRoaXMucGVyc2lzdExhbmd1YWdlKCk7XG4gICAgfVxuICAgIHRoaXMubGFuZ3VhZ2UkID0gdGhpcy5sYW5ndWFnZVNvdXJjZS5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRUcmFuc2xhdGlvbiQocGhyYXNlOiBzdHJpbmcpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLmdldFRyYW5zbGF0ZWREYXRhKHBocmFzZS50cmltKCkpLnBpcGUoXG4gICAgICBtYXAoKHQpID0+IHQudHJhbnNsYXRpb24pXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRUcmFuc2xhdGlvbldpdGhSZXBsYWNlbWVudHMkKHBocmFzZTogc3RyaW5nLCByZXBsYWNlbWVudHM6IFJlcGxhY2VtZW50cyk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgLy8gU3BsaXQgdGhlIHBocmFzZSBpbnRvIGNvbXBvbmVudHMgZmlyc3QgYmFzZWQgb24gcmVwbGFjZW1lbnRzXG4gICAgY29uc3QgY29tcG9uZW50cyA9IHNwbGl0UGhyYXNlSW50b0NvbXBvbmVudHMocGhyYXNlLCByZXBsYWNlbWVudHMpO1xuXG4gICAgLy8gVHJhbnNsYXRlIGVhY2ggY29tcG9uZW50IGluZGl2aWR1YWxseSB1c2luZyBnZXRUcmFuc2xhdGVkRGF0YSBhbmQgdGhlbiBjb21iaW5lIHRoZW1cbiAgICBjb25zdCB0cmFuc2xhdGVkQ29tcG9uZW50cyQgPSBjb21wb25lbnRzLm1hcCgoY29tcG9uZW50KSA9PiB0aGlzLmdldFRyYW5zbGF0ZWREYXRhKGNvbXBvbmVudCkucGlwZShcbiAgICAgIG1hcCgodHJhbnNsYXRlZERhdGEpID0+IHRyYW5zbGF0ZWREYXRhLnRyYW5zbGF0aW9uKSAvLyBFeHRyYWN0IHRoZSB0cmFuc2xhdGVkIHN0cmluZ1xuICAgICkpO1xuXG4gICAgcmV0dXJuIGNvbWJpbmVMYXRlc3QodHJhbnNsYXRlZENvbXBvbmVudHMkKS5waXBlKFxuICAgICAgbWFwKCh2YWx1ZXM6IHN0cmluZ1tdKSA9PiB2YWx1ZXMuam9pbignJykpIC8vIEpvaW4gdGhlIHN0cmluZ3Mgd2l0aG91dCBhbnkgc2VwYXJhdG9yXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRUcmFuc2xhdGlvbldpdGhZZXNPck5vJChwaHJhc2U6IHN0cmluZywgeWVzT3JOb1ZhbHVlOiBzdHJpbmcpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgIGNvbnN0IGlzWWVzID0geWVzT3JOb1ZhbHVlPy50b0xvd2VyQ2FzZSgpID09PSBZZXNPck5vVmFsdWUuWUVTLnRvTG93ZXJDYXNlKCk7XG5cbiAgICByZXR1cm4gdGhpcy5nZXRUcmFuc2xhdGVkRGF0YShwaHJhc2UpLnBpcGUobWFwKCh0cmFuc2xhdGVkRGF0YTogVHJhbnNsYXRlZERhdGEpID0+IHtcbiAgICAgIGNvbnN0IHllc09yTm9UcmFuc2xhdGVkID0gaXNZZXMgPyAodHJhbnNsYXRlZERhdGEueWVzIHx8IHllc09yTm9WYWx1ZSlcbiAgICAgICAgOiAodHJhbnNsYXRlZERhdGEubm8gfHwgeWVzT3JOb1ZhbHVlKTtcbiAgICAgIHJldHVybiBtYXRjaENhc2UoeWVzT3JOb1ZhbHVlISwgeWVzT3JOb1RyYW5zbGF0ZWQpO1xuICAgIH1cbiAgICApKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VHJhbnNsYXRlZERhdGEocGhyYXNlOiBzdHJpbmcpOiBPYnNlcnZhYmxlPFRyYW5zbGF0ZWREYXRhPiB7XG4gICAgaWYgKHRoaXMub2JzZXJ2YWJsZXMuaGFzT3duUHJvcGVydHkocGhyYXNlKSkge1xuICAgICAgcmV0dXJuIHRoaXMub2JzZXJ2YWJsZXNbcGhyYXNlXTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy50cmFuc2xhdGUocGhyYXNlKTtcbiAgfVxuXG4gIHByaXZhdGUgdHJhbnNsYXRlKHBocmFzZTogc3RyaW5nKTogT2JzZXJ2YWJsZTxUcmFuc2xhdGVkRGF0YT4ge1xuICAgIGNvbnN0IGxhbmcgPSB0aGlzLmxhbmd1YWdlO1xuICAgIGlmICghdGhpcy5waHJhc2VzLmhhc093blByb3BlcnR5KHBocmFzZSkpIHtcbiAgICAgIHRoaXMucGhyYXNlc1twaHJhc2VdID0gbmV3IEJlaGF2aW9yU3ViamVjdDxUcmFuc2xhdGVkRGF0YT4oeyB0cmFuc2xhdGlvbjogcGhyYXNlIH0pO1xuICAgICAgdGhpcy5vYnNlcnZhYmxlc1twaHJhc2VdID0gdGhpcy5waHJhc2VzW3BocmFzZV0uYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxuXG4gICAgaWYgKGxhbmcgPT09ICdlbicpIHtcbiAgICAgIHRoaXMucGhyYXNlc1twaHJhc2VdLm5leHQoeyB0cmFuc2xhdGlvbjogcGhyYXNlIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBmcm9tKGxpdmVRdWVyeSgoKSA9PiBkYi50cmFuc2xhdGlvbnMud2hlcmUoJ1twaHJhc2UrbGFuZ10nKS5lcXVhbHMoW3BocmFzZSwgbGFuZ10pLmZpcnN0KCkpKS5waXBlKFxuICAgICAgICB0YXAoKHQpID0+IHtcbiAgICAgICAgICBpZiAodCAmJiAhdC5pc0V4cGlyZWQoKSkge1xuICAgICAgICAgICAgdGhpcy5waHJhc2VzW3BocmFzZV0ubmV4dCh0LnRyYW5zbGF0aW9uKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHQpIHtcbiAgICAgICAgICAgICAgLy8gZXhwaXJlZCwgY2xlYW4gdXAgREJcbiAgICAgICAgICAgICAgZGIudHJhbnNsYXRpb25zLmRlbGV0ZSh0LmlkISk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnBocmFzZXNbcGhyYXNlXS5uZXh0KHtcbiAgICAgICAgICAgICAgdHJhbnNsYXRpb246IGAke3BocmFzZX0gW1RyYW5zbGF0aW9uIGluIHByb2dyZXNzXWAsXG4gICAgICAgICAgICAgIHllczogJ1llcyBbVHJhbnNsYXRpb24gaW4gcHJvZ3Jlc3NdJyxcbiAgICAgICAgICAgICAgbm86ICdObyBbVHJhbnNsYXRpb24gaW4gcHJvZ3Jlc3NdJ1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLmxvYWQocGhyYXNlLCBsYW5nKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pLFxuICAgICAgKS5zdWJzY3JpYmUoKCkgPT4gKHt9KSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMub2JzZXJ2YWJsZXNbcGhyYXNlXTtcbiAgfVxuXG4gIHByaXZhdGUgc2hvdWxkVHJhbnNsYXRlKHBocmFzZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKCEvW2EtekEtWl0vLnRlc3QocGhyYXNlKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChwaHJhc2UuaW5jbHVkZXMoJ1tUcmFuc2xhdGlvbiBpbiBwcm9ncmVzc10nKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIGNoZWNrIGlmIHBocmFzZSBjb25zaXN0cyBvZiBhIHBsYWNlaG9sZGVyIG9ubHkgKGVnICR7a2V5fSlcbiAgICBpZiAoL15cXCRcXHtbXn1dK1xcfSQvLnRlc3QocGhyYXNlLnRyaW0oKSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgbG9hZChwaHJhc2U6IHN0cmluZywgbGFuZzogUnB4TGFuZ3VhZ2UpOiB2b2lkIHtcbiAgICBpZiAobGFuZyA9PT0gJ2VuJyB8fCAhdGhpcy5zaG91bGRUcmFuc2xhdGUocGhyYXNlKSkge1xuICAgICAgdGhpcy5waHJhc2VzW3BocmFzZV0ubmV4dCh7XG4gICAgICAgIHRyYW5zbGF0aW9uOiBwaHJhc2UsXG4gICAgICAgIHllczogJ1llcycsXG4gICAgICAgIG5vOiAnTm8nXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMucmVxdWVzdGluZy5oYXNPd25Qcm9wZXJ0eShsYW5nKSkge1xuICAgICAgdGhpcy5yZXF1ZXN0aW5nW2xhbmddID0gW107XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucmVxdWVzdGluZ1tsYW5nXS5pbmRleE9mKHBocmFzZSkgIT09IC0xKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gUHJldmVudCBtYWtpbmcgYSBBUEkgY2FsbCB3aXRoIGVtcHR5IGFycmF5IG9mIHBocmFzZVxuICAgIGlmIChwaHJhc2UubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5yZXF1ZXN0aW5nW2xhbmddLnB1c2gocGhyYXNlKTtcblxuICAgIGlmICh0aGlzLnJlcXVlc3RUaW1lclN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5yZXF1ZXN0VGltZXJTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICB0aGlzLnJlcXVlc3RUaW1lclN1YnNjcmlwdGlvbiA9IHRpbWVyKHRoaXMuY29uZmlnLmRlYm91bmNlVGltZU1zKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgY29uc3QgdXJsID0gdGhpcy5jb25maWcuYmFzZVVybCArIGAvJHtsYW5nfWA7XG4gICAgICBjb25zdCBzID0gdGhpcy5odHRwLnBvc3Q8VHJhbnNsYXRpb25zRFRPPih1cmwsXG4gICAgICAgIHtcbiAgICAgICAgICBwaHJhc2VzOiB0aGlzLnJlcXVlc3RpbmdbbGFuZ11cbiAgICAgICAgfVxuICAgICAgKVxuICAgICAgICAucGlwZShcbiAgICAgICAgICBtYXAoKHQpID0+IHQudHJhbnNsYXRpb25zKSxcbiAgICAgICAgICBtYXAoKHRyYW5zbGF0aW9ucykgPT4ge1xuICAgICAgICAgICAgY29uc3QgdHJhbnNsYXRlZERhdGE6IHsgW2Zyb206IHN0cmluZ106IFRyYW5zbGF0ZWREYXRhIH0gPSB7fTtcblxuICAgICAgICAgICAgT2JqZWN0LmtleXModHJhbnNsYXRpb25zKS5mb3JFYWNoKChwKSA9PiB7XG4gICAgICAgICAgICAgIGlmICh0eXBlb2YodHJhbnNsYXRpb25zW3BdKSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICB0cmFuc2xhdGVkRGF0YVtwXSA9IHsgdHJhbnNsYXRpb246IHRyYW5zbGF0aW9uc1twXSBhcyBzdHJpbmcgfTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0cmFuc2xhdGVkRGF0YVtwXSA9IHRyYW5zbGF0aW9uc1twXSBhcyBUcmFuc2xhdGVkRGF0YTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiB0cmFuc2xhdGVkRGF0YTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBjYXRjaEVycm9yKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHRyYW5zbGF0aW9uczogeyBbZnJvbTogc3RyaW5nXTogVHJhbnNsYXRlZERhdGEgfSA9IHt9O1xuICAgICAgICAgICAgdGhpcy5yZXF1ZXN0aW5nW2xhbmddLmZvckVhY2goKHApID0+IChcbiAgICAgICAgICAgICAgdHJhbnNsYXRpb25zW3BdID0gdGhpcy5jb25maWcudGVzdE1vZGUgPyB7IHRyYW5zbGF0aW9uOiBgW1Rlc3QgdHJhbnNsYXRpb24gZm9yICR7cH1dYCB9IDogeyB0cmFuc2xhdGlvbjogcCB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybiBvZih0cmFuc2xhdGlvbnMpO1xuICAgICAgICAgIH0pXG4gICAgICAgICkuc3Vic2NyaWJlKCh0cmFuc2xhdGlvbnM6IHsgW2Zyb206IHN0cmluZ106IFRyYW5zbGF0ZWREYXRhIH0pID0+IHtcbiAgICAgICAgICBjb25zdCB0b0FkZDogVHJhbnNsYXRpb25bXSA9IFtdO1xuICAgICAgICAgIE9iamVjdC5rZXlzKHRyYW5zbGF0aW9ucykuZm9yRWFjaCgocCkgPT4ge1xuICAgICAgICAgICAgdG9BZGQucHVzaChUcmFuc2xhdGlvbi5jcmVhdGUocCwgbGFuZywgdHJhbnNsYXRpb25zW3BdLCBEYXRlVGltZS5ub3coKS5wbHVzKHRoaXMuY29uZmlnLnZhbGlkaXR5KS50b0lTTygpKSk7XG4gICAgICAgICAgICB0aGlzLnBocmFzZXNbcF0ubmV4dCh0cmFuc2xhdGlvbnNbcF0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGRiLnRyYW5zbGF0aW9ucy5idWxrQWRkKHRvQWRkKTtcbiAgICAgICAgICB0aGlzLnJlcXVlc3RpbmdbbGFuZ10gPSBbXTtcbiAgICAgICAgICB0aGlzLnJlcXVlc3RUaW1lclN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICB0aGlzLnJlcXVlc3RUaW1lclN1YnNjcmlwdGlvbiA9IG51bGw7XG4gICAgICAgICAgcy51bnN1YnNjcmliZSgpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcGVyc2lzdExhbmd1YWdlKCk6IHZvaWQge1xuICAgIGRvY3VtZW50LmNvb2tpZSA9IGAke3RoaXMubGFuZ3VhZ2VLZXl9PSR7dGhpcy5jdXJyZW50TGFuZ3VhZ2V9OyBTYW1lU2l0ZT1TdHJpY3Q7YDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UGVyc2lzdGVkTGFuZ3VhZ2UoKTogUnB4TGFuZ3VhZ2Uge1xuICAgIGNvbnNvbGUubG9nKGRvY3VtZW50LmNvb2tpZS5zcGxpdCgnOycpLmZpbmQoKGNvb2tpZSkgPT4gY29va2llLnRyaW0oKS5zdGFydHNXaXRoKHRoaXMubGFuZ3VhZ2VLZXkgKyAnPScpKT8uc3BsaXQoJz0nKVsxXS50cmltKCkpO1xuICAgIHJldHVybiBkb2N1bWVudC5jb29raWUuc3BsaXQoJzsnKS5maW5kKChjb29raWUpID0+IGNvb2tpZS50cmltKCkuc3RhcnRzV2l0aCh0aGlzLmxhbmd1YWdlS2V5ICsgJz0nKSk/LnNwbGl0KCc9JylbMV0udHJpbSgpIGFzIFJweExhbmd1YWdlO1xuICB9XG59XG4iXX0=
@@ -1,9 +0,0 @@
1
- /*
2
- * Public API Surface of rpx-translation
3
- */
4
- export * from './lib/rpx-language.enum';
5
- export * from './lib/rpx-translation.config';
6
- export * from './lib/rpx-translation.service';
7
- export * from './lib/rpx-translate.pipe';
8
- export * from './lib/rpx-translation.module';
9
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL3JweC14dWktdHJhbnNsYXRpb24vc3JjL3B1YmxpYy1hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLHlCQUF5QixDQUFDO0FBQ3hDLGNBQWMsOEJBQThCLENBQUM7QUFDN0MsY0FBYywrQkFBK0IsQ0FBQztBQUM5QyxjQUFjLDBCQUEwQixDQUFDO0FBQ3pDLGNBQWMsOEJBQThCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogUHVibGljIEFQSSBTdXJmYWNlIG9mIHJweC10cmFuc2xhdGlvblxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vbGliL3JweC1sYW5ndWFnZS5lbnVtJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3JweC10cmFuc2xhdGlvbi5jb25maWcnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvcnB4LXRyYW5zbGF0aW9uLnNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvcnB4LXRyYW5zbGF0ZS5waXBlJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3JweC10cmFuc2xhdGlvbi5tb2R1bGUnO1xuIl19
@@ -1,5 +0,0 @@
1
- /**
2
- * Generated bundle index. Do not edit.
3
- */
4
- export * from './public-api';
5
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnB4LXh1aS10cmFuc2xhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL3JweC14dWktdHJhbnNsYXRpb24vc3JjL3JweC14dWktdHJhbnNsYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9wdWJsaWMtYXBpJztcbiJdfQ==
package/lib/db.d.ts DELETED
@@ -1,17 +0,0 @@
1
- import Dexie, { Table } from 'dexie';
2
- import { RpxLanguage } from './rpx-language.enum';
3
- import { TranslatedData } from './models/translated-data.model';
4
- export declare class Translation {
5
- id?: number;
6
- phrase: string;
7
- lang: RpxLanguage;
8
- translation: TranslatedData;
9
- validity: string;
10
- static create(phrase: string, lang: RpxLanguage, translation: TranslatedData, validity: string): Translation;
11
- isExpired(): boolean;
12
- }
13
- export declare class TranslationDB extends Dexie {
14
- translations: Table<Translation, number>;
15
- constructor();
16
- }
17
- export declare const db: TranslationDB;
@@ -1 +0,0 @@
1
- export declare const matchCase: (str1: string, str2: string) => string;
@@ -1,3 +0,0 @@
1
- import { Replacements } from '../../rpx-translation.service';
2
- export declare const replacePlaceholders: (input: string, replacements: Replacements) => string;
3
- export declare const splitPhraseIntoComponents: (phrase: string, replacements: Record<string, string>) => string[];
@@ -1,6 +0,0 @@
1
- export interface TranslatedData {
2
- translation: string;
3
- yesOrNoField?: boolean;
4
- yes?: string;
5
- no?: string;
6
- }
@@ -1,5 +0,0 @@
1
- export type RpxLanguage = 'en' | 'cy';
2
- export declare enum YesOrNoValue {
3
- YES = "Yes",
4
- NO = "No"
5
- }
@@ -1,13 +0,0 @@
1
- import { Injector, OnDestroy, PipeTransform } from '@angular/core';
2
- import { Replacements, RpxTranslationService } from './rpx-translation.service';
3
- import * as i0 from "@angular/core";
4
- export declare class RpxTranslatePipe implements PipeTransform, OnDestroy {
5
- private translationService;
6
- private injector;
7
- private asyncPipe;
8
- constructor(translationService: RpxTranslationService, injector: Injector);
9
- transform<T = string>(value: T, replacements?: Replacements | null, yesOrNoValue?: string): T | null;
10
- ngOnDestroy(): void;
11
- static ɵfac: i0.ɵɵFactoryDeclaration<RpxTranslatePipe, never>;
12
- static ɵpipe: i0.ɵɵPipeDeclaration<RpxTranslatePipe, "rpxTranslate", false>;
13
- }
@@ -1,17 +0,0 @@
1
- export type ValidityDurationSpec = {
2
- years?: number;
3
- quarters?: number;
4
- months?: number;
5
- weeks?: number;
6
- days?: number;
7
- hours?: number;
8
- minutes?: number;
9
- seconds?: number;
10
- milliseconds?: number;
11
- };
12
- export declare class RpxTranslationConfig {
13
- validity: ValidityDurationSpec;
14
- baseUrl: string;
15
- debounceTimeMs: number;
16
- testMode: boolean;
17
- }
@@ -1,11 +0,0 @@
1
- import { ModuleWithProviders } from '@angular/core';
2
- import { RpxTranslationConfig } from './rpx-translation.config';
3
- import * as i0 from "@angular/core";
4
- import * as i1 from "./rpx-translate.pipe";
5
- export declare class RpxTranslationModule {
6
- static forRoot(config: RpxTranslationConfig): ModuleWithProviders<RpxTranslationModule>;
7
- static forChild(): ModuleWithProviders<RpxTranslationModule>;
8
- static ɵfac: i0.ɵɵFactoryDeclaration<RpxTranslationModule, never>;
9
- static ɵmod: i0.ɵɵNgModuleDeclaration<RpxTranslationModule, [typeof i1.RpxTranslatePipe], never, [typeof i1.RpxTranslatePipe]>;
10
- static ɵinj: i0.ɵɵInjectorDeclaration<RpxTranslationModule>;
11
- }
@@ -1,34 +0,0 @@
1
- import { HttpClient } from '@angular/common/http';
2
- import { Observable } from 'rxjs';
3
- import { RpxLanguage } from './rpx-language.enum';
4
- import { RpxTranslationConfig } from './rpx-translation.config';
5
- import * as i0 from "@angular/core";
6
- export type Replacements = {
7
- [key: string]: string;
8
- };
9
- export declare class RpxTranslationService {
10
- private config;
11
- private http;
12
- private currentLanguage;
13
- private languageKey;
14
- private phrases;
15
- private observables;
16
- private requesting;
17
- private requestTimerSubscription;
18
- private languageSource;
19
- language$: Observable<RpxLanguage>;
20
- get language(): RpxLanguage;
21
- set language(lang: RpxLanguage);
22
- constructor(config: RpxTranslationConfig, http: HttpClient);
23
- getTranslation$(phrase: string): Observable<string>;
24
- getTranslationWithReplacements$(phrase: string, replacements: Replacements): Observable<string>;
25
- getTranslationWithYesOrNo$(phrase: string, yesOrNoValue: string): Observable<string>;
26
- private getTranslatedData;
27
- private translate;
28
- private shouldTranslate;
29
- private load;
30
- private persistLanguage;
31
- private getPersistedLanguage;
32
- static ɵfac: i0.ɵɵFactoryDeclaration<RpxTranslationService, never>;
33
- static ɵprov: i0.ɵɵInjectableDeclaration<RpxTranslationService>;
34
- }
package/public-api.d.ts DELETED
@@ -1,5 +0,0 @@
1
- export * from './lib/rpx-language.enum';
2
- export * from './lib/rpx-translation.config';
3
- export * from './lib/rpx-translation.service';
4
- export * from './lib/rpx-translate.pipe';
5
- export * from './lib/rpx-translation.module';