feat(i18n): 增强管理端多语言支持,优化语言初始化与恢复逻辑
This commit is contained in:
@@ -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));
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user