{"version":3,"file":"i18n.cjs","sources":["../../src/i18n.tsx"],"sourcesContent":["import i18n, { type InitOptions, type ReactOptions, type TFunction as I18NextTFunction } from 'i18next';\nimport LanguageDetector, { type DetectorOptions } from 'i18next-browser-languagedetector';\nimport React from 'react';\n// eslint-disable-next-line no-restricted-imports\nimport { initReactI18next, setDefaults, setI18n, Trans as I18NextTrans, getI18n } from 'react-i18next';\n\nimport { DEFAULT_LANGUAGE, PSEUDO_LOCALE } from './constants';\nimport { LANGUAGES } from './languages';\nimport { type ResourceLoader, type Resources, type TFunction, type TransProps, type TransType } from './types';\n\nlet tFunc: I18NextTFunction<string[], undefined> | undefined;\nlet transComponent: TransType;\n\nconst VALID_LANGUAGES = [\n  ...LANGUAGES,\n  {\n    name: 'Pseudo',\n    code: PSEUDO_LOCALE,\n  },\n];\n\nfunction initTFuncAndTransComponent({ id, ns }: { id?: string; ns?: string[] } = {}) {\n  if (id) {\n    tFunc = getI18nInstance().getFixedT(null, id);\n    transComponent = (props: TransProps) => <I18NextTrans shouldUnescape ns={id} {...props} />;\n    return;\n  }\n\n  tFunc = getI18nInstance().t;\n  transComponent = (props: TransProps) => <I18NextTrans shouldUnescape ns={ns} {...props} />;\n}\n\nexport async function loadNamespacedResources(namespace: string, language: string, loaders?: ResourceLoader[]) {\n  if (!loaders?.length) {\n    return;\n  }\n\n  const resolvedLanguage = language === PSEUDO_LOCALE ? DEFAULT_LANGUAGE : language;\n\n  // Don't load resources for the default language as they are already embedded in the source code.\n  // Pseudo-locale still needs the default-language resources loaded for post-processing.\n  if (language === DEFAULT_LANGUAGE) {\n    return;\n  }\n\n  return Promise.all(\n    loaders.map(async (loader) => {\n      try {\n        const resources = await loader(resolvedLanguage);\n        addResourceBundle(resolvedLanguage, namespace, resources);\n      } catch (error) {\n        console.error(`Error loading resources for namespace ${namespace} and language: ${resolvedLanguage}`, error);\n      }\n    })\n  );\n}\n\n// exported for testing\nexport function initDefaultI18nInstance() {\n  // If the resources are not an object, we need to initialize the plugin translations\n  if (getI18nInstance().options?.resources && typeof getI18nInstance().options.resources === 'object') {\n    return;\n  }\n\n  const initPromise = getI18nInstance().use(initReactI18next).init({\n    resources: {},\n    returnEmptyString: false,\n    lng: DEFAULT_LANGUAGE, // this should be the locale of the phrases in our source JSX\n  });\n  initTFuncAndTransComponent();\n  return initPromise;\n}\n\n// exported for testing\nexport function initDefaultReactI18nInstance() {\n  // If the initReactI18next is not set, we need to set them\n  if (getI18n()?.options?.react) {\n    return;\n  }\n\n  const options: ReactOptions = {};\n  setDefaults(options);\n  setI18n(getI18nInstance());\n}\n\nexport async function initPluginTranslations(id: string, loaders?: ResourceLoader[]) {\n  await initDefaultI18nInstance();\n  initDefaultReactI18nInstance();\n\n  const language = getResolvedLanguage();\n  initTFuncAndTransComponent({ id });\n\n  await loadNamespacedResources(id, language, loaders);\n\n  return { language };\n}\n\nexport function getI18nInstance(): typeof i18n {\n  // in Grafana versions < 12.1.0 the i18n instance is exposed through the default export\n  // used by plugins that support translations from Grafana >= 11.0.0\n  const instance: typeof i18n & { default?: typeof i18n } = i18n;\n  if (instance && instance.default) {\n    return instance.default;\n  }\n\n  return instance;\n}\n\ninterface Module {\n  type: 'backend';\n}\n\ninterface InitializeI18nOptions {\n  ns?: string[];\n  language?: string;\n  module?: Module;\n}\n\nasync function initTranslations({\n  ns,\n  language = DEFAULT_LANGUAGE,\n  module,\n}: InitializeI18nOptions): Promise<{ language: string | undefined }> {\n  const options: InitOptions = {\n    // We don't bundle any translations, we load them async\n    partialBundledLanguages: true,\n    resources: {},\n\n    // If translations are empty strings (no translation), fall back to the default value in source code\n    returnEmptyString: false,\n\n    // Required to ensure that `resolvedLanguage` is set property when an invalid language is passed (such as through 'detect')\n    supportedLngs: VALID_LANGUAGES.map((lang) => lang.code),\n    fallbackLng: DEFAULT_LANGUAGE,\n\n    ns,\n    postProcess: [\n      // Add pseudo processing even if we aren't necessarily going to use it\n      PSEUDO_LOCALE,\n    ],\n  };\n\n  if (language === 'detect') {\n    getI18nInstance().use(LanguageDetector);\n    const detection: DetectorOptions = { order: ['navigator'], caches: [] };\n    options.detection = detection;\n  } else {\n    options.lng = VALID_LANGUAGES.find((lang) => lang.code === language)?.code ?? undefined;\n  }\n\n  if (module) {\n    getI18nInstance().use(module).use(initReactI18next); // passes i18n down to react-i18next\n  } else {\n    getI18nInstance().use(initReactI18next); // passes i18n down to react-i18next\n  }\n\n  if (language === PSEUDO_LOCALE) {\n    const { default: Pseudo } = await import('i18next-pseudo');\n    getI18nInstance().use(\n      new Pseudo({\n        languageToPseudo: PSEUDO_LOCALE,\n        enabled: true,\n        wrapped: true,\n      })\n    );\n  }\n\n  await getI18nInstance().init(options);\n\n  initTFuncAndTransComponent({ ns });\n\n  return {\n    language: getResolvedLanguage(),\n  };\n}\n\nexport function getLanguage() {\n  return getI18nInstance()?.language || DEFAULT_LANGUAGE;\n}\n\nexport function getResolvedLanguage() {\n  return getI18nInstance()?.resolvedLanguage || DEFAULT_LANGUAGE;\n}\nexport async function changeLanguage(language?: string) {\n  const validLanguage = VALID_LANGUAGES.find((lang) => lang.code === language)?.code ?? DEFAULT_LANGUAGE;\n  await getI18nInstance().changeLanguage(validLanguage);\n}\n\nexport async function initializeI18n({\n  language,\n  ns,\n  module,\n}: InitializeI18nOptions): Promise<{ language: string | undefined }> {\n  return initTranslations({ language, ns, module });\n}\n\nexport function addResourceBundle(language: string, namespace: string, resources: Resources) {\n  getI18nInstance().addResourceBundle(language, namespace, resources, true, false);\n}\n\nexport const t: TFunction = (id: string, defaultMessage: string, values?: Record<string, unknown>) => {\n  initDefaultI18nInstance();\n  if (!tFunc) {\n    if (process.env.NODE_ENV !== 'test') {\n      console.warn(\n        't() was called before i18n was initialized. This is probably caused by calling t() in the root module scope, instead of lazily on render'\n      );\n    }\n\n    if (process.env.NODE_ENV === 'development') {\n      throw new Error('t() was called before i18n was initialized');\n    }\n\n    tFunc = getI18nInstance().t;\n  }\n\n  return tFunc(id, defaultMessage, values);\n};\n\nexport function Trans(props: TransProps): React.ReactElement {\n  initDefaultI18nInstance();\n  const Component = transComponent ?? I18NextTrans;\n  return <Component shouldUnescape {...props} />;\n}\n"],"names":["LANGUAGES","PSEUDO_LOCALE","React","I18NextTrans","DEFAULT_LANGUAGE","initReactI18next","getI18n","setDefaults","setI18n","i18n","LanguageDetector"],"mappings":";;;;;;;;;;;;;;;;;;AAUA,IAAI,KAAA;AACJ,IAAI,cAAA;AAEJ,MAAM,eAAA,GAAkB;AAAA,EACtB,GAAGA,mBAAA;AAAA,EACH;AAAA,IACE,IAAA,EAAM,QAAA;AAAA,IACN,IAAA,EAAMC;AAAA;AAEV,CAAA;AAEA,SAAS,2BAA2B,EAAE,EAAA,EAAI,EAAA,EAAG,GAAoC,EAAC,EAAG;AACnF,EAAA,IAAI,EAAA,EAAI;AACN,IAAA,KAAA,GAAQ,eAAA,EAAgB,CAAE,SAAA,CAAU,IAAA,EAAM,EAAE,CAAA;AAC5C,IAAA,cAAA,GAAiB,CAAC,0BAAsBC,sBAAA,CAAA,aAAA,CAACC,kBAAA,EAAA,EAAa,gBAAc,IAAA,EAAC,EAAA,EAAI,EAAA,EAAK,GAAG,KAAA,EAAO,CAAA;AACxF,IAAA;AAAA,EACF;AAEA,EAAA,KAAA,GAAQ,iBAAgB,CAAE,CAAA;AAC1B,EAAA,cAAA,GAAiB,CAAC,0BAAsBD,sBAAA,CAAA,aAAA,CAACC,kBAAA,EAAA,EAAa,gBAAc,IAAA,EAAC,EAAA,EAAS,GAAG,KAAA,EAAO,CAAA;AAC1F;AAEA,eAAsB,uBAAA,CAAwB,SAAA,EAAmB,QAAA,EAAkB,OAAA,EAA4B;AAC7G,EAAA,IAAI,EAAC,mCAAS,MAAA,CAAA,EAAQ;AACpB,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,gBAAA,GAAmB,QAAA,KAAaF,uBAAA,GAAgBG,0BAAA,GAAmB,QAAA;AAIzE,EAAA,IAAI,aAAaA,0BAAA,EAAkB;AACjC,IAAA;AAAA,EACF;AAEA,EAAA,OAAO,OAAA,CAAQ,GAAA;AAAA,IACb,OAAA,CAAQ,GAAA,CAAI,OAAO,MAAA,KAAW;AAC5B,MAAA,IAAI;AACF,QAAA,MAAM,SAAA,GAAY,MAAM,MAAA,CAAO,gBAAgB,CAAA;AAC/C,QAAA,iBAAA,CAAkB,gBAAA,EAAkB,WAAW,SAAS,CAAA;AAAA,MAC1D,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,MAAM,CAAA,sCAAA,EAAyC,SAAS,CAAA,eAAA,EAAkB,gBAAgB,IAAI,KAAK,CAAA;AAAA,MAC7G;AAAA,IACF,CAAC;AAAA,GACH;AACF;AAGO,SAAS,uBAAA,GAA0B;AA1D1C,EAAA,IAAA,EAAA;AA4DE,EAAA,IAAA,CAAA,CAAI,EAAA,GAAA,eAAA,EAAgB,CAAE,OAAA,KAAlB,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAA2B,SAAA,KAAa,OAAO,eAAA,EAAgB,CAAE,OAAA,CAAQ,SAAA,KAAc,QAAA,EAAU;AACnG,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,cAAc,eAAA,EAAgB,CAAE,GAAA,CAAIC,6BAAgB,EAAE,IAAA,CAAK;AAAA,IAC/D,WAAW,EAAC;AAAA,IACZ,iBAAA,EAAmB,KAAA;AAAA,IACnB,GAAA,EAAKD;AAAA;AAAA,GACN,CAAA;AACD,EAAA,0BAAA,EAA2B;AAC3B,EAAA,OAAO,WAAA;AACT;AAGO,SAAS,4BAAA,GAA+B;AA1E/C,EAAA,IAAA,EAAA,EAAA,EAAA;AA4EE,EAAA,IAAA,CAAI,EAAA,GAAA,CAAA,EAAA,GAAAE,oBAAA,EAAQ,KAAR,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAW,OAAA,KAAX,mBAAoB,KAAA,EAAO;AAC7B,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,UAAwB,EAAC;AAC/B,EAAAC,wBAAA,CAAY,OAAO,CAAA;AACnB,EAAAC,oBAAA,CAAQ,iBAAiB,CAAA;AAC3B;AAEA,eAAsB,sBAAA,CAAuB,IAAY,OAAA,EAA4B;AACnF,EAAA,MAAM,uBAAA,EAAwB;AAC9B,EAAA,4BAAA,EAA6B;AAE7B,EAAA,MAAM,WAAW,mBAAA,EAAoB;AACrC,EAAA,0BAAA,CAA2B,EAAE,IAAI,CAAA;AAEjC,EAAA,MAAM,uBAAA,CAAwB,EAAA,EAAI,QAAA,EAAU,OAAO,CAAA;AAEnD,EAAA,OAAO,EAAE,QAAA,EAAS;AACpB;AAEO,SAAS,eAAA,GAA+B;AAG7C,EAAA,MAAM,QAAA,GAAoDC,qBAAA;AAC1D,EAAA,IAAI,QAAA,IAAY,SAAS,OAAA,EAAS;AAChC,IAAA,OAAO,QAAA,CAAS,OAAA;AAAA,EAClB;AAEA,EAAA,OAAO,QAAA;AACT;AAYA,eAAe,gBAAA,CAAiB;AAAA,EAC9B,EAAA;AAAA,EACA,QAAA,GAAWL,0BAAA;AAAA,EACX;AACF,CAAA,EAAqE;AA1HrE,EAAA,IAAA,EAAA,EAAA,EAAA;AA2HE,EAAA,MAAM,OAAA,GAAuB;AAAA;AAAA,IAE3B,uBAAA,EAAyB,IAAA;AAAA,IACzB,WAAW,EAAC;AAAA;AAAA,IAGZ,iBAAA,EAAmB,KAAA;AAAA;AAAA,IAGnB,eAAe,eAAA,CAAgB,GAAA,CAAI,CAAC,IAAA,KAAS,KAAK,IAAI,CAAA;AAAA,IACtD,WAAA,EAAaA,0BAAA;AAAA,IAEb,EAAA;AAAA,IACA,WAAA,EAAa;AAAA;AAAA,MAEXH;AAAA;AACF,GACF;AAEA,EAAA,IAAI,aAAa,QAAA,EAAU;AACzB,IAAA,eAAA,EAAgB,CAAE,IAAIS,iCAAgB,CAAA;AACtC,IAAA,MAAM,SAAA,GAA6B,EAAE,KAAA,EAAO,CAAC,WAAW,CAAA,EAAG,MAAA,EAAQ,EAAC,EAAE;AACtE,IAAA,OAAA,CAAQ,SAAA,GAAY,SAAA;AAAA,EACtB,CAAA,MAAO;AACL,IAAA,OAAA,CAAQ,GAAA,GAAA,CAAM,EAAA,GAAA,CAAA,EAAA,GAAA,eAAA,CAAgB,IAAA,CAAK,CAAC,IAAA,KAAS,IAAA,CAAK,IAAA,KAAS,QAAQ,CAAA,KAArD,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAwD,IAAA,KAAxD,IAAA,GAAA,EAAA,GAAgE,KAAA,CAAA;AAAA,EAChF;AAEA,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,eAAA,EAAgB,CAAE,GAAA,CAAI,MAAM,CAAA,CAAE,IAAIL,6BAAgB,CAAA;AAAA,EACpD,CAAA,MAAO;AACL,IAAA,eAAA,EAAgB,CAAE,IAAIA,6BAAgB,CAAA;AAAA,EACxC;AAEA,EAAA,IAAI,aAAaJ,uBAAA,EAAe;AAC9B,IAAA,MAAM,EAAE,OAAA,EAAS,MAAA,EAAO,GAAI,MAAM,OAAO,gBAAgB,CAAA;AACzD,IAAA,eAAA,EAAgB,CAAE,GAAA;AAAA,MAChB,IAAI,MAAA,CAAO;AAAA,QACT,gBAAA,EAAkBA,uBAAA;AAAA,QAClB,OAAA,EAAS,IAAA;AAAA,QACT,OAAA,EAAS;AAAA,OACV;AAAA,KACH;AAAA,EACF;AAEA,EAAA,MAAM,eAAA,EAAgB,CAAE,IAAA,CAAK,OAAO,CAAA;AAEpC,EAAA,0BAAA,CAA2B,EAAE,IAAI,CAAA;AAEjC,EAAA,OAAO;AAAA,IACL,UAAU,mBAAA;AAAoB,GAChC;AACF;AAEO,SAAS,WAAA,GAAc;AAhL9B,EAAA,IAAA,EAAA;AAiLE,EAAA,OAAA,CAAA,CAAO,EAAA,GAAA,eAAA,EAAgB,KAAhB,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAmB,QAAA,KAAYG,0BAAA;AACxC;AAEO,SAAS,mBAAA,GAAsB;AApLtC,EAAA,IAAA,EAAA;AAqLE,EAAA,OAAA,CAAA,CAAO,EAAA,GAAA,eAAA,EAAgB,KAAhB,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAmB,gBAAA,KAAoBA,0BAAA;AAChD;AACA,eAAsB,eAAe,QAAA,EAAmB;AAvLxD,EAAA,IAAA,EAAA,EAAA,EAAA;AAwLE,EAAA,MAAM,aAAA,GAAA,CAAgB,EAAA,GAAA,CAAA,EAAA,GAAA,eAAA,CAAgB,IAAA,CAAK,CAAC,IAAA,KAAS,IAAA,CAAK,IAAA,KAAS,QAAQ,CAAA,KAArD,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAwD,IAAA,KAAxD,IAAA,GAAA,EAAA,GAAgEA,0BAAA;AACtF,EAAA,MAAM,eAAA,EAAgB,CAAE,cAAA,CAAe,aAAa,CAAA;AACtD;AAEA,eAAsB,cAAA,CAAe;AAAA,EACnC,QAAA;AAAA,EACA,EAAA;AAAA,EACA;AACF,CAAA,EAAqE;AACnE,EAAA,OAAO,gBAAA,CAAiB,EAAE,QAAA,EAAU,EAAA,EAAI,QAAQ,CAAA;AAClD;AAEO,SAAS,iBAAA,CAAkB,QAAA,EAAkB,SAAA,EAAmB,SAAA,EAAsB;AAC3F,EAAA,eAAA,GAAkB,iBAAA,CAAkB,QAAA,EAAU,SAAA,EAAW,SAAA,EAAW,MAAM,KAAK,CAAA;AACjF;AAEO,MAAM,CAAA,GAAe,CAAC,EAAA,EAAY,cAAA,EAAwB,MAAA,KAAqC;AACpG,EAAA,uBAAA,EAAwB;AACxB,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,QAAA,KAAa,MAAA,EAAQ;AACnC,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN;AAAA,OACF;AAAA,IACF;AAEA,IAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,QAAA,KAAa,aAAA,EAAe;AAC1C,MAAA,MAAM,IAAI,MAAM,4CAA4C,CAAA;AAAA,IAC9D;AAEA,IAAA,KAAA,GAAQ,iBAAgB,CAAE,CAAA;AAAA,EAC5B;AAEA,EAAA,OAAO,KAAA,CAAM,EAAA,EAAI,cAAA,EAAgB,MAAM,CAAA;AACzC;AAEO,SAAS,MAAM,KAAA,EAAuC;AAC3D,EAAA,uBAAA,EAAwB;AACxB,EAAA,MAAM,YAAY,cAAA,IAAA,IAAA,GAAA,cAAA,GAAkBD,kBAAA;AACpC,EAAA,uBAAOD,sBAAA,CAAA,aAAA,CAAC,SAAA,EAAA,EAAU,cAAA,EAAc,IAAA,EAAE,GAAG,KAAA,EAAO,CAAA;AAC9C;;;;;;;;;;;;;;;"}