intl-template 1.0.0-alpha.2 → 1.0.0-alpha.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 CHANGED
@@ -7,6 +7,15 @@ export function parseTemplate(templateString: string): {
7
7
  template: string[];
8
8
  order: number[];
9
9
  };
10
+ /**
11
+ * @param {string} regexString
12
+ * @param {string} matchString
13
+ * @returns {{ strings: Array<string>, parts: Array<string> }}
14
+ */
15
+ export function regexTemplate(regexString: string, matchString: string): {
16
+ strings: Array<string>;
17
+ parts: Array<string>;
18
+ };
10
19
  export class Runes extends Array<any> {
11
20
  constructor(arrayLength?: number | undefined);
12
21
  constructor(arrayLength: number);
@@ -16,6 +25,8 @@ export class Runes extends Array<any> {
16
25
  * Represents a Translation object that handles string translation based on locale and templates.
17
26
  */
18
27
  export class Translation {
28
+ constructor(locale: any);
29
+ defaultLocale: any;
19
30
  set templates(value: ProxyConstructor);
20
31
  get templates(): ProxyConstructor;
21
32
  /**
@@ -28,8 +39,19 @@ export class Translation {
28
39
  * @throws {Error} - If the length of the template parts does not match the length of the template.
29
40
  */
30
41
  translate: (locale: string, strings: TemplateStringsArray | string, ...parts: any[]) => Runes;
42
+ /**
43
+ * Use regex extract template and vars
44
+ * @param {*} locale
45
+ * @param {*} regexString
46
+ * @param {*} matchString
47
+ * @returns {Runes}
48
+ */
49
+ translateByRegEx: (locale: any, regexString: any, matchString: any) => Runes;
50
+ l10n: (strings: any, ...parts: any[]) => Runes;
51
+ l10nRegExp: (regexString: any, matchString: any) => Runes;
31
52
  #private;
32
53
  }
33
54
  export default translation;
34
- export const l10n: (strings: string | TemplateStringsArray, ...parts: any[]) => Runes;
55
+ export function l10n(strings: any, ...parts: any[]): Runes;
56
+ export function l10nRegExp(regexString: any, matchString: any): Runes;
35
57
  declare const translation: Translation;
package/dist/intl.js CHANGED
@@ -18,7 +18,15 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
18
18
  if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
19
19
  return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
20
20
  };
21
- var _a;
21
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
22
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
23
+ if (ar || !(i in from)) {
24
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
25
+ ar[i] = from[i];
26
+ }
27
+ }
28
+ return to.concat(ar || Array.prototype.slice.call(from));
29
+ };
22
30
  var _Translation_templates;
23
31
  var Runes = /** @class */ (function (_super) {
24
32
  __extends(Runes, _super);
@@ -60,7 +68,7 @@ export function parseTemplate(templateString) {
60
68
  * Represents a Translation object that handles string translation based on locale and templates.
61
69
  */
62
70
  var Translation = /** @class */ (function () {
63
- function Translation() {
71
+ function Translation(locale) {
64
72
  var _this = this;
65
73
  /**
66
74
  * Templates object that stores the translation templates for each locale.
@@ -107,6 +115,9 @@ var Translation = /** @class */ (function () {
107
115
  }
108
116
  var key = strings.join("{}");
109
117
  var translation = (_a = __classPrivateFieldGet(_this, _Translation_templates, "f")) === null || _a === void 0 ? void 0 : _a[locale];
118
+ if (!translation) {
119
+ translation = __classPrivateFieldGet(_this, _Translation_templates, "f")[_this.defaultLocale];
120
+ }
110
121
  var _d = (translation === null || translation === void 0 ? void 0 : translation[key]) || {}, template = _d.template, order = _d.order;
111
122
  if (!template) {
112
123
  if (((_c = (_b = import.meta) === null || _b === void 0 ? void 0 : _b.env) === null || _c === void 0 ? void 0 : _c.MODE) === "development") {
@@ -134,6 +145,28 @@ var Translation = /** @class */ (function () {
134
145
  }, new Runes());
135
146
  return runes;
136
147
  };
148
+ /**
149
+ * Use regex extract template and vars
150
+ * @param {*} locale
151
+ * @param {*} regexString
152
+ * @param {*} matchString
153
+ * @returns {Runes}
154
+ */
155
+ this.translateByRegEx = function (locale, regexString, matchString) {
156
+ var _a = regexTemplate(regexString, matchString), parts = _a.parts, strings = _a.strings;
157
+ return _this.translate.apply(_this, __spreadArray([locale, strings], parts, false));
158
+ };
159
+ this.l10n = function (strings) {
160
+ var parts = [];
161
+ for (var _i = 1; _i < arguments.length; _i++) {
162
+ parts[_i - 1] = arguments[_i];
163
+ }
164
+ return translation.translate.apply(translation, __spreadArray([_this.defaultLocale, strings], parts, false));
165
+ };
166
+ this.l10nRegExp = function (regexString, matchString) {
167
+ return translation.translateByRegEx(_this.defaultLocale, regexString, matchString);
168
+ };
169
+ this.defaultLocale = locale;
137
170
  }
138
171
  Object.defineProperty(Translation.prototype, "templates", {
139
172
  get: function () {
@@ -156,5 +189,28 @@ export { Translation };
156
189
  _Translation_templates = new WeakMap();
157
190
  var translation = new Translation();
158
191
  export default translation;
159
- export var l10n = translation.translate.bind(null, (_a = globalThis === null || globalThis === void 0 ? void 0 : globalThis.navigator) === null || _a === void 0 ? void 0 : _a.language);
192
+ export var l10n = translation.l10n;
193
+ export var l10nRegExp = translation.l10nRegExp;
194
+ /**
195
+ * @param {string} regexString
196
+ * @param {string} matchString
197
+ * @returns {{ strings: Array<string>, parts: Array<string> }}
198
+ */
199
+ export function regexTemplate(regexString, matchString) {
200
+ var parts = [];
201
+ var strings = [];
202
+ var matches = new RegExp(regexString).exec(matchString);
203
+ if (!matches) {
204
+ return { parts: [], strings: strings };
205
+ }
206
+ parts = matches.slice(1);
207
+ regexString
208
+ .split(/(\([^)]+\))/) // split by regex group
209
+ .forEach(function (part) {
210
+ if (!part.startsWith("(") || !part.endsWith(")")) {
211
+ strings.push(part);
212
+ }
213
+ });
214
+ return { strings: strings, parts: parts };
215
+ }
160
216
  //# 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":"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"}
1
+ {"version":3,"file":"intl.js","sourceRoot":"","sources":["../src/intl.js"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "intl-template",
3
- "version": "1.0.0-alpha.2",
3
+ "version": "1.0.0-alpha.4",
4
4
  "description": "l10n tagged template literals",
5
5
  "type": "module",
6
6
  "main": "dist/intl.js",
package/src/intl.js CHANGED
@@ -33,6 +33,10 @@ export function parseTemplate(templateString) {
33
33
  * Represents a Translation object that handles string translation based on locale and templates.
34
34
  */
35
35
  export class Translation {
36
+ constructor(locale) {
37
+ this.defaultLocale = locale
38
+ }
39
+
36
40
  /**
37
41
  * Templates object that stores the translation templates for each locale.
38
42
  * @type {Proxy}
@@ -89,7 +93,10 @@ export class Translation {
89
93
  }
90
94
 
91
95
  const key = strings.join("{}")
92
- const translation = this.#templates?.[locale]
96
+ let translation = this.#templates?.[locale]
97
+ if (!translation) {
98
+ translation = this.#templates[this.defaultLocale]
99
+ }
93
100
  let { template, order } = translation?.[key] || {}
94
101
  if (!template) {
95
102
  if (import.meta?.env?.MODE === "development") {
@@ -121,10 +128,58 @@ export class Translation {
121
128
 
122
129
  return runes
123
130
  }
131
+
132
+ /**
133
+ * Use regex extract template and vars
134
+ * @param {*} locale
135
+ * @param {*} regexString
136
+ * @param {*} matchString
137
+ * @returns {Runes}
138
+ */
139
+ translateByRegEx = (locale, regexString, matchString) => {
140
+ const { parts, strings } = regexTemplate(regexString, matchString)
141
+ return this.translate(locale, strings, ...parts);
142
+ }
143
+
144
+ l10n = (strings, ...parts) => {
145
+ return translation.translate(this.defaultLocale, strings, ...parts)
146
+ }
147
+
148
+ l10nRegExp = (regexString, matchString) => {
149
+ return translation.translateByRegEx(this.defaultLocale, regexString, matchString)
150
+ }
124
151
  }
125
152
 
126
153
  const translation = new Translation()
127
154
 
128
155
  export default translation
129
156
 
130
- export const l10n = translation.translate.bind(null, globalThis?.navigator?.language);
157
+ export const l10n = translation.l10n
158
+
159
+ export const l10nRegExp = translation.l10nRegExp
160
+
161
+ /**
162
+ * @param {string} regexString
163
+ * @param {string} matchString
164
+ * @returns {{ strings: Array<string>, parts: Array<string> }}
165
+ */
166
+ export function regexTemplate(regexString, matchString) {
167
+ let parts = [];
168
+ const strings = [];
169
+
170
+ const matches = new RegExp(regexString).exec(matchString)
171
+ if (!matches) {
172
+ return { parts: [], strings }
173
+ }
174
+
175
+ parts = matches.slice(1)
176
+ regexString
177
+ .split(/(\([^)]+\))/) // split by regex group
178
+ .forEach(part => {
179
+ if (!part.startsWith("(") || !part.endsWith(")")) {
180
+ strings.push(part)
181
+ }
182
+ })
183
+
184
+ return { strings, parts };
185
+ }
package/src/intl.test.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import assert from "node:assert"
2
2
  import test from "node:test"
3
- import { Translation, Runes } from "./intl.js"
3
+ import { Translation, Runes, regexTemplate } from "./intl.js"
4
4
 
5
5
  test("template", async (t) => {
6
6
  await t.test("multiple locale template parse", () => {
@@ -124,6 +124,27 @@ test("translation.translate", async (t) => {
124
124
  })
125
125
  })
126
126
 
127
+ test("translation.regexTranslate", async (t) => {
128
+ await t.test("regexTranslate", () => {
129
+ const translation = new Translation("zh-CN")
130
+ translation.templates["zh-CN"] = {
131
+ "abc {} def {}": "甲乙丙 {1} {0} 丁戊卯",
132
+ }
133
+
134
+ assert.equal(
135
+ translation.regexTranslate("zh-CN", "abc (\\d+) def (\\d+)", "abc 123 def 345").toString(),
136
+ "甲乙丙 345 123 丁戊卯"
137
+ )
138
+ })
139
+ })
140
+
141
+ test("regexTemplate", async (t) => {
142
+ assert.deepEqual(
143
+ regexTemplate("(\\d+) def (\\d+)", "123 def 345"),
144
+ { strings: ["", " def ", ""], parts: ['123', '345'] }
145
+ )
146
+ })
147
+
127
148
  test("Runes", async (t) => {
128
149
  assert.equal(
129
150
  new Runes('a', ' b ', 1, 2).toString(),