Improve task management by adding translations for all app features

Implement i18n support by adding new translation keys for Calendar, Kanban Board, and TaskCard components, and update existing translations in de.json and en.json.

Replit-Commit-Author: Agent
Replit-Commit-Session-Id: ceced2fc-aa46-458d-ba87-ddd4b7bb1518
Replit-Commit-Checkpoint-Type: intermediate_checkpoint
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/659922a9-0087-461c-90dd-6d9a58b81d4d/ceced2fc-aa46-458d-ba87-ddd4b7bb1518/nn5bWKE
This commit is contained in:
paul-nothaft
2025-10-24 06:05:04 +00:00
parent b74a290337
commit 8fe1c66d70
6 changed files with 120 additions and 46 deletions
+12 -10
View File
@@ -1,3 +1,4 @@
import { useTranslation } from 'react-i18next';
import { Card } from "@/components/ui/card";
import { Button } from "@/components/ui/button";
import { Badge } from "@/components/ui/badge";
@@ -23,6 +24,7 @@ interface TaskCardProps {
}
export default function TaskCard({ task, onStartTimer, onStopTimer, onEdit, onDelete, onStatusChange, isDragging }: TaskCardProps) {
const { t } = useTranslation();
// Fetch labels to get the label color
const { data: labels = [] } = useQuery<Label[]>({
@@ -105,7 +107,7 @@ export default function TaskCard({ task, onStartTimer, onStopTimer, onEdit, onDe
className={`text-xs ${getPriorityColor(task.priority)}`}
data-testid={`badge-priority-${task.id}`}
>
{task.priority}
{t(`priority.${task.priority}`)}
</Badge>
<Badge
@@ -113,7 +115,7 @@ export default function TaskCard({ task, onStartTimer, onStopTimer, onEdit, onDe
className={`text-xs ${getStatusColor(task.status)}`}
data-testid={`badge-status-${task.id}`}
>
{task.status.replace(/([A-Z])/g, ' $1').toLowerCase()}
{t(`status.${task.status}`)}
</Badge>
{task.dueDate && (
@@ -134,7 +136,7 @@ export default function TaskCard({ task, onStartTimer, onStopTimer, onEdit, onDe
className={task.isTracking ? 'text-primary font-medium' : 'text-muted-foreground'}
>
{task.timeTracked > 0 ? formatTime(task.timeTracked) : '0m'}
{task.isTracking && ' (running)'}
{task.isTracking && ` (${t('taskCard.running')})`}
</span>
</div>
)}
@@ -163,7 +165,7 @@ export default function TaskCard({ task, onStartTimer, onStopTimer, onEdit, onDe
data-testid={`menu-edit-${task.id}`}
>
<Edit className="w-4 h-4 mr-2" />
Edit Task
{t('taskCard.editTask')}
</DropdownMenuItem>
<DropdownMenuItem
@@ -174,7 +176,7 @@ export default function TaskCard({ task, onStartTimer, onStopTimer, onEdit, onDe
data-testid={`menu-timer-${task.id}`}
>
<Timer className="w-4 h-4 mr-2" />
{task.isTracking ? 'Stop Timer' : 'Start Timer'}
{task.isTracking ? t('taskCard.stopTimer') : t('taskCard.startTimer')}
</DropdownMenuItem>
<DropdownMenuSeparator />
@@ -189,7 +191,7 @@ export default function TaskCard({ task, onStartTimer, onStopTimer, onEdit, onDe
data-testid={`menu-complete-${task.id}`}
>
<CheckCircle className="w-4 h-4 mr-2" />
Mark as Done
{t('taskCard.markAsDone')}
</DropdownMenuItem>
)}
@@ -203,7 +205,7 @@ export default function TaskCard({ task, onStartTimer, onStopTimer, onEdit, onDe
data-testid={`menu-start-${task.id}`}
>
<Play className="w-4 h-4 mr-2" />
Start Working
{t('taskCard.startWorking')}
</DropdownMenuItem>
)}
@@ -217,7 +219,7 @@ export default function TaskCard({ task, onStartTimer, onStopTimer, onEdit, onDe
data-testid={`menu-todo-${task.id}`}
>
<Clock className="w-4 h-4 mr-2" />
Move to Todo
{t('taskCard.moveToTodo')}
</DropdownMenuItem>
)}
@@ -231,7 +233,7 @@ export default function TaskCard({ task, onStartTimer, onStopTimer, onEdit, onDe
data-testid={`menu-reopen-${task.id}`}
>
<Play className="w-4 h-4 mr-2" />
Reopen Task
{t('taskCard.reopenTask')}
</DropdownMenuItem>
)}
@@ -248,7 +250,7 @@ export default function TaskCard({ task, onStartTimer, onStopTimer, onEdit, onDe
data-testid={`menu-delete-${task.id}`}
>
<Trash2 className="w-4 h-4 mr-2" />
Delete Task
{t('taskCard.deleteTask')}
</DropdownMenuItem>
)}
</DropdownMenuContent>