UNPKG

@intlayer/core

Version:

Includes core Intlayer functions like translation, dictionary, and utility functions shared across multiple packages.

113 lines (111 loc) 3.95 kB
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