@rxap/ngx-localize 19.1.0-dev.3 → 19.1.0-dev.4
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/CHANGELOG.md +6 -0
- package/compodoc/changelog.html +5 -0
- package/compodoc/dependencies.html +2 -2
- package/compodoc/injectables/I18nService.html +17 -6
- package/compodoc/injectables/LanguageSelectorService.html +34 -40
- package/compodoc/js/menu-wc.js +1 -1
- package/compodoc/js/menu-wc_es5.js +1 -1
- package/compodoc/js/search/search_index.js +2 -2
- package/compodoc/miscellaneous/functions.html +99 -3
- package/compodoc/properties.html +1 -1
- package/docs/documentation.json +112 -87
- package/docs/html/assets/navigation.js +1 -1
- package/docs/html/classes/I18nService.html +6 -5
- package/docs/html/classes/LanguageSelectorService.html +2 -2
- package/docs/html/functions/LanguageInterceptor.html +1 -1
- package/docs/html/functions/loadI18nBootstrapHook.html +1 -1
- package/docs/html/functions/loadLanguages.html +1 -1
- package/docs/html/functions/xliffToJson.html +1 -1
- package/docs/html/index.html +2 -2
- package/docs/html/modules.html +1 -1
- package/docs/markdown/README.md +1 -1
- package/docs/markdown/classes/I18nService.md +13 -9
- package/docs/markdown/classes/LanguageSelectorService.md +12 -10
- package/docs/markdown/functions/LanguageInterceptor.md +2 -2
- package/docs/markdown/functions/loadI18nBootstrapHook.md +2 -2
- package/docs/markdown/functions/loadLanguages.md +7 -3
- package/docs/markdown/functions/xliffToJson.md +2 -2
- package/docs/markdown/globals.md +3 -3
- package/docs/wiki/Class.I18nService.md +12 -8
- package/docs/wiki/Class.LanguageSelectorService.md +11 -9
- package/docs/wiki/Function.LanguageInterceptor.md +1 -1
- package/docs/wiki/Function.loadI18nBootstrapHook.md +1 -1
- package/docs/wiki/Function.loadLanguages.md +6 -2
- package/docs/wiki/Function.xliffToJson.md +1 -1
- package/docs/wiki/globals.md +2 -2
- package/fesm2022/rxap-ngx-localize.mjs +75 -46
- package/fesm2022/rxap-ngx-localize.mjs.map +1 -1
- package/lib/i18n.service.d.ts +3 -0
- package/lib/language-selector.service.d.ts +1 -3
- package/lib/load-languages.d.ts +1 -1
- package/package.json +20 -24
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { inject, LOCALE_ID, signal, isDevMode, Injectable, computed
|
|
2
|
+
import { inject, LOCALE_ID, signal, isDevMode, Injectable, computed } from '@angular/core';
|
|
3
3
|
import { UserSettingsLanguageService } from '@rxap/ngx-user';
|
|
4
4
|
import { ConfigService } from '@rxap/config';
|
|
5
5
|
import { registerLocaleData } from '@angular/common';
|
|
6
6
|
import { loadTranslations } from '@angular/localize';
|
|
7
7
|
import { xliff2js } from 'xliff/esm';
|
|
8
8
|
|
|
9
|
+
/**
|
|
10
|
+
* @deprecated removed
|
|
11
|
+
*/
|
|
9
12
|
class I18nService {
|
|
10
13
|
constructor() {
|
|
11
14
|
this.localId = inject(LOCALE_ID);
|
|
@@ -53,19 +56,19 @@ function LanguageInterceptor(request, next) {
|
|
|
53
56
|
class LanguageSelectorService {
|
|
54
57
|
constructor() {
|
|
55
58
|
this.config = inject(ConfigService);
|
|
56
|
-
this.i18nService = inject(I18nService);
|
|
57
59
|
this.languages = signal(this.config.get('i18n.languages', {}));
|
|
58
60
|
this.defaultLanguage = signal(this.config.get('i18n.defaultLanguage', Object.keys(this.languages())[0] ?? 'en'));
|
|
59
|
-
this.selectedLanguage = signal(this.
|
|
61
|
+
this.selectedLanguage = signal(localStorage.getItem("locale") ?? this.defaultLanguage());
|
|
60
62
|
this.hasLanguages = computed(() => Object.keys(this.languages()).length > 1);
|
|
61
|
-
effect(() => {
|
|
62
|
-
const currentLanguage = this.i18nService.currentLanguage();
|
|
63
|
-
this.selectedLanguage.set(currentLanguage);
|
|
64
|
-
}, { allowSignalWrites: true });
|
|
65
63
|
}
|
|
66
|
-
async setLanguage(language) {
|
|
67
|
-
if (language !== this.
|
|
68
|
-
|
|
64
|
+
async setLanguage(language, reload = false) {
|
|
65
|
+
if (language !== this.selectedLanguage()) {
|
|
66
|
+
if (Object.keys(this.languages()).includes(language)) {
|
|
67
|
+
localStorage.setItem("locale", language);
|
|
68
|
+
if (reload) {
|
|
69
|
+
location.reload();
|
|
70
|
+
}
|
|
71
|
+
}
|
|
69
72
|
}
|
|
70
73
|
}
|
|
71
74
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.1", ngImport: i0, type: LanguageSelectorService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
@@ -74,7 +77,7 @@ class LanguageSelectorService {
|
|
|
74
77
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.1", ngImport: i0, type: LanguageSelectorService, decorators: [{
|
|
75
78
|
type: Injectable,
|
|
76
79
|
args: [{ providedIn: 'root' }]
|
|
77
|
-
}]
|
|
80
|
+
}] });
|
|
78
81
|
|
|
79
82
|
// @ts-expect-error type definition do not exists
|
|
80
83
|
async function xliffToJson(translations) {
|
|
@@ -101,29 +104,49 @@ async function xliffToJson(translations) {
|
|
|
101
104
|
function isTranslationXml(xml) {
|
|
102
105
|
return !!xml && typeof xml === 'string' && xml.startsWith('<?xml') && xml.includes('<xliff');
|
|
103
106
|
}
|
|
104
|
-
async function
|
|
107
|
+
async function fetchTranslation(locale) {
|
|
105
108
|
let xml;
|
|
106
109
|
try {
|
|
107
110
|
xml = await fetch(`/i18n/${locale}.xlf`).then((r) => r.text());
|
|
108
111
|
if (!isTranslationXml(xml)) {
|
|
109
|
-
|
|
112
|
+
console.error(`Invalid XLIFF file for locale ${locale}`);
|
|
113
|
+
return null;
|
|
110
114
|
}
|
|
115
|
+
return xml;
|
|
111
116
|
}
|
|
112
117
|
catch (e) {
|
|
113
|
-
console.
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
118
|
+
console.warn(`Could not download XLIFF file for locale ${locale}: ${e.message}`);
|
|
119
|
+
}
|
|
120
|
+
return null;
|
|
121
|
+
}
|
|
122
|
+
async function fetchTranslations(locale, preferredLanguages, fallback) {
|
|
123
|
+
let xml;
|
|
124
|
+
let currentLocale = locale;
|
|
125
|
+
do {
|
|
126
|
+
xml = await fetchTranslation(currentLocale);
|
|
127
|
+
if (!xml) {
|
|
128
|
+
currentLocale = preferredLanguages.shift();
|
|
119
129
|
}
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
130
|
+
} while (!xml && currentLocale);
|
|
131
|
+
if (!xml) {
|
|
132
|
+
console.error(`Could not download XLIFF file for locale ${locale} or fallback ${fallback}`);
|
|
133
|
+
}
|
|
134
|
+
try {
|
|
135
|
+
xml = await fetch(`/i18n/${fallback}.xlf`).then((r) => r.text());
|
|
136
|
+
currentLocale = locale;
|
|
137
|
+
if (xml && !isTranslationXml(xml)) {
|
|
138
|
+
console.error(`Invalid XLIFF file for fallback locale ${fallback}`);
|
|
123
139
|
}
|
|
124
140
|
}
|
|
141
|
+
catch (e) {
|
|
142
|
+
console.warn(`Could not download XLIFF file for fallback locale ${fallback}: ${e.message}`);
|
|
143
|
+
}
|
|
144
|
+
if (!xml) {
|
|
145
|
+
console.error(`Could not download XLIFF file for locale ${locale} or preferred ${preferredLanguages.join(', ')} or fallback ${fallback}`);
|
|
146
|
+
return null;
|
|
147
|
+
}
|
|
125
148
|
if (!isTranslationXml(xml)) {
|
|
126
|
-
|
|
149
|
+
console.error(`Invalid XLIFF file for fallback locale ${currentLocale}`);
|
|
127
150
|
}
|
|
128
151
|
let json;
|
|
129
152
|
try {
|
|
@@ -131,35 +154,41 @@ async function fetchTranslations(locale, fallback) {
|
|
|
131
154
|
}
|
|
132
155
|
catch (e) {
|
|
133
156
|
console.error(`Could not parse XLIFF file for locale ${locale}: ${e.message}`);
|
|
134
|
-
|
|
157
|
+
return null;
|
|
135
158
|
}
|
|
136
|
-
return json;
|
|
159
|
+
return { json, locale: currentLocale ?? locale };
|
|
137
160
|
}
|
|
138
161
|
async function defaultLoadModule(locale) {
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
162
|
+
try {
|
|
163
|
+
// Load required locale module (needs to be adjusted for different locales)
|
|
164
|
+
let module = null;
|
|
165
|
+
switch (locale) {
|
|
166
|
+
case 'en':
|
|
167
|
+
module = await import('@angular/common/locales/en');
|
|
168
|
+
break;
|
|
169
|
+
case 'de':
|
|
170
|
+
module = await import('@angular/common/locales/de');
|
|
171
|
+
break;
|
|
172
|
+
}
|
|
173
|
+
if (module) {
|
|
174
|
+
registerLocaleData(module.default);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
catch (e) {
|
|
178
|
+
console.error(`Could not load locale module for locale ${locale}: ${e.message}`);
|
|
154
179
|
}
|
|
155
180
|
}
|
|
156
|
-
async function loadLanguages(loadModule = defaultLoadModule, locale = localStorage.getItem("locale") ||
|
|
181
|
+
async function loadLanguages(loadModule = defaultLoadModule, locale = localStorage.getItem("locale") || navigator.language.split('-')[0] || 'en', preferredLanguages = navigator.languages?.map((l) => l.split('-')[0]) ?? [], fallback = 'messages') {
|
|
157
182
|
// Fetch XLIFF translation file and transform to JSON format (JSON translations can be used directly)
|
|
158
|
-
const
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
183
|
+
const response = await fetchTranslations(locale, preferredLanguages, fallback);
|
|
184
|
+
if (response) {
|
|
185
|
+
// Initialize translation
|
|
186
|
+
loadTranslations(response.json);
|
|
187
|
+
locale = response.locale;
|
|
188
|
+
$localize.locale = locale;
|
|
189
|
+
localStorage.setItem("locale", locale);
|
|
190
|
+
await loadModule(locale);
|
|
191
|
+
}
|
|
163
192
|
return locale;
|
|
164
193
|
}
|
|
165
194
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rxap-ngx-localize.mjs","sources":["../../../../../packages/angular/localize/src/lib/i18n.service.ts","../../../../../packages/angular/localize/src/lib/language-interceptor.ts","../../../../../packages/angular/localize/src/lib/language-selector.service.ts","../../../../../packages/angular/localize/src/lib/xliff-to-json.ts","../../../../../packages/angular/localize/src/lib/load-languages.ts","../../../../../packages/angular/localize/src/lib/load-i18n-bootstrap-hook.ts","../../../../../packages/angular/localize/src/index.ts","../../../../../packages/angular/localize/src/rxap-ngx-localize.ts"],"sourcesContent":["import {\n inject,\n Injectable,\n isDevMode,\n LOCALE_ID,\n signal,\n Signal,\n} from '@angular/core';\nimport { UserSettingsLanguageService } from '@rxap/ngx-user';\n\n@Injectable({ providedIn: 'root' })\nexport class I18nService {\n\n private readonly localId: string = inject(LOCALE_ID);\n private readonly userSettingsLanguageService = inject(UserSettingsLanguageService);\n\n public readonly currentLanguage: Signal<string> = signal(this.localId.replace(/-[A-Z]+$/, ''));\n\n public async setLanguage(language: string) {\n await this.userSettingsLanguageService.setLanguage(language);\n if (!isDevMode()) {\n this.redirect(language);\n }\n if (typeof (this.currentLanguage as any)['set'] === 'function') {\n (this.currentLanguage as any).set(language);\n }\n }\n\n public redirect(next: string, current: string = this.currentLanguage()) {\n if (current === next) {\n console.warn('[I18nService] redirect not required - language unchanged');\n return;\n }\n const redirectUrl =\n location.origin +\n location.pathname.replace(new RegExp(`^/${ current }`), `/${ next }`) +\n location.search;\n console.log('[I18nService] redirect to: ' + redirectUrl);\n location.replace(redirectUrl);\n }\n\n}\n","import { HttpEvent, HttpHandlerFn, HttpRequest } from '@angular/common/http';\nimport {\n inject,\n LOCALE_ID,\n} from '@angular/core';\nimport { Observable } from 'rxjs';\n\nexport function LanguageInterceptor(\n request: HttpRequest<unknown>,\n next: HttpHandlerFn,\n): Observable<HttpEvent<unknown>> {\n\n const localId = inject(LOCALE_ID, { optional: true });\n\n if (localId) {\n request = request.clone({\n headers: request.headers.set('Accept-Language', localId),\n });\n }\n\n return next(request);\n\n}\n","import {\n computed,\n effect,\n inject,\n Injectable,\n Signal,\n signal,\n} from '@angular/core';\nimport {\n ConfigService,\n LanguagesConfig,\n} from '@rxap/config';\nimport { I18nService } from './i18n.service';\n\n@Injectable({ providedIn: 'root' })\nexport class LanguageSelectorService {\n private readonly config = inject(ConfigService);\n private readonly i18nService = inject(I18nService);\n\n public readonly languages: Signal<LanguagesConfig> = signal(this.config.get<LanguagesConfig>('i18n.languages', {}));\n public readonly defaultLanguage: Signal<string> = signal(this.config.get('i18n.defaultLanguage', Object.keys(this.languages())[0] ?? 'en'));\n public readonly selectedLanguage = signal(this.i18nService.currentLanguage());\n\n public readonly hasLanguages = computed(() => Object.keys(this.languages()).length > 1);\n\n constructor() {\n effect(() => {\n const currentLanguage = this.i18nService.currentLanguage();\n this.selectedLanguage.set(currentLanguage);\n }, { allowSignalWrites: true });\n }\n\n public async setLanguage(language: string) {\n if (language !== this.i18nService.currentLanguage()) {\n await this.i18nService.setLanguage(language);\n }\n }\n\n}\n","// @ts-expect-error type definition do not exists\nimport { xliff2js } from 'xliff/esm';\n\nexport async function xliffToJson(translations: string) {\n const parserResult = await xliff2js(translations);\n const xliffContent = parserResult.resources[\"ngi18n\"];\n\n return Object.keys(xliffContent).reduce((result: any, current) => {\n const translation = xliffContent[current].target;\n if (typeof translation === \"string\") {\n result[current] = translation;\n } else if (Array.isArray(translation)) {\n result[current] = translation\n .map((entry) =>\n typeof entry === \"string\" ? entry : `{{${entry.Standalone.id}}}`,\n )\n .map((entry) => entry.replace(\"{{\", \"{$\").replace(\"}}\", \"}\"))\n .join(\"\");\n } else {\n throw new Error(\"Could not parse XLIFF: \" + JSON.stringify(translation));\n }\n return result;\n }, {});\n}\n","import { registerLocaleData } from '@angular/common';\nimport { loadTranslations } from '@angular/localize';\nimport { xliffToJson } from './xliff-to-json';\n\nfunction isTranslationXml(xml: string): boolean {\n return !!xml && typeof xml === 'string' && xml.startsWith('<?xml') && xml.includes('<xliff');\n}\n\nasync function fetchTranslations(locale: string, fallback: string) {\n\n let xml: string;\n try {\n xml = await fetch(`/i18n/${ locale }.xlf`).then((r) => r.text());\n if (!isTranslationXml(xml)) {\n throw new Error('Invalid XLIFF file');\n }\n } catch (e: any) {\n console.error(`Could not download XLIFF file for locale ${ locale }: ${ e.message }`);\n try {\n xml = await fetch(`/i18n/${ fallback }.xlf`).then((r) => r.text());\n if (!isTranslationXml(xml)) {\n throw new Error('Invalid XLIFF file');\n }\n } catch (e: any) {\n console.error(`Could not download XLIFF file for fallback locale ${ fallback }: ${ e.message }`);\n throw new Error(`Could not download XLIFF file for locale ${ locale } or fallback ${ fallback }: ${ e.message }`);\n }\n }\n\n if (!isTranslationXml(xml)) {\n throw new Error('Invalid XLIFF file');\n }\n\n let json: any;\n try {\n json = xliffToJson(xml);\n } catch (e: any) {\n console.error(`Could not parse XLIFF file for locale ${ locale }: ${ e.message }`);\n throw new Error(`Could not parse XLIFF file for locale ${ locale }: ${ e.message }`);\n }\n\n return json;\n\n}\n\nasync function defaultLoadModule(locale: string) {\n\n // Load required locale module (needs to be adjusted for different locales)\n let module: { default: any } | null = null;\n switch (locale) {\n\n case 'en':\n module = await import('@angular/common/locales/en');\n break;\n\n case 'de':\n module = await import('@angular/common/locales/de');\n break;\n\n case 'fr':\n module = await import('@angular/common/locales/fr');\n break;\n\n }\n if (module) {\n registerLocaleData(module.default);\n }\n\n}\n\nexport async function loadLanguages(\n loadModule: (locale: string) => Promise<void> = defaultLoadModule,\n locale: string = localStorage.getItem(\"locale\") || \"en\",\n fallback = 'messages'\n) {\n // Fetch XLIFF translation file and transform to JSON format (JSON translations can be used directly)\n const json = await fetchTranslations(locale, fallback);\n\n // Initialize translation\n loadTranslations(json);\n $localize.locale = locale;\n\n await loadModule(locale);\n\n return locale;\n}\n","import {\n ApplicationConfig,\n LOCALE_ID,\n} from '@angular/core';\nimport { loadLanguages } from './load-languages';\n\nexport async function loadI18nBootstrapHook(options: Partial<ApplicationConfig>): Promise<void> {\n\n try {\n const locale = await loadLanguages();\n console.debug('locale', locale);\n options.providers ??= [];\n options.providers.push({\n provide: LOCALE_ID,\n useValue: locale\n });\n } catch (e: any) {\n console.error(`Failed to load language translations: ${e.message}`);\n }\n\n}\n","// region \nexport * from './lib/i18n.service';\nexport * from './lib/language-interceptor';\nexport * from './lib/language-selector.service';\nexport * from './lib/load-i18n-bootstrap-hook';\nexport * from './lib/load-languages';\nexport * from './lib/xliff-to-json';\n// endregion\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"rxap-ngx-localize.mjs","sources":["../../../../../packages/angular/localize/src/lib/i18n.service.ts","../../../../../packages/angular/localize/src/lib/language-interceptor.ts","../../../../../packages/angular/localize/src/lib/language-selector.service.ts","../../../../../packages/angular/localize/src/lib/xliff-to-json.ts","../../../../../packages/angular/localize/src/lib/load-languages.ts","../../../../../packages/angular/localize/src/lib/load-i18n-bootstrap-hook.ts","../../../../../packages/angular/localize/src/index.ts","../../../../../packages/angular/localize/src/rxap-ngx-localize.ts"],"sourcesContent":["import {\n inject,\n Injectable,\n isDevMode,\n LOCALE_ID,\n signal,\n Signal,\n} from '@angular/core';\nimport { UserSettingsLanguageService } from '@rxap/ngx-user';\n\n/**\n * @deprecated removed\n */\n@Injectable({ providedIn: 'root' })\nexport class I18nService {\n\n private readonly localId: string = inject(LOCALE_ID);\n private readonly userSettingsLanguageService = inject(UserSettingsLanguageService);\n\n public readonly currentLanguage: Signal<string> = signal(this.localId.replace(/-[A-Z]+$/, ''));\n\n public async setLanguage(language: string) {\n await this.userSettingsLanguageService.setLanguage(language);\n if (!isDevMode()) {\n this.redirect(language);\n }\n if (typeof (this.currentLanguage as any)['set'] === 'function') {\n (this.currentLanguage as any).set(language);\n }\n }\n\n public redirect(next: string, current: string = this.currentLanguage()) {\n if (current === next) {\n console.warn('[I18nService] redirect not required - language unchanged');\n return;\n }\n const redirectUrl =\n location.origin +\n location.pathname.replace(new RegExp(`^/${ current }`), `/${ next }`) +\n location.search;\n console.log('[I18nService] redirect to: ' + redirectUrl);\n location.replace(redirectUrl);\n }\n\n}\n","import { HttpEvent, HttpHandlerFn, HttpRequest } from '@angular/common/http';\nimport {\n inject,\n LOCALE_ID,\n} from '@angular/core';\nimport { Observable } from 'rxjs';\n\nexport function LanguageInterceptor(\n request: HttpRequest<unknown>,\n next: HttpHandlerFn,\n): Observable<HttpEvent<unknown>> {\n\n const localId = inject(LOCALE_ID, { optional: true });\n\n if (localId) {\n request = request.clone({\n headers: request.headers.set('Accept-Language', localId),\n });\n }\n\n return next(request);\n\n}\n","import {\n computed,\n inject,\n Injectable,\n Signal,\n signal,\n} from '@angular/core';\nimport {\n ConfigService,\n LanguagesConfig,\n} from '@rxap/config';\n\n@Injectable({ providedIn: 'root' })\nexport class LanguageSelectorService {\n private readonly config = inject(ConfigService);\n\n public readonly languages: Signal<LanguagesConfig> = signal(this.config.get<LanguagesConfig>('i18n.languages', {}));\n public readonly defaultLanguage: Signal<string> = signal(this.config.get('i18n.defaultLanguage', Object.keys(this.languages())[0] ?? 'en'));\n public readonly selectedLanguage = signal(localStorage.getItem(\"locale\") ?? this.defaultLanguage());\n\n public readonly hasLanguages = computed(() => Object.keys(this.languages()).length > 1);\n\n public async setLanguage(language: string, reload = false) {\n if (language !== this.selectedLanguage()) {\n if (Object.keys(this.languages()).includes(language)) {\n localStorage.setItem(\"locale\", language);\n if (reload) {\n location.reload();\n }\n }\n }\n }\n\n}\n","// @ts-expect-error type definition do not exists\nimport { xliff2js } from 'xliff/esm';\n\nexport async function xliffToJson(translations: string) {\n const parserResult = await xliff2js(translations);\n const xliffContent = parserResult.resources[\"ngi18n\"];\n\n return Object.keys(xliffContent).reduce((result: any, current) => {\n const translation = xliffContent[current].target;\n if (typeof translation === \"string\") {\n result[current] = translation;\n } else if (Array.isArray(translation)) {\n result[current] = translation\n .map((entry) =>\n typeof entry === \"string\" ? entry : `{{${entry.Standalone.id}}}`,\n )\n .map((entry) => entry.replace(\"{{\", \"{$\").replace(\"}}\", \"}\"))\n .join(\"\");\n } else {\n throw new Error(\"Could not parse XLIFF: \" + JSON.stringify(translation));\n }\n return result;\n }, {});\n}\n","import { registerLocaleData } from '@angular/common';\nimport { loadTranslations } from '@angular/localize';\nimport { xliffToJson } from './xliff-to-json';\n\nfunction isTranslationXml(xml: string): boolean {\n return !!xml && typeof xml === 'string' && xml.startsWith('<?xml') && xml.includes('<xliff');\n}\n\nasync function fetchTranslation(locale: string): Promise<string | null> {\n\n let xml: string;\n try {\n xml = await fetch(`/i18n/${ locale }.xlf`).then((r) => r.text());\n if (!isTranslationXml(xml)) {\n console.error(`Invalid XLIFF file for locale ${ locale }`);\n return null;\n }\n return xml;\n } catch (e: any) {\n console.warn(`Could not download XLIFF file for locale ${ locale }: ${ e.message }`);\n }\n\n return null;\n\n}\n\nasync function fetchTranslations(locale: string, preferredLanguages: string[], fallback: string): Promise<{ json: any, locale: string } | null> {\n let xml: string | null;\n let currentLocale: string | undefined = locale;\n do {\n xml = await fetchTranslation(currentLocale);\n if (!xml) {\n currentLocale = preferredLanguages.shift();\n }\n } while (!xml && currentLocale);\n\n if (!xml) {\n console.error(`Could not download XLIFF file for locale ${ locale } or fallback ${ fallback }`);\n }\n\n try {\n xml = await fetch(`/i18n/${ fallback }.xlf`).then((r) => r.text());\n currentLocale = locale;\n if (xml && !isTranslationXml(xml)) {\n console.error(`Invalid XLIFF file for fallback locale ${ fallback }`);\n }\n } catch (e: any) {\n console.warn(`Could not download XLIFF file for fallback locale ${ fallback }: ${ e.message }`);\n }\n\n if (!xml) {\n console.error(`Could not download XLIFF file for locale ${ locale } or preferred ${preferredLanguages.join(', ')} or fallback ${ fallback }`);\n return null;\n }\n\n if (!isTranslationXml(xml)) {\n console.error(`Invalid XLIFF file for fallback locale ${ currentLocale }`);\n }\n\n let json: any;\n try {\n json = xliffToJson(xml);\n } catch (e: any) {\n console.error(`Could not parse XLIFF file for locale ${ locale }: ${ e.message }`);\n return null;\n }\n\n return { json, locale: currentLocale ?? locale };\n\n}\n\nasync function defaultLoadModule(locale: string) {\n\n try {\n // Load required locale module (needs to be adjusted for different locales)\n let module: { default: any } | null = null;\n switch (locale) {\n\n case 'en':\n module = await import('@angular/common/locales/en');\n break;\n\n case 'de':\n module = await import('@angular/common/locales/de');\n break;\n\n }\n if (module) {\n registerLocaleData(module.default);\n }\n } catch (e: any) {\n console.error(`Could not load locale module for locale ${ locale }: ${ e.message }`);\n }\n\n}\n\nexport async function loadLanguages(\n loadModule: (locale: string) => Promise<void> = defaultLoadModule,\n locale: string = localStorage.getItem(\"locale\") || navigator.language.split('-')[0] || 'en',\n preferredLanguages = navigator.languages?.map((l) => l.split('-')[0]) ?? [],\n fallback = 'messages'\n) {\n // Fetch XLIFF translation file and transform to JSON format (JSON translations can be used directly)\n const response = await fetchTranslations(locale, preferredLanguages, fallback);\n\n if (response) {\n // Initialize translation\n loadTranslations(response.json);\n locale = response.locale;\n $localize.locale = locale;\n localStorage.setItem(\"locale\", locale);\n await loadModule(locale);\n }\n\n return locale;\n}\n","import {\n ApplicationConfig,\n LOCALE_ID,\n} from '@angular/core';\nimport { loadLanguages } from './load-languages';\n\nexport async function loadI18nBootstrapHook(options: Partial<ApplicationConfig>): Promise<void> {\n\n try {\n const locale = await loadLanguages();\n console.debug('locale', locale);\n options.providers ??= [];\n options.providers.push({\n provide: LOCALE_ID,\n useValue: locale\n });\n } catch (e: any) {\n console.error(`Failed to load language translations: ${e.message}`);\n }\n\n}\n","// region \nexport * from './lib/i18n.service';\nexport * from './lib/language-interceptor';\nexport * from './lib/language-selector.service';\nexport * from './lib/load-i18n-bootstrap-hook';\nexport * from './lib/load-languages';\nexport * from './lib/xliff-to-json';\n// endregion\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
package/lib/i18n.service.d.ts
CHANGED
|
@@ -3,13 +3,11 @@ import { LanguagesConfig } from '@rxap/config';
|
|
|
3
3
|
import * as i0 from "@angular/core";
|
|
4
4
|
export declare class LanguageSelectorService {
|
|
5
5
|
private readonly config;
|
|
6
|
-
private readonly i18nService;
|
|
7
6
|
readonly languages: Signal<LanguagesConfig>;
|
|
8
7
|
readonly defaultLanguage: Signal<string>;
|
|
9
8
|
readonly selectedLanguage: import("@angular/core").WritableSignal<string>;
|
|
10
9
|
readonly hasLanguages: Signal<boolean>;
|
|
11
|
-
|
|
12
|
-
setLanguage(language: string): Promise<void>;
|
|
10
|
+
setLanguage(language: string, reload?: boolean): Promise<void>;
|
|
13
11
|
static ɵfac: i0.ɵɵFactoryDeclaration<LanguageSelectorService, never>;
|
|
14
12
|
static ɵprov: i0.ɵɵInjectableDeclaration<LanguageSelectorService>;
|
|
15
13
|
}
|
package/lib/load-languages.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare function loadLanguages(loadModule?: (locale: string) => Promise<void>, locale?: string, fallback?: string): Promise<string>;
|
|
1
|
+
export declare function loadLanguages(loadModule?: (locale: string) => Promise<void>, locale?: string, preferredLanguages?: string[], fallback?: string): Promise<string>;
|
package/package.json
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "19.1.0-dev.
|
|
2
|
+
"version": "19.1.0-dev.4",
|
|
3
3
|
"name": "@rxap/ngx-localize",
|
|
4
4
|
"description": "This package provides internationalization (i18n) support for Angular applications, including services for language management, an HTTP interceptor for setting the `Accept-Language` header, and a language selector component. It allows you to set and manage the current language of your application, redirect users based on their language preference, and configure available languages. The package also includes an init generator to handle peer dependencies.\n",
|
|
5
5
|
"license": "GPL-3.0-or-later",
|
|
@@ -11,8 +11,8 @@
|
|
|
11
11
|
"peerDependencies": {
|
|
12
12
|
"@angular/common": "^19.2.1",
|
|
13
13
|
"@angular/core": "^19.2.1",
|
|
14
|
-
"@rxap/config": "^19.0.
|
|
15
|
-
"@rxap/ngx-user": "^19.0.
|
|
14
|
+
"@rxap/config": "^19.1.0-dev.2",
|
|
15
|
+
"@rxap/ngx-user": "^19.0.4-dev.0",
|
|
16
16
|
"rxjs": "^7.8.1"
|
|
17
17
|
},
|
|
18
18
|
"author": {
|
|
@@ -35,13 +35,9 @@
|
|
|
35
35
|
],
|
|
36
36
|
"nx-migrations": {
|
|
37
37
|
"packageGroup": [
|
|
38
|
-
{
|
|
39
|
-
"package": "@angular/animations",
|
|
40
|
-
"version": "19.2.1"
|
|
41
|
-
},
|
|
42
38
|
{
|
|
43
39
|
"package": "@angular/cdk",
|
|
44
|
-
"version": "19.
|
|
40
|
+
"version": "19.2.2"
|
|
45
41
|
},
|
|
46
42
|
{
|
|
47
43
|
"package": "@angular/common",
|
|
@@ -57,7 +53,7 @@
|
|
|
57
53
|
},
|
|
58
54
|
{
|
|
59
55
|
"package": "@angular/material",
|
|
60
|
-
"version": "19.
|
|
56
|
+
"version": "19.2.2"
|
|
61
57
|
},
|
|
62
58
|
{
|
|
63
59
|
"package": "@angular/platform-browser",
|
|
@@ -65,59 +61,59 @@
|
|
|
65
61
|
},
|
|
66
62
|
{
|
|
67
63
|
"package": "@rxap/config",
|
|
68
|
-
"version": "19.0.
|
|
64
|
+
"version": "19.1.0-dev.2"
|
|
69
65
|
},
|
|
70
66
|
{
|
|
71
67
|
"package": "@rxap/data-source",
|
|
72
|
-
"version": "19.0.
|
|
68
|
+
"version": "19.1.0-dev.2"
|
|
73
69
|
},
|
|
74
70
|
{
|
|
75
71
|
"package": "@rxap/data-structure-tree",
|
|
76
|
-
"version": "1.1.
|
|
72
|
+
"version": "1.1.16-dev.0"
|
|
77
73
|
},
|
|
78
74
|
{
|
|
79
75
|
"package": "@rxap/definition",
|
|
80
|
-
"version": "19.0.
|
|
76
|
+
"version": "19.0.4-dev.0"
|
|
81
77
|
},
|
|
82
78
|
{
|
|
83
79
|
"package": "@rxap/environment",
|
|
84
|
-
"version": "19.0.
|
|
80
|
+
"version": "19.0.4-dev.0"
|
|
85
81
|
},
|
|
86
82
|
{
|
|
87
83
|
"package": "@rxap/mixin",
|
|
88
|
-
"version": "16.0.
|
|
84
|
+
"version": "16.0.14-dev.0"
|
|
89
85
|
},
|
|
90
86
|
{
|
|
91
87
|
"package": "@rxap/ngx-pub-sub",
|
|
92
|
-
"version": "19.0.
|
|
88
|
+
"version": "19.0.4-dev.0"
|
|
93
89
|
},
|
|
94
90
|
{
|
|
95
91
|
"package": "@rxap/ngx-user",
|
|
96
|
-
"version": "19.0.
|
|
92
|
+
"version": "19.0.4-dev.0"
|
|
97
93
|
},
|
|
98
94
|
{
|
|
99
95
|
"package": "@rxap/open-api",
|
|
100
|
-
"version": "19.0.
|
|
96
|
+
"version": "19.1.0-dev.2"
|
|
101
97
|
},
|
|
102
98
|
{
|
|
103
99
|
"package": "@rxap/pattern",
|
|
104
|
-
"version": "1.1.
|
|
100
|
+
"version": "1.1.14-dev.0"
|
|
105
101
|
},
|
|
106
102
|
{
|
|
107
103
|
"package": "@rxap/reflect-metadata",
|
|
108
|
-
"version": "1.0.
|
|
104
|
+
"version": "1.0.15-dev.0"
|
|
109
105
|
},
|
|
110
106
|
{
|
|
111
107
|
"package": "@rxap/remote-method",
|
|
112
|
-
"version": "19.0.
|
|
108
|
+
"version": "19.0.4-dev.0"
|
|
113
109
|
},
|
|
114
110
|
{
|
|
115
111
|
"package": "@rxap/rxjs",
|
|
116
|
-
"version": "1.1.
|
|
112
|
+
"version": "1.1.16-dev.0"
|
|
117
113
|
},
|
|
118
114
|
{
|
|
119
115
|
"package": "@rxap/utilities",
|
|
120
|
-
"version": "16.4.
|
|
116
|
+
"version": "16.4.4-dev.0"
|
|
121
117
|
}
|
|
122
118
|
]
|
|
123
119
|
},
|
|
@@ -132,7 +128,7 @@
|
|
|
132
128
|
},
|
|
133
129
|
"schematics": "./generators.json",
|
|
134
130
|
"sideEffects": false,
|
|
135
|
-
"gitHead": "
|
|
131
|
+
"gitHead": "be694d79f5cdf8ae9d37bf304a086dfe1db9e09b",
|
|
136
132
|
"module": "fesm2022/rxap-ngx-localize.mjs",
|
|
137
133
|
"typings": "index.d.ts",
|
|
138
134
|
"exports": {
|