@digitaldefiance/i18n-lib 2.1.40 → 3.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (128) hide show
  1. package/README.md +405 -0
  2. package/package.json +1 -1
  3. package/src/core/component-store.d.ts +4 -0
  4. package/src/core/component-store.d.ts.map +1 -1
  5. package/src/core/component-store.js +27 -5
  6. package/src/core/component-store.js.map +1 -1
  7. package/src/errors/i18n-error.d.ts +6 -0
  8. package/src/errors/i18n-error.d.ts.map +1 -1
  9. package/src/errors/i18n-error.js +12 -0
  10. package/src/errors/i18n-error.js.map +1 -1
  11. package/src/gender/gender-categories.d.ts +7 -0
  12. package/src/gender/gender-categories.d.ts.map +1 -0
  13. package/src/gender/gender-categories.js +10 -0
  14. package/src/gender/gender-categories.js.map +1 -0
  15. package/src/gender/gender-resolver.d.ts +9 -0
  16. package/src/gender/gender-resolver.d.ts.map +1 -0
  17. package/src/gender/gender-resolver.js +30 -0
  18. package/src/gender/gender-resolver.js.map +1 -0
  19. package/src/gender/index.d.ts +3 -0
  20. package/src/gender/index.d.ts.map +1 -0
  21. package/src/gender/index.js +6 -0
  22. package/src/gender/index.js.map +1 -0
  23. package/src/icu/ast.d.ts +48 -0
  24. package/src/icu/ast.d.ts.map +1 -0
  25. package/src/icu/ast.js +16 -0
  26. package/src/icu/ast.js.map +1 -0
  27. package/src/icu/compiler.d.ts +16 -0
  28. package/src/icu/compiler.d.ts.map +1 -0
  29. package/src/icu/compiler.js +81 -0
  30. package/src/icu/compiler.js.map +1 -0
  31. package/src/icu/formatter-registry.d.ts +10 -0
  32. package/src/icu/formatter-registry.d.ts.map +1 -0
  33. package/src/icu/formatter-registry.js +34 -0
  34. package/src/icu/formatter-registry.js.map +1 -0
  35. package/src/icu/formatters/base-formatter.d.ts +8 -0
  36. package/src/icu/formatters/base-formatter.d.ts.map +1 -0
  37. package/src/icu/formatters/base-formatter.js +3 -0
  38. package/src/icu/formatters/base-formatter.js.map +1 -0
  39. package/src/icu/formatters/date-formatter.d.ts +5 -0
  40. package/src/icu/formatters/date-formatter.d.ts.map +1 -0
  41. package/src/icu/formatters/date-formatter.js +31 -0
  42. package/src/icu/formatters/date-formatter.js.map +1 -0
  43. package/src/icu/formatters/number-formatter.d.ts +5 -0
  44. package/src/icu/formatters/number-formatter.d.ts.map +1 -0
  45. package/src/icu/formatters/number-formatter.js +30 -0
  46. package/src/icu/formatters/number-formatter.js.map +1 -0
  47. package/src/icu/formatters/plural-formatter.d.ts +5 -0
  48. package/src/icu/formatters/plural-formatter.d.ts.map +1 -0
  49. package/src/icu/formatters/plural-formatter.js +15 -0
  50. package/src/icu/formatters/plural-formatter.js.map +1 -0
  51. package/src/icu/formatters/select-formatter.d.ts +5 -0
  52. package/src/icu/formatters/select-formatter.d.ts.map +1 -0
  53. package/src/icu/formatters/select-formatter.js +10 -0
  54. package/src/icu/formatters/select-formatter.js.map +1 -0
  55. package/src/icu/formatters/selectordinal-formatter.d.ts +5 -0
  56. package/src/icu/formatters/selectordinal-formatter.d.ts.map +1 -0
  57. package/src/icu/formatters/selectordinal-formatter.js +22 -0
  58. package/src/icu/formatters/selectordinal-formatter.js.map +1 -0
  59. package/src/icu/formatters/time-formatter.d.ts +5 -0
  60. package/src/icu/formatters/time-formatter.d.ts.map +1 -0
  61. package/src/icu/formatters/time-formatter.js +31 -0
  62. package/src/icu/formatters/time-formatter.js.map +1 -0
  63. package/src/icu/helpers.d.ts +9 -0
  64. package/src/icu/helpers.d.ts.map +1 -0
  65. package/src/icu/helpers.js +31 -0
  66. package/src/icu/helpers.js.map +1 -0
  67. package/src/icu/parser.d.ts +29 -0
  68. package/src/icu/parser.d.ts.map +1 -0
  69. package/src/icu/parser.js +194 -0
  70. package/src/icu/parser.js.map +1 -0
  71. package/src/icu/runtime.d.ts +10 -0
  72. package/src/icu/runtime.d.ts.map +1 -0
  73. package/src/icu/runtime.js +28 -0
  74. package/src/icu/runtime.js.map +1 -0
  75. package/src/icu/tokenizer.d.ts +37 -0
  76. package/src/icu/tokenizer.d.ts.map +1 -0
  77. package/src/icu/tokenizer.js +187 -0
  78. package/src/icu/tokenizer.js.map +1 -0
  79. package/src/icu/validator.d.ts +11 -0
  80. package/src/icu/validator.d.ts.map +1 -0
  81. package/src/icu/validator.js +140 -0
  82. package/src/icu/validator.js.map +1 -0
  83. package/src/index.d.ts +4 -0
  84. package/src/index.d.ts.map +1 -1
  85. package/src/index.js +4 -0
  86. package/src/index.js.map +1 -1
  87. package/src/interfaces/component-config.interface.d.ts +2 -1
  88. package/src/interfaces/component-config.interface.d.ts.map +1 -1
  89. package/src/pluralization/index.d.ts +7 -0
  90. package/src/pluralization/index.d.ts.map +1 -0
  91. package/src/pluralization/index.js +10 -0
  92. package/src/pluralization/index.js.map +1 -0
  93. package/src/pluralization/language-plural-map.d.ts +29 -0
  94. package/src/pluralization/language-plural-map.d.ts.map +1 -0
  95. package/src/pluralization/language-plural-map.js +136 -0
  96. package/src/pluralization/language-plural-map.js.map +1 -0
  97. package/src/pluralization/plural-categories.d.ts +22 -0
  98. package/src/pluralization/plural-categories.d.ts.map +1 -0
  99. package/src/pluralization/plural-categories.js +8 -0
  100. package/src/pluralization/plural-categories.js.map +1 -0
  101. package/src/pluralization/plural-rules.d.ts +102 -0
  102. package/src/pluralization/plural-rules.d.ts.map +1 -0
  103. package/src/pluralization/plural-rules.js +263 -0
  104. package/src/pluralization/plural-rules.js.map +1 -0
  105. package/src/types/index.d.ts +5 -0
  106. package/src/types/index.d.ts.map +1 -0
  107. package/src/types/index.js +8 -0
  108. package/src/types/index.js.map +1 -0
  109. package/src/types/plural-types.d.ts +17 -0
  110. package/src/types/plural-types.d.ts.map +1 -0
  111. package/src/types/plural-types.js +33 -0
  112. package/src/types/plural-types.js.map +1 -0
  113. package/src/utils/index.d.ts +1 -6
  114. package/src/utils/index.d.ts.map +1 -1
  115. package/src/utils/index.js +1 -6
  116. package/src/utils/index.js.map +1 -1
  117. package/src/utils/plural-helpers.d.ts +10 -0
  118. package/src/utils/plural-helpers.d.ts.map +1 -0
  119. package/src/utils/plural-helpers.js +19 -0
  120. package/src/utils/plural-helpers.js.map +1 -0
  121. package/src/validation/index.d.ts +2 -0
  122. package/src/validation/index.d.ts.map +1 -0
  123. package/src/validation/index.js +5 -0
  124. package/src/validation/index.js.map +1 -0
  125. package/src/validation/plural-validator.d.ts +23 -0
  126. package/src/validation/plural-validator.d.ts.map +1 -0
  127. package/src/validation/plural-validator.js +105 -0
  128. package/src/validation/plural-validator.js.map +1 -0
@@ -0,0 +1,263 @@
1
+ "use strict";
2
+ /**
3
+ * CLDR Plural Rules Implementation
4
+ * Based on Unicode CLDR plural rules for cardinal numbers
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.pluralRuleRomanian = exports.pluralRuleIrish = exports.pluralRuleLatvian = exports.pluralRuleLithuanian = exports.pluralRuleCzech = exports.pluralRuleSlovenian = exports.pluralRuleBreton = exports.pluralRuleWelsh = exports.pluralRuleScottishGaelic = exports.pluralRuleGerman = exports.pluralRuleChinese = exports.pluralRuleUkrainian = exports.pluralRuleJapanese = exports.pluralRuleSpanish = exports.pluralRuleFrench = exports.pluralRulePolish = exports.pluralRuleArabic = exports.pluralRuleRussian = exports.pluralRuleEnglish = void 0;
8
+ /**
9
+ * English plural rule (en-US, en-GB)
10
+ * Forms: one, other
11
+ */
12
+ const pluralRuleEnglish = (n) => {
13
+ if (n === 1)
14
+ return 'one';
15
+ return 'other';
16
+ };
17
+ exports.pluralRuleEnglish = pluralRuleEnglish;
18
+ /**
19
+ * Russian plural rule (ru)
20
+ * Forms: one, few, many
21
+ */
22
+ const pluralRuleRussian = (n) => {
23
+ const mod10 = n % 10;
24
+ const mod100 = n % 100;
25
+ if (mod10 === 1 && mod100 !== 11)
26
+ return 'one';
27
+ if (mod10 >= 2 && mod10 <= 4 && (mod100 < 12 || mod100 > 14))
28
+ return 'few';
29
+ return 'many';
30
+ };
31
+ exports.pluralRuleRussian = pluralRuleRussian;
32
+ /**
33
+ * Arabic plural rule (ar)
34
+ * Forms: zero, one, two, few, many, other
35
+ */
36
+ const pluralRuleArabic = (n) => {
37
+ if (n === 0)
38
+ return 'zero';
39
+ if (n === 1)
40
+ return 'one';
41
+ if (n === 2)
42
+ return 'two';
43
+ const mod100 = n % 100;
44
+ if (mod100 >= 3 && mod100 <= 10)
45
+ return 'few';
46
+ if (mod100 >= 11)
47
+ return 'many';
48
+ return 'other';
49
+ };
50
+ exports.pluralRuleArabic = pluralRuleArabic;
51
+ /**
52
+ * Polish plural rule (pl)
53
+ * Forms: one, few, many, other
54
+ */
55
+ const pluralRulePolish = (n) => {
56
+ // Fractional numbers use "other"
57
+ if (n !== Math.floor(n))
58
+ return 'other';
59
+ if (n === 1)
60
+ return 'one';
61
+ const mod10 = n % 10;
62
+ const mod100 = n % 100;
63
+ if (mod10 >= 2 && mod10 <= 4 && (mod100 < 12 || mod100 > 14))
64
+ return 'few';
65
+ if (n !== 1 && (mod10 === 0 || mod10 === 1 || (mod10 >= 5 && mod10 <= 9) || (mod100 >= 12 && mod100 <= 14)))
66
+ return 'many';
67
+ return 'other';
68
+ };
69
+ exports.pluralRulePolish = pluralRulePolish;
70
+ /**
71
+ * French plural rule (fr)
72
+ * Forms: one, other
73
+ */
74
+ const pluralRuleFrench = (n) => {
75
+ if (n === 0 || n === 1)
76
+ return 'one';
77
+ return 'other';
78
+ };
79
+ exports.pluralRuleFrench = pluralRuleFrench;
80
+ /**
81
+ * Spanish plural rule (es)
82
+ * Forms: one, other
83
+ */
84
+ const pluralRuleSpanish = (n) => {
85
+ if (n === 1)
86
+ return 'one';
87
+ return 'other';
88
+ };
89
+ exports.pluralRuleSpanish = pluralRuleSpanish;
90
+ /**
91
+ * Japanese plural rule (ja)
92
+ * Forms: other (no plural distinction)
93
+ */
94
+ const pluralRuleJapanese = (n) => {
95
+ return 'other';
96
+ };
97
+ exports.pluralRuleJapanese = pluralRuleJapanese;
98
+ /**
99
+ * Ukrainian plural rule (uk)
100
+ * Forms: one, few, many (same as Russian)
101
+ */
102
+ exports.pluralRuleUkrainian = exports.pluralRuleRussian;
103
+ /**
104
+ * Chinese plural rule (zh-CN)
105
+ * Forms: other (no plural distinction)
106
+ */
107
+ const pluralRuleChinese = (n) => {
108
+ return 'other';
109
+ };
110
+ exports.pluralRuleChinese = pluralRuleChinese;
111
+ /**
112
+ * German plural rule (de)
113
+ * Forms: one, other
114
+ */
115
+ const pluralRuleGerman = (n) => {
116
+ if (n === 1)
117
+ return 'one';
118
+ return 'other';
119
+ };
120
+ exports.pluralRuleGerman = pluralRuleGerman;
121
+ /**
122
+ * Scottish Gaelic plural rule (gd)
123
+ * Forms: one, two, few, other
124
+ * One of the most complex plural systems
125
+ */
126
+ const pluralRuleScottishGaelic = (n) => {
127
+ if (n === 1 || n === 11)
128
+ return 'one';
129
+ if (n === 2 || n === 12)
130
+ return 'two';
131
+ if ((n >= 3 && n <= 10) || (n >= 13 && n <= 19))
132
+ return 'few';
133
+ return 'other';
134
+ };
135
+ exports.pluralRuleScottishGaelic = pluralRuleScottishGaelic;
136
+ /**
137
+ * Welsh plural rule (cy)
138
+ * Forms: zero, one, two, few, many, other
139
+ */
140
+ const pluralRuleWelsh = (n) => {
141
+ if (n === 0)
142
+ return 'zero';
143
+ if (n === 1)
144
+ return 'one';
145
+ if (n === 2)
146
+ return 'two';
147
+ if (n === 3)
148
+ return 'few';
149
+ if (n === 6)
150
+ return 'many';
151
+ return 'other';
152
+ };
153
+ exports.pluralRuleWelsh = pluralRuleWelsh;
154
+ /**
155
+ * Breton plural rule (br)
156
+ * Forms: one, two, few, many, other
157
+ */
158
+ const pluralRuleBreton = (n) => {
159
+ const mod10 = n % 10;
160
+ const mod100 = n % 100;
161
+ if (mod10 === 1 && mod100 !== 11 && mod100 !== 71 && mod100 !== 91)
162
+ return 'one';
163
+ if (mod10 === 2 && mod100 !== 12 && mod100 !== 72 && mod100 !== 92)
164
+ return 'two';
165
+ if ((mod10 === 3 || mod10 === 4 || mod10 === 9) &&
166
+ (mod100 < 10 || mod100 > 19) &&
167
+ (mod100 < 70 || mod100 > 79) &&
168
+ (mod100 < 90 || mod100 > 99))
169
+ return 'few';
170
+ if (n !== 0 && n % 1000000 === 0)
171
+ return 'many';
172
+ return 'other';
173
+ };
174
+ exports.pluralRuleBreton = pluralRuleBreton;
175
+ /**
176
+ * Slovenian plural rule (sl)
177
+ * Forms: one, two, few, other
178
+ */
179
+ const pluralRuleSlovenian = (n) => {
180
+ const mod100 = n % 100;
181
+ if (mod100 === 1)
182
+ return 'one';
183
+ if (mod100 === 2)
184
+ return 'two';
185
+ if (mod100 === 3 || mod100 === 4)
186
+ return 'few';
187
+ return 'other';
188
+ };
189
+ exports.pluralRuleSlovenian = pluralRuleSlovenian;
190
+ /**
191
+ * Czech plural rule (cs)
192
+ * Forms: one, few, many, other
193
+ */
194
+ const pluralRuleCzech = (n) => {
195
+ if (n === 1)
196
+ return 'one';
197
+ if (n >= 2 && n <= 4)
198
+ return 'few';
199
+ if (n !== Math.floor(n))
200
+ return 'many';
201
+ return 'other';
202
+ };
203
+ exports.pluralRuleCzech = pluralRuleCzech;
204
+ /**
205
+ * Lithuanian plural rule (lt)
206
+ * Forms: one, few, many, other
207
+ */
208
+ const pluralRuleLithuanian = (n) => {
209
+ const mod10 = n % 10;
210
+ const mod100 = n % 100;
211
+ if (mod10 === 1 && (mod100 < 11 || mod100 > 19))
212
+ return 'one';
213
+ if (mod10 >= 2 && mod10 <= 9 && (mod100 < 11 || mod100 > 19))
214
+ return 'few';
215
+ if (n !== Math.floor(n))
216
+ return 'many';
217
+ return 'other';
218
+ };
219
+ exports.pluralRuleLithuanian = pluralRuleLithuanian;
220
+ /**
221
+ * Latvian plural rule (lv)
222
+ * Forms: zero, one, other
223
+ */
224
+ const pluralRuleLatvian = (n) => {
225
+ const mod10 = n % 10;
226
+ const mod100 = n % 100;
227
+ if (n === 0)
228
+ return 'zero';
229
+ if (mod10 === 1 && mod100 !== 11)
230
+ return 'one';
231
+ return 'other';
232
+ };
233
+ exports.pluralRuleLatvian = pluralRuleLatvian;
234
+ /**
235
+ * Irish plural rule (ga)
236
+ * Forms: one, two, few, many, other
237
+ */
238
+ const pluralRuleIrish = (n) => {
239
+ if (n === 1)
240
+ return 'one';
241
+ if (n === 2)
242
+ return 'two';
243
+ if (n >= 3 && n <= 6)
244
+ return 'few';
245
+ if (n >= 7 && n <= 10)
246
+ return 'many';
247
+ return 'other';
248
+ };
249
+ exports.pluralRuleIrish = pluralRuleIrish;
250
+ /**
251
+ * Romanian plural rule (ro)
252
+ * Forms: one, few, other
253
+ */
254
+ const pluralRuleRomanian = (n) => {
255
+ const mod100 = n % 100;
256
+ if (n === 1)
257
+ return 'one';
258
+ if (n === 0 || (mod100 >= 1 && mod100 <= 19))
259
+ return 'few';
260
+ return 'other';
261
+ };
262
+ exports.pluralRuleRomanian = pluralRuleRomanian;
263
+ //# sourceMappingURL=plural-rules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plural-rules.js","sourceRoot":"","sources":["../../../../../packages/digitaldefiance-i18n-lib/src/pluralization/plural-rules.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Type exports
3
+ */
4
+ export * from './plural-types';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../packages/digitaldefiance-i18n-lib/src/types/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,gBAAgB,CAAC"}
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ /**
3
+ * Type exports
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const tslib_1 = require("tslib");
7
+ tslib_1.__exportStar(require("./plural-types"), exports);
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../packages/digitaldefiance-i18n-lib/src/types/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,yDAA+B"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Type definitions for pluralization support
3
+ */
4
+ import { PluralCategory } from '../pluralization/plural-categories';
5
+ /**
6
+ * A string value that can be either a simple string or an object with plural forms
7
+ */
8
+ export type PluralString = string | Partial<Record<PluralCategory, string>>;
9
+ /**
10
+ * Check if a value is a plural string object (not a simple string)
11
+ */
12
+ export declare function isPluralString(value: any): value is Record<PluralCategory, string>;
13
+ /**
14
+ * Get the appropriate plural form from a PluralString
15
+ */
16
+ export declare function resolvePluralString(value: PluralString, category: PluralCategory): string | undefined;
17
+ //# sourceMappingURL=plural-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plural-types.d.ts","sourceRoot":"","sources":["../../../../../packages/digitaldefiance-i18n-lib/src/types/plural-types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAEpE;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC,CAAC;AAE5E;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,GAAG,GAAG,KAAK,IAAI,MAAM,CAAC,cAAc,EAAE,MAAM,CAAC,CAElF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,YAAY,EACnB,QAAQ,EAAE,cAAc,GACvB,MAAM,GAAG,SAAS,CAkBpB"}
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ /**
3
+ * Type definitions for pluralization support
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.isPluralString = isPluralString;
7
+ exports.resolvePluralString = resolvePluralString;
8
+ /**
9
+ * Check if a value is a plural string object (not a simple string)
10
+ */
11
+ function isPluralString(value) {
12
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
13
+ }
14
+ /**
15
+ * Get the appropriate plural form from a PluralString
16
+ */
17
+ function resolvePluralString(value, category) {
18
+ if (typeof value === 'string') {
19
+ return value;
20
+ }
21
+ // Try exact match first
22
+ if (value[category]) {
23
+ return value[category];
24
+ }
25
+ // Fallback to 'other'
26
+ if (value.other) {
27
+ return value.other;
28
+ }
29
+ // Fallback to first available form
30
+ const forms = Object.values(value);
31
+ return forms.length > 0 ? forms[0] : undefined;
32
+ }
33
+ //# sourceMappingURL=plural-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plural-types.js","sourceRoot":"","sources":["../../../../../packages/digitaldefiance-i18n-lib/src/types/plural-types.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAYH,wCAEC;AAKD,kDAqBC;AA/BD;;GAEG;AACH,SAAgB,cAAc,CAAC,KAAU;IACvC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED;;GAEG;AACH,SAAgB,mBAAmB,CACjC,KAAmB,EACnB,QAAwB;IAExB,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,wBAAwB;IACxB,IAAI,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;QACpB,OAAO,KAAK,CAAC,QAAQ,CAAC,CAAC;IACzB,CAAC;IAED,sBAAsB;IACtB,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAChB,OAAO,KAAK,CAAC,KAAK,CAAC;IACrB,CAAC;IAED,mCAAmC;IACnC,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACnC,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACjD,CAAC"}
@@ -1,7 +1,2 @@
1
- /**
2
- * Utility exports
3
- */
4
- export * from './string-utils';
5
- export * from './currency';
6
- export * from './timezone';
1
+ export * from './plural-helpers';
7
2
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../packages/digitaldefiance-i18n-lib/src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../packages/digitaldefiance-i18n-lib/src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC"}
@@ -1,10 +1,5 @@
1
1
  "use strict";
2
- /**
3
- * Utility exports
4
- */
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
3
  const tslib_1 = require("tslib");
7
- tslib_1.__exportStar(require("./string-utils"), exports);
8
- tslib_1.__exportStar(require("./currency"), exports);
9
- tslib_1.__exportStar(require("./timezone"), exports);
4
+ tslib_1.__exportStar(require("./plural-helpers"), exports);
10
5
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../packages/digitaldefiance-i18n-lib/src/utils/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,yDAA+B;AAC/B,qDAA2B;AAC3B,qDAA2B"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../packages/digitaldefiance-i18n-lib/src/utils/index.ts"],"names":[],"mappings":";;;AAAA,2DAAiC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Helper functions for creating plural and gender strings
3
+ */
4
+ import { PluralCategory } from '../pluralization/plural-categories';
5
+ import { PluralString } from '../types/plural-types';
6
+ import { GenderCategory, GenderedString } from '../gender/gender-categories';
7
+ export declare function createPluralString(forms: Partial<Record<PluralCategory, string>>): PluralString;
8
+ export declare function createGenderedString(forms: Partial<Record<GenderCategory, string>>): GenderedString;
9
+ export declare function getRequiredPluralForms(language: string): PluralCategory[];
10
+ //# sourceMappingURL=plural-helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plural-helpers.d.ts","sourceRoot":"","sources":["../../../../../packages/digitaldefiance-i18n-lib/src/utils/plural-helpers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAG7E,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC,GAAG,YAAY,CAE/F;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC,GAAG,cAAc,CAEnG;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,EAAE,CAEzE"}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ /**
3
+ * Helper functions for creating plural and gender strings
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.createPluralString = createPluralString;
7
+ exports.createGenderedString = createGenderedString;
8
+ exports.getRequiredPluralForms = getRequiredPluralForms;
9
+ const language_plural_map_1 = require("../pluralization/language-plural-map");
10
+ function createPluralString(forms) {
11
+ return forms;
12
+ }
13
+ function createGenderedString(forms) {
14
+ return forms;
15
+ }
16
+ function getRequiredPluralForms(language) {
17
+ return (0, language_plural_map_1.getRequiredPluralForms)(language);
18
+ }
19
+ //# sourceMappingURL=plural-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plural-helpers.js","sourceRoot":"","sources":["../../../../../packages/digitaldefiance-i18n-lib/src/utils/plural-helpers.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAOH,gDAEC;AAED,oDAEC;AAED,wDAEC;AAZD,8EAAyG;AAEzG,SAAgB,kBAAkB,CAAC,KAA8C;IAC/E,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAgB,oBAAoB,CAAC,KAA8C;IACjF,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAgB,sBAAsB,CAAC,QAAgB;IACrD,OAAO,IAAA,4CAAuB,EAAC,QAAQ,CAAqB,CAAC;AAC/D,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from './plural-validator';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../packages/digitaldefiance-i18n-lib/src/validation/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC"}
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ tslib_1.__exportStar(require("./plural-validator"), exports);
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../packages/digitaldefiance-i18n-lib/src/validation/index.ts"],"names":[],"mappings":";;;AAAA,6DAAmC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Plural form validation
3
+ */
4
+ import { PluralString } from '../types/plural-types';
5
+ export interface PluralValidationResult {
6
+ isValid: boolean;
7
+ errors: string[];
8
+ warnings: string[];
9
+ }
10
+ export interface PluralValidationOptions {
11
+ strict?: boolean;
12
+ checkUnused?: boolean;
13
+ checkVariables?: boolean;
14
+ }
15
+ /**
16
+ * Validate plural forms for a specific language
17
+ */
18
+ export declare function validatePluralForms(value: PluralString, language: string, key: string, options?: PluralValidationOptions): PluralValidationResult;
19
+ /**
20
+ * Validate that count variable exists when plural forms are used
21
+ */
22
+ export declare function validateCountVariable(value: PluralString, variables: Record<string, any> | undefined, key: string): PluralValidationResult;
23
+ //# sourceMappingURL=plural-validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plural-validator.d.ts","sourceRoot":"","sources":["../../../../../packages/digitaldefiance-i18n-lib/src/validation/plural-validator.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,YAAY,EAAkB,MAAM,uBAAuB,CAAC;AAGrE,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,uBAAuB;IACtC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,YAAY,EACnB,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,uBAA4B,GACpC,sBAAsB,CA8CxB;AA+CD;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,YAAY,EACnB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,SAAS,EAC1C,GAAG,EAAE,MAAM,GACV,sBAAsB,CASxB"}
@@ -0,0 +1,105 @@
1
+ "use strict";
2
+ /**
3
+ * Plural form validation
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.validatePluralForms = validatePluralForms;
7
+ exports.validateCountVariable = validateCountVariable;
8
+ const plural_types_1 = require("../types/plural-types");
9
+ const language_plural_map_1 = require("../pluralization/language-plural-map");
10
+ /**
11
+ * Validate plural forms for a specific language
12
+ */
13
+ function validatePluralForms(value, language, key, options = {}) {
14
+ const errors = [];
15
+ const warnings = [];
16
+ if (!(0, plural_types_1.isPluralString)(value)) {
17
+ return { isValid: true, errors, warnings };
18
+ }
19
+ const required = (0, language_plural_map_1.getRequiredPluralForms)(language);
20
+ const all = (0, language_plural_map_1.getAllPluralForms)(language);
21
+ const provided = Object.keys(value);
22
+ // Check required forms
23
+ for (const form of required) {
24
+ if (!value[form]) {
25
+ if (options.strict) {
26
+ errors.push(`Missing required plural form '${form}' for language '${language}' in key '${key}'`);
27
+ }
28
+ else {
29
+ warnings.push(`Missing required plural form '${form}' for language '${language}' in key '${key}'`);
30
+ }
31
+ }
32
+ }
33
+ // Check unused forms
34
+ if (options.checkUnused) {
35
+ for (const form of provided) {
36
+ if (!all.includes(form)) {
37
+ warnings.push(`Unused plural form '${form}' for language '${language}' in key '${key}'`);
38
+ }
39
+ }
40
+ }
41
+ // Check variable consistency
42
+ if (options.checkVariables) {
43
+ const variables = extractVariables(value);
44
+ const inconsistent = findInconsistentVariables(value, variables);
45
+ for (const [form, missing] of Object.entries(inconsistent)) {
46
+ warnings.push(`Plural form '${form}' in key '${key}' missing variables: ${missing.join(', ')}`);
47
+ }
48
+ }
49
+ return {
50
+ isValid: errors.length === 0,
51
+ errors,
52
+ warnings,
53
+ };
54
+ }
55
+ /**
56
+ * Extract all variables from plural forms
57
+ */
58
+ function extractVariables(value) {
59
+ const vars = new Set();
60
+ if (typeof value === 'string')
61
+ return vars;
62
+ for (const text of Object.values(value)) {
63
+ if (text) {
64
+ const matches = text.match(/\{(\w+)\}/g);
65
+ if (matches) {
66
+ matches.forEach(m => vars.add(m.slice(1, -1)));
67
+ }
68
+ }
69
+ }
70
+ return vars;
71
+ }
72
+ /**
73
+ * Find forms with inconsistent variables
74
+ */
75
+ function findInconsistentVariables(value, allVars) {
76
+ const inconsistent = {};
77
+ if (typeof value === 'string')
78
+ return inconsistent;
79
+ for (const [form, text] of Object.entries(value)) {
80
+ if (text) {
81
+ const formVars = new Set();
82
+ const matches = text.match(/\{(\w+)\}/g);
83
+ if (matches) {
84
+ matches.forEach(m => formVars.add(m.slice(1, -1)));
85
+ }
86
+ const missing = Array.from(allVars).filter(v => !formVars.has(v));
87
+ if (missing.length > 0) {
88
+ inconsistent[form] = missing;
89
+ }
90
+ }
91
+ }
92
+ return inconsistent;
93
+ }
94
+ /**
95
+ * Validate that count variable exists when plural forms are used
96
+ */
97
+ function validateCountVariable(value, variables, key) {
98
+ const errors = [];
99
+ const warnings = [];
100
+ if ((0, plural_types_1.isPluralString)(value) && (!variables || variables.count === undefined)) {
101
+ warnings.push(`Plural forms used in key '${key}' but no 'count' variable provided`);
102
+ }
103
+ return { isValid: true, errors, warnings };
104
+ }
105
+ //# sourceMappingURL=plural-validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plural-validator.js","sourceRoot":"","sources":["../../../../../packages/digitaldefiance-i18n-lib/src/validation/plural-validator.ts"],"names":[],"mappings":"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"}