import i18n from "i18next"; import { initReactI18next } from "react-i18next"; import en from "./locales/en.json"; import zh from "./locales/zh.json"; const DEFAULT_LANGUAGE: "zh" | "en" = "zh"; const getInitialLanguage = (): "zh" | "en" => { if (typeof window !== "undefined") { try { const stored = window.localStorage.getItem("language"); if (stored === "zh" || stored === "en") { return stored; } } catch (error) { console.warn("[i18n] Failed to read stored language preference", error); } } const navigatorLang = typeof navigator !== "undefined" ? (navigator.language?.toLowerCase() ?? navigator.languages?.[0]?.toLowerCase()) : undefined; if (navigatorLang?.startsWith("zh")) { return "zh"; } if (navigatorLang?.startsWith("en")) { return "en"; } return DEFAULT_LANGUAGE; }; const resources = { en: { translation: en, }, zh: { translation: zh, }, }; i18n.use(initReactI18next).init({ resources, lng: getInitialLanguage(), // 根据本地存储或系统语言选择默认语言 fallbackLng: "en", // 如果缺少中文翻译则退回英文 interpolation: { escapeValue: false, // React 已经默认转义 }, // 开发模式下显示调试信息 debug: false, }); export default i18n;