@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
@@ -0,0 +1,186 @@
1
+ /**
2
+ * Language to Plural Rule Mapping
3
+ */
4
+
5
+ import {
6
+ LanguagePluralForms,
7
+ PluralCategory,
8
+ PluralRuleFunction,
9
+ } from './plural-categories';
10
+ import {
11
+ pluralRuleArabic,
12
+ pluralRuleBreton,
13
+ pluralRuleChinese,
14
+ pluralRuleCzech,
15
+ pluralRuleEnglish,
16
+ pluralRuleFrench,
17
+ pluralRuleGerman,
18
+ pluralRuleIrish,
19
+ pluralRuleJapanese,
20
+ pluralRuleLatvian,
21
+ pluralRuleLithuanian,
22
+ pluralRulePolish,
23
+ pluralRuleRomanian,
24
+ pluralRuleRussian,
25
+ pluralRuleScottishGaelic,
26
+ pluralRuleSlovenian,
27
+ pluralRuleSpanish,
28
+ pluralRuleUkrainian,
29
+ pluralRuleWelsh,
30
+ } from './plural-rules';
31
+
32
+ /**
33
+ * Map of language codes to plural rule functions
34
+ */
35
+ export const LANGUAGE_PLURAL_RULES: Record<string, PluralRuleFunction> = {
36
+ en: pluralRuleEnglish,
37
+ 'en-US': pluralRuleEnglish,
38
+ 'en-GB': pluralRuleEnglish,
39
+ ru: pluralRuleRussian,
40
+ ar: pluralRuleArabic,
41
+ pl: pluralRulePolish,
42
+ fr: pluralRuleFrench,
43
+ es: pluralRuleSpanish,
44
+ ja: pluralRuleJapanese,
45
+ uk: pluralRuleUkrainian,
46
+ zh: pluralRuleChinese,
47
+ 'zh-CN': pluralRuleChinese,
48
+ de: pluralRuleGerman,
49
+ gd: pluralRuleScottishGaelic,
50
+ cy: pluralRuleWelsh,
51
+ br: pluralRuleBreton,
52
+ sl: pluralRuleSlovenian,
53
+ cs: pluralRuleCzech,
54
+ lt: pluralRuleLithuanian,
55
+ lv: pluralRuleLatvian,
56
+ ga: pluralRuleIrish,
57
+ ro: pluralRuleRomanian,
58
+ // Common languages reusing existing rules
59
+ it: pluralRuleEnglish,
60
+ pt: pluralRuleEnglish,
61
+ 'pt-BR': pluralRuleFrench, // Brazilian Portuguese: 0 and 1 use 'one'
62
+ nl: pluralRuleEnglish,
63
+ sv: pluralRuleEnglish,
64
+ no: pluralRuleEnglish,
65
+ da: pluralRuleEnglish,
66
+ fi: pluralRuleEnglish,
67
+ el: pluralRuleEnglish,
68
+ tr: pluralRuleJapanese,
69
+ ko: pluralRuleJapanese,
70
+ vi: pluralRuleJapanese,
71
+ th: pluralRuleJapanese,
72
+ id: pluralRuleJapanese,
73
+ ms: pluralRuleJapanese,
74
+ he: pluralRuleEnglish, // Simplified - full Hebrew is more complex
75
+ hi: pluralRuleFrench,
76
+ };
77
+
78
+ /**
79
+ * Map of language codes to required/optional plural forms
80
+ */
81
+ export const LANGUAGE_PLURAL_FORMS: Record<string, LanguagePluralForms> = {
82
+ en: { required: ['one', 'other'], optional: ['zero'] },
83
+ 'en-US': { required: ['one', 'other'], optional: ['zero'] },
84
+ 'en-GB': { required: ['one', 'other'], optional: ['zero'] },
85
+ ru: { required: ['one', 'few', 'many'], optional: ['zero'] },
86
+ ar: {
87
+ required: ['zero', 'one', 'two', 'few', 'many', 'other'],
88
+ optional: [],
89
+ },
90
+ pl: { required: ['one', 'few', 'many'], optional: ['zero', 'other'] },
91
+ fr: { required: ['one', 'other'], optional: ['zero'] },
92
+ es: { required: ['one', 'other'], optional: ['zero'] },
93
+ ja: { required: ['other'], optional: [] },
94
+ uk: { required: ['one', 'few', 'many'], optional: ['zero'] },
95
+ zh: { required: ['other'], optional: [] },
96
+ 'zh-CN': { required: ['other'], optional: [] },
97
+ de: { required: ['one', 'other'], optional: ['zero'] },
98
+ gd: { required: ['one', 'two', 'few', 'other'], optional: [] },
99
+ cy: {
100
+ required: ['zero', 'one', 'two', 'few', 'many', 'other'],
101
+ optional: [],
102
+ },
103
+ br: { required: ['one', 'two', 'few', 'many', 'other'], optional: [] },
104
+ sl: { required: ['one', 'two', 'few', 'other'], optional: [] },
105
+ cs: { required: ['one', 'few', 'many', 'other'], optional: [] },
106
+ lt: { required: ['one', 'few', 'many', 'other'], optional: [] },
107
+ lv: { required: ['zero', 'one', 'other'], optional: [] },
108
+ ga: { required: ['one', 'two', 'few', 'many', 'other'], optional: [] },
109
+ ro: { required: ['one', 'few', 'other'], optional: [] },
110
+ // Common languages
111
+ it: { required: ['one', 'other'], optional: ['zero'] },
112
+ pt: { required: ['one', 'other'], optional: ['zero'] },
113
+ 'pt-BR': { required: ['one', 'other'], optional: ['zero'] },
114
+ nl: { required: ['one', 'other'], optional: ['zero'] },
115
+ sv: { required: ['one', 'other'], optional: ['zero'] },
116
+ no: { required: ['one', 'other'], optional: ['zero'] },
117
+ da: { required: ['one', 'other'], optional: ['zero'] },
118
+ fi: { required: ['one', 'other'], optional: ['zero'] },
119
+ el: { required: ['one', 'other'], optional: ['zero'] },
120
+ tr: { required: ['other'], optional: [] },
121
+ ko: { required: ['other'], optional: [] },
122
+ vi: { required: ['other'], optional: [] },
123
+ th: { required: ['other'], optional: [] },
124
+ id: { required: ['other'], optional: [] },
125
+ ms: { required: ['other'], optional: [] },
126
+ he: { required: ['one', 'other'], optional: ['zero'] },
127
+ hi: { required: ['one', 'other'], optional: ['zero'] },
128
+ };
129
+
130
+ /**
131
+ * Get plural category for a number in a specific language
132
+ */
133
+ export function getPluralCategory(
134
+ language: string,
135
+ count: number,
136
+ ): PluralCategory {
137
+ // Handle invalid inputs
138
+ if (typeof count !== 'number' || !isFinite(count)) {
139
+ return 'other';
140
+ }
141
+
142
+ // Get the plural rule for the language
143
+ const rule = LANGUAGE_PLURAL_RULES[language] || LANGUAGE_PLURAL_RULES['en'];
144
+
145
+ // Apply the rule
146
+ return rule(Math.abs(count));
147
+ }
148
+
149
+ /**
150
+ * Get required plural forms for a language
151
+ */
152
+ export function getRequiredPluralForms(language: string): string[] {
153
+ const forms = LANGUAGE_PLURAL_FORMS[language] || LANGUAGE_PLURAL_FORMS['en'];
154
+ return forms.required;
155
+ }
156
+
157
+ /**
158
+ * Get all plural forms (required + optional) for a language
159
+ */
160
+ export function getAllPluralForms(language: string): string[] {
161
+ const forms = LANGUAGE_PLURAL_FORMS[language] || LANGUAGE_PLURAL_FORMS['en'];
162
+ return [...forms.required, ...forms.optional];
163
+ }
164
+
165
+ /**
166
+ * Check if a language has a specific plural form
167
+ */
168
+ export function hasPluralForm(language: string, category: string): boolean {
169
+ const forms = LANGUAGE_PLURAL_FORMS[language] || LANGUAGE_PLURAL_FORMS['en'];
170
+ // Type guard to check if category is a valid PluralCategory
171
+ const validCategories: readonly string[] = [
172
+ 'zero',
173
+ 'one',
174
+ 'two',
175
+ 'few',
176
+ 'many',
177
+ 'other',
178
+ ];
179
+ if (!validCategories.includes(category)) {
180
+ return false;
181
+ }
182
+ return (
183
+ forms.required.includes(category as PluralCategory) ||
184
+ forms.optional.includes(category as PluralCategory)
185
+ );
186
+ }
@@ -3,20 +3,22 @@
3
3
  * Based on Unicode CLDR plural rules
