@digitaldefiance/i18n-lib 1.0.33 → 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/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 +3 -1
- 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
|
},
|
|
@@ -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
|
*/
|
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[];
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Language registry for managing supported languages and their properties
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.LanguageRegistry = void 0;
|
|
7
|
+
exports.createLanguageDefinition = createLanguageDefinition;
|
|
8
|
+
exports.createLanguageDefinitions = createLanguageDefinitions;
|
|
9
|
+
const registry_error_1 = require("./registry-error");
|
|
10
|
+
const registry_error_type_1 = require("./registry-error-type");
|
|
11
|
+
/**
|
|
12
|
+
* Registry for managing supported languages
|
|
13
|
+
*/
|
|
14
|
+
class LanguageRegistry {
|
|
15
|
+
constructor() {
|
|
16
|
+
this.languages = new Map();
|
|
17
|
+
this.languagesByCodes = new Map();
|
|
18
|
+
this.defaultLanguageId = null;
|
|
19
|
+
// Empty constructor - languages are registered via registerLanguage method
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Register a new language
|
|
23
|
+
*/
|
|
24
|
+
registerLanguage(language) {
|
|
25
|
+
const languageId = language.id;
|
|
26
|
+
// Check for duplicate language ID
|
|
27
|
+
if (this.languages.has(languageId)) {
|
|
28
|
+
throw registry_error_1.RegistryError.createSimple(registry_error_type_1.RegistryErrorType.DuplicateLanguage, `Language '${languageId}' is already registered`, { languageId });
|
|
29
|
+
}
|
|
30
|
+
// Check for duplicate language code
|
|
31
|
+
if (this.languagesByCodes.has(language.code)) {
|
|
32
|
+
const existingLanguageId = this.languagesByCodes.get(language.code);
|
|
33
|
+
throw registry_error_1.RegistryError.createSimple(registry_error_type_1.RegistryErrorType.DuplicateLanguage, `Language code '${language.code}' is already used by language '${existingLanguageId}'`, { languageId, code: language.code, existingLanguageId });
|
|
34
|
+
}
|
|
35
|
+
// Register the language
|
|
36
|
+
this.languages.set(languageId, language);
|
|
37
|
+
this.languagesByCodes.set(language.code, languageId);
|
|
38
|
+
// Set as default if specified or if it's the first language
|
|
39
|
+
if (language.isDefault || this.defaultLanguageId === null) {
|
|
40
|
+
this.defaultLanguageId = languageId;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Register multiple languages at once
|
|
45
|
+
*/
|
|
46
|
+
registerLanguages(languages) {
|
|
47
|
+
for (const language of languages) {
|
|
48
|
+
this.registerLanguage(language);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Get a language by its ID
|
|
53
|
+
*/
|
|
54
|
+
getLanguage(languageId) {
|
|
55
|
+
return this.languages.get(languageId);
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Get a language by its code
|
|
59
|
+
*/
|
|
60
|
+
getLanguageByCode(code) {
|
|
61
|
+
const languageId = this.languagesByCodes.get(code);
|
|
62
|
+
return languageId ? this.languages.get(languageId) : undefined;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Get all registered languages
|
|
66
|
+
*/
|
|
67
|
+
getAllLanguages() {
|
|
68
|
+
return Array.from(this.languages.values());
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Get all language IDs
|
|
72
|
+
*/
|
|
73
|
+
getLanguageIds() {
|
|
74
|
+
return Array.from(this.languages.keys());
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Get all language codes
|
|
78
|
+
*/
|
|
79
|
+
getLanguageCodes() {
|
|
80
|
+
return Array.from(this.languagesByCodes.keys());
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Check if a language is registered
|
|
84
|
+
*/
|
|
85
|
+
hasLanguage(languageId) {
|
|
86
|
+
return this.languages.has(languageId);
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Check if a language code is registered
|
|
90
|
+
*/
|
|
91
|
+
hasLanguageCode(code) {
|
|
92
|
+
return this.languagesByCodes.has(code);
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Get the default language
|
|
96
|
+
*/
|
|
97
|
+
getDefaultLanguage() {
|
|
98
|
+
return this.defaultLanguageId
|
|
99
|
+
? this.languages.get(this.defaultLanguageId) || null
|
|
100
|
+
: null;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Get the default language ID
|
|
104
|
+
*/
|
|
105
|
+
getDefaultLanguageId() {
|
|
106
|
+
return this.defaultLanguageId;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Set the default language
|
|
110
|
+
*/
|
|
111
|
+
setDefaultLanguage(languageId) {
|
|
112
|
+
if (!this.languages.has(languageId)) {
|
|
113
|
+
throw registry_error_1.RegistryError.createSimple(registry_error_type_1.RegistryErrorType.LanguageNotFound, `Language '${languageId}' not found`, { languageId });
|
|
114
|
+
}
|
|
115
|
+
this.defaultLanguageId = languageId;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Get the number of registered languages
|
|
119
|
+
*/
|
|
120
|
+
getLanguageCount() {
|
|
121
|
+
return this.languages.size;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Validate that all required languages are present
|
|
125
|
+
*/
|
|
126
|
+
validateRequiredLanguages(requiredLanguages) {
|
|
127
|
+
const missingLanguages = [];
|
|
128
|
+
const errors = [];
|
|
129
|
+
for (const languageId of requiredLanguages) {
|
|
130
|
+
if (!this.languages.has(languageId)) {
|
|
131
|
+
missingLanguages.push(languageId);
|
|
132
|
+
errors.push(`Required language '${languageId}' is not registered`);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
return {
|
|
136
|
+
isValid: missingLanguages.length === 0,
|
|
137
|
+
missingLanguages,
|
|
138
|
+
errors,
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Create a mapping of language IDs to their display names
|
|
143
|
+
*/
|
|
144
|
+
getLanguageDisplayNames() {
|
|
145
|
+
const result = {};
|
|
146
|
+
for (const [languageId, language] of this.languages) {
|
|
147
|
+
result[languageId] = language.name;
|
|
148
|
+
}
|
|
149
|
+
return result;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Create a mapping of language IDs to their codes
|
|
153
|
+
*/
|
|
154
|
+
getLanguageCodeMapping() {
|
|
155
|
+
const result = {};
|
|
156
|
+
for (const [languageId, language] of this.languages) {
|
|
157
|
+
result[languageId] = language.code;
|
|
158
|
+
}
|
|
159
|
+
return result;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Find languages by partial name match (case-insensitive)
|
|
163
|
+
*/
|
|
164
|
+
findLanguagesByName(partialName) {
|
|
165
|
+
const searchTerm = partialName.toLowerCase();
|
|
166
|
+
return Array.from(this.languages.values()).filter((language) => language.name.toLowerCase().includes(searchTerm));
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Clear all registered languages
|
|
170
|
+
*/
|
|
171
|
+
clear() {
|
|
172
|
+
this.languages.clear();
|
|
173
|
+
this.languagesByCodes.clear();
|
|
174
|
+
this.defaultLanguageId = null;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
exports.LanguageRegistry = LanguageRegistry;
|
|
178
|
+
/**
|
|
179
|
+
* Helper function to create language definitions with type safety
|
|
180
|
+
*/
|
|
181
|
+
function createLanguageDefinition(id, name, code, isDefault) {
|
|
182
|
+
return {
|
|
183
|
+
id,
|
|
184
|
+
name,
|
|
185
|
+
code,
|
|
186
|
+
isDefault: isDefault || false,
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Helper function to create multiple language definitions
|
|
191
|
+
*/
|
|
192
|
+
function createLanguageDefinitions(languages) {
|
|
193
|
+
return languages.map((lang) => createLanguageDefinition(lang.id, lang.name, lang.code, lang.isDefault));
|
|
194
|
+
}
|