UNPKG

@rainbow-me/rainbowkit

Version:
241 lines (234 loc) 6.93 kB
"use client"; import { en_US_default } from "./chunk-JT4N2T7B.js"; // src/components/RainbowKitProvider/I18nContext.tsx import React, { createContext, useEffect, useMemo, useState } from "react"; // src/locales/I18n.ts var defaultOptions = { defaultLocale: "en", locale: "en" }; var I18n = class { constructor(localeTranslations) { this.listeners = /* @__PURE__ */ new Set(); this.defaultLocale = defaultOptions.defaultLocale; this.enableFallback = false; this.locale = defaultOptions.locale; this.cachedLocales = []; this.translations = {}; for (const [locale, translation] of Object.entries(localeTranslations)) { this.cachedLocales = [...this.cachedLocales, locale]; this.translations = { ...this.translations, ...this.flattenTranslation(translation, locale) }; } } missingMessage(key) { return `[missing: "${this.locale}.${key}" translation]`; } flattenTranslation(translationObject, locale) { const result = {}; const flatten = (currentTranslationObj, parentKey) => { for (const key of Object.keys(currentTranslationObj)) { const newKey = `${parentKey}.${key}`; const currentValue = currentTranslationObj[key]; if (typeof currentValue === "object" && currentValue !== null) { flatten(currentValue, newKey); } else { result[newKey] = currentValue; } } }; flatten(translationObject, locale); return result; } translateWithReplacements(translation, replacements = {}) { let translatedString = translation; for (const placeholder in replacements) { const replacementValue = replacements[placeholder]; translatedString = translatedString.replace( `%{${placeholder}}`, replacementValue ); } return translatedString; } t(key, replacements, options) { const translationKey = `${this.locale}.${key}`; const translation = this.translations[translationKey]; if (!translation) { if (this.enableFallback) { const fallbackTranslationKey = `${this.defaultLocale}.${key}`; const fallbackTranslation = this.translations[fallbackTranslationKey]; if (fallbackTranslation) { return this.translateWithReplacements( fallbackTranslation, replacements ); } } if (options?.rawKeyIfTranslationMissing) return key; return this.missingMessage(key); } return this.translateWithReplacements(translation, replacements); } isLocaleCached(locale) { return this.cachedLocales.includes(locale); } updateLocale(locale) { this.locale = locale; this.notifyListeners(); } setTranslations(locale, translations) { const cachedLocale = this.isLocaleCached(locale); if (!cachedLocale) { this.cachedLocales = [...this.cachedLocales, locale]; this.translations = { ...this.translations, ...this.flattenTranslation(translations, locale) }; } this.locale = locale; this.notifyListeners(); } notifyListeners() { for (const listener of this.listeners) { listener(); } } onChange(fn) { this.listeners.add(fn); return () => { this.listeners.delete(fn); }; } }; // src/locales/index.ts var i18n = new I18n({ en: JSON.parse(en_US_default), "en-US": JSON.parse(en_US_default) }); i18n.defaultLocale = "en-US"; i18n.locale = "en-US"; i18n.enableFallback = true; var fetchTranslations = async (locale) => { switch (locale) { case "ar": case "ar-AR": return (await import("./ar_AR-LIPSOZP5.js")).default; case "de": case "de-DE": return (await import("./de_DE-YE3KOFHU.js")).default; case "en": case "en-US": return (await import("./en_US-SK3WV2N3.js")).default; case "es": case "es-419": return (await import("./es_419-7LMPU7G4.js")).default; case "fr": case "fr-FR": return (await import("./fr_FR-VBJP3ZLL.js")).default; case "hi": case "hi-IN": return (await import("./hi_IN-WBVD5XYI.js")).default; case "id": case "id-ID": return (await import("./id_ID-SBYANJ7G.js")).default; case "ja": case "ja-JP": return (await import("./ja_JP-ZRMWJV3I.js")).default; case "ko": case "ko-KR": return (await import("./ko_KR-FR54RFUG.js")).default; case "ms": case "ms-MY": return (await import("./ms_MY-EZSGYYYQ.js")).default; case "pt": case "pt-BR": return (await import("./pt_BR-JQFQ3P4L.js")).default; case "ru": case "ru-RU": return (await import("./ru_RU-Z42UEJBP.js")).default; case "th": case "th-TH": return (await import("./th_TH-4YB4VSB2.js")).default; case "tr": case "tr-TR": return (await import("./tr_TR-5FKHPPIO.js")).default; case "ua": case "uk-UA": return (await import("./uk_UA-ZD4IBC52.js")).default; case "vi": case "vi-VN": return (await import("./vi_VN-5EVRZKLY.js")).default; case "zh": case "zh-CN": case "zh-Hans": return (await import("./zh_CN-4XK5YJPR.js")).default; case "zh-HK": return (await import("./zh_HK-N4YN2WSI.js")).default; case "zh-Hant": case "zh-TW": return (await import("./zh_TW-CNCRXH6Z.js")).default; default: return (await import("./en_US-SK3WV2N3.js")).default; } }; async function setLocale(locale) { const isCached = i18n.isLocaleCached(locale); if (isCached) { i18n.updateLocale(locale); return; } const translations = await fetchTranslations(locale); i18n.setTranslations(locale, JSON.parse(translations)); } // src/utils/locale.ts var detectedBrowserLocale = () => { if (typeof window !== "undefined" && typeof navigator !== "undefined") { if (navigator.languages?.length) { return navigator.languages[0]; } if (navigator.language) { return navigator.language; } } }; // src/components/RainbowKitProvider/I18nContext.tsx var I18nContext = createContext({ i18n }); var I18nProvider = ({ children, locale }) => { const [updateCount, setUpdateCount] = useState(0); const browserLocale = useMemo( () => detectedBrowserLocale(), [] ); useEffect(() => { const unsubscribe = i18n.onChange(() => { setUpdateCount((count) => count + 1); }); return unsubscribe; }, []); useEffect(() => { if (locale && locale !== i18n.locale) { setLocale(locale); } else if (!locale && browserLocale && browserLocale !== i18n.locale) { setLocale(browserLocale); } }, [locale, browserLocale]); const memoizedValue = useMemo(() => { const t = (key, options) => i18n.t(key, options); return { t, i18n }; }, [updateCount]); return /* @__PURE__ */ React.createElement(I18nContext.Provider, { value: memoizedValue }, children); }; export { I18nContext, I18nProvider };