@yamada-ui/react
Version:
React UI components of the Yamada, by the Yamada, for the Yamada built with React and Emotion
133 lines (129 loc) • 4.92 kB
JavaScript
"use client";
const require_rolldown_runtime = require('../../_virtual/rolldown_runtime.cjs');
const require_effect = require('../../utils/effect.cjs');
const require_utils_index = require('../../utils/index.cjs');
const require_constant = require('../../core/constant.cjs');
const require_providers_i18n_provider_intl_index = require('./intl/index.cjs');
let react = require("react");
react = require_rolldown_runtime.__toESM(react);
let react_jsx_runtime = require("react/jsx-runtime");
react_jsx_runtime = require_rolldown_runtime.__toESM(react_jsx_runtime);
let intl_messageformat = require("intl-messageformat");
intl_messageformat = require_rolldown_runtime.__toESM(intl_messageformat);
//#region src/providers/i18n-provider/i18n-provider.tsx
const DEFAULT_LANGUAGE = {
dir: require_constant.DEFAULT_DIRECTION,
locale: require_constant.DEFAULT_LOCALE
};
const LOCALES = Object.keys(require_providers_i18n_provider_intl_index.default);
function getLanguage(locale, dir) {
locale ??= (0, require_utils_index.utils_exports.createdDom)() ? navigator.language : require_constant.DEFAULT_LOCALE;
try {
Intl.DateTimeFormat.supportedLocalesOf([locale]);
} catch (_err) {
locale = require_constant.DEFAULT_LOCALE;
}
dir ??= (0, require_utils_index.utils_exports.isRtl)(locale) ? "rtl" : "ltr";
return {
dir,
locale
};
}
const I18nContext = (0, react.createContext)({
...DEFAULT_LANGUAGE,
changeLanguage: require_utils_index.utils_exports.noop,
getTranslation: () => () => "",
t: () => ""
});
const I18nProvider = ({ children, dir: forcedDir, formats, intl = require_providers_i18n_provider_intl_index.default, intlMessageFormatOptions, locale: forcedLocale }) => {
const [language, setLanguage] = (0, react.useState)(getLanguage(forcedLocale, forcedDir));
const controlled = !(0, require_utils_index.utils_exports.isUndefined)(forcedLocale);
const { locale } = language;
const messages = (0, react.useMemo)(() => intl[locale], [intl, locale]);
const changeSystemLanguage = (0, react.useCallback)(() => {
setLanguage(getLanguage());
}, []);
const changeLanguage = (0, react.useCallback)((locale$1, dir) => {
setLanguage(getLanguage(locale$1, dir));
}, []);
const getValue = (0, react.useCallback)((path) => {
const value$1 = (0, require_utils_index.utils_exports.getMemoizedObject)(messages, path);
if (!(0, require_utils_index.utils_exports.isUndefined)(value$1)) return value$1;
else {
path = path.toString().replace(/^[^.]+\./g, "");
return (0, require_utils_index.utils_exports.getMemoizedObject)(messages, path);
}
}, [messages]);
const getTranslation = (0, react.useCallback)((key) => (path, replaceValues) => {
const value$1 = getValue(key ? `${key}.${path}` : path) ?? path;
if ((0, require_utils_index.utils_exports.isUndefined)(replaceValues)) return value$1;
try {
const resolvedReplaceValues = Object.entries(replaceValues).reduce((prev, [key$1, pathOrValue]) => {
if ((0, require_utils_index.utils_exports.isString)(pathOrValue)) {
const resolvedPathOrValue = String(pathOrValue);
prev[key$1] = getValue(key$1 ? `${key$1}.${resolvedPathOrValue}` : resolvedPathOrValue) ?? resolvedPathOrValue;
} else prev[key$1] = pathOrValue;
return prev;
}, {});
return new intl_messageformat.default(value$1, locale, formats, intlMessageFormatOptions).format(resolvedReplaceValues);
} catch (e) {
if (e instanceof Error) console.warn(e.message);
return value$1;
}
}, [
getValue,
locale,
formats,
intlMessageFormatOptions
]);
const value = (0, react.useMemo)(() => {
const rest = {
changeLanguage,
getTranslation,
t: getTranslation()
};
return {
...language,
...rest
};
}, [
changeLanguage,
getTranslation,
language
]);
(0, react.useEffect)(() => {
if (controlled) return;
window.addEventListener("languagechange", changeSystemLanguage);
return () => {
window.removeEventListener("languagechange", changeSystemLanguage);
};
}, [controlled, changeSystemLanguage]);
require_effect.useUpdateEffect(() => {
setLanguage(getLanguage(forcedLocale, forcedDir));
}, [forcedLocale, forcedDir]);
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(I18nContext, {
value,
children
});
};
function useI18n(key) {
const context = (0, react.useContext)(I18nContext);
const translation = (0, react.useCallback)((path, replaceValues) => context.getTranslation(key)(path, replaceValues), [key, context]);
if ((0, require_utils_index.utils_exports.isEmptyObject)(context)) return {
...DEFAULT_LANGUAGE,
changeLanguage: require_utils_index.utils_exports.noop,
t: () => ""
};
if (key) return {
...context,
t: translation
};
else return context;
}
//#endregion
exports.I18nContext = I18nContext;
exports.I18nProvider = I18nProvider;
exports.LOCALES = LOCALES;
exports.getLanguage = getLanguage;
exports.useI18n = useI18n;
//# sourceMappingURL=i18n-provider.cjs.map