@digitaldefiance/i18n-lib 1.1.10 → 1.2.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 CHANGED
@@ -49,38 +49,36 @@ npm install @digitaldefiance/i18n-lib
49
49
  ```typescript
50
50
  import { I18nEngine, I18nConfig, createContext, CurrencyCode, Timezone } from '@digitaldefiance/i18n-lib';
51
51
 
52
- // Define your enums
52
+ // Define your string keys
53
53
  enum MyStrings {
54
54
  Welcome = 'welcome',
55
55
  UserGreetingTemplate = 'userGreetingTemplate'
56
56
  }
57
57
 
58
- enum MyLanguages {
59
- English = 'English',
60
- Spanish = 'Spanish'
61
- }
58
+ // Define your language codes (or use string literals)
59
+ type MyLanguages = 'en-US' | 'es';
62
60
 
63
61
  // Configure the engine
64
62
  const config: I18nConfig<MyStrings, MyLanguages> = {
65
63
  stringNames: Object.values(MyStrings),
66
64
  strings: {
67
- [MyLanguages.English]: {
65
+ 'en-US': {
68
66
  [MyStrings.Welcome]: 'Welcome!',
69
67
  [MyStrings.UserGreetingTemplate]: 'Hello, {name}!'
70
68
  },
71
- [MyLanguages.Spanish]: {
69
+ 'es': {
72
70
  [MyStrings.Welcome]: '¡Bienvenido!',
73
71
  [MyStrings.UserGreetingTemplate]: '¡Hola, {name}!'
74
72
  }
75
73
  },
76
- defaultLanguage: MyLanguages.English,
74
+ defaultLanguage: 'en-US',
77
75
  defaultTranslationContext: 'user',
78
76
  defaultCurrencyCode: new CurrencyCode('USD'),
79
77
  languageCodes: {
80
- [MyLanguages.English]: 'en',
81
- [MyLanguages.Spanish]: 'es'
78
+ 'en-US': 'en-US',
79
+ 'es': 'es'
82
80
  },
83
- languages: Object.values(MyLanguages),
81
+ languages: ['en-US', 'es'],
84
82
  timezone: new Timezone('UTC'),
85
83
  adminTimezone: new Timezone('UTC')
86
84
  };
@@ -96,7 +94,7 @@ const greeting = i18n.translate(MyStrings.UserGreetingTemplate, { name: 'John' }
96
94
  // "Hello, John!"
97
95
 
98
96
  // Change language
99
- i18n.context = { language: MyLanguages.Spanish };
97
+ i18n.context = { language: 'es' };
100
98
  const spanishGreeting = i18n.translate(MyStrings.UserGreetingTemplate, { name: 'Juan' });
101
99
  // "¡Hola, Juan!"
102
100
  ```
@@ -111,7 +109,8 @@ The new plugin-based architecture provides a component registration system with
111
109
  import {
112
110
  createCoreI18nEngine,
113
111
  CoreStringKey,
114
- CoreLanguage,
112
+ CoreLanguageCode,
113
+ LanguageCodes,
115
114
  ComponentDefinition,
116
115
  ComponentRegistration
117
116
  } from '@digitaldefiance/i18n-lib';
@@ -138,26 +137,26 @@ const MyComponent: ComponentDefinition<MyComponentStringKey> = {
138
137
 
139
138
  // Define translations for all supported languages
140
139
  const myComponentStrings = {
141
- [CoreLanguage.EnglishUS]: {
140
+ [LanguageCodes.EN_US]: {
142
141
  [MyComponentStringKey.Welcome]: 'Welcome to my component!',
143
142
  [MyComponentStringKey.Goodbye]: 'Goodbye from my component!',
144
143
  [MyComponentStringKey.UserGreetingTemplate]: 'Hello, {name}!'
145
144
  },
146
- [CoreLanguage.French]: {
145
+ [LanguageCodes.FR]: {
147
146
  [MyComponentStringKey.Welcome]: 'Bienvenue dans mon composant !',
148
147
  [MyComponentStringKey.Goodbye]: 'Au revoir de mon composant !',
149
148
  [MyComponentStringKey.UserGreetingTemplate]: 'Bonjour, {name} !'
150
149
  },
151
- [CoreLanguage.Spanish]: {
150
+ [LanguageCodes.ES]: {
152
151
  [MyComponentStringKey.Welcome]: '¡Bienvenido a mi componente!',
153
152
  [MyComponentStringKey.Goodbye]: '¡Adiós desde mi componente!',
154
153
  [MyComponentStringKey.UserGreetingTemplate]: '¡Hola, {name}!'
155
154
  }
156
- // TypeScript ensures all CoreLanguages are handled
155
+ // TypeScript ensures all language codes are handled
157
156
  };
158
157
 
159
158
  // Register component (with validation)
160
- const registration: ComponentRegistration<MyComponentStringKey, CoreLanguage> = {
159
+ const registration: ComponentRegistration<MyComponentStringKey, CoreLanguageCode> = {
161
160
  component: MyComponent,
162
161
  strings: myComponentStrings
163
162
  };
@@ -174,7 +173,7 @@ const greeting = i18n.translate('my-component', MyComponentStringKey.UserGreetin
174
173
  });
175
174
 
176
175
  // Change language - affects all components
177
- i18n.setLanguage(CoreLanguage.French);
176
+ i18n.setLanguage(LanguageCodes.FR);
178
177
  const frenchWelcome = i18n.translate('my-component', MyComponentStringKey.Welcome);
179
178
  // "Bienvenue dans mon composant !"
180
179
  ```
@@ -199,6 +198,17 @@ Provides essential system strings in 8 languages:
199
198
 
200
199
  - English (US/UK), French, Spanish, German, Chinese (Simplified), Japanese, Ukrainian
201
200
 
201
+ **Language Codes**: Use `LanguageCodes` constants or define your own:
202
+ ```typescript
203
+ import { LanguageCodes } from '@digitaldefiance/i18n-lib';
204
+
205
+ // Common codes provided
206
+ LanguageCodes.EN_US // 'en-US'
207
+ LanguageCodes.FR // 'fr'
208
+ LanguageCodes.ES // 'es'
209
+ // ... or use any string: 'custom-lang'
210
+ ```
211
+
202
212
  ```typescript
203
213
  import { createCoreI18nEngine, CoreStringKey } from '@digitaldefiance/i18n-lib';
204
214
 
@@ -1026,6 +1036,46 @@ Part of the DigitalBurnbag project - a secure file sharing and automated protoco
1026
1036
 
1027
1037
  ## ChangeLog
1028
1038
 
1039
+ ### Version 1.2.0
1040
+
1041
+ - Thu Oct 23 2025 14:13:00 GMT-0700 (Pacific Daylight Time)
1042
+
1043
+ #### Breaking Changes
1044
+ - **Removed `CoreLanguage` enum** - Replaced with `CoreLanguageCode` type and `LanguageCodes` constants
1045
+ - **Language identifiers now use BCP 47 codes** - Changed from descriptive names (e.g., `'English (US)'`) to standard codes (e.g., `'en-US'`)
1046
+ - **API changes**:
1047
+ - `CoreLanguage` → `CoreLanguageCode` (union type)
1048
+ - `DefaultLanguage` enum → `DefaultLanguageCode` type
1049
+ - All language references updated to use `LanguageCodes` constants
1050
+
1051
+ #### Added
1052
+ - **`LanguageCodes` constants object** - Provides standard BCP 47 language codes:
1053
+ - `EN_US`, `EN_GB`, `FR`, `ES`, `DE`, `ZH_CN`, `JA`, `UK`
1054
+ - **`LanguageDisplayNames` mapping** - Maps language codes to human-readable names
1055
+ - **`CommonLanguageCode` type** - Type for built-in language codes
1056
+ - **`LanguageCode` type** - Generic string type for custom language codes
1057
+ - **Custom language code support** - Any string can now be used as a language code
1058
+
1059
+ #### Changed
1060
+ - **Language code format** - All language identifiers now use BCP 47 standard (e.g., `'en-US'` instead of `'English (US)'`)
1061
+ - **Type system** - Languages are now string-based types instead of enums, allowing custom language codes
1062
+ - **Documentation** - Updated README with new API usage examples and language code constants
1063
+
1064
+ #### Migration Guide
1065
+ ```typescript
1066
+ // Before
1067
+ import { CoreLanguage } from '@digitaldefiance/i18n-lib';
1068
+ i18n.setLanguage(CoreLanguage.French);
1069
+
1070
+ // After
1071
+ import { LanguageCodes } from '@digitaldefiance/i18n-lib';
1072
+ i18n.setLanguage(LanguageCodes.FR);
1073
+
1074
+ // Extending with custom language codes
1075
+ type MyLanguageCodes = CoreLanguageCode | 'pt-BR' | 'it';
1076
+ const myEngine = PluginI18nEngine.createInstance<MyLanguageCodes>('custom', languages);
1077
+ ```
1078
+
1029
1079
  ### Version 1.1.10
1030
1080
 
1031
1081
  - Fri Oct 17 2025 15:02:00 GMT-0700 (Pacific Daylight Time)
@@ -3,10 +3,11 @@
3
3
  */
4
4
  import { ComponentDefinition } from './component-definition';
5
5
  import { ComponentRegistration } from './component-registration';
6
- import { CoreLanguage } from './core-language';
7
6
  import { CoreStringKey } from './core-string-key';
7
+ import { LanguageCodes } from './language-codes';
8
8
  import { LanguageDefinition } from './language-definition';
9
9
  import { PluginI18nEngine } from './plugin-i18n-engine';
10
+ export type CoreLanguageCode = typeof LanguageCodes.EN_US | typeof LanguageCodes.EN_GB | typeof LanguageCodes.FR | typeof LanguageCodes.ES | typeof LanguageCodes.DE | typeof LanguageCodes.ZH_CN | typeof LanguageCodes.JA | typeof LanguageCodes.UK;
10
11
  /**
11
12
  * Create default language definitions
12
13
  */
@@ -19,24 +20,24 @@ export declare const CoreComponentDefinition: ComponentDefinition<CoreStringKey>
19
20
  /**
20
21
  * Core component strings for all default languages
21
22
  */
22
- export declare function createCoreComponentStrings(): import("./strict-types").CompleteComponentLanguageStrings<CoreStringKey, CoreLanguage>;
23
+ export declare function createCoreComponentStrings(): import("./strict-types").CompleteComponentLanguageStrings<CoreStringKey, CoreLanguageCode>;
23
24
  /**
24
25
  * Create core component registration
25
26
  */
26
- export declare function createCoreComponentRegistration(): ComponentRegistration<CoreStringKey, CoreLanguage>;
27
+ export declare function createCoreComponentRegistration(): ComponentRegistration<CoreStringKey, CoreLanguageCode>;
27
28
  /**
28
29
  * Create a pre-configured I18n engine with core components
29
30
  */
30
- export declare function createCoreI18nEngine(instanceKey?: string): PluginI18nEngine<CoreLanguage>;
31
+ export declare function createCoreI18nEngine(instanceKey?: string): PluginI18nEngine<CoreLanguageCode>;
31
32
  /**
32
33
  * Type alias for easier usage
33
34
  */
34
- export type CoreI18nEngine = PluginI18nEngine<CoreLanguage>;
35
+ export type CoreI18nEngine = PluginI18nEngine<CoreLanguageCode>;
35
36
  /**
36
37
  * Helper function to get core translation
37
38
  */
38
- export declare function getCoreTranslation(stringKey: CoreStringKey, variables?: Record<string, string | number>, language?: CoreLanguage, instanceKey?: string): string;
39
+ export declare function getCoreTranslation(stringKey: CoreStringKey, variables?: Record<string, string | number>, language?: CoreLanguageCode, instanceKey?: string): string;
39
40
  /**
40
41
  * Helper function to safely get core translation with fallback
41
42
  */
42
- export declare function safeCoreTranslation(stringKey: CoreStringKey, variables?: Record<string, string | number>, language?: CoreLanguage, instanceKey?: string): string;
43
+ export declare function safeCoreTranslation(stringKey: CoreStringKey, variables?: Record<string, string | number>, language?: CoreLanguageCode, instanceKey?: string): string;
package/dist/core-i18n.js CHANGED
@@ -10,8 +10,8 @@ exports.createCoreComponentRegistration = createCoreComponentRegistration;
10
10
  exports.createCoreI18nEngine = createCoreI18nEngine;
11
11
  exports.getCoreTranslation = getCoreTranslation;
12
12
  exports.safeCoreTranslation = safeCoreTranslation;
13
- const core_language_1 = require("./core-language");
14
13
  const core_string_key_1 = require("./core-string-key");
14
+ const language_codes_1 = require("./language-codes");
15
15
  const language_registry_1 = require("./language-registry");
16
16
  const plugin_i18n_engine_1 = require("./plugin-i18n-engine");
17
17
  const strict_types_1 = require("./strict-types");
@@ -22,43 +22,43 @@ const DefaultInstanceKey = 'default';
22
22
  function createDefaultLanguages() {
23
23
  return (0, language_registry_1.createLanguageDefinitions)([
24
24
  {
25
- id: core_language_1.CoreLanguage.EnglishUS,
25
+ id: language_codes_1.LanguageCodes.EN_US,
26
26
  name: 'English (US)',
27
27
  code: 'en-US',
28
28
  isDefault: true,
29
29
  },
30
30
  {
31
- id: core_language_1.CoreLanguage.EnglishUK,
31
+ id: language_codes_1.LanguageCodes.EN_GB,
32
32
  name: 'English (UK)',
33
33
  code: 'en-GB',
34
34
  },
35
35
  {
36
- id: core_language_1.CoreLanguage.French,
36
+ id: language_codes_1.LanguageCodes.FR,
37
37
  name: 'Français',
38
38
  code: 'fr',
39
39
  },
40
40
  {
41
- id: core_language_1.CoreLanguage.Spanish,
41
+ id: language_codes_1.LanguageCodes.ES,
42
42
  name: 'Español',
43
43
  code: 'es',
44
44
  },
45
45
  {
46
- id: core_language_1.CoreLanguage.German,
46
+ id: language_codes_1.LanguageCodes.DE,
47
47
  name: 'Deutsch',
48
48
  code: 'de',
49
49
  },
50
50
  {
51
- id: core_language_1.CoreLanguage.MandarinChinese,
51
+ id: language_codes_1.LanguageCodes.ZH_CN,
52
52
  name: '中文 (简体)',
53
53
  code: 'zh-CN',
54
54
  },
55
55
  {
56
- id: core_language_1.CoreLanguage.Japanese,
56
+ id: language_codes_1.LanguageCodes.JA,
57
57
  name: '日本語',
58
58
  code: 'ja',
59
59
  },
60
60
  {
61
- id: core_language_1.CoreLanguage.Ukrainian,
61
+ id: language_codes_1.LanguageCodes.UK,
62
62
  name: 'Українська',
63
63
  code: 'uk',
64
64
  },
@@ -78,7 +78,7 @@ exports.CoreComponentDefinition = {
78
78
  */
79
79
  function createCoreComponentStrings() {
80
80
  return (0, strict_types_1.createCompleteComponentStrings)({
81
- [core_language_1.CoreLanguage.EnglishUS]: {
81
+ [language_codes_1.LanguageCodes.EN_US]: {
82
82
  // Common/General
83
83
  [core_string_key_1.CoreStringKey.Common_Yes]: 'Yes',
84
84
  [core_string_key_1.CoreStringKey.Common_No]: 'No',
@@ -121,7 +121,7 @@ function createCoreComponentStrings() {
121
121
  [core_string_key_1.CoreStringKey.System_OperationComplete]: 'Operation completed successfully',
122
122
  [core_string_key_1.CoreStringKey.System_NoDataAvailable]: 'No data available',
123
123
  },
124
- [core_language_1.CoreLanguage.EnglishUK]: {
124
+ [language_codes_1.LanguageCodes.EN_GB]: {
125
125
  // Common/General (mostly same as US English)
126
126
  [core_string_key_1.CoreStringKey.Common_Yes]: 'Yes',
127
127
  [core_string_key_1.CoreStringKey.Common_No]: 'No',
@@ -164,7 +164,7 @@ function createCoreComponentStrings() {
164
164
  [core_string_key_1.CoreStringKey.System_OperationComplete]: 'Operation completed successfully',
165
165
  [core_string_key_1.CoreStringKey.System_NoDataAvailable]: 'No data available',
166
166
  },
167
- [core_language_1.CoreLanguage.French]: {
167
+ [language_codes_1.LanguageCodes.FR]: {
168
168
  // Common/General
169
169
  [core_string_key_1.CoreStringKey.Common_Yes]: 'Oui',
170
170
  [core_string_key_1.CoreStringKey.Common_No]: 'Non',
@@ -207,7 +207,7 @@ function createCoreComponentStrings() {
207
207
  [core_string_key_1.CoreStringKey.System_OperationComplete]: 'Opération terminée avec succès',
208
208
  [core_string_key_1.CoreStringKey.System_NoDataAvailable]: 'Aucune donnée disponible',
209
209
  },
210
- [core_language_1.CoreLanguage.Spanish]: {
210
+ [language_codes_1.LanguageCodes.ES]: {
211
211
  // Common/General
212
212
  [core_string_key_1.CoreStringKey.Common_Yes]: 'Sí',
213
213
  [core_string_key_1.CoreStringKey.Common_No]: 'No',
@@ -250,7 +250,7 @@ function createCoreComponentStrings() {
250
250
  [core_string_key_1.CoreStringKey.System_OperationComplete]: 'Operación completada exitosamente',
251
251
  [core_string_key_1.CoreStringKey.System_NoDataAvailable]: 'No hay datos disponibles',
252
252
  },
253
- [core_language_1.CoreLanguage.German]: {
253
+ [language_codes_1.LanguageCodes.DE]: {
254
254
  // Common/General
255
255
  [core_string_key_1.CoreStringKey.Common_Yes]: 'Ja',
256
256
  [core_string_key_1.CoreStringKey.Common_No]: 'Nein',
@@ -293,7 +293,7 @@ function createCoreComponentStrings() {
293
293
  [core_string_key_1.CoreStringKey.System_OperationComplete]: 'Vorgang erfolgreich abgeschlossen',
294
294
  [core_string_key_1.CoreStringKey.System_NoDataAvailable]: 'Keine Daten verfügbar',
295
295
  },
296
- [core_language_1.CoreLanguage.MandarinChinese]: {
296
+ [language_codes_1.LanguageCodes.ZH_CN]: {
297
297
  // Common/General
298
298
  [core_string_key_1.CoreStringKey.Common_Yes]: '是',
299
299
  [core_string_key_1.CoreStringKey.Common_No]: '否',
@@ -336,7 +336,7 @@ function createCoreComponentStrings() {
336
336
  [core_string_key_1.CoreStringKey.System_OperationComplete]: '操作成功完成',
337
337
  [core_string_key_1.CoreStringKey.System_NoDataAvailable]: '无可用数据',
338
338
  },
339
- [core_language_1.CoreLanguage.Japanese]: {
339
+ [language_codes_1.LanguageCodes.JA]: {
340
340
  // Common/General
341
341
  [core_string_key_1.CoreStringKey.Common_Yes]: 'はい',
342
342
  [core_string_key_1.CoreStringKey.Common_No]: 'いいえ',
@@ -379,7 +379,7 @@ function createCoreComponentStrings() {
379
379
  [core_string_key_1.CoreStringKey.System_OperationComplete]: '操作が正常に完了しました',
380
380
  [core_string_key_1.CoreStringKey.System_NoDataAvailable]: '利用可能なデータがありません',
381
381
  },
382
- [core_language_1.CoreLanguage.Ukrainian]: {
382
+ [language_codes_1.LanguageCodes.UK]: {
383
383
  // Common/General
384
384
  [core_string_key_1.CoreStringKey.Common_Yes]: 'Так',
385
385
  [core_string_key_1.CoreStringKey.Common_No]: 'Ні',
@@ -1,5 +1,6 @@
1
1
  import { I18nContext } from './i18n-context';
2
2
  import { I18nEngine } from './i18n-engine';
3
+ import { LanguageCodes } from './language-codes';
3
4
  import { Timezone } from './timezone';
4
5
  import { LanguageCodeCollection } from './types';
5
6
  export declare enum DefaultStringKey {
@@ -11,21 +12,14 @@ export declare enum DefaultStringKey {
11
12
  Error_DefaultLanguageNoCollectionTemplate = "error_defaultLanguageNoCollectionTemplate",
12
13
  Error_MissingTranslationKeyTemplate = "error_missingTranslationKeyTemplate"
13
14
  }
14
- export declare enum DefaultLanguage {
15
- EnglishUS = "English (US)",
16
- EnglishUK = "English (UK)",
17
- French = "Fran\u00E7ais",
18
- MandarinChinese = "\u4E2D\u6587",
19
- Spanish = "Espa\u00F1ol",
20
- Ukrainian = "\u0423\u043A\u0440\u0430\u0457\u043D\u0441\u044C\u043A\u0438\u0439"
21
- }
22
- export declare const DefaultLanguageCodes: LanguageCodeCollection<DefaultLanguage>;
15
+ export type DefaultLanguageCode = typeof LanguageCodes.EN_US | typeof LanguageCodes.EN_GB | typeof LanguageCodes.FR | typeof LanguageCodes.ES | typeof LanguageCodes.ZH_CN | typeof LanguageCodes.UK;
16
+ export declare const DefaultLanguageCodes: LanguageCodeCollection<DefaultLanguageCode>;
23
17
  declare global {
24
18
  namespace I18n {
25
19
  interface Config {
26
20
  StringKey: DefaultStringKey;
27
- Language: DefaultLanguage;
28
- LanguageCodes: LanguageCodeCollection<DefaultLanguage>;
21
+ Language: DefaultLanguageCode;
22
+ LanguageCodes: LanguageCodeCollection<DefaultLanguageCode>;
29
23
  engine: I18nEngine<I18n.Config['StringKey'], I18n.Config['Language'], Record<any, any>, string>;
30
24
  }
31
25
  }
@@ -33,6 +27,6 @@ declare global {
33
27
  export type StringKey = I18n.Config['StringKey'];
34
28
  export type Language = I18n.Config['Language'];
35
29
  export type Engine = I18n.Config['engine'];
36
- export type LanguageCodes = I18n.Config['LanguageCodes'];
30
+ export type DefaultLanguageCodesType = I18n.Config['LanguageCodes'];
37
31
  export declare const getI18nEngine: () => Engine;
38
- export declare const getDefaultI18nEngine: <TConstants extends Record<string, any>, TTranslationContext extends string, TContext extends I18nContext<DefaultLanguage, TTranslationContext>>(constants: TConstants, timezone?: Timezone, adminTimezone?: Timezone) => I18nEngine<DefaultStringKey, DefaultLanguage, TConstants, TTranslationContext, TContext>;
32
+ export declare const getDefaultI18nEngine: <TConstants extends Record<string, any>, TTranslationContext extends string, TContext extends I18nContext<DefaultLanguageCode, TTranslationContext>>(constants: TConstants, timezone?: Timezone, adminTimezone?: Timezone) => I18nEngine<DefaultStringKey, DefaultLanguageCode, TConstants, TTranslationContext, TContext>;
@@ -1,8 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getDefaultI18nEngine = exports.getI18nEngine = exports.DefaultLanguageCodes = exports.DefaultLanguage = exports.DefaultStringKey = void 0;
3
+ exports.getDefaultI18nEngine = exports.getI18nEngine = exports.DefaultLanguageCodes = exports.DefaultStringKey = void 0;
4
4
  const currency_code_1 = require("./currency-code");
5
5
  const i18n_engine_1 = require("./i18n-engine");
6
+ const language_codes_1 = require("./language-codes");
6
7
  const timezone_1 = require("./timezone");
7
8
  const types_1 = require("./types");
8
9
  // Default enum types that can be augmented by consumers
@@ -16,29 +17,20 @@ var DefaultStringKey;
16
17
  DefaultStringKey["Error_DefaultLanguageNoCollectionTemplate"] = "error_defaultLanguageNoCollectionTemplate";
17
18
  DefaultStringKey["Error_MissingTranslationKeyTemplate"] = "error_missingTranslationKeyTemplate";
18
19
  })(DefaultStringKey || (exports.DefaultStringKey = DefaultStringKey = {}));
19
- var DefaultLanguage;
20
- (function (DefaultLanguage) {
21
- DefaultLanguage["EnglishUS"] = "English (US)";
22
- DefaultLanguage["EnglishUK"] = "English (UK)";
23
- DefaultLanguage["French"] = "Fran\u00E7ais";
24
- DefaultLanguage["MandarinChinese"] = "\u4E2D\u6587";
25
- DefaultLanguage["Spanish"] = "Espa\u00F1ol";
26
- DefaultLanguage["Ukrainian"] = "\u0423\u043A\u0440\u0430\u0457\u043D\u0441\u044C\u043A\u0438\u0439";
27
- })(DefaultLanguage || (exports.DefaultLanguage = DefaultLanguage = {}));
28
20
  exports.DefaultLanguageCodes = {
29
- [DefaultLanguage.EnglishUS]: 'en',
30
- [DefaultLanguage.EnglishUK]: 'en-GB',
31
- [DefaultLanguage.French]: 'fr',
32
- [DefaultLanguage.MandarinChinese]: 'zh-CN',
33
- [DefaultLanguage.Spanish]: 'es',
34
- [DefaultLanguage.Ukrainian]: 'uk',
21
+ [language_codes_1.LanguageCodes.EN_US]: 'en-US',
22
+ [language_codes_1.LanguageCodes.EN_GB]: 'en-GB',
23
+ [language_codes_1.LanguageCodes.FR]: 'fr',
24
+ [language_codes_1.LanguageCodes.ES]: 'es',
25
+ [language_codes_1.LanguageCodes.ZH_CN]: 'zh-CN',
26
+ [language_codes_1.LanguageCodes.UK]: 'uk',
35
27
  };
36
28
  // Singleton instance that uses the augmented types
37
29
  const getI18nEngine = () => i18n_engine_1.I18nEngine.getInstance();
38
30
  exports.getI18nEngine = getI18nEngine;
39
31
  const getConfig = (constants, timezone, adminTimezone) => ({
40
32
  strings: {
41
- [DefaultLanguage.EnglishUS]: {
33
+ [language_codes_1.LanguageCodes.EN_US]: {
42
34
  [DefaultStringKey.Common_Test]: 'Test',
43
35
  [DefaultStringKey.Error_InstanceAlreadyExistsTemplate]: "Instance with key '{key}' already exists",
44
36
  [DefaultStringKey.Error_InstanceNotFoundTemplate]: "Instance with key '{key}' not found",
@@ -47,7 +39,7 @@ const getConfig = (constants, timezone, adminTimezone) => ({
47
39
  [DefaultStringKey.Error_DefaultLanguageNoCollectionTemplate]: "Default language '{language}' has no string collection",
48
40
  [DefaultStringKey.Error_MissingTranslationKeyTemplate]: 'Missing translation key for type: {type}',
49
41
  },
50
- [DefaultLanguage.EnglishUK]: {
42
+ [language_codes_1.LanguageCodes.EN_GB]: {
51
43
  [DefaultStringKey.Common_Test]: 'Test',
52
44
  [DefaultStringKey.Error_InstanceAlreadyExistsTemplate]: "Instance with key '{key}' already exists",
53
45
  [DefaultStringKey.Error_InstanceNotFoundTemplate]: "Instance with key '{key}' not found",
@@ -56,7 +48,7 @@ const getConfig = (constants, timezone, adminTimezone) => ({
56
48
  [DefaultStringKey.Error_DefaultLanguageNoCollectionTemplate]: "Default language '{language}' has no string collection",
57
49
  [DefaultStringKey.Error_MissingTranslationKeyTemplate]: 'Missing translation key for type: {type}',
58
50
  },
59
- [DefaultLanguage.French]: {
51
+ [language_codes_1.LanguageCodes.FR]: {
60
52
  [DefaultStringKey.Common_Test]: 'Test',
61
53
  [DefaultStringKey.Error_InstanceAlreadyExistsTemplate]: "Instance avec clé '{key}' existe déjà",
62
54
  [DefaultStringKey.Error_InstanceNotFoundTemplate]: "Instance avec clé '{key}' introuvable",
@@ -65,7 +57,7 @@ const getConfig = (constants, timezone, adminTimezone) => ({
65
57
  [DefaultStringKey.Error_DefaultLanguageNoCollectionTemplate]: "La langue par défaut '{language}' n'a pas de collection de chaînes",
66
58
  [DefaultStringKey.Error_MissingTranslationKeyTemplate]: 'Clé de traduction manquante pour le type: {type}',
67
59
  },
68
- [DefaultLanguage.MandarinChinese]: {
60
+ [language_codes_1.LanguageCodes.ZH_CN]: {
69
61
  [DefaultStringKey.Common_Test]: '测试',
70
62
  [DefaultStringKey.Error_InstanceAlreadyExistsTemplate]: "键为'{key}'的实例已存在",
71
63
  [DefaultStringKey.Error_InstanceNotFoundTemplate]: "未找到键为'{key}'的实例",
@@ -74,7 +66,7 @@ const getConfig = (constants, timezone, adminTimezone) => ({
74
66
  [DefaultStringKey.Error_DefaultLanguageNoCollectionTemplate]: "默认语言'{language}'没有字符串集合",
75
67
  [DefaultStringKey.Error_MissingTranslationKeyTemplate]: '类型缺少翻译键: {type}',
76
68
  },
77
- [DefaultLanguage.Spanish]: {
69
+ [language_codes_1.LanguageCodes.ES]: {
78
70
  [DefaultStringKey.Common_Test]: 'Prueba',
79
71
  [DefaultStringKey.Error_InstanceAlreadyExistsTemplate]: "La instancia con clave '{key}' ya existe",
80
72
  [DefaultStringKey.Error_InstanceNotFoundTemplate]: "Instancia con clave '{key}' no encontrada",
@@ -83,7 +75,7 @@ const getConfig = (constants, timezone, adminTimezone) => ({
83
75
  [DefaultStringKey.Error_DefaultLanguageNoCollectionTemplate]: "El idioma predeterminado '{language}' no tiene colección de cadenas",
84
76
  [DefaultStringKey.Error_MissingTranslationKeyTemplate]: 'Falta clave de traducción para el tipo: {type}',
85
77
  },
86
- [DefaultLanguage.Ukrainian]: {
78
+ [language_codes_1.LanguageCodes.UK]: {
87
79
  [DefaultStringKey.Common_Test]: 'Тест',
88
80
  [DefaultStringKey.Error_InstanceAlreadyExistsTemplate]: "Екземпляр з ключем '{key}' вже існує",
89
81
  [DefaultStringKey.Error_InstanceNotFoundTemplate]: "Екземпляр з ключем '{key}' не знайдено",
@@ -94,11 +86,11 @@ const getConfig = (constants, timezone, adminTimezone) => ({
94
86
  },
95
87
  },
96
88
  stringNames: Object.values(DefaultStringKey),
97
- defaultLanguage: DefaultLanguage.EnglishUS,
89
+ defaultLanguage: language_codes_1.LanguageCodes.EN_US,
98
90
  defaultTranslationContext: 'user',
99
91
  defaultCurrencyCode: new currency_code_1.CurrencyCode(types_1.DefaultCurrencyCode),
100
92
  languageCodes: exports.DefaultLanguageCodes,
101
- languages: Object.values(DefaultLanguage),
93
+ languages: [language_codes_1.LanguageCodes.EN_US, language_codes_1.LanguageCodes.EN_GB, language_codes_1.LanguageCodes.FR, language_codes_1.LanguageCodes.ES, language_codes_1.LanguageCodes.ZH_CN, language_codes_1.LanguageCodes.UK],
102
94
  constants: constants,
103
95
  enumName: 'DefaultStringKey',
104
96
  enumObj: DefaultStringKey,
@@ -1,13 +1,13 @@
1
1
  import { IActiveContext } from './active-context';
2
2
  import { CurrencyCode } from './currency-code';
3
- import { DefaultLanguage } from './default-config';
3
+ import { DefaultLanguageCode } from './default-config';
4
4
  import { IGlobalActiveContext } from './i-global-active-context';
5
5
  import { Timezone } from './timezone';
6
6
  import { LanguageContextSpace } from './types';
7
7
  export declare class GlobalActiveContext<TLanguage extends string, TActiveContext extends IActiveContext<TLanguage>> implements IGlobalActiveContext<TLanguage, TActiveContext> {
8
8
  protected static _contextMap: Map<string, IActiveContext<any>>;
9
9
  static readonly defaultContextKey = "default";
10
- static readonly defaultLanguage: DefaultLanguage;
10
+ static readonly defaultLanguage: DefaultLanguageCode;
11
11
  private static _instance;
12
12
  static get instance(): GlobalActiveContext<any, any>;
13
13
  static getInstance<TLanguage extends string, TActiveContext extends IActiveContext<TLanguage>>(): GlobalActiveContext<TLanguage, TActiveContext>;
@@ -4,7 +4,6 @@ exports.GlobalActiveContext = void 0;
4
4
  const context_error_1 = require("./context-error");
5
5
  const context_error_type_1 = require("./context-error-type");
6
6
  const currency_code_1 = require("./currency-code");
7
- const default_config_1 = require("./default-config");
8
7
  const timezone_1 = require("./timezone");
9
8
  const types_1 = require("./types");
10
9
  class GlobalActiveContext {
@@ -168,4 +167,4 @@ class GlobalActiveContext {
168
167
  exports.GlobalActiveContext = GlobalActiveContext;
169
168
  GlobalActiveContext._contextMap = new Map();
170
169
  GlobalActiveContext.defaultContextKey = 'default';
171
- GlobalActiveContext.defaultLanguage = default_config_1.DefaultLanguage.EnglishUS;
170
+ GlobalActiveContext.defaultLanguage = 'en-US';
package/dist/index.d.ts CHANGED
@@ -25,8 +25,8 @@ export * from './utils';
25
25
  export * from './validation-config';
26
26
  export * from './validation-result';
27
27
  export * from './core-i18n';
28
- export * from './core-language';
29
28
  export * from './core-string-key';
29
+ export * from './language-codes';
30
30
  export * from './language-registry';
31
31
  export * from './plugin-i18n-engine';
32
32
  export * from './registry-config';
package/dist/index.js CHANGED
@@ -44,8 +44,8 @@ __exportStar(require("./utils"), exports);
44
44
  __exportStar(require("./validation-config"), exports);
45
45
  __exportStar(require("./validation-result"), exports);
46
46
  __exportStar(require("./core-i18n"), exports);
47
- __exportStar(require("./core-language"), exports);
48
47
  __exportStar(require("./core-string-key"), exports);
48
+ __exportStar(require("./language-codes"), exports);
49
49
  __exportStar(require("./language-registry"), exports);
50
50
  __exportStar(require("./plugin-i18n-engine"), exports);
51
51
  __exportStar(require("./registry-config"), exports);
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Common language codes following BCP 47 standard.
3
+ * These are provided as constants for convenience, but any string can be used as a language code.
4
+ * Site builders can use these or define their own custom language codes.
5
+ */
6
+ export declare const LanguageCodes: {
7
+ readonly EN_US: "en-US";
8
+ readonly EN_GB: "en-GB";
9
+ readonly FR: "fr";
10
+ readonly ES: "es";
11
+ readonly DE: "de";
12
+ readonly ZH_CN: "zh-CN";
13
+ readonly JA: "ja";
14
+ readonly UK: "uk";
15
+ };
16
+ /**
17
+ * Type representing any language code (string)
18
+ */
19
+ export type LanguageCode = string;
20
+ /**
21
+ * Type representing the common language codes provided by this library
22
+ */
23
+ export type CommonLanguageCode = typeof LanguageCodes[keyof typeof LanguageCodes];
24
+ /**
25
+ * Helper to get display names for common language codes
26
+ */
27
+ export declare const LanguageDisplayNames: Record<CommonLanguageCode, string>;
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LanguageDisplayNames = exports.LanguageCodes = void 0;
4
+ /**
5
+ * Common language codes following BCP 47 standard.
6
+ * These are provided as constants for convenience, but any string can be used as a language code.
7
+ * Site builders can use these or define their own custom language codes.
8
+ */
9
+ exports.LanguageCodes = {
10
+ EN_US: 'en-US',
11
+ EN_GB: 'en-GB',
12
+ FR: 'fr',
13
+ ES: 'es',
14
+ DE: 'de',
15
+ ZH_CN: 'zh-CN',
16
+ JA: 'ja',
17
+ UK: 'uk',
18
+ };
19
+ /**
20
+ * Helper to get display names for common language codes
21
+ */
22
+ exports.LanguageDisplayNames = {
23
+ [exports.LanguageCodes.EN_US]: 'English (US)',
24
+ [exports.LanguageCodes.EN_GB]: 'English (UK)',
25
+ [exports.LanguageCodes.FR]: 'Français',
26
+ [exports.LanguageCodes.ES]: 'Español',
27
+ [exports.LanguageCodes.DE]: 'Deutsch',
28
+ [exports.LanguageCodes.ZH_CN]: '中文',
29
+ [exports.LanguageCodes.JA]: '日本語',
30
+ [exports.LanguageCodes.UK]: 'Українська',
31
+ };
@@ -1,4 +1,4 @@
1
- import { CoreLanguage } from './core-language';
1
+ import { CoreLanguageCode } from './core-i18n';
2
2
  import { RegistryErrorType } from './registry-error-type';
3
3
  import { TranslationEngine } from './typed-error';
4
4
  /**
@@ -11,7 +11,7 @@ export declare class RegistryError extends Error {
11
11
  /**
12
12
  * Create a registry error with translation support
13
13
  */
14
- static createWithEngine(engine: TranslationEngine, type: RegistryErrorType, variables?: Record<string, string | number>, language?: CoreLanguage, metadata?: Record<string, any>): RegistryError;
14
+ static createWithEngine(engine: TranslationEngine, type: RegistryErrorType, variables?: Record<string, string | number>, language?: CoreLanguageCode, metadata?: Record<string, any>): RegistryError;
15
15
  /**
16
16
  * Create a simple RegistryError without engine dependency
17
17
  */
@@ -1,6 +1,6 @@
1
1
  import { Language, StringKey } from './default-config';
2
2
  import { I18nEngine } from './i18n-engine';
3
- import { CoreLanguage } from './core-language';
3
+ import { CoreLanguageCode } from './core-i18n';
4
4
  import { CoreStringKey } from './core-string-key';
5
5
  import { PluginI18nEngine } from './plugin-i18n-engine';
6
6
  /**
@@ -42,7 +42,7 @@ export declare abstract class TypedError<TEnum extends Record<string, string>, T
42
42
  /**
43
43
  * Plugin-based TypedError that works with the new component registration system
44
44
  */
45
- export declare abstract class PluginTypedError<TEnum extends Record<string, string>, TStringKey extends string, TLanguages extends string = CoreLanguage> extends Error {
45
+ export declare abstract class PluginTypedError<TEnum extends Record<string, string>, TStringKey extends string, TLanguages extends string = string> extends Error {
46
46
  readonly componentId: string;
47
47
  readonly type: TEnum[keyof TEnum];
48
48
  readonly reasonMap: CompleteReasonMap<TEnum, TStringKey>;
@@ -56,18 +56,18 @@ export declare abstract class PluginTypedError<TEnum extends Record<string, stri
56
56
  export declare abstract class CoreTypedError<TEnum extends Record<string, string>> extends Error {
57
57
  readonly type: TEnum[keyof TEnum];
58
58
  readonly reasonMap: CompleteReasonMap<TEnum, CoreStringKey>;
59
- readonly language?: CoreLanguage | undefined;
59
+ readonly language?: CoreLanguageCode | undefined;
60
60
  readonly otherVars?: Record<string, string | number> | undefined;
61
- constructor(engine: PluginI18nEngine<CoreLanguage>, type: TEnum[keyof TEnum], reasonMap: CompleteReasonMap<TEnum, CoreStringKey>, language?: CoreLanguage | undefined, otherVars?: Record<string, string | number> | undefined);
61
+ constructor(engine: PluginI18nEngine<CoreLanguageCode>, type: TEnum[keyof TEnum], reasonMap: CompleteReasonMap<TEnum, CoreStringKey>, language?: CoreLanguageCode | undefined, otherVars?: Record<string, string | number> | undefined);
62
62
  }
63
63
  /**
64
64
  * Helper function to create a plugin-based TypedError with automatic engine detection
65
65
  */
66
- export declare function createPluginTypedError<TEnum extends Record<string, string>, TStringKey extends string, TLanguages extends string = CoreLanguage>(componentId: string, type: TEnum[keyof TEnum], reasonMap: CompleteReasonMap<TEnum, TStringKey>, otherVars?: Record<string, string | number>, language?: TLanguages, instanceKey?: string): Error;
66
+ export declare function createPluginTypedError<TEnum extends Record<string, string>, TStringKey extends string, TLanguages extends string = string>(componentId: string, type: TEnum[keyof TEnum], reasonMap: CompleteReasonMap<TEnum, TStringKey>, otherVars?: Record<string, string | number>, language?: TLanguages, instanceKey?: string): Error;
67
67
  /**
68
68
  * Helper function to create a core system TypedError with automatic engine detection
69
69
  */
70
- export declare function createCoreTypedError<TEnum extends Record<string, string>>(type: TEnum[keyof TEnum], reasonMap: CompleteReasonMap<TEnum, CoreStringKey>, otherVars?: Record<string, string | number>, language?: CoreLanguage, instanceKey?: string): Error;
70
+ export declare function createCoreTypedError<TEnum extends Record<string, string>>(type: TEnum[keyof TEnum], reasonMap: CompleteReasonMap<TEnum, CoreStringKey>, otherVars?: Record<string, string | number>, language?: CoreLanguageCode, instanceKey?: string): Error;
71
71
  /**
72
72
  * Create a simple error with translation support (generalized pattern from RegistryError)
73
73
  */
@@ -177,7 +177,7 @@ const coreErrorReasonMap: CompleteReasonMap<typeof DatabaseErrorType, CoreString
177
177
 
178
178
  class DatabaseError extends CoreTypedError<typeof DatabaseErrorType> {
179
179
  constructor(
180
- engine: PluginI18nEngine<CoreLanguage>,
180
+ engine: PluginI18nEngine<CoreLanguageCode>,
181
181
  type: DatabaseErrorType,
182
182
  otherVars?: Record<string, string | number>,
183
183
  language?: CoreLanguage
@@ -187,7 +187,7 @@ class DatabaseError extends CoreTypedError<typeof DatabaseErrorType> {
187
187
  }
188
188
 
189
189
  // Usage:
190
- // const engine = PluginI18nEngine.getInstance<CoreLanguage>();
190
+ // const engine = PluginI18nEngine.getInstance<CoreLanguageCode>();
191
191
  // throw new DatabaseError(engine, DatabaseErrorType.ConnectionFailed);
192
192
  */
193
193
  // Example 2: Custom component error with custom strings
@@ -210,9 +210,9 @@ const userErrorReasonMap: CompleteReasonMap<typeof UserErrorType, UserErrorStrin
210
210
  [UserErrorType.AccountLocked]: UserErrorStringKey.AccountLockedMessage
211
211
  };
212
212
 
213
- class UserError extends PluginTypedError<typeof UserErrorType, UserErrorStringKey, CoreLanguage> {
213
+ class UserError extends PluginTypedError<typeof UserErrorType, UserErrorStringKey, CoreLanguageCode> {
214
214
  constructor(
215
- engine: PluginI18nEngine<CoreLanguage>,
215
+ engine: PluginI18nEngine<CoreLanguageCode>,
216
216
  type: UserErrorType,
217
217
  otherVars?: Record<string, string | number>,
218
218
  language?: CoreLanguage
@@ -222,7 +222,7 @@ class UserError extends PluginTypedError<typeof UserErrorType, UserErrorStringKe
222
222
  }
223
223
 
224
224
  // Usage:
225
- // const engine = PluginI18nEngine.getInstance<CoreLanguage>();
225
+ // const engine = PluginI18nEngine.getInstance<CoreLanguageCode>();
226
226
  // throw new UserError(engine, UserErrorType.UserNotFound, { username: 'john_doe' });
227
227
  */
228
228
  // Example 3: Using helper functions for simpler error creation
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@digitaldefiance/i18n-lib",
3
- "version": "1.1.10",
3
+ "version": "1.2.0",
4
4
  "description": "Generic i18n library with enum translation support",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",