@juit/vue-i18n 0.2.7 → 0.2.8

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/README.md CHANGED
@@ -302,8 +302,9 @@ const dateTime = translator.d(new Date(), 'time') // e.g. '18:08:05' in de-DE
302
302
  A full [`Intl.DateTimeFormatOptions`][5] set of options can also be specified
303
303
  as a second parameter to fine-tune the formatting.
304
304
 
305
- The third parameter, if specified, can be used to override the default time
306
- zone when formatting:
305
+ The third parameter, if specified, can be used to force the time zone used
306
+ when formatting the date. This is useful when time zones are specified in
307
+ the definition of date format _aliases_ (see above):
307
308
 
308
309
  ```typescript
309
310
  import { useTranslator } from '@juit/vue-i18n'
package/dist/index.d.ts CHANGED
@@ -871,7 +871,7 @@ export declare interface Translator {
871
871
  /** The region (if any) used by thus translator to localize translations. */
872
872
  region: ISOCountry | undefined;
873
873
  /** The `Locale` used by this translator (merges `language` and `region`) */
874
- locale: Intl.Locale;
874
+ locale: Readonly<Intl.Locale>;
875
875
  /**
876
876
  * Return the (possibly parameterized) translation for the specified message
877
877
  * in the current language.
package/dist/index.js CHANGED
@@ -8,7 +8,7 @@ function b(t) {
8
8
  k.includes(t.language) || f(`Unknown language code "${t.language}"`), t.region && (A.includes(t.region) || f(`Unknown region code "${t.region}"`));
9
9
  }
10
10
  function E(t) {
11
- const l = typeof t.defaultLanguage == "string" ? new Intl.Locale(t.defaultLanguage) : t.defaultLanguage, o = l.region ? `${l.language}-${l.region}` : l.language, r = t.defaultTimeZone, i = t.translations ? structuredClone(t.translations) : {}, c = {
11
+ const l = typeof t.defaultLanguage == "string" ? new Intl.Locale(t.defaultLanguage) : t.defaultLanguage, o = l.region ? `${l.language}-${l.region}` : l.language, r = t.defaultTimeZone, i = t.translations ? structuredClone(t.translations) : {}, g = {
12
12
  default: { dateStyle: "medium", timeStyle: "medium" },
13
13
  short: { dateStyle: "short", timeStyle: "short" },
14
14
  medium: { dateStyle: "medium", timeStyle: "medium" },
@@ -35,23 +35,23 @@ function E(t) {
35
35
  default: {},
36
36
  // Overrides and custom formats
37
37
  ...t.numberFormats
38
- }, g = I(new Intl.Locale(o));
39
- G(g, b, { immediate: !0 });
38
+ }, m = I(new Intl.Locale(o));
39
+ G(m, b, { immediate: !0 });
40
40
  const s = N(() => {
41
- const { language: e, region: n } = g.value, m = [e];
42
- return n && m.unshift(`${e}-${n}`), e !== o && m.push(o), m;
41
+ const { language: e, region: n } = m.value, c = [e];
42
+ return n && c.unshift(`${e}-${n}`), e !== o && c.push(o), c;
43
43
  }), a = {
44
44
  get locale() {
45
- return g.value;
45
+ return m.value;
46
46
  },
47
47
  set locale(e) {
48
- g.value = e;
48
+ m.value = e;
49
49
  },
50
50
  get language() {
51
51
  return a.locale.language;
52
52
  },
53
53
  set language(e) {
54
- a.locale = new Intl.Locale(e, { ...g.value });
54
+ a.locale = new Intl.Locale(e, { ...m.value });
55
55
  },
56
56
  get region() {
57
57
  return a.locale.region;
@@ -61,22 +61,22 @@ function E(t) {
61
61
  },
62
62
  n(e, n = "default") {
63
63
  if (e == null) return "";
64
- const m = typeof n == "string" ? u[n] : n;
65
- return m || f(`NumberFormat alias "${n}" not found`), new Intl.NumberFormat(a.locale, m).format(e);
64
+ const c = typeof n == "string" ? u[n] : n;
65
+ return c || f(`NumberFormat alias "${n}" not found`), new Intl.NumberFormat(a.locale, c).format(e);
66
66
  },
67
67
  t(e, n) {
68
68
  return a.tc(e, 1, n);
69
69
  },
70
- tc(e, n, m) {
70
+ tc(e, n, c) {
71
71
  const S = w(i, e, s.value), d = new Intl.NumberFormat(a.locale, u.default);
72
- return P(S, Object.assign({ n }, m), d);
72
+ return P(S, Object.assign({ n }, c), d);
73
73
  },
74
- d(e, n = "default", m) {
74
+ d(e, n = "default", c) {
75
75
  if (e == null || e === "") return "";
76
- const S = e instanceof Date ? e : new Date(e), d = typeof n == "string" ? c[n] : n;
76
+ const S = e instanceof Date ? e : new Date(e), d = typeof n == "string" ? g[n] : n;
77
77
  d || f(`DateTimeFormat alias "${n}" not found`);
78
- const h = { timeZone: m || r, ...d };
79
- return new Intl.DateTimeFormat(g.value, h).format(S);
78
+ const y = { timeZone: r, ...d };
79
+ return c && (y.timeZone = c), new Intl.DateTimeFormat(m.value, y).format(S);
80
80
  },
81
81
  utils: {
82
82
  language(e) {
@@ -92,24 +92,24 @@ function E(t) {
92
92
  };
93
93
  return p(a);
94
94
  }
95
- const y = /* @__PURE__ */ new WeakMap();
95
+ const T = /* @__PURE__ */ new WeakMap();
96
96
  function w(t, l, o) {
97
97
  if (!l) throw new Error("No translation key specified");
98
98
  if (typeof l == "string") {
99
- let r = y.get(t);
100
- r || y.set(t, r = {});
99
+ let r = T.get(t);
100
+ r || T.set(t, r = {});
101
101
  let i = r[o[0]];
102
102
  i || (r[o[0]] = i = {});
103
- let c = i[l];
104
- if (!c) {
103
+ let g = i[l];
104
+ if (!g) {
105
105
  let u = t[l];
106
- u || (f(`Translation key "${l}" not found`), u = { [o[o.length - 1]]: l }), c = T(u, o), i[l] = c;
106
+ u || (f(`Translation key "${l}" not found`), u = { [o[o.length - 1]]: l }), g = M(u, o), i[l] = g;
107
107
  }
108
- return c;
108
+ return g;
109
109
  } else
110
- return T(l, o);
110
+ return M(l, o);
111
111
  }
112
- function T(t, l) {
112
+ function M(t, l) {
113
113
  let o;
114
114
  for (const s of l)
115
115
  if (o = t[s], o) break;
@@ -129,25 +129,25 @@ function T(t, l) {
129
129
  const [s, a, e] = i;
130
130
  r = { zero: s, singular: a, plural: e };
131
131
  }
132
- const { zero: c, singular: u, plural: g } = r;
133
- return { zero: c.trim(), singular: u.trim(), plural: g.trim() };
132
+ const { zero: g, singular: u, plural: m } = r;
133
+ return { zero: g.trim(), singular: u.trim(), plural: m.trim() };
134
134
  }
135
135
  function P(t, l, o) {
136
136
  const r = typeof l.n == "string" ? Number(l.n) : l.n;
137
137
  let i = r === 0 ? t.zero : r === 1 ? t.singular : t.plural;
138
- for (const [c, u] of Object.entries(l)) {
139
- const g = typeof u == "number" ? o.format(u) : typeof u == "string" ? u : u ? String(u) : "", s = new RegExp(`(.|^)({\\s*${c}\\s*})`, "gi");
140
- i = i.replaceAll(s, (a, e, n) => e === "\\" ? n : e + g);
138
+ for (const [g, u] of Object.entries(l)) {
139
+ const m = typeof u == "number" ? o.format(u) : typeof u == "string" ? u : u ? String(u) : "", s = new RegExp(`(.|^)({\\s*${g}\\s*})`, "gi");
140
+ i = i.replaceAll(s, (a, e, n) => e === "\\" ? n : e + m);
141
141
  }
142
142
  return i.trim();
143
143
  }
144
- const M = Symbol.for("@juit/vue-i18n/translator");
144
+ const h = Symbol.for("@juit/vue-i18n/translator");
145
145
  function R(t, l) {
146
146
  const r = E(typeof l == "string" ? { defaultLanguage: l } : l);
147
- return t.config.globalProperties.$t = r.t, t.config.globalProperties.$tc = r.tc, t.config.globalProperties.$n = r.n, t.config.globalProperties.$d = r.d, t.provide(M, r), t;
147
+ return t.config.globalProperties.$t = r.t, t.config.globalProperties.$tc = r.tc, t.config.globalProperties.$n = r.n, t.config.globalProperties.$d = r.d, t.provide(h, r), t;
148
148
  }
149
149
  function D() {
150
- const t = C(M);
150
+ const t = C(h);
151
151
  if (!t) throw new Error("No translator found in the Vue app");
152
152
  return t;
153
153
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../lib/iso-3166.ts","../lib/iso-4217.ts","../lib/iso-639.ts","../lib/translator.ts","../lib/index.ts"],"sourcesContent":["/** The array of all known ISO-3166-1 countries */\nexport const ISO_COUNTRIES = [\n ...('ADAEAFAGAIALAMAOAQARASATAUAWAXAZBABBBDBEBFBGBHBIBJBLBMBNBOBQBRBSBTBVBW' +\n 'BYBZCACCCDCFCGCHCICKCLCMCNCOCRCUCVCWCXCYCZDEDJDKDMDODZECEEEGEHERESETFIFJFK' +\n 'FMFOFRGAGBGDGEGFGGGHGIGLGMGNGPGQGRGSGTGUGWGYHKHMHNHRHTHUIDIEILIMINIOIQIRIS' +\n 'ITJEJMJOJPKEKGKHKIKMKNKPKRKWKYKZLALBLCLILKLRLSLTLULVLYMAMCMDMEMFMGMHMKMLMM' +\n 'MNMOMPMQMRMSMTMUMVMWMXMYMZNANCNENFNGNINLNONPNRNUNZOMPAPEPFPGPHPKPLPMPNPRPS' +\n 'PTPWPYQARERORSRURWSASBSCSDSESGSHSISJSKSLSMSNSOSRSSSTSVSXSYSZTCTDTFTGTHTJTK' +\n 'TLTMTNTOTRTTTVTWTZUAUGUMUSUYUZVAVCVEVGVIVNVUWFWSXKYEYTZAZMZW').match(/../g)!,\n].sort() as ISOCountry[]\n\n/** All known ISO-3166-1 countries and their names */\nexport type ISOCountries = {\n AD: 'Andorra',\n AE: 'United Arab Emirates',\n AF: 'Afghanistan',\n AG: 'Antigua & Barbuda',\n AI: 'Anguilla',\n AL: 'Albania',\n AM: 'Armenia',\n AO: 'Angola',\n AQ: 'Antarctica',\n AR: 'Argentina',\n AS: 'American Samoa',\n AT: 'Austria',\n AU: 'Australia',\n AW: 'Aruba',\n AX: 'Åland Islands',\n AZ: 'Azerbaijan',\n BA: 'Bosnia & Herzegovina',\n BB: 'Barbados',\n BD: 'Bangladesh',\n BE: 'Belgium',\n BF: 'Burkina Faso',\n BG: 'Bulgaria',\n BH: 'Bahrain',\n BI: 'Burundi',\n BJ: 'Benin',\n BL: 'St. Barthélemy',\n BM: 'Bermuda',\n BN: 'Brunei',\n BO: 'Bolivia',\n BQ: 'Caribbean Netherlands',\n BR: 'Brazil',\n BS: 'Bahamas',\n BT: 'Bhutan',\n BV: 'Bouvet Island',\n BW: 'Botswana',\n BY: 'Belarus',\n BZ: 'Belize',\n CA: 'Canada',\n CC: 'Cocos (Keeling) Islands',\n CD: 'Congo - Kinshasa',\n CF: 'Central African Republic',\n CG: 'Congo - Brazzaville',\n CH: 'Switzerland',\n CI: 'Côte d\\'Ivoire',\n CK: 'Cook Islands',\n CL: 'Chile',\n CM: 'Cameroon',\n CN: 'China',\n CO: 'Colombia',\n CR: 'Costa Rica',\n CU: 'Cuba',\n CV: 'Cape Verde',\n CW: 'Curaçao',\n CX: 'Christmas Island',\n CY: 'Cyprus',\n CZ: 'Czechia',\n DE: 'Germany',\n DJ: 'Djibouti',\n DK: 'Denmark',\n DM: 'Dominica',\n DO: 'Dominican Republic',\n DZ: 'Algeria',\n EC: 'Ecuador',\n EE: 'Estonia',\n EG: 'Egypt',\n EH: 'Western Sahara',\n ER: 'Eritrea',\n ES: 'Spain',\n ET: 'Ethiopia',\n FI: 'Finland',\n FJ: 'Fiji',\n FK: 'Falkland Islands',\n FM: 'Micronesia',\n FO: 'Faroe Islands',\n FR: 'France',\n GA: 'Gabon',\n GB: 'United Kingdom',\n GD: 'Grenada',\n GE: 'Georgia',\n GF: 'French Guiana',\n GG: 'Guernsey',\n GH: 'Ghana',\n GI: 'Gibraltar',\n GL: 'Greenland',\n GM: 'Gambia',\n GN: 'Guinea',\n GP: 'Guadeloupe',\n GQ: 'Equatorial Guinea',\n GR: 'Greece',\n GS: 'South Georgia & South Sandwich Islands',\n GT: 'Guatemala',\n GU: 'Guam',\n GW: 'Guinea-Bissau',\n GY: 'Guyana',\n HK: 'Hong Kong SAR China',\n HM: 'Heard & McDonald Islands',\n HN: 'Honduras',\n HR: 'Croatia',\n HT: 'Haiti',\n HU: 'Hungary',\n ID: 'Indonesia',\n IE: 'Ireland',\n IL: 'Israel',\n IM: 'Isle of Man',\n IN: 'India',\n IO: 'British Indian Ocean Territory',\n IQ: 'Iraq',\n IR: 'Iran',\n IS: 'Iceland',\n IT: 'Italy',\n JE: 'Jersey',\n JM: 'Jamaica',\n JO: 'Jordan',\n JP: 'Japan',\n KE: 'Kenya',\n KG: 'Kyrgyzstan',\n KH: 'Cambodia',\n KI: 'Kiribati',\n KM: 'Comoros',\n KN: 'St. Kitts & Nevis',\n KP: 'North Korea',\n KR: 'South Korea',\n KW: 'Kuwait',\n KY: 'Cayman Islands',\n KZ: 'Kazakhstan',\n LA: 'Laos',\n LB: 'Lebanon',\n LC: 'St. Lucia',\n LI: 'Liechtenstein',\n LK: 'Sri Lanka',\n LR: 'Liberia',\n LS: 'Lesotho',\n LT: 'Lithuania',\n LU: 'Luxembourg',\n LV: 'Latvia',\n LY: 'Libya',\n MA: 'Morocco',\n MC: 'Monaco',\n MD: 'Moldova',\n ME: 'Montenegro',\n MF: 'St. Martin',\n MG: 'Madagascar',\n MH: 'Marshall Islands',\n MK: 'North Macedonia',\n ML: 'Mali',\n MM: 'Myanmar (Burma)',\n MN: 'Mongolia',\n MO: 'Macao SAR China',\n MP: 'Northern Mariana Islands',\n MQ: 'Martinique',\n MR: 'Mauritania',\n MS: 'Montserrat',\n MT: 'Malta',\n MU: 'Mauritius',\n MV: 'Maldives',\n MW: 'Malawi',\n MX: 'Mexico',\n MY: 'Malaysia',\n MZ: 'Mozambique',\n NA: 'Namibia',\n NC: 'New Caledonia',\n NE: 'Niger',\n NF: 'Norfolk Island',\n NG: 'Nigeria',\n NI: 'Nicaragua',\n NL: 'Netherlands',\n NO: 'Norway',\n NP: 'Nepal',\n NR: 'Nauru',\n NU: 'Niue',\n NZ: 'New Zealand',\n OM: 'Oman',\n PA: 'Panama',\n PE: 'Peru',\n PF: 'French Polynesia',\n PG: 'Papua New Guinea',\n PH: 'Philippines',\n PK: 'Pakistan',\n PL: 'Poland',\n PM: 'St. Pierre & Miquelon',\n PN: 'Pitcairn Islands',\n PR: 'Puerto Rico',\n PS: 'Palestinian Territories',\n PT: 'Portugal',\n PW: 'Palau',\n PY: 'Paraguay',\n QA: 'Qatar',\n RE: 'Réunion',\n RO: 'Romania',\n RS: 'Serbia',\n RU: 'Russia',\n RW: 'Rwanda',\n SA: 'Saudi Arabia',\n SB: 'Solomon Islands',\n SC: 'Seychelles',\n SD: 'Sudan',\n SE: 'Sweden',\n SG: 'Singapore',\n SH: 'St. Helena',\n SI: 'Slovenia',\n SJ: 'Svalbard & Jan Mayen',\n SK: 'Slovakia',\n SL: 'Sierra Leone',\n SM: 'San Marino',\n SN: 'Senegal',\n SO: 'Somalia',\n SR: 'Suriname',\n SS: 'South Sudan',\n ST: 'São Tomé & Príncipe',\n SV: 'El Salvador',\n SX: 'Sint Maarten',\n SY: 'Syria',\n SZ: 'Eswatini',\n TC: 'Turks & Caicos Islands',\n TD: 'Chad',\n TF: 'French Southern Territories',\n TG: 'Togo',\n TH: 'Thailand',\n TJ: 'Tajikistan',\n TK: 'Tokelau',\n TL: 'Timor-Leste',\n TM: 'Turkmenistan',\n TN: 'Tunisia',\n TO: 'Tonga',\n TR: 'Türkiye',\n TT: 'Trinidad & Tobago',\n TV: 'Tuvalu',\n TW: 'Taiwan',\n TZ: 'Tanzania',\n UA: 'Ukraine',\n UG: 'Uganda',\n UM: 'U.S. Outlying Islands',\n US: 'United States',\n UY: 'Uruguay',\n UZ: 'Uzbekistan',\n VA: 'Vatican City',\n VC: 'St. Vincent & Grenadines',\n VE: 'Venezuela',\n VG: 'British Virgin Islands',\n VI: 'U.S. Virgin Islands',\n VN: 'Vietnam',\n VU: 'Vanuatu',\n WF: 'Wallis & Futuna',\n WS: 'Samoa',\n XK: 'Kosovo', // not an official ISO-3166-1 country, but specified in CLDR\n YE: 'Yemen',\n YT: 'Mayotte',\n ZA: 'South Africa',\n ZM: 'Zambia',\n ZW: 'Zimbabwe',\n}\n\n/** Array of all known ISO-3166-1 country names */\nexport type ISOCountry = keyof ISOCountries\n","/** The array of all known ISO-639-1 languages */\nexport const ISO_CURRENCIES = Intl.supportedValuesOf('currency') as ISOCurrency[]\n\n/** All known ISO-4217 currencies and their name */\nexport type ISOCurrencies = {\n AED: 'United Arab Emirates Dirham',\n AFN: 'Afghan Afghani',\n ALL: 'Albanian Lek',\n AMD: 'Armenian Dram',\n ANG: 'Netherlands Antillean Guilder',\n AOA: 'Angolan Kwanza',\n ARS: 'Argentine Peso',\n AUD: 'Australian Dollar',\n AWG: 'Aruban Florin',\n AZN: 'Azerbaijani Manat',\n BAM: 'Bosnia-Herzegovina Convertible Mark',\n BBD: 'Barbadian Dollar',\n BDT: 'Bangladeshi Taka',\n BGN: 'Bulgarian Lev',\n BHD: 'Bahraini Dinar',\n BIF: 'Burundian Franc',\n BMD: 'Bermudan Dollar',\n BND: 'Brunei Dollar',\n BOB: 'Bolivian Boliviano',\n BRL: 'Brazilian Real',\n BSD: 'Bahamian Dollar',\n BTN: 'Bhutanese Ngultrum',\n BWP: 'Botswanan Pula',\n BYN: 'Belarusian Ruble',\n BZD: 'Belize Dollar',\n CAD: 'Canadian Dollar',\n CDF: 'Congolese Franc',\n CHF: 'Swiss Franc',\n CLP: 'Chilean Peso',\n CNY: 'Chinese Yuan',\n COP: 'Colombian Peso',\n CRC: 'Costa Rican Colón',\n CUC: 'Cuban Convertible Peso',\n CUP: 'Cuban Peso',\n CVE: 'Cape Verdean Escudo',\n CZK: 'Czech Koruna',\n DJF: 'Djiboutian Franc',\n DKK: 'Danish Krone',\n DOP: 'Dominican Peso',\n DZD: 'Algerian Dinar',\n EGP: 'Egyptian Pound',\n ERN: 'Eritrean Nakfa',\n ETB: 'Ethiopian Birr',\n EUR: 'Euro',\n FJD: 'Fijian Dollar',\n FKP: 'Falkland Islands Pound',\n GBP: 'British Pound',\n GEL: 'Georgian Lari',\n GHS: 'Ghanaian Cedi',\n GIP: 'Gibraltar Pound',\n GMD: 'Gambian Dalasi',\n GNF: 'Guinean Franc',\n GTQ: 'Guatemalan Quetzal',\n GYD: 'Guyanaese Dollar',\n HKD: 'Hong Kong Dollar',\n HNL: 'Honduran Lempira',\n HRK: 'Croatian Kuna',\n HTG: 'Haitian Gourde',\n HUF: 'Hungarian Forint',\n IDR: 'Indonesian Rupiah',\n ILS: 'Israeli New Shekel',\n INR: 'Indian Rupee',\n IQD: 'Iraqi Dinar',\n IRR: 'Iranian Rial',\n ISK: 'Icelandic Króna',\n JMD: 'Jamaican Dollar',\n JOD: 'Jordanian Dinar',\n JPY: 'Japanese Yen',\n KES: 'Kenyan Shilling',\n KGS: 'Kyrgystani Som',\n KHR: 'Cambodian Riel',\n KMF: 'Comorian Franc',\n KPW: 'North Korean Won',\n KRW: 'South Korean Won',\n KWD: 'Kuwaiti Dinar',\n KYD: 'Cayman Islands Dollar',\n KZT: 'Kazakhstani Tenge',\n LAK: 'Laotian Kip',\n LBP: 'Lebanese Pound',\n LKR: 'Sri Lankan Rupee',\n LRD: 'Liberian Dollar',\n LSL: 'Lesotho Loti',\n LYD: 'Libyan Dinar',\n MAD: 'Moroccan Dirham',\n MDL: 'Moldovan Leu',\n MGA: 'Malagasy Ariary',\n MKD: 'Macedonian Denar',\n MMK: 'Myanmar Kyat',\n MNT: 'Mongolian Tugrik',\n MOP: 'Macanese Pataca',\n MRU: 'Mauritanian Ouguiya',\n MUR: 'Mauritian Rupee',\n MVR: 'Maldivian Rufiyaa',\n MWK: 'Malawian Kwacha',\n MXN: 'Mexican Peso',\n MYR: 'Malaysian Ringgit',\n MZN: 'Mozambican Metical',\n NAD: 'Namibian Dollar',\n NGN: 'Nigerian Naira',\n NIO: 'Nicaraguan Córdoba',\n NOK: 'Norwegian Krone',\n NPR: 'Nepalese Rupee',\n NZD: 'New Zealand Dollar',\n OMR: 'Omani Rial',\n PAB: 'Panamanian Balboa',\n PEN: 'Peruvian Sol',\n PGK: 'Papua New Guinean Kina',\n PHP: 'Philippine Peso',\n PKR: 'Pakistani Rupee',\n PLN: 'Polish Zloty',\n PYG: 'Paraguayan Guarani',\n QAR: 'Qatari Riyal',\n RON: 'Romanian Leu',\n RSD: 'Serbian Dinar',\n RUB: 'Russian Ruble',\n RWF: 'Rwandan Franc',\n SAR: 'Saudi Riyal',\n SBD: 'Solomon Islands Dollar',\n SCR: 'Seychellois Rupee',\n SDG: 'Sudanese Pound',\n SEK: 'Swedish Krona',\n SGD: 'Singapore Dollar',\n SHP: 'St. Helena Pound',\n SLL: 'Sierra Leonean Leone (1964—2022)',\n SOS: 'Somali Shilling',\n SRD: 'Surinamese Dollar',\n SSP: 'South Sudanese Pound',\n STN: 'São Tomé & Príncipe Dobra',\n SVC: 'Salvadoran Colón',\n SYP: 'Syrian Pound',\n SZL: 'Swazi Lilangeni',\n THB: 'Thai Baht',\n TJS: 'Tajikistani Somoni',\n TMT: 'Turkmenistani Manat',\n TND: 'Tunisian Dinar',\n TOP: 'Tongan Paʻanga',\n TRY: 'Turkish Lira',\n TTD: 'Trinidad & Tobago Dollar',\n TWD: 'New Taiwan Dollar',\n TZS: 'Tanzanian Shilling',\n UAH: 'Ukrainian Hryvnia',\n UGX: 'Ugandan Shilling',\n USD: 'US Dollar',\n UYU: 'Uruguayan Peso',\n UZS: 'Uzbekistani Som',\n VES: 'Venezuelan Bolívar',\n VND: 'Vietnamese Dong',\n VUV: 'Vanuatu Vatu',\n WST: 'Samoan Tala',\n XAF: 'Central African CFA Franc',\n XCD: 'East Caribbean Dollar',\n XDR: 'Special Drawing Rights',\n XOF: 'West African CFA Franc',\n XPF: 'CFP Franc',\n XSU: 'Sucre',\n YER: 'Yemeni Rial',\n ZAR: 'South African Rand',\n ZMW: 'Zambian Kwacha',\n ZWL: 'Zimbabwean Dollar (2009)',\n}\n\n/** All known ISO-4217 currency codes */\nexport type ISOCurrency = keyof ISOCurrencies\n","/** The array of all known ISO-639-1 languages */\nexport const ISO_LANGUAGES = [\n ...('aaabaeafakamanarasavayazbabebgbhbibmbnbobrbscacechcocrcscucvcydadedvdz' +\n 'eeeleneoeseteufafffifjfofrfygagdglgngugvhahehihohrhthuhyhziaidieigiiikiois' +\n 'itiujajvkakgkikjkkklkmknkokrkskukvkwkylalblglilnloltlulvmgmhmimkmlmnmrmsmt' +\n 'mynanbndnengnlnnnonrnvnyocojomorospapiplpsptqurmrnrorurwsascsdsesgsiskslsm' +\n 'snsosqsrssstsusvswtatetgthtitktltntotrtstttwtyugukuruzvevivowawoxhyiyozazh' +\n 'zu').match(/../g)!,\n].sort() as ISOLanguage[]\n\n/** All known ISO-639-1 languages and their name */\nexport type ISOLanguages = {\n aa: 'Afar',\n ab: 'Abkhazian',\n ae: 'Avestan',\n af: 'Afrikaans',\n ak: 'Akan',\n am: 'Amharic',\n an: 'Aragonese',\n ar: 'Arabic',\n as: 'Assamese',\n av: 'Avaric',\n ay: 'Aymara',\n az: 'Azerbaijani',\n ba: 'Bashkir',\n be: 'Belarusian',\n bg: 'Bulgarian',\n bh: 'Bhojpuri',\n bi: 'Bislama',\n bm: 'Bambara',\n bn: 'Bangla',\n bo: 'Tibetan',\n br: 'Breton',\n bs: 'Bosnian',\n ca: 'Catalan',\n ce: 'Chechen',\n ch: 'Chamorro',\n co: 'Corsican',\n cr: 'Cree',\n cs: 'Czech',\n cu: 'Church Slavic',\n cv: 'Chuvash',\n cy: 'Welsh',\n da: 'Danish',\n de: 'German',\n dv: 'Divehi',\n dz: 'Dzongkha',\n ee: 'Ewe',\n el: 'Greek',\n en: 'English',\n eo: 'Esperanto',\n es: 'Spanish',\n et: 'Estonian',\n eu: 'Basque',\n fa: 'Persian',\n ff: 'Fula',\n fi: 'Finnish',\n fj: 'Fijian',\n fo: 'Faroese',\n fr: 'French',\n fy: 'Western Frisian',\n ga: 'Irish',\n gd: 'Scottish Gaelic',\n gl: 'Galician',\n gn: 'Guarani',\n gu: 'Gujarati',\n gv: 'Manx',\n ha: 'Hausa',\n he: 'Hebrew',\n hi: 'Hindi',\n ho: 'Hiri Motu',\n hr: 'Croatian',\n ht: 'Haitian Creole',\n hu: 'Hungarian',\n hy: 'Armenian',\n hz: 'Herero',\n ia: 'Interlingua',\n id: 'Indonesian',\n ie: 'Interlingue',\n ig: 'Igbo',\n ii: 'Sichuan Yi',\n ik: 'Inupiaq',\n io: 'Ido',\n is: 'Icelandic',\n it: 'Italian',\n iu: 'Inuktitut',\n ja: 'Japanese',\n jv: 'Javanese',\n ka: 'Georgian',\n kg: 'Kongo',\n ki: 'Kikuyu',\n kj: 'Kuanyama',\n kk: 'Kazakh',\n kl: 'Kalaallisut',\n km: 'Khmer',\n kn: 'Kannada',\n ko: 'Korean',\n kr: 'Kanuri',\n ks: 'Kashmiri',\n ku: 'Kurdish',\n kv: 'Komi',\n kw: 'Cornish',\n ky: 'Kyrgyz',\n la: 'Latin',\n lb: 'Luxembourgish',\n lg: 'Ganda',\n li: 'Limburgish',\n ln: 'Lingala',\n lo: 'Lao',\n lt: 'Lithuanian',\n lu: 'Luba-Katanga',\n lv: 'Latvian',\n mg: 'Malagasy',\n mh: 'Marshallese',\n mi: 'Māori',\n mk: 'Macedonian',\n ml: 'Malayalam',\n mn: 'Mongolian',\n mr: 'Marathi',\n ms: 'Malay',\n mt: 'Maltese',\n my: 'Burmese',\n na: 'Nauru',\n nb: 'Norwegian Bokmål',\n nd: 'North Ndebele',\n ne: 'Nepali',\n ng: 'Ndonga',\n nl: 'Dutch',\n nn: 'Norwegian Nynorsk',\n no: 'Norwegian',\n nr: 'South Ndebele',\n nv: 'Navajo',\n ny: 'Nyanja',\n oc: 'Occitan',\n oj: 'Ojibwa',\n om: 'Oromo',\n or: 'Odia',\n os: 'Ossetic',\n pa: 'Punjabi',\n pi: 'Pali',\n pl: 'Polish',\n ps: 'Pashto',\n pt: 'Portuguese',\n qu: 'Quechua',\n rm: 'Romansh',\n rn: 'Rundi',\n ro: 'Romanian',\n ru: 'Russian',\n rw: 'Kinyarwanda',\n sa: 'Sanskrit',\n sc: 'Sardinian',\n sd: 'Sindhi',\n se: 'Northern Sami',\n sg: 'Sango',\n si: 'Sinhala',\n sk: 'Slovak',\n sl: 'Slovenian',\n sm: 'Samoan',\n sn: 'Shona',\n so: 'Somali',\n sq: 'Albanian',\n sr: 'Serbian',\n ss: 'Swati',\n st: 'Southern Sotho',\n su: 'Sundanese',\n sv: 'Swedish',\n sw: 'Swahili',\n ta: 'Tamil',\n te: 'Telugu',\n tg: 'Tajik',\n th: 'Thai',\n ti: 'Tigrinya',\n tk: 'Turkmen',\n tl: 'Filipino',\n tn: 'Tswana',\n to: 'Tongan',\n tr: 'Turkish',\n ts: 'Tsonga',\n tt: 'Tatar',\n tw: 'Akan',\n ty: 'Tahitian',\n ug: 'Uyghur',\n uk: 'Ukrainian',\n ur: 'Urdu',\n uz: 'Uzbek',\n ve: 'Venda',\n vi: 'Vietnamese',\n vo: 'Volapük',\n wa: 'Walloon',\n wo: 'Wolof',\n xh: 'Xhosa',\n yi: 'Yiddish',\n yo: 'Yoruba',\n za: 'Zhuang',\n zh: 'Chinese',\n zu: 'Zulu',\n}\n\n/** All known ISO-639-1 language codes */\nexport type ISOLanguage = keyof ISOLanguages\n","import { computed, reactive, shallowRef, warn, watch } from 'vue'\n\nimport { ISO_COUNTRIES } from './iso-3166'\nimport { ISO_CURRENCIES } from './iso-4217'\nimport { ISO_LANGUAGES } from './iso-639'\n\nimport type { DateTimeFormatAlias, DateTimeFormats, I18nOptions, ISOCountry, NumberFormatAlias, NumberFormats, Translation, TranslationKey } from './index'\nimport type { ISOLanguage } from './iso-639'\n\n/* ===== TRANSLATOR INTERFACE =============================================== */\n\n/**\n * Parameters for the formatting of a translation.\n *\n * This type is used to pass parameters to the `t` and `tc` methods of the\n * translator, allowing for the interpolation of values into the translated\n * message.\n *\n * When the parameter value is a number, it will be formatted using the `n`\n * formatter before being interpolated into the message.\n */\nexport interface TranslationParams {\n [ key: string ]: string | number\n}\n\n/**\n * The date input type for date and time translation\n *\n * When the input is a non-empty `string`, or a `number`, it will be constructed\n * into a `Date` object before being formatted.\n *\n * When the input is `null`, `undefined`, or an empty string, formatted result\n * will be a simple empty string.\n */\nexport type DateInput = Date | string | number | null | undefined\n\n/**\n * The translator interface for the application.\n *\n * This interface provides methods to translate messages, format numbers, and\n * format dates and times.\n *\n * Configured instances can be accessed using the `useI18n()` composition\n * function, which will provide an instance of the translator.\n */\nexport interface Translator {\n /** The current ISO-639-1 language code used by this translator. */\n language: ISOLanguage\n /** The region (if any) used by thus translator to localize translations. */\n region: ISOCountry | undefined\n /** The `Locale` used by this translator (merges `language` and `region`) */\n locale: Intl.Locale\n\n /**\n * Return the (possibly parameterized) translation for the specified message\n * in the current language.\n *\n * Internally, this method uses the `tc(...)` function with `n=1`, in order to\n * avoid duplication of message keys\n */\n t(key: TranslationKey | Translation, params?: TranslationParams): string\n\n /**\n * Return the (possibly parameterized) translation for the specified message\n * in the current language, with pluralization.\n *\n * For pluralization, translation messages should be separated by the pipe\n * character, like in Vue I18N. Example:\n *\n * * `\" one apple | {n} apples \"` when _two_ translations are separated by a\n * pipe, the first will be used for singular, the second for zero or plural\n * * `\" no apples | one apple | {n} apples \"` when _three_ translations are\n * separated by a pipe, the first will be used for zero, the second for\n * singular, the second for zero or plural\n *\n * For convenience, the `{n}` message parameter will always be contextualized\n * with the number, unless overridden in the `params` themselves.\n */\n tc(key: TranslationKey | Translation, n: number, params?: TranslationParams): string\n\n /**\n * Format a number according to the current language.\n *\n * When `format` is provided, it will be used to configure the number format.\n * This can be one of the aliases specified at initialization, or a\n * fully-fledged `Intl.NumberFormatOptions` object.\n */\n n(value?: number | bigint | null | undefined, format?: NumberFormatAlias | Intl.NumberFormatOptions): string\n\n /**\n * Format date and time according to the current language.\n *\n * When `format` is provided, it will be used to configure the date and time\n * format. This can be one of the aliases specified at initialization, or a\n * fully-fledged `Intl.DateTimeFormatOptions` object.\n */\n d(date?: DateInput, format?: DateTimeFormatAlias | Intl.DateTimeFormatOptions, timeZone?: string): string\n\n /** Extra internationalization utilities */\n utils: {\n /**\n * Return the name of the language for the given ISO-639-1 code localized\n * using the current language\n */\n language(code: ISOLanguage): string\n\n /**\n * Return the name of the country (or region) for the given ISO-3166-1 code\n * (or CLDR region code) using the current language\n */\n country(code: ISOCountry | 'EU' | 'UN'): string\n\n /**\n * Return the flag emoji for the given ISO-3166-1 code (or CLDR region\n * code).\n */\n flag(code: ISOCountry | 'EU' | 'UN'): string\n }\n}\n\n/* ===== TRANSLATOR IMPLEMENTATION ========================================== */\n\nfunction checkLocale(locale: Intl.Locale): void {\n if (! ISO_LANGUAGES.includes(locale.language as any)) {\n warn(`Unknown language code \"${locale.language}\"`)\n }\n\n if (! locale.region) return\n\n if (! ISO_COUNTRIES.includes(locale.region as any)) {\n warn(`Unknown region code \"${locale.region}\"`)\n }\n}\n\n/** Create a _reactive_ translator object from the given options */\nexport function makeTranslator(options: I18nOptions): Translator {\n // Default locale, parsing the default language\n const defaultLocale: Intl.Locale = typeof options.defaultLanguage === 'string' ?\n new Intl.Locale(options.defaultLanguage) :\n options.defaultLanguage\n\n // Normalized default language (language-REGION)\n const defaultLanguage = defaultLocale.region ?\n `${defaultLocale.language}-${defaultLocale.region}` :\n defaultLocale.language\n\n // Default time zone\n const defaultTimeZone = options.defaultTimeZone\n\n const translations: InternalTranslations = options.translations ? structuredClone(options.translations) : {}\n const dateTimeFormats: DateTimeFormats = {\n default: { dateStyle: 'medium', timeStyle: 'medium' },\n short: { dateStyle: 'short', timeStyle: 'short' },\n medium: { dateStyle: 'medium', timeStyle: 'medium' },\n long: { dateStyle: 'long', timeStyle: 'long' },\n full: { dateStyle: 'full', timeStyle: 'full' },\n\n // date only formats\n date: { dateStyle: 'medium' },\n shortDate: { dateStyle: 'short' },\n mediumDate: { dateStyle: 'medium' },\n longDate: { dateStyle: 'long' },\n fullDate: { dateStyle: 'full' },\n\n // time only formats\n time: { timeStyle: 'medium' },\n shortTime: { timeStyle: 'short' },\n mediumTime: { timeStyle: 'medium' },\n longTime: { timeStyle: 'long' },\n fullTime: { timeStyle: 'full' },\n\n // overrides and custom formats\n ...options.dateTimeFormats,\n }\n\n const numberFormats: NumberFormats = {\n // Expand all currency codes into number formats for currencies\n ...ISO_CURRENCIES.reduce((formats, currency) => {\n formats[currency] = { style: 'currency', currency }\n return formats\n }, {} as Record<string, Intl.NumberFormatOptions>),\n // Add the default number format\n default: {},\n // Overrides and custom formats\n ...options.numberFormats,\n }\n\n // Current locale, from the browser's language settings\n const locale = shallowRef(new Intl.Locale(defaultLanguage))\n watch(locale, checkLocale, { immediate: true })\n // checkLocale(locale.value)\n\n // Language order, from the current locale\n const languages = computed(() => {\n const { language, region } = locale.value\n const order: string[] = [ language ]\n if (region) order.unshift(`${language}-${region}`)\n if (language !== defaultLanguage) order.push(defaultLanguage)\n return order as any as LanguageKeys\n })\n\n // The translator object (non-reactive)\n const translator = {\n get locale() {\n return locale.value\n },\n\n set locale(value: Intl.Locale) {\n locale.value = value\n },\n\n get language(): ISOLanguage {\n return translator.locale.language as ISOLanguage\n },\n\n set language(value: ISOLanguage) {\n translator.locale = new Intl.Locale(value, { ...locale.value })\n },\n\n get region(): ISOCountry | undefined {\n return translator.locale.region as ISOCountry\n },\n\n set region(value: ISOCountry | undefined) {\n translator.locale = new Intl.Locale(translator.language, { ...translator.locale, region: value || undefined })\n },\n\n n(value?: number | bigint | null | undefined, format: string | Intl.NumberFormatOptions = 'default'): string {\n if (value == null) return '' // null or undefined produces an empty string\n\n const options = typeof format === 'string' ? numberFormats[format] : format\n if (! options) warn(`NumberFormat alias \"${format}\" not found`)\n\n return new Intl.NumberFormat(translator.locale, options).format(value)\n },\n\n t(translation: TranslationKey | Translation, params?: TranslationParams): string {\n return translator.tc(translation, 1, params)\n },\n\n tc(translation: TranslationKey | Translation, n: number, params?: TranslationParams): string {\n const template = getTemplate(translations, translation, languages.value)\n const format = new Intl.NumberFormat(translator.locale, numberFormats['default'])\n return replaceParams(template, Object.assign({ n }, params), format)\n },\n\n d(input?: DateInput, format: DateTimeFormatAlias | Intl.DateTimeFormatOptions = 'default', timeZone?: string): string {\n if ((input == null) || (input === '')) return ''\n\n const date = input instanceof Date ? input : new Date(input)\n const options = typeof format === 'string' ? dateTimeFormats[format] : format\n if (! options) warn(`DateTimeFormat alias \"${format}\" not found`)\n\n // Merge the default time zone with the options\n const optionsWithTimeZone = { timeZone: timeZone || defaultTimeZone, ...options }\n\n // Format our date, optionally defaulting the time zone\n return new Intl.DateTimeFormat(locale.value, optionsWithTimeZone).format(date)\n },\n\n utils: {\n language(code: ISOLanguage): string {\n return new Intl.DisplayNames(translator.locale, { type: 'language' }).of(code)!\n },\n country(code: ISOCountry | 'EU' | 'UN'): string {\n return new Intl.DisplayNames(translator.locale, { type: 'region' }).of(code)!\n },\n flag(code: ISOCountry | 'EU' | 'UN'): string {\n return [ ...code ]\n .map((c) => c.codePointAt(0)!)\n .map((n) => 0x1f1a5 + n)\n .map((n) => String.fromCodePoint(n))\n .join('')\n },\n },\n } as const satisfies Translator\n\n // Return a reactive version of the translator\n return reactive(translator)\n}\n\n/* ===== TRANSLATION UTILITIES ============================================== */\n\ntype LanguageKeys = readonly [ string, ...string[] ]\ntype InternalTranslation = Record<string, string | undefined>\ntype InternalTranslations = Record<string, InternalTranslation>\ntype TranslationTemplate = { zero: string, singular: string, plural: string }\n\n/**\n * Cached parsed translation templates.\n *\n * The keys are:\n * 1) the translations instance (WeakMap key)\n * 2) the current language (first entry in the order)\n * 3) the translation key\n */\nconst caches = new WeakMap<InternalTranslations, Record<string, Record<string, TranslationTemplate>>>()\n\n/** Get the `TranslationTemplate` for the translation or translation key. */\nfunction getTemplate(\n translations: InternalTranslations,\n translation: TranslationKey | Translation,\n languages: LanguageKeys,\n): TranslationTemplate {\n if (! translation) throw new Error('No translation key specified')\n\n if (typeof translation === 'string') {\n // Get the cache for the messages instance\n let cache = caches.get(translations)\n if (! cache) caches.set(translations, cache = {})\n\n // Get the cache for the current language\n let languageCache = cache[languages[0]]\n if (! languageCache) cache[languages[0]] = languageCache = {}\n\n // Get the translation from the cache or parse it\n let template = languageCache[translation]\n if (! template) {\n let object = translations[translation]\n if (! object) {\n warn(`Translation key \"${translation}\" not found`)\n object = { [languages[languages.length - 1]!]: translation }\n }\n template = extractTemplate(object, languages)\n languageCache[translation] = template\n }\n\n return template\n } else {\n return extractTemplate(translation, languages)\n }\n}\n\n/**\n * Extract a message from a translation, according to its locale, and split\n * it into its parsed components: zero, singular, and plural.\n */\nfunction extractTemplate(\n translation: InternalTranslation,\n languages: LanguageKeys,\n): TranslationTemplate {\n let string: string | undefined = undefined\n\n for (const language of languages) {\n string = translation[language as any]\n if (string) break\n }\n\n if (! string) {\n const language = languages[languages.length - 1]\n warn(`Translation missing default language \"${language}\" in`, translation)\n return { zero: '', singular: '', plural: '' }\n }\n\n let parsed: TranslationTemplate\n\n const translations = string.split(/(?<!\\\\)(?:\\\\\\\\)*\\|/)\n if (translations.length === 1) {\n const [ singular ] = translations\n parsed = { zero: singular!, singular: singular!, plural: singular! }\n } else if (translations.length === 2) {\n const [ singular, plural ] = translations\n parsed ={ zero: plural!, singular: singular!, plural: plural! }\n } else {\n const [ zero, singular, plural ] = translations\n parsed ={ zero: zero!, singular: singular!, plural: plural! }\n }\n\n const { zero, singular, plural } = parsed\n return { zero: zero.trim(), singular: singular.trim(), plural: plural.trim() }\n}\n\n/** Replace the parameters in a translation template, returning a string */\nfunction replaceParams(\n template: TranslationTemplate,\n params: TranslationParams,\n format: Intl.NumberFormat,\n): string {\n // Select the template to use based on the \"n\" (number) parameter\n const n = typeof params.n === 'string' ? Number(params.n) : params.n\n let formatted = n === 0 ? template.zero :\n n === 1 ? template.singular :\n template.plural\n\n // Replace any property `{ prop }` with the associated value\n for (const [ prop, value ] of Object.entries(params)) {\n const string =\n typeof value === 'number' ? format.format(value) :\n typeof value === 'string' ? value :\n value ? String(value) : ''\n\n // Expression matches `{ xxx }` where `{` is _not_ preceded by a '\\'\n const expr = new RegExp(`(.|^)({\\\\s*${prop}\\\\s*})`, 'gi')\n formatted = formatted.replaceAll(expr, (_, before, token) => {\n return before === '\\\\' ? token : before + string\n })\n }\n\n // All done!\n return formatted.trim()\n}\n","import { inject } from 'vue'\n\nimport { makeTranslator } from './translator'\n\nimport type { App } from 'vue'\nimport type { ISOCurrency } from './iso-4217'\nimport type { ISOLanguage } from './iso-639'\nimport type { Translator } from './translator'\n\n/* ===== REFERENCE LANGUAGES AND COUNTRIES ================================== */\n\nexport { ISO_COUNTRIES } from './iso-3166'\nexport { ISO_CURRENCIES } from './iso-4217'\nexport { ISO_LANGUAGES } from './iso-639'\n\nexport type * from './iso-3166'\nexport type * from './iso-639'\n\n/* ===== TYPES FOR DECLARATION MERGING ====================================== */\n\n/**\n * I18n Configuration interface (to be merged with the actual configuration).\n *\n * This interface (intentionally empty) is used to merge the actual per-app\n * configuration of the translation system, in order to provide the correct\n * types to the rest of the system.\n *\n * Two properties are expected to be defined in the configuration:\n *\n * * `languages`: the list of supported languages for the application. Those\n * are ISO 639-1 language codes, and when specified, _every_\n * translation _must_ include a translation for each.\n * * `translationKeys`: the list of translation keys known by the application.\n * Those are the arbitrary keys used to identify the\n * messages to be translated with the `t` and `tc`\n * methods of `Translator`.\n * * `dateTimeFormats`: the date and time formats _aliases_ used by the\n * application.\n * * `numberFormats`: the number formats _aliases_ used by the application.\n *\n * To configure the types, follow the example below:\n *\n * ```ts\n * const translations = {\n * 'hello': { en: 'Hello, world!', de: 'Hallo, Welt!' }\n * } as const satisfies Translations\n *\n * const dateTimeFormats = {\n * // override the default format\n * default: { dateStyle: 'short', timeStyle: 'short' },\n * // add a new custom format\n * custom: {\n * day: '2-digit',\n * month: '2-digit',\n * year: 'numeric',\n * weekday: 'short',\n * timeZone: 'UTC',\n * },\n * } as const satisfies DateTimeFormats\n *\n * const numberFormats = {\n * speed: { style: 'unit', unit: 'kilometer-per-hour' },\n * } as const satisfies NumberFormats\n *\n * declare module '@juit/vue-i18n' {\n * export interface I18nConfiguration {\n * languages: 'de' | 'en',\n * translationKeys: keyof typeof translations,\n * dateTimeFormats: keyof typeof dateTimeFormats,\n * numberFormats: keyof typeof numberFormats,\n * }\n * }\n * ```\n */\nexport interface I18nConfiguration {\n // intentionally empty\n}\n\n/* ===== FROM CONFIG TO TRANSLATIONS ======================================== */\n\n/** Extract the value associated with key `K` from type `T` if it extends `R`, otherwise return `R` */\ntype ExtractConfig<T, R, K extends string> = T extends { [ X in K ]: infer V } ? V extends R ? V : R : R\n\n/** The languages configured in `I18nConfiguration` or all ISO languages */\nexport type Language = ExtractConfig<I18nConfiguration, ISOLanguage, 'languages'>\n\n/** Base translations, either required when languages are set or all optional */\ntype BaseTranslation = ISOLanguage extends Language ? {\n readonly [ key in ISOLanguage ]?: string\n} : {\n readonly [ key in Language ]: string\n}\n\n/** Extended translations, supporting multiple region of each language */\ntype ExtendedTranslation = {\n readonly [ key in `${Language}-${string}` ]?: string\n}\n\n/** Prettify our `Translations` exported type */\ntype PrettifyTranslation<T> = { [ l in keyof T ]: T[l] }\n\n/**\n * A type describing the translations for a given translation key.\n *\n * When the `I18nConfig` interface is properly merged with and its contains\n * the `languages` property, this type will represent the list of required\n * translation keys (languages) required for each translation.\n *\n * When left unconfigured, all ISO languages will be considered as optional.\n */\nexport type Translation = PrettifyTranslation<BaseTranslation & ExtendedTranslation>\n\n/**\n * All known translation keys.\n *\n * When the `I18nConfig` interface is properly merged with and its contains\n * the `translationKeys` property, this type will represent the list of\n * translations keys available to the `t(...)` and `tc(...)` methods.\n *\n * When left unconfigured, this type will be `string`.\n */\nexport type TranslationKey = ExtractConfig<I18nConfiguration, string, 'translationKeys'>\n\n/**\n * All known date and time formats aliases.\n *\n * When the `I18nConfig` interface is properly merged with and its contains\n * the `dateTimeFormats` property, this type will represent the list of\n * date and time formats available to the `d(...)` method.\n *\n * When left unconfigured, this type will be `string`.\n */\nexport type DateTimeFormatAlias = ExtractConfig<I18nConfiguration, string, 'dateTimeFormats'>\n | 'default' | 'short' | 'medium' | 'long' | 'full'\n | 'date' | 'shortDate' | 'mediumDate' | 'longDate' | 'fullDate'\n | 'time' | 'shortTime' | 'mediumTime' | 'longTime' | 'fullTime'\n\n/**\n * All known number formats aliases.\n *\n * When the `I18nConfig` interface is properly merged with and its contains\n * the `numberFormats` property, this type will represent the list of\n * date and time formats available to the `n(...)` method.\n *\n * When left unconfigured, this type will be `string`.\n */\nexport type NumberFormatAlias = ExtractConfig<I18nConfiguration, string, 'numberFormats'>\n | 'default' | ISOCurrency\n\n/* ===== MODULE INITIALIZATION ============================================== */\n\n/* Export the translator types */\nexport type * from './translator'\n\n/**\n * Options to initialize the translations handled by the translation system.\n *\n * Shared translations are defined as a key-value pair, where the key is the\n * identifier of the translation, and the value is an object containing the\n * translations for each language.\n */\nexport interface Translations {\n readonly [ key: string ]: Translation\n}\n\n/**\n * Options to initialize the date and time format _aliases_ used by the\n * translation system.\n *\n * The default aliases (each can be overridden) are:\n *\n * ```ts\n * {\n * default: { dateStyle: 'medium', timeStyle: 'medium' },\n * short: { dateStyle: 'short', timeStyle: 'short' },\n * medium: { dateStyle: 'medium', timeStyle: 'medium' },\n * long: { dateStyle: 'long', timeStyle: 'long' },\n * full: { dateStyle: 'full', timeStyle: 'full' },\n *\n * // date only formats\n * date: { dateStyle: 'medium' },\n * shortDate: { dateStyle: 'short' },\n * mediumDate: { dateStyle: 'medium' },\n * longDate: { dateStyle: 'long' },\n * fullDate: { dateStyle: 'full' },\n *\n * // time only formats\n * time: { timeStyle: 'medium' },\n * shortTime: { timeStyle: 'short' },\n * mediumTime: { timeStyle: 'medium' },\n * longTime: { timeStyle: 'long' },\n * fullTime: { timeStyle: 'full' },\n * }\n * ```\n */\nexport interface DateTimeFormats {\n readonly [ key: string ]: Intl.DateTimeFormatOptions\n}\n\n/**\n * Options to initialize the number format _aliases_ used by the translation\n * system.\n *\n * The default aliases (each can be overridden) are:\n *\n * ```ts\n * {\n * default: { }, // use the default number format\n * EUR: { style: 'currency', currency: 'EUR' },\n * USD: { style: 'currency', currency: 'USD' },\n * // ... all currency codes can be used as aliases\n * }\n * ```\n */\nexport interface NumberFormats {\n readonly [ key: string ]: Intl.NumberFormatOptions\n}\n\n/** The language or locale to use at construction */\nexport type DefaultLanguage = ISOLanguage | `${ISOLanguage}-${string}` | Intl.Locale\n\n/** Options to initialize the I18n plugin */\nexport interface I18nOptions {\n defaultLanguage: DefaultLanguage,\n defaultTimeZone?: string,\n translations?: Translations,\n dateTimeFormats?: DateTimeFormats,\n numberFormats?: NumberFormats,\n}\n\n/* ===== PUBLIC METHODS ===================================================== */\n\n/** Symbol for Vue injections */\nconst injectionSymbol = Symbol.for('@juit/vue-i18n/translator')\n\n/** Initialize the translation system plugin */\nexport function i18n(app: App, optionsOrLanguage: Language | I18nOptions): App {\n const options = typeof optionsOrLanguage === 'string' ?\n { defaultLanguage: optionsOrLanguage } : optionsOrLanguage\n\n const translator = makeTranslator(options)\n\n app.config.globalProperties.$t = translator.t\n app.config.globalProperties.$tc = translator.tc\n app.config.globalProperties.$n = translator.n\n app.config.globalProperties.$d = translator.d\n\n app.provide(injectionSymbol, translator)\n return app\n}\n\n/** Retrieve the translator instance from the Vue app */\nexport function useTranslator(): Translator {\n const translator = inject(injectionSymbol)\n if (! translator) throw new Error('No translator found in the Vue app')\n return translator as Translator\n}\n\n/* ===== VUE EXTENSIONS ===================================================== */\n\n// Extension to the Vue component interface\ndeclare module 'vue' {\n interface ComponentCustomProperties {\n /** Translate a message according to the current language */\n $t: Translator['t']\n /**\n * Return the (possibly parameterized) translation for the specified message\n * in the current language, with pluralization.\n */\n $tc: Translator['tc']\n /** Format a number into a string according to the current language */\n $n: Translator['n']\n /**\n * Format date and time using the specified style (defaults to `medium`)\n * according to the current language\n */\n $d: Translator['d']\n }\n}\n"],"names":["ISO_COUNTRIES","ISO_CURRENCIES","ISO_LANGUAGES","checkLocale","locale","warn","makeTranslator","options","defaultLocale","defaultLanguage","defaultTimeZone","translations","dateTimeFormats","numberFormats","formats","currency","shallowRef","watch","languages","computed","language","region","order","translator","value","format","translation","params","template","getTemplate","replaceParams","input","timeZone","date","optionsWithTimeZone","code","c","reactive","caches","cache","languageCache","object","extractTemplate","string","parsed","singular","plural","zero","n","formatted","prop","expr","_","before","token","injectionSymbol","i18n","app","optionsOrLanguage","useTranslator","inject"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../lib/iso-3166.ts","../lib/iso-4217.ts","../lib/iso-639.ts","../lib/translator.ts","../lib/index.ts"],"sourcesContent":["/** The array of all known ISO-3166-1 countries */\nexport const ISO_COUNTRIES = [\n ...('ADAEAFAGAIALAMAOAQARASATAUAWAXAZBABBBDBEBFBGBHBIBJBLBMBNBOBQBRBSBTBVBW' +\n 'BYBZCACCCDCFCGCHCICKCLCMCNCOCRCUCVCWCXCYCZDEDJDKDMDODZECEEEGEHERESETFIFJFK' +\n 'FMFOFRGAGBGDGEGFGGGHGIGLGMGNGPGQGRGSGTGUGWGYHKHMHNHRHTHUIDIEILIMINIOIQIRIS' +\n 'ITJEJMJOJPKEKGKHKIKMKNKPKRKWKYKZLALBLCLILKLRLSLTLULVLYMAMCMDMEMFMGMHMKMLMM' +\n 'MNMOMPMQMRMSMTMUMVMWMXMYMZNANCNENFNGNINLNONPNRNUNZOMPAPEPFPGPHPKPLPMPNPRPS' +\n 'PTPWPYQARERORSRURWSASBSCSDSESGSHSISJSKSLSMSNSOSRSSSTSVSXSYSZTCTDTFTGTHTJTK' +\n 'TLTMTNTOTRTTTVTWTZUAUGUMUSUYUZVAVCVEVGVIVNVUWFWSXKYEYTZAZMZW').match(/../g)!,\n].sort() as ISOCountry[]\n\n/** All known ISO-3166-1 countries and their names */\nexport type ISOCountries = {\n AD: 'Andorra',\n AE: 'United Arab Emirates',\n AF: 'Afghanistan',\n AG: 'Antigua & Barbuda',\n AI: 'Anguilla',\n AL: 'Albania',\n AM: 'Armenia',\n AO: 'Angola',\n AQ: 'Antarctica',\n AR: 'Argentina',\n AS: 'American Samoa',\n AT: 'Austria',\n AU: 'Australia',\n AW: 'Aruba',\n AX: 'Åland Islands',\n AZ: 'Azerbaijan',\n BA: 'Bosnia & Herzegovina',\n BB: 'Barbados',\n BD: 'Bangladesh',\n BE: 'Belgium',\n BF: 'Burkina Faso',\n BG: 'Bulgaria',\n BH: 'Bahrain',\n BI: 'Burundi',\n BJ: 'Benin',\n BL: 'St. Barthélemy',\n BM: 'Bermuda',\n BN: 'Brunei',\n BO: 'Bolivia',\n BQ: 'Caribbean Netherlands',\n BR: 'Brazil',\n BS: 'Bahamas',\n BT: 'Bhutan',\n BV: 'Bouvet Island',\n BW: 'Botswana',\n BY: 'Belarus',\n BZ: 'Belize',\n CA: 'Canada',\n CC: 'Cocos (Keeling) Islands',\n CD: 'Congo - Kinshasa',\n CF: 'Central African Republic',\n CG: 'Congo - Brazzaville',\n CH: 'Switzerland',\n CI: 'Côte d\\'Ivoire',\n CK: 'Cook Islands',\n CL: 'Chile',\n CM: 'Cameroon',\n CN: 'China',\n CO: 'Colombia',\n CR: 'Costa Rica',\n CU: 'Cuba',\n CV: 'Cape Verde',\n CW: 'Curaçao',\n CX: 'Christmas Island',\n CY: 'Cyprus',\n CZ: 'Czechia',\n DE: 'Germany',\n DJ: 'Djibouti',\n DK: 'Denmark',\n DM: 'Dominica',\n DO: 'Dominican Republic',\n DZ: 'Algeria',\n EC: 'Ecuador',\n EE: 'Estonia',\n EG: 'Egypt',\n EH: 'Western Sahara',\n ER: 'Eritrea',\n ES: 'Spain',\n ET: 'Ethiopia',\n FI: 'Finland',\n FJ: 'Fiji',\n FK: 'Falkland Islands',\n FM: 'Micronesia',\n FO: 'Faroe Islands',\n FR: 'France',\n GA: 'Gabon',\n GB: 'United Kingdom',\n GD: 'Grenada',\n GE: 'Georgia',\n GF: 'French Guiana',\n GG: 'Guernsey',\n GH: 'Ghana',\n GI: 'Gibraltar',\n GL: 'Greenland',\n GM: 'Gambia',\n GN: 'Guinea',\n GP: 'Guadeloupe',\n GQ: 'Equatorial Guinea',\n GR: 'Greece',\n GS: 'South Georgia & South Sandwich Islands',\n GT: 'Guatemala',\n GU: 'Guam',\n GW: 'Guinea-Bissau',\n GY: 'Guyana',\n HK: 'Hong Kong SAR China',\n HM: 'Heard & McDonald Islands',\n HN: 'Honduras',\n HR: 'Croatia',\n HT: 'Haiti',\n HU: 'Hungary',\n ID: 'Indonesia',\n IE: 'Ireland',\n IL: 'Israel',\n IM: 'Isle of Man',\n IN: 'India',\n IO: 'British Indian Ocean Territory',\n IQ: 'Iraq',\n IR: 'Iran',\n IS: 'Iceland',\n IT: 'Italy',\n JE: 'Jersey',\n JM: 'Jamaica',\n JO: 'Jordan',\n JP: 'Japan',\n KE: 'Kenya',\n KG: 'Kyrgyzstan',\n KH: 'Cambodia',\n KI: 'Kiribati',\n KM: 'Comoros',\n KN: 'St. Kitts & Nevis',\n KP: 'North Korea',\n KR: 'South Korea',\n KW: 'Kuwait',\n KY: 'Cayman Islands',\n KZ: 'Kazakhstan',\n LA: 'Laos',\n LB: 'Lebanon',\n LC: 'St. Lucia',\n LI: 'Liechtenstein',\n LK: 'Sri Lanka',\n LR: 'Liberia',\n LS: 'Lesotho',\n LT: 'Lithuania',\n LU: 'Luxembourg',\n LV: 'Latvia',\n LY: 'Libya',\n MA: 'Morocco',\n MC: 'Monaco',\n MD: 'Moldova',\n ME: 'Montenegro',\n MF: 'St. Martin',\n MG: 'Madagascar',\n MH: 'Marshall Islands',\n MK: 'North Macedonia',\n ML: 'Mali',\n MM: 'Myanmar (Burma)',\n MN: 'Mongolia',\n MO: 'Macao SAR China',\n MP: 'Northern Mariana Islands',\n MQ: 'Martinique',\n MR: 'Mauritania',\n MS: 'Montserrat',\n MT: 'Malta',\n MU: 'Mauritius',\n MV: 'Maldives',\n MW: 'Malawi',\n MX: 'Mexico',\n MY: 'Malaysia',\n MZ: 'Mozambique',\n NA: 'Namibia',\n NC: 'New Caledonia',\n NE: 'Niger',\n NF: 'Norfolk Island',\n NG: 'Nigeria',\n NI: 'Nicaragua',\n NL: 'Netherlands',\n NO: 'Norway',\n NP: 'Nepal',\n NR: 'Nauru',\n NU: 'Niue',\n NZ: 'New Zealand',\n OM: 'Oman',\n PA: 'Panama',\n PE: 'Peru',\n PF: 'French Polynesia',\n PG: 'Papua New Guinea',\n PH: 'Philippines',\n PK: 'Pakistan',\n PL: 'Poland',\n PM: 'St. Pierre & Miquelon',\n PN: 'Pitcairn Islands',\n PR: 'Puerto Rico',\n PS: 'Palestinian Territories',\n PT: 'Portugal',\n PW: 'Palau',\n PY: 'Paraguay',\n QA: 'Qatar',\n RE: 'Réunion',\n RO: 'Romania',\n RS: 'Serbia',\n RU: 'Russia',\n RW: 'Rwanda',\n SA: 'Saudi Arabia',\n SB: 'Solomon Islands',\n SC: 'Seychelles',\n SD: 'Sudan',\n SE: 'Sweden',\n SG: 'Singapore',\n SH: 'St. Helena',\n SI: 'Slovenia',\n SJ: 'Svalbard & Jan Mayen',\n SK: 'Slovakia',\n SL: 'Sierra Leone',\n SM: 'San Marino',\n SN: 'Senegal',\n SO: 'Somalia',\n SR: 'Suriname',\n SS: 'South Sudan',\n ST: 'São Tomé & Príncipe',\n SV: 'El Salvador',\n SX: 'Sint Maarten',\n SY: 'Syria',\n SZ: 'Eswatini',\n TC: 'Turks & Caicos Islands',\n TD: 'Chad',\n TF: 'French Southern Territories',\n TG: 'Togo',\n TH: 'Thailand',\n TJ: 'Tajikistan',\n TK: 'Tokelau',\n TL: 'Timor-Leste',\n TM: 'Turkmenistan',\n TN: 'Tunisia',\n TO: 'Tonga',\n TR: 'Türkiye',\n TT: 'Trinidad & Tobago',\n TV: 'Tuvalu',\n TW: 'Taiwan',\n TZ: 'Tanzania',\n UA: 'Ukraine',\n UG: 'Uganda',\n UM: 'U.S. Outlying Islands',\n US: 'United States',\n UY: 'Uruguay',\n UZ: 'Uzbekistan',\n VA: 'Vatican City',\n VC: 'St. Vincent & Grenadines',\n VE: 'Venezuela',\n VG: 'British Virgin Islands',\n VI: 'U.S. Virgin Islands',\n VN: 'Vietnam',\n VU: 'Vanuatu',\n WF: 'Wallis & Futuna',\n WS: 'Samoa',\n XK: 'Kosovo', // not an official ISO-3166-1 country, but specified in CLDR\n YE: 'Yemen',\n YT: 'Mayotte',\n ZA: 'South Africa',\n ZM: 'Zambia',\n ZW: 'Zimbabwe',\n}\n\n/** Array of all known ISO-3166-1 country names */\nexport type ISOCountry = keyof ISOCountries\n","/** The array of all known ISO-639-1 languages */\nexport const ISO_CURRENCIES = Intl.supportedValuesOf('currency') as ISOCurrency[]\n\n/** All known ISO-4217 currencies and their name */\nexport type ISOCurrencies = {\n AED: 'United Arab Emirates Dirham',\n AFN: 'Afghan Afghani',\n ALL: 'Albanian Lek',\n AMD: 'Armenian Dram',\n ANG: 'Netherlands Antillean Guilder',\n AOA: 'Angolan Kwanza',\n ARS: 'Argentine Peso',\n AUD: 'Australian Dollar',\n AWG: 'Aruban Florin',\n AZN: 'Azerbaijani Manat',\n BAM: 'Bosnia-Herzegovina Convertible Mark',\n BBD: 'Barbadian Dollar',\n BDT: 'Bangladeshi Taka',\n BGN: 'Bulgarian Lev',\n BHD: 'Bahraini Dinar',\n BIF: 'Burundian Franc',\n BMD: 'Bermudan Dollar',\n BND: 'Brunei Dollar',\n BOB: 'Bolivian Boliviano',\n BRL: 'Brazilian Real',\n BSD: 'Bahamian Dollar',\n BTN: 'Bhutanese Ngultrum',\n BWP: 'Botswanan Pula',\n BYN: 'Belarusian Ruble',\n BZD: 'Belize Dollar',\n CAD: 'Canadian Dollar',\n CDF: 'Congolese Franc',\n CHF: 'Swiss Franc',\n CLP: 'Chilean Peso',\n CNY: 'Chinese Yuan',\n COP: 'Colombian Peso',\n CRC: 'Costa Rican Colón',\n CUC: 'Cuban Convertible Peso',\n CUP: 'Cuban Peso',\n CVE: 'Cape Verdean Escudo',\n CZK: 'Czech Koruna',\n DJF: 'Djiboutian Franc',\n DKK: 'Danish Krone',\n DOP: 'Dominican Peso',\n DZD: 'Algerian Dinar',\n EGP: 'Egyptian Pound',\n ERN: 'Eritrean Nakfa',\n ETB: 'Ethiopian Birr',\n EUR: 'Euro',\n FJD: 'Fijian Dollar',\n FKP: 'Falkland Islands Pound',\n GBP: 'British Pound',\n GEL: 'Georgian Lari',\n GHS: 'Ghanaian Cedi',\n GIP: 'Gibraltar Pound',\n GMD: 'Gambian Dalasi',\n GNF: 'Guinean Franc',\n GTQ: 'Guatemalan Quetzal',\n GYD: 'Guyanaese Dollar',\n HKD: 'Hong Kong Dollar',\n HNL: 'Honduran Lempira',\n HRK: 'Croatian Kuna',\n HTG: 'Haitian Gourde',\n HUF: 'Hungarian Forint',\n IDR: 'Indonesian Rupiah',\n ILS: 'Israeli New Shekel',\n INR: 'Indian Rupee',\n IQD: 'Iraqi Dinar',\n IRR: 'Iranian Rial',\n ISK: 'Icelandic Króna',\n JMD: 'Jamaican Dollar',\n JOD: 'Jordanian Dinar',\n JPY: 'Japanese Yen',\n KES: 'Kenyan Shilling',\n KGS: 'Kyrgystani Som',\n KHR: 'Cambodian Riel',\n KMF: 'Comorian Franc',\n KPW: 'North Korean Won',\n KRW: 'South Korean Won',\n KWD: 'Kuwaiti Dinar',\n KYD: 'Cayman Islands Dollar',\n KZT: 'Kazakhstani Tenge',\n LAK: 'Laotian Kip',\n LBP: 'Lebanese Pound',\n LKR: 'Sri Lankan Rupee',\n LRD: 'Liberian Dollar',\n LSL: 'Lesotho Loti',\n LYD: 'Libyan Dinar',\n MAD: 'Moroccan Dirham',\n MDL: 'Moldovan Leu',\n MGA: 'Malagasy Ariary',\n MKD: 'Macedonian Denar',\n MMK: 'Myanmar Kyat',\n MNT: 'Mongolian Tugrik',\n MOP: 'Macanese Pataca',\n MRU: 'Mauritanian Ouguiya',\n MUR: 'Mauritian Rupee',\n MVR: 'Maldivian Rufiyaa',\n MWK: 'Malawian Kwacha',\n MXN: 'Mexican Peso',\n MYR: 'Malaysian Ringgit',\n MZN: 'Mozambican Metical',\n NAD: 'Namibian Dollar',\n NGN: 'Nigerian Naira',\n NIO: 'Nicaraguan Córdoba',\n NOK: 'Norwegian Krone',\n NPR: 'Nepalese Rupee',\n NZD: 'New Zealand Dollar',\n OMR: 'Omani Rial',\n PAB: 'Panamanian Balboa',\n PEN: 'Peruvian Sol',\n PGK: 'Papua New Guinean Kina',\n PHP: 'Philippine Peso',\n PKR: 'Pakistani Rupee',\n PLN: 'Polish Zloty',\n PYG: 'Paraguayan Guarani',\n QAR: 'Qatari Riyal',\n RON: 'Romanian Leu',\n RSD: 'Serbian Dinar',\n RUB: 'Russian Ruble',\n RWF: 'Rwandan Franc',\n SAR: 'Saudi Riyal',\n SBD: 'Solomon Islands Dollar',\n SCR: 'Seychellois Rupee',\n SDG: 'Sudanese Pound',\n SEK: 'Swedish Krona',\n SGD: 'Singapore Dollar',\n SHP: 'St. Helena Pound',\n SLL: 'Sierra Leonean Leone (1964—2022)',\n SOS: 'Somali Shilling',\n SRD: 'Surinamese Dollar',\n SSP: 'South Sudanese Pound',\n STN: 'São Tomé & Príncipe Dobra',\n SVC: 'Salvadoran Colón',\n SYP: 'Syrian Pound',\n SZL: 'Swazi Lilangeni',\n THB: 'Thai Baht',\n TJS: 'Tajikistani Somoni',\n TMT: 'Turkmenistani Manat',\n TND: 'Tunisian Dinar',\n TOP: 'Tongan Paʻanga',\n TRY: 'Turkish Lira',\n TTD: 'Trinidad & Tobago Dollar',\n TWD: 'New Taiwan Dollar',\n TZS: 'Tanzanian Shilling',\n UAH: 'Ukrainian Hryvnia',\n UGX: 'Ugandan Shilling',\n USD: 'US Dollar',\n UYU: 'Uruguayan Peso',\n UZS: 'Uzbekistani Som',\n VES: 'Venezuelan Bolívar',\n VND: 'Vietnamese Dong',\n VUV: 'Vanuatu Vatu',\n WST: 'Samoan Tala',\n XAF: 'Central African CFA Franc',\n XCD: 'East Caribbean Dollar',\n XDR: 'Special Drawing Rights',\n XOF: 'West African CFA Franc',\n XPF: 'CFP Franc',\n XSU: 'Sucre',\n YER: 'Yemeni Rial',\n ZAR: 'South African Rand',\n ZMW: 'Zambian Kwacha',\n ZWL: 'Zimbabwean Dollar (2009)',\n}\n\n/** All known ISO-4217 currency codes */\nexport type ISOCurrency = keyof ISOCurrencies\n","/** The array of all known ISO-639-1 languages */\nexport const ISO_LANGUAGES = [\n ...('aaabaeafakamanarasavayazbabebgbhbibmbnbobrbscacechcocrcscucvcydadedvdz' +\n 'eeeleneoeseteufafffifjfofrfygagdglgngugvhahehihohrhthuhyhziaidieigiiikiois' +\n 'itiujajvkakgkikjkkklkmknkokrkskukvkwkylalblglilnloltlulvmgmhmimkmlmnmrmsmt' +\n 'mynanbndnengnlnnnonrnvnyocojomorospapiplpsptqurmrnrorurwsascsdsesgsiskslsm' +\n 'snsosqsrssstsusvswtatetgthtitktltntotrtstttwtyugukuruzvevivowawoxhyiyozazh' +\n 'zu').match(/../g)!,\n].sort() as ISOLanguage[]\n\n/** All known ISO-639-1 languages and their name */\nexport type ISOLanguages = {\n aa: 'Afar',\n ab: 'Abkhazian',\n ae: 'Avestan',\n af: 'Afrikaans',\n ak: 'Akan',\n am: 'Amharic',\n an: 'Aragonese',\n ar: 'Arabic',\n as: 'Assamese',\n av: 'Avaric',\n ay: 'Aymara',\n az: 'Azerbaijani',\n ba: 'Bashkir',\n be: 'Belarusian',\n bg: 'Bulgarian',\n bh: 'Bhojpuri',\n bi: 'Bislama',\n bm: 'Bambara',\n bn: 'Bangla',\n bo: 'Tibetan',\n br: 'Breton',\n bs: 'Bosnian',\n ca: 'Catalan',\n ce: 'Chechen',\n ch: 'Chamorro',\n co: 'Corsican',\n cr: 'Cree',\n cs: 'Czech',\n cu: 'Church Slavic',\n cv: 'Chuvash',\n cy: 'Welsh',\n da: 'Danish',\n de: 'German',\n dv: 'Divehi',\n dz: 'Dzongkha',\n ee: 'Ewe',\n el: 'Greek',\n en: 'English',\n eo: 'Esperanto',\n es: 'Spanish',\n et: 'Estonian',\n eu: 'Basque',\n fa: 'Persian',\n ff: 'Fula',\n fi: 'Finnish',\n fj: 'Fijian',\n fo: 'Faroese',\n fr: 'French',\n fy: 'Western Frisian',\n ga: 'Irish',\n gd: 'Scottish Gaelic',\n gl: 'Galician',\n gn: 'Guarani',\n gu: 'Gujarati',\n gv: 'Manx',\n ha: 'Hausa',\n he: 'Hebrew',\n hi: 'Hindi',\n ho: 'Hiri Motu',\n hr: 'Croatian',\n ht: 'Haitian Creole',\n hu: 'Hungarian',\n hy: 'Armenian',\n hz: 'Herero',\n ia: 'Interlingua',\n id: 'Indonesian',\n ie: 'Interlingue',\n ig: 'Igbo',\n ii: 'Sichuan Yi',\n ik: 'Inupiaq',\n io: 'Ido',\n is: 'Icelandic',\n it: 'Italian',\n iu: 'Inuktitut',\n ja: 'Japanese',\n jv: 'Javanese',\n ka: 'Georgian',\n kg: 'Kongo',\n ki: 'Kikuyu',\n kj: 'Kuanyama',\n kk: 'Kazakh',\n kl: 'Kalaallisut',\n km: 'Khmer',\n kn: 'Kannada',\n ko: 'Korean',\n kr: 'Kanuri',\n ks: 'Kashmiri',\n ku: 'Kurdish',\n kv: 'Komi',\n kw: 'Cornish',\n ky: 'Kyrgyz',\n la: 'Latin',\n lb: 'Luxembourgish',\n lg: 'Ganda',\n li: 'Limburgish',\n ln: 'Lingala',\n lo: 'Lao',\n lt: 'Lithuanian',\n lu: 'Luba-Katanga',\n lv: 'Latvian',\n mg: 'Malagasy',\n mh: 'Marshallese',\n mi: 'Māori',\n mk: 'Macedonian',\n ml: 'Malayalam',\n mn: 'Mongolian',\n mr: 'Marathi',\n ms: 'Malay',\n mt: 'Maltese',\n my: 'Burmese',\n na: 'Nauru',\n nb: 'Norwegian Bokmål',\n nd: 'North Ndebele',\n ne: 'Nepali',\n ng: 'Ndonga',\n nl: 'Dutch',\n nn: 'Norwegian Nynorsk',\n no: 'Norwegian',\n nr: 'South Ndebele',\n nv: 'Navajo',\n ny: 'Nyanja',\n oc: 'Occitan',\n oj: 'Ojibwa',\n om: 'Oromo',\n or: 'Odia',\n os: 'Ossetic',\n pa: 'Punjabi',\n pi: 'Pali',\n pl: 'Polish',\n ps: 'Pashto',\n pt: 'Portuguese',\n qu: 'Quechua',\n rm: 'Romansh',\n rn: 'Rundi',\n ro: 'Romanian',\n ru: 'Russian',\n rw: 'Kinyarwanda',\n sa: 'Sanskrit',\n sc: 'Sardinian',\n sd: 'Sindhi',\n se: 'Northern Sami',\n sg: 'Sango',\n si: 'Sinhala',\n sk: 'Slovak',\n sl: 'Slovenian',\n sm: 'Samoan',\n sn: 'Shona',\n so: 'Somali',\n sq: 'Albanian',\n sr: 'Serbian',\n ss: 'Swati',\n st: 'Southern Sotho',\n su: 'Sundanese',\n sv: 'Swedish',\n sw: 'Swahili',\n ta: 'Tamil',\n te: 'Telugu',\n tg: 'Tajik',\n th: 'Thai',\n ti: 'Tigrinya',\n tk: 'Turkmen',\n tl: 'Filipino',\n tn: 'Tswana',\n to: 'Tongan',\n tr: 'Turkish',\n ts: 'Tsonga',\n tt: 'Tatar',\n tw: 'Akan',\n ty: 'Tahitian',\n ug: 'Uyghur',\n uk: 'Ukrainian',\n ur: 'Urdu',\n uz: 'Uzbek',\n ve: 'Venda',\n vi: 'Vietnamese',\n vo: 'Volapük',\n wa: 'Walloon',\n wo: 'Wolof',\n xh: 'Xhosa',\n yi: 'Yiddish',\n yo: 'Yoruba',\n za: 'Zhuang',\n zh: 'Chinese',\n zu: 'Zulu',\n}\n\n/** All known ISO-639-1 language codes */\nexport type ISOLanguage = keyof ISOLanguages\n","import { computed, reactive, shallowRef, warn, watch } from 'vue'\n\nimport { ISO_COUNTRIES } from './iso-3166'\nimport { ISO_CURRENCIES } from './iso-4217'\nimport { ISO_LANGUAGES } from './iso-639'\n\nimport type { DateTimeFormatAlias, DateTimeFormats, I18nOptions, ISOCountry, NumberFormatAlias, NumberFormats, Translation, TranslationKey } from './index'\nimport type { ISOLanguage } from './iso-639'\n\n/* ===== TRANSLATOR INTERFACE =============================================== */\n\n/**\n * Parameters for the formatting of a translation.\n *\n * This type is used to pass parameters to the `t` and `tc` methods of the\n * translator, allowing for the interpolation of values into the translated\n * message.\n *\n * When the parameter value is a number, it will be formatted using the `n`\n * formatter before being interpolated into the message.\n */\nexport interface TranslationParams {\n [ key: string ]: string | number\n}\n\n/**\n * The date input type for date and time translation\n *\n * When the input is a non-empty `string`, or a `number`, it will be constructed\n * into a `Date` object before being formatted.\n *\n * When the input is `null`, `undefined`, or an empty string, formatted result\n * will be a simple empty string.\n */\nexport type DateInput = Date | string | number | null | undefined\n\n/**\n * The translator interface for the application.\n *\n * This interface provides methods to translate messages, format numbers, and\n * format dates and times.\n *\n * Configured instances can be accessed using the `useI18n()` composition\n * function, which will provide an instance of the translator.\n */\nexport interface Translator {\n /** The current ISO-639-1 language code used by this translator. */\n language: ISOLanguage\n /** The region (if any) used by thus translator to localize translations. */\n region: ISOCountry | undefined\n /** The `Locale` used by this translator (merges `language` and `region`) */\n locale: Readonly<Intl.Locale>\n\n /**\n * Return the (possibly parameterized) translation for the specified message\n * in the current language.\n *\n * Internally, this method uses the `tc(...)` function with `n=1`, in order to\n * avoid duplication of message keys\n */\n t(key: TranslationKey | Translation, params?: TranslationParams): string\n\n /**\n * Return the (possibly parameterized) translation for the specified message\n * in the current language, with pluralization.\n *\n * For pluralization, translation messages should be separated by the pipe\n * character, like in Vue I18N. Example:\n *\n * * `\" one apple | {n} apples \"` when _two_ translations are separated by a\n * pipe, the first will be used for singular, the second for zero or plural\n * * `\" no apples | one apple | {n} apples \"` when _three_ translations are\n * separated by a pipe, the first will be used for zero, the second for\n * singular, the second for zero or plural\n *\n * For convenience, the `{n}` message parameter will always be contextualized\n * with the number, unless overridden in the `params` themselves.\n */\n tc(key: TranslationKey | Translation, n: number, params?: TranslationParams): string\n\n /**\n * Format a number according to the current language.\n *\n * When `format` is provided, it will be used to configure the number format.\n * This can be one of the aliases specified at initialization, or a\n * fully-fledged `Intl.NumberFormatOptions` object.\n */\n n(value?: number | bigint | null | undefined, format?: NumberFormatAlias | Intl.NumberFormatOptions): string\n\n /**\n * Format date and time according to the current language.\n *\n * When `format` is provided, it will be used to configure the date and time\n * format. This can be one of the aliases specified at initialization, or a\n * fully-fledged `Intl.DateTimeFormatOptions` object.\n */\n d(date?: DateInput, format?: DateTimeFormatAlias | Intl.DateTimeFormatOptions, timeZone?: string): string\n\n /** Extra internationalization utilities */\n utils: {\n /**\n * Return the name of the language for the given ISO-639-1 code localized\n * using the current language\n */\n language(code: ISOLanguage): string\n\n /**\n * Return the name of the country (or region) for the given ISO-3166-1 code\n * (or CLDR region code) using the current language\n */\n country(code: ISOCountry | 'EU' | 'UN'): string\n\n /**\n * Return the flag emoji for the given ISO-3166-1 code (or CLDR region\n * code).\n */\n flag(code: ISOCountry | 'EU' | 'UN'): string\n }\n}\n\n/* ===== TRANSLATOR IMPLEMENTATION ========================================== */\n\nfunction checkLocale(locale: Intl.Locale): void {\n if (! ISO_LANGUAGES.includes(locale.language as any)) {\n warn(`Unknown language code \"${locale.language}\"`)\n }\n\n if (! locale.region) return\n\n if (! ISO_COUNTRIES.includes(locale.region as any)) {\n warn(`Unknown region code \"${locale.region}\"`)\n }\n}\n\n/** Create a _reactive_ translator object from the given options */\nexport function makeTranslator(options: I18nOptions): Translator {\n // Default locale, parsing the default language\n const defaultLocale: Intl.Locale = typeof options.defaultLanguage === 'string' ?\n new Intl.Locale(options.defaultLanguage) :\n options.defaultLanguage\n\n // Normalized default language (language-REGION)\n const defaultLanguage = defaultLocale.region ?\n `${defaultLocale.language}-${defaultLocale.region}` :\n defaultLocale.language\n\n // Default time zone\n const defaultTimeZone = options.defaultTimeZone\n\n const translations: InternalTranslations = options.translations ? structuredClone(options.translations) : {}\n const dateTimeFormats: DateTimeFormats = {\n default: { dateStyle: 'medium', timeStyle: 'medium' },\n short: { dateStyle: 'short', timeStyle: 'short' },\n medium: { dateStyle: 'medium', timeStyle: 'medium' },\n long: { dateStyle: 'long', timeStyle: 'long' },\n full: { dateStyle: 'full', timeStyle: 'full' },\n\n // date only formats\n date: { dateStyle: 'medium' },\n shortDate: { dateStyle: 'short' },\n mediumDate: { dateStyle: 'medium' },\n longDate: { dateStyle: 'long' },\n fullDate: { dateStyle: 'full' },\n\n // time only formats\n time: { timeStyle: 'medium' },\n shortTime: { timeStyle: 'short' },\n mediumTime: { timeStyle: 'medium' },\n longTime: { timeStyle: 'long' },\n fullTime: { timeStyle: 'full' },\n\n // overrides and custom formats\n ...options.dateTimeFormats,\n }\n\n const numberFormats: NumberFormats = {\n // Expand all currency codes into number formats for currencies\n ...ISO_CURRENCIES.reduce((formats, currency) => {\n formats[currency] = { style: 'currency', currency }\n return formats\n }, {} as Record<string, Intl.NumberFormatOptions>),\n // Add the default number format\n default: {},\n // Overrides and custom formats\n ...options.numberFormats,\n }\n\n // Current locale, from the browser's language settings\n const locale = shallowRef(new Intl.Locale(defaultLanguage))\n watch(locale, checkLocale, { immediate: true })\n // checkLocale(locale.value)\n\n // Language order, from the current locale\n const languages = computed(() => {\n const { language, region } = locale.value\n const order: string[] = [ language ]\n if (region) order.unshift(`${language}-${region}`)\n if (language !== defaultLanguage) order.push(defaultLanguage)\n return order as any as LanguageKeys\n })\n\n // The translator object (non-reactive)\n const translator = {\n get locale() {\n return locale.value\n },\n\n set locale(value: Intl.Locale) {\n locale.value = value\n },\n\n get language(): ISOLanguage {\n return translator.locale.language as ISOLanguage\n },\n\n set language(value: ISOLanguage) {\n translator.locale = new Intl.Locale(value, { ...locale.value })\n },\n\n get region(): ISOCountry | undefined {\n return translator.locale.region as ISOCountry\n },\n\n set region(value: ISOCountry | undefined) {\n translator.locale = new Intl.Locale(translator.language, { ...translator.locale, region: value || undefined })\n },\n\n n(value?: number | bigint | null | undefined, format: string | Intl.NumberFormatOptions = 'default'): string {\n if (value == null) return '' // null or undefined produces an empty string\n\n const options = typeof format === 'string' ? numberFormats[format] : format\n if (! options) warn(`NumberFormat alias \"${format}\" not found`)\n\n return new Intl.NumberFormat(translator.locale, options).format(value)\n },\n\n t(translation: TranslationKey | Translation, params?: TranslationParams): string {\n return translator.tc(translation, 1, params)\n },\n\n tc(translation: TranslationKey | Translation, n: number, params?: TranslationParams): string {\n const template = getTemplate(translations, translation, languages.value)\n const format = new Intl.NumberFormat(translator.locale, numberFormats['default'])\n return replaceParams(template, Object.assign({ n }, params), format)\n },\n\n d(input?: DateInput, format: DateTimeFormatAlias | Intl.DateTimeFormatOptions = 'default', timeZone?: string): string {\n if ((input == null) || (input === '')) return ''\n\n const date = input instanceof Date ? input : new Date(input)\n const options = typeof format === 'string' ? dateTimeFormats[format] : format\n if (! options) warn(`DateTimeFormat alias \"${format}\" not found`)\n\n // Merge the default time zone with the options\n const optionsWithTimeZone = { timeZone: defaultTimeZone, ...options }\n if (timeZone) optionsWithTimeZone.timeZone = timeZone // Override the time zone\n\n // Format our date, optionally defaulting the time zone\n return new Intl.DateTimeFormat(locale.value, optionsWithTimeZone).format(date)\n },\n\n utils: {\n language(code: ISOLanguage): string {\n return new Intl.DisplayNames(translator.locale, { type: 'language' }).of(code)!\n },\n country(code: ISOCountry | 'EU' | 'UN'): string {\n return new Intl.DisplayNames(translator.locale, { type: 'region' }).of(code)!\n },\n flag(code: ISOCountry | 'EU' | 'UN'): string {\n return [ ...code ]\n .map((c) => c.codePointAt(0)!)\n .map((n) => 0x1f1a5 + n)\n .map((n) => String.fromCodePoint(n))\n .join('')\n },\n },\n } as const satisfies Translator\n\n // Return a reactive version of the translator\n return reactive(translator)\n}\n\n/* ===== TRANSLATION UTILITIES ============================================== */\n\ntype LanguageKeys = readonly [ string, ...string[] ]\ntype InternalTranslation = Record<string, string | undefined>\ntype InternalTranslations = Record<string, InternalTranslation>\ntype TranslationTemplate = { zero: string, singular: string, plural: string }\n\n/**\n * Cached parsed translation templates.\n *\n * The keys are:\n * 1) the translations instance (WeakMap key)\n * 2) the current language (first entry in the order)\n * 3) the translation key\n */\nconst caches = new WeakMap<InternalTranslations, Record<string, Record<string, TranslationTemplate>>>()\n\n/** Get the `TranslationTemplate` for the translation or translation key. */\nfunction getTemplate(\n translations: InternalTranslations,\n translation: TranslationKey | Translation,\n languages: LanguageKeys,\n): TranslationTemplate {\n if (! translation) throw new Error('No translation key specified')\n\n if (typeof translation === 'string') {\n // Get the cache for the messages instance\n let cache = caches.get(translations)\n if (! cache) caches.set(translations, cache = {})\n\n // Get the cache for the current language\n let languageCache = cache[languages[0]]\n if (! languageCache) cache[languages[0]] = languageCache = {}\n\n // Get the translation from the cache or parse it\n let template = languageCache[translation]\n if (! template) {\n let object = translations[translation]\n if (! object) {\n warn(`Translation key \"${translation}\" not found`)\n object = { [languages[languages.length - 1]!]: translation }\n }\n template = extractTemplate(object, languages)\n languageCache[translation] = template\n }\n\n return template\n } else {\n return extractTemplate(translation, languages)\n }\n}\n\n/**\n * Extract a message from a translation, according to its locale, and split\n * it into its parsed components: zero, singular, and plural.\n */\nfunction extractTemplate(\n translation: InternalTranslation,\n languages: LanguageKeys,\n): TranslationTemplate {\n let string: string | undefined = undefined\n\n for (const language of languages) {\n string = translation[language as any]\n if (string) break\n }\n\n if (! string) {\n const language = languages[languages.length - 1]\n warn(`Translation missing default language \"${language}\" in`, translation)\n return { zero: '', singular: '', plural: '' }\n }\n\n let parsed: TranslationTemplate\n\n const translations = string.split(/(?<!\\\\)(?:\\\\\\\\)*\\|/)\n if (translations.length === 1) {\n const [ singular ] = translations\n parsed = { zero: singular!, singular: singular!, plural: singular! }\n } else if (translations.length === 2) {\n const [ singular, plural ] = translations\n parsed ={ zero: plural!, singular: singular!, plural: plural! }\n } else {\n const [ zero, singular, plural ] = translations\n parsed ={ zero: zero!, singular: singular!, plural: plural! }\n }\n\n const { zero, singular, plural } = parsed\n return { zero: zero.trim(), singular: singular.trim(), plural: plural.trim() }\n}\n\n/** Replace the parameters in a translation template, returning a string */\nfunction replaceParams(\n template: TranslationTemplate,\n params: TranslationParams,\n format: Intl.NumberFormat,\n): string {\n // Select the template to use based on the \"n\" (number) parameter\n const n = typeof params.n === 'string' ? Number(params.n) : params.n\n let formatted = n === 0 ? template.zero :\n n === 1 ? template.singular :\n template.plural\n\n // Replace any property `{ prop }` with the associated value\n for (const [ prop, value ] of Object.entries(params)) {\n const string =\n typeof value === 'number' ? format.format(value) :\n typeof value === 'string' ? value :\n value ? String(value) : ''\n\n // Expression matches `{ xxx }` where `{` is _not_ preceded by a '\\'\n const expr = new RegExp(`(.|^)({\\\\s*${prop}\\\\s*})`, 'gi')\n formatted = formatted.replaceAll(expr, (_, before, token) => {\n return before === '\\\\' ? token : before + string\n })\n }\n\n // All done!\n return formatted.trim()\n}\n","import { inject } from 'vue'\n\nimport { makeTranslator } from './translator'\n\nimport type { App } from 'vue'\nimport type { ISOCurrency } from './iso-4217'\nimport type { ISOLanguage } from './iso-639'\nimport type { Translator } from './translator'\n\n/* ===== REFERENCE LANGUAGES AND COUNTRIES ================================== */\n\nexport { ISO_COUNTRIES } from './iso-3166'\nexport { ISO_CURRENCIES } from './iso-4217'\nexport { ISO_LANGUAGES } from './iso-639'\n\nexport type * from './iso-3166'\nexport type * from './iso-639'\n\n/* ===== TYPES FOR DECLARATION MERGING ====================================== */\n\n/**\n * I18n Configuration interface (to be merged with the actual configuration).\n *\n * This interface (intentionally empty) is used to merge the actual per-app\n * configuration of the translation system, in order to provide the correct\n * types to the rest of the system.\n *\n * Two properties are expected to be defined in the configuration:\n *\n * * `languages`: the list of supported languages for the application. Those\n * are ISO 639-1 language codes, and when specified, _every_\n * translation _must_ include a translation for each.\n * * `translationKeys`: the list of translation keys known by the application.\n * Those are the arbitrary keys used to identify the\n * messages to be translated with the `t` and `tc`\n * methods of `Translator`.\n * * `dateTimeFormats`: the date and time formats _aliases_ used by the\n * application.\n * * `numberFormats`: the number formats _aliases_ used by the application.\n *\n * To configure the types, follow the example below:\n *\n * ```ts\n * const translations = {\n * 'hello': { en: 'Hello, world!', de: 'Hallo, Welt!' }\n * } as const satisfies Translations\n *\n * const dateTimeFormats = {\n * // override the default format\n * default: { dateStyle: 'short', timeStyle: 'short' },\n * // add a new custom format\n * custom: {\n * day: '2-digit',\n * month: '2-digit',\n * year: 'numeric',\n * weekday: 'short',\n * timeZone: 'UTC',\n * },\n * } as const satisfies DateTimeFormats\n *\n * const numberFormats = {\n * speed: { style: 'unit', unit: 'kilometer-per-hour' },\n * } as const satisfies NumberFormats\n *\n * declare module '@juit/vue-i18n' {\n * export interface I18nConfiguration {\n * languages: 'de' | 'en',\n * translationKeys: keyof typeof translations,\n * dateTimeFormats: keyof typeof dateTimeFormats,\n * numberFormats: keyof typeof numberFormats,\n * }\n * }\n * ```\n */\nexport interface I18nConfiguration {\n // intentionally empty\n}\n\n/* ===== FROM CONFIG TO TRANSLATIONS ======================================== */\n\n/** Extract the value associated with key `K` from type `T` if it extends `R`, otherwise return `R` */\ntype ExtractConfig<T, R, K extends string> = T extends { [ X in K ]: infer V } ? V extends R ? V : R : R\n\n/** The languages configured in `I18nConfiguration` or all ISO languages */\nexport type Language = ExtractConfig<I18nConfiguration, ISOLanguage, 'languages'>\n\n/** Base translations, either required when languages are set or all optional */\ntype BaseTranslation = ISOLanguage extends Language ? {\n readonly [ key in ISOLanguage ]?: string\n} : {\n readonly [ key in Language ]: string\n}\n\n/** Extended translations, supporting multiple region of each language */\ntype ExtendedTranslation = {\n readonly [ key in `${Language}-${string}` ]?: string\n}\n\n/** Prettify our `Translations` exported type */\ntype PrettifyTranslation<T> = { [ l in keyof T ]: T[l] }\n\n/**\n * A type describing the translations for a given translation key.\n *\n * When the `I18nConfig` interface is properly merged with and its contains\n * the `languages` property, this type will represent the list of required\n * translation keys (languages) required for each translation.\n *\n * When left unconfigured, all ISO languages will be considered as optional.\n */\nexport type Translation = PrettifyTranslation<BaseTranslation & ExtendedTranslation>\n\n/**\n * All known translation keys.\n *\n * When the `I18nConfig` interface is properly merged with and its contains\n * the `translationKeys` property, this type will represent the list of\n * translations keys available to the `t(...)` and `tc(...)` methods.\n *\n * When left unconfigured, this type will be `string`.\n */\nexport type TranslationKey = ExtractConfig<I18nConfiguration, string, 'translationKeys'>\n\n/**\n * All known date and time formats aliases.\n *\n * When the `I18nConfig` interface is properly merged with and its contains\n * the `dateTimeFormats` property, this type will represent the list of\n * date and time formats available to the `d(...)` method.\n *\n * When left unconfigured, this type will be `string`.\n */\nexport type DateTimeFormatAlias = ExtractConfig<I18nConfiguration, string, 'dateTimeFormats'>\n | 'default' | 'short' | 'medium' | 'long' | 'full'\n | 'date' | 'shortDate' | 'mediumDate' | 'longDate' | 'fullDate'\n | 'time' | 'shortTime' | 'mediumTime' | 'longTime' | 'fullTime'\n\n/**\n * All known number formats aliases.\n *\n * When the `I18nConfig` interface is properly merged with and its contains\n * the `numberFormats` property, this type will represent the list of\n * date and time formats available to the `n(...)` method.\n *\n * When left unconfigured, this type will be `string`.\n */\nexport type NumberFormatAlias = ExtractConfig<I18nConfiguration, string, 'numberFormats'>\n | 'default' | ISOCurrency\n\n/* ===== MODULE INITIALIZATION ============================================== */\n\n/* Export the translator types */\nexport type * from './translator'\n\n/**\n * Options to initialize the translations handled by the translation system.\n *\n * Shared translations are defined as a key-value pair, where the key is the\n * identifier of the translation, and the value is an object containing the\n * translations for each language.\n */\nexport interface Translations {\n readonly [ key: string ]: Translation\n}\n\n/**\n * Options to initialize the date and time format _aliases_ used by the\n * translation system.\n *\n * The default aliases (each can be overridden) are:\n *\n * ```ts\n * {\n * default: { dateStyle: 'medium', timeStyle: 'medium' },\n * short: { dateStyle: 'short', timeStyle: 'short' },\n * medium: { dateStyle: 'medium', timeStyle: 'medium' },\n * long: { dateStyle: 'long', timeStyle: 'long' },\n * full: { dateStyle: 'full', timeStyle: 'full' },\n *\n * // date only formats\n * date: { dateStyle: 'medium' },\n * shortDate: { dateStyle: 'short' },\n * mediumDate: { dateStyle: 'medium' },\n * longDate: { dateStyle: 'long' },\n * fullDate: { dateStyle: 'full' },\n *\n * // time only formats\n * time: { timeStyle: 'medium' },\n * shortTime: { timeStyle: 'short' },\n * mediumTime: { timeStyle: 'medium' },\n * longTime: { timeStyle: 'long' },\n * fullTime: { timeStyle: 'full' },\n * }\n * ```\n */\nexport interface DateTimeFormats {\n readonly [ key: string ]: Intl.DateTimeFormatOptions\n}\n\n/**\n * Options to initialize the number format _aliases_ used by the translation\n * system.\n *\n * The default aliases (each can be overridden) are:\n *\n * ```ts\n * {\n * default: { }, // use the default number format\n * EUR: { style: 'currency', currency: 'EUR' },\n * USD: { style: 'currency', currency: 'USD' },\n * // ... all currency codes can be used as aliases\n * }\n * ```\n */\nexport interface NumberFormats {\n readonly [ key: string ]: Intl.NumberFormatOptions\n}\n\n/** The language or locale to use at construction */\nexport type DefaultLanguage = ISOLanguage | `${ISOLanguage}-${string}` | Intl.Locale\n\n/** Options to initialize the I18n plugin */\nexport interface I18nOptions {\n defaultLanguage: DefaultLanguage,\n defaultTimeZone?: string,\n translations?: Translations,\n dateTimeFormats?: DateTimeFormats,\n numberFormats?: NumberFormats,\n}\n\n/* ===== PUBLIC METHODS ===================================================== */\n\n/** Symbol for Vue injections */\nconst injectionSymbol = Symbol.for('@juit/vue-i18n/translator')\n\n/** Initialize the translation system plugin */\nexport function i18n(app: App, optionsOrLanguage: Language | I18nOptions): App {\n const options = typeof optionsOrLanguage === 'string' ?\n { defaultLanguage: optionsOrLanguage } : optionsOrLanguage\n\n const translator = makeTranslator(options)\n\n app.config.globalProperties.$t = translator.t\n app.config.globalProperties.$tc = translator.tc\n app.config.globalProperties.$n = translator.n\n app.config.globalProperties.$d = translator.d\n\n app.provide(injectionSymbol, translator)\n return app\n}\n\n/** Retrieve the translator instance from the Vue app */\nexport function useTranslator(): Translator {\n const translator = inject(injectionSymbol)\n if (! translator) throw new Error('No translator found in the Vue app')\n return translator as Translator\n}\n\n/* ===== VUE EXTENSIONS ===================================================== */\n\n// Extension to the Vue component interface\ndeclare module 'vue' {\n interface ComponentCustomProperties {\n /** Translate a message according to the current language */\n $t: Translator['t']\n /**\n * Return the (possibly parameterized) translation for the specified message\n * in the current language, with pluralization.\n */\n $tc: Translator['tc']\n /** Format a number into a string according to the current language */\n $n: Translator['n']\n /**\n * Format date and time using the specified style (defaults to `medium`)\n * according to the current language\n */\n $d: Translator['d']\n }\n}\n"],"names":["ISO_COUNTRIES","ISO_CURRENCIES","ISO_LANGUAGES","checkLocale","locale","warn","makeTranslator","options","defaultLocale","defaultLanguage","defaultTimeZone","translations","dateTimeFormats","numberFormats","formats","currency","shallowRef","watch","languages","computed","language","region","order","translator","value","format","translation","params","template","getTemplate","replaceParams","input","timeZone","date","optionsWithTimeZone","code","c","reactive","caches","cache","languageCache","object","extractTemplate","string","parsed","singular","plural","zero","n","formatted","prop","expr","_","before","token","injectionSymbol","i18n","app","optionsOrLanguage","useTranslator","inject"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@juit/vue-i18n",
3
- "version": "0.2.7",
3
+ "version": "0.2.8",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {