val-i18n-react
Version:
React goodies for val-i18n
69 lines (65 loc) • 1.95 kB
JavaScript
;
var react = require('react');
var useValueEnhancer = require('use-value-enhancer');
// src/hooks.ts
var I18nContext = /* @__PURE__ */ react.createContext(null);
var I18nProvider = ({
i18n,
children
}) => react.createElement(I18nContext.Provider, { value: i18n, children });
// src/hooks.ts
var useI18n = () => {
const i18n = react.useContext(I18nContext);
if (!i18n) {
throw new Error("I18nContext not found");
}
return i18n;
};
var useTranslate = () => useValueEnhancer.useVal(useI18n().t$);
var useLang = () => useValueEnhancer.useVal(useI18n().lang$);
var Trans = ({ message, children }) => {
if (!message)
return null;
const slices = react.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 react.createElement(react.Fragment, null, message);
const slots = {};
let hasSlot = false;
for (const child of Array.isArray(children) ? children : [children]) {
if (react.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 react.createElement(react.Fragment, null, copy);
};
exports.I18nContext = I18nContext;
exports.I18nProvider = I18nProvider;
exports.Trans = Trans;
exports.useI18n = useI18n;
exports.useLang = useLang;
exports.useTranslate = useTranslate;
//# sourceMappingURL=out.js.map
//# sourceMappingURL=main.js.map