mirror of
https://github.com/fosrl/pangolin.git
synced 2026-09-02 01:09:03 +02:00
49 lines
1.5 KiB
TypeScript
49 lines
1.5 KiB
TypeScript
import { Locale, locales } from "./config";
|
|
|
|
export function detectLocale(acceptLanguage: string): Locale | undefined {
|
|
const browserLocales = acceptLanguage
|
|
.split(",")
|
|
.map((entry, index) => {
|
|
const [locale, ...parameters] = entry.trim().split(";");
|
|
const qualityParameter = parameters.find((parameter) =>
|
|
parameter.trim().toLowerCase().startsWith("q=")
|
|
);
|
|
const quality = qualityParameter
|
|
? Number(qualityParameter.trim().slice(2))
|
|
: 1;
|
|
|
|
return {
|
|
locale: locale.trim().toLowerCase(),
|
|
quality,
|
|
index
|
|
};
|
|
})
|
|
.filter(
|
|
({ locale, quality }) =>
|
|
locale && locale !== "*" && quality > 0 && quality <= 1
|
|
)
|
|
.sort(
|
|
(left, right) =>
|
|
right.quality - left.quality || left.index - right.index
|
|
);
|
|
|
|
for (const { locale: browserLocale } of browserLocales) {
|
|
const exactMatch = locales.find(
|
|
(locale) => locale.toLowerCase() === browserLocale
|
|
);
|
|
if (exactMatch) {
|
|
return exactMatch;
|
|
}
|
|
|
|
const browserLanguage = browserLocale.split("-")[0];
|
|
const languageMatch = locales.find(
|
|
(locale) => locale.split("-")[0].toLowerCase() === browserLanguage
|
|
);
|
|
if (languageMatch) {
|
|
return languageMatch;
|
|
}
|
|
}
|
|
|
|
return undefined;
|
|
}
|