feat: add i18n internationalization support

- Add react-i18next, i18next with browser language detection
- Support Traditional Chinese (zh-TW) and English (en)
- Default language: zh-TW, stored in localStorage
- Create 10 translation namespaces (common, auth, dashboard, tasks, etc.)
- Add LanguageSwitcher component in header
- Translate pages: Login, Dashboard, Tasks, Spaces, Workload, Audit

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
beabigegg
2026-01-08 23:18:41 +08:00
parent 1e31def7ba
commit 4bc3c24360
32 changed files with 1741 additions and 104 deletions

View File

@@ -0,0 +1,56 @@
{
"title": "稽核日誌",
"subtitle": "追蹤系統中的所有操作記錄",
"filters": {
"action": "操作類型",
"user": "使用者",
"entity": "實體類型",
"dateRange": "日期範圍",
"allActions": "所有操作",
"allUsers": "所有使用者",
"allEntities": "所有實體"
},
"actions": {
"create": "建立",
"update": "更新",
"delete": "刪除",
"login": "登入",
"logout": "登出",
"assign": "指派",
"unassign": "取消指派",
"statusChange": "狀態變更",
"comment": "留言",
"upload": "上傳",
"download": "下載"
},
"entities": {
"task": "任務",
"project": "專案",
"space": "工作空間",
"user": "使用者",
"comment": "留言",
"attachment": "附件"
},
"columns": {
"timestamp": "時間",
"user": "使用者",
"action": "操作",
"entity": "實體",
"details": "詳情",
"ipAddress": "IP 位址"
},
"details": {
"before": "變更前",
"after": "變更後",
"changes": "變更內容"
},
"export": {
"title": "匯出日誌",
"csv": "匯出為 CSV",
"json": "匯出為 JSON"
},
"empty": {
"title": "沒有稽核記錄",
"description": "目前沒有符合條件的稽核記錄"
}
}

View File

@@ -0,0 +1,28 @@
{
"login": {
"title": "登入",
"subtitle": "登入您的帳戶",
"email": "電子郵件",
"emailPlaceholder": "請輸入電子郵件",
"password": "密碼",
"passwordPlaceholder": "請輸入密碼",
"rememberMe": "記住我",
"forgotPassword": "忘記密碼?",
"submit": "登入",
"loggingIn": "登入中...",
"noAccount": "還沒有帳戶?",
"signUp": "註冊"
},
"errors": {
"invalidCredentials": "電子郵件或密碼錯誤",
"accountLocked": "帳戶已被鎖定,請聯繫管理員",
"emailRequired": "請輸入電子郵件",
"passwordRequired": "請輸入密碼",
"invalidEmail": "請輸入有效的電子郵件地址",
"loginFailed": "登入失敗,請稍後再試"
},
"welcome": {
"title": "專案控制中心",
"subtitle": "管理您的專案、任務和團隊"
}
}

View File

@@ -0,0 +1,102 @@
{
"buttons": {
"save": "儲存",
"cancel": "取消",
"delete": "刪除",
"edit": "編輯",
"create": "建立",
"close": "關閉",
"confirm": "確認",
"back": "返回",
"next": "下一步",
"previous": "上一步",
"submit": "提交",
"reset": "重置",
"search": "搜尋",
"filter": "篩選",
"export": "匯出",
"import": "匯入",
"refresh": "重新整理",
"add": "新增",
"remove": "移除",
"view": "檢視",
"download": "下載",
"upload": "上傳"
},
"labels": {
"loading": "載入中...",
"noData": "暫無資料",
"required": "必填",
"optional": "選填",
"all": "全部",
"none": "無",
"yes": "是",
"no": "否",
"active": "啟用",
"inactive": "停用",
"enabled": "已啟用",
"disabled": "已停用",
"actions": "操作",
"details": "詳情",
"description": "描述",
"name": "名稱",
"title": "標題",
"status": "狀態",
"type": "類型",
"date": "日期",
"time": "時間",
"createdAt": "建立時間",
"updatedAt": "更新時間",
"createdBy": "建立者",
"assignee": "負責人",
"selectAssignee": "選擇負責人...",
"searchUsers": "搜尋使用者...",
"noUsersFound": "找不到使用者",
"typeToSearch": "輸入以搜尋使用者"
},
"messages": {
"success": "操作成功",
"error": "操作失敗",
"confirmDelete": "確定要刪除嗎?此操作無法復原。",
"unsavedChanges": "您有未儲存的變更,確定要離開嗎?",
"networkError": "網路連線錯誤,請稍後再試",
"sessionExpired": "工作階段已過期,請重新登入",
"permissionDenied": "您沒有權限執行此操作",
"notFound": "找不到請求的資源"
},
"validation": {
"required": "此欄位為必填",
"email": "請輸入有效的電子郵件地址",
"minLength": "至少需要 {{min}} 個字元",
"maxLength": "最多 {{max}} 個字元",
"invalidFormat": "格式不正確"
},
"nav": {
"dashboard": "儀表板",
"spaces": "工作空間",
"projects": "專案",
"tasks": "任務",
"workload": "工作負載",
"health": "專案健康度",
"audit": "稽核日誌",
"settings": "設定",
"logout": "登出"
},
"language": {
"switch": "切換語言",
"zhTW": "繁體中文",
"en": "English"
},
"notifications": {
"title": "通知",
"markAllRead": "全部標為已讀",
"noNotifications": "沒有通知",
"viewAll": "查看全部"
},
"pagination": {
"page": "第 {{page}} 頁",
"of": "共 {{total}} 頁",
"showing": "顯示 {{from}}-{{to}} 筆,共 {{total}} 筆",
"itemsPerPage": "每頁顯示"
}
}

