@acorex/core 7.17.27 → 7.17.29

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 +1 @@
1
- {"version":3,"file":"acorex-core-format.mjs","sources":["../../../../libs/core/format/src/lib/format.config.ts","../../../../libs/core/format/src/lib/format.service.ts","../../../../libs/core/format/src/lib/format.pipe.ts","../../../../libs/core/format/src/lib/formatters/number-formatter.ts","../../../../libs/core/format/src/lib/format.module.ts","../../../../libs/core/format/src/acorex-core-format.ts"],"sourcesContent":["import { AXFormatOptions } from \"./format.types\";\n\nexport abstract class AXFormatter {\n abstract get name(): string;\n abstract format(value: unknown, options?: AXFormatOptions | string): string;\n}\n","import { Injectable, Injector } from '@angular/core';\nimport { AXFormatter } from './format.config';\nimport { AXFormatOptionsMap } from './format.types';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class AXFormatterRegistryService {\n private plugins: AXFormatter[] = [];\n\n private injector: Injector;\n\n constructor(injector: Injector) {\n this.injector = injector;\n }\n\n register(...plugins: (new () => AXFormatter)[]) {\n plugins.forEach(t => {\n const childInjector = Injector.create({ providers: [{ provide: t, useClass: t, deps: [] }], parent: this.injector });\n const v = childInjector.get(t);\n\n if (v && !this.plugins.some(p => p.name == v.name)) {\n this.plugins.push(v);\n }\n })\n }\n\n get formatters(): AXFormatter[] {\n return this.plugins;\n }\n}\n\n@Injectable({ providedIn: 'root' })\nexport class AXFormatService {\n constructor(\n private pluginRegistry: AXFormatterRegistryService\n ) { }\n\n /**\n * Resolves a formatter by its name.\n * @param name The name of the formatter.\n * @returns The formatter if found, otherwise throws an error.\n */\n resolveFormatter(name: string): AXFormatter {\n const formatter = this.pluginRegistry.formatters.find((c) => c.name == name);\n if (!formatter) {\n throw new Error(`Formatter not found: ${name}`);\n }\n return formatter;\n }\n\n // Overload for traditional formatting\n format<K extends keyof AXFormatOptionsMap>(\n value: unknown,\n name: K,\n options?: AXFormatOptionsMap[K]\n ): string;\n\n // Overload for starting fluent API chain\n format(value: unknown): AXFormatFluent;\n\n // Implementation of the format method\n format<K extends keyof AXFormatOptionsMap>(\n value: unknown,\n formatter?: K,\n options?: AXFormatOptionsMap[K]\n ): string | AXFormatFluent {\n if (typeof formatter === 'string') {\n const formatterRef = this.resolveFormatter(formatter);\n return formatterRef.format(value, options);\n } else {\n return new AXFormatFluent(this, value);\n }\n }\n}\n\n\nclass AXFormatFluent {\n\n constructor(private formatService: AXFormatService, private initialValue: unknown) { }\n\n /**\n * Formats the value using the specified formatter and options.\n * @param formatter The name of the formatter to use.\n * @param options The options to pass to the formatter.\n * @returns The formatted string.\n */\n to<K extends keyof AXFormatOptionsMap>(formatter: K, options?: AXFormatOptionsMap[K]): string {\n try {\n const formatterRef = this.formatService.resolveFormatter(formatter);\n return formatterRef.format(this.initialValue, options);\n } catch (error) {\n // Handle or log the error as needed\n console.error(error);\n return String(this.initialValue);\n }\n }\n\n}\n","import { Pipe, PipeTransform, inject } from '@angular/core';\nimport { AXFormatService } from './format.service';\nimport { AXFormatOptions } from './format.types';\n\n@Pipe({\n name: 'format',\n pure: false,\n})\nexport class AXFormatPipe implements PipeTransform {\n private formatService = inject(AXFormatService);\n\n transform(value: unknown, name: string, options?: AXFormatOptions | string): string {\n return this.formatService.format(value, name as any, options);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { AXFormatter } from '../format.config';\nimport { AXFormatOptions } from '../format.types';\nimport { isInteger, defaults, padStart } from 'lodash-es';\n\n\nexport interface AXNumberFormatterOptions extends AXFormatOptions {\n decimalPlaces?: number;\n thousandSeparator?: string;\n decimalSeparator?: string;\n zeroPadLength?: number; // New option for zero padding,\n locale?: string\n}\n\ndeclare module '../format.types' {\n interface AXFormatOptionsMap {\n 'number': AXNumberFormatterOptions;\n }\n}\n\n@Injectable()\nexport class AXNumberFormatter implements AXFormatter {\n\n private separatorsCache = {};\n\n get name(): string {\n return 'number';\n }\n\n format(value: number, options: AXNumberFormatterOptions): string {\n const { thousandSeparator, decimalSeparator } = this.getLocaleSeparators(options?.locale);\n // Merge user options with default options\n const effectiveOptions = defaults({}, options, {\n thousandSeparator,\n decimalSeparator,\n zeroPadLength: 0,\n locale: navigator.language\n });\n\n const sign = value < 0 ? '-' : '';\n const absoluteValue = Math.abs(value);\n\n // Handling zero padding for integer part\n let integerPart = Math.floor(absoluteValue).toString();\n if (effectiveOptions.zeroPadLength && effectiveOptions.zeroPadLength > integerPart.length) {\n integerPart = padStart(integerPart, effectiveOptions.zeroPadLength, '0');\n }\n\n // Applying thousand separator to integer part\n if (effectiveOptions.thousandSeparator) {\n integerPart = integerPart.replace(/\\B(?=(\\d{3})+(?!\\d))/g, effectiveOptions.thousandSeparator);\n }\n\n // Constructing the final formatted value\n let formattedValue = sign + integerPart;\n if (effectiveOptions.decimalPlaces !== undefined) {\n // Limiting decimal places if specified\n const decimalPart = absoluteValue.toFixed(effectiveOptions.decimalPlaces).split('.')[1];\n formattedValue += effectiveOptions.decimalSeparator + decimalPart;\n } else if (!isInteger(value)) {\n // Showing full decimal part if decimalPlaces is not specified\n const decimalPart = absoluteValue.toString().split('.')[1] || '';\n if (decimalPart.length > 0) {\n formattedValue += effectiveOptions.decimalSeparator + decimalPart;\n }\n }\n\n return formattedValue;\n }\n\n private getLocaleSeparators(locale = navigator.language): { thousandSeparator: string, decimalSeparator: string } {\n // Use cache if available\n if (this.separatorsCache[locale]) {\n return this.separatorsCache[locale];\n }\n\n console.log('getLocaleSeparators', locale)\n const numberFormat = new Intl.NumberFormat(locale);\n const parts = numberFormat.formatToParts(1234567.89);\n let thousandSeparator = '';\n let decimalSeparator = '';\n\n for (const part of parts) {\n if (part.type === 'group') {\n thousandSeparator = part.value;\n } else if (part.type === 'decimal') {\n decimalSeparator = part.value;\n }\n }\n\n // Cache the result\n this.separatorsCache[locale] = { thousandSeparator, decimalSeparator };\n return this.separatorsCache[locale];\n }\n}\n","import { APP_INITIALIZER, ModuleWithProviders, NgModule } from '@angular/core';\nimport { AXFormatPipe } from './format.pipe';\nimport { AXNumberFormatter } from './formatters/number-formatter';\nimport { AXFormatterRegistryService } from './format.service';\nimport { AXFormatter } from './format.config';\n\n\nconst BUILT_IN_RULES = [\n AXNumberFormatter,\n]\n\nexport interface AXFormatModuleConfigs {\n formatters: (new () => AXFormatter)[]\n}\n\n@NgModule({\n imports: [],\n exports: [AXFormatPipe],\n declarations: [AXFormatPipe],\n})\nexport class AXFormatModule {\n\n private static registry: AXFormatterRegistryService;\n\n static forRoot(configs?: AXFormatModuleConfigs): ModuleWithProviders<AXFormatModule> {\n return {\n ngModule: AXFormatModule,\n providers: [\n ...(configs?.formatters || []),\n {\n provide: APP_INITIALIZER,\n useFactory: (pluginRegistry: AXFormatterRegistryService) => () =>\n pluginRegistry.register(...[...BUILT_IN_RULES, ...(configs?.formatters || [])]),\n deps: [AXFormatterRegistryService],\n multi: true\n }\n ]\n };\n }\n\n static forChild(configs?: AXFormatModuleConfigs): ModuleWithProviders<AXFormatModule> {\n AXFormatModule.registry.register(...[...BUILT_IN_RULES, ...(configs?.formatters || [])]);\n return {\n ngModule: AXFormatModule,\n providers: [\n ...(configs?.formatters || [])\n ]\n };\n }\n\n /**\n * @ignore\n */\n constructor(pluginRegistry: AXFormatterRegistryService) {\n AXFormatModule.registry = pluginRegistry;\n AXFormatModule.registry.register(...BUILT_IN_RULES);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1.AXFormatterRegistryService"],"mappings":"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"}
1
+ {"version":3,"file":"acorex-core-format.mjs","sources":["../../../../libs/core/format/src/lib/format.config.ts","../../../../libs/core/format/src/lib/format.service.ts","../../../../libs/core/format/src/lib/format.pipe.ts","../../../../libs/core/format/src/lib/formatters/number-formatter.ts","../../../../libs/core/format/src/lib/format.module.ts","../../../../libs/core/format/src/acorex-core-format.ts"],"sourcesContent":["import { AXFormatOptions } from \"./format.types\";\n\nexport abstract class AXFormatter {\n abstract get name(): string;\n abstract format(value: unknown, options?: AXFormatOptions | string): string;\n}\n","import { Injectable, Injector } from '@angular/core';\nimport { AXFormatter } from './format.config';\nimport { AXFormatOptionsMap } from './format.types';\nimport { Subject } from 'rxjs';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class AXFormatterRegistryService {\n private plugins: AXFormatter[] = [];\n\n private injector: Injector;\n\n constructor(injector: Injector) {\n this.injector = injector;\n }\n\n register(...plugins: (new () => AXFormatter)[]) {\n plugins.forEach(t => {\n const childInjector = Injector.create({ providers: [{ provide: t, useClass: t, deps: [] }], parent: this.injector });\n const v = childInjector.get(t);\n\n if (v && !this.plugins.some(p => p.name == v.name)) {\n this.plugins.push(v);\n }\n })\n }\n\n get formatters(): AXFormatter[] {\n return this.plugins;\n }\n}\n\n@Injectable({ providedIn: 'root' })\nexport class AXFormatService {\n constructor(\n private pluginRegistry: AXFormatterRegistryService\n ) { }\n\n\n private renderSubject = new Subject<void>();\n\n // Observable that other services/components can subscribe to\n onRender = this.renderSubject.asObservable();\n\n\n render() {\n this.renderSubject.next();\n }\n\n\n /**\n * Resolves a formatter by its name.\n * @param name The name of the formatter.\n * @returns The formatter if found, otherwise throws an error.\n */\n resolveFormatter(name: string): AXFormatter {\n const formatter = this.pluginRegistry.formatters.find((c) => c.name == name);\n if (!formatter) {\n throw new Error(`Formatter not found: ${name}`);\n }\n return formatter;\n }\n\n // Overload for traditional formatting\n format<K extends keyof AXFormatOptionsMap>(\n value: unknown,\n name: K,\n options?: AXFormatOptionsMap[K]\n ): string;\n\n // Overload for starting fluent API chain\n format(value: unknown): AXFormatFluent;\n\n // Implementation of the format method\n format<K extends keyof AXFormatOptionsMap>(\n value: unknown,\n formatter?: K,\n options?: AXFormatOptionsMap[K]\n ): string | AXFormatFluent {\n if (typeof formatter === 'string') {\n const formatterRef = this.resolveFormatter(formatter);\n return formatterRef.format(value, options);\n } else {\n return new AXFormatFluent(this, value);\n }\n }\n}\n\n\nclass AXFormatFluent {\n\n constructor(private formatService: AXFormatService, private initialValue: unknown) { }\n\n /**\n * Formats the value using the specified formatter and options.\n * @param formatter The name of the formatter to use.\n * @param options The options to pass to the formatter.\n * @returns The formatted string.\n */\n to<K extends keyof AXFormatOptionsMap>(formatter: K, options?: AXFormatOptionsMap[K]): string {\n try {\n const formatterRef = this.formatService.resolveFormatter(formatter);\n return formatterRef.format(this.initialValue, options);\n } catch (error) {\n // Handle or log the error as needed\n console.error(error);\n return String(this.initialValue);\n }\n }\n\n}\n","import { Pipe, PipeTransform, inject } from '@angular/core';\nimport { AXFormatService } from './format.service';\nimport { AXFormatOptions } from './format.types';\nimport { Observable, filter, of, startWith, switchMap } from 'rxjs';\nimport { AXEventService, AXEventData } from '@acorex/core/events';\n\n\n@Pipe({\n name: 'format',\n pure: true\n})\nexport class AXFormatPipe implements PipeTransform {\n private formatService = inject(AXFormatService);\n private eventService = inject(AXEventService);\n\n private triggers = ['AX_CALENDAR_CHANGED', 'AX_LANGUAGE_CHANGED', 'AX_LANGUAGE_LOADED']\n\n transform(value: unknown, name: string, options?: AXFormatOptions | string): Observable<string> {\n // Initial formatted value\n const initialFormattedValue = this.formatService.format(value, name as any, options);\n\n // React to language changes and re-format the value\n return this.eventService.onEvent.pipe(\n filter((event: AXEventData) => this.triggers.includes(event.type)),\n startWith(initialFormattedValue), // Emit the initial formatted value immediately\n switchMap((event) => {\n // Re-call format method on every language change\n const formattedValue = this.formatService.format(value, name as any, options);\n return of(formattedValue);\n })\n );\n }\n}\n","import { Injectable } from '@angular/core';\nimport { AXFormatter } from '../format.config';\nimport { AXFormatOptions } from '../format.types';\nimport { isInteger, defaults, padStart } from 'lodash-es';\n\n\nexport interface AXNumberFormatterOptions extends AXFormatOptions {\n decimalPlaces?: number;\n thousandSeparator?: string;\n decimalSeparator?: string;\n zeroPadLength?: number; // New option for zero padding,\n locale?: string\n}\n\ndeclare module '../format.types' {\n interface AXFormatOptionsMap {\n 'number': AXNumberFormatterOptions;\n }\n}\n\n@Injectable()\nexport class AXNumberFormatter implements AXFormatter {\n\n private separatorsCache = {};\n\n get name(): string {\n return 'number';\n }\n\n format(value: number, options: AXNumberFormatterOptions): string {\n const { thousandSeparator, decimalSeparator } = this.getLocaleSeparators(options?.locale);\n // Merge user options with default options\n const effectiveOptions = defaults({}, options, {\n thousandSeparator,\n decimalSeparator,\n zeroPadLength: 0,\n locale: navigator.language\n });\n\n const sign = value < 0 ? '-' : '';\n const absoluteValue = Math.abs(value);\n\n // Handling zero padding for integer part\n let integerPart = Math.floor(absoluteValue).toString();\n if (effectiveOptions.zeroPadLength && effectiveOptions.zeroPadLength > integerPart.length) {\n integerPart = padStart(integerPart, effectiveOptions.zeroPadLength, '0');\n }\n\n // Applying thousand separator to integer part\n if (effectiveOptions.thousandSeparator) {\n integerPart = integerPart.replace(/\\B(?=(\\d{3})+(?!\\d))/g, effectiveOptions.thousandSeparator);\n }\n\n // Constructing the final formatted value\n let formattedValue = sign + integerPart;\n if (effectiveOptions.decimalPlaces !== undefined) {\n // Limiting decimal places if specified\n const decimalPart = absoluteValue.toFixed(effectiveOptions.decimalPlaces).split('.')[1];\n formattedValue += effectiveOptions.decimalSeparator + decimalPart;\n } else if (!isInteger(value)) {\n // Showing full decimal part if decimalPlaces is not specified\n const decimalPart = absoluteValue.toString().split('.')[1] || '';\n if (decimalPart.length > 0) {\n formattedValue += effectiveOptions.decimalSeparator + decimalPart;\n }\n }\n\n return formattedValue;\n }\n\n private getLocaleSeparators(locale = navigator.language): { thousandSeparator: string, decimalSeparator: string } {\n // Use cache if available\n if (this.separatorsCache[locale]) {\n return this.separatorsCache[locale];\n }\n\n console.log('getLocaleSeparators', locale)\n const numberFormat = new Intl.NumberFormat(locale);\n const parts = numberFormat.formatToParts(1234567.89);\n let thousandSeparator = '';\n let decimalSeparator = '';\n\n for (const part of parts) {\n if (part.type === 'group') {\n thousandSeparator = part.value;\n } else if (part.type === 'decimal') {\n decimalSeparator = part.value;\n }\n }\n\n // Cache the result\n this.separatorsCache[locale] = { thousandSeparator, decimalSeparator };\n return this.separatorsCache[locale];\n }\n}\n","import { APP_INITIALIZER, ModuleWithProviders, NgModule } from '@angular/core';\nimport { AXFormatPipe } from './format.pipe';\nimport { AXNumberFormatter } from './formatters/number-formatter';\nimport { AXFormatterRegistryService } from './format.service';\nimport { AXFormatter } from './format.config';\n\n\nconst BUILT_IN_RULES = [\n AXNumberFormatter,\n]\n\nexport interface AXFormatModuleConfigs {\n formatters: (new () => AXFormatter)[]\n}\n\n@NgModule({\n imports: [],\n exports: [AXFormatPipe],\n declarations: [AXFormatPipe],\n})\nexport class AXFormatModule {\n\n private static registry: AXFormatterRegistryService;\n\n static forRoot(configs?: AXFormatModuleConfigs): ModuleWithProviders<AXFormatModule> {\n return {\n ngModule: AXFormatModule,\n providers: [\n ...(configs?.formatters || []),\n {\n provide: APP_INITIALIZER,\n useFactory: (pluginRegistry: AXFormatterRegistryService) => () =>\n pluginRegistry.register(...[...BUILT_IN_RULES, ...(configs?.formatters || [])]),\n deps: [AXFormatterRegistryService],\n multi: true\n }\n ]\n };\n }\n\n static forChild(configs?: AXFormatModuleConfigs): ModuleWithProviders<AXFormatModule> {\n AXFormatModule.registry.register(...[...BUILT_IN_RULES, ...(configs?.formatters || [])]);\n return {\n ngModule: AXFormatModule,\n providers: [\n ...(configs?.formatters || [])\n ]\n };\n }\n\n /**\n * @ignore\n */\n constructor(pluginRegistry: AXFormatterRegistryService) {\n AXFormatModule.registry = pluginRegistry;\n AXFormatModule.registry.register(...BUILT_IN_RULES);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1.AXFormatterRegistryService"],"mappings":"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"}
@@ -1,7 +1,8 @@
1
1
  import * as i0 from '@angular/core';
