refactor(i18n): route claude pane labels through the catalog (T-464)

Migrate the hardcoded user-facing strings across builtin.claude — composer,
conversation cards/segments, permission + AskUserQuestion prompts, task dock,
meta-sidebar (activity/config/team/roster), session/model pickers — to
ClideSettings.i18n.string/.interpolated, English kept as the placeholder;
builtin.claude_en_us.json extended to cover them. Context threaded into the
context-free render helpers (toolInputBody chain, _ConversationTurn) the same
way the mono family already is. No en_US behaviour change (D-21).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-18 21:19:19 +02:00
co-authored by Claude Opus 4.8
parent 93aa9bc332
commit 16fe71cb3f
23 changed files with 870 additions and 193 deletions
@@ -3,5 +3,167 @@
"status.attaching": { "translation": "attaching…" },
"status.no-tmux": { "translation": "no-tmux · fresh every launch" },
"status.exited": { "translation": "session exited" },
"status.primary-exited": { "translation": "session exited — restart clide to retry" }
"status.primary-exited": { "translation": "session exited — restart clide to retry" },
"banner.title": { "translation": "Claude" },
"banner.warmingUp": { "translation": "Warming up — your conversation will appear here." },
"composer.hint": { "translation": "Message Claude… (Enter to send · Shift+Enter for newline)" },
"composer.stop": { "translation": "Stop ⎋" },
"composer.stop.hint": { "translation": "Interrupt the running turn (Escape)" },
"composer.removeAttachment": { "translation": "Remove {name}" },
"pane.starting": { "translation": "starting…" },
"pane.modeBadge.semantics": { "translation": "permission mode: {mode}" },
"running.semantics": { "translation": "Claude is running" },
"conversation.empty": { "translation": "Waiting for Claude…" },
"conversation.label.you": { "translation": "you" },
"conversation.label.claude": { "translation": "claude" },
"conversation.label.clide": { "translation": "clide" },
"conversation.label.agent": { "translation": "agent" },
"conversation.label.agentPrompt": { "translation": "agent prompt" },
"conversation.label.context": { "translation": "context" },
"conversation.label.thinking": { "translation": "thinking" },
"conversation.label.agentThinking": { "translation": "agent thinking" },
"conversation.label.image": { "translation": "image" },
"conversation.label.agentRun": { "translation": "agent run" },
"conversation.label.workflow": { "translation": "workflow" },
"conversation.label.error": { "translation": "error" },
"conversation.label.result": { "translation": "result" },
"conversation.label.denied": { "translation": "denied" },
"conversation.segment.prompt": { "translation": "prompt" },
"conversation.segment.result": { "translation": "result" },
"conversation.segment.liveTail": { "translation": "live tail" },
"conversation.segment.usage": { "translation": "usage" },
"conversation.segment.script": { "translation": "script" },
"conversation.workflow.launching": { "translation": "Launching…" },
"conversation.imagePlaceholder": { "translation": "could not load {path}" },
"conversation.bashTail.empty": { "translation": "no independent source to follow" },
"conversation.bashTail.label": { "translation": "live tail" },
"conversation.cluster.activity": { "translation": "Activity" },
"conversation.cluster.edits": { "translation": "Edits" },
"prompt.permission.allow": { "translation": "1. Allow" },
"prompt.permission.allowRemember": { "translation": "2. Allow & don't ask again" },
"prompt.permission.deny": { "translation": "{n}. Deny" },
"prompt.permission.denySimplify": { "translation": "{n}. Deny & simplify" },
"prompt.permission.denySimplify.tooltip": { "translation": "Deny and ask Claude to retry this action in a simpler format — complex interactions don't work well with the permission system." },
"prompt.permission.note.placeholder": { "translation": "add a note (optional) — sent to Claude" },
"prompt.permission.label": { "translation": "permission · {name}" },
"prompt.question.label": { "translation": "question" },
"prompt.review.label": { "translation": "review" },
"prompt.review.title": { "translation": "Review your answers" },
"prompt.submit": { "translation": "Submit" },
"prompt.submitAnswers": { "translation": "Submit answers" },
"prompt.back": { "translation": " Back" },
"prompt.next": { "translation": "Next " },
"prompt.reviewNav": { "translation": "Review " },
"prompt.nav.review": { "translation": "Review" },
"prompt.option.other": { "translation": "Other…" },
"prompt.other.placeholder": { "translation": "type your answer…" },
"prompt.note.placeholder": { "translation": "+ note (optional)" },
"prompt.chatInstead": { "translation": "chat instead" },
"tool.edit.before": { "translation": "— before" },
"tool.edit.after": { "translation": "+ after" },
"tool.bash.background": { "translation": "background" },
"permissionControl.semantics": { "translation": "permission mode: {mode}. Activate to change." },
"permissionControl.tooltip": { "translation": "Permission mode: {mode} — change (Ctrl/Cmd+M cycles)" },
"permissionBadge.tooltip": { "translation": "Permission mode: {mode}. Click to cycle default/acceptEdits/plan; Shift-click for bypassPermissions." },
"permissionBadge.semantics": { "translation": "Permission mode: {label}" },
"card.expand": { "translation": "Expand" },
"card.collapse": { "translation": "Collapse" },
"card.succeeded": { "translation": "succeeded" },
"card.failed": { "translation": "failed" },
"card.copy": { "translation": "copy" },
"taskDock.summary": { "translation": "{count} {tasks} · {done} done" },
"taskDock.task.singular": { "translation": "task" },
"taskDock.task.plural": { "translation": "tasks" },
"taskDock.collapse": { "translation": "Collapse tasks" },
"taskDock.expand": { "translation": "Expand tasks" },
"taskDock.semantics": { "translation": "Claude task list, {summary}, {state}" },
"taskDock.state.expanded": { "translation": "expanded" },
"taskDock.state.collapsed": { "translation": "collapsed" },
"taskDock.status.done": { "translation": "done" },
"taskDock.status.inProgress": { "translation": "in progress" },
"taskDock.status.pending": { "translation": "pending" },
"taskDock.row.semantics": { "translation": "{text}, {status}" },
"sessionPicker.title": { "translation": "Resume a Claude session" },
"sessionPicker.empty": { "translation": "No sessions found for this workspace." },
"modelPicker.cancel": { "translation": "cancel" },
"image.semantics": { "translation": "Image {name}" },
"activity.section.session": { "translation": "SESSION" },
"activity.control.clear": { "translation": "clear" },
"activity.control.compact": { "translation": "compact" },
"activity.control.fork": { "translation": "fork" },
"activity.control.resume": { "translation": "resume" },
"activity.control.refreshUsage": { "translation": "refresh usage" },
"activity.control.semantics": { "translation": "{label} session" },
"activity.control.tooltip": { "translation": "{label} · {command}" },
"activity.empty": { "translation": "No activity recorded yet." },
"activity.section.workflows": { "translation": "WORKFLOWS" },
"activity.workflow.fallback": { "translation": "workflow" },
"activity.workflow.done": { "translation": "done" },
"activity.workflow.starting": { "translation": "starting" },
"activity.section.usage": { "translation": "USAGE" },
"activity.row.session": { "translation": "session" },
"activity.row.weekAll": { "translation": "week (all)" },
"activity.row.weekSonnet": { "translation": "week (sonnet)" },
"activity.section.today": { "translation": "TODAY" },
"activity.row.messages": { "translation": "messages" },
"activity.row.sessions": { "translation": "sessions" },
"activity.row.toolCalls": { "translation": "tool calls" },
"activity.section.lifetime": { "translation": "LIFETIME" },
"activity.section.runtime": { "translation": "RUNTIME · primary" },
"activity.row.model": { "translation": "model" },
"activity.row.effort": { "translation": "effort" },
"activity.row.context": { "translation": "context" },
"activity.row.mode": { "translation": "mode" },
"activity.row.skills": { "translation": "skills" },
"config.empty": { "translation": "Claude environment not loaded." },
"config.section.settings": { "translation": "SETTINGS" },
"config.row.model": { "translation": "model" },
"config.row.effort": { "translation": "effort" },
"config.row.permissionMode": { "translation": "permission mode" },
"config.row.outputStyle": { "translation": "output style" },
"config.row.source": { "translation": "source" },
"config.row.source.value": { "translation": "~/.claude + .claude" },
"config.footer": { "translation": "expand a list to see all · click a skill/agent/command → opens its .md" },
"config.section.skills": { "translation": "SKILLS" },
"config.section.agents": { "translation": "AGENTS" },
"config.section.commands": { "translation": "COMMANDS" },
"config.section.hooks": { "translation": "HOOKS" },
"config.section.permissions": { "translation": "PERMISSIONS" },
"config.section.mcpServers": { "translation": "MCP SERVERS" },
"config.perm.allow": { "translation": "allow" },
"config.perm.ask": { "translation": "ask" },
"config.perm.deny": { "translation": "deny" },
"config.control.semantics": { "translation": "{label}: {value}. Click to change." },
"config.control.tooltip": { "translation": "change {label}" },
"config.control.option.semantics": { "translation": "{label}: {name}" },
"roster.bypass.confirmBody": { "translation": "Enable bypassPermissions? All tool calls will be auto-allowed." },
"roster.bypass.confirm.semantics": { "translation": "Confirm bypass" },
"roster.bypass.confirm.tooltip": { "translation": "Confirm" },
"roster.bypass.ok": { "translation": "OK" },
"roster.bypass.cancel.semantics": { "translation": "Cancel bypass" },
"roster.bypass.cancel.tooltip": { "translation": "Cancel" },
"roster.bypass.cancel": { "translation": "Cancel" },
"roster.hidePane": { "translation": "Hide pane" },
"roster.showPane": { "translation": "Show pane" },
"roster.unmute": { "translation": "Unmute messages" },
"roster.mute": { "translation": "Mute messages" },
"roster.inject": { "translation": "Inject message" },
"roster.fork": { "translation": "Fork session" },
"roster.close": { "translation": "Close session" },
"roster.inject.cancel": { "translation": "Cancel" },
"taskRow.reassign": { "translation": "Reassign task" },
"team.empty": { "translation": "No team active." },
"team.section.tasks": { "translation": "TASKS" },
"tabStrip.activity": { "translation": "Activity" },
"tabStrip.team": { "translation": "Team" },
"tabStrip.team.count": { "translation": "Team · {count}" },
"tabStrip.config": { "translation": "Config" },
"teamChat.section.messages": { "translation": "MESSAGES" },
"teamChat.popOut.semantics": { "translation": "Open full chat pane" },
"teamChat.popOut.tooltip": { "translation": "Open full chat" },
"teamChat.empty": { "translation": "No messages yet." },
"teamChat.composer.placeholder": { "translation": "@name or @team …" },
"teamChat.pane.title": { "translation": "Team Chat" },
"teamChat.interrupt.semantics": { "translation": "Interrupt target session" },
"teamChat.interrupt.label": { "translation": "Interrupt" }
}