val-i18n-react
Version:
React goodies for val-i18n
62 lines (59 loc) • 1.8 kB
JavaScript
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