2
- import { InjectionToken, inject, Injectable, ChangeDetectorRef, Pipe, Directive, APP_INITIALIZER, NgModule } from '@angular/core';
3
- import { of, BehaviorSubject, tap, catchError, forkJoin, map, switchMap } from 'rxjs';
2
+ import { InjectionToken, inject, Injectable, Pipe, Directive, APP_INITIALIZER, NgModule } from '@angular/core';
3
+ import { of, BehaviorSubject, forkJoin, tap, catchError, finalize, shareReplay, map, switchMap, startWith } from 'rxjs';
4
4
  import { set, get } from 'lodash-es';
5
+ import { AXEventService, AXEventTypes } from '@acorex/core/events';
5
6
 
6
7
  const AX_TRANSLATION_CONFIG = new InjectionToken('AX_TRANSLATION_CONFIG', {
7
8
  providedIn: 'root',
@@ -45,22 +46,41 @@ class AXTranslationService {
45
46
  constructor() {
46
47
  this.loader = inject(AX_TRANSLATION_LOADER);
47
48
  this.config = inject(AX_TRANSLATION_CONFIG);
49
+ this.eventService = inject(AXEventService);
48
50
  this.translationCache = {};
51
+ this.ongoingRequests = new Map();
49
52
  this.activeLang = new BehaviorSubject(this.getDefaultLang());
50
53
  this.langChanges$ = this.activeLang.asObservable();
54
+ this.lastActiveLang = null;
51
55
  service = this;
52
56
  }
53
57
  loadLanguagesAndScopes(languages, scopes) {
54
58
  const requests = languages.flatMap(lang => scopes.map(scope => {
59
+ // Check if translations are already cached
55
60
  if (this.translationCache[lang]?.[scope]) {
56
61
  return of(this.translationCache[lang][scope]);
57
62
  }
58
- return this.loader.getTranslation({ lang, scope }).pipe(tap(translations => this.cacheTranslations(lang, scope, translations)), catchError(error => {
59
- console.error(`Error loading translations for lang: ${lang}, scope: ${scope}`, error);
60
- return of(null); // You can return 'null' or any other fallback value
61
- }));
63
+ // Use the new method to handle ongoing requests and loading
64
+ return this.getOrLoadTranslations(lang, scope);
62
65
  }));
63
- return forkJoin(...requests);
66
+ return forkJoin(requests);
67
+ }
68
+ getOrLoadTranslations(lang, scope) {
69
+ const requestKey = `${lang}_${scope}`;
70
+ // Return existing observable if the request is already in progress
71
+ if (this.ongoingRequests.has(requestKey)) {
72
+ return this.ongoingRequests.get(requestKey);
73
+ }
74
+ // Load translations if not in cache or ongoing requests
75
+ const translationObservable = this.loader.getTranslation({ lang, scope }).pipe(tap(translations => this.cacheTranslations(lang, scope, translations)), catchError(error => {
76
+ console.error(`Error loading translations for lang: ${lang}, scope: ${scope}`, error);
77
+ return of(null);
78
+ }), finalize(() => {
79
+ this.eventService.emitEvent({ type: AXEventTypes.AXLanguageLoaded, payload: lang });
80
+ this.ongoingRequests.delete(requestKey);
81
+ }), shareReplay(1));
82
+ this.ongoingRequests.set(requestKey, translationObservable);
83
+ return translationObservable;
64
84
  }
65
85
  cacheTranslations(lang, scope, translations) {
66
86
  set(this.translationCache, `${lang}.${scope}`, translations);
@@ -72,17 +92,22 @@ class AXTranslationService {
72
92
  return this.activeLang.getValue();
73
93
  }
74
94
  setActiveLang(lang) {
75
- this.activeLang.next(lang);
95
+ if (lang != this.getActiveLang()) {
96
+ this.lastActiveLang = this.getActiveLang(); // Update last active language
97
+ this.activeLang.next(lang);
98
+ this.eventService.emitEvent({ type: AXEventTypes.AXLanguageChanged, payload: lang });
99
+ }
76
100
  }
77
101
  load(key, options = {}) {
78
102
  const { lang = this.getActiveLang(), scope = this.config.defaultScope } = options;
103
+ // Function to fetch translation
79
104
  const fetchTranslation = (language) => {
80
105
  // Check if translations are available in the cache
81
106
  if (this.translationCache[language]?.[scope]) {
82
107
  return of(this.getTranslation(key, language, scope, options.params));
83
108
  }
84
- // Load translations for the language and scope
85
- return this.loadLanguagesAndScopes([language], [scope]).pipe(map(() => {
109
+ // Use the new method to handle ongoing requests and loading
110
+ return this.getOrLoadTranslations(language, scope).pipe(map(() => {
86
111
  const translation = this.translationCache[language]?.[scope]?.[key] || key;
87
112
  return this.getTranslation(translation, language, scope, options.params);
88
113
  }), switchMap(translatedText => {
@@ -94,8 +119,14 @@ class AXTranslationService {
94
119
  return of(translatedText);
95
120
  }));
96
121
  };
97
- // Return the translation or initiate fetching process
98
- return fetchTranslation(lang);
122
+ // First, try to fetch the translation for the requested language
123
+ const translationForRequestedLang = fetchTranslation(lang);
124
+ // If lastActiveLang is available and different from the requested language, use it as a fallback
125
+ if (this.lastActiveLang && this.lastActiveLang !== lang) {
126
+ const translationForLastActiveLang = this.getTranslation(key, this.lastActiveLang, scope, options.params);
127
+ return translationForRequestedLang.pipe(startWith(translationForLastActiveLang));
128
+ }
129
+ return translationForRequestedLang;
99
130
  }
100
131
  getTranslation(key, lang, scope, params) {
101
132
  let translation = (get(this.translationCache, `${lang}.${scope}.${key}`) || key);
@@ -123,7 +154,18 @@ class AXTranslationService {
123
154
  }
124
155
  translateSync(key, options) {
125
156
  const { lang = this.getActiveLang(), scope = this.config.defaultScope } = options || {};
126
- return this.getTranslation(key, lang, scope, options?.params);
157
+ // Check if the translation for the active language is available
158
+ let translation = get(this.translationCache, `${lang}.${scope}.${key}`);
159
+ // If not available, check lastActiveLang
160
+ if (!translation && this.lastActiveLang) {
161
+ translation = get(this.translationCache, `${this.lastActiveLang}.${scope}.${key}`);
162
+ }
163
+ // If still not available, use the default language
164
+ if (!translation) {
165
+ translation = get(this.translationCache, `${this.getDefaultLang()}.${scope}.${key}`);
166
+ }
167
+ // If no translation found, return the key
168
+ return translation || this.getTranslation(key, lang, scope, options?.params);
127
169
  }
128
170
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: AXTranslationService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
129
171
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: AXTranslationService, providedIn: 'root' }); }
@@ -134,42 +176,22 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.8", ngImpor
134
176
  }], ctorParameters: () => [] });
135
177
 
136
178
  class AXTranslatorPipe {
137
- constructor() {
138
- this.service = inject(AXTranslationService);
139
- this.cdr = inject(ChangeDetectorRef);
140
- this.value = '';
141
- this.lastKey = null;
142
- this.subscription = null;
179
+ constructor(service) {
180
+ this.service = service;
143
181
  }
144
182
  transform(key, options) {
145
- if (!key || key === this.lastKey) {
146
- return this.value;
147
- }
148
- this.lastKey = key;
149
- this.value = key;
150
- this.dispose();
151
- this.subscription = this.service.translate(key, options).subscribe(translatedValue => {
152
- this.value = translatedValue;
153
- this.cdr.markForCheck();
154
- });
155
- return this.value;
156
- }
157
- ngOnDestroy() {
158
- this.dispose();
159
- }
160
- dispose() {
161
- if (this.subscription) {
162
- this.subscription.unsubscribe();
163
- this.subscription = null;
183
+ if (!key) {
184
+ return of(''); // Return an empty observable if the key is not provided
164
185
  }
186
+ return this.service.translate(key, options);
165
187
  }
166
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: AXTranslatorPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
167
- static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "17.0.8", ngImport: i0, type: AXTranslatorPipe, name: "translate", pure: false }); }
188
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: AXTranslatorPipe, deps: [{ token: AXTranslationService }], target: i0.ɵɵFactoryTarget.Pipe }); }
189
+ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "17.0.8", ngImport: i0, type: AXTranslatorPipe, name: "translate" }); }
168
190
  }
