intl-template 0.0.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/dist/intl.d.ts +2 -0
- package/dist/intl.js +67 -0
- package/dist/intl.js.map +1 -0
- package/package.json +20 -0
- package/src/intl.js +69 -0
- package/tsconfig.json +23 -0
package/dist/intl.d.ts
ADDED
package/dist/intl.js
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
var TRANSLATIONS = {};
|
|
2
|
+
export function setTransition(locale, transition) {
|
|
3
|
+
return TRANSLATIONS[locale] = Object.entries(transition).reduce(function (obj, _a) {
|
|
4
|
+
var key = _a[0], value = _a[1];
|
|
5
|
+
var order = [];
|
|
6
|
+
var template = [];
|
|
7
|
+
var parts = value.split(/({\d*})/);
|
|
8
|
+
parts.forEach(function (part, index) {
|
|
9
|
+
if (part === '{}') {
|
|
10
|
+
if (index === 0 || index === parts.length - 1) {
|
|
11
|
+
template.push("");
|
|
12
|
+
}
|
|
13
|
+
order.push(order.length);
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
if (part.match(/^{\d+}$/)) {
|
|
17
|
+
if (index === 0 || index === parts.length - 1) {
|
|
18
|
+
template.push("");
|
|
19
|
+
}
|
|
20
|
+
order.push(parseInt(part.slice(1, -1), 10));
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
template.push(part);
|
|
24
|
+
});
|
|
25
|
+
obj[key] = { template: template, order: order };
|
|
26
|
+
return obj;
|
|
27
|
+
}, {});
|
|
28
|
+
}
|
|
29
|
+
export function translate(locale, strings) {
|
|
30
|
+
var parts = [];
|
|
31
|
+
for (var _i = 2; _i < arguments.length; _i++) {
|
|
32
|
+
parts[_i - 2] = arguments[_i];
|
|
33
|
+
}
|
|
34
|
+
var key = strings.join("{}");
|
|
35
|
+
var translation = TRANSLATIONS === null || TRANSLATIONS === void 0 ? void 0 : TRANSLATIONS[locale];
|
|
36
|
+
var _a = (translation === null || translation === void 0 ? void 0 : translation[key]) || {}, template = _a.template, order = _a.order;
|
|
37
|
+
if (!template) {
|
|
38
|
+
console.warn("not match translate key, ".concat(key), { translation: translation, locale: locale, strings: strings, parts: parts });
|
|
39
|
+
template = strings.slice();
|
|
40
|
+
order = parts.map(function (_, i) { return i; });
|
|
41
|
+
}
|
|
42
|
+
if (template.length !== strings.length) {
|
|
43
|
+
throw new Error("translate template parts length not match. locale: ".concat(locale, ", key: ").concat(key));
|
|
44
|
+
}
|
|
45
|
+
var ret = order.length
|
|
46
|
+
? order.reduce(function (ret, partIdx, templaIdx) {
|
|
47
|
+
var part = parts[partIdx];
|
|
48
|
+
ret.push(template[templaIdx]);
|
|
49
|
+
if (typeof part == "function") {
|
|
50
|
+
ret.push(part(locale, translation));
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
ret.push(part);
|
|
54
|
+
}
|
|
55
|
+
return ret;
|
|
56
|
+
}, [])
|
|
57
|
+
: template.slice();
|
|
58
|
+
var text = ret.join("");
|
|
59
|
+
Object.defineProperty(ret, "toString", {
|
|
60
|
+
enumerable: false,
|
|
61
|
+
writable: false,
|
|
62
|
+
configurable: false,
|
|
63
|
+
value: function () { return text; }
|
|
64
|
+
});
|
|
65
|
+
return ret;
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=intl.js.map
|
package/dist/intl.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"intl.js","sourceRoot":"","sources":["../src/intl.js"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "intl-template",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "L10N Tagged Template Literals",
|
|
5
|
+
"main": "dist/intl.js",
|
|
6
|
+
"module": "src/intl.js",
|
|
7
|
+
"scripts": {
|
|
8
|
+
"build": "tsc"
|
|
9
|
+
},
|
|
10
|
+
"keywords": [
|
|
11
|
+
"i18n",
|
|
12
|
+
"l10n",
|
|
13
|
+
"tagged template literals"
|
|
14
|
+
],
|
|
15
|
+
"author": "p10y",
|
|
16
|
+
"license": "ISC",
|
|
17
|
+
"devDependencies": {
|
|
18
|
+
"typescript": "^5.0.0"
|
|
19
|
+
}
|
|
20
|
+
}
|
package/src/intl.js
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
const TRANSLATIONS = {}
|
|
2
|
+
|
|
3
|
+
export function setTransition(locale, transition) {
|
|
4
|
+
return TRANSLATIONS[locale] = Object.entries(transition).reduce((obj, [key, value]) => {
|
|
5
|
+
const order = [];
|
|
6
|
+
const template = [];
|
|
7
|
+
const parts = value.split(/({\d*})/)
|
|
8
|
+
parts.forEach((part, index) => {
|
|
9
|
+
if (part === '{}') {
|
|
10
|
+
if (index === 0 || index === parts.length - 1) {
|
|
11
|
+
template.push("")
|
|
12
|
+
}
|
|
13
|
+
order.push(order.length)
|
|
14
|
+
return
|
|
15
|
+
}
|
|
16
|
+
if (part.match(/^{\d+}$/)) {
|
|
17
|
+
if (index === 0 || index === parts.length - 1) {
|
|
18
|
+
template.push("")
|
|
19
|
+
}
|
|
20
|
+
order.push(parseInt(part.slice(1, -1), 10))
|
|
21
|
+
return
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
template.push(part)
|
|
25
|
+
})
|
|
26
|
+
|
|
27
|
+
obj[key] = { template, order }
|
|
28
|
+
|
|
29
|
+
return obj
|
|
30
|
+
}, {})
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export function translate(locale, strings, ...parts) {
|
|
34
|
+
const key = strings.join("{}")
|
|
35
|
+
const translation = TRANSLATIONS?.[locale]
|
|
36
|
+
let { template, order } = translation?.[key] || {}
|
|
37
|
+
if (!template) {
|
|
38
|
+
console.warn(`not match translate key, ${key}`, { translation, locale, strings, parts })
|
|
39
|
+
template = strings.slice()
|
|
40
|
+
order = parts.map((_, i) => i)
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
if (template.length !== strings.length) {
|
|
44
|
+
throw new Error(`translate template parts length not match. locale: ${locale}, key: ${key}`)
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const ret = order.length
|
|
48
|
+
? order.reduce((ret, partIdx, templaIdx) => {
|
|
49
|
+
const part = parts[partIdx]
|
|
50
|
+
ret.push(template[templaIdx])
|
|
51
|
+
if (typeof part == "function") {
|
|
52
|
+
ret.push(part(locale, translation))
|
|
53
|
+
} else {
|
|
54
|
+
ret.push(part)
|
|
55
|
+
}
|
|
56
|
+
return ret
|
|
57
|
+
}, [])
|
|
58
|
+
: template.slice()
|
|
59
|
+
|
|
60
|
+
const text = ret.join("")
|
|
61
|
+
Object.defineProperty(ret, "toString", {
|
|
62
|
+
enumerable: false,
|
|
63
|
+
writable: false,
|
|
64
|
+
configurable: false,
|
|
65
|
+
value: () => text
|
|
66
|
+
})
|
|
67
|
+
|
|
68
|
+
return ret
|
|
69
|
+
}
|
package/tsconfig.json
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"allowJs": true,
|
|
4
|
+
"target": "ES5",
|
|
5
|
+
"lib": [
|
|
6
|
+
"ESNext",
|
|
7
|
+
"DOM"
|
|
8
|
+
],
|
|
9
|
+
"module": "ESNext",
|
|
10
|
+
"declaration": true,
|
|
11
|
+
"sourceMap": true,
|
|
12
|
+
"outDir": "./dist",
|
|
13
|
+
"esModuleInterop": true,
|
|
14
|
+
"forceConsistentCasingInFileNames": true,
|
|
15
|
+
"strict": true,
|
|
16
|
+
"skipLibCheck": true
|
|
17
|
+
},
|
|
18
|
+
"exclude": [
|
|
19
|
+
"dist",
|
|
20
|
+
"*.test.js",
|
|
21
|
+
"jest.config.js"
|
|
22
|
+
]
|
|
23
|
+
}
|