@digitaldefiance/i18n-lib 2.1.32 → 3.0.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 (68) hide show
  1. package/README.md +286 -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/index.d.ts +4 -0
  24. package/src/index.d.ts.map +1 -1
  25. package/src/index.js +4 -0
  26. package/src/index.js.map +1 -1
  27. package/src/interfaces/component-config.interface.d.ts +2 -1
  28. package/src/interfaces/component-config.interface.d.ts.map +1 -1
  29. package/src/pluralization/index.d.ts +7 -0
  30. package/src/pluralization/index.d.ts.map +1 -0
  31. package/src/pluralization/index.js +10 -0
  32. package/src/pluralization/index.js.map +1 -0
  33. package/src/pluralization/language-plural-map.d.ts +29 -0
  34. package/src/pluralization/language-plural-map.d.ts.map +1 -0
  35. package/src/pluralization/language-plural-map.js +136 -0
  36. package/src/pluralization/language-plural-map.js.map +1 -0
  37. package/src/pluralization/plural-categories.d.ts +22 -0
  38. package/src/pluralization/plural-categories.d.ts.map +1 -0
  39. package/src/pluralization/plural-categories.js +8 -0
  40. package/src/pluralization/plural-categories.js.map +1 -0
  41. package/src/pluralization/plural-rules.d.ts +102 -0
  42. package/src/pluralization/plural-rules.d.ts.map +1 -0
  43. package/src/pluralization/plural-rules.js +263 -0
  44. package/src/pluralization/plural-rules.js.map +1 -0
  45. package/src/types/index.d.ts +5 -0
  46. package/src/types/index.d.ts.map +1 -0
  47. package/src/types/index.js +8 -0
  48. package/src/types/index.js.map +1 -0
  49. package/src/types/plural-types.d.ts +17 -0
  50. package/src/types/plural-types.d.ts.map +1 -0
  51. package/src/types/plural-types.js +33 -0
  52. package/src/types/plural-types.js.map +1 -0
  53. package/src/utils/index.d.ts +1 -6
  54. package/src/utils/index.d.ts.map +1 -1
  55. package/src/utils/index.js +1 -6
  56. package/src/utils/index.js.map +1 -1
  57. package/src/utils/plural-helpers.d.ts +10 -0
  58. package/src/utils/plural-helpers.d.ts.map +1 -0
  59. package/src/utils/plural-helpers.js +19 -0
  60. package/src/utils/plural-helpers.js.map +1 -0
  61. package/src/validation/index.d.ts +2 -0
  62. package/src/validation/index.d.ts.map +1 -0
  63. package/src/validation/index.js +5 -0
  64. package/src/validation/index.js.map +1 -0
  65. package/src/validation/plural-validator.d.ts +23 -0
  66. package/src/validation/plural-validator.d.ts.map +1 -0
  67. package/src/validation/plural-validator.js +105 -0
  68. package/src/validation/plural-validator.js.map +1 -0
@@ -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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"}