169
191
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: AXTranslatorPipe, decorators: [{
170
192
  type: Pipe,
171
- args: [{ name: 'translate', pure: false }]
172
- }] });
193
+ args: [{ name: 'translate', pure: true }]
194
+ }], ctorParameters: () => [{ type: AXTranslationService }] });
173
195
 
174
196
  class AXTranslatorDirective {
175
197
  constructor(templateRef, viewContainer, translationService) {
@@ -1 +1 @@
1
- {"version":3,"file":"acorex-core-translation.mjs","sources":["../../../../libs/core/translation/src/lib/translation.config.ts","../../../../libs/core/translation/src/lib/translation.loader.ts","../../../../libs/core/translation/src/lib/translation.service.ts","../../../../libs/core/translation/src/lib/translator.pipe.ts","../../../../libs/core/translation/src/lib/translator.directive.ts","../../../../libs/core/translation/src/lib/translation.module.ts","../../../../libs/core/translation/src/lib/translation-scope.resolver.ts","../../../../libs/core/translation/src/acorex-core-translation.ts"],"sourcesContent":["import { InjectionToken } from \"@angular/core\";\nimport { AXTranslateLang, AXTranslateScope } from \"./translation.types\";\n\n\n\nexport interface AXTranslationConfig {\n defaultLang: AXTranslateLang,\n defaultScope: AXTranslateScope,\n preloadLangs?: AXTranslateLang[],\n preloadScopes?: AXTranslateLang[],\n availableLangs?: AXTranslateLang[],\n scopeResolverKey: string\n}\n\nexport const AX_TRANSLATION_CONFIG = new InjectionToken<AXTranslationConfig>('AX_TRANSLATION_CONFIG', {\n providedIn: 'root',\n factory: () => {\n return AXTranslationDefaultConfig;\n },\n});\n\nexport const AXTranslationDefaultConfig: AXTranslationConfig = {\n defaultLang: 'en',\n defaultScope: 'common',\n scopeResolverKey: 'scope',\n};\n\nexport type AXPartialTranslationConfig = Partial<AXTranslationConfig>;\n\nexport function translationConfig(config: AXPartialTranslationConfig = {}): AXTranslationConfig {\n const result = {\n ...AXTranslationDefaultConfig,\n ...config,\n };\n return result;\n}\n","import { InjectionToken } from \"@angular/core\";\nimport { AXTranslateLang, AXTranslateScope, AXTranslation } from \"./translation.types\";\nimport { Observable, of } from \"rxjs\";\n\nexport interface AXTranslationLoaderOptions {\n lang: AXTranslateLang,\n scope?: AXTranslateScope;\n}\n\n\nexport interface AXTranslationLoader {\n getTranslation(options: AXTranslationLoaderOptions): Observable<AXTranslation>;\n}\n\n\nexport class AXTranslationLoaderDefault implements AXTranslationLoader {\n getTranslation(options: AXTranslationLoaderOptions): Observable<AXTranslation> {\n return of({});\n }\n}\n\n\nexport const AX_TRANSLATION_LOADER = new InjectionToken<AXTranslationLoader>('AX_TRANSLATION_LOADER', {\n providedIn: 'root',\n factory: () => {\n return new AXTranslationLoaderDefault();\n },\n});","import { Injectable, inject } from '@angular/core';\nimport { BehaviorSubject, Observable, catchError, forkJoin, map, of, switchMap, tap } from 'rxjs';\nimport { AXTranslateHashMap, AXTranslateOptions, AXTranslateParams } from './translation.types';\nimport { AX_TRANSLATION_LOADER } from './translation.loader';\nimport { set as lodashSet, get as lodashGet } from 'lodash-es';\nimport { AX_TRANSLATION_CONFIG } from './translation.config';\n\nlet service: AXTranslationService;\n\n\nexport function translateSync(key: string, options?: AXTranslateOptions): string {\n return service.translateSync(key, options);\n}\n\n\n@Injectable({ providedIn: 'root' })\nexport class AXTranslationService {\n\n private loader = inject(AX_TRANSLATION_LOADER)\n private config = inject(AX_TRANSLATION_CONFIG)\n\n private translationCache: AXTranslateHashMap<AXTranslateHashMap<string>> = {};\n\n private activeLang: BehaviorSubject<string> = new BehaviorSubject<string>(this.getDefaultLang());\n langChanges$: Observable<string> = this.activeLang.asObservable();\n\n\n /**\n * @ignore\n */\n constructor() {\n service = this;\n }\n\n\n public loadLanguagesAndScopes(languages: string[], scopes: string[]): Observable<unknown> {\n const requests = languages.flatMap(lang =>\n scopes.map(scope => {\n if (this.translationCache[lang]?.[scope]) {\n return of(this.translationCache[lang][scope]);\n }\n return this.loader.getTranslation({ lang, scope }).pipe(\n tap(translations => this.cacheTranslations(lang, scope, translations)),\n catchError(error => {\n console.error(`Error loading translations for lang: ${lang}, scope: ${scope}`, error);\n return of(null); // You can return 'null' or any other fallback value\n })\n );\n })\n );\n\n return forkJoin(...requests);\n }\n\n private cacheTranslations(lang: string, scope: string, translations: AXTranslateHashMap<string>): void {\n lodashSet(this.translationCache, `${lang}.${scope}`, translations);\n }\n\n public getDefaultLang(): string {\n return this.config.defaultLang;\n }\n\n public getActiveLang(): string {\n return this.activeLang.getValue();\n }\n\n public setActiveLang(lang: string): void {\n this.activeLang.next(lang);\n }\n\n\n\n private load(key: string, options: AXTranslateOptions = {}): Observable<string> {\n const { lang = this.getActiveLang(), scope = this.config.defaultScope } = options;\n\n const fetchTranslation = (language: string): Observable<string> => {\n // Check if translations are available in the cache\n if (this.translationCache[language]?.[scope]) {\n return of(this.getTranslation(key, language, scope, options.params));\n }\n\n // Load translations for the language and scope\n return this.loadLanguagesAndScopes([language], [scope]).pipe(\n map(() => {\n const translation = this.translationCache[language]?.[scope]?.[key] || key;\n return this.getTranslation(translation, language, scope, options.params);\n }),\n switchMap(translatedText => {\n if (translatedText === key && language !== this.getDefaultLang()) {\n // If the translation is not found and the language is not default,\n // try fetching from the default language\n return fetchTranslation(this.getDefaultLang());\n }\n return of(translatedText);\n })\n );\n };\n\n // Return the translation or initiate fetching process\n return fetchTranslation(lang);\n }\n\n private getTranslation(key: string, lang: string, scope: string, params?: AXTranslateParams): string {\n let translation: string = (lodashGet(this.translationCache, `${lang}.${scope}.${key}`) || key) as string\n\n // Replace params like {{ name }}\n if (params) {\n Object.keys(params).forEach(paramKey => {\n const paramValue = params[paramKey] as string;\n translation = translation.replace(new RegExp(`{{\\\\s*${paramKey}\\\\s*}}`, 'g'), paramValue);\n });\n }\n\n // Replace translations like {{ t('key') }}\n const translationPattern = /{{\\s*t\\('([^']+)'\\)\\s*}}/g;\n translation = translation.replace(translationPattern, (match, innerKey) => {\n return this.getTranslation(innerKey, lang, scope, params);\n });\n\n return translation;\n }\n\n public translate(key: string, options?: AXTranslateOptions): Observable<string> {\n if (options?.lang) {\n return this.load(key, options)\n }\n return this.langChanges$.pipe(\n switchMap((lang) => {\n return this.load(key, { ...options, lang: lang })\n })\n );\n }\n\n public translateSync(key: string, options?: AXTranslateOptions): string {\n const { lang = this.getActiveLang(), scope = this.config.defaultScope } = options || {};\n return this.getTranslation(key, lang, scope, options?.params);\n }\n}\n","import { ChangeDetectorRef, OnDestroy, Pipe, PipeTransform, inject } from '@angular/core';\nimport { AXTranslationService } from './translation.service';\nimport { Subscription } from 'rxjs';\nimport { AXTranslateOptions } from './translation.types';\n\n\n\n@Pipe({ name: 'translate', pure: false })\nexport class AXTranslatorPipe implements PipeTransform, OnDestroy {\n\n private service = inject(AXTranslationService);\n private cdr = inject(ChangeDetectorRef);\n\n private value: string = '';\n private lastKey: string | null = null;\n private subscription: Subscription | null = null;\n\n transform(key: string, options?: AXTranslateOptions): string {\n if (!key || key === this.lastKey) {\n return this.value;\n }\n this.lastKey = key;\n this.value = key;\n this.dispose();\n this.subscription = this.service.translate(key, options).subscribe(translatedValue => {\n this.value = translatedValue;\n this.cdr.markForCheck();\n });\n return this.value;\n }\n\n ngOnDestroy() {\n this.dispose();\n }\n\n private dispose() {\n if (this.subscription) {\n this.subscription.unsubscribe();\n this.subscription = null;\n }\n }\n}\n","import { Directive, Input, OnChanges, OnDestroy, OnInit, SimpleChanges, TemplateRef, ViewContainerRef, inject } from \"@angular/core\";\nimport { AXTranslationService } from \"./translation.service\";\nimport { AXTranslateOptions } from \"./translation.types\";\n\n@Directive({\n selector: '[translate]',\n})\nexport class AXTranslatorDirective implements OnInit {\n\n constructor(\n private templateRef: TemplateRef<any>,\n private viewContainer: ViewContainerRef,\n private translationService: AXTranslationService\n ) { }\n\n ngOnInit() {\n this.viewContainer.clear();\n this.viewContainer.createEmbeddedView(this.templateRef, {\n $implicit: (key: string, options?: AXTranslateOptions) => {\n return this.translationService.translate(key, options)\n }\n });\n }\n}","import { APP_INITIALIZER, NgModule } from '@angular/core';\nimport { AXTranslatorPipe } from './translator.pipe';\nimport { AXTranslatorDirective } from './translator.directive';\nimport { AXTranslationService } from './translation.service';\nimport { Observable } from 'rxjs';\nimport { AXTranslationConfig, AX_TRANSLATION_CONFIG } from './translation.config';\n\n\nfunction initializeApp(translatorService: AXTranslationService, config: AXTranslationConfig) {\n return (): Observable<any> => {\n return translatorService.loadLanguagesAndScopes(\n config.preloadLangs ?? [config.defaultLang],\n config.preloadScopes ?? [config.defaultScope])\n };\n}\n\n@NgModule({\n imports: [],\n exports: [AXTranslatorPipe, AXTranslatorDirective],\n declarations: [AXTranslatorPipe, AXTranslatorDirective],\n providers: [\n {\n provide: APP_INITIALIZER,\n useFactory: initializeApp,\n deps: [AXTranslationService, AX_TRANSLATION_CONFIG],\n multi: true\n }\n ],\n})\nexport class AXTranslationModule { }\n","import { inject } from \"@angular/core\";\nimport { AXTranslationService } from \"./translation.service\";\nimport { ResolveFn } from \"@angular/router\";\nimport { AX_TRANSLATION_CONFIG } from \"./translation.config\";\n\nexport const loadTranslationScope: ResolveFn<unknown> = (route, state) => {\n const translatorService = inject(AXTranslationService);\n const config = inject(AX_TRANSLATION_CONFIG);\n const scopeValue = route.data[config.scopeResolverKey];\n const scopes = Array.isArray(scopeValue) ? scopeValue : [scopeValue];\n return translatorService.loadLanguagesAndScopes([translatorService.getActiveLang()], scopes);\n};","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["lodashSet","lodashGet","i1.AXTranslationService"],"mappings":"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"}
1
+ {"version":3,"file":"acorex-core-translation.mjs","sources":["../../../../libs/core/translation/src/lib/translation.config.ts","../../../../libs/core/translation/src/lib/translation.loader.ts","../../../../libs/core/translation/src/lib/translation.service.ts","../../../../libs/core/translation/src/lib/translator.pipe.ts","../../../../libs/core/translation/src/lib/translator.directive.ts","../../../../libs/core/translation/src/lib/translation.module.ts","../../../../libs/core/translation/src/lib/translation-scope.resolver.ts","../../../../libs/core/translation/src/acorex-core-translation.ts"],"sourcesContent":["import { InjectionToken } from \"@angular/core\";\nimport { AXTranslateLang, AXTranslateScope } from \"./translation.types\";\n\n\n\nexport interface AXTranslationConfig {\n defaultLang: AXTranslateLang,\n defaultScope: AXTranslateScope,\n preloadLangs?: AXTranslateLang[],\n preloadScopes?: AXTranslateLang[],\n availableLangs?: AXTranslateLang[],\n scopeResolverKey: string\n}\n\nexport const AX_TRANSLATION_CONFIG = new InjectionToken<AXTranslationConfig>('AX_TRANSLATION_CONFIG', {\n providedIn: 'root',\n factory: () => {\n return AXTranslationDefaultConfig;\n },\n});\n\nexport const AXTranslationDefaultConfig: AXTranslationConfig = {\n defaultLang: 'en',\n defaultScope: 'common',\n scopeResolverKey: 'scope',\n};\n\nexport type AXPartialTranslationConfig = Partial<AXTranslationConfig>;\n\nexport function translationConfig(config: AXPartialTranslationConfig = {}): AXTranslationConfig {\n const result = {\n ...AXTranslationDefaultConfig,\n ...config,\n };\n return result;\n}\n","import { InjectionToken } from \"@angular/core\";\nimport { AXTranslateLang, AXTranslateScope, AXTranslation } from \"./translation.types\";\nimport { Observable, of } from \"rxjs\";\n\nexport interface AXTranslationLoaderOptions {\n lang: AXTranslateLang,\n scope?: AXTranslateScope;\n}\n\n\nexport interface AXTranslationLoader {\n getTranslation(options: AXTranslationLoaderOptions): Observable<AXTranslation>;\n}\n\n\nexport class AXTranslationLoaderDefault implements AXTranslationLoader {\n getTranslation(options: AXTranslationLoaderOptions): Observable<AXTranslation> {\n return of({});\n }\n}\n\n\nexport const AX_TRANSLATION_LOADER = new InjectionToken<AXTranslationLoader>('AX_TRANSLATION_LOADER', {\n providedIn: 'root',\n factory: () => {\n return new AXTranslationLoaderDefault();\n },\n});","import { Injectable, inject } from '@angular/core';\nimport { BehaviorSubject, Observable, catchError, finalize, forkJoin, map, of, shareReplay, startWith, switchMap, tap } from 'rxjs';\nimport { AXTranslateHashMap, AXTranslateOptions, AXTranslateParams } from './translation.types';\nimport { AX_TRANSLATION_LOADER } from './translation.loader';\nimport { set as lodashSet, get as lodashGet } from 'lodash-es';\nimport { AX_TRANSLATION_CONFIG } from './translation.config';\nimport { AXEventService, AXEventTypes } from '@acorex/core/events';\n\n\nlet service: AXTranslationService;\n\n\nexport function translateSync(key: string, options?: AXTranslateOptions): string {\n return service.translateSync(key, options);\n}\n\n\n@Injectable({ providedIn: 'root' })\nexport class AXTranslationService {\n\n private loader = inject(AX_TRANSLATION_LOADER);\n private config = inject(AX_TRANSLATION_CONFIG);\n\n private eventService = inject(AXEventService);\n\n\n private translationCache: AXTranslateHashMap<AXTranslateHashMap<string>> = {};\n private ongoingRequests: Map<string, Observable<any>> = new Map();\n\n private activeLang: BehaviorSubject<string> = new BehaviorSubject<string>(this.getDefaultLang());\n langChanges$: Observable<string> = this.activeLang.asObservable();\n\n private lastActiveLang: string | null = null;\n\n\n /**\n * @ignore\n */\n constructor() {\n service = this;\n }\n\n\n public loadLanguagesAndScopes(languages: string[], scopes: string[]): Observable<unknown> {\n const requests = languages.flatMap(lang =>\n scopes.map(scope => {\n // Check if translations are already cached\n if (this.translationCache[lang]?.[scope]) {\n return of(this.translationCache[lang][scope]);\n }\n\n // Use the new method to handle ongoing requests and loading\n return this.getOrLoadTranslations(lang, scope);\n })\n );\n\n return forkJoin(requests);\n }\n\n\n private getOrLoadTranslations(lang: string, scope: string): Observable<AXTranslateHashMap<string>> {\n const requestKey = `${lang}_${scope}`;\n\n // Return existing observable if the request is already in progress\n if (this.ongoingRequests.has(requestKey)) {\n return this.ongoingRequests.get(requestKey);\n }\n\n // Load translations if not in cache or ongoing requests\n const translationObservable = this.loader.getTranslation({ lang, scope }).pipe(\n tap(translations => this.cacheTranslations(lang, scope, translations)),\n catchError(error => {\n console.error(`Error loading translations for lang: ${lang}, scope: ${scope}`, error);\n return of(null);\n }),\n finalize(() => {\n this.eventService.emitEvent({ type: AXEventTypes.AXLanguageLoaded, payload: lang });\n this.ongoingRequests.delete(requestKey);\n }),\n shareReplay(1)\n );\n\n this.ongoingRequests.set(requestKey, translationObservable);\n return translationObservable;\n }\n\n private cacheTranslations(lang: string, scope: string, translations: AXTranslateHashMap<string>): void {\n lodashSet(this.translationCache, `${lang}.${scope}`, translations);\n }\n\n public getDefaultLang(): string {\n return this.config.defaultLang;\n }\n\n public getActiveLang(): string {\n return this.activeLang.getValue();\n }\n\n public setActiveLang(lang: string): void {\n if (lang != this.getActiveLang()) {\n this.lastActiveLang = this.getActiveLang(); // Update last active language\n this.activeLang.next(lang);\n this.eventService.emitEvent({ type: AXEventTypes.AXLanguageChanged, payload: lang });\n }\n }\n\n private load(key: string, options: AXTranslateOptions = {}): Observable<string> {\n const { lang = this.getActiveLang(), scope = this.config.defaultScope } = options;\n\n // Function to fetch translation\n const fetchTranslation = (language: string): Observable<string> => {\n // Check if translations are available in the cache\n if (this.translationCache[language]?.[scope]) {\n return of(this.getTranslation(key, language, scope, options.params));\n }\n\n // Use the new method to handle ongoing requests and loading\n return this.getOrLoadTranslations(language, scope).pipe(\n map(() => {\n const translation = this.translationCache[language]?.[scope]?.[key] || key;\n return this.getTranslation(translation, language, scope, options.params);\n }),\n switchMap(translatedText => {\n if (translatedText === key && language !== this.getDefaultLang()) {\n // If the translation is not found and the language is not default,\n // try fetching from the default language\n return fetchTranslation(this.getDefaultLang());\n }\n return of(translatedText);\n })\n );\n };\n\n // First, try to fetch the translation for the requested language\n const translationForRequestedLang = fetchTranslation(lang);\n\n // If lastActiveLang is available and different from the requested language, use it as a fallback\n if (this.lastActiveLang && this.lastActiveLang !== lang) {\n const translationForLastActiveLang = this.getTranslation(key, this.lastActiveLang, scope, options.params);\n return translationForRequestedLang.pipe(\n startWith(translationForLastActiveLang)\n );\n }\n\n return translationForRequestedLang;\n }\n\n private getTranslation(key: string, lang: string, scope: string, params?: AXTranslateParams): string {\n let translation: string = (lodashGet(this.translationCache, `${lang}.${scope}.${key}`) || key) as string\n\n // Replace params like {{ name }}\n if (params) {\n Object.keys(params).forEach(paramKey => {\n const paramValue = params[paramKey] as string;\n translation = translation.replace(new RegExp(`{{\\\\s*${paramKey}\\\\s*}}`, 'g'), paramValue);\n });\n }\n\n // Replace translations like {{ t('key') }}\n const translationPattern = /{{\\s*t\\('([^']+)'\\)\\s*}}/g;\n translation = translation.replace(translationPattern, (match, innerKey) => {\n return this.getTranslation(innerKey, lang, scope, params);\n });\n\n return translation;\n }\n\n public translate(key: string, options?: AXTranslateOptions): Observable<string> {\n if (options?.lang) {\n return this.load(key, options)\n }\n return this.langChanges$.pipe(\n switchMap((lang) => {\n return this.load(key, { ...options, lang: lang })\n })\n );\n }\n\n public translateSync(key: string, options?: AXTranslateOptions): string {\n const { lang = this.getActiveLang(), scope = this.config.defaultScope } = options || {};\n\n // Check if the translation for the active language is available\n let translation = lodashGet(this.translationCache, `${lang}.${scope}.${key}`)\n\n // If not available, check lastActiveLang\n if (!translation && this.lastActiveLang) {\n translation = lodashGet(this.translationCache, `${this.lastActiveLang}.${scope}.${key}`)\n }\n\n // If still not available, use the default language\n if (!translation) {\n translation = lodashGet(this.translationCache, `${this.getDefaultLang()}.${scope}.${key}`)\n }\n\n // If no translation found, return the key\n return translation as any || this.getTranslation(key, lang, scope, options?.params);\n }\n\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { AXTranslationService } from './translation.service';\nimport { Observable, of } from 'rxjs';\nimport { AXTranslateOptions } from './translation.types';\n\n\n\n\n@Pipe({ name: 'translate', pure: true }) // The pipe can now be pure\nexport class AXTranslatorPipe implements PipeTransform {\n\n constructor(private service: AXTranslationService) { }\n\n transform(key: string, options?: AXTranslateOptions): Observable<string> {\n if (!key) {\n return of(''); // Return an empty observable if the key is not provided\n }\n return this.service.translate(key, options);\n }\n}\n","import { Directive, Input, OnChanges, OnDestroy, OnInit, SimpleChanges, TemplateRef, ViewContainerRef, inject } from \"@angular/core\";\nimport { AXTranslationService } from \"./translation.service\";\nimport { AXTranslateOptions } from \"./translation.types\";\n\n@Directive({\n selector: '[translate]',\n})\nexport class AXTranslatorDirective implements OnInit {\n\n constructor(\n private templateRef: TemplateRef<any>,\n private viewContainer: ViewContainerRef,\n private translationService: AXTranslationService\n ) { }\n\n ngOnInit() {\n this.viewContainer.clear();\n this.viewContainer.createEmbeddedView(this.templateRef, {\n $implicit: (key: string, options?: AXTranslateOptions) => {\n return this.translationService.translate(key, options)\n }\n });\n }\n}","import { APP_INITIALIZER, NgModule } from '@angular/core';\nimport { AXTranslatorPipe } from './translator.pipe';\nimport { AXTranslatorDirective } from './translator.directive';\nimport { AXTranslationService } from './translation.service';\nimport { Observable } from 'rxjs';\nimport { AXTranslationConfig, AX_TRANSLATION_CONFIG } from './translation.config';\n\n\nfunction initializeApp(translatorService: AXTranslationService, config: AXTranslationConfig) {\n return (): Observable<any> => {\n return translatorService.loadLanguagesAndScopes(\n config.preloadLangs ?? [config.defaultLang],\n config.preloadScopes ?? [config.defaultScope])\n };\n}\n\n@NgModule({\n imports: [],\n exports: [AXTranslatorPipe, AXTranslatorDirective],\n declarations: [AXTranslatorPipe, AXTranslatorDirective],\n providers: [\n {\n provide: APP_INITIALIZER,\n useFactory: initializeApp,\n deps: [AXTranslationService, AX_TRANSLATION_CONFIG],\n multi: true\n }\n ],\n})\nexport class AXTranslationModule { }\n","import { inject } from \"@angular/core\";\nimport { AXTranslationService } from \"./translation.service\";\nimport { ResolveFn } from \"@angular/router\";\nimport { AX_TRANSLATION_CONFIG } from \"./translation.config\";\n\nexport const loadTranslationScope: ResolveFn<unknown> = (route, state) => {\n const translatorService = inject(AXTranslationService);\n const config = inject(AX_TRANSLATION_CONFIG);\n const scopeValue = route.data[config.scopeResolverKey];\n const scopes = Array.isArray(scopeValue) ? scopeValue : [scopeValue];\n return translatorService.loadLanguagesAndScopes([translatorService.getActiveLang()], scopes);\n};","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["lodashSet","lodashGet","i1.AXTranslationService"],"mappings":"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"}
@@ -1,9 +1,12 @@
1
1
  import { PipeTransform } from '@angular/core';
2
2
  import { AXFormatOptions } from './format.types';
3
+ import { Observable } from 'rxjs';
3
4
  import * as i0 from "@angular/core";
4
5
  export declare class AXFormatPipe implements PipeTransform {
5
6
  private formatService;
6
- transform(value: unknown, name: string, options?: AXFormatOptions | string): string;
7
+ private eventService;
8
+ private triggers;
9
+ transform(value: unknown, name: string, options?: AXFormatOptions | string): Observable<string>;
7
10
  static ɵfac: i0.ɵɵFactoryDeclaration<AXFormatPipe, never>;
8
11
  static ɵpipe: i0.ɵɵPipeDeclaration<AXFormatPipe, "format", false>;
9
12
  }
@@ -14,6 +14,9 @@ export declare class AXFormatterRegistryService {
14
14
  export declare class AXFormatService {
15
15
  private pluginRegistry;
16
16
  constructor(pluginRegistry: AXFormatterRegistryService);
17
+ private renderSubject;
18
+ onRender: import("rxjs").Observable<void>;
19
+ render(): void;
17
20
  /**
18
21
  * Resolves a formatter by its name.
19
22
  * @param name The name of the formatter.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@acorex/core",
3
- "version": "7.17.27",
3
+ "version": "7.17.29",
4
4
  "sideEffects": false,
5
5
  "peerDependencies": {
6
6
  "@angular/common": ">=17.0.3",
@@ -5,14 +5,18 @@ export declare function translateSync(key: string, options?: AXTranslateOptions)
5
5
  export declare class AXTranslationService {
6
6
  private loader;
7
7
  private config;
8
+ private eventService;
8
9
  private translationCache;
10
+ private ongoingRequests;
9
11
  private activeLang;
10
12
  langChanges$: Observable<string>;
13
+ private lastActiveLang;
11
14
  /**
12
15
  * @ignore
13
16
  */
14
17
  constructor();
15
18
  loadLanguagesAndScopes(languages: string[], scopes: string[]): Observable<unknown>;
19
+ private getOrLoadTranslations;
16
20
  private cacheTranslations;
17
21
  getDefaultLang(): string;
18
22
  getActiveLang(): string;
@@ -1,15 +1,12 @@
1
- import { OnDestroy, PipeTransform } from '@angular/core';
1
+ import { PipeTransform } from '@angular/core';
2
+ import { AXTranslationService } from './translation.service';
3
+ import { Observable } from 'rxjs';
2
4
  import { AXTranslateOptions } from './translation.types';
3
5
  import * as i0 from "@angular/core";
4
- export declare class AXTranslatorPipe implements PipeTransform, OnDestroy {
6
+ export declare class AXTranslatorPipe implements PipeTransform {
5
7
  private service;
6
- private cdr;
7
- private value;
8
- private lastKey;
9
- private subscription;
10
- transform(key: string, options?: AXTranslateOptions): string;
11
- ngOnDestroy(): void;
12
- private dispose;
8
+ constructor(service: AXTranslationService);
9
+ transform(key: string, options?: AXTranslateOptions): Observable<string>;
13
10
  static ɵfac: i0.ɵɵFactoryDeclaration<AXTranslatorPipe, never>;
14
11
  static ɵpipe: i0.ɵɵPipeDeclaration<AXTranslatorPipe, "translate", false>;
15
12
  }