diff --git a/frontend/data/i18n/en.json b/frontend/data/i18n/en.json
index defb85f..06015e4 100644
--- a/frontend/data/i18n/en.json
+++ b/frontend/data/i18n/en.json
@@ -14,19 +14,23 @@
"search": "Search"
},
"theme": {
- "light": "Light Mode",
- "dark": "Dark Mode",
- "system": "System Mode"
+ "light": "Light",
+ "dark": "Dark",
+ "system": "System"
},
"footer": {
"copyright": "TSS Rocks. All rights reserved."
},
"admin": {
"common": {
+ "loading": "Loading...",
"search": "Search",
"create": "Create",
"edit": "Edit",
"delete": "Delete",
+ "upload": "Upload",
+ "save": "Save",
+ "saving": "Saving...",
"status": "Status",
"actions": "Actions",
"published": "Published",
@@ -43,19 +47,68 @@
"lastLogin": "Last Login",
"joinDate": "Join Date",
"username": "Username",
- "logout": "Logout"
+ "logout": "Logout",
+ "language": "Language",
+ "theme": {
+ "light": "Light Mode",
+ "dark": "Dark Mode",
+ "system": "System"
+ }
+ },
+ "dashboard": {
+ "totalPosts": "Total Posts",
+ "totalCategories": "Total Categories",
+ "totalUsers": "Total Users",
+ "totalContributors": "Total Contributors"
+ },
+ "login": {
+ "title": "Admin Login",
+ "username": "Username",
+ "password": "Password",
+ "remember": "Remember me",
+ "submit": "Sign in",
+ "loading": "Signing in...",
+ "error": {
+ "failed": "Login failed",
+ "retry": "Login failed, please try again later"
+ }
},
"nav": {
"dashboard": "Dashboard",
"posts": "Posts",
+ "daily": "Daily Quotes",
+ "medias": "Media",
"categories": "Categories",
"users": "Users",
- "contributors": "Contributors"
+ "contributors": "Contributors",
+ "settings": "Settings"
+ },
+ "daily": {
+ "title": "Title",
+ "publishDate": "Publish Date",
+ "status": "Status"
+ },
+ "medias": {
+ "name": "File Name",
+ "type": "Type",
+ "size": "Size",
+ "uploadDate": "Upload Date"
},
"roles": {
"admin": "Administrator",
"user": "User",
"contributor": "Contributor"
+ },
+ "settings": {
+ "username": "Username",
+ "displayName": "Display Name",
+ "email": "Email",
+ "changePassword": "Change Password",
+ "currentPassword": "Current Password",
+ "newPassword": "New Password",
+ "confirmPassword": "Confirm Password",
+ "passwordMismatch": "Passwords do not match",
+ "passwordTooShort": "Password must be at least 8 characters long"
}
}
}
diff --git a/frontend/data/i18n/zh-Hans.json b/frontend/data/i18n/zh-Hans.json
index 749c864..296d279 100644
--- a/frontend/data/i18n/zh-Hans.json
+++ b/frontend/data/i18n/zh-Hans.json
@@ -14,8 +14,8 @@
"search": "搜索"
},
"theme": {
- "light": "浅色模式",
- "dark": "深色模式",
+ "light": "浅色",
+ "dark": "深色",
"system": "跟随系统"
},
"footer": {
@@ -23,10 +23,12 @@
},
"admin": {
"common": {
+ "loading": "正在加载...",
"search": "搜索",
"create": "新建",
"edit": "编辑",
"delete": "删除",
+ "upload": "上传",
"status": "状态",
"actions": "操作",
"published": "已发布",
@@ -43,19 +45,64 @@
"lastLogin": "最后登录",
"joinDate": "加入时间",
"username": "用户名",
- "logout": "退出"
+ "logout": "退出登录",
+ "save": "保存",
+ "saving": "保存中..."
+ },
+ "dashboard": {
+ "totalPosts": "文章总数",
+ "totalCategories": "分类总数",
+ "totalUsers": "用户总数",
+ "totalContributors": "贡献者总数"
+ },
+ "login": {
+ "title": "管理员登录",
+ "username": "用户名",
+ "password": "密码",
+ "remember": "记住我",
+ "submit": "登录",
+ "loading": "登录中...",
+ "error": {
+ "failed": "登录失败",
+ "retry": "登录失败,请稍后重试"
+ }
},
"nav": {
- "dashboard": "仪表盘",
- "posts": "文章",
- "categories": "分类",
- "users": "用户",
- "contributors": "作者"
+ "dashboard": "仪表板",
+ "posts": "文章管理",
+ "daily": "每日一句",
+ "medias": "媒体管理",
+ "categories": "分类管理",
+ "users": "用户管理",
+ "contributors": "贡献者管理",
+ "settings": "个人设置"
+ },
+ "daily": {
+ "title": "标题",
+ "publishDate": "发布日期",
+ "status": "状态"
+ },
+ "medias": {
+ "name": "文件名",
+ "type": "类型",
+ "size": "大小",
+ "uploadDate": "上传日期"
},
"roles": {
"admin": "管理员",
"user": "普通用户",
"contributor": "作者"
+ },
+ "settings": {
+ "username": "用户名",
+ "displayName": "显示名称",
+ "email": "邮箱",
+ "changePassword": "修改密码",
+ "currentPassword": "当前密码",
+ "newPassword": "新密码",
+ "confirmPassword": "确认密码",
+ "passwordMismatch": "两次输入的密码不一致",
+ "passwordTooShort": "密码长度不能少于8个字符"
}
}
}
diff --git a/frontend/data/i18n/zh-Hant.json b/frontend/data/i18n/zh-Hant.json
index 6377964..7a89534 100644
--- a/frontend/data/i18n/zh-Hant.json
+++ b/frontend/data/i18n/zh-Hant.json
@@ -14,8 +14,8 @@
"search": "搜尋"
},
"theme": {
- "light": "淺色模式",
- "dark": "深色模式",
+ "light": "淺色",
+ "dark": "深色",
"system": "跟隨系統"
},
"footer": {
@@ -23,10 +23,12 @@
},
"admin": {
"common": {
+ "loading": "正在載入...",
"search": "搜尋",
"create": "新建",
"edit": "編輯",
"delete": "刪除",
+ "upload": "上傳",
"status": "狀態",
"actions": "操作",
"published": "已發布",
@@ -43,19 +45,70 @@
"lastLogin": "最後登入",
"joinDate": "加入時間",
"username": "用戶名",
- "logout": "退出"
+ "logout": "退出登錄",
+ "language": "語言",
+ "theme": {
+ "light": "淺色模式",
+ "dark": "深色模式",
+ "system": "跟隨系統"
+ },
+ "save": "保存",
+ "saving": "保存中..."
},
"nav": {
"dashboard": "儀表板",
- "posts": "文章",
- "categories": "分類",
- "users": "用戶",
- "contributors": "作者"
+ "posts": "文章管理",
+ "daily": "每日一句",
+ "medias": "媒體管理",
+ "categories": "分類管理",
+ "users": "用戶管理",
+ "contributors": "貢獻者管理",
+ "settings": "個人設置"
+ },
+ "dashboard": {
+ "totalPosts": "文章總數",
+ "totalCategories": "分類總數",
+ "totalUsers": "用戶總數",
+ "totalContributors": "貢獻者總數"
+ },
+ "daily": {
+ "title": "標題",
+ "publishDate": "發布日期",
+ "status": "狀態"
+ },
+ "medias": {
+ "name": "檔案名",
+ "type": "類型",
+ "size": "大小",
+ "uploadDate": "上傳日期"
+ },
+ "login": {
+ "title": "管理員登錄",
+ "username": "用戶名",
+ "password": "密碼",
+ "remember": "記住我",
+ "submit": "登錄",
+ "loading": "登錄中...",
+ "error": {
+ "failed": "登錄失敗",
+ "retry": "登錄失敗,請稍後重試"
+ }
},
"roles": {
"admin": "管理員",
"user": "普通用戶",
"contributor": "作者"
+ },
+ "settings": {
+ "username": "用戶名",
+ "displayName": "顯示名稱",
+ "email": "郵箱",
+ "changePassword": "修改密碼",
+ "currentPassword": "當前密碼",
+ "newPassword": "新密碼",
+ "confirmPassword": "確認密碼",
+ "passwordMismatch": "兩次輸入的密碼不一致",
+ "passwordTooShort": "密碼長度不能少於8個字符"
}
}
}
diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx
index c5f2ca5..9fa788f 100644
--- a/frontend/src/App.tsx
+++ b/frontend/src/App.tsx
@@ -1,63 +1,19 @@
-import React from 'react';
-import { BrowserRouter, Routes, Route } from 'react-router-dom';
-import { Header } from './components/layout/Header';
-import { Suspense, lazy } from 'react';
-import Footer from './components/Footer';
+import { RouterProvider } from 'react-router-dom';
+import { Suspense } from 'react';
import { AuthProvider } from './contexts/AuthContext';
-
-// Lazy load pages
-const Home = lazy(() => import('./pages/Home'));
-const Daily = lazy(() => import('./pages/Daily'));
-const Article = lazy(() => import('./pages/Article'));
-const AdminLayout = lazy(() => import('./pages/admin/layout/AdminLayout'));
-
-// 管理页面懒加载
-const PostsManagement = lazy(() => import('./pages/admin/posts/PostsManagement'));
-const CategoriesManagement = lazy(() => import('./pages/admin/categories/CategoriesManagement'));
-const UsersManagement = lazy(() => import('./pages/admin/users/UsersManagement'));
-const ContributorsManagement = lazy(() => import('./pages/admin/contributors/ContributorsManagement'));
+import { UserProvider } from './contexts/UserContext';
+import router from './router';
+import LoadingSpinner from './components/LoadingSpinner';
function App() {
return (
-
{t('admin.common.name')} | -{t('admin.common.bio')} | -{t('admin.common.articles')} | -{t('admin.common.joinDate')} | +{t('admin.contributors.name')} | +{t('admin.contributors.email')} | +{t('admin.contributors.role')} | +{t('admin.contributors.status')} | +{t('admin.contributors.postCount')} | {t('admin.common.actions')} |
---|---|---|---|---|---|---|---|---|---|
{contributor.name} | -{contributor.bio} | +{contributor.email} | - - {contributor.articles} + + {t(`admin.roles.${contributor.role}`)} | -{contributor.joinDate} | ++ + {t(`admin.common.${contributor.status}`)} + + | +{contributor.postCount} |