@digitaldefiance/i18n-lib 3.7.5 → 3.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (490) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +261 -0
  3. package/package.json +12 -4
  4. package/src/active-context.ts +4 -0
  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.ts +16 -0
  16. package/src/core/language-registry.ts +345 -0
  17. package/src/core-component-id.ts +5 -0
  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.ts +8 -0
  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.ts +15 -0
  29. package/src/errors/simple-typed-error.ts +81 -0
  30. package/src/errors/{index.d.ts → translatable-exports.ts} +3 -5
  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} +46 -14
  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.ts +13 -0
  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.ts +142 -0
  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 +0 -36
  109. package/src/active-context.d.ts.map +0 -1
  110. package/src/active-context.js +0 -3
  111. package/src/active-context.js.map +0 -1
  112. package/src/builders/i18n-builder.d.ts +0 -26
  113. package/src/builders/i18n-builder.d.ts.map +0 -1
  114. package/src/builders/i18n-builder.js +0 -70
  115. package/src/builders/i18n-builder.js.map +0 -1
  116. package/src/builders/index.d.ts.map +0 -1
  117. package/src/builders/index.js +0 -8
  118. package/src/builders/index.js.map +0 -1
  119. package/src/component-definition.d.ts +0 -12
  120. package/src/component-definition.d.ts.map +0 -1
  121. package/src/component-definition.js +0 -3
  122. package/src/component-definition.js.map +0 -1
  123. package/src/component-registration.d.ts +0 -13
  124. package/src/component-registration.d.ts.map +0 -1
  125. package/src/component-registration.js +0 -3
  126. package/src/component-registration.js.map +0 -1
  127. package/src/component-registry.d.ts +0 -102
  128. package/src/component-registry.d.ts.map +0 -1
  129. package/src/component-registry.js +0 -282
  130. package/src/component-registry.js.map +0 -1
  131. package/src/context-error-type.d.ts +0 -8
  132. package/src/context-error-type.d.ts.map +0 -1
  133. package/src/context-error-type.js +0 -12
  134. package/src/context-error-type.js.map +0 -1
  135. package/src/core/component-store.d.ts +0 -93
  136. package/src/core/component-store.d.ts.map +0 -1
  137. package/src/core/component-store.js +0 -198
  138. package/src/core/component-store.js.map +0 -1
  139. package/src/core/context-manager.d.ts +0 -72
  140. package/src/core/context-manager.d.ts.map +0 -1
  141. package/src/core/context-manager.js +0 -98
  142. package/src/core/context-manager.js.map +0 -1
  143. package/src/core/enum-registry.d.ts +0 -48
  144. package/src/core/enum-registry.d.ts.map +0 -1
  145. package/src/core/enum-registry.js +0 -85
  146. package/src/core/enum-registry.js.map +0 -1
  147. package/src/core/i18n-engine.d.ts +0 -241
  148. package/src/core/i18n-engine.d.ts.map +0 -1
  149. package/src/core/i18n-engine.js +0 -568
  150. package/src/core/i18n-engine.js.map +0 -1
  151. package/src/core/index.d.ts +0 -9
  152. package/src/core/index.d.ts.map +0 -1
  153. package/src/core/index.js +0 -12
  154. package/src/core/index.js.map +0 -1
  155. package/src/core/language-registry.d.ts +0 -180
  156. package/src/core/language-registry.d.ts.map +0 -1
  157. package/src/core/language-registry.js +0 -295
  158. package/src/core/language-registry.js.map +0 -1
  159. package/src/core-i18n.d.ts +0 -91
  160. package/src/core-i18n.d.ts.map +0 -1
  161. package/src/core-i18n.js +0 -287
  162. package/src/core-i18n.js.map +0 -1
  163. package/src/core-string-key.d.ts +0 -52
  164. package/src/core-string-key.d.ts.map +0 -1
  165. package/src/core-string-key.js +0 -61
  166. package/src/core-string-key.js.map +0 -1
  167. package/src/create-translation-adapter.d.ts +0 -33
  168. package/src/create-translation-adapter.d.ts.map +0 -1
  169. package/src/create-translation-adapter.js +0 -72
  170. package/src/create-translation-adapter.js.map +0 -1
  171. package/src/enum-registry.d.ts +0 -65
  172. package/src/enum-registry.d.ts.map +0 -1
  173. package/src/enum-registry.js +0 -123
  174. package/src/enum-registry.js.map +0 -1
  175. package/src/errors/context-error.d.ts +0 -50
  176. package/src/errors/context-error.d.ts.map +0 -1
  177. package/src/errors/context-error.js +0 -75
  178. package/src/errors/context-error.js.map +0 -1
  179. package/src/errors/enhanced-error-base.d.ts +0 -125
  180. package/src/errors/enhanced-error-base.d.ts.map +0 -1
  181. package/src/errors/enhanced-error-base.js +0 -165
  182. package/src/errors/enhanced-error-base.js.map +0 -1
  183. package/src/errors/handleable.d.ts +0 -83
  184. package/src/errors/handleable.d.ts.map +0 -1
  185. package/src/errors/handleable.js +0 -136
  186. package/src/errors/handleable.js.map +0 -1
  187. package/src/errors/i18n-error.d.ts +0 -211
  188. package/src/errors/i18n-error.d.ts.map +0 -1
  189. package/src/errors/i18n-error.js +0 -358
  190. package/src/errors/i18n-error.js.map +0 -1
  191. package/src/errors/index.d.ts.map +0 -1
  192. package/src/errors/index.js +0 -17
  193. package/src/errors/index.js.map +0 -1
  194. package/src/errors/simple-typed-error.d.ts +0 -53
  195. package/src/errors/simple-typed-error.d.ts.map +0 -1
  196. package/src/errors/simple-typed-error.js +0 -51
  197. package/src/errors/simple-typed-error.js.map +0 -1
  198. package/src/errors/translatable-generic.d.ts +0 -84
  199. package/src/errors/translatable-generic.d.ts.map +0 -1
  200. package/src/errors/translatable-generic.js +0 -134
  201. package/src/errors/translatable-generic.js.map +0 -1
  202. package/src/errors/translatable-handleable-generic.d.ts +0 -116
  203. package/src/errors/translatable-handleable-generic.d.ts.map +0 -1
  204. package/src/errors/translatable-handleable-generic.js +0 -121
  205. package/src/errors/translatable-handleable-generic.js.map +0 -1
  206. package/src/errors/translatable.d.ts +0 -59
  207. package/src/errors/translatable.d.ts.map +0 -1
  208. package/src/errors/translatable.js +0 -80
  209. package/src/errors/translatable.js.map +0 -1
  210. package/src/errors/typed-handleable.d.ts +0 -62
  211. package/src/errors/typed-handleable.d.ts.map +0 -1
  212. package/src/errors/typed-handleable.js +0 -106
  213. package/src/errors/typed-handleable.js.map +0 -1
  214. package/src/errors/typed.d.ts +0 -206
  215. package/src/errors/typed.d.ts.map +0 -1
  216. package/src/errors/typed.js +0 -452
  217. package/src/errors/typed.js.map +0 -1
  218. package/src/gender/gender-categories.d.ts.map +0 -1
  219. package/src/gender/gender-categories.js +0 -15
  220. package/src/gender/gender-categories.js.map +0 -1
  221. package/src/gender/gender-resolver.d.ts +0 -14
  222. package/src/gender/gender-resolver.d.ts.map +0 -1
  223. package/src/gender/gender-resolver.js +0 -35
  224. package/src/gender/gender-resolver.js.map +0 -1
  225. package/src/gender/index.d.ts.map +0 -1
  226. package/src/gender/index.js +0 -6
  227. package/src/gender/index.js.map +0 -1
  228. package/src/global-active-context.d.ts +0 -50
  229. package/src/global-active-context.d.ts.map +0 -1
  230. package/src/global-active-context.js +0 -185
  231. package/src/global-active-context.js.map +0 -1
  232. package/src/icu/ast.d.ts +0 -48
  233. package/src/icu/ast.d.ts.map +0 -1
  234. package/src/icu/ast.js +0 -16
  235. package/src/icu/ast.js.map +0 -1
  236. package/src/icu/compiler.d.ts +0 -16
  237. package/src/icu/compiler.d.ts.map +0 -1
  238. package/src/icu/compiler.js +0 -87
  239. package/src/icu/compiler.js.map +0 -1
  240. package/src/icu/formatter-registry.d.ts +0 -10
  241. package/src/icu/formatter-registry.d.ts.map +0 -1
  242. package/src/icu/formatter-registry.js +0 -34
  243. package/src/icu/formatter-registry.js.map +0 -1
  244. package/src/icu/formatters/base-formatter.d.ts +0 -8
  245. package/src/icu/formatters/base-formatter.d.ts.map +0 -1
  246. package/src/icu/formatters/base-formatter.js +0 -3
  247. package/src/icu/formatters/base-formatter.js.map +0 -1
  248. package/src/icu/formatters/date-formatter.d.ts +0 -5
  249. package/src/icu/formatters/date-formatter.d.ts.map +0 -1
  250. package/src/icu/formatters/date-formatter.js +0 -31
  251. package/src/icu/formatters/date-formatter.js.map +0 -1
  252. package/src/icu/formatters/number-formatter.d.ts +0 -5
  253. package/src/icu/formatters/number-formatter.d.ts.map +0 -1
  254. package/src/icu/formatters/number-formatter.js +0 -33
  255. package/src/icu/formatters/number-formatter.js.map +0 -1
  256. package/src/icu/formatters/plural-formatter.d.ts +0 -5
  257. package/src/icu/formatters/plural-formatter.d.ts.map +0 -1
  258. package/src/icu/formatters/plural-formatter.js +0 -15
  259. package/src/icu/formatters/plural-formatter.js.map +0 -1
  260. package/src/icu/formatters/select-formatter.d.ts +0 -5
  261. package/src/icu/formatters/select-formatter.d.ts.map +0 -1
  262. package/src/icu/formatters/select-formatter.js +0 -10
  263. package/src/icu/formatters/select-formatter.js.map +0 -1
  264. package/src/icu/formatters/selectordinal-formatter.d.ts +0 -5
  265. package/src/icu/formatters/selectordinal-formatter.d.ts.map +0 -1
  266. package/src/icu/formatters/selectordinal-formatter.js +0 -22
  267. package/src/icu/formatters/selectordinal-formatter.js.map +0 -1
  268. package/src/icu/formatters/time-formatter.d.ts +0 -5
  269. package/src/icu/formatters/time-formatter.d.ts.map +0 -1
  270. package/src/icu/formatters/time-formatter.js +0 -31
  271. package/src/icu/formatters/time-formatter.js.map +0 -1
  272. package/src/icu/helpers.d.ts +0 -9
  273. package/src/icu/helpers.d.ts.map +0 -1
  274. package/src/icu/helpers.js +0 -31
  275. package/src/icu/helpers.js.map +0 -1
  276. package/src/icu/parser.d.ts +0 -31
  277. package/src/icu/parser.d.ts.map +0 -1
  278. package/src/icu/parser.js +0 -203
  279. package/src/icu/parser.js.map +0 -1
  280. package/src/icu/runtime.d.ts +0 -10
  281. package/src/icu/runtime.d.ts.map +0 -1
  282. package/src/icu/runtime.js +0 -33
  283. package/src/icu/runtime.js.map +0 -1
  284. package/src/icu/tokenizer.d.ts +0 -37
  285. package/src/icu/tokenizer.d.ts.map +0 -1
  286. package/src/icu/tokenizer.js +0 -187
  287. package/src/icu/tokenizer.js.map +0 -1
  288. package/src/icu/validator.d.ts +0 -11
  289. package/src/icu/validator.d.ts.map +0 -1
  290. package/src/icu/validator.js +0 -140
  291. package/src/icu/validator.js.map +0 -1
  292. package/src/index.d.ts.map +0 -1
  293. package/src/index.js +0 -76
  294. package/src/index.js.map +0 -1
  295. package/src/interfaces/component-config.interface.d.ts +0 -16
  296. package/src/interfaces/component-config.interface.d.ts.map +0 -1
  297. package/src/interfaces/component-config.interface.js +0 -6
  298. package/src/interfaces/component-config.interface.js.map +0 -1
  299. package/src/interfaces/engine-config.interface.d.ts +0 -22
  300. package/src/interfaces/engine-config.interface.d.ts.map +0 -1
  301. package/src/interfaces/engine-config.interface.js +0 -6
  302. package/src/interfaces/engine-config.interface.js.map +0 -1
  303. package/src/interfaces/global-active-context.d.ts +0 -23
  304. package/src/interfaces/global-active-context.d.ts.map +0 -1
  305. package/src/interfaces/global-active-context.js +0 -3
  306. package/src/interfaces/global-active-context.js.map +0 -1
  307. package/src/interfaces/handleable-error-options.d.ts +0 -14
  308. package/src/interfaces/handleable-error-options.d.ts.map +0 -1
  309. package/src/interfaces/handleable-error-options.js +0 -3
  310. package/src/interfaces/handleable-error-options.js.map +0 -1
  311. package/src/interfaces/handleable.d.ts +0 -21
  312. package/src/interfaces/handleable.d.ts.map +0 -1
  313. package/src/interfaces/handleable.js +0 -3
  314. package/src/interfaces/handleable.js.map +0 -1
  315. package/src/interfaces/i18n-engine.interface.d.ts +0 -46
  316. package/src/interfaces/i18n-engine.interface.d.ts.map +0 -1
  317. package/src/interfaces/i18n-engine.interface.js +0 -6
  318. package/src/interfaces/i18n-engine.interface.js.map +0 -1
  319. package/src/interfaces/index.d.ts +0 -11
  320. package/src/interfaces/index.d.ts.map +0 -1
  321. package/src/interfaces/index.js +0 -14
  322. package/src/interfaces/index.js.map +0 -1
  323. package/src/interfaces/language-definition.interface.d.ts +0 -17
  324. package/src/interfaces/language-definition.interface.d.ts.map +0 -1
  325. package/src/interfaces/language-definition.interface.js +0 -6
  326. package/src/interfaces/language-definition.interface.js.map +0 -1
  327. package/src/interfaces/translation-options.interface.d.ts +0 -15
  328. package/src/interfaces/translation-options.interface.d.ts.map +0 -1
  329. package/src/interfaces/translation-options.interface.js +0 -6
  330. package/src/interfaces/translation-options.interface.js.map +0 -1
  331. package/src/interfaces/validation-result.interface.d.ts +0 -24
  332. package/src/interfaces/validation-result.interface.d.ts.map +0 -1
  333. package/src/interfaces/validation-result.interface.js +0 -6
  334. package/src/interfaces/validation-result.interface.js.map +0 -1
  335. package/src/language-codes.d.ts +0 -28
  336. package/src/language-codes.d.ts.map +0 -1
  337. package/src/language-codes.js +0 -32
  338. package/src/language-codes.js.map +0 -1
  339. package/src/language-definition.d.ts +0 -14
  340. package/src/language-definition.d.ts.map +0 -1
  341. package/src/language-definition.js +0 -3
  342. package/src/language-definition.js.map +0 -1
  343. package/src/plugin-i18n-engine.d.ts +0 -164
  344. package/src/plugin-i18n-engine.d.ts.map +0 -1
  345. package/src/plugin-i18n-engine.js +0 -489
  346. package/src/plugin-i18n-engine.js.map +0 -1
  347. package/src/pluralization/index.d.ts.map +0 -1
  348. package/src/pluralization/index.js +0 -10
  349. package/src/pluralization/index.js.map +0 -1
  350. package/src/pluralization/language-plural-map.d.ts +0 -29
  351. package/src/pluralization/language-plural-map.d.ts.map +0 -1
  352. package/src/pluralization/language-plural-map.js +0 -155
  353. package/src/pluralization/language-plural-map.js.map +0 -1
  354. package/src/pluralization/plural-categories.d.ts.map +0 -1
  355. package/src/pluralization/plural-categories.js +0 -8
  356. package/src/pluralization/plural-categories.js.map +0 -1
  357. package/src/pluralization/plural-rules.d.ts +0 -102
  358. package/src/pluralization/plural-rules.d.ts.map +0 -1
  359. package/src/pluralization/plural-rules.js +0 -263
  360. package/src/pluralization/plural-rules.js.map +0 -1
  361. package/src/registry-config.d.ts +0 -16
  362. package/src/registry-config.d.ts.map +0 -1
  363. package/src/registry-config.js +0 -3
  364. package/src/registry-config.js.map +0 -1
  365. package/src/registry-error-type.d.ts +0 -20
  366. package/src/registry-error-type.d.ts.map +0 -1
  367. package/src/registry-error-type.js +0 -24
  368. package/src/registry-error-type.js.map +0 -1
  369. package/src/registry-error.d.ts +0 -19
  370. package/src/registry-error.d.ts.map +0 -1
  371. package/src/registry-error.js +0 -49
  372. package/src/registry-error.js.map +0 -1
  373. package/src/strict-types.d.ts +0 -19
  374. package/src/strict-types.d.ts.map +0 -1
  375. package/src/strict-types.js +0 -18
  376. package/src/strict-types.js.map +0 -1
  377. package/src/strings/de.d.ts +0 -3
  378. package/src/strings/de.d.ts.map +0 -1
  379. package/src/strings/de.js +0 -57
  380. package/src/strings/de.js.map +0 -1
  381. package/src/strings/en-GB.d.ts +0 -3
  382. package/src/strings/en-GB.d.ts.map +0 -1
  383. package/src/strings/en-GB.js +0 -57
  384. package/src/strings/en-GB.js.map +0 -1
  385. package/src/strings/en-US.d.ts +0 -3
  386. package/src/strings/en-US.d.ts.map +0 -1
  387. package/src/strings/en-US.js +0 -57
  388. package/src/strings/en-US.js.map +0 -1
  389. package/src/strings/es.d.ts +0 -3
  390. package/src/strings/es.d.ts.map +0 -1
  391. package/src/strings/es.js +0 -57
  392. package/src/strings/es.js.map +0 -1
  393. package/src/strings/fr.d.ts +0 -3
  394. package/src/strings/fr.d.ts.map +0 -1
  395. package/src/strings/fr.js +0 -57
  396. package/src/strings/fr.js.map +0 -1
  397. package/src/strings/ja.d.ts +0 -3
  398. package/src/strings/ja.d.ts.map +0 -1
  399. package/src/strings/ja.js +0 -57
  400. package/src/strings/ja.js.map +0 -1
  401. package/src/strings/uk.d.ts +0 -3
  402. package/src/strings/uk.d.ts.map +0 -1
  403. package/src/strings/uk.js +0 -57
  404. package/src/strings/uk.js.map +0 -1
  405. package/src/strings/zh-CN.d.ts +0 -3
  406. package/src/strings/zh-CN.d.ts.map +0 -1
  407. package/src/strings/zh-CN.js +0 -57
  408. package/src/strings/zh-CN.js.map +0 -1
  409. package/src/template.d.ts +0 -13
  410. package/src/template.d.ts.map +0 -1
  411. package/src/template.js +0 -40
  412. package/src/template.js.map +0 -1
  413. package/src/translation-engine.d.ts +0 -9
  414. package/src/translation-engine.d.ts.map +0 -1
  415. package/src/translation-engine.js +0 -3
  416. package/src/translation-engine.js.map +0 -1
  417. package/src/translation-request.d.ts +0 -10
  418. package/src/translation-request.d.ts.map +0 -1
  419. package/src/translation-request.js +0 -3
  420. package/src/translation-request.js.map +0 -1
  421. package/src/translation-response.d.ts +0 -9
  422. package/src/translation-response.d.ts.map +0 -1
  423. package/src/translation-response.js +0 -3
  424. package/src/translation-response.js.map +0 -1
  425. package/src/types/engine.d.ts +0 -47
  426. package/src/types/engine.d.ts.map +0 -1
  427. package/src/types/engine.js +0 -8
  428. package/src/types/engine.js.map +0 -1
  429. package/src/types/index.d.ts.map +0 -1
  430. package/src/types/index.js +0 -9
  431. package/src/types/index.js.map +0 -1
  432. package/src/types/plural-types.d.ts.map +0 -1
  433. package/src/types/plural-types.js +0 -39
  434. package/src/types/plural-types.js.map +0 -1
  435. package/src/types.d.ts +0 -96
  436. package/src/types.d.ts.map +0 -1
  437. package/src/types.js +0 -23
  438. package/src/types.js.map +0 -1
  439. package/src/utils/currency.d.ts +0 -81
  440. package/src/utils/currency.d.ts.map +0 -1
  441. package/src/utils/currency.js +0 -101
  442. package/src/utils/currency.js.map +0 -1
  443. package/src/utils/html-escape.d.ts +0 -22
  444. package/src/utils/html-escape.d.ts.map +0 -1
  445. package/src/utils/html-escape.js +0 -53
  446. package/src/utils/html-escape.js.map +0 -1
  447. package/src/utils/index.d.ts.map +0 -1
  448. package/src/utils/index.js +0 -12
  449. package/src/utils/index.js.map +0 -1
  450. package/src/utils/lru-cache.d.ts +0 -42
  451. package/src/utils/lru-cache.d.ts.map +0 -1
  452. package/src/utils/lru-cache.js +0 -73
  453. package/src/utils/lru-cache.js.map +0 -1
  454. package/src/utils/plural-helpers.d.ts.map +0 -1
  455. package/src/utils/plural-helpers.js +0 -35
  456. package/src/utils/plural-helpers.js.map +0 -1
  457. package/src/utils/safe-object.d.ts +0 -39
  458. package/src/utils/safe-object.d.ts.map +0 -1
  459. package/src/utils/safe-object.js.map +0 -1
  460. package/src/utils/string-utils.d.ts +0 -28
  461. package/src/utils/string-utils.d.ts.map +0 -1
  462. package/src/utils/string-utils.js +0 -63
  463. package/src/utils/string-utils.js.map +0 -1
  464. package/src/utils/timezone.d.ts +0 -50
  465. package/src/utils/timezone.d.ts.map +0 -1
  466. package/src/utils/timezone.js +0 -74
  467. package/src/utils/timezone.js.map +0 -1
  468. package/src/utils/validation.d.ts +0 -40
  469. package/src/utils/validation.d.ts.map +0 -1
  470. package/src/utils/validation.js +0 -69
  471. package/src/utils/validation.js.map +0 -1
  472. package/src/utils.d.ts +0 -65
  473. package/src/utils.d.ts.map +0 -1
  474. package/src/utils.js +0 -129
  475. package/src/utils.js.map +0 -1
  476. package/src/validation/index.d.ts.map +0 -1
  477. package/src/validation/index.js +0 -5
  478. package/src/validation/index.js.map +0 -1
  479. package/src/validation/plural-validator.d.ts +0 -46
  480. package/src/validation/plural-validator.d.ts.map +0 -1
  481. package/src/validation/plural-validator.js +0 -123
  482. package/src/validation/plural-validator.js.map +0 -1
  483. package/src/validation-config.d.ts +0 -12
  484. package/src/validation-config.d.ts.map +0 -1
  485. package/src/validation-config.js +0 -3
  486. package/src/validation-config.js.map +0 -1
  487. package/src/validation-result.d.ts +0 -13
  488. package/src/validation-result.d.ts.map +0 -1
  489. package/src/validation-result.js +0 -3
  490. package/src/validation-result.js.map +0 -1
@@ -0,0 +1,111 @@
1
+ /**
2
+ * Factory for creating core plugin I18n engine instances
3
+ * This file breaks the circular dependency between core-i18n.ts and plugin-i18n-engine.ts
4
+ */
5
+
6
+ import {
7
+ createCoreComponentRegistration,
8
+ createDefaultLanguages,
9
+ } from './core-i18n';
10
+ import { PluginI18nEngine } from './plugin-i18n-engine';
11
+ import { RegistryConfig } from './registry-config';
12
+
13
+ const DefaultInstanceKey = 'default';
14
+
15
+ /**
16
+ * Create a pre-configured I18n engine with core components
17
+ * Returns engine with string type - use registry for language validation
18
+ */
19
+ export function createCorePluginI18nEngine(
20
+ instanceKey: string = DefaultInstanceKey,
21
+ config?: Partial<RegistryConfig<string>>,
22
+ ): PluginI18nEngine<string> {
23
+ const languages = createDefaultLanguages();
24
+ const engine = PluginI18nEngine.createInstance<string>(
25
+ instanceKey,
26
+ languages,
27
+ config,
28
+ );
29
+ engine.registerComponent(createCoreComponentRegistration());
30
+ return engine;
31
+ }
32
+
33
+ // Note: Lazy initialization to avoid circular dependency issues
34
+ // Tests should call resetCorePluginI18nEngine() after PluginI18nEngine.resetAll()
35
+ let _corePluginI18nEngine: PluginI18nEngine<string> | undefined;
36
+
37
+ export function getCorePluginI18nEngine(): PluginI18nEngine<string> {
38
+ // Lazy initialization on first access
39
+ if (!_corePluginI18nEngine) {
40
+ _corePluginI18nEngine = createCorePluginI18nEngine();
41
+ return _corePluginI18nEngine;
42
+ }
43
+
44
+ // Lazy re-initialization if instance was cleared
45
+ try {
46
+ PluginI18nEngine.getInstance<string>(DefaultInstanceKey);
47
+ return _corePluginI18nEngine;
48
+ } catch {
49
+ _corePluginI18nEngine = createCorePluginI18nEngine();
50
+ return _corePluginI18nEngine;
51
+ }
52
+ }
53
+
54
+ // Getter for direct reference - lazily initialized
55
+ export const corePluginI18nEngine = new Proxy({} as PluginI18nEngine<string>, {
56
+ get(_target, prop) {
57
+ const engine = getCorePluginI18nEngine();
58
+ return engine[prop as keyof PluginI18nEngine<string>];
59
+ },
60
+ });
61
+
62
+ // Reset function for tests
63
+ export function resetCorePluginI18nEngine(): void {
64
+ _corePluginI18nEngine = undefined;
65
+ }
66
+
67
+ /**
68
+ * Type alias for easier usage
69
+ */
70
+ export type CorePluginI18nEngine = PluginI18nEngine<string>;
71
+
72
+ /**
73
+ * Helper function to get core translation
74
+ * Uses the core engine instance to ensure core strings are available
75
+ */
76
+ export function getCorePluginTranslation(
77
+ stringKey: string,
78
+ variables?: Record<string, string | number>,
79
+ language?: string,
80
+ instanceKey?: string,
81
+ ): string {
82
+ // Use string literal to avoid circular dependency
83
+ const coreComponentId = 'core';
84
+
85
+ // Use core engine if no instance key specified, otherwise use specified instance
86
+ const engine = instanceKey
87
+ ? PluginI18nEngine.getInstance<string>(instanceKey)
88
+ : getCorePluginI18nEngine();
89
+ return engine.translate(coreComponentId, stringKey, variables, language);
90
+ }
91
+
92
+ /**
93
+ * Helper function to safely get core translation with fallback
94
+ */
95
+ export function safeCorePluginTranslation(
96
+ stringKey: string,
97
+ variables?: Record<string, string | number>,
98
+ language?: string,
99
+ instanceKey?: string,
100
+ ): string {
101
+ try {
102
+ return getCorePluginTranslation(
103
+ stringKey,
104
+ variables,
105
+ language,
106
+ instanceKey,
107
+ );
108
+ } catch {
109
+ return `[CoreStringKey.${stringKey}]`;
110
+ }
111
+ }
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Core system string keys
3
+ */
4
+ export enum CoreStringKey {
5
+ // Common/General
6
+ Common_Yes = 'common_yes',
7
+ Common_No = 'common_no',
8
+ Common_Cancel = 'common_cancel',
9
+ Common_OK = 'common_ok',
10
+ Common_Save = 'common_save',
11
+ Common_Delete = 'common_delete',
12
+ Common_Edit = 'common_edit',
13
+ Common_Create = 'common_create',
14
+ Common_Update = 'common_update',
15
+ Common_Loading = 'common_loading',
16
+ Common_Error = 'common_error',
17
+ Common_Success = 'common_success',
18
+ Common_Warning = 'common_warning',
19
+ Common_Info = 'common_info',
20
+ Common_Disposed = 'common_disposed',
21
+ Common_Test = 'common_test',
22
+ // Error Messages
23
+ Error_InvalidInput = 'error_invalidInput',
24
+ Error_NetworkError = 'error_networkError',
25
+ Error_NotFound = 'error_notFound',
26
+ Error_AccessDenied = 'error_accessDenied',
27
+ Error_InternalServer = 'error_internalServer',
28
+ Error_ValidationFailed = 'error_validationFailed',
29
+ Error_RequiredField = 'error_requiredField',
30
+ Error_InvalidContext = 'error_invalidContext',
31
+ Error_InvalidContextTemplate = 'error_invalidContextTemplate',
32
+ Error_InvalidCurrencyCodeTemplate = 'error_invalidCurrencyCodeTemplate',
33
+
34
+ // Registry Errors (templates support variables)
35
+ Error_ComponentNotFoundTemplate = 'error_componentNotFoundTemplate',
36
+ Error_LanguageNotFoundTemplate = 'error_languageNotFoundTemplate',
37
+ Error_StringKeyNotFoundTemplate = 'error_stringKeyNotFoundTemplate',
38
+ Error_IncompleteRegistrationTemplate = 'error_incompleteRegistrationTemplate',
39
+ Error_DuplicateComponentTemplate = 'error_duplicateComponentTemplate',
40
+ Error_DuplicateLanguageTemplate = 'error_duplicateLanguageTemplate',
41
+ Error_ValidationFailedTemplate = 'error_validationFailedTemplate',
42
+ Error_MissingTranslationKeyTemplate = 'error_missingTranslationKeyTemplate',
43
+
44
+ // System Messages
45
+ System_Welcome = 'system_welcome',
46
+ System_Goodbye = 'system_goodbye',
47
+ System_PleaseWait = 'system_pleaseWait',
48
+ System_ProcessingRequest = 'system_processingRequest',
49
+ System_OperationComplete = 'system_operationComplete',
50
+ System_NoDataAvailable = 'system_noDataAvailable',
51
+
52
+ // DefaultStringKey
53
+ Error_InstanceAlreadyExistsTemplate = 'error_instanceAlreadyExistsTemplate',
54
+ Error_InstanceNotFoundTemplate = 'error_instanceNotFoundTemplate',
55
+ Error_MissingStringCollectionTemplate = 'error_missingStringCollectionTemplate',
56
+ Error_MissingTranslationTemplate = 'error_missingTranslationTemplate',
57
+ Error_DefaultLanguageNoCollectionTemplate = 'error_defaultLanguageNoCollectionTemplate',
58
+ Error_MissingTranslationKeyForTypeTemplate = 'error_missingTranslationKeyForTypeTemplate',
59
+ }
@@ -0,0 +1,93 @@
1
+ import { PluginI18nEngine } from './plugin-i18n-engine';
2
+ import { TranslationEngine } from './translation-engine';
3
+
4
+ /**
5
+ * Creates a TranslationEngine adapter from a PluginI18nEngine for a specific component.
6
+ * This allows PluginI18nEngine to be used where TranslationEngine interface is expected.
7
+ *
8
+ * The adapter supports both calling conventions:
9
+ * - Full TranslationEngine interface: `translate(componentId, key, vars, lang)`
10
+ * - Simplified interface: `translate(key, vars, lang)` (componentId is bound)
11
+ *
12
+ * @param pluginEngine - The PluginI18nEngine instance to wrap
13
+ * @param componentId - The component ID to use for translations
14
+ * @returns A TranslationEngine that delegates to the PluginI18nEngine
15
+ *
16
+ * @example
17
+ * ```typescript
18
+ * const pluginEngine = getMyPluginI18nEngine();
19
+ * const adapter = createTranslationAdapter(pluginEngine, 'my-component');
20
+ *
21
+ * // Simplified interface (componentId is bound)
22
+ * const text1 = adapter.translate('key');
23
+ * const text2 = adapter.translate('key', { var: 'value' });
24
+ * const text3 = adapter.translate('key', { var: 'value' }, 'fr');
25
+ *
26
+ * // Full TranslationEngine interface
27
+ * const text4 = adapter.translate('other-component', 'key', { var: 'value' }, 'fr');
28
+ * ```
29
+ */
30
+ export function createTranslationAdapter<
31
+ TStringKey extends string,
32
+ TLanguage extends string,
33
+ >(
34
+ pluginEngine: PluginI18nEngine<TLanguage>,
35
+ componentId: string,
36
+ ): TranslationEngine<TStringKey> & {
37
+ translate(key: TStringKey, vars?: Record<string, string | number>, lang?: TLanguage): string;
38
+ safeTranslate(key: TStringKey, vars?: Record<string, string | number>, lang?: TLanguage): string;
39
+ } {
40
+ const adapter: any = {
41
+ translate: (
42
+ keyOrComponentId: string | TStringKey,
43
+ varsOrKey?: TStringKey | Record<string, string | number>,
44
+ langOrVars?: TLanguage | Record<string, string | number>,
45
+ maybeLang?: TLanguage,
46
+ ): string => {
47
+ let actualKey: TStringKey;
48
+ let actualVars: Record<string, string | number> | undefined;
49
+ let actualLang: TLanguage | undefined;
50
+
51
+ if (arguments.length >= 4 || (typeof varsOrKey === 'string')) {
52
+ actualKey = varsOrKey as TStringKey;
53
+ actualVars = langOrVars as Record<string, string | number> | undefined;
54
+ actualLang = maybeLang;
55
+ } else {
56
+ actualKey = keyOrComponentId as TStringKey;
57
+ actualVars = varsOrKey as Record<string, string | number> | undefined;
58
+ actualLang = langOrVars as TLanguage | undefined;
59
+ }
60
+
61
+ try {
62
+ return pluginEngine.translate(componentId, actualKey, actualVars, actualLang);
63
+ } catch (error) {
64
+ return String(actualKey);
65
+ }
66
+ },
67
+
68
+ safeTranslate: (
69
+ keyOrComponentId: string | TStringKey,
70
+ varsOrKey?: TStringKey | Record<string, string | number>,
71
+ langOrVars?: TLanguage | Record<string, string | number>,
72
+ maybeLang?: TLanguage,
73
+ ): string => {
74
+ let actualKey: TStringKey;
75
+ let actualVars: Record<string, string | number> | undefined;
76
+ let actualLang: TLanguage | undefined;
77
+
78
+ if (arguments.length >= 4 || (typeof varsOrKey === 'string')) {
79
+ actualKey = varsOrKey as TStringKey;
80
+ actualVars = langOrVars as Record<string, string | number> | undefined;
81
+ actualLang = maybeLang;
82
+ } else {
83
+ actualKey = keyOrComponentId as TStringKey;
84
+ actualVars = varsOrKey as Record<string, string | number> | undefined;
85
+ actualLang = langOrVars as TLanguage | undefined;
86
+ }
87
+
88
+ return pluginEngine.safeTranslate(componentId, actualKey, actualVars, actualLang);
89
+ },
90
+ };
91
+
92
+ return adapter;
93
+ }
@@ -0,0 +1,152 @@
1
+ import { EnumLanguageTranslation } from './types';
2
+
3
+ /**
4
+ * Registry for managing translations of enum values across multiple languages.
5
+ *
6
+ * @template TStringKey Type of translation key used in error messages.
7
+ * @template TLanguage Type of supported language codes.
8
+ */
9
+ export class EnumTranslationRegistry<
10
+ TStringKey extends string,
11
+ TLanguage extends string,
12
+ > {
13
+ protected translations = new Map<any, EnumLanguageTranslation<any, TLanguage>>();
14
+ protected enumNames = new WeakMap<any, string>();
15
+ protected availableLanguages: Set<TLanguage>;
16
+ protected translateFn?: (key: TStringKey, vars?: Record<string, any>) => string;
17
+
18
+ /**
19
+ * Creates a new EnumTranslationRegistry.
20
+ *
21
+ * @param availableLanguages Array of supported language codes.
22
+ * @param translateFn Optional translation function for error templates.
23
+ */
24
+ constructor(
25
+ availableLanguages: TLanguage[],
26
+ translateFn?: (key: TStringKey, vars?: Record<string, any>) => string,
27
+ ) {
28
+ this.availableLanguages = new Set(availableLanguages);
29
+ this.translateFn = translateFn;
30
+ }
31
+
32
+ /**
33
+ * Registers an enum and its language-specific translations.
34
+ *
35
+ * @template TEnum Enum value type (string or number).
36
+ * @param enumObj The enum object to register.
37
+ * @param translations Mapping of language codes to value-to-string translations.
38
+ * @param enumName Human-readable name of the enum (used in errors).
39
+ * @throws {Error} If translations contain languages not in availableLanguages.
40
+ */
41
+ public register<TEnum extends string | number>(
42
+ enumObj: Record<string, TEnum>,
43
+ translations: EnumLanguageTranslation<TEnum, TLanguage>,
44
+ enumName: string,
45
+ ): void {
46
+ this.validateTranslations(translations, enumName);
47
+ this.translations.set(enumObj, translations);
48
+ this.enumNames.set(enumObj, enumName);
49
+ }
50
+
51
+ /**
52
+ * Translates a specific enum value into the target language.
53
+ *
54
+ * @template TEnum Enum value type.
55
+ * @param enumObj The enum object registered previously.
56
+ * @param value The enum value to translate.
57
+ * @param language The target language code.
58
+ * @returns The translated string.
59
+ * @throws {Error} If the enum or language or value is not found.
60
+ */
61
+ public translate<TEnum extends string | number>(
62
+ enumObj: Record<string, TEnum>,
63
+ value: TEnum,
64
+ language: TLanguage,
65
+ ): string {
66
+ const translations = this.translations.get(enumObj);
67
+ if (!translations) {
68
+ const message = this.translateFn
69
+ ? this.translateFn('Error_EnumNotFoundTemplate' as TStringKey, {
70
+ enumName: this.getEnumName(enumObj),
71
+ })
72
+ : `No translations found for enum: ${this.getEnumName(enumObj)}`;
73
+ throw new Error(message);
74
+ }
75
+
76
+ const langTranslations = translations[language];
77
+ if (!langTranslations) {
78
+ const message = this.translateFn
79
+ ? this.translateFn('Error_EnumLanguageNotFoundTemplate' as TStringKey, {
80
+ language,
81
+ })
82
+ : `No translations found for language: ${language}`;
83
+ throw new Error(message);
84
+ }
85
+
86
+ let result = langTranslations[value];
87
+ if (!result && typeof value === 'number') {
88
+ const stringKey = Object.keys(enumObj).find(
89
+ (key) => enumObj[key] === value,
90
+ );
91
+ if (stringKey) {
92
+ result = langTranslations[stringKey as TEnum];
93
+ }
94
+ }
95
+
96
+ if (!result) {
97
+ const message = this.translateFn
98
+ ? this.translateFn('Error_EnumValueNotFoundTemplate' as TStringKey, {
99
+ value: String(value),
100
+ })
101
+ : `No translation found for value: ${String(value)}`;
102
+ throw new Error(message);
103
+ }
104
+
105
+ return result;
106
+ }
107
+
108
+ /**
109
+ * Checks whether translations exist for the given enum object.
110
+ *
111
+ * @param enumObj The enum object to check.
112
+ * @returns True if registered, false otherwise.
113
+ */
114
+ public has(enumObj: any): boolean {
115
+ return this.translations.has(enumObj);
116
+ }
117
+
118
+ /**
119
+ * Internal: Retrieves the human-readable name of the enum.
120
+ *
121
+ * @param enumObj The enum object.
122
+ * @returns Registered enum name or 'UnknownEnum' if not set.
123
+ */
124
+ private getEnumName(enumObj: any): string {
125
+ return this.enumNames.get(enumObj) || 'UnknownEnum';
126
+ }
127
+
128
+ /**
129
+ * Internal: Validates that translation entries only use available languages.
130
+ *
131
+ * @template TEnum Enum value type.
132
+ * @param translations Mapping of language codes to translations.
133
+ * @param enumName Enum name for error reporting.
134
+ * @throws {Error} If a translation language is not available.
135
+ */
136
+ private validateTranslations<TEnum extends string | number>(
137
+ translations: EnumLanguageTranslation<TEnum, TLanguage>,
138
+ enumName: string,
139
+ ): void {
140
+ for (const language of Object.keys(translations) as TLanguage[]) {
141
+ if (!this.availableLanguages.has(language)) {
142
+ const message = this.translateFn
143
+ ? this.translateFn(
144
+ 'Error_EnumLanguageNotAvailableTemplate' as TStringKey,
145
+ { language, enumName },
146
+ )
147
+ : `Language '${language}' in enum '${enumName}' is not available in this registry`;
148
+ throw new Error(message);
149
+ }
150
+ }
151
+ }
152
+ }
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Base error exports that don't depend on core modules
3
+ * These can be imported without triggering core module initialization
4
+ */
5
+
6
+ export * from './enhanced-error-base';
7
+ export * from './handleable';
8
+ export * from './simple-typed-error';
@@ -0,0 +1,122 @@
1
+ import { ContextErrorType } from '../context-error-type';
2
+ import { CoreI18nComponentId } from '../core-component-id';
3
+ import { CoreStringKey } from '../core-string-key';
4
+ import { EnhancedErrorHelper } from './enhanced-error-base';
5
+
6
+ // Lazy reference to I18nEngine to avoid circular dependencies
7
+ let engineGetter: (() => any) | undefined;
8
+
9
+ /**
10
+ * Error class for context-related failures in the i18n system.
11
+ * Thrown when attempting to access or manipulate an invalid or non-existent context.
12
+ *
13
+ * **i18n Feature Support:**
14
+ * - ICU MessageFormat variable substitution
15
+ * - Nested message paths detection
16
+ * - Number formatting for context depths/positions
17
+ * - SelectOrdinal for context priority levels
18
+ *
19
+ * **Translation String Examples:**
20
+ * ```typescript
21
+ * // ICU plural
22
+ * "Context has {count, plural, one {# issue} other {# issues}}"
23
+ *
24
+ * // ICU select + nested
25
+ * "{severity, select, low {Minor context issue} high {Critical context error}}"
26
+ *
27
+ * // Number formatting
28
+ * "Context exceeded {limit, number, integer} maximum depth"
29
+ * ```
30
+ */
31
+ export class ContextError extends Error {
32
+ /** The type of context error */
33
+ public override readonly type: ContextErrorType;
34
+ /** The context key that caused the error, if applicable */
35
+ public readonly contextKey?: string;
36
+ /** Additional context metadata */
37
+ public override readonly metadata?: Record<string, any>;
38
+
39
+ /**
40
+ * Creates a new ContextError instance.
41
+ * @param type - The type of context error
42
+ * @param contextKey - Optional context key that caused the error
43
+ * @param variables - Additional variables for ICU message formatting
44
+ * @param language - Optional language code
45
+ */
46
+ constructor(
47
+ type: ContextErrorType,
48
+ contextKey?: string,
49
+ variables?: Record<string, string | number>,
50
+ language?: string,
51
+ ) {
52
+ // Lazy initialization: get engine instance at runtime to avoid circular dependencies
53
+ let message: string;
54
+ try {
55
+ // Lazy load I18nEngine to break circular dependency
56
+ if (!engineGetter) {
57
+ // Dynamically import at runtime
58
+ const coreModule = eval('require')('../core');
59
+ engineGetter = () => coreModule.I18nEngine.getInstance('default');
60
+ }
61
+ const engine = engineGetter();
62
+ const allVars = { ...variables, contextKey: contextKey || '' };
63
+ message = contextKey
64
+ ? engine.safeTranslate(
65
+ CoreI18nComponentId,
66
+ CoreStringKey.Error_InvalidContextTemplate,
67
+ allVars,
68
+ language,
69
+ )
70
+ : engine.safeTranslate(
71
+ CoreI18nComponentId,
72
+ CoreStringKey.Error_InvalidContext,
73
+ allVars,
74
+ language,
75
+ );
76
+ } catch {
77
+ // Fallback if engine not available
78
+ message = contextKey
79
+ ? `Invalid context: ${contextKey}`
80
+ : 'Invalid context';
81
+ }
82
+ super(message);
83
+ this.name = 'ContextError';
84
+ this.type = type;
85
+ this.contextKey = contextKey;
86
+ this.metadata = variables;
87
+ }
88
+
89
+ /**
90
+ * Create context error with nested path information
91
+ * Demonstrates selectordinal for depth level
92
+ */
93
+ static withNestedPath(
94
+ type: ContextErrorType,
95
+ contextPath: string,
96
+ language = 'en-US',
97
+ ): ContextError {
98
+ const analysis = EnhancedErrorHelper.analyzeKeyPath(contextPath);
99
+ return new ContextError(
100
+ type,
101
+ contextPath,
102
+ {
103
+ depth: analysis.depth,
104
+ isNested: analysis.isNested ? 'true' : 'false',
105
+ },
106
+ language,
107
+ );
108
+ }
109
+
110
+ /**
111
+ * Create context error with count information
112
+ * Demonstrates plural formatting
113
+ */
114
+ static withCount(
115
+ type: ContextErrorType,
116
+ contextKey: string,
117
+ count: number,
118
+ language = 'en-US',
119
+ ): ContextError {
120
+ return new ContextError(type, contextKey, { count }, language);
121
+ }
122
+ }