intl-template 0.0.1 → 0.0.3
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 +0 -0
- package/dist/intl.d.ts +1 -0
- package/dist/intl.js +14 -10
- package/dist/intl.js.map +1 -1
- package/dist/intl.test.d.ts +1 -0
- package/dist/intl.test.js +44 -0
- package/dist/intl.test.js.map +1 -0
- package/package.json +5 -3
- package/src/intl.js +12 -9
- package/src/intl.test.js +46 -0
package/README.md
ADDED
|
File without changes
|
package/dist/intl.d.ts
CHANGED
package/dist/intl.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
var _a;
|
|
1
2
|
var TRANSLATIONS = {};
|
|
2
3
|
export function setTransition(locale, transition) {
|
|
3
4
|
return TRANSLATIONS[locale] = Object.entries(transition).reduce(function (obj, _a) {
|
|
@@ -27,34 +28,36 @@ export function setTransition(locale, transition) {
|
|
|
27
28
|
}, {});
|
|
28
29
|
}
|
|
29
30
|
export function translate(locale, strings) {
|
|
31
|
+
var _a, _b;
|
|
30
32
|
var parts = [];
|
|
31
33
|
for (var _i = 2; _i < arguments.length; _i++) {
|
|
32
34
|
parts[_i - 2] = arguments[_i];
|
|
33
35
|
}
|
|
34
36
|
var key = strings.join("{}");
|
|
35
37
|
var translation = TRANSLATIONS === null || TRANSLATIONS === void 0 ? void 0 : TRANSLATIONS[locale];
|
|
36
|
-
var
|
|
37
|
-
if (!template) {
|
|
38
|
+
var _c = (translation === null || translation === void 0 ? void 0 : translation[key]) || {}, template = _c.template, order = _c.order;
|
|
39
|
+
if (!template && ((_b = (_a = import.meta) === null || _a === void 0 ? void 0 : _a.env) === null || _b === void 0 ? void 0 : _b.MODE) === "development") {
|
|
38
40
|
console.warn("not match translate key, ".concat(key), { translation: translation, locale: locale, strings: strings, parts: parts });
|
|
39
41
|
template = strings.slice();
|
|
40
42
|
order = parts.map(function (_, i) { return i; });
|
|
41
43
|
}
|
|
42
|
-
if (template.length !==
|
|
44
|
+
if (parts.length > 0 && template.length - 1 !== parts.length) {
|
|
43
45
|
throw new Error("translate template parts length not match. locale: ".concat(locale, ", key: ").concat(key));
|
|
44
46
|
}
|
|
45
|
-
var ret =
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
47
|
+
var ret = template.reduce(function (ret, template, idx) {
|
|
48
|
+
ret.push(template);
|
|
49
|
+
var orderIdx = order[idx];
|
|
50
|
+
if (orderIdx >= 0) {
|
|
51
|
+
var part = parts[orderIdx];
|
|
49
52
|
if (typeof part == "function") {
|
|
50
53
|
ret.push(part(locale, translation));
|
|
51
54
|
}
|
|
52
55
|
else {
|
|
53
56
|
ret.push(part);
|
|
54
57
|
}
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
+
}
|
|
59
|
+
return ret;
|
|
60
|
+
}, []);
|
|
58
61
|
var text = ret.join("");
|
|
59
62
|
Object.defineProperty(ret, "toString", {
|
|
60
63
|
enumerable: false,
|
|
@@ -64,4 +67,5 @@ export function translate(locale, strings) {
|
|
|
64
67
|
});
|
|
65
68
|
return ret;
|
|
66
69
|
}
|
|
70
|
+
export var l10n = translate.bind(null, (_a = globalThis === null || globalThis === void 0 ? void 0 : globalThis.navigator) === null || _a === void 0 ? void 0 : _a.language);
|
|
67
71
|
//# sourceMappingURL=intl.js.map
|
package/dist/intl.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"intl.js","sourceRoot":"","sources":["../src/intl.js"],"names":[],"mappings":"AAAA,IAAM,YAAY,GAAG,EAAE,CAAA;AAEvB,MAAM,UAAU,aAAa,CAAC,MAAM,EAAE,UAAU;IAC/C,OAAO,YAAY,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,UAAC,GAAG,EAAE,EAAY;YAAX,GAAG,QAAA,EAAE,KAAK,QAAA;QAChF,IAAM,KAAK,GAAG,EAAE,CAAC;QACjB,IAAM,QAAQ,GAAG,EAAE,CAAC;QACpB,IAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;QACpC,KAAK,CAAC,OAAO,CAAC,UAAC,IAAI,EAAE,KAAK;YACzB,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;gBACnB,IAAI,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC/C,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;gBAClB,CAAC;gBACD,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;gBACxB,OAAM;YACP,CAAC;YACD,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC3B,IAAI,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC/C,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;gBAClB,CAAC;gBACD,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAA;gBAC3C,OAAM;YACP,CAAC;YAED,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACpB,CAAC,CAAC,CAAA;QAEF,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,UAAA,EAAE,KAAK,OAAA,EAAE,CAAA;QAE9B,OAAO,GAAG,CAAA;IACX,CAAC,EAAE,EAAE,CAAC,CAAA;AACP,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,MAAM,EAAE,OAAO
|
|
1
|
+
{"version":3,"file":"intl.js","sourceRoot":"","sources":["../src/intl.js"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
var __makeTemplateObject = (this && this.__makeTemplateObject) || function (cooked, raw) {
|
|
2
|
+
if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; }
|
|
3
|
+
return cooked;
|
|
4
|
+
};
|
|
5
|
+
import assert from 'node:assert';
|
|
6
|
+
import test from 'node:test';
|
|
7
|
+
import { translate, setTransition } from './intl.js';
|
|
8
|
+
test('apply template', function (t) {
|
|
9
|
+
setTransition('zh-CN', {
|
|
10
|
+
'abc {} def {}': '甲乙丙 {} {} 丁戊卯',
|
|
11
|
+
});
|
|
12
|
+
var l10n = translate.bind(null, 'zh-CN');
|
|
13
|
+
assert.deepEqual(l10n(templateObject_1 || (templateObject_1 = __makeTemplateObject(["abc ", " def ", ""], ["abc ", " def ", ""])), 123, 345), ['甲乙丙 ', 123, ' ', 345, ' 丁戊卯']);
|
|
14
|
+
});
|
|
15
|
+
test('change slot order', function (t) {
|
|
16
|
+
setTransition('zh-CN', {
|
|
17
|
+
'abc {} def {}': '甲乙丙 {1} {0} 丁戊卯',
|
|
18
|
+
});
|
|
19
|
+
var l10n = translate.bind(null, 'zh-CN');
|
|
20
|
+
assert.equal(l10n(templateObject_2 || (templateObject_2 = __makeTemplateObject(["abc ", " def ", ""], ["abc ", " def ", ""])), 123, 345).toString(), '甲乙丙 345 123 丁戊卯');
|
|
21
|
+
});
|
|
22
|
+
test('slot function', function (t) {
|
|
23
|
+
setTransition('zh-CN', {
|
|
24
|
+
'{} def {}': '{1} {0} 丁戊卯',
|
|
25
|
+
});
|
|
26
|
+
var l10n = translate.bind(null, 'zh-CN');
|
|
27
|
+
assert.equal(l10n(templateObject_3 || (templateObject_3 = __makeTemplateObject(["", " def ", ""], ["", " def ", ""])), function (locale) { return locale; }, 345).toString(), '345 zh-CN 丁戊卯');
|
|
28
|
+
});
|
|
29
|
+
test('slot count match', function (t) {
|
|
30
|
+
setTransition('zh-CN', {
|
|
31
|
+
'{} def {}': '{} 丁戊卯',
|
|
32
|
+
'{}matched{}': '{}{}丁戊卯',
|
|
33
|
+
});
|
|
34
|
+
var l10n = translate.bind(null, 'zh-CN');
|
|
35
|
+
try {
|
|
36
|
+
l10n(templateObject_4 || (templateObject_4 = __makeTemplateObject(["", " def ", ""], ["", " def ", ""])), function (locale) { return locale; }, 345);
|
|
37
|
+
}
|
|
38
|
+
catch (err) {
|
|
39
|
+
assert.equal(err.message, "translate template parts length not match. locale: zh-CN, key: {} def {}");
|
|
40
|
+
}
|
|
41
|
+
assert.equal(l10n(templateObject_5 || (templateObject_5 = __makeTemplateObject(["", "matched", ""], ["", "matched", ""])), function (locale) { return locale; }, 345).toString(), "zh-CN345\u4E01\u620A\u536F");
|
|
42
|
+
});
|
|
43
|
+
var templateObject_1, templateObject_2, templateObject_3, templateObject_4, templateObject_5;
|
|
44
|
+
//# sourceMappingURL=intl.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"intl.test.js","sourceRoot":"","sources":["../src/intl.test.js"],"names":[],"mappings":";;;;AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAGrD,IAAI,CAAC,gBAAgB,EAAE,UAAC,CAAC;IACxB,aAAa,CAAC,OAAO,EAAE;QACtB,eAAe,EAAE,eAAe;KAChC,CAAC,CAAA;IACF,IAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;IAC1C,MAAM,CAAC,SAAS,CAAC,IAAI,sFAAA,MAAO,EAAG,OAAQ,EAAG,EAAE,KAAhB,GAAG,EAAQ,GAAG,GAAI,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC,CAAA;AAC/E,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,mBAAmB,EAAE,UAAC,CAAC;IAC3B,aAAa,CAAC,OAAO,EAAE;QACtB,eAAe,EAAE,iBAAiB;KAClC,CAAC,CAAA;IACF,IAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;IAC1C,MAAM,CAAC,KAAK,CAAC,IAAI,sFAAA,MAAO,EAAG,OAAQ,EAAG,EAAE,KAAhB,GAAG,EAAQ,GAAG,EAAG,QAAQ,EAAE,EAAE,iBAAiB,CAAC,CAAA;AACxE,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,eAAe,EAAE,UAAC,CAAC;IACvB,aAAa,CAAC,OAAO,EAAE;QACtB,WAAW,EAAE,aAAa;KAC1B,CAAC,CAAA;IACF,IAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;IAC1C,MAAM,CAAC,KAAK,CAAC,IAAI,kFAAA,EAAG,EAAgB,OAAQ,EAAG,EAAE,KAA7B,UAAA,MAAM,IAAI,OAAA,MAAM,EAAN,CAAM,EAAQ,GAAG,EAAG,QAAQ,EAAE,EAAE,eAAe,CAAC,CAAA;AAC/E,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,kBAAkB,EAAE,UAAC,CAAC;IAC1B,aAAa,CAAC,OAAO,EAAE;QACtB,WAAW,EAAE,QAAQ;QACrB,aAAa,EAAE,SAAS;KACxB,CAAC,CAAA;IACF,IAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;IAC1C,IAAI,CAAC;QACJ,IAAI,kFAAA,EAAG,EAAgB,OAAQ,EAAG,EAAE,KAA7B,UAAA,MAAM,IAAI,OAAA,MAAM,EAAN,CAAM,EAAQ,GAAG,EAAE;IACrC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACd,MAAM,CAAC,KAAK,CACX,GAAG,CAAC,OAAO,EACX,0EAA0E,CAC1E,CAAA;IACF,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,IAAI,oFAAA,EAAG,EAAgB,SAAU,EAAG,EAAE,KAA/B,UAAA,MAAM,IAAI,OAAA,MAAM,EAAN,CAAM,EAAU,GAAG,EAAG,QAAQ,EAAE,EAAE,4BAAa,CAAC,CAAA;AAC/E,CAAC,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "intl-template",
|
|
3
|
-
"version": "0.0.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "0.0.3",
|
|
4
|
+
"description": "l10n tagged template literals",
|
|
5
|
+
"type": "module",
|
|
5
6
|
"main": "dist/intl.js",
|
|
6
7
|
"module": "src/intl.js",
|
|
7
8
|
"scripts": {
|
|
8
|
-
"build": "tsc"
|
|
9
|
+
"build": "tsc",
|
|
10
|
+
"test": "node --test"
|
|
9
11
|
},
|
|
10
12
|
"keywords": [
|
|
11
13
|
"i18n",
|
package/src/intl.js
CHANGED
|
@@ -34,28 +34,29 @@ export function translate(locale, strings, ...parts) {
|
|
|
34
34
|
const key = strings.join("{}")
|
|
35
35
|
const translation = TRANSLATIONS?.[locale]
|
|
36
36
|
let { template, order } = translation?.[key] || {}
|
|
37
|
-
if (!template) {
|
|
37
|
+
if (!template && import.meta?.env?.MODE === "development") {
|
|
38
38
|
console.warn(`not match translate key, ${key}`, { translation, locale, strings, parts })
|
|
39
39
|
template = strings.slice()
|
|
40
40
|
order = parts.map((_, i) => i)
|
|
41
41
|
}
|
|
42
42
|
|
|
43
|
-
if (template.length !==
|
|
43
|
+
if (parts.length > 0 && template.length - 1 !== parts.length) {
|
|
44
44
|
throw new Error(`translate template parts length not match. locale: ${locale}, key: ${key}`)
|
|
45
45
|
}
|
|
46
46
|
|
|
47
|
-
const ret =
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
47
|
+
const ret = template.reduce((ret, template, idx) => {
|
|
48
|
+
ret.push(template)
|
|
49
|
+
const orderIdx = order[idx]
|
|
50
|
+
if (orderIdx >= 0) {
|
|
51
|
+
const part = parts[orderIdx]
|
|
51
52
|
if (typeof part == "function") {
|
|
52
53
|
ret.push(part(locale, translation))
|
|
53
54
|
} else {
|
|
54
55
|
ret.push(part)
|
|
55
56
|
}
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
57
|
+
}
|
|
58
|
+
return ret
|
|
59
|
+
}, [])
|
|
59
60
|
|
|
60
61
|
const text = ret.join("")
|
|
61
62
|
Object.defineProperty(ret, "toString", {
|
|
@@ -67,3 +68,5 @@ export function translate(locale, strings, ...parts) {
|
|
|
67
68
|
|
|
68
69
|
return ret
|
|
69
70
|
}
|
|
71
|
+
|
|
72
|
+
export const l10n = translate.bind(null, globalThis?.navigator?.language)
|
package/src/intl.test.js
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import assert from 'node:assert';
|
|
2
|
+
import test from 'node:test';
|
|
3
|
+
import { translate, setTransition } from './intl.js';
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
test('apply template', (t) => {
|
|
7
|
+
setTransition('zh-CN', {
|
|
8
|
+
'abc {} def {}': '甲乙丙 {} {} 丁戊卯',
|
|
9
|
+
})
|
|
10
|
+
const l10n = translate.bind(null, 'zh-CN')
|
|
11
|
+
assert.deepEqual(l10n`abc ${123} def ${345}`, ['甲乙丙 ', 123, ' ', 345, ' 丁戊卯'])
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
test('change slot order', (t) => {
|
|
15
|
+
setTransition('zh-CN', {
|
|
16
|
+
'abc {} def {}': '甲乙丙 {1} {0} 丁戊卯',
|
|
17
|
+
})
|
|
18
|
+
const l10n = translate.bind(null, 'zh-CN')
|
|
19
|
+
assert.equal(l10n`abc ${123} def ${345}`.toString(), '甲乙丙 345 123 丁戊卯')
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
test('slot function', (t) => {
|
|
23
|
+
setTransition('zh-CN', {
|
|
24
|
+
'{} def {}': '{1} {0} 丁戊卯',
|
|
25
|
+
})
|
|
26
|
+
const l10n = translate.bind(null, 'zh-CN')
|
|
27
|
+
assert.equal(l10n`${locale => locale} def ${345}`.toString(), '345 zh-CN 丁戊卯')
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
test('slot count match', (t) => {
|
|
31
|
+
setTransition('zh-CN', {
|
|
32
|
+
'{} def {}': '{} 丁戊卯',
|
|
33
|
+
'{}matched{}': '{}{}丁戊卯',
|
|
34
|
+
})
|
|
35
|
+
const l10n = translate.bind(null, 'zh-CN')
|
|
36
|
+
try {
|
|
37
|
+
l10n`${locale => locale} def ${345}`
|
|
38
|
+
} catch (err) {
|
|
39
|
+
assert.equal(
|
|
40
|
+
err.message,
|
|
41
|
+
`translate template parts length not match. locale: zh-CN, key: {} def {}`
|
|
42
|
+
)
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
assert.equal(l10n`${locale => locale}matched${345}`.toString(), `zh-CN345丁戊卯`)
|
|
46
|
+
});
|