View File

@@ -0,0 +1,47 @@
{
"title": "儀表板",
"welcome": "歡迎回來,{{name}}",
"stats": {
"myTasks": "我的任務",
"overdueTasks": "逾期任務",
"completedTasks": "已完成任務",
"activeProjects": "進行中專案",
"teamMembers": "團隊成員",
"totalTasks": "總任務數",
"pendingReview": "待審核"
},
"sections": {
"recentActivity": "近期活動",
"upcomingDeadlines": "即將到期",
"myAssignedTasks": "指派給我的任務",
"projectOverview": "專案概覽",
"quickActions": "快速操作"
},
"activity": {
"taskCreated": "建立了任務「{{task}}」",
"taskCompleted": "完成了任務「{{task}}」",
"taskAssigned": "將任務「{{task}}」指派給 {{assignee}}",
"commentAdded": "在任務「{{task}}」新增了留言",
"projectCreated": "建立了專案「{{project}}」",
"noRecentActivity": "暫無近期活動"
},
"deadlines": {
"today": "今天到期",
"tomorrow": "明天到期",
"thisWeek": "本週到期",
"overdue": "已逾期",
"noUpcoming": "近期沒有待處理的截止日期"
},
"quickActions": {
"createTask": "建立任務",
"createProject": "建立專案",
"viewAllTasks": "查看所有任務",
"viewWorkload": "查看工作負載"
},
"widgets": {
"tasksByStatus": "依狀態分類的任務",
"tasksByPriority": "依優先順序分類的任務",
"projectProgress": "專案進度",
"teamWorkload": "團隊工作負載"
}
}

View File

@@ -0,0 +1,48 @@
{
"title": "專案健康度",
"subtitle": "監控專案的整體健康狀況",
"overall": {
"title": "整體健康度",
"healthy": "健康",
"atRisk": "風險中",
"critical": "危急"
},
"metrics": {
"schedule": "進度",
"budget": "預算",
"scope": "範圍",
"quality": "品質",
"resources": "資源"
},
"status": {
"onTrack": "正常進行",
"delayed": "延遲",
"ahead": "超前",
"overBudget": "超支",
"underBudget": "低於預算"
},
"indicators": {
"title": "健康指標",
"taskCompletion": "任務完成率",
"onTimeDelivery": "準時交付率",
"blockedTasks": "阻擋任務數",
"overdueRate": "逾期率",
"velocityTrend": "速度趨勢"
},
"risks": {
"title": "風險",
"high": "高風險",
"medium": "中風險",
"low": "低風險",
"mitigated": "已緩解"
},
"actions": {
"viewDetails": "查看詳情",
"exportReport": "匯出報告",
"setAlert": "設定警示"
},
"empty": {
"title": "沒有健康度資料",
"description": "專案需要更多資料才能顯示健康度指標"
}
}

View File

@@ -0,0 +1,50 @@
{
"title": "專案",
"createProject": "建立專案",
"editProject": "編輯專案",
"deleteProject": "刪除專案",
"projectSettings": "專案設定",
"fields": {
"name": "名稱",
"namePlaceholder": "輸入專案名稱",
"description": "描述",
"descriptionPlaceholder": "輸入專案描述",
"status": "狀態",
"startDate": "開始日期",
"endDate": "結束日期",
"owner": "專案負責人",
"space": "工作空間"
},
"status": {
"planning": "規劃中",
"active": "進行中",
"on_hold": "暫停",
"completed": "已完成",
"cancelled": "已取消"
},
"tabs": {
"overview": "概覽",
"tasks": "任務",
"members": "成員",
"settings": "設定",
"files": "檔案",
"activity": "活動紀錄"
},
"stats": {
"totalTasks": "總任務數",
"completedTasks": "已完成",
"inProgress": "進行中",
"overdue": "逾期",
"progress": "整體進度"
},
"messages": {
"created": "專案已建立",
"updated": "專案已更新",
"deleted": "專案已刪除",
"confirmDelete": "確定要刪除此專案嗎?此操作將刪除所有相關任務。"
},
"empty": {
"title": "沒有專案",
"description": "建立您的第一個專案來開始管理任務"
}
}

View File

@@ -0,0 +1,73 @@
{
"title": "設定",
"projectSettings": "專案設定",
"tabs": {
"general": "一般",
"members": "成員",
"customFields": "自訂欄位",
"notifications": "通知",
"integrations": "整合",
"danger": "危險區域"
},
"general": {
"title": "一般設定",
"projectName": "專案名稱",
"description": "描述",
"status": "狀態",
"visibility": "可見性",
"public": "公開",
"private": "私人"
},
"members": {
"title": "成員管理",
"invite": "邀請成員",
"inviteByEmail": "透過電子郵件邀請",
"emailPlaceholder": "輸入電子郵件地址",
"role": "角色",
"changeRole": "變更角色",
"remove": "移除成員",
"confirmRemove": "確定要移除此成員嗎?"
},
"customFields": {
"title": "自訂欄位",
"add": "新增欄位",
"edit": "編輯欄位",
"delete": "刪除欄位",
"fieldName": "欄位名稱",
"fieldType": "欄位類型",
"required": "必填",
"types": {
"text": "文字",
"number": "數字",
"date": "日期",
"select": "下拉選單",
"multiSelect": "多選",
"checkbox": "核取方塊"
}
},
"notifications": {
"title": "通知設定",
"email": "電子郵件通知",
"inApp": "應用內通知",
"taskAssigned": "任務指派給我時",
"taskCompleted": "任務完成時",
"commentAdded": "新增留言時",
"dueDateApproaching": "截止日期即將到來時"
},
"danger": {
"title": "危險區域",
"archive": "封存專案",
"archiveDescription": "封存此專案。封存後專案將變為唯讀。",
"delete": "刪除專案",
"deleteDescription": "永久刪除此專案及其所有資料。此操作無法復原。",
"confirmArchive": "確定要封存此專案嗎?",
"confirmDelete": "確定要刪除此專案嗎?請輸入專案名稱以確認:",
"typeToConfirm": "輸入「{{name}}」以確認"
},
"messages": {
"saved": "設定已儲存",
"memberInvited": "已發送邀請",
"memberRemoved": "成員已移除",
"roleChanged": "角色已變更"
}
}

View File

@@ -0,0 +1,39 @@
{
"title": "工作空間",
"createSpace": "建立工作空間",
"editSpace": "編輯工作空間",
"deleteSpace": "刪除工作空間",
"fields": {
"name": "名稱",
"namePlaceholder": "輸入工作空間名稱",
"description": "描述",
"descriptionPlaceholder": "輸入工作空間描述",
"icon": "圖示",
"color": "顏色"
},
"members": {
"title": "成員",
"add": "新增成員",
"remove": "移除成員",
"role": "角色",
"owner": "擁有者",
"admin": "管理員",
"member": "成員",
"viewer": "檢視者"
},
"stats": {
"projects": "專案數",
"members": "成員數",
"tasks": "任務數"
},
"messages": {
"created": "工作空間已建立",
"updated": "工作空間已更新",
"deleted": "工作空間已刪除",
"confirmDelete": "確定要刪除此工作空間嗎?此操作將刪除所有相關專案和任務。"
},
"empty": {
"title": "沒有工作空間",
"description": "建立您的第一個工作空間來組織專案"
}
}

View File

@@ -0,0 +1,134 @@
{
"title": "任務",
"createTask": "建立任務",
"editTask": "編輯任務",
"deleteTask": "刪除任務",
"taskDetails": "任務詳情",
"fields": {
"title": "標題",
"titlePlaceholder": "輸入任務標題",
"description": "描述",
"descriptionPlaceholder": "輸入任務描述",
"status": "狀態",
"priority": "優先順序",
"assignee": "負責人",
"dueDate": "截止日期",
"startDate": "開始日期",
"estimatedHours": "預估工時",
"actualHours": "實際工時",
"progress": "進度",
"tags": "標籤",
"parent": "父任務",
"subtasks": "子任務",
"attachments": "附件",
"comments": "留言",
"watchers": "關注者",
"blockers": "阻擋項目"
},
"status": {
"todo": "待處理",
"in_progress": "進行中",
"review": "審核中",
"done": "已完成",
"cancelled": "已取消",
"blocked": "被阻擋"
},
"priority": {
"low": "低",
"medium": "中",
"high": "高",
"urgent": "緊急"
},
"views": {
"list": "列表",
"kanban": "看板",
"calendar": "日曆",
"gantt": "甘特圖",
"timeline": "時間軸"
},
"filters": {
"all": "全部任務",
"myTasks": "我的任務",
"unassigned": "未指派",
"overdue": "逾期",
"dueThisWeek": "本週到期",
"highPriority": "高優先順序",
"recentlyUpdated": "最近更新"
},
"sort": {
"sortBy": "排序方式",
"dueDate": "截止日期",
"priority": "優先順序",
"status": "狀態",
"title": "標題",
"createdAt": "建立時間",
"updatedAt": "更新時間",
"ascending": "升序",
"descending": "降序"
},
"actions": {
"assign": "指派",
"reassign": "重新指派",
"changeStatus": "變更狀態",
"changePriority": "變更優先順序",
"addSubtask": "新增子任務",
"addComment": "新增留言",
"addAttachment": "新增附件",
"addWatcher": "新增關注者",
"removeWatcher": "移除關注者",
"duplicate": "複製任務",
"archive": "封存",
"restore": "還原",
"moveToProject": "移至專案"
},
"subtasks": {
"title": "子任務",
"add": "新增子任務",
"placeholder": "輸入子任務標題",
"completed": "已完成 {{count}} / {{total}}",
"empty": "沒有子任務"
},
"comments": {
"title": "留言",
"add": "新增留言",
"placeholder": "輸入您的留言...",
"edited": "已編輯",
"delete": "刪除留言",
"confirmDelete": "確定要刪除此留言嗎?",
"empty": "還沒有留言",
"reply": "回覆"
},
"attachments": {
"title": "附件",
"add": "新增附件",
"upload": "上傳檔案",
"dragDrop": "拖放檔案至此或點擊上傳",
"maxSize": "最大檔案大小:{{size}}MB",
"downloading": "下載中...",
"empty": "沒有附件"
},
"blockers": {
"title": "阻擋項目",
"add": "新增阻擋項目",
"blockedBy": "被以下任務阻擋",
"blocking": "正在阻擋以下任務",
"remove": "移除阻擋關係",
"empty": "沒有阻擋項目"
},
"messages": {
"created": "任務已建立",
"updated": "任務已更新",
"deleted": "任務已刪除",
"statusChanged": "狀態已變更為「{{status}}」",
"assigned": "已指派給 {{assignee}}",
"unassigned": "已取消指派",
"commentAdded": "留言已新增",
"attachmentUploaded": "附件已上傳",
"confirmDelete": "確定要刪除此任務嗎?此操作無法復原。"
},
"empty": {
"title": "沒有任務",
"description": "目前沒有任務。建立您的第一個任務開始吧!",
"filtered": "沒有符合篩選條件的任務"
}
}

View File

@@ -0,0 +1,42 @@
{
"title": "工作負載",
"subtitle": "檢視團隊成員的工作負載分佈",
"filters": {
"project": "專案",
"allProjects": "所有專案",
"dateRange": "日期範圍",
"thisWeek": "本週",
"thisMonth": "本月",
"custom": "自訂"
},
"metrics": {
"totalHours": "總工時",
"assignedTasks": "指派任務數",
"completedTasks": "已完成任務",
"overdueTasks": "逾期任務",
"utilization": "使用率"
},
"chart": {
"hoursPerDay": "每日工時",
"taskDistribution": "任務分佈",
"byProject": "依專案",
"byPriority": "依優先順序"
},
"team": {
"title": "團隊成員",
"member": "成員",
"allocated": "已分配",
"available": "可用",
"overloaded": "超載",
"underutilized": "低使用率"
},
"status": {
"balanced": "平衡",
"overloaded": "超載",
"underutilized": "低使用率"
},
"empty": {
"title": "沒有工作負載資料",
"description": "目前沒有足夠的資料來顯示工作負載"
}
}