frontend/.pnpm-store/v3/files/5a/8e17affd675a3a457eb6ceec6b20d40b0fba05cb6c0e187dddd555773e22c37d34e81d488d38e66d64c8d8e82d9e6956da9a8092b819146091219739a8c79e-exec

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,
};
}