@formatjs/intl-localematcher 0.5.1 → 0.5.3
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/LICENSE.md +1 -1
- package/abstract/utils.js +2 -2
- package/lib/abstract/BestAvailableLocale.js +1 -5
- package/lib/abstract/BestFitMatcher.js +4 -8
- package/lib/abstract/CanonicalizeLocaleList.js +1 -5
- package/lib/abstract/LookupMatcher.js +5 -9
- package/lib/abstract/LookupSupportedLocales.js +5 -9
- package/lib/abstract/ResolveLocale.js +13 -17
- package/lib/abstract/UnicodeExtensionValue.js +3 -7
- package/lib/abstract/languageMatching.js +1 -4
- package/lib/abstract/regions.generated.js +1 -4
- package/lib/abstract/types.js +1 -2
- package/lib/abstract/utils.js +15 -21
- package/lib/index.js +6 -12
- package/package.json +1 -1
package/LICENSE.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
MIT License
|
|
2
2
|
|
|
3
|
-
Copyright (c)
|
|
3
|
+
Copyright (c) 2023 FormatJS
|
|
4
4
|
|
|
5
5
|
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
6
6
|
|
package/abstract/utils.js
CHANGED
|
@@ -12,8 +12,8 @@ function invariant(condition, message, Err) {
|
|
|
12
12
|
}
|
|
13
13
|
}
|
|
14
14
|
exports.invariant = invariant;
|
|
15
|
-
// This is effectively 2 languages in 2 different regions
|
|
16
|
-
var DEFAULT_MATCHING_THRESHOLD =
|
|
15
|
+
// This is effectively 2 languages in 2 different regions in the same cluster
|
|
16
|
+
var DEFAULT_MATCHING_THRESHOLD = 838;
|
|
17
17
|
var PROCESSED_DATA;
|
|
18
18
|
function processData() {
|
|
19
19
|
var _a, _b;
|
|
@@ -1,12 +1,9 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.BestAvailableLocale = void 0;
|
|
4
1
|
/**
|
|
5
2
|
* https://tc39.es/ecma402/#sec-bestavailablelocale
|
|
6
3
|
* @param availableLocales
|
|
7
4
|
* @param locale
|
|
8
5
|
*/
|
|
9
|
-
function BestAvailableLocale(availableLocales, locale) {
|
|
6
|
+
export function BestAvailableLocale(availableLocales, locale) {
|
|
10
7
|
var candidate = locale;
|
|
11
8
|
while (true) {
|
|
12
9
|
if (availableLocales.indexOf(candidate) > -1) {
|
|
@@ -22,4 +19,3 @@ function BestAvailableLocale(availableLocales, locale) {
|
|
|
22
19
|
candidate = candidate.slice(0, pos);
|
|
23
20
|
}
|
|
24
21
|
}
|
|
25
|
-
exports.BestAvailableLocale = BestAvailableLocale;
|
|
@@ -1,24 +1,21 @@
|
|
|
1
|
-
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.BestFitMatcher = void 0;
|
|
4
|
-
var utils_1 = require("./utils");
|
|
1
|
+
import { UNICODE_EXTENSION_SEQUENCE_REGEX, findBestMatch } from './utils';
|
|
5
2
|
/**
|
|
6
3
|
* https://tc39.es/ecma402/#sec-bestfitmatcher
|
|
7
4
|
* @param availableLocales
|
|
8
5
|
* @param requestedLocales
|
|
9
6
|
* @param getDefaultLocale
|
|
10
7
|
*/
|
|
11
|
-
function BestFitMatcher(availableLocales, requestedLocales, getDefaultLocale) {
|
|
8
|
+
export function BestFitMatcher(availableLocales, requestedLocales, getDefaultLocale) {
|
|
12
9
|
var foundLocale;
|
|
13
10
|
var extension;
|
|
14
11
|
var noExtensionLocales = [];
|
|
15
12
|
var noExtensionLocaleMap = requestedLocales.reduce(function (all, l) {
|
|
16
|
-
var noExtensionLocale = l.replace(
|
|
13
|
+
var noExtensionLocale = l.replace(UNICODE_EXTENSION_SEQUENCE_REGEX, '');
|
|
17
14
|
noExtensionLocales.push(noExtensionLocale);
|
|
18
15
|
all[noExtensionLocale] = l;
|
|
19
16
|
return all;
|
|
20
17
|
}, {});
|
|
21
|
-
var result =
|
|
18
|
+
var result = findBestMatch(noExtensionLocales, availableLocales);
|
|
22
19
|
if (result.matchedSupportedLocale && result.matchedDesiredLocale) {
|
|
23
20
|
foundLocale = result.matchedSupportedLocale;
|
|
24
21
|
extension =
|
|
@@ -32,4 +29,3 @@ function BestFitMatcher(availableLocales, requestedLocales, getDefaultLocale) {
|
|
|
32
29
|
extension: extension,
|
|
33
30
|
};
|
|
34
31
|
}
|
|
35
|
-
exports.BestFitMatcher = BestFitMatcher;
|
|
@@ -1,12 +1,8 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.CanonicalizeLocaleList = void 0;
|
|
4
1
|
/**
|
|
5
2
|
* http://ecma-international.org/ecma-402/7.0/index.html#sec-canonicalizelocalelist
|
|
6
3
|
* @param locales
|
|
7
4
|
*/
|
|
8
|
-
function CanonicalizeLocaleList(locales) {
|
|
5
|
+
export function CanonicalizeLocaleList(locales) {
|
|
9
6
|
// TODO
|
|
10
7
|
return Intl.getCanonicalLocales(locales);
|
|
11
8
|
}
|
|
12
|
-
exports.CanonicalizeLocaleList = CanonicalizeLocaleList;
|
|
@@ -1,20 +1,17 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
exports.LookupMatcher = void 0;
|
|
4
|
-
var BestAvailableLocale_1 = require("./BestAvailableLocale");
|
|
5
|
-
var utils_1 = require("./utils");
|
|
1
|
+
import { BestAvailableLocale } from './BestAvailableLocale';
|
|
2
|
+
import { UNICODE_EXTENSION_SEQUENCE_REGEX } from './utils';
|
|
6
3
|
/**
|
|
7
4
|
* https://tc39.es/ecma402/#sec-lookupmatcher
|
|
8
5
|
* @param availableLocales
|
|
9
6
|
* @param requestedLocales
|
|
10
7
|
* @param getDefaultLocale
|
|
11
8
|
*/
|
|
12
|
-
function LookupMatcher(availableLocales, requestedLocales, getDefaultLocale) {
|
|
9
|
+
export function LookupMatcher(availableLocales, requestedLocales, getDefaultLocale) {
|
|
13
10
|
var result = { locale: '' };
|
|
14
11
|
for (var _i = 0, requestedLocales_1 = requestedLocales; _i < requestedLocales_1.length; _i++) {
|
|
15
12
|
var locale = requestedLocales_1[_i];
|
|
16
|
-
var noExtensionLocale = locale.replace(
|
|
17
|
-
var availableLocale =
|
|
13
|
+
var noExtensionLocale = locale.replace(UNICODE_EXTENSION_SEQUENCE_REGEX, '');
|
|
14
|
+
var availableLocale = BestAvailableLocale(availableLocales, noExtensionLocale);
|
|
18
15
|
if (availableLocale) {
|
|
19
16
|
result.locale = availableLocale;
|
|
20
17
|
if (locale !== noExtensionLocale) {
|
|
@@ -26,4 +23,3 @@ function LookupMatcher(availableLocales, requestedLocales, getDefaultLocale) {
|
|
|
26
23
|
result.locale = getDefaultLocale();
|
|
27
24
|
return result;
|
|
28
25
|
}
|
|
29
|
-
exports.LookupMatcher = LookupMatcher;
|
|
@@ -1,23 +1,19 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
exports.LookupSupportedLocales = void 0;
|
|
4
|
-
var BestAvailableLocale_1 = require("./BestAvailableLocale");
|
|
5
|
-
var utils_1 = require("./utils");
|
|
1
|
+
import { BestAvailableLocale } from './BestAvailableLocale';
|
|
2
|
+
import { UNICODE_EXTENSION_SEQUENCE_REGEX } from './utils';
|
|
6
3
|
/**
|
|
7
4
|
* https://tc39.es/ecma402/#sec-lookupsupportedlocales
|
|
8
5
|
* @param availableLocales
|
|
9
6
|
* @param requestedLocales
|
|
10
7
|
*/
|
|
11
|
-
function LookupSupportedLocales(availableLocales, requestedLocales) {
|
|
8
|
+
export function LookupSupportedLocales(availableLocales, requestedLocales) {
|
|
12
9
|
var subset = [];
|
|
13
10
|
for (var _i = 0, requestedLocales_1 = requestedLocales; _i < requestedLocales_1.length; _i++) {
|
|
14
11
|
var locale = requestedLocales_1[_i];
|
|
15
|
-
var noExtensionLocale = locale.replace(
|
|
16
|
-
var availableLocale =
|
|
12
|
+
var noExtensionLocale = locale.replace(UNICODE_EXTENSION_SEQUENCE_REGEX, '');
|
|
13
|
+
var availableLocale = BestAvailableLocale(availableLocales, noExtensionLocale);
|
|
17
14
|
if (availableLocale) {
|
|
18
15
|
subset.push(availableLocale);
|
|
19
16
|
}
|
|
20
17
|
}
|
|
21
18
|
return subset;
|
|
22
19
|
}
|
|
23
|
-
exports.LookupSupportedLocales = LookupSupportedLocales;
|
|
@@ -1,37 +1,34 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
var LookupMatcher_1 = require("./LookupMatcher");
|
|
6
|
-
var UnicodeExtensionValue_1 = require("./UnicodeExtensionValue");
|
|
7
|
-
var utils_1 = require("./utils");
|
|
1
|
+
import { BestFitMatcher } from './BestFitMatcher';
|
|
2
|
+
import { LookupMatcher } from './LookupMatcher';
|
|
3
|
+
import { UnicodeExtensionValue } from './UnicodeExtensionValue';
|
|
4
|
+
import { invariant } from './utils';
|
|
8
5
|
/**
|
|
9
6
|
* https://tc39.es/ecma402/#sec-resolvelocale
|
|
10
7
|
*/
|
|
11
|
-
function ResolveLocale(availableLocales, requestedLocales, options, relevantExtensionKeys, localeData, getDefaultLocale) {
|
|
8
|
+
export function ResolveLocale(availableLocales, requestedLocales, options, relevantExtensionKeys, localeData, getDefaultLocale) {
|
|
12
9
|
var matcher = options.localeMatcher;
|
|
13
10
|
var r;
|
|
14
11
|
if (matcher === 'lookup') {
|
|
15
|
-
r =
|
|
12
|
+
r = LookupMatcher(Array.from(availableLocales), requestedLocales, getDefaultLocale);
|
|
16
13
|
}
|
|
17
14
|
else {
|
|
18
|
-
r =
|
|
15
|
+
r = BestFitMatcher(Array.from(availableLocales), requestedLocales, getDefaultLocale);
|
|
19
16
|
}
|
|
20
17
|
var foundLocale = r.locale;
|
|
21
18
|
var result = { locale: '', dataLocale: foundLocale };
|
|
22
19
|
var supportedExtension = '-u';
|
|
23
20
|
for (var _i = 0, relevantExtensionKeys_1 = relevantExtensionKeys; _i < relevantExtensionKeys_1.length; _i++) {
|
|
24
21
|
var key = relevantExtensionKeys_1[_i];
|
|
25
|
-
|
|
22
|
+
invariant(foundLocale in localeData, "Missing locale data for ".concat(foundLocale));
|
|
26
23
|
var foundLocaleData = localeData[foundLocale];
|
|
27
|
-
|
|
24
|
+
invariant(typeof foundLocaleData === 'object' && foundLocaleData !== null, "locale data ".concat(key, " must be an object"));
|
|
28
25
|
var keyLocaleData = foundLocaleData[key];
|
|
29
|
-
|
|
26
|
+
invariant(Array.isArray(keyLocaleData), "keyLocaleData for ".concat(key, " must be an array"));
|
|
30
27
|
var value = keyLocaleData[0];
|
|
31
|
-
|
|
28
|
+
invariant(typeof value === 'string' || value === null, "value must be string or null but got ".concat(typeof value, " in key ").concat(key));
|
|
32
29
|
var supportedExtensionAddition = '';
|
|
33
30
|
if (r.extension) {
|
|
34
|
-
var requestedValue =
|
|
31
|
+
var requestedValue = UnicodeExtensionValue(r.extension, key);
|
|
35
32
|
if (requestedValue !== undefined) {
|
|
36
33
|
if (requestedValue !== '') {
|
|
37
34
|
if (~keyLocaleData.indexOf(requestedValue)) {
|
|
@@ -47,7 +44,7 @@ function ResolveLocale(availableLocales, requestedLocales, options, relevantExte
|
|
|
47
44
|
}
|
|
48
45
|
if (key in options) {
|
|
49
46
|
var optionsValue = options[key];
|
|
50
|
-
|
|
47
|
+
invariant(typeof optionsValue === 'string' ||
|
|
51
48
|
typeof optionsValue === 'undefined' ||
|
|
52
49
|
optionsValue === null, 'optionsValue must be String, Undefined or Null');
|
|
53
50
|
if (~keyLocaleData.indexOf(optionsValue)) {
|
|
@@ -75,4 +72,3 @@ function ResolveLocale(availableLocales, requestedLocales, options, relevantExte
|
|
|
75
72
|
result.locale = foundLocale;
|
|
76
73
|
return result;
|
|
77
74
|
}
|
|
78
|
-
exports.ResolveLocale = ResolveLocale;
|
|
@@ -1,14 +1,11 @@
|
|
|
1
|
-
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.UnicodeExtensionValue = void 0;
|
|
4
|
-
var utils_1 = require("./utils");
|
|
1
|
+
import { invariant } from './utils';
|
|
5
2
|
/**
|
|
6
3
|
* https://tc39.es/ecma402/#sec-unicodeextensionvalue
|
|
7
4
|
* @param extension
|
|
8
5
|
* @param key
|
|
9
6
|
*/
|
|
10
|
-
function UnicodeExtensionValue(extension, key) {
|
|
11
|
-
|
|
7
|
+
export function UnicodeExtensionValue(extension, key) {
|
|
8
|
+
invariant(key.length === 2, 'key must have 2 elements');
|
|
12
9
|
var size = extension.length;
|
|
13
10
|
var searchValue = "-".concat(key, "-");
|
|
14
11
|
var pos = extension.indexOf(searchValue);
|
|
@@ -47,4 +44,3 @@ function UnicodeExtensionValue(extension, key) {
|
|
|
47
44
|
}
|
|
48
45
|
return undefined;
|
|
49
46
|
}
|
|
50
|
-
exports.UnicodeExtensionValue = UnicodeExtensionValue;
|
package/lib/abstract/types.js
CHANGED
|
@@ -1,2 +1 @@
|
|
|
1
|
-
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
1
|
+
export {};
|
package/lib/abstract/utils.js
CHANGED
|
@@ -1,26 +1,22 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
var
|
|
5
|
-
|
|
6
|
-
var regions_generated_1 = require("./regions.generated");
|
|
7
|
-
exports.UNICODE_EXTENSION_SEQUENCE_REGEX = /-u(?:-[0-9a-z]{2,8})+/gi;
|
|
8
|
-
function invariant(condition, message, Err) {
|
|
1
|
+
import { __spreadArray } from "tslib";
|
|
2
|
+
import { data as jsonData } from './languageMatching';
|
|
3
|
+
import { regions } from './regions.generated';
|
|
4
|
+
export var UNICODE_EXTENSION_SEQUENCE_REGEX = /-u(?:-[0-9a-z]{2,8})+/gi;
|
|
5
|
+
export function invariant(condition, message, Err) {
|
|
9
6
|
if (Err === void 0) { Err = Error; }
|
|
10
7
|
if (!condition) {
|
|
11
8
|
throw new Err(message);
|
|
12
9
|
}
|
|
13
10
|
}
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
var DEFAULT_MATCHING_THRESHOLD = 840;
|
|
11
|
+
// This is effectively 2 languages in 2 different regions in the same cluster
|
|
12
|
+
var DEFAULT_MATCHING_THRESHOLD = 838;
|
|
17
13
|
var PROCESSED_DATA;
|
|
18
14
|
function processData() {
|
|
19
15
|
var _a, _b;
|
|
20
16
|
if (!PROCESSED_DATA) {
|
|
21
|
-
var paradigmLocales = (_b = (_a =
|
|
22
|
-
var matchVariables =
|
|
23
|
-
var data =
|
|
17
|
+
var paradigmLocales = (_b = (_a = jsonData.supplemental.languageMatching['written-new'][0]) === null || _a === void 0 ? void 0 : _a.paradigmLocales) === null || _b === void 0 ? void 0 : _b._locales.split(' ');
|
|
18
|
+
var matchVariables = jsonData.supplemental.languageMatching['written-new'].slice(1, 5);
|
|
19
|
+
var data = jsonData.supplemental.languageMatching['written-new'].slice(5);
|
|
24
20
|
var matches = data.map(function (d) {
|
|
25
21
|
var key = Object.keys(d)[0];
|
|
26
22
|
var value = d[key];
|
|
@@ -39,7 +35,7 @@ function processData() {
|
|
|
39
35
|
all[key.slice(1)] = value._value.split('+');
|
|
40
36
|
return all;
|
|
41
37
|
}, {}),
|
|
42
|
-
paradigmLocales:
|
|
38
|
+
paradigmLocales: __spreadArray(__spreadArray([], paradigmLocales, true), paradigmLocales.map(function (l) {
|
|
43
39
|
return new Intl.Locale(l.replace(/_/g, '-')).maximize().toString();
|
|
44
40
|
}), true),
|
|
45
41
|
};
|
|
@@ -55,8 +51,8 @@ function isMatched(locale, languageMatchInfoLocale, matchVariables) {
|
|
|
55
51
|
? matchVariables[region.slice(1)]
|
|
56
52
|
: matchVariables[region.slice(2)];
|
|
57
53
|
var expandedMatchedRegions = matchRegions
|
|
58
|
-
.map(function (r) { return
|
|
59
|
-
.reduce(function (all, list) { return
|
|
54
|
+
.map(function (r) { return regions[r] || [r]; })
|
|
55
|
+
.reduce(function (all, list) { return __spreadArray(__spreadArray([], all, true), list, true); }, []);
|
|
60
56
|
matches && (matches = !(expandedMatchedRegions.indexOf(locale.region || '') > 1 !=
|
|
61
57
|
shouldInclude));
|
|
62
58
|
}
|
|
@@ -95,7 +91,7 @@ function findMatchingDistanceForLSR(desired, supported, data) {
|
|
|
95
91
|
}
|
|
96
92
|
throw new Error('No matching distance found');
|
|
97
93
|
}
|
|
98
|
-
function findMatchingDistance(desired, supported) {
|
|
94
|
+
export function findMatchingDistance(desired, supported) {
|
|
99
95
|
var desiredLocale = new Intl.Locale(desired).maximize();
|
|
100
96
|
var supportedLocale = new Intl.Locale(supported).maximize();
|
|
101
97
|
var desiredLSR = {
|
|
@@ -137,8 +133,7 @@ function findMatchingDistance(desired, supported) {
|
|
|
137
133
|
}
|
|
138
134
|
return matchingDistance;
|
|
139
135
|
}
|
|
140
|
-
|
|
141
|
-
function findBestMatch(requestedLocales, supportedLocales, threshold) {
|
|
136
|
+
export function findBestMatch(requestedLocales, supportedLocales, threshold) {
|
|
142
137
|
if (threshold === void 0) { threshold = DEFAULT_MATCHING_THRESHOLD; }
|
|
143
138
|
var lowestDistance = Infinity;
|
|
144
139
|
var result = {
|
|
@@ -167,4 +162,3 @@ function findBestMatch(requestedLocales, supportedLocales, threshold) {
|
|
|
167
162
|
}
|
|
168
163
|
return result;
|
|
169
164
|
}
|
|
170
|
-
exports.findBestMatch = findBestMatch;
|
package/lib/index.js
CHANGED
|
@@ -1,15 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
var ResolveLocale_1 = require("./abstract/ResolveLocale");
|
|
6
|
-
function match(requestedLocales, availableLocales, defaultLocale, opts) {
|
|
7
|
-
return (0, ResolveLocale_1.ResolveLocale)(availableLocales, (0, CanonicalizeLocaleList_1.CanonicalizeLocaleList)(requestedLocales), {
|
|
1
|
+
import { CanonicalizeLocaleList } from './abstract/CanonicalizeLocaleList';
|
|
2
|
+
import { ResolveLocale } from './abstract/ResolveLocale';
|
|
3
|
+
export function match(requestedLocales, availableLocales, defaultLocale, opts) {
|
|
4
|
+
return ResolveLocale(availableLocales, CanonicalizeLocaleList(requestedLocales), {
|
|
8
5
|
localeMatcher: (opts === null || opts === void 0 ? void 0 : opts.algorithm) || 'best fit',
|
|
9
6
|
}, [], {}, function () { return defaultLocale; }).locale;
|
|
10
7
|
}
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
Object.defineProperty(exports, "LookupSupportedLocales", { enumerable: true, get: function () { return LookupSupportedLocales_1.LookupSupportedLocales; } });
|
|
14
|
-
var ResolveLocale_2 = require("./abstract/ResolveLocale");
|
|
15
|
-
Object.defineProperty(exports, "ResolveLocale", { enumerable: true, get: function () { return ResolveLocale_2.ResolveLocale; } });
|
|
8
|
+
export { LookupSupportedLocales } from './abstract/LookupSupportedLocales';
|
|
9
|
+
export { ResolveLocale } from './abstract/ResolveLocale';
|