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.
- package/README.md +3 -7
- package/dist/index.js +129 -7
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -208,11 +208,7 @@ function LanguageSwitcher() {
|
|
|
208
208
|
|
|
209
209
|
return (
|
|
210
210
|
<View>
|
|
211
|
-
{/*
|
|
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('
|
|
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('
|
|
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