{"version":3,"file":"i18n.es.mjs","names":[],"sources":["../src/i18n/staffbaseLocales.ts","../src/i18n/defaultLocaleForLanguage.ts","../src/i18n/isSupportedLocale.ts","../src/i18n/normalizeLanguageCode.ts","../src/i18n/getBrowserLanguage.ts","../src/i18n/resolveSupportedLanguage.ts"],"sourcesContent":["/**\n * Canonical map of every Staffbase-supported content locale code to its\n * human-readable language name.\n *\n * Sourced verbatim from the platform reference\n * (https://developers.staffbase.com/references/languages-and-locale-codes/).\n * This is the single source of truth for localization across every widget:\n * adding a locale here makes it resolvable everywhere at once. Order is\n * significant - `defaultLocaleForLanguage` derives the default region for a\n * bare two-letter code from the first matching entry, so keep the most common\n * region first for languages that have several (e.g. `pt_BR` before `pt_PT`).\n */\nexport const STAFFBASE_LOCALES = {\n  af_ZA: 'Afrikaans',\n  sq_AL: 'Albanian',\n  am_ET: 'Amharic',\n  ar_AE: 'Arabic (United Arab Emirates)',\n  ar_EG: 'Arabic (Egypt)',\n  ar_SA: 'Arabic (Saudi Arabia)',\n  eu_ES: 'Basque (Spain)',\n  bn_BD: 'Bengali',\n  my_MM: 'Burmese',\n  bs_BA: 'Bosnian',\n  bg_BG: 'Bulgarian',\n  zh_CN: 'Chinese (simplified)',\n  zh_HK: 'Chinese (traditional)',\n  hr_HR: 'Croatian',\n  cs_CZ: 'Czech',\n  da_DK: 'Danish',\n  nl_NL: 'Dutch',\n  en_US: 'English',\n  et_EE: 'Estonian',\n  nl_BE: 'Flemish',\n  tl_PH: 'Filipino (Tagalog)',\n  fi_FI: 'Finnish',\n  fr_FR: 'French (France)',\n  fr_CA: 'French (Canada)',\n  ka_GE: 'Georgian',\n  de_DE: 'German',\n  el_GR: 'Greek',\n  kl_GL: 'Greenlandic',\n  gu_IN: 'Gujarati',\n  he_IL: 'Hebrew',\n  hi_IN: 'Hindi',\n  hu_HU: 'Hungarian',\n  is_IS: 'Icelandic',\n  id_ID: 'Indonesian (Bahasa Indonesia)',\n  it_IT: 'Italian',\n  ga_IE: 'Irish',\n  ja_JP: 'Japanese',\n  kn_IN: 'Kannada',\n  rw_RW: 'Kinyarwanda',\n  km_KH: 'Khmer',\n  ko_KR: 'Korean',\n  lo_LA: 'Lao',\n  lv_LV: 'Latvian',\n  lt_LT: 'Lithuanian',\n  mk_MK: 'Macedonian',\n  mg_MG: 'Malagasy',\n  ms_MY: 'Malay',\n  ml_IN: 'Malayalam',\n  mr_IN: 'Marathi',\n  mi_NZ: 'Māori',\n  mn_MN: 'Mongolian',\n  ne_NP: 'Nepali',\n  no_NO: 'Norwegian',\n  ps_AF: 'Pashto / Pushtu',\n  fa_AF: 'Persian (Dari)',\n  fa_IR: 'Persian (Farsi)',\n  pa_IN: 'Punjabi',\n  pl_PL: 'Polish',\n  pt_BR: 'Portuguese (Brazilian)',\n  pt_PT: 'Portuguese (European)',\n  ro_RO: 'Romanian',\n  ru_RU: 'Russian',\n  sr_RS: 'Serbian',\n  si_LK: 'Sinhala',\n  sk_SK: 'Slovak',\n  sl_SI: 'Slovenian',\n  so_SO: 'Somali',\n  es_ES: 'Spanish (Spain)',\n  es_MX: 'Spanish (Mexico)',\n  sw_TZ: 'Swahili',\n  sv_SE: 'Swedish',\n  ta_IN: 'Tamil',\n  te_IN: 'Telugu',\n  th_TH: 'Thai',\n  ti_ER: 'Tigrinya',\n  tr_TR: 'Turkish',\n  uk_UA: 'Ukrainian',\n  ur_PK: 'Urdu',\n  uz_UZ: 'Uzbek',\n  vi_VN: 'Vietnamese',\n  cy_GB: 'Welsh',\n  zu_ZA: 'Zulu',\n} as const\n","import type { StaffbaseLocale } from '../types/i18n/StaffbaseLocale'\nimport { STAFFBASE_LOCALES } from './staffbaseLocales'\n\n/**\n * Resolves a bare two-letter language code (e.g. `'pt'`) to the default\n * Staffbase locale for that language (e.g. `'pt_BR'`).\n *\n * \"Default\" means the first matching entry in `STAFFBASE_LOCALES`, so the\n * preferred region for multi-region languages is controlled purely by that\n * map's ordering. Returns null when no supported locale uses the language.\n * @param {string} language - A two-letter language code (case-insensitive).\n * @returns {StaffbaseLocale | null} The default locale, or null when unsupported.\n */\nexport const defaultLocaleForLanguage = (\n  language: string,\n): StaffbaseLocale | null => {\n  const prefix = `${language.toLowerCase()}_`\n  const match = Object.keys(STAFFBASE_LOCALES).find((locale) =>\n    locale.startsWith(prefix),\n  )\n\n  return (match as StaffbaseLocale | undefined) ?? null\n}\n","import type { StaffbaseLocale } from '../types/i18n/StaffbaseLocale'\nimport { STAFFBASE_LOCALES } from './staffbaseLocales'\n\n/**\n * Type guard: narrows an arbitrary string to a `StaffbaseLocale` when it is one\n * of the canonical, exactly-cased locale codes (e.g. `'en_US'`). Does not\n * normalize - pass values through `normalizeLanguageCode` first if they may use\n * a different separator or casing.\n * @param {string | null | undefined} value - The value to test.\n * @returns {value is StaffbaseLocale} True when `value` is a supported locale code.\n */\nexport const isSupportedLocale = (\n  value: string | null | undefined,\n): value is StaffbaseLocale =>\n  typeof value === 'string' &&\n  Object.prototype.hasOwnProperty.call(STAFFBASE_LOCALES, value)\n","import type { StaffbaseLocale } from '../types/i18n/StaffbaseLocale'\nimport { defaultLocaleForLanguage } from './defaultLocaleForLanguage'\nimport { isSupportedLocale } from './isSupportedLocale'\n\n/**\n * Normalizes an arbitrary language tag to a canonical Staffbase locale code.\n *\n * Accepts the loose forms widgets receive in practice - BCP-47 (`en-US`),\n * snake_case (`en_US`), wrong casing (`EN_us`), or a bare language (`en`) - and\n * returns the exactly-cased supported locale (`en_US`). A full tag with an\n * unsupported region falls back to the language's default region\n * (`es_AR` -> `es_ES`). Returns null when the language is not supported at all.\n * @param {string | null | undefined} input - The language tag to normalize.\n * @returns {StaffbaseLocale | null} The canonical locale, or null when unsupported.\n */\nexport const normalizeLanguageCode = (\n  input: string | null | undefined,\n): StaffbaseLocale | null => {\n  if (!input) return null\n\n  const [rawLanguage, rawRegion] = input.trim().replace(/-/g, '_').split('_')\n  if (!rawLanguage) return null\n\n  const language = rawLanguage.toLowerCase()\n\n  if (rawRegion) {\n    const candidate = `${language}_${rawRegion.toUpperCase()}`\n    if (isSupportedLocale(candidate)) return candidate\n  }\n\n  return defaultLocaleForLanguage(language)\n}\n","import type { StaffbaseLocale } from '../types/i18n/StaffbaseLocale'\nimport { normalizeLanguageCode } from './normalizeLanguageCode'\n\n/**\n * Reads the browser's preferred language and normalizes it to a supported\n * Staffbase locale.\n *\n * Walks `navigator.languages` (most preferred first), falling back to\n * `navigator.language`, and returns the first entry that maps to a supported\n * locale. Returns null when there is no navigator or none of the preferences\n * are supported, so callers can fall back to their injected default.\n * @returns {StaffbaseLocale | null} The preferred supported locale, or null.\n */\nexport const getBrowserLanguage = (): StaffbaseLocale | null => {\n  if (typeof navigator === 'undefined') return null\n\n  const candidates =\n    navigator.languages && navigator.languages.length > 0\n      ? navigator.languages\n      : [navigator.language]\n\n  for (const candidate of candidates) {\n    const normalized = normalizeLanguageCode(candidate)\n    if (normalized) return normalized\n  }\n\n  return null\n}\n","import type { ResolveSupportedLanguageOptions } from '../types/i18n/ResolveSupportedLanguageOptions'\nimport type { StaffbaseLocale } from '../types/i18n/StaffbaseLocale'\nimport { normalizeLanguageCode } from './normalizeLanguageCode'\n\n/**\n * Picks the best supported locale to render content in.\n *\n * Resolution order: the normalized `requested` locale when it is supported and\n * (if `available` is given) present there; otherwise an available locale that\n * shares the requested language; otherwise `defaultLocale` when available (or\n * when no `available` set was given); otherwise the first available locale.\n * Always returns a supported `StaffbaseLocale` so callers never handle null.\n * @param {ResolveSupportedLanguageOptions} options - Requested/available/default locales.\n * @returns {StaffbaseLocale} The resolved supported locale.\n */\nexport const resolveSupportedLanguage = (\n  options: ResolveSupportedLanguageOptions,\n): StaffbaseLocale => {\n  const { requested, available, defaultLocale } = options\n\n  const requestedLocale = normalizeLanguageCode(requested)\n  const availableLocales = (available ?? [])\n    .map((code) => normalizeLanguageCode(code))\n    .filter((code): code is StaffbaseLocale => code !== null)\n\n  if (availableLocales.length === 0) {\n    return requestedLocale ?? defaultLocale\n  }\n\n  if (requestedLocale) {\n    if (availableLocales.includes(requestedLocale)) return requestedLocale\n\n    const requestedLanguage = requestedLocale.split('_')[0]\n    const sameLanguage = availableLocales.find(\n      (locale) => locale.split('_')[0] === requestedLanguage,\n    )\n    if (sameLanguage) return sameLanguage\n  }\n\n  return availableLocales.includes(defaultLocale)\n    ? defaultLocale\n    : availableLocales[0]\n}\n"],"mappings":";AAYA,IAAa,IAAoB;CAC/B,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;AACT,GClFa,KACX,MAC2B;CAC3B,IAAM,IAAS,GAAG,EAAS,YAAY,EAAE;CAKzC,OAJc,OAAO,KAAK,CAAiB,EAAE,MAAM,MACjD,EAAO,WAAW,CAAM,CAGlB,KAAyC;AACnD,GCXa,KACX,MAEA,OAAO,KAAU,YACjB,OAAO,UAAU,eAAe,KAAK,GAAmB,CAAK,GCAlD,KACX,MAC2B;CAC3B,IAAI,CAAC,GAAO,OAAO;CAEnB,IAAM,CAAC,GAAa,KAAa,EAAM,KAAK,EAAE,QAAQ,MAAM,GAAG,EAAE,MAAM,GAAG;CAC1E,IAAI,CAAC,GAAa,OAAO;CAEzB,IAAM,IAAW,EAAY,YAAY;CAEzC,IAAI,GAAW;EACb,IAAM,IAAY,GAAG,EAAS,GAAG,EAAU,YAAY;EACvD,IAAI,EAAkB,CAAS,GAAG,OAAO;CAC3C;CAEA,OAAO,EAAyB,CAAQ;AAC1C,GClBa,UAAmD;CAC9D,IAAI,OAAO,YAAc,KAAa,OAAO;CAE7C,IAAM,IACJ,UAAU,aAAa,UAAU,UAAU,SAAS,IAChD,UAAU,YACV,CAAC,UAAU,QAAQ;CAEzB,KAAK,IAAM,KAAa,GAAY;EAClC,IAAM,IAAa,EAAsB,CAAS;EAClD,IAAI,GAAY,OAAO;CACzB;CAEA,OAAO;AACT,GCZa,KACX,MACoB;CACpB,IAAM,EAAE,cAAW,cAAW,qBAAkB,GAE1C,IAAkB,EAAsB,CAAS,GACjD,KAAoB,KAAa,CAAC,GACrC,KAAK,MAAS,EAAsB,CAAI,CAAC,EACzC,QAAQ,MAAkC,MAAS,IAAI;CAE1D,IAAI,EAAiB,WAAW,GAC9B,OAAO,KAAmB;CAG5B,IAAI,GAAiB;EACnB,IAAI,EAAiB,SAAS,CAAe,GAAG,OAAO;EAEvD,IAAM,IAAoB,EAAgB,MAAM,GAAG,EAAE,IAC/C,IAAe,EAAiB,MACnC,MAAW,EAAO,MAAM,GAAG,EAAE,OAAO,CACvC;EACA,IAAI,GAAc,OAAO;CAC3B;CAEA,OAAO,EAAiB,SAAS,CAAa,IAC1C,IACA,EAAiB;AACvB"}