@digitaldefiance/i18n-lib 3.8.0 → 3.8.2

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 (503) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +182 -0
  3. package/package.json +12 -4
  4. package/src/{active-context.d.ts → active-context.ts} +0 -1
  5. package/src/builders/i18n-builder.ts +82 -0
  6. package/src/builders/{index.d.ts → index.ts} +1 -1
  7. package/src/component-definition.ts +11 -0
  8. package/src/component-registration.ts +29 -0
  9. package/src/component-registry.ts +432 -0
  10. package/src/context-error-type.ts +7 -0
  11. package/src/core/component-store.ts +241 -0
  12. package/src/core/context-manager.ts +113 -0
  13. package/src/core/enum-registry.ts +106 -0
  14. package/src/core/i18n-engine.ts +710 -0
  15. package/src/core/{index.d.ts → index.ts} +4 -1
  16. package/src/core/language-registry.ts +345 -0
  17. package/src/{core-component-id.d.ts → core-component-id.ts} +1 -2
  18. package/src/core-i18n.ts +270 -0
  19. package/src/core-plugin-factory.ts +111 -0
  20. package/src/core-string-key.ts +59 -0
  21. package/src/create-translation-adapter.ts +93 -0
  22. package/src/enum-registry.ts +152 -0
  23. package/src/errors/{base.d.ts → base.ts} +1 -1
  24. package/src/errors/context-error.ts +122 -0
  25. package/src/errors/enhanced-error-base.ts +260 -0
  26. package/src/errors/handleable.ts +152 -0
  27. package/src/errors/i18n-error.ts +494 -0
  28. package/src/errors/{index.d.ts → index.ts} +4 -1
  29. package/src/errors/simple-typed-error.ts +81 -0
  30. package/src/errors/{translatable-exports.d.ts → translatable-exports.ts} +1 -1
  31. package/src/errors/translatable-generic.ts +245 -0
  32. package/src/errors/translatable-handleable-generic.ts +222 -0
  33. package/src/errors/translatable.ts +138 -0
  34. package/src/errors/typed-handleable.ts +138 -0
  35. package/src/errors/typed.ts +617 -0
  36. package/src/gender/{gender-categories.d.ts → gender-categories.ts} +6 -2
  37. package/src/gender/gender-resolver.ts +40 -0
  38. package/src/gender/{index.d.ts → index.ts} +0 -1
  39. package/src/global-active-context.ts +266 -0
  40. package/src/icu/ast.ts +56 -0
  41. package/src/icu/compiler.ts +96 -0
  42. package/src/icu/formatter-registry.ts +36 -0
  43. package/src/icu/formatters/base-formatter.ts +8 -0
  44. package/src/icu/formatters/date-formatter.ts +30 -0
  45. package/src/icu/formatters/number-formatter.ts +32 -0
  46. package/src/icu/formatters/plural-formatter.ts +12 -0
  47. package/src/icu/formatters/select-formatter.ts +7 -0
  48. package/src/icu/formatters/selectordinal-formatter.ts +17 -0
  49. package/src/icu/formatters/time-formatter.ts +30 -0
  50. package/src/icu/helpers.ts +34 -0
  51. package/src/icu/parser.ts +242 -0
  52. package/src/icu/runtime.ts +37 -0
  53. package/src/icu/tokenizer.ts +212 -0
  54. package/src/icu/validator.ts +163 -0
  55. package/src/{index.d.ts → index.ts} +38 -6
  56. package/src/interfaces/active-context.interface.ts +41 -0
  57. package/src/interfaces/component-config.interface.ts +17 -0
  58. package/src/interfaces/engine-config.interface.ts +22 -0
  59. package/src/interfaces/global-active-context.ts +39 -0
  60. package/src/interfaces/handleable-error-options.ts +13 -0
  61. package/src/interfaces/handleable.ts +20 -0
  62. package/src/interfaces/i18n-engine.interface.ts +57 -0
  63. package/src/interfaces/{index.d.ts → index.ts} +1 -1
  64. package/src/interfaces/language-definition.interface.ts +17 -0
  65. package/src/interfaces/translation-options.interface.ts +15 -0
  66. package/src/interfaces/validation-result.interface.ts +24 -0
  67. package/src/language-codes.ts +40 -0
  68. package/src/language-definition.ts +13 -0
  69. package/src/plugin-i18n-engine.ts +707 -0
  70. package/src/pluralization/{index.d.ts → index.ts} +1 -1
  71. package/src/pluralization/language-plural-map.ts +186 -0
  72. package/src/pluralization/{plural-categories.d.ts → plural-categories.ts} +5 -3
  73. package/src/pluralization/plural-rules.ts +228 -0
  74. package/src/registry-config.ts +16 -0
  75. package/src/registry-error-type.ts +19 -0
  76. package/src/registry-error.ts +100 -0
  77. package/src/strict-types.ts +35 -0
  78. package/src/strings/de.ts +75 -0
  79. package/src/strings/en-GB.ts +74 -0
  80. package/src/strings/en-US.ts +74 -0
  81. package/src/strings/es.ts +74 -0
  82. package/src/strings/fr.ts +75 -0
  83. package/src/strings/ja.ts +73 -0
  84. package/src/strings/uk.ts +73 -0
  85. package/src/strings/zh-CN.ts +72 -0
  86. package/src/template.ts +72 -0
  87. package/src/translation-engine.ts +18 -0
  88. package/src/translation-request.ts +12 -0
  89. package/src/translation-response.ts +8 -0
  90. package/src/types/engine.ts +55 -0
  91. package/src/types/{index.d.ts → index.ts} +1 -1
  92. package/src/types/{plural-types.d.ts → plural-types.ts} +29 -3
  93. package/src/{types.d.ts → types.ts} +72 -21
  94. package/src/utils/currency.ts +141 -0
  95. package/src/utils/html-escape.ts +55 -0
  96. package/src/utils/{index.d.ts → index.ts} +0 -1
  97. package/src/utils/lru-cache.ts +76 -0
  98. package/src/utils/{plural-helpers.d.ts → plural-helpers.ts} +14 -4
  99. package/src/utils/{safe-object.js → safe-object.ts} +37 -34
  100. package/src/utils/string-utils.ts +77 -0
  101. package/src/utils/timezone.ts +76 -0
  102. package/src/utils/validation.ts +66 -0
  103. package/src/utils.ts +215 -0
  104. package/src/validation/{index.d.ts → index.ts} +0 -1
  105. package/src/validation/plural-validator.ts +168 -0
  106. package/src/validation-config.ts +11 -0
  107. package/src/validation-result.ts +12 -0
  108. package/src/active-context.d.ts.map +0 -1
  109. package/src/active-context.js +0 -3
  110. package/src/active-context.js.map +0 -1
  111. package/src/builders/i18n-builder.d.ts +0 -26
  112. package/src/builders/i18n-builder.d.ts.map +0 -1
  113. package/src/builders/i18n-builder.js +0 -70
  114. package/src/builders/i18n-builder.js.map +0 -1
  115. package/src/builders/index.d.ts.map +0 -1
  116. package/src/builders/index.js +0 -8
  117. package/src/builders/index.js.map +0 -1
  118. package/src/component-definition.d.ts +0 -12
  119. package/src/component-definition.d.ts.map +0 -1
  120. package/src/component-definition.js +0 -3
  121. package/src/component-definition.js.map +0 -1
  122. package/src/component-registration.d.ts +0 -22
  123. package/src/component-registration.d.ts.map +0 -1
  124. package/src/component-registration.js +0 -3
  125. package/src/component-registration.js.map +0 -1
  126. package/src/component-registry.d.ts +0 -102
  127. package/src/component-registry.d.ts.map +0 -1
  128. package/src/component-registry.js +0 -282
  129. package/src/component-registry.js.map +0 -1
  130. package/src/context-error-type.d.ts +0 -8
  131. package/src/context-error-type.d.ts.map +0 -1
  132. package/src/context-error-type.js +0 -12
  133. package/src/context-error-type.js.map +0 -1
  134. package/src/core/component-store.d.ts +0 -93
  135. package/src/core/component-store.d.ts.map +0 -1
  136. package/src/core/component-store.js +0 -198
  137. package/src/core/component-store.js.map +0 -1
  138. package/src/core/context-manager.d.ts +0 -72
  139. package/src/core/context-manager.d.ts.map +0 -1
  140. package/src/core/context-manager.js +0 -98
  141. package/src/core/context-manager.js.map +0 -1
  142. package/src/core/enum-registry.d.ts +0 -48
  143. package/src/core/enum-registry.d.ts.map +0 -1
  144. package/src/core/enum-registry.js +0 -85
  145. package/src/core/enum-registry.js.map +0 -1
  146. package/src/core/i18n-engine.d.ts +0 -241
  147. package/src/core/i18n-engine.d.ts.map +0 -1
  148. package/src/core/i18n-engine.js +0 -568
  149. package/src/core/i18n-engine.js.map +0 -1
  150. package/src/core/index.d.ts.map +0 -1
  151. package/src/core/index.js +0 -21
  152. package/src/core/index.js.map +0 -1
  153. package/src/core/language-registry.d.ts +0 -180
  154. package/src/core/language-registry.d.ts.map +0 -1
  155. package/src/core/language-registry.js +0 -298
  156. package/src/core/language-registry.js.map +0 -1
  157. package/src/core-component-id.d.ts.map +0 -1
  158. package/src/core-component-id.js +0 -9
  159. package/src/core-component-id.js.map +0 -1
  160. package/src/core-i18n.d.ts +0 -69
  161. package/src/core-i18n.d.ts.map +0 -1
  162. package/src/core-i18n.js +0 -219
  163. package/src/core-i18n.js.map +0 -1
  164. package/src/core-plugin-factory.d.ts +0 -28
  165. package/src/core-plugin-factory.d.ts.map +0 -1
  166. package/src/core-plugin-factory.js +0 -80
  167. package/src/core-plugin-factory.js.map +0 -1
  168. package/src/core-string-key.d.ts +0 -52
  169. package/src/core-string-key.d.ts.map +0 -1
  170. package/src/core-string-key.js +0 -61
  171. package/src/core-string-key.js.map +0 -1
  172. package/src/create-translation-adapter.d.ts +0 -33
  173. package/src/create-translation-adapter.d.ts.map +0 -1
  174. package/src/create-translation-adapter.js +0 -72
  175. package/src/create-translation-adapter.js.map +0 -1
  176. package/src/enum-registry.d.ts +0 -65
  177. package/src/enum-registry.d.ts.map +0 -1
  178. package/src/enum-registry.js +0 -123
  179. package/src/enum-registry.js.map +0 -1
  180. package/src/errors/base.d.ts.map +0 -1
  181. package/src/errors/base.js +0 -11
  182. package/src/errors/base.js.map +0 -1
  183. package/src/errors/context-error.d.ts +0 -50
  184. package/src/errors/context-error.d.ts.map +0 -1
  185. package/src/errors/context-error.js +0 -93
  186. package/src/errors/context-error.js.map +0 -1
  187. package/src/errors/enhanced-error-base.d.ts +0 -125
  188. package/src/errors/enhanced-error-base.d.ts.map +0 -1
  189. package/src/errors/enhanced-error-base.js +0 -165
  190. package/src/errors/enhanced-error-base.js.map +0 -1
  191. package/src/errors/handleable.d.ts +0 -83
  192. package/src/errors/handleable.d.ts.map +0 -1
  193. package/src/errors/handleable.js +0 -136
  194. package/src/errors/handleable.js.map +0 -1
  195. package/src/errors/i18n-error.d.ts +0 -211
  196. package/src/errors/i18n-error.d.ts.map +0 -1
  197. package/src/errors/i18n-error.js +0 -358
  198. package/src/errors/i18n-error.js.map +0 -1
  199. package/src/errors/index.d.ts.map +0 -1
  200. package/src/errors/index.js +0 -17
  201. package/src/errors/index.js.map +0 -1
  202. package/src/errors/simple-typed-error.d.ts +0 -53
  203. package/src/errors/simple-typed-error.d.ts.map +0 -1
  204. package/src/errors/simple-typed-error.js +0 -51
  205. package/src/errors/simple-typed-error.js.map +0 -1
  206. package/src/errors/translatable-exports.d.ts.map +0 -1
  207. package/src/errors/translatable-exports.js +0 -15
  208. package/src/errors/translatable-exports.js.map +0 -1
  209. package/src/errors/translatable-generic.d.ts +0 -87
  210. package/src/errors/translatable-generic.d.ts.map +0 -1
  211. package/src/errors/translatable-generic.js +0 -139
  212. package/src/errors/translatable-generic.js.map +0 -1
  213. package/src/errors/translatable-handleable-generic.d.ts +0 -116
  214. package/src/errors/translatable-handleable-generic.d.ts.map +0 -1
  215. package/src/errors/translatable-handleable-generic.js +0 -121
  216. package/src/errors/translatable-handleable-generic.js.map +0 -1
  217. package/src/errors/translatable.d.ts +0 -63
  218. package/src/errors/translatable.d.ts.map +0 -1
  219. package/src/errors/translatable.js +0 -85
  220. package/src/errors/translatable.js.map +0 -1
  221. package/src/errors/typed-handleable.d.ts +0 -62
  222. package/src/errors/typed-handleable.d.ts.map +0 -1
  223. package/src/errors/typed-handleable.js +0 -108
  224. package/src/errors/typed-handleable.js.map +0 -1
  225. package/src/errors/typed.d.ts +0 -206
  226. package/src/errors/typed.d.ts.map +0 -1
  227. package/src/errors/typed.js +0 -458
  228. package/src/errors/typed.js.map +0 -1
  229. package/src/gender/gender-categories.d.ts.map +0 -1
  230. package/src/gender/gender-categories.js +0 -15
  231. package/src/gender/gender-categories.js.map +0 -1
  232. package/src/gender/gender-resolver.d.ts +0 -14
  233. package/src/gender/gender-resolver.d.ts.map +0 -1
  234. package/src/gender/gender-resolver.js +0 -35
  235. package/src/gender/gender-resolver.js.map +0 -1
  236. package/src/gender/index.d.ts.map +0 -1
  237. package/src/gender/index.js +0 -6
  238. package/src/gender/index.js.map +0 -1
  239. package/src/global-active-context.d.ts +0 -50
  240. package/src/global-active-context.d.ts.map +0 -1
  241. package/src/global-active-context.js +0 -185
  242. package/src/global-active-context.js.map +0 -1
  243. package/src/icu/ast.d.ts +0 -48
  244. package/src/icu/ast.d.ts.map +0 -1
  245. package/src/icu/ast.js +0 -16
  246. package/src/icu/ast.js.map +0 -1
  247. package/src/icu/compiler.d.ts +0 -16
  248. package/src/icu/compiler.d.ts.map +0 -1
  249. package/src/icu/compiler.js +0 -87
  250. package/src/icu/compiler.js.map +0 -1
  251. package/src/icu/formatter-registry.d.ts +0 -10
  252. package/src/icu/formatter-registry.d.ts.map +0 -1
  253. package/src/icu/formatter-registry.js +0 -34
  254. package/src/icu/formatter-registry.js.map +0 -1
  255. package/src/icu/formatters/base-formatter.d.ts +0 -8
  256. package/src/icu/formatters/base-formatter.d.ts.map +0 -1
  257. package/src/icu/formatters/base-formatter.js +0 -3
  258. package/src/icu/formatters/base-formatter.js.map +0 -1
  259. package/src/icu/formatters/date-formatter.d.ts +0 -5
  260. package/src/icu/formatters/date-formatter.d.ts.map +0 -1
  261. package/src/icu/formatters/date-formatter.js +0 -31
  262. package/src/icu/formatters/date-formatter.js.map +0 -1
  263. package/src/icu/formatters/number-formatter.d.ts +0 -5
  264. package/src/icu/formatters/number-formatter.d.ts.map +0 -1
  265. package/src/icu/formatters/number-formatter.js +0 -33
  266. package/src/icu/formatters/number-formatter.js.map +0 -1
  267. package/src/icu/formatters/plural-formatter.d.ts +0 -5
  268. package/src/icu/formatters/plural-formatter.d.ts.map +0 -1
  269. package/src/icu/formatters/plural-formatter.js +0 -15
  270. package/src/icu/formatters/plural-formatter.js.map +0 -1
  271. package/src/icu/formatters/select-formatter.d.ts +0 -5
  272. package/src/icu/formatters/select-formatter.d.ts.map +0 -1
  273. package/src/icu/formatters/select-formatter.js +0 -10
  274. package/src/icu/formatters/select-formatter.js.map +0 -1
  275. package/src/icu/formatters/selectordinal-formatter.d.ts +0 -5
  276. package/src/icu/formatters/selectordinal-formatter.d.ts.map +0 -1
  277. package/src/icu/formatters/selectordinal-formatter.js +0 -22
  278. package/src/icu/formatters/selectordinal-formatter.js.map +0 -1
  279. package/src/icu/formatters/time-formatter.d.ts +0 -5
  280. package/src/icu/formatters/time-formatter.d.ts.map +0 -1
  281. package/src/icu/formatters/time-formatter.js +0 -31
  282. package/src/icu/formatters/time-formatter.js.map +0 -1
  283. package/src/icu/helpers.d.ts +0 -9
  284. package/src/icu/helpers.d.ts.map +0 -1
  285. package/src/icu/helpers.js +0 -31
  286. package/src/icu/helpers.js.map +0 -1
  287. package/src/icu/parser.d.ts +0 -31
  288. package/src/icu/parser.d.ts.map +0 -1
  289. package/src/icu/parser.js +0 -203
  290. package/src/icu/parser.js.map +0 -1
  291. package/src/icu/runtime.d.ts +0 -10
  292. package/src/icu/runtime.d.ts.map +0 -1
  293. package/src/icu/runtime.js +0 -33
  294. package/src/icu/runtime.js.map +0 -1
  295. package/src/icu/tokenizer.d.ts +0 -37
  296. package/src/icu/tokenizer.d.ts.map +0 -1
  297. package/src/icu/tokenizer.js +0 -187
  298. package/src/icu/tokenizer.js.map +0 -1
  299. package/src/icu/validator.d.ts +0 -11
  300. package/src/icu/validator.d.ts.map +0 -1
  301. package/src/icu/validator.js +0 -140
  302. package/src/icu/validator.js.map +0 -1
  303. package/src/index.d.ts.map +0 -1
  304. package/src/index.js +0 -76
  305. package/src/index.js.map +0 -1
  306. package/src/interfaces/active-context.interface.d.ts +0 -36
  307. package/src/interfaces/active-context.interface.d.ts.map +0 -1
  308. package/src/interfaces/active-context.interface.js +0 -3
  309. package/src/interfaces/active-context.interface.js.map +0 -1
  310. package/src/interfaces/component-config.interface.d.ts +0 -16
  311. package/src/interfaces/component-config.interface.d.ts.map +0 -1
  312. package/src/interfaces/component-config.interface.js +0 -6
  313. package/src/interfaces/component-config.interface.js.map +0 -1
  314. package/src/interfaces/engine-config.interface.d.ts +0 -22
  315. package/src/interfaces/engine-config.interface.d.ts.map +0 -1
  316. package/src/interfaces/engine-config.interface.js +0 -6
  317. package/src/interfaces/engine-config.interface.js.map +0 -1
  318. package/src/interfaces/global-active-context.d.ts +0 -23
  319. package/src/interfaces/global-active-context.d.ts.map +0 -1
  320. package/src/interfaces/global-active-context.js +0 -3
  321. package/src/interfaces/global-active-context.js.map +0 -1
  322. package/src/interfaces/handleable-error-options.d.ts +0 -14
  323. package/src/interfaces/handleable-error-options.d.ts.map +0 -1
  324. package/src/interfaces/handleable-error-options.js +0 -3
  325. package/src/interfaces/handleable-error-options.js.map +0 -1
  326. package/src/interfaces/handleable.d.ts +0 -21
  327. package/src/interfaces/handleable.d.ts.map +0 -1
  328. package/src/interfaces/handleable.js +0 -3
  329. package/src/interfaces/handleable.js.map +0 -1
  330. package/src/interfaces/i18n-engine.interface.d.ts +0 -46
  331. package/src/interfaces/i18n-engine.interface.d.ts.map +0 -1
  332. package/src/interfaces/i18n-engine.interface.js +0 -6
  333. package/src/interfaces/i18n-engine.interface.js.map +0 -1
  334. package/src/interfaces/index.d.ts.map +0 -1
  335. package/src/interfaces/index.js +0 -7
  336. package/src/interfaces/index.js.map +0 -1
  337. package/src/interfaces/language-definition.interface.d.ts +0 -17
  338. package/src/interfaces/language-definition.interface.d.ts.map +0 -1
  339. package/src/interfaces/language-definition.interface.js +0 -6
  340. package/src/interfaces/language-definition.interface.js.map +0 -1
  341. package/src/interfaces/translation-options.interface.d.ts +0 -15
  342. package/src/interfaces/translation-options.interface.d.ts.map +0 -1
  343. package/src/interfaces/translation-options.interface.js +0 -6
  344. package/src/interfaces/translation-options.interface.js.map +0 -1
  345. package/src/interfaces/validation-result.interface.d.ts +0 -24
  346. package/src/interfaces/validation-result.interface.d.ts.map +0 -1
  347. package/src/interfaces/validation-result.interface.js +0 -6
  348. package/src/interfaces/validation-result.interface.js.map +0 -1
  349. package/src/language-codes.d.ts +0 -28
  350. package/src/language-codes.d.ts.map +0 -1
  351. package/src/language-codes.js +0 -32
  352. package/src/language-codes.js.map +0 -1
  353. package/src/language-definition.d.ts +0 -14
  354. package/src/language-definition.d.ts.map +0 -1
  355. package/src/language-definition.js +0 -3
  356. package/src/language-definition.js.map +0 -1
  357. package/src/plugin-i18n-engine.d.ts +0 -164
  358. package/src/plugin-i18n-engine.d.ts.map +0 -1
  359. package/src/plugin-i18n-engine.js +0 -493
  360. package/src/plugin-i18n-engine.js.map +0 -1
  361. package/src/pluralization/index.d.ts.map +0 -1
  362. package/src/pluralization/index.js +0 -10
  363. package/src/pluralization/index.js.map +0 -1
  364. package/src/pluralization/language-plural-map.d.ts +0 -29
  365. package/src/pluralization/language-plural-map.d.ts.map +0 -1
  366. package/src/pluralization/language-plural-map.js +0 -155
  367. package/src/pluralization/language-plural-map.js.map +0 -1
  368. package/src/pluralization/plural-categories.d.ts.map +0 -1
  369. package/src/pluralization/plural-categories.js +0 -8
  370. package/src/pluralization/plural-categories.js.map +0 -1
  371. package/src/pluralization/plural-rules.d.ts +0 -102
  372. package/src/pluralization/plural-rules.d.ts.map +0 -1
  373. package/src/pluralization/plural-rules.js +0 -263
  374. package/src/pluralization/plural-rules.js.map +0 -1
  375. package/src/registry-config.d.ts +0 -16
  376. package/src/registry-config.d.ts.map +0 -1
  377. package/src/registry-config.js +0 -3
  378. package/src/registry-config.js.map +0 -1
  379. package/src/registry-error-type.d.ts +0 -20
  380. package/src/registry-error-type.d.ts.map +0 -1
  381. package/src/registry-error-type.js +0 -24
  382. package/src/registry-error-type.js.map +0 -1
  383. package/src/registry-error.d.ts +0 -25
  384. package/src/registry-error.d.ts.map +0 -1
  385. package/src/registry-error.js +0 -63
  386. package/src/registry-error.js.map +0 -1
  387. package/src/strict-types.d.ts +0 -19
  388. package/src/strict-types.d.ts.map +0 -1
  389. package/src/strict-types.js +0 -18
  390. package/src/strict-types.js.map +0 -1
  391. package/src/strings/de.d.ts +0 -3
  392. package/src/strings/de.d.ts.map +0 -1
  393. package/src/strings/de.js +0 -57
  394. package/src/strings/de.js.map +0 -1
  395. package/src/strings/en-GB.d.ts +0 -3
  396. package/src/strings/en-GB.d.ts.map +0 -1
  397. package/src/strings/en-GB.js +0 -57
  398. package/src/strings/en-GB.js.map +0 -1
  399. package/src/strings/en-US.d.ts +0 -3
  400. package/src/strings/en-US.d.ts.map +0 -1
  401. package/src/strings/en-US.js +0 -57
  402. package/src/strings/en-US.js.map +0 -1
  403. package/src/strings/es.d.ts +0 -3
  404. package/src/strings/es.d.ts.map +0 -1
  405. package/src/strings/es.js +0 -57
  406. package/src/strings/es.js.map +0 -1
  407. package/src/strings/fr.d.ts +0 -3
  408. package/src/strings/fr.d.ts.map +0 -1
  409. package/src/strings/fr.js +0 -57
  410. package/src/strings/fr.js.map +0 -1
  411. package/src/strings/ja.d.ts +0 -3
  412. package/src/strings/ja.d.ts.map +0 -1
  413. package/src/strings/ja.js +0 -57
  414. package/src/strings/ja.js.map +0 -1
  415. package/src/strings/uk.d.ts +0 -3
  416. package/src/strings/uk.d.ts.map +0 -1
  417. package/src/strings/uk.js +0 -57
  418. package/src/strings/uk.js.map +0 -1
  419. package/src/strings/zh-CN.d.ts +0 -3
  420. package/src/strings/zh-CN.d.ts.map +0 -1
  421. package/src/strings/zh-CN.js +0 -57
  422. package/src/strings/zh-CN.js.map +0 -1
  423. package/src/template.d.ts +0 -13
  424. package/src/template.d.ts.map +0 -1
  425. package/src/template.js +0 -40
  426. package/src/template.js.map +0 -1
  427. package/src/translation-engine.d.ts +0 -9
  428. package/src/translation-engine.d.ts.map +0 -1
  429. package/src/translation-engine.js +0 -3
  430. package/src/translation-engine.js.map +0 -1
  431. package/src/translation-request.d.ts +0 -10
  432. package/src/translation-request.d.ts.map +0 -1
  433. package/src/translation-request.js +0 -3
  434. package/src/translation-request.js.map +0 -1
  435. package/src/translation-response.d.ts +0 -9
  436. package/src/translation-response.d.ts.map +0 -1
  437. package/src/translation-response.js +0 -3
  438. package/src/translation-response.js.map +0 -1
  439. package/src/types/engine.d.ts +0 -47
  440. package/src/types/engine.d.ts.map +0 -1
  441. package/src/types/engine.js +0 -8
  442. package/src/types/engine.js.map +0 -1
  443. package/src/types/index.d.ts.map +0 -1
  444. package/src/types/index.js +0 -9
  445. package/src/types/index.js.map +0 -1
  446. package/src/types/plural-types.d.ts.map +0 -1
  447. package/src/types/plural-types.js +0 -39
  448. package/src/types/plural-types.js.map +0 -1
  449. package/src/types.d.ts.map +0 -1
  450. package/src/types.js +0 -23
  451. package/src/types.js.map +0 -1
  452. package/src/utils/currency.d.ts +0 -81
  453. package/src/utils/currency.d.ts.map +0 -1
  454. package/src/utils/currency.js +0 -99
  455. package/src/utils/currency.js.map +0 -1
  456. package/src/utils/html-escape.d.ts +0 -22
  457. package/src/utils/html-escape.d.ts.map +0 -1
  458. package/src/utils/html-escape.js +0 -53
  459. package/src/utils/html-escape.js.map +0 -1
  460. package/src/utils/index.d.ts.map +0 -1
  461. package/src/utils/index.js +0 -12
  462. package/src/utils/index.js.map +0 -1
  463. package/src/utils/lru-cache.d.ts +0 -42
  464. package/src/utils/lru-cache.d.ts.map +0 -1
  465. package/src/utils/lru-cache.js +0 -73
  466. package/src/utils/lru-cache.js.map +0 -1
  467. package/src/utils/plural-helpers.d.ts.map +0 -1
  468. package/src/utils/plural-helpers.js +0 -35
  469. package/src/utils/plural-helpers.js.map +0 -1
  470. package/src/utils/safe-object.d.ts +0 -39
  471. package/src/utils/safe-object.d.ts.map +0 -1
  472. package/src/utils/safe-object.js.map +0 -1
  473. package/src/utils/string-utils.d.ts +0 -28
  474. package/src/utils/string-utils.d.ts.map +0 -1
  475. package/src/utils/string-utils.js +0 -63
  476. package/src/utils/string-utils.js.map +0 -1
  477. package/src/utils/timezone.d.ts +0 -50
  478. package/src/utils/timezone.d.ts.map +0 -1
  479. package/src/utils/timezone.js +0 -74
  480. package/src/utils/timezone.js.map +0 -1
  481. package/src/utils/validation.d.ts +0 -40
  482. package/src/utils/validation.d.ts.map +0 -1
  483. package/src/utils/validation.js +0 -69
  484. package/src/utils/validation.js.map +0 -1
  485. package/src/utils.d.ts +0 -65
  486. package/src/utils.d.ts.map +0 -1
  487. package/src/utils.js +0 -129
  488. package/src/utils.js.map +0 -1
  489. package/src/validation/index.d.ts.map +0 -1
  490. package/src/validation/index.js +0 -5
  491. package/src/validation/index.js.map +0 -1
  492. package/src/validation/plural-validator.d.ts +0 -46
  493. package/src/validation/plural-validator.d.ts.map +0 -1
  494. package/src/validation/plural-validator.js +0 -123
  495. package/src/validation/plural-validator.js.map +0 -1
  496. package/src/validation-config.d.ts +0 -12
  497. package/src/validation-config.d.ts.map +0 -1
  498. package/src/validation-config.js +0 -3
  499. package/src/validation-config.js.map +0 -1
  500. package/src/validation-result.d.ts +0 -13
  501. package/src/validation-result.d.ts.map +0 -1
  502. package/src/validation-result.js +0 -3
  503. package/src/validation-result.js.map +0 -1
@@ -4,10 +4,13 @@
4
4
  * Note: Using regular exports for classes and type-only exports for interfaces
5
5
  * to minimize runtime circular dependencies while maintaining type availability.
6
6
  */
7
+
8
+ // Export classes (runtime dependencies)
7
9
  export { ComponentStore } from './component-store';
8
10
  export { ContextManager } from './context-manager';
9
11
  export { EnumRegistry } from './enum-registry';
10
12
  export { I18nEngine } from './i18n-engine';
11
13
  export { LanguageRegistry } from './language-registry';
14
+
15
+ // Export types only (no runtime dependency)
12
16
  export type { Context } from './context-manager';
13
- //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,345 @@
1
+ /**
2
+ * Static language registry (no generics)
3
+ */
4
+
5
+ import { I18nError } from '../errors/i18n-error';
6
+ import { LanguageDefinition } from '../interfaces';
7
+
8
+ /**
9
+ * Class representing a static registry for language definitions.
10
+ */
11
+ export class LanguageRegistry {
12
+ private static languages = new Map<string, LanguageDefinition>();
13
+ private static defaultLanguageId: string | null = null;
14
+
15
+ /**
16
+ * Registers a new language definition.
17
+ * @param language - The language definition to register.
18
+ * @throws {I18nError} If the language ID or code is already registered.
19
+ */
20
+ static register(language: LanguageDefinition): void {
21
+ if (this.languages.has(language.id)) {
22
+ throw I18nError.duplicateLanguage(language.id);
23
+ }
24
+
25
+ const existing = this.getByCode(language.code);
26
+ if (existing) {
27
+ throw I18nError.duplicateLanguage(language.id);
28
+ }
29
+
30
+ this.languages.set(language.id, language);
31
+
32
+ if (language.isDefault || !this.defaultLanguageId) {
33
+ this.defaultLanguageId = language.id;
34
+ }
35
+ }
36
+
37
+ /**
38
+ * Checks if a language ID is registered.
39
+ * @param languageId - The language ID to check.
40
+ * @returns True if the language ID is registered, false otherwise.
41
+ */
42
+ static has(languageId: string): boolean {
43
+ return this.languages.has(languageId);
44
+ }
45
+
46
+ /**
47
+ * Retrieves a language definition by its ID.
48
+ * @param languageId - The language ID to retrieve.
49
+ * @returns The language definition.
50
+ * @throws {I18nError} If the language ID is not found.
51
+ */
52
+ static get(languageId: string): LanguageDefinition {
53
+ const lang = this.languages.get(languageId);
54
+ if (!lang) {
55
+ throw I18nError.languageNotFound(languageId);
56
+ }
57
+ return lang;
58
+ }
59
+
60
+ /**
61
+ * Retrieves all registered language definitions.
62
+ * @returns An array of all language definitions.
63
+ */
64
+ static getAll(): readonly LanguageDefinition[] {
65
+ return Array.from(this.languages.values());
66
+ }
67
+
68
+ /**
69
+ * Retrieves all registered language IDs.
70
+ * @returns An array of all language IDs.
71
+ */
72
+ static getIds(): readonly string[] {
73
+ return Array.from(this.languages.keys());
74
+ }
75
+
76
+ /**
77
+ * Retrieves all registered language codes.
78
+ * @returns An array of all language codes.
79
+ */
80
+ static getCodes(): readonly string[] {
81
+ return Array.from(this.languages.values()).map((l) => l.code);
82
+ }
83
+
84
+ /**
85
+ * Retrieves an array of objects mapping language codes to their labels.
86
+ * @returns An array of objects with code and label properties.
87
+ */
88
+ static getCodeLabelMap(): { code: string; label: string }[] {
89
+ return Array.from(this.languages.values()).map((l) => ({
90
+ code: l.code,
91
+ label: l.name,
92
+ }));
93
+ }
94
+
95
+ /**
96
+ * Retrieves the default language definition.
97
+ * @returns The default language definition or null if none is set.
98
+ */
99
+ static getDefault(): LanguageDefinition | null {
100
+ if (!this.defaultLanguageId) {
101
+ return null;
102
+ }
103
+ return this.get(this.defaultLanguageId);
104
+ }
105
+
106
+ /**
107
+ * Retrieves a language definition by its code.
108
+ * @param code - The language code to retrieve.
109
+ * @returns The language definition or undefined if not found.
110
+ */
111
+ static getByCode(code: string): LanguageDefinition | undefined {
112
+ return Array.from(this.languages.values()).find((l) => l.code === code);
113
+ }
114
+
115
+ /**
116
+ * Determines the best matching language code based on requested and user default codes.
117
+ * @param requestedCode - The requested language code.
118
+ * @param userDefaultCode - The user's default language code.
119
+ * @returns The best matching language code.
120
+ * @throws {I18nError} If no default language is configured.
121
+ */
122
+ static getMatchingCode(
123
+ requestedCode?: string,
124
+ userDefaultCode?: string,
125
+ ): string {
126
+ const trimmedRequested = requestedCode?.trim();
127
+ const trimmedUserDefault = userDefaultCode?.trim();
128
+
129
+ if (trimmedRequested && this.getByCode(trimmedRequested)) {
130
+ return trimmedRequested;
131
+ }
132
+ if (trimmedUserDefault && this.getByCode(trimmedUserDefault)) {
133
+ return trimmedUserDefault;
134
+ }
135
+ const defaultLang = this.getDefault();
136
+ if (!defaultLang) {
137
+ throw I18nError.invalidConfig('No default language configured');
138
+ }
139
+ return defaultLang.code;
140
+ }
141
+
142
+ /**
143
+ * Clears all registered languages and resets the default language.
144
+ */
145
+ static clear(): void {
146
+ this.languages.clear();
147
+ this.defaultLanguageId = null;
148
+ }
149
+
150
+ // V1 compatibility methods
151
+
152
+ /**
153
+ * Checks if a language ID is registered (V1 compatibility).
154
+ * @param languageId - The language ID to check.
155
+ * @returns True if the language ID is registered, false otherwise.
156
+ */
157
+ static hasLanguage(languageId: string): boolean {
158
+ return this.has(languageId);
159
+ }
160
+
161
+ /**
162
+ * Registers a new language definition (V1 compatibility).
163
+ * @param language - The language definition to register.
164
+ */
165
+ static registerLanguage(language: LanguageDefinition): void {
166
+ this.register(language);
167
+ }
168
+
169
+ /**
170
+ * Registers multiple language definitions (V1 compatibility).
171
+ * @param languages - An array of language definitions to register.
172
+ */
173
+ static registerLanguages(languages: readonly LanguageDefinition[]): void {
174
+ languages.forEach((lang) => this.register(lang));
175
+ }
176
+
177
+ /**
178
+ * Retrieves all registered language IDs (V1 compatibility).
179
+ * @returns An array of all language IDs.
180
+ */
181
+ static getLanguageIds(): readonly string[] {
182
+ return this.getIds();
183
+ }
184
+
185
+ /**
186
+ * Retrieves all registered language definitions (V1 compatibility).
187
+ * @returns An array of all language definitions.
188
+ */
189
+ static getAllLanguages(): readonly LanguageDefinition[] {
190
+ return this.getAll();
191
+ }
192
+
193
+ /**
194
+ * Retrieves a language definition by its code (V1 compatibility).
195
+ * @param code - The language code to retrieve.
196
+ * @returns The language definition or undefined if not found.
197
+ */
198
+ static getLanguageByCode(code: string): LanguageDefinition | undefined {
199
+ return this.getByCode(code);
200
+ }
201
+
202
+ /**
203
+ * Retrieves a language definition by its ID (V1 compatibility).
204
+ * @param languageId - The language ID to retrieve.
205
+ * @returns The language definition or undefined if not found.
206
+ */
207
+ static getLanguage(languageId: string): LanguageDefinition | undefined {
208
+ try {
209
+ return this.get(languageId);
210
+ } catch {
211
+ return undefined;
212
+ }
213
+ }
214
+
215
+ /**
216
+ * Checks if a language code is registered.
217
+ * @param code - The language code to check.
218
+ * @returns True if the language code is registered, false otherwise.
219
+ */
220
+ static hasLanguageCode(code: string): boolean {
221
+ return this.getByCode(code) !== undefined;
222
+ }
223
+
224
+ /**
225
+ * Retrieves the default language ID.
226
+ * @returns The default language ID or null if none is set.
227
+ */
228
+ static getDefaultLanguageId(): string | null {
229
+ return this.defaultLanguageId;
230
+ }
231
+
232
+ /**
233
+ * Retrieves the count of registered languages.
234
+ * @returns The number of registered languages.
235
+ */
236
+ static getLanguageCount(): number {
237
+ return this.languages.size;
238
+ }
239
+
240
+ /**
241
+ * Retrieves the default language definition.
242
+ * @returns The default language definition or null if none is set.
243
+ */
244
+ static getDefaultLanguage(): LanguageDefinition | null {
245
+ return this.getDefault();
246
+ }
247
+
248
+ /**
249
+ * Sets the default language by its ID.
250
+ * @param languageId - The language ID to set as default.
251
+ * @throws {I18nError} If the language ID is not registered.
252
+ */
253
+ static setDefaultLanguage(languageId: string): void {
254
+ if (!this.has(languageId)) {
255
+ throw I18nError.languageNotFound(languageId);
256
+ }
257
+ this.defaultLanguageId = languageId;
258
+ }
259
+
260
+ /**
261
+ * Validates that all required languages are registered.
262
+ * @param requiredLanguages - An array of required language IDs.
263
+ * @returns An object containing validation results, missing languages, and errors.
264
+ */
265
+ static validateRequiredLanguages(requiredLanguages: readonly string[]): {
266
+ isValid: boolean;
267
+ missingLanguages: readonly string[];
268
+ errors: readonly string[];
269
+ } {
270
+ const missingLanguages: string[] = [];
271
+ const errors: string[] = [];
272
+
273
+ for (const languageId of requiredLanguages) {
274
+ if (!this.has(languageId)) {
275
+ missingLanguages.push(languageId);
276
+ errors.push(`Required language '${languageId}' is not registered`);
277
+ }
278
+ }
279
+
280
+ return {
281
+ isValid: missingLanguages.length === 0,
282
+ missingLanguages,
283
+ errors,
284
+ };
285
+ }
286
+
287
+ /**
288
+ * Retrieves a mapping of language IDs to their display names.
289
+ * @returns An object mapping language IDs to display names.
290
+ */
291
+ static getLanguageDisplayNames(): Record<string, string> {
292
+ const result: Record<string, string> = {};
293
+ for (const [languageId, language] of this.languages) {
294
+ result[languageId] = language.name;
295
+ }
296
+ return result;
297
+ }
298
+
299
+ /**
300
+ * Retrieves a mapping of language IDs to their codes.
301
+ * @returns An object mapping language IDs to language codes.
302
+ */
303
+ static getLanguageCodeMapping(): Record<string, string> {
304
+ const result: Record<string, string> = {};
305
+ for (const [languageId, language] of this.languages) {
306
+ result[languageId] = language.code;
307
+ }
308
+ return result;
309
+ }
310
+
311
+ /**
312
+ * Finds languages whose names include the given partial name (case-insensitive).
313
+ * @param partialName - The partial name to search for.
314
+ * @returns An array of matching language definitions.
315
+ */
316
+ static findLanguagesByName(
317
+ partialName: string,
318
+ ): readonly LanguageDefinition[] {
319
+ const searchTerm = partialName.toLowerCase();
320
+ return Array.from(this.languages.values()).filter((language) =>
321
+ language.name.toLowerCase().includes(searchTerm),
322
+ );
323
+ }
324
+
325
+ /**
326
+ * Retrieves all registered language codes.
327
+ * @returns An array of all language codes.
328
+ */
329
+ static getLanguageCodes(): readonly string[] {
330
+ return this.getCodes();
331
+ }
332
+
333
+ /**
334
+ * Determines the best matching language code based on requested and user default codes.
335
+ * @param requestedCode - The requested language code.
336
+ * @param userDefaultCode - The user's default language code.
337
+ * @returns The best matching language code.
338
+ */
339
+ static getMatchingLanguageCode(
340
+ requestedCode?: string,
341
+ userDefaultCode?: string,
342
+ ): string {
343
+ return this.getMatchingCode(requestedCode, userDefaultCode);
344
+ }
345
+ }
@@ -2,5 +2,4 @@
2
2
  * Core component ID constant
3
3
  * Extracted to separate file to avoid circular dependencies
4
4
  */
5
- export declare const CoreI18nComponentId = "core";
6
- //# sourceMappingURL=core-component-id.d.ts.map
5
+ export const CoreI18nComponentId = 'core';
@@ -0,0 +1,270 @@
1
+ /**
2
+ * Core I18n component with default languages and system strings
3
+ */
4
+
5
+ import { ComponentDefinition } from './component-definition';
6
+ import { ComponentRegistration } from './component-registration';
7
+ import { CoreI18nComponentId } from './core-component-id';
8
+ import { CoreStringKey } from './core-string-key';
9
+ import { I18nEngine } from './core/i18n-engine';
10
+ import { ComponentConfig, EngineConfig } from './interfaces';
11
+ import { LanguageCodes } from './language-codes';
12
+ import { LanguageDefinition } from './language-definition';
13
+ import { createCompleteComponentStrings } from './strict-types';
14
+ import { germanStrings } from './strings/de';
15
+ import { BritishEnglishStrings } from './strings/en-GB';
16
+ import { americanEnglishString } from './strings/en-US';
17
+ import { spanishStrings } from './strings/es';
18
+ import { frenchStrings } from './strings/fr';
19
+ import { japaneseStrings } from './strings/ja';
20
+ import { ukrainianStrings } from './strings/uk';
21
+ import { mandarinStrings } from './strings/zh-CN';
22
+
23
+ // Re-export for backward compatibility
24
+ export { CoreI18nComponentId };
25
+
26
+ /**
27
+ * Helper function to create multiple language definitions
28
+ */
29
+ function createLanguageDefinitions(
30
+ languages: Array<{
31
+ id: string;
32
+ name: string;
33
+ code: string;
34
+ isDefault?: boolean;
35
+ }>,
36
+ ): LanguageDefinition[] {
37
+ return languages.map((lang) => ({
38
+ id: lang.id,
39
+ name: lang.name,
40
+ code: lang.code,
41
+ isDefault: lang.isDefault || false,
42
+ }));
43
+ }
44
+
45
+ /**
46
+ * Core language code type - union of supported language codes
47
+ * Provides compile-time type safety for core languages
48
+ * For custom languages, extend this type or use string
49
+ */
50
+ export type CoreLanguageCode =
51
+ (typeof LanguageCodes)[keyof typeof LanguageCodes];
52
+
53
+ /**
54
+ * Flexible language code type - use when you want runtime-only validation
55
+ * Alias for string to indicate it's a language code
56
+ */
57
+ export type FlexibleLanguageCode = string;
58
+
59
+ /**
60
+ * Create default language definitions
61
+ */
62
+ export function createDefaultLanguages(): LanguageDefinition[] {
63
+ return createLanguageDefinitions([
64
+ {
65
+ id: LanguageCodes.EN_US,
66
+ name: 'English (US)',
67
+ code: 'en-US',
68
+ isDefault: true,
69
+ },
70
+ {
71
+ id: LanguageCodes.EN_GB,
72
+ name: 'English (UK)',
73
+ code: 'en-GB',
74
+ },
75
+ {
76
+ id: LanguageCodes.FR,
77
+ name: 'Français',
78
+ code: 'fr',
79
+ },
80
+ {
81
+ id: LanguageCodes.ES,
82
+ name: 'Español',
83
+ code: 'es',
84
+ },
85
+ {
86
+ id: LanguageCodes.DE,
87
+ name: 'Deutsch',
88
+ code: 'de',
89
+ },
90
+ {
91
+ id: LanguageCodes.ZH_CN,
92
+ name: '中文 (简体)',
93
+ code: 'zh-CN',
94
+ },
95
+ {
96
+ id: LanguageCodes.JA,
97
+ name: '日本語',
98
+ code: 'ja',
99
+ },
100
+ {
101
+ id: LanguageCodes.UK,
102
+ name: 'Українська',
103
+ code: 'uk',
104
+ },
105
+ ]);
106
+ }
107
+
108
+ /**
109
+ * Core component definition
110
+ */
111
+ export const CoreComponentDefinition: ComponentDefinition<CoreStringKey> = {
112
+ id: CoreI18nComponentId,
113
+ name: 'Core I18n System',
114
+ stringKeys: Object.values(CoreStringKey),
115
+ };
116
+
117
+ /**
118
+ * Core component strings for all default languages
119
+ */
120
+ export function createCoreComponentStrings() {
121
+ return createCompleteComponentStrings<CoreStringKey, string>({
122
+ [LanguageCodes.EN_US]: americanEnglishString,
123
+ [LanguageCodes.EN_GB]: BritishEnglishStrings,
124
+ [LanguageCodes.FR]: frenchStrings,
125
+ [LanguageCodes.ES]: spanishStrings,
126
+ [LanguageCodes.DE]: germanStrings,
127
+ [LanguageCodes.ZH_CN]: mandarinStrings,
128
+ [LanguageCodes.JA]: japaneseStrings,
129
+ [LanguageCodes.UK]: ukrainianStrings,
130
+ });
131
+ }
132
+
133
+ /**
134
+ * Create core component registration (for PluginI18nEngine)
135
+ */
136
+ export function createCoreComponentRegistration(): ComponentRegistration<
137
+ CoreStringKey,
138
+ string
139
+ > {
140
+ return {
141
+ component: CoreComponentDefinition,
142
+ strings: createCoreComponentStrings(),
143
+ };
144
+ }
145
+
146
+ /**
147
+ * Create core component config (for I18nEngine)
148
+ */
149
+ export function createCoreComponentConfig(): ComponentConfig {
150
+ return {
151
+ id: CoreI18nComponentId,
152
+ strings: createCoreComponentStrings(),
153
+ aliases: ['CoreStringKey'],
154
+ };
155
+ }
156
+
157
+ /**
158
+ * Get core language codes as array (for Mongoose enums, etc.)
159
+ */
160
+ export function getCoreLanguageCodes(): string[] {
161
+ return Object.values(LanguageCodes);
162
+ }
163
+
164
+ /**
165
+ * Get core language definitions
166
+ */
167
+ export function getCoreLanguageDefinitions(): LanguageDefinition[] {
168
+ return createDefaultLanguages();
169
+ }
170
+
171
+ // 1.x definitions moved to core-plugin-factory.ts to break circular dependency
172
+ // Import these from './core-plugin-factory' or from the main index
173
+
174
+ // 2.x definitions
175
+ //------------------------------
176
+
177
+ /**
178
+ * Create Core i18n engine instance
179
+ * Uses i18n 2.0 pattern with runtime validation
180
+ * IMPORTANT: Uses 'default' as instance key so TypedHandleableError can find it
181
+ */
182
+ function createInstance(config?: EngineConfig): I18nEngine {
183
+ const engine = I18nEngine.registerIfNotExists(
184
+ 'default',
185
+ createDefaultLanguages(),
186
+ config,
187
+ );
188
+
189
+ // Register core component if not already registered
190
+ const coreReg = createCoreComponentRegistration();
191
+ engine.registerIfNotExists({
192
+ id: coreReg.component.id,
193
+ strings: coreReg.strings as Record<string, Record<string, string>>,
194
+ });
195
+
196
+ return engine;
197
+ }
198
+
199
+ /**
200
+ * Lazy initialization with Proxy (like core-i18n.ts pattern)
201
+ */
202
+ let _coreEngine: I18nEngine | undefined;
203
+
204
+ export function getCoreI18nEngine(): I18nEngine {
205
+ // Lazy initialization on first access
206
+ if (!_coreEngine) {
207
+ // Check if instance exists before creating
208
+ if (I18nEngine.hasInstance('default')) {
209
+ _coreEngine = I18nEngine.getInstance('default');
210
+ } else {
211
+ _coreEngine = createInstance();
212
+ }
213
+ return _coreEngine;
214
+ }
215
+
216
+ // Lazy re-initialization if instance was cleared
217
+ if (I18nEngine.hasInstance('default')) {
218
+ return _coreEngine;
219
+ } else {
220
+ _coreEngine = createInstance();
221
+ return _coreEngine;
222
+ }
223
+ }
224
+
225
+ /**
226
+ * Proxy for backward compatibility
227
+ */
228
+ export const coreI18nEngine = new Proxy({} as I18nEngine, {
229
+ get(target, prop) {
230
+ return getCoreI18nEngine()[prop as keyof I18nEngine];
231
+ },
232
+ });
233
+
234
+ /**
235
+ * Reset function for tests
236
+ */
237
+ export function resetCoreI18nEngine(): void {
238
+ _coreEngine = undefined;
239
+ }
240
+
241
+ /**
242
+ * Helper to translate Core strings
243
+ */
244
+ export function getCoreTranslation(
245
+ stringKey: CoreStringKey,
246
+ variables?: Record<string, string | number>,
247
+ language?: string,
248
+ ): string {
249
+ return getCoreI18nEngine().translate(
250
+ CoreI18nComponentId,
251
+ stringKey,
252
+ variables,
253
+ language,
254
+ );
255
+ }
256
+
257
+ /**
258
+ * Safe translation with fallback
259
+ */
260
+ export function safeCoreTranslation(
261
+ stringKey: CoreStringKey,
262
+ variables?: Record<string, string | number>,
263
+ language?: string,
264
+ ): string {
265
+ try {
266
+ return getCoreTranslation(stringKey, variables, language);
267
+ } catch {
268
+ return `[${stringKey}]`;
269
+ }
270
+ }