{"version":3,"sources":["../../../src/client/getBrowserLocale.tsx"],"sourcesContent":["import { Locales } from '@intlayer/config/client';\nimport configuration from '@intlayer/config/built';\n\nimport { localeList } from '@intlayer/core';\n\nexport enum LanguageDetector {\n  Querystring = 'querystring',\n  Cookie = 'cookie',\n  LocalStorage = 'localStorage',\n  SessionStorage = 'sessionStorage',\n  Navigator = 'navigator',\n  HtmlTag = 'htmlTag',\n}\n\n// Default settings for the language detector\ntype LanguageDetectorOptions = {\n  order?: LanguageDetector[];\n  lookupQuerystring?: string;\n  lookupCookie?: string;\n  lookupLocalStorage?: string;\n  lookupSessionStorage?: string;\n  excludeCacheFor?: string[];\n  htmlTag?: HTMLElement | null;\n};\n\nconst getDefaultsOptions = (): LanguageDetectorOptions => {\n  const { middleware } = configuration;\n\n  return {\n    order: [\n      LanguageDetector.Querystring,\n      LanguageDetector.Cookie,\n      LanguageDetector.Navigator,\n      LanguageDetector.HtmlTag,\n    ],\n    lookupQuerystring: 'locale',\n    lookupCookie: middleware?.cookieName,\n    htmlTag: document.documentElement,\n  };\n};\n\n// Helper functions for various checks and operations\nconst isLocalStorageAvailable = (): boolean => {\n  try {\n    if (typeof window === 'undefined') return false;\n    const testKey = 'intlayer.translate.boo';\n    window.localStorage.setItem(testKey, 'foo');\n    window.localStorage.removeItem(testKey);\n    return true;\n  } catch {\n    return false;\n  }\n};\n\nconst isSessionStorageAvailable = (): boolean => {\n  try {\n    if (typeof window === 'undefined') return false;\n    const testKey = 'intlayer.translate.boo';\n    window.sessionStorage.setItem(testKey, 'foo');\n    window.sessionStorage.removeItem(testKey);\n    return true;\n  } catch {\n    return false;\n  }\n};\n\n// Function to detect language using different detectors\nconst detectLanguage = (\n  order: string[],\n  options: LanguageDetectorOptions\n): Record<LanguageDetector, Locales | Locales[]> => {\n  const detected: Record<LanguageDetector, Locales | Locales[]> = {} as Record<\n    LanguageDetector,\n    Locales | Locales[]\n  >;\n\n  const queryStringDetector = () => {\n    if (typeof window === 'undefined') return;\n    const search = window.location.search || '';\n    const params = new URLSearchParams(search);\n    const value = params.get(options.lookupQuerystring ?? '');\n    if (value) {\n      detected[LanguageDetector.Querystring] = value as Locales;\n    }\n  };\n\n  const cookieDetector = () => {\n    if (typeof document === 'undefined') return;\n    const cookies = document.cookie.split(';');\n    const cookieName = `${options.lookupCookie ?? ''}=`;\n    const cookie = cookies.find((c) => c.trim().startsWith(cookieName));\n    if (cookie) {\n      const value = cookie.split('=')[1].trim();\n\n      detected[LanguageDetector.Cookie] = value as Locales;\n    }\n  };\n\n  const localStorageDetector = () => {\n    if (!isLocalStorageAvailable()) return;\n    const value = window.localStorage.getItem(options.lookupLocalStorage ?? '');\n    if (value) {\n      detected[LanguageDetector.LocalStorage] = value as Locales;\n    }\n  };\n\n  const sessionStorageDetector = () => {\n    if (!isSessionStorageAvailable()) return;\n    const value = window.sessionStorage.getItem(\n      options.lookupSessionStorage ?? ''\n    );\n    if (value) {\n      detected[LanguageDetector.SessionStorage] = value as Locales;\n    }\n  };\n\n  const navigatorDetector = () => {\n    if (typeof navigator === 'undefined') return;\n\n    if (navigator.language) {\n      detected[LanguageDetector.Navigator] = navigator.language as Locales;\n    }\n  };\n\n  const htmlTagDetector = () => {\n    const htmlTag = options.htmlTag;\n    if (htmlTag && typeof htmlTag.getAttribute === 'function') {\n      const lang = htmlTag.getAttribute('lang');\n      if (lang) {\n        detected[LanguageDetector.HtmlTag] = lang as Locales;\n      }\n    }\n  };\n\n  // Map detector names to their corresponding functions\n  const detectors: Record<string, () => void> = {\n    [LanguageDetector.Querystring]: queryStringDetector,\n    [LanguageDetector.Cookie]: cookieDetector,\n    [LanguageDetector.LocalStorage]: localStorageDetector,\n    [LanguageDetector.SessionStorage]: sessionStorageDetector,\n    [LanguageDetector.Navigator]: navigatorDetector,\n    [LanguageDetector.HtmlTag]: htmlTagDetector,\n  };\n\n  // Use the provided order to run each detector\n  order.forEach((detectorName) => {\n    detectors[detectorName]?.();\n  });\n\n  return detected;\n};\n\nconst getFirstAvailableLocale = (\n  locales: Record<LanguageDetector, Locales | Locales[]>,\n  order: LanguageDetector[]\n): Locales => {\n  const { internationalization } = configuration;\n\n  for (const detector of order) {\n    const localesArray = [locales[detector]].flat();\n\n    for (const locale of localesArray) {\n      if (\n        locale &&\n        (internationalization?.locales ?? localeList).includes(locale)\n      ) {\n        return locale;\n      } else if (\n        locale?.includes('-') &&\n        (internationalization?.locales ?? localeList).includes(\n          locale.split('-')[0] as Locales\n        )\n      ) {\n        return locale.split('-')[0] as Locales;\n      }\n    }\n  }\n\n  return internationalization?.defaultLocale ?? Locales.ENGLISH;\n};\n\n/**\n * Core language detector function\n * const detectedLanguages = detectLanguage(['LanguageDetector.Cookie', 'LanguageDetector.LocalStorage'], { lookupCookie: 'myCookie' });\n */\nexport const getBrowserLocale = (\n  userOptions: LanguageDetectorOptions | undefined = {}\n): Locales => {\n  const options = { ...getDefaultsOptions(), ...userOptions };\n\n  const locales = detectLanguage(options.order ?? [], options);\n\n  return getFirstAvailableLocale(locales, options.order ?? []);\n};\n"],"mappings":"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","names":["LanguageDetector"]}