@digitaldefiance/i18n-lib 1.0.33 → 1.1.1

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.
Files changed (51) hide show
  1. package/README.md +477 -4
  2. package/dist/component-definition.d.ts +11 -0
  3. package/dist/component-definition.js +2 -0
  4. package/dist/component-registration.d.ts +9 -0
  5. package/dist/component-registration.js +2 -0
  6. package/dist/component-registry.d.ts +64 -0
  7. package/dist/component-registry.js +238 -0
  8. package/dist/context.d.ts +2 -1
  9. package/dist/core-i18n.d.ts +41 -0
  10. package/dist/core-i18n.js +436 -0
  11. package/dist/core-language.d.ts +13 -0
  12. package/dist/core-language.js +17 -0
  13. package/dist/core-string-key.d.ts +39 -0
  14. package/dist/core-string-key.js +47 -0
  15. package/dist/default-config.d.ts +2 -1
  16. package/dist/default-config.js +24 -24
  17. package/dist/i18n-config.d.ts +20 -0
  18. package/dist/i18n-config.js +2 -0
  19. package/dist/i18n-context.d.ts +14 -0
  20. package/dist/i18n-context.js +2 -0
  21. package/dist/i18n-engine.d.ts +3 -1
  22. package/dist/index.d.ts +21 -1
  23. package/dist/index.js +25 -2
  24. package/dist/language-definition.d.ts +13 -0
  25. package/dist/language-definition.js +2 -0
  26. package/dist/language-registry.d.ts +106 -0
  27. package/dist/language-registry.js +194 -0
  28. package/dist/plugin-i18n-engine.d.ts +126 -0
  29. package/dist/plugin-i18n-engine.js +266 -0
  30. package/dist/registry-config.d.ts +14 -0
  31. package/dist/registry-config.js +2 -0
  32. package/dist/registry-context.d.ts +12 -0
  33. package/dist/registry-context.js +2 -0
  34. package/dist/registry-error-type.d.ts +12 -0
  35. package/dist/registry-error-type.js +16 -0
  36. package/dist/registry-error.d.ts +19 -0
  37. package/dist/registry-error.js +44 -0
  38. package/dist/strict-types.d.ts +18 -0
  39. package/dist/strict-types.js +17 -0
  40. package/dist/translation-request.d.ts +9 -0
  41. package/dist/translation-request.js +2 -0
  42. package/dist/translation-response.d.ts +8 -0
  43. package/dist/translation-response.js +2 -0
  44. package/dist/typed-error.d.ts +63 -3
  45. package/dist/typed-error.js +230 -2
  46. package/dist/types.d.ts +42 -29
  47. package/dist/validation-config.d.ts +11 -0
  48. package/dist/validation-config.js +2 -0
  49. package/dist/validation-result.d.ts +12 -0
  50. package/dist/validation-result.js +2 -0
  51. package/package.json +2 -1
@@ -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]: 'Instance with key \'{key}\' already exists',
44
- [DefaultStringKey.Error_InstanceNotFoundTemplate]: 'Instance with key \'{key}\' not found',
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]: 'Missing translation for key \'{key}\' in language \'{language}\'',
47
- [DefaultStringKey.Error_DefaultLanguageNoCollectionTemplate]: 'Default language \'{language}\' has no string collection',
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]: 'Instance with key \'{key}\' already exists',
53
- [DefaultStringKey.Error_InstanceNotFoundTemplate]: 'Instance with key \'{key}\' not found',
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]: 'Missing translation for key \'{key}\' in language \'{language}\'',
56
- [DefaultStringKey.Error_DefaultLanguageNoCollectionTemplate]: 'Default language \'{language}\' has no string collection',
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]: 'Instance avec clé \'{key}\' existe déjà',
62
- [DefaultStringKey.Error_InstanceNotFoundTemplate]: 'Instance avec clé \'{key}\' introuvable',
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]: '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',
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]: '键为\'{key}\'的实例已存在',
71
- [DefaultStringKey.Error_InstanceNotFoundTemplate]: '未找到键为\'{key}\'的实例',
70
+ [DefaultStringKey.Error_InstanceAlreadyExistsTemplate]: "键为'{key}'的实例已存在",
71
+ [DefaultStringKey.Error_InstanceNotFoundTemplate]: "未找到键为'{key}'的实例",
72
72
  [DefaultStringKey.Error_MissingStringCollectionTemplate]: '缺少语言的字符串集合: {language}',
73
- [DefaultStringKey.Error_MissingTranslationTemplate]: '在语言\'{language}\'中缺少键\'{key}\'的翻译',
74
- [DefaultStringKey.Error_DefaultLanguageNoCollectionTemplate]: '默认语言\'{language}\'没有字符串集合',
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]: 'La instancia con clave \'{key}\' ya existe',
80
- [DefaultStringKey.Error_InstanceNotFoundTemplate]: 'Instancia con clave \'{key}\' no encontrada',
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]: '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',
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]: 'Екземпляр з ключем \'{key}\' вже існує',
89
- [DefaultStringKey.Error_InstanceNotFoundTemplate]: 'Екземпляр з ключем \'{key}\' не знайдено',
88
+ [DefaultStringKey.Error_InstanceAlreadyExistsTemplate]: "Екземпляр з ключем '{key}' вже існує",
89
+ [DefaultStringKey.Error_InstanceNotFoundTemplate]: "Екземпляр з ключем '{key}' не знайдено",
90
90
  [DefaultStringKey.Error_MissingStringCollectionTemplate]: 'Відсутня колекція рядків для мови: {language}',
91
- [DefaultStringKey.Error_MissingTranslationTemplate]: 'Відсутній переклад для ключа \'{key}\' в мові \'{language}\'',
92
- [DefaultStringKey.Error_DefaultLanguageNoCollectionTemplate]: 'Мова за замовчуванням \'{language}\' не має колекції рядків',
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,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -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
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,5 +1,7 @@
1
1
  import { EnumTranslationRegistry } from './enum-registry';
2
- import { EnumLanguageTranslation, I18nConfig, I18nContext } from './types';
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,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -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
+ }