@intlayer/core
Version:
Includes core Intlayer functions like translation, dictionary, and utility functions shared across multiple packages.
113 lines (111 loc) • 3.95 kB
JavaScript
import { getLocaleFromStorageClient } from "../utils/localeStorage.mjs";
import { localeDetector } from "./localeDetector.mjs";
import { internationalization } from "@intlayer/config/built";
import { DEFAULT_LOCALE } from "@intlayer/config/defaultValues";
//#region src/localization/getBrowserLocale.tsx
let LanguageDetector = /* @__PURE__ */ function(LanguageDetector) {
LanguageDetector["Querystring"] = "querystring";
LanguageDetector["Storage"] = "storage";
LanguageDetector["Navigator"] = "navigator";
LanguageDetector["HtmlTag"] = "htmlTag";
return LanguageDetector;
}({});
const getDefaultsOptions = () => {
return {
order: [
"querystring",
"storage",
"navigator",
"htmlTag"
],
lookupQuerystring: "locale",
htmlTag: typeof document !== "undefined" ? document.documentElement : null
};
};
const detectLanguage = (order, options) => {
const detected = {};
const queryStringDetector = () => {
if (typeof window === "undefined") return;
const search = window.location.search || "";
const value = new URLSearchParams(search).get(options.lookupQuerystring ?? "");
if (value) detected["querystring"] = value;
};
const storageDetector = () => {
if (typeof window === "undefined") return;
const locale = getLocaleFromStorageClient({
getCookie: (name) => {
try {
const cookies = document.cookie.split(";");
const cookieName = `${name}=`;
const cookie = cookies.find((cookie) => cookie.trim().startsWith(cookieName));
if (cookie) return cookie.split("=")[1].trim();
} catch {}
},
getSessionStorage: (name) => {
try {
return window.sessionStorage.getItem(name) ?? void 0;
} catch {}
},
getLocaleStorage: (name) => {
try {
return window.localStorage.getItem(name) ?? void 0;
} catch {}
}
});
if (locale) detected["storage"] = locale;
};
const navigatorDetector = () => {
if (typeof navigator === "undefined") return;
const locale = localeDetector({ "accept-language": (navigator.languages ?? [navigator.language]).join(",") }, internationalization.locales, internationalization.defaultLocale);
if (locale) detected["navigator"] = locale;
};
const htmlTagDetector = () => {
const htmlTag = options.htmlTag;
if (htmlTag && typeof htmlTag.getAttribute === "function") {
const lang = htmlTag.getAttribute("lang");
if (lang) detected["htmlTag"] = localeDetector({ "accept-language": lang }, internationalization.locales, internationalization.defaultLocale);
}
};
const detectors = {
["querystring"]: queryStringDetector,
["storage"]: storageDetector,
["navigator"]: navigatorDetector,
["htmlTag"]: htmlTagDetector
};
order.forEach((detectorName) => {
detectors[detectorName]?.();
});
return detected;
};
const getFirstAvailableLocale = (locales, order) => {
for (const detector of order) {
const locale = locales[detector];
if (locale && internationalization.locales.includes(locale)) return locale;
}
return internationalization?.defaultLocale ?? DEFAULT_LOCALE;
};
/**
* Core language detector function for browser environments.
*
* Detects the user's preferred locale by checking multiple sources in order:
* 1. Query string parameter
* 2. Storage (cookies, localStorage, sessionStorage) - uses getLocaleFromStorage
* 3. Navigator languages - uses localeDetector
* 4. HTML lang attribute - uses localeDetector
*
* @param userOptions - Optional configuration for detection order and lookup keys
* @returns The detected locale or the default locale
*
* @example
* const locale = getBrowserLocale({ order: [LanguageDetector.Storage, LanguageDetector.Navigator] });
*/
const getBrowserLocale = (userOptions = {}) => {
const options = {
...getDefaultsOptions(),
...userOptions
};
return getFirstAvailableLocale(detectLanguage(options.order ?? [], options), options.order ?? []);
};
//#endregion
export { LanguageDetector, getBrowserLocale };
//# sourceMappingURL=getBrowserLocale.mjs.map