UNPKG

@intlayer/core

Version:

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

143 lines (141 loc) 5.48 kB
const require_rolldown_runtime = require('../_virtual/rolldown_runtime.cjs'); const require_utils_localeStorage = require('../utils/localeStorage.cjs'); const require_localization_localeDetector = require('./localeDetector.cjs'); let __intlayer_types = require("@intlayer/types"); let __intlayer_config_built = require("@intlayer/config/built"); __intlayer_config_built = require_rolldown_runtime.__toESM(__intlayer_config_built); //#region src/localization/getBrowserLocale.tsx let LanguageDetector = /* @__PURE__ */ function(LanguageDetector$1) { LanguageDetector$1["Querystring"] = "querystring"; LanguageDetector$1["Storage"] = "storage"; LanguageDetector$1["Navigator"] = "navigator"; LanguageDetector$1["HtmlTag"] = "htmlTag"; return LanguageDetector$1; }({}); const localeStorageOptions = { getCookie: (name) => document.cookie.split(";").find((c) => c.trim().startsWith(`${name}=`))?.split("=")[1], getLocaleStorage: (name) => localStorage.getItem(name), getSessionStorage: (name) => sessionStorage.getItem(name), isCookieEnabled: true, setCookieStore: (name, value, attributes) => cookieStore.set({ name, value, path: attributes.path, domain: attributes.domain, expires: attributes.expires, sameSite: attributes.sameSite }), setCookieString: (cookie) => { document.cookie = cookie; }, setSessionStorage: (name, value) => sessionStorage.setItem(name, value), setLocaleStorage: (name, value) => localStorage.setItem(name, value) }; const getDefaultsOptions = () => { return { order: [ LanguageDetector.Querystring, LanguageDetector.Storage, LanguageDetector.Navigator, LanguageDetector.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[LanguageDetector.Querystring] = value; }; const storageDetector = () => { if (typeof window === "undefined") return; const locale = require_utils_localeStorage.getLocaleFromStorage({ getCookie: (name) => { try { const cookies = document.cookie.split(";"); const cookieName = `${name}=`; const cookie = cookies.find((c) => c.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[LanguageDetector.Storage] = locale; }; const navigatorDetector = () => { if (typeof navigator === "undefined") return; const { internationalization } = __intlayer_config_built.default; const languages = navigator.languages ?? [navigator.language]; const locale = require_localization_localeDetector.localeDetector({ "accept-language": languages.join(",") }, internationalization.locales, internationalization.defaultLocale); if (locale) detected[LanguageDetector.Navigator] = locale; }; const htmlTagDetector = () => { const htmlTag = options.htmlTag; if (htmlTag && typeof htmlTag.getAttribute === "function") { const lang = htmlTag.getAttribute("lang"); if (lang) { const { internationalization } = __intlayer_config_built.default; const locale = require_localization_localeDetector.localeDetector({ "accept-language": lang }, internationalization.locales, internationalization.defaultLocale); detected[LanguageDetector.HtmlTag] = locale; } } }; const detectors = { [LanguageDetector.Querystring]: queryStringDetector, [LanguageDetector.Storage]: storageDetector, [LanguageDetector.Navigator]: navigatorDetector, [LanguageDetector.HtmlTag]: htmlTagDetector }; order.forEach((detectorName) => { detectors[detectorName]?.(); }); return detected; }; const getFirstAvailableLocale = (locales, order) => { const { internationalization } = __intlayer_config_built.default; for (const detector of order) { const locale = locales[detector]; if (locale && internationalization.locales.includes(locale)) return locale; } return internationalization?.defaultLocale ?? __intlayer_types.Locales.ENGLISH; }; /** * 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 exports.LanguageDetector = LanguageDetector; exports.getBrowserLocale = getBrowserLocale; exports.localeStorageOptions = localeStorageOptions; //# sourceMappingURL=getBrowserLocale.cjs.map