Some checks failed
Build & Deploy / 🔍 Prepare (push) Successful in 20s
Build & Deploy / 🧪 QA (push) Failing after 34s
Build & Deploy / 🏗️ Build (push) Has started running
Build & Deploy / 🚀 Deploy (push) Has been cancelled
Build & Deploy / 🧪 Smoke Test (push) Has been cancelled
Build & Deploy / ⚡ Lighthouse (push) Has been cancelled
Build & Deploy / 🔔 Notify (push) Has been cancelled
30 lines
839 B
Plaintext
30 lines
839 B
Plaintext
// Cache for Set conversions to avoid repeated array->Set conversions
|
|
const availableLocalesSetCache = new WeakMap();
|
|
/**
|
|
* https://tc39.es/ecma402/#sec-bestavailablelocale
|
|
* @param availableLocales
|
|
* @param locale
|
|
*/
|
|
export function BestAvailableLocale(availableLocales, locale) {
|
|
// Fast path: use Set for O(1) lookups instead of O(n) indexOf
|
|
let availableSet = availableLocalesSetCache.get(availableLocales);
|
|
if (!availableSet) {
|
|
availableSet = new Set(availableLocales);
|
|
availableLocalesSetCache.set(availableLocales, availableSet);
|
|
}
|
|
let candidate = locale;
|
|
while (true) {
|
|
if (availableSet.has(candidate)) {
|
|
return candidate;
|
|
}
|
|
let pos = candidate.lastIndexOf("-");
|
|
if (!~pos) {
|
|
return undefined;
|
|
}
|
|
if (pos >= 2 && candidate[pos - 2] === "-") {
|
|
pos -= 2;
|
|
}
|
|
candidate = candidate.slice(0, pos);
|
|
}
|
|
}
|