@digitaldefiance/i18n-lib 1.0.32 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +440 -4
- package/dist/component-definition.d.ts +11 -0
- package/dist/component-definition.js +2 -0
- package/dist/component-registration.d.ts +9 -0
- package/dist/component-registration.js +2 -0
- package/dist/component-registry.d.ts +64 -0
- package/dist/component-registry.js +238 -0
- package/dist/context.d.ts +2 -1
- package/dist/core-i18n.d.ts +330 -0
- package/dist/core-i18n.js +435 -0
- package/dist/core-language.d.ts +13 -0
- package/dist/core-language.js +17 -0
- package/dist/core-string-key.d.ts +39 -0
- package/dist/core-string-key.js +47 -0
- package/dist/default-config.d.ts +2 -1
- package/dist/default-config.js +24 -24
- package/dist/enum-registry.d.ts +10 -1
- package/dist/enum-registry.js +31 -4
- package/dist/i18n-config.d.ts +20 -0
- package/dist/i18n-config.js +2 -0
- package/dist/i18n-context.d.ts +14 -0
- package/dist/i18n-context.js +2 -0
- package/dist/i18n-engine.d.ts +9 -2
- package/dist/i18n-engine.js +16 -13
- package/dist/index.d.ts +21 -1
- package/dist/index.js +25 -2
- package/dist/language-definition.d.ts +13 -0
- package/dist/language-definition.js +2 -0
- package/dist/language-registry.d.ts +106 -0
- package/dist/language-registry.js +194 -0
- package/dist/plugin-i18n-engine.d.ts +126 -0
- package/dist/plugin-i18n-engine.js +266 -0
- package/dist/registry-config.d.ts +14 -0
- package/dist/registry-config.js +2 -0
- package/dist/registry-context.d.ts +12 -0
- package/dist/registry-context.js +2 -0
- package/dist/registry-error-type.d.ts +12 -0
- package/dist/registry-error-type.js +16 -0
- package/dist/registry-error.d.ts +19 -0
- package/dist/registry-error.js +44 -0
- package/dist/translation-request.d.ts +9 -0
- package/dist/translation-request.js +2 -0
- package/dist/translation-response.d.ts +8 -0
- package/dist/translation-response.js +2 -0
- package/dist/typed-error.d.ts +63 -3
- package/dist/typed-error.js +230 -2
- package/dist/types.d.ts +42 -29
- package/dist/validation-config.d.ts +11 -0
- package/dist/validation-config.js +2 -0
- package/dist/validation-result.d.ts +12 -0
- package/dist/validation-result.js +2 -0
- package/package.json +2 -1
package/dist/default-config.js
CHANGED
|
@@ -40,56 +40,56 @@ const getConfig = (constants, timezone, adminTimezone) => ({
|
|
|
40
40
|
strings: {
|
|
41
41
|
[DefaultLanguage.EnglishUS]: {
|
|
42
42
|
[DefaultStringKey.Common_Test]: 'Test',
|
|
43
|
-
[DefaultStringKey.Error_InstanceAlreadyExistsTemplate]:
|
|
44
|
-
[DefaultStringKey.Error_InstanceNotFoundTemplate]:
|
|
43
|
+
[DefaultStringKey.Error_InstanceAlreadyExistsTemplate]: "Instance with key '{key}' already exists",
|
|
44
|
+
[DefaultStringKey.Error_InstanceNotFoundTemplate]: "Instance with key '{key}' not found",
|
|
45
45
|
[DefaultStringKey.Error_MissingStringCollectionTemplate]: 'Missing string collection for language: {language}',
|
|
46
|
-
[DefaultStringKey.Error_MissingTranslationTemplate]:
|
|
47
|
-
[DefaultStringKey.Error_DefaultLanguageNoCollectionTemplate]:
|
|
46
|
+
[DefaultStringKey.Error_MissingTranslationTemplate]: "Missing translation for key '{key}' in language '{language}'",
|
|
47
|
+
[DefaultStringKey.Error_DefaultLanguageNoCollectionTemplate]: "Default language '{language}' has no string collection",
|
|
48
48
|
[DefaultStringKey.Error_MissingTranslationKeyTemplate]: 'Missing translation key for type: {type}',
|
|
49
49
|
},
|
|
50
50
|
[DefaultLanguage.EnglishUK]: {
|
|
51
51
|
[DefaultStringKey.Common_Test]: 'Test',
|
|
52
|
-
[DefaultStringKey.Error_InstanceAlreadyExistsTemplate]:
|
|
53
|
-
[DefaultStringKey.Error_InstanceNotFoundTemplate]:
|
|
52
|
+
[DefaultStringKey.Error_InstanceAlreadyExistsTemplate]: "Instance with key '{key}' already exists",
|
|
53
|
+
[DefaultStringKey.Error_InstanceNotFoundTemplate]: "Instance with key '{key}' not found",
|
|
54
54
|
[DefaultStringKey.Error_MissingStringCollectionTemplate]: 'Missing string collection for language: {language}',
|
|
55
|
-
[DefaultStringKey.Error_MissingTranslationTemplate]:
|
|
56
|
-
[DefaultStringKey.Error_DefaultLanguageNoCollectionTemplate]:
|
|
55
|
+
[DefaultStringKey.Error_MissingTranslationTemplate]: "Missing translation for key '{key}' in language '{language}'",
|
|
56
|
+
[DefaultStringKey.Error_DefaultLanguageNoCollectionTemplate]: "Default language '{language}' has no string collection",
|
|
57
57
|
[DefaultStringKey.Error_MissingTranslationKeyTemplate]: 'Missing translation key for type: {type}',
|
|
58
58
|
},
|
|
59
59
|
[DefaultLanguage.French]: {
|
|
60
60
|
[DefaultStringKey.Common_Test]: 'Test',
|
|
61
|
-
[DefaultStringKey.Error_InstanceAlreadyExistsTemplate]:
|
|
62
|
-
[DefaultStringKey.Error_InstanceNotFoundTemplate]:
|
|
61
|
+
[DefaultStringKey.Error_InstanceAlreadyExistsTemplate]: "Instance avec clé '{key}' existe déjà",
|
|
62
|
+
[DefaultStringKey.Error_InstanceNotFoundTemplate]: "Instance avec clé '{key}' introuvable",
|
|
63
63
|
[DefaultStringKey.Error_MissingStringCollectionTemplate]: 'Collection de chaînes manquante pour la langue: {language}',
|
|
64
|
-
[DefaultStringKey.Error_MissingTranslationTemplate]:
|
|
65
|
-
[DefaultStringKey.Error_DefaultLanguageNoCollectionTemplate]:
|
|
64
|
+
[DefaultStringKey.Error_MissingTranslationTemplate]: "Traduction manquante pour la clé '{key}' dans la langue '{language}'",
|
|
65
|
+
[DefaultStringKey.Error_DefaultLanguageNoCollectionTemplate]: "La langue par défaut '{language}' n'a pas de collection de chaînes",
|
|
66
66
|
[DefaultStringKey.Error_MissingTranslationKeyTemplate]: 'Clé de traduction manquante pour le type: {type}',
|
|
67
67
|
},
|
|
68
68
|
[DefaultLanguage.MandarinChinese]: {
|
|
69
69
|
[DefaultStringKey.Common_Test]: '测试',
|
|
70
|
-
[DefaultStringKey.Error_InstanceAlreadyExistsTemplate]: '
|
|
71
|
-
[DefaultStringKey.Error_InstanceNotFoundTemplate]: '
|
|
70
|
+
[DefaultStringKey.Error_InstanceAlreadyExistsTemplate]: "键为'{key}'的实例已存在",
|
|
71
|
+
[DefaultStringKey.Error_InstanceNotFoundTemplate]: "未找到键为'{key}'的实例",
|
|
72
72
|
[DefaultStringKey.Error_MissingStringCollectionTemplate]: '缺少语言的字符串集合: {language}',
|
|
73
|
-
[DefaultStringKey.Error_MissingTranslationTemplate]: '
|
|
74
|
-
[DefaultStringKey.Error_DefaultLanguageNoCollectionTemplate]: '
|
|
73
|
+
[DefaultStringKey.Error_MissingTranslationTemplate]: "在语言'{language}'中缺少键'{key}'的翻译",
|
|
74
|
+
[DefaultStringKey.Error_DefaultLanguageNoCollectionTemplate]: "默认语言'{language}'没有字符串集合",
|
|
75
75
|
[DefaultStringKey.Error_MissingTranslationKeyTemplate]: '类型缺少翻译键: {type}',
|
|
76
76
|
},
|
|
77
77
|
[DefaultLanguage.Spanish]: {
|
|
78
78
|
[DefaultStringKey.Common_Test]: 'Prueba',
|
|
79
|
-
[DefaultStringKey.Error_InstanceAlreadyExistsTemplate]:
|
|
80
|
-
[DefaultStringKey.Error_InstanceNotFoundTemplate]:
|
|
79
|
+
[DefaultStringKey.Error_InstanceAlreadyExistsTemplate]: "La instancia con clave '{key}' ya existe",
|
|
80
|
+
[DefaultStringKey.Error_InstanceNotFoundTemplate]: "Instancia con clave '{key}' no encontrada",
|
|
81
81
|
[DefaultStringKey.Error_MissingStringCollectionTemplate]: 'Falta colección de cadenas para el idioma: {language}',
|
|
82
|
-
[DefaultStringKey.Error_MissingTranslationTemplate]:
|
|
83
|
-
[DefaultStringKey.Error_DefaultLanguageNoCollectionTemplate]:
|
|
82
|
+
[DefaultStringKey.Error_MissingTranslationTemplate]: "Falta traducción para la clave '{key}' en el idioma '{language}'",
|
|
83
|
+
[DefaultStringKey.Error_DefaultLanguageNoCollectionTemplate]: "El idioma predeterminado '{language}' no tiene colección de cadenas",
|
|
84
84
|
[DefaultStringKey.Error_MissingTranslationKeyTemplate]: 'Falta clave de traducción para el tipo: {type}',
|
|
85
85
|
},
|
|
86
86
|
[DefaultLanguage.Ukrainian]: {
|
|
87
87
|
[DefaultStringKey.Common_Test]: 'Тест',
|
|
88
|
-
[DefaultStringKey.Error_InstanceAlreadyExistsTemplate]:
|
|
89
|
-
[DefaultStringKey.Error_InstanceNotFoundTemplate]:
|
|
88
|
+
[DefaultStringKey.Error_InstanceAlreadyExistsTemplate]: "Екземпляр з ключем '{key}' вже існує",
|
|
89
|
+
[DefaultStringKey.Error_InstanceNotFoundTemplate]: "Екземпляр з ключем '{key}' не знайдено",
|
|
90
90
|
[DefaultStringKey.Error_MissingStringCollectionTemplate]: 'Відсутня колекція рядків для мови: {language}',
|
|
91
|
-
[DefaultStringKey.Error_MissingTranslationTemplate]:
|
|
92
|
-
[DefaultStringKey.Error_DefaultLanguageNoCollectionTemplate]:
|
|
91
|
+
[DefaultStringKey.Error_MissingTranslationTemplate]: "Відсутній переклад для ключа '{key}' в мові '{language}'",
|
|
92
|
+
[DefaultStringKey.Error_DefaultLanguageNoCollectionTemplate]: "Мова за замовчуванням '{language}' не має колекції рядків",
|
|
93
93
|
[DefaultStringKey.Error_MissingTranslationKeyTemplate]: 'Відсутній ключ перекладу для типу: {type}',
|
|
94
94
|
},
|
|
95
95
|
},
|
package/dist/enum-registry.d.ts
CHANGED
|
@@ -2,9 +2,12 @@ import { EnumLanguageTranslation } from './types';
|
|
|
2
2
|
/**
|
|
3
3
|
* Registry for managing enum translations across multiple languages.
|
|
4
4
|
*/
|
|
5
|
-
export declare class EnumTranslationRegistry<TLanguage extends string> {
|
|
5
|
+
export declare class EnumTranslationRegistry<TStringKey extends string, TLanguage extends string> {
|
|
6
6
|
protected translations: Map<any, Partial<{ [L in TLanguage]: import("./types").EnumTranslation<any>; }>>;
|
|
7
7
|
protected enumNames: WeakMap<any, string>;
|
|
8
|
+
protected availableLanguages: Set<TLanguage>;
|
|
9
|
+
protected translateFn?: (key: TStringKey, vars?: Record<string, any>) => string;
|
|
10
|
+
constructor(availableLanguages: TLanguage[], translateFn?: (key: TStringKey, vars?: Record<string, any>) => string);
|
|
8
11
|
/**
|
|
9
12
|
* Registers an enumeration with its translations and a name.
|
|
10
13
|
* @param enumObj The enumeration object
|
|
@@ -32,4 +35,10 @@ export declare class EnumTranslationRegistry<TLanguage extends string> {
|
|
|
32
35
|
* @returns True if translations exist, false otherwise
|
|
33
36
|
*/
|
|
34
37
|
has(enumObj: any): boolean;
|
|
38
|
+
/**
|
|
39
|
+
* Validates that enum translations only contain available languages.
|
|
40
|
+
* @param translations The translations to validate
|
|
41
|
+
* @param enumName The name of the enumeration for error messages
|
|
42
|
+
*/
|
|
43
|
+
private validateTranslations;
|
|
35
44
|
}
|
package/dist/enum-registry.js
CHANGED
|
@@ -5,9 +5,11 @@ exports.EnumTranslationRegistry = void 0;
|
|
|
5
5
|
* Registry for managing enum translations across multiple languages.
|
|
6
6
|
*/
|
|
7
7
|
class EnumTranslationRegistry {
|
|
8
|
-
constructor() {
|
|
8
|
+
constructor(availableLanguages, translateFn) {
|
|
9
9
|
this.translations = new Map();
|
|
10
10
|
this.enumNames = new WeakMap();
|
|
11
|
+
this.availableLanguages = new Set(availableLanguages);
|
|
12
|
+
this.translateFn = translateFn;
|
|
11
13
|
}
|
|
12
14
|
/**
|
|
13
15
|
* Registers an enumeration with its translations and a name.
|
|
@@ -16,6 +18,7 @@ class EnumTranslationRegistry {
|
|
|
16
18
|
* @param enumName The name of the enumeration
|
|
17
19
|
*/
|
|
18
20
|
register(enumObj, translations, enumName) {
|
|
21
|
+
this.validateTranslations(translations, enumName);
|
|
19
22
|
this.translations.set(enumObj, translations);
|
|
20
23
|
this.enumNames.set(enumObj, enumName);
|
|
21
24
|
}
|
|
@@ -29,11 +32,17 @@ class EnumTranslationRegistry {
|
|
|
29
32
|
translate(enumObj, value, language) {
|
|
30
33
|
const translations = this.translations.get(enumObj);
|
|
31
34
|
if (!translations) {
|
|
32
|
-
|
|
35
|
+
const message = this.translateFn
|
|
36
|
+
? this.translateFn('Error_EnumNotFoundTemplate', { enumName: this.getEnumName(enumObj) })
|
|
37
|
+
: `No translations found for enum: ${this.getEnumName(enumObj)}`;
|
|
38
|
+
throw new Error(message);
|
|
33
39
|
}
|
|
34
40
|
const langTranslations = translations[language];
|
|
35
41
|
if (!langTranslations) {
|
|
36
|
-
|
|
42
|
+
const message = this.translateFn
|
|
43
|
+
? this.translateFn('Error_EnumLanguageNotFoundTemplate', { language })
|
|
44
|
+
: `No translations found for language: ${language}`;
|
|
45
|
+
throw new Error(message);
|
|
37
46
|
}
|
|
38
47
|
let result = langTranslations[value];
|
|
39
48
|
if (!result && typeof value === 'number') {
|
|
@@ -43,7 +52,10 @@ class EnumTranslationRegistry {
|
|
|
43
52
|
}
|
|
44
53
|
}
|
|
45
54
|
if (!result) {
|
|
46
|
-
|
|
55
|
+
const message = this.translateFn
|
|
56
|
+
? this.translateFn('Error_EnumValueNotFoundTemplate', { value: String(value) })
|
|
57
|
+
: `No translation found for value: ${String(value)}`;
|
|
58
|
+
throw new Error(message);
|
|
47
59
|
}
|
|
48
60
|
return result;
|
|
49
61
|
}
|
|
@@ -63,5 +75,20 @@ class EnumTranslationRegistry {
|
|
|
63
75
|
has(enumObj) {
|
|
64
76
|
return this.translations.has(enumObj);
|
|
65
77
|
}
|
|
78
|
+
/**
|
|
79
|
+
* Validates that enum translations only contain available languages.
|
|
80
|
+
* @param translations The translations to validate
|
|
81
|
+
* @param enumName The name of the enumeration for error messages
|
|
82
|
+
*/
|
|
83
|
+
validateTranslations(translations, enumName) {
|
|
84
|
+
for (const language of Object.keys(translations)) {
|
|
85
|
+
if (!this.availableLanguages.has(language)) {
|
|
86
|
+
const message = this.translateFn
|
|
87
|
+
? this.translateFn('Error_EnumLanguageNotAvailableTemplate', { language, enumName })
|
|
88
|
+
: `Language '${language}' in enum '${enumName}' is not available in this engine instance`;
|
|
89
|
+
throw new Error(message);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
66
93
|
}
|
|
67
94
|
exports.EnumTranslationRegistry = EnumTranslationRegistry;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { CurrencyCode } from './currency-code';
|
|
2
|
+
import { Timezone } from './timezone';
|
|
3
|
+
import { LanguageCodeCollection, LanguageContext, MasterStringsCollection } from './types';
|
|
4
|
+
/**
|
|
5
|
+
* I18n configuration interface
|
|
6
|
+
*/
|
|
7
|
+
export interface I18nConfig<TStringKey extends string, TLanguage extends string, TConstants extends Record<string, any> = Record<string, any>, TTranslationContext extends string = LanguageContext> {
|
|
8
|
+
stringNames: TStringKey[];
|
|
9
|
+
strings: MasterStringsCollection<TStringKey, TLanguage>;
|
|
10
|
+
defaultLanguage: TLanguage;
|
|
11
|
+
defaultTranslationContext: TTranslationContext;
|
|
12
|
+
defaultCurrencyCode: CurrencyCode;
|
|
13
|
+
languageCodes: LanguageCodeCollection<TLanguage>;
|
|
14
|
+
languages: TLanguage[];
|
|
15
|
+
constants?: TConstants;
|
|
16
|
+
enumName?: string;
|
|
17
|
+
enumObj?: Record<string, TStringKey>;
|
|
18
|
+
timezone: Timezone;
|
|
19
|
+
adminTimezone: Timezone;
|
|
20
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { CurrencyCode } from './currency-code';
|
|
2
|
+
import { Timezone } from './timezone';
|
|
3
|
+
import { LanguageContext } from './types';
|
|
4
|
+
/**
|
|
5
|
+
* I18n context interface
|
|
6
|
+
*/
|
|
7
|
+
export interface I18nContext<TLanguage extends string, TTranslationContext extends string = LanguageContext> {
|
|
8
|
+
language: TLanguage;
|
|
9
|
+
adminLanguage: TLanguage;
|
|
10
|
+
currencyCode: CurrencyCode;
|
|
11
|
+
currentContext: TTranslationContext;
|
|
12
|
+
timezone: Timezone;
|
|
13
|
+
adminTimezone: Timezone;
|
|
14
|
+
}
|
package/dist/i18n-engine.d.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { EnumTranslationRegistry } from './enum-registry';
|
|
2
|
-
import {
|
|
2
|
+
import { I18nConfig } from './i18n-config';
|
|
3
|
+
import { I18nContext } from './i18n-context';
|
|
4
|
+
import { EnumLanguageTranslation } from './types';
|
|
3
5
|
/**
|
|
4
6
|
* Internationalization engine class
|
|
5
7
|
*/
|
|
@@ -7,7 +9,7 @@ export declare class I18nEngine<TStringKey extends string, TLanguage extends str
|
|
|
7
9
|
/**
|
|
8
10
|
* Registry for enum translations
|
|
9
11
|
*/
|
|
10
|
-
protected
|
|
12
|
+
protected _enumRegistry: EnumTranslationRegistry<TStringKey, TLanguage>;
|
|
11
13
|
/**
|
|
12
14
|
* Configuration for the i18n engine
|
|
13
15
|
*/
|
|
@@ -74,6 +76,11 @@ export declare class I18nEngine<TStringKey extends string, TLanguage extends str
|
|
|
74
76
|
* @param context The context to set
|
|
75
77
|
*/
|
|
76
78
|
set context(context: Partial<TContext>);
|
|
79
|
+
/**
|
|
80
|
+
* Gets the enum translation registry for this engine instance
|
|
81
|
+
* @returns The enum translation registry
|
|
82
|
+
*/
|
|
83
|
+
get enumRegistry(): EnumTranslationRegistry<TStringKey, TLanguage>;
|
|
77
84
|
/**
|
|
78
85
|
* Translates a string key into the specified language, replacing any variables as needed.
|
|
79
86
|
* @param key The string key to translate
|
package/dist/i18n-engine.js
CHANGED
|
@@ -18,7 +18,7 @@ class I18nEngine {
|
|
|
18
18
|
constructor(config, key, newContext = () => (0, context_1.createContext)(config.defaultLanguage, config.defaultTranslationContext, config.defaultCurrencyCode, config.timezone, config.adminTimezone)) {
|
|
19
19
|
this.validateConfig(config);
|
|
20
20
|
this.config = config;
|
|
21
|
-
this.
|
|
21
|
+
this._enumRegistry = new enum_registry_1.EnumTranslationRegistry(Object.keys(config.strings), (key, vars) => this.safeTranslate(key, vars));
|
|
22
22
|
this._context = newContext();
|
|
23
23
|
const instanceKey = key || I18nEngine.DefaultInstanceKey;
|
|
24
24
|
if (I18nEngine._instances.has(instanceKey)) {
|
|
@@ -91,6 +91,13 @@ class I18nEngine {
|
|
|
91
91
|
set context(context) {
|
|
92
92
|
this._context = { ...this._context, ...context };
|
|
93
93
|
}
|
|
94
|
+
/**
|
|
95
|
+
* Gets the enum translation registry for this engine instance
|
|
96
|
+
* @returns The enum translation registry
|
|
97
|
+
*/
|
|
98
|
+
get enumRegistry() {
|
|
99
|
+
return this._enumRegistry;
|
|
100
|
+
}
|
|
94
101
|
/**
|
|
95
102
|
* Translates a string key into the specified language, replacing any variables as needed.
|
|
96
103
|
* @param key The string key to translate
|
|
@@ -144,7 +151,7 @@ class I18nEngine {
|
|
|
144
151
|
* @returns The translated enumeration value
|
|
145
152
|
*/
|
|
146
153
|
translateEnum(enumObj, value, language) {
|
|
147
|
-
return this.
|
|
154
|
+
return this._enumRegistry.translate(enumObj, value, language);
|
|
148
155
|
}
|
|
149
156
|
/**
|
|
150
157
|
* Registers an enumeration and its translations with the engine.
|
|
@@ -153,7 +160,7 @@ class I18nEngine {
|
|
|
153
160
|
* @param enumName The name of the enumeration (for error messages)
|
|
154
161
|
*/
|
|
155
162
|
registerEnum(enumObj, translations, enumName) {
|
|
156
|
-
this.
|
|
163
|
+
this._enumRegistry.register(enumObj, translations, enumName);
|
|
157
164
|
}
|
|
158
165
|
/**
|
|
159
166
|
* Safe translation that prevents infinite recursion for error messages
|
|
@@ -274,12 +281,12 @@ class I18nEngine {
|
|
|
274
281
|
* @throws Error if validation fails
|
|
275
282
|
*/
|
|
276
283
|
validateConfig(config) {
|
|
277
|
-
// Check that
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
284
|
+
// Check that default language exists
|
|
285
|
+
if (!config.strings[config.defaultLanguage]) {
|
|
286
|
+
throw new Error(this.getValidationError('Error_DefaultLanguageNoCollectionTemplate', { language: config.defaultLanguage }, config));
|
|
287
|
+
}
|
|
288
|
+
// Check that all string keys are provided for each language that has strings
|
|
289
|
+
for (const language of Object.keys(config.strings)) {
|
|
283
290
|
const strings = config.strings[language];
|
|
284
291
|
for (const stringKey of config.stringNames) {
|
|
285
292
|
if (!strings[stringKey]) {
|
|
@@ -287,10 +294,6 @@ class I18nEngine {
|
|
|
287
294
|
}
|
|
288
295
|
}
|
|
289
296
|
}
|
|
290
|
-
// Check that default language exists
|
|
291
|
-
if (!config.strings[config.defaultLanguage]) {
|
|
292
|
-
throw new Error(this.getValidationError('Error_DefaultLanguageNoCollectionTemplate', { language: config.defaultLanguage }, config));
|
|
293
|
-
}
|
|
294
297
|
}
|
|
295
298
|
/**
|
|
296
299
|
* Gets validation error message, trying translation first, falling back to template
|
package/dist/index.d.ts
CHANGED
|
@@ -1,15 +1,35 @@
|
|
|
1
1
|
export * from './active-context';
|
|
2
|
+
export * from './component-definition';
|
|
3
|
+
export * from './component-registration';
|
|
4
|
+
export * from './component-registry';
|
|
2
5
|
export * from './context';
|
|
3
6
|
export * from './context-manager';
|
|
4
7
|
export * from './currency';
|
|
5
8
|
export * from './currency-code';
|
|
6
9
|
export * from './currency-format';
|
|
7
|
-
export * from './enum-registry';
|
|
8
10
|
export * from './default-config';
|
|
11
|
+
export * from './enum-registry';
|
|
12
|
+
export * from './i18n-context';
|
|
9
13
|
export * from './i18n-engine';
|
|
14
|
+
export * from './language-definition';
|
|
10
15
|
export * from './template';
|
|
11
16
|
export * from './timezone';
|
|
12
17
|
export * from './typed-error';
|
|
13
18
|
export * from './types';
|
|
14
19
|
export * from './utils';
|
|
20
|
+
export * from './validation-config';
|
|
21
|
+
export * from './validation-result';
|
|
22
|
+
export * from './core-i18n';
|
|
23
|
+
export * from './core-language';
|
|
24
|
+
export * from './core-string-key';
|
|
25
|
+
export * from './language-registry';
|
|
26
|
+
export * from './plugin-i18n-engine';
|
|
27
|
+
export * from './registry-config';
|
|
28
|
+
export * from './registry-context';
|
|
29
|
+
export * from './registry-error';
|
|
30
|
+
export * from './registry-error-type';
|
|
31
|
+
export * from './translation-request';
|
|
32
|
+
export * from './translation-response';
|
|
33
|
+
export { createCoreI18nEngine as createCoreI18n } from './core-i18n';
|
|
15
34
|
export { I18nEngine as I18n } from './i18n-engine';
|
|
35
|
+
export { PluginI18nEngine as PluginI18n } from './plugin-i18n-engine';
|
package/dist/index.js
CHANGED
|
@@ -14,21 +14,44 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
14
14
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
exports.I18n = void 0;
|
|
17
|
+
exports.PluginI18n = exports.I18n = exports.createCoreI18n = void 0;
|
|
18
|
+
// Legacy exports (for backwards compatibility)
|
|
18
19
|
__exportStar(require("./active-context"), exports);
|
|
20
|
+
__exportStar(require("./component-definition"), exports);
|
|
21
|
+
__exportStar(require("./component-registration"), exports);
|
|
22
|
+
__exportStar(require("./component-registry"), exports);
|
|
19
23
|
__exportStar(require("./context"), exports);
|
|
20
24
|
__exportStar(require("./context-manager"), exports);
|
|
21
25
|
__exportStar(require("./currency"), exports);
|
|
22
26
|
__exportStar(require("./currency-code"), exports);
|
|
23
27
|
__exportStar(require("./currency-format"), exports);
|
|
24
|
-
__exportStar(require("./enum-registry"), exports);
|
|
25
28
|
__exportStar(require("./default-config"), exports);
|
|
29
|
+
__exportStar(require("./enum-registry"), exports);
|
|
30
|
+
__exportStar(require("./i18n-context"), exports);
|
|
26
31
|
__exportStar(require("./i18n-engine"), exports);
|
|
32
|
+
__exportStar(require("./language-definition"), exports);
|
|
27
33
|
__exportStar(require("./template"), exports);
|
|
28
34
|
__exportStar(require("./timezone"), exports);
|
|
29
35
|
__exportStar(require("./typed-error"), exports);
|
|
30
36
|
__exportStar(require("./types"), exports);
|
|
31
37
|
__exportStar(require("./utils"), exports);
|
|
38
|
+
__exportStar(require("./validation-config"), exports);
|
|
39
|
+
__exportStar(require("./validation-result"), exports);
|
|
40
|
+
__exportStar(require("./core-i18n"), exports);
|
|
41
|
+
__exportStar(require("./core-language"), exports);
|
|
42
|
+
__exportStar(require("./core-string-key"), exports);
|
|
43
|
+
__exportStar(require("./language-registry"), exports);
|
|
44
|
+
__exportStar(require("./plugin-i18n-engine"), exports);
|
|
45
|
+
__exportStar(require("./registry-config"), exports);
|
|
46
|
+
__exportStar(require("./registry-context"), exports);
|
|
47
|
+
__exportStar(require("./registry-error"), exports);
|
|
48
|
+
__exportStar(require("./registry-error-type"), exports);
|
|
49
|
+
__exportStar(require("./translation-request"), exports);
|
|
50
|
+
__exportStar(require("./translation-response"), exports);
|
|
32
51
|
// Re-export for convenience
|
|
52
|
+
var core_i18n_1 = require("./core-i18n");
|
|
53
|
+
Object.defineProperty(exports, "createCoreI18n", { enumerable: true, get: function () { return core_i18n_1.createCoreI18nEngine; } });
|
|
33
54
|
var i18n_engine_1 = require("./i18n-engine");
|
|
34
55
|
Object.defineProperty(exports, "I18n", { enumerable: true, get: function () { return i18n_engine_1.I18nEngine; } });
|
|
56
|
+
var plugin_i18n_engine_1 = require("./plugin-i18n-engine");
|
|
57
|
+
Object.defineProperty(exports, "PluginI18n", { enumerable: true, get: function () { return plugin_i18n_engine_1.PluginI18nEngine; } });
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Language definition with its properties
|
|
3
|
+
*/
|
|
4
|
+
export interface LanguageDefinition {
|
|
5
|
+
/** Unique identifier for the language */
|
|
6
|
+
readonly id: string;
|
|
7
|
+
/** Display name in the native language */
|
|
8
|
+
readonly name: string;
|
|
9
|
+
/** ISO language code (e.g., 'en', 'fr', 'zh-CN') */
|
|
10
|
+
readonly code: string;
|
|
11
|
+
/** Whether this is the fallback/default language */
|
|
12
|
+
readonly isDefault?: boolean;
|
|
13
|
+
}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Language registry for managing supported languages and their properties
|
|
3
|
+
*/
|
|
4
|
+
import { LanguageDefinition } from './language-definition';
|
|
5
|
+
/**
|
|
6
|
+
* Registry for managing supported languages
|
|
7
|
+
*/
|
|
8
|
+
export declare class LanguageRegistry<TLanguages extends string> {
|
|
9
|
+
private readonly languages;
|
|
10
|
+
private readonly languagesByCodes;
|
|
11
|
+
private defaultLanguageId;
|
|
12
|
+
constructor();
|
|
13
|
+
/**
|
|
14
|
+
* Register a new language
|
|
15
|
+
*/
|
|
16
|
+
registerLanguage(language: LanguageDefinition): void;
|
|
17
|
+
/**
|
|
18
|
+
* Register multiple languages at once
|
|
19
|
+
*/
|
|
20
|
+
registerLanguages(languages: readonly LanguageDefinition[]): void;
|
|
21
|
+
/**
|
|
22
|
+
* Get a language by its ID
|
|
23
|
+
*/
|
|
24
|
+
getLanguage(languageId: TLanguages): LanguageDefinition | undefined;
|
|
25
|
+
/**
|
|
26
|
+
* Get a language by its code
|
|
27
|
+
*/
|
|
28
|
+
getLanguageByCode(code: string): LanguageDefinition | undefined;
|
|
29
|
+
/**
|
|
30
|
+
* Get all registered languages
|
|
31
|
+
*/
|
|
32
|
+
getAllLanguages(): ReadonlyArray<LanguageDefinition>;
|
|
33
|
+
/**
|
|
34
|
+
* Get all language IDs
|
|
35
|
+
*/
|
|
36
|
+
getLanguageIds(): readonly TLanguages[];
|
|
37
|
+
/**
|
|
38
|
+
* Get all language codes
|
|
39
|
+
*/
|
|
40
|
+
getLanguageCodes(): readonly string[];
|
|
41
|
+
/**
|
|
42
|
+
* Check if a language is registered
|
|
43
|
+
*/
|
|
44
|
+
hasLanguage(languageId: TLanguages): boolean;
|
|
45
|
+
/**
|
|
46
|
+
* Check if a language code is registered
|
|
47
|
+
*/
|
|
48
|
+
hasLanguageCode(code: string): boolean;
|
|
49
|
+
/**
|
|
50
|
+
* Get the default language
|
|
51
|
+
*/
|
|
52
|
+
getDefaultLanguage(): LanguageDefinition | null;
|
|
53
|
+
/**
|
|
54
|
+
* Get the default language ID
|
|
55
|
+
*/
|
|
56
|
+
getDefaultLanguageId(): TLanguages | null;
|
|
57
|
+
/**
|
|
58
|
+
* Set the default language
|
|
59
|
+
*/
|
|
60
|
+
setDefaultLanguage(languageId: TLanguages): void;
|
|
61
|
+
/**
|
|
62
|
+
* Get the number of registered languages
|
|
63
|
+
*/
|
|
64
|
+
getLanguageCount(): number;
|
|
65
|
+
/**
|
|
66
|
+
* Validate that all required languages are present
|
|
67
|
+
*/
|
|
68
|
+
validateRequiredLanguages(requiredLanguages: readonly TLanguages[]): LanguageValidationResult;
|
|
69
|
+
/**
|
|
70
|
+
* Create a mapping of language IDs to their display names
|
|
71
|
+
*/
|
|
72
|
+
getLanguageDisplayNames(): Record<TLanguages, string>;
|
|
73
|
+
/**
|
|
74
|
+
* Create a mapping of language IDs to their codes
|
|
75
|
+
*/
|
|
76
|
+
getLanguageCodeMapping(): Record<TLanguages, string>;
|
|
77
|
+
/**
|
|
78
|
+
* Find languages by partial name match (case-insensitive)
|
|
79
|
+
*/
|
|
80
|
+
findLanguagesByName(partialName: string): readonly LanguageDefinition[];
|
|
81
|
+
/**
|
|
82
|
+
* Clear all registered languages
|
|
83
|
+
*/
|
|
84
|
+
clear(): void;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Validation result for language operations
|
|
88
|
+
*/
|
|
89
|
+
export interface LanguageValidationResult {
|
|
90
|
+
readonly isValid: boolean;
|
|
91
|
+
readonly missingLanguages: readonly string[];
|
|
92
|
+
readonly errors: readonly string[];
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Helper function to create language definitions with type safety
|
|
96
|
+
*/
|
|
97
|
+
export declare function createLanguageDefinition(id: string, name: string, code: string, isDefault?: boolean): LanguageDefinition;
|
|
98
|
+
/**
|
|
99
|
+
* Helper function to create multiple language definitions
|
|
100
|
+
*/
|
|
101
|
+
export declare function createLanguageDefinitions(languages: Array<{
|
|
102
|
+
id: string;
|
|
103
|
+
name: string;
|
|
104
|
+
code: string;
|
|
105
|
+
isDefault?: boolean;
|
|
106
|
+
}>): LanguageDefinition[];
|