@wordpress/i18n 6.0.1-next.719a03cbe.0 → 6.1.1-next.0f6f9d12c.0

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.
Files changed (40) hide show
  1. package/CHANGELOG.md +3 -1
  2. package/README.md +20 -19
  3. package/build/create-i18n.js +60 -205
  4. package/build/create-i18n.js.map +1 -1
  5. package/build/default-i18n.js +31 -34
  6. package/build/default-i18n.js.map +1 -1
  7. package/build/index.js.map +1 -1
  8. package/build/sprintf.js +5 -4
  9. package/build/sprintf.js.map +1 -1
  10. package/build/types.js.map +1 -1
  11. package/build-module/create-i18n.js +60 -205
  12. package/build-module/create-i18n.js.map +1 -1
  13. package/build-module/default-i18n.js +31 -35
  14. package/build-module/default-i18n.js.map +1 -1
  15. package/build-module/index.js.map +1 -1
  16. package/build-module/sprintf.js +5 -4
  17. package/build-module/sprintf.js.map +1 -1
  18. package/build-module/types.js.map +1 -1
  19. package/build-types/create-i18n.d.ts +11 -115
  20. package/build-types/create-i18n.d.ts.map +1 -1
  21. package/build-types/default-i18n.d.ts +45 -47
  22. package/build-types/default-i18n.d.ts.map +1 -1
  23. package/build-types/index.d.ts +4 -3
  24. package/build-types/index.d.ts.map +1 -1
  25. package/build-types/sprintf.d.ts +1 -4
  26. package/build-types/sprintf.d.ts.map +1 -1
  27. package/build-types/types.d.ts +101 -0
  28. package/build-types/types.d.ts.map +1 -1
  29. package/package.json +4 -4
  30. package/src/create-i18n.ts +405 -0
  31. package/src/{default-i18n.js → default-i18n.ts} +37 -35
  32. package/src/index.ts +16 -0
  33. package/src/sprintf.ts +6 -10
  34. package/src/test/{create-i18n.js → create-i18n.ts} +63 -30
  35. package/src/test/{sprintf.js → sprintf.ts} +5 -1
  36. package/src/test/{subscribe-i18n.js → subscribe-i18n.ts} +3 -3
  37. package/src/types.ts +155 -0
  38. package/tsconfig.tsbuildinfo +1 -1
  39. package/src/create-i18n.js +0 -514
  40. /package/src/test/{default-i18n.js → default-i18n.ts} +0 -0
package/CHANGELOG.md CHANGED
@@ -2,7 +2,9 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
- ## 6.0.0-next.0 (2025-07-08)
5
+ ## 6.1.0 (2025-08-07)
6
+
7
+ ## 6.0.0 (2025-07-23)
6
8
 
7
9
  ### Breaking Changes
8
10
 
package/README.md CHANGED
@@ -33,13 +33,13 @@ Create an i18n instance
33
33
 
34
34
  _Parameters_
35
35
 
36
- - _initialData_ `[LocaleData]`: Locale data configuration.
37
- - _initialDomain_ `[string]`: Domain for which configuration applies.
36
+ - _initialData_ `[LocaleData< TextDomain >]`: Locale data configuration.
37
+ - _initialDomain_ `[TextDomain]`: Domain for which configuration applies.
38
38
  - _hooks_ `[Hooks]`: Hooks implementation.
39
39
 
40
40
  _Returns_
41
41
 
42
- - `I18n`: I18n instance.
42
+ - `I18n< TextDomain >`: I18n instance.
43
43
 
44
44
  ### defaultI18n
45
45
 
@@ -55,7 +55,7 @@ _Related_
55
55
 
56
56
  _Parameters_
57
57
 
58
- - _domain_ `[string]`: Domain for which to get the data.
58
+ - _domain_ `[ string | undefined ]`: Domain for which to get the data.
59
59
 
60
60
  _Returns_
61
61
 
@@ -68,8 +68,8 @@ Check if there is a translation for a given string (in singular form).
68
68
  _Parameters_
69
69
 
70
70
  - _single_ `string`: Singular form of the string to look up.
71
- - _context_ `[string]`: Context information for the translators.
72
- - _domain_ `[string]`: Domain to retrieve the translated text.
71
+ - _context_ `string`: Context information for the translators.
72
+ - _domain_ `string`: Domain to retrieve the translated text.
73
73
 
74
74
  _Returns_
75
75
 
@@ -96,7 +96,7 @@ _Related_
96
96
  _Parameters_
97
97
 
98
98
  - _data_ `[LocaleData]`: Locale data configuration.
99
- - _domain_ `[string]`: Domain for which configuration applies.
99
+ - _domain_ `[string | undefined]`: Domain for which configuration applies.
100
100
 
101
101
  ### setLocaleData
102
102
 
@@ -108,8 +108,8 @@ _Related_
108
108
 
109
109
  _Parameters_
110
110
 
111
- - _data_ `[LocaleData]`: Locale data configuration.
112
- - _domain_ `[string]`: Domain for which configuration applies.
111
+ - _data_ `[LocaleData ]`: Locale data configuration.
112
+ - _domain_ `[string | undefined]`: Domain for which configuration applies.
113
113
 
114
114
  ### sprintf
115
115
 
@@ -121,8 +121,8 @@ _Related_
121
121
 
122
122
  _Parameters_
123
123
 
124
- - _format_ `T | TranslatableText<T>`: The format of the string to generate.
125
- - _args_ `DistributeSprintfArgs<T>`: Arguments to apply to the format.
124
+ - _format_ `T | TranslatableText< T >`: The format of the string to generate.
125
+ - _args_ `DistributeSprintfArgs< T >`: Arguments to apply to the format.
126
126
 
127
127
  _Returns_
128
128
 
@@ -153,11 +153,11 @@ _Parameters_
153
153
  - _single_ `Single`: The text to be used if the number is singular.
154
154
  - _plural_ `Plural`: The text to be used if the number is plural.
155
155
  - _number_ `number`: The number to compare against to use either the singular or plural form.
156
- - _domain_ `[string]`: Domain to retrieve the translated text.
156
+ - _domain_ `string | undefined`: Domain to retrieve the translated text.
157
157
 
158
158
  _Returns_
159
159
 
160
- - `import('./types').TranslatableText< Single | Plural >`: The translated singular or plural form.
160
+ - `TranslatableText<Single | Plural>`: The translated singular or plural form.
161
161
 
162
162
  ### \_nx
163
163
 
@@ -169,15 +169,16 @@ _Related_
169
169
 
170
170
  _Parameters_
171
171
 
172
+ - _single_ `Single`: The text to be used if the number is singular.
172
173
  - _single_ `Single`: The text to be used if the number is singular.
173
174
  - _plural_ `Plural`: The text to be used if the number is plural.
174
175
  - _number_ `number`: The number to compare against to use either the singular or plural form.
175
176
  - _context_ `string`: Context information for the translators.
176
- - _domain_ `[string]`: Domain to retrieve the translated text.
177
+ - _domain_ `[string | undefined]`: Domain to retrieve the translated text.
177
178
 
178
179
  _Returns_
179
180
 
180
- - `import('./types').TranslatableText< Single | Plural >`: The translated singular or plural form.
181
+ - `TranslatableText<Single | Plural>`: The translated singular or plural form.
181
182
 
182
183
  ### \_x
183
184
 
@@ -191,11 +192,11 @@ _Parameters_
191
192
 
192
193
  - _text_ `Text`: Text to translate.
193
194
  - _context_ `string`: Context information for the translators.
194
- - _domain_ `[string]`: Domain to retrieve the translated text.
195
+ - _domain_ `string | undefined`: Domain to retrieve the translated text.
195
196
 
196
197
  _Returns_
197
198
 
198
- - `import('./types').TranslatableText< Text >`: Translated context string without pipe.
199
+ - `TranslatableText<Text>`: Translated context string without pipe.
199
200
 
200
201
  ### \_\_
201
202
 
@@ -208,11 +209,11 @@ _Related_
208
209
  _Parameters_
209
210
 
210
211
  - _text_ `Text`: Text to translate.
211
- - _domain_ `[string]`: Domain to retrieve the translated text.
212
+ - _domain_ `string | undefined`: Domain to retrieve the translated text.
212
213
 
213
214
  _Returns_
214
215
 
215
- - `import('./types').TranslatableText< Text >`: Translated text.
216
+ - `TranslatableText<Text>`: Translated text.
216
217
 
217
218
  <!-- END TOKEN(Autogenerated API docs) -->
218
219
 
@@ -11,18 +11,19 @@ var _tannin = _interopRequireDefault(require("tannin"));
11
11
  */
12
12
 
13
13
  /**
14
- * @typedef {Record<string,any>} LocaleData
14
+ * Internal dependencies
15
+ */
16
+
17
+ /**
18
+ * WordPress dependencies
15
19
  */
16
20
 
17
21
  /**
18
22
  * Default locale data to use for Tannin domain when not otherwise provided.
19
23
  * Assumes an English plural forms expression.
20
- *
21
- * @type {LocaleData}
22
24
  */
23
25
  const DEFAULT_LOCALE_DATA = {
24
26
  '': {
25
- /** @param {number} n */
26
27
  plural_forms(n) {
27
28
  return n === 1 ? 0 : 1;
28
29
  }
@@ -35,136 +36,18 @@ const DEFAULT_LOCALE_DATA = {
35
36
  */
36
37
  const I18N_HOOK_REGEXP = /^i18n\.(n?gettext|has_translation)(_|$)/;
37
38
 
38
- /**
39
- * @typedef {(domain?: string) => LocaleData} GetLocaleData
40
- *
41
- * Returns locale data by domain in a
42
- * Jed-formatted JSON object shape.
43
- *
44
- * @see http://messageformat.github.io/Jed/
45
- */
46
- /**
47
- * @typedef {(data?: LocaleData, domain?: string) => void} SetLocaleData
48
- *
49
- * Merges locale data into the Tannin instance by domain. Note that this
50
- * function will overwrite the domain configuration. Accepts data in a
51
- * Jed-formatted JSON object shape.
52
- *
53
- * @see http://messageformat.github.io/Jed/
54
- */
55
- /**
56
- * @typedef {(data?: LocaleData, domain?: string) => void} AddLocaleData
57
- *
58
- * Merges locale data into the Tannin instance by domain. Note that this
59
- * function will also merge the domain configuration. Accepts data in a
60
- * Jed-formatted JSON object shape.
61
- *
62
- * @see http://messageformat.github.io/Jed/
63
- */
64
- /**
65
- * @typedef {(data?: LocaleData, domain?: string) => void} ResetLocaleData
66
- *
67
- * Resets all current Tannin instance locale data and sets the specified
68
- * locale data for the domain. Accepts data in a Jed-formatted JSON object shape.
69
- *
70
- * @see http://messageformat.github.io/Jed/
71
- */
72
- /** @typedef {() => void} SubscribeCallback */
73
- /** @typedef {() => void} UnsubscribeCallback */
74
- /**
75
- * @typedef {(callback: SubscribeCallback) => UnsubscribeCallback} Subscribe
76
- *
77
- * Subscribes to changes of locale data
78
- */
79
- /**
80
- * @typedef {(domain?: string) => string} GetFilterDomain
81
- * Retrieve the domain to use when calling domain-specific filters.
82
- */
83
- /**
84
- * @typedef {<Text extends string>(text: Text, domain?: string) => import('./types').TranslatableText< Text >} __
85
- *
86
- * Retrieve the translation of text.
87
- *
88
- * @see https://developer.wordpress.org/reference/functions/__/
89
- */
90
- /**
91
- * @typedef {<Text extends string>(text: Text, context: string, domain?: string) => import('./types').TranslatableText< Text >} _x
92
- *
93
- * Retrieve translated string with gettext context.
94
- *
95
- * @see https://developer.wordpress.org/reference/functions/_x/
96
- */
97
- /**
98
- * @typedef {<Single extends string, Plural extends string>(single: Single, plural: Plural, number: number, domain?: string) => import('./types').TranslatableText< Single | Plural >} _n
99
- *
100
- * Translates and retrieves the singular or plural form based on the supplied
101
- * number.
102
- *
103
- * @see https://developer.wordpress.org/reference/functions/_n/
104
- */
105
- /**
106
- * @typedef {<Single extends string, Plural extends string>(single: Single, plural: Plural, number: number, context: string, domain?: string) => import('./types').TranslatableText< Single | Plural >} _nx
107
- *
108
- * Translates and retrieves the singular or plural form based on the supplied
109
- * number, with gettext context.
110
- *
111
- * @see https://developer.wordpress.org/reference/functions/_nx/
112
- */
113
- /**
114
- * @typedef {() => boolean} IsRtl
115
- *
116
- * Check if current locale is RTL.
117
- *
118
- * **RTL (Right To Left)** is a locale property indicating that text is written from right to left.
119
- * For example, the `he` locale (for Hebrew) specifies right-to-left. Arabic (ar) is another common
120
- * language written RTL. The opposite of RTL, LTR (Left To Right) is used in other languages,
121
- * including English (`en`, `en-US`, `en-GB`, etc.), Spanish (`es`), and French (`fr`).
122
- */
123
- /**
124
- * @typedef {(single: string, context?: string, domain?: string) => boolean} HasTranslation
125
- *
126
- * Check if there is a translation for a given string in singular form.
127
- */
128
- /** @typedef {import('@wordpress/hooks').Hooks} Hooks */
129
-
130
- /**
131
- * An i18n instance
132
- *
133
- * @typedef I18n
134
- * @property {GetLocaleData} getLocaleData Returns locale data by domain in a Jed-formatted JSON object shape.
135
- * @property {SetLocaleData} setLocaleData Merges locale data into the Tannin instance by domain. Note that this
136
- * function will overwrite the domain configuration. Accepts data in a
137
- * Jed-formatted JSON object shape.
138
- * @property {AddLocaleData} addLocaleData Merges locale data into the Tannin instance by domain. Note that this
139
- * function will also merge the domain configuration. Accepts data in a
140
- * Jed-formatted JSON object shape.
141
- * @property {ResetLocaleData} resetLocaleData Resets all current Tannin instance locale data and sets the specified
142
- * locale data for the domain. Accepts data in a Jed-formatted JSON object shape.
143
- * @property {Subscribe} subscribe Subscribes to changes of Tannin locale data.
144
- * @property {__} __ Retrieve the translation of text.
145
- * @property {_x} _x Retrieve translated string with gettext context.
146
- * @property {_n} _n Translates and retrieves the singular or plural form based on the supplied
147
- * number.
148
- * @property {_nx} _nx Translates and retrieves the singular or plural form based on the supplied
149
- * number, with gettext context.
150
- * @property {IsRtl} isRTL Check if current locale is RTL.
151
- * @property {HasTranslation} hasTranslation Check if there is a translation for a given string.
152
- */
153
-
154
39
  /**
155
40
  * Create an i18n instance
156
41
  *
157
- * @param {LocaleData} [initialData] Locale data configuration.
158
- * @param {string} [initialDomain] Domain for which configuration applies.
159
- * @param {Hooks} [hooks] Hooks implementation.
42
+ * @param [initialData] Locale data configuration.
43
+ * @param [initialDomain] Domain for which configuration applies.
44
+ * @param [hooks] Hooks implementation.
160
45
  *
161
- * @return {I18n} I18n instance.
46
+ * @return I18n instance.
162
47
  */
163
48
  const createI18n = (initialData, initialDomain, hooks) => {
164
49
  /**
165
50
  * The underlying instance of Tannin to which exported functions interface.
166
- *
167
- * @type {Tannin}
168
51
  */
169
52
  const tannin = new _tannin.default({});
170
53
  const listeners = new Set();
@@ -175,20 +58,18 @@ const createI18n = (initialData, initialDomain, hooks) => {
175
58
  /**
176
59
  * Subscribe to changes of locale data.
177
60
  *
178
- * @param {SubscribeCallback} callback Subscription callback.
179
- * @return {UnsubscribeCallback} Unsubscribe callback.
61
+ * @param callback Subscription callback.
62
+ * @return Unsubscribe callback.
180
63
  */
181
64
  const subscribe = callback => {
182
65
  listeners.add(callback);
183
66
  return () => listeners.delete(callback);
184
67
  };
185
-
186
- /** @type {GetLocaleData} */
187
68
  const getLocaleData = (domain = 'default') => tannin.data[domain];
188
69
 
189
70
  /**
190
- * @param {LocaleData} [data]
191
- * @param {string} [domain]
71
+ * @param [data]
72
+ * @param [domain]
192
73
  */
193
74
  const doSetLocaleData = (data, domain = 'default') => {
194
75
  tannin.data[domain] = {
@@ -206,14 +87,10 @@ const createI18n = (initialData, initialDomain, hooks) => {
206
87
  // Clean up cached plural forms functions cache as it might be updated.
207
88
  delete tannin.pluralForms[domain];
208
89
  };
209
-
210
- /** @type {SetLocaleData} */
211
90
  const setLocaleData = (data, domain) => {
212
91
  doSetLocaleData(data, domain);
213
92
  notifyListeners();
214
93
  };
215
-
216
- /** @type {AddLocaleData} */
217
94
  const addLocaleData = (data, domain = 'default') => {
218
95
  tannin.data[domain] = {
219
96
  ...tannin.data[domain],
@@ -231,8 +108,6 @@ const createI18n = (initialData, initialDomain, hooks) => {
231
108
  delete tannin.pluralForms[domain];
232
109
  notifyListeners();
233
110
  };
234
-
235
- /** @type {ResetLocaleData} */
236
111
  const resetLocaleData = (data, domain) => {
237
112
  // Reset all current Tannin locale data.
238
113
  tannin.data = {};
@@ -246,16 +121,16 @@ const createI18n = (initialData, initialDomain, hooks) => {
246
121
  * Wrapper for Tannin's `dcnpgettext`. Populates default locale data if not
247
122
  * otherwise previously assigned.
248
123
  *
249
- * @param {string|undefined} domain Domain to retrieve the translated text.
250
- * @param {string|undefined} context Context information for the translators.
251
- * @param {string} single Text to translate if non-plural. Used as
252
- * fallback return value on a caught error.
253
- * @param {string} [plural] The text to be used if the number is
254
- * plural.
255
- * @param {number} [number] The number to compare against to use
256
- * either the singular or plural form.
124
+ * @param domain Domain to retrieve the translated text.
125
+ * @param context Context information for the translators.
126
+ * @param single Text to translate if non-plural. Used as
127
+ * fallback return value on a caught error.
128
+ * @param [plural] The text to be used if the number is
129
+ * plural.
130
+ * @param [number] The number to compare against to use
131
+ * either the singular or plural form.
257
132
  *
258
- * @return {string} The translated string.
133
+ * @return The translated string.
259
134
  */
260
135
  const dcnpgettext = (domain = 'default', context, single, plural, number) => {
261
136
  if (!tannin.data[domain]) {
@@ -264,98 +139,80 @@ const createI18n = (initialData, initialDomain, hooks) => {
264
139
  }
265
140
  return tannin.dcnpgettext(domain, context, single, plural, number);
266
141
  };
267
-
268
- /** @type {GetFilterDomain} */
269
- const getFilterDomain = (domain = 'default') => domain;
270
-
271
- /** @type {__} */
142
+ const getFilterDomain = domain => domain || 'default';
272
143
  const __ = (text, domain) => {
273
144
  let translation = dcnpgettext(domain, undefined, text);
274
145
  if (!hooks) {
275
- return /** @type {import('./types').TranslatableText<typeof text>} */translation;
146
+ return translation;
276
147
  }
277
148
 
278
149
  /**
279
150
  * Filters text with its translation.
280
151
  *
281
- * @param {string} translation Translated text.
282
- * @param {string} text Text to translate.
283
- * @param {string} domain Text domain. Unique identifier for retrieving translated strings.
152
+ * @param translation Translated text.
153
+ * @param text Text to translate.
154
+ * @param domain Text domain. Unique identifier for retrieving translated strings.
284
155
  */
285
- translation = /** @type {string} */
286
- /** @type {*} */hooks.applyFilters('i18n.gettext', translation, text, domain);
287
- return /** @type {import('./types').TranslatableText<typeof text>} */ /** @type {*} */hooks.applyFilters('i18n.gettext_' + getFilterDomain(domain), translation, text, domain);
156
+ translation = hooks.applyFilters('i18n.gettext', translation, text, domain);
157
+ return hooks.applyFilters('i18n.gettext_' + getFilterDomain(domain), translation, text, domain);
288
158
  };
289
-
290
- /** @type {_x} */
291
159
  const _x = (text, context, domain) => {
292
160
  let translation = dcnpgettext(domain, context, text);
293
161
  if (!hooks) {
294
- return /** @type {import('./types').TranslatableText<typeof text>} */translation;
162
+ return translation;
295
163
  }
296
164
 
297
165
  /**
298
166
  * Filters text with its translation based on context information.
299
167
  *
300
- * @param {string} translation Translated text.
301
- * @param {string} text Text to translate.
302
- * @param {string} context Context information for the translators.
303
- * @param {string} domain Text domain. Unique identifier for retrieving translated strings.
168
+ * @param translation Translated text.
169
+ * @param text Text to translate.
170
+ * @param context Context information for the translators.
171
+ * @param domain Text domain. Unique identifier for retrieving translated strings.
304
172
  */
305
- translation = /** @type {string} */
306
- /** @type {*} */hooks.applyFilters('i18n.gettext_with_context', translation, text, context, domain);
307
- return /** @type {import('./types').TranslatableText<typeof text>} */ /** @type {*} */hooks.applyFilters('i18n.gettext_with_context_' + getFilterDomain(domain), translation, text, context, domain);
173
+ translation = hooks.applyFilters('i18n.gettext_with_context', translation, text, context, domain);
174
+ return hooks.applyFilters('i18n.gettext_with_context_' + getFilterDomain(domain), translation, text, context, domain);
308
175
  };
309
-
310
- /** @type {_n} */
311
176
  const _n = (single, plural, number, domain) => {
312
177
  let translation = dcnpgettext(domain, undefined, single, plural, number);
313
178
  if (!hooks) {
314
- return /** @type {import('./types').TranslatableText<typeof single | typeof plural>} */translation;
179
+ return translation;
315
180
  }
316
181
 
317
182
  /**
318
183
  * Filters the singular or plural form of a string.
319
184
  *
320
- * @param {string} translation Translated text.
321
- * @param {string} single The text to be used if the number is singular.
322
- * @param {string} plural The text to be used if the number is plural.
323
- * @param {string} number The number to compare against to use either the singular or plural form.
324
- * @param {string} domain Text domain. Unique identifier for retrieving translated strings.
185
+ * @param translation Translated text.
186
+ * @param single The text to be used if the number is singular.
187
+ * @param plural The text to be used if the number is plural.
188
+ * @param number The number to compare against to use either the singular or plural form.
189
+ * @param domain Text domain. Unique identifier for retrieving translated strings.
325
190
  */
326
- translation = /** @type {string} */
327
- /** @type {*} */hooks.applyFilters('i18n.ngettext', translation, single, plural, number, domain);
328
- return /** @type {import('./types').TranslatableText<typeof single | typeof plural>} */ /** @type {*} */hooks.applyFilters('i18n.ngettext_' + getFilterDomain(domain), translation, single, plural, number, domain);
191
+ translation = hooks.applyFilters('i18n.ngettext', translation, single, plural, number, domain);
192
+ return hooks.applyFilters('i18n.ngettext_' + getFilterDomain(domain), translation, single, plural, number, domain);
329
193
  };
330
-
331
- /** @type {_nx} */
332
194
  const _nx = (single, plural, number, context, domain) => {
333
195
  let translation = dcnpgettext(domain, context, single, plural, number);
334
196
  if (!hooks) {
335
- return /** @type {import('./types').TranslatableText<typeof single | typeof plural>} */translation;
197
+ return translation;
336
198
  }
337
199
 
338
200
  /**
339
201
  * Filters the singular or plural form of a string with gettext context.
340
202
  *
341
- * @param {string} translation Translated text.
342
- * @param {string} single The text to be used if the number is singular.
343
- * @param {string} plural The text to be used if the number is plural.
344
- * @param {string} number The number to compare against to use either the singular or plural form.
345
- * @param {string} context Context information for the translators.
346
- * @param {string} domain Text domain. Unique identifier for retrieving translated strings.
203
+ * @param translation Translated text.
204
+ * @param single The text to be used if the number is singular.
205
+ * @param plural The text to be used if the number is plural.
206
+ * @param number The number to compare against to use either the singular or plural form.
207
+ * @param context Context information for the translators.
208
+ * @param domain Text domain. Unique identifier for retrieving translated strings.
347
209
  */
348
- translation = /** @type {string} */
349
- /** @type {*} */hooks.applyFilters('i18n.ngettext_with_context', translation, single, plural, number, context, domain);
350
- return /** @type {import('./types').TranslatableText<typeof single | typeof plural>} */ /** @type {*} */hooks.applyFilters('i18n.ngettext_with_context_' + getFilterDomain(domain), translation, single, plural, number, context, domain);
210
+ translation = hooks.applyFilters('i18n.ngettext_with_context', translation, single, plural, number, context, domain);
211
+ return hooks.applyFilters('i18n.ngettext_with_context_' + getFilterDomain(domain), translation, single, plural, number, context, domain);
351
212
  };
352
-
353
- /** @type {IsRtl} */
354
213
  const isRTL = () => {
355
214
  return 'rtl' === _x('ltr', 'text direction');
356
215
  };
357
-
358
- /** @type {HasTranslation} */
359
216
  const hasTranslation = (single, context, domain) => {
360
217
  const key = context ? context + '\u0004' + single : single;
361
218
  let result = !!tannin.data?.[domain !== null && domain !== void 0 ? domain : 'default']?.[key];
@@ -363,15 +220,13 @@ const createI18n = (initialData, initialDomain, hooks) => {
363
220
  /**
364
221
  * Filters the presence of a translation in the locale data.
365
222
  *
366
- * @param {boolean} hasTranslation Whether the translation is present or not..
367
- * @param {string} single The singular form of the translated text (used as key in locale data)
368
- * @param {string} context Context information for the translators.
369
- * @param {string} domain Text domain. Unique identifier for retrieving translated strings.
223
+ * @param hasTranslation Whether the translation is present or not..
224
+ * @param single The singular form of the translated text (used as key in locale data)
225
+ * @param context Context information for the translators.
226
+ * @param domain Text domain. Unique identifier for retrieving translated strings.
370
227
  */
371
- result = /** @type { boolean } */
372
- /** @type {*} */hooks.applyFilters('i18n.has_translation', result, single, context, domain);
373
- result = /** @type { boolean } */
374
- /** @type {*} */hooks.applyFilters('i18n.has_translation_' + getFilterDomain(domain), result, single, context, domain);
228
+ result = hooks.applyFilters('i18n.has_translation', result, single, context, domain);
229
+ result = hooks.applyFilters('i18n.has_translation_' + getFilterDomain(domain), result, single, context, domain);
375
230
  }
376
231
  return result;
377
232
  };
@@ -380,7 +235,7 @@ const createI18n = (initialData, initialDomain, hooks) => {
380
235
  }
381
236
  if (hooks) {
382
237
  /**
383
- * @param {string} hookName
238
+ * @param hookName
384
239
  */
385
240
  const onHookAddedOrRemoved = hookName => {
386
241
  if (I18N_HOOK_REGEXP.test(hookName)) {
@@ -1 +1 @@
1
- {"version":3,"names":["_tannin","_interopRequireDefault","require","DEFAULT_LOCALE_DATA","plural_forms","n","I18N_HOOK_REGEXP","createI18n","initialData","initialDomain","hooks","tannin","Tannin","listeners","Set","notifyListeners","forEach","listener","subscribe","callback","add","delete","getLocaleData","domain","data","doSetLocaleData","pluralForms","setLocaleData","addLocaleData","resetLocaleData","dcnpgettext","context","single","plural","number","undefined","getFilterDomain","__","text","translation","applyFilters","_x","_n","_nx","isRTL","hasTranslation","key","result","onHookAddedOrRemoved","hookName","test","addAction","exports"],"sources":["@wordpress/i18n/src/create-i18n.js"],"sourcesContent":["/**\n * External dependencies\n */\nimport Tannin from 'tannin';\n\n/**\n * @typedef {Record<string,any>} LocaleData\n */\n\n/**\n * Default locale data to use for Tannin domain when not otherwise provided.\n * Assumes an English plural forms expression.\n *\n * @type {LocaleData}\n */\nconst DEFAULT_LOCALE_DATA = {\n\t'': {\n\t\t/** @param {number} n */\n\t\tplural_forms( n ) {\n\t\t\treturn n === 1 ? 0 : 1;\n\t\t},\n\t},\n};\n\n/*\n * Regular expression that matches i18n hooks like `i18n.gettext`, `i18n.ngettext`,\n * `i18n.gettext_domain` or `i18n.ngettext_with_context` or `i18n.has_translation`.\n */\nconst I18N_HOOK_REGEXP = /^i18n\\.(n?gettext|has_translation)(_|$)/;\n\n/**\n * @typedef {(domain?: string) => LocaleData} GetLocaleData\n *\n * Returns locale data by domain in a\n * Jed-formatted JSON object shape.\n *\n * @see http://messageformat.github.io/Jed/\n */\n/**\n * @typedef {(data?: LocaleData, domain?: string) => void} SetLocaleData\n *\n * Merges locale data into the Tannin instance by domain. Note that this\n * function will overwrite the domain configuration. Accepts data in a\n * Jed-formatted JSON object shape.\n *\n * @see http://messageformat.github.io/Jed/\n */\n/**\n * @typedef {(data?: LocaleData, domain?: string) => void} AddLocaleData\n *\n * Merges locale data into the Tannin instance by domain. Note that this\n * function will also merge the domain configuration. Accepts data in a\n * Jed-formatted JSON object shape.\n *\n * @see http://messageformat.github.io/Jed/\n */\n/**\n * @typedef {(data?: LocaleData, domain?: string) => void} ResetLocaleData\n *\n * Resets all current Tannin instance locale data and sets the specified\n * locale data for the domain. Accepts data in a Jed-formatted JSON object shape.\n *\n * @see http://messageformat.github.io/Jed/\n */\n/** @typedef {() => void} SubscribeCallback */\n/** @typedef {() => void} UnsubscribeCallback */\n/**\n * @typedef {(callback: SubscribeCallback) => UnsubscribeCallback} Subscribe\n *\n * Subscribes to changes of locale data\n */\n/**\n * @typedef {(domain?: string) => string} GetFilterDomain\n * Retrieve the domain to use when calling domain-specific filters.\n */\n/**\n * @typedef {<Text extends string>(text: Text, domain?: string) => import('./types').TranslatableText< Text >} __\n *\n * Retrieve the translation of text.\n *\n * @see https://developer.wordpress.org/reference/functions/__/\n */\n/**\n * @typedef {<Text extends string>(text: Text, context: string, domain?: string) => import('./types').TranslatableText< Text >} _x\n *\n * Retrieve translated string with gettext context.\n *\n * @see https://developer.wordpress.org/reference/functions/_x/\n */\n/**\n * @typedef {<Single extends string, Plural extends string>(single: Single, plural: Plural, number: number, domain?: string) => import('./types').TranslatableText< Single | Plural >} _n\n *\n * Translates and retrieves the singular or plural form based on the supplied\n * number.\n *\n * @see https://developer.wordpress.org/reference/functions/_n/\n */\n/**\n * @typedef {<Single extends string, Plural extends string>(single: Single, plural: Plural, number: number, context: string, domain?: string) => import('./types').TranslatableText< Single | Plural >} _nx\n *\n * Translates and retrieves the singular or plural form based on the supplied\n * number, with gettext context.\n *\n * @see https://developer.wordpress.org/reference/functions/_nx/\n */\n/**\n * @typedef {() => boolean} IsRtl\n *\n * Check if current locale is RTL.\n *\n * **RTL (Right To Left)** is a locale property indicating that text is written from right to left.\n * For example, the `he` locale (for Hebrew) specifies right-to-left. Arabic (ar) is another common\n * language written RTL. The opposite of RTL, LTR (Left To Right) is used in other languages,\n * including English (`en`, `en-US`, `en-GB`, etc.), Spanish (`es`), and French (`fr`).\n */\n/**\n * @typedef {(single: string, context?: string, domain?: string) => boolean} HasTranslation\n *\n * Check if there is a translation for a given string in singular form.\n */\n/** @typedef {import('@wordpress/hooks').Hooks} Hooks */\n\n/**\n * An i18n instance\n *\n * @typedef I18n\n * @property {GetLocaleData} getLocaleData Returns locale data by domain in a Jed-formatted JSON object shape.\n * @property {SetLocaleData} setLocaleData Merges locale data into the Tannin instance by domain. Note that this\n * function will overwrite the domain configuration. Accepts data in a\n * Jed-formatted JSON object shape.\n * @property {AddLocaleData} addLocaleData Merges locale data into the Tannin instance by domain. Note that this\n * function will also merge the domain configuration. Accepts data in a\n * Jed-formatted JSON object shape.\n * @property {ResetLocaleData} resetLocaleData Resets all current Tannin instance locale data and sets the specified\n * locale data for the domain. Accepts data in a Jed-formatted JSON object shape.\n * @property {Subscribe} subscribe Subscribes to changes of Tannin locale data.\n * @property {__} __ Retrieve the translation of text.\n * @property {_x} _x Retrieve translated string with gettext context.\n * @property {_n} _n Translates and retrieves the singular or plural form based on the supplied\n * number.\n * @property {_nx} _nx Translates and retrieves the singular or plural form based on the supplied\n * number, with gettext context.\n * @property {IsRtl} isRTL Check if current locale is RTL.\n * @property {HasTranslation} hasTranslation Check if there is a translation for a given string.\n */\n\n/**\n * Create an i18n instance\n *\n * @param {LocaleData} [initialData] Locale data configuration.\n * @param {string} [initialDomain] Domain for which configuration applies.\n * @param {Hooks} [hooks] Hooks implementation.\n *\n * @return {I18n} I18n instance.\n */\nexport const createI18n = ( initialData, initialDomain, hooks ) => {\n\t/**\n\t * The underlying instance of Tannin to which exported functions interface.\n\t *\n\t * @type {Tannin}\n\t */\n\tconst tannin = new Tannin( {} );\n\n\tconst listeners = new Set();\n\n\tconst notifyListeners = () => {\n\t\tlisteners.forEach( ( listener ) => listener() );\n\t};\n\n\t/**\n\t * Subscribe to changes of locale data.\n\t *\n\t * @param {SubscribeCallback} callback Subscription callback.\n\t * @return {UnsubscribeCallback} Unsubscribe callback.\n\t */\n\tconst subscribe = ( callback ) => {\n\t\tlisteners.add( callback );\n\t\treturn () => listeners.delete( callback );\n\t};\n\n\t/** @type {GetLocaleData} */\n\tconst getLocaleData = ( domain = 'default' ) => tannin.data[ domain ];\n\n\t/**\n\t * @param {LocaleData} [data]\n\t * @param {string} [domain]\n\t */\n\tconst doSetLocaleData = ( data, domain = 'default' ) => {\n\t\ttannin.data[ domain ] = {\n\t\t\t...tannin.data[ domain ],\n\t\t\t...data,\n\t\t};\n\n\t\t// Populate default domain configuration (supported locale date which omits\n\t\t// a plural forms expression).\n\t\ttannin.data[ domain ][ '' ] = {\n\t\t\t...DEFAULT_LOCALE_DATA[ '' ],\n\t\t\t...tannin.data[ domain ]?.[ '' ],\n\t\t};\n\n\t\t// Clean up cached plural forms functions cache as it might be updated.\n\t\tdelete tannin.pluralForms[ domain ];\n\t};\n\n\t/** @type {SetLocaleData} */\n\tconst setLocaleData = ( data, domain ) => {\n\t\tdoSetLocaleData( data, domain );\n\t\tnotifyListeners();\n\t};\n\n\t/** @type {AddLocaleData} */\n\tconst addLocaleData = ( data, domain = 'default' ) => {\n\t\ttannin.data[ domain ] = {\n\t\t\t...tannin.data[ domain ],\n\t\t\t...data,\n\t\t\t// Populate default domain configuration (supported locale date which omits\n\t\t\t// a plural forms expression).\n\t\t\t'': {\n\t\t\t\t...DEFAULT_LOCALE_DATA[ '' ],\n\t\t\t\t...tannin.data[ domain ]?.[ '' ],\n\t\t\t\t...data?.[ '' ],\n\t\t\t},\n\t\t};\n\n\t\t// Clean up cached plural forms functions cache as it might be updated.\n\t\tdelete tannin.pluralForms[ domain ];\n\n\t\tnotifyListeners();\n\t};\n\n\t/** @type {ResetLocaleData} */\n\tconst resetLocaleData = ( data, domain ) => {\n\t\t// Reset all current Tannin locale data.\n\t\ttannin.data = {};\n\n\t\t// Reset cached plural forms functions cache.\n\t\ttannin.pluralForms = {};\n\n\t\tsetLocaleData( data, domain );\n\t};\n\n\t/**\n\t * Wrapper for Tannin's `dcnpgettext`. Populates default locale data if not\n\t * otherwise previously assigned.\n\t *\n\t * @param {string|undefined} domain Domain to retrieve the translated text.\n\t * @param {string|undefined} context Context information for the translators.\n\t * @param {string} single Text to translate if non-plural. Used as\n\t * fallback return value on a caught error.\n\t * @param {string} [plural] The text to be used if the number is\n\t * plural.\n\t * @param {number} [number] The number to compare against to use\n\t * either the singular or plural form.\n\t *\n\t * @return {string} The translated string.\n\t */\n\tconst dcnpgettext = (\n\t\tdomain = 'default',\n\t\tcontext,\n\t\tsingle,\n\t\tplural,\n\t\tnumber\n\t) => {\n\t\tif ( ! tannin.data[ domain ] ) {\n\t\t\t// Use `doSetLocaleData` to set silently, without notifying listeners.\n\t\t\tdoSetLocaleData( undefined, domain );\n\t\t}\n\n\t\treturn tannin.dcnpgettext( domain, context, single, plural, number );\n\t};\n\n\t/** @type {GetFilterDomain} */\n\tconst getFilterDomain = ( domain = 'default' ) => domain;\n\n\t/** @type {__} */\n\tconst __ = ( text, domain ) => {\n\t\tlet translation = dcnpgettext( domain, undefined, text );\n\t\tif ( ! hooks ) {\n\t\t\treturn /** @type {import('./types').TranslatableText<typeof text>} */ (\n\t\t\t\ttranslation\n\t\t\t);\n\t\t}\n\n\t\t/**\n\t\t * Filters text with its translation.\n\t\t *\n\t\t * @param {string} translation Translated text.\n\t\t * @param {string} text Text to translate.\n\t\t * @param {string} domain Text domain. Unique identifier for retrieving translated strings.\n\t\t */\n\t\ttranslation = /** @type {string} */ (\n\t\t\t/** @type {*} */ hooks.applyFilters(\n\t\t\t\t'i18n.gettext',\n\t\t\t\ttranslation,\n\t\t\t\ttext,\n\t\t\t\tdomain\n\t\t\t)\n\t\t);\n\t\treturn /** @type {import('./types').TranslatableText<typeof text>} */ (\n\t\t\t/** @type {*} */ hooks.applyFilters(\n\t\t\t\t'i18n.gettext_' + getFilterDomain( domain ),\n\t\t\t\ttranslation,\n\t\t\t\ttext,\n\t\t\t\tdomain\n\t\t\t)\n\t\t);\n\t};\n\n\t/** @type {_x} */\n\tconst _x = ( text, context, domain ) => {\n\t\tlet translation = dcnpgettext( domain, context, text );\n\t\tif ( ! hooks ) {\n\t\t\treturn /** @type {import('./types').TranslatableText<typeof text>} */ (\n\t\t\t\ttranslation\n\t\t\t);\n\t\t}\n\n\t\t/**\n\t\t * Filters text with its translation based on context information.\n\t\t *\n\t\t * @param {string} translation Translated text.\n\t\t * @param {string} text Text to translate.\n\t\t * @param {string} context Context information for the translators.\n\t\t * @param {string} domain Text domain. Unique identifier for retrieving translated strings.\n\t\t */\n\t\ttranslation = /** @type {string} */ (\n\t\t\t/** @type {*} */ hooks.applyFilters(\n\t\t\t\t'i18n.gettext_with_context',\n\t\t\t\ttranslation,\n\t\t\t\ttext,\n\t\t\t\tcontext,\n\t\t\t\tdomain\n\t\t\t)\n\t\t);\n\t\treturn /** @type {import('./types').TranslatableText<typeof text>} */ (\n\t\t\t/** @type {*} */ hooks.applyFilters(\n\t\t\t\t'i18n.gettext_with_context_' + getFilterDomain( domain ),\n\t\t\t\ttranslation,\n\t\t\t\ttext,\n\t\t\t\tcontext,\n\t\t\t\tdomain\n\t\t\t)\n\t\t);\n\t};\n\n\t/** @type {_n} */\n\tconst _n = ( single, plural, number, domain ) => {\n\t\tlet translation = dcnpgettext(\n\t\t\tdomain,\n\t\t\tundefined,\n\t\t\tsingle,\n\t\t\tplural,\n\t\t\tnumber\n\t\t);\n\t\tif ( ! hooks ) {\n\t\t\treturn /** @type {import('./types').TranslatableText<typeof single | typeof plural>} */ (\n\t\t\t\ttranslation\n\t\t\t);\n\t\t}\n\n\t\t/**\n\t\t * Filters the singular or plural form of a string.\n\t\t *\n\t\t * @param {string} translation Translated text.\n\t\t * @param {string} single The text to be used if the number is singular.\n\t\t * @param {string} plural The text to be used if the number is plural.\n\t\t * @param {string} number The number to compare against to use either the singular or plural form.\n\t\t * @param {string} domain Text domain. Unique identifier for retrieving translated strings.\n\t\t */\n\t\ttranslation = /** @type {string} */ (\n\t\t\t/** @type {*} */ hooks.applyFilters(\n\t\t\t\t'i18n.ngettext',\n\t\t\t\ttranslation,\n\t\t\t\tsingle,\n\t\t\t\tplural,\n\t\t\t\tnumber,\n\t\t\t\tdomain\n\t\t\t)\n\t\t);\n\t\treturn /** @type {import('./types').TranslatableText<typeof single | typeof plural>} */ (\n\t\t\t/** @type {*} */ hooks.applyFilters(\n\t\t\t\t'i18n.ngettext_' + getFilterDomain( domain ),\n\t\t\t\ttranslation,\n\t\t\t\tsingle,\n\t\t\t\tplural,\n\t\t\t\tnumber,\n\t\t\t\tdomain\n\t\t\t)\n\t\t);\n\t};\n\n\t/** @type {_nx} */\n\tconst _nx = ( single, plural, number, context, domain ) => {\n\t\tlet translation = dcnpgettext(\n\t\t\tdomain,\n\t\t\tcontext,\n\t\t\tsingle,\n\t\t\tplural,\n\t\t\tnumber\n\t\t);\n\t\tif ( ! hooks ) {\n\t\t\treturn /** @type {import('./types').TranslatableText<typeof single | typeof plural>} */ (\n\t\t\t\ttranslation\n\t\t\t);\n\t\t}\n\n\t\t/**\n\t\t * Filters the singular or plural form of a string with gettext context.\n\t\t *\n\t\t * @param {string} translation Translated text.\n\t\t * @param {string} single The text to be used if the number is singular.\n\t\t * @param {string} plural The text to be used if the number is plural.\n\t\t * @param {string} number The number to compare against to use either the singular or plural form.\n\t\t * @param {string} context Context information for the translators.\n\t\t * @param {string} domain Text domain. Unique identifier for retrieving translated strings.\n\t\t */\n\t\ttranslation = /** @type {string} */ (\n\t\t\t/** @type {*} */ hooks.applyFilters(\n\t\t\t\t'i18n.ngettext_with_context',\n\t\t\t\ttranslation,\n\t\t\t\tsingle,\n\t\t\t\tplural,\n\t\t\t\tnumber,\n\t\t\t\tcontext,\n\t\t\t\tdomain\n\t\t\t)\n\t\t);\n\n\t\treturn /** @type {import('./types').TranslatableText<typeof single | typeof plural>} */ (\n\t\t\t/** @type {*} */ hooks.applyFilters(\n\t\t\t\t'i18n.ngettext_with_context_' + getFilterDomain( domain ),\n\t\t\t\ttranslation,\n\t\t\t\tsingle,\n\t\t\t\tplural,\n\t\t\t\tnumber,\n\t\t\t\tcontext,\n\t\t\t\tdomain\n\t\t\t)\n\t\t);\n\t};\n\n\t/** @type {IsRtl} */\n\tconst isRTL = () => {\n\t\treturn 'rtl' === _x( 'ltr', 'text direction' );\n\t};\n\n\t/** @type {HasTranslation} */\n\tconst hasTranslation = ( single, context, domain ) => {\n\t\tconst key = context ? context + '\\u0004' + single : single;\n\t\tlet result = !! tannin.data?.[ domain ?? 'default' ]?.[ key ];\n\t\tif ( hooks ) {\n\t\t\t/**\n\t\t\t * Filters the presence of a translation in the locale data.\n\t\t\t *\n\t\t\t * @param {boolean} hasTranslation Whether the translation is present or not..\n\t\t\t * @param {string} single The singular form of the translated text (used as key in locale data)\n\t\t\t * @param {string} context Context information for the translators.\n\t\t\t * @param {string} domain Text domain. Unique identifier for retrieving translated strings.\n\t\t\t */\n\t\t\tresult = /** @type { boolean } */ (\n\t\t\t\t/** @type {*} */ hooks.applyFilters(\n\t\t\t\t\t'i18n.has_translation',\n\t\t\t\t\tresult,\n\t\t\t\t\tsingle,\n\t\t\t\t\tcontext,\n\t\t\t\t\tdomain\n\t\t\t\t)\n\t\t\t);\n\n\t\t\tresult = /** @type { boolean } */ (\n\t\t\t\t/** @type {*} */ hooks.applyFilters(\n\t\t\t\t\t'i18n.has_translation_' + getFilterDomain( domain ),\n\t\t\t\t\tresult,\n\t\t\t\t\tsingle,\n\t\t\t\t\tcontext,\n\t\t\t\t\tdomain\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\t\treturn result;\n\t};\n\n\tif ( initialData ) {\n\t\tsetLocaleData( initialData, initialDomain );\n\t}\n\n\tif ( hooks ) {\n\t\t/**\n\t\t * @param {string} hookName\n\t\t */\n\t\tconst onHookAddedOrRemoved = ( hookName ) => {\n\t\t\tif ( I18N_HOOK_REGEXP.test( hookName ) ) {\n\t\t\t\tnotifyListeners();\n\t\t\t}\n\t\t};\n\n\t\thooks.addAction( 'hookAdded', 'core/i18n', onHookAddedOrRemoved );\n\t\thooks.addAction( 'hookRemoved', 'core/i18n', onHookAddedOrRemoved );\n\t}\n\n\treturn {\n\t\tgetLocaleData,\n\t\tsetLocaleData,\n\t\taddLocaleData,\n\t\tresetLocaleData,\n\t\tsubscribe,\n\t\t__,\n\t\t_x,\n\t\t_n,\n\t\t_nx,\n\t\tisRTL,\n\t\thasTranslation,\n\t};\n};\n"],"mappings":";;;;;;;AAGA,IAAAA,OAAA,GAAAC,sBAAA,CAAAC,OAAA;AAHA;AACA;AACA;;AAGA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAMC,mBAAmB,GAAG;EAC3B,EAAE,EAAE;IACH;IACAC,YAAYA,CAAEC,CAAC,EAAG;MACjB,OAAOA,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;IACvB;EACD;AACD,CAAC;;AAED;AACA;AACA;AACA;AACA,MAAMC,gBAAgB,GAAG,yCAAyC;;AAElE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAMC,UAAU,GAAGA,CAAEC,WAAW,EAAEC,aAAa,EAAEC,KAAK,KAAM;EAClE;AACD;AACA;AACA;AACA;EACC,MAAMC,MAAM,GAAG,IAAIC,eAAM,CAAE,CAAC,CAAE,CAAC;EAE/B,MAAMC,SAAS,GAAG,IAAIC,GAAG,CAAC,CAAC;EAE3B,MAAMC,eAAe,GAAGA,CAAA,KAAM;IAC7BF,SAAS,CAACG,OAAO,CAAIC,QAAQ,IAAMA,QAAQ,CAAC,CAAE,CAAC;EAChD,CA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","ignoreList":[]}
1
+ {"version":3,"names":["_tannin","_interopRequireDefault","require","DEFAULT_LOCALE_DATA","plural_forms","n","I18N_HOOK_REGEXP","createI18n","initialData","initialDomain","hooks","tannin","Tannin","listeners","Set","notifyListeners","forEach","listener","subscribe","callback","add","delete","getLocaleData","domain","data","doSetLocaleData","pluralForms","setLocaleData","addLocaleData","resetLocaleData","dcnpgettext","context","single","plural","number","undefined","getFilterDomain","__","text","translation","applyFilters","_x","_n","_nx","isRTL","hasTranslation","key","result","onHookAddedOrRemoved","hookName","test","addAction","exports"],"sources":["@wordpress/i18n/src/create-i18n.ts"],"sourcesContent":["/**\n * External dependencies\n */\nimport type { TanninLocaleDomain } from 'tannin';\nimport Tannin from 'tannin';\n/**\n * Internal dependencies\n */\nimport type {\n\tgetFilterDomain,\n\tI18n,\n\tLocaleData,\n\tSubscribeCallback,\n\tTranslatableText,\n\tUnsubscribeCallback,\n} from './types';\n/**\n * WordPress dependencies\n */\nimport type { Hooks } from '@wordpress/hooks';\n/**\n * Default locale data to use for Tannin domain when not otherwise provided.\n * Assumes an English plural forms expression.\n */\nconst DEFAULT_LOCALE_DATA: LocaleData = {\n\t'': {\n\t\tplural_forms( n: number ) {\n\t\t\treturn n === 1 ? 0 : 1;\n\t\t},\n\t},\n};\n\n/*\n * Regular expression that matches i18n hooks like `i18n.gettext`, `i18n.ngettext`,\n * `i18n.gettext_domain` or `i18n.ngettext_with_context` or `i18n.has_translation`.\n */\nconst I18N_HOOK_REGEXP = /^i18n\\.(n?gettext|has_translation)(_|$)/;\n\n/**\n * Create an i18n instance\n *\n * @param [initialData] Locale data configuration.\n * @param [initialDomain] Domain for which configuration applies.\n * @param [hooks] Hooks implementation.\n *\n * @return I18n instance.\n */\nexport const createI18n = < TextDomain extends string >(\n\tinitialData?: LocaleData< TextDomain >,\n\tinitialDomain?: TextDomain,\n\thooks?: Hooks\n): I18n< TextDomain > => {\n\t/**\n\t * The underlying instance of Tannin to which exported functions interface.\n\t */\n\tconst tannin = new Tannin( {} );\n\n\tconst listeners = new Set< () => void >();\n\n\tconst notifyListeners = () => {\n\t\tlisteners.forEach( ( listener ) => listener() );\n\t};\n\n\t/**\n\t * Subscribe to changes of locale data.\n\t *\n\t * @param callback Subscription callback.\n\t * @return Unsubscribe callback.\n\t */\n\tconst subscribe = ( callback: SubscribeCallback ): UnsubscribeCallback => {\n\t\tlisteners.add( callback );\n\t\treturn () => listeners.delete( callback );\n\t};\n\n\tconst getLocaleData: I18n< TextDomain >[ 'getLocaleData' ] = (\n\t\tdomain = 'default' as TextDomain\n\t) => tannin.data[ domain ] as LocaleData< TextDomain >;\n\n\t/**\n\t * @param [data]\n\t * @param [domain]\n\t */\n\tconst doSetLocaleData = (\n\t\tdata?: LocaleData,\n\t\tdomain: TextDomain = 'default' as TextDomain\n\t) => {\n\t\ttannin.data[ domain ] = {\n\t\t\t...tannin.data[ domain ],\n\t\t\t...data,\n\t\t} as TanninLocaleDomain;\n\n\t\t// Populate default domain configuration (supported locale date which omits\n\t\t// a plural forms expression).\n\t\ttannin.data[ domain ][ '' ] = {\n\t\t\t...DEFAULT_LOCALE_DATA[ '' ],\n\t\t\t...tannin.data[ domain ]?.[ '' ],\n\t\t};\n\n\t\t// Clean up cached plural forms functions cache as it might be updated.\n\t\tdelete tannin.pluralForms[ domain ];\n\t};\n\n\tconst setLocaleData: I18n< TextDomain >[ 'setLocaleData' ] = (\n\t\tdata,\n\t\tdomain\n\t) => {\n\t\tdoSetLocaleData( data, domain );\n\t\tnotifyListeners();\n\t};\n\n\tconst addLocaleData: I18n< TextDomain >[ 'addLocaleData' ] = (\n\t\tdata,\n\t\tdomain = 'default' as TextDomain\n\t) => {\n\t\ttannin.data[ domain ] = {\n\t\t\t...tannin.data[ domain ],\n\t\t\t...data,\n\t\t\t// Populate default domain configuration (supported locale date which omits\n\t\t\t// a plural forms expression).\n\t\t\t'': {\n\t\t\t\t...DEFAULT_LOCALE_DATA[ '' ],\n\t\t\t\t...tannin.data[ domain ]?.[ '' ],\n\t\t\t\t...data?.[ '' ],\n\t\t\t},\n\t\t} as TanninLocaleDomain;\n\n\t\t// Clean up cached plural forms functions cache as it might be updated.\n\t\tdelete tannin.pluralForms[ domain ];\n\n\t\tnotifyListeners();\n\t};\n\n\tconst resetLocaleData: I18n< TextDomain >[ 'resetLocaleData' ] = (\n\t\tdata,\n\t\tdomain\n\t) => {\n\t\t// Reset all current Tannin locale data.\n\t\ttannin.data = {};\n\n\t\t// Reset cached plural forms functions cache.\n\t\ttannin.pluralForms = {};\n\n\t\tsetLocaleData( data, domain );\n\t};\n\n\t/**\n\t * Wrapper for Tannin's `dcnpgettext`. Populates default locale data if not\n\t * otherwise previously assigned.\n\t *\n\t * @param domain Domain to retrieve the translated text.\n\t * @param context Context information for the translators.\n\t * @param single Text to translate if non-plural. Used as\n\t * fallback return value on a caught error.\n\t * @param [plural] The text to be used if the number is\n\t * plural.\n\t * @param [number] The number to compare against to use\n\t * either the singular or plural form.\n\t *\n\t * @return The translated string.\n\t */\n\tconst dcnpgettext = (\n\t\tdomain = 'default' as TextDomain,\n\t\tcontext: string | void,\n\t\tsingle: string,\n\t\tplural?: string,\n\t\tnumber?: number\n\t): string => {\n\t\tif ( ! tannin.data[ domain ] ) {\n\t\t\t// Use `doSetLocaleData` to set silently, without notifying listeners.\n\t\t\tdoSetLocaleData( undefined, domain );\n\t\t}\n\n\t\treturn tannin.dcnpgettext( domain, context, single, plural, number );\n\t};\n\n\tconst getFilterDomain: getFilterDomain = ( domain ) => domain || 'default';\n\n\tconst __: I18n< TextDomain >[ '__' ] = ( text, domain ) => {\n\t\tlet translation = dcnpgettext( domain, undefined, text );\n\t\tif ( ! hooks ) {\n\t\t\treturn translation as TranslatableText< typeof text >;\n\t\t}\n\n\t\t/**\n\t\t * Filters text with its translation.\n\t\t *\n\t\t * @param translation Translated text.\n\t\t * @param text Text to translate.\n\t\t * @param domain Text domain. Unique identifier for retrieving translated strings.\n\t\t */\n\t\ttranslation = hooks.applyFilters(\n\t\t\t'i18n.gettext',\n\t\t\ttranslation,\n\t\t\ttext,\n\t\t\tdomain\n\t\t) as TranslatableText< typeof text >;\n\n\t\treturn hooks.applyFilters(\n\t\t\t'i18n.gettext_' + getFilterDomain( domain ),\n\t\t\ttranslation,\n\t\t\ttext,\n\t\t\tdomain\n\t\t) as TranslatableText< typeof text >;\n\t};\n\n\tconst _x: I18n< TextDomain >[ '_x' ] = ( text, context, domain ) => {\n\t\tlet translation = dcnpgettext( domain, context, text );\n\t\tif ( ! hooks ) {\n\t\t\treturn translation as TranslatableText< typeof text >;\n\t\t}\n\n\t\t/**\n\t\t * Filters text with its translation based on context information.\n\t\t *\n\t\t * @param translation Translated text.\n\t\t * @param text Text to translate.\n\t\t * @param context Context information for the translators.\n\t\t * @param domain Text domain. Unique identifier for retrieving translated strings.\n\t\t */\n\t\ttranslation = hooks.applyFilters(\n\t\t\t'i18n.gettext_with_context',\n\t\t\ttranslation,\n\t\t\ttext,\n\t\t\tcontext,\n\t\t\tdomain\n\t\t) as TranslatableText< typeof text >;\n\n\t\treturn hooks.applyFilters(\n\t\t\t'i18n.gettext_with_context_' + getFilterDomain( domain ),\n\t\t\ttranslation,\n\t\t\ttext,\n\t\t\tcontext,\n\t\t\tdomain\n\t\t) as TranslatableText< typeof text >;\n\t};\n\n\tconst _n: I18n< TextDomain >[ '_n' ] = (\n\t\tsingle,\n\t\tplural,\n\t\tnumber,\n\t\tdomain\n\t) => {\n\t\tlet translation = dcnpgettext(\n\t\t\tdomain,\n\t\t\tundefined,\n\t\t\tsingle,\n\t\t\tplural,\n\t\t\tnumber\n\t\t);\n\t\tif ( ! hooks ) {\n\t\t\treturn translation as TranslatableText<\n\t\t\t\ttypeof single | typeof plural\n\t\t\t>;\n\t\t}\n\n\t\t/**\n\t\t * Filters the singular or plural form of a string.\n\t\t *\n\t\t * @param translation Translated text.\n\t\t * @param single The text to be used if the number is singular.\n\t\t * @param plural The text to be used if the number is plural.\n\t\t * @param number The number to compare against to use either the singular or plural form.\n\t\t * @param domain Text domain. Unique identifier for retrieving translated strings.\n\t\t */\n\t\ttranslation = hooks.applyFilters(\n\t\t\t'i18n.ngettext',\n\t\t\ttranslation,\n\t\t\tsingle,\n\t\t\tplural,\n\t\t\tnumber,\n\t\t\tdomain\n\t\t) as TranslatableText< typeof single | typeof plural >;\n\n\t\treturn hooks.applyFilters(\n\t\t\t'i18n.ngettext_' + getFilterDomain( domain ),\n\t\t\ttranslation,\n\t\t\tsingle,\n\t\t\tplural,\n\t\t\tnumber,\n\t\t\tdomain\n\t\t) as TranslatableText< typeof single | typeof plural >;\n\t};\n\n\tconst _nx: I18n< TextDomain >[ '_nx' ] = (\n\t\tsingle,\n\t\tplural,\n\t\tnumber,\n\t\tcontext,\n\t\tdomain\n\t) => {\n\t\tlet translation = dcnpgettext(\n\t\t\tdomain,\n\t\t\tcontext,\n\t\t\tsingle,\n\t\t\tplural,\n\t\t\tnumber\n\t\t);\n\t\tif ( ! hooks ) {\n\t\t\treturn translation as TranslatableText<\n\t\t\t\ttypeof single | typeof plural\n\t\t\t>;\n\t\t}\n\n\t\t/**\n\t\t * Filters the singular or plural form of a string with gettext context.\n\t\t *\n\t\t * @param translation Translated text.\n\t\t * @param single The text to be used if the number is singular.\n\t\t * @param plural The text to be used if the number is plural.\n\t\t * @param number The number to compare against to use either the singular or plural form.\n\t\t * @param context Context information for the translators.\n\t\t * @param domain Text domain. Unique identifier for retrieving translated strings.\n\t\t */\n\t\ttranslation = hooks.applyFilters(\n\t\t\t'i18n.ngettext_with_context',\n\t\t\ttranslation,\n\t\t\tsingle,\n\t\t\tplural,\n\t\t\tnumber,\n\t\t\tcontext,\n\t\t\tdomain\n\t\t) as TranslatableText< typeof single | typeof plural >;\n\n\t\treturn hooks.applyFilters(\n\t\t\t'i18n.ngettext_with_context_' + getFilterDomain( domain ),\n\t\t\ttranslation,\n\t\t\tsingle,\n\t\t\tplural,\n\t\t\tnumber,\n\t\t\tcontext,\n\t\t\tdomain\n\t\t) as TranslatableText< typeof single | typeof plural >;\n\t};\n\n\tconst isRTL: I18n< TextDomain >[ 'isRTL' ] = () => {\n\t\treturn 'rtl' === _x( 'ltr', 'text direction' );\n\t};\n\n\tconst hasTranslation: I18n< TextDomain >[ 'hasTranslation' ] = (\n\t\tsingle,\n\t\tcontext,\n\t\tdomain\n\t) => {\n\t\tconst key = context ? context + '\\u0004' + single : single;\n\t\tlet result = !! tannin.data?.[ domain ?? 'default' ]?.[ key ];\n\t\tif ( hooks ) {\n\t\t\t/**\n\t\t\t * Filters the presence of a translation in the locale data.\n\t\t\t *\n\t\t\t * @param hasTranslation Whether the translation is present or not..\n\t\t\t * @param single The singular form of the translated text (used as key in locale data)\n\t\t\t * @param context Context information for the translators.\n\t\t\t * @param domain Text domain. Unique identifier for retrieving translated strings.\n\t\t\t */\n\t\t\tresult = hooks.applyFilters(\n\t\t\t\t'i18n.has_translation',\n\t\t\t\tresult,\n\t\t\t\tsingle,\n\t\t\t\tcontext,\n\t\t\t\tdomain\n\t\t\t) as boolean;\n\n\t\t\tresult = hooks.applyFilters(\n\t\t\t\t'i18n.has_translation_' + getFilterDomain( domain ),\n\t\t\t\tresult,\n\t\t\t\tsingle,\n\t\t\t\tcontext,\n\t\t\t\tdomain\n\t\t\t) as boolean;\n\t\t}\n\t\treturn result;\n\t};\n\n\tif ( initialData ) {\n\t\tsetLocaleData( initialData, initialDomain );\n\t}\n\n\tif ( hooks ) {\n\t\t/**\n\t\t * @param hookName\n\t\t */\n\t\tconst onHookAddedOrRemoved = ( hookName: string ) => {\n\t\t\tif ( I18N_HOOK_REGEXP.test( hookName ) ) {\n\t\t\t\tnotifyListeners();\n\t\t\t}\n\t\t};\n\n\t\thooks.addAction( 'hookAdded', 'core/i18n', onHookAddedOrRemoved );\n\t\thooks.addAction( 'hookRemoved', 'core/i18n', onHookAddedOrRemoved );\n\t}\n\n\treturn {\n\t\tgetLocaleData,\n\t\tsetLocaleData,\n\t\taddLocaleData,\n\t\tresetLocaleData,\n\t\tsubscribe,\n\t\t__,\n\t\t_x,\n\t\t_n,\n\t\t_nx,\n\t\tisRTL,\n\t\thasTranslation,\n\t};\n};\n"],"mappings":"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","ignoreList":[]}