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,134 @@
{
"title": "Tasks",
"createTask": "Create Task",
"editTask": "Edit Task",
"deleteTask": "Delete Task",
"taskDetails": "Task Details",
"fields": {
"title": "Title",
"titlePlaceholder": "Enter task title",
"description": "Description",
"descriptionPlaceholder": "Enter task description",
"status": "Status",
"priority": "Priority",
"assignee": "Assignee",
"dueDate": "Due Date",
"startDate": "Start Date",
"estimatedHours": "Estimated Hours",
"actualHours": "Actual Hours",
"progress": "Progress",
"tags": "Tags",
"parent": "Parent Task",
"subtasks": "Subtasks",
"attachments": "Attachments",
"comments": "Comments",
"watchers": "Watchers",
"blockers": "Blockers"
},
"status": {
"todo": "To Do",
"in_progress": "In Progress",
"review": "In Review",
"done": "Done",
"cancelled": "Cancelled",
"blocked": "Blocked"
},
"priority": {
"low": "Low",
"medium": "Medium",
"high": "High",
"urgent": "Urgent"
},
"views": {
"list": "List",
"kanban": "Kanban",
"calendar": "Calendar",
"gantt": "Gantt",
"timeline": "Timeline"
},
"filters": {
"all": "All Tasks",
"myTasks": "My Tasks",
"unassigned": "Unassigned",
"overdue": "Overdue",
"dueThisWeek": "Due This Week",
"highPriority": "High Priority",
"recentlyUpdated": "Recently Updated"
},
"sort": {
"sortBy": "Sort by",
"dueDate": "Due Date",
"priority": "Priority",
"status": "Status",
"title": "Title",
"createdAt": "Created At",
"updatedAt": "Updated At",
"ascending": "Ascending",
"descending": "Descending"
},
"actions": {
"assign": "Assign",
"reassign": "Reassign",
"changeStatus": "Change Status",
"changePriority": "Change Priority",
"addSubtask": "Add Subtask",
"addComment": "Add Comment",
"addAttachment": "Add Attachment",
"addWatcher": "Add Watcher",
"removeWatcher": "Remove Watcher",
"duplicate": "Duplicate Task",
"archive": "Archive",
"restore": "Restore",
"moveToProject": "Move to Project"
},
"subtasks": {
"title": "Subtasks",
"add": "Add Subtask",
"placeholder": "Enter subtask title",
"completed": "{{count}} / {{total}} completed",
"empty": "No subtasks"
},
"comments": {
"title": "Comments",
"add": "Add Comment",
"placeholder": "Write your comment...",
"edited": "edited",
"delete": "Delete Comment",
"confirmDelete": "Are you sure you want to delete this comment?",
"empty": "No comments yet",
"reply": "Reply"
},
"attachments": {
"title": "Attachments",
"add": "Add Attachment",
"upload": "Upload File",
"dragDrop": "Drag and drop files here or click to upload",
"maxSize": "Max file size: {{size}}MB",
"downloading": "Downloading...",
"empty": "No attachments"
},
"blockers": {
"title": "Blockers",
"add": "Add Blocker",
"blockedBy": "Blocked by",
"blocking": "Blocking",
"remove": "Remove blocker",
"empty": "No blockers"
},
"messages": {
"created": "Task created",
"updated": "Task updated",
"deleted": "Task deleted",
"statusChanged": "Status changed to \"{{status}}\"",
"assigned": "Assigned to {{assignee}}",
"unassigned": "Unassigned",
"commentAdded": "Comment added",
"attachmentUploaded": "Attachment uploaded",
"confirmDelete": "Are you sure you want to delete this task? This action cannot be undone."
},
"empty": {
"title": "No Tasks",
"description": "There are no tasks yet. Create your first task to get started!",
"filtered": "No tasks match your filters"
}
}