UNPKG

@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
"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