feat(i18n): 增强管理端多语言支持,优化语言初始化与恢复逻辑

This commit is contained in:
2026-05-25 14:53:15 +08:00
parent ddedef824e
commit 84bf924378
4 changed files with 56 additions and 9 deletions

View File

@@ -3,7 +3,13 @@
import i18n from "i18next";
import { initReactI18next } from "react-i18next";
import { adminHtmlLang, applyAdminUiLocale, type AdminApiLocale } from "@/lib/admin-locale";
import {
adminHtmlLang,
applyAdminUiLocale,
getStoredAdminUiLocale,
hydrateAdminUiLocale,
type AdminApiLocale,
} from "@/lib/admin-locale";
import enAudit from "@/i18n/locales/en/audit.json";
import enAdminUsers from "@/i18n/locales/en/adminUsers.json";
import enAuth from "@/i18n/locales/en/auth.json";
@@ -118,10 +124,15 @@ export function normalizeAdminLanguage(lang: string | undefined): AdminLanguage
}
function getInitialAdminLanguage(): AdminLanguage {
if (typeof document === "undefined") {
if (typeof window === "undefined") {
return ADMIN_DEFAULT_LANGUAGE;
}
const stored = getStoredAdminUiLocale();
if (stored) {
return stored;
}
return normalizeAdminLanguage(document.documentElement.lang);
}
@@ -133,11 +144,17 @@ function syncAdminLanguage(lang: AdminLanguage): void {
}
if (!i18n.isInitialized) {
if (typeof window !== "undefined") {
hydrateAdminUiLocale();
}
const initialLanguage = getInitialAdminLanguage();
void i18n
.use(initReactI18next)
.init({
resources,
lng: getInitialAdminLanguage(),
lng: initialLanguage,
fallbackLng: ADMIN_DEFAULT_LANGUAGE,
supportedLngs: [...ADMIN_SUPPORTED_LANGUAGES],
defaultNS: "common",
@@ -149,9 +166,16 @@ if (!i18n.isInitialized) {
react: {
useSuspense: false,
},
})
.then(() => {
const lang = getInitialAdminLanguage();
if (normalizeAdminLanguage(i18n.language) !== lang) {
void i18n.changeLanguage(lang);
}
syncAdminLanguage(normalizeAdminLanguage(i18n.resolvedLanguage ?? i18n.language));
});
syncAdminLanguage(normalizeAdminLanguage(i18n.resolvedLanguage ?? i18n.language));
syncAdminLanguage(initialLanguage);
i18n.on("languageChanged", (lang) => {
syncAdminLanguage(normalizeAdminLanguage(lang));
});