locon 1.5.0 → 1.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/README.md +3 -7
  2. package/dist/index.js +129 -7
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -208,11 +208,7 @@ function LanguageSwitcher() {
208
208
 
209
209
  return (
210
210
  <View>
211
- {/* Localised value by key */}
212
- <Text>
213
- {l('current_language')}: {currentLocale}
214
- </Text>
215
- {/* or by value in project- or default language */}
211
+ {/* Resolve by the value written in the project language. */}
216
212
  <Text>
217
213
  {l('Current language')}: {currentLocale}
218
214
  </Text>
@@ -349,7 +345,7 @@ Unknown tokens are left as-is rather than blanked:
349
345
  ```
350
346
 
351
347
  ```tsx
352
- l('saved_radius', { params: { m: 150 } }) // → '150 m radius · saved'
348
+ l('{m} m radius · saved', { params: { m: 150 } }) // → '150 m radius · saved'
353
349
  ```
354
350
 
355
351
  **Fallback** — `fallback` is returned only when no locale resolves the input.
@@ -411,7 +407,7 @@ fallback when a locale-specific category is absent.
411
407
  ```
412
408
 
413
409
  ```tsx
414
- l('day', { count: 5 }) // en → '5 days' · ru → '5 дней'
410
+ l('{count} days', { count: 5 }) // en → '5 days' · ru → '5 дней'
415
411
  ```
416
412
 
417
413
  There is deliberately no generic `_plural` suffix: most languages do not have
package/dist/index.js CHANGED
@@ -36,6 +36,135 @@ __export(index_exports, {
36
36
  module.exports = __toCommonJS(index_exports);
37
37
  var import_react2 = require("react");
38
38
 
39
+ // src/locon/utils/pluralCategory.ts
40
+ var between = (x, from, to) => x >= from && x <= to;
41
+ var oneIfIntegerOne = ({ i, v }) => i === 1 && v === 0 ? "one" : "other";
42
+ var oneIfOne = ({ n }) => n === 1 ? "one" : "other";
43
+ var oneIfZeroOrOne = ({ i }) => i === 0 || i === 1 ? "one" : "other";
44
+ var onlyOther = () => "other";
45
+ var eastSlavic = ({ i, v }) => {
46
+ if (v !== 0) return "other";
47
+ if (i % 10 === 1 && i % 100 !== 11) return "one";
48
+ if (between(i % 10, 2, 4) && !between(i % 100, 12, 14)) return "few";
49
+ return "many";
50
+ };
51
+ var southSlavic = ({ i, v }) => {
52
+ if (v === 0 && i % 10 === 1 && i % 100 !== 11) return "one";
53
+ if (v === 0 && between(i % 10, 2, 4) && !between(i % 100, 12, 14)) return "few";
54
+ return "other";
55
+ };
56
+ var westSlavic = ({ i, v }) => {
57
+ if (i === 1 && v === 0) return "one";
58
+ if (between(i, 2, 4) && v === 0) return "few";
59
+ return v !== 0 ? "many" : "other";
60
+ };
61
+ var RULES = {
62
+ ru: eastSlavic,
63
+ uk: eastSlavic,
64
+ be: eastSlavic,
65
+ pl: ({ i, v }) => {
66
+ if (v !== 0) return "other";
67
+ if (i === 1) return "one";
68
+ if (between(i % 10, 2, 4) && !between(i % 100, 12, 14)) return "few";
69
+ return "many";
70
+ },
71
+ cs: westSlavic,
72
+ sk: westSlavic,
73
+ hr: southSlavic,
74
+ sr: southSlavic,
75
+ bs: southSlavic,
76
+ sl: ({ i, v }) => {
77
+ if (v !== 0) return "few";
78
+ if (i % 100 === 1) return "one";
79
+ if (i % 100 === 2) return "two";
80
+ if (between(i % 100, 3, 4)) return "few";
81
+ return "other";
82
+ },
83
+ lt: ({ n, v }) => {
84
+ if (v !== 0) return "many";
85
+ if (n % 10 === 1 && !between(n % 100, 11, 19)) return "one";
86
+ if (between(n % 10, 2, 9) && !between(n % 100, 11, 19)) return "few";
87
+ return "other";
88
+ },
89
+ lv: ({ n, v }) => {
90
+ if (v === 0 && (n % 10 === 0 || between(n % 100, 11, 19))) return "zero";
91
+ if (v === 0 && n % 10 === 1 && n % 100 !== 11) return "one";
92
+ return "other";
93
+ },
94
+ ro: ({ n, i, v }) => {
95
+ if (i === 1 && v === 0) return "one";
96
+ if (v !== 0 || n === 0 || n !== 1 && between(n % 100, 1, 19)) return "few";
97
+ return "other";
98
+ },
99
+ ar: ({ n, v }) => {
100
+ if (v !== 0) return "other";
101
+ if (n === 0) return "zero";
102
+ if (n === 1) return "one";
103
+ if (n === 2) return "two";
104
+ if (between(n % 100, 3, 10)) return "few";
105
+ if (between(n % 100, 11, 99)) return "many";
106
+ return "other";
107
+ },
108
+ he: ({ i, v }) => {
109
+ if (i === 1 && v === 0 || i === 0 && v !== 0) return "one";
110
+ if (i === 2 && v === 0) return "two";
111
+ return "other";
112
+ },
113
+ ga: ({ n, v }) => {
114
+ if (v !== 0) return "other";
115
+ if (n === 1) return "one";
116
+ if (n === 2) return "two";
117
+ if (between(n, 3, 6)) return "few";
118
+ if (between(n, 7, 10)) return "many";
119
+ return "other";
120
+ },
121
+ fr: oneIfZeroOrOne,
122
+ pt: oneIfZeroOrOne,
123
+ hi: ({ n, i }) => i === 0 || n === 1 ? "one" : "other",
124
+ bn: ({ n, i }) => i === 0 || n === 1 ? "one" : "other",
125
+ fa: ({ n, i }) => i === 0 || n === 1 ? "one" : "other",
126
+ es: oneIfOne,
127
+ tr: oneIfOne,
128
+ el: oneIfOne,
129
+ hu: oneIfOne,
130
+ ka: oneIfOne,
131
+ kk: oneIfOne,
132
+ az: oneIfOne,
133
+ uz: oneIfOne,
134
+ bg: oneIfOne,
135
+ sq: oneIfOne,
136
+ ja: onlyOther,
137
+ zh: onlyOther,
138
+ ko: onlyOther,
139
+ vi: onlyOther,
140
+ th: onlyOther,
141
+ id: onlyOther,
142
+ ms: onlyOther,
143
+ my: onlyOther,
144
+ km: onlyOther,
145
+ lo: onlyOther
146
+ };
147
+ function operands(count) {
148
+ const n = Math.abs(count);
149
+ const fraction = String(n).split(".")[1] ?? "";
150
+ return { n, i: Math.floor(n), v: fraction.length };
151
+ }
152
+ function fallbackCategory(count, tag) {
153
+ const language = tag.split("-")[0]?.toLowerCase() ?? "";
154
+ const rule = RULES[language] ?? oneIfIntegerOne;
155
+ return rule(operands(count));
156
+ }
157
+ function pluralCategory(count, locale) {
158
+ const tag = locale.replace(/_/g, "-");
159
+ if (typeof Intl !== "undefined" && typeof Intl.PluralRules === "function") {
160
+ try {
161
+ return new Intl.PluralRules(tag).select(count);
162
+ } catch {
163
+ }
164
+ }
165
+ return fallbackCategory(count, tag);
166
+ }
167
+
39
168
  // src/locon/utils/createTranslator.ts
40
169
  var reverseIndexCache = /* @__PURE__ */ new WeakMap();
41
170
  function getReverseIndex(assets, locale) {
@@ -71,13 +200,6 @@ function interpolate(value, params) {
71
200
  );
72
201
  }
73
202
  var PLURAL_SUFFIX = /_(zero|one|two|few|many|other)$/;
74
- function pluralCategory(count, locale) {
75
- try {
76
- return new Intl.PluralRules(locale.replace(/_/g, "-")).select(count);
77
- } catch {
78
- return count === 1 ? "one" : "other";
79
- }
80
- }
81
203
  function createTranslator({ assets, locale, defaultLocale = "en", projectLocale }) {
82
204
  const resolvedProjectLocale = projectLocale || defaultLocale;
83
205
  const read = (fromLocale, key) => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "locon",
3
- "version": "1.5.0",
3
+ "version": "1.5.1",
4
4
  "description": "locon is a simple and lightweight library for React Native that provides a simple way to manage translations in your app.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",