@intlayer/core
Version:
Includes core Intlayer functions like translation, dictionary, and utility functions shared across multiple packages.
143 lines (141 loc) • 5.48 kB
JavaScript
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