import React,{createContext,useContext,useState,useEffect,ReactNode}from "react"; import{zh}from "./locales/zh"; import{en}from "./locales/en"; // 类型定义 export type Language = "zh" | "en"; type Locale = typeof zh; interface I18nContextType{language:Language;locale:Locale;t:(path: string) => string;setLanguage:(lang: Language) => void}const translations ={zh,en}; // Context const I18nContext = createContext<I18nContextType | null>(null); // 工具函数：path like "tabBar.discover" → string function getNestedValue(obj: any,path: string): string{return path.split(".").reduce((acc,key) => acc?.[key],obj) ?? path}// 自动检测系统语言 function detectSystemLanguage(): Language{if (typeof navigator === "undefined") return "zh";const lang = navigator.language.toLowerCase();if (lang.startsWith("zh")) return "zh";return "en"}interface I18nProviderProps{children:ReactNode}export function I18nProvider({children}: I18nProviderProps){const [language,setLanguageState] = useState<Language>(() => {// 优先读 localStorage if (typeof window !== "undefined") {const saved = localStorage.getItem("shipworth-language"); if (saved === "zh" || saved === "en") return saved;} // 其次跟随系统 return detectSystemLanguage();});const locale = translations[language];const setLanguage = (lang: Language) =>{setLanguageState(lang);if (typeof window !== "undefined"){localStorage.setItem("shipworth-language",lang)}}const t = (path: string): string =>{const value = getNestedValue(locale,path);return typeof value === "string" ? value : path}return (<I18nContext.Provider value={{language,locale,t,setLanguage}}> {children} </I18nContext.Provider>)}// Hook export function useI18n(): I18nContextType{const context = useContext(I18nContext);if (!context){throw new Error("useI18n must be used within I18nProvider")}return context}// 语言切换组件 export function LanguageSwitch(){const{language,setLanguage}= useI18n();return (<div style={{display: "flex",gap: 8,padding: "8px 16px",background: "rgba(255,255,255,0.1)",borderRadius: 8,}}> <button onClick={() => setLanguage("zh")} style={{padding: "4px 12px",borderRadius: 6,border: "none",fontSize: 12,fontWeight: 600,cursor: "pointer",background: language === "zh" ? "#fff" : "transparent",color: language === "zh" ? "#1a3a5c" : "#fff",transition: "all 0.2s",}} > 中文 </button> <button onClick={() => setLanguage("en")} style={{padding: "4px 12px",borderRadius: 6,border: "none",fontSize: 12,fontWeight: 600,cursor: "pointer",background: language === "en" ? "#fff" : "transparent",color: language === "en" ? "#1a3a5c" : "#fff",transition: "all 0.2s",}} > EN </button> </div>)}
