intl-template 0.0.2 → 0.0.4
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/dist/intl.d.ts +1 -0
- package/dist/intl.js +6 -3
- package/dist/intl.js.map +1 -1
- package/dist/intl.test.js +33 -67
- package/dist/intl.test.js.map +1 -1
- package/package.json +1 -1
- package/src/intl.js +6 -2
- package/src/intl.test.js +21 -3
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,19 +28,20 @@ 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
47
|
var ret = template.reduce(function (ret, template, idx) {
|
|
@@ -65,4 +67,5 @@ export function translate(locale, strings) {
|
|
|
65
67
|
});
|
|
66
68
|
return ret;
|
|
67
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);
|
|
68
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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"}
|
package/dist/intl.test.js
CHANGED
|
@@ -2,77 +2,43 @@ var __makeTemplateObject = (this && this.__makeTemplateObject) || function (cook
|
|
|
2
2
|
if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; }
|
|
3
3
|
return cooked;
|
|
4
4
|
};
|
|
5
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
6
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
7
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
8
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
9
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
10
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
11
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
12
|
-
});
|
|
13
|
-
};
|
|
14
|
-
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
15
|
-
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
16
|
-
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
17
|
-
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
18
|
-
function step(op) {
|
|
19
|
-
if (f) throw new TypeError("Generator is already executing.");
|
|
20
|
-
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
21
|
-
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
22
|
-
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
23
|
-
switch (op[0]) {
|
|
24
|
-
case 0: case 1: t = op; break;
|
|
25
|
-
case 4: _.label++; return { value: op[1], done: false };
|
|
26
|
-
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
27
|
-
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
28
|
-
default:
|
|
29
|
-
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
30
|
-
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
31
|
-
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
32
|
-
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
33
|
-
if (t[2]) _.ops.pop();
|
|
34
|
-
_.trys.pop(); continue;
|
|
35
|
-
}
|
|
36
|
-
op = body.call(thisArg, _);
|
|
37
|
-
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
38
|
-
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
39
|
-
}
|
|
40
|
-
};
|
|
41
5
|
import assert from 'node:assert';
|
|
42
6
|
import test from 'node:test';
|
|
43
7
|
import { translate, setTransition } from './intl.js';
|
|
44
|
-
test('apply template', function (t) {
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
setTransition('zh-CN', {
|
|
48
|
-
'abc {} def {}': '甲乙丙 {} {} 丁戊卯',
|
|
49
|
-
});
|
|
50
|
-
l10n = translate.bind(null, 'zh-CN');
|
|
51
|
-
assert.deepEqual(l10n(templateObject_1 || (templateObject_1 = __makeTemplateObject(["abc ", " def ", ""], ["abc ", " def ", ""])), 123, 345), ['甲乙丙 ', 123, ' ', 345, ' 丁戊卯']);
|
|
52
|
-
return [2 /*return*/];
|
|
8
|
+
test('apply template', function (t) {
|
|
9
|
+
setTransition('zh-CN', {
|
|
10
|
+
'abc {} def {}': '甲乙丙 {} {} 丁戊卯',
|
|
53
11
|
});
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
});
|
|
61
|
-
l10n = translate.bind(null, 'zh-CN');
|
|
62
|
-
assert.equal(l10n(templateObject_2 || (templateObject_2 = __makeTemplateObject(["abc ", " def ", ""], ["abc ", " def ", ""])), 123, 345).toString(), '甲乙丙 345 123 丁戊卯');
|
|
63
|
-
return [2 /*return*/];
|
|
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} 丁戊卯',
|
|
64
18
|
});
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
});
|
|
72
|
-
l10n = translate.bind(null, 'zh-CN');
|
|
73
|
-
assert.equal(l10n(templateObject_3 || (templateObject_3 = __makeTemplateObject(["", " def ", ""], ["", " def ", ""])), function (locale) { return locale; }, 345).toString(), '345 zh-CN 丁戊卯');
|
|
74
|
-
return [2 /*return*/];
|
|
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} 丁戊卯',
|
|
75
25
|
});
|
|
76
|
-
|
|
77
|
-
|
|
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;
|
|
78
44
|
//# sourceMappingURL=intl.test.js.map
|
package/dist/intl.test.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"intl.test.js","sourceRoot":"","sources":["../src/intl.test.js"],"names":[],"mappings":"
|
|
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
package/src/intl.js
CHANGED
|
@@ -35,12 +35,14 @@ export function translate(locale, strings, ...parts) {
|
|
|
35
35
|
const translation = TRANSLATIONS?.[locale]
|
|
36
36
|
let { template, order } = translation?.[key] || {}
|
|
37
37
|
if (!template) {
|
|
38
|
-
|
|
38
|
+
if (import.meta?.env?.MODE === "development") {
|
|
39
|
+
console.warn(`not match translate key, ${key}`, { translation, locale, strings, parts })
|
|
40
|
+
}
|
|
39
41
|
template = strings.slice()
|
|
40
42
|
order = parts.map((_, i) => i)
|
|
41
43
|
}
|
|
42
44
|
|
|
43
|
-
if (template.length !==
|
|
45
|
+
if (parts.length > 0 && template.length - 1 !== parts.length) {
|
|
44
46
|
throw new Error(`translate template parts length not match. locale: ${locale}, key: ${key}`)
|
|
45
47
|
}
|
|
46
48
|
|
|
@@ -68,3 +70,5 @@ export function translate(locale, strings, ...parts) {
|
|
|
68
70
|
|
|
69
71
|
return ret
|
|
70
72
|
}
|
|
73
|
+
|
|
74
|
+
export const l10n = translate.bind(null, globalThis?.navigator?.language)
|
package/src/intl.test.js
CHANGED
|
@@ -3,7 +3,7 @@ import test from 'node:test';
|
|
|
3
3
|
import { translate, setTransition } from './intl.js';
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
test('apply template',
|
|
6
|
+
test('apply template', (t) => {
|
|
7
7
|
setTransition('zh-CN', {
|
|
8
8
|
'abc {} def {}': '甲乙丙 {} {} 丁戊卯',
|
|
9
9
|
})
|
|
@@ -11,7 +11,7 @@ test('apply template', async (t) => {
|
|
|
11
11
|
assert.deepEqual(l10n`abc ${123} def ${345}`, ['甲乙丙 ', 123, ' ', 345, ' 丁戊卯'])
|
|
12
12
|
});
|
|
13
13
|
|
|
14
|
-
test('change slot order',
|
|
14
|
+
test('change slot order', (t) => {
|
|
15
15
|
setTransition('zh-CN', {
|
|
16
16
|
'abc {} def {}': '甲乙丙 {1} {0} 丁戊卯',
|
|
17
17
|
})
|
|
@@ -19,10 +19,28 @@ test('change slot order', async (t) => {
|
|
|
19
19
|
assert.equal(l10n`abc ${123} def ${345}`.toString(), '甲乙丙 345 123 丁戊卯')
|
|
20
20
|
});
|
|
21
21
|
|
|
22
|
-
test('slot function',
|
|
22
|
+
test('slot function', (t) => {
|
|
23
23
|
setTransition('zh-CN', {
|
|
24
24
|
'{} def {}': '{1} {0} 丁戊卯',
|
|
25
25
|
})
|
|
26
26
|
const l10n = translate.bind(null, 'zh-CN')
|
|
27
27
|
assert.equal(l10n`${locale => locale} def ${345}`.toString(), '345 zh-CN 丁戊卯')
|
|
28
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
|
+
});
|