@formatjs/intl-numberformat 8.15.5 → 9.0.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.
package/lib/src/core.js DELETED
@@ -1,238 +0,0 @@
1
- import { CanonicalizeLocaleList, FormatNumeric, FormatNumericRange, FormatNumericRangeToParts, FormatNumericToParts, InitializeNumberFormat, OrdinaryHasInstance, SupportedLocales, ToIntlMathematicalValue, createMemoizedPluralRules, defineProperty, invariant, } from '@formatjs/ecma402-abstract';
2
- import { currencyDigitsData } from './currency-digits.generated';
3
- import { numberingSystemNames } from './numbering-systems.generated';
4
- import getInternalSlots from './get_internal_slots';
5
- var RESOLVED_OPTIONS_KEYS = [
6
- 'locale',
7
- 'numberingSystem',
8
- 'style',
9
- 'currency',
10
- 'currencyDisplay',
11
- 'currencySign',
12
- 'unit',
13
- 'unitDisplay',
14
- 'minimumIntegerDigits',
15
- 'minimumFractionDigits',
16
- 'maximumFractionDigits',
17
- 'minimumSignificantDigits',
18
- 'maximumSignificantDigits',
19
- 'useGrouping',
20
- 'notation',
21
- 'compactDisplay',
22
- 'signDisplay',
23
- ];
24
- /**
25
- * https://tc39.es/ecma402/#sec-intl-numberformat-constructor
26
- */
27
- export var NumberFormat = function (locales, options) {
28
- // Cannot use `new.target` bc of IE11 & TS transpiles it to something else
29
- if (!this || !OrdinaryHasInstance(NumberFormat, this)) {
30
- return new NumberFormat(locales, options);
31
- }
32
- InitializeNumberFormat(this, locales, options, {
33
- getInternalSlots: getInternalSlots,
34
- localeData: NumberFormat.localeData,
35
- availableLocales: NumberFormat.availableLocales,
36
- getDefaultLocale: NumberFormat.getDefaultLocale,
37
- currencyDigitsData: currencyDigitsData,
38
- numberingSystemNames: numberingSystemNames,
39
- });
40
- var internalSlots = getInternalSlots(this);
41
- var dataLocale = internalSlots.dataLocale;
42
- var dataLocaleData = NumberFormat.localeData[dataLocale];
43
- invariant(dataLocaleData !== undefined, "Cannot load locale-dependent data for ".concat(dataLocale, "."));
44
- internalSlots.pl = createMemoizedPluralRules(dataLocale, {
45
- minimumFractionDigits: internalSlots.minimumFractionDigits,
46
- maximumFractionDigits: internalSlots.maximumFractionDigits,
47
- minimumIntegerDigits: internalSlots.minimumIntegerDigits,
48
- minimumSignificantDigits: internalSlots.minimumSignificantDigits,
49
- maximumSignificantDigits: internalSlots.maximumSignificantDigits,
50
- });
51
- return this;
52
- };
53
- function formatToParts(x) {
54
- return FormatNumericToParts(this, ToIntlMathematicalValue(x), {
55
- getInternalSlots: getInternalSlots,
56
- });
57
- }
58
- function formatRange(start, end) {
59
- return FormatNumericRange(this, ToIntlMathematicalValue(start), ToIntlMathematicalValue(end), {
60
- getInternalSlots: getInternalSlots,
61
- });
62
- }
63
- function formatRangeToParts(start, end) {
64
- return FormatNumericRangeToParts(this, ToIntlMathematicalValue(start), ToIntlMathematicalValue(end), {
65
- getInternalSlots: getInternalSlots,
66
- });
67
- }
68
- try {
69
- Object.defineProperty(formatToParts, 'name', {
70
- value: 'formatToParts',
71
- enumerable: false,
72
- writable: false,
73
- configurable: true,
74
- });
75
- }
76
- catch (e) {
77
- // In older browser (e.g Chrome 36 like polyfill-fastly.io)
78
- // TypeError: Cannot redefine property: name
79
- }
80
- defineProperty(NumberFormat.prototype, 'formatToParts', {
81
- value: formatToParts,
82
- });
83
- defineProperty(NumberFormat.prototype, 'formatRange', {
84
- value: formatRange,
85
- });
86
- defineProperty(NumberFormat.prototype, 'formatRangeToParts', {
87
- value: formatRangeToParts,
88
- });
89
- defineProperty(NumberFormat.prototype, 'resolvedOptions', {
90
- value: function resolvedOptions() {
91
- if (typeof this !== 'object' || !OrdinaryHasInstance(NumberFormat, this)) {
92
- throw TypeError('Method Intl.NumberFormat.prototype.resolvedOptions called on incompatible receiver');
93
- }
94
- var internalSlots = getInternalSlots(this);
95
- var ro = {};
96
- for (var _i = 0, RESOLVED_OPTIONS_KEYS_1 = RESOLVED_OPTIONS_KEYS; _i < RESOLVED_OPTIONS_KEYS_1.length; _i++) {
97
- var key = RESOLVED_OPTIONS_KEYS_1[_i];
98
- var value = internalSlots[key];
99
- if (value !== undefined) {
100
- ro[key] = value;
101
- }
102
- }
103
- if (internalSlots.roundingType === 'morePrecision') {
104
- ro.roundingPriority = 'morePrecision';
105
- }
106
- else if (internalSlots.roundingType === 'lessPrecision') {
107
- ro.roundingPriority = 'lessPrecision';
108
- }
109
- else {
110
- ro.roundingPriority = 'auto';
111
- }
112
- return ro;
113
- },
114
- });
115
- var formatDescriptor = {
116
- enumerable: false,
117
- configurable: true,
118
- get: function () {
119
- if (typeof this !== 'object' || !OrdinaryHasInstance(NumberFormat, this)) {
120
- throw TypeError('Intl.NumberFormat format property accessor called on incompatible receiver');
121
- }
122
- var internalSlots = getInternalSlots(this);
123
- var boundFormat = internalSlots.boundFormat;
124
- if (boundFormat === undefined) {
125
- // https://tc39.es/proposal-unified-intl-numberformat/section11/numberformat_diff_out.html#sec-number-format-functions
126
- boundFormat = function (value) {
127
- return FormatNumeric(internalSlots, ToIntlMathematicalValue(value));
128
- };
129
- try {
130
- // https://github.com/tc39/test262/blob/master/test/intl402/NumberFormat/prototype/format/format-function-name.js
131
- Object.defineProperty(boundFormat, 'name', {
132
- configurable: true,
133
- enumerable: false,
134
- writable: false,
135
- value: '',
136
- });
137
- }
138
- catch (e) {
139
- // In older browser (e.g Chrome 36 like polyfill-fastly.io)
140
- // TypeError: Cannot redefine property: name
141
- }
142
- internalSlots.boundFormat = boundFormat;
143
- }
144
- return boundFormat;
145
- },
146
- };
147
- try {
148
- // https://github.com/tc39/test262/blob/master/test/intl402/NumberFormat/prototype/format/name.js
149
- Object.defineProperty(formatDescriptor.get, 'name', {
150
- configurable: true,
151
- enumerable: false,
152
- writable: false,
153
- value: 'get format',
154
- });
155
- }
156
- catch (e) {
157
- // In older browser (e.g Chrome 36 like polyfill-fastly.io)
158
- // TypeError: Cannot redefine property: name
159
- }
160
- Object.defineProperty(NumberFormat.prototype, 'format', formatDescriptor);
161
- // Static properties
162
- defineProperty(NumberFormat, 'supportedLocalesOf', {
163
- value: function supportedLocalesOf(locales, options) {
164
- return SupportedLocales(NumberFormat.availableLocales, CanonicalizeLocaleList(locales), options);
165
- },
166
- });
167
- NumberFormat.__addLocaleData = function __addLocaleData() {
168
- var data = [];
169
- for (var _i = 0; _i < arguments.length; _i++) {
170
- data[_i] = arguments[_i];
171
- }
172
- for (var _a = 0, data_1 = data; _a < data_1.length; _a++) {
173
- var _b = data_1[_a], d = _b.data, locale = _b.locale;
174
- var minimizedLocale = new Intl.Locale(locale)
175
- .minimize()
176
- .toString();
177
- NumberFormat.localeData[locale] = NumberFormat.localeData[minimizedLocale] =
178
- d;
179
- NumberFormat.availableLocales.add(minimizedLocale);
180
- NumberFormat.availableLocales.add(locale);
181
- if (!NumberFormat.__defaultLocale) {
182
- NumberFormat.__defaultLocale = minimizedLocale;
183
- }
184
- }
185
- };
186
- NumberFormat.__addUnitData = function __addUnitData(locale, unitsData) {
187
- var _a = NumberFormat.localeData, _b = locale, existingData = _a[_b];
188
- if (!existingData) {
189
- throw new Error("Locale data for \"".concat(locale, "\" has not been loaded in NumberFormat. \nPlease __addLocaleData before adding additional unit data"));
190
- }
191
- for (var unit in unitsData.simple) {
192
- existingData.units.simple[unit] = unitsData.simple[unit];
193
- }
194
- for (var unit in unitsData.compound) {
195
- existingData.units.compound[unit] = unitsData.compound[unit];
196
- }
197
- };
198
- NumberFormat.__defaultLocale = '';
199
- NumberFormat.localeData = {};
200
- NumberFormat.availableLocales = new Set();
201
- NumberFormat.getDefaultLocale = function () {
202
- return NumberFormat.__defaultLocale;
203
- };
204
- NumberFormat.polyfilled = true;
205
- try {
206
- // IE11 does not have Symbol
207
- if (typeof Symbol !== 'undefined') {
208
- Object.defineProperty(NumberFormat.prototype, Symbol.toStringTag, {
209
- configurable: true,
210
- enumerable: false,
211
- writable: false,
212
- value: 'Intl.NumberFormat',
213
- });
214
- }
215
- // https://github.com/tc39/test262/blob/master/test/intl402/NumberFormat/length.js
216
- Object.defineProperty(NumberFormat.prototype.constructor, 'length', {
217
- configurable: true,
218
- enumerable: false,
219
- writable: false,
220
- value: 0,
221
- });
222
- // https://github.com/tc39/test262/blob/master/test/intl402/NumberFormat/supportedLocalesOf/length.js
223
- Object.defineProperty(NumberFormat.supportedLocalesOf, 'length', {
224
- configurable: true,
225
- enumerable: false,
226
- writable: false,
227
- value: 1,
228
- });
229
- Object.defineProperty(NumberFormat, 'prototype', {
230
- configurable: false,
231
- enumerable: false,
232
- writable: false,
233
- value: NumberFormat.prototype,
234
- });
235
- }
236
- catch (e) {
237
- // Meta fix so we're test262-compliant, not important
238
- }
@@ -1 +0,0 @@
1
- export declare const currencyDigitsData: Record<string, number>;
@@ -1,75 +0,0 @@
1
- export var currencyDigitsData = {
2
- "ADP": 0,
3
- "AFN": 0,
4
- "ALL": 0,
5
- "AMD": 2,
6
- "BHD": 3,
7
- "BIF": 0,
8
- "BYN": 2,
9
- "BYR": 0,
10
- "CAD": 2,
11
- "CHF": 2,
12
- "CLF": 4,
13
- "CLP": 0,
14
- "COP": 2,
15
- "CRC": 2,
16
- "CZK": 2,
17
- "DEFAULT": 2,
18
- "DJF": 0,
19
- "DKK": 2,
20
- "ESP": 0,
21
- "GNF": 0,
22
- "GYD": 2,
23
- "HUF": 2,
24
- "IDR": 2,
25
- "IQD": 0,
26
- "IRR": 0,
27
- "ISK": 0,
28
- "ITL": 0,
29
- "JOD": 3,
30
- "JPY": 0,
31
- "KMF": 0,
32
- "KPW": 0,
33
- "KRW": 0,
34
- "KWD": 3,
35
- "LAK": 0,
36
- "LBP": 0,
37
- "LUF": 0,
38
- "LYD": 3,
39
- "MGA": 0,
40
- "MGF": 0,
41
- "MMK": 0,
42
- "MNT": 2,
43
- "MRO": 0,
44
- "MUR": 2,
45
- "NOK": 2,
46
- "OMR": 3,
47
- "PKR": 2,
48
- "PYG": 0,
49
- "RSD": 0,
50
- "RWF": 0,
51
- "SEK": 2,
52
- "SLE": 2,
53
- "SLL": 0,
54
- "SOS": 0,
55
- "STD": 0,
56
- "SYP": 0,
57
- "TMM": 0,
58
- "TND": 3,
59
- "TRL": 0,
60
- "TWD": 2,
61
- "TZS": 2,
62
- "UGX": 0,
63
- "UYI": 0,
64
- "UYW": 4,
65
- "UZS": 2,
66
- "VEF": 2,
67
- "VND": 0,
68
- "VUV": 0,
69
- "XAF": 0,
70
- "XOF": 0,
71
- "XPF": 0,
72
- "YER": 0,
73
- "ZMK": 0,
74
- "ZWD": 0
75
- };
@@ -1,2 +0,0 @@
1
- import { NumberFormatInternal } from '@formatjs/ecma402-abstract';
2
- export default function getInternalSlots(x: Intl.NumberFormat): NumberFormatInternal;
@@ -1,10 +0,0 @@
1
- // Type-only circular import
2
- var internalSlotMap = new WeakMap();
3
- export default function getInternalSlots(x) {
4
- var internalSlots = internalSlotMap.get(x);
5
- if (!internalSlots) {
6
- internalSlots = Object.create(null);
7
- internalSlotMap.set(x, internalSlots);
8
- }
9
- return internalSlots;
10
- }
@@ -1 +0,0 @@
1
- export declare const numberingSystemNames: ReadonlyArray<string>;
@@ -1 +0,0 @@
1
- export var numberingSystemNames = ["adlm", "ahom", "arab", "arabext", "armn", "armnlow", "bali", "beng", "bhks", "brah", "cakm", "cham", "cyrl", "deva", "diak", "ethi", "fullwide", "gara", "geor", "gong", "gonm", "grek", "greklow", "gujr", "gukh", "guru", "hanidays", "hanidec", "hans", "hansfin", "hant", "hantfin", "hebr", "hmng", "hmnp", "java", "jpan", "jpanfin", "jpanyear", "kali", "kawi", "khmr", "knda", "krai", "lana", "lanatham", "laoo", "latn", "lepc", "limb", "mathbold", "mathdbl", "mathmono", "mathsanb", "mathsans", "mlym", "modi", "mong", "mroo", "mtei", "mymr", "mymrepka", "mymrpao", "mymrshan", "mymrtlng", "nagm", "newa", "nkoo", "olck", "onao", "orya", "osma", "outlined", "rohg", "roman", "romanlow", "saur", "segment", "shrd", "sind", "sinh", "sora", "sund", "sunu", "takr", "talu", "taml", "tamldec", "telu", "thai", "tibt", "tirh", "tnsa", "vaii", "wara", "wcho"];
@@ -1,6 +0,0 @@
1
- import { NumberFormatOptions } from '@formatjs/ecma402-abstract';
2
- /**
3
- * Number.prototype.toLocaleString ponyfill
4
- * https://tc39.es/ecma402/#sup-number.prototype.tolocalestring
5
- */
6
- export declare function toLocaleString(x: number, locales?: string | string[], options?: NumberFormatOptions): string;
@@ -1,10 +0,0 @@
1
- // eslint-disable-next-line import/no-cycle
2
- import { NumberFormat } from './core';
3
- /**
4
- * Number.prototype.toLocaleString ponyfill
5
- * https://tc39.es/ecma402/#sup-number.prototype.tolocalestring
6
- */
7
- export function toLocaleString(x, locales, options) {
8
- var numberFormat = new NumberFormat(locales, options);
9
- return numberFormat.format(x);
10
- }
@@ -1,21 +0,0 @@
1
- import { NumberFormatLocaleInternalData, NumberFormatOptions, NumberFormatPart, NumberRangeToParts, RawNumberLocaleData, ResolvedNumberFormatOptions } from '@formatjs/ecma402-abstract';
2
- import Decimal from 'decimal.js';
3
- export interface NumberFormat {
4
- resolvedOptions(): ResolvedNumberFormatOptions;
5
- formatToParts(x: number | bigint | Decimal | string): NumberFormatPart[];
6
- format(x: number | bigint | Decimal | string): string;
7
- formatRange(start: number | bigint | Decimal | string, end: number | bigint | Decimal | string): string;
8
- formatRangeToParts(start: number | bigint | Decimal | string, end: number | bigint | Decimal | string): NumberRangeToParts[];
9
- }
10
- export interface NumberFormatConstructor {
11
- new (locales?: string | string[], options?: NumberFormatOptions): NumberFormat;
12
- (locales?: string | string[], options?: NumberFormatOptions): NumberFormat;
13
- __addLocaleData(...data: RawNumberLocaleData[]): void;
14
- __addUnitData(locale: string, unitsData: RawNumberLocaleData['data']['units']): void;
15
- supportedLocalesOf(locales: string | string[], options?: Pick<NumberFormatOptions, 'localeMatcher'>): string[];
16
- getDefaultLocale(): string;
17
- __defaultLocale: string;
18
- localeData: Record<string, NumberFormatLocaleInternalData | undefined>;
19
- availableLocales: Set<string>;
20
- polyfilled: boolean;
21
- }
package/lib/src/types.js DELETED
@@ -1 +0,0 @@
1
- export {};
@@ -1 +0,0 @@
1
- export declare const supportedLocales: string[];
@@ -1 +0,0 @@
1
- export var supportedLocales = ["af", "af-NA", "agq", "ak", "am", "ar", "ar-AE", "ar-BH", "ar-DJ", "ar-DZ", "ar-EG", "ar-EH", "ar-ER", "ar-IL", "ar-IQ", "ar-JO", "ar-KM", "ar-KW", "ar-LB", "ar-LY", "ar-MA", "ar-MR", "ar-OM", "ar-PS", "ar-QA", "ar-SA", "ar-SD", "ar-SO", "ar-SS", "ar-SY", "ar-TD", "ar-TN", "ar-YE", "as", "asa", "ast", "az", "az-Cyrl", "az-Latn", "bas", "be", "be-tarask", "bem", "bez", "bg", "bm", "bn", "bn-IN", "bo", "bo-IN", "br", "brx", "bs", "bs-Cyrl", "bs-Latn", "ca", "ca-AD", "ca-ES-valencia", "ca-FR", "ca-IT", "ccp", "ccp-IN", "ce", "ceb", "cgg", "chr", "ckb", "ckb-IR", "cs", "cy", "da", "da-GL", "dav", "de", "de-AT", "de-BE", "de-CH", "de-IT", "de-LI", "de-LU", "dje", "doi", "dsb", "dua", "dyo", "dz", "ebu", "ee", "ee-TG", "el", "el-CY", "en", "en-001", "en-150", "en-AE", "en-AG", "en-AI", "en-AS", "en-AT", "en-AU", "en-BB", "en-BE", "en-BI", "en-BM", "en-BS", "en-BW", "en-BZ", "en-CA", "en-CC", "en-CH", "en-CK", "en-CM", "en-CX", "en-CY", "en-DE", "en-DG", "en-DK", "en-DM", "en-ER", "en-FI", "en-FJ", "en-FK", "en-FM", "en-GB", "en-GD", "en-GG", "en-GH", "en-GI", "en-GM", "en-GU", "en-GY", "en-HK", "en-IE", "en-IL", "en-IM", "en-IN", "en-IO", "en-JE", "en-JM", "en-KE", "en-KI", "en-KN", "en-KY", "en-LC", "en-LR", "en-LS", "en-MG", "en-MH", "en-MO", "en-MP", "en-MS", "en-MT", "en-MU", "en-MW", "en-MY", "en-NA", "en-NF", "en-NG", "en-NL", "en-NR", "en-NU", "en-NZ", "en-PG", "en-PH", "en-PK", "en-PN", "en-PR", "en-PW", "en-RW", "en-SB", "en-SC", "en-SD", "en-SE", "en-SG", "en-SH", "en-SI", "en-SL", "en-SS", "en-SX", "en-SZ", "en-TC", "en-TK", "en-TO", "en-TT", "en-TV", "en-TZ", "en-UG", "en-UM", "en-VC", "en-VG", "en-VI", "en-VU", "en-WS", "en-ZA", "en-ZM", "en-ZW", "eo", "es", "es-419", "es-AR", "es-BO", "es-BR", "es-BZ", "es-CL", "es-CO", "es-CR", "es-CU", "es-DO", "es-EA", "es-EC", "es-GQ", "es-GT", "es-HN", "es-IC", "es-MX", "es-NI", "es-PA", "es-PE", "es-PH", "es-PR", "es-PY", "es-SV", "es-US", "es-UY", "es-VE", "et", "eu", "ewo", "fa", "fa-AF", "ff", "ff-Adlm", "ff-Adlm-BF", "ff-Adlm-CM", "ff-Adlm-GH", "ff-Adlm-GM", "ff-Adlm-GW", "ff-Adlm-LR", "ff-Adlm-MR", "ff-Adlm-NE", "ff-Adlm-NG", "ff-Adlm-SL", "ff-Adlm-SN", "ff-Latn", "ff-Latn-BF", "ff-Latn-CM", "ff-Latn-GH", "ff-Latn-GM", "ff-Latn-GN", "ff-Latn-GW", "ff-Latn-LR", "ff-Latn-MR", "ff-Latn-NE", "ff-Latn-NG", "ff-Latn-SL", "fi", "fil", "fo", "fo-DK", "fr", "fr-BE", "fr-BF", "fr-BI", "fr-BJ", "fr-BL", "fr-CA", "fr-CD", "fr-CF", "fr-CG", "fr-CH", "fr-CI", "fr-CM", "fr-DJ", "fr-DZ", "fr-GA", "fr-GF", "fr-GN", "fr-GP", "fr-GQ", "fr-HT", "fr-KM", "fr-LU", "fr-MA", "fr-MC", "fr-MF", "fr-MG", "fr-ML", "fr-MQ", "fr-MR", "fr-MU", "fr-NC", "fr-NE", "fr-PF", "fr-PM", "fr-RE", "fr-RW", "fr-SC", "fr-SN", "fr-SY", "fr-TD", "fr-TG", "fr-TN", "fr-VU", "fr-WF", "fr-YT", "fur", "fy", "ga", "ga-GB", "gd", "gl", "gsw", "gsw-FR", "gsw-LI", "gu", "guz", "gv", "ha", "ha-GH", "ha-NE", "haw", "he", "hi", "hr", "hr-BA", "hsb", "hu", "hy", "ia", "id", "ig", "ii", "is", "it", "it-CH", "it-SM", "it-VA", "ja", "jgo", "jmc", "jv", "ka", "kab", "kam", "kde", "kea", "kgp", "khq", "ki", "kk", "kkj", "kl", "kln", "km", "kn", "ko", "ko-KP", "kok", "ks", "ks-Arab", "ksb", "ksf", "ksh", "ku", "kw", "ky", "lag", "lb", "lg", "lkt", "ln", "ln-AO", "ln-CF", "ln-CG", "lo", "lrc", "lrc-IQ", "lt", "lu", "luo", "luy", "lv", "mai", "mas", "mas-TZ", "mer", "mfe", "mg", "mgh", "mgo", "mi", "mk", "ml", "mn", "mni", "mni-Beng", "mr", "ms", "ms-BN", "ms-ID", "ms-SG", "mt", "mua", "my", "mzn", "naq", "nb", "nb-SJ", "nd", "nds", "nds-NL", "ne", "ne-IN", "nl", "nl-AW", "nl-BE", "nl-BQ", "nl-CW", "nl-SR", "nl-SX", "nmg", "nn", "nnh", "no", "nus", "nyn", "om", "om-KE", "or", "os", "os-RU", "pa", "pa-Arab", "pa-Guru", "pcm", "pl", "ps", "ps-PK", "pt", "pt-AO", "pt-CH", "pt-CV", "pt-GQ", "pt-GW", "pt-LU", "pt-MO", "pt-MZ", "pt-PT", "pt-ST", "pt-TL", "qu", "qu-BO", "qu-EC", "rm", "rn", "ro", "ro-MD", "rof", "ru", "ru-BY", "ru-KG", "ru-KZ", "ru-MD", "ru-UA", "rw", "rwk", "sa", "sah", "saq", "sat", "sat-Olck", "sbp", "sc", "sd", "sd-Arab", "sd-Deva", "se", "se-FI", "se-SE", "seh", "ses", "sg", "shi", "shi-Latn", "shi-Tfng", "si", "sk", "sl", "smn", "sn", "so", "so-DJ", "so-ET", "so-KE", "sq", "sq-MK", "sq-XK", "sr", "sr-Cyrl", "sr-Cyrl-BA", "sr-Cyrl-ME", "sr-Cyrl-XK", "sr-Latn", "sr-Latn-BA", "sr-Latn-ME", "sr-Latn-XK", "su", "su-Latn", "sv", "sv-AX", "sv-FI", "sw", "sw-CD", "sw-KE", "sw-UG", "ta", "ta-LK", "ta-MY", "ta-SG", "te", "teo", "teo-KE", "tg", "th", "ti", "ti-ER", "tk", "to", "tr", "tr-CY", "tt", "twq", "tzm", "ug", "uk", "und", "ur", "ur-IN", "uz", "uz-Arab", "uz-Cyrl", "uz-Latn", "vai", "vai-Latn", "vai-Vaii", "vi", "vun", "wae", "wo", "xh", "xog", "yav", "yi", "yo", "yo-BJ", "yrl", "yrl-CO", "yrl-VE", "yue", "yue-Hans", "yue-Hant", "zgh", "zh", "zh-Hans", "zh-Hans-HK", "zh-Hans-MO", "zh-Hans-SG", "zh-Hant", "zh-Hant-HK", "zh-Hant-MO", "zu"];