feat: 接入公开币种目录并统一多币种金额与语言初始化处理

This commit is contained in:
2026-05-21 15:14:00 +08:00
parent 626914feb6
commit 6b18e25766
27 changed files with 277 additions and 94 deletions

View File

@@ -1,7 +1,6 @@
"use client";
import i18n from "i18next";
import LanguageDetector from "i18next-browser-languagedetector";
import { initReactI18next } from "react-i18next";
import enCommon from "./locales/en/common.json";
@@ -60,38 +59,48 @@ export function syncDocumentLanguage(lang: AppLanguage): void {
document.documentElement.lang = lang;
}
export function syncPreferredLanguage(): void {
if (typeof window === "undefined") return;
const stored = window.localStorage.getItem("i18nextLng");
const preferred = normalizeLanguage(stored ?? window.navigator.language);
const current = normalizeLanguage(i18n.resolvedLanguage ?? i18n.language);
if (preferred !== current) {
void i18n.changeLanguage(preferred);
}
}
if (!i18n.isInitialized) {
void i18n
.use(LanguageDetector)
.use(initReactI18next)
.init({
resources,
fallbackLng: DEFAULT_LANGUAGE,
supportedLngs: ["en", "ne", "zh"],
defaultNS: "common",
ns: [...namespaces],
/** zh-CN → zhne-NP → ne未匹配时用 fallbackLng */
load: "languageOnly",
void i18n.use(initReactI18next).init({
resources,
fallbackLng: DEFAULT_LANGUAGE,
supportedLngs: ["en", "ne", "zh"],
defaultNS: "common",
ns: [...namespaces],
/** 始终先用默认语言完成 SSR / 首次 hydration避免首屏文本不一致 */
load: "languageOnly",
lng: DEFAULT_LANGUAGE,
initImmediate: false,
detection: {
order: ["localStorage", "navigator"],
caches: ["localStorage"],
lookupLocalStorage: "i18nextLng",
},
interpolation: {
escapeValue: false,
},
interpolation: {
escapeValue: false,
},
react: {
useSuspense: false,
},
});
react: {
useSuspense: false,
},
});
syncDocumentLanguage(normalizeLanguage(i18n.resolvedLanguage ?? i18n.language));
i18n.on("languageChanged", (lang) => {
syncDocumentLanguage(normalizeLanguage(lang));
const next = normalizeLanguage(lang);
syncDocumentLanguage(next);
if (typeof window !== "undefined") {
window.localStorage.setItem("i18nextLng", next);
}
});
}