{"version":3,"file":"browser.mjs","sources":["../src/TransProvider.tsx","../src/utils/decodeHtmlEntities.ts","../src/utils/has-interpolation.ts","../src/utils/replace-elements.ts","../src/utils/translate-with-interpolation.ts","../src/utils/translate-jsx.ts","../src/Trans.tsx"],"sourcesContent":["import i18next, { type InitOptions, type TFunction, type i18n } from '@nerimity/i18lite';\r\nimport { createContext, createSignal, useContext, type ParentComponent } from 'solid-js';\r\n\r\nexport type TransProviderActions = {\r\n  addResources(lng: string, ns: string, resources: any): i18n;\r\n  changeLanguage(lng: string): Promise<void>;\r\n  getI18next(): i18n;\r\n};\r\n\r\nconst TransContext = createContext<[TFunction, TransProviderActions]>();\r\n\r\nfunction createTransContext(instance: i18n, options: InitOptions): [TFunction, TransProviderActions] {\r\n  const [language, setLanguage] = createSignal(null);\r\n\r\n  instance.init(options, () => setLanguage(() => instance.language));\r\n\r\n  async function changeLanguage(lng: string) {\r\n    await instance.changeLanguage(lng);\r\n    setLanguage(() => lng);\r\n  }\r\n\r\n  function addResources(\r\n    lng: string,\r\n    ns: string,\r\n    resources: any,\r\n    bundleOptions: { deep?: boolean; overwrite?: boolean } = {},\r\n  ): i18n {\r\n    return instance.addResourceBundle(lng, ns, resources, bundleOptions.deep, bundleOptions.overwrite);\r\n  }\r\n\r\n  const t = (...args: Parameters<TFunction>) => {\r\n    // Access the signal to track it - this ensures components re-render when language changes\r\n    language();\r\n    return instance.t(...args);\r\n  };\r\n\r\n  return [\r\n    t,\r\n    {\r\n      addResources,\r\n      getI18next: () => instance,\r\n      changeLanguage,\r\n    },\r\n  ];\r\n}\r\n\r\nexport const useTransContext = () => useContext(TransContext);\r\n\r\nexport const TransProvider: ParentComponent<{ instance?: i18n; lng?: string; options?: InitOptions }> = (props) => {\r\n  return (\r\n    <TransContext.Provider\r\n      value={createTransContext(props.instance || i18next, { lng: props.lng, ...props.options })}\r\n      children={props.children}\r\n    />\r\n  );\r\n};\r\n","const tempElement = document.createElement('textarea');\r\nexport function decodeHtmlEntities(encodedText: string) {\r\n  tempElement.innerHTML = encodedText || '';\r\n\r\n  return tempElement.value;\r\n}\r\n","import type { InterpolationOptions } from '@nerimity/i18lite';\r\n\r\nexport const hasInterpolation = (value: string, { prefix, suffix }: InterpolationOptions) =>\r\n  value.includes(prefix) && value.includes(suffix);\r\n","import type { InitOptions } from '@nerimity/i18lite';\r\nimport type { IDom } from 'html-parse-string';\r\nimport { decodeHtmlEntities } from './decodeHtmlEntities';\r\nimport { hasInterpolation } from './has-interpolation';\r\n\r\nexport const replaceElements =\r\n  (ast: IDom, { interpolation }: InitOptions) =>\r\n  (child: Node, index: number) => {\r\n    if (typeof child === 'string') {\r\n      if (hasInterpolation(child, interpolation)) return decodeHtmlEntities(ast.children[index].children?.[0].content);\r\n\r\n      return decodeHtmlEntities(ast.children[index].content);\r\n    }\r\n\r\n    child.textContent = decodeHtmlEntities(ast.children[index].children?.[0].content);\r\n\r\n    return child;\r\n  };\r\n","import type { InitOptions, TFunction } from '@nerimity/i18lite';\r\nimport type { TransProps } from '../Trans';\r\nimport { decodeHtmlEntities } from './decodeHtmlEntities';\r\nimport { hasInterpolation } from './has-interpolation';\r\n\r\nconst isNode = !globalThis.window;\r\n\r\nexport const translateWithInterpolation = (t: TFunction, options: InitOptions, props: TransProps) => (item) => {\r\n  const type = typeof item;\r\n\r\n  if (type === 'string' && hasInterpolation(item, options.interpolation)) {\r\n    return decodeHtmlEntities(t(item, props.options));\r\n  }\r\n\r\n  if (type === 'object') {\r\n    const textContent = item.textContent ?? item.t;\r\n    if (textContent && hasInterpolation(textContent, options.interpolation)) {\r\n      item[isNode ? 't' : 'textContent'] = t(textContent, props.options);\r\n    }\r\n  }\r\n\r\n  return item;\r\n};\r\n","import type { TFunction, i18n } from '@nerimity/i18lite';\r\nimport type { parse, stringify } from 'html-parse-string';\r\nimport type { ParentProps } from 'solid-js';\r\nimport type { TransProps } from '../Trans';\r\nimport { replaceElements } from './replace-elements';\r\nimport { translateWithInterpolation } from './translate-with-interpolation';\r\n\r\nexport let parseHTML: typeof parse;\r\nexport let stringifyHtml: typeof stringify;\r\n(async () => {\r\n  try {\r\n    // @ts-ignore\r\n    const module = await import('html-parse-string');\r\n    parseHTML = module.parse;\r\n    stringifyHtml = module.stringify;\r\n  } catch {}\r\n})();\r\n\r\nexport const htmlParseStringNotFoundError = () => {\r\n  console.error(\r\n    'In order to use JSX nesting, install %chtml-parse-string',\r\n    'font-weight: 700',\r\n    'https://github.com/ryansolid/html-parse-string.'\r\n  );\r\n};\r\nexport const translateJSX = (\r\n  { i18n: { options }, t, props }: { t: TFunction; props: ParentProps<TransProps>; i18n: i18n },\r\n  children: Node[]\r\n) => {\r\n  const translation = t(props.key, props.options);\r\n\r\n  if (!props.children) return translation;\r\n\r\n  if (translation === props.key) return children.map(translateWithInterpolation(t, options, props));\r\n\r\n  if (!parseHTML) {\r\n    htmlParseStringNotFoundError();\r\n    return;\r\n  }\r\n  try {\r\n    const [ast] = parseHTML(`<0>${translation}</0>`);\r\n    return children.map(replaceElements(ast, options));\r\n  } catch (e) {\r\n    console.error(e);\r\n  }\r\n};\r\n","import type { TFunction, TOptions } from '@nerimity/i18lite';\r\nimport { stringify } from 'html-parse-string';\r\nimport { children, type JSXElement, type ParentComponent, type ParentProps } from 'solid-js';\r\nimport { Dynamic } from 'solid-js/web';\r\nimport { useTransContext } from './TransProvider';\r\nimport { htmlParseStringNotFoundError, parseHTML, translateJSX } from './utils/translate-jsx';\r\n\r\nexport type TransProps = {\r\n  key: string;\r\n  options?: TOptions;\r\n  components?: Record<string, JSXElement | ((props: any) => JSXElement)>;\r\n};\r\n\r\nexport const Trans: ParentComponent<TransProps> = (props) => {\r\n  const [t, { getI18next }] = useTransContext();\r\n\r\n  return (\r\n    <>\r\n      {props.components\r\n        ? renderInterpolatedTranslation({ t, props })\r\n        : typeof props.children === 'string'\r\n        ? t(props.key, props.children, props.options)\r\n        : translateJSX({ i18n: getI18next(), t, props }, children(() => props.children)() as Node[])}\r\n    </>\r\n  );\r\n};\r\n\r\nconst renderInterpolatedTranslation = ({ t, props }: { t: TFunction; props: ParentProps<TransProps> }) => {\r\n  const translatedString = t(props.key, props.options);\r\n\r\n  if (!parseHTML) {\r\n    htmlParseStringNotFoundError();\r\n    return;\r\n  }\r\n\r\n  const [ast] = parseHTML(`<0>${translatedString}</0>`);\r\n\r\n  return ast.children.map((node) => {\r\n    if (node.type === 'text') {\r\n      return node.content;\r\n    }\r\n\r\n    const componentKey = node.name;\r\n    const mappedComponent = props.components?.[componentKey];\r\n\r\n    if (!mappedComponent) {\r\n      return node.content;\r\n    }\r\n\r\n    if (typeof mappedComponent === 'function') {\r\n      return <Dynamic component={mappedComponent} children={stringify(node.children)} />;\r\n    }\r\n\r\n    return mappedComponent;\r\n  });\r\n};\r\n"],"names":["TransContext","createContext","createTransContext","instance","options","language","setLanguage","createSignal","init","changeLanguage","lng","addResources","ns","resources","bundleOptions","addResourceBundle","deep","overwrite","t","args","getI18next","useTransContext","useContext","TransProvider","props","_$createComponent","Provider","value","i18next","children","tempElement","decodeHtmlEntities","encodedText","hasInterpolation","prefix","suffix","replaceElements","ast","interpolation","child","index","isNode","translateWithInterpolation","item","type","textContent","parseHTML","stringifyHtml","module","htmlParseStringNotFoundError","translateJSX","translation","e","Trans","_$memo","components","renderInterpolatedTranslation","key","i18n","translatedString","map","node","content","componentKey","name","mappedComponent","Dynamic","component","stringify"],"mappings":"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"}