@acorex/core 21.0.1-next.56 → 21.0.1-next.58
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.
- package/fesm2022/acorex-core-platform.mjs +108 -2
- package/fesm2022/acorex-core-platform.mjs.map +1 -1
- package/fesm2022/acorex-core-translation.mjs +129 -47
- package/fesm2022/acorex-core-translation.mjs.map +1 -1
- package/package.json +1 -1
- package/types/acorex-core-platform.d.ts +28 -5
- package/types/acorex-core-translation.d.ts +29 -4
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { isPlatformBrowser } from '@angular/common';
|
|
2
2
|
import * as i0 from '@angular/core';
|
|
3
3
|
import { signal, inject, DOCUMENT, PLATFORM_ID, Injectable } from '@angular/core';
|
|
4
|
+
import { AXEventService, AXSystemEvents } from '@acorex/core/events';
|
|
4
5
|
import { Subject, BehaviorSubject, fromEvent } from 'rxjs';
|
|
5
6
|
import { debounceTime, distinctUntilChanged } from 'rxjs/operators';
|
|
6
7
|
|
|
@@ -103,6 +104,23 @@ class AXPlatform {
|
|
|
103
104
|
}
|
|
104
105
|
return false;
|
|
105
106
|
}
|
|
107
|
+
get documentDirection() {
|
|
108
|
+
if (!isPlatformBrowser(this.platformID)) {
|
|
109
|
+
return 'ltr';
|
|
110
|
+
}
|
|
111
|
+
const dir = (this.document.documentElement.getAttribute('dir') ||
|
|
112
|
+
this.document.body.getAttribute('dir') ||
|
|
113
|
+
this.document.dir ||
|
|
114
|
+
this.document.body.style.direction ||
|
|
115
|
+
'ltr');
|
|
116
|
+
return dir.toLowerCase() === 'rtl' ? 'rtl' : 'ltr';
|
|
117
|
+
}
|
|
118
|
+
get documentLanguage() {
|
|
119
|
+
if (!isPlatformBrowser(this.platformID)) {
|
|
120
|
+
return 'en-US';
|
|
121
|
+
}
|
|
122
|
+
return this.document.documentElement.getAttribute('lang') || this.document.body.getAttribute('lang') || 'en-US';
|
|
123
|
+
}
|
|
106
124
|
isLandscape() {
|
|
107
125
|
if (isPlatformBrowser(this.platformID)) {
|
|
108
126
|
return window.innerHeight < window.innerWidth;
|
|
@@ -207,6 +225,68 @@ class AXPlatform {
|
|
|
207
225
|
break;
|
|
208
226
|
}
|
|
209
227
|
}
|
|
228
|
+
/**
|
|
229
|
+
* Sets document direction (dir="ltr|rtl") and persists it.
|
|
230
|
+
*/
|
|
231
|
+
setDirection(dir) {
|
|
232
|
+
if (!isPlatformBrowser(this.platformID)) {
|
|
233
|
+
return;
|
|
234
|
+
}
|
|
235
|
+
const normalized = dir === 'rtl' ? 'rtl' : 'ltr';
|
|
236
|
+
this.document.documentElement.setAttribute('dir', normalized);
|
|
237
|
+
this.document.body.setAttribute('dir', normalized);
|
|
238
|
+
this.document.body.style.direction = normalized;
|
|
239
|
+
localStorage.setItem('AX_DIRECTION', normalized);
|
|
240
|
+
this.direction$.next(normalized);
|
|
241
|
+
this.direction.set(normalized);
|
|
242
|
+
}
|
|
243
|
+
toggleDirection() {
|
|
244
|
+
const next = this.documentDirection === 'rtl' ? 'ltr' : 'rtl';
|
|
245
|
+
this.setDirection(next);
|
|
246
|
+
return next;
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Sets document language (lang="<bcp47>") and optionally direction, then persists it.
|
|
250
|
+
*/
|
|
251
|
+
setLanguage(lang, options) {
|
|
252
|
+
if (!isPlatformBrowser(this.platformID)) {
|
|
253
|
+
return;
|
|
254
|
+
}
|
|
255
|
+
const normalizedLang = (lang || 'en-US').trim();
|
|
256
|
+
this.document.documentElement.setAttribute('lang', normalizedLang);
|
|
257
|
+
this.document.body.setAttribute('lang', normalizedLang);
|
|
258
|
+
localStorage.setItem('AX_LANGUAGE', normalizedLang);
|
|
259
|
+
this.language$.next(normalizedLang);
|
|
260
|
+
this.language.set(normalizedLang);
|
|
261
|
+
const dir = options?.dir ?? this.#inferDirectionFromLanguage(normalizedLang);
|
|
262
|
+
this.setDirection(dir);
|
|
263
|
+
}
|
|
264
|
+
autoDetectLanguage() {
|
|
265
|
+
if (!isPlatformBrowser(this.platformID)) {
|
|
266
|
+
return this.documentLanguage;
|
|
267
|
+
}
|
|
268
|
+
const lang = localStorage.getItem('AX_LANGUAGE') || this.documentLanguage || 'en-US';
|
|
269
|
+
this.setLanguage(lang, { dir: this.#inferDirectionFromLanguage(lang) });
|
|
270
|
+
return lang;
|
|
271
|
+
}
|
|
272
|
+
autoDetectDirection() {
|
|
273
|
+
if (!isPlatformBrowser(this.platformID)) {
|
|
274
|
+
return this.documentDirection;
|
|
275
|
+
}
|
|
276
|
+
const dir = localStorage.getItem('AX_DIRECTION') || this.documentDirection || 'ltr';
|
|
277
|
+
this.setDirection(dir);
|
|
278
|
+
return dir;
|
|
279
|
+
}
|
|
280
|
+
#inferDirectionFromLanguage(lang) {
|
|
281
|
+
const normalized = lang.toLowerCase();
|
|
282
|
+
if (normalized.startsWith('fa') ||
|
|
283
|
+
normalized.startsWith('ar') ||
|
|
284
|
+
normalized.startsWith('he') ||
|
|
285
|
+
normalized.startsWith('ur')) {
|
|
286
|
+
return 'rtl';
|
|
287
|
+
}
|
|
288
|
+
return 'ltr';
|
|
289
|
+
}
|
|
210
290
|
setFullHeightRatio() {
|
|
211
291
|
if (isPlatformBrowser(this.platformID)) {
|
|
212
292
|
try {
|
|
@@ -237,12 +317,18 @@ class AXPlatform {
|
|
|
237
317
|
constructor() {
|
|
238
318
|
this.resize = new Subject();
|
|
239
319
|
this.directionChange = new Subject();
|
|
320
|
+
this.languageChange = new Subject();
|
|
240
321
|
this.click = new Subject();
|
|
241
322
|
this.scroll = new Subject();
|
|
242
323
|
this.themeMode$ = new BehaviorSubject('system');
|
|
243
324
|
this.themeMode = signal('system', ...(ngDevMode ? [{ debugName: "themeMode" }] : []));
|
|
325
|
+
this.direction$ = new BehaviorSubject('ltr');
|
|
326
|
+
this.direction = signal('ltr', ...(ngDevMode ? [{ debugName: "direction" }] : []));
|
|
327
|
+
this.language$ = new BehaviorSubject('en-US');
|
|
328
|
+
this.language = signal('en-US', ...(ngDevMode ? [{ debugName: "language" }] : []));
|
|
244
329
|
this.document = inject(DOCUMENT);
|
|
245
330
|
this.platformID = inject(PLATFORM_ID);
|
|
331
|
+
this.eventService = inject(AXEventService);
|
|
246
332
|
if (isPlatformBrowser(this.platformID)) {
|
|
247
333
|
this.detectDarkMode();
|
|
248
334
|
this.detectOnResize();
|
|
@@ -250,8 +336,19 @@ class AXPlatform {
|
|
|
250
336
|
this.detectScrollEvent();
|
|
251
337
|
this.setFullHeightRatio();
|
|
252
338
|
this.detectDocumentDirectionChange();
|
|
339
|
+
this.autoDetectLanguage();
|
|
340
|
+
this.autoDetectDirection();
|
|
341
|
+
this.detectLanguageChangeFromSystemEvents();
|
|
253
342
|
}
|
|
254
343
|
}
|
|
344
|
+
detectLanguageChangeFromSystemEvents() {
|
|
345
|
+
this.eventService.onEvent.subscribe((e) => {
|
|
346
|
+
if (e.type === AXSystemEvents.AXLanguageChanged && typeof e.payload === 'string') {
|
|
347
|
+
// Keep platform/document state in sync with translation module language changes
|
|
348
|
+
this.setLanguage(e.payload);
|
|
349
|
+
}
|
|
350
|
+
});
|
|
351
|
+
}
|
|
255
352
|
detectDarkMode() {
|
|
256
353
|
if (isPlatformBrowser(this.platformID)) {
|
|
257
354
|
// fromEvent(UIEvent)(window,'')
|
|
@@ -304,8 +401,17 @@ class AXPlatform {
|
|
|
304
401
|
mutations.forEach((mutation) => {
|
|
305
402
|
// Detect Direction Change
|
|
306
403
|
if (mutation.attributeName === 'dir') {
|
|
307
|
-
const dir = this.document.documentElement.getAttribute('dir');
|
|
308
|
-
|
|
404
|
+
const dir = (this.document.documentElement.getAttribute('dir') || 'ltr');
|
|
405
|
+
const normalized = dir.toLowerCase() === 'rtl' ? 'rtl' : 'ltr';
|
|
406
|
+
this.direction$.next(normalized);
|
|
407
|
+
this.direction.set(normalized);
|
|
408
|
+
this.directionChange.next({ source: this, nativeEvent: null, data: normalized });
|
|
409
|
+
}
|
|
410
|
+
if (mutation.attributeName === 'lang') {
|
|
411
|
+
const lang = this.document.documentElement.getAttribute('lang') || 'en-US';
|
|
412
|
+
this.language$.next(lang);
|
|
413
|
+
this.language.set(lang);
|
|
414
|
+
this.languageChange.next({ source: this, nativeEvent: null, data: lang });
|
|
309
415
|
}
|
|
310
416
|
});
|
|
311
417
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acorex-core-platform.mjs","sources":["../../../../packages/core/platform/src/lib/platform.service.ts","../../../../packages/core/platform/src/acorex-core-platform.ts"],"sourcesContent":["import { isPlatformBrowser } from '@angular/common';\nimport { DOCUMENT, inject, Injectable, PLATFORM_ID, signal } from '@angular/core';\nimport { BehaviorSubject, fromEvent, Subject } from 'rxjs';\nimport { debounceTime, distinctUntilChanged } from 'rxjs/operators';\n\nexport type AXThemeMode = 'light' | 'dark' | 'system' | 'system-dark' | 'system-light';\nexport type AXPlatforms = 'Android' | 'Desktop' | 'iOS' | 'Mobile';\nexport type AXBrowsers = 'Chrome' | 'Safari' | 'Edge' | 'Firefox' | 'Opera' | 'MSIE';\nexport type AXTechnologies = 'PWA' | 'Hybrid' | 'Electron';\n\nexport type AXScreenSizes = 'SM' | 'MD' | 'LG' | 'XL' | '2XL' | '3XL' | '4XL' | '5XL';\n\nexport const isChrome = (win: Window): boolean => testUserAgent(win, /Chrome/i);\n\nexport const isFirefox = (win: Window): boolean => testUserAgent(win, /Firefox/i);\n\nexport const isEdge = (win: Window): boolean => testUserAgent(win, /Edge/i);\n\nexport const isSafari = (win: Window): boolean => testUserAgent(win, /Safari/i);\n\nexport const isOpera = (win: Window): boolean => testUserAgent(win, /Opera/i) || testUserAgent(win, /OPR/i);\n\nexport const isMSIE = (win: Window): boolean => testUserAgent(win, /MSIE/i) || testUserAgent(win, /Trident/i);\n\nexport const isMobileWeb = (win: Window): boolean => isMobile(win) && !isHybrid(win);\n\nexport const isIpad = (win: Window) => {\n // iOS 12 and below\n if (testUserAgent(win, /iPad/i)) {\n return true;\n }\n\n // iOS 13+\n if (testUserAgent(win, /Macintosh/i) && isMobile(win)) {\n return true;\n }\n\n return false;\n};\n\nexport const isIphone = (win: Window) => testUserAgent(win, /iPhone/i);\n\nexport const isIOS = (win: Window) => testUserAgent(win, /iPhone|iPod/i) || isIpad(win);\n\nexport const isAndroid = (win: Window) => testUserAgent(win, /android|sink/i);\n\nexport const isAndroidTablet = (win: Window) => {\n return isAndroid(win) && !testUserAgent(win, /mobile/i);\n};\n\nexport const isPhablet = (win: Window) => {\n const width = win.innerWidth;\n const height = win.innerHeight;\n const smallest = Math.min(width, height);\n const largest = Math.max(width, height);\n\n return smallest > 390 && smallest < 520 && largest > 620 && largest < 800;\n};\n\nexport const isTablet = (win: Window) => {\n const width = win.innerWidth;\n const height = win.innerHeight;\n const smallest = Math.min(width, height);\n const largest = Math.max(width, height);\n\n return isIpad(win) || isAndroidTablet(win) || (smallest > 460 && smallest < 820 && largest > 780 && largest < 1400);\n};\n\nexport const isMobile = (win: Window) => matchMedia(win, '(any-pointer:coarse)');\nexport const isTouch = (win: Window) => matchMedia(win, '(any-pointer:coarse)');\n\nexport const isDesktop = (win: Window) => !isMobile(win);\n\nexport const isHybrid = (win: Window) => isCordova(win) || isCapacitorNative(win);\n\nexport const isCordova = (win: any): boolean => !!(win['cordova'] || win['phonegap'] || win['PhoneGap']);\n\nexport const isCapacitorNative = (win: any): boolean => {\n const capacitor = win['Capacitor'];\n return !!(capacitor && capacitor.isNative);\n};\n\nexport const isElectron = (win: Window): boolean => testUserAgent(win, /electron/i);\n\nexport const isPWA = (win: Window): boolean =>\n !!(win.matchMedia('(display-mode: standalone)').matches || (win.navigator as any).standalone);\n\nexport const testUserAgent = (win: Window, expr: RegExp) => expr.test(win.navigator.userAgent);\n\nexport const isBrowser = new Function('try {return this===window;}catch(e){ return false;}');\nexport const isServer = new Function('try {return this===global;}catch(e){return false;}');\n\nexport const matchMedia = (win: Window, query: string): boolean => {\n return win.matchMedia(query).matches;\n};\n\nexport const isSMScreen = (win: Window) => matchMedia(win, '(max-width: 640px)');\nexport const isMDScreen = (win: Window) => matchMedia(win, '(max-width: 768px)');\nexport const isLGScreen = (win: Window) => matchMedia(win, '(max-width: 1024px)');\nexport const isXLScreen = (win: Window) => matchMedia(win, '(max-width: 1280px)');\nexport const is2XLScreen = (win: Window) => matchMedia(win, '(max-width: 1536px)');\nexport const is3XLScreen = (win: Window) => matchMedia(win, '(max-width: 1920px)');\nexport const is4XLScreen = (win: Window) => matchMedia(win, '(max-width: 2560px)');\n\nexport const PLATFORMS_MAP: any = {\n Android: isAndroid,\n iOS: isIOS,\n Desktop: isDesktop,\n Mobile: isMobile,\n Touch: isTouch,\n Chrome: isChrome,\n Firefox: isFirefox,\n Safari: isSafari,\n Edge: isEdge,\n Opera: isOpera,\n Hybrid: isHybrid,\n PWA: isPWA,\n Electron: isElectron,\n SM: isSMScreen,\n MD: isMDScreen,\n LG: isLGScreen,\n XL: isXLScreen,\n '2XL': is2XLScreen,\n '3XL': is3XLScreen,\n '4XL': is4XLScreen,\n};\n\nexport class AXPlatformEvent<T extends Event = Event> {\n nativeEvent!: T;\n source!: AXPlatform;\n data?: any;\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AXPlatform {\n resize: Subject<AXPlatformEvent> = new Subject<AXPlatformEvent>();\n directionChange: Subject<AXPlatformEvent> = new Subject<AXPlatformEvent>();\n click: Subject<AXPlatformEvent> = new Subject<AXPlatformEvent>();\n scroll: Subject<AXPlatformEvent> = new Subject<AXPlatformEvent>();\n themeMode$: BehaviorSubject<AXThemeMode> = new BehaviorSubject<AXThemeMode>('system');\n themeMode = signal<AXThemeMode>('system');\n private document = inject(DOCUMENT);\n private platformID = inject(PLATFORM_ID);\n\n isDark(): boolean {\n if (isPlatformBrowser(this.platformID)) {\n return this.document.documentElement.classList.contains('dark');\n }\n return false;\n }\n\n isRtl(): boolean {\n if (isPlatformBrowser(this.platformID)) {\n return (\n this.document.dir == 'rtl' || this.document.body.dir == 'rtl' || this.document.body.style.direction == 'rtl'\n );\n }\n return false;\n }\n\n isLandscape(): boolean {\n if (isPlatformBrowser(this.platformID)) {\n return window.innerHeight < window.innerWidth;\n }\n return true;\n }\n\n isPortrate(): boolean {\n return !this.isLandscape();\n }\n\n /**\n * Checks whether the current environment matches the given platform/browser/technology/screen size keyword.\n *\n * @param name - One of AXPlatforms | AXBrowsers | AXTechnologies | AXScreenSizes.\n */\n\n is(name: AXPlatforms | AXBrowsers | AXTechnologies | AXScreenSizes): boolean {\n if (isPlatformBrowser(this.platformID)) {\n return PLATFORMS_MAP[name](window) || false;\n } else {\n return false;\n }\n }\n\n get screenSize(): AXScreenSizes {\n return (['SM', 'MD', 'LG', 'XL', '2XL', '3XL', '4XL'].find((name) => PLATFORMS_MAP[name](window) == true) ||\n '5XL') as AXScreenSizes;\n }\n\n /**\n * Switches to light mode and persists it.\n * @returns 'light'\n */\n\n switchLightMode() {\n if (isPlatformBrowser(this.platformID)) {\n const _html = this.document.getElementsByTagName('html')[0];\n _html.classList.remove('dark');\n }\n this.#setSystemTheme('light');\n return 'light';\n }\n\n /**\n * Switches to dark mode and persists it.\n * @returns 'dark'\n */\n\n switchDarkMode() {\n if (isPlatformBrowser(this.platformID)) {\n const _html = this.document.getElementsByTagName('html')[0];\n _html.classList.add('dark');\n }\n this.#setSystemTheme('dark');\n return 'dark';\n }\n\n switchSystemMode() {\n if (isPlatformBrowser(this.platformID)) {\n if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {\n const _html = this.document.getElementsByTagName('html')[0];\n _html.classList.add('dark');\n this.#setSystemTheme('system-dark');\n } else {\n const _html = this.document.getElementsByTagName('html')[0];\n _html.classList.remove('dark');\n this.#setSystemTheme('system-light');\n }\n }\n }\n\n #setSystemTheme(themeMode: AXThemeMode) {\n this.themeMode$.next(themeMode);\n localStorage.setItem('AX_THEME_MODE', themeMode);\n this.themeMode.set(themeMode);\n }\n\n /**\n * Reads persisted theme preference and applies it (returns the effective mode).\n * @returns AXThemeMode\n */\n\n autoDetectThemeMode() {\n const mode = localStorage.getItem('AX_THEME_MODE') || 'system';\n switch (mode) {\n case 'light':\n this.switchLightMode();\n return 'light';\n\n case 'dark':\n this.switchDarkMode();\n return 'dark';\n\n default:\n this.switchSystemMode();\n return 'system';\n }\n }\n\n /**\n * Sets theme mode explicitly and persists it.\n * @param mode - Desired theme mode.\n */\n\n setThemeMode(mode: AXThemeMode) {\n switch (mode) {\n case 'light':\n this.switchLightMode();\n break;\n case 'dark':\n this.switchDarkMode();\n break;\n default:\n this.switchSystemMode();\n break;\n }\n }\n\n private setFullHeightRatio() {\n if (isPlatformBrowser(this.platformID)) {\n try {\n this.document\n .querySelector<HTMLElement>(':root')\n ?.style.setProperty('--ax-vh', window.innerHeight / 100 + 'px');\n } catch (error) {\n console.error(error);\n }\n }\n }\n\n private autoSystemModeDetection(event) {\n if (this.themeMode() === 'system') {\n const themeMode = event.matches ? 'dark' : 'light';\n\n if (isPlatformBrowser(this.platformID)) {\n if (themeMode === 'dark') {\n const _html = this.document.getElementsByTagName('html')[0];\n _html.classList.add('dark');\n } else {\n const _html = this.document.getElementsByTagName('html')[0];\n _html.classList.remove('dark');\n }\n }\n }\n }\n\n constructor() {\n if (isPlatformBrowser(this.platformID)) {\n this.detectDarkMode();\n this.detectOnResize();\n this.detectClickEvent();\n this.detectScrollEvent();\n this.setFullHeightRatio();\n this.detectDocumentDirectionChange();\n }\n }\n\n private detectDarkMode() {\n if (isPlatformBrowser(this.platformID)) {\n // fromEvent(UIEvent)(window,'')\n if (window?.matchMedia('(prefers-color-scheme: dark)').matches) {\n window?.matchMedia('(prefers-color-scheme: dark)')?.addEventListener('change', (event) => {\n // Detect System color mode\n this.autoSystemModeDetection(event);\n });\n }\n }\n }\n\n private detectOnResize() {\n if (isPlatformBrowser(this.platformID)) {\n fromEvent<UIEvent>(window, 'resize')\n .pipe(debounceTime(100))\n .pipe(distinctUntilChanged())\n .subscribe((e) => {\n this.resize.next({\n nativeEvent: e,\n source: this,\n });\n //\n this.setFullHeightRatio();\n });\n }\n }\n\n private detectClickEvent() {\n if (isPlatformBrowser(this.platformID)) {\n this.document.addEventListener(\n 'click',\n (e) => {\n this.click.next({\n nativeEvent: e,\n source: this,\n });\n },\n true,\n );\n }\n }\n\n private detectScrollEvent() {\n if (isPlatformBrowser(this.platformID)) {\n this.document.addEventListener(\n 'scroll',\n (e) => {\n this.scroll.next({\n nativeEvent: e,\n source: this,\n });\n },\n true,\n );\n }\n }\n\n private detectDocumentDirectionChange() {\n if (isPlatformBrowser(this.platformID)) {\n const observer = new MutationObserver((mutations) => {\n mutations.forEach((mutation) => {\n // Detect Direction Change\n if (mutation.attributeName === 'dir') {\n const dir = this.document.documentElement.getAttribute('dir');\n this.directionChange.next({ source: this, nativeEvent: null, data: dir });\n }\n });\n });\n observer.observe(document.documentElement, {\n attributes: true,\n childList: false,\n characterData: false,\n });\n }\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"acorex-core-platform.mjs","sources":["../../../../packages/core/platform/src/lib/platform.service.ts","../../../../packages/core/platform/src/acorex-core-platform.ts"],"sourcesContent":["import { isPlatformBrowser } from '@angular/common';\nimport { DOCUMENT, inject, Injectable, PLATFORM_ID, signal } from '@angular/core';\nimport { AXEventService, AXSystemEvents } from '@acorex/core/events';\nimport { BehaviorSubject, fromEvent, Subject } from 'rxjs';\nimport { debounceTime, distinctUntilChanged } from 'rxjs/operators';\n\nexport type AXThemeMode = 'light' | 'dark' | 'system' | 'system-dark' | 'system-light';\nexport type AXDirection = 'ltr' | 'rtl';\nexport type AXPlatforms = 'Android' | 'Desktop' | 'iOS' | 'Mobile';\nexport type AXBrowsers = 'Chrome' | 'Safari' | 'Edge' | 'Firefox' | 'Opera' | 'MSIE';\nexport type AXTechnologies = 'PWA' | 'Hybrid' | 'Electron';\n\nexport type AXScreenSizes = 'SM' | 'MD' | 'LG' | 'XL' | '2XL' | '3XL' | '4XL' | '5XL';\n\nexport const isChrome = (win: Window): boolean => testUserAgent(win, /Chrome/i);\n\nexport const isFirefox = (win: Window): boolean => testUserAgent(win, /Firefox/i);\n\nexport const isEdge = (win: Window): boolean => testUserAgent(win, /Edge/i);\n\nexport const isSafari = (win: Window): boolean => testUserAgent(win, /Safari/i);\n\nexport const isOpera = (win: Window): boolean => testUserAgent(win, /Opera/i) || testUserAgent(win, /OPR/i);\n\nexport const isMSIE = (win: Window): boolean => testUserAgent(win, /MSIE/i) || testUserAgent(win, /Trident/i);\n\nexport const isMobileWeb = (win: Window): boolean => isMobile(win) && !isHybrid(win);\n\nexport const isIpad = (win: Window) => {\n // iOS 12 and below\n if (testUserAgent(win, /iPad/i)) {\n return true;\n }\n\n // iOS 13+\n if (testUserAgent(win, /Macintosh/i) && isMobile(win)) {\n return true;\n }\n\n return false;\n};\n\nexport const isIphone = (win: Window) => testUserAgent(win, /iPhone/i);\n\nexport const isIOS = (win: Window) => testUserAgent(win, /iPhone|iPod/i) || isIpad(win);\n\nexport const isAndroid = (win: Window) => testUserAgent(win, /android|sink/i);\n\nexport const isAndroidTablet = (win: Window) => {\n return isAndroid(win) && !testUserAgent(win, /mobile/i);\n};\n\nexport const isPhablet = (win: Window) => {\n const width = win.innerWidth;\n const height = win.innerHeight;\n const smallest = Math.min(width, height);\n const largest = Math.max(width, height);\n\n return smallest > 390 && smallest < 520 && largest > 620 && largest < 800;\n};\n\nexport const isTablet = (win: Window) => {\n const width = win.innerWidth;\n const height = win.innerHeight;\n const smallest = Math.min(width, height);\n const largest = Math.max(width, height);\n\n return isIpad(win) || isAndroidTablet(win) || (smallest > 460 && smallest < 820 && largest > 780 && largest < 1400);\n};\n\nexport const isMobile = (win: Window) => matchMedia(win, '(any-pointer:coarse)');\nexport const isTouch = (win: Window) => matchMedia(win, '(any-pointer:coarse)');\n\nexport const isDesktop = (win: Window) => !isMobile(win);\n\nexport const isHybrid = (win: Window) => isCordova(win) || isCapacitorNative(win);\n\nexport const isCordova = (win: any): boolean => !!(win['cordova'] || win['phonegap'] || win['PhoneGap']);\n\nexport const isCapacitorNative = (win: any): boolean => {\n const capacitor = win['Capacitor'];\n return !!(capacitor && capacitor.isNative);\n};\n\nexport const isElectron = (win: Window): boolean => testUserAgent(win, /electron/i);\n\nexport const isPWA = (win: Window): boolean =>\n !!(win.matchMedia('(display-mode: standalone)').matches || (win.navigator as any).standalone);\n\nexport const testUserAgent = (win: Window, expr: RegExp) => expr.test(win.navigator.userAgent);\n\nexport const isBrowser = new Function('try {return this===window;}catch(e){ return false;}');\nexport const isServer = new Function('try {return this===global;}catch(e){return false;}');\n\nexport const matchMedia = (win: Window, query: string): boolean => {\n return win.matchMedia(query).matches;\n};\n\nexport const isSMScreen = (win: Window) => matchMedia(win, '(max-width: 640px)');\nexport const isMDScreen = (win: Window) => matchMedia(win, '(max-width: 768px)');\nexport const isLGScreen = (win: Window) => matchMedia(win, '(max-width: 1024px)');\nexport const isXLScreen = (win: Window) => matchMedia(win, '(max-width: 1280px)');\nexport const is2XLScreen = (win: Window) => matchMedia(win, '(max-width: 1536px)');\nexport const is3XLScreen = (win: Window) => matchMedia(win, '(max-width: 1920px)');\nexport const is4XLScreen = (win: Window) => matchMedia(win, '(max-width: 2560px)');\n\nexport const PLATFORMS_MAP: any = {\n Android: isAndroid,\n iOS: isIOS,\n Desktop: isDesktop,\n Mobile: isMobile,\n Touch: isTouch,\n Chrome: isChrome,\n Firefox: isFirefox,\n Safari: isSafari,\n Edge: isEdge,\n Opera: isOpera,\n Hybrid: isHybrid,\n PWA: isPWA,\n Electron: isElectron,\n SM: isSMScreen,\n MD: isMDScreen,\n LG: isLGScreen,\n XL: isXLScreen,\n '2XL': is2XLScreen,\n '3XL': is3XLScreen,\n '4XL': is4XLScreen,\n};\n\nexport class AXPlatformEvent<T extends Event = Event> {\n nativeEvent!: T;\n source!: AXPlatform;\n data?: any;\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AXPlatform {\n resize: Subject<AXPlatformEvent> = new Subject<AXPlatformEvent>();\n directionChange: Subject<AXPlatformEvent> = new Subject<AXPlatformEvent>();\n languageChange: Subject<AXPlatformEvent> = new Subject<AXPlatformEvent>();\n click: Subject<AXPlatformEvent> = new Subject<AXPlatformEvent>();\n scroll: Subject<AXPlatformEvent> = new Subject<AXPlatformEvent>();\n themeMode$: BehaviorSubject<AXThemeMode> = new BehaviorSubject<AXThemeMode>('system');\n themeMode = signal<AXThemeMode>('system');\n direction$: BehaviorSubject<AXDirection> = new BehaviorSubject<AXDirection>('ltr');\n direction = signal<AXDirection>('ltr');\n language$: BehaviorSubject<string> = new BehaviorSubject<string>('en-US');\n language = signal<string>('en-US');\n private document = inject(DOCUMENT);\n private platformID = inject(PLATFORM_ID);\n private eventService = inject(AXEventService);\n\n isDark(): boolean {\n if (isPlatformBrowser(this.platformID)) {\n return this.document.documentElement.classList.contains('dark');\n }\n return false;\n }\n\n isRtl(): boolean {\n if (isPlatformBrowser(this.platformID)) {\n return (\n this.document.dir == 'rtl' || this.document.body.dir == 'rtl' || this.document.body.style.direction == 'rtl'\n );\n }\n return false;\n }\n\n get documentDirection(): AXDirection {\n if (!isPlatformBrowser(this.platformID)) {\n return 'ltr';\n }\n\n const dir = (this.document.documentElement.getAttribute('dir') ||\n this.document.body.getAttribute('dir') ||\n this.document.dir ||\n (this.document.body.style.direction as string) ||\n 'ltr') as string;\n\n return dir.toLowerCase() === 'rtl' ? 'rtl' : 'ltr';\n }\n\n get documentLanguage(): string {\n if (!isPlatformBrowser(this.platformID)) {\n return 'en-US';\n }\n\n return this.document.documentElement.getAttribute('lang') || this.document.body.getAttribute('lang') || 'en-US';\n }\n\n isLandscape(): boolean {\n if (isPlatformBrowser(this.platformID)) {\n return window.innerHeight < window.innerWidth;\n }\n return true;\n }\n\n isPortrate(): boolean {\n return !this.isLandscape();\n }\n\n /**\n * Checks whether the current environment matches the given platform/browser/technology/screen size keyword.\n *\n * @param name - One of AXPlatforms | AXBrowsers | AXTechnologies | AXScreenSizes.\n */\n\n is(name: AXPlatforms | AXBrowsers | AXTechnologies | AXScreenSizes): boolean {\n if (isPlatformBrowser(this.platformID)) {\n return PLATFORMS_MAP[name](window) || false;\n } else {\n return false;\n }\n }\n\n get screenSize(): AXScreenSizes {\n return (['SM', 'MD', 'LG', 'XL', '2XL', '3XL', '4XL'].find((name) => PLATFORMS_MAP[name](window) == true) ||\n '5XL') as AXScreenSizes;\n }\n\n /**\n * Switches to light mode and persists it.\n * @returns 'light'\n */\n\n switchLightMode() {\n if (isPlatformBrowser(this.platformID)) {\n const _html = this.document.getElementsByTagName('html')[0];\n _html.classList.remove('dark');\n }\n this.#setSystemTheme('light');\n return 'light';\n }\n\n /**\n * Switches to dark mode and persists it.\n * @returns 'dark'\n */\n\n switchDarkMode() {\n if (isPlatformBrowser(this.platformID)) {\n const _html = this.document.getElementsByTagName('html')[0];\n _html.classList.add('dark');\n }\n this.#setSystemTheme('dark');\n return 'dark';\n }\n\n switchSystemMode() {\n if (isPlatformBrowser(this.platformID)) {\n if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {\n const _html = this.document.getElementsByTagName('html')[0];\n _html.classList.add('dark');\n this.#setSystemTheme('system-dark');\n } else {\n const _html = this.document.getElementsByTagName('html')[0];\n _html.classList.remove('dark');\n this.#setSystemTheme('system-light');\n }\n }\n }\n\n #setSystemTheme(themeMode: AXThemeMode) {\n this.themeMode$.next(themeMode);\n localStorage.setItem('AX_THEME_MODE', themeMode);\n this.themeMode.set(themeMode);\n }\n\n /**\n * Reads persisted theme preference and applies it (returns the effective mode).\n * @returns AXThemeMode\n */\n\n autoDetectThemeMode() {\n const mode = localStorage.getItem('AX_THEME_MODE') || 'system';\n switch (mode) {\n case 'light':\n this.switchLightMode();\n return 'light';\n\n case 'dark':\n this.switchDarkMode();\n return 'dark';\n\n default:\n this.switchSystemMode();\n return 'system';\n }\n }\n\n /**\n * Sets theme mode explicitly and persists it.\n * @param mode - Desired theme mode.\n */\n\n setThemeMode(mode: AXThemeMode) {\n switch (mode) {\n case 'light':\n this.switchLightMode();\n break;\n case 'dark':\n this.switchDarkMode();\n break;\n default:\n this.switchSystemMode();\n break;\n }\n }\n\n /**\n * Sets document direction (dir=\"ltr|rtl\") and persists it.\n */\n setDirection(dir: AXDirection) {\n if (!isPlatformBrowser(this.platformID)) {\n return;\n }\n\n const normalized: AXDirection = dir === 'rtl' ? 'rtl' : 'ltr';\n this.document.documentElement.setAttribute('dir', normalized);\n this.document.body.setAttribute('dir', normalized);\n this.document.body.style.direction = normalized;\n\n localStorage.setItem('AX_DIRECTION', normalized);\n this.direction$.next(normalized);\n this.direction.set(normalized);\n }\n\n toggleDirection() {\n const next = this.documentDirection === 'rtl' ? 'ltr' : 'rtl';\n this.setDirection(next);\n return next;\n }\n\n /**\n * Sets document language (lang=\"<bcp47>\") and optionally direction, then persists it.\n */\n setLanguage(lang: string, options?: { dir?: AXDirection }) {\n if (!isPlatformBrowser(this.platformID)) {\n return;\n }\n\n const normalizedLang = (lang || 'en-US').trim();\n this.document.documentElement.setAttribute('lang', normalizedLang);\n this.document.body.setAttribute('lang', normalizedLang);\n\n localStorage.setItem('AX_LANGUAGE', normalizedLang);\n this.language$.next(normalizedLang);\n this.language.set(normalizedLang);\n\n const dir = options?.dir ?? this.#inferDirectionFromLanguage(normalizedLang);\n this.setDirection(dir);\n }\n\n autoDetectLanguage() {\n if (!isPlatformBrowser(this.platformID)) {\n return this.documentLanguage;\n }\n\n const lang = localStorage.getItem('AX_LANGUAGE') || this.documentLanguage || 'en-US';\n this.setLanguage(lang, { dir: this.#inferDirectionFromLanguage(lang) });\n return lang;\n }\n\n autoDetectDirection() {\n if (!isPlatformBrowser(this.platformID)) {\n return this.documentDirection;\n }\n\n const dir = (localStorage.getItem('AX_DIRECTION') as AXDirection | null) || this.documentDirection || 'ltr';\n this.setDirection(dir);\n return dir;\n }\n\n #inferDirectionFromLanguage(lang: string): AXDirection {\n const normalized = lang.toLowerCase();\n if (\n normalized.startsWith('fa') ||\n normalized.startsWith('ar') ||\n normalized.startsWith('he') ||\n normalized.startsWith('ur')\n ) {\n return 'rtl';\n }\n return 'ltr';\n }\n\n private setFullHeightRatio() {\n if (isPlatformBrowser(this.platformID)) {\n try {\n this.document\n .querySelector<HTMLElement>(':root')\n ?.style.setProperty('--ax-vh', window.innerHeight / 100 + 'px');\n } catch (error) {\n console.error(error);\n }\n }\n }\n\n private autoSystemModeDetection(event) {\n if (this.themeMode() === 'system') {\n const themeMode = event.matches ? 'dark' : 'light';\n\n if (isPlatformBrowser(this.platformID)) {\n if (themeMode === 'dark') {\n const _html = this.document.getElementsByTagName('html')[0];\n _html.classList.add('dark');\n } else {\n const _html = this.document.getElementsByTagName('html')[0];\n _html.classList.remove('dark');\n }\n }\n }\n }\n\n constructor() {\n if (isPlatformBrowser(this.platformID)) {\n this.detectDarkMode();\n this.detectOnResize();\n this.detectClickEvent();\n this.detectScrollEvent();\n this.setFullHeightRatio();\n this.detectDocumentDirectionChange();\n this.autoDetectLanguage();\n this.autoDetectDirection();\n this.detectLanguageChangeFromSystemEvents();\n }\n }\n\n private detectLanguageChangeFromSystemEvents() {\n this.eventService.onEvent.subscribe((e) => {\n if (e.type === AXSystemEvents.AXLanguageChanged && typeof e.payload === 'string') {\n // Keep platform/document state in sync with translation module language changes\n this.setLanguage(e.payload);\n }\n });\n }\n\n private detectDarkMode() {\n if (isPlatformBrowser(this.platformID)) {\n // fromEvent(UIEvent)(window,'')\n if (window?.matchMedia('(prefers-color-scheme: dark)').matches) {\n window?.matchMedia('(prefers-color-scheme: dark)')?.addEventListener('change', (event) => {\n // Detect System color mode\n this.autoSystemModeDetection(event);\n });\n }\n }\n }\n\n private detectOnResize() {\n if (isPlatformBrowser(this.platformID)) {\n fromEvent<UIEvent>(window, 'resize')\n .pipe(debounceTime(100))\n .pipe(distinctUntilChanged())\n .subscribe((e) => {\n this.resize.next({\n nativeEvent: e,\n source: this,\n });\n //\n this.setFullHeightRatio();\n });\n }\n }\n\n private detectClickEvent() {\n if (isPlatformBrowser(this.platformID)) {\n this.document.addEventListener(\n 'click',\n (e) => {\n this.click.next({\n nativeEvent: e,\n source: this,\n });\n },\n true,\n );\n }\n }\n\n private detectScrollEvent() {\n if (isPlatformBrowser(this.platformID)) {\n this.document.addEventListener(\n 'scroll',\n (e) => {\n this.scroll.next({\n nativeEvent: e,\n source: this,\n });\n },\n true,\n );\n }\n }\n\n private detectDocumentDirectionChange() {\n if (isPlatformBrowser(this.platformID)) {\n const observer = new MutationObserver((mutations) => {\n mutations.forEach((mutation) => {\n // Detect Direction Change\n if (mutation.attributeName === 'dir') {\n const dir = (this.document.documentElement.getAttribute('dir') || 'ltr') as string;\n const normalized: AXDirection = dir.toLowerCase() === 'rtl' ? 'rtl' : 'ltr';\n this.direction$.next(normalized);\n this.direction.set(normalized);\n this.directionChange.next({ source: this, nativeEvent: null, data: normalized });\n }\n\n if (mutation.attributeName === 'lang') {\n const lang = this.document.documentElement.getAttribute('lang') || 'en-US';\n this.language$.next(lang);\n this.language.set(lang);\n this.languageChange.next({ source: this, nativeEvent: null, data: lang });\n }\n });\n });\n observer.observe(document.documentElement, {\n attributes: true,\n childList: false,\n characterData: false,\n });\n }\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
2
|
import { InjectionToken, inject, Injectable, TemplateRef, ViewContainerRef, Directive, Pipe, provideAppInitializer, NgModule } from '@angular/core';
|
|
3
3
|
import { get } from 'lodash-es';
|
|
4
|
-
import { of, tap, shareReplay, firstValueFrom, BehaviorSubject, switchMap, from } from 'rxjs';
|
|
4
|
+
import { of, tap, shareReplay, firstValueFrom, BehaviorSubject, distinctUntilChanged, switchMap, from } from 'rxjs';
|
|
5
5
|
import { AXEventService, AXSystemEvents } from '@acorex/core/events';
|
|
6
6
|
import { AXLocaleService } from '@acorex/core/locale';
|
|
7
7
|
import { waitFor } from '@acorex/core/utils';
|
|
@@ -215,36 +215,18 @@ function escapeRegExp(string) {
|
|
|
215
215
|
class TranslationResolverService {
|
|
216
216
|
constructor() {
|
|
217
217
|
this.loaderService = inject(AXTranslationLoaderService);
|
|
218
|
-
this.cache = new Map();
|
|
219
|
-
this.inflight = new Map();
|
|
220
218
|
this.parser = new TranslationParserService();
|
|
221
219
|
}
|
|
222
220
|
async resolve(lang, scope, key, params) {
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
const fetchPromise = firstValueFrom(this.loaderService.load(lang, scope));
|
|
228
|
-
this.inflight.set(cacheKey, fetchPromise);
|
|
229
|
-
try {
|
|
230
|
-
const data = await fetchPromise;
|
|
231
|
-
this.cache.set(cacheKey, data);
|
|
232
|
-
}
|
|
233
|
-
finally {
|
|
234
|
-
this.inflight.delete(cacheKey);
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
|
-
else {
|
|
238
|
-
await this.inflight.get(cacheKey);
|
|
239
|
-
}
|
|
221
|
+
let result = this.loaderService.peek(lang, scope, key);
|
|
222
|
+
if (result == null) {
|
|
223
|
+
await firstValueFrom(this.loaderService.load(lang, scope));
|
|
224
|
+
result = this.loaderService.peek(lang, scope, key);
|
|
240
225
|
}
|
|
241
|
-
|
|
242
|
-
if (!translations) {
|
|
243
|
-
console.warn(`Translations not found for ${cacheKey} after attempting to load.`);
|
|
226
|
+
if (result == null) {
|
|
244
227
|
const unresolvedResult = key;
|
|
245
228
|
return this.format(unresolvedResult, params);
|
|
246
229
|
}
|
|
247
|
-
let result = get(translations, key, key);
|
|
248
230
|
// Recursively resolve references
|
|
249
231
|
if (typeof result === 'string' && this.parser.isExpression(result)) {
|
|
250
232
|
const tokens = this.parser.parse(result, lang, scope);
|
|
@@ -284,6 +266,57 @@ class TranslationResolverService {
|
|
|
284
266
|
}
|
|
285
267
|
}
|
|
286
268
|
|
|
269
|
+
const LOCALE_KEY_REGEX = /^(\*-\*|[a-z]{2}-[A-Z]{2})$/;
|
|
270
|
+
function resolveMultiLanguageValue(value, locale) {
|
|
271
|
+
return value[locale] ?? value['en-US'] ?? Object.values(value).find((item) => item != null) ?? '';
|
|
272
|
+
}
|
|
273
|
+
function isValidMultiLanguageObject(value) {
|
|
274
|
+
if (!value || typeof value !== 'object' || Array.isArray(value)) {
|
|
275
|
+
return false;
|
|
276
|
+
}
|
|
277
|
+
const entries = Object.entries(value);
|
|
278
|
+
if (!entries.length) {
|
|
279
|
+
return false;
|
|
280
|
+
}
|
|
281
|
+
return entries.every(([key, entryValue]) => LOCALE_KEY_REGEX.test(key) && typeof entryValue === 'string');
|
|
282
|
+
}
|
|
283
|
+
/**
|
|
284
|
+
* Resolves {@link AXMultiLanguageString} to a single string for the given locale.
|
|
285
|
+
* Fallback order: `currentLocale` → `en-US` → first map value.
|
|
286
|
+
*/
|
|
287
|
+
function resolveMultiLanguageString(content, currentLocale) {
|
|
288
|
+
if (content == null || content === '') {
|
|
289
|
+
return '';
|
|
290
|
+
}
|
|
291
|
+
if (typeof content === 'string') {
|
|
292
|
+
return content;
|
|
293
|
+
}
|
|
294
|
+
if (!isValidMultiLanguageObject(content)) {
|
|
295
|
+
return String(content);
|
|
296
|
+
}
|
|
297
|
+
return resolveMultiLanguageValue(content, currentLocale);
|
|
298
|
+
}
|
|
299
|
+
/**
|
|
300
|
+
* Creates an {@link AXMultiLanguageMap} with `en-US` and `fa-IR` entries.
|
|
301
|
+
* Use for seed data, tests, and demos that supply English and Persian copy explicitly.
|
|
302
|
+
*/
|
|
303
|
+
function createMultiLanguageString(enUs, faIr) {
|
|
304
|
+
return { 'en-US': enUs, 'fa-IR': faIr };
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* True when there is no displayable text in any locale (plain string or ML map).
|
|
308
|
+
*/
|
|
309
|
+
function isEffectivelyEmptyLocalizedValue(value) {
|
|
310
|
+
if (value == null)
|
|
311
|
+
return true;
|
|
312
|
+
if (typeof value === 'string')
|
|
313
|
+
return value.trim() === '';
|
|
314
|
+
if (typeof value !== 'object' || Array.isArray(value))
|
|
315
|
+
return false;
|
|
316
|
+
const record = value;
|
|
317
|
+
return Object.values(record).every((v) => v == null || String(v).trim() === '');
|
|
318
|
+
}
|
|
319
|
+
|
|
287
320
|
let singletonInstance;
|
|
288
321
|
function translateSync(key, options) {
|
|
289
322
|
return singletonInstance.translateSync(key, options);
|
|
@@ -298,6 +331,7 @@ class AXTranslationService {
|
|
|
298
331
|
this.resolver = new TranslationResolverService();
|
|
299
332
|
this.activeLang = new BehaviorSubject(this.config.defaults.lang);
|
|
300
333
|
this.langChanges$ = this.activeLang.asObservable();
|
|
334
|
+
this.currentLocale$ = this.langChanges$.pipe(distinctUntilChanged());
|
|
301
335
|
singletonInstance = this;
|
|
302
336
|
this.localeService.profileChanged$.subscribe((locale) => {
|
|
303
337
|
if (locale?.localeInfo?.code) {
|
|
@@ -320,37 +354,55 @@ class AXTranslationService {
|
|
|
320
354
|
getDefaultLang() {
|
|
321
355
|
return this.config.defaults.lang;
|
|
322
356
|
}
|
|
323
|
-
|
|
324
|
-
if (
|
|
325
|
-
return
|
|
357
|
+
resolve(value, locale) {
|
|
358
|
+
if (value == null) {
|
|
359
|
+
return '';
|
|
326
360
|
}
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
361
|
+
if (typeof value === 'string') {
|
|
362
|
+
return value;
|
|
363
|
+
}
|
|
364
|
+
if (!isValidMultiLanguageObject(value)) {
|
|
365
|
+
return '';
|
|
366
|
+
}
|
|
367
|
+
return resolveMultiLanguageValue(value, locale ?? this.getActiveLang());
|
|
368
|
+
}
|
|
369
|
+
toLocaleMap(value, activeLocale = this.getActiveLang()) {
|
|
370
|
+
if (isValidMultiLanguageObject(value)) {
|
|
371
|
+
return { ...value };
|
|
372
|
+
}
|
|
373
|
+
return {
|
|
374
|
+
[activeLocale]: typeof value === 'string' ? value : '',
|
|
375
|
+
};
|
|
376
|
+
}
|
|
377
|
+
translate$(value, options) {
|
|
378
|
+
if (isValidMultiLanguageObject(value)) {
|
|
379
|
+
return this.langChanges$.pipe(switchMap((activeLang) => {
|
|
380
|
+
const targetLang = options?.lang ?? activeLang;
|
|
381
|
+
const selectedValue = resolveMultiLanguageValue(value, targetLang);
|
|
382
|
+
const scope = options?.scope ?? this.config.defaults.scope;
|
|
383
|
+
return from(this.translateAsync(selectedValue, {
|
|
384
|
+
...options,
|
|
385
|
+
lang: targetLang,
|
|
386
|
+
scope,
|
|
387
|
+
}));
|
|
334
388
|
}));
|
|
335
|
-
}
|
|
389
|
+
}
|
|
390
|
+
return this.translateValue$(value, options);
|
|
336
391
|
}
|
|
337
392
|
async translateAsync(text, options) {
|
|
338
|
-
const lang
|
|
339
|
-
const scope = options?.scope ?? this.config.defaults.scope;
|
|
393
|
+
const { lang, scope } = this.resolveContext(options);
|
|
340
394
|
const params = options?.params;
|
|
341
395
|
if (!this.parser.isExpression(text)) {
|
|
342
|
-
|
|
343
|
-
return this.resolver.format(resolved, params);
|
|
396
|
+
return this.resolver.resolve(lang, scope, text, params);
|
|
344
397
|
}
|
|
345
398
|
const tokens = this.parser.parse(text, lang, scope);
|
|
346
399
|
const results = await Promise.all(tokens.map((token) => this.resolver
|
|
347
400
|
.resolve(token.lang ?? lang, token.scope ?? scope, token.key, params)
|
|
348
|
-
.then((translated) => [token.fullMatch,
|
|
401
|
+
.then((translated) => [token.fullMatch, translated])));
|
|
349
402
|
return results.reduce((output, [match, translated]) => output.replace(match, translated), text);
|
|
350
403
|
}
|
|
351
404
|
translateSync(text, options) {
|
|
352
|
-
const lang
|
|
353
|
-
const scope = options?.scope ?? this.config.defaults.scope;
|
|
405
|
+
const { lang, scope } = this.resolveContext(options);
|
|
354
406
|
const params = options?.params;
|
|
355
407
|
const waitForLoad = options?.waitForLoad ?? false;
|
|
356
408
|
const timeoutMs = options?.timeoutMs ?? 100;
|
|
@@ -376,6 +428,36 @@ class AXTranslationService {
|
|
|
376
428
|
}
|
|
377
429
|
return result;
|
|
378
430
|
}
|
|
431
|
+
translateValue$(text, options) {
|
|
432
|
+
if (!text) {
|
|
433
|
+
return of('');
|
|
434
|
+
}
|
|
435
|
+
const staticOptions = { ...options };
|
|
436
|
+
const staticScope = staticOptions.scope ?? this.config.defaults.scope;
|
|
437
|
+
return this.langChanges$.pipe(switchMap((lang) => {
|
|
438
|
+
return from(this.translateAsync(text, {
|
|
439
|
+
...staticOptions,
|
|
440
|
+
lang: staticOptions.lang ?? lang,
|
|
441
|
+
scope: staticScope,
|
|
442
|
+
}));
|
|
443
|
+
}), shareReplay({ bufferSize: 1, refCount: true }));
|
|
444
|
+
}
|
|
445
|
+
resolveContext(options) {
|
|
446
|
+
return {
|
|
447
|
+
lang: options?.lang ?? this.getActiveLang() ?? this.config.defaults.lang,
|
|
448
|
+
scope: options?.scope ?? this.config.defaults.scope,
|
|
449
|
+
};
|
|
450
|
+
}
|
|
451
|
+
isValidMultiLanguageObject(value) {
|
|
452
|
+
if (!value || typeof value !== 'object' || Array.isArray(value)) {
|
|
453
|
+
return false;
|
|
454
|
+
}
|
|
455
|
+
const entries = Object.entries(value);
|
|
456
|
+
if (!entries.length) {
|
|
457
|
+
return false;
|
|
458
|
+
}
|
|
459
|
+
return entries.every(([key, entryValue]) => LOCALE_KEY_REGEX.test(key) && typeof entryValue === 'string');
|
|
460
|
+
}
|
|
379
461
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: AXTranslationService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
380
462
|
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: AXTranslationService, providedIn: 'root' }); }
|
|
381
463
|
}
|
|
@@ -425,11 +507,11 @@ class AXTranslatorPipe {
|
|
|
425
507
|
constructor() {
|
|
426
508
|
this.service = inject(AXTranslationService);
|
|
427
509
|
}
|
|
428
|
-
transform(
|
|
429
|
-
if (!
|
|
430
|
-
return of('');
|
|
510
|
+
transform(value, options) {
|
|
511
|
+
if (!value) {
|
|
512
|
+
return of('');
|
|
431
513
|
}
|
|
432
|
-
return this.service.translate$(
|
|
514
|
+
return this.service.translate$(value, options);
|
|
433
515
|
}
|
|
434
516
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: AXTranslatorPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
|
|
435
517
|
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "21.1.3", ngImport: i0, type: AXTranslatorPipe, isStandalone: true, name: "translate" }); }
|
|
@@ -475,5 +557,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
|
|
|
475
557
|
* Generated bundle index. Do not edit.
|
|
476
558
|
*/
|
|
477
559
|
|
|
478
|
-
export { AXTranslationDefaultConfig, AXTranslationLoaderDefault, AXTranslationModule, AXTranslationService, AXTranslatorDirective, AXTranslatorPipe, AX_TRANSLATION_CONFIG, AX_TRANSLATION_LOADER, loadTranslationScope, translateSync, translationConfig };
|
|
560
|
+
export { AXTranslationDefaultConfig, AXTranslationLoaderDefault, AXTranslationModule, AXTranslationService, AXTranslatorDirective, AXTranslatorPipe, AX_TRANSLATION_CONFIG, AX_TRANSLATION_LOADER, LOCALE_KEY_REGEX, createMultiLanguageString, isEffectivelyEmptyLocalizedValue, isValidMultiLanguageObject, loadTranslationScope, resolveMultiLanguageString, resolveMultiLanguageValue, translateSync, translationConfig };
|
|
479
561
|
//# sourceMappingURL=acorex-core-translation.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acorex-core-translation.mjs","sources":["../../../../packages/core/translation/src/lib/translation.config.ts","../../../../packages/core/translation/src/lib/translation.loader.ts","../../../../packages/core/translation/src/lib/translation-loader.service.ts","../../../../packages/core/translation/src/lib/translation.parser.ts","../../../../packages/core/translation/src/lib/translation.resolver.ts","../../../../packages/core/translation/src/lib/translation.service.ts","../../../../packages/core/translation/src/lib/translation-scope.resolver.ts","../../../../packages/core/translation/src/lib/translator.directive.ts","../../../../packages/core/translation/src/lib/translator.pipe.ts","../../../../packages/core/translation/src/lib/translation.module.ts","../../../../packages/core/translation/src/acorex-core-translation.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\nimport { AXTranslateLang, AXTranslateScope } from './translation.types';\n\nexport interface AXTranslationConfig {\n defaults: {\n lang: AXTranslateLang;\n scope: AXTranslateScope;\n };\n preload?: {\n langs: AXTranslateLang[];\n scopes: AXTranslateScope[];\n };\n fallbacks?: {\n langs?: Record<AXTranslateLang, AXTranslateLang[]>;\n scopes?: Record<AXTranslateScope, AXTranslateScope[]>;\n };\n available?: {\n langs?: AXTranslateLang[];\n scopes?: AXTranslateScope[];\n };\n resolver?: {\n scopeKey: string; // used to extract scope from params, e.g. `scope: 'common'`\n };\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 defaults: {\n lang: 'en-US',\n scope: 'acorex',\n },\n preload: {\n langs: ['en-US'],\n scopes: ['acorex'],\n },\n resolver: {\n scopeKey: 'scope',\n },\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 { Observable, of } from 'rxjs';\nimport { AXTranslateLang, AXTranslateScope, AXTranslation } from './translation.types';\n\nexport interface AXTranslationLoaderOptions {\n lang: AXTranslateLang;\n scope?: AXTranslateScope;\n}\n\nexport interface AXTranslationLoader {\n load(options: AXTranslationLoaderOptions): Observable<AXTranslation>;\n}\n\nexport class AXTranslationLoaderDefault implements AXTranslationLoader {\n load(options: AXTranslationLoaderOptions): Observable<AXTranslation> {\n return of({});\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});\n","import { Injectable, inject } from '@angular/core';\nimport { get } from 'lodash-es';\nimport { Observable, firstValueFrom, of, shareReplay, tap } from 'rxjs';\nimport { AX_TRANSLATION_CONFIG } from './translation.config';\nimport { AX_TRANSLATION_LOADER } from './translation.loader';\nimport { AXTranslateLang, AXTranslateScope, AXTranslation } from './translation.types';\nimport { AXEventService, AXSystemEvents } from '@acorex/core/events';\n\n@Injectable({ providedIn: 'root' })\nexport class AXTranslationLoaderService {\n private loader = inject(AX_TRANSLATION_LOADER);\n private config = inject(AX_TRANSLATION_CONFIG);\n private eventService = inject(AXEventService);\n\n private cache = new Map<string, AXTranslation>();\n private inflight = new Map<string, Observable<AXTranslation>>();\n\n public load(lang: AXTranslateLang, scope: AXTranslateScope): Observable<AXTranslation> {\n const key = `${lang}:${scope}`;\n\n // 1. Check cache first\n if (this.cache.has(key)) {\n return of(this.cache.get(key)!);\n }\n\n // 2. Check if it's already in-flight\n if (this.inflight.has(key)) {\n return this.inflight.get(key)!;\n }\n\n // 3. Not in cache, not in-flight: Make the request\n const newObs = this.loader.load({ lang, scope }).pipe(\n tap({\n next: (data) => {\n this.cache.set(key, data);\n // No need to delete from inflight here, finalize will handle it\n // or delete it only after caching. If you delete here, and shareReplay\n // source completes, subsequent subscribers might re-trigger if not careful.\n // It's better to remove from inflight in finalize or after shareReplay has replayed.\n // For simplicity and common patterns, removing after caching within tap (before shareReplay)\n // can work if shareReplay handles the source completion correctly.\n // A safer bet is to remove it in finalize *after* shareReplay.\n\n // Emit event to notify other components that the language has been loaded\n this.eventService.emitEvent({\n type: AXSystemEvents.AXLanguageLoaded,\n payload: data,\n });\n },\n error: (err) => {\n console.error(`Error loading ${key}:`, err);\n // Remove from inflight on error so subsequent calls can retry\n this.inflight.delete(key);\n },\n // finalize is tricky with shareReplay if you want to keep the replayed value\n // but still clear inflight. For this pattern, deleting on next/error\n // *before* shareReplay often means that shareReplay will re-trigger the source\n // if the inflight observable is requested again after being deleted.\n // The current structure of deleting in `tap` and then `shareReplay`\n // might need `this.inflight.delete(key)` to be moved after `shareReplay` effect.\n // Let's try a common pattern:\n }),\n shareReplay(1), // Replay the last emitted value for subsequent subscribers\n tap({\n // This tap runs *after* shareReplay has done its work for the first subscriber\n // and for subsequent subscribers that get the replayed value.\n next: () => {\n // Once data is successfully loaded and cached (by the first tap),\n // and shareReplay ensures it's available, we can remove from inflight.\n // This means subsequent calls for the same key during the \"inflight\" period\n // get the shared observable, and after it resolves and is cached,\n // inflight is cleared.\n this.inflight.delete(key);\n },\n // Error is handled by the first tap, or catchError if you want to provide a fallback\n }),\n );\n\n this.inflight.set(key, newObs); // Store the observable that includes caching and cleanup logic\n return newObs;\n }\n\n public peek(lang: AXTranslateLang, scope: AXTranslateScope, key: string): string | null {\n const cacheKey = `${lang}:${scope}`;\n const data = this.cache.get(cacheKey);\n return get(data, key, null);\n }\n\n public async preload(options?: { langs?: AXTranslateLang[]; scopes?: AXTranslateScope[] }): Promise<void> {\n const langsToLoad = [...new Set(options?.langs ?? this.config.preload?.langs ?? [this.config.defaults.lang])];\n const scopesToLoad = [...new Set(options?.scopes ?? this.config.preload?.scopes ?? [this.config.defaults.scope])];\n\n const loadPromises: Promise<\n | { lang: AXTranslateLang; scope: AXTranslateScope; status: 'fulfilled'; value: AXTranslation } // Changed any to AXTranslation\n | { lang: AXTranslateLang; scope: AXTranslateScope; status: 'rejected'; reason: any }\n >[] = [];\n\n langsToLoad.forEach((lang) => {\n scopesToLoad.forEach((scope) => {\n const loadPromise = firstValueFrom(this.load(lang, scope)) // This should now always get a valid Observable\n .then((value) => ({ lang, scope, status: 'fulfilled' as const, value }))\n .catch((reason) => ({ lang, scope, status: 'rejected' as const, reason }));\n loadPromises.push(loadPromise);\n });\n });\n\n const results = await Promise.all(loadPromises);\n\n let allSucceeded = true;\n results.forEach((result) => {\n if (result.status === 'rejected') {\n allSucceeded = false;\n console.error(\n `Failed to preload translations for lang: ${result.lang}, scope: ${result.scope}. Reason:`,\n result.reason,\n );\n } else {\n // console.log(`Successfully preloaded lang: ${result.lang}, scope: ${result.scope}`); // Optionally uncomment for success logs\n }\n // else {\n // console.log(`Successfully preloaded lang: ${result.lang}, scope: ${result.scope}`); // Optionally uncomment for success logs\n // }\n });\n\n if (!allSucceeded) {\n console.error('One or more translation preloads failed. See console for details.');\n // throw new Error(\"One or more translation preloads failed. See console for details.\");\n }\n // The second results.forEach loop in your original code was redundant, I've removed it.\n // If it was for a different purpose, you can add it back.\n }\n\n public clear(): void {\n this.cache.clear();\n this.inflight.clear();\n }\n\n public getFallbackLangs(lang: AXTranslateLang): AXTranslateLang[] {\n return this.config.fallbacks?.langs?.[lang] ?? [];\n }\n\n public getFallbackScopes(scope: AXTranslateScope): AXTranslateScope[] {\n return this.config.fallbacks?.scopes?.[scope] ?? [];\n }\n}\n","import { AXParsedToken } from './translation.types';\n\nexport class TranslationParserService {\n private readonly legacyRegex = /t\\([\"']([^\"']+)[\"']\\s*(?:,\\s*(\\{.*?\\}))?\\)/g;\n private readonly inlineRegex = /@([a-zA-Z\\-]+:)?([a-zA-Z0-9_-]+):([a-zA-Z0-9_.:-]+)(?=[\\\\s.,;!?)]|$)/g;\n\n public isExpression(value: string): boolean {\n return typeof value === 'string' && (value.includes('t(') || value.includes('@'));\n }\n\n public parse(expression: string, currentLang: string, currentScope: string): AXParsedToken[] {\n const tokens: AXParsedToken[] = [];\n\n // Extract inline references like @lang:scope:key or @scope:key\n let inlineMatch;\n while ((inlineMatch = this.inlineRegex.exec(expression)) !== null) {\n const langPart = inlineMatch[1]?.replace(':', '') ?? null;\n const scope = inlineMatch[2] ?? currentScope;\n const key = inlineMatch[3];\n const fullMatch = inlineMatch[0];\n\n tokens.push({ lang: langPart || currentLang, scope, key, fullMatch });\n }\n\n // Extract legacy expressions\n let legacyMatch;\n while ((legacyMatch = this.legacyRegex.exec(expression)) !== null) {\n const key = legacyMatch[1];\n const rawOptions = legacyMatch[2];\n let scope = currentScope;\n let lang = currentLang;\n\n if (rawOptions) {\n try {\n const jsonString = rawOptions.replace(/(['\"])?([a-zA-Z0-9_]+)(['\"])?\\s*:/g, '\"$2\":').replace(/'/g, '\"');\n const options = JSON.parse(jsonString);\n scope = options.scope || scope;\n lang = options.lang || lang;\n } catch (err) {\n console.error('Invalid translation expression options:', err);\n }\n }\n\n tokens.push({ key, scope, lang, fullMatch: legacyMatch[0] });\n }\n\n return tokens;\n }\n}\n","import { inject } from '@angular/core';\nimport { get as lodashGet } from 'lodash-es';\nimport { firstValueFrom } from 'rxjs';\nimport { AXTranslationLoaderService } from './translation-loader.service';\nimport { TranslationParserService } from './translation.parser';\nimport { AXTranslateLang, AXTranslateParams, AXTranslateScope, AXTranslation } from './translation.types';\n\n// Helper function to escape special characters for use in a regular expression\nfunction escapeRegExp(string: string): string {\n return string.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nexport class TranslationResolverService {\n private loaderService = inject(AXTranslationLoaderService);\n private cache = new Map<string, AXTranslation>();\n private inflight = new Map<string, Promise<AXTranslation>>();\n private parser = new TranslationParserService();\n\n async resolve(\n lang: AXTranslateLang,\n scope: AXTranslateScope,\n key: string,\n params?: AXTranslateParams,\n ): Promise<string> {\n const cacheKey = `${lang}:${scope}`;\n\n // Load and cache if not present\n if (!this.cache.has(cacheKey)) {\n if (!this.inflight.has(cacheKey)) {\n const fetchPromise = firstValueFrom(this.loaderService.load(lang, scope));\n this.inflight.set(cacheKey, fetchPromise);\n try {\n const data = await fetchPromise;\n this.cache.set(cacheKey, data);\n } finally {\n this.inflight.delete(cacheKey);\n }\n } else {\n await this.inflight.get(cacheKey);\n }\n }\n\n const translations = this.cache.get(cacheKey);\n if (!translations) {\n console.warn(`Translations not found for ${cacheKey} after attempting to load.`);\n const unresolvedResult = key;\n return this.format(unresolvedResult, params);\n }\n let result = lodashGet(translations, key, key);\n\n // Recursively resolve references\n if (typeof result === 'string' && this.parser.isExpression(result)) {\n const tokens = this.parser.parse(result, lang, scope);\n if (tokens.length > 0) {\n const first = tokens[0];\n result = await this.resolve(first.lang || lang, first.scope || scope, first.key, params);\n }\n }\n\n return this.format(result, params);\n }\n\n public format(text: string, params?: AXTranslateParams): string {\n if (!params || typeof text !== 'string' || Object.keys(params).length === 0) {\n return text;\n }\n\n return Object.keys(params).reduce((currentText, paramKey) => {\n // paramKey is the key from the params object, e.g., \"title\" or \" title \"\n const valueToInsert = params[paramKey];\n\n // 1. Trim the key from the params object to handle potential leading/trailing spaces.\n // e.g., if paramKey is \" title \", keyForPattern becomes \"title\".\n const keyForPattern = paramKey.trim();\n\n // If trimming results in an empty string, it's not a valid placeholder to replace.\n if (keyForPattern === '') {\n return currentText;\n }\n\n // 2. Escape the trimmed key to safely use it in a regular expression.\n // This handles cases where the key might contain special regex characters (e.g., \"user.name\", \"item[0]\").\n const escapedKey = escapeRegExp(keyForPattern);\n\n // 3. Construct the RegExp. This will match:\n // - {{KEY}}\n // - {{ KEY }}\n // - {{ KEY }}\n // etc., where KEY is the (trimmed and escaped) paramKey.\n const re = new RegExp(`{{\\\\s*${escapedKey}\\\\s*}}`, 'g');\n\n // 4. Replace occurrences, ensuring the value is a string.\n return currentText.replace(re, String(valueToInsert));\n }, text);\n }\n}\n","import { AXLocaleService } from '@acorex/core/locale';\nimport { waitFor } from '@acorex/core/utils';\nimport { inject, Injectable } from '@angular/core';\nimport { BehaviorSubject, from, Observable, of, shareReplay, switchMap } from 'rxjs';\nimport { AXTranslationLoaderService } from './translation-loader.service';\nimport { AX_TRANSLATION_CONFIG } from './translation.config';\nimport { TranslationParserService } from './translation.parser';\nimport { TranslationResolverService } from './translation.resolver';\nimport { AXTranslateLang, AXTranslateOptions } from './translation.types';\nimport { AXEventService, AXSystemEvents } from '@acorex/core/events';\n\nlet singletonInstance: AXTranslationService;\n\nexport function translateSync(key: string, options?: AXTranslateOptions): string {\n return singletonInstance.translateSync(key, options);\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AXTranslationService {\n private localeService = inject(AXLocaleService);\n private config = inject(AX_TRANSLATION_CONFIG);\n private loader = inject(AXTranslationLoaderService);\n private parser = new TranslationParserService();\n private eventService = inject(AXEventService);\n private resolver = new TranslationResolverService();\n private activeLang = new BehaviorSubject<AXTranslateLang>(this.config.defaults.lang);\n public readonly langChanges$ = this.activeLang.asObservable();\n\n constructor() {\n singletonInstance = this;\n this.localeService.profileChanged$.subscribe((locale) => {\n if (locale?.localeInfo?.code) {\n this.setActiveLang(locale.localeInfo.code);\n }\n });\n }\n\n public setActiveLang(lang: AXTranslateLang): void {\n if (lang && lang !== this.activeLang.getValue()) {\n this.activeLang.next(lang);\n this.eventService.emitEvent({\n type: AXSystemEvents.AXLanguageChanged,\n payload: lang,\n });\n }\n }\n\n public getActiveLang(): AXTranslateLang {\n return this.activeLang.getValue();\n }\n\n public getDefaultLang(): AXTranslateLang {\n return this.config.defaults.lang;\n }\n\n public translate$(text: string, options?: AXTranslateOptions): Observable<string> {\n if (!text) {\n return of('');\n }\n\n const staticOptions = { ...options };\n const staticScope = staticOptions.scope ?? this.config.defaults.scope;\n\n return this.langChanges$.pipe(\n switchMap((lang) => {\n return from(\n this.translateAsync(text, {\n ...staticOptions,\n lang: staticOptions.lang ?? lang,\n scope: staticScope,\n }),\n );\n }),\n shareReplay({ bufferSize: 1, refCount: true }),\n );\n }\n\n async translateAsync(text: string, options?: AXTranslateOptions): Promise<string> {\n const lang = options?.lang ?? this.getActiveLang() ?? this.config.defaults.lang;\n const scope = options?.scope ?? this.config.defaults.scope;\n const params = options?.params;\n\n if (!this.parser.isExpression(text)) {\n const resolved = await this.resolver.resolve(lang, scope, text, params);\n return this.resolver.format(resolved, params);\n }\n\n const tokens = this.parser.parse(text, lang, scope);\n\n const results = await Promise.all(\n tokens.map((token) =>\n this.resolver\n .resolve(token.lang ?? lang, token.scope ?? scope, token.key, params)\n .then((translated) => [token.fullMatch, this.resolver.format(translated, params)]),\n ),\n );\n\n return results.reduce((output, [match, translated]) => output.replace(match, translated), text);\n }\n\n public translateSync(\n text: string,\n options?: AXTranslateOptions & { waitForLoad?: boolean; timeoutMs?: number },\n ): string {\n const lang = options?.lang ?? this.getActiveLang() ?? this.config.defaults.lang;\n const scope = options?.scope ?? this.config.defaults.scope;\n const params = options?.params;\n const waitForLoad = options?.waitForLoad ?? false;\n const timeoutMs = options?.timeoutMs ?? 100;\n\n if (!this.parser.isExpression(text)) {\n let translated = this.loader.peek(lang, scope, text);\n\n if (!translated && waitForLoad) {\n translated = waitFor(\n () => this.loader.peek(lang, scope, text),\n () => this.loader.load(lang, scope).subscribe(),\n timeoutMs,\n );\n }\n\n return this.resolver.format(translated ?? text, params);\n }\n\n const tokens = this.parser.parse(text, lang, scope);\n let result = text;\n\n for (const token of tokens) {\n const targetLang = token.lang ?? lang;\n const targetScope = token.scope ?? scope;\n const key = token.key;\n\n let translation = this.loader.peek(targetLang, targetScope, key);\n\n if (!translation) {\n translation =\n waitFor(\n () => this.loader.peek(targetLang, targetScope, key),\n () => this.loader.load(targetLang, targetScope).subscribe(),\n waitForLoad ? timeoutMs : 0,\n ) ?? key;\n }\n\n result = result.replace(token.fullMatch, this.resolver.format(translation, params));\n }\n\n return result;\n }\n}\n","import { inject } from '@angular/core';\nimport { ResolveFn } from '@angular/router';\nimport { AXTranslationLoaderService } from './translation-loader.service';\nimport { AX_TRANSLATION_CONFIG } from './translation.config';\nimport { AXTranslationService } from './translation.service';\n\nexport const loadTranslationScope: ResolveFn<unknown> = (route, state) => {\n const translationLoaderService = inject(AXTranslationLoaderService);\n const translationService = inject(AXTranslationService);\n const config = inject(AX_TRANSLATION_CONFIG);\n const scopeValue = route.data[config.resolver?.scopeKey];\n const scopes = Array.isArray(scopeValue) ? scopeValue : [scopeValue];\n return translationLoaderService.preload({ langs: [translationService.getActiveLang()], scopes });\n};\n","import { Directive, OnInit, TemplateRef, ViewContainerRef, inject } from '@angular/core';\nimport { Observable, shareReplay } from 'rxjs';\nimport { AXTranslationService } from './translation.service';\nimport { AXTranslateOptions } from './translation.types';\n@Directive({ selector: '[translate]' })\nexport class AXTranslatorDirective implements OnInit {\n private templateRef = inject<TemplateRef<any>>(TemplateRef);\n private vc = inject(ViewContainerRef);\n private translationService = inject(AXTranslationService);\n\n ngOnInit() {\n const cache = new Map<string, Observable<string>>();\n\n const t = (key: string, opts?: AXTranslateOptions) => {\n const id = `${key}|${opts?.lang ?? this.translationService.getActiveLang()}|${opts?.scope ?? 'common'}`;\n if (!cache.has(id)) {\n cache.set(\n id,\n this.translationService.translate$(key, opts).pipe(shareReplay({ bufferSize: 1, refCount: true })),\n );\n }\n return cache.get(id)!;\n };\n\n this.vc.clear();\n this.vc.createEmbeddedView(this.templateRef, { $implicit: t });\n }\n}\n","import { inject, Pipe, PipeTransform } from '@angular/core';\nimport { Observable, of } from 'rxjs';\nimport { AXTranslationService } from './translation.service';\nimport { AXTranslateOptions } from './translation.types';\n\n@Pipe({\n name: 'translate',\n pure: true,\n}) // The pipe can now be pure\nexport class AXTranslatorPipe implements PipeTransform {\n private service = inject(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 { NgModule, inject, provideAppInitializer } from '@angular/core';\nimport { AXTranslationLoaderService } from './translation-loader.service';\nimport { AXTranslatorDirective } from './translator.directive';\nimport { AXTranslatorPipe } from './translator.pipe';\n\nfunction initializeApp(translatorService: AXTranslationLoaderService) {\n return (): Promise<void> => {\n return translatorService.preload();\n };\n}\n\n@NgModule({\n imports: [AXTranslatorPipe, AXTranslatorDirective],\n exports: [AXTranslatorPipe, AXTranslatorDirective],\n providers: [\n provideAppInitializer(() => {\n const initializerFn = initializeApp(inject(AXTranslationLoaderService));\n return initializerFn();\n }),\n ],\n})\nexport class AXTranslationModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["lodashGet"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"acorex-core-translation.mjs","sources":["../../../../packages/core/translation/src/lib/translation.config.ts","../../../../packages/core/translation/src/lib/translation.loader.ts","../../../../packages/core/translation/src/lib/translation-loader.service.ts","../../../../packages/core/translation/src/lib/translation.parser.ts","../../../../packages/core/translation/src/lib/translation.resolver.ts","../../../../packages/core/translation/src/lib/translation.types.ts","../../../../packages/core/translation/src/lib/translation.service.ts","../../../../packages/core/translation/src/lib/translation-scope.resolver.ts","../../../../packages/core/translation/src/lib/translator.directive.ts","../../../../packages/core/translation/src/lib/translator.pipe.ts","../../../../packages/core/translation/src/lib/translation.module.ts","../../../../packages/core/translation/src/acorex-core-translation.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\nimport { AXTranslateLang, AXTranslateScope } from './translation.types';\n\nexport interface AXTranslationConfig {\n defaults: {\n lang: AXTranslateLang;\n scope: AXTranslateScope;\n };\n preload?: {\n langs: AXTranslateLang[];\n scopes: AXTranslateScope[];\n };\n fallbacks?: {\n langs?: Record<AXTranslateLang, AXTranslateLang[]>;\n scopes?: Record<AXTranslateScope, AXTranslateScope[]>;\n };\n available?: {\n langs?: AXTranslateLang[];\n scopes?: AXTranslateScope[];\n };\n resolver?: {\n scopeKey: string; // used to extract scope from params, e.g. `scope: 'common'`\n };\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 defaults: {\n lang: 'en-US',\n scope: 'acorex',\n },\n preload: {\n langs: ['en-US'],\n scopes: ['acorex'],\n },\n resolver: {\n scopeKey: 'scope',\n },\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 { Observable, of } from 'rxjs';\nimport { AXTranslateLang, AXTranslateScope, AXTranslation } from './translation.types';\n\nexport interface AXTranslationLoaderOptions {\n lang: AXTranslateLang;\n scope?: AXTranslateScope;\n}\n\nexport interface AXTranslationLoader {\n load(options: AXTranslationLoaderOptions): Observable<AXTranslation>;\n}\n\nexport class AXTranslationLoaderDefault implements AXTranslationLoader {\n load(options: AXTranslationLoaderOptions): Observable<AXTranslation> {\n return of({});\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});\n","import { Injectable, inject } from '@angular/core';\nimport { get } from 'lodash-es';\nimport { Observable, firstValueFrom, of, shareReplay, tap } from 'rxjs';\nimport { AX_TRANSLATION_CONFIG } from './translation.config';\nimport { AX_TRANSLATION_LOADER } from './translation.loader';\nimport { AXTranslateLang, AXTranslateScope, AXTranslation } from './translation.types';\nimport { AXEventService, AXSystemEvents } from '@acorex/core/events';\n\n@Injectable({ providedIn: 'root' })\nexport class AXTranslationLoaderService {\n private loader = inject(AX_TRANSLATION_LOADER);\n private config = inject(AX_TRANSLATION_CONFIG);\n private eventService = inject(AXEventService);\n\n private cache = new Map<string, AXTranslation>();\n private inflight = new Map<string, Observable<AXTranslation>>();\n\n public load(lang: AXTranslateLang, scope: AXTranslateScope): Observable<AXTranslation> {\n const key = `${lang}:${scope}`;\n\n // 1. Check cache first\n if (this.cache.has(key)) {\n return of(this.cache.get(key)!);\n }\n\n // 2. Check if it's already in-flight\n if (this.inflight.has(key)) {\n return this.inflight.get(key)!;\n }\n\n // 3. Not in cache, not in-flight: Make the request\n const newObs = this.loader.load({ lang, scope }).pipe(\n tap({\n next: (data) => {\n this.cache.set(key, data);\n // No need to delete from inflight here, finalize will handle it\n // or delete it only after caching. If you delete here, and shareReplay\n // source completes, subsequent subscribers might re-trigger if not careful.\n // It's better to remove from inflight in finalize or after shareReplay has replayed.\n // For simplicity and common patterns, removing after caching within tap (before shareReplay)\n // can work if shareReplay handles the source completion correctly.\n // A safer bet is to remove it in finalize *after* shareReplay.\n\n // Emit event to notify other components that the language has been loaded\n this.eventService.emitEvent({\n type: AXSystemEvents.AXLanguageLoaded,\n payload: data,\n });\n },\n error: (err) => {\n console.error(`Error loading ${key}:`, err);\n // Remove from inflight on error so subsequent calls can retry\n this.inflight.delete(key);\n },\n // finalize is tricky with shareReplay if you want to keep the replayed value\n // but still clear inflight. For this pattern, deleting on next/error\n // *before* shareReplay often means that shareReplay will re-trigger the source\n // if the inflight observable is requested again after being deleted.\n // The current structure of deleting in `tap` and then `shareReplay`\n // might need `this.inflight.delete(key)` to be moved after `shareReplay` effect.\n // Let's try a common pattern:\n }),\n shareReplay(1), // Replay the last emitted value for subsequent subscribers\n tap({\n // This tap runs *after* shareReplay has done its work for the first subscriber\n // and for subsequent subscribers that get the replayed value.\n next: () => {\n // Once data is successfully loaded and cached (by the first tap),\n // and shareReplay ensures it's available, we can remove from inflight.\n // This means subsequent calls for the same key during the \"inflight\" period\n // get the shared observable, and after it resolves and is cached,\n // inflight is cleared.\n this.inflight.delete(key);\n },\n // Error is handled by the first tap, or catchError if you want to provide a fallback\n }),\n );\n\n this.inflight.set(key, newObs); // Store the observable that includes caching and cleanup logic\n return newObs;\n }\n\n public peek(lang: AXTranslateLang, scope: AXTranslateScope, key: string): string | null {\n const cacheKey = `${lang}:${scope}`;\n const data = this.cache.get(cacheKey);\n return get(data, key, null);\n }\n\n public async preload(options?: { langs?: AXTranslateLang[]; scopes?: AXTranslateScope[] }): Promise<void> {\n const langsToLoad = [...new Set(options?.langs ?? this.config.preload?.langs ?? [this.config.defaults.lang])];\n const scopesToLoad = [...new Set(options?.scopes ?? this.config.preload?.scopes ?? [this.config.defaults.scope])];\n\n const loadPromises: Promise<\n | { lang: AXTranslateLang; scope: AXTranslateScope; status: 'fulfilled'; value: AXTranslation } // Changed any to AXTranslation\n | { lang: AXTranslateLang; scope: AXTranslateScope; status: 'rejected'; reason: any }\n >[] = [];\n\n langsToLoad.forEach((lang) => {\n scopesToLoad.forEach((scope) => {\n const loadPromise = firstValueFrom(this.load(lang, scope)) // This should now always get a valid Observable\n .then((value) => ({ lang, scope, status: 'fulfilled' as const, value }))\n .catch((reason) => ({ lang, scope, status: 'rejected' as const, reason }));\n loadPromises.push(loadPromise);\n });\n });\n\n const results = await Promise.all(loadPromises);\n\n let allSucceeded = true;\n results.forEach((result) => {\n if (result.status === 'rejected') {\n allSucceeded = false;\n console.error(\n `Failed to preload translations for lang: ${result.lang}, scope: ${result.scope}. Reason:`,\n result.reason,\n );\n } else {\n // console.log(`Successfully preloaded lang: ${result.lang}, scope: ${result.scope}`); // Optionally uncomment for success logs\n }\n // else {\n // console.log(`Successfully preloaded lang: ${result.lang}, scope: ${result.scope}`); // Optionally uncomment for success logs\n // }\n });\n\n if (!allSucceeded) {\n console.error('One or more translation preloads failed. See console for details.');\n // throw new Error(\"One or more translation preloads failed. See console for details.\");\n }\n // The second results.forEach loop in your original code was redundant, I've removed it.\n // If it was for a different purpose, you can add it back.\n }\n\n public clear(): void {\n this.cache.clear();\n this.inflight.clear();\n }\n\n public getFallbackLangs(lang: AXTranslateLang): AXTranslateLang[] {\n return this.config.fallbacks?.langs?.[lang] ?? [];\n }\n\n public getFallbackScopes(scope: AXTranslateScope): AXTranslateScope[] {\n return this.config.fallbacks?.scopes?.[scope] ?? [];\n }\n}\n","import { AXParsedToken } from './translation.types';\n\nexport class TranslationParserService {\n private readonly legacyRegex = /t\\([\"']([^\"']+)[\"']\\s*(?:,\\s*(\\{.*?\\}))?\\)/g;\n private readonly inlineRegex = /@([a-zA-Z\\-]+:)?([a-zA-Z0-9_-]+):([a-zA-Z0-9_.:-]+)(?=[\\\\s.,;!?)]|$)/g;\n\n public isExpression(value: string): boolean {\n return typeof value === 'string' && (value.includes('t(') || value.includes('@'));\n }\n\n public parse(expression: string, currentLang: string, currentScope: string): AXParsedToken[] {\n const tokens: AXParsedToken[] = [];\n\n // Extract inline references like @lang:scope:key or @scope:key\n let inlineMatch;\n while ((inlineMatch = this.inlineRegex.exec(expression)) !== null) {\n const langPart = inlineMatch[1]?.replace(':', '') ?? null;\n const scope = inlineMatch[2] ?? currentScope;\n const key = inlineMatch[3];\n const fullMatch = inlineMatch[0];\n\n tokens.push({ lang: langPart || currentLang, scope, key, fullMatch });\n }\n\n // Extract legacy expressions\n let legacyMatch;\n while ((legacyMatch = this.legacyRegex.exec(expression)) !== null) {\n const key = legacyMatch[1];\n const rawOptions = legacyMatch[2];\n let scope = currentScope;\n let lang = currentLang;\n\n if (rawOptions) {\n try {\n const jsonString = rawOptions.replace(/(['\"])?([a-zA-Z0-9_]+)(['\"])?\\s*:/g, '\"$2\":').replace(/'/g, '\"');\n const options = JSON.parse(jsonString);\n scope = options.scope || scope;\n lang = options.lang || lang;\n } catch (err) {\n console.error('Invalid translation expression options:', err);\n }\n }\n\n tokens.push({ key, scope, lang, fullMatch: legacyMatch[0] });\n }\n\n return tokens;\n }\n}\n","import { inject } from '@angular/core';\nimport { firstValueFrom } from 'rxjs';\nimport { AXTranslationLoaderService } from './translation-loader.service';\nimport { TranslationParserService } from './translation.parser';\nimport { AXTranslateLang, AXTranslateParams, AXTranslateScope } from './translation.types';\n\n// Helper function to escape special characters for use in a regular expression\nfunction escapeRegExp(string: string): string {\n return string.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nexport class TranslationResolverService {\n private loaderService = inject(AXTranslationLoaderService);\n private parser = new TranslationParserService();\n\n async resolve(\n lang: AXTranslateLang,\n scope: AXTranslateScope,\n key: string,\n params?: AXTranslateParams,\n ): Promise<string> {\n let result = this.loaderService.peek(lang, scope, key);\n\n if (result == null) {\n await firstValueFrom(this.loaderService.load(lang, scope));\n result = this.loaderService.peek(lang, scope, key);\n }\n\n if (result == null) {\n const unresolvedResult = key;\n return this.format(unresolvedResult, params);\n }\n\n // Recursively resolve references\n if (typeof result === 'string' && this.parser.isExpression(result)) {\n const tokens = this.parser.parse(result, lang, scope);\n if (tokens.length > 0) {\n const first = tokens[0];\n result = await this.resolve(first.lang || lang, first.scope || scope, first.key, params);\n }\n }\n\n return this.format(result, params);\n }\n\n public format(text: string, params?: AXTranslateParams): string {\n if (!params || typeof text !== 'string' || Object.keys(params).length === 0) {\n return text;\n }\n\n return Object.keys(params).reduce((currentText, paramKey) => {\n // paramKey is the key from the params object, e.g., \"title\" or \" title \"\n const valueToInsert = params[paramKey];\n\n // 1. Trim the key from the params object to handle potential leading/trailing spaces.\n // e.g., if paramKey is \" title \", keyForPattern becomes \"title\".\n const keyForPattern = paramKey.trim();\n\n // If trimming results in an empty string, it's not a valid placeholder to replace.\n if (keyForPattern === '') {\n return currentText;\n }\n\n // 2. Escape the trimmed key to safely use it in a regular expression.\n // This handles cases where the key might contain special regex characters (e.g., \"user.name\", \"item[0]\").\n const escapedKey = escapeRegExp(keyForPattern);\n\n // 3. Construct the RegExp. This will match:\n // - {{KEY}}\n // - {{ KEY }}\n // - {{ KEY }}\n // etc., where KEY is the (trimmed and escaped) paramKey.\n const re = new RegExp(`{{\\\\s*${escapedKey}\\\\s*}}`, 'g');\n\n // 4. Replace occurrences, ensuring the value is a string.\n return currentText.replace(re, String(valueToInsert));\n }, text);\n }\n}\n","export type AXTranslateHashMap<T = unknown> = Record<string, T>;\n\nexport type AXTranslateLang = string;\nexport type AXTranslateScope = string;\nexport type AXTranslateParams<T = unknown> = Record<string, T>;\nexport type AXTranslation = Record<string, string>;\n\nexport interface AXTranslateOptions {\n lang?: AXTranslateLang;\n scope?: AXTranslateScope;\n params?: AXTranslateParams;\n}\n\nexport interface AXParsedToken {\n key: string;\n scope?: AXTranslateScope;\n lang?: AXTranslateLang;\n fullMatch: string;\n}\n\nexport const LOCALE_KEY_REGEX = /^(\\*-\\*|[a-z]{2}-[A-Z]{2})$/;\n\nexport type AXMultiLanguageMap = Record<string, string>;\n\nexport type AXMultiLanguageString = string | AXMultiLanguageMap;\n\nexport function resolveMultiLanguageValue(value: AXMultiLanguageMap, locale: string): string {\n return value[locale] ?? value['en-US'] ?? Object.values(value).find((item) => item != null) ?? '';\n}\n\nexport function isValidMultiLanguageObject(value: unknown): value is AXMultiLanguageMap {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return false;\n }\n\n const entries = Object.entries(value);\n if (!entries.length) {\n return false;\n }\n\n return entries.every(([key, entryValue]) => LOCALE_KEY_REGEX.test(key) && typeof entryValue === 'string');\n}\n\n/**\n * Resolves {@link AXMultiLanguageString} to a single string for the given locale.\n * Fallback order: `currentLocale` → `en-US` → first map value.\n */\nexport function resolveMultiLanguageString(\n content: AXMultiLanguageString | null | undefined,\n currentLocale: string,\n): string {\n if (content == null || content === '') {\n return '';\n }\n if (typeof content === 'string') {\n return content;\n }\n if (!isValidMultiLanguageObject(content)) {\n return String(content);\n }\n\n return resolveMultiLanguageValue(content, currentLocale);\n}\n\n/**\n * Creates an {@link AXMultiLanguageMap} with `en-US` and `fa-IR` entries.\n * Use for seed data, tests, and demos that supply English and Persian copy explicitly.\n */\nexport function createMultiLanguageString(enUs: string, faIr: string): AXMultiLanguageMap {\n return { 'en-US': enUs, 'fa-IR': faIr };\n}\n\n/**\n * True when there is no displayable text in any locale (plain string or ML map).\n */\nexport function isEffectivelyEmptyLocalizedValue(value: unknown): boolean {\n if (value == null) return true;\n if (typeof value === 'string') return value.trim() === '';\n if (typeof value !== 'object' || Array.isArray(value)) return false;\n const record = value as Record<string, unknown>;\n return Object.values(record).every((v) => v == null || String(v).trim() === '');\n}\n","import { AXEventService, AXSystemEvents } from '@acorex/core/events';\nimport { AXLocaleService } from '@acorex/core/locale';\nimport { waitFor } from '@acorex/core/utils';\nimport { inject, Injectable } from '@angular/core';\nimport { BehaviorSubject, distinctUntilChanged, from, Observable, of, shareReplay, switchMap } from 'rxjs';\nimport { AXTranslationLoaderService } from './translation-loader.service';\nimport { AX_TRANSLATION_CONFIG } from './translation.config';\nimport { TranslationParserService } from './translation.parser';\nimport { TranslationResolverService } from './translation.resolver';\nimport {\n AXMultiLanguageMap,\n AXTranslateLang,\n AXTranslateOptions,\n isValidMultiLanguageObject,\n LOCALE_KEY_REGEX,\n resolveMultiLanguageValue,\n} from './translation.types';\n\nlet singletonInstance: AXTranslationService;\n\nexport function translateSync(key: string, options?: AXTranslateOptions): string {\n return singletonInstance.translateSync(key, options);\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AXTranslationService {\n private localeService = inject(AXLocaleService);\n private config = inject(AX_TRANSLATION_CONFIG);\n private loader = inject(AXTranslationLoaderService);\n private parser = new TranslationParserService();\n private eventService = inject(AXEventService);\n private resolver = new TranslationResolverService();\n private activeLang = new BehaviorSubject<AXTranslateLang>(this.config.defaults.lang);\n public readonly langChanges$ = this.activeLang.asObservable();\n public readonly currentLocale$ = this.langChanges$.pipe(distinctUntilChanged());\n\n constructor() {\n singletonInstance = this;\n this.localeService.profileChanged$.subscribe((locale) => {\n if (locale?.localeInfo?.code) {\n this.setActiveLang(locale.localeInfo.code);\n }\n });\n }\n\n public setActiveLang(lang: AXTranslateLang): void {\n if (lang && lang !== this.activeLang.getValue()) {\n this.activeLang.next(lang);\n this.eventService.emitEvent({\n type: AXSystemEvents.AXLanguageChanged,\n payload: lang,\n });\n }\n }\n\n public getActiveLang(): AXTranslateLang {\n return this.activeLang.getValue();\n }\n\n public getDefaultLang(): AXTranslateLang {\n return this.config.defaults.lang;\n }\n\n public resolve(value: string | AXMultiLanguageMap | null | undefined, locale?: string): string {\n if (value == null) {\n return '';\n }\n\n if (typeof value === 'string') {\n return value;\n }\n\n if (!isValidMultiLanguageObject(value)) {\n return '';\n }\n\n return resolveMultiLanguageValue(value, locale ?? this.getActiveLang());\n }\n\n public toLocaleMap(\n value: string | AXMultiLanguageMap | null | undefined,\n activeLocale: string = this.getActiveLang(),\n ): AXMultiLanguageMap {\n if (isValidMultiLanguageObject(value)) {\n return { ...value };\n }\n\n return {\n [activeLocale]: typeof value === 'string' ? value : '',\n };\n }\n\n public translate$(\n value: string | AXMultiLanguageMap | null | undefined,\n options?: AXTranslateOptions,\n ): Observable<string> {\n if (isValidMultiLanguageObject(value)) {\n return this.langChanges$.pipe(\n switchMap((activeLang) => {\n const targetLang = options?.lang ?? activeLang;\n const selectedValue = resolveMultiLanguageValue(value, targetLang);\n const scope = options?.scope ?? this.config.defaults.scope;\n\n return from(\n this.translateAsync(selectedValue, {\n ...options,\n lang: targetLang,\n scope,\n }),\n );\n }),\n );\n }\n return this.translateValue$(value, options);\n }\n\n async translateAsync(text: string, options?: AXTranslateOptions): Promise<string> {\n const { lang, scope } = this.resolveContext(options);\n const params = options?.params;\n\n if (!this.parser.isExpression(text)) {\n return this.resolver.resolve(lang, scope, text, params);\n }\n\n const tokens = this.parser.parse(text, lang, scope);\n\n const results = await Promise.all(\n tokens.map((token) =>\n this.resolver\n .resolve(token.lang ?? lang, token.scope ?? scope, token.key, params)\n .then((translated) => [token.fullMatch, translated]),\n ),\n );\n\n return results.reduce((output, [match, translated]) => output.replace(match, translated), text);\n }\n\n public translateSync(\n text: string,\n options?: AXTranslateOptions & { waitForLoad?: boolean; timeoutMs?: number },\n ): string {\n const { lang, scope } = this.resolveContext(options);\n const params = options?.params;\n const waitForLoad = options?.waitForLoad ?? false;\n const timeoutMs = options?.timeoutMs ?? 100;\n\n if (!this.parser.isExpression(text)) {\n let translated = this.loader.peek(lang, scope, text);\n\n if (!translated && waitForLoad) {\n translated = waitFor(\n () => this.loader.peek(lang, scope, text),\n () => this.loader.load(lang, scope).subscribe(),\n timeoutMs,\n );\n }\n\n return this.resolver.format(translated ?? text, params);\n }\n\n const tokens = this.parser.parse(text, lang, scope);\n let result = text;\n\n for (const token of tokens) {\n const targetLang = token.lang ?? lang;\n const targetScope = token.scope ?? scope;\n const key = token.key;\n\n let translation = this.loader.peek(targetLang, targetScope, key);\n\n if (!translation) {\n translation =\n waitFor(\n () => this.loader.peek(targetLang, targetScope, key),\n () => this.loader.load(targetLang, targetScope).subscribe(),\n waitForLoad ? timeoutMs : 0,\n ) ?? key;\n }\n\n result = result.replace(token.fullMatch, this.resolver.format(translation, params));\n }\n\n return result;\n }\n\n private translateValue$(text: string, options?: AXTranslateOptions): Observable<string> {\n if (!text) {\n return of('');\n }\n\n const staticOptions = { ...options };\n const staticScope = staticOptions.scope ?? this.config.defaults.scope;\n\n return this.langChanges$.pipe(\n switchMap((lang) => {\n return from(\n this.translateAsync(text, {\n ...staticOptions,\n lang: staticOptions.lang ?? lang,\n scope: staticScope,\n }),\n );\n }),\n shareReplay({ bufferSize: 1, refCount: true }),\n );\n }\n\n private resolveContext(options?: AXTranslateOptions): { lang: AXTranslateLang; scope: string } {\n return {\n lang: options?.lang ?? this.getActiveLang() ?? this.config.defaults.lang,\n scope: options?.scope ?? this.config.defaults.scope,\n };\n }\n\n public isValidMultiLanguageObject(value: unknown): value is AXMultiLanguageMap {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return false;\n }\n\n const entries = Object.entries(value);\n if (!entries.length) {\n return false;\n }\n\n return entries.every(([key, entryValue]) => LOCALE_KEY_REGEX.test(key) && typeof entryValue === 'string');\n }\n}\n","import { inject } from '@angular/core';\nimport { ResolveFn } from '@angular/router';\nimport { AXTranslationLoaderService } from './translation-loader.service';\nimport { AX_TRANSLATION_CONFIG } from './translation.config';\nimport { AXTranslationService } from './translation.service';\n\nexport const loadTranslationScope: ResolveFn<unknown> = (route, state) => {\n const translationLoaderService = inject(AXTranslationLoaderService);\n const translationService = inject(AXTranslationService);\n const config = inject(AX_TRANSLATION_CONFIG);\n const scopeValue = route.data[config.resolver?.scopeKey];\n const scopes = Array.isArray(scopeValue) ? scopeValue : [scopeValue];\n return translationLoaderService.preload({ langs: [translationService.getActiveLang()], scopes });\n};\n","import { Directive, OnInit, TemplateRef, ViewContainerRef, inject } from '@angular/core';\nimport { Observable, shareReplay } from 'rxjs';\nimport { AXTranslationService } from './translation.service';\nimport { AXTranslateOptions } from './translation.types';\n@Directive({ selector: '[translate]' })\nexport class AXTranslatorDirective implements OnInit {\n private templateRef = inject<TemplateRef<any>>(TemplateRef);\n private vc = inject(ViewContainerRef);\n private translationService = inject(AXTranslationService);\n\n ngOnInit() {\n const cache = new Map<string, Observable<string>>();\n\n const t = (key: string, opts?: AXTranslateOptions) => {\n const id = `${key}|${opts?.lang ?? this.translationService.getActiveLang()}|${opts?.scope ?? 'common'}`;\n if (!cache.has(id)) {\n cache.set(\n id,\n this.translationService.translate$(key, opts).pipe(shareReplay({ bufferSize: 1, refCount: true })),\n );\n }\n return cache.get(id)!;\n };\n\n this.vc.clear();\n this.vc.createEmbeddedView(this.templateRef, { $implicit: t });\n }\n}\n","import { inject, Pipe, PipeTransform } from '@angular/core';\nimport { Observable, of } from 'rxjs';\nimport { AXTranslationService } from './translation.service';\nimport { AXTranslateOptions } from './translation.types';\n\n@Pipe({\n name: 'translate',\n pure: true,\n}) // The pipe can now be pure\nexport class AXTranslatorPipe implements PipeTransform {\n private service = inject(AXTranslationService);\n\n transform(\n value: string | Record<string, string> | null | undefined,\n options?: AXTranslateOptions,\n ): Observable<string> {\n if (!value) {\n return of('');\n }\n return this.service.translate$(value, options);\n }\n}\n","import { NgModule, inject, provideAppInitializer } from '@angular/core';\nimport { AXTranslationLoaderService } from './translation-loader.service';\nimport { AXTranslatorDirective } from './translator.directive';\nimport { AXTranslatorPipe } from './translator.pipe';\n\nfunction initializeApp(translatorService: AXTranslationLoaderService) {\n return (): Promise<void> => {\n return translatorService.preload();\n };\n}\n\n@NgModule({\n imports: [AXTranslatorPipe, AXTranslatorDirective],\n exports: [AXTranslatorPipe, AXTranslatorDirective],\n providers: [\n provideAppInitializer(() => {\n const initializerFn = initializeApp(inject(AXTranslationLoaderService));\n return initializerFn();\n }),\n ],\n})\nexport class AXTranslationModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import * as
|
|
1
|
+
import * as _angular_core from '@angular/core';
|
|
2
2
|
import { Subject, BehaviorSubject } from 'rxjs';
|
|
3
3
|
|
|
4
4
|
type AXThemeMode = 'light' | 'dark' | 'system' | 'system-dark' | 'system-light';
|
|
5
|
+
type AXDirection = 'ltr' | 'rtl';
|
|
5
6
|
type AXPlatforms = 'Android' | 'Desktop' | 'iOS' | 'Mobile';
|
|
6
7
|
type AXBrowsers = 'Chrome' | 'Safari' | 'Edge' | 'Firefox' | 'Opera' | 'MSIE';
|
|
7
8
|
type AXTechnologies = 'PWA' | 'Hybrid' | 'Electron';
|
|
@@ -49,14 +50,22 @@ declare class AXPlatform {
|
|
|
49
50
|
#private;
|
|
50
51
|
resize: Subject<AXPlatformEvent>;
|
|
51
52
|
directionChange: Subject<AXPlatformEvent>;
|
|
53
|
+
languageChange: Subject<AXPlatformEvent>;
|
|
52
54
|
click: Subject<AXPlatformEvent>;
|
|
53
55
|
scroll: Subject<AXPlatformEvent>;
|
|
54
56
|
themeMode$: BehaviorSubject<AXThemeMode>;
|
|
55
|
-
themeMode:
|
|
57
|
+
themeMode: _angular_core.WritableSignal<AXThemeMode>;
|
|
58
|
+
direction$: BehaviorSubject<AXDirection>;
|
|
59
|
+
direction: _angular_core.WritableSignal<AXDirection>;
|
|
60
|
+
language$: BehaviorSubject<string>;
|
|
61
|
+
language: _angular_core.WritableSignal<string>;
|
|
56
62
|
private document;
|
|
57
63
|
private platformID;
|
|
64
|
+
private eventService;
|
|
58
65
|
isDark(): boolean;
|
|
59
66
|
isRtl(): boolean;
|
|
67
|
+
get documentDirection(): AXDirection;
|
|
68
|
+
get documentLanguage(): string;
|
|
60
69
|
isLandscape(): boolean;
|
|
61
70
|
isPortrate(): boolean;
|
|
62
71
|
/**
|
|
@@ -87,17 +96,31 @@ declare class AXPlatform {
|
|
|
87
96
|
* @param mode - Desired theme mode.
|
|
88
97
|
*/
|
|
89
98
|
setThemeMode(mode: AXThemeMode): void;
|
|
99
|
+
/**
|
|
100
|
+
* Sets document direction (dir="ltr|rtl") and persists it.
|
|
101
|
+
*/
|
|
102
|
+
setDirection(dir: AXDirection): void;
|
|
103
|
+
toggleDirection(): "ltr" | "rtl";
|
|
104
|
+
/**
|
|
105
|
+
* Sets document language (lang="<bcp47>") and optionally direction, then persists it.
|
|
106
|
+
*/
|
|
107
|
+
setLanguage(lang: string, options?: {
|
|
108
|
+
dir?: AXDirection;
|
|
109
|
+
}): void;
|
|
110
|
+
autoDetectLanguage(): string;
|
|
111
|
+
autoDetectDirection(): AXDirection;
|
|
90
112
|
private setFullHeightRatio;
|
|
91
113
|
private autoSystemModeDetection;
|
|
92
114
|
constructor();
|
|
115
|
+
private detectLanguageChangeFromSystemEvents;
|
|
93
116
|
private detectDarkMode;
|
|
94
117
|
private detectOnResize;
|
|
95
118
|
private detectClickEvent;
|
|
96
119
|
private detectScrollEvent;
|
|
97
120
|
private detectDocumentDirectionChange;
|
|
98
|
-
static ɵfac:
|
|
99
|
-
static ɵprov:
|
|
121
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXPlatform, never>;
|
|
122
|
+
static ɵprov: _angular_core.ɵɵInjectableDeclaration<AXPlatform>;
|
|
100
123
|
}
|
|
101
124
|
|
|
102
125
|
export { AXPlatform, AXPlatformEvent, PLATFORMS_MAP, is2XLScreen, is3XLScreen, is4XLScreen, isAndroid, isAndroidTablet, isBrowser, isCapacitorNative, isChrome, isCordova, isDesktop, isEdge, isElectron, isFirefox, isHybrid, isIOS, isIpad, isIphone, isLGScreen, isMDScreen, isMSIE, isMobile, isMobileWeb, isOpera, isPWA, isPhablet, isSMScreen, isSafari, isServer, isTablet, isTouch, isXLScreen, matchMedia, testUserAgent };
|
|
103
|
-
export type { AXBrowsers, AXPlatforms, AXScreenSizes, AXTechnologies, AXThemeMode };
|
|
126
|
+
export type { AXBrowsers, AXDirection, AXPlatforms, AXScreenSizes, AXTechnologies, AXThemeMode };
|
|
@@ -21,6 +21,25 @@ interface AXParsedToken {
|
|
|
21
21
|
lang?: AXTranslateLang;
|
|
22
22
|
fullMatch: string;
|
|
23
23
|
}
|
|
24
|
+
declare const LOCALE_KEY_REGEX: RegExp;
|
|
25
|
+
type AXMultiLanguageMap = Record<string, string>;
|
|
26
|
+
type AXMultiLanguageString = string | AXMultiLanguageMap;
|
|
27
|
+
declare function resolveMultiLanguageValue(value: AXMultiLanguageMap, locale: string): string;
|
|
28
|
+
declare function isValidMultiLanguageObject(value: unknown): value is AXMultiLanguageMap;
|
|
29
|
+
/**
|
|
30
|
+
* Resolves {@link AXMultiLanguageString} to a single string for the given locale.
|
|
31
|
+
* Fallback order: `currentLocale` → `en-US` → first map value.
|
|
32
|
+
*/
|
|
33
|
+
declare function resolveMultiLanguageString(content: AXMultiLanguageString | null | undefined, currentLocale: string): string;
|
|
34
|
+
/**
|
|
35
|
+
* Creates an {@link AXMultiLanguageMap} with `en-US` and `fa-IR` entries.
|
|
36
|
+
* Use for seed data, tests, and demos that supply English and Persian copy explicitly.
|
|
37
|
+
*/
|
|
38
|
+
declare function createMultiLanguageString(enUs: string, faIr: string): AXMultiLanguageMap;
|
|
39
|
+
/**
|
|
40
|
+
* True when there is no displayable text in any locale (plain string or ML map).
|
|
41
|
+
*/
|
|
42
|
+
declare function isEffectivelyEmptyLocalizedValue(value: unknown): boolean;
|
|
24
43
|
|
|
25
44
|
interface AXTranslationConfig {
|
|
26
45
|
defaults: {
|
|
@@ -62,7 +81,7 @@ declare const AX_TRANSLATION_LOADER: InjectionToken<AXTranslationLoader>;
|
|
|
62
81
|
|
|
63
82
|
declare class AXTranslatorPipe implements PipeTransform {
|
|
64
83
|
private service;
|
|
65
|
-
transform(
|
|
84
|
+
transform(value: string | Record<string, string> | null | undefined, options?: AXTranslateOptions): Observable<string>;
|
|
66
85
|
static ɵfac: i0.ɵɵFactoryDeclaration<AXTranslatorPipe, never>;
|
|
67
86
|
static ɵpipe: i0.ɵɵPipeDeclaration<AXTranslatorPipe, "translate", true>;
|
|
68
87
|
}
|
|
@@ -92,19 +111,25 @@ declare class AXTranslationService {
|
|
|
92
111
|
private resolver;
|
|
93
112
|
private activeLang;
|
|
94
113
|
readonly langChanges$: Observable<string>;
|
|
114
|
+
readonly currentLocale$: Observable<string>;
|
|
95
115
|
constructor();
|
|
96
116
|
setActiveLang(lang: AXTranslateLang): void;
|
|
97
117
|
getActiveLang(): AXTranslateLang;
|
|
98
118
|
getDefaultLang(): AXTranslateLang;
|
|
99
|
-
|
|
119
|
+
resolve(value: string | AXMultiLanguageMap | null | undefined, locale?: string): string;
|
|
120
|
+
toLocaleMap(value: string | AXMultiLanguageMap | null | undefined, activeLocale?: string): AXMultiLanguageMap;
|
|
121
|
+
translate$(value: string | AXMultiLanguageMap | null | undefined, options?: AXTranslateOptions): Observable<string>;
|
|
100
122
|
translateAsync(text: string, options?: AXTranslateOptions): Promise<string>;
|
|
101
123
|
translateSync(text: string, options?: AXTranslateOptions & {
|
|
102
124
|
waitForLoad?: boolean;
|
|
103
125
|
timeoutMs?: number;
|
|
104
126
|
}): string;
|
|
127
|
+
private translateValue$;
|
|
128
|
+
private resolveContext;
|
|
129
|
+
isValidMultiLanguageObject(value: unknown): value is AXMultiLanguageMap;
|
|
105
130
|
static ɵfac: i0.ɵɵFactoryDeclaration<AXTranslationService, never>;
|
|
106
131
|
static ɵprov: i0.ɵɵInjectableDeclaration<AXTranslationService>;
|
|
107
132
|
}
|
|
108
133
|
|
|
109
|
-
export { AXTranslationDefaultConfig, AXTranslationLoaderDefault, AXTranslationModule, AXTranslationService, AXTranslatorDirective, AXTranslatorPipe, AX_TRANSLATION_CONFIG, AX_TRANSLATION_LOADER, loadTranslationScope, translateSync, translationConfig };
|
|
110
|
-
export type { AXParsedToken, AXPartialTranslationConfig, AXTranslateHashMap, AXTranslateLang, AXTranslateOptions, AXTranslateParams, AXTranslateScope, AXTranslation, AXTranslationConfig, AXTranslationLoader, AXTranslationLoaderOptions };
|
|
134
|
+
export { AXTranslationDefaultConfig, AXTranslationLoaderDefault, AXTranslationModule, AXTranslationService, AXTranslatorDirective, AXTranslatorPipe, AX_TRANSLATION_CONFIG, AX_TRANSLATION_LOADER, LOCALE_KEY_REGEX, createMultiLanguageString, isEffectivelyEmptyLocalizedValue, isValidMultiLanguageObject, loadTranslationScope, resolveMultiLanguageString, resolveMultiLanguageValue, translateSync, translationConfig };
|
|
135
|
+
export type { AXMultiLanguageMap, AXMultiLanguageString, AXParsedToken, AXPartialTranslationConfig, AXTranslateHashMap, AXTranslateLang, AXTranslateOptions, AXTranslateParams, AXTranslateScope, AXTranslation, AXTranslationConfig, AXTranslationLoader, AXTranslationLoaderOptions };
|