UNPKG

val-i18n-react

Version:
62 lines (59 loc) 1.8 kB
import { createContext, createElement, useContext, useMemo, Fragment, isValidElement } from 'react'; import { useVal } from 'use-value-enhancer'; // src/hooks.ts var I18nContext = /* @__PURE__ */ createContext(null); var I18nProvider = ({ i18n, children }) => createElement(I18nContext.Provider, { value: i18n, children }); // src/hooks.ts var useI18n = () => { const i18n = useContext(I18nContext); if (!i18n) { throw new Error("I18nContext not found"); } return i18n; }; var useTranslate = () => useVal(useI18n().t$); var useLang = () => useVal(useI18n().lang$); var Trans = ({ message, children }) => { if (!message) return null; const slices = useMemo(() => { const slices2 = []; const matchArgs = /{{(\S+?)}}/gi; let slice; let pointer = 0; while (slice = matchArgs.exec(message)) { slices2.push(message.slice(pointer, slice.index), slice[1]); pointer = slice.index + slice[0].length; } slices2.push(message.slice(pointer)); return slices2; }, [message]); if (slices.length === 1) return createElement(Fragment, null, message); const slots = {}; let hasSlot = false; for (const child of Array.isArray(children) ? children : [children]) { if (isValidElement(child)) { const key = child.props["data-t-slot"]; if (key) { slots[key] = child; hasSlot = true; } } } const copy = slices.slice(); if (hasSlot) { for (let i = 1; i < copy.length; i += 2) { copy[i] = slots[slices[i]] || `{{${slices[i]}}}`; } } else { copy[1] = children || `{{${slices[1]}}}`; } return createElement(Fragment, null, copy); }; export { I18nContext, I18nProvider, Trans, useI18n, useLang, useTranslate }; //# sourceMappingURL=out.js.map //# sourceMappingURL=main.mjs.map