@rainbow-me/rainbowkit
Version:
The best way to connect a wallet
241 lines (234 loc) • 6.93 kB
JavaScript
"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
};