4
4
  * @see https://cldr.unicode.org/index/cldr-spec/plural-rules
5
5
  */
6
+
6
7
  /**
7
8
  * Standard CLDR plural categories
8
9
  */
9
10
  export type PluralCategory = 'zero' | 'one' | 'two' | 'few' | 'many' | 'other';
11
+
10
12
  /**
11
13
  * Plural rule function type
12
14
  * Takes a number and returns the appropriate plural category
13
15
  */
14
16
  export type PluralRuleFunction = (n: number) => PluralCategory;
17
+
15
18
  /**
16
19
  * Language-specific plural forms required
17
20
  */
18
21
  export interface LanguagePluralForms {
19
- required: PluralCategory[];
20
- optional: PluralCategory[];
22
+ required: PluralCategory[];
23
+ optional: PluralCategory[];
21
24
  }
22
- //# sourceMappingURL=plural-categories.d.ts.map
@@ -0,0 +1,228 @@
1
+ /**
2
+ * CLDR Plural Rules Implementation
3
+ * Based on Unicode CLDR plural rules for cardinal numbers
4
+ */
5
+
6
+ import { PluralCategory, PluralRuleFunction } from './plural-categories';
7
+
8
+ /**
9
+ * English plural rule (en-US, en-GB)
10
+ * Forms: one, other
11
+ */
12
+ export const pluralRuleEnglish: PluralRuleFunction = (n: number): PluralCategory => {
13
+ if (n === 1) return 'one';
14
+ return 'other';
15
+ };
16
+
17
+ /**
18
+ * Russian plural rule (ru)
19
+ * Forms: one, few, many
20
+ */
21
+ export const pluralRuleRussian: PluralRuleFunction = (n: number): PluralCategory => {
22
+ const mod10 = n % 10;
23
+ const mod100 = n % 100;
24
+
25
+ if (mod10 === 1 && mod100 !== 11) return 'one';
26
+ if (mod10 >= 2 && mod10 <= 4 && (mod100 < 12 || mod100 > 14)) return 'few';
27
+ return 'many';
28
+ };
29
+
30
+ /**
31
+ * Arabic plural rule (ar)
32
+ * Forms: zero, one, two, few, many, other
33
+ */
34
+ export const pluralRuleArabic: PluralRuleFunction = (n: number): PluralCategory => {
35
+ if (n === 0) return 'zero';
36
+ if (n === 1) return 'one';
37
+ if (n === 2) return 'two';
38
+
39
+ const mod100 = n % 100;
40
+ if (mod100 >= 3 && mod100 <= 10) return 'few';
41
+ if (mod100 >= 11) return 'many';
42
+ return 'other';
43
+ };
44
+
45
+ /**
46
+ * Polish plural rule (pl)
47
+ * Forms: one, few, many, other
48
+ */
49
+ export const pluralRulePolish: PluralRuleFunction = (n: number): PluralCategory => {
50
+ // Fractional numbers use "other"
51
+ if (n !== Math.floor(n)) return 'other';
52
+
53
+ if (n === 1) return 'one';
54
+
55
+ const mod10 = n % 10;
56
+ const mod100 = n % 100;
57
+
58
+ if (mod10 >= 2 && mod10 <= 4 && (mod100 < 12 || mod100 > 14)) return 'few';
59
+ if (n !== 1 && (mod10 === 0 || mod10 === 1 || (mod10 >= 5 && mod10 <= 9) || (mod100 >= 12 && mod100 <= 14))) return 'many';
60
+ return 'other';
61
+ };
62
+
63
+ /**
64
+ * French plural rule (fr)
65
+ * Forms: one, other
66
+ */
67
+ export const pluralRuleFrench: PluralRuleFunction = (n: number): PluralCategory => {
68
+ if (n === 0 || n === 1) return 'one';
69
+ return 'other';
70
+ };
71
+
72
+ /**
73
+ * Spanish plural rule (es)
74
+ * Forms: one, other
75
+ */
76
+ export const pluralRuleSpanish: PluralRuleFunction = (n: number): PluralCategory => {
77
+ if (n === 1) return 'one';
78
+ return 'other';
79
+ };
80
+
81
+ /**
82
+ * Japanese plural rule (ja)
83
+ * Forms: other (no plural distinction)
84
+ */
85
+ export const pluralRuleJapanese: PluralRuleFunction = (n: number): PluralCategory => {
86
+ return 'other';
87
+ };
88
+
89
+ /**
90
+ * Ukrainian plural rule (uk)
91
+ * Forms: one, few, many (same as Russian)
92
+ */
93
+ export const pluralRuleUkrainian: PluralRuleFunction = pluralRuleRussian;
94
+
95
+ /**
96
+ * Chinese plural rule (zh-CN)
97
+ * Forms: other (no plural distinction)
98
+ */
99
+ export const pluralRuleChinese: PluralRuleFunction = (n: number): PluralCategory => {
100
+ return 'other';
101
+ };
102
+
103
+ /**
104
+ * German plural rule (de)
105
+ * Forms: one, other
106
+ */
107
+ export const pluralRuleGerman: PluralRuleFunction = (n: number): PluralCategory => {
108
+ if (n === 1) return 'one';
109
+ return 'other';
110
+ };
111
+
112
+ /**
113
+ * Scottish Gaelic plural rule (gd)
114
+ * Forms: one, two, few, other
115
+ * One of the most complex plural systems
116
+ */
117
+ export const pluralRuleScottishGaelic: PluralRuleFunction = (n: number): PluralCategory => {
118
+ if (n === 1 || n === 11) return 'one';
119
+ if (n === 2 || n === 12) return 'two';
120
+ if ((n >= 3 && n <= 10) || (n >= 13 && n <= 19)) return 'few';
121
+ return 'other';
122
+ };
123
+
124
+ /**
125
+ * Welsh plural rule (cy)
126
+ * Forms: zero, one, two, few, many, other
127
+ */
128
+ export const pluralRuleWelsh: PluralRuleFunction = (n: number): PluralCategory => {
129
+ if (n === 0) return 'zero';
130
+ if (n === 1) return 'one';
131
+ if (n === 2) return 'two';
132
+ if (n === 3) return 'few';
133
+ if (n === 6) return 'many';
134
+ return 'other';
135
+ };
136
+
137
+ /**
138
+ * Breton plural rule (br)
139
+ * Forms: one, two, few, many, other
140
+ */
141
+ export const pluralRuleBreton: PluralRuleFunction = (n: number): PluralCategory => {
142
+ const mod10 = n % 10;
143
+ const mod100 = n % 100;
144
+
145
+ if (mod10 === 1 && mod100 !== 11 && mod100 !== 71 && mod100 !== 91) return 'one';
146
+ if (mod10 === 2 && mod100 !== 12 && mod100 !== 72 && mod100 !== 92) return 'two';
147
+ if ((mod10 === 3 || mod10 === 4 || mod10 === 9) &&
148
+ (mod100 < 10 || mod100 > 19) &&
149
+ (mod100 < 70 || mod100 > 79) &&
150
+ (mod100 < 90 || mod100 > 99)) return 'few';
151
+ if (n !== 0 && n % 1000000 === 0) return 'many';
152
+ return 'other';
153
+ };
154
+
155
+ /**
156
+ * Slovenian plural rule (sl)
157
+ * Forms: one, two, few, other
158
+ */
159
+ export const pluralRuleSlovenian: PluralRuleFunction = (n: number): PluralCategory => {
160
+ const mod100 = n % 100;
161
+
162
+ if (mod100 === 1) return 'one';
163
+ if (mod100 === 2) return 'two';
164
+ if (mod100 === 3 || mod100 === 4) return 'few';
165
+ return 'other';
166
+ };
167
+
168
+ /**
169
+ * Czech plural rule (cs)
170
+ * Forms: one, few, many, other
171
+ */
172
+ export const pluralRuleCzech: PluralRuleFunction = (n: number): PluralCategory => {
173
+ if (n === 1) return 'one';
174
+ if (n >= 2 && n <= 4) return 'few';
175
+ if (n !== Math.floor(n)) return 'many';
176
+ return 'other';
177
+ };
178
+
179
+ /**
180
+ * Lithuanian plural rule (lt)
181
+ * Forms: one, few, many, other
182
+ */
183
+ export const pluralRuleLithuanian: PluralRuleFunction = (n: number): PluralCategory => {
184
+ const mod10 = n % 10;
185
+ const mod100 = n % 100;
186
+
187
+ if (mod10 === 1 && (mod100 < 11 || mod100 > 19)) return 'one';
188
+ if (mod10 >= 2 && mod10 <= 9 && (mod100 < 11 || mod100 > 19)) return 'few';
189
+ if (n !== Math.floor(n)) return 'many';
190
+ return 'other';
191
+ };
192
+
193
+ /**
194
+ * Latvian plural rule (lv)
195
+ * Forms: zero, one, other
196
+ */
197
+ export const pluralRuleLatvian: PluralRuleFunction = (n: number): PluralCategory => {
198
+ const mod10 = n % 10;
199
+ const mod100 = n % 100;
200
+
201
+ if (n === 0) return 'zero';
202
+ if (mod10 === 1 && mod100 !== 11) return 'one';
203
+ return 'other';
204
+ };
205
+
206
+ /**
207
+ * Irish plural rule (ga)
208
+ * Forms: one, two, few, many, other
209
+ */
210
+ export const pluralRuleIrish: PluralRuleFunction = (n: number): PluralCategory => {
211
+ if (n === 1) return 'one';
212
+ if (n === 2) return 'two';
213
+ if (n >= 3 && n <= 6) return 'few';
214
+ if (n >= 7 && n <= 10) return 'many';
215
+ return 'other';
216
+ };
217
+
218
+ /**
219
+ * Romanian plural rule (ro)
220
+ * Forms: one, few, other
221
+ */
222
+ export const pluralRuleRomanian: PluralRuleFunction = (n: number): PluralCategory => {
223
+ const mod100 = n % 100;
224
+
225
+ if (n === 1) return 'one';
226
+ if (n === 0 || (mod100 >= 1 && mod100 <= 19)) return 'few';
227
+ return 'other';
228
+ }
@@ -0,0 +1,16 @@
1
+ import { CurrencyCode } from './utils/currency';
2
+ import { Timezone } from './utils/timezone';
3
+ import { ValidationConfig } from './validation-config';
4
+
5
+ /**
6
+ * Registry configuration
7
+ */
8
+ export interface RegistryConfig<TLanguages extends string> {
9
+ readonly defaultLanguage: TLanguages;
10
+ readonly fallbackLanguage: TLanguages;
11
+ readonly defaultCurrencyCode: CurrencyCode;
12
+ readonly timezone: Timezone;
13
+ readonly adminTimezone: Timezone;
14
+ readonly validation: ValidationConfig;
15
+ readonly constants?: Record<string, any>;
16
+ }
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Error types for registry operations
3
+ */
4
+ export enum RegistryErrorType {
5
+ /** Error when a requested component is not found in the registry */
6
+ ComponentNotFound = 'COMPONENT_NOT_FOUND',
7
+ /** Error when a requested language is not found in the registry */
8
+ LanguageNotFound = 'LANGUAGE_NOT_FOUND',
9
+ /** Error when a requested string key is not found in a component */
10
+ StringKeyNotFound = 'STRING_KEY_NOT_FOUND',
11
+ /** Error when component registration is incomplete (missing strings) */
12
+ IncompleteRegistration = 'INCOMPLETE_REGISTRATION',
13
+ /** Error when attempting to register a component that already exists */
14
+ DuplicateComponent = 'DUPLICATE_COMPONENT',
15
+ /** Error when attempting to register a language that already exists */
16
+ DuplicateLanguage = 'DUPLICATE_LANGUAGE',
17
+ /** Error when component validation fails */
18
+ ValidationFailed = 'VALIDATION_FAILED',
19
+ }
@@ -0,0 +1,100 @@
1
+ // CoreLanguageCode is deprecated - using string
2
+ import { CoreI18nComponentId } from './core-component-id';
3
+ import { CoreStringKey } from './core-string-key';
4
+ import { RegistryErrorType } from './registry-error-type';
5
+
6
+ /**
7
+ * Minimal translation engine interface to avoid circular dependencies
8
+ */
9
+ export interface RegistryTranslationEngine {
10
+ safeTranslate(
11
+ componentId: string,
12
+ key: string,
13
+ variables?: Record<string, string | number>,
14
+ language?: string,
15
+ ): string;
16
+ }
17
+
18
+ /**
19
+ * Reason map for registry errors
20
+ */
21
+ const REGISTRY_ERROR_REASON_MAP = {
22
+ [RegistryErrorType.ComponentNotFound]:
23
+ CoreStringKey.Error_ComponentNotFoundTemplate,
24
+ [RegistryErrorType.DuplicateComponent]:
25
+ CoreStringKey.Error_DuplicateComponentTemplate,
26
+ [RegistryErrorType.DuplicateLanguage]:
27
+ CoreStringKey.Error_DuplicateLanguageTemplate,
28
+ [RegistryErrorType.IncompleteRegistration]:
29
+ CoreStringKey.Error_IncompleteRegistrationTemplate,
30
+ [RegistryErrorType.LanguageNotFound]:
31
+ CoreStringKey.Error_LanguageNotFoundTemplate,
32
+ [RegistryErrorType.StringKeyNotFound]:
33
+ CoreStringKey.Error_StringKeyNotFoundTemplate,
34
+ [RegistryErrorType.ValidationFailed]:
35
+ CoreStringKey.Error_ValidationFailedTemplate,
36
+ } as const;
37
+
38
+ /**
39
+ * Registry error class that can work with plugin engines
40
+ */
41
+ export class RegistryError extends Error {
42
+ constructor(
43
+ public override readonly type: RegistryErrorType,
44
+ message: string,
45
+ public override readonly metadata?: Record<string, any>,
46
+ ) {
47
+ super(message);
48
+ this.name = 'RegistryError';
49
+ }
50
+
51
+ /**
52
+ * Create a registry error with translation support
53
+ * Uses lazy initialization to avoid circular dependencies
54
+ */
55
+ static createWithEngine(
56
+ engine: RegistryTranslationEngine,
57
+ type: RegistryErrorType,
58
+ variables?: Record<string, string | number>,
59
+ language?: string,
60
+ metadata?: Record<string, any>,
61
+ ): RegistryError {
62
+ const key = REGISTRY_ERROR_REASON_MAP[type];
63
+ let message: string;
64
+
65
+ if (key && engine) {
66
+ try {
67
+ // Try to translate the error message using the engine
68
+ message = engine.safeTranslate(
69
+ CoreI18nComponentId,
70
+ key,
71
+ variables,
72
+ language,
73
+ );
74
+ } catch (translationError) {
75
+ // Fallback if translation fails
76
+ message = `Error: ${type}${
77
+ metadata ? ` - ${JSON.stringify(metadata)}` : ''
78
+ }`;
79
+ }
80
+ } else {
81
+ // Fallback to a basic English message
82
+ message = `Error: ${type}${
83
+ metadata ? ` - ${JSON.stringify(metadata)}` : ''
84
+ }`;
85
+ }
86
+
87
+ return new RegistryError(type, message, metadata);
88
+ }
89
+
90
+ /**
91
+ * Create a simple RegistryError without engine dependency
92
+ */
93
+ static createSimple(
94
+ type: RegistryErrorType,
95
+ message: string,
96
+ metadata?: Record<string, any>,
97
+ ): RegistryError {
98
+ return new RegistryError(type, message, metadata);
99
+ }
100
+ }
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Enforces that for each language L, all string keys K are present.
3
+ */
4
+ export type CompleteLanguageStrings<TStringKey extends string> = {
5
+ [K in TStringKey]: string;
6
+ };
7
+
8
+ export type CompleteComponentLanguageStrings<
9
+ TStringKey extends string,
10
+ TLanguages extends string,
11
+ > = {
12
+ [L in TLanguages]: CompleteLanguageStrings<TStringKey>;
13
+ };
14
+
15
+ /**
16
+ * Helper to assert at compile-time that an object is a complete component language map.
17
+ * Returns the object unchanged at runtime.
18
+ */
19
+ export function createCompleteComponentStrings<
20
+ TStringKey extends string,
21
+ TLanguages extends string,
22
+ >(
23
+ obj: CompleteComponentLanguageStrings<TStringKey, TLanguages>,
24
+ ): CompleteComponentLanguageStrings<TStringKey, TLanguages> {
25
+ return obj;
26
+ }
27
+
28
+ /**
29
+ * Utility to extract missing keys at compile time (identity, purely for readability)
30
+ */
31
+ export function defineLanguageStrings<TStringKey extends string>(
32
+ strings: CompleteLanguageStrings<TStringKey>,
33
+ ): CompleteLanguageStrings<TStringKey> {
34
+ return strings;
35
+ }
@@ -0,0 +1,75 @@
1
+ import { CoreStringKey } from '../core-string-key';
2
+
3
+ export const germanStrings: Record<CoreStringKey, string> = {
4
+ // Common/General
5
+ [CoreStringKey.Common_Yes]: 'Ja',
6
+ [CoreStringKey.Common_No]: 'Nein',
7
+ [CoreStringKey.Common_Cancel]: 'Abbrechen',
8
+ [CoreStringKey.Common_OK]: 'OK',
9
+ [CoreStringKey.Common_Save]: 'Speichern',
10
+ [CoreStringKey.Common_Delete]: 'Löschen',
11
+ [CoreStringKey.Common_Edit]: 'Bearbeiten',
12
+ [CoreStringKey.Common_Create]: 'Erstellen',
13
+ [CoreStringKey.Common_Update]: 'Aktualisieren',
14
+ [CoreStringKey.Common_Loading]: 'Lädt...',
15
+ [CoreStringKey.Common_Error]: 'Fehler',
16
+ [CoreStringKey.Common_Success]: 'Erfolg',
17
+ [CoreStringKey.Common_Warning]: 'Warnung',
18
+ [CoreStringKey.Common_Info]: 'Information',
19
+ [CoreStringKey.Common_Disposed]: 'Objekt wurde freigegeben',
20
+ [CoreStringKey.Common_Test]: 'Test',
21
+
22
+ // Error Messages
23
+ [CoreStringKey.Error_InvalidInput]: 'Ungültige Eingabe bereitgestellt',
24
+ [CoreStringKey.Error_NetworkError]: 'Netzwerkverbindungsfehler',
25
+ [CoreStringKey.Error_NotFound]: 'Ressource nicht gefunden',
26
+ [CoreStringKey.Error_AccessDenied]: 'Zugriff verweigert',
27
+ [CoreStringKey.Error_InternalServer]: 'Interner Serverfehler',
28
+ [CoreStringKey.Error_ValidationFailed]: 'Validierung fehlgeschlagen',
29
+ [CoreStringKey.Error_RequiredField]: 'Dieses Feld ist erforderlich',
30
+ [CoreStringKey.Error_InvalidContext]: 'Ungültiger Kontext',
31
+ [CoreStringKey.Error_InvalidContextTemplate]:
32
+ 'Ungültiger Kontext: {contextKey}',
33
+ [CoreStringKey.Error_MissingTranslationKeyTemplate]:
34
+ 'Fehlender Übersetzungsschlüssel: {stringKey}',
35
+ [CoreStringKey.Error_InvalidCurrencyCodeTemplate]: 'Ungültiger Währungscode: {value}',
36
+
37
+ // Registry Error Templates
38
+ [CoreStringKey.Error_ComponentNotFoundTemplate]:
39
+ 'Komponente "{componentId}" nicht gefunden',
40
+ [CoreStringKey.Error_LanguageNotFoundTemplate]:
41
+ 'Sprache "{language}" nicht gefunden',
42
+ [CoreStringKey.Error_StringKeyNotFoundTemplate]:
43
+ 'String-Schlüssel "{stringKey}" für Komponente "{componentId}" nicht gefunden',
44
+ [CoreStringKey.Error_IncompleteRegistrationTemplate]:
45
+ 'Unvollständige Registrierung für Komponente "{componentId}": {missingCount} Strings fehlen',
46
+ [CoreStringKey.Error_DuplicateComponentTemplate]:
47
+ 'Komponente "{componentId}" ist bereits registriert',
48
+ [CoreStringKey.Error_DuplicateLanguageTemplate]:
49
+ 'Sprache "{languageId}" ist bereits registriert',
50
+ [CoreStringKey.Error_ValidationFailedTemplate]:
51
+ 'Validierung für Komponente "{componentId}" fehlgeschlagen: {errorCount} Fehler',
52
+
53
+ // System Messages
54
+ [CoreStringKey.System_Welcome]: 'Willkommen',
55
+ [CoreStringKey.System_Goodbye]: 'Auf Wiedersehen',
56
+ [CoreStringKey.System_PleaseWait]: 'Bitte warten...',
57
+ [CoreStringKey.System_ProcessingRequest]:
58
+ 'Ihre Anfrage wird bearbeitet...',
59
+ [CoreStringKey.System_OperationComplete]:
60
+ 'Vorgang erfolgreich abgeschlossen',
61
+ [CoreStringKey.System_NoDataAvailable]: 'Keine Daten verfügbar',
62
+
63
+ [CoreStringKey.Error_InstanceAlreadyExistsTemplate]:
64
+ "Instanz mit Schlüssel '{key}' existiert bereits",
65
+ [CoreStringKey.Error_InstanceNotFoundTemplate]:
66
+ "Instanz mit Schlüssel '{key}' nicht gefunden",
67
+ [CoreStringKey.Error_MissingStringCollectionTemplate]:
68
+ 'Fehlende String-Sammlung für Sprache: {language}',
69
+ [CoreStringKey.Error_MissingTranslationTemplate]:
70
+ "Fehlende Übersetzung für Schlüssel '{key}' in Sprache '{language}'",
71
+ [CoreStringKey.Error_DefaultLanguageNoCollectionTemplate]:
72
+ "Standardsprache '{language}' hat keine String-Sammlung",
73
+ [CoreStringKey.Error_MissingTranslationKeyForTypeTemplate]:
74
+ 'Fehlender Übersetzungsschlüssel für Typ: {type}',
75
+ };