Implemented proposals from comprehensive QA review: 1. extend-csrf-protection - Add POST to CSRF protected methods in frontend - Global CSRF middleware for all state-changing operations - Update tests with CSRF token fixtures 2. tighten-cors-websocket-security - Replace wildcard CORS with explicit method/header lists - Disable query parameter auth in production (code 4002) - Add per-user WebSocket connection limit (max 5, code 4005) 3. shorten-jwt-expiry - Reduce JWT expiry from 7 days to 60 minutes - Add refresh token support with 7-day expiry - Implement token rotation on refresh - Frontend auto-refresh when token near expiry (<5 min) 4. fix-frontend-quality - Add React.lazy() code splitting for all pages - Fix useCallback dependency arrays (Dashboard, Comments) - Add localStorage data validation in AuthContext - Complete i18n for AttachmentUpload component 5. enhance-backend-validation - Add SecurityAuditMiddleware for access denied logging - Add ErrorSanitizerMiddleware for production error messages - Protect /health/detailed with admin authentication - Add input length validation (comment 5000, desc 10000) All 521 backend tests passing. Frontend builds successfully. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
140 lines
3.9 KiB
JSON
140 lines
3.9 KiB
JSON
{
|
|
"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": "輸入以搜尋使用者",
|
|
"task": "任務",
|
|
"admin": "管理員",
|
|
"live": "即時",
|
|
"offline": "離線"
|
|
},
|
|
"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": "登出",
|
|
"toggleMenu": "切換選單",
|
|
"menu": "選單"
|
|
},
|
|
"language": {
|
|
"switch": "切換語言",
|
|
"zhTW": "繁體中文",
|
|
"en": "English"
|
|
},
|
|
"notifications": {
|
|
"title": "通知",
|
|
"markAllRead": "全部標為已讀",
|
|
"noNotifications": "沒有通知",
|
|
"empty": "沒有通知",
|
|
"viewAll": "查看全部",
|
|
"refresh": "重新整理",
|
|
"time": {
|
|
"justNow": "剛剛",
|
|
"minutesAgo": "{{count}} 分鐘前",
|
|
"hoursAgo": "{{count}} 小時前",
|
|
"daysAgo": "{{count}} 天前"
|
|
}
|
|
},
|
|
"pagination": {
|
|
"page": "第 {{page}} 頁",
|
|
"of": "共 {{total}} 頁",
|
|
"showing": "顯示 {{from}}-{{to}} 筆,共 {{total}} 筆",
|
|
"itemsPerPage": "每頁顯示"
|
|
},
|
|
"errorBoundary": {
|
|
"retry": "重試",
|
|
"page": {
|
|
"title": "發生錯誤",
|
|
"message": "非常抱歉造成不便。請嘗試重新整理頁面,如果問題持續發生,請聯繫技術支援。"
|
|
},
|
|
"section": {
|
|
"title": "無法載入此區塊",
|
|
"message": "此區塊發生錯誤,但頁面的其他部分可能仍然正常運作。",
|
|
"messageWithName": "{{section}} 發生錯誤,但頁面的其他部分可能仍然正常運作。"
|
|
},
|
|
"widget": {
|
|
"title": "元件錯誤",
|
|
"message": "無法顯示此元件。",
|
|
"errorSuffix": "發生錯誤"
|
|
}
|
|
},
|
|
"attachments": {
|
|
"dropzone": "拖曳檔案至此或點擊上傳",
|
|
"maxFileSize": "檔案大小上限:{{size}}",
|
|
"uploading": "正在上傳 {{filename}} ({{current}}/{{total}})...",
|
|
"uploadFailed": "上傳失敗"
|
|
}
|
|
}
|