62 lines
2.4 KiB
Plaintext
Executable File
62 lines
2.4 KiB
Plaintext
Executable File
import { BestAvailableLocale } from './BestAvailableLocale';
|
|
import { UNICODE_EXTENSION_SEQUENCE_REGEX } from './utils';
|
|
/**
|
|
* https://tc39.es/ecma402/#sec-bestfitmatcher
|
|
* @param availableLocales
|
|
* @param requestedLocales
|
|
* @param getDefaultLocale
|
|
*/
|
|
export function BestFitMatcher(availableLocales, requestedLocales, getDefaultLocale) {
|
|
var minimizedAvailableLocaleMap = {};
|
|
var availableLocaleMap = {};
|
|
var canonicalizedLocaleMap = {};
|
|
var minimizedAvailableLocales = new Set();
|
|
availableLocales.forEach(function (locale) {
|
|
var minimizedLocale = new Intl.Locale(locale)
|
|
.minimize()
|
|
.toString();
|
|
var canonicalizedLocale = Intl.getCanonicalLocales(locale)[0] || locale;
|
|
minimizedAvailableLocaleMap[minimizedLocale] = locale;
|
|
availableLocaleMap[locale] = locale;
|
|
canonicalizedLocaleMap[canonicalizedLocale] = locale;
|
|
minimizedAvailableLocales.add(minimizedLocale);
|
|
minimizedAvailableLocales.add(locale);
|
|
minimizedAvailableLocales.add(canonicalizedLocale);
|
|
});
|
|
var foundLocale;
|
|
for (var _i = 0, requestedLocales_1 = requestedLocales; _i < requestedLocales_1.length; _i++) {
|
|
var l = requestedLocales_1[_i];
|
|
if (foundLocale) {
|
|
break;
|
|
}
|
|
var noExtensionLocale = l.replace(UNICODE_EXTENSION_SEQUENCE_REGEX, '');
|
|
if (availableLocales.has(noExtensionLocale)) {
|
|
foundLocale = noExtensionLocale;
|
|
break;
|
|
}
|
|
if (minimizedAvailableLocales.has(noExtensionLocale)) {
|
|
foundLocale = noExtensionLocale;
|
|
break;
|
|
}
|
|
var locale = new Intl.Locale(noExtensionLocale);
|
|
var maximizedRequestedLocale = locale.maximize().toString();
|
|
var minimizedRequestedLocale = locale.minimize().toString();
|
|
// Check minimized locale
|
|
if (minimizedAvailableLocales.has(minimizedRequestedLocale)) {
|
|
foundLocale = minimizedRequestedLocale;
|
|
break;
|
|
}
|
|
// Lookup algo on maximized locale
|
|
foundLocale = BestAvailableLocale(minimizedAvailableLocales, maximizedRequestedLocale);
|
|
}
|
|
if (!foundLocale) {
|
|
return { locale: getDefaultLocale() };
|
|
}
|
|
return {
|
|
locale: availableLocaleMap[foundLocale] ||
|
|
canonicalizedLocaleMap[foundLocale] ||
|
|
minimizedAvailableLocaleMap[foundLocale] ||
|
|
foundLocale,
|
|
};
|
|
}
|