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 ADDED
@@ -0,0 +1,2 @@
1
+ export function setTransition(locale: any, transition: any): {};
2
+ export function translate(locale: any, strings: any, ...parts: any[]): any;
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
@@ -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
+ }