@gears-frontx/i18n 0.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/CLAUDE.md +134 -0
- package/dist/index.cjs +901 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +328 -0
- package/dist/index.d.ts +328 -0
- package/dist/index.js +850 -0
- package/dist/index.js.map +1 -0
- package/dist/types.cjs +98 -0
- package/dist/types.cjs.map +1 -0
- package/dist/types.d.cts +305 -0
- package/dist/types.d.ts +305 -0
- package/dist/types.js +66 -0
- package/dist/types.js.map +1 -0
- package/llms.txt +49 -0
- package/package.json +48 -0
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @gears-frontx/i18n - Type Definitions
|
|
3
|
+
*
|
|
4
|
+
* Core types for HAI3 internationalization.
|
|
5
|
+
* Supports 36 languages with RTL support.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Text Direction Enum
|
|
9
|
+
* Defines text direction for RTL language support.
|
|
10
|
+
*/
|
|
11
|
+
declare enum TextDirection {
|
|
12
|
+
LeftToRight = "ltr",
|
|
13
|
+
RightToLeft = "rtl"
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Language Enum
|
|
17
|
+
* All 36 supported languages based on major platforms (Google, Facebook, Microsoft, Apple).
|
|
18
|
+
*/
|
|
19
|
+
declare enum Language {
|
|
20
|
+
English = "en",
|
|
21
|
+
Spanish = "es",
|
|
22
|
+
French = "fr",
|
|
23
|
+
German = "de",
|
|
24
|
+
Italian = "it",
|
|
25
|
+
Portuguese = "pt",
|
|
26
|
+
Dutch = "nl",
|
|
27
|
+
Russian = "ru",
|
|
28
|
+
Polish = "pl",
|
|
29
|
+
Ukrainian = "uk",
|
|
30
|
+
Czech = "cs",
|
|
31
|
+
Arabic = "ar",
|
|
32
|
+
Hebrew = "he",
|
|
33
|
+
Persian = "fa",
|
|
34
|
+
Urdu = "ur",
|
|
35
|
+
Turkish = "tr",
|
|
36
|
+
ChineseSimplified = "zh",
|
|
37
|
+
ChineseTraditional = "zh-TW",
|
|
38
|
+
Japanese = "ja",
|
|
39
|
+
Korean = "ko",
|
|
40
|
+
Vietnamese = "vi",
|
|
41
|
+
Thai = "th",
|
|
42
|
+
Indonesian = "id",
|
|
43
|
+
Hindi = "hi",
|
|
44
|
+
Bengali = "bn",
|
|
45
|
+
Swedish = "sv",
|
|
46
|
+
Danish = "da",
|
|
47
|
+
Norwegian = "no",
|
|
48
|
+
Finnish = "fi",
|
|
49
|
+
Greek = "el",
|
|
50
|
+
Romanian = "ro",
|
|
51
|
+
Hungarian = "hu",
|
|
52
|
+
Malay = "ms",
|
|
53
|
+
Tagalog = "tl",
|
|
54
|
+
Tamil = "ta",
|
|
55
|
+
Swahili = "sw"
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Language Metadata
|
|
59
|
+
* Complete information about a supported language.
|
|
60
|
+
*/
|
|
61
|
+
interface LanguageMetadata {
|
|
62
|
+
/** Language code (from Language enum) */
|
|
63
|
+
code: Language;
|
|
64
|
+
/** Native name (e.g., 'English', 'العربية') */
|
|
65
|
+
name: string;
|
|
66
|
+
/** English name for settings UI */
|
|
67
|
+
englishName: string;
|
|
68
|
+
/** Text direction */
|
|
69
|
+
direction: TextDirection;
|
|
70
|
+
/** Optional region (e.g., 'US', 'GB', 'TW') */
|
|
71
|
+
region?: string;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Language Code Type
|
|
75
|
+
* Type alias for language codes.
|
|
76
|
+
*/
|
|
77
|
+
type LanguageCode = Language;
|
|
78
|
+
/**
|
|
79
|
+
* Translation Dictionary
|
|
80
|
+
* Nested key-value structure for translations.
|
|
81
|
+
*
|
|
82
|
+
* @example
|
|
83
|
+
* ```typescript
|
|
84
|
+
* const translations: TranslationDictionary = {
|
|
85
|
+
* button: {
|
|
86
|
+
* submit: 'Submit',
|
|
87
|
+
* cancel: 'Cancel',
|
|
88
|
+
* },
|
|
89
|
+
* messages: {
|
|
90
|
+
* success: 'Operation completed successfully',
|
|
91
|
+
* },
|
|
92
|
+
* };
|
|
93
|
+
* ```
|
|
94
|
+
*/
|
|
95
|
+
interface TranslationDictionary {
|
|
96
|
+
[key: string]: string | TranslationDictionary;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Translation Loader Function
|
|
100
|
+
* Returns translations for a given language using dynamic import.
|
|
101
|
+
* Accepts both Language enum and string for compatibility with @gears-frontx/layout.
|
|
102
|
+
*
|
|
103
|
+
* @example
|
|
104
|
+
* ```typescript
|
|
105
|
+
* const loader: TranslationLoader = async (language) => {
|
|
106
|
+
* const module = await import(`./i18n/${language}.json`);
|
|
107
|
+
* return module.default;
|
|
108
|
+
* };
|
|
109
|
+
* ```
|
|
110
|
+
*/
|
|
111
|
+
type TranslationLoader = (language: Language | string) => Promise<TranslationDictionary>;
|
|
112
|
+
/**
|
|
113
|
+
* Translation Map
|
|
114
|
+
* Maps languages to their dynamic import functions.
|
|
115
|
+
* Used by I18nRegistry.createLoader().
|
|
116
|
+
*
|
|
117
|
+
* @example
|
|
118
|
+
* ```typescript
|
|
119
|
+
* const translationMap: TranslationMap = {
|
|
120
|
+
* [Language.English]: () => import('./i18n/en.json'),
|
|
121
|
+
* [Language.Spanish]: () => import('./i18n/es.json'),
|
|
122
|
+
* // ... all 36 languages
|
|
123
|
+
* };
|
|
124
|
+
* ```
|
|
125
|
+
*/
|
|
126
|
+
type TranslationMap = Record<Language, () => Promise<{
|
|
127
|
+
default: TranslationDictionary;
|
|
128
|
+
}>>;
|
|
129
|
+
/**
|
|
130
|
+
* I18n Configuration
|
|
131
|
+
* Configuration options for the i18n system.
|
|
132
|
+
*/
|
|
133
|
+
interface I18nConfig {
|
|
134
|
+
/** Default language to use */
|
|
135
|
+
defaultLanguage: LanguageCode;
|
|
136
|
+
/** Fallback language when translation is missing */
|
|
137
|
+
fallbackLanguage: LanguageCode;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Translation Parameters
|
|
141
|
+
* Parameters for string interpolation.
|
|
142
|
+
*
|
|
143
|
+
* @example
|
|
144
|
+
* ```typescript
|
|
145
|
+
* // Translation: "Hello, {name}!"
|
|
146
|
+
* t('greeting', { name: 'John' }); // "Hello, John!"
|
|
147
|
+
* ```
|
|
148
|
+
*/
|
|
149
|
+
type TranslationParams = Record<string, string | number | boolean>;
|
|
150
|
+
/**
|
|
151
|
+
* I18n Registry Interface
|
|
152
|
+
* Central registry for translation management.
|
|
153
|
+
*
|
|
154
|
+
* @example
|
|
155
|
+
* ```typescript
|
|
156
|
+
* // Register translations
|
|
157
|
+
* i18nRegistry.registerLoader('screenset.demo', demoLoader);
|
|
158
|
+
*
|
|
159
|
+
* // Set language
|
|
160
|
+
* await i18nRegistry.setLanguage(Language.Spanish);
|
|
161
|
+
*
|
|
162
|
+
* // Translate
|
|
163
|
+
* const text = i18nRegistry.t('screenset.demo:welcome.title');
|
|
164
|
+
* ```
|
|
165
|
+
*/
|
|
166
|
+
interface I18nRegistry {
|
|
167
|
+
/**
|
|
168
|
+
* Register translations for a namespace.
|
|
169
|
+
*
|
|
170
|
+
* @param namespace - Translation namespace (e.g., 'screenset.demo')
|
|
171
|
+
* @param language - Language enum value
|
|
172
|
+
* @param translations - Translation dictionary
|
|
173
|
+
*/
|
|
174
|
+
register(namespace: string, language: Language, translations: TranslationDictionary): void;
|
|
175
|
+
/**
|
|
176
|
+
* Register a translation loader for a namespace.
|
|
177
|
+
* Loader is called on-demand when language changes.
|
|
178
|
+
*
|
|
179
|
+
* @param namespace - Namespace identifier
|
|
180
|
+
* @param loader - Function that loads translations
|
|
181
|
+
*/
|
|
182
|
+
registerLoader(namespace: string, loader: TranslationLoader): void;
|
|
183
|
+
/**
|
|
184
|
+
* Translate a key.
|
|
185
|
+
*
|
|
186
|
+
* @param key - Format: 'namespace:key.subkey' or just 'key' for default namespace
|
|
187
|
+
* @param params - Interpolation parameters
|
|
188
|
+
* @returns Translated string
|
|
189
|
+
*/
|
|
190
|
+
t(key: string, params?: TranslationParams): string;
|
|
191
|
+
/**
|
|
192
|
+
* Set current language and load translations.
|
|
193
|
+
* Updates HTML lang and dir attributes.
|
|
194
|
+
*
|
|
195
|
+
* @param language - Language to set
|
|
196
|
+
*/
|
|
197
|
+
setLanguage(language: Language): Promise<void>;
|
|
198
|
+
/**
|
|
199
|
+
* Get current language.
|
|
200
|
+
*
|
|
201
|
+
* @returns Current language or null if not set
|
|
202
|
+
*/
|
|
203
|
+
getLanguage(): Language | null;
|
|
204
|
+
/**
|
|
205
|
+
* Get language metadata.
|
|
206
|
+
*
|
|
207
|
+
* @param code - Optional language code (defaults to current)
|
|
208
|
+
* @returns Language metadata
|
|
209
|
+
*/
|
|
210
|
+
getLanguageMetadata(code?: Language): LanguageMetadata | undefined;
|
|
211
|
+
/**
|
|
212
|
+
* Get all supported languages.
|
|
213
|
+
*
|
|
214
|
+
* @returns Array of language metadata
|
|
215
|
+
*/
|
|
216
|
+
getSupportedLanguages(): LanguageMetadata[];
|
|
217
|
+
/**
|
|
218
|
+
* Check if current language is RTL.
|
|
219
|
+
*
|
|
220
|
+
* @param code - Optional language code (defaults to current)
|
|
221
|
+
* @returns True if RTL
|
|
222
|
+
*/
|
|
223
|
+
isRTL(code?: Language): boolean;
|
|
224
|
+
/**
|
|
225
|
+
* Check if namespace is registered.
|
|
226
|
+
*
|
|
227
|
+
* @param namespace - Namespace to check
|
|
228
|
+
* @returns True if registered
|
|
229
|
+
*/
|
|
230
|
+
hasNamespace(namespace: string): boolean;
|
|
231
|
+
/**
|
|
232
|
+
* Get all registered namespaces.
|
|
233
|
+
*
|
|
234
|
+
* @returns Array of namespace identifiers
|
|
235
|
+
*/
|
|
236
|
+
getNamespaces(): string[];
|
|
237
|
+
/**
|
|
238
|
+
* Load translations for a specific language.
|
|
239
|
+
*
|
|
240
|
+
* @param language - Language to load
|
|
241
|
+
*/
|
|
242
|
+
loadLanguage(language: Language): Promise<void>;
|
|
243
|
+
/**
|
|
244
|
+
* Load translations for a specific screenset.
|
|
245
|
+
*
|
|
246
|
+
* @param screensetId - Screenset ID
|
|
247
|
+
* @param language - Optional language (defaults to current)
|
|
248
|
+
*/
|
|
249
|
+
loadScreensetTranslations(screensetId: string, language?: Language): Promise<void>;
|
|
250
|
+
/**
|
|
251
|
+
* Preload translations for multiple languages.
|
|
252
|
+
*
|
|
253
|
+
* @param languages - Languages to preload
|
|
254
|
+
*/
|
|
255
|
+
preloadLanguages(languages: Language[]): Promise<void>;
|
|
256
|
+
/**
|
|
257
|
+
* Subscribe to translation changes.
|
|
258
|
+
* Called when new translations are registered.
|
|
259
|
+
*
|
|
260
|
+
* @param callback - Function to call on changes
|
|
261
|
+
* @returns Unsubscribe function
|
|
262
|
+
*/
|
|
263
|
+
subscribe(callback: () => void): () => void;
|
|
264
|
+
/**
|
|
265
|
+
* Get the current version number.
|
|
266
|
+
* Increments when translations change. Used by React for re-rendering.
|
|
267
|
+
*
|
|
268
|
+
* @returns Current version number
|
|
269
|
+
*/
|
|
270
|
+
getVersion(): number;
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Language Display Mode
|
|
274
|
+
* How to display language names in the UI.
|
|
275
|
+
*/
|
|
276
|
+
declare enum LanguageDisplayMode {
|
|
277
|
+
/** Show native name (e.g., 'Español') */
|
|
278
|
+
Native = "native",
|
|
279
|
+
/** Show English name (e.g., 'Spanish') */
|
|
280
|
+
English = "english"
|
|
281
|
+
}
|
|
282
|
+
/**
|
|
283
|
+
* I18n namespace separator constant.
|
|
284
|
+
* Used to separate namespace from key: 'namespace:key'
|
|
285
|
+
*/
|
|
286
|
+
declare const I18N_NAMESPACE_SEPARATOR = ":";
|
|
287
|
+
/**
|
|
288
|
+
* I18n path separator constant.
|
|
289
|
+
* Used to separate nested keys: 'key.subkey'
|
|
290
|
+
*/
|
|
291
|
+
declare const I18N_PATH_SEPARATOR = ".";
|
|
292
|
+
/**
|
|
293
|
+
* Default namespace for translations without explicit namespace.
|
|
294
|
+
*/
|
|
295
|
+
declare const I18N_DEFAULT_NAMESPACE = "app";
|
|
296
|
+
/**
|
|
297
|
+
* HTML lang attribute name.
|
|
298
|
+
*/
|
|
299
|
+
declare const HTML_LANG_ATTRIBUTE = "lang";
|
|
300
|
+
/**
|
|
301
|
+
* HTML dir attribute name.
|
|
302
|
+
*/
|
|
303
|
+
declare const HTML_DIR_ATTRIBUTE = "dir";
|
|
304
|
+
|
|
305
|
+
export { HTML_DIR_ATTRIBUTE, HTML_LANG_ATTRIBUTE, I18N_DEFAULT_NAMESPACE, I18N_NAMESPACE_SEPARATOR, I18N_PATH_SEPARATOR, type I18nConfig, type I18nRegistry, Language, type LanguageCode, LanguageDisplayMode, type LanguageMetadata, TextDirection, type TranslationDictionary, type TranslationLoader, type TranslationMap, type TranslationParams };
|
package/dist/types.js
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
// src/types.ts
|
|
2
|
+
var TextDirection = /* @__PURE__ */ ((TextDirection2) => {
|
|
3
|
+
TextDirection2["LeftToRight"] = "ltr";
|
|
4
|
+
TextDirection2["RightToLeft"] = "rtl";
|
|
5
|
+
return TextDirection2;
|
|
6
|
+
})(TextDirection || {});
|
|
7
|
+
var Language = /* @__PURE__ */ ((Language2) => {
|
|
8
|
+
Language2["English"] = "en";
|
|
9
|
+
Language2["Spanish"] = "es";
|
|
10
|
+
Language2["French"] = "fr";
|
|
11
|
+
Language2["German"] = "de";
|
|
12
|
+
Language2["Italian"] = "it";
|
|
13
|
+
Language2["Portuguese"] = "pt";
|
|
14
|
+
Language2["Dutch"] = "nl";
|
|
15
|
+
Language2["Russian"] = "ru";
|
|
16
|
+
Language2["Polish"] = "pl";
|
|
17
|
+
Language2["Ukrainian"] = "uk";
|
|
18
|
+
Language2["Czech"] = "cs";
|
|
19
|
+
Language2["Arabic"] = "ar";
|
|
20
|
+
Language2["Hebrew"] = "he";
|
|
21
|
+
Language2["Persian"] = "fa";
|
|
22
|
+
Language2["Urdu"] = "ur";
|
|
23
|
+
Language2["Turkish"] = "tr";
|
|
24
|
+
Language2["ChineseSimplified"] = "zh";
|
|
25
|
+
Language2["ChineseTraditional"] = "zh-TW";
|
|
26
|
+
Language2["Japanese"] = "ja";
|
|
27
|
+
Language2["Korean"] = "ko";
|
|
28
|
+
Language2["Vietnamese"] = "vi";
|
|
29
|
+
Language2["Thai"] = "th";
|
|
30
|
+
Language2["Indonesian"] = "id";
|
|
31
|
+
Language2["Hindi"] = "hi";
|
|
32
|
+
Language2["Bengali"] = "bn";
|
|
33
|
+
Language2["Swedish"] = "sv";
|
|
34
|
+
Language2["Danish"] = "da";
|
|
35
|
+
Language2["Norwegian"] = "no";
|
|
36
|
+
Language2["Finnish"] = "fi";
|
|
37
|
+
Language2["Greek"] = "el";
|
|
38
|
+
Language2["Romanian"] = "ro";
|
|
39
|
+
Language2["Hungarian"] = "hu";
|
|
40
|
+
Language2["Malay"] = "ms";
|
|
41
|
+
Language2["Tagalog"] = "tl";
|
|
42
|
+
Language2["Tamil"] = "ta";
|
|
43
|
+
Language2["Swahili"] = "sw";
|
|
44
|
+
return Language2;
|
|
45
|
+
})(Language || {});
|
|
46
|
+
var LanguageDisplayMode = /* @__PURE__ */ ((LanguageDisplayMode2) => {
|
|
47
|
+
LanguageDisplayMode2["Native"] = "native";
|
|
48
|
+
LanguageDisplayMode2["English"] = "english";
|
|
49
|
+
return LanguageDisplayMode2;
|
|
50
|
+
})(LanguageDisplayMode || {});
|
|
51
|
+
var I18N_NAMESPACE_SEPARATOR = ":";
|
|
52
|
+
var I18N_PATH_SEPARATOR = ".";
|
|
53
|
+
var I18N_DEFAULT_NAMESPACE = "app";
|
|
54
|
+
var HTML_LANG_ATTRIBUTE = "lang";
|
|
55
|
+
var HTML_DIR_ATTRIBUTE = "dir";
|
|
56
|
+
export {
|
|
57
|
+
HTML_DIR_ATTRIBUTE,
|
|
58
|
+
HTML_LANG_ATTRIBUTE,
|
|
59
|
+
I18N_DEFAULT_NAMESPACE,
|
|
60
|
+
I18N_NAMESPACE_SEPARATOR,
|
|
61
|
+
I18N_PATH_SEPARATOR,
|
|
62
|
+
Language,
|
|
63
|
+
LanguageDisplayMode,
|
|
64
|
+
TextDirection
|
|
65
|
+
};
|
|
66
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/types.ts"],"sourcesContent":["/**\n * @gears-frontx/i18n - Type Definitions\n *\n * Core types for HAI3 internationalization.\n * Supports 36 languages with RTL support.\n */\n\n// ============================================================================\n// Text Direction\n// ============================================================================\n\n/**\n * Text Direction Enum\n * Defines text direction for RTL language support.\n */\nexport enum TextDirection {\n LeftToRight = 'ltr',\n RightToLeft = 'rtl',\n}\n\n// ============================================================================\n// Language Enum\n// ============================================================================\n\n/**\n * Language Enum\n * All 36 supported languages based on major platforms (Google, Facebook, Microsoft, Apple).\n */\nexport enum Language {\n // Western European\n English = 'en',\n Spanish = 'es',\n French = 'fr',\n German = 'de',\n Italian = 'it',\n Portuguese = 'pt',\n Dutch = 'nl',\n\n // Eastern European\n Russian = 'ru',\n Polish = 'pl',\n Ukrainian = 'uk',\n Czech = 'cs',\n\n // Middle East & North Africa (RTL)\n Arabic = 'ar',\n Hebrew = 'he',\n Persian = 'fa',\n Urdu = 'ur',\n Turkish = 'tr',\n\n // Asian\n ChineseSimplified = 'zh',\n ChineseTraditional = 'zh-TW',\n Japanese = 'ja',\n Korean = 'ko',\n Vietnamese = 'vi',\n Thai = 'th',\n Indonesian = 'id',\n Hindi = 'hi',\n Bengali = 'bn',\n\n // Nordic\n Swedish = 'sv',\n Danish = 'da',\n Norwegian = 'no',\n Finnish = 'fi',\n\n // Other\n Greek = 'el',\n Romanian = 'ro',\n Hungarian = 'hu',\n\n // Additional major languages\n Malay = 'ms',\n Tagalog = 'tl',\n Tamil = 'ta',\n Swahili = 'sw',\n}\n\n// ============================================================================\n// Language Metadata\n// ============================================================================\n\n/**\n * Language Metadata\n * Complete information about a supported language.\n */\nexport interface LanguageMetadata {\n /** Language code (from Language enum) */\n code: Language;\n /** Native name (e.g., 'English', 'العربية') */\n name: string;\n /** English name for settings UI */\n englishName: string;\n /** Text direction */\n direction: TextDirection;\n /** Optional region (e.g., 'US', 'GB', 'TW') */\n region?: string;\n}\n\n/**\n * Language Code Type\n * Type alias for language codes.\n */\nexport type LanguageCode = Language;\n\n// ============================================================================\n// Translation Types\n// ============================================================================\n\n/**\n * Translation Dictionary\n * Nested key-value structure for translations.\n *\n * @example\n * ```typescript\n * const translations: TranslationDictionary = {\n * button: {\n * submit: 'Submit',\n * cancel: 'Cancel',\n * },\n * messages: {\n * success: 'Operation completed successfully',\n * },\n * };\n * ```\n */\nexport interface TranslationDictionary {\n [key: string]: string | TranslationDictionary;\n}\n\n/**\n * Translation Loader Function\n * Returns translations for a given language using dynamic import.\n * Accepts both Language enum and string for compatibility with @gears-frontx/layout.\n *\n * @example\n * ```typescript\n * const loader: TranslationLoader = async (language) => {\n * const module = await import(`./i18n/${language}.json`);\n * return module.default;\n * };\n * ```\n */\nexport type TranslationLoader = (language: Language | string) => Promise<TranslationDictionary>;\n\n/**\n * Translation Map\n * Maps languages to their dynamic import functions.\n * Used by I18nRegistry.createLoader().\n *\n * @example\n * ```typescript\n * const translationMap: TranslationMap = {\n * [Language.English]: () => import('./i18n/en.json'),\n * [Language.Spanish]: () => import('./i18n/es.json'),\n * // ... all 36 languages\n * };\n * ```\n */\nexport type TranslationMap = Record<Language, () => Promise<{ default: TranslationDictionary }>>;\n\n// ============================================================================\n// I18n Configuration\n// ============================================================================\n\n/**\n * I18n Configuration\n * Configuration options for the i18n system.\n */\nexport interface I18nConfig {\n /** Default language to use */\n defaultLanguage: LanguageCode;\n /** Fallback language when translation is missing */\n fallbackLanguage: LanguageCode;\n}\n\n/**\n * Translation Parameters\n * Parameters for string interpolation.\n *\n * @example\n * ```typescript\n * // Translation: \"Hello, {name}!\"\n * t('greeting', { name: 'John' }); // \"Hello, John!\"\n * ```\n */\nexport type TranslationParams = Record<string, string | number | boolean>;\n\n// ============================================================================\n// I18n Registry Interface\n// ============================================================================\n\n/**\n * I18n Registry Interface\n * Central registry for translation management.\n *\n * @example\n * ```typescript\n * // Register translations\n * i18nRegistry.registerLoader('screenset.demo', demoLoader);\n *\n * // Set language\n * await i18nRegistry.setLanguage(Language.Spanish);\n *\n * // Translate\n * const text = i18nRegistry.t('screenset.demo:welcome.title');\n * ```\n */\nexport interface I18nRegistry {\n /**\n * Register translations for a namespace.\n *\n * @param namespace - Translation namespace (e.g., 'screenset.demo')\n * @param language - Language enum value\n * @param translations - Translation dictionary\n */\n register(namespace: string, language: Language, translations: TranslationDictionary): void;\n\n /**\n * Register a translation loader for a namespace.\n * Loader is called on-demand when language changes.\n *\n * @param namespace - Namespace identifier\n * @param loader - Function that loads translations\n */\n registerLoader(namespace: string, loader: TranslationLoader): void;\n\n /**\n * Translate a key.\n *\n * @param key - Format: 'namespace:key.subkey' or just 'key' for default namespace\n * @param params - Interpolation parameters\n * @returns Translated string\n */\n t(key: string, params?: TranslationParams): string;\n\n /**\n * Set current language and load translations.\n * Updates HTML lang and dir attributes.\n *\n * @param language - Language to set\n */\n setLanguage(language: Language): Promise<void>;\n\n /**\n * Get current language.\n *\n * @returns Current language or null if not set\n */\n getLanguage(): Language | null;\n\n /**\n * Get language metadata.\n *\n * @param code - Optional language code (defaults to current)\n * @returns Language metadata\n */\n getLanguageMetadata(code?: Language): LanguageMetadata | undefined;\n\n /**\n * Get all supported languages.\n *\n * @returns Array of language metadata\n */\n getSupportedLanguages(): LanguageMetadata[];\n\n /**\n * Check if current language is RTL.\n *\n * @param code - Optional language code (defaults to current)\n * @returns True if RTL\n */\n isRTL(code?: Language): boolean;\n\n /**\n * Check if namespace is registered.\n *\n * @param namespace - Namespace to check\n * @returns True if registered\n */\n hasNamespace(namespace: string): boolean;\n\n /**\n * Get all registered namespaces.\n *\n * @returns Array of namespace identifiers\n */\n getNamespaces(): string[];\n\n /**\n * Load translations for a specific language.\n *\n * @param language - Language to load\n */\n loadLanguage(language: Language): Promise<void>;\n\n /**\n * Load translations for a specific screenset.\n *\n * @param screensetId - Screenset ID\n * @param language - Optional language (defaults to current)\n */\n loadScreensetTranslations(screensetId: string, language?: Language): Promise<void>;\n\n /**\n * Preload translations for multiple languages.\n *\n * @param languages - Languages to preload\n */\n preloadLanguages(languages: Language[]): Promise<void>;\n\n /**\n * Subscribe to translation changes.\n * Called when new translations are registered.\n *\n * @param callback - Function to call on changes\n * @returns Unsubscribe function\n */\n subscribe(callback: () => void): () => void;\n\n /**\n * Get the current version number.\n * Increments when translations change. Used by React for re-rendering.\n *\n * @returns Current version number\n */\n getVersion(): number;\n}\n\n// ============================================================================\n// Display Mode\n// ============================================================================\n\n/**\n * Language Display Mode\n * How to display language names in the UI.\n */\nexport enum LanguageDisplayMode {\n /** Show native name (e.g., 'Español') */\n Native = 'native',\n /** Show English name (e.g., 'Spanish') */\n English = 'english',\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/**\n * I18n namespace separator constant.\n * Used to separate namespace from key: 'namespace:key'\n */\nexport const I18N_NAMESPACE_SEPARATOR = ':';\n\n/**\n * I18n path separator constant.\n * Used to separate nested keys: 'key.subkey'\n */\nexport const I18N_PATH_SEPARATOR = '.';\n\n/**\n * Default namespace for translations without explicit namespace.\n */\nexport const I18N_DEFAULT_NAMESPACE = 'app';\n\n/**\n * HTML lang attribute name.\n */\nexport const HTML_LANG_ATTRIBUTE = 'lang';\n\n/**\n * HTML dir attribute name.\n */\nexport const HTML_DIR_ATTRIBUTE = 'dir';\n"],"mappings":";AAeO,IAAK,gBAAL,kBAAKA,mBAAL;AACL,EAAAA,eAAA,iBAAc;AACd,EAAAA,eAAA,iBAAc;AAFJ,SAAAA;AAAA,GAAA;AAaL,IAAK,WAAL,kBAAKC,cAAL;AAEL,EAAAA,UAAA,aAAU;AACV,EAAAA,UAAA,aAAU;AACV,EAAAA,UAAA,YAAS;AACT,EAAAA,UAAA,YAAS;AACT,EAAAA,UAAA,aAAU;AACV,EAAAA,UAAA,gBAAa;AACb,EAAAA,UAAA,WAAQ;AAGR,EAAAA,UAAA,aAAU;AACV,EAAAA,UAAA,YAAS;AACT,EAAAA,UAAA,eAAY;AACZ,EAAAA,UAAA,WAAQ;AAGR,EAAAA,UAAA,YAAS;AACT,EAAAA,UAAA,YAAS;AACT,EAAAA,UAAA,aAAU;AACV,EAAAA,UAAA,UAAO;AACP,EAAAA,UAAA,aAAU;AAGV,EAAAA,UAAA,uBAAoB;AACpB,EAAAA,UAAA,wBAAqB;AACrB,EAAAA,UAAA,cAAW;AACX,EAAAA,UAAA,YAAS;AACT,EAAAA,UAAA,gBAAa;AACb,EAAAA,UAAA,UAAO;AACP,EAAAA,UAAA,gBAAa;AACb,EAAAA,UAAA,WAAQ;AACR,EAAAA,UAAA,aAAU;AAGV,EAAAA,UAAA,aAAU;AACV,EAAAA,UAAA,YAAS;AACT,EAAAA,UAAA,eAAY;AACZ,EAAAA,UAAA,aAAU;AAGV,EAAAA,UAAA,WAAQ;AACR,EAAAA,UAAA,cAAW;AACX,EAAAA,UAAA,eAAY;AAGZ,EAAAA,UAAA,WAAQ;AACR,EAAAA,UAAA,aAAU;AACV,EAAAA,UAAA,WAAQ;AACR,EAAAA,UAAA,aAAU;AAjDA,SAAAA;AAAA,GAAA;AAuTL,IAAK,sBAAL,kBAAKC,yBAAL;AAEL,EAAAA,qBAAA,YAAS;AAET,EAAAA,qBAAA,aAAU;AAJA,SAAAA;AAAA,GAAA;AAeL,IAAM,2BAA2B;AAMjC,IAAM,sBAAsB;AAK5B,IAAM,yBAAyB;AAK/B,IAAM,sBAAsB;AAK5B,IAAM,qBAAqB;","names":["TextDirection","Language","LanguageDisplayMode"]}
|
package/llms.txt
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# @gears-frontx/i18n
|
|
2
|
+
|
|
3
|
+
> Internationalization with 36 languages, namespace support, lazy loading, and RTL detection for HAI3 SDK.
|
|
4
|
+
|
|
5
|
+
Part of the HAI3 SDK Layer (L1) - can be used independently without other @gears-frontx packages. Zero dependencies.
|
|
6
|
+
|
|
7
|
+
## Core API
|
|
8
|
+
|
|
9
|
+
- [i18nRegistry](https://hai3.dev/docs/i18n/registry): Singleton for translations
|
|
10
|
+
- [Language](https://hai3.dev/docs/i18n/languages): Enum of 36 language codes
|
|
11
|
+
- [createI18nRegistry](https://hai3.dev/docs/i18n/create): Factory for isolated testing
|
|
12
|
+
|
|
13
|
+
## Key Patterns
|
|
14
|
+
|
|
15
|
+
- Namespace keys: `namespace:key.subkey` (e.g., `screen.demo.home:title`)
|
|
16
|
+
- Lazy loading via `registerLoader()` with dynamic imports
|
|
17
|
+
- RTL detection for Arabic, Hebrew, Persian, Urdu
|
|
18
|
+
- Parameter interpolation: `{param}` syntax
|
|
19
|
+
|
|
20
|
+
## Quick Start
|
|
21
|
+
|
|
22
|
+
```typescript
|
|
23
|
+
import { i18nRegistry, Language, I18nRegistryImpl } from '@gears-frontx/i18n';
|
|
24
|
+
|
|
25
|
+
// Register translations directly
|
|
26
|
+
i18nRegistry.register('common', Language.English, {
|
|
27
|
+
'app.title': 'My App',
|
|
28
|
+
'app.welcome': 'Welcome, {name}!'
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
// Or lazy load per screen
|
|
32
|
+
const screenTranslations = I18nRegistryImpl.createLoader({
|
|
33
|
+
[Language.English]: () => import('./i18n/en.json'),
|
|
34
|
+
[Language.Spanish]: () => import('./i18n/es.json'),
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
// Use translations
|
|
38
|
+
const title = i18nRegistry.t('common:app.title');
|
|
39
|
+
const welcome = i18nRegistry.t('common:app.welcome', { name: 'John' });
|
|
40
|
+
|
|
41
|
+
// Language management
|
|
42
|
+
await i18nRegistry.setLanguage(Language.Spanish);
|
|
43
|
+
const isRTL = i18nRegistry.isRTL();
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## Optional
|
|
47
|
+
|
|
48
|
+
- [Migration Guide](https://hai3.dev/docs/i18n/migration): Migrating from @gears-frontx/uicore
|
|
49
|
+
- [RTL Support](https://hai3.dev/docs/i18n/rtl): Right-to-left language handling
|
package/package.json
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@gears-frontx/i18n",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Internationalization and translation management for HAI3 SDK",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.cjs",
|
|
7
|
+
"module": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"import": "./dist/index.js",
|
|
13
|
+
"require": "./dist/index.cjs"
|
|
14
|
+
},
|
|
15
|
+
"./types": {
|
|
16
|
+
"types": "./dist/types.d.ts",
|
|
17
|
+
"import": "./dist/types.js",
|
|
18
|
+
"require": "./dist/types.cjs"
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
"files": [
|
|
22
|
+
"dist",
|
|
23
|
+
"CLAUDE.md",
|
|
24
|
+
"llms.txt"
|
|
25
|
+
],
|
|
26
|
+
"scripts": {
|
|
27
|
+
"build": "tsup",
|
|
28
|
+
"type-check": "tsc --noEmit"
|
|
29
|
+
},
|
|
30
|
+
"dependencies": {},
|
|
31
|
+
"devDependencies": {
|
|
32
|
+
"tsup": "^8.0.0",
|
|
33
|
+
"typescript": "^5.4.2"
|
|
34
|
+
},
|
|
35
|
+
"peerDependencies": {},
|
|
36
|
+
"publishConfig": {
|
|
37
|
+
"access": "public"
|
|
38
|
+
},
|
|
39
|
+
"keywords": [
|
|
40
|
+
"hai3",
|
|
41
|
+
"i18n",
|
|
42
|
+
"internationalization",
|
|
43
|
+
"localization",
|
|
44
|
+
"typescript"
|
|
45
|
+
],
|
|
46
|
+
"author": "HAI3",
|
|
47
|
+
"license": "Apache-2.0"
|
|
48
|
+
}
|