diff --git a/frontend/i18n/locales/en.json b/frontend/i18n/locales/en.json index f9912eb..0a3daf1 100644 --- a/frontend/i18n/locales/en.json +++ b/frontend/i18n/locales/en.json @@ -90,7 +90,8 @@ "messages": "messages" }, "settings": { - "language": "Language" + "language": "Language", + "toggleTheme": "Toggle Theme" }, "errors": { "generic": "An error occurred, please try again later", diff --git a/frontend/i18n/locales/zh-CN.json b/frontend/i18n/locales/zh-CN.json index b0d9444..f1894e3 100644 --- a/frontend/i18n/locales/zh-CN.json +++ b/frontend/i18n/locales/zh-CN.json @@ -90,7 +90,8 @@ "messages": "封邮件" }, "settings": { - "language": "语言" + "language": "语言", + "toggleTheme": "切换主题" }, "errors": { "generic": "发生错误,请稍后重试", diff --git a/frontend/src/components/Header.tsx b/frontend/src/components/Header.tsx index 9a25ee9..20a4a76 100644 --- a/frontend/src/components/Header.tsx +++ b/frontend/src/components/Header.tsx @@ -5,6 +5,7 @@ import LanguageSwitcher from './LanguageSwitcher'; import HeaderMailbox from './HeaderMailbox'; import Container from './Container'; import { getEmailDomains, getDefaultEmailDomain, EMAIL_DOMAINS, DEFAULT_EMAIL_DOMAIN } from '../config'; +import ThemeSwitcher from './ThemeSwitcher'; // 导入新增的主题切换组件 interface HeaderProps { mailbox: Mailbox | null; @@ -56,6 +57,8 @@ const Header: React.FC = ({ isLoading={isLoading} />
+ {/* 在这里添加主题切换组件 */} + { + const { t } = useTranslation(); + + // 从 localStorage 获取初始主题,如果不存在则默认为 'light' + const [theme, setTheme] = useState(() => { + const savedTheme = localStorage.getItem('theme'); + return savedTheme || 'light'; + }); + + // 使用 useEffect 监听 theme 状态的变化,并应用到 元素上 + useEffect(() => { + const root = window.document.documentElement; + // 先移除旧的 class,以防万一 + root.classList.remove(theme === 'light' ? 'dark' : 'light'); + // 添加当前主题的 class + root.classList.add(theme); + // 将当前主题保存到 localStorage + localStorage.setItem('theme', theme); + }, [theme]); + + // 定义切换主题的函数 + const toggleTheme = () => { + setTheme(prevTheme => (prevTheme === 'light' ? 'dark' : 'light')); + }; + + return ( + + ); +}; + +export default ThemeSwitcher; \ No newline at end of file