@acorex/core 19.13.0-next.1 → 19.13.0-next.2
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-format.mjs +16 -17
- package/fesm2022/acorex-core-format.mjs.map +1 -1
- package/fesm2022/acorex-core-translation.mjs +201 -233
- package/fesm2022/acorex-core-translation.mjs.map +1 -1
- package/fesm2022/acorex-core-utils.mjs +15 -140
- package/fesm2022/acorex-core-utils.mjs.map +1 -1
- package/format/lib/format.service.d.ts +7 -8
- package/package.json +1 -1
- package/translation/index.d.ts +1 -1
- package/translation/lib/translation.config.d.ts +6 -19
- package/translation/lib/translation.loader.d.ts +2 -2
- package/translation/lib/translation.service.d.ts +32 -12
- package/translation/lib/translation.types.d.ts +2 -8
- package/translation/lib/translator.pipe.d.ts +2 -0
- package/utils/index.d.ts +5 -6
- package/utils/lib/string-util.d.ts +6 -0
- package/translation/lib/translation-loader.service.d.ts +0 -20
- package/translation/lib/translation.parser.d.ts +0 -7
- package/translation/lib/translation.resolver.d.ts +0 -9
- package/utils/lib/execution.utils.d.ts +0 -33
- package/utils/lib/string.utils.d.ts +0 -4
- /package/utils/lib/{lifecycle-helpers.utils.d.ts → auto-unsubscribe.d.ts} +0 -0
- /package/utils/lib/{color.utils.d.ts → color-util.d.ts} +0 -0
- /package/utils/lib/{drawing.utils.d.ts → drawing-util.d.ts} +0 -0
- /package/utils/lib/{html-utils.d.ts → html-util.d.ts} +0 -0
@@ -1,9 +1,9 @@
|
|
1
1
|
import * as i0 from '@angular/core';
|
2
2
|
import { InjectionToken, inject, Injectable, Directive, Pipe, provideAppInitializer, NgModule } from '@angular/core';
|
3
|
-
import {
|
4
|
-
import { get } from 'lodash-es';
|
5
|
-
import {
|
6
|
-
import {
|
3
|
+
import { AXEventService } from '@acorex/core/events';
|
4
|
+
import { set, get } from 'lodash-es';
|
5
|
+
import { of, BehaviorSubject, forkJoin, tap, catchError, finalize, shareReplay, startWith, map, distinctUntilChanged, switchMap, firstValueFrom } from 'rxjs';
|
6
|
+
import { AXLocaleEvents, AXLocaleService } from '@acorex/core/locale';
|
7
7
|
|
8
8
|
const AX_TRANSLATION_CONFIG = new InjectionToken('AX_TRANSLATION_CONFIG', {
|
9
9
|
providedIn: 'root',
|
@@ -12,17 +12,9 @@ const AX_TRANSLATION_CONFIG = new InjectionToken('AX_TRANSLATION_CONFIG', {
|
|
12
12
|
},
|
13
13
|
});
|
14
14
|
const AXTranslationDefaultConfig = {
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
},
|
19
|
-
preload: {
|
20
|
-
langs: ['en-US'],
|
21
|
-
scopes: ['common'],
|
22
|
-
},
|
23
|
-
resolver: {
|
24
|
-
scopeKey: 'scope',
|
25
|
-
},
|
15
|
+
defaultLang: 'en-US',
|
16
|
+
defaultScope: 'common',
|
17
|
+
scopeResolverKey: 'scope',
|
26
18
|
};
|
27
19
|
function translationConfig(config = {}) {
|
28
20
|
const result = {
|
@@ -33,7 +25,7 @@ function translationConfig(config = {}) {
|
|
33
25
|
}
|
34
26
|
|
35
27
|
class AXTranslationLoaderDefault {
|
36
|
-
|
28
|
+
getTranslation(options) {
|
37
29
|
return of({});
|
38
30
|
}
|
39
31
|
}
|
@@ -44,256 +36,232 @@ const AX_TRANSLATION_LOADER = new InjectionToken('AX_TRANSLATION_LOADER', {
|
|
44
36
|
},
|
45
37
|
});
|
46
38
|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
39
|
+
let singletonInstance;
|
40
|
+
function translateSync(key, options) {
|
41
|
+
return singletonInstance.translateSync(key, options);
|
42
|
+
}
|
43
|
+
class AXTranslationService {
|
44
|
+
getDefaultLang() {
|
45
|
+
return this.config.defaultLang;
|
53
46
|
}
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
obs.subscribe({
|
64
|
-
next: (data) => {
|
65
|
-
this.cache.set(key, data);
|
66
|
-
this.inflight.delete(key);
|
67
|
-
},
|
68
|
-
error: () => {
|
69
|
-
this.inflight.delete(key);
|
70
|
-
},
|
47
|
+
getActiveLang() {
|
48
|
+
return this.activeLang.getValue();
|
49
|
+
}
|
50
|
+
setActiveLang(lang) {
|
51
|
+
if (lang != this.getActiveLang()) {
|
52
|
+
this.activeLang.next(lang);
|
53
|
+
this.eventService.emitEvent({
|
54
|
+
type: AXLocaleEvents.AXLanguageChanged,
|
55
|
+
payload: lang,
|
71
56
|
});
|
72
57
|
}
|
73
|
-
return this.inflight.get(key);
|
74
58
|
}
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
59
|
+
/**
|
60
|
+
* @ignore
|
61
|
+
*/
|
62
|
+
constructor() {
|
63
|
+
this.loader = inject(AX_TRANSLATION_LOADER);
|
64
|
+
this.config = inject(AX_TRANSLATION_CONFIG);
|
65
|
+
this.eventService = inject(AXEventService);
|
66
|
+
this.localeService = inject(AXLocaleService);
|
67
|
+
this.translationCache = {};
|
68
|
+
this.ongoingRequests = new Map();
|
69
|
+
this.activeLang = new BehaviorSubject(this.getDefaultLang());
|
70
|
+
this.langChanges$ = this.activeLang.asObservable();
|
71
|
+
this.expressionCache = new Map();
|
72
|
+
this.isExpression = (value) => value.includes('t(');
|
73
|
+
singletonInstance = this;
|
74
|
+
//
|
75
|
+
this.localeService.profileChanged$.subscribe((locale) => {
|
76
|
+
if (locale?.localeInfo?.code) {
|
77
|
+
this.setActiveLang(locale.localeInfo.code);
|
78
|
+
}
|
89
79
|
});
|
90
|
-
await Promise.all(promises);
|
91
80
|
}
|
92
|
-
|
93
|
-
|
94
|
-
|
81
|
+
loadLanguagesAndScopes(languages, scopes) {
|
82
|
+
const requests = languages.flatMap((lang) => scopes.map((scope) => {
|
83
|
+
// Check if translations are already cached
|
84
|
+
if (this.translationCache[lang]?.[scope]) {
|
85
|
+
return of(this.translationCache[lang][scope]);
|
86
|
+
}
|
87
|
+
// Use the new method to handle ongoing requests and loading
|
88
|
+
return this.fetchTranslationFiles(lang, scope);
|
89
|
+
}));
|
90
|
+
return forkJoin(requests);
|
95
91
|
}
|
96
|
-
|
97
|
-
|
92
|
+
fetchTranslationFiles(lang, scope) {
|
93
|
+
const requestKey = `${lang}_${scope}`;
|
94
|
+
// Return existing observable if the request is already in progress
|
95
|
+
if (this.ongoingRequests.has(requestKey)) {
|
96
|
+
return this.ongoingRequests.get(requestKey);
|
97
|
+
}
|
98
|
+
// Load translations if not in cache or ongoing requests
|
99
|
+
const translationObservable = this.loader.getTranslation({ lang, scope }).pipe(tap((translations) => this.setTranslationCache(lang, scope, translations)), catchError((error) => {
|
100
|
+
this.handleError(`Error loading translations for lang: ${lang}, scope: ${scope}`, error);
|
101
|
+
return of(null);
|
102
|
+
}), finalize(() => {
|
103
|
+
this.eventService.emitEvent({
|
104
|
+
type: AXLocaleEvents.AXLanguageLoaded,
|
105
|
+
payload: lang,
|
106
|
+
});
|
107
|
+
this.ongoingRequests.delete(requestKey);
|
108
|
+
}), shareReplay(1));
|
109
|
+
this.ongoingRequests.set(requestKey, translationObservable);
|
110
|
+
return translationObservable;
|
98
111
|
}
|
99
|
-
|
100
|
-
|
112
|
+
//#region Helpers Methods
|
113
|
+
/**
|
114
|
+
* Set translation data into cache
|
115
|
+
*/
|
116
|
+
setTranslationCache(lang, scope, translations) {
|
117
|
+
set(this.translationCache, `${lang}.${scope}`, translations);
|
101
118
|
}
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
args: [{ providedIn: 'root' }]
|
108
|
-
}] });
|
109
|
-
|
110
|
-
class TranslationParserService {
|
111
|
-
constructor() {
|
112
|
-
this.legacyRegex = /t\(["']([^"']+)["']\s*(?:,\s*(\{.*?\}))?\)/g;
|
113
|
-
this.inlineRegex = /@([a-zA-Z\-]+:)?([a-zA-Z0-9_-]+):([a-zA-Z0-9_.:-]+)(?=[\\s.,;!?)]|$)/g;
|
119
|
+
/**
|
120
|
+
* Get the translation from the cache or fallback to loading
|
121
|
+
*/
|
122
|
+
getTranslationFromCache(lang, scope, key) {
|
123
|
+
return get(this.translationCache, `${lang}.${scope}.${key}`, key);
|
114
124
|
}
|
115
|
-
|
116
|
-
return
|
125
|
+
isLangAvailable(lang, scope = null) {
|
126
|
+
return !this.translationCache[lang] && (!scope || !this.translationCache[lang][scope]);
|
117
127
|
}
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
const key = legacyMatch[1];
|
133
|
-
const rawOptions = legacyMatch[2];
|
134
|
-
let scope = currentScope;
|
135
|
-
let lang = currentLang;
|
136
|
-
if (rawOptions) {
|
137
|
-
try {
|
138
|
-
const jsonString = rawOptions
|
139
|
-
.replace(/(['"])?([a-zA-Z0-9_]+)(['"])?\s*:/g, '"$2":')
|
140
|
-
.replace(/'/g, '"');
|
141
|
-
const options = JSON.parse(jsonString);
|
142
|
-
scope = options.scope || scope;
|
143
|
-
lang = options.lang || lang;
|
144
|
-
}
|
145
|
-
catch (err) {
|
146
|
-
console.error('Invalid translation expression options:', err);
|
147
|
-
}
|
148
|
-
}
|
149
|
-
tokens.push({ key, scope, lang, fullMatch: legacyMatch[0] });
|
128
|
+
translateKey(key, lang, scope, params) {
|
129
|
+
// Trigger async preloading without blocking execution
|
130
|
+
this.loadLanguagesAndScopes([lang], [scope]).pipe(startWith()).subscribe({
|
131
|
+
error: (err) => {
|
132
|
+
this.handleError(`Error preloading translations for ${lang}, ${scope}`, err);
|
133
|
+
},
|
134
|
+
});
|
135
|
+
// Retrieve the translation from the cache or fallback to the key
|
136
|
+
let translation = this.getTranslationFromCache(lang, scope, key);
|
137
|
+
// Replace params like {{ name }}
|
138
|
+
if (params && typeof translation === 'string') {
|
139
|
+
Object.keys(params).forEach((paramKey) => {
|
140
|
+
translation = translation.replace(new RegExp(`{{\\s*${paramKey}\\s*}}`, 'g'), params[paramKey]);
|
141
|
+
});
|
150
142
|
}
|
151
|
-
return
|
152
|
-
}
|
153
|
-
}
|
154
|
-
|
155
|
-
class TranslationResolverService {
|
156
|
-
constructor() {
|
157
|
-
this.loaderService = inject(AXTranslationLoaderService);
|
158
|
-
this.cache = new Map();
|
159
|
-
this.inflight = new Map();
|
160
|
-
this.parser = new TranslationParserService();
|
143
|
+
return translation || key;
|
161
144
|
}
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
145
|
+
decodeExpression(expression) {
|
146
|
+
if (this.expressionCache.has(expression)) {
|
147
|
+
return this.expressionCache.get(expression);
|
148
|
+
}
|
149
|
+
const regex = /t\(["']([^"']+)["']\s*(?:,\s*(\{.*?\}))?\)/g;
|
150
|
+
const matches = [];
|
151
|
+
let match;
|
152
|
+
while ((match = regex.exec(expression)) !== null) {
|
153
|
+
const key = match[1];
|
154
|
+
const rawOptions = match[2];
|
155
|
+
if (!rawOptions) {
|
156
|
+
matches.push({ key, scope: null, lang: null, fullMatch: match[0] });
|
157
|
+
continue;
|
172
158
|
}
|
173
|
-
|
174
|
-
|
159
|
+
try {
|
160
|
+
const jsonString = rawOptions
|
161
|
+
.replace(/(['"])?([a-zA-Z0-9_]+)(['"])?\s*:/g, '"$2":') // Ensure keys are quoted
|
162
|
+
.replace(/'/g, '"'); // Replace single quotes with double quotes
|
163
|
+
const options = JSON.parse(jsonString);
|
164
|
+
matches.push({
|
165
|
+
key,
|
166
|
+
scope: options.scope || null,
|
167
|
+
lang: options.lang || null,
|
168
|
+
fullMatch: match[0],
|
169
|
+
});
|
175
170
|
}
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
// Recursively resolve references
|
180
|
-
if (typeof result === 'string' && this.parser.isExpression(result)) {
|
181
|
-
const tokens = this.parser.parse(result, lang, scope);
|
182
|
-
if (tokens.length > 0) {
|
183
|
-
const first = tokens[0];
|
184
|
-
result = await this.resolve(first.lang || lang, first.scope || scope, first.key, params);
|
171
|
+
catch (error) {
|
172
|
+
this.handleError(`Failed to parse options for key "${key}":`, error);
|
173
|
+
matches.push({ key, scope: null, lang: null, fullMatch: match[0] });
|
185
174
|
}
|
186
175
|
}
|
187
|
-
|
188
|
-
|
189
|
-
format(text, params) {
|
190
|
-
if (!params || typeof text !== 'string')
|
191
|
-
return text;
|
192
|
-
return Object.keys(params).reduce((out, key) => {
|
193
|
-
const re = new RegExp(`{{\s*${key}\s*}}`, 'g');
|
194
|
-
return out.replace(re, params[key]);
|
195
|
-
}, text);
|
176
|
+
this.expressionCache.set(expression, matches);
|
177
|
+
return matches;
|
196
178
|
}
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
}
|
203
|
-
class AXTranslationService {
|
204
|
-
constructor() {
|
205
|
-
this.localeService = inject(AXLocaleService);
|
206
|
-
this.config = inject(AX_TRANSLATION_CONFIG);
|
207
|
-
this.loader = inject(AXTranslationLoaderService);
|
208
|
-
this.parser = new TranslationParserService();
|
209
|
-
this.resolver = new TranslationResolverService();
|
210
|
-
this.activeLang = new BehaviorSubject('en-US');
|
211
|
-
this.langChanges$ = this.activeLang.asObservable();
|
212
|
-
singletonInstance = this;
|
213
|
-
this.localeService.profileChanged$.subscribe((locale) => {
|
214
|
-
if (locale?.localeInfo?.code) {
|
215
|
-
this.setActiveLang(locale.localeInfo.code);
|
216
|
-
}
|
179
|
+
handleError(message, error) {
|
180
|
+
console.error(message, error);
|
181
|
+
this.eventService.emitEvent({
|
182
|
+
type: 'error',
|
183
|
+
payload: { message, error },
|
217
184
|
});
|
218
185
|
}
|
219
|
-
|
220
|
-
|
221
|
-
|
186
|
+
//#endregion
|
187
|
+
//#region Async Translation Methods
|
188
|
+
translateText(text, contextLang, contextScope, params) {
|
189
|
+
if (!this.isExpression(text)) {
|
190
|
+
return this.loadLanguagesAndScopes([contextLang], [contextScope]).pipe(map(() => this.translateKey(text, contextLang, contextScope, params)), catchError((error) => {
|
191
|
+
this.handleError(`Error during translation:`, error);
|
192
|
+
return of(text); // Fallback to the original text
|
193
|
+
}));
|
222
194
|
}
|
223
|
-
|
224
|
-
|
225
|
-
|
195
|
+
const matches = this.decodeExpression(text);
|
196
|
+
// Extract unique languages and scopes for batch loading
|
197
|
+
const langScopeSet = new Set(matches.map(({ lang, scope }) => `${lang || contextLang}_${scope || contextScope}`));
|
198
|
+
const langs = Array.from(new Set(Array.from(langScopeSet).map((pair) => pair.split('_')[0])));
|
199
|
+
const scopes = Array.from(new Set(Array.from(langScopeSet).map((pair) => pair.split('_')[1])));
|
200
|
+
// Load all required languages and scopes
|
201
|
+
return this.loadLanguagesAndScopes(langs, scopes).pipe(map(() => {
|
202
|
+
// Resolve translations after loading
|
203
|
+
const translations = matches.reduce((acc, { key, scope, lang, fullMatch }) => {
|
204
|
+
const resolvedScope = scope || contextScope;
|
205
|
+
const resolvedLang = lang || contextLang;
|
206
|
+
acc[fullMatch] = this.translateKey(key, resolvedLang, resolvedScope, params);
|
207
|
+
return acc;
|
208
|
+
}, {});
|
209
|
+
// Replace all matches in the text with their resolved translations
|
210
|
+
return matches.reduce((result, { fullMatch }) => result.replace(new RegExp(fullMatch.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&'), 'g'), translations[fullMatch]), text);
|
211
|
+
}), catchError((error) => {
|
212
|
+
this.handleError(`Error during translation:`, error);
|
213
|
+
return of(text); // Fallback to the original text
|
214
|
+
}));
|
226
215
|
}
|
227
216
|
translate$(text, options) {
|
228
|
-
if (
|
229
|
-
return
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
return from(this.translateAsync(text, {
|
234
|
-
...staticOptions,
|
235
|
-
lang: staticOptions.lang ?? lang,
|
236
|
-
scope: staticScope
|
237
|
-
}));
|
217
|
+
if (options?.lang) {
|
218
|
+
return this.translateText(text, options.lang, options?.scope ?? this.config.defaultScope, options?.params);
|
219
|
+
}
|
220
|
+
return this.langChanges$.pipe(startWith(this.getActiveLang()), distinctUntilChanged(), switchMap((lang) => {
|
221
|
+
return this.translateText(text, lang, options?.scope ?? this.config.defaultScope, options?.params);
|
238
222
|
}));
|
239
223
|
}
|
240
224
|
async translateAsync(text, options) {
|
241
|
-
|
242
|
-
const scope = options?.scope ?? this.config.defaults.scope;
|
243
|
-
const params = options?.params;
|
244
|
-
if (!this.parser.isExpression(text)) {
|
245
|
-
const resolved = await this.resolver.resolve(lang, scope, text, params);
|
246
|
-
return this.resolver.format(resolved, params);
|
247
|
-
}
|
248
|
-
const tokens = this.parser.parse(text, lang, scope);
|
249
|
-
const results = await Promise.all(tokens.map(token => this.resolver.resolve(token.lang ?? lang, token.scope ?? scope, token.key, params)
|
250
|
-
.then(translated => [token.fullMatch, this.resolver.format(translated, params)])));
|
251
|
-
return results.reduce((output, [match, translated]) => output.replace(match, translated), text);
|
225
|
+
return firstValueFrom(this.translate$(text, options));
|
252
226
|
}
|
227
|
+
//#endregion
|
228
|
+
//#region Sync Translation Methods
|
253
229
|
translateSync(text, options) {
|
254
|
-
|
255
|
-
|
256
|
-
const params = options?.params;
|
257
|
-
const waitForLoad = options?.waitForLoad ?? false;
|
258
|
-
const timeoutMs = options?.timeoutMs ?? 100;
|
259
|
-
if (!this.parser.isExpression(text)) {
|
260
|
-
let translated = this.loader.peek(lang, scope, text);
|
261
|
-
if (!translated && waitForLoad) {
|
262
|
-
translated = waitFor(() => this.loader.peek(lang, scope, text), () => this.loader.load(lang, scope).subscribe(), timeoutMs);
|
263
|
-
}
|
264
|
-
return this.resolver.format(translated ?? text, params);
|
230
|
+
if (this.isExpression(text)) {
|
231
|
+
return this.translateTextSync(text, options?.lang ?? this.getActiveLang(), options?.scope ?? this.config.defaultScope);
|
265
232
|
}
|
266
|
-
|
267
|
-
|
268
|
-
for (const token of tokens) {
|
269
|
-
const targetLang = token.lang ?? lang;
|
270
|
-
const targetScope = token.scope ?? scope;
|
271
|
-
const key = token.key;
|
272
|
-
let translation = this.loader.peek(targetLang, targetScope, key);
|
273
|
-
if (!translation) {
|
274
|
-
translation = waitFor(() => this.loader.peek(targetLang, targetScope, key), () => this.loader.load(targetLang, targetScope).subscribe(), waitForLoad ? timeoutMs : 0) ?? key;
|
275
|
-
}
|
276
|
-
result = result.replace(token.fullMatch, this.resolver.format(translation, params));
|
233
|
+
else {
|
234
|
+
return this.translateKey(text, options?.lang ?? this.getActiveLang(), options?.scope ?? this.config.defaultScope);
|
277
235
|
}
|
278
|
-
|
236
|
+
}
|
237
|
+
translateTextSync(text, contextLang, contextScope, params) {
|
238
|
+
const matches = this.decodeExpression(text);
|
239
|
+
const translations = matches.reduce((acc, { key, scope, lang, fullMatch }) => {
|
240
|
+
const resolvedScope = scope || contextScope;
|
241
|
+
const resolvedLang = lang || contextLang;
|
242
|
+
// Cache translation to avoid redundant processing
|
243
|
+
if (!acc[fullMatch]) {
|
244
|
+
acc[fullMatch] = this.translateKey(key, resolvedLang, resolvedScope, params);
|
245
|
+
}
|
246
|
+
return acc;
|
247
|
+
}, {});
|
248
|
+
// Replace all matches in one go
|
249
|
+
return matches.reduce((result, { fullMatch }) => result.replace(fullMatch, translations[fullMatch]), text);
|
279
250
|
}
|
280
251
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.8", ngImport: i0, type: AXTranslationService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
281
252
|
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.8", ngImport: i0, type: AXTranslationService, providedIn: 'root' }); }
|
282
253
|
}
|
283
254
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.8", ngImport: i0, type: AXTranslationService, decorators: [{
|
284
255
|
type: Injectable,
|
285
|
-
args: [{
|
286
|
-
providedIn: 'root'
|
287
|
-
}]
|
256
|
+
args: [{ providedIn: 'root' }]
|
288
257
|
}], ctorParameters: () => [] });
|
289
258
|
|
290
259
|
const loadTranslationScope = (route, state) => {
|
291
|
-
const
|
292
|
-
const translationService = inject(AXTranslationService);
|
260
|
+
const translatorService = inject(AXTranslationService);
|
293
261
|
const config = inject(AX_TRANSLATION_CONFIG);
|
294
|
-
const scopeValue = route.data[config.
|
262
|
+
const scopeValue = route.data[config.scopeResolverKey];
|
295
263
|
const scopes = Array.isArray(scopeValue) ? scopeValue : [scopeValue];
|
296
|
-
return
|
264
|
+
return translatorService.loadLanguagesAndScopes([translatorService.getActiveLang()], scopes);
|
297
265
|
};
|
298
266
|
|
299
267
|
class AXTranslatorDirective {
|
@@ -319,8 +287,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.8", ngImpor
|
|
319
287
|
}], ctorParameters: () => [{ type: i0.TemplateRef }, { type: i0.ViewContainerRef }, { type: AXTranslationService }] });
|
320
288
|
|
321
289
|
class AXTranslatorPipe {
|
322
|
-
constructor() {
|
323
|
-
this.service =
|
290
|
+
constructor(service) {
|
291
|
+
this.service = service;
|
324
292
|
}
|
325
293
|
transform(key, options) {
|
326
294
|
if (!key) {
|
@@ -328,7 +296,7 @@ class AXTranslatorPipe {
|
|
328
296
|
}
|
329
297
|
return this.service.translate$(key, options);
|
330
298
|
}
|
331
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.8", ngImport: i0, type: AXTranslatorPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
|
299
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.8", ngImport: i0, type: AXTranslatorPipe, deps: [{ token: AXTranslationService }], target: i0.ɵɵFactoryTarget.Pipe }); }
|
332
300
|
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "19.2.8", ngImport: i0, type: AXTranslatorPipe, isStandalone: true, name: "translate" }); }
|
333
301
|
}
|
334
302
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.8", ngImport: i0, type: AXTranslatorPipe, decorators: [{
|
@@ -337,11 +305,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.8", ngImpor
|
|
337
305
|
name: 'translate',
|
338
306
|
pure: true,
|
339
307
|
}]
|
340
|
-
}] });
|
308
|
+
}], ctorParameters: () => [{ type: AXTranslationService }] });
|
341
309
|
|
342
|
-
function initializeApp(translatorService) {
|
310
|
+
function initializeApp(translatorService, config) {
|
343
311
|
return () => {
|
344
|
-
return translatorService.
|
312
|
+
return translatorService.loadLanguagesAndScopes(config.preloadLangs ?? [config.defaultLang], config.preloadScopes ?? [config.defaultScope]);
|
345
313
|
};
|
346
314
|
}
|
347
315
|
class AXTranslationModule {
|
@@ -349,7 +317,7 @@ class AXTranslationModule {
|
|
349
317
|
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.2.8", ngImport: i0, type: AXTranslationModule, imports: [AXTranslatorPipe, AXTranslatorDirective], exports: [AXTranslatorPipe, AXTranslatorDirective] }); }
|
350
318
|
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.2.8", ngImport: i0, type: AXTranslationModule, providers: [
|
351
319
|
provideAppInitializer(() => {
|
352
|
-
const initializerFn = initializeApp(inject(
|
320
|
+
const initializerFn = initializeApp(inject(AXTranslationService), inject(AX_TRANSLATION_CONFIG));
|
353
321
|
return initializerFn();
|
354
322
|
}),
|
355
323
|
] }); }
|
@@ -361,7 +329,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.8", ngImpor
|
|
361
329
|
exports: [AXTranslatorPipe, AXTranslatorDirective],
|
362
330
|
providers: [
|
363
331
|
provideAppInitializer(() => {
|
364
|
-
const initializerFn = initializeApp(inject(
|
332
|
+
const initializerFn = initializeApp(inject(AXTranslationService), inject(AX_TRANSLATION_CONFIG));
|
365
333
|
return initializerFn();
|
366
334
|
}),
|
367
335
|
],
|