diff --git a/apps/frontend/src/renderer/components/ChatHistorySidebar.tsx b/apps/frontend/src/renderer/components/ChatHistorySidebar.tsx index be826def..2d6e9108 100644 --- a/apps/frontend/src/renderer/components/ChatHistorySidebar.tsx +++ b/apps/frontend/src/renderer/components/ChatHistorySidebar.tsx @@ -1,4 +1,5 @@ import { useState } from 'react'; +import { useTranslation } from 'react-i18next'; import { Plus, MessageSquare, @@ -12,6 +13,7 @@ import { import { Button } from './ui/button'; import { Input } from './ui/input'; import { ScrollArea } from './ui/scroll-area'; +import { Tooltip, TooltipContent, TooltipTrigger } from './ui/tooltip'; import { DropdownMenu, DropdownMenuContent, @@ -50,6 +52,7 @@ export function ChatHistorySidebar({ onDeleteSession, onRenameSession }: ChatHistorySidebarProps) { + const { t } = useTranslation('common'); const [editingId, setEditingId] = useState(null); const [editTitle, setEditTitle] = useState(''); const [deleteSessionId, setDeleteSessionId] = useState(null); @@ -111,15 +114,20 @@ export function ChatHistorySidebar({ {/* Header */}

Chat History

- + + + + + {t('accessibility.newConversationAriaLabel')} +
{/* Session list */} @@ -205,6 +213,7 @@ function SessionItem({ onEditTitleChange, onDelete }: SessionItemProps) { + const { t } = useTranslation('common'); const handleKeyDown = (e: React.KeyboardEvent) => { if (e.key === 'Enter') { e.preventDefault(); @@ -229,6 +238,7 @@ function SessionItem({ size="icon" className="h-7 w-7 shrink-0" onClick={onSaveEdit} + aria-label={t('accessibility.saveEditAriaLabel')} > @@ -237,6 +247,7 @@ function SessionItem({ size="icon" className="h-7 w-7 shrink-0" onClick={onCancelEdit} + aria-label={t('accessibility.cancelEditAriaLabel')} > @@ -282,6 +293,7 @@ function SessionItem({ variant="ghost" size="icon" className="absolute right-1 top-1/2 -translate-y-1/2 h-6 w-6 opacity-0 group-hover:opacity-100 data-[state=open]:opacity-100 hover:bg-muted-foreground/20 transition-opacity" + aria-label={t('accessibility.moreOptionsAriaLabel')} > diff --git a/apps/frontend/src/renderer/components/KanbanBoard.tsx b/apps/frontend/src/renderer/components/KanbanBoard.tsx index 4eb3c134..30fc3c10 100644 --- a/apps/frontend/src/renderer/components/KanbanBoard.tsx +++ b/apps/frontend/src/renderer/components/KanbanBoard.tsx @@ -261,6 +261,7 @@ const DroppableColumn = memo(function DroppableColumn({ status, tasks, onTaskCli )} onClick={onToggleArchived} aria-pressed={showArchived} + aria-label={t('common:accessibility.toggleShowArchivedAriaLabel')} > diff --git a/apps/frontend/src/renderer/components/github-issues/components/IssueDetail.tsx b/apps/frontend/src/renderer/components/github-issues/components/IssueDetail.tsx index df699fd1..87d2a56b 100644 --- a/apps/frontend/src/renderer/components/github-issues/components/IssueDetail.tsx +++ b/apps/frontend/src/renderer/components/github-issues/components/IssueDetail.tsx @@ -1,3 +1,4 @@ +import { useTranslation } from 'react-i18next'; import { ExternalLink, User, Clock, MessageCircle, Sparkles, CheckCircle2, Eye } from 'lucide-react'; import { Badge } from '../../ui/badge'; import { Button } from '../../ui/button'; @@ -22,6 +23,7 @@ export function IssueDetail({ autoFixConfig, autoFixQueueItem, }: IssueDetailProps) { + const { t } = useTranslation('common'); // Determine which task ID to use - either already linked or just created const taskId = linkedTaskId || (investigationResult?.success ? investigationResult.taskId : undefined); const hasLinkedTask = !!taskId; @@ -47,7 +49,7 @@ export function IssueDetail({ #{issue.number} - - Convert to Task + {t('accessibility.convertToTaskAriaLabel')} @@ -150,11 +154,12 @@ export function IdeaCard({ idea, isSelected, onClick, onConvert, onGoToTask, onD e.stopPropagation(); onDismiss(idea); }} + aria-label={t('accessibility.dismissAriaLabel')} > - Dismiss + {t('accessibility.dismissAriaLabel')} )} @@ -171,11 +176,12 @@ export function IdeaCard({ idea, isSelected, onClick, onConvert, onGoToTask, onD e.stopPropagation(); onGoToTask(idea.taskId!); }} + aria-label={t('accessibility.goToTaskAriaLabel')} > - Go to Task + {t('accessibility.goToTaskAriaLabel')} )} @@ -192,11 +198,12 @@ export function IdeaCard({ idea, isSelected, onClick, onConvert, onGoToTask, onD e.stopPropagation(); onGoToTask(idea.taskId!); }} + aria-label={t('accessibility.goToTaskAriaLabel')} > - Go to Task + {t('accessibility.goToTaskAriaLabel')} )} diff --git a/apps/frontend/src/renderer/components/ideation/IdeaDetailPanel.tsx b/apps/frontend/src/renderer/components/ideation/IdeaDetailPanel.tsx index 35b426b2..ec4b9475 100644 --- a/apps/frontend/src/renderer/components/ideation/IdeaDetailPanel.tsx +++ b/apps/frontend/src/renderer/components/ideation/IdeaDetailPanel.tsx @@ -1,3 +1,4 @@ +import { useTranslation } from 'react-i18next'; import { ChevronRight, ExternalLink, Lightbulb, Play, X } from 'lucide-react'; import { Button } from '../ui/button'; import { Badge } from '../ui/badge'; @@ -32,6 +33,7 @@ interface IdeaDetailPanelProps { } export function IdeaDetailPanel({ idea, onClose, onConvert, onGoToTask, onDismiss }: IdeaDetailPanelProps) { + const { t } = useTranslation('common'); const isDismissed = idea.status === 'dismissed'; const isConverted = idea.status === 'converted'; @@ -54,7 +56,7 @@ export function IdeaDetailPanel({ idea, onClose, onConvert, onGoToTask, onDismis

{idea.title}

- diff --git a/apps/frontend/src/renderer/components/ideation/IdeationHeader.tsx b/apps/frontend/src/renderer/components/ideation/IdeationHeader.tsx index b6e811bb..fc439b31 100644 --- a/apps/frontend/src/renderer/components/ideation/IdeationHeader.tsx +++ b/apps/frontend/src/renderer/components/ideation/IdeationHeader.tsx @@ -1,3 +1,4 @@ +import { useTranslation } from 'react-i18next'; import { Lightbulb, Eye, EyeOff, Settings2, Plus, Trash2, RefreshCw, CheckSquare, X } from 'lucide-react'; import { Button } from '../ui/button'; import { Badge } from '../ui/badge'; @@ -39,6 +40,7 @@ export function IdeationHeader({ hasActiveIdeas, canAddMore }: IdeationHeaderProps) { + const { t } = useTranslation('common'); const hasSelection = selectedCount > 0; return (
@@ -75,11 +77,12 @@ export function IdeationHeader({ variant="ghost" size="icon" onClick={onClearSelection} + aria-label={t('accessibility.clearSelectionAriaLabel')} > - Clear selection + {t('accessibility.clearSelectionAriaLabel')}
@@ -91,11 +94,12 @@ export function IdeationHeader({ variant="ghost" size="icon" onClick={onSelectAll} + aria-label={t('accessibility.selectAllAriaLabel')} > - Select all + {t('accessibility.selectAllAriaLabel')} ) )} @@ -107,12 +111,13 @@ export function IdeationHeader({ variant={showDismissed ? 'secondary' : 'outline'} size="icon" onClick={onToggleShowDismissed} + aria-label={showDismissed ? t('accessibility.hideDismissedAriaLabel') : t('accessibility.showDismissedAriaLabel')} > {showDismissed ? : } - {showDismissed ? 'Hide dismissed' : 'Show dismissed'} + {showDismissed ? t('accessibility.hideDismissedAriaLabel') : t('accessibility.showDismissedAriaLabel')} @@ -121,11 +126,12 @@ export function IdeationHeader({ variant="outline" size="icon" onClick={onOpenConfig} + aria-label={t('accessibility.configureAriaLabel')} > - Configure + {t('accessibility.configureAriaLabel')} {canAddMore && ( @@ -133,12 +139,13 @@ export function IdeationHeader({ - Add more ideation types + {t('accessibility.addMoreAriaLabel')} )} {hasActiveIdeas && !hasSelection && ( @@ -149,20 +156,21 @@ export function IdeationHeader({ size="icon" className="text-muted-foreground hover:text-destructive" onClick={onDismissAll} + aria-label={t('accessibility.dismissAllAriaLabel')} > - Dismiss all ideas + {t('accessibility.dismissAllAriaLabel')} )} - - Regenerate Ideas + {t('accessibility.regenerateIdeasAriaLabel')}
diff --git a/apps/frontend/src/renderer/components/settings/AdvancedSettings.tsx b/apps/frontend/src/renderer/components/settings/AdvancedSettings.tsx index 5b58abe2..ac3d05fa 100644 --- a/apps/frontend/src/renderer/components/settings/AdvancedSettings.tsx +++ b/apps/frontend/src/renderer/components/settings/AdvancedSettings.tsx @@ -362,6 +362,7 @@ export function AdvancedSettings({ settings, onSettingsChange, section, version size="icon" className="h-6 w-6" onClick={dismissStableDowngrade} + aria-label={t('common:accessibility.dismissAriaLabel')} > diff --git a/apps/frontend/src/renderer/components/settings/DevToolsSettings.tsx b/apps/frontend/src/renderer/components/settings/DevToolsSettings.tsx index 2dd82d62..24e1cd65 100644 --- a/apps/frontend/src/renderer/components/settings/DevToolsSettings.tsx +++ b/apps/frontend/src/renderer/components/settings/DevToolsSettings.tsx @@ -293,6 +293,7 @@ export function DevToolsSettings({ settings, onSettingsChange }: DevToolsSetting handleCustomIDEPathChange(result); } }} + aria-label={t('common:accessibility.browseFilesAriaLabel')} > @@ -354,6 +355,7 @@ export function DevToolsSettings({ settings, onSettingsChange }: DevToolsSetting handleCustomTerminalPathChange(result); } }} + aria-label={t('common:accessibility.browseFilesAriaLabel')} > diff --git a/apps/frontend/src/renderer/components/settings/IntegrationSettings.tsx b/apps/frontend/src/renderer/components/settings/IntegrationSettings.tsx index 6cfbc706..fbc0dfa0 100644 --- a/apps/frontend/src/renderer/components/settings/IntegrationSettings.tsx +++ b/apps/frontend/src/renderer/components/settings/IntegrationSettings.tsx @@ -25,6 +25,7 @@ import { Input } from '../ui/input'; import { Label } from '../ui/label'; import { Switch } from '../ui/switch'; import { cn } from '../../lib/utils'; +import { Tooltip, TooltipContent, TooltipTrigger } from '../ui/tooltip'; import { SettingsSection } from './SettingsSection'; import { loadClaudeProfiles as loadGlobalClaudeProfiles } from '../../stores/claude-profile-store'; import { useClaudeLoginTerminal } from '../../hooks/useClaudeLoginTerminal'; @@ -358,6 +359,7 @@ export function IntegrationSettings({ settings, onSettingsChange, isOpen }: Inte size="icon" onClick={handleRenameProfile} className="h-7 w-7 text-success hover:text-success hover:bg-success/10" + aria-label={t('common:accessibility.saveEditAriaLabel')} > @@ -366,6 +368,7 @@ export function IntegrationSettings({ settings, onSettingsChange, isOpen }: Inte size="icon" onClick={cancelEditingProfile} className="h-7 w-7 text-muted-foreground hover:text-foreground" + aria-label={t('common:accessibility.cancelEditAriaLabel')} > @@ -422,20 +425,25 @@ export function IntegrationSettings({ settings, onSettingsChange, isOpen }: Inte ) : ( /* Re-authenticate button for already authenticated profiles */ - + + + + + {t('common:accessibility.reAuthenticateProfileAriaLabel')} + )} {profile.id !== activeProfileId && ( - + + + + + + {expandedTokenProfileId === profile.id ? t('common:accessibility.hideTokenEntryAriaLabel') : t('common:accessibility.enterTokenManuallyAriaLabel')} + + + + + + + {t('common:accessibility.renameProfileAriaLabel')} + {!profile.isDefault && ( - + + + + + {t('common:accessibility.deleteProfileAriaLabel')} + )} )} diff --git a/apps/frontend/src/shared/i18n/locales/en/common.json b/apps/frontend/src/shared/i18n/locales/en/common.json index 426e32fd..4c66de42 100644 --- a/apps/frontend/src/shared/i18n/locales/en/common.json +++ b/apps/frontend/src/shared/i18n/locales/en/common.json @@ -21,7 +21,38 @@ "learnMoreAriaLabel": "Learn more (opens in new window)", "toggleFolder": "Toggle {{name}} folder", "expandFolder": "Expand {{name}} folder", - "collapseFolder": "Collapse {{name}} folder" + "collapseFolder": "Collapse {{name}} folder", + "newConversationAriaLabel": "New conversation", + "saveEditAriaLabel": "Save", + "cancelEditAriaLabel": "Cancel", + "moreOptionsAriaLabel": "More options", + "closePanelAriaLabel": "Close panel", + "openOnGitHubAriaLabel": "Open on GitHub (opens in new window)", + "openOnGitLabAriaLabel": "Open on GitLab (opens in new window)", + "toggleShowArchivedAriaLabel": "Toggle show archived tasks", + "clearSelectionAriaLabel": "Clear selection", + "selectAllAriaLabel": "Select all", + "showDismissedAriaLabel": "Show dismissed", + "hideDismissedAriaLabel": "Hide dismissed", + "configureAriaLabel": "Configure", + "addMoreAriaLabel": "Add more", + "dismissAllAriaLabel": "Dismiss all ideas", + "regenerateIdeasAriaLabel": "Regenerate ideas", + "dismissAriaLabel": "Dismiss", + "browseFilesAriaLabel": "Browse files", + "renameAriaLabel": "Rename", + "deleteAriaLabel": "Delete", + "refreshAriaLabel": "Refresh", + "expandAriaLabel": "Expand", + "collapseAriaLabel": "Collapse", + "selectIdeaAriaLabel": "Select idea: {{title}}", + "convertToTaskAriaLabel": "Convert to task", + "goToTaskAriaLabel": "Go to task", + "reAuthenticateProfileAriaLabel": "Re-authenticate profile", + "hideTokenEntryAriaLabel": "Hide token entry", + "enterTokenManuallyAriaLabel": "Enter token manually", + "renameProfileAriaLabel": "Rename profile", + "deleteProfileAriaLabel": "Delete profile" }, "buttons": { "save": "Save", diff --git a/apps/frontend/src/shared/i18n/locales/fr/common.json b/apps/frontend/src/shared/i18n/locales/fr/common.json index dbec9b02..85caf6fc 100644 --- a/apps/frontend/src/shared/i18n/locales/fr/common.json +++ b/apps/frontend/src/shared/i18n/locales/fr/common.json @@ -21,7 +21,38 @@ "learnMoreAriaLabel": "En savoir plus (s'ouvre dans une nouvelle fenêtre)", "toggleFolder": "Basculer le dossier {{name}}", "expandFolder": "Déplier le dossier {{name}}", - "collapseFolder": "Replier le dossier {{name}}" + "collapseFolder": "Replier le dossier {{name}}", + "newConversationAriaLabel": "Nouvelle conversation", + "saveEditAriaLabel": "Enregistrer", + "cancelEditAriaLabel": "Annuler", + "moreOptionsAriaLabel": "Plus d'options", + "closePanelAriaLabel": "Fermer le panneau", + "openOnGitHubAriaLabel": "Ouvrir sur GitHub (s'ouvre dans une nouvelle fenêtre)", + "openOnGitLabAriaLabel": "Ouvrir sur GitLab (s'ouvre dans une nouvelle fenêtre)", + "toggleShowArchivedAriaLabel": "Afficher/masquer les tâches archivées", + "clearSelectionAriaLabel": "Effacer la sélection", + "selectAllAriaLabel": "Tout sélectionner", + "showDismissedAriaLabel": "Afficher les rejetées", + "hideDismissedAriaLabel": "Masquer les rejetées", + "configureAriaLabel": "Configurer", + "addMoreAriaLabel": "Ajouter plus", + "dismissAllAriaLabel": "Rejeter toutes les idées", + "regenerateIdeasAriaLabel": "Régénérer les idées", + "dismissAriaLabel": "Ignorer", + "browseFilesAriaLabel": "Parcourir les fichiers", + "renameAriaLabel": "Renommer", + "deleteAriaLabel": "Supprimer", + "refreshAriaLabel": "Actualiser", + "expandAriaLabel": "Développer", + "collapseAriaLabel": "Réduire", + "selectIdeaAriaLabel": "Sélectionner l'idée : {{title}}", + "convertToTaskAriaLabel": "Convertir en tâche", + "goToTaskAriaLabel": "Aller à la tâche", + "reAuthenticateProfileAriaLabel": "Ré-authentifier le profil", + "hideTokenEntryAriaLabel": "Masquer la saisie du jeton", + "enterTokenManuallyAriaLabel": "Saisir le jeton manuellement", + "renameProfileAriaLabel": "Renommer le profil", + "deleteProfileAriaLabel": "Supprimer le profil" }, "buttons": { "save": "Enregistrer",