UNPKG

react-intlayer

Version:

Easily internationalize i18n your React applications with type-safe multilingual content management.

138 lines 4.63 kB
import configuration from "@intlayer/config/built"; import { Locales } from "@intlayer/config/client"; var LanguageDetector = /* @__PURE__ */ ((LanguageDetector2) => { LanguageDetector2["Querystring"] = "querystring"; LanguageDetector2["Cookie"] = "cookie"; LanguageDetector2["LocalStorage"] = "localStorage"; LanguageDetector2["SessionStorage"] = "sessionStorage"; LanguageDetector2["Navigator"] = "navigator"; LanguageDetector2["HtmlTag"] = "htmlTag"; return LanguageDetector2; })(LanguageDetector || {}); const getDefaultsOptions = () => { const { middleware } = configuration; return { order: [ "querystring" /* Querystring */, "cookie" /* Cookie */, "navigator" /* Navigator */, "htmlTag" /* HtmlTag */ ], lookupQuerystring: "locale", lookupCookie: middleware?.cookieName, htmlTag: document.documentElement }; }; const isLocalStorageAvailable = () => { try { if (typeof window === "undefined") return false; const testKey = "intlayer.translate.boo"; window.localStorage.setItem(testKey, "foo"); window.localStorage.removeItem(testKey); return true; } catch { return false; } }; const isSessionStorageAvailable = () => { try { if (typeof window === "undefined") return false; const testKey = "intlayer.translate.boo"; window.sessionStorage.setItem(testKey, "foo"); window.sessionStorage.removeItem(testKey); return true; } catch { return false; } }; const detectLanguage = (order, options) => { const detected = {}; const queryStringDetector = () => { if (typeof window === "undefined") return; const search = window.location.search || ""; const params = new URLSearchParams(search); const value = params.get(options.lookupQuerystring ?? ""); if (value) { detected["querystring" /* Querystring */] = value; } }; const cookieDetector = () => { if (typeof document === "undefined") return; const cookies = document.cookie.split(";"); const cookieName = `${options.lookupCookie ?? ""}=`; const cookie = cookies.find((c) => c.trim().startsWith(cookieName)); if (cookie) { const value = cookie.split("=")[1].trim(); detected["cookie" /* Cookie */] = value; } }; const localStorageDetector = () => { if (!isLocalStorageAvailable()) return; const value = window.localStorage.getItem(options.lookupLocalStorage ?? ""); if (value) { detected["localStorage" /* LocalStorage */] = value; } }; const sessionStorageDetector = () => { if (!isSessionStorageAvailable()) return; const value = window.sessionStorage.getItem( options.lookupSessionStorage ?? "" ); if (value) { detected["sessionStorage" /* SessionStorage */] = value; } }; const navigatorDetector = () => { if (typeof navigator === "undefined") return; if (navigator.language) { detected["navigator" /* Navigator */] = navigator.language; } }; const htmlTagDetector = () => { const htmlTag = options.htmlTag; if (htmlTag && typeof htmlTag.getAttribute === "function") { const lang = htmlTag.getAttribute("lang"); if (lang) { detected["htmlTag" /* HtmlTag */] = lang; } } }; const detectors = { ["querystring" /* Querystring */]: queryStringDetector, ["cookie" /* Cookie */]: cookieDetector, ["localStorage" /* LocalStorage */]: localStorageDetector, ["sessionStorage" /* SessionStorage */]: sessionStorageDetector, ["navigator" /* Navigator */]: navigatorDetector, ["htmlTag" /* HtmlTag */]: htmlTagDetector }; order.forEach((detectorName) => { detectors[detectorName]?.(); }); return detected; }; const getFirstAvailableLocale = (locales, order) => { const { internationalization } = configuration; for (const detector of order) { const localesArray = [locales[detector]].flat(); for (const locale of localesArray) { if (locale && (internationalization?.locales).includes(locale)) { return locale; } else if (locale?.includes("-") && (internationalization?.locales).includes( locale.split("-")[0] )) { return locale.split("-")[0]; } } } return internationalization?.defaultLocale ?? Locales.ENGLISH; }; const getBrowserLocale = (userOptions = {}) => { const options = { ...getDefaultsOptions(), ...userOptions }; const locales = detectLanguage(options.order ?? [], options); return getFirstAvailableLocale(locales, options.order ?? []); }; export { LanguageDetector, getBrowserLocale }; //# sourceMappingURL=getBrowserLocale.mjs.map