diff --git a/Cargo.lock b/Cargo.lock index 6c056fff3b..72f9982da6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -200,6 +200,15 @@ dependencies = [ "x11rb", ] +[[package]] +name = "arc-swap" +version = "1.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a3a1fd6f75306b68087b831f025c712524bcb19aad54e557b1129cfa0a2b207" +dependencies = [ + "rustversion", +] + [[package]] name = "arrayvec" version = "0.7.6" @@ -455,6 +464,12 @@ dependencies = [ "tracing", ] +[[package]] +name = "base62" +version = "2.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd637ac531c60eb7fbc4684dc061c2d7d90d73d758181aa02eeff0464b9eee4b" + [[package]] name = "base64" version = "0.22.1" @@ -853,8 +868,8 @@ dependencies = [ "serde", "serde_json", "tempfile", - "toml", - "toml_edit", + "toml 1.1.2+spec-1.1.0", + "toml_edit 0.23.10+spec-1.0.0", "tracing", ] @@ -1013,6 +1028,7 @@ dependencies = [ "regex", "reqwest 0.13.4", "rmcp", + "rust-i18n", "rustls", "schemars", "schemaui", @@ -1029,8 +1045,8 @@ dependencies = [ "tiny_http", "tokio", "tokio-util", - "toml", - "toml_edit", + "toml 1.1.2+spec-1.1.0", + "toml_edit 0.23.10+spec-1.0.0", "tower-http", "tracing", "tracing-subscriber", @@ -1334,7 +1350,7 @@ dependencies = [ "either", "futures", "gherkin", - "globwalk", + "globwalk 0.9.1", "humantime", "inventory", "itertools 0.14.0", @@ -2188,6 +2204,12 @@ dependencies = [ "typed-builder", ] +[[package]] +name = "glob" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" + [[package]] name = "globset" version = "0.4.18" @@ -2201,6 +2223,17 @@ dependencies = [ "regex-syntax 0.8.8", ] +[[package]] +name = "globwalk" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93e3af942408868f6934a7b85134a3230832b9977cf66125df2f9edcfce4ddcc" +dependencies = [ + "bitflags 1.3.2", + "ignore", + "walkdir", +] + [[package]] name = "globwalk" version = "0.9.1" @@ -2740,6 +2773,15 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" +dependencies = [ + "either", +] + [[package]] name = "itertools" version = "0.13.0" @@ -3349,6 +3391,15 @@ dependencies = [ "nom 8.0.0", ] +[[package]] +name = "normpath" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9985ef7269fa99f3b12437bb698381da2428743ab90f20393f399fa14cab21a" +dependencies = [ + "windows-sys 0.61.2", +] + [[package]] name = "nu-ansi-term" version = "0.50.3" @@ -3966,7 +4017,7 @@ version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" dependencies = [ - "toml_edit", + "toml_edit 0.23.10+spec-1.0.0", ] [[package]] @@ -4472,6 +4523,54 @@ dependencies = [ "smallvec", ] +[[package]] +name = "rust-i18n" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55691a65892c33ee2de49c15ea5600c6f4a70e8eeb8e6c3cd96d2a231d230c40" +dependencies = [ + "globwalk 0.8.1", + "regex", + "rust-i18n-macro", + "rust-i18n-support", + "smallvec", +] + +[[package]] +name = "rust-i18n-macro" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30de488acadcf767d97cd48518a8da8ea9777b1c9a5beca4eab78bbf77d07309" +dependencies = [ + "glob", + "proc-macro2", + "quote", + "rust-i18n-support", + "serde", + "serde_json", + "serde_yaml", + "syn 2.0.117", +] + +[[package]] +name = "rust-i18n-support" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aea0fef8a93c06326b66392c95a115120e609674cb2132d37d276a6b05b545b4" +dependencies = [ + "arc-swap", + "base62", + "globwalk 0.8.1", + "itertools 0.11.0", + "normpath", + "serde", + "serde_json", + "serde_yaml", + "siphasher", + "toml 0.8.23", + "triomphe", +] + [[package]] name = "rustc-hash" version = "2.1.2" @@ -4725,7 +4824,7 @@ dependencies = [ "serde_json", "sha2 0.11.0", "tokio", - "toml", + "toml 1.1.2+spec-1.1.0", "unicode-width 0.2.2", ] @@ -4884,6 +4983,15 @@ dependencies = [ "syn 2.0.117", ] +[[package]] +name = "serde_spanned" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" +dependencies = [ + "serde", +] + [[package]] name = "serde_spanned" version = "1.1.1" @@ -4905,6 +5013,19 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_yaml" +version = "0.9.34+deprecated" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" +dependencies = [ + "indexmap", + "itoa", + "ryu", + "serde", + "unsafe-libyaml", +] + [[package]] name = "serial2" version = "0.2.37" @@ -5655,6 +5776,18 @@ dependencies = [ "tokio", ] +[[package]] +name = "toml" +version = "0.8.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" +dependencies = [ + "serde", + "serde_spanned 0.6.9", + "toml_datetime 0.6.11", + "toml_edit 0.22.27", +] + [[package]] name = "toml" version = "1.1.2+spec-1.1.0" @@ -5663,13 +5796,22 @@ checksum = "81f3d15e84cbcd896376e6730314d59fb5a87f31e4b038454184435cd57defee" dependencies = [ "indexmap", "serde_core", - "serde_spanned", + "serde_spanned 1.1.1", "toml_datetime 1.1.1+spec-1.1.0", "toml_parser", "toml_writer", "winnow 1.0.2", ] +[[package]] +name = "toml_datetime" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" +dependencies = [ + "serde", +] + [[package]] name = "toml_datetime" version = "0.7.5+spec-1.1.0" @@ -5688,6 +5830,20 @@ dependencies = [ "serde_core", ] +[[package]] +name = "toml_edit" +version = "0.22.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" +dependencies = [ + "indexmap", + "serde", + "serde_spanned 0.6.9", + "toml_datetime 0.6.11", + "toml_write", + "winnow 0.7.14", +] + [[package]] name = "toml_edit" version = "0.23.10+spec-1.0.0" @@ -5710,6 +5866,12 @@ dependencies = [ "winnow 1.0.2", ] +[[package]] +name = "toml_write" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" + [[package]] name = "toml_writer" version = "1.1.1+spec-1.1.0" @@ -5829,6 +5991,17 @@ dependencies = [ "tracing-log", ] +[[package]] +name = "triomphe" +version = "0.1.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd69c5aa8f924c7519d6372789a74eac5b94fb0f8fcf0d4a97eb0bfc3e785f39" +dependencies = [ + "arc-swap", + "serde", + "stable_deref_trait", +] + [[package]] name = "try-lock" version = "0.2.5" @@ -5973,6 +6146,12 @@ version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" +[[package]] +name = "unsafe-libyaml" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861" + [[package]] name = "untrusted" version = "0.9.0" diff --git a/crates/tui/Cargo.toml b/crates/tui/Cargo.toml index d80e29c9de..b0135816a3 100644 --- a/crates/tui/Cargo.toml +++ b/crates/tui/Cargo.toml @@ -79,6 +79,7 @@ pdf-extract = "0.10" tar = "0.4" flate2 = "1.1" sha2 = "0.10" +rust-i18n = "4.1.0" [dev-dependencies] cucumber = "0.23.0" diff --git a/crates/tui/locales/en.json b/crates/tui/locales/en.json new file mode 100644 index 0000000000..4d30dfd42d --- /dev/null +++ b/crates/tui/locales/en.json @@ -0,0 +1,444 @@ +{ + "ComposerPlaceholder": "Write a task or use /.", + "HistorySearchPlaceholder": "Search prompt history...", + "HistorySearchTitle": "History Search", + "HistoryHintMove": "Up/Down move", + "HistoryHintAccept": "Enter accept", + "HistoryHintRestore": "Esc restore", + "HistoryNoMatches": " No matches", + "StatusPickerTitle": " Status line ", + "StatusPickerInstruction": "Pick the chips you want in the footer:", + "StatusPickerActionToggle": "toggle ", + "StatusPickerActionAll": "all ", + "StatusPickerActionNone": "none ", + "StatusPickerActionSave": "save ", + "StatusPickerActionCancel": "cancel ", + "ConfigTitle": "Session Configuration", + "ConfigModalTitle": " Config ", + "ConfigSearchPlaceholder": "type to filter", + "ConfigNoSettings": " No settings available.", + "ConfigNoMatchesPrefix": " No settings match ", + "ConfigFilteredSettings": " Filtered settings", + "ConfigShowing": " Showing", + "ConfigFooterDefault": " type=filter, Up/Down=select, Enter/e=edit, Esc/q=close ", + "ConfigFooterScrollable": " type=filter, Up/Down=select, Enter/e=edit, PgUp/PgDn=scroll, Esc/q=close ", + "ConfigFooterFiltered": " type=filter, Backspace=delete, Ctrl+U/Esc=clear, Enter=edit ", + "ConfigSectionProvider": "Provider", + "ConfigSectionModel": "Model", + "ConfigSectionPermissions": "Permissions", + "ConfigSectionNetwork": "Network", + "ConfigSectionDisplay": "Display", + "ConfigSectionComposer": "Composer", + "ConfigSectionSidebar": "Sidebar", + "ConfigSectionHistory": "History", + "ConfigSectionMcp": "MCP", + "ConfigSectionFleet": "Fleet", + "ConfigSectionExperimental": "Experimental", + "ConfigScopeSession": "SESSION", + "ConfigScopeSaved": "SAVED", + "ConfigEditCancelled": "Edit cancelled", + "ConfigEditTitlePrefix": "Edit ", + "ConfigEditScopeLabel": "Scope: ", + "ConfigEditCurrentLabel": "Current: ", + "ConfigEditHintLabel": "Hint: ", + "ConfigEditNewLabel": "New: ", + "ConfigEditFooter": " Enter=apply, Esc=cancel, Ctrl+U=clear, Ctrl+A=all, \u2190,/\u2192,=move ", + "ConfigRowEffective": " (effective {currency})", + "ConfigDefaultValue": "(default)", + "ConfigDefaultReasoning": "(config/default)", + "ConfigUnavailable": "(unavailable)", + "HelpTitle": "Help", + "HelpFilterPlaceholder": "Type to filter", + "HelpFilterPrefix": "Filter: ", + "HelpNoMatches": " No matches.", + "HelpSlashCommands": "Slash commands", + "HelpKeybindings": "Keybindings", + "HelpFooterTypeFilter": " type to filter ", + "HelpFooterMove": " Up/Down move ", + "HelpFooterJump": " PgUp/PgDn jump ", + "HelpFooterClose": " Esc close ", + "CmdAnchorDescription": "Pin a fact that survives compaction (auto-injected into context)", + "CmdAttachDescription": "Attach image/video media; use @path for text files or directories", + "CmdCacheDescription": "Show DeepSeek prefix-cache hit/miss stats for the last N turns", + "CmdChangeDescription": "Show the latest changelog entry", + "CmdChangeHeader": "Latest Changelog", + "CmdChangeTranslationQueued": "English release notes are shown below. A translated version will be requested next; if the provider is unavailable, this English text is the fallback.", + "CmdChangeTranslationUnavailable": "English release notes are shown below. Translation is unavailable because the current session has no API key or is offline.", + "CmdChangePreviousVersion": "Previous version: {version} — run `/change {version}` to view it", + "CmdBalanceDescription": "Check the active provider account balance", + "CmdClearDescription": "Clear conversation history", + "CmdCompactDescription": "Trigger context compaction to free up space", + "CmdPurgeDescription": "Let the agent surgically prune conversation history to free context space", + "CmdConfigDescription": "Open interactive configuration editor", + "CmdContextDescription": "Open context inspector or source-map report", + "CmdCostDescription": "Show session cost breakdown", + "CmdDiffDescription": "Show file changes since session start", + "CmdEditDescription": "Revise and resubmit the last message", + "CmdExitDescription": "Exit the application", + "CmdExportDescription": "Export conversation to markdown", + "CmdFeedbackDescription": "Generate a GitHub feedback URL", + "CmdHfDescription": "Inspect Hugging Face MCP setup and concepts", + "CmdHelpDescription": "Show help information", + "CmdProfileDescription": "Switch to a named config profile", + "CmdHomeDescription": "Show home dashboard with stats and quick actions", + "CmdHooksDescription": "List configured lifecycle hooks (read-only)", + "CmdAgentDescription": "Open a persistent sub-agent session: /agent [0-3] ", + "CmdGoalDescription": "Set a session goal with optional token budget", + "CmdInitDescription": "Generate AGENTS.md for project", + "CmdLspDescription": "Toggle LSP diagnostics on or off", + "CmdShareDescription": "Export current session as a shareable web URL", + "CmdJobsDescription": "Inspect and control background Bash jobs", + "CmdLinksDescription": "Show provider token, dashboard, and docs links", + "CmdLoadDescription": "Load session from file", + "CmdLogoutDescription": "Clear API key and return to setup", + "CmdMcpDescription": "Open or manage MCP servers", + "CmdPluginDescription": "List discovered plugin tools or show details for one", + "CmdPluginNoneFound": "No plugin tools discovered in {dir}", + "CmdPluginNotFound": "Plugin '{name}' not found", + "CmdPluginListHeader": "Plugin tools ({count}):", + "CmdPluginDetailDescription": "Description: {description}", + "CmdPluginDetailSchema": "Schema:\n{schema}", + "CmdPluginDetailApproval": "Approval: {approval}", + "CmdPluginDetailPath": "Path: {path}", + "CmdMemoryDescription": "Inspect or manage the persistent user-memory file", + "CmdModeDescription": "Switch mode or open picker: /mode [agent|plan|yolo|1|2|3]", + "CmdModelDescription": "Switch or view current model", + "CmdModelsDescription": "Toolbox: fetch live model IDs from the active API", + "CmdModelDbDescription": "Reference: browse the bundled model database", + "CmdNetworkDescription": "Manage network allow and deny rules", + "CmdNoteDescription": "Add, list, edit, or remove workspace notes", + "CmdThemeDescription": "Switch theme or open the theme picker", + "CmdProviderDescription": "Switch the active provider and/or model", + "CmdQueueDescription": "View or edit queued messages", + "CmdQueueUsage": "Usage: /queue [list|send |edit |drop |clear]", + "CmdQueueDraftHeader": "Editing queued message:", + "CmdQueueNoMessages": "No queued messages", + "CmdQueueListHeader": "Queued messages ({count}):", + "CmdQueueTip": "Tip: /queue send to send now, /queue drop to remove", + "CmdQueueAlreadyEditing": "Already editing a queued message. Send it or /queue clear to discard.", + "CmdQueueNotFound": "Queued message not found", + "CmdQueueEditingStatus": "Editing queued message {index}", + "CmdQueueEditingMessage": "Editing queued message {index} (press Enter to re-queue/send)", + "CmdQueueDropped": "Dropped queued message {index}", + "CmdQueueAlreadyEmpty": "Queue already empty", + "CmdQueueCleared": "Queue cleared", + "CmdQueueMissingIndex": "Missing index. Usage: /queue edit or /queue drop ", + "CmdQueueIndexPositive": "Index must be a positive number", + "CmdQueueIndexMin": "Index must be >= 1", + "CmdRelayDescription": "Create a session relay (接力) for a fresh thread", + "CmdRenameDescription": "Rename the current session", + "CmdRestoreDescription": "Roll back the workspace to a prior pre/post-turn snapshot. With no arg, lists recent snapshots.", + "CmdRetryDescription": "Retry the last request", + "CmdReviewDescription": "Run a structured code review on a file, diff, or PR", + "CmdRlmDescription": "Toolbox: open a persistent RLM context for a file or text", + "CmdSaveDescription": "Save session to file", + "CmdForkDescription": "Fork the active conversation into a sibling session", + "CmdNewDescription": "Start a fresh saved session", + "CmdSessionsDescription": "Open session history picker", + "CmdSettingsDescription": "Show persistent settings", + "CmdSidebarDescription": "Toggle or focus the right sidebar", + "CmdSkillDescription": "Activate a skill, or install/update/uninstall/trust a community skill", + "CmdSkillsDescription": "List local skills (filter by `/skills `; --remote browses the curated registry)", + "CmdSlopDescription": "Inspect or export the debt ledger", + "CmdStashDescription": "Park or restore a composer draft (Ctrl+S sends queued follow-up first; otherwise stash, /stash list/pop)", + "CmdStatusDescription": "Show runtime session status", + "CmdStatuslineDescription": "Configure which items appear in the footer", + "CmdFleetDescription": "Open Fleet setup or worker status", + "CmdHotbarDescription": "Open Hotbar setup", + "CmdSubagentsDescription": "Compatibility shortcut for /fleet status", + "CmdSystemDescription": "Show current system prompt", + "CmdTaskDescription": "Manage background tasks", + "CmdTokensDescription": "Show token usage for session", + "CmdTranslateDescription": "Toggle output translation to the current system language on/off", + "CmdTranslateOff": "Output translation disabled (original model output shown)", + "CmdTranslateOn": "Output translation enabled: model responses will be shown in your system language", + "TranslationInProgress": "Translating assistant output...", + "TranslationComplete": "Translation complete", + "TranslationFailed": "Translation failed", + "CmdTrustDescription": "Manage workspace trust and per-path allowlist (`/trust add `, `/trust list`, `/trust on|off`)", + "CmdWorkspaceDescription": "Show or switch the current workspace", + "CmdUndoDescription": "Remove last message pair", + "CmdVerboseDescription": "Toggle full live thinking in the transcript", + "CmdCacheAdvice": "Hit/miss ratios over ~70% after the third turn indicate a stable cache prefix; \n lower than that on long sessions suggests prefix churn worth investigating (#263).", + "CmdCacheFootnote": "* miss inferred from input − hit when the provider did not report it explicitly.\n", + "CmdCacheHeader": "Cache telemetry — last {count} of {total} turn(s) (model: {model})\n", + "CmdCacheNoData": "Cache history: no turns recorded yet.\n\n DeepSeek surfaces `prompt_cache_hit_tokens` / `prompt_cache_miss_tokens` on every API turn that the model supports it (V4 family). Run a turn and try /cache again.", + "CmdCacheTotals": "Σ in: {sum_in} Σ hit: {sum_hit} Σ miss: {sum_miss} avg hit ratio: {avg}\n", + "CmdCostReport": "Session Cost:\n ─────────────────────────────\n Approx total spent: {cost}\n\n Cost estimates are approximate and use provider usage telemetry when available.\n\n DeepSeek API Pricing:\n ─────────────────────────────\n Pricing details are not configured in this CLI.", + "CmdTokensCacheBoth": "{hit} hit / {miss} miss", + "CmdTokensCacheHitOnly": "{hit} hit / miss not reported", + "CmdTokensCacheMissOnly": "hit not reported / {miss} miss", + "CmdTokensContextUnknownWindow": "~{estimated} / unknown window", + "CmdTokensContextWithWindow": "~{used} / {window} ({percent}%)", + "FooterAgentSingular": "1 agent", + "FooterAgentsPlural": "{count} agents", + "FooterPressCtrlCAgain": "Press Ctrl+C again to quit", + "FooterWorking": "working", + "FooterBalancePrefix": "balance", + "HelpSectionActions": "Actions", + "HelpSectionClipboard": "Clipboard", + "HelpSectionEditing": "Input editing", + "HelpSectionHelp": "Help", + "HelpSectionModes": "Modes", + "HelpSectionNavigation": "Navigation", + "HelpSectionSessions": "Sessions", + "CmdTokensNotReported": "not reported", + "CmdTokensReport": "Token Usage:\n ─────────────────────────────\n Active context: {active}\n Last API input: {input} (turn telemetry; may count repeated prefix across tool rounds)\n Last API output: {output}\n Cache hit/miss: {cache} (telemetry/cost only)\n Cumulative tokens: {total} (session usage telemetry)\n Approx session cost: {cost}\n API messages: {api_messages}\n Chat messages: {chat_messages}\n Model: {model}", + "KbScrollTranscript": "Scroll transcript, navigate input history, or select composer attachments", + "KbNavigateHistory": "Navigate input history", + "KbBrowseHistory": "Browse conversation history", + "KbScrollTranscriptAlt": "Scroll transcript", + "KbScrollPage": "Scroll transcript by page", + "KbJumpTopBottom": "Jump to top / bottom of transcript", + "KbJumpTopBottomEmpty": "Jump to top / bottom (when input is empty)", + "KbJumpToolBlocks": "Jump between tool output blocks", + "KbMoveCursor": "Move cursor in composer", + "KbJumpLineStartEnd": "Jump to start / end of line", + "KbDeleteChar": "Delete character before / after the cursor, or remove selected attachment", + "KbClearDraft": "Clear the current draft", + "KbStashDraft": "Send queued follow-up first; otherwise stash current draft (`/stash pop` to restore)", + "KbSearchHistory": "Search prompt history and recover local drafts", + "KbInsertNewline": "Insert a newline in the composer", + "KbSendDraft": "Send the current draft", + "KbCloseMenu": "Close menu, cancel request, discard draft, or clear input", + "KbCancelOrExit": "Cancel request, or exit when idle", + "KbShellControls": "Background the running foreground shell command", + "KbExitEmpty": "Exit when input is empty", + "KbCommandPalette": "Open the command palette", + "KbCancelBackgroundShellJobs": "Cancel all running background shell jobs (Tasks sidebar)", + "KbFuzzyFilePicker": "Open the fuzzy file picker (insert @path on Enter)", + "KbCompactInspector": "Open compact session context inspector", + "KbLastMessagePager": "Open pager for the last message (when input is empty)", + "KbSelectedDetails": "Open details for the selected tool or message (when input is empty)", + "KbToolDetailsPager": "Open tool-details pager", + "KbThinkingPager": "Open Activity Detail", + "KbLiveTranscript": "Open live transcript overlay (sticky-tail auto-scroll)", + "KbBacktrackMessage": "Backtrack to a previous user message (Left/Right step, Enter to rewind)", + "KbCompleteCycleModes": "Complete /command, queue running-turn follow-up, cycle modes; Shift+Tab cycles reasoning effort", + "KbJumpPlanAgentYolo": "Trigger hotbar slots", + "KbAltJumpPlanAgentYolo": "Alternative jump to Plan / Agent / YOLO mode", + "KbFocusSidebar": "Focus Pinned / Tasks / Agents / Context / Auto sidebar; Ctrl+Alt+0 toggles pinned sidebar", + "KbSessionPicker": "Open the session picker", + "KbPasteAttach": "Paste text or attach a clipboard image", + "KbCopySelection": "Copy the current selection (Cmd+C on macOS)", + "KbContextMenu": "Open context actions for paste, selection, message details, context, and help", + "KbAttachPath": "Add a local text file or directory to context", + "KbHelpOverlay": "Open this help overlay (when input is empty)", + "KbToggleHelp": "Toggle help overlay", + "KbToggleHelpSlash": "Toggle help overlay", + "HelpUsageLabel": "Usage:", + "HelpAliasesLabel": "Aliases:", + "SettingsTitle": "Settings:", + "SettingsConfigFile": "Config file:", + "ClearConversation": "Conversation cleared", + "ClearConversationBusy": "Conversation cleared (plan state busy; run /clear again if needed)", + "ModelChanged": "Model changed: {old} \u2192, {new}", + "LinksTitle": "Provider Links:", + "LinksDashboard": "Dashboard:", + "LinksDocs": "Docs:", + "LinksTip": "Tip: Use the env var shown for your provider, or save the key with `codewhale auth set --provider `.", + "SubagentsFetching": "Fetching Fleet worker status...", + "HelpUnknownCommand": "Unknown command: {topic}", + "HomeDashboardTitle": "codewhale Home Dashboard", + "HomeModel": "Model:", + "HomeMode": "Mode:", + "HomeWorkspace": "Workspace:", + "HomeHistory": "History:", + "HomeTokens": "Tokens:", + "HomeQueued": "Queued:", + "HomeSubagents": "Fleet workers:", + "HomeSkill": "Skill:", + "HomeQuickActions": "Quick Actions", + "HomeQuickLinks": "/links - Dashboard & API links", + "HomeQuickSkills": "/skills - List available skills", + "HomeQuickConfig": "/config - Open interactive configuration editor", + "HomeQuickSettings": "/settings - Show persistent settings", + "HomeQuickModel": "/model - Switch or view model", + "HomeQuickSubagents": "/fleet status - Fleet worker status", + "HomeQuickTaskList": "/task list - Show background task queue", + "HomeQuickHelp": "/help - Show help", + "HomeModeTips": "Mode Tips", + "HomeAgentModeTip": "Agent mode - Use tools for autonomous tasks", + "HomeAgentModeReviewTip": " Type /mode plan to review before executing", + "HomeAgentModeYoloTip": " Type /mode yolo to enable full tool access", + "HomeYoloModeTip": "YOLO mode - Full tool access, no approvals", + "HomeYoloModeCaution": " Be careful with destructive operations!", + "HomePlanModeTip": "Plan mode - Design before implementing", + "HomePlanModeChecklistTip": " Use /mode plan to create structured checklists", + "HomeGoalModeTip": "Goal tracking - Set /goal to pursue objectives", + "OnboardLanguageTitle": "Choose your language", + "OnboardLanguageBlurb": "Pick the UI language. You can change it any time with `/settings set locale `.", + "OnboardLanguageFooter": "Press 1-7 to choose, or Enter to keep the current setting", + "OnboardApiKeyTitle": "Connect your DeepSeek API key", + "OnboardApiKeyStep1": "Step 1. Open https://platform.deepseek.com/api_keys and create a key.", + "OnboardApiKeyStep2": "Step 2. Paste it below and press Enter.", + "OnboardApiKeySavedHint": "Saved to ~/.codewhale/config.toml so it works from any folder.", + "OnboardApiKeyFormatHint": "Paste the full key exactly as issued (no spaces or newlines).", + "OnboardApiKeyPlaceholder": "(paste key here)", + "OnboardApiKeyLabel": "Key: ", + "OnboardApiKeyFooter": "Press Enter to save, Esc to go back.", + "OnboardTrustTitle": "Trust Workspace", + "OnboardTrustQuestion": "Do you trust the contents of this directory?", + "OnboardTrustLocationPrefix": "You are in ", + "OnboardTrustRiskHint": "Working with untrusted contents comes with higher risk of prompt injection.", + "OnboardTrustEffectHint": "Trusting this directory records it in global config and enables trusted workspace mode.", + "OnboardTrustFooterPrefix": "Press ", + "OnboardTrustFooterMiddle": " to trust and continue, ", + "OnboardTrustFooterSuffix": " to quit", + "OnboardTipsTitle": "Start Simple", + "OnboardTipsLine1": "Write the task in plain language. Use /help or Ctrl+K when you want a command.", + "OnboardTipsLine2": "The bottom composer is multi-line: Enter sends, Alt+Enter or Ctrl+J adds a new line.", + "OnboardTipsLine3": "Switch modes only when the job changes: Plan for review-first work, Agent for execution, YOLO when you want auto-approval.", + "OnboardTipsLine4": "Ctrl+R resumes earlier sessions, and Esc backs out of the current draft or overlay.", + "OnboardTipsFooterEnter": "Press Enter", + "OnboardTipsFooterAction": " to open the workspace", + "CtxMenuTitle": " Right click ", + "CtxMenuCopySelection": "Copy selection", + "CtxMenuCopySelectionDesc": "write selected transcript text", + "CtxMenuOpenSelection": "Open selection", + "CtxMenuOpenSelectionDesc": "show selected text in pager", + "CtxMenuClearSelection": "Clear selection", + "CtxMenuOpenDetails": "Open details", + "CtxMenuCopyMessage": "Copy message", + "CtxMenuCopyMessageDesc": "write clicked transcript cell", + "CtxMenuOpenInEditor": "Open in editor", + "CtxMenuOpenInEditorDesc": "open file:line in $EDITOR", + "CtxMenuShowCell": "Show cell", + "CtxMenuShowCellDesc": "unhide this transcript cell", + "CtxMenuHideCell": "Hide cell", + "CtxMenuHideCellDesc": "collapse this transcript cell", + "CtxMenuShowHidden": "Show hidden", + "CtxMenuShowHiddenDesc": "unhide all collapsed cells", + "CtxMenuPaste": "Paste", + "CtxMenuPasteDesc": "insert clipboard into composer", + "CtxMenuCmdPalette": "Command palette", + "CtxMenuCmdPaletteDesc": "commands, skills, and tools", + "CtxMenuContextInspector": "Context inspector", + "CtxMenuContextInspectorDesc": "active context and cache hints", + "CtxMenuHelp": "Help", + "CtxMenuHelpDesc": "keybindings and commands", + "FanoutCounts": "{done} done · {running} running · {failed} failed · {pending} pending", + "ModePickerPrompt": "Choose how CodeWhale should operate:", + "AppModeAgent": "Agent", + "AppModeYolo": "YOLO", + "AppModePlan": "Plan", + "AppModeAgentHint": "Normal execution with approvals", + "AppModePlanHint": "Plan first before execution", + "AppModeYoloHint": "Auto-approve; shell enabled", + "VimModeNormal": "-- NORMAL --", + "VimModeInsert": "-- INSERT --", + "VimModeVisual": "-- VISUAL --", + "ApprovalRiskReview": "REVIEW", + "ApprovalRiskDestructive": "DESTRUCTIVE", + "ApprovalCategorySafe": "Safe", + "ApprovalCategoryFileWrite": "File Write", + "ApprovalCategoryShell": "Bash", + "ApprovalCategoryNetwork": "Network", + "ApprovalCategoryMcpRead": "MCP Read", + "ApprovalCategoryMcpAction": "MCP Action", + "ApprovalCategoryUnknown": "Unknown", + "ApprovalFieldType": "Type: ", + "ApprovalFieldAbout": "About: ", + "ApprovalFieldImpact": "Impact: ", + "ApprovalFieldParams": "Params: ", + "ApprovalOptionApproveOnce": "Approve once", + "ApprovalOptionApproveAlways": "Approve always for this kind", + "ApprovalOptionDeny": "Deny this call", + "ApprovalOptionAbortTurn": "Abort the turn", + "ApprovalBlockTitle": "approval", + "ApprovalControlsHint": " · v: full params · Esc: abort", + "ApprovalChooseHint": "Choose: ", + "ApprovalChooseAction": "Enter selected option, or press y/a/d directly", + "ApprovalIntentLabel": "Intent: ", + "ApprovalMoreLines": " … (+{count} lines)", + "ElevationTitleSandboxDenied": " \u26a0, Sandbox Denied ", + "ElevationTitleRequired": " Sandbox Elevation Required ", + "ElevationFieldTool": " Tool: ", + "ElevationFieldCmd": " Cmd: ", + "ElevationFieldReason": " Reason: ", + "ElevationImpactHeader": " Impact if approved:", + "ElevationImpactNetwork": " - network retry enables outbound downloads and HTTP requests", + "ElevationImpactWrite": " - write retry expands writable filesystem scope for this tool call", + "ElevationImpactFullAccess": " - full access removes sandbox restrictions entirely for this retry", + "ElevationPromptProceed": " Choose how to proceed:", + "ElevationOptionNetwork": "Allow outbound network", + "ElevationOptionWrite": "Allow extra write access", + "ElevationOptionFullAccess": "Full access (filesystem + network)", + "ElevationOptionAbort": "Abort", + "ElevationOptionNetworkDesc": "Retry this tool call with outbound network access for downloads and HTTP requests", + "ElevationOptionWriteDesc": "Retry this tool call with additional writable filesystem scope", + "ElevationOptionFullAccessDesc": "Retry without sandbox limits; grants unrestricted filesystem and network access", + "ElevationOptionAbortDesc": "Cancel this tool execution", + "CtxInspTitle": "Context inspector", + "CtxInspSessionContext": "Session Context", + "CtxInspSystemPrompt": "System Prompt Structure", + "CtxInspReferences": "References", + "CtxInspRecentTools": "Recent Tools", + "CtxInspModel": "Model", + "CtxInspWorkspace": "Workspace", + "CtxInspSession": "Session", + "CtxInspContext": "Context", + "CtxInspTranscript": "Transcript", + "CtxInspWorkspaceStatus": "Workspace status", + "CtxInspNotSampledYet": "not sampled yet", + "CtxInspOk": "ok", + "CtxInspHigh": "high", + "CtxInspCritical": "critical", + "CtxInspIncluded": "included", + "CtxInspAttached": "attached", + "CtxInspNotIncluded": "not included", + "CtxInspOutputCaptured": "output captured", + "CtxInspNoOutputYet": "no output yet", + "CtxInspNoSystemPrompt": "No system prompt set.", + "CtxInspNoReferences": "No file, directory, or media references recorded yet.", + "CtxInspNoToolActivity": "No tool activity recorded yet.", + "CtxInspVHint": "Open the matching card and press v for full details.", + "CtxInspCells": "cells", + "CtxInspApiMessages": "API messages", + "CtxInspActive": "active", + "CtxInspCell": "cell", + "CtxInspMoreReferences": "more reference(s)", + "CtxInspStablePrefix": "Stable prefix", + "CtxInspVolatileWorkingSet": "Volatile working set", + "CtxInspFirstLine": "First line", + "CtxInspTotal": "Total", + "CtxInspTextPromptLayers": "Text prompt layers", + "CtxInspSingleTextBlob": "Single text blob", + "CtxInspBlocks": "block(s)", + "CtxInspBlock": "block", + "CtxInspTokens": "tokens", + "CtxInspLayers": "layer(s)", + "CtxInspNone": "none", + "CtxInspEmpty": "(empty)", + "CtxInspCacheFriendly": "cache-friendly", + "CtxInspChangesByTurn": "changes by session/turn", + "CtxInspStablePrefixOnly": "stable prefix only", + "CtxInspCacheTip": "Tip: Stable prefix blocks are DeepSeek V4 prefix-cache eligible. Volatile working-set changes break the cache only for the tail.", + "ToolFamilyRead": "read", + "ToolFamilyPatch": "patch", + "ToolFamilyRun": "run", + "ToolFamilyFind": "find", + "ToolFamilyDelegate": "delegate", + "ToolFamilyFanout": "fanout", + "ToolFamilyRlm": "rlm", + "ToolFamilyVerify": "verify", + "ToolFamilyThink": "think", + "ToolFamilyGeneric": "tool", + "CmdVoiceDescription": "Toggle voice input: record speech and transcribe into the composer", + "CmdVoiceSendDescription": "Toggle voice auto-send: submit when the transcript ends with \"send it\"", + "CmdVoiceControlDescription": "Toggle voice control: AI-assisted dictation aware of the composer text", + "VoiceEnabled": "Voice input enabled. Speak to record.", + "VoiceDisabled": "Voice input disabled.", + "VoiceSendEnabled": "Voice auto-send enabled.", + "VoiceSendDisabled": "Voice auto-send disabled.", + "VoiceControlEnabled": "Voice control enabled.", + "VoiceControlDisabled": "Voice control disabled.", + "VoiceErrNoAuth": "Voice: no API key configured for the active provider", + "VoiceErrNoRecorder": "Voice: no recording tool found. Install sox, arecord, or rec.", + "VoiceErrNetwork": "Voice: transcription request failed", + "VoiceErrEmptySend": "Voice: nothing to send", + "VoiceErrTooShort": "Voice: no speech detected, recording too short", + "VoiceRecording": "🎙 Recording... speak now", + "VoiceProcessing": "🎙 Transcribing...", + "VoiceTranscribed": "🎙 Transcribed" +} \ No newline at end of file diff --git a/crates/tui/locales/es-419.json b/crates/tui/locales/es-419.json new file mode 100644 index 0000000000..4a0f217498 --- /dev/null +++ b/crates/tui/locales/es-419.json @@ -0,0 +1,426 @@ +{ + "ComposerPlaceholder": "Escribe una tarea o usa /.", + "HistorySearchPlaceholder": "Buscar en el historial de prompts...", + "HistorySearchTitle": "Búsqueda en el historial", + "HistoryHintMove": "Arriba/Abajo mover", + "HistoryHintAccept": "Enter aceptar", + "HistoryHintRestore": "Esc restaurar", + "HistoryNoMatches": " Sin resultados", + "StatusPickerTitle": " Línea de estado ", + "StatusPickerInstruction": "Elige los elementos que quieres en el pie:", + "StatusPickerActionToggle": "alternar ", + "StatusPickerActionAll": "todos ", + "StatusPickerActionNone": "ninguno ", + "StatusPickerActionSave": "guardar ", + "StatusPickerActionCancel": "cancelar ", + "ConfigTitle": "Configuración de la sesión", + "ConfigSearchPlaceholder": "escribe para filtrar", + "ConfigNoSettings": " No hay configuraciones disponibles.", + "ConfigNoMatchesPrefix": " Ninguna configuración coincide con ", + "ConfigFilteredSettings": " Configuraciones filtradas", + "ConfigShowing": " Mostrando", + "ConfigFooterDefault": " escribir=filtrar, Arriba/Abajo=seleccionar, Enter/e=editar, Esc/q=cerrar ", + "ConfigFooterScrollable": " escribir=filtrar, Arriba/Abajo=seleccionar, Enter/e=editar, PgUp/PgDn=desplazar, Esc/q=cerrar ", + "ConfigFooterFiltered": " escribir=filtrar, Backspace=borrar, Ctrl+U/Esc=limpiar, Enter=editar ", + "ConfigSectionProvider": "Proveedor", + "ConfigSectionModel": "Modelo", + "ConfigSectionPermissions": "Permisos", + "ConfigSectionNetwork": "Red", + "ConfigSectionDisplay": "Pantalla", + "ConfigSectionComposer": "Compositor", + "ConfigSectionSidebar": "Barra lateral", + "ConfigSectionHistory": "Historial", + "ConfigScopeSession": "SESIÓN", + "ConfigScopeSaved": "GUARDADO", + "ConfigEditCancelled": "Edición cancelada", + "ConfigEditTitlePrefix": "Editar ", + "ConfigEditScopeLabel": "Ámbito: ", + "ConfigEditCurrentLabel": "Actual: ", + "ConfigEditHintLabel": "Pista: ", + "ConfigEditNewLabel": "Nuevo: ", + "ConfigEditFooter": " Enter=aplicar, Esc=cancelar, Ctrl+U=limpiar, Ctrl+A=todo, ←,/→,=mover ", + "ConfigRowEffective": " (efectivo {currency})", + "ConfigDefaultValue": "(predeterminado)", + "ConfigDefaultReasoning": "(config/predeterminado)", + "ConfigUnavailable": "(no disponible)", + "HelpTitle": "Ayuda", + "HelpFilterPlaceholder": "Escribe para filtrar", + "HelpFilterPrefix": "Filtro: ", + "HelpNoMatches": " Sin resultados.", + "HelpSlashCommands": "Comandos con barra", + "HelpKeybindings": "Atajos de teclado", + "HelpFooterTypeFilter": " escribir para filtrar ", + "HelpFooterMove": " Arriba/Abajo mover ", + "HelpFooterJump": " PgUp/PgDn saltar ", + "HelpFooterClose": " Esc cerrar ", + "CmdAnchorDescription": "Fijar un dato que sobrevive a la compactación (inyectado automáticamente en el contexto)", + "CmdAttachDescription": "Adjuntar imagen o video; usa @ruta para archivos de texto o directorios", + "CmdCacheDescription": "Mostrar estadísticas de hit/miss del caché de prefijo DeepSeek en las últimas N rondas", + "CmdChangeDescription": "Mostrar la entrada más reciente del changelog", + "CmdChangeHeader": "Changelog más reciente", + "CmdChangeTranslationQueued": "Las notas de la versión en inglés se muestran abajo. Se solicitará una versión traducida a continuación; si el proveedor no está disponible, este texto en inglés será el fallback.", + "CmdChangeTranslationUnavailable": "Las notas de la versión en inglés se muestran abajo. La traducción no está disponible porque la sesión actual no tiene clave de API o está offline.", + "CmdChangePreviousVersion": "Versión anterior: {version} — ejecuta `/change {version}` para verla", + "CmdBalanceDescription": "Consultar el saldo de la cuenta del proveedor activo", + "CmdClearDescription": "Limpiar el historial de la conversación", + "CmdCompactDescription": "Compactar el contexto para liberar espacio", + "CmdPurgeDescription": "Permite al agente eliminar quirúrgicamente historial innecesario para liberar espacio de contexto", + "CmdConfigDescription": "Abrir el editor interactivo de configuración", + "CmdContextDescription": "Abrir el inspector compacto de contexto de la sesión", + "CmdCostDescription": "Mostrar el desglose de costo de la sesión", + "CmdDiffDescription": "Mostrar cambios en archivos desde el inicio de la sesión", + "CmdEditDescription": "Revisar y reenviar el último mensaje", + "CmdExitDescription": "Salir de la aplicación", + "CmdExportDescription": "Exportar la conversación a markdown", + "CmdFeedbackDescription": "Generar una URL de feedback en GitHub", + "CmdHfDescription": "Inspeccionar configuracion y conceptos de Hugging Face MCP", + "CmdHelpDescription": "Mostrar información de ayuda", + "CmdProfileDescription": "Cambiar a un perfil de configuración con nombre", + "CmdHomeDescription": "Mostrar el panel inicial con estadísticas y acciones rápidas", + "CmdHooksDescription": "Listar hooks de ciclo de vida configurados (solo lectura)", + "CmdAgentDescription": "Abrir una sesión persistente de sub-agente: /agent [0-3] ", + "CmdGoalDescription": "Definir una meta de sesión con presupuesto de tokens opcional", + "CmdInitDescription": "Generar AGENTS.md para el proyecto", + "CmdLspDescription": "Alternar diagnóstico LSP encendido o apagado", + "CmdShareDescription": "Exportar la sesión actual como una URL web compartible", + "CmdJobsDescription": "Inspeccionar y controlar trabajos de shell en segundo plano", + "CmdLinksDescription": "Mostrar enlaces de tokens, paneles y documentación de proveedores", + "CmdLoadDescription": "Cargar la sesión desde un archivo", + "CmdLogoutDescription": "Limpiar la clave de API y volver a la configuración", + "CmdMcpDescription": "Abrir o gestionar servidores MCP", + "CmdPluginNoneFound": "No plugin tools discovered in {dir}", + "CmdPluginNotFound": "Plugin '{name}' not found", + "CmdPluginListHeader": "Plugin tools ({count}):", + "CmdPluginDetailDescription": "Description: {description}", + "CmdPluginDetailSchema": "Schema:\n{schema}", + "CmdPluginDetailApproval": "Approval: {approval}", + "CmdPluginDetailPath": "Path: {path}", + "CmdMemoryDescription": "Inspeccionar o gestionar el archivo persistente de memoria del usuario", + "CmdModeDescription": "Alternar modo o abrir selector: /mode [agent|plan|yolo|1|2|3]", + "CmdModelDescription": "Cambiar o mostrar el modelo actual", + "CmdModelsDescription": "Listar los modelos disponibles por la API", + "CmdModelDbDescription": "Explorar la base de datos de referencia de modelos integrada", + "CmdNetworkDescription": "Gestionar reglas de red permitidas y bloqueadas", + "CmdNoteDescription": "Agregar nota al archivo persistente (.codewhale/notes.md)", + "CmdThemeDescription": "Alternar entre tema claro y oscuro", + "CmdProviderDescription": "Cambiar o mostrar el backend LLM activo (deepseek | nvidia-nim | ollama)", + "CmdQueueDescription": "Ver o editar mensajes en cola", + "CmdQueueUsage": "Uso: /queue [list|send |edit |drop |clear]", + "CmdQueueDraftHeader": "Editando mensaje en cola:", + "CmdQueueNoMessages": "No hay mensajes en cola", + "CmdQueueListHeader": "Mensajes en cola ({count}):", + "CmdQueueTip": "Consejo: /queue send para enviar ahora, /queue drop para eliminar", + "CmdQueueAlreadyEditing": "Ya estás editando un mensaje en cola. Envíalo o usa /queue clear para descartarlo.", + "CmdQueueNotFound": "Mensaje en cola no encontrado", + "CmdQueueEditingStatus": "Editando mensaje en cola {index}", + "CmdQueueEditingMessage": "Editando mensaje en cola {index} (presiona Enter para re-encolar/enviar)", + "CmdQueueDropped": "Mensaje en cola {index} eliminado", + "CmdQueueAlreadyEmpty": "La cola ya está vacía", + "CmdQueueCleared": "Cola limpiada", + "CmdQueueMissingIndex": "Índice faltante. Uso: /queue edit o /queue drop ", + "CmdQueueIndexPositive": "El índice debe ser un número positivo", + "CmdQueueIndexMin": "El índice debe ser >= 1", + "CmdRelayDescription": "Crear un relay de sesión (接力) para un hilo nuevo", + "CmdRenameDescription": "Renombrar la sesión actual", + "CmdRestoreDescription": "Revertir el workspace a un snapshot pre/post-turno anterior. Sin argumento, lista los snapshots recientes.", + "CmdRetryDescription": "Repetir la última solicitud", + "CmdReviewDescription": "Ejecutar una revisión de código estructurada en un archivo, diff o PR", + "CmdRlmDescription": "Turno del Recursive Language Model (RLM) — guarda el prompt en un REPL Python y deja que el modelo escriba el código que lo procesa; usa `llm_query()` / `sub_rlm()` para llamadas a sub-LLMs.", + "CmdSaveDescription": "Guardar la sesión en archivo", + "CmdForkDescription": "Bifurcar la conversación activa a una sesión hermana", + "CmdNewDescription": "Iniciar una nueva sesión guardada", + "CmdSessionsDescription": "Abrir el selector de sesiones", + "CmdSettingsDescription": "Mostrar las configuraciones persistidas", + "CmdSkillDescription": "Activar una skill, o instalar/actualizar/desinstalar/confiar en una skill de la comunidad", + "CmdSkillsDescription": "Listar skills locales (filtra con `/skills `; --remote navega el registro curado)", + "CmdStashDescription": "Estacionar o restaurar borrador del compositor (Ctrl+S estaciona, /stash list|pop)", + "CmdStatusDescription": "Mostrar el estado de la sesión en ejecución", + "CmdStatuslineDescription": "Configurar qué elementos aparecen en el pie de página", + "CmdFleetDescription": "Abrir configuración Fleet o estado de workers", + "CmdHotbarDescription": "Abrir configuración de Hotbar", + "CmdSubagentsDescription": "Atajo compatible para /fleet status", + "CmdSystemDescription": "Mostrar el prompt de sistema actual", + "CmdTaskDescription": "Gestionar tareas en segundo plano", + "CmdTokensDescription": "Mostrar el uso de tokens de la sesión", + "CmdTranslateDescription": "Activar o desactivar la traducción de salida al idioma actual del sistema", + "CmdTranslateOff": "Traducción de salida desactivada (se muestra la salida original del modelo)", + "CmdTranslateOn": "Traducción de salida activada: las respuestas del modelo se mostrarán en el idioma del sistema", + "TranslationInProgress": "Traduciendo la salida del asistente...", + "TranslationComplete": "Traducción completada", + "TranslationFailed": "Traducción fallida", + "CmdTrustDescription": "Gestionar la confianza del workspace y la lista de paths permitidos (`/trust add `, `/trust list`, `/trust on|off`)", + "CmdWorkspaceDescription": "Mostrar o cambiar el workspace actual", + "CmdUndoDescription": "Eliminar el último par de mensajes", + "CmdVerboseDescription": "Alternar pensamiento en vivo completo en la transcripción", + "CmdCacheAdvice": "Tasas de hit/miss arriba del ~70% a partir del tercer turno indican un prefijo de caché estable;\nvalores menores en sesiones largas sugieren inestabilidad en el prefijo, vale investigar (#263).", + "CmdCacheFootnote": "* miss inferido a partir de entrada − hit cuando el proveedor no lo reporta por separado.\n", + "CmdCacheHeader": "Telemetría del caché — últimos {count} de {total} turno(s) (modelo: {model})\n", + "CmdCacheNoData": "Historial del caché: ningún turno registrado todavía.\n\nDeepSeek expone `prompt_cache_hit_tokens` / `prompt_cache_miss_tokens` en cada turno de la API donde el modelo lo soporta (familia V4). Ejecuta un turno y prueba /cache de nuevo.", + "CmdCacheTotals": "Σ entrada: {sum_in} Σ hit: {sum_hit} Σ miss: {sum_miss} tasa promedio de hit: {avg}\n", + "CmdCostReport": "Costo de la sesión:\n─────────────────────────────\nTotal aproximado: {cost}\n\nLas estimaciones de costo son aproximadas y usan la telemetría de uso del proveedor cuando está disponible.\n\n Precios de la API DeepSeek:\n─────────────────────────────\nLos detalles de precio no están configurados en esta CLI.", + "CmdTokensCacheBoth": "{hit} hit / {miss} miss", + "CmdTokensCacheHitOnly": "{hit} hit / miss no reportado", + "CmdTokensCacheMissOnly": "hit no reportado / {miss} miss", + "CmdTokensContextUnknownWindow": "~{estimated} / ventana desconocida", + "CmdTokensContextWithWindow": "~{used} / {window} ({percent}%)", + "FooterAgentSingular": "1 sub-agente", + "FooterAgentsPlural": "{count} sub-agentes", + "FooterPressCtrlCAgain": "Presiona Ctrl+C de nuevo para salir", + "FooterWorking": "trabajando", + "FooterBalancePrefix": "saldo", + "HelpSectionActions": "Acciones", + "HelpSectionClipboard": "Portapapeles", + "HelpSectionEditing": "Edición de entrada", + "HelpSectionHelp": "Ayuda", + "HelpSectionModes": "Modos", + "HelpSectionNavigation": "Navegación", + "HelpSectionSessions": "Sesiones", + "CmdTokensNotReported": "no reportado", + "CmdTokensReport": "Uso de tokens:\n─────────────────────────────\nContexto activo: {active}\nÚltima entrada de API: {input} (telemetría por turno; puede contar el mismo prefijo varias veces en rondas con herramientas)\nÚltima salida de API: {output}\nHit/miss del caché: {cache} (solo para telemetría/costo)\nTokens acumulados: {total} (telemetría de uso de la sesión)\nCosto aproximado: {cost}\nMensajes de API: {api_messages}\nMensajes del chat: {chat_messages}\nModelo: {model}", + "KbScrollTranscript": "Desplazar transcripción, navegar historial de entrada o seleccionar adjuntos del compositor", + "KbNavigateHistory": "Navegar historial de entrada", + "KbBrowseHistory": "Explorar historial de conversación", + "KbScrollTranscriptAlt": "Desplazar transcripción", + "KbScrollPage": "Desplazar transcripción por página", + "KbJumpTopBottom": "Saltar al inicio / fin de la transcripción", + "KbJumpTopBottomEmpty": "Saltar al inicio / fin (cuando la entrada está vacía)", + "KbJumpToolBlocks": "Saltar entre bloques de salida de herramientas", + "KbMoveCursor": "Mover cursor en el compositor", + "KbJumpLineStartEnd": "Saltar al inicio / fin de la línea", + "KbDeleteChar": "Eliminar carácter antes / después del cursor, o quitar adjunto seleccionado", + "KbClearDraft": "Limpiar borrador actual", + "KbStashDraft": "Estacionar borrador actual (`/stash pop` restaura)", + "KbSearchHistory": "Buscar historial de prompts y recuperar borradores locales", + "KbInsertNewline": "Insertar nueva línea en el compositor", + "KbSendDraft": "Enviar borrador actual", + "KbCloseMenu": "Cerrar menú, cancelar solicitud, descartar borrador o limpiar entrada", + "KbCancelOrExit": "Cancelar solicitud o salir cuando está inactivo", + "KbShellControls": "Enviar el comando en primer plano a segundo plano", + "KbExitEmpty": "Salir cuando la entrada está vacía", + "KbCommandPalette": "Abrir paleta de comandos", + "KbCancelBackgroundShellJobs": "Cancelar todos los trabajos shell en segundo plano en ejecución (barra lateral Tasks)", + "KbFuzzyFilePicker": "Abrir selector de archivo fuzzy (inserta @ruta al presionar Enter)", + "KbCompactInspector": "Abrir inspector compacto de contexto de la sesión", + "KbLastMessagePager": "Abrir paginador para el último mensaje (cuando la entrada está vacía)", + "KbSelectedDetails": "Abrir detalles de la herramienta o mensaje seleccionado (cuando la entrada está vacía)", + "KbToolDetailsPager": "Abrir paginador de detalles de la herramienta", + "KbThinkingPager": "Abrir paginador de razonamiento", + "KbLiveTranscript": "Abrir superposición de transcripción en vivo (auto-scroll)", + "KbBacktrackMessage": "Retroceder al mensaje anterior del usuario (izquierda/derecha, Enter para rebobinar)", + "KbCompleteCycleModes": "Completar /command, encolar follow-up, ciclar modos; Shift+Tab cicla esfuerzo de razonamiento", + "KbJumpPlanAgentYolo": "Activar ranuras de la hotbar", + "KbAltJumpPlanAgentYolo": "Salto alternativo a modo Plan / Agent / YOLO", + "KbFocusSidebar": "Enfocar barra lateral Pinned / Tasks / Agents / Context / Auto / Ocultar", + "KbSessionPicker": "Abrir selector de sesiones", + "KbPasteAttach": "Pegar texto o adjuntar imagen del portapapeles", + "KbCopySelection": "Copiar selección actual (Cmd+C en macOS)", + "KbContextMenu": "Abrir acciones de contexto para pegar, selección, detalles, contexto y ayuda", + "KbAttachPath": "Agregar archivo o directorio local al contexto", + "KbHelpOverlay": "Abrir esta superposición de ayuda (cuando la entrada está vacía)", + "KbToggleHelp": "Alternar superposición de ayuda", + "KbToggleHelpSlash": "Alternar superposición de ayuda", + "HelpUsageLabel": "Uso:", + "HelpAliasesLabel": "Alias:", + "SettingsTitle": "Configuraciones:", + "SettingsConfigFile": "Archivo de configuración:", + "ClearConversation": "Conversación limpia", + "ClearConversationBusy": "Conversación limpia (estado del plan ocupado; ejecuta /clear de nuevo si es necesario)", + "ModelChanged": "Modelo cambiado: {old} →, {new}", + "LinksTitle": "Enlaces de proveedores:", + "LinksDashboard": "Panel:", + "LinksDocs": "Documentación:", + "LinksTip": "Tip: usa la variable de entorno mostrada para tu proveedor o guarda la clave con `codewhale auth set --provider `.", + "SubagentsFetching": "Obteniendo estado de workers Fleet...", + "HelpUnknownCommand": "Comando desconocido: {topic}", + "HomeDashboardTitle": "Panel Inicial de codewhale", + "HomeModel": "Modelo:", + "HomeMode": "Modo:", + "HomeHistory": "Historial:", + "HomeQueued": "En cola:", + "HomeSubagents": "Workers Fleet:", + "HomeQuickActions": "Acciones Rápidas", + "HomeQuickLinks": "/links - Enlaces del panel y API", + "HomeQuickSkills": "/skills - Listar skills disponibles", + "HomeQuickConfig": "/config - Abrir editor interactivo de configuración", + "HomeQuickSettings": "/settings - Mostrar configuraciones persistentes", + "HomeQuickModel": "/model - Alternar o visualizar modelo", + "HomeQuickSubagents": "/fleet status - Estado de workers Fleet", + "HomeQuickTaskList": "/task list - Mostrar fila de tareas en segundo plano", + "HomeQuickHelp": "/help - Mostrar ayuda", + "HomeModeTips": "Tips de Modo", + "HomeAgentModeTip": "Modo Agent - Usar herramientas para tareas autónomas", + "HomeAgentModeReviewTip": " Escribe /mode plan para revisar antes de ejecutar", + "HomeAgentModeYoloTip": " Escribe /mode yolo para habilitar acceso total a las herramientas", + "HomeYoloModeTip": "Modo YOLO - Acceso total a herramientas, sin aprobaciones", + "HomeYoloModeCaution": " ¡Ten cuidado con operaciones destructivas!", + "HomePlanModeTip": "Modo Plan - Planear antes de implementar", + "HomePlanModeChecklistTip": " Usa /mode plan para crear checklists estructurados", + "HomeGoalModeTip": "Seguimiento de Goal - Usa /goal para seguir un objetivo persistente", + "OnboardLanguageTitle": "Elige el idioma", + "OnboardLanguageBlurb": "Elige el idioma de la interfaz. Puedes cambiarlo en cualquier momento con `/settings set locale `.", + "OnboardLanguageFooter": "Presiona 1-7 para elegir, o Enter para mantener la configuración actual", + "OnboardApiKeyTitle": "Conecta tu clave de API DeepSeek", + "OnboardApiKeyStep1": "Paso 1. Abre https://platform.deepseek.com/api_keys y crea una clave.", + "OnboardApiKeyStep2": "Paso 2. Pégala abajo y presiona Enter.", + "OnboardApiKeySavedHint": "Guardada en ~/.codewhale/config.toml para funcionar en cualquier carpeta.", + "OnboardApiKeyFormatHint": "Pega la clave completa tal como fue emitida (sin espacios ni saltos de línea).", + "OnboardApiKeyPlaceholder": "(pega la clave acá)", + "OnboardApiKeyLabel": "Clave: ", + "OnboardApiKeyFooter": "Enter para guardar, Esc para volver.", + "OnboardTrustTitle": "Confiar en el directorio", + "OnboardTrustQuestion": "¿Confías en el contenido de este directorio?", + "OnboardTrustLocationPrefix": "Estás en ", + "OnboardTrustRiskHint": "Trabajar con contenido no confiable aumenta el riesgo de inyección de prompt.", + "OnboardTrustEffectHint": "Confiar en este directorio lo registra en la configuración global y habilita el modo workspace confiable.", + "OnboardTrustFooterPrefix": "Presiona ", + "OnboardTrustFooterMiddle": " para confiar y continuar, ", + "OnboardTrustFooterSuffix": " para salir", + "OnboardTipsTitle": "Empieza simple", + "OnboardTipsLine1": "Escribe la tarea en lenguaje natural. Usa /help o Ctrl+K para comandos.", + "OnboardTipsLine2": "El composer inferior es multilínea: Enter envía, Alt+Enter o Ctrl+J agrega una nueva línea.", + "OnboardTipsLine3": "Cambia de modo solo cuando el trabajo cambie: Plan para revisar antes, Agent para ejecución, YOLO para auto-aprobación.", + "OnboardTipsLine4": "Ctrl+R retoma sesiones anteriores, y Esc cancela el borrador o superposición actual.", + "OnboardTipsFooterEnter": "Presiona Enter", + "OnboardTipsFooterAction": " para abrir el workspace", + "CtxMenuTitle": " Clic derecho ", + "CtxMenuCopySelection": "Copiar selección", + "CtxMenuCopySelectionDesc": "copiar texto seleccionado de la transcripción", + "CtxMenuOpenSelection": "Abrir selección", + "CtxMenuOpenSelectionDesc": "mostrar texto seleccionado en el visor", + "CtxMenuClearSelection": "Limpiar selección", + "CtxMenuOpenDetails": "Abrir detalles", + "CtxMenuCopyMessage": "Copiar mensaje", + "CtxMenuCopyMessageDesc": "copiar celda de transcripción seleccionada", + "CtxMenuOpenInEditor": "Abrir en editor", + "CtxMenuOpenInEditorDesc": "abrir file:line en $EDITOR", + "CtxMenuShowCell": "Mostrar celda", + "CtxMenuShowCellDesc": "volver a mostrar esta celda de transcripción", + "CtxMenuHideCell": "Ocultar celda", + "CtxMenuHideCellDesc": "colapsar esta celda de transcripción", + "CtxMenuShowHidden": "Mostrar ocultas", + "CtxMenuShowHiddenDesc": "volver a mostrar todas las celdas colapsadas", + "CtxMenuPaste": "Pegar", + "CtxMenuPasteDesc": "insertar portapapeles en el compositor", + "CtxMenuCmdPalette": "Paleta de comandos", + "CtxMenuCmdPaletteDesc": "comandos, habilidades y herramientas", + "CtxMenuContextInspector": "Inspector de contexto", + "CtxMenuContextInspectorDesc": "contexto activo y sugerencias de caché", + "CtxMenuHelp": "Ayuda", + "CtxMenuHelpDesc": "atajos de teclado y comandos", + "FanoutCounts": "{done} completado · {running} ejecutando · {failed} falló · {pending} pendiente", + "ModePickerPrompt": "Elige cómo debe funcionar CodeWhale:", + "AppModeAgent": "Agente", + "AppModeAgentHint": "Ejecución normal con aprobaciones", + "AppModePlanHint": "Planifica antes de ejecutar", + "AppModeYoloHint": "Aprobación automática; shell habilitado", + "VimModeInsert": "-- INSERTAR --", + "ApprovalRiskReview": "REVISAR", + "ApprovalRiskDestructive": "DESTRUCTIVO", + "ApprovalCategorySafe": "Seguro", + "ApprovalCategoryFileWrite": "Escritura de Archivo", + "ApprovalCategoryNetwork": "Red", + "ApprovalCategoryMcpRead": "Lectura MCP", + "ApprovalCategoryMcpAction": "Acción MCP", + "ApprovalCategoryUnknown": "Desconocido", + "ApprovalFieldType": "Tipo:", + "ApprovalFieldAbout": "Acerca de:", + "ApprovalFieldImpact": "Impacto:", + "ApprovalFieldParams": "Parámetros:", + "ApprovalOptionApproveOnce": "Aprobar una vez", + "ApprovalOptionApproveAlways": "Aprobar siempre para este tipo", + "ApprovalOptionDeny": "Denegar esta llamada", + "ApprovalOptionAbortTurn": "Abortar turno", + "ApprovalBlockTitle": "aprobación", + "ApprovalControlsHint": " · v: parámetros · Esc: abortar", + "ApprovalChooseHint": "Elegir: ", + "ApprovalChooseAction": "Enter para seleccionar, o presione y/a/d directamente", + "ApprovalIntentLabel": "Intención: ", + "ApprovalMoreLines": " … (+{count} líneas)", + "ElevationTitleSandboxDenied": " ⚠, Sandbox Denegado ", + "ElevationTitleRequired": " Elevación de Sandbox Requerida ", + "ElevationFieldTool": " Herramienta: ", + "ElevationFieldCmd": " Comando: ", + "ElevationFieldReason": " Motivo: ", + "ElevationImpactHeader": " Impacto si se aprueba:", + "ElevationImpactNetwork": " - reintento de red permite descargas y solicitudes HTTP externas", + "ElevationImpactWrite": " - reintento de escritura expande el ámbito del sistema de archivos para esta llamada", + "ElevationImpactFullAccess": " - acceso total elimina todas las restricciones de sandbox para este reintento", + "ElevationPromptProceed": " Elige cómo proceder:", + "ElevationOptionNetwork": "Permitir red externa", + "ElevationOptionWrite": "Permitir acceso extra de escritura", + "ElevationOptionFullAccess": "Acceso total (sistema de archivos + red)", + "ElevationOptionAbort": "Abortar", + "ElevationOptionNetworkDesc": "Reintenta esta llamada con acceso de red externa para descargas y solicitudes HTTP", + "ElevationOptionWriteDesc": "Reintenta esta llamada con ámbito adicional de sistema de archivos grabable", + "ElevationOptionFullAccessDesc": "Reintenta sin límites de sandbox; concede acceso sin restricciones al sistema de archivos y red", + "ElevationOptionAbortDesc": "Cancelar esta ejecución de herramienta", + "CtxInspTitle": "Inspector de contexto", + "CtxInspSessionContext": "Contexto de la sesión", + "CtxInspSystemPrompt": "Estructura del prompt del sistema", + "CtxInspReferences": "Referencias", + "CtxInspRecentTools": "Herramientas recientes", + "CtxInspModel": "Modelo", + "CtxInspWorkspace": "Espacio de trabajo", + "CtxInspSession": "Sesión", + "CtxInspContext": "Contexto", + "CtxInspTranscript": "Transcripción", + "CtxInspWorkspaceStatus": "Estado del espacio de trabajo", + "CtxInspNotSampledYet": "aún no muestreado", + "CtxInspOk": "bien", + "CtxInspHigh": "alto", + "CtxInspCritical": "crítico", + "CtxInspIncluded": "incluido", + "CtxInspAttached": "adjunto", + "CtxInspNotIncluded": "no incluido", + "CtxInspOutputCaptured": "salida capturada", + "CtxInspNoOutputYet": "sin salida aún", + "CtxInspNoSystemPrompt": "No hay prompt de sistema establecido.", + "CtxInspNoReferences": "Aún no se han registrado referencias de archivos, directorios o medios.", + "CtxInspNoToolActivity": "Aún no se ha registrado actividad de herramientas.", + "CtxInspVHint": "Abra la tarjeta correspondiente y presione v para ver los detalles completos.", + "CtxInspCells": "celdas", + "CtxInspApiMessages": "mensajes de API", + "CtxInspActive": "activo", + "CtxInspCell": "celda", + "CtxInspMoreReferences": "más referencia(s)", + "CtxInspStablePrefix": "Prefijo estable", + "CtxInspVolatileWorkingSet": "Conjunto de trabajo volátil", + "CtxInspFirstLine": "Primera línea", + "CtxInspTextPromptLayers": "Capas de prompt de texto", + "CtxInspSingleTextBlob": "Bloque de texto único", + "CtxInspBlocks": "bloque(s)", + "CtxInspBlock": "bloque", + "CtxInspTokens": "token(es)", + "CtxInspLayers": "capa(s)", + "CtxInspNone": "ninguno", + "CtxInspEmpty": "(vacío)", + "CtxInspCacheFriendly": "amigable con caché", + "CtxInspChangesByTurn": "cambia por sesión/turno", + "CtxInspStablePrefixOnly": "solo prefijo estable", + "CtxInspCacheTip": "Consejo: Los bloques de prefijo estable son elegibles para caché de prefijo DeepSeek V4. Los cambios en el conjunto de trabajo volátil solo rompen la caché al final.", + "ToolFamilyRead": "leer", + "ToolFamilyPatch": "parchear", + "ToolFamilyRun": "ejecutar", + "ToolFamilyFind": "buscar", + "ToolFamilyDelegate": "delegar", + "ToolFamilyVerify": "verificar", + "ToolFamilyThink": "pensar", + "ToolFamilyGeneric": "herramienta", + "CmdVoiceDescription": "Alternar entrada de voz: grabar voz y transcribir a texto", + "CmdVoiceSendDescription": "Alternar envío automático por voz: envía cuando la transcripción termina con \"send it\"", + "CmdVoiceControlDescription": "Alternar control por voz: dictado asistido por IA", + "VoiceEnabled": "Entrada de voz activada. Habla para grabar.", + "VoiceDisabled": "Entrada de voz desactivada.", + "VoiceSendEnabled": "Envío automático por voz activado.", + "VoiceSendDisabled": "Envío automático por voz desactivado.", + "VoiceControlEnabled": "Control por voz activado.", + "VoiceControlDisabled": "Control por voz desactivado.", + "VoiceErrNoAuth": "Voz: no hay clave de API configurada para el proveedor activo", + "VoiceErrNoRecorder": "Voz: no se encontró herramienta de grabación. Instala sox, arecord o rec.", + "VoiceErrNetwork": "Voz: falló la solicitud de transcripción", + "VoiceErrEmptySend": "Voz: nada que enviar", + "VoiceErrTooShort": "Voz: no se detectó voz, grabación demasiado corta", + "VoiceRecording": "🎙 Grabando... habla ahora", + "VoiceProcessing": "🎙 Transcribiendo...", + "VoiceTranscribed": "🎙 Transcrito" +} \ No newline at end of file diff --git a/crates/tui/locales/ja.json b/crates/tui/locales/ja.json new file mode 100644 index 0000000000..6cd7568dec --- /dev/null +++ b/crates/tui/locales/ja.json @@ -0,0 +1,428 @@ +{ + "ComposerPlaceholder": "タスクを書くか / を使う。", + "HistorySearchPlaceholder": "プロンプト履歴を検索...", + "HistorySearchTitle": "履歴検索", + "HistoryHintMove": "Up/Down 移動", + "HistoryHintAccept": "Enter 確定", + "HistoryHintRestore": "Esc 復元", + "HistoryNoMatches": " 一致なし", + "StatusPickerTitle": " ステータス行 ", + "StatusPickerInstruction": "フッターに表示する項目を選択:", + "StatusPickerActionToggle": "切替 ", + "StatusPickerActionAll": "すべて ", + "StatusPickerActionNone": "なし ", + "StatusPickerActionSave": "保存 ", + "StatusPickerActionCancel": "キャンセル ", + "ConfigTitle": "セッション設定", + "ConfigModalTitle": " 設定 ", + "ConfigSearchPlaceholder": "入力して絞り込み", + "ConfigNoSettings": " 設定がありません。", + "ConfigNoMatchesPrefix": " 一致する設定なし: ", + "ConfigFilteredSettings": " 絞り込み後の設定", + "ConfigShowing": " 表示", + "ConfigFooterDefault": " 入力=絞り込み, Up/Down=選択, Enter/e=編集, Esc/q=閉じる ", + "ConfigFooterScrollable": " 入力=絞り込み, Up/Down=選択, Enter/e=編集, PgUp/PgDn=スクロール, Esc/q=閉じる ", + "ConfigFooterFiltered": " 入力=絞り込み, Backspace=削除, Ctrl+U/Esc=クリア, Enter=編集 ", + "ConfigSectionProvider": "プロバイダ", + "ConfigSectionModel": "モデル", + "ConfigSectionPermissions": "権限", + "ConfigSectionNetwork": "ネットワーク", + "ConfigSectionDisplay": "表示", + "ConfigSectionComposer": "コンポーザー", + "ConfigSectionSidebar": "サイドバー", + "ConfigSectionHistory": "履歴", + "ConfigSectionExperimental": "実験", + "ConfigScopeSession": "セッション", + "ConfigScopeSaved": "保存済み", + "ConfigEditCancelled": "編集をキャンセルしました", + "ConfigEditTitlePrefix": "編集 ", + "ConfigEditScopeLabel": "スコープ: ", + "ConfigEditCurrentLabel": "現在: ", + "ConfigEditHintLabel": "ヒント: ", + "ConfigEditNewLabel": "新規: ", + "ConfigEditFooter": " Enter=適用, Esc=キャンセル, Ctrl+U=クリア, Ctrl+A=全選択, ←,/→,=移動 ", + "ConfigRowEffective": " (実効 {currency})", + "ConfigDefaultValue": "(デフォルト)", + "ConfigDefaultReasoning": "(設定/デフォルト)", + "ConfigUnavailable": "(利用不可)", + "HelpTitle": "ヘルプ", + "HelpFilterPlaceholder": "入力して絞り込み", + "HelpFilterPrefix": "絞り込み: ", + "HelpNoMatches": " 一致なし。", + "HelpSlashCommands": "スラッシュコマンド", + "HelpKeybindings": "キー操作", + "HelpFooterTypeFilter": " 入力して絞り込み ", + "HelpFooterMove": " Up/Down 移動 ", + "HelpFooterJump": " PgUp/PgDn ジャンプ ", + "HelpFooterClose": " Esc 閉じる ", + "CmdAnchorDescription": "コンパクション後も保持される重要な事実をピン留め(コンテキストに自動注入)", + "CmdAttachDescription": "画像・動画メディアを添付(テキストファイルやディレクトリは @path)", + "CmdCacheDescription": "直近 N ターンの DeepSeek プレフィックスキャッシュのヒット/ミス統計を表示", + "CmdChangeDescription": "最新の更新履歴を表示", + "CmdChangeHeader": "最新の更新履歴", + "CmdChangeTranslationQueued": "英語のリリースノートを以下に表示します。次に翻訳を依頼します。プロバイダーを利用できない場合は、この英語版がフォールバックです。", + "CmdChangeTranslationUnavailable": "英語のリリースノートを以下に表示します。現在のセッションに API キーがないかオフラインのため、翻訳は利用できません。", + "CmdChangePreviousVersion": "前のバージョン: {version} — `/change {version}` で表示", + "CmdBalanceDescription": "アクティブなプロバイダーのアカウント残高を確認", + "CmdClearDescription": "会話履歴をクリア", + "CmdCompactDescription": "コンテキスト圧縮で容量を確保", + "CmdPurgeDescription": "エージェントに会話履歴を分析させ、不要なメッセージを削除・要約", + "CmdConfigDescription": "インタラクティブな設定エディタを開く", + "CmdContextDescription": "コンパクトなセッションコンテキスト検査ツールを開く", + "CmdCostDescription": "セッションのコスト内訳を表示", + "CmdDiffDescription": "セッション開始以降のファイル変更を表示", + "CmdEditDescription": "最後のメッセージを編集して再送信", + "CmdExitDescription": "アプリを終了", + "CmdExportDescription": "会話を Markdown にエクスポート", + "CmdFeedbackDescription": "GitHub フィードバック URL を生成", + "CmdHfDescription": "Hugging Face MCP の設定と概念を確認", + "CmdHelpDescription": "ヘルプを表示", + "CmdProfileDescription": "名前付き設定プロファイルに切り替え", + "CmdHomeDescription": "統計とクイックアクション付きのホームダッシュボードを表示", + "CmdHooksDescription": "設定済みのライフサイクルフックを一覧表示(読み取り専用)", + "CmdAgentDescription": "永続サブエージェントセッションを開く: /agent [0-3] ", + "CmdGoalDescription": "トークンバジェット付きのセッション目標を設定", + "CmdInitDescription": "プロジェクト用に AGENTS.md を生成", + "CmdLspDescription": "LSP 診断のオン・オフを切り替え", + "CmdShareDescription": "現在のセッションを共有可能な Web URL としてエクスポート", + "CmdJobsDescription": "バックグラウンドのシェルジョブを確認・制御", + "CmdLinksDescription": "プロバイダーのトークン、ダッシュボード、ドキュメントのリンクを表示", + "CmdLoadDescription": "ファイルからセッションを読み込み", + "CmdLogoutDescription": "API キーを消去してセットアップに戻る", + "CmdMcpDescription": "MCP サーバを開く・管理する", + "CmdMemoryDescription": "永続ユーザーメモリファイルを確認・管理", + "CmdModeDescription": "動作モードを切り替え、または選択画面を開く: /mode [agent|plan|yolo|1|2|3]", + "CmdModelDescription": "現在のモデルを切り替え・確認", + "CmdModelsDescription": "API から利用可能なモデルを一覧表示", + "CmdModelDbDescription": "内蔵のモデルリファレンスデータベースを閲覧", + "CmdNetworkDescription": "ネットワーク許可・拒否ルールを管理", + "CmdNoteDescription": "ワークスペースノートの追加、一覧、編集、削除", + "CmdThemeDescription": "テーマを切り替え(ダーク/ライト/グレースケール/システム)", + "CmdProviderDescription": "現在の LLM バックエンドを切り替え・確認(deepseek | nvidia-nim | ollama)", + "CmdQueueDescription": "キューされたメッセージを確認・編集", + "CmdQueueUsage": "使用方法: /queue [list|send |edit |drop |clear]", + "CmdQueueDraftHeader": "キューされたメッセージを編集中:", + "CmdQueueNoMessages": "キューされたメッセージはありません", + "CmdQueueListHeader": "キューされたメッセージ ({count}):", + "CmdQueueTip": "ヒント: /queue send で今すぐ送信、/queue drop で削除", + "CmdQueueAlreadyEditing": "すでにキューされたメッセージを編集中です。送信するか /queue clear で破棄してください。", + "CmdQueueNotFound": "キューされたメッセージが見つかりません", + "CmdQueueEditingStatus": "キューされたメッセージ {index} を編集中", + "CmdQueueEditingMessage": "キューされたメッセージ {index} を編集中(Enter で再キュー/送信)", + "CmdQueueDropped": "キューされたメッセージ {index} を削除しました", + "CmdQueueAlreadyEmpty": "キューはすでに空です", + "CmdQueueCleared": "キューをクリアしました", + "CmdQueueMissingIndex": "インデックスが指定されていません。使用方法: /queue edit または /queue drop ", + "CmdQueueIndexPositive": "インデックスは正の数値である必要があります", + "CmdQueueIndexMin": "インデックスは 1 以上である必要があります", + "CmdRelayDescription": "新しいスレッド用のセッションリレー(接力)を作成", + "CmdRenameDescription": "現在のセッションの名前を変更", + "CmdRestoreDescription": "ワークスペースを以前のターン前/後スナップショットへロールバック。引数なしで最近のスナップショットを一覧表示。", + "CmdRetryDescription": "直前のリクエストを再試行", + "CmdReviewDescription": "ファイル・diff・PR に対して構造化コードレビューを実行", + "CmdRlmDescription": "永続 RLM コンテキストを開く: /rlm [0-3] ", + "CmdSaveDescription": "セッションをファイルに保存", + "CmdForkDescription": "現在の会話を兄弟セッションに fork", + "CmdNewDescription": "新しい保存済みセッションを開始", + "CmdSessionsDescription": "セッション履歴ピッカーを開く", + "CmdSettingsDescription": "永続化された設定を表示", + "CmdSkillDescription": "スキルを有効化、またはコミュニティスキルをインストール/更新/アンインストール/信頼", + "CmdSkillsDescription": "ローカルスキルを一覧表示(`/skills ` で絞り込み、--remote で精選レジストリを参照)", + "CmdStashDescription": "コンポーザーの下書きを退避/復元(Ctrl+S で退避、/stash list|pop)", + "CmdStatusDescription": "実行中のセッション状態を表示", + "CmdStatuslineDescription": "フッターに表示する項目を設定", + "CmdFleetDescription": "Fleet設定またはワーカー状態を開く", + "CmdHotbarDescription": "Hotbar設定を開く", + "CmdSubagentsDescription": "/fleet status の互換ショートカット", + "CmdSystemDescription": "現在のシステムプロンプトを表示", + "CmdTaskDescription": "バックグラウンドタスクを管理", + "CmdTokensDescription": "セッションのトークン使用量を表示", + "CmdTranslateDescription": "出力翻訳を現在のシステム言語に切り替え", + "CmdTranslateOff": "出力翻訳が無効になりました(元のモデル出力を表示)", + "CmdTranslateOn": "出力翻訳が有効になりました:モデル応答は現在のシステム言語で表示されます", + "TranslationInProgress": "アシスタント出力を翻訳中...", + "TranslationComplete": "翻訳が完了しました", + "TranslationFailed": "翻訳に失敗しました", + "CmdTrustDescription": "ワークスペースの信頼設定とパス別許可リストを管理(`/trust add `、`/trust list`、`/trust on|off`)", + "CmdWorkspaceDescription": "現在のワークスペースを表示または切り替え", + "CmdUndoDescription": "最後のメッセージ対を削除", + "CmdVerboseDescription": "ライブ思考表示の詳細モードを切り替え", + "CmdCacheAdvice": "3 ターン目以降にヒット率が ~70% 以上で安定していれば、プレフィックスキャッシュは健全。\n長いセッションでこれを下回る場合はプレフィックスのドリフトの可能性あり (#263)。", + "CmdCacheFootnote": "* プロバイダがミスを単独で報告しない場合は「入力 − ヒット」から推定。\n", + "CmdCacheHeader": "キャッシュテレメトリ — 直近 {count} / {total} ターン(モデル: {model})\n", + "CmdCacheNoData": "キャッシュ履歴: まだターンを記録していません。\n\nDeepSeek は対応モデル (V4 系) の各 API ターンで `prompt_cache_hit_tokens` / `prompt_cache_miss_tokens` を返します。1 ターン実行してから /cache を再度試してください。", + "CmdCacheTotals": "Σ 入力: {sum_in} Σ ヒット: {sum_hit} Σ ミス: {sum_miss} 平均ヒット率: {avg}\n", + "CmdCostReport": "セッション費用:\n─────────────────────────────\n累計概算: {cost}\n\n費用は概算値。プロバイダの使用量テレメトリがあれば優先して使用します。\n\nDeepSeek API 料金:\n─────────────────────────────\n本 CLI には詳細な料金表は組み込まれていません。", + "CmdTokensCacheBoth": "ヒット {hit} / ミス {miss}", + "CmdTokensCacheHitOnly": "ヒット {hit} / ミスは未報告", + "CmdTokensCacheMissOnly": "ヒットは未報告 / ミス {miss}", + "CmdTokensContextUnknownWindow": "~{estimated} / コンテキスト窓不明", + "FooterAgentSingular": "1 エージェント", + "FooterAgentsPlural": "{count} エージェント", + "FooterPressCtrlCAgain": "もう一度 Ctrl+C で終了", + "FooterWorking": "処理中", + "FooterBalancePrefix": "残高", + "HelpSectionActions": "操作", + "HelpSectionClipboard": "クリップボード", + "HelpSectionEditing": "入力編集", + "HelpSectionHelp": "ヘルプ", + "HelpSectionModes": "モード", + "HelpSectionNavigation": "ナビゲーション", + "HelpSectionSessions": "セッション", + "CmdTokensNotReported": "未報告", + "CmdTokensReport": "トークン使用量:\n─── ──────────────────────────\nアクティブコンテキスト: {active}\n直近の API 入力: {input}(ターン単位のテレメトリ。複数回のツール往復で同じプレフィックスが重複してカウントされる場合あり)\n直近の API 出力: {output}\nキャッシュヒット/ミス: {cache}(テレメトリ/コスト用のみ)\n累計トークン: {total}(セッション使用量テレメトリ)\nセッション費用概算: {cost}\nAPI メッセージ: {api_messages}\nチャットメッセージ: {chat_messages}\nモデル: {model}", + "KbScrollTranscript": "会話履歴をスクロール、入力履歴を移動、または添付ファイルを選択", + "KbNavigateHistory": "入力履歴を移動", + "KbBrowseHistory": "会話履歴を閲覧", + "KbScrollTranscriptAlt": "会話履歴をスクロール", + "KbScrollPage": "ページ単位で会話履歴をスクロール", + "KbJumpTopBottom": "会話履歴の先頭/末尾へジャンプ", + "KbJumpTopBottomEmpty": "先頭/末尾へジャンプ(入力が空の時)", + "KbJumpToolBlocks": "ツール出力ブロック間をジャンプ", + "KbMoveCursor": "コンポーザー内でカーソルを移動", + "KbJumpLineStartEnd": "行の先頭/末尾へジャンプ", + "KbDeleteChar": "カーソル前/後の文字を削除、または選択中の添付を削除", + "KbClearDraft": "現在の下書きをクリア", + "KbStashDraft": "現在の下書きをスタッシュ(`/stash pop`で復元)", + "KbSearchHistory": "プロンプト履歴を検索してローカル下書きを復元", + "KbInsertNewline": "コンポーザーに改行を挿入", + "KbSendDraft": "現在の下書きを送信", + "KbCloseMenu": "メニューを閉じる、リクエストをキャンセル、下書きを破棄、または入力をクリア", + "KbCancelOrExit": "リクエストをキャンセル、またはアイドル時に終了", + "KbShellControls": "実行中のフォアグラウンドコマンドをバックグラウンドへ移す", + "KbExitEmpty": "入力が空の時に終了", + "KbCommandPalette": "コマンドパレットを開く", + "KbCancelBackgroundShellJobs": "実行中のバックグラウンド shell ジョブをすべてキャンセル(Tasks サイドバー)", + "KbFuzzyFilePicker": "ファジーファイルピッカーを開く(Enter で @path を挿入)", + "KbCompactInspector": "コンパクトなセッションコンテキスト検査ツールを開く", + "KbLastMessagePager": "最後のメッセージのページャーを開く(入力が空の時)", + "KbSelectedDetails": "選択中のツールまたはメッセージの詳細を開く(入力が空の時)", + "KbToolDetailsPager": "ツール詳細のページャーを開く", + "KbThinkingPager": "Activity Detail を開く", + "KbLiveTranscript": "ライブ会話履歴オーバーレイを開く(自動追尾スクロール)", + "KbBacktrackMessage": "前のユーザーメッセージに戻る(左右でステップ、Enter で巻き戻し)", + "KbCompleteCycleModes": "/command を補完、実行中ターンのフォローアップをキュー、モードを切り替え;Shift+Tab で推論強度を切り替え", + "KbJumpPlanAgentYolo": "ホットバースロットを起動", + "KbAltJumpPlanAgentYolo": "Plan / Agent / YOLO モードへの代替ジャンプ", + "KbFocusSidebar": "Pinned / Tasks / Agents / Context / Auto / Hidden サイドバーにフォーカス", + "KbSessionPicker": "セッションピッカーを開く", + "KbPasteAttach": "テキストを貼り付けまたはクリップボード画像を添付", + "KbCopySelection": "現在の選択をコピー(macOS は Cmd+C)", + "KbContextMenu": "貼り付け、選択、メッセージ詳細、コンテキスト、ヘルプのコンテキスト操作を開く", + "KbAttachPath": "ローカルのテキストファイルまたはディレクトリをコンテキストに追加", + "KbHelpOverlay": "このヘルプオーバーレイを開く(入力が空の時)", + "KbToggleHelp": "ヘルプオーバーレイを切り替え", + "KbToggleHelpSlash": "ヘルプオーバーレイを切り替え", + "HelpUsageLabel": "使い方:", + "HelpAliasesLabel": "エイリアス:", + "SettingsTitle": "設定:", + "SettingsConfigFile": "設定ファイル:", + "ClearConversation": "会話履歴をクリアしました", + "ClearConversationBusy": "会話履歴をクリアしました(plan 状態が忙しい;必要なら /clear を再度実行)", + "ModelChanged": "モデルを変更しました: {old} → {new}", + "LinksTitle": "プロバイダーリンク:", + "LinksDashboard": "ダッシュボード:", + "LinksDocs": "ドキュメント:", + "LinksTip": "ヒント: 表示されたプロバイダー用の環境変数を使うか、`codewhale auth set --provider ` でキーを保存してください。", + "SubagentsFetching": "Fleetワーカー状態を取得中...", + "HelpUnknownCommand": "不明なコマンド: {topic}", + "HomeDashboardTitle": "codewhale ホームダッシュボード", + "HomeModel": "モデル:", + "HomeMode": "モード:", + "HomeWorkspace": "ワークスペース:", + "HomeHistory": "履歴:", + "HomeTokens": "トークン:", + "HomeQueued": "キュー:", + "HomeSubagents": "Fleetワーカー:", + "HomeSkill": "スキル:", + "HomeQuickActions": "クイックアクション", + "HomeQuickLinks": "/links - ダッシュボードと API リンク", + "HomeQuickSkills": "/skills - 利用可能なスキルを一覧", + "HomeQuickConfig": "/config - インタラクティブな設定エディタを開く", + "HomeQuickSettings": "/settings - 永続化された設定を表示", + "HomeQuickModel": "/model - モデルを切り替え・確認", + "HomeQuickSubagents": "/fleet status - Fleetワーカー状態", + "HomeQuickTaskList": "/task list - バックグラウンドタスクキューを表示", + "HomeQuickHelp": "/help - ヘルプを表示", + "HomeModeTips": "モードヒント", + "HomeAgentModeTip": "Agent モード - ツールを使って自律的なタスクを実行", + "HomeAgentModeReviewTip": " 実行前のレビューには /mode plan を入力", + "HomeAgentModeYoloTip": " /mode yolo と入力して完全なツールアクセスを有効化", + "HomeYoloModeTip": "YOLO モード - 完全なツールアクセス、承認なし", + "HomeYoloModeCaution": " 破壊的な操作には注意してください!", + "HomePlanModeTip": "Plan モード - 実装前に設計", + "HomePlanModeChecklistTip": " /mode plan を使って構造化されたチェックリストを作成", + "HomeGoalModeTip": "Goal 追跡 - /goal <目標> で持続的な目標を追跡", + "OnboardLanguageTitle": "言語を選択", + "OnboardLanguageBlurb": "UI 言語を選んでください。`/settings set locale ` でいつでも変更できます。", + "OnboardLanguageFooter": "1〜7 で選択、または Enter で現在の設定を維持", + "OnboardApiKeyTitle": "DeepSeek API キーを設定", + "OnboardApiKeyStep1": "ステップ 1. https://platform.deepseek.com/api_keys を開いてキーを作成。", + "OnboardApiKeyStep2": "ステップ 2. 下に貼り付けて Enter を押してください。", + "OnboardApiKeySavedHint": "~/.codewhale/config.toml に保存されるので、どのフォルダからでも有効になります。", + "OnboardApiKeyFormatHint": "発行されたキーをそのまま貼り付けてください(空白や改行を含めない)。", + "OnboardApiKeyPlaceholder": "(ここにキーを貼り付け)", + "OnboardApiKeyLabel": "キー: ", + "OnboardApiKeyFooter": "Enter で保存、Esc で戻る。", + "OnboardTrustTitle": "ワークスペースを信頼", + "OnboardTrustQuestion": "このディレクトリの内容を信頼しますか?", + "OnboardTrustLocationPrefix": "現在の場所: ", + "OnboardTrustRiskHint": "信頼されていない内容を扱うとプロンプトインジェクションのリスクが高くなります。", + "OnboardTrustEffectHint": "信頼するとグローバル設定に記録され、信頼済みワークスペースモードが有効になります。", + "OnboardTrustFooterPrefix": "キー ", + "OnboardTrustFooterMiddle": " で信頼して続行、", + "OnboardTrustFooterSuffix": " で終了", + "OnboardTipsTitle": "シンプルに始めよう", + "OnboardTipsLine1": "タスクを自然な言葉で記入。コマンドが必要な時は /help や Ctrl+K を使ってください。", + "OnboardTipsLine2": "下の入力欄は複数行対応です。Enter で送信、Alt+Enter または Ctrl+J で改行。", + "OnboardTipsLine3": "用途に応じてモードを切り替え:Plan は事前レビュー、Agent は実行、YOLO は自動承認。", + "OnboardTipsLine4": "Ctrl+R で過去のセッションを再開、Esc で現在の入力やオーバーレイをキャンセル。", + "OnboardTipsFooterEnter": "Enter を押す", + "OnboardTipsFooterAction": " とワークスペースが開きます", + "CtxMenuTitle": " 右クリック ", + "CtxMenuCopySelection": "選択をコピー", + "CtxMenuCopySelectionDesc": "選択したトランスクリプトのテキストを書き込む", + "CtxMenuOpenSelection": "選択を開く", + "CtxMenuOpenSelectionDesc": "選択したテキストをページャで表示", + "CtxMenuClearSelection": "選択を解除", + "CtxMenuOpenDetails": "詳細を開く", + "CtxMenuCopyMessage": "メッセージをコピー", + "CtxMenuCopyMessageDesc": "クリックしたトランスクリプトセルを書き込む", + "CtxMenuOpenInEditor": "エディタで開く", + "CtxMenuOpenInEditorDesc": "$EDITOR で file:line を開く", + "CtxMenuShowCell": "セルを表示", + "CtxMenuShowCellDesc": "このトランスクリプトセルを再表示", + "CtxMenuHideCell": "セルを隠す", + "CtxMenuHideCellDesc": "このトランスクリプトセルを折りたたむ", + "CtxMenuShowHidden": "非表示を表示", + "CtxMenuShowHiddenDesc": "すべての折りたたまれたセルを再表示", + "CtxMenuPaste": "貼り付け", + "CtxMenuPasteDesc": "クリップボードをコンポーザに挿入", + "CtxMenuCmdPalette": "コマンドパレット", + "CtxMenuCmdPaletteDesc": "コマンド、スキル、ツール", + "CtxMenuContextInspector": "コンテキストインスペクタ", + "CtxMenuContextInspectorDesc": "アクティブなコンテキストとキャッシュヒント", + "CtxMenuHelp": "ヘルプ", + "CtxMenuHelpDesc": "キー操作とコマンド", + "FanoutCounts": "{done} 完了 · {running} 実行中 · {failed} 失敗 · {pending} 保留", + "ModePickerPrompt": "CodeWhale の動作方法を選択してください:", + "AppModeAgent": "エージェント", + "AppModePlan": "プラン", + "AppModeAgentHint": "通常実行(変更前に承認を求めます)", + "AppModePlanHint": "実行前にまず計画します", + "AppModeYoloHint": "自動承認・シェル有効(フルアクセス)", + "VimModeNormal": "-- ノーマル --", + "VimModeInsert": "-- 挿入 --", + "VimModeVisual": "-- ビジュアル --", + "ApprovalRiskReview": "確認", + "ApprovalRiskDestructive": "破壊的操作", + "ApprovalCategorySafe": "安全", + "ApprovalCategoryFileWrite": "ファイル書き込み", + "ApprovalCategoryNetwork": "ネットワーク", + "ApprovalCategoryMcpRead": "MCP読み取り", + "ApprovalCategoryMcpAction": "MCPアクション", + "ApprovalCategoryUnknown": "未分類", + "ApprovalFieldType": "種類:", + "ApprovalFieldAbout": "詳細:", + "ApprovalFieldImpact": "影響:", + "ApprovalFieldParams": "パラメータ:", + "ApprovalOptionApproveOnce": "1回だけ承認", + "ApprovalOptionApproveAlways": "常に承認(この種類)", + "ApprovalOptionDeny": "拒否", + "ApprovalOptionAbortTurn": "中断", + "ApprovalBlockTitle": "承認", + "ApprovalControlsHint": " · v: パラメータ表示 · Esc: 中止", + "ApprovalChooseHint": "選択:", + "ApprovalChooseAction": "Enterで選択、または y/a/d を直接入力", + "ApprovalIntentLabel": "意図:", + "ApprovalMoreLines": " … (+{count} 行)", + "ElevationTitleSandboxDenied": " ⚠, サンドボックス拒否 ", + "ElevationTitleRequired": " サンドボックス昇格 ", + "ElevationFieldTool": " ツール:", + "ElevationFieldCmd": " コマンド:", + "ElevationFieldReason": " 理由:", + "ElevationImpactHeader": " 承認された場合の影響:", + "ElevationImpactNetwork": " - ネットワーク再試行で外部ダウンロードとHTTPリクエストが可能", + "ElevationImpactWrite": " - 書き込み再試行でファイルシステムの書き込み範囲が拡大", + "ElevationImpactFullAccess": " - フルアクセスでサンドボックス制限を完全に解除", + "ElevationPromptProceed": " 方法を選択:", + "ElevationOptionNetwork": "外部ネットワークを許可", + "ElevationOptionWrite": "追加の書き込みアクセスを許可", + "ElevationOptionFullAccess": "フルアクセス(ファイルシステム + ネットワーク)", + "ElevationOptionAbort": "中止", + "ElevationOptionNetworkDesc": "外部ネットワークアクセスでこのツール呼び出しを再試行(ダウンロードとHTTPリクエスト用)", + "ElevationOptionWriteDesc": "追加の書き込み可能ファイルシステム範囲で再試行", + "ElevationOptionFullAccessDesc": "サンドボックス制限なしで再試行(ファイルシステムとネットワークへの無制限アクセス)", + "ElevationOptionAbortDesc": "このツール実行をキャンセル", + "CtxInspTitle": "コンテキストインスペクタ", + "CtxInspSessionContext": "セッションコンテキスト", + "CtxInspSystemPrompt": "システムプロンプト構造", + "CtxInspReferences": "参照", + "CtxInspRecentTools": "最近のツール", + "CtxInspModel": "モデル", + "CtxInspWorkspace": "ワークスペース", + "CtxInspSession": "セッション", + "CtxInspContext": "コンテキスト", + "CtxInspTranscript": "トランスクリプト", + "CtxInspWorkspaceStatus": "ワークスペース状態", + "CtxInspNotSampledYet": "未サンプリング", + "CtxInspOk": "良好", + "CtxInspHigh": "高い", + "CtxInspCritical": "深刻", + "CtxInspIncluded": "含まれている", + "CtxInspAttached": "添付済み", + "CtxInspNotIncluded": "含まれていない", + "CtxInspOutputCaptured": "出力取得済み", + "CtxInspNoOutputYet": "未出力", + "CtxInspNoSystemPrompt": "システムプロンプトが設定されていません。", + "CtxInspNoReferences": "ファイル、ディレクトリ、メディアの参照はまだ記録されていません。", + "CtxInspNoToolActivity": "ツールアクティビティはまだ記録されていません。", + "CtxInspVHint": "該当するカードを開き、v を押すと詳細が表示されます。", + "CtxInspCells": "セル", + "CtxInspApiMessages": "API メッセージ", + "CtxInspActive": "アクティブ", + "CtxInspCell": "セル", + "CtxInspMoreReferences": "その他の参照", + "CtxInspStablePrefix": "安定プレフィックス", + "CtxInspVolatileWorkingSet": "揮発性ワーキングセット", + "CtxInspFirstLine": "最初の行", + "CtxInspTotal": "合計", + "CtxInspTextPromptLayers": "テキストプロンプトレイヤー", + "CtxInspSingleTextBlob": "単一テキストブロブ", + "CtxInspBlocks": "ブロック", + "CtxInspBlock": "ブロック", + "CtxInspTokens": "トークン", + "CtxInspLayers": "レイヤー", + "CtxInspNone": "なし", + "CtxInspEmpty": "(空)", + "CtxInspCacheFriendly": "キャッシュフレンドリー", + "CtxInspChangesByTurn": "セッション/ターンごとに変更", + "CtxInspStablePrefixOnly": "安定プレフィックスのみ", + "CtxInspCacheTip": "ヒント:安定プレフィックスブロックはDeepSeek V4プレフィックスキャッシュの対象です。揮発性ワーキングセットの変更は末尾のキャッシュのみを破壊します。", + "ToolFamilyRead": "読込", + "ToolFamilyPatch": "パッチ", + "ToolFamilyRun": "実行", + "ToolFamilyFind": "検索", + "ToolFamilyDelegate": "委任", + "ToolFamilyFanout": "ファンアウト", + "ToolFamilyVerify": "検証", + "ToolFamilyThink": "思考", + "ToolFamilyGeneric": "ツール", + "CmdVoiceDescription": "音声入力の切替:音声を録音してテキストに変換", + "CmdVoiceSendDescription": "音声自動送信の切替:転写が「send it」で終わると自動送信", + "CmdVoiceControlDescription": "音声コントロールの切替:入力欄を考慮した AI 音声ディクテーション", + "VoiceEnabled": "音声入力を有効にしました。話すと録音されます。", + "VoiceDisabled": "音声入力を無効にしました。", + "VoiceSendEnabled": "音声自動送信を有効にしました。", + "VoiceSendDisabled": "音声自動送信を無効にしました。", + "VoiceControlEnabled": "音声コントロールを有効にしました。", + "VoiceControlDisabled": "音声コントロールを無効にしました。", + "VoiceErrNoAuth": "音声:アクティブなプロバイダーに API キーが設定されていません", + "VoiceErrNoRecorder": "音声:録音ツールが見つかりません。sox、arecord、rec のいずれかをインストールしてください", + "VoiceErrNetwork": "音声:文字起こしリクエストに失敗しました", + "VoiceErrEmptySend": "音声:送信する内容がありません", + "VoiceErrTooShort": "音声:音声が検出されませんでした。録音が短すぎます", + "VoiceRecording": "🎙 録音中...お話しください", + "VoiceProcessing": "🎙 文字起こし中...", + "VoiceTranscribed": "🎙 文字起こし完了" +} diff --git a/crates/tui/locales/pt-BR.json b/crates/tui/locales/pt-BR.json new file mode 100644 index 0000000000..1e23fbf15b --- /dev/null +++ b/crates/tui/locales/pt-BR.json @@ -0,0 +1,415 @@ +{ + "ComposerPlaceholder": "Escreva uma tarefa ou use /.", + "HistorySearchPlaceholder": "Pesquisar histórico de prompts...", + "HistorySearchTitle": "Busca no histórico", + "HistoryHintAccept": "Enter aceita", + "HistoryHintRestore": "Esc restaura", + "HistoryNoMatches": " Sem resultados", + "StatusPickerTitle": " Linha de status ", + "StatusPickerInstruction": "Escolha os itens que deseja no rodapé:", + "StatusPickerActionToggle": "alternar ", + "StatusPickerActionAll": "todos ", + "StatusPickerActionNone": "nenhum ", + "StatusPickerActionSave": "salvar ", + "StatusPickerActionCancel": "cancelar ", + "ConfigTitle": "Configuração da sessão", + "ConfigSearchPlaceholder": "digite para filtrar", + "ConfigNoSettings": " Nenhuma configuração disponível.", + "ConfigNoMatchesPrefix": " Nenhuma configuração corresponde a ", + "ConfigFilteredSettings": " Configurações filtradas", + "ConfigShowing": " Mostrando", + "ConfigFooterDefault": " digite=filtrar, Up/Down=selecionar, Enter/e=editar, Esc/q=fechar ", + "ConfigFooterScrollable": " digite=filtrar, Up/Down=selecionar, Enter/e=editar, PgUp/PgDn=rolar, Esc/q=fechar ", + "ConfigFooterFiltered": " digite=filtrar, Backspace=apagar, Ctrl+U/Esc=limpar, Enter=editar ", + "ConfigSectionProvider": "Provedor", + "ConfigSectionModel": "Modelo", + "ConfigSectionPermissions": "Permissões", + "ConfigSectionNetwork": "Rede", + "ConfigSectionDisplay": "Exibição", + "ConfigSectionComposer": "Compositor", + "ConfigSectionSidebar": "Barra lateral", + "ConfigSectionHistory": "Histórico", + "ConfigScopeSession": "SESSÃO", + "ConfigScopeSaved": "SALVO", + "ConfigEditCancelled": "Edição cancelada", + "ConfigEditTitlePrefix": "Editar ", + "ConfigEditScopeLabel": "Escopo: ", + "ConfigEditCurrentLabel": "Atual: ", + "ConfigEditHintLabel": "Dica: ", + "ConfigEditNewLabel": "Novo: ", + "ConfigEditFooter": " Enter=aplicar, Esc=cancelar, Ctrl+U=limpar, Ctrl+A=tudo, ←,/→,=mover ", + "ConfigRowEffective": " (efetivo {currency})", + "ConfigDefaultValue": "(padrão)", + "ConfigDefaultReasoning": "(config/padrão)", + "ConfigUnavailable": "(indisponível)", + "HelpTitle": "Ajuda", + "HelpFilterPlaceholder": "Digite para filtrar", + "HelpFilterPrefix": "Filtro: ", + "HelpNoMatches": " Sem resultados.", + "HelpSlashCommands": "Comandos com barra", + "HelpKeybindings": "Atalhos", + "HelpFooterTypeFilter": " digite para filtrar ", + "HelpFooterJump": " PgUp/PgDn salta ", + "HelpFooterClose": " Esc fecha ", + "CmdAnchorDescription": "Fixar um fato que sobrevive à compactação (injetado automaticamente no contexto)", + "CmdAttachDescription": "Anexar imagem ou vídeo; use @path para arquivos de texto ou diretórios", + "CmdCacheDescription": "Exibir estatísticas de hit/miss do cache de prefixo DeepSeek nas últimas N rodadas", + "CmdChangeDescription": "Mostrar a entrada mais recente do changelog", + "CmdChangeHeader": "Changelog Mais Recente", + "CmdChangeTranslationQueued": "As notas de versao em ingles aparecem abaixo. Uma versao traduzida sera solicitada em seguida; se o provedor estiver indisponivel, este texto em ingles sera o fallback.", + "CmdChangeTranslationUnavailable": "As notas de versao em ingles aparecem abaixo. A traducao esta indisponivel porque a sessao atual nao tem chave de API ou esta offline.", + "CmdChangePreviousVersion": "Versão anterior: {version} — execute `/change {version}` para visualizar", + "CmdBalanceDescription": "Verificar o saldo da conta do provedor ativo", + "CmdClearDescription": "Limpar o histórico da conversa", + "CmdCompactDescription": "Compactar o contexto para liberar espaço", + "CmdPurgeDescription": "Deixe o agente podar cirurgicamente o histórico para liberar espaço de contexto", + "CmdConfigDescription": "Abrir o editor interativo de configuração", + "CmdContextDescription": "Abrir o inspetor compacto de contexto da sessão", + "CmdCostDescription": "Exibir o detalhamento de custo da sessão", + "CmdDiffDescription": "Mostrar alterações em arquivos desde o início da sessão", + "CmdEditDescription": "Revisar e reenviar a última mensagem", + "CmdExitDescription": "Sair do aplicativo", + "CmdExportDescription": "Exportar a conversa para markdown", + "CmdFeedbackDescription": "Gerar uma URL de feedback no GitHub", + "CmdHfDescription": "Inspecionar configuracao e conceitos do Hugging Face MCP", + "CmdHelpDescription": "Exibir informações de ajuda", + "CmdProfileDescription": "Alternar para um perfil de configuracao nomeado", + "CmdHomeDescription": "Exibir o painel inicial com estatísticas e ações rápidas", + "CmdHooksDescription": "Listar hooks de ciclo de vida configurados (somente leitura)", + "CmdAgentDescription": "Abrir uma sessão persistente de sub-agente: /agent [0-3] ", + "CmdGoalDescription": "Definir uma meta de sessão com orçamento de tokens opcional", + "CmdInitDescription": "Gerar AGENTS.md para o projeto", + "CmdLspDescription": "Alternar diagnóstico LSP ligado ou desligado", + "CmdShareDescription": "Exportar a sessão atual como uma URL web compartilhável", + "CmdJobsDescription": "Inspecionar e controlar jobs de shell em segundo plano", + "CmdLinksDescription": "Exibir links de tokens, painéis e documentação dos provedores", + "CmdLoadDescription": "Carregar a sessão de um arquivo", + "CmdLogoutDescription": "Limpar a chave de API e voltar à configuração", + "CmdMcpDescription": "Abrir ou gerenciar servidores MCP", + "CmdMemoryDescription": "Inspecionar ou gerenciar o arquivo persistente de memória do usuário", + "CmdModeDescription": "Alternar modo ou abrir seletor: /mode [agent|plan|yolo|1|2|3]", + "CmdModelDescription": "Trocar ou exibir o modelo atual", + "CmdModelsDescription": "Listar os modelos disponíveis pela API", + "CmdModelDbDescription": "Navegar pelo banco de dados de referência de modelos integrado", + "CmdNetworkDescription": "Gerenciar regras de rede permitidas e bloqueadas", + "CmdNoteDescription": "Adicionar, listar, editar ou remover notas do workspace", + "CmdThemeDescription": "Alternar tema: escuro, claro, tons de cinza ou sistema", + "CmdProviderDescription": "Trocar ou exibir o backend LLM ativo (deepseek | nvidia-nim | ollama)", + "CmdQueueDescription": "Ver ou editar mensagens enfileiradas", + "CmdQueueUsage": "Uso: /queue [list|send |edit |drop |clear]", + "CmdQueueDraftHeader": "Editando mensagem enfileirada:", + "CmdQueueNoMessages": "Nenhuma mensagem enfileirada", + "CmdQueueListHeader": "Mensagens enfileiradas ({count}):", + "CmdQueueTip": "Dica: /queue send para enviar agora, /queue drop para remover", + "CmdQueueAlreadyEditing": "Já está editando uma mensagem enfileirada. Envie-a ou use /queue clear para descartar.", + "CmdQueueNotFound": "Mensagem enfileirada não encontrada", + "CmdQueueEditingStatus": "Editando mensagem enfileirada {index}", + "CmdQueueEditingMessage": "Editando mensagem enfileirada {index} (pressione Enter para re-enfileirar/enviar)", + "CmdQueueDropped": "Mensagem enfileirada {index} removida", + "CmdQueueAlreadyEmpty": "Fila já está vazia", + "CmdQueueCleared": "Fila limpa", + "CmdQueueMissingIndex": "Índice ausente. Uso: /queue edit ou /queue drop ", + "CmdQueueIndexPositive": "O índice deve ser um número positivo", + "CmdQueueIndexMin": "O índice deve ser >= 1", + "CmdRelayDescription": "Criar um relay da sessão para um novo thread", + "CmdRenameDescription": "Renomear a sessão atual", + "CmdRestoreDescription": "Reverter o workspace a um snapshot pré/pós-turno anterior. Sem argumento, lista os snapshots recentes.", + "CmdRetryDescription": "Repetir a última requisição", + "CmdReviewDescription": "Executar uma revisão de código estruturada em um arquivo, diff ou PR", + "CmdRlmDescription": "Abrir um contexto RLM persistente: /rlm [0-3] ", + "CmdSaveDescription": "Salvar a sessão em arquivo", + "CmdForkDescription": "Bifurcar a conversa ativa para uma sessão irmã", + "CmdNewDescription": "Iniciar uma nova sessão salva", + "CmdSessionsDescription": "Abrir seletor de histórico de sessões", + "CmdSettingsDescription": "Exibir as configurações persistidas", + "CmdSkillDescription": "Ativar uma skill, ou instalar/atualizar/desinstalar/confiar em uma skill da comunidade", + "CmdSkillsDescription": "Listar skills locais (filtre com `/skills `; --remote navega pelo registro curado)", + "CmdStashDescription": "Estacionar ou restaurar rascunho do compositor (Ctrl+S estaciona, /stash list|pop)", + "CmdStatusDescription": "Exibir o status da sessão em execução", + "CmdStatuslineDescription": "Configurar quais itens aparecem no rodapé", + "CmdFleetDescription": "Abrir configuração Fleet ou status dos workers", + "CmdHotbarDescription": "Abrir configuração da Hotbar", + "CmdSubagentsDescription": "Atalho compatível para /fleet status", + "CmdSystemDescription": "Exibir o prompt de sistema atual", + "CmdTaskDescription": "Gerenciar tarefas em segundo plano", + "CmdTokensDescription": "Exibir o uso de tokens da sessão", + "CmdTranslateDescription": "Alternar tradução de saída para o idioma atual do sistema", + "CmdTranslateOff": "Tradução de saída desativada (saída original do modelo exibida)", + "CmdTranslateOn": "Tradução de saída ativada: as respostas serão exibidas no idioma do sistema", + "TranslationInProgress": "Traduzindo saída do assistente...", + "TranslationComplete": "Tradução concluída", + "TranslationFailed": "Falha na tradução", + "CmdTrustDescription": "Gerenciar a confiança do workspace e a allowlist por caminho (`/trust add `, `/trust list`, `/trust on|off`)", + "CmdWorkspaceDescription": "Mostrar ou trocar o workspace atual", + "CmdUndoDescription": "Remover o último par de mensagens", + "CmdVerboseDescription": "Alternar pensamento ao vivo completo no transcript", + "CmdCacheAdvice": "Taxas de hit/miss acima de ~70% a partir do terceiro turno indicam um prefixo de cache estável;\nvalores menores em sessões longas sugerem instabilidade no prefixo, vale investigar (#263).", + "CmdCacheFootnote": "* miss inferido a partir de entrada − hit quando o provedor não o reporta separadamente.\n", + "CmdCacheHeader": "Telemetria do cache — últimos {count} de {total} turno(s) (modelo: {model})\n", + "CmdCacheNoData": "Histórico do cache: nenhum turno registrado ainda.\n\nO DeepSeek expõe `prompt_cache_hit_tokens` / `prompt_cache_miss_tokens` em cada turno da API onde o modelo suporta (família V4). Execute um turno e tente /cache de novo.", + "CmdCacheTotals": "Σ entrada: {sum_in} Σ hit: {sum_hit} Σ miss: {sum_miss} taxa média de hit: {avg}\n", + "CmdCostReport": "Custo da sessão:\n─────────────────────────────\nTotal aproximado: {cost}\n\nEstimativas de custo são aproximadas e usam a telemetria de uso do provedor quando disponível.\n\nPreços da API DeepSeek:\n─────────────────────────────\nOs detalhes de preço não estão configurados nesta CLI.", + "CmdTokensCacheHitOnly": "{hit} hit / miss não reportado", + "CmdTokensCacheMissOnly": "hit não reportado / {miss} miss", + "CmdTokensContextUnknownWindow": "~{estimated} / janela desconhecida", + "FooterAgentSingular": "1 sub-agente", + "FooterAgentsPlural": "{count} sub-agentes", + "FooterPressCtrlCAgain": "Pressione Ctrl+C novamente para sair", + "FooterWorking": "trabalhando", + "FooterBalancePrefix": "saldo", + "HelpSectionActions": "Ações", + "HelpSectionClipboard": "Área de transferência", + "HelpSectionEditing": "Edição de entrada", + "HelpSectionHelp": "Ajuda", + "HelpSectionModes": "Modos", + "HelpSectionNavigation": "Navegação", + "HelpSectionSessions": "Sessões", + "CmdTokensNotReported": "não reportado", + "CmdTokensReport": "Uso de tokens:\n─────────────────────────────\nContexto ativo: {active}\nÚltima entrada da API: {input} (telemetria por turno; pode contar o mesmo prefixo várias vezes em rodadas com ferramentas)\nÚltima saída da API: {output}\nHit/miss do cache: {cache} (apenas para telemetria/custo)\nTokens acumulados: {total} (telemetria de uso da sessão)\nCusto aproximado: {cost}\nMensagens da API: {api_messages}\nMensagens do chat: {chat_messages}\nModelo: {model}", + "KbScrollTranscript": "Rolar transcrição, navegar histórico de entrada ou selecionar anexos do compositor", + "KbNavigateHistory": "Navegar histórico de entrada", + "KbBrowseHistory": "Navegar histórico da conversa", + "KbScrollTranscriptAlt": "Rolar transcrição", + "KbScrollPage": "Rolar transcrição por página", + "KbJumpTopBottom": "Pular para topo / fim da transcrição", + "KbJumpTopBottomEmpty": "Pular para topo / fim (quando entrada vazia)", + "KbJumpToolBlocks": "Pular entre blocos de saída de ferramentas", + "KbMoveCursor": "Mover cursor no compositor", + "KbJumpLineStartEnd": "Pular para início / fim da linha", + "KbDeleteChar": "Excluir caractere antes / depois do cursor, ou remover anexo selecionado", + "KbClearDraft": "Limpar rascunho atual", + "KbStashDraft": "Estacionar rascunho atual (`/stash pop` restaura)", + "KbSearchHistory": "Buscar histórico de prompts e recuperar rascunhos locais", + "KbInsertNewline": "Inserir nova linha no compositor", + "KbSendDraft": "Enviar rascunho atual", + "KbCloseMenu": "Fechar menu, cancelar requisição, descartar rascunho ou limpar entrada", + "KbCancelOrExit": "Cancelar requisição ou sair quando ocioso", + "KbShellControls": "Enviar o comando em primeiro plano para segundo plano", + "KbExitEmpty": "Sair quando entrada vazia", + "KbCommandPalette": "Abrir paleta de comandos", + "KbCancelBackgroundShellJobs": "Cancelar todos os trabalhos shell em segundo plano em execução (barra lateral Tasks)", + "KbFuzzyFilePicker": "Abrir seletor de arquivo fuzzy (insere @path ao pressionar Enter)", + "KbCompactInspector": "Abrir inspetor compacto de contexto da sessão", + "KbLastMessagePager": "Abrir paginador para última mensagem (quando entrada vazia)", + "KbSelectedDetails": "Abrir detalhes da ferramenta ou mensagem selecionada (quando entrada vazia)", + "KbToolDetailsPager": "Abrir paginador de detalhes da ferramenta", + "KbThinkingPager": "Abrir Activity Detail", + "KbLiveTranscript": "Abrir sobreposição de transcrição ao vivo (auto-scroll)", + "KbBacktrackMessage": "Retroceder para mensagem anterior do usuário (esquerda/direita, Enter para rebobinar)", + "KbCompleteCycleModes": "Completar /command, enfileirar follow-up, ciclar modos; Shift+Tab cicla esforço de raciocínio", + "KbJumpPlanAgentYolo": "Acionar slots da hotbar", + "KbAltJumpPlanAgentYolo": "Salto alternativo para modo Plan / Agent / YOLO", + "KbFocusSidebar": "Focar barra lateral Pinned / Tasks / Agents / Context / Auto / Ocultar", + "KbSessionPicker": "Abrir seletor de sessões", + "KbPasteAttach": "Colar texto ou anexar imagem da área de transferência", + "KbCopySelection": "Copiar seleção atual (Cmd+C no macOS)", + "KbContextMenu": "Abrir ações de contexto para colar, seleção, detalhes, contexto e ajuda", + "KbAttachPath": "Adicionar arquivo ou diretório local ao contexto", + "KbHelpOverlay": "Abrir esta sobreposição de ajuda (quando entrada vazia)", + "KbToggleHelp": "Alternar sobreposição de ajuda", + "KbToggleHelpSlash": "Alternar sobreposição de ajuda", + "HelpUsageLabel": "Uso:", + "HelpAliasesLabel": "Apelidos:", + "SettingsTitle": "Configurações:", + "SettingsConfigFile": "Arquivo de configuração:", + "ClearConversation": "Conversa limpa", + "ClearConversationBusy": "Conversa limpa (estado do plano ocupado; execute /clear novamente se necessário)", + "ModelChanged": "Modelo alterado: {old} →, {new}", + "LinksTitle": "Links dos provedores:", + "LinksDashboard": "Painel:", + "LinksDocs": "Documentação:", + "LinksTip": "Dica: use a variável de ambiente mostrada para seu provedor ou salve a chave com `codewhale auth set --provider `.", + "SubagentsFetching": "Buscando status dos workers Fleet...", + "HelpUnknownCommand": "Comando desconhecido: {topic}", + "HomeDashboardTitle": "Painel Inicial do codewhale", + "HomeModel": "Modelo:", + "HomeMode": "Modo:", + "HomeHistory": "Histórico:", + "HomeQueued": "Enfileirado:", + "HomeSubagents": "Workers Fleet:", + "HomeQuickActions": "Ações Rápidas", + "HomeQuickLinks": "/links - Links do painel e API", + "HomeQuickSkills": "/skills - Listar skills disponíveis", + "HomeQuickConfig": "/config - Abrir editor interativo de configuração", + "HomeQuickSettings": "/settings - Exibir configurações persistentes", + "HomeQuickModel": "/model - Alternar ou visualizar modelo", + "HomeQuickSubagents": "/fleet status - Status dos workers Fleet", + "HomeQuickTaskList": "/task list - Exibir fila de tarefas em segundo plano", + "HomeQuickHelp": "/help - Exibir ajuda", + "HomeModeTips": "Dicas de Modo", + "HomeAgentModeTip": "Modo Agent - Use ferramentas para tarefas autônomas", + "HomeAgentModeReviewTip": " Digite /mode plan para revisar antes de executar", + "HomeAgentModeYoloTip": " Digite /mode yolo para habilitar acesso total às ferramentas", + "HomeYoloModeTip": "Modo YOLO - Acesso total a ferramentas, sem aprovações", + "HomeYoloModeCaution": " Tenha cuidado com operações destrutivas!", + "HomePlanModeTip": "Modo Plan - Planeje antes de implementar", + "HomePlanModeChecklistTip": " Use /mode plan para criar checklists estruturados", + "HomeGoalModeTip": "Rastreamento de Goal - Use /goal para rastrear um objetivo persistente", + "OnboardLanguageTitle": "Escolha o idioma", + "OnboardLanguageBlurb": "Escolha o idioma da interface. Você pode mudá-lo a qualquer momento com `/settings set locale `.", + "OnboardLanguageFooter": "Pressione 1-7 para escolher, ou Enter para manter a configuração atual", + "OnboardApiKeyTitle": "Conecte sua chave de API DeepSeek", + "OnboardApiKeyStep1": "Passo 1. Abra https://platform.deepseek.com/api_keys e crie uma chave.", + "OnboardApiKeyStep2": "Passo 2. Cole abaixo e pressione Enter.", + "OnboardApiKeySavedHint": "Salvo em ~/.codewhale/config.toml para funcionar em qualquer pasta.", + "OnboardApiKeyFormatHint": "Cole a chave inteira como foi emitida (sem espaços ou quebras de linha).", + "OnboardApiKeyPlaceholder": "(cole a chave aqui)", + "OnboardApiKeyLabel": "Chave: ", + "OnboardApiKeyFooter": "Enter para salvar, Esc para voltar.", + "OnboardTrustTitle": "Confiar no diretório", + "OnboardTrustQuestion": "Você confia no conteúdo deste diretório?", + "OnboardTrustLocationPrefix": "Você está em ", + "OnboardTrustRiskHint": "Trabalhar com conteúdo não confiável aumenta o risco de injeção de prompt.", + "OnboardTrustEffectHint": "Confiar neste diretório o registra na configuração global e habilita o modo workspace confiável.", + "OnboardTrustFooterPrefix": "Pressione ", + "OnboardTrustFooterMiddle": " para confiar e continuar, ", + "OnboardTrustFooterSuffix": " para sair", + "OnboardTipsTitle": "Comece simples", + "OnboardTipsLine1": "Escreva a tarefa em linguagem natural. Use /help ou Ctrl+K para comandos.", + "OnboardTipsLine2": "O composer inferior é multilinhas: Enter envia, Alt+Enter ou Ctrl+J adiciona uma nova linha.", + "OnboardTipsLine3": "Mude de modo apenas quando o trabalho mudar: Plan para revisar antes, Agent para execução, YOLO para auto-aprovação.", + "OnboardTipsLine4": "Ctrl+R retoma sessões anteriores, e Esc cancela o rascunho ou overlay atual.", + "OnboardTipsFooterEnter": "Pressione Enter", + "OnboardTipsFooterAction": " para abrir o workspace", + "CtxMenuTitle": " Clique direito ", + "CtxMenuCopySelection": "Copiar seleção", + "CtxMenuCopySelectionDesc": "copiar texto selecionado da transcrição", + "CtxMenuOpenSelection": "Abrir seleção", + "CtxMenuOpenSelectionDesc": "mostrar texto selecionado no visualizador", + "CtxMenuClearSelection": "Limpar seleção", + "CtxMenuOpenDetails": "Abrir detalhes", + "CtxMenuCopyMessage": "Copiar mensagem", + "CtxMenuCopyMessageDesc": "copiar célula da transcrição clicada", + "CtxMenuOpenInEditor": "Abrir no editor", + "CtxMenuOpenInEditorDesc": "abrir file:line no $EDITOR", + "CtxMenuShowCell": "Mostrar célula", + "CtxMenuShowCellDesc": "reexibir esta célula da transcrição", + "CtxMenuHideCell": "Ocultar célula", + "CtxMenuHideCellDesc": "recolher esta célula da transcrição", + "CtxMenuShowHidden": "Mostrar ocultas", + "CtxMenuShowHiddenDesc": "reexibir todas as células recolhidas", + "CtxMenuPaste": "Colar", + "CtxMenuPasteDesc": "inserir área de transferência no compositor", + "CtxMenuCmdPalette": "Paleta de comandos", + "CtxMenuCmdPaletteDesc": "comandos, habilidades e ferramentas", + "CtxMenuContextInspector": "Inspetor de contexto", + "CtxMenuContextInspectorDesc": "contexto ativo e dicas de cache", + "CtxMenuHelp": "Ajuda", + "CtxMenuHelpDesc": "atalhos de teclado e comandos", + "FanoutCounts": "{done} concluído · {running} em execução · {failed} falhou · {pending} pendente", + "ModePickerPrompt": "Escolha como o CodeWhale deve operar:", + "AppModeAgent": "Agente", + "AppModePlan": "Plano", + "AppModeAgentHint": "Execução normal com aprovações", + "AppModePlanHint": "Planeje antes de executar", + "AppModeYoloHint": "Aprovação automática; shell habilitado", + "VimModeInsert": "-- INSERIR --", + "ApprovalRiskReview": "REVISÃO", + "ApprovalRiskDestructive": "DESTRUTIVO", + "ApprovalCategorySafe": "Seguro", + "ApprovalCategoryFileWrite": "Escrita de Arquivo", + "ApprovalCategoryNetwork": "Rede", + "ApprovalCategoryMcpRead": "Leitura MCP", + "ApprovalCategoryMcpAction": "Ação MCP", + "ApprovalCategoryUnknown": "Desconhecido", + "ApprovalFieldType": "Tipo:", + "ApprovalFieldAbout": "Sobre:", + "ApprovalFieldImpact": "Impacto:", + "ApprovalFieldParams": "Parâmetros:", + "ApprovalOptionApproveOnce": "Aprovar uma vez", + "ApprovalOptionApproveAlways": "Aprovar sempre para este tipo", + "ApprovalOptionDeny": "Negar esta chamada", + "ApprovalOptionAbortTurn": "Abortar turno", + "ApprovalBlockTitle": "aprovação", + "ApprovalControlsHint": " · v: parâmetros · Esc: abortar", + "ApprovalChooseHint": "Escolha: ", + "ApprovalChooseAction": "Enter para selecionar, ou pressione y/a/d diretamente", + "ApprovalIntentLabel": "Intenção: ", + "ApprovalMoreLines": " … (+{count} linhas)", + "ElevationTitleSandboxDenied": " ⚠, Sandbox Negado ", + "ElevationTitleRequired": " Elevação de Sandbox Necessária ", + "ElevationFieldTool": " Ferramenta: ", + "ElevationFieldCmd": " Comando: ", + "ElevationFieldReason": " Motivo: ", + "ElevationImpactHeader": " Impacto se aprovado:", + "ElevationImpactNetwork": " - retry de rede permite downloads externos e requisições HTTP", + "ElevationImpactWrite": " - retry de escrita expande o escopo do sistema de arquivos para esta chamada", + "ElevationImpactFullAccess": " - acesso total remove todas as restrições de sandbox para este retry", + "ElevationPromptProceed": " Escolha como prosseguir:", + "ElevationOptionNetwork": "Permitir rede externa", + "ElevationOptionWrite": "Permitir acesso extra de escrita", + "ElevationOptionFullAccess": "Acesso total (sistema de arquivos + rede)", + "ElevationOptionAbort": "Abortar", + "ElevationOptionNetworkDesc": "Retry esta chamada com acesso de rede externa para downloads e requisições HTTP", + "ElevationOptionWriteDesc": "Retry esta chamada com escopo adicional de sistema de arquivos gravável", + "ElevationOptionFullAccessDesc": "Retry sem limites de sandbox; concede acesso irrestrito ao sistema de arquivos e rede", + "ElevationOptionAbortDesc": "Cancelar esta execução de ferramenta", + "CtxInspTitle": "Inspetor de contexto", + "CtxInspSessionContext": "Contexto da sessão", + "CtxInspSystemPrompt": "Estrutura do prompt do sistema", + "CtxInspReferences": "Referências", + "CtxInspRecentTools": "Ferramentas recentes", + "CtxInspModel": "Modelo", + "CtxInspWorkspace": "Espaço de trabalho", + "CtxInspSession": "Sessão", + "CtxInspContext": "Contexto", + "CtxInspTranscript": "Transcrição", + "CtxInspWorkspaceStatus": "Status do espaço de trabalho", + "CtxInspNotSampledYet": "ainda não amostrado", + "CtxInspHigh": "alto", + "CtxInspCritical": "crítico", + "CtxInspIncluded": "incluído", + "CtxInspAttached": "anexado", + "CtxInspNotIncluded": "não incluído", + "CtxInspOutputCaptured": "saída capturada", + "CtxInspNoOutputYet": "nenhuma saída ainda", + "CtxInspNoSystemPrompt": "Nenhum prompt de sistema definido.", + "CtxInspNoReferences": "Nenhuma referência de arquivo, diretório ou mídia registrada ainda.", + "CtxInspNoToolActivity": "Nenhuma atividade de ferramenta registrada ainda.", + "CtxInspVHint": "Abra o cartão correspondente e pressione v para detalhes completos.", + "CtxInspCells": "células", + "CtxInspApiMessages": "mensagens da API", + "CtxInspActive": "ativo", + "CtxInspCell": "célula", + "CtxInspMoreReferences": "mais referência(s)", + "CtxInspStablePrefix": "Prefixo estável", + "CtxInspVolatileWorkingSet": "Conjunto de trabalho volátil", + "CtxInspFirstLine": "Primeira linha", + "CtxInspTextPromptLayers": "Camadas de prompt de texto", + "CtxInspSingleTextBlob": "Bloco de texto único", + "CtxInspBlocks": "bloco(s)", + "CtxInspBlock": "bloco", + "CtxInspTokens": "token(s)", + "CtxInspLayers": "camada(s)", + "CtxInspNone": "nenhum", + "CtxInspEmpty": "(vazio)", + "CtxInspCacheFriendly": "amigável ao cache", + "CtxInspChangesByTurn": "muda por sessão/turno", + "CtxInspStablePrefixOnly": "apenas prefixo estável", + "CtxInspCacheTip": "Dica: Blocos de prefixo estável são elegíveis para cache de prefixo DeepSeek V4. Alterações no conjunto de trabalho volátil quebram o cache apenas no final.", + "ToolFamilyRead": "ler", + "ToolFamilyPatch": "corrigir", + "ToolFamilyRun": "executar", + "ToolFamilyFind": "buscar", + "ToolFamilyDelegate": "delegar", + "ToolFamilyVerify": "verificar", + "ToolFamilyThink": "pensar", + "ToolFamilyGeneric": "ferramenta", + "CmdVoiceDescription": "Alternar entrada de voz: gravar fala e transcrever para texto", + "CmdVoiceSendDescription": "Alternar envio automático por voz: envia quando a transcrição termina com \"send it\"", + "CmdVoiceControlDescription": "Alternar controle por voz: ditado assistido por IA", + "VoiceEnabled": "Entrada de voz ativada. Fale para gravar.", + "VoiceDisabled": "Entrada de voz desativada.", + "VoiceSendEnabled": "Envio automático por voz ativado.", + "VoiceSendDisabled": "Envio automático por voz desativado.", + "VoiceControlEnabled": "Controle por voz ativado.", + "VoiceControlDisabled": "Controle por voz desativado.", + "VoiceErrNoAuth": "Voz: nenhuma chave de API configurada para o provedor ativo", + "VoiceErrNoRecorder": "Voz: nenhuma ferramenta de gravação encontrada. Instale sox, arecord ou rec.", + "VoiceErrNetwork": "Voz: falha na solicitação de transcrição", + "VoiceErrEmptySend": "Voz: nada para enviar", + "VoiceErrTooShort": "Voz: nenhuma fala detectada, gravação muito curta", + "VoiceRecording": "🎙 Gravando... fale agora", + "VoiceProcessing": "🎙 Transcrevendo...", + "VoiceTranscribed": "🎙 Transcrito" +} diff --git a/crates/tui/locales/vi.json b/crates/tui/locales/vi.json new file mode 100644 index 0000000000..95ff9fe61f --- /dev/null +++ b/crates/tui/locales/vi.json @@ -0,0 +1,426 @@ +{ + "ComposerPlaceholder": "Nhập nhiệm vụ hoặc sử dụng /.", + "HistorySearchPlaceholder": "Tìm kiếm lịch sử câu lệnh...", + "HistorySearchTitle": "Tìm kiếm lịch sử", + "HistoryHintMove": "Lên/Xuống để di chuyển", + "HistoryHintAccept": "Enter để chấp nhận", + "HistoryHintRestore": "Esc để khôi phục", + "HistoryNoMatches": " Không tìm thấy kết quả", + "StatusPickerTitle": " Dòng trạng thái ", + "StatusPickerInstruction": "Chọn các thành phần bạn muốn hiển thị ở cuối màn hình:", + "StatusPickerActionToggle": "bật/tắt ", + "StatusPickerActionAll": "tất cả ", + "StatusPickerActionNone": "không ", + "StatusPickerActionSave": "lưu ", + "StatusPickerActionCancel": "huỷ ", + "ConfigTitle": "Cấu hình phiên làm việc", + "ConfigModalTitle": " Cấu hình ", + "ConfigSearchPlaceholder": "Nhập để lọc kết quả", + "ConfigNoSettings": " Không có cài đặt nào khả dụng.", + "ConfigNoMatchesPrefix": " Không có cài đặt nào khớp với ", + "ConfigFilteredSettings": " Cài đặt đã lọc", + "ConfigShowing": " Đang hiển thị", + "ConfigFooterDefault": " gõ=lọc, Lên/Xuống=chọn, Enter/e=sửa, Esc/q=đóng ", + "ConfigFooterScrollable": " gõ=lọc, Lên/Xuống=chọn, Enter/e=sửa, PgUp/PgDn=cuộn, Esc/q=đóng ", + "ConfigFooterFiltered": " gõ=lọc, Backspace=xóa, Ctrl+U/Esc=xóa sạch, Enter=sửa ", + "ConfigSectionProvider": "Nhà cung cấp", + "ConfigSectionModel": "Mô hình", + "ConfigSectionPermissions": "Quyền hạn", + "ConfigSectionNetwork": "Mạng", + "ConfigSectionDisplay": "Hiển thị", + "ConfigSectionComposer": "Soạn thảo", + "ConfigSectionSidebar": "Thanh bên", + "ConfigSectionHistory": "Lịch sử", + "ConfigSectionExperimental": "Thử nghiệm", + "ConfigScopeSession": "PHIÊN", + "ConfigScopeSaved": "ĐÃ LƯU", + "ConfigEditCancelled": "Đã hủy chỉnh sửa", + "ConfigEditTitlePrefix": "Sửa ", + "ConfigEditScopeLabel": "Phạm vi: ", + "ConfigEditCurrentLabel": "Hiện tại: ", + "ConfigEditHintLabel": "Gợi ý: ", + "ConfigEditNewLabel": "Mới: ", + "ConfigEditFooter": " Enter=áp dụng, Esc=hủy, Ctrl+U=xóa, Ctrl+A=tất cả, ←/→=di chuyển ", + "ConfigRowEffective": " (hiệu lực {currency})", + "ConfigDefaultValue": "(mặc định)", + "ConfigDefaultReasoning": "(cấu hình/mặc định)", + "ConfigUnavailable": "(không khả dụng)", + "HelpTitle": "Trợ giúp", + "HelpFilterPlaceholder": "Nhập để lọc", + "HelpFilterPrefix": "Bộ lọc: ", + "HelpNoMatches": " Không tìm thấy kết quả.", + "HelpSlashCommands": "Các lệnh bắt đầu bằng dấu gạch chéo (/)", + "HelpKeybindings": "Phím tắt", + "HelpFooterTypeFilter": " nhập để lọc ", + "HelpFooterMove": " Lên/Xuống để di chuyển ", + "HelpFooterJump": " PgUp/PgDn để nhảy trang ", + "HelpFooterClose": " Esc để đóng ", + "CmdAnchorDescription": "Ghim một dữ kiện không bị ảnh hưởng khi nén (tự động đưa vào ngữ cảnh)", + "CmdAttachDescription": "Đính kèm hình ảnh/video; sử dụng @path cho tệp văn bản hoặc thư mục", + "CmdCacheDescription": "Hiển thị thống kê hit/miss của bộ nhớ đệm tiền tố DeepSeek trong N lượt gần nhất", + "CmdChangeDescription": "Hiển thị thông tin nhật ký thay đổi mới nhất", + "CmdChangeHeader": "Nhật Ký Thay Đổi Mới Nhất", + "CmdChangeTranslationQueued": "Ghi chú phát hành bằng tiếng Anh hiển thị bên dưới. Bản dịch sẽ được yêu cầu tiếp theo; nếu nhà cung cấp không khả dụng, văn bản tiếng Anh này sẽ được dùng làm dự phòng.", + "CmdChangeTranslationUnavailable": "Ghi chú phát hành bằng tiếng Anh hiển thị bên dưới. Bản dịch không khả dụng vì phiên hiện tại không có mã khóa API hoặc đang ngoại tuyến.", + "CmdChangePreviousVersion": "Phiên bản trước: {version} — chạy `/change {version}` để xem", + "CmdBalanceDescription": "Kiểm tra số dư tài khoản của nhà cung cấp dịch vụ đang hoạt động", + "CmdClearDescription": "Xóa lịch sử trò chuyện", + "CmdCompactDescription": "Kích hoạt nén ngữ cảnh để giải phóng không gian", + "CmdPurgeDescription": "Cho agent cắt gọn lịch sử trò chuyện để giải phóng ngữ cảnh", + "CmdConfigDescription": "Mở trình chỉnh sửa cấu hình tương tác", + "CmdContextDescription": "Mở trình kiểm tra ngữ cảnh phiên thu gọn", + "CmdCostDescription": "Hiển thị chi tiết chi phí của phiên làm việc", + "CmdDiffDescription": "Hiển thị các thay đổi của tệp kể từ khi bắt đầu phiên", + "CmdEditDescription": "Chỉnh sửa và gửi lại tin nhắn gần nhất", + "CmdExitDescription": "Thoát ứng dụng", + "CmdExportDescription": "Xuất cuộc trò chuyện sang định dạng Markdown", + "CmdFeedbackDescription": "Tạo một URL để gửi phản hồi trên GitHub", + "CmdHfDescription": "Kiểm tra thiết lập và khái niệm Hugging Face MCP", + "CmdHelpDescription": "Hiển thị thông tin trợ giúp", + "CmdProfileDescription": "Chuyển sang profile cấu hình đã đặt tên", + "CmdHomeDescription": "Hiển thị bảng điều khiển trang chủ với số liệu thống kê và hành động nhanh", + "CmdHooksDescription": "Liệt kê các lifecycle hook đã cấu hình (chỉ đọc)", + "CmdAgentDescription": "Mở một phiên sub-agent nền: /agent [0-3] ", + "CmdGoalDescription": "Đặt mục tiêu cho phiên với giới hạn token tùy chọn", + "CmdInitDescription": "Tạo tệp AGENTS.md cho dự án", + "CmdLspDescription": "Bật hoặc tắt tính năng chẩn đoán LSP", + "CmdShareDescription": "Xuất phiên hiện tại thành một liên kết web có thể chia sẻ", + "CmdJobsDescription": "Kiểm tra và kiểm soát các lệnh chạy ngầm", + "CmdLinksDescription": "Hiển thị liên kết token, bảng điều khiển và tài liệu của nhà cung cấp", + "CmdLoadDescription": "Tải phiên làm việc từ tệp", + "CmdLogoutDescription": "Xóa khóa API và quay lại bước thiết lập", + "CmdMcpDescription": "Mở hoặc quản lý các máy chủ MCP", + "CmdMemoryDescription": "Kiểm tra hoặc quản lý tệp bộ nhớ người dùng liên tục", + "CmdModeDescription": "Chuyển đổi chế độ hoặc mở bảng chọn: /mode [agent|plan|yolo|1|2|3]", + "CmdModelDescription": "Chuyển đổi hoặc xem mô hình AI hiện tại", + "CmdModelsDescription": "Liệt kê các mô hình khả dụng từ API", + "CmdModelDbDescription": "Duyệt cơ sở dữ liệu tham chiếu mô hình tích hợp", + "CmdNetworkDescription": "Quản lý các quy tắc cho phép và từ chối mạng", + "CmdNoteDescription": "Thêm, liệt kê, sửa hoặc xóa ghi chú trong không gian làm việc", + "CmdThemeDescription": "Chuyển đổi giao diện hoặc mở bảng chọn giao diện", + "CmdProviderDescription": "Chuyển đổi hoặc xem backend LLM đang hoạt động (deepseek | nvidia-nim | ollama)", + "CmdQueueDescription": "Xem hoặc chỉnh sửa các tin nhắn đang chờ xử lý", + "CmdQueueUsage": "Cách dùng: /queue [list|send |edit |drop |clear]", + "CmdQueueDraftHeader": "Đang chỉnh sửa tin nhắn đang chờ:", + "CmdQueueNoMessages": "Không có tin nhắn đang chờ", + "CmdQueueListHeader": "Tin nhắn đang chờ ({count}):", + "CmdQueueTip": "Mẹo: /queue send để gửi ngay, /queue drop để xóa", + "CmdQueueAlreadyEditing": "Đã đang chỉnh sửa một tin nhắn đang chờ. Hãy gửi nó hoặc dùng /queue clear để hủy.", + "CmdQueueNotFound": "Không tìm thấy tin nhắn đang chờ", + "CmdQueueEditingStatus": "Đang chỉnh sửa tin nhắn đang chờ {index}", + "CmdQueueEditingMessage": "Đang chỉnh sửa tin nhắn đang chờ {index} (nhấn Enter để xếp lại hàng/gửi)", + "CmdQueueDropped": "Đã xóa tin nhắn đang chờ {index}", + "CmdQueueAlreadyEmpty": "Hàng đợi đã trống", + "CmdQueueCleared": "Đã xóa hàng đợi", + "CmdQueueMissingIndex": "Thiếu chỉ mục. Cách dùng: /queue edit hoặc /queue drop ", + "CmdQueueIndexPositive": "Chỉ mục phải là số dương", + "CmdQueueIndexMin": "Chỉ mục phải >= 1", + "CmdRelayDescription": "Tạo một phiên tiếp sức cho một luồng mới", + "CmdRenameDescription": "Đổi tên phiên làm việc hiện tại", + "CmdRestoreDescription": "Khôi phục không gian làm việc về bản chụp trước/sau lượt. Nếu không có đối số, hiển thị các bản chụp gần đây.", + "CmdRetryDescription": "Thử lại yêu cầu gần nhất", + "CmdReviewDescription": "Chạy một quy trình xem xét mã nguồn có cấu trúc trên tệp, diff hoặc PR", + "CmdRlmDescription": "Mở một ngữ cảnh RLM liên tục: /rlm [0-3] ", + "CmdSaveDescription": "Lưu phiên làm việc vào tệp", + "CmdForkDescription": "Rẽ nhánh (fork) cuộc hội thoại hiện tại thành một phiên song song", + "CmdNewDescription": "Bắt đầu một phiên lưu mới", + "CmdSessionsDescription": "Mở bảng chọn lịch sử phiên làm việc", + "CmdSettingsDescription": "Hiển thị các cài đặt liên tục", + "CmdSkillDescription": "Kích hoạt một kỹ năng, hoặc cài đặt/cập nhật/gỡ bỏ/tin cậy một kỹ năng cộng đồng", + "CmdSkillsDescription": "Liệt kê các kỹ năng cục bộ (lọc bằng `/skills `; --remote để duyệt kho lưu trữ được kiểm duyệt)", + "CmdStashDescription": "Tạm cất hoặc khôi phục bản nháp (Ctrl+S để cất, /stash list/pop để xem/lấy ra)", + "CmdStatusDescription": "Hiển thị trạng thái thời gian chạy của phiên", + "CmdStatuslineDescription": "Cấu hình các mục hiển thị ở thanh trạng thái dưới cùng", + "CmdFleetDescription": "Mở thiết lập Fleet hoặc trạng thái worker", + "CmdHotbarDescription": "Mở thiết lập Hotbar", + "CmdSubagentsDescription": "Lối tắt tương thích cho /fleet status", + "CmdSystemDescription": "Hiển thị prompt hệ thống hiện tại", + "CmdTaskDescription": "Quản lý các nhiệm vụ chạy ngầm", + "CmdTokensDescription": "Hiển thị lượng token đã sử dụng cho phiên", + "CmdTranslateDescription": "Bật/Tắt chế độ dịch đầu ra sang ngôn ngữ hệ thống hiện tại", + "CmdTranslateOff": "Đã tắt chế độ dịch đầu ra (hiển thị câu trả lời gốc của mô hình)", + "CmdTranslateOn": "Đã bật chế độ dịch đầu ra: câu trả lời của mô hình sẽ được hiển thị bằng tiếng Việt", + "TranslationInProgress": "Đang dịch câu trả lời của trợ lý...", + "TranslationComplete": "Đã dịch xong", + "TranslationFailed": "Dịch thất bại", + "CmdTrustDescription": "Quản lý quyền tin cậy không gian làm việc và danh sách trắng theo đường dẫn (`/trust add `, `/trust list`, `/trust on|off`)", + "CmdWorkspaceDescription": "Hiển thị hoặc chuyển đổi không gian làm việc hiện tại", + "CmdUndoDescription": "Xóa cặp tin nhắn gần nhất", + "CmdVerboseDescription": "Bật/Tắt chế độ hiển thị đầy đủ quá trình suy nghĩ trực tiếp", + "CmdCacheAdvice": "Tỷ lệ hit/miss trên ~70% sau lượt thứ ba cho thấy tiền tố bộ nhớ đệm ổn định; \nthấp hơn mức đó trong các phiên dài cho thấy có sự biến động tiền tố cần kiểm tra (#263).", + "CmdCacheFootnote": "* miss được suy ra từ đầu vào − hit khi nhà cung cấp không báo cáo rõ ràng.\n", + "CmdCacheHeader": "Thông tin cache — {count} lượt gần nhất trong tổng số {total} lượt (mô hình: {model})\n", + "CmdCacheNoData": "Lịch sử bộ nhớ đệm: chưa có lượt nào được ghi nhận.\n\n DeepSeek cung cấp `prompt_cache_hit_tokens` / `prompt_cache_miss_tokens` trên mỗi lượt API mà mô hình hỗ trợ (dòng V4). Hãy chạy một lượt và thử lại lệnh /cache.", + "CmdCacheTotals": "Σ vào: {sum_in} Σ hit: {sum_hit} Σ miss: {sum_miss} tỷ lệ hit trung bình: {avg}\n", + "CmdCostReport": "Chi Phí Phiên Làm Việc:\n─────────────────────────────\nTổng chi tiêu ước tính: {cost}\n\nCác ước tính chi phí mang tính xấp xỉ và sử dụng dữ liệu viễn trắc từ nhà cung cấp nếu có.\n\nBảng Giá API DeepSeek:\n─────────────────────────────\nThông tin chi tiết về giá chưa được cấu hình trong CLI này.", + "CmdTokensCacheHitOnly": "{hit} hit / không báo cáo miss", + "CmdTokensCacheMissOnly": "không báo cáo hit / {miss} miss", + "CmdTokensContextUnknownWindow": "~{estimated} / không rõ cửa sổ ngữ cảnh", + "FooterAgentSingular": "1 tác nhân", + "FooterAgentsPlural": "{count} tác nhân", + "FooterPressCtrlCAgain": "Nhấn Ctrl+C một lần nữa để thoát", + "FooterWorking": "đang xử lý", + "FooterBalancePrefix": "số dư", + "HelpSectionActions": "Hành động", + "HelpSectionClipboard": "Bộ nhớ tạm", + "HelpSectionEditing": "Chỉnh sửa đầu vào", + "HelpSectionHelp": "Trợ giúp", + "HelpSectionModes": "Chế độ", + "HelpSectionNavigation": "Điều hướng", + "HelpSectionSessions": "Phiên", + "CmdTokensNotReported": "không được báo cáo", + "CmdTokensReport": "Lượng Token Sử Dụng:\n─────────────────────────────\nNgữ cảnh hoạt động: {active}\nĐầu vào API gần nhất: {input} (viễn trắc theo lượt; có thể đếm lặp lại tiền tố qua các vòng công cụ)\nĐầu ra API gần nhất: {output}\nHit/miss bộ nhớ đệm: {cache} (chỉ dành cho viễn trắc/chi phí)\nToken tích lũy: {total} (dữ liệu viễn trắc sử dụng của phiên)\nChi phí phiên xấp xỉ: {cost}\nTin nhắn API: {api_messages}\nTin nhắn trò chuyện: {chat_messages}\nMô hình: {model}", + "KbScrollTranscript": "Cuộn bản ghi trò chuyện, điều hướng lịch sử nhập hoặc chọn tệp đính kèm", + "KbNavigateHistory": "Điều hướng lịch sử nhập", + "KbBrowseHistory": "Duyệt lịch sử cuộc trò chuyện", + "KbScrollTranscriptAlt": "Cuộn bản ghi trò chuyện", + "KbScrollPage": "Cuộn bản ghi trò chuyện theo trang", + "KbJumpTopBottom": "Nhảy lên đầu / xuống cuối bản ghi trò chuyện", + "KbJumpTopBottomEmpty": "Nhảy lên đầu / xuống cuối (khi khung nhập trống)", + "KbJumpToolBlocks": "Nhảy giữa các khối đầu ra của công cụ", + "KbMoveCursor": "Di chuyển con trỏ trong khung soạn thảo", + "KbJumpLineStartEnd": "Nhảy về đầu / cuối dòng", + "KbDeleteChar": "Xóa ký tự trước / sau con trỏ, hoặc xóa tệp đính kèm đã chọn", + "KbClearDraft": "Xóa bản nháp hiện tại", + "KbStashDraft": "Tạm cất bản nháp hiện tại (dùng `/stash pop` để khôi phục)", + "KbSearchHistory": "Tìm kiếm lịch sử câu lệnh và khôi phục các bản nháp cục bộ", + "KbInsertNewline": "Chèn một dòng mới trong khung soạn thảo", + "KbSendDraft": "Gửi bản nháp hiện tại", + "KbCloseMenu": "Đóng menu, hủy yêu cầu, hủy bản nháp hoặc xóa sạch đầu vào", + "KbCancelOrExit": "Hủy yêu cầu, hoặc thoát khi rảnh", + "KbShellControls": "Chuyển lệnh shell đang chạy ở tiền cảnh xuống nền", + "KbExitEmpty": "Thoát khi khung nhập trống", + "KbCommandPalette": "Mở bảng lệnh (command palette)", + "KbCancelBackgroundShellJobs": "Hủy mọi tác vụ shell nền đang chạy (thanh bên Tasks)", + "KbFuzzyFilePicker": "Mở trình tìm file nhanh (fuzzy) (chèn @path khi nhấn Enter)", + "KbCompactInspector": "Mở trình kiểm tra ngữ cảnh phiên thu gọn", + "KbLastMessagePager": "Mở trang xem cho tin nhắn cuối cùng (khi khung nhập trống)", + "KbSelectedDetails": "Mở chi tiết cho công cụ hoặc tin nhắn được chọn (khi khung nhập trống)", + "KbToolDetailsPager": "Mở trang xem chi tiết công cụ", + "KbThinkingPager": "Mở Chi Tiết Hoạt Động (Activity Detail)", + "KbLiveTranscript": "Mở lớp phủ bản ghi trực tiếp (tự động cuộn theo đuôi)", + "KbBacktrackMessage": "Quay lại tin nhắn trước đó của người dùng (nhấn Trái/Phải để chuyển bước, Enter để lùi lại)", + "KbCompleteCycleModes": "Hoàn thành /command, xếp hàng theo dõi lượt đang chạy, chuyển đổi chế độ; Shift+Tab để chuyển đổi mức độ suy luận", + "KbJumpPlanAgentYolo": "Kích hoạt các ô hotbar", + "KbAltJumpPlanAgentYolo": "Phím tắt thay thế để nhảy sang chế độ Plan / Agent / YOLO", + "KbFocusSidebar": "Focus vào thanh bên Pinned / Tasks / Agents / Context / Auto; Ctrl+Alt+0 để ẩn", + "KbSessionPicker": "Mở bảng chọn phiên làm việc", + "KbPasteAttach": "Dán văn bản hoặc đính kèm hình ảnh từ bộ nhớ tạm", + "KbCopySelection": "Sao chép vùng chọn hiện tại (Cmd+C trên macOS)", + "KbContextMenu": "Mở các hành động ngữ cảnh cho dán, vùng chọn, chi tiết tin nhắn, ngữ cảnh và trợ giúp", + "KbAttachPath": "Thêm một tệp văn bản cục bộ hoặc thư mục vào ngữ cảnh", + "KbHelpOverlay": "Mở lớp phủ trợ giúp này (khi khung nhập trống)", + "KbToggleHelp": "Bật/Tắt lớp phủ trợ giúp", + "KbToggleHelpSlash": "Bật/Tắt lớp phủ trợ giúp", + "HelpUsageLabel": "Sử dụng:", + "HelpAliasesLabel": "Bí danh:", + "SettingsTitle": "Cài đặt:", + "SettingsConfigFile": "Tệp cấu hình:", + "ClearConversation": "Đã xóa cuộc trò chuyện", + "ClearConversationBusy": "Đã xóa cuộc trò chuyện (trạng thái plan đang bận; chạy lại /clear nếu cần)", + "ModelChanged": "Đã thay đổi mô hình: {old} → {new}", + "LinksTitle": "Liên kết nhà cung cấp:", + "LinksDashboard": "Bảng điều khiển:", + "LinksDocs": "Tài liệu:", + "LinksTip": "Mẹo: Dùng biến môi trường được hiển thị cho nhà cung cấp, hoặc lưu khóa bằng `codewhale auth set --provider `.", + "SubagentsFetching": "Đang lấy trạng thái Fleet worker...", + "HelpUnknownCommand": "Lệnh không xác định: {topic}", + "HomeDashboardTitle": "Bảng Điều Khiển Trang Chủ codewhale", + "HomeModel": "Mô hình:", + "HomeMode": "Chế độ:", + "HomeWorkspace": "Không gian làm việc:", + "HomeHistory": "Lịch sử:", + "HomeTokens": "Token:", + "HomeQueued": "Trong hàng đợi:", + "HomeSubagents": "Fleet worker:", + "HomeSkill": "Kỹ năng:", + "HomeQuickActions": "Hành động nhanh", + "HomeQuickLinks": "/links - Các liên kết đến Dashboard & API", + "HomeQuickSkills": "/skills - Liệt kê các kỹ năng khả dụng", + "HomeQuickConfig": "/config - Mở trình chỉnh sửa cấu hình tương tác", + "HomeQuickSettings": "/settings - Hiển thị các cài đặt liên tục", + "HomeQuickModel": "/model - Xem hoặc chuyển đổi mô hình", + "HomeQuickSubagents": "/fleet status - Trạng thái Fleet worker", + "HomeQuickTaskList": "/task list - Hiển thị hàng đợi nhiệm vụ ngầm", + "HomeQuickHelp": "/help - Hiển thị trợ giúp", + "HomeModeTips": "Mẹo về Chế độ", + "HomeAgentModeTip": "Chế độ Agent - Sử dụng công cụ cho các nhiệm vụ tự chủ", + "HomeAgentModeReviewTip": " Nhập /mode plan để xem xét trước khi thực thi", + "HomeAgentModeYoloTip": " Nhập /mode yolo để bật toàn quyền truy cập công cụ", + "HomeYoloModeTip": "Chế độ YOLO - Toàn quyền truy cập công cụ, không cần phê duyệt", + "HomeYoloModeCaution": " Hãy cẩn thận với các thao tác mang tính phá hủy!", + "HomePlanModeTip": "Chế độ Plan - Thiết kế trước khi triển khai", + "HomePlanModeChecklistTip": " Sử dụng /mode plan để tạo danh sách kiểm tra có cấu trúc", + "HomeGoalModeTip": "Theo dõi mục tiêu - Dùng /goal để đặt mục tiêu làm việc", + "OnboardLanguageTitle": "Chọn ngôn ngữ của bạn", + "OnboardLanguageBlurb": "Chọn ngôn ngữ hiển thị. Bạn có thể thay đổi bất kỳ lúc nào bằng lệnh `/settings set locale `.", + "OnboardLanguageFooter": "Nhấn phím từ 1-7 để chọn, hoặc Enter để giữ cài đặt hiện tại", + "OnboardApiKeyTitle": "Kết nối khóa API DeepSeek của bạn", + "OnboardApiKeyStep1": "Bước 1. Truy cập https://platform.deepseek.com/api_keys và tạo một khóa.", + "OnboardApiKeyStep2": "Bước 2. Dán khóa vào bên dưới và nhấn Enter.", + "OnboardApiKeySavedHint": "Được lưu vào ~/.codewhale/config.toml để có thể hoạt động từ mọi thư mục.", + "OnboardApiKeyFormatHint": "Dán chính xác toàn bộ khóa (không chứa khoảng trắng hoặc xuống dòng).", + "OnboardApiKeyPlaceholder": "(dán khóa vào đây)", + "OnboardApiKeyLabel": "Khóa: ", + "OnboardApiKeyFooter": "Nhấn Enter để lưu, Esc để quay lại.", + "OnboardTrustTitle": "Tin cậy không gian làm việc", + "OnboardTrustQuestion": "Bạn có tin cậy nội dung của thư mục này không?", + "OnboardTrustLocationPrefix": "Bạn đang ở ", + "OnboardTrustRiskHint": "Làm việc với các nội dung không tin cậy sẽ tăng nguy cơ bị tấn công prompt injection.", + "OnboardTrustEffectHint": "Tin cậy thư mục này sẽ lưu lại vào cấu hình toàn cục và bật chế độ không gian làm việc tin cậy.", + "OnboardTrustFooterPrefix": "Nhấn ", + "OnboardTrustFooterMiddle": " để tin cậy và tiếp tục, ", + "OnboardTrustFooterSuffix": " để thoát", + "OnboardTipsTitle": "Bắt đầu đơn giản", + "OnboardTipsLine1": "Viết nhiệm vụ bằng ngôn ngữ tự nhiên. Sử dụng /help hoặc Ctrl+K khi bạn muốn dùng lệnh.", + "OnboardTipsLine2": "Khung nhập văn bản bên dưới hỗ trợ viết nhiều dòng: Enter để gửi, Alt+Enter hoặc Ctrl+J để xuống dòng.", + "OnboardTipsLine3": "Chỉ chuyển đổi chế độ khi tính chất công việc thay đổi: Plan để lập kế hoạch trước khi làm, Agent để tự động thực hiện, YOLO khi bạn muốn tự động phê duyệt.", + "OnboardTipsLine4": "Ctrl+R để khôi phục lại các phiên làm việc trước đó, và Esc để thoát khỏi bản nháp hoặc lớp phủ hiện tại.", + "OnboardTipsFooterEnter": "Nhấn Enter", + "OnboardTipsFooterAction": " để mở không gian làm việc", + "CtxMenuTitle": " Nhấp chuột phải ", + "CtxMenuCopySelection": "Sao chép vùng chọn", + "CtxMenuCopySelectionDesc": "ghi văn bản transcript đã chọn", + "CtxMenuOpenSelection": "Mở vùng chọn", + "CtxMenuOpenSelectionDesc": "hiển thị văn bản đã chọn trong trình xem", + "CtxMenuClearSelection": "Xóa vùng chọn", + "CtxMenuOpenDetails": "Mở chi tiết", + "CtxMenuCopyMessage": "Sao chép tin nhắn", + "CtxMenuCopyMessageDesc": "ghi ô transcript đã bấm", + "CtxMenuOpenInEditor": "Mở trong trình soạn thảo", + "CtxMenuOpenInEditorDesc": "mở file:line trong $EDITOR", + "CtxMenuShowCell": "Hiển thị ô", + "CtxMenuShowCellDesc": "hiển thị lại ô transcript này", + "CtxMenuHideCell": "Ẩn ô", + "CtxMenuHideCellDesc": "thu gọn ô transcript này", + "CtxMenuShowHidden": "Hiển thị mục ẩn", + "CtxMenuShowHiddenDesc": "hiển thị lại tất cả ô đã thu gọn", + "CtxMenuPaste": "Dán", + "CtxMenuPasteDesc": "chèn clipboard vào khung nhập", + "CtxMenuCmdPalette": "Bảng lệnh", + "CtxMenuCmdPaletteDesc": "lệnh, kỹ năng và công cụ", + "CtxMenuContextInspector": "Trình kiểm tra ngữ cảnh", + "CtxMenuContextInspectorDesc": "ngữ cảnh đang hoạt động và gợi ý bộ nhớ đệm", + "CtxMenuHelp": "Trợ giúp", + "CtxMenuHelpDesc": "phím tắt và lệnh", + "FanoutCounts": "{done} hoàn thành · {running} đang chạy · {failed} thất bại · {pending} chờ", + "ModePickerPrompt": "Chọn cách CodeWhale hoạt động:", + "AppModeAgent": "Tác nhân", + "AppModePlan": "Kế hoạch", + "AppModeAgentHint": "Thực thi bình thường, hỏi trước khi thay đổi", + "AppModePlanHint": "Lập kế hoạch trước khi thực thi", + "AppModeYoloHint": "Tự động phê duyệt; bật shell (toàn quyền)", + "VimModeNormal": "-- BÌNH THƯỜNG --", + "VimModeInsert": "-- CHÈN --", + "VimModeVisual": "-- TRỰC QUAN --", + "ApprovalRiskReview": "XEM XÉT", + "ApprovalRiskDestructive": "NGUY HẠI", + "ApprovalCategorySafe": "An toàn", + "ApprovalCategoryFileWrite": "Ghi Tệp", + "ApprovalCategoryNetwork": "Mạng", + "ApprovalCategoryMcpRead": "Đọc MCP", + "ApprovalCategoryMcpAction": "Hành động MCP", + "ApprovalCategoryUnknown": "Không xác định", + "ApprovalFieldType": "Loại:", + "ApprovalFieldAbout": "Mô tả:", + "ApprovalFieldImpact": "Tác động:", + "ApprovalFieldParams": "Tham số:", + "ApprovalOptionApproveOnce": "Phê duyệt một lần", + "ApprovalOptionApproveAlways": "Phê duyệt mọi lần cho loại này", + "ApprovalOptionDeny": "Từ chối lần gọi này", + "ApprovalOptionAbortTurn": "Hủy bỏ lượt", + "ApprovalBlockTitle": "phê duyệt", + "ApprovalControlsHint": " · v: tham số · Esc: hủy bỏ", + "ApprovalChooseHint": "Chọn: ", + "ApprovalChooseAction": "Enter để chọn, hoặc nhấn y/a/d trực tiếp", + "ApprovalIntentLabel": "Ý định: ", + "ApprovalMoreLines": " … (+{count} dòng)", + "ElevationTitleSandboxDenied": " ⚠ Sandbox Bị Từ Chối ", + "ElevationTitleRequired": " Yêu Cầu Nâng Cấp Sandbox ", + "ElevationFieldTool": " Công cụ: ", + "ElevationFieldCmd": " Lệnh: ", + "ElevationFieldReason": " Lý do: ", + "ElevationImpactHeader": " Tác động nếu được chấp thuận:", + "ElevationImpactNetwork": " - thử lại với mạng cho phép tải xuống và yêu cầu HTTP", + "ElevationImpactWrite": " - thử lại với quyền ghi mở rộng phạm vi hệ thống tệp", + "ElevationImpactFullAccess": " - truy cập đầy đủ loại bỏ hoàn toàn hạn chế sandbox", + "ElevationPromptProceed": " Chọn cách tiếp tục:", + "ElevationOptionNetwork": "Cho phép mạng ngoài", + "ElevationOptionWrite": "Cho phép quyền ghi bổ sung", + "ElevationOptionFullAccess": "Truy cập đầy đủ (hệ thống tệp + mạng)", + "ElevationOptionAbort": "Hủy bỏ", + "ElevationOptionNetworkDesc": "Thử lại cuộc gọi công cụ này với quyền truy cập mạng ngoài", + "ElevationOptionWriteDesc": "Thử lại cuộc gọi công cụ này với phạm vi hệ thống tệp có thể ghi bổ sung", + "ElevationOptionFullAccessDesc": "Thử lại không giới hạn sandbox; cấp quyền truy cập không hạn chế", + "ElevationOptionAbortDesc": "Hủy thực thi công cụ này", + "CtxInspTitle": "Trình kiểm tra ngữ cảnh", + "CtxInspSessionContext": "Ngữ cảnh phiên", + "CtxInspSystemPrompt": "Cấu trúc lời nhắc hệ thống", + "CtxInspReferences": "Tham chiếu", + "CtxInspRecentTools": "Công cụ gần đây", + "CtxInspModel": "Mô hình", + "CtxInspWorkspace": "Không gian làm việc", + "CtxInspSession": "Phiên", + "CtxInspContext": "Ngữ cảnh", + "CtxInspTranscript": "Bảng ghi", + "CtxInspWorkspaceStatus": "Trạng thái không gian làm việc", + "CtxInspNotSampledYet": "chưa lấy mẫu", + "CtxInspOk": "ổn", + "CtxInspHigh": "cao", + "CtxInspCritical": "nghiêm trọng", + "CtxInspIncluded": "đã bao gồm", + "CtxInspAttached": "đã đính kèm", + "CtxInspNotIncluded": "không bao gồm", + "CtxInspOutputCaptured": "đã thu được đầu ra", + "CtxInspNoOutputYet": "chưa có đầu ra", + "CtxInspNoSystemPrompt": "Chưa có lời nhắc hệ thống.", + "CtxInspNoReferences": "Chưa có tham chiếu tệp, thư mục hoặc phương tiện nào.", + "CtxInspNoToolActivity": "Chưa có hoạt động công cụ nào.", + "CtxInspVHint": "Mở thẻ phù hợp và nhấn v để biết chi tiết.", + "CtxInspCells": "ô", + "CtxInspApiMessages": "tin nhắn API", + "CtxInspActive": "đang hoạt động", + "CtxInspCell": "ô", + "CtxInspMoreReferences": "các tham chiếu khác", + "CtxInspStablePrefix": "Khối ổn định", + "CtxInspVolatileWorkingSet": "Vùng làm việc thay đổi", + "CtxInspFirstLine": "Dòng đầu", + "CtxInspTotal": "Tổng", + "CtxInspTextPromptLayers": "Lớp văn bản gợi ý", + "CtxInspSingleTextBlob": "Văn bản khối đơn", + "CtxInspBlocks": "khối", + "CtxInspBlock": "khối", + "CtxInspTokens": "token", + "CtxInspLayers": "lớp", + "CtxInspNone": "không", + "CtxInspEmpty": "(trống)", + "CtxInspCacheFriendly": "thân thiện với bộ nhớ đệm", + "CtxInspChangesByTurn": "thay đổi theo phiên/lượt", + "CtxInspStablePrefixOnly": "chỉ có tiền tố ổn định", + "CtxInspCacheTip": "Gợi ý: Các khối ổn định đủ điều kiện cho bộ nhớ đệm tiền tố DeepSeek V4. Thay đổi vùng làm việc chỉ phá vỡ bộ nhớ đệm ở phần cuối.", + "ToolFamilyRead": "đọc", + "ToolFamilyPatch": "vá", + "ToolFamilyRun": "chạy", + "ToolFamilyFind": "tìm", + "ToolFamilyDelegate": "ủy quyền", + "ToolFamilyVerify": "xác minh", + "ToolFamilyThink": "suy nghĩ", + "ToolFamilyGeneric": "công cụ", + "CmdVoiceDescription": "Bật/tắt nhập liệu bằng giọng nói: ghi âm và chuyển thành văn bản", + "CmdVoiceSendDescription": "Bật/tắt tự gửi bằng giọng nói: gửi khi bản ghi kết thúc bằng \"send it\"", + "CmdVoiceControlDescription": "Bật/tắt điều khiển giọng nói: đọc chính tả có AI hỗ trợ", + "VoiceEnabled": "Đã bật nhập liệu bằng giọng nói. Hãy nói để ghi âm.", + "VoiceDisabled": "Đã tắt nhập liệu bằng giọng nói.", + "VoiceSendEnabled": "Đã bật tự gửi bằng giọng nói.", + "VoiceSendDisabled": "Đã tắt tự gửi bằng giọng nói.", + "VoiceControlEnabled": "Đã bật điều khiển giọng nói.", + "VoiceControlDisabled": "Đã tắt điều khiển giọng nói.", + "VoiceErrNoAuth": "Giọng nói: nhà cung cấp hiện tại chưa có khóa API", + "VoiceErrNoRecorder": "Giọng nói: không tìm thấy công cụ ghi âm. Hãy cài sox, arecord hoặc rec.", + "VoiceErrNetwork": "Giọng nói: yêu cầu chuyển giọng nói thất bại", + "VoiceErrEmptySend": "Giọng nói: không có nội dung để gửi", + "VoiceErrTooShort": "Giọng nói: không phát hiện giọng nói, bản ghi quá ngắn", + "VoiceRecording": "🎙 Đang ghi âm... hãy nói", + "VoiceProcessing": "🎙 Đang chuyển thành văn bản...", + "VoiceTranscribed": "🎙 Đã chuyển xong" +} diff --git a/crates/tui/locales/zh-Hans.json b/crates/tui/locales/zh-Hans.json index c3deb720ce..3da7989bae 100644 --- a/crates/tui/locales/zh-Hans.json +++ b/crates/tui/locales/zh-Hans.json @@ -31,7 +31,6 @@ "ConfigSectionComposer": "编辑器", "ConfigSectionSidebar": "侧边栏", "ConfigSectionHistory": "历史", - "ConfigSectionMcp": "MCP", "ConfigSectionFleet": "舰队", "ConfigSectionExperimental": "实验", "ConfigScopeSession": "会话", @@ -92,14 +91,6 @@ "CmdLoadDescription": "从文件加载会话", "CmdLogoutDescription": "清除 API 密钥并返回设置", "CmdMcpDescription": "打开或管理 MCP 服务器", - "CmdPluginDescription": "List discovered plugin tools or show details for one", - "CmdPluginNoneFound": "No plugin tools discovered in {dir}", - "CmdPluginNotFound": "Plugin '{name}' not found", - "CmdPluginListHeader": "Plugin tools ({count}):", - "CmdPluginDetailDescription": "Description: {description}", - "CmdPluginDetailSchema": "Schema:\n{schema}", - "CmdPluginDetailApproval": "Approval: {approval}", - "CmdPluginDetailPath": "Path: {path}", "CmdMemoryDescription": "查看或管理持久用户记忆文件", "CmdModeDescription": "切换运行模式或打开选择器:/mode [agent|plan|yolo|1|2|3]", "CmdModelDescription": "切换或查看当前模型", @@ -137,9 +128,7 @@ "CmdSessionsDescription": "打开会话历史选择器", "CmdSettingsDescription": "显示持久化设置", "CmdSkillDescription": "激活技能,或安装/更新/卸载/信任社区技能", - "CmdSidebarDescription": "Toggle or focus the right sidebar", "CmdSkillsDescription": "列出本地技能(用 `/skills ` 按名称前缀过滤,--remote 浏览精选注册表)", - "CmdSlopDescription": "Inspect or export the debt ledger", "CmdStashDescription": "暂存或恢复输入草稿(Ctrl+S 暂存,/stash list|pop)", "CmdStatusDescription": "显示当前运行状态", "CmdStatuslineDescription": "配置底栏要显示哪些条目", @@ -321,7 +310,6 @@ "FanoutCounts": "{done} 已完成 · {running} 运行中 · {failed} 失败 · {pending} 等待中", "ModePickerPrompt": "选择 CodeWhale 的运行方式:", "AppModeAgent": "智能体", - "AppModeYolo": "YOLO", "AppModePlan": "计划", "AppModeAgentHint": "正常执行,变更前需批准", "AppModePlanHint": "先规划,再执行", @@ -333,7 +321,6 @@ "ApprovalRiskDestructive": "破坏性", "ApprovalCategorySafe": "安全", "ApprovalCategoryFileWrite": "文件写入", - "ApprovalCategoryShell": "Bash", "ApprovalCategoryNetwork": "网络", "ApprovalCategoryMcpRead": "MCP 读取", "ApprovalCategoryMcpAction": "MCP 操作", @@ -421,7 +408,6 @@ "ToolFamilyFind": "搜索", "ToolFamilyDelegate": "委派", "ToolFamilyFanout": "扇出", - "ToolFamilyRlm": "rlm", "ToolFamilyVerify": "验证", "ToolFamilyThink": "思考", "ToolFamilyGeneric": "工具", diff --git a/crates/tui/locales/zh-Hant.json b/crates/tui/locales/zh-Hant.json new file mode 100644 index 0000000000..2f691fd7d5 --- /dev/null +++ b/crates/tui/locales/zh-Hant.json @@ -0,0 +1,161 @@ +{ + "CmdRelayDescription": "為新執行緒建立會話接力摘要", + "CmdTranslateDescription": "切換輸出翻譯為目前系統語言的開關狀態", + "CmdTranslateOff": "輸出翻譯已關閉(顯示原始模型輸出)", + "CmdTranslateOn": "輸出翻譯已開啟:模型回覆將以繁體中文顯示", + "TranslationInProgress": "正在翻譯助理輸出...", + "TranslationComplete": "翻譯完成", + "TranslationFailed": "翻譯失敗", + "FooterBalancePrefix": "餘額", + "FanoutCounts": "{done} 已完成 · {running} 運行中 · {failed} 失敗 · {pending} 等待中", + "ModePickerPrompt": "選擇 CodeWhale 的運作方式:", + "AppModeAgent": "智能體", + "AppModePlan": "計畫", + "AppModeAgentHint": "正常執行,變更前需核准", + "AppModePlanHint": "先規劃,再執行", + "AppModeYoloHint": "自動核准;啟用 shell(完全存取)", + "VimModeNormal": "-- 一般 --", + "VimModeInsert": "-- 插入 --", + "VimModeVisual": "-- 可視 --", + "ApprovalRiskReview": "審查", + "ApprovalRiskDestructive": "破壞性", + "ApprovalCategorySafe": "安全", + "ApprovalCategoryFileWrite": "檔案寫入", + "ApprovalCategoryNetwork": "網路", + "ApprovalCategoryMcpRead": "MCP 讀取", + "ApprovalCategoryMcpAction": "MCP 操作", + "ApprovalCategoryUnknown": "未分類", + "ApprovalFieldType": "類型:", + "ApprovalFieldAbout": "說明:", + "ApprovalFieldImpact": "影響:", + "ApprovalFieldParams": "參數:", + "ApprovalOptionApproveOnce": "僅批准一次", + "ApprovalOptionApproveAlways": "本會話同類自動批准", + "ApprovalOptionDeny": "拒絕本次調用", + "ApprovalOptionAbortTurn": "終止本輪", + "ApprovalBlockTitle": "審批", + "ApprovalControlsHint": " · v:完整參數 · Esc:終止", + "ApprovalChooseHint": "選擇:", + "ApprovalChooseAction": "Enter 執行選中項,或直接按 y/a/d", + "ApprovalIntentLabel": "意圖:", + "ApprovalMoreLines": " … (還有 {count} 行)", + "ElevationTitleSandboxDenied": " ⚠, 沙箱拒絕 ", + "ElevationTitleRequired": " 沙箱提權 ", + "ElevationFieldTool": " 工具:", + "ElevationFieldCmd": " 命令:", + "ElevationFieldReason": " 原因:", + "ElevationImpactHeader": " 批准後的影響:", + "ElevationImpactNetwork": " - 網路重試允許外部下載和 HTTP 請求", + "ElevationImpactWrite": " - 寫入重試擴大此工具呼叫的檔案系統寫入範圍", + "ElevationImpactFullAccess": " - 完全訪問解除沙箱限制", + "ElevationPromptProceed": " 請選擇處理方式:", + "ElevationOptionNetwork": "允許外部網路訪問", + "ElevationOptionWrite": "允許額外寫入權限", + "ElevationOptionFullAccess": "完全訪問(檔案系統 + 網路)", + "ElevationOptionAbort": "中止", + "ElevationOptionNetworkDesc": "使用外部網路訪問重試此工具呼叫(下載和 HTTP 請求)", + "ElevationOptionWriteDesc": "重試此工具呼叫,擴大可寫入的檔案系統範圍", + "ElevationOptionFullAccessDesc": "無沙箱限制重試(授予無限制的檔案系統和網路訪問權限)", + "ElevationOptionAbortDesc": "取消此工具呼叫", + "CtxInspTitle": "上下文檢查器", + "CtxInspSessionContext": "會話上下文", + "CtxInspSystemPrompt": "系統提示結構", + "CtxInspReferences": "引用", + "CtxInspRecentTools": "最近使用的工具", + "CtxInspModel": "模型", + "CtxInspWorkspace": "工作區", + "CtxInspSession": "會話", + "CtxInspContext": "上下文", + "CtxInspTranscript": "記錄", + "CtxInspWorkspaceStatus": "工作區狀態", + "CtxInspNotSampledYet": "尚未取樣", + "CtxInspOk": "正常", + "CtxInspHigh": "較高", + "CtxInspCritical": "嚴重", + "CtxInspIncluded": "已包含", + "CtxInspAttached": "已附加", + "CtxInspNotIncluded": "未包含", + "CtxInspOutputCaptured": "已捕獲輸出", + "CtxInspNoOutputYet": "尚無輸出", + "CtxInspNoSystemPrompt": "未設定系統提示。", + "CtxInspNoReferences": "尚未記錄任何檔案、目錄或媒體引用。", + "CtxInspNoToolActivity": "尚未記錄任何工具活動。", + "CtxInspVHint": "開啟對應的卡片並按 v 檢視詳細資訊。", + "CtxInspCells": "儲存格", + "CtxInspApiMessages": "API 訊息", + "CtxInspActive": "作用中", + "CtxInspCell": "儲存格", + "CtxInspMoreReferences": "其他引用", + "CtxInspStablePrefix": "穩定前綴", + "CtxInspVolatileWorkingSet": "易變工作集", + "CtxInspFirstLine": "第一行", + "CtxInspTotal": "總計", + "CtxInspTextPromptLayers": "文字提示層", + "CtxInspSingleTextBlob": "單一文字塊", + "CtxInspBlocks": "個區塊", + "CtxInspBlock": "個區塊", + "CtxInspTokens": "個 token", + "CtxInspLayers": "個層", + "CtxInspNone": "無", + "CtxInspEmpty": "(空)", + "CtxInspCacheFriendly": "快取友好", + "CtxInspChangesByTurn": "按會話/輪次變化", + "CtxInspStablePrefixOnly": "僅穩定前綴", + "CtxInspCacheTip": "提示:穩定前綴區塊符合 DeepSeek V4 前綴快取條件。易變工作集的更改僅會破壞快取尾部。", + "ConfigSectionProvider": "提供商", + "ConfigSectionModel": "模型", + "ConfigSectionPermissions": "權限", + "ConfigSectionNetwork": "網路", + "ConfigSectionDisplay": "顯示", + "ConfigSectionComposer": "編輯器", + "ConfigSectionSidebar": "側邊欄", + "ConfigSectionHistory": "歷史", + "ConfigSectionFleet": "艦隊", + "ConfigSectionExperimental": "實驗", + "ConfigScopeSession": "會話", + "ConfigScopeSaved": "已儲存", + "ConfigEditCancelled": "編輯已取消", + "ConfigEditTitlePrefix": "編輯 ", + "ConfigEditScopeLabel": "範圍: ", + "ConfigEditCurrentLabel": "目前: ", + "ConfigEditHintLabel": "提示: ", + "ConfigEditNewLabel": "新值: ", + "ConfigEditFooter": " Enter=套用, Esc=取消, Ctrl+U=清除, Ctrl+A=全選, ←,/→,=移動 ", + "ConfigRowEffective": " (實際 {currency})", + "ConfigDefaultValue": "(預設)", + "ConfigDefaultReasoning": "(設定/預設)", + "ConfigUnavailable": "(無法使用)", + "StatusPickerTitle": " 狀態列 ", + "StatusPickerInstruction": "選擇要在底部顯示的項目:", + "StatusPickerActionToggle": "切換 ", + "StatusPickerActionAll": "全部 ", + "StatusPickerActionNone": "無 ", + "StatusPickerActionSave": "儲存 ", + "StatusPickerActionCancel": "取消 ", + "ToolFamilyRead": "讀取", + "ToolFamilyPatch": "修補", + "ToolFamilyRun": "執行", + "ToolFamilyFind": "搜尋", + "ToolFamilyDelegate": "委派", + "ToolFamilyFanout": "扇出", + "ToolFamilyVerify": "驗證", + "ToolFamilyThink": "思考", + "ToolFamilyGeneric": "工具", + "CmdVoiceDescription": "切換語音輸入:錄製語音並轉錄為文字", + "CmdVoiceSendDescription": "切換語音自動傳送:轉錄以「發送」或「send it」結尾時自動提交", + "CmdVoiceControlDescription": "切換語音控制:AI 輔助的語音聽寫(結合當前輸入內容)", + "VoiceEnabled": "語音輸入已開啟,開始說話即可錄製", + "VoiceDisabled": "語音輸入已關閉", + "VoiceSendEnabled": "語音自動傳送已開啟", + "VoiceSendDisabled": "語音自動傳送已關閉", + "VoiceControlEnabled": "語音控制已開啟", + "VoiceControlDisabled": "語音控制已關閉", + "VoiceErrNoAuth": "語音:目前供應商未設定 API 金鑰", + "VoiceErrNoRecorder": "語音:未找到錄音工具,請安裝 sox、arecord 或 rec", + "VoiceErrNetwork": "語音:轉錄請求失敗", + "VoiceErrEmptySend": "語音:沒有可傳送的內容", + "VoiceErrTooShort": "語音:未偵測到有效語音,錄製時間過短", + "VoiceRecording": "🎙 正在錄音...請說話", + "VoiceProcessing": "🎙 正在轉錄...", + "VoiceTranscribed": "🎙 轉錄完成" +} diff --git a/crates/tui/src/commands/groups/core/queue.rs b/crates/tui/src/commands/groups/core/queue.rs index 5c255acc8f..b41abf7b52 100644 --- a/crates/tui/src/commands/groups/core/queue.rs +++ b/crates/tui/src/commands/groups/core/queue.rs @@ -195,7 +195,7 @@ mod tests { let result = queue(&mut app, None); assert!(result.message.is_some()); let msg = result.message.unwrap(); - assert!(msg.contains(tr(app.ui_locale, MessageId::CmdQueueNoMessages))); + assert!(msg.contains(&*tr(app.ui_locale, MessageId::CmdQueueNoMessages))); } #[test] @@ -228,7 +228,7 @@ mod tests { assert!(result.message.is_some()); let msg = result.message.unwrap(); assert!( - msg.contains(tr(Locale::En, MessageId::CmdQueueMissingIndex)), + msg.contains(&*tr(Locale::En, MessageId::CmdQueueMissingIndex)), "msg={msg:?}" ); } @@ -242,7 +242,7 @@ mod tests { assert!(result.message.is_some()); let msg = result.message.unwrap(); assert!( - msg.contains(tr(Locale::En, MessageId::CmdQueueIndexPositive)), + msg.contains(&*tr(Locale::En, MessageId::CmdQueueIndexPositive)), "msg={msg:?}" ); } @@ -256,7 +256,7 @@ mod tests { assert!(result.message.is_some()); let msg = result.message.unwrap(); assert!( - msg.contains(tr(Locale::En, MessageId::CmdQueueNotFound)), + msg.contains(&*tr(Locale::En, MessageId::CmdQueueNotFound)), "msg={msg:?}" ); } @@ -277,7 +277,7 @@ mod tests { assert!(result.message.is_some()); let msg = result.message.unwrap(); assert!( - msg.contains(tr(Locale::En, MessageId::CmdQueueAlreadyEditing)), + msg.contains(&*tr(Locale::En, MessageId::CmdQueueAlreadyEditing)), "msg={msg:?}" ); } @@ -327,7 +327,7 @@ mod tests { assert!(result.message.is_some()); let msg = result.message.unwrap(); assert!( - msg.contains(tr(Locale::En, MessageId::CmdQueueCleared)), + msg.contains(&*tr(Locale::En, MessageId::CmdQueueCleared)), "msg={msg:?}" ); assert!(app.queued_messages.is_empty()); @@ -342,7 +342,7 @@ mod tests { assert!(result.message.is_some()); let msg = result.message.unwrap(); assert!( - msg.contains(tr(Locale::En, MessageId::CmdQueueAlreadyEmpty)), + msg.contains(&*tr(Locale::En, MessageId::CmdQueueAlreadyEmpty)), "msg={msg:?}" ); } diff --git a/crates/tui/src/commands/groups/debug/change.rs b/crates/tui/src/commands/groups/debug/change.rs index 8d37eebc3d..787fa3bbdf 100644 --- a/crates/tui/src/commands/groups/debug/change.rs +++ b/crates/tui/src/commands/groups/debug/change.rs @@ -484,7 +484,7 @@ Previous release.\n"; let result = change(&mut app, None); assert!(!result.is_error, "Failed for locale {locale:?}"); let msg = result.message.expect("should have a message"); - assert!(msg.contains(tr(locale, MessageId::CmdChangeTranslationQueued))); + assert!(msg.contains(&*tr(locale, MessageId::CmdChangeTranslationQueued))); assert!( matches!(result.action, Some(AppAction::SendMessage(_))), "Non-English locale should send translation, got {:?}", @@ -516,7 +516,7 @@ Previous release.\n"; let result = change(&mut app, None); assert!(!result.is_error); let msg = result.message.expect("should have a message"); - assert!(msg.contains(tr( + assert!(msg.contains(&*tr( Locale::ZhHans, MessageId::CmdChangeTranslationUnavailable ))); @@ -534,7 +534,7 @@ Previous release.\n"; let result = change(&mut app, None); assert!(!result.is_error); let msg = result.message.expect("should have a message"); - assert!(msg.contains(tr(Locale::Ja, MessageId::CmdChangeTranslationUnavailable))); + assert!(msg.contains(&*tr(Locale::Ja, MessageId::CmdChangeTranslationUnavailable))); assert!( result.action.is_none(), "offline mode should not send translation" diff --git a/crates/tui/src/commands/groups/debug/debug.rs b/crates/tui/src/commands/groups/debug/debug.rs index b389b94214..4e7dc0fb66 100644 --- a/crates/tui/src/commands/groups/debug/debug.rs +++ b/crates/tui/src/commands/groups/debug/debug.rs @@ -798,8 +798,8 @@ fn format_cache_history(app: &App, count: usize, locale: Locale) -> String { .replace("{sum_miss}", &totals_miss.to_string()) .replace("{avg}", &avg_ratio), ); - footer.push_str(tr(locale, MessageId::CmdCacheFootnote)); - footer.push_str(tr(locale, MessageId::CmdCacheAdvice)); + footer.push_str(&tr(locale, MessageId::CmdCacheFootnote)); + footer.push_str(&tr(locale, MessageId::CmdCacheAdvice)); format!("{header}{body}{footer}") } diff --git a/crates/tui/src/commands/traits.rs b/crates/tui/src/commands/traits.rs index f442d4e1f8..8a3751fd11 100644 --- a/crates/tui/src/commands/traits.rs +++ b/crates/tui/src/commands/traits.rs @@ -1,5 +1,6 @@ //! Command traits and registry support. +use std::borrow::Cow; use std::collections::HashMap; use crate::localization::{Locale, MessageId, tr}; @@ -54,7 +55,7 @@ impl CommandInfo { } } - pub fn description_for(&self, locale: Locale) -> &'static str { + pub fn description_for(&self, locale: Locale) -> Cow<'static, str> { tr(locale, self.description_id) } diff --git a/crates/tui/src/localization.rs b/crates/tui/src/localization.rs index a5e0e5dc4b..361cd26f60 100644 --- a/crates/tui/src/localization.rs +++ b/crates/tui/src/localization.rs @@ -2,7 +2,7 @@ //! //! This intentionally covers UI chrome only. It does not change model prompts, //! model output language, provider behavior, or media payload semantics. - +use std::borrow::Cow; use unicode_width::{UnicodeWidthChar, UnicodeWidthStr}; #[allow(dead_code)] @@ -219,7 +219,7 @@ pub const PLANNED_QA_LOCALES: &[LocaleSpec] = &[ }, ]; -#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +#[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum MessageId { ComposerPlaceholder, HistorySearchPlaceholder, @@ -1124,8 +1124,8 @@ pub const ALL_MESSAGE_IDS: &[MessageId] = &[ MessageId::VoiceTranscribed, ]; -pub fn tr(locale: Locale, id: MessageId) -> &'static str { - fallback_translation(translation(locale, id), id) +pub fn tr(locale: Locale, id: MessageId) -> Cow<'static, str> { + rust_i18n::t!(format!("{id:?}"), locale = locale.tag()) } pub fn thinking_translation_placeholder(locale: Locale) -> &'static str { @@ -1188,15 +1188,6 @@ pub fn hidden_translation_failed(locale: Locale) -> &'static str { } } -#[allow(dead_code)] -pub fn missing_message_ids(locale: Locale) -> Vec { - ALL_MESSAGE_IDS - .iter() - .copied() - .filter(|id| translation(locale, *id).is_none()) - .collect() -} - pub fn normalize_configured_locale(input: &str) -> Option<&'static str> { let normalized = normalize_locale_input(input); if matches!(normalized.as_str(), "" | "auto" | "system") { @@ -1300,3388 +1291,6 @@ fn parse_locale(value: &str) -> Option { None } -fn fallback_translation(candidate: Option<&'static str>, id: MessageId) -> &'static str { - candidate.unwrap_or_else(|| english(id)) -} - -fn english(id: MessageId) -> &'static str { - match id { - MessageId::ComposerPlaceholder => "Write a task or use /.", - MessageId::HistorySearchPlaceholder => "Search prompt history...", - MessageId::HistorySearchTitle => "History Search", - MessageId::HistoryHintMove => "Up/Down move", - MessageId::HistoryHintAccept => "Enter accept", - MessageId::HistoryHintRestore => "Esc restore", - MessageId::HistoryNoMatches => " No matches", - MessageId::StatusPickerTitle => " Status line ", - MessageId::StatusPickerInstruction => "Pick the chips you want in the footer:", - MessageId::StatusPickerActionToggle => "toggle ", - MessageId::StatusPickerActionAll => "all ", - MessageId::StatusPickerActionNone => "none ", - MessageId::StatusPickerActionSave => "save ", - MessageId::StatusPickerActionCancel => "cancel ", - MessageId::ConfigTitle => "Session Configuration", - MessageId::ConfigModalTitle => " Config ", - MessageId::ConfigSearchPlaceholder => "type to filter", - MessageId::ConfigNoSettings => " No settings available.", - MessageId::ConfigNoMatchesPrefix => " No settings match ", - MessageId::ConfigFilteredSettings => " Filtered settings", - MessageId::ConfigShowing => " Showing", - MessageId::ConfigFooterDefault => { - " type=filter, Up/Down=select, Enter/e=edit, Esc/q=close " - } - MessageId::ConfigFooterScrollable => { - " type=filter, Up/Down=select, Enter/e=edit, PgUp/PgDn=scroll, Esc/q=close " - } - MessageId::ConfigFooterFiltered => { - " type=filter, Backspace=delete, Ctrl+U/Esc=clear, Enter=edit " - } - MessageId::ConfigSectionProvider => "Provider", - MessageId::ConfigSectionModel => "Model", - MessageId::ConfigSectionPermissions => "Permissions", - MessageId::ConfigSectionNetwork => "Network", - MessageId::ConfigSectionDisplay => "Display", - MessageId::ConfigSectionComposer => "Composer", - MessageId::ConfigSectionSidebar => "Sidebar", - MessageId::ConfigSectionHistory => "History", - MessageId::ConfigSectionMcp => "MCP", - MessageId::ConfigSectionFleet => "Fleet", - MessageId::ConfigSectionExperimental => "Experimental", - MessageId::ConfigScopeSession => "SESSION", - MessageId::ConfigScopeSaved => "SAVED", - MessageId::ConfigEditCancelled => "Edit cancelled", - MessageId::ConfigEditTitlePrefix => "Edit ", - MessageId::ConfigEditScopeLabel => "Scope: ", - MessageId::ConfigEditCurrentLabel => "Current: ", - MessageId::ConfigEditHintLabel => "Hint: ", - MessageId::ConfigEditNewLabel => "New: ", - MessageId::ConfigEditFooter => { - " Enter=apply, Esc=cancel, Ctrl+U=clear, Ctrl+A=all, \u{2190}/\u{2192}=move " - } - MessageId::ConfigRowEffective => " (effective {currency})", - MessageId::ConfigDefaultValue => "(default)", - MessageId::ConfigDefaultReasoning => "(config/default)", - MessageId::ConfigUnavailable => "(unavailable)", - MessageId::HelpTitle => "Help", - MessageId::HelpFilterPlaceholder => "Type to filter", - MessageId::HelpFilterPrefix => "Filter: ", - MessageId::HelpNoMatches => " No matches.", - MessageId::HelpSlashCommands => "Slash commands", - MessageId::HelpKeybindings => "Keybindings", - MessageId::HelpFooterTypeFilter => " type to filter ", - MessageId::HelpFooterMove => " Up/Down move ", - MessageId::HelpFooterJump => " PgUp/PgDn jump ", - MessageId::HelpFooterClose => " Esc close ", - MessageId::CmdAnchorDescription => { - "Pin a fact that survives compaction (auto-injected into context)" - } - MessageId::CmdAttachDescription => { - "Attach image/video media; use @path for text files or directories" - } - MessageId::CmdCacheDescription => { - "Show DeepSeek prefix-cache hit/miss stats for the last N turns" - } - MessageId::CmdChangeDescription => "Show the latest changelog entry", - MessageId::CmdChangeHeader => "Latest Changelog", - MessageId::CmdChangeTranslationQueued => { - "English release notes are shown below. A translated version will be requested next; if the provider is unavailable, this English text is the fallback." - } - MessageId::CmdChangeTranslationUnavailable => { - "English release notes are shown below. Translation is unavailable because the current session has no API key or is offline." - } - MessageId::CmdChangePreviousVersion => { - "Previous version: {version} — run `/change {version}` to view it" - } - MessageId::CmdBalanceDescription => "Check the active provider account balance", - MessageId::CmdClearDescription => "Clear conversation history", - MessageId::CmdCompactDescription => "Trigger context compaction to free up space", - MessageId::CmdPurgeDescription => { - "Let the agent surgically prune conversation history to free context space" - } - MessageId::CmdConfigDescription => "Open interactive configuration editor", - MessageId::CmdContextDescription => "Open context inspector or source-map report", - MessageId::CmdCostDescription => "Show session cost breakdown", - MessageId::CmdDiffDescription => "Show file changes since session start", - MessageId::CmdEditDescription => "Revise and resubmit the last message", - MessageId::CmdExitDescription => "Exit the application", - MessageId::CmdExportDescription => "Export conversation to markdown", - MessageId::CmdFeedbackDescription => "Generate a GitHub feedback URL", - MessageId::CmdHfDescription => "Inspect Hugging Face MCP setup and concepts", - MessageId::CmdHelpDescription => "Show help information", - MessageId::CmdProfileDescription => "Switch to a named config profile", - MessageId::CmdHomeDescription => "Show home dashboard with stats and quick actions", - MessageId::CmdHooksDescription => "List configured lifecycle hooks (read-only)", - MessageId::CmdAgentDescription => { - "Open a persistent sub-agent session: /agent [0-3] " - } - MessageId::CmdGoalDescription => "Set a session goal with optional token budget", - MessageId::CmdInitDescription => "Generate AGENTS.md for project", - MessageId::CmdLspDescription => "Toggle LSP diagnostics on or off", - MessageId::CmdShareDescription => "Export current session as a shareable web URL", - MessageId::CmdJobsDescription => "Inspect and control background Bash jobs", - MessageId::CmdLinksDescription => "Show provider token, dashboard, and docs links", - MessageId::CmdLoadDescription => "Load session from file", - MessageId::CmdLogoutDescription => "Clear API key and return to setup", - MessageId::CmdMcpDescription => "Open or manage MCP servers", - MessageId::CmdPluginDescription => "List discovered plugin tools or show details for one", - MessageId::CmdPluginNoneFound => "No plugin tools discovered in {dir}", - MessageId::CmdPluginNotFound => "Plugin '{name}' not found", - MessageId::CmdPluginListHeader => "Plugin tools ({count}):", - MessageId::CmdPluginDetailDescription => "Description: {description}", - MessageId::CmdPluginDetailSchema => "Schema:\n{schema}", - MessageId::CmdPluginDetailApproval => "Approval: {approval}", - MessageId::CmdPluginDetailPath => "Path: {path}", - MessageId::CmdMemoryDescription => "Inspect or manage the persistent user-memory file", - MessageId::CmdModeDescription => { - "Switch mode or open picker: /mode [agent|plan|yolo|1|2|3]" - } - MessageId::CmdModelDescription => "Switch or view current model", - MessageId::CmdModelsDescription => "Toolbox: fetch live model IDs from the active API", - MessageId::CmdModelDbDescription => "Reference: browse the bundled model database", - MessageId::CmdNetworkDescription => "Manage network allow and deny rules", - MessageId::CmdNoteDescription => "Add, list, edit, or remove workspace notes", - MessageId::CmdThemeDescription => "Switch theme or open the theme picker", - MessageId::CmdProviderDescription => "Switch the active provider and/or model", - MessageId::CmdQueueDescription => "View or edit queued messages", - MessageId::CmdQueueUsage => "Usage: /queue [list|send |edit |drop |clear]", - MessageId::CmdQueueDraftHeader => "Editing queued message:", - MessageId::CmdQueueNoMessages => "No queued messages", - MessageId::CmdQueueListHeader => "Queued messages ({count}):", - MessageId::CmdQueueTip => "Tip: /queue send to send now, /queue drop to remove", - MessageId::CmdQueueAlreadyEditing => { - "Already editing a queued message. Send it or /queue clear to discard." - } - MessageId::CmdQueueNotFound => "Queued message not found", - MessageId::CmdQueueEditingStatus => "Editing queued message {index}", - MessageId::CmdQueueEditingMessage => { - "Editing queued message {index} (press Enter to re-queue/send)" - } - MessageId::CmdQueueDropped => "Dropped queued message {index}", - MessageId::CmdQueueAlreadyEmpty => "Queue already empty", - MessageId::CmdQueueCleared => "Queue cleared", - MessageId::CmdQueueMissingIndex => { - "Missing index. Usage: /queue edit or /queue drop " - } - MessageId::CmdQueueIndexPositive => "Index must be a positive number", - MessageId::CmdQueueIndexMin => "Index must be >= 1", - MessageId::CmdRelayDescription => "Create a session relay (接力) for a fresh thread", - MessageId::CmdRenameDescription => "Rename the current session", - MessageId::CmdRestoreDescription => { - "Roll back the workspace to a prior pre/post-turn snapshot. With no arg, lists recent snapshots." - } - MessageId::CmdRetryDescription => "Retry the last request", - MessageId::CmdReviewDescription => "Run a structured code review on a file, diff, or PR", - MessageId::CmdRlmDescription => "Toolbox: open a persistent RLM context for a file or text", - MessageId::CmdSaveDescription => "Save session to file", - MessageId::CmdForkDescription => "Fork the active conversation into a sibling session", - MessageId::CmdNewDescription => "Start a fresh saved session", - MessageId::CmdSessionsDescription => "Open session history picker", - MessageId::CmdSettingsDescription => "Show persistent settings", - MessageId::CmdSidebarDescription => "Toggle or focus the right sidebar", - MessageId::CmdSkillDescription => { - "Activate a skill, or install/update/uninstall/trust a community skill" - } - MessageId::CmdSkillsDescription => { - "List local skills (filter by `/skills `; --remote browses the curated registry)" - } - MessageId::CmdSlopDescription => "Inspect or export the debt ledger", - MessageId::CmdStashDescription => { - "Park or restore a composer draft (Ctrl+S sends queued follow-up first; otherwise stash, /stash list/pop)" - } - MessageId::CmdStatusDescription => "Show runtime session status", - MessageId::CmdStatuslineDescription => "Configure which items appear in the footer", - MessageId::CmdFleetDescription => "Open Fleet setup or worker status", - MessageId::CmdHotbarDescription => "Open Hotbar setup", - MessageId::CmdSubagentsDescription => "Compatibility shortcut for /fleet status", - MessageId::CmdSystemDescription => "Show current system prompt", - MessageId::CmdTaskDescription => "Manage background tasks", - MessageId::CmdTokensDescription => "Show token usage for session", - MessageId::CmdTranslateDescription => { - "Toggle output translation to the current system language on/off" - } - MessageId::CmdTranslateOff => "Output translation disabled (original model output shown)", - MessageId::CmdTranslateOn => { - "Output translation enabled: model responses will be shown in your system language" - } - MessageId::TranslationInProgress => "Translating assistant output...", - MessageId::TranslationComplete => "Translation complete", - MessageId::TranslationFailed => "Translation failed", - MessageId::CmdTrustDescription => { - "Manage workspace trust and per-path allowlist (`/trust add `, `/trust list`, `/trust on|off`)" - } - MessageId::CmdWorkspaceDescription => "Show or switch the current workspace", - MessageId::CmdUndoDescription => "Remove last message pair", - MessageId::CmdVerboseDescription => "Toggle full live thinking in the transcript", - MessageId::CmdCacheAdvice => { - "Hit/miss ratios over ~70% after the third turn indicate a stable cache prefix; \n\ - lower than that on long sessions suggests prefix churn worth investigating (#263)." - } - MessageId::CmdCacheFootnote => { - "* miss inferred from input − hit when the provider did not report it explicitly.\n" - } - MessageId::CmdCacheHeader => { - "Cache telemetry — last {count} of {total} turn(s) (model: {model})\n" - } - MessageId::CmdCacheNoData => { - "Cache history: no turns recorded yet.\n\n\ - DeepSeek surfaces `prompt_cache_hit_tokens` / `prompt_cache_miss_tokens` \ - on every API turn that the model supports it (V4 family). Run a turn \ - and try /cache again." - } - MessageId::CmdCacheTotals => { - "Σ in: {sum_in} Σ hit: {sum_hit} Σ miss: {sum_miss} avg hit ratio: {avg}\n" - } - MessageId::CmdCostReport => { - "Session Cost:\n\ - ─────────────────────────────\n\ - Approx total spent: {cost}\n\n\ - Cost estimates are approximate and use provider usage telemetry when available.\n\n\ - DeepSeek API Pricing:\n\ - ─────────────────────────────\n\ - Pricing details are not configured in this CLI." - } - MessageId::CmdTokensCacheBoth => "{hit} hit / {miss} miss", - MessageId::CmdTokensCacheHitOnly => "{hit} hit / miss not reported", - MessageId::CmdTokensCacheMissOnly => "hit not reported / {miss} miss", - MessageId::CmdTokensContextUnknownWindow => "~{estimated} / unknown window", - MessageId::CmdTokensContextWithWindow => "~{used} / {window} ({percent}%)", - MessageId::FooterAgentSingular => "1 agent", - MessageId::FooterAgentsPlural => "{count} agents", - MessageId::FooterPressCtrlCAgain => "Press Ctrl+C again to quit", - MessageId::FooterWorking => "working", - MessageId::FooterBalancePrefix => "balance", - MessageId::HelpSectionActions => "Actions", - MessageId::HelpSectionClipboard => "Clipboard", - MessageId::HelpSectionEditing => "Input editing", - MessageId::HelpSectionHelp => "Help", - MessageId::HelpSectionModes => "Modes", - MessageId::HelpSectionNavigation => "Navigation", - MessageId::HelpSectionSessions => "Sessions", - MessageId::CmdTokensNotReported => "not reported", - MessageId::CmdTokensReport => { - "Token Usage:\n\ - ─────────────────────────────\n\ - Active context: {active}\n\ - Last API input: {input} (turn telemetry; may count repeated prefix across tool rounds)\n\ - Last API output: {output}\n\ - Cache hit/miss: {cache} (telemetry/cost only)\n\ - Cumulative tokens: {total} (session usage telemetry)\n\ - Approx session cost: {cost}\n\ - API messages: {api_messages}\n\ - Chat messages: {chat_messages}\n\ - Model: {model}" - } - MessageId::KbScrollTranscript => { - "Scroll transcript, navigate input history, or select composer attachments" - } - MessageId::KbNavigateHistory => "Navigate input history", - MessageId::KbBrowseHistory => "Browse conversation history", - MessageId::KbScrollTranscriptAlt => "Scroll transcript", - MessageId::KbScrollPage => "Scroll transcript by page", - MessageId::KbJumpTopBottom => "Jump to top / bottom of transcript", - MessageId::KbJumpTopBottomEmpty => "Jump to top / bottom (when input is empty)", - MessageId::KbJumpToolBlocks => "Jump between tool output blocks", - MessageId::KbMoveCursor => "Move cursor in composer", - MessageId::KbJumpLineStartEnd => "Jump to start / end of line", - MessageId::KbDeleteChar => { - "Delete character before / after the cursor, or remove selected attachment" - } - MessageId::KbClearDraft => "Clear the current draft", - MessageId::KbStashDraft => { - "Send queued follow-up first; otherwise stash current draft (`/stash pop` to restore)" - } - MessageId::KbSearchHistory => "Search prompt history and recover local drafts", - MessageId::KbInsertNewline => "Insert a newline in the composer", - MessageId::KbSendDraft => "Send the current draft", - MessageId::KbCloseMenu => "Close menu, cancel request, discard draft, or clear input", - MessageId::KbCancelOrExit => "Cancel request, or exit when idle", - MessageId::KbShellControls => "Background the running foreground shell command", - MessageId::KbExitEmpty => "Exit when input is empty", - MessageId::KbCommandPalette => "Open the command palette", - MessageId::KbCancelBackgroundShellJobs => { - "Cancel all running background shell jobs (Tasks sidebar)" - } - MessageId::KbFuzzyFilePicker => "Open the fuzzy file picker (insert @path on Enter)", - MessageId::KbCompactInspector => "Open compact session context inspector", - MessageId::KbLastMessagePager => "Open pager for the last message (when input is empty)", - MessageId::KbSelectedDetails => { - "Open details for the selected tool or message (when input is empty)" - } - MessageId::KbToolDetailsPager => "Open tool-details pager", - MessageId::KbThinkingPager => "Open Activity Detail", - MessageId::KbLiveTranscript => "Open live transcript overlay (sticky-tail auto-scroll)", - MessageId::KbBacktrackMessage => { - "Backtrack to a previous user message (Left/Right step, Enter to rewind)" - } - MessageId::KbCompleteCycleModes => { - "Complete /command, queue running-turn follow-up, cycle modes; Shift+Tab cycles reasoning effort" - } - MessageId::KbJumpPlanAgentYolo => "Trigger hotbar slots; bare digits stay text", - MessageId::KbAltJumpPlanAgentYolo => "Alternative jump to Plan / Agent / YOLO mode", - MessageId::KbFocusSidebar => { - "Focus Pinned / Tasks / Agents / Context / Auto sidebar; Ctrl+Alt+0 toggles pinned sidebar" - } - MessageId::KbSessionPicker => "Open the session picker", - MessageId::KbPasteAttach => "Paste text or attach a clipboard image", - MessageId::KbCopySelection => "Copy the current selection (Cmd+C on macOS)", - MessageId::KbContextMenu => { - "Open context actions for paste, selection, message details, context, and help" - } - MessageId::KbAttachPath => "Add a local text file or directory to context", - MessageId::KbHelpOverlay => "Open this help overlay (when input is empty)", - MessageId::KbToggleHelp => "Toggle help overlay", - MessageId::KbToggleHelpSlash => "Toggle help overlay", - MessageId::HelpUsageLabel => "Usage:", - MessageId::HelpAliasesLabel => "Aliases:", - MessageId::SettingsTitle => "Settings:", - MessageId::SettingsConfigFile => "Config file:", - MessageId::ClearConversation => "Conversation cleared", - MessageId::ClearConversationBusy => { - "Conversation cleared (plan state busy; run /clear again if needed)" - } - MessageId::ModelChanged => "Model changed: {old} \u{2192} {new}", - MessageId::LinksTitle => "Provider Links:", - MessageId::LinksDashboard => "Dashboard:", - MessageId::LinksDocs => "Docs:", - MessageId::LinksTip => { - "Tip: Use the env var shown for your provider, or save the key with `codewhale auth set --provider `." - } - MessageId::SubagentsFetching => "Fetching Fleet worker status...", - MessageId::HelpUnknownCommand => "Unknown command: {topic}", - MessageId::HomeDashboardTitle => "codewhale Home Dashboard", - MessageId::HomeModel => "Model:", - MessageId::HomeMode => "Mode:", - MessageId::HomeWorkspace => "Workspace:", - MessageId::HomeHistory => "History:", - MessageId::HomeTokens => "Tokens:", - MessageId::HomeQueued => "Queued:", - MessageId::HomeSubagents => "Fleet workers:", - MessageId::HomeSkill => "Skill:", - MessageId::HomeQuickActions => "Quick Actions", - MessageId::HomeQuickLinks => "/links - Dashboard & API links", - MessageId::HomeQuickSkills => "/skills - List available skills", - MessageId::HomeQuickConfig => "/config - Open interactive configuration editor", - MessageId::HomeQuickSettings => "/settings - Show persistent settings", - MessageId::HomeQuickModel => "/model - Switch or view model", - MessageId::HomeQuickSubagents => "/fleet status - Fleet worker status", - MessageId::HomeQuickTaskList => "/task list - Show background task queue", - MessageId::HomeQuickHelp => "/help - Show help", - MessageId::HomeModeTips => "Mode Tips", - MessageId::HomeAgentModeTip => "Agent mode - Use tools for autonomous tasks", - MessageId::HomeAgentModeReviewTip => " Type /mode plan to review before executing", - MessageId::HomeAgentModeYoloTip => " Type /mode yolo to enable full tool access", - MessageId::HomeYoloModeTip => "YOLO mode - Full tool access, no approvals", - MessageId::HomeYoloModeCaution => " Be careful with destructive operations!", - MessageId::HomePlanModeTip => "Plan mode - Design before implementing", - MessageId::HomePlanModeChecklistTip => " Use /mode plan to create structured checklists", - MessageId::HomeGoalModeTip => "Goal tracking - Set /goal to pursue objectives", - // Onboarding — language picker. - MessageId::OnboardLanguageTitle => "Choose your language", - MessageId::OnboardLanguageBlurb => { - "Pick the UI language. You can change it any time with `/settings set locale `." - } - MessageId::OnboardLanguageFooter => { - "Press 1-7 to choose, or Enter to keep the current setting" - } - // Onboarding — API key entry. - MessageId::OnboardApiKeyTitle => "Connect your DeepSeek API key", - MessageId::OnboardApiKeyStep1 => { - "Step 1. Open https://platform.deepseek.com/api_keys and create a key." - } - MessageId::OnboardApiKeyStep2 => "Step 2. Paste it below and press Enter.", - MessageId::OnboardApiKeySavedHint => { - "Saved to ~/.codewhale/config.toml so it works from any folder." - } - MessageId::OnboardApiKeyFormatHint => { - "Paste the full key exactly as issued (no spaces or newlines)." - } - MessageId::OnboardApiKeyPlaceholder => "(paste key here)", - MessageId::OnboardApiKeyLabel => "Key: ", - MessageId::OnboardApiKeyFooter => "Press Enter to save, Esc to go back.", - // Onboarding — workspace trust. - MessageId::OnboardTrustTitle => "Trust Workspace", - MessageId::OnboardTrustQuestion => "Do you trust the contents of this directory?", - MessageId::OnboardTrustLocationPrefix => "You are in ", - MessageId::OnboardTrustRiskHint => { - "Working with untrusted contents comes with higher risk of prompt injection." - } - MessageId::OnboardTrustEffectHint => { - "Trusting this directory records it in global config and enables trusted workspace mode." - } - MessageId::OnboardTrustFooterPrefix => "Press ", - MessageId::OnboardTrustFooterMiddle => " to trust and continue, ", - MessageId::OnboardTrustFooterSuffix => " to quit", - // Onboarding — final tips. - MessageId::OnboardTipsTitle => "Start Simple", - MessageId::OnboardTipsLine1 => { - "Write the task in plain language. Use /help or Ctrl+K when you want a command." - } - MessageId::OnboardTipsLine2 => { - "The bottom composer is multi-line: Enter sends, Alt+Enter or Ctrl+J adds a new line." - } - MessageId::OnboardTipsLine3 => { - "Switch modes only when the job changes: Plan for review-first work, Agent for execution, YOLO when you want auto-approval." - } - MessageId::OnboardTipsLine4 => { - "Ctrl+R resumes earlier sessions, and Esc backs out of the current draft or overlay." - } - MessageId::OnboardTipsFooterEnter => "Press Enter", - MessageId::OnboardTipsFooterAction => " to open the workspace", - // Context menu. - MessageId::CtxMenuTitle => " Right click ", - MessageId::CtxMenuCopySelection => "Copy selection", - MessageId::CtxMenuCopySelectionDesc => "write selected transcript text", - MessageId::CtxMenuOpenSelection => "Open selection", - MessageId::CtxMenuOpenSelectionDesc => "show selected text in pager", - MessageId::CtxMenuClearSelection => "Clear selection", - MessageId::CtxMenuOpenDetails => "Open details", - MessageId::CtxMenuCopyMessage => "Copy message", - MessageId::CtxMenuCopyMessageDesc => "write clicked transcript cell", - MessageId::CtxMenuOpenInEditor => "Open in editor", - MessageId::CtxMenuOpenInEditorDesc => "open file:line in $EDITOR", - MessageId::CtxMenuShowCell => "Show cell", - MessageId::CtxMenuShowCellDesc => "unhide this transcript cell", - MessageId::CtxMenuHideCell => "Hide cell", - MessageId::CtxMenuHideCellDesc => "collapse this transcript cell", - MessageId::CtxMenuShowHidden => "Show hidden", - MessageId::CtxMenuShowHiddenDesc => "unhide all collapsed cells", - MessageId::CtxMenuPaste => "Paste", - MessageId::CtxMenuPasteDesc => "insert clipboard into composer", - MessageId::CtxMenuCmdPalette => "Command palette", - MessageId::CtxMenuCmdPaletteDesc => "commands, skills, and tools", - MessageId::CtxMenuContextInspector => "Context inspector", - MessageId::CtxMenuContextInspectorDesc => "active context and cache hints", - MessageId::CtxMenuHelp => "Help", - MessageId::CtxMenuHelpDesc => "keybindings and commands", - MessageId::FanoutCounts => { - "{done} done · {running} running · {failed} failed · {pending} pending" - } - - // App mode picker (prompt, names, hints) and composer vim indicator. - MessageId::ModePickerPrompt => "Choose how CodeWhale should operate:", - MessageId::AppModeAgent => "Agent", - MessageId::AppModeYolo => "YOLO", - MessageId::AppModePlan => "Plan", - MessageId::AppModeAgentHint => "Normal execution with approvals", - MessageId::AppModePlanHint => "Plan first before execution", - MessageId::AppModeYoloHint => "Auto-approve; shell enabled", - MessageId::VimModeNormal => "-- NORMAL --", - MessageId::VimModeInsert => "-- INSERT --", - MessageId::VimModeVisual => "-- VISUAL --", - - // Approval dialog. - MessageId::ApprovalRiskReview => "REVIEW", - MessageId::ApprovalRiskDestructive => "DESTRUCTIVE", - MessageId::ApprovalCategorySafe => "Safe", - MessageId::ApprovalCategoryFileWrite => "File Write", - MessageId::ApprovalCategoryShell => "Bash", - MessageId::ApprovalCategoryNetwork => "Network", - MessageId::ApprovalCategoryMcpRead => "MCP Read", - MessageId::ApprovalCategoryMcpAction => "MCP Action", - MessageId::ApprovalCategoryUnknown => "Unknown", - MessageId::ApprovalFieldType => "Type: ", - MessageId::ApprovalFieldAbout => "About: ", - MessageId::ApprovalFieldImpact => "Impact: ", - MessageId::ApprovalFieldParams => "Params: ", - MessageId::ApprovalOptionApproveOnce => "Approve once", - MessageId::ApprovalOptionApproveAlways => "Approve always for this kind", - MessageId::ApprovalOptionDeny => "Deny this call", - MessageId::ApprovalOptionAbortTurn => "Abort the turn", - MessageId::ApprovalBlockTitle => "approval", - MessageId::ApprovalControlsHint => " · v: full params · Esc: abort", - MessageId::ApprovalChooseHint => "Choose: ", - MessageId::ApprovalChooseAction => "Enter selected option, or press y/a/d directly", - MessageId::ApprovalIntentLabel => "Intent: ", - MessageId::ApprovalMoreLines => " … (+{count} lines)", - // Sandbox elevation dialog. - MessageId::ElevationTitleSandboxDenied => " \u{26a0} Sandbox Denied ", - MessageId::ElevationTitleRequired => " Sandbox Elevation Required ", - MessageId::ElevationFieldTool => " Tool: ", - MessageId::ElevationFieldCmd => " Cmd: ", - MessageId::ElevationFieldReason => " Reason: ", - MessageId::ElevationImpactHeader => " Impact if approved:", - MessageId::ElevationImpactNetwork => { - " - network retry enables outbound downloads and HTTP requests" - } - MessageId::ElevationImpactWrite => { - " - write retry expands writable filesystem scope for this tool call" - } - MessageId::ElevationImpactFullAccess => { - " - full access removes sandbox restrictions entirely for this retry" - } - MessageId::ElevationPromptProceed => " Choose how to proceed:", - MessageId::ElevationOptionNetwork => "Allow outbound network", - MessageId::ElevationOptionWrite => "Allow extra write access", - MessageId::ElevationOptionFullAccess => "Full access (filesystem + network)", - MessageId::ElevationOptionAbort => "Abort", - MessageId::ElevationOptionNetworkDesc => { - "Retry this tool call with outbound network access for downloads and HTTP requests" - } - MessageId::ElevationOptionWriteDesc => { - "Retry this tool call with additional writable filesystem scope" - } - MessageId::ElevationOptionFullAccessDesc => { - "Retry without sandbox limits; grants unrestricted filesystem and network access" - } - MessageId::ElevationOptionAbortDesc => "Cancel this tool execution", - - MessageId::CtxInspTitle => "Context inspector", - MessageId::CtxInspSessionContext => "Session Context", - MessageId::CtxInspSystemPrompt => "System Prompt Structure", - MessageId::CtxInspReferences => "References", - MessageId::CtxInspRecentTools => "Recent Tools", - MessageId::CtxInspModel => "Model", - MessageId::CtxInspWorkspace => "Workspace", - MessageId::CtxInspSession => "Session", - MessageId::CtxInspContext => "Context", - MessageId::CtxInspTranscript => "Transcript", - MessageId::CtxInspWorkspaceStatus => "Workspace status", - MessageId::CtxInspNotSampledYet => "not sampled yet", - MessageId::CtxInspOk => "ok", - MessageId::CtxInspHigh => "high", - MessageId::CtxInspCritical => "critical", - MessageId::CtxInspIncluded => "included", - MessageId::CtxInspAttached => "attached", - MessageId::CtxInspNotIncluded => "not included", - MessageId::CtxInspOutputCaptured => "output captured", - MessageId::CtxInspNoOutputYet => "no output yet", - MessageId::CtxInspNoSystemPrompt => "No system prompt set.", - MessageId::CtxInspNoReferences => "No file, directory, or media references recorded yet.", - MessageId::CtxInspNoToolActivity => "No tool activity recorded yet.", - MessageId::CtxInspVHint => "Open the matching card and press v for full details.", - MessageId::CtxInspCells => "cells", - MessageId::CtxInspApiMessages => "API messages", - MessageId::CtxInspActive => "active", - MessageId::CtxInspCell => "cell", - MessageId::CtxInspMoreReferences => "more reference(s)", - MessageId::CtxInspStablePrefix => "Stable prefix", - MessageId::CtxInspVolatileWorkingSet => "Volatile working set", - MessageId::CtxInspFirstLine => "First line", - MessageId::CtxInspTotal => "Total", - MessageId::CtxInspTextPromptLayers => "Text prompt layers", - MessageId::CtxInspSingleTextBlob => "Single text blob", - MessageId::CtxInspBlocks => "block(s)", - MessageId::CtxInspBlock => "block", - MessageId::CtxInspTokens => "tokens", - MessageId::CtxInspLayers => "layer(s)", - MessageId::CtxInspNone => "none", - MessageId::CtxInspEmpty => "(empty)", - MessageId::CtxInspCacheFriendly => "cache-friendly", - MessageId::CtxInspChangesByTurn => "changes by session/turn", - MessageId::CtxInspStablePrefixOnly => "stable prefix only", - MessageId::CtxInspCacheTip => { - "Tip: Stable prefix blocks are DeepSeek V4 prefix-cache eligible. \ - Volatile working-set changes break the cache only for the tail." - } - MessageId::ToolFamilyRead => "read", - MessageId::ToolFamilyPatch => "patch", - MessageId::ToolFamilyRun => "run", - MessageId::ToolFamilyFind => "find", - MessageId::ToolFamilyDelegate => "delegate", - MessageId::ToolFamilyFanout => "fanout", - MessageId::ToolFamilyRlm => "rlm", - MessageId::ToolFamilyVerify => "verify", - MessageId::ToolFamilyThink => "think", - MessageId::ToolFamilyGeneric => "tool", - // Voice commands - MessageId::CmdVoiceDescription => { - "Toggle voice input: record speech and transcribe into the composer" - } - MessageId::CmdVoiceSendDescription => { - "Toggle voice auto-send: submit when the transcript ends with \"send it\"" - } - MessageId::CmdVoiceControlDescription => { - "Toggle voice control: AI-assisted dictation aware of the composer text" - } - MessageId::VoiceEnabled => "Voice input enabled. Speak to record.", - MessageId::VoiceDisabled => "Voice input disabled.", - MessageId::VoiceSendEnabled => "Voice auto-send enabled.", - MessageId::VoiceSendDisabled => "Voice auto-send disabled.", - MessageId::VoiceControlEnabled => "Voice control enabled.", - MessageId::VoiceControlDisabled => "Voice control disabled.", - MessageId::VoiceErrNoAuth => "Voice: no API key configured for the active provider", - MessageId::VoiceErrNoRecorder => { - "Voice: no recording tool found. Install sox, arecord, or rec." - } - MessageId::VoiceErrNetwork => "Voice: transcription request failed", - MessageId::VoiceErrEmptySend => "Voice: nothing to send", - MessageId::VoiceErrTooShort => "Voice: no speech detected, recording too short", - MessageId::VoiceRecording => "🎙 Recording... speak now", - MessageId::VoiceProcessing => "🎙 Transcribing...", - MessageId::VoiceTranscribed => "🎙 Transcribed", - } -} - -fn translation(locale: Locale, id: MessageId) -> Option<&'static str> { - match locale { - Locale::En => Some(english(id)), - Locale::Ja => japanese(id), - Locale::ZhHans => chinese_simplified(id), - Locale::ZhHant => traditional_chinese(id), - Locale::PtBr => portuguese_brazil(id), - Locale::Es419 => spanish_latin_america(id), - Locale::Vi => vietnamese(id), - } -} - -fn vietnamese(id: MessageId) -> Option<&'static str> { - Some(match id { - MessageId::ComposerPlaceholder => "Nhập nhiệm vụ hoặc sử dụng /.", - MessageId::HistorySearchPlaceholder => "Tìm kiếm lịch sử câu lệnh...", - MessageId::HistorySearchTitle => "Tìm kiếm lịch sử", - MessageId::HistoryHintMove => "Lên/Xuống để di chuyển", - MessageId::HistoryHintAccept => "Enter để chấp nhận", - MessageId::HistoryHintRestore => "Esc để khôi phục", - MessageId::HistoryNoMatches => " Không tìm thấy kết quả", - MessageId::StatusPickerTitle => " Dòng trạng thái ", - MessageId::StatusPickerInstruction => { - "Chọn các thành phần bạn muốn hiển thị ở cuối màn hình:" - } - MessageId::StatusPickerActionToggle => "bật/tắt ", - MessageId::StatusPickerActionAll => "tất cả ", - MessageId::StatusPickerActionNone => "không ", - MessageId::StatusPickerActionSave => "lưu ", - MessageId::StatusPickerActionCancel => "huỷ ", - MessageId::ConfigTitle => "Cấu hình phiên làm việc", - MessageId::ConfigModalTitle => " Cấu hình ", - MessageId::ConfigSearchPlaceholder => "Nhập để lọc kết quả", - MessageId::ConfigNoSettings => " Không có cài đặt nào khả dụng.", - MessageId::ConfigNoMatchesPrefix => " Không có cài đặt nào khớp với ", - MessageId::ConfigFilteredSettings => " Cài đặt đã lọc", - MessageId::ConfigShowing => " Đang hiển thị", - MessageId::ConfigFooterDefault => " gõ=lọc, Lên/Xuống=chọn, Enter/e=sửa, Esc/q=đóng ", - MessageId::ConfigFooterScrollable => { - " gõ=lọc, Lên/Xuống=chọn, Enter/e=sửa, PgUp/PgDn=cuộn, Esc/q=đóng " - } - MessageId::ConfigFooterFiltered => { - " gõ=lọc, Backspace=xóa, Ctrl+U/Esc=xóa sạch, Enter=sửa " - } - MessageId::ConfigSectionProvider => "Nhà cung cấp", - MessageId::ConfigSectionModel => "Mô hình", - MessageId::ConfigSectionPermissions => "Quyền hạn", - MessageId::ConfigSectionNetwork => "Mạng", - MessageId::ConfigSectionDisplay => "Hiển thị", - MessageId::ConfigSectionComposer => "Soạn thảo", - MessageId::ConfigSectionSidebar => "Thanh bên", - MessageId::ConfigSectionHistory => "Lịch sử", - MessageId::ConfigSectionMcp => "MCP", - MessageId::ConfigSectionFleet => "Fleet", - MessageId::ConfigSectionExperimental => "Thử nghiệm", - MessageId::ConfigScopeSession => "PHIÊN", - MessageId::ConfigScopeSaved => "ĐÃ LƯU", - MessageId::ConfigEditCancelled => "Đã hủy chỉnh sửa", - MessageId::ConfigEditTitlePrefix => "Sửa ", - MessageId::ConfigEditScopeLabel => "Phạm vi: ", - MessageId::ConfigEditCurrentLabel => "Hiện tại: ", - MessageId::ConfigEditHintLabel => "Gợi ý: ", - MessageId::ConfigEditNewLabel => "Mới: ", - MessageId::ConfigEditFooter => { - " Enter=áp dụng, Esc=hủy, Ctrl+U=xóa, Ctrl+A=tất cả, \u{2190}/\u{2192}=di chuyển " - } - MessageId::ConfigRowEffective => " (hiệu lực {currency})", - MessageId::ConfigDefaultValue => "(mặc định)", - MessageId::ConfigDefaultReasoning => "(cấu hình/mặc định)", - MessageId::ConfigUnavailable => "(không khả dụng)", - MessageId::HelpTitle => "Trợ giúp", - MessageId::HelpFilterPlaceholder => "Nhập để lọc", - MessageId::HelpFilterPrefix => "Bộ lọc: ", - MessageId::HelpNoMatches => " Không tìm thấy kết quả.", - MessageId::HelpSlashCommands => "Các lệnh bắt đầu bằng dấu gạch chéo (/)", - MessageId::HelpKeybindings => "Phím tắt", - MessageId::HelpFooterTypeFilter => " nhập để lọc ", - MessageId::HelpFooterMove => " Lên/Xuống để di chuyển ", - MessageId::HelpFooterJump => " PgUp/PgDn để nhảy trang ", - MessageId::HelpFooterClose => " Esc để đóng ", - MessageId::CmdAnchorDescription => { - "Ghim một dữ kiện không bị ảnh hưởng khi nén (tự động đưa vào ngữ cảnh)" - } - MessageId::CmdAttachDescription => { - "Đính kèm hình ảnh/video; sử dụng @path cho tệp văn bản hoặc thư mục" - } - MessageId::CmdCacheDescription => { - "Hiển thị thống kê hit/miss của bộ nhớ đệm tiền tố DeepSeek trong N lượt gần nhất" - } - MessageId::CmdChangeDescription => "Hiển thị thông tin nhật ký thay đổi mới nhất", - MessageId::CmdChangeHeader => "Nhật Ký Thay Đổi Mới Nhất", - MessageId::CmdChangeTranslationQueued => { - "Ghi chú phát hành bằng tiếng Anh hiển thị bên dưới. Bản dịch sẽ được yêu cầu tiếp theo; nếu nhà cung cấp không khả dụng, văn bản tiếng Anh này sẽ được dùng làm dự phòng." - } - MessageId::CmdChangeTranslationUnavailable => { - "Ghi chú phát hành bằng tiếng Anh hiển thị bên dưới. Bản dịch không khả dụng vì phiên hiện tại không có mã khóa API hoặc đang ngoại tuyến." - } - MessageId::CmdChangePreviousVersion => { - "Phiên bản trước: {version} — chạy `/change {version}` để xem" - } - MessageId::CmdBalanceDescription => { - "Kiểm tra số dư tài khoản của nhà cung cấp dịch vụ đang hoạt động" - } - MessageId::CmdClearDescription => "Xóa lịch sử trò chuyện", - MessageId::CmdCompactDescription => "Kích hoạt nén ngữ cảnh để giải phóng không gian", - MessageId::CmdPurgeDescription => { - "Cho agent cắt gọn lịch sử trò chuyện để giải phóng ngữ cảnh" - } - MessageId::CmdConfigDescription => "Mở trình chỉnh sửa cấu hình tương tác", - MessageId::CmdContextDescription => "Mở trình kiểm tra ngữ cảnh phiên thu gọn", - MessageId::CmdCostDescription => "Hiển thị chi tiết chi phí của phiên làm việc", - MessageId::CmdDiffDescription => "Hiển thị các thay đổi của tệp kể từ khi bắt đầu phiên", - MessageId::CmdEditDescription => "Chỉnh sửa và gửi lại tin nhắn gần nhất", - MessageId::CmdExitDescription => "Thoát ứng dụng", - MessageId::CmdExportDescription => "Xuất cuộc trò chuyện sang định dạng Markdown", - MessageId::CmdFeedbackDescription => "Tạo một URL để gửi phản hồi trên GitHub", - MessageId::CmdHfDescription => "Kiểm tra thiết lập và khái niệm Hugging Face MCP", - MessageId::CmdHelpDescription => "Hiển thị thông tin trợ giúp", - MessageId::CmdProfileDescription => "Chuyển sang profile cấu hình đã đặt tên", - MessageId::CmdHomeDescription => { - "Hiển thị bảng điều khiển trang chủ với số liệu thống kê và hành động nhanh" - } - MessageId::CmdHooksDescription => "Liệt kê các lifecycle hook đã cấu hình (chỉ đọc)", - MessageId::CmdAgentDescription => "Mở một phiên sub-agent nền: /agent [0-3] ", - MessageId::CmdGoalDescription => "Đặt mục tiêu cho phiên với giới hạn token tùy chọn", - MessageId::CmdInitDescription => "Tạo tệp AGENTS.md cho dự án", - MessageId::CmdLspDescription => "Bật hoặc tắt tính năng chẩn đoán LSP", - MessageId::CmdShareDescription => { - "Xuất phiên hiện tại thành một liên kết web có thể chia sẻ" - } - MessageId::CmdJobsDescription => "Kiểm tra và kiểm soát các lệnh chạy ngầm", - MessageId::CmdLinksDescription => { - "Hiển thị liên kết token, bảng điều khiển và tài liệu của nhà cung cấp" - } - MessageId::CmdLoadDescription => "Tải phiên làm việc từ tệp", - MessageId::CmdLogoutDescription => "Xóa khóa API và quay lại bước thiết lập", - MessageId::CmdMcpDescription => "Mở hoặc quản lý các máy chủ MCP", - MessageId::CmdPluginDescription => "List discovered plugin tools or show details for one", - MessageId::CmdPluginNoneFound => "No plugin tools discovered in {dir}", - MessageId::CmdPluginNotFound => "Plugin '{name}' not found", - MessageId::CmdPluginListHeader => "Plugin tools ({count}):", - MessageId::CmdPluginDetailDescription => "Description: {description}", - MessageId::CmdPluginDetailSchema => "Schema:\n{schema}", - MessageId::CmdPluginDetailApproval => "Approval: {approval}", - MessageId::CmdPluginDetailPath => "Path: {path}", - MessageId::CmdMemoryDescription => "Kiểm tra hoặc quản lý tệp bộ nhớ người dùng liên tục", - MessageId::CmdModeDescription => { - "Chuyển đổi chế độ hoặc mở bảng chọn: /mode [agent|plan|yolo|1|2|3]" - } - MessageId::CmdModelDescription => "Chuyển đổi hoặc xem mô hình AI hiện tại", - MessageId::CmdModelsDescription => "Liệt kê các mô hình khả dụng từ API", - MessageId::CmdModelDbDescription => "Duyệt cơ sở dữ liệu tham chiếu mô hình tích hợp", - MessageId::CmdNetworkDescription => "Quản lý các quy tắc cho phép và từ chối mạng", - MessageId::CmdNoteDescription => { - "Thêm, liệt kê, sửa hoặc xóa ghi chú trong không gian làm việc" - } - MessageId::CmdThemeDescription => "Chuyển đổi giao diện hoặc mở bảng chọn giao diện", - MessageId::CmdProviderDescription => { - "Chuyển đổi hoặc xem backend LLM đang hoạt động (deepseek | nvidia-nim | ollama)" - } - MessageId::CmdQueueDescription => "Xem hoặc chỉnh sửa các tin nhắn đang chờ xử lý", - MessageId::CmdQueueUsage => "Cách dùng: /queue [list|send |edit |drop |clear]", - MessageId::CmdQueueDraftHeader => "Đang chỉnh sửa tin nhắn đang chờ:", - MessageId::CmdQueueNoMessages => "Không có tin nhắn đang chờ", - MessageId::CmdQueueListHeader => "Tin nhắn đang chờ ({count}):", - MessageId::CmdQueueTip => "Mẹo: /queue send để gửi ngay, /queue drop để xóa", - MessageId::CmdQueueAlreadyEditing => { - "Đã đang chỉnh sửa một tin nhắn đang chờ. Hãy gửi nó hoặc dùng /queue clear để hủy." - } - MessageId::CmdQueueNotFound => "Không tìm thấy tin nhắn đang chờ", - MessageId::CmdQueueEditingStatus => "Đang chỉnh sửa tin nhắn đang chờ {index}", - MessageId::CmdQueueEditingMessage => { - "Đang chỉnh sửa tin nhắn đang chờ {index} (nhấn Enter để xếp lại hàng/gửi)" - } - MessageId::CmdQueueDropped => "Đã xóa tin nhắn đang chờ {index}", - MessageId::CmdQueueAlreadyEmpty => "Hàng đợi đã trống", - MessageId::CmdQueueCleared => "Đã xóa hàng đợi", - MessageId::CmdQueueMissingIndex => { - "Thiếu chỉ mục. Cách dùng: /queue edit hoặc /queue drop " - } - MessageId::CmdQueueIndexPositive => "Chỉ mục phải là số dương", - MessageId::CmdQueueIndexMin => "Chỉ mục phải >= 1", - MessageId::CmdRelayDescription => "Tạo một phiên tiếp sức cho một luồng mới", - MessageId::CmdRenameDescription => "Đổi tên phiên làm việc hiện tại", - MessageId::CmdRestoreDescription => { - "Khôi phục không gian làm việc về bản chụp trước/sau lượt. Nếu không có đối số, hiển thị các bản chụp gần đây." - } - MessageId::CmdRetryDescription => "Thử lại yêu cầu gần nhất", - MessageId::CmdReviewDescription => { - "Chạy một quy trình xem xét mã nguồn có cấu trúc trên tệp, diff hoặc PR" - } - MessageId::CmdRlmDescription => { - "Mở một ngữ cảnh RLM liên tục: /rlm [0-3] " - } - MessageId::CmdSaveDescription => "Lưu phiên làm việc vào tệp", - MessageId::CmdForkDescription => { - "Rẽ nhánh (fork) cuộc hội thoại hiện tại thành một phiên song song" - } - MessageId::CmdNewDescription => "Bắt đầu một phiên lưu mới", - MessageId::CmdSessionsDescription => "Mở bảng chọn lịch sử phiên làm việc", - MessageId::CmdSettingsDescription => "Hiển thị các cài đặt liên tục", - MessageId::CmdSidebarDescription => "Toggle or focus the right sidebar", - MessageId::CmdSkillDescription => { - "Kích hoạt một kỹ năng, hoặc cài đặt/cập nhật/gỡ bỏ/tin cậy một kỹ năng cộng đồng" - } - MessageId::CmdSkillsDescription => { - "Liệt kê các kỹ năng cục bộ (lọc bằng `/skills `; --remote để duyệt kho lưu trữ được kiểm duyệt)" - } - MessageId::CmdSlopDescription => "Inspect or export the debt ledger", - MessageId::CmdStashDescription => { - "Tạm cất hoặc khôi phục bản nháp (Ctrl+S để cất, /stash list/pop để xem/lấy ra)" - } - MessageId::CmdStatusDescription => "Hiển thị trạng thái thời gian chạy của phiên", - MessageId::CmdStatuslineDescription => { - "Cấu hình các mục hiển thị ở thanh trạng thái dưới cùng" - } - MessageId::CmdFleetDescription => "Mở thiết lập Fleet hoặc trạng thái worker", - MessageId::CmdHotbarDescription => "Mở thiết lập Hotbar", - MessageId::CmdSubagentsDescription => "Lối tắt tương thích cho /fleet status", - MessageId::CmdSystemDescription => "Hiển thị prompt hệ thống hiện tại", - MessageId::CmdTaskDescription => "Quản lý các nhiệm vụ chạy ngầm", - MessageId::CmdTokensDescription => "Hiển thị lượng token đã sử dụng cho phiên", - MessageId::CmdTranslateDescription => { - "Bật/Tắt chế độ dịch đầu ra sang ngôn ngữ hệ thống hiện tại" - } - MessageId::CmdTranslateOff => { - "Đã tắt chế độ dịch đầu ra (hiển thị câu trả lời gốc của mô hình)" - } - MessageId::CmdTranslateOn => { - "Đã bật chế độ dịch đầu ra: câu trả lời của mô hình sẽ được hiển thị bằng tiếng Việt" - } - MessageId::TranslationInProgress => "Đang dịch câu trả lời của trợ lý...", - MessageId::TranslationComplete => "Đã dịch xong", - MessageId::TranslationFailed => "Dịch thất bại", - MessageId::CmdTrustDescription => { - "Quản lý quyền tin cậy không gian làm việc và danh sách trắng theo đường dẫn (`/trust add `, `/trust list`, `/trust on|off`)" - } - MessageId::CmdWorkspaceDescription => { - "Hiển thị hoặc chuyển đổi không gian làm việc hiện tại" - } - MessageId::CmdUndoDescription => "Xóa cặp tin nhắn gần nhất", - MessageId::CmdVerboseDescription => { - "Bật/Tắt chế độ hiển thị đầy đủ quá trình suy nghĩ trực tiếp" - } - MessageId::CmdCacheAdvice => { - "Tỷ lệ hit/miss trên ~70% sau lượt thứ ba cho thấy tiền tố bộ nhớ đệm ổn định; \nthấp hơn mức đó trong các phiên dài cho thấy có sự biến động tiền tố cần kiểm tra (#263)." - } - MessageId::CmdCacheFootnote => { - "* miss được suy ra từ đầu vào − hit khi nhà cung cấp không báo cáo rõ ràng.\n" - } - MessageId::CmdCacheHeader => { - "Thông tin cache — {count} lượt gần nhất trong tổng số {total} lượt (mô hình: {model})\n" - } - MessageId::CmdCacheNoData => { - "Lịch sử bộ nhớ đệm: chưa có lượt nào được ghi nhận.\n\n\ - DeepSeek cung cấp `prompt_cache_hit_tokens` / `prompt_cache_miss_tokens` \ - trên mỗi lượt API mà mô hình hỗ trợ (dòng V4). Hãy chạy một lượt \ - và thử lại lệnh /cache." - } - MessageId::CmdCacheTotals => { - "Σ vào: {sum_in} Σ hit: {sum_hit} Σ miss: {sum_miss} tỷ lệ hit trung bình: {avg}\n" - } - MessageId::CmdCostReport => { - "Chi Phí Phiên Làm Việc:\n\ - ─────────────────────────────\n\ - Tổng chi tiêu ước tính: {cost}\n\n\ - Các ước tính chi phí mang tính xấp xỉ và sử dụng dữ liệu viễn trắc từ nhà cung cấp nếu có.\n\n\ - Bảng Giá API DeepSeek:\n\ - ─────────────────────────────\n\ - Thông tin chi tiết về giá chưa được cấu hình trong CLI này." - } - MessageId::CmdTokensCacheBoth => "{hit} hit / {miss} miss", - MessageId::CmdTokensCacheHitOnly => "{hit} hit / không báo cáo miss", - MessageId::CmdTokensCacheMissOnly => "không báo cáo hit / {miss} miss", - MessageId::CmdTokensContextUnknownWindow => "~{estimated} / không rõ cửa sổ ngữ cảnh", - MessageId::CmdTokensContextWithWindow => "~{used} / {window} ({percent}%)", - MessageId::FooterAgentSingular => "1 tác nhân", - MessageId::FooterAgentsPlural => "{count} tác nhân", - MessageId::FooterPressCtrlCAgain => "Nhấn Ctrl+C một lần nữa để thoát", - MessageId::FooterWorking => "đang xử lý", - MessageId::FooterBalancePrefix => "số dư", - MessageId::HelpSectionActions => "Hành động", - MessageId::HelpSectionClipboard => "Bộ nhớ tạm", - MessageId::HelpSectionEditing => "Chỉnh sửa đầu vào", - MessageId::HelpSectionHelp => "Trợ giúp", - MessageId::HelpSectionModes => "Chế độ", - MessageId::HelpSectionNavigation => "Điều hướng", - MessageId::HelpSectionSessions => "Phiên", - MessageId::CmdTokensNotReported => "không được báo cáo", - MessageId::CmdTokensReport => { - "Lượng Token Sử Dụng:\n\ - ─────────────────────────────\n\ - Ngữ cảnh hoạt động: {active}\n\ - Đầu vào API gần nhất: {input} (viễn trắc theo lượt; có thể đếm lặp lại tiền tố qua các vòng công cụ)\n\ - Đầu ra API gần nhất: {output}\n\ - Hit/miss bộ nhớ đệm: {cache} (chỉ dành cho viễn trắc/chi phí)\n\ - Token tích lũy: {total} (dữ liệu viễn trắc sử dụng của phiên)\n\ - Chi phí phiên xấp xỉ: {cost}\n\ - Tin nhắn API: {api_messages}\n\ - Tin nhắn trò chuyện: {chat_messages}\n\ - Mô hình: {model}" - } - MessageId::KbScrollTranscript => { - "Cuộn bản ghi trò chuyện, điều hướng lịch sử nhập hoặc chọn tệp đính kèm" - } - MessageId::KbNavigateHistory => "Điều hướng lịch sử nhập", - MessageId::KbBrowseHistory => "Duyệt lịch sử cuộc trò chuyện", - MessageId::KbScrollTranscriptAlt => "Cuộn bản ghi trò chuyện", - MessageId::KbScrollPage => "Cuộn bản ghi trò chuyện theo trang", - MessageId::KbJumpTopBottom => "Nhảy lên đầu / xuống cuối bản ghi trò chuyện", - MessageId::KbJumpTopBottomEmpty => "Nhảy lên đầu / xuống cuối (khi khung nhập trống)", - MessageId::KbJumpToolBlocks => "Nhảy giữa các khối đầu ra của công cụ", - MessageId::KbMoveCursor => "Di chuyển con trỏ trong khung soạn thảo", - MessageId::KbJumpLineStartEnd => "Nhảy về đầu / cuối dòng", - MessageId::KbDeleteChar => "Xóa ký tự trước / sau con trỏ, hoặc xóa tệp đính kèm đã chọn", - MessageId::KbClearDraft => "Xóa bản nháp hiện tại", - MessageId::KbStashDraft => "Tạm cất bản nháp hiện tại (dùng `/stash pop` để khôi phục)", - MessageId::KbSearchHistory => "Tìm kiếm lịch sử câu lệnh và khôi phục các bản nháp cục bộ", - MessageId::KbInsertNewline => "Chèn một dòng mới trong khung soạn thảo", - MessageId::KbSendDraft => "Gửi bản nháp hiện tại", - MessageId::KbCloseMenu => "Đóng menu, hủy yêu cầu, hủy bản nháp hoặc xóa sạch đầu vào", - MessageId::KbCancelOrExit => "Hủy yêu cầu, hoặc thoát khi rảnh", - MessageId::KbShellControls => "Chuyển lệnh shell đang chạy ở tiền cảnh xuống nền", - MessageId::KbExitEmpty => "Thoát khi khung nhập trống", - MessageId::KbCommandPalette => "Mở bảng lệnh (command palette)", - MessageId::KbCancelBackgroundShellJobs => { - "Hủy mọi tác vụ shell nền đang chạy (thanh bên Tasks)" - } - MessageId::KbFuzzyFilePicker => { - "Mở trình tìm file nhanh (fuzzy) (chèn @path khi nhấn Enter)" - } - MessageId::KbCompactInspector => "Mở trình kiểm tra ngữ cảnh phiên thu gọn", - MessageId::KbLastMessagePager => { - "Mở trang xem cho tin nhắn cuối cùng (khi khung nhập trống)" - } - MessageId::KbSelectedDetails => { - "Mở chi tiết cho công cụ hoặc tin nhắn được chọn (khi khung nhập trống)" - } - MessageId::KbToolDetailsPager => "Mở trang xem chi tiết công cụ", - MessageId::KbThinkingPager => "Mở Chi Tiết Hoạt Động (Activity Detail)", - MessageId::KbLiveTranscript => "Mở lớp phủ bản ghi trực tiếp (tự động cuộn theo đuôi)", - MessageId::KbBacktrackMessage => { - "Quay lại tin nhắn trước đó của người dùng (nhấn Trái/Phải để chuyển bước, Enter để lùi lại)" - } - MessageId::KbCompleteCycleModes => { - "Hoàn thành /command, xếp hàng theo dõi lượt đang chạy, chuyển đổi chế độ; Shift+Tab để chuyển đổi mức độ suy luận" - } - MessageId::KbJumpPlanAgentYolo => "Kích hoạt các ô hotbar", - MessageId::KbAltJumpPlanAgentYolo => { - "Phím tắt thay thế để nhảy sang chế độ Plan / Agent / YOLO" - } - MessageId::KbFocusSidebar => { - "Focus vào thanh bên Pinned / Tasks / Agents / Context / Auto; Ctrl+Alt+0 để ẩn" - } - MessageId::KbSessionPicker => "Mở bảng chọn phiên làm việc", - MessageId::KbPasteAttach => "Dán văn bản hoặc đính kèm hình ảnh từ bộ nhớ tạm", - MessageId::KbCopySelection => "Sao chép vùng chọn hiện tại (Cmd+C trên macOS)", - MessageId::KbContextMenu => { - "Mở các hành động ngữ cảnh cho dán, vùng chọn, chi tiết tin nhắn, ngữ cảnh và trợ giúp" - } - MessageId::KbAttachPath => "Thêm một tệp văn bản cục bộ hoặc thư mục vào ngữ cảnh", - MessageId::KbHelpOverlay => "Mở lớp phủ trợ giúp này (khi khung nhập trống)", - MessageId::KbToggleHelp => "Bật/Tắt lớp phủ trợ giúp", - MessageId::KbToggleHelpSlash => "Bật/Tắt lớp phủ trợ giúp", - MessageId::HelpUsageLabel => "Sử dụng:", - MessageId::HelpAliasesLabel => "Bí danh:", - MessageId::SettingsTitle => "Cài đặt:", - MessageId::SettingsConfigFile => "Tệp cấu hình:", - MessageId::ClearConversation => "Đã xóa cuộc trò chuyện", - MessageId::ClearConversationBusy => { - "Đã xóa cuộc trò chuyện (trạng thái plan đang bận; chạy lại /clear nếu cần)" - } - MessageId::ModelChanged => "Đã thay đổi mô hình: {old} \u{2192} {new}", - MessageId::LinksTitle => "Liên kết nhà cung cấp:", - MessageId::LinksDashboard => "Bảng điều khiển:", - MessageId::LinksDocs => "Tài liệu:", - MessageId::LinksTip => { - "Mẹo: Dùng biến môi trường được hiển thị cho nhà cung cấp, hoặc lưu khóa bằng `codewhale auth set --provider `." - } - MessageId::SubagentsFetching => "Đang lấy trạng thái Fleet worker...", - MessageId::HelpUnknownCommand => "Lệnh không xác định: {topic}", - MessageId::HomeDashboardTitle => "Bảng Điều Khiển Trang Chủ codewhale", - MessageId::HomeModel => "Mô hình:", - MessageId::HomeMode => "Chế độ:", - MessageId::HomeWorkspace => "Không gian làm việc:", - MessageId::HomeHistory => "Lịch sử:", - MessageId::HomeTokens => "Token:", - MessageId::HomeQueued => "Trong hàng đợi:", - MessageId::HomeSubagents => "Fleet worker:", - MessageId::HomeSkill => "Kỹ năng:", - MessageId::HomeQuickActions => "Hành động nhanh", - MessageId::HomeQuickLinks => "/links - Các liên kết đến Dashboard & API", - MessageId::HomeQuickSkills => "/skills - Liệt kê các kỹ năng khả dụng", - MessageId::HomeQuickConfig => "/config - Mở trình chỉnh sửa cấu hình tương tác", - MessageId::HomeQuickSettings => "/settings - Hiển thị các cài đặt liên tục", - MessageId::HomeQuickModel => "/model - Xem hoặc chuyển đổi mô hình", - MessageId::HomeQuickSubagents => "/fleet status - Trạng thái Fleet worker", - MessageId::HomeQuickTaskList => "/task list - Hiển thị hàng đợi nhiệm vụ ngầm", - MessageId::HomeQuickHelp => "/help - Hiển thị trợ giúp", - MessageId::HomeModeTips => "Mẹo về Chế độ", - MessageId::HomeAgentModeTip => "Chế độ Agent - Sử dụng công cụ cho các nhiệm vụ tự chủ", - MessageId::HomeAgentModeReviewTip => " Nhập /mode plan để xem xét trước khi thực thi", - MessageId::HomeAgentModeYoloTip => " Nhập /mode yolo để bật toàn quyền truy cập công cụ", - MessageId::HomeYoloModeTip => { - "Chế độ YOLO - Toàn quyền truy cập công cụ, không cần phê duyệt" - } - MessageId::HomeYoloModeCaution => " Hãy cẩn thận với các thao tác mang tính phá hủy!", - MessageId::HomePlanModeTip => "Chế độ Plan - Thiết kế trước khi triển khai", - MessageId::HomePlanModeChecklistTip => { - " Sử dụng /mode plan để tạo danh sách kiểm tra có cấu trúc" - } - MessageId::HomeGoalModeTip => { - "Theo dõi mục tiêu - Dùng /goal để đặt mục tiêu làm việc" - } - // Onboarding — language picker. - MessageId::OnboardLanguageTitle => "Chọn ngôn ngữ của bạn", - MessageId::OnboardLanguageBlurb => { - "Chọn ngôn ngữ hiển thị. Bạn có thể thay đổi bất kỳ lúc nào bằng lệnh `/settings set locale `." - } - MessageId::OnboardLanguageFooter => { - "Nhấn phím từ 1-7 để chọn, hoặc Enter để giữ cài đặt hiện tại" - } - // Onboarding — API key entry. - MessageId::OnboardApiKeyTitle => "Kết nối khóa API DeepSeek của bạn", - MessageId::OnboardApiKeyStep1 => { - "Bước 1. Truy cập https://platform.deepseek.com/api_keys và tạo một khóa." - } - MessageId::OnboardApiKeyStep2 => "Bước 2. Dán khóa vào bên dưới và nhấn Enter.", - MessageId::OnboardApiKeySavedHint => { - "Được lưu vào ~/.codewhale/config.toml để có thể hoạt động từ mọi thư mục." - } - MessageId::OnboardApiKeyFormatHint => { - "Dán chính xác toàn bộ khóa (không chứa khoảng trắng hoặc xuống dòng)." - } - MessageId::OnboardApiKeyPlaceholder => "(dán khóa vào đây)", - MessageId::OnboardApiKeyLabel => "Khóa: ", - MessageId::OnboardApiKeyFooter => "Nhấn Enter để lưu, Esc để quay lại.", - // Onboarding — workspace trust. - MessageId::OnboardTrustTitle => "Tin cậy không gian làm việc", - MessageId::OnboardTrustQuestion => "Bạn có tin cậy nội dung của thư mục này không?", - MessageId::OnboardTrustLocationPrefix => "Bạn đang ở ", - MessageId::OnboardTrustRiskHint => { - "Làm việc với các nội dung không tin cậy sẽ tăng nguy cơ bị tấn công prompt injection." - } - MessageId::OnboardTrustEffectHint => { - "Tin cậy thư mục này sẽ lưu lại vào cấu hình toàn cục và bật chế độ không gian làm việc tin cậy." - } - MessageId::OnboardTrustFooterPrefix => "Nhấn ", - MessageId::OnboardTrustFooterMiddle => " để tin cậy và tiếp tục, ", - MessageId::OnboardTrustFooterSuffix => " để thoát", - // Onboarding — final tips. - MessageId::OnboardTipsTitle => "Bắt đầu đơn giản", - MessageId::OnboardTipsLine1 => { - "Viết nhiệm vụ bằng ngôn ngữ tự nhiên. Sử dụng /help hoặc Ctrl+K khi bạn muốn dùng lệnh." - } - MessageId::OnboardTipsLine2 => { - "Khung nhập văn bản bên dưới hỗ trợ viết nhiều dòng: Enter để gửi, Alt+Enter hoặc Ctrl+J để xuống dòng." - } - MessageId::OnboardTipsLine3 => { - "Chỉ chuyển đổi chế độ khi tính chất công việc thay đổi: Plan để lập kế hoạch trước khi làm, Agent để tự động thực hiện, YOLO khi bạn muốn tự động phê duyệt." - } - MessageId::OnboardTipsLine4 => { - "Ctrl+R để khôi phục lại các phiên làm việc trước đó, và Esc để thoát khỏi bản nháp hoặc lớp phủ hiện tại." - } - MessageId::OnboardTipsFooterEnter => "Nhấn Enter", - MessageId::OnboardTipsFooterAction => " để mở không gian làm việc", - // Context menu. - MessageId::CtxMenuTitle => " Nhấp chuột phải ", - MessageId::CtxMenuCopySelection => "Sao chép vùng chọn", - MessageId::CtxMenuCopySelectionDesc => "ghi văn bản transcript đã chọn", - MessageId::CtxMenuOpenSelection => "Mở vùng chọn", - MessageId::CtxMenuOpenSelectionDesc => "hiển thị văn bản đã chọn trong trình xem", - MessageId::CtxMenuClearSelection => "Xóa vùng chọn", - MessageId::CtxMenuOpenDetails => "Mở chi tiết", - MessageId::CtxMenuCopyMessage => "Sao chép tin nhắn", - MessageId::CtxMenuCopyMessageDesc => "ghi ô transcript đã bấm", - MessageId::CtxMenuOpenInEditor => "Mở trong trình soạn thảo", - MessageId::CtxMenuOpenInEditorDesc => "mở file:line trong $EDITOR", - MessageId::CtxMenuShowCell => "Hiển thị ô", - MessageId::CtxMenuShowCellDesc => "hiển thị lại ô transcript này", - MessageId::CtxMenuHideCell => "Ẩn ô", - MessageId::CtxMenuHideCellDesc => "thu gọn ô transcript này", - MessageId::CtxMenuShowHidden => "Hiển thị mục ẩn", - MessageId::CtxMenuShowHiddenDesc => "hiển thị lại tất cả ô đã thu gọn", - MessageId::CtxMenuPaste => "Dán", - MessageId::CtxMenuPasteDesc => "chèn clipboard vào khung nhập", - MessageId::CtxMenuCmdPalette => "Bảng lệnh", - MessageId::CtxMenuCmdPaletteDesc => "lệnh, kỹ năng và công cụ", - MessageId::CtxMenuContextInspector => "Trình kiểm tra ngữ cảnh", - MessageId::CtxMenuContextInspectorDesc => "ngữ cảnh đang hoạt động và gợi ý bộ nhớ đệm", - MessageId::CtxMenuHelp => "Trợ giúp", - MessageId::CtxMenuHelpDesc => "phím tắt và lệnh", - MessageId::FanoutCounts => { - "{done} hoàn thành · {running} đang chạy · {failed} thất bại · {pending} chờ" - } - - // App mode picker (prompt, names, hints) and composer vim indicator. - MessageId::ModePickerPrompt => "Chọn cách CodeWhale hoạt động:", - MessageId::AppModeAgent => "Tác nhân", - MessageId::AppModeYolo => "YOLO", - MessageId::AppModePlan => "Kế hoạch", - MessageId::AppModeAgentHint => "Thực thi bình thường, hỏi trước khi thay đổi", - MessageId::AppModePlanHint => "Lập kế hoạch trước khi thực thi", - MessageId::AppModeYoloHint => "Tự động phê duyệt; bật shell (toàn quyền)", - MessageId::VimModeNormal => "-- BÌNH THƯỜNG --", - MessageId::VimModeInsert => "-- CHÈN --", - MessageId::VimModeVisual => "-- TRỰC QUAN --", - - // Approval dialog. - MessageId::ApprovalRiskReview => "XEM XÉT", - MessageId::ApprovalRiskDestructive => "NGUY HẠI", - MessageId::ApprovalCategorySafe => "An toàn", - MessageId::ApprovalCategoryFileWrite => "Ghi Tệp", - MessageId::ApprovalCategoryShell => "Bash", - MessageId::ApprovalCategoryNetwork => "Mạng", - MessageId::ApprovalCategoryMcpRead => "Đọc MCP", - MessageId::ApprovalCategoryMcpAction => "Hành động MCP", - MessageId::ApprovalCategoryUnknown => "Không xác định", - MessageId::ApprovalFieldType => "Loại:", - MessageId::ApprovalFieldAbout => "Mô tả:", - MessageId::ApprovalFieldImpact => "Tác động:", - MessageId::ApprovalFieldParams => "Tham số:", - MessageId::ApprovalOptionApproveOnce => "Phê duyệt một lần", - MessageId::ApprovalOptionApproveAlways => "Phê duyệt mọi lần cho loại này", - MessageId::ApprovalOptionDeny => "Từ chối lần gọi này", - MessageId::ApprovalOptionAbortTurn => "Hủy bỏ lượt", - MessageId::ApprovalBlockTitle => "phê duyệt", - MessageId::ApprovalControlsHint => " · v: tham số · Esc: hủy bỏ", - MessageId::ApprovalChooseHint => "Chọn: ", - MessageId::ApprovalChooseAction => "Enter để chọn, hoặc nhấn y/a/d trực tiếp", - MessageId::ApprovalIntentLabel => "Ý định: ", - MessageId::ApprovalMoreLines => " … (+{count} dòng)", - // Sandbox elevation dialog. - // Sandbox elevation dialog. - MessageId::ElevationTitleSandboxDenied => " \u{26a0} Sandbox Bị Từ Chối ", - MessageId::ElevationTitleRequired => " Yêu Cầu Nâng Cấp Sandbox ", - MessageId::ElevationFieldTool => " Công cụ: ", - MessageId::ElevationFieldCmd => " Lệnh: ", - MessageId::ElevationFieldReason => " Lý do: ", - MessageId::ElevationImpactHeader => " Tác động nếu được chấp thuận:", - MessageId::ElevationImpactNetwork => { - " - thử lại với mạng cho phép tải xuống và yêu cầu HTTP" - } - MessageId::ElevationImpactWrite => { - " - thử lại với quyền ghi mở rộng phạm vi hệ thống tệp" - } - MessageId::ElevationImpactFullAccess => { - " - truy cập đầy đủ loại bỏ hoàn toàn hạn chế sandbox" - } - MessageId::ElevationPromptProceed => " Chọn cách tiếp tục:", - MessageId::ElevationOptionNetwork => "Cho phép mạng ngoài", - MessageId::ElevationOptionWrite => "Cho phép quyền ghi bổ sung", - MessageId::ElevationOptionFullAccess => "Truy cập đầy đủ (hệ thống tệp + mạng)", - MessageId::ElevationOptionAbort => "Hủy bỏ", - MessageId::ElevationOptionNetworkDesc => { - "Thử lại cuộc gọi công cụ này với quyền truy cập mạng ngoài" - } - MessageId::ElevationOptionWriteDesc => { - "Thử lại cuộc gọi công cụ này với phạm vi hệ thống tệp có thể ghi bổ sung" - } - MessageId::ElevationOptionFullAccessDesc => { - "Thử lại không giới hạn sandbox; cấp quyền truy cập không hạn chế" - } - MessageId::ElevationOptionAbortDesc => "Hủy thực thi công cụ này", - - MessageId::CtxInspTitle => "Trình kiểm tra ngữ cảnh", - MessageId::CtxInspSessionContext => "Ngữ cảnh phiên", - MessageId::CtxInspSystemPrompt => "Cấu trúc lời nhắc hệ thống", - MessageId::CtxInspReferences => "Tham chiếu", - MessageId::CtxInspRecentTools => "Công cụ gần đây", - MessageId::CtxInspModel => "Mô hình", - MessageId::CtxInspWorkspace => "Không gian làm việc", - MessageId::CtxInspSession => "Phiên", - MessageId::CtxInspContext => "Ngữ cảnh", - MessageId::CtxInspTranscript => "Bảng ghi", - MessageId::CtxInspWorkspaceStatus => "Trạng thái không gian làm việc", - MessageId::CtxInspNotSampledYet => "chưa lấy mẫu", - MessageId::CtxInspOk => "ổn", - MessageId::CtxInspHigh => "cao", - MessageId::CtxInspCritical => "nghiêm trọng", - MessageId::CtxInspIncluded => "đã bao gồm", - MessageId::CtxInspAttached => "đã đính kèm", - MessageId::CtxInspNotIncluded => "không bao gồm", - MessageId::CtxInspOutputCaptured => "đã thu được đầu ra", - MessageId::CtxInspNoOutputYet => "chưa có đầu ra", - MessageId::CtxInspNoSystemPrompt => "Chưa có lời nhắc hệ thống.", - MessageId::CtxInspNoReferences => "Chưa có tham chiếu tệp, thư mục hoặc phương tiện nào.", - MessageId::CtxInspNoToolActivity => "Chưa có hoạt động công cụ nào.", - MessageId::CtxInspVHint => "Mở thẻ phù hợp và nhấn v để biết chi tiết.", - MessageId::CtxInspCells => "ô", - MessageId::CtxInspApiMessages => "tin nhắn API", - MessageId::CtxInspActive => "đang hoạt động", - MessageId::CtxInspCell => "ô", - MessageId::CtxInspMoreReferences => "các tham chiếu khác", - MessageId::CtxInspStablePrefix => "Khối ổn định", - MessageId::CtxInspVolatileWorkingSet => "Vùng làm việc thay đổi", - MessageId::CtxInspFirstLine => "Dòng đầu", - MessageId::CtxInspTotal => "Tổng", - MessageId::CtxInspTextPromptLayers => "Lớp văn bản gợi ý", - MessageId::CtxInspSingleTextBlob => "Văn bản khối đơn", - MessageId::CtxInspBlocks => "khối", - MessageId::CtxInspBlock => "khối", - MessageId::CtxInspTokens => "token", - MessageId::CtxInspLayers => "lớp", - MessageId::CtxInspNone => "không", - MessageId::CtxInspEmpty => "(trống)", - MessageId::CtxInspCacheFriendly => "thân thiện với bộ nhớ đệm", - MessageId::CtxInspChangesByTurn => "thay đổi theo phiên/lượt", - MessageId::CtxInspStablePrefixOnly => "chỉ có tiền tố ổn định", - MessageId::CtxInspCacheTip => { - "Gợi ý: Các khối ổn định đủ điều kiện cho bộ nhớ đệm tiền tố DeepSeek V4. Thay đổi vùng làm việc chỉ phá vỡ bộ nhớ đệm ở phần cuối." - } - MessageId::ToolFamilyRead => "đọc", - MessageId::ToolFamilyPatch => "vá", - MessageId::ToolFamilyRun => "chạy", - MessageId::ToolFamilyFind => "tìm", - MessageId::ToolFamilyDelegate => "ủy quyền", - MessageId::ToolFamilyFanout => "fanout", - MessageId::ToolFamilyRlm => "rlm", - MessageId::ToolFamilyVerify => "xác minh", - MessageId::ToolFamilyThink => "suy nghĩ", - MessageId::ToolFamilyGeneric => "công cụ", - // Voice commands - MessageId::CmdVoiceDescription => { - "Bật/tắt nhập liệu bằng giọng nói: ghi âm và chuyển thành văn bản" - } - MessageId::CmdVoiceSendDescription => { - "Bật/tắt tự gửi bằng giọng nói: gửi khi bản ghi kết thúc bằng \"send it\"" - } - MessageId::CmdVoiceControlDescription => { - "Bật/tắt điều khiển giọng nói: đọc chính tả có AI hỗ trợ" - } - MessageId::VoiceEnabled => "Đã bật nhập liệu bằng giọng nói. Hãy nói để ghi âm.", - MessageId::VoiceDisabled => "Đã tắt nhập liệu bằng giọng nói.", - MessageId::VoiceSendEnabled => "Đã bật tự gửi bằng giọng nói.", - MessageId::VoiceSendDisabled => "Đã tắt tự gửi bằng giọng nói.", - MessageId::VoiceControlEnabled => "Đã bật điều khiển giọng nói.", - MessageId::VoiceControlDisabled => "Đã tắt điều khiển giọng nói.", - MessageId::VoiceErrNoAuth => "Giọng nói: nhà cung cấp hiện tại chưa có khóa API", - MessageId::VoiceErrNoRecorder => { - "Giọng nói: không tìm thấy công cụ ghi âm. Hãy cài sox, arecord hoặc rec." - } - MessageId::VoiceErrNetwork => "Giọng nói: yêu cầu chuyển giọng nói thất bại", - MessageId::VoiceErrEmptySend => "Giọng nói: không có nội dung để gửi", - MessageId::VoiceErrTooShort => "Giọng nói: không phát hiện giọng nói, bản ghi quá ngắn", - MessageId::VoiceRecording => "🎙 Đang ghi âm... hãy nói", - MessageId::VoiceProcessing => "🎙 Đang chuyển thành văn bản...", - MessageId::VoiceTranscribed => "🎙 Đã chuyển xong", - }) -} - -fn traditional_chinese(id: MessageId) -> Option<&'static str> { - Some(match id { - MessageId::CmdRelayDescription => "為新執行緒建立會話接力摘要", - MessageId::CmdPluginDescription => "List discovered plugin tools or show details for one", - MessageId::CmdPluginNoneFound => "No plugin tools discovered in {dir}", - MessageId::CmdPluginNotFound => "Plugin '{name}' not found", - MessageId::CmdPluginListHeader => "Plugin tools ({count}):", - MessageId::CmdPluginDetailDescription => "Description: {description}", - MessageId::CmdPluginDetailSchema => "Schema:\n{schema}", - MessageId::CmdPluginDetailApproval => "Approval: {approval}", - MessageId::CmdPluginDetailPath => "Path: {path}", - MessageId::CmdTranslateDescription => "切換輸出翻譯為目前系統語言的開關狀態", - MessageId::CmdTranslateOff => "輸出翻譯已關閉(顯示原始模型輸出)", - MessageId::CmdTranslateOn => "輸出翻譯已開啟:模型回覆將以繁體中文顯示", - MessageId::TranslationInProgress => "正在翻譯助理輸出...", - MessageId::TranslationComplete => "翻譯完成", - MessageId::TranslationFailed => "翻譯失敗", - MessageId::FooterBalancePrefix => "餘額", - MessageId::FanoutCounts => { - "{done} 已完成 · {running} 運行中 · {failed} 失敗 · {pending} 等待中" - } - - // App mode picker (prompt, names, hints) and composer vim indicator. - MessageId::ModePickerPrompt => "選擇 CodeWhale 的運作方式:", - MessageId::AppModeAgent => "智能體", - MessageId::AppModeYolo => "YOLO", - MessageId::AppModePlan => "計畫", - MessageId::AppModeAgentHint => "正常執行,變更前需核准", - MessageId::AppModePlanHint => "先規劃,再執行", - MessageId::AppModeYoloHint => "自動核准;啟用 shell(完全存取)", - MessageId::VimModeNormal => "-- 一般 --", - MessageId::VimModeInsert => "-- 插入 --", - MessageId::VimModeVisual => "-- 可視 --", - - // Approval dialog. - MessageId::ApprovalRiskReview => "審查", - MessageId::ApprovalRiskDestructive => "破壞性", - MessageId::ApprovalCategorySafe => "安全", - MessageId::ApprovalCategoryFileWrite => "檔案寫入", - MessageId::ApprovalCategoryShell => "Bash", - MessageId::ApprovalCategoryNetwork => "網路", - MessageId::ApprovalCategoryMcpRead => "MCP 讀取", - MessageId::ApprovalCategoryMcpAction => "MCP 操作", - MessageId::ApprovalCategoryUnknown => "未分類", - MessageId::ApprovalFieldType => "類型:", - MessageId::ApprovalFieldAbout => "說明:", - MessageId::ApprovalFieldImpact => "影響:", - MessageId::ApprovalFieldParams => "參數:", - MessageId::ApprovalOptionApproveOnce => "僅批准一次", - MessageId::ApprovalOptionApproveAlways => "本會話同類自動批准", - MessageId::ApprovalOptionDeny => "拒絕本次調用", - MessageId::ApprovalOptionAbortTurn => "終止本輪", - MessageId::ApprovalBlockTitle => "審批", - MessageId::ApprovalControlsHint => " · v:完整參數 · Esc:終止", - MessageId::ApprovalChooseHint => "選擇:", - MessageId::ApprovalChooseAction => "Enter 執行選中項,或直接按 y/a/d", - MessageId::ApprovalIntentLabel => "意圖:", - MessageId::ApprovalMoreLines => " … (還有 {count} 行)", - // Sandbox elevation dialog. - // Sandbox elevation dialog. - MessageId::ElevationTitleSandboxDenied => " \u{26a0} 沙箱拒絕 ", - MessageId::ElevationTitleRequired => " 沙箱提權 ", - MessageId::ElevationFieldTool => " 工具:", - MessageId::ElevationFieldCmd => " 命令:", - MessageId::ElevationFieldReason => " 原因:", - MessageId::ElevationImpactHeader => " 批准後的影響:", - MessageId::ElevationImpactNetwork => " - 網路重試允許外部下載和 HTTP 請求", - MessageId::ElevationImpactWrite => " - 寫入重試擴大此工具呼叫的檔案系統寫入範圍", - MessageId::ElevationImpactFullAccess => " - 完全訪問解除沙箱限制", - MessageId::ElevationPromptProceed => " 請選擇處理方式:", - MessageId::ElevationOptionNetwork => "允許外部網路訪問", - MessageId::ElevationOptionWrite => "允許額外寫入權限", - MessageId::ElevationOptionFullAccess => "完全訪問(檔案系統 + 網路)", - MessageId::ElevationOptionAbort => "中止", - MessageId::ElevationOptionNetworkDesc => { - "使用外部網路訪問重試此工具呼叫(下載和 HTTP 請求)" - } - MessageId::ElevationOptionWriteDesc => "重試此工具呼叫,擴大可寫入的檔案系統範圍", - MessageId::ElevationOptionFullAccessDesc => { - "無沙箱限制重試(授予無限制的檔案系統和網路訪問權限)" - } - MessageId::ElevationOptionAbortDesc => "取消此工具呼叫", - - MessageId::CtxInspTitle => "上下文檢查器", - MessageId::CtxInspSessionContext => "會話上下文", - MessageId::CtxInspSystemPrompt => "系統提示結構", - MessageId::CtxInspReferences => "引用", - MessageId::CtxInspRecentTools => "最近使用的工具", - MessageId::CtxInspModel => "模型", - MessageId::CtxInspWorkspace => "工作區", - MessageId::CtxInspSession => "會話", - MessageId::CtxInspContext => "上下文", - MessageId::CtxInspTranscript => "記錄", - MessageId::CtxInspWorkspaceStatus => "工作區狀態", - MessageId::CtxInspNotSampledYet => "尚未取樣", - MessageId::CtxInspOk => "正常", - MessageId::CtxInspHigh => "較高", - MessageId::CtxInspCritical => "嚴重", - MessageId::CtxInspIncluded => "已包含", - MessageId::CtxInspAttached => "已附加", - MessageId::CtxInspNotIncluded => "未包含", - MessageId::CtxInspOutputCaptured => "已捕獲輸出", - MessageId::CtxInspNoOutputYet => "尚無輸出", - MessageId::CtxInspNoSystemPrompt => "未設定系統提示。", - MessageId::CtxInspNoReferences => "尚未記錄任何檔案、目錄或媒體引用。", - MessageId::CtxInspNoToolActivity => "尚未記錄任何工具活動。", - MessageId::CtxInspVHint => "開啟對應的卡片並按 v 檢視詳細資訊。", - MessageId::CtxInspCells => "儲存格", - MessageId::CtxInspApiMessages => "API 訊息", - MessageId::CtxInspActive => "作用中", - MessageId::CtxInspCell => "儲存格", - MessageId::CtxInspMoreReferences => "其他引用", - MessageId::CtxInspStablePrefix => "穩定前綴", - MessageId::CtxInspVolatileWorkingSet => "易變工作集", - MessageId::CtxInspFirstLine => "第一行", - MessageId::CtxInspTotal => "總計", - MessageId::CtxInspTextPromptLayers => "文字提示層", - MessageId::CtxInspSingleTextBlob => "單一文字塊", - MessageId::CtxInspBlocks => "個區塊", - MessageId::CtxInspBlock => "個區塊", - MessageId::CtxInspTokens => "個 token", - MessageId::CtxInspLayers => "個層", - MessageId::CtxInspNone => "無", - MessageId::CtxInspEmpty => "(空)", - MessageId::CtxInspCacheFriendly => "快取友好", - MessageId::CtxInspChangesByTurn => "按會話/輪次變化", - MessageId::CtxInspStablePrefixOnly => "僅穩定前綴", - MessageId::CtxInspCacheTip => { - "提示:穩定前綴區塊符合 DeepSeek V4 前綴快取條件。易變工作集的更改僅會破壞快取尾部。" - } - MessageId::ConfigSectionProvider => "提供商", - MessageId::ConfigSectionModel => "模型", - MessageId::ConfigSectionPermissions => "權限", - MessageId::ConfigSectionNetwork => "網路", - MessageId::ConfigSectionDisplay => "顯示", - MessageId::ConfigSectionComposer => "編輯器", - MessageId::ConfigSectionSidebar => "側邊欄", - MessageId::ConfigSectionHistory => "歷史", - MessageId::ConfigSectionMcp => "MCP", - MessageId::ConfigSectionFleet => "艦隊", - MessageId::ConfigSectionExperimental => "實驗", - MessageId::ConfigScopeSession => "會話", - MessageId::ConfigScopeSaved => "已儲存", - MessageId::ConfigEditCancelled => "編輯已取消", - MessageId::ConfigEditTitlePrefix => "編輯 ", - MessageId::ConfigEditScopeLabel => "範圍: ", - MessageId::ConfigEditCurrentLabel => "目前: ", - MessageId::ConfigEditHintLabel => "提示: ", - MessageId::ConfigEditNewLabel => "新值: ", - MessageId::ConfigEditFooter => { - " Enter=套用, Esc=取消, Ctrl+U=清除, Ctrl+A=全選, \u{2190}/\u{2192}=移動 " - } - MessageId::ConfigRowEffective => " (實際 {currency})", - MessageId::ConfigDefaultValue => "(預設)", - MessageId::ConfigDefaultReasoning => "(設定/預設)", - MessageId::ConfigUnavailable => "(無法使用)", - MessageId::StatusPickerTitle => " 狀態列 ", - MessageId::StatusPickerInstruction => "選擇要在底部顯示的項目:", - MessageId::StatusPickerActionToggle => "切換 ", - MessageId::StatusPickerActionAll => "全部 ", - MessageId::StatusPickerActionNone => "無 ", - MessageId::StatusPickerActionSave => "儲存 ", - MessageId::StatusPickerActionCancel => "取消 ", - MessageId::ToolFamilyRead => "讀取", - MessageId::ToolFamilyPatch => "修補", - MessageId::ToolFamilyRun => "執行", - MessageId::ToolFamilyFind => "搜尋", - MessageId::ToolFamilyDelegate => "委派", - MessageId::ToolFamilyFanout => "扇出", - MessageId::ToolFamilyRlm => "rlm", - MessageId::ToolFamilyVerify => "驗證", - MessageId::ToolFamilyThink => "思考", - MessageId::ToolFamilyGeneric => "工具", - // Voice commands - MessageId::CmdVoiceDescription => "切換語音輸入:錄製語音並轉錄為文字", - MessageId::CmdVoiceSendDescription => { - "切換語音自動傳送:轉錄以「發送」或「send it」結尾時自動提交" - } - MessageId::CmdVoiceControlDescription => { - "切換語音控制:AI 輔助的語音聽寫(結合當前輸入內容)" - } - MessageId::VoiceEnabled => "語音輸入已開啟,開始說話即可錄製", - MessageId::VoiceDisabled => "語音輸入已關閉", - MessageId::VoiceSendEnabled => "語音自動傳送已開啟", - MessageId::VoiceSendDisabled => "語音自動傳送已關閉", - MessageId::VoiceControlEnabled => "語音控制已開啟", - MessageId::VoiceControlDisabled => "語音控制已關閉", - MessageId::VoiceErrNoAuth => "語音:目前供應商未設定 API 金鑰", - MessageId::VoiceErrNoRecorder => "語音:未找到錄音工具,請安裝 sox、arecord 或 rec", - MessageId::VoiceErrNetwork => "語音:轉錄請求失敗", - MessageId::VoiceErrEmptySend => "語音:沒有可傳送的內容", - MessageId::VoiceErrTooShort => "語音:未偵測到有效語音,錄製時間過短", - MessageId::VoiceRecording => "🎙 正在錄音...請說話", - MessageId::VoiceProcessing => "🎙 正在轉錄...", - MessageId::VoiceTranscribed => "🎙 轉錄完成", - other => chinese_simplified(other)?, - }) -} - -fn japanese(id: MessageId) -> Option<&'static str> { - Some(match id { - MessageId::ComposerPlaceholder => "タスクを書くか / を使う。", - MessageId::HistorySearchPlaceholder => "プロンプト履歴を検索...", - MessageId::HistorySearchTitle => "履歴検索", - MessageId::HistoryHintMove => "Up/Down 移動", - MessageId::HistoryHintAccept => "Enter 確定", - MessageId::HistoryHintRestore => "Esc 復元", - MessageId::HistoryNoMatches => " 一致なし", - MessageId::StatusPickerTitle => " ステータス行 ", - MessageId::StatusPickerInstruction => "フッターに表示する項目を選択:", - MessageId::StatusPickerActionToggle => "切替 ", - MessageId::StatusPickerActionAll => "すべて ", - MessageId::StatusPickerActionNone => "なし ", - MessageId::StatusPickerActionSave => "保存 ", - MessageId::StatusPickerActionCancel => "キャンセル ", - MessageId::ConfigTitle => "セッション設定", - MessageId::ConfigModalTitle => " 設定 ", - MessageId::ConfigSearchPlaceholder => "入力して絞り込み", - MessageId::ConfigNoSettings => " 設定がありません。", - MessageId::ConfigNoMatchesPrefix => " 一致する設定なし: ", - MessageId::ConfigFilteredSettings => " 絞り込み後の設定", - MessageId::ConfigShowing => " 表示", - MessageId::ConfigFooterDefault => { - " 入力=絞り込み, Up/Down=選択, Enter/e=編集, Esc/q=閉じる " - } - MessageId::ConfigFooterScrollable => { - " 入力=絞り込み, Up/Down=選択, Enter/e=編集, PgUp/PgDn=スクロール, Esc/q=閉じる " - } - MessageId::ConfigFooterFiltered => { - " 入力=絞り込み, Backspace=削除, Ctrl+U/Esc=クリア, Enter=編集 " - } - MessageId::ConfigSectionProvider => "プロバイダ", - MessageId::ConfigSectionModel => "モデル", - MessageId::ConfigSectionPermissions => "権限", - MessageId::ConfigSectionNetwork => "ネットワーク", - MessageId::ConfigSectionDisplay => "表示", - MessageId::ConfigSectionComposer => "コンポーザー", - MessageId::ConfigSectionSidebar => "サイドバー", - MessageId::ConfigSectionHistory => "履歴", - MessageId::ConfigSectionMcp => "MCP", - MessageId::ConfigSectionFleet => "Fleet", - MessageId::ConfigSectionExperimental => "実験", - MessageId::ConfigScopeSession => "セッション", - MessageId::ConfigScopeSaved => "保存済み", - MessageId::ConfigEditCancelled => "編集をキャンセルしました", - MessageId::ConfigEditTitlePrefix => "編集 ", - MessageId::ConfigEditScopeLabel => "スコープ: ", - MessageId::ConfigEditCurrentLabel => "現在: ", - MessageId::ConfigEditHintLabel => "ヒント: ", - MessageId::ConfigEditNewLabel => "新規: ", - MessageId::ConfigEditFooter => { - " Enter=適用, Esc=キャンセル, Ctrl+U=クリア, Ctrl+A=全選択, \u{2190}/\u{2192}=移動 " - } - MessageId::ConfigRowEffective => " (実効 {currency})", - MessageId::ConfigDefaultValue => "(デフォルト)", - MessageId::ConfigDefaultReasoning => "(設定/デフォルト)", - MessageId::ConfigUnavailable => "(利用不可)", - MessageId::HelpTitle => "ヘルプ", - MessageId::HelpFilterPlaceholder => "入力して絞り込み", - MessageId::HelpFilterPrefix => "絞り込み: ", - MessageId::HelpNoMatches => " 一致なし。", - MessageId::HelpSlashCommands => "スラッシュコマンド", - MessageId::HelpKeybindings => "キー操作", - MessageId::HelpFooterTypeFilter => " 入力して絞り込み ", - MessageId::HelpFooterMove => " Up/Down 移動 ", - MessageId::HelpFooterJump => " PgUp/PgDn ジャンプ ", - MessageId::HelpFooterClose => " Esc 閉じる ", - MessageId::CmdAnchorDescription => { - "コンパクション後も保持される重要な事実をピン留め(コンテキストに自動注入)" - } - MessageId::CmdAttachDescription => { - "画像・動画メディアを添付(テキストファイルやディレクトリは @path)" - } - MessageId::CmdCacheDescription => { - "直近 N ターンの DeepSeek プレフィックスキャッシュのヒット/ミス統計を表示" - } - MessageId::CmdChangeDescription => "最新の更新履歴を表示", - MessageId::CmdChangeHeader => "最新の更新履歴", - MessageId::CmdChangeTranslationQueued => { - "英語のリリースノートを以下に表示します。次に翻訳を依頼します。プロバイダーを利用できない場合は、この英語版がフォールバックです。" - } - MessageId::CmdChangeTranslationUnavailable => { - "英語のリリースノートを以下に表示します。現在のセッションに API キーがないかオフラインのため、翻訳は利用できません。" - } - MessageId::CmdChangePreviousVersion => { - "前のバージョン: {version} — `/change {version}` で表示" - } - MessageId::CmdBalanceDescription => "アクティブなプロバイダーのアカウント残高を確認", - MessageId::CmdClearDescription => "会話履歴をクリア", - MessageId::CmdCompactDescription => "コンテキスト圧縮で容量を確保", - MessageId::CmdPurgeDescription => { - "エージェントに会話履歴を分析させ、不要なメッセージを削除・要約" - } - MessageId::CmdConfigDescription => "インタラクティブな設定エディタを開く", - MessageId::CmdContextDescription => "コンパクトなセッションコンテキスト検査ツールを開く", - MessageId::CmdCostDescription => "セッションのコスト内訳を表示", - MessageId::CmdDiffDescription => "セッション開始以降のファイル変更を表示", - MessageId::CmdEditDescription => "最後のメッセージを編集して再送信", - MessageId::CmdExitDescription => "アプリを終了", - MessageId::CmdExportDescription => "会話を Markdown にエクスポート", - MessageId::CmdFeedbackDescription => "GitHub フィードバック URL を生成", - MessageId::CmdHfDescription => "Hugging Face MCP の設定と概念を確認", - MessageId::CmdHelpDescription => "ヘルプを表示", - MessageId::CmdProfileDescription => "名前付き設定プロファイルに切り替え", - MessageId::CmdHomeDescription => "統計とクイックアクション付きのホームダッシュボードを表示", - MessageId::CmdHooksDescription => { - "設定済みのライフサイクルフックを一覧表示(読み取り専用)" - } - MessageId::CmdAgentDescription => { - "永続サブエージェントセッションを開く: /agent [0-3] " - } - MessageId::CmdGoalDescription => "トークンバジェット付きのセッション目標を設定", - MessageId::CmdInitDescription => "プロジェクト用に AGENTS.md を生成", - MessageId::CmdLspDescription => "LSP 診断のオン・オフを切り替え", - MessageId::CmdShareDescription => "現在のセッションを共有可能な Web URL としてエクスポート", - MessageId::CmdJobsDescription => "バックグラウンドのシェルジョブを確認・制御", - MessageId::CmdLinksDescription => { - "プロバイダーのトークン、ダッシュボード、ドキュメントのリンクを表示" - } - MessageId::CmdLoadDescription => "ファイルからセッションを読み込み", - MessageId::CmdLogoutDescription => "API キーを消去してセットアップに戻る", - MessageId::CmdMcpDescription => "MCP サーバを開く・管理する", - MessageId::CmdPluginDescription => "List discovered plugin tools or show details for one", - MessageId::CmdPluginNoneFound => "No plugin tools discovered in {dir}", - MessageId::CmdPluginNotFound => "Plugin '{name}' not found", - MessageId::CmdPluginListHeader => "Plugin tools ({count}):", - MessageId::CmdPluginDetailDescription => "Description: {description}", - MessageId::CmdPluginDetailSchema => "Schema:\n{schema}", - MessageId::CmdPluginDetailApproval => "Approval: {approval}", - MessageId::CmdPluginDetailPath => "Path: {path}", - MessageId::CmdMemoryDescription => "永続ユーザーメモリファイルを確認・管理", - MessageId::CmdModeDescription => { - "動作モードを切り替え、または選択画面を開く: /mode [agent|plan|yolo|1|2|3]" - } - MessageId::CmdModelDescription => "現在のモデルを切り替え・確認", - MessageId::CmdModelsDescription => "API から利用可能なモデルを一覧表示", - MessageId::CmdModelDbDescription => "内蔵のモデルリファレンスデータベースを閲覧", - MessageId::CmdNetworkDescription => "ネットワーク許可・拒否ルールを管理", - MessageId::CmdNoteDescription => "ワークスペースノートの追加、一覧、編集、削除", - MessageId::CmdThemeDescription => { - "テーマを切り替え(ダーク/ライト/グレースケール/システム)" - } - MessageId::CmdProviderDescription => { - "現在の LLM バックエンドを切り替え・確認(deepseek | nvidia-nim | ollama)" - } - MessageId::CmdQueueDescription => "キューされたメッセージを確認・編集", - MessageId::CmdQueueUsage => "使用方法: /queue [list|send |edit |drop |clear]", - MessageId::CmdQueueDraftHeader => "キューされたメッセージを編集中:", - MessageId::CmdQueueNoMessages => "キューされたメッセージはありません", - MessageId::CmdQueueListHeader => "キューされたメッセージ ({count}):", - MessageId::CmdQueueTip => "ヒント: /queue send で今すぐ送信、/queue drop で削除", - MessageId::CmdQueueAlreadyEditing => { - "すでにキューされたメッセージを編集中です。送信するか /queue clear で破棄してください。" - } - MessageId::CmdQueueNotFound => "キューされたメッセージが見つかりません", - MessageId::CmdQueueEditingStatus => "キューされたメッセージ {index} を編集中", - MessageId::CmdQueueEditingMessage => { - "キューされたメッセージ {index} を編集中(Enter で再キュー/送信)" - } - MessageId::CmdQueueDropped => "キューされたメッセージ {index} を削除しました", - MessageId::CmdQueueAlreadyEmpty => "キューはすでに空です", - MessageId::CmdQueueCleared => "キューをクリアしました", - MessageId::CmdQueueMissingIndex => { - "インデックスが指定されていません。使用方法: /queue edit または /queue drop " - } - MessageId::CmdQueueIndexPositive => "インデックスは正の数値である必要があります", - MessageId::CmdQueueIndexMin => "インデックスは 1 以上である必要があります", - MessageId::CmdRelayDescription => "新しいスレッド用のセッションリレー(接力)を作成", - MessageId::CmdRenameDescription => "現在のセッションの名前を変更", - MessageId::CmdRestoreDescription => { - "ワークスペースを以前のターン前/後スナップショットへロールバック。引数なしで最近のスナップショットを一覧表示。" - } - MessageId::CmdRetryDescription => "直前のリクエストを再試行", - MessageId::CmdReviewDescription => "ファイル・diff・PR に対して構造化コードレビューを実行", - MessageId::CmdRlmDescription => "永続 RLM コンテキストを開く: /rlm [0-3] ", - MessageId::CmdSaveDescription => "セッションをファイルに保存", - MessageId::CmdForkDescription => "現在の会話を兄弟セッションに fork", - MessageId::CmdNewDescription => "新しい保存済みセッションを開始", - MessageId::CmdSessionsDescription => "セッション履歴ピッカーを開く", - MessageId::CmdSettingsDescription => "永続化された設定を表示", - MessageId::CmdSidebarDescription => "Toggle or focus the right sidebar", - MessageId::CmdSkillDescription => { - "スキルを有効化、またはコミュニティスキルをインストール/更新/アンインストール/信頼" - } - MessageId::CmdSkillsDescription => { - "ローカルスキルを一覧表示(`/skills ` で絞り込み、--remote で精選レジストリを参照)" - } - MessageId::CmdSlopDescription => "Inspect or export the debt ledger", - MessageId::CmdStashDescription => { - "コンポーザーの下書きを退避/復元(Ctrl+S で退避、/stash list|pop)" - } - MessageId::CmdStatusDescription => "実行中のセッション状態を表示", - MessageId::CmdStatuslineDescription => "フッターに表示する項目を設定", - MessageId::CmdFleetDescription => "Fleet設定またはワーカー状態を開く", - MessageId::CmdHotbarDescription => "Hotbar設定を開く", - MessageId::CmdSubagentsDescription => "/fleet status の互換ショートカット", - MessageId::CmdSystemDescription => "現在のシステムプロンプトを表示", - MessageId::CmdTaskDescription => "バックグラウンドタスクを管理", - MessageId::CmdTokensDescription => "セッションのトークン使用量を表示", - MessageId::CmdTranslateDescription => "出力翻訳を現在のシステム言語に切り替え", - MessageId::CmdTranslateOff => "出力翻訳が無効になりました(元のモデル出力を表示)", - MessageId::CmdTranslateOn => { - "出力翻訳が有効になりました:モデル応答は現在のシステム言語で表示されます" - } - MessageId::TranslationInProgress => "アシスタント出力を翻訳中...", - MessageId::TranslationComplete => "翻訳が完了しました", - MessageId::TranslationFailed => "翻訳に失敗しました", - MessageId::CmdTrustDescription => { - "ワークスペースの信頼設定とパス別許可リストを管理(`/trust add `、`/trust list`、`/trust on|off`)" - } - MessageId::CmdWorkspaceDescription => "現在のワークスペースを表示または切り替え", - MessageId::CmdUndoDescription => "最後のメッセージ対を削除", - MessageId::CmdVerboseDescription => "ライブ思考表示の詳細モードを切り替え", - MessageId::CmdCacheAdvice => { - "3 ターン目以降にヒット率が ~70% 以上で安定していれば、プレフィックスキャッシュは健全。\n\ - 長いセッションでこれを下回る場合はプレフィックスのドリフトの可能性あり (#263)。" - } - MessageId::CmdCacheFootnote => { - "* プロバイダがミスを単独で報告しない場合は「入力 − ヒット」から推定。\n" - } - MessageId::CmdCacheHeader => { - "キャッシュテレメトリ — 直近 {count} / {total} ターン(モデル: {model})\n" - } - MessageId::CmdCacheNoData => { - "キャッシュ履歴: まだターンを記録していません。\n\n\ - DeepSeek は対応モデル (V4 系) の各 API ターンで `prompt_cache_hit_tokens` / \ - `prompt_cache_miss_tokens` を返します。1 ターン実行してから /cache を再度試してください。" - } - MessageId::CmdCacheTotals => { - "Σ 入力: {sum_in} Σ ヒット: {sum_hit} Σ ミス: {sum_miss} 平均ヒット率: {avg}\n" - } - MessageId::CmdCostReport => { - "セッション費用:\n\ - ─────────────────────────────\n\ - 累計概算: {cost}\n\n\ - 費用は概算値。プロバイダの使用量テレメトリがあれば優先して使用します。\n\n\ - DeepSeek API 料金:\n\ - ─────────────────────────────\n\ - 本 CLI には詳細な料金表は組み込まれていません。" - } - MessageId::CmdTokensCacheBoth => "ヒット {hit} / ミス {miss}", - MessageId::CmdTokensCacheHitOnly => "ヒット {hit} / ミスは未報告", - MessageId::CmdTokensCacheMissOnly => "ヒットは未報告 / ミス {miss}", - MessageId::CmdTokensContextUnknownWindow => "~{estimated} / コンテキスト窓不明", - MessageId::CmdTokensContextWithWindow => "~{used} / {window} ({percent}%)", - MessageId::FooterAgentSingular => "1 エージェント", - MessageId::FooterAgentsPlural => "{count} エージェント", - MessageId::FooterPressCtrlCAgain => "もう一度 Ctrl+C で終了", - MessageId::FooterWorking => "処理中", - MessageId::FooterBalancePrefix => "残高", - MessageId::HelpSectionActions => "操作", - MessageId::HelpSectionClipboard => "クリップボード", - MessageId::HelpSectionEditing => "入力編集", - MessageId::HelpSectionHelp => "ヘルプ", - MessageId::HelpSectionModes => "モード", - MessageId::HelpSectionNavigation => "ナビゲーション", - MessageId::HelpSectionSessions => "セッション", - MessageId::CmdTokensNotReported => "未報告", - MessageId::CmdTokensReport => { - "トークン使用量:\n\ - ─────────────────────────────\n\ - アクティブコンテキスト: {active}\n\ - 直近の API 入力: {input}(ターン単位のテレメトリ。複数回のツール往復で同じプレフィックスが重複してカウントされる場合あり)\n\ - 直近の API 出力: {output}\n\ - キャッシュヒット/ミス: {cache}(テレメトリ/コスト用のみ)\n\ - 累計トークン: {total}(セッション使用量テレメトリ)\n\ - セッション費用概算: {cost}\n\ - API メッセージ: {api_messages}\n\ - チャットメッセージ: {chat_messages}\n\ - モデル: {model}" - } - MessageId::KbScrollTranscript => { - "会話履歴をスクロール、入力履歴を移動、または添付ファイルを選択" - } - MessageId::KbNavigateHistory => "入力履歴を移動", - MessageId::KbBrowseHistory => "会話履歴を閲覧", - MessageId::KbScrollTranscriptAlt => "会話履歴をスクロール", - MessageId::KbScrollPage => "ページ単位で会話履歴をスクロール", - MessageId::KbJumpTopBottom => "会話履歴の先頭/末尾へジャンプ", - MessageId::KbJumpTopBottomEmpty => "先頭/末尾へジャンプ(入力が空の時)", - MessageId::KbJumpToolBlocks => "ツール出力ブロック間をジャンプ", - MessageId::KbMoveCursor => "コンポーザー内でカーソルを移動", - MessageId::KbJumpLineStartEnd => "行の先頭/末尾へジャンプ", - MessageId::KbDeleteChar => "カーソル前/後の文字を削除、または選択中の添付を削除", - MessageId::KbClearDraft => "現在の下書きをクリア", - MessageId::KbStashDraft => "現在の下書きをスタッシュ(`/stash pop`で復元)", - MessageId::KbSearchHistory => "プロンプト履歴を検索してローカル下書きを復元", - MessageId::KbInsertNewline => "コンポーザーに改行を挿入", - MessageId::KbSendDraft => "現在の下書きを送信", - MessageId::KbCloseMenu => { - "メニューを閉じる、リクエストをキャンセル、下書きを破棄、または入力をクリア" - } - MessageId::KbCancelOrExit => "リクエストをキャンセル、またはアイドル時に終了", - MessageId::KbShellControls => "実行中のフォアグラウンドコマンドをバックグラウンドへ移す", - MessageId::KbExitEmpty => "入力が空の時に終了", - MessageId::KbCommandPalette => "コマンドパレットを開く", - MessageId::KbCancelBackgroundShellJobs => { - "実行中のバックグラウンド shell ジョブをすべてキャンセル(Tasks サイドバー)" - } - MessageId::KbFuzzyFilePicker => "ファジーファイルピッカーを開く(Enter で @path を挿入)", - MessageId::KbCompactInspector => "コンパクトなセッションコンテキスト検査ツールを開く", - MessageId::KbLastMessagePager => "最後のメッセージのページャーを開く(入力が空の時)", - MessageId::KbSelectedDetails => { - "選択中のツールまたはメッセージの詳細を開く(入力が空の時)" - } - MessageId::KbToolDetailsPager => "ツール詳細のページャーを開く", - MessageId::KbThinkingPager => "Activity Detail を開く", - MessageId::KbLiveTranscript => "ライブ会話履歴オーバーレイを開く(自動追尾スクロール)", - MessageId::KbBacktrackMessage => { - "前のユーザーメッセージに戻る(左右でステップ、Enter で巻き戻し)" - } - MessageId::KbCompleteCycleModes => { - "/command を補完、実行中ターンのフォローアップをキュー、モードを切り替え;Shift+Tab で推論強度を切り替え" - } - MessageId::KbJumpPlanAgentYolo => "ホットバースロットを起動", - MessageId::KbAltJumpPlanAgentYolo => "Plan / Agent / YOLO モードへの代替ジャンプ", - MessageId::KbFocusSidebar => { - "Pinned / Tasks / Agents / Context / Auto / Hidden サイドバーにフォーカス" - } - MessageId::KbSessionPicker => "セッションピッカーを開く", - MessageId::KbPasteAttach => "テキストを貼り付けまたはクリップボード画像を添付", - MessageId::KbCopySelection => "現在の選択をコピー(macOS は Cmd+C)", - MessageId::KbContextMenu => { - "貼り付け、選択、メッセージ詳細、コンテキスト、ヘルプのコンテキスト操作を開く" - } - MessageId::KbAttachPath => { - "ローカルのテキストファイルまたはディレクトリをコンテキストに追加" - } - MessageId::KbHelpOverlay => "このヘルプオーバーレイを開く(入力が空の時)", - MessageId::KbToggleHelp => "ヘルプオーバーレイを切り替え", - MessageId::KbToggleHelpSlash => "ヘルプオーバーレイを切り替え", - MessageId::HelpUsageLabel => "使い方:", - MessageId::HelpAliasesLabel => "エイリアス:", - MessageId::SettingsTitle => "設定:", - MessageId::SettingsConfigFile => "設定ファイル:", - MessageId::ClearConversation => "会話履歴をクリアしました", - MessageId::ClearConversationBusy => { - "会話履歴をクリアしました(plan 状態が忙しい;必要なら /clear を再度実行)" - } - MessageId::ModelChanged => "モデルを変更しました: {old} → {new}", - MessageId::LinksTitle => "プロバイダーリンク:", - MessageId::LinksDashboard => "ダッシュボード:", - MessageId::LinksDocs => "ドキュメント:", - MessageId::LinksTip => { - "ヒント: 表示されたプロバイダー用の環境変数を使うか、`codewhale auth set --provider ` でキーを保存してください。" - } - MessageId::SubagentsFetching => "Fleetワーカー状態を取得中...", - MessageId::HelpUnknownCommand => "不明なコマンド: {topic}", - MessageId::HomeDashboardTitle => "codewhale ホームダッシュボード", - MessageId::HomeModel => "モデル:", - MessageId::HomeMode => "モード:", - MessageId::HomeWorkspace => "ワークスペース:", - MessageId::HomeHistory => "履歴:", - MessageId::HomeTokens => "トークン:", - MessageId::HomeQueued => "キュー:", - MessageId::HomeSubagents => "Fleetワーカー:", - MessageId::HomeSkill => "スキル:", - MessageId::HomeQuickActions => "クイックアクション", - MessageId::HomeQuickLinks => "/links - ダッシュボードと API リンク", - MessageId::HomeQuickSkills => "/skills - 利用可能なスキルを一覧", - MessageId::HomeQuickConfig => "/config - インタラクティブな設定エディタを開く", - MessageId::HomeQuickSettings => "/settings - 永続化された設定を表示", - MessageId::HomeQuickModel => "/model - モデルを切り替え・確認", - MessageId::HomeQuickSubagents => "/fleet status - Fleetワーカー状態", - MessageId::HomeQuickTaskList => "/task list - バックグラウンドタスクキューを表示", - MessageId::HomeQuickHelp => "/help - ヘルプを表示", - MessageId::HomeModeTips => "モードヒント", - MessageId::HomeAgentModeTip => "Agent モード - ツールを使って自律的なタスクを実行", - MessageId::HomeAgentModeReviewTip => " 実行前のレビューには /mode plan を入力", - MessageId::HomeAgentModeYoloTip => " /mode yolo と入力して完全なツールアクセスを有効化", - MessageId::HomeYoloModeTip => "YOLO モード - 完全なツールアクセス、承認なし", - MessageId::HomeYoloModeCaution => " 破壊的な操作には注意してください!", - MessageId::HomePlanModeTip => "Plan モード - 実装前に設計", - MessageId::HomePlanModeChecklistTip => { - " /mode plan を使って構造化されたチェックリストを作成" - } - MessageId::HomeGoalModeTip => "Goal 追跡 - /goal <目標> で持続的な目標を追跡", - // Onboarding — language picker. - MessageId::OnboardLanguageTitle => "言語を選択", - MessageId::OnboardLanguageBlurb => { - "UI 言語を選んでください。`/settings set locale ` でいつでも変更できます。" - } - MessageId::OnboardLanguageFooter => "1〜7 で選択、または Enter で現在の設定を維持", - // Onboarding — API key entry. - MessageId::OnboardApiKeyTitle => "DeepSeek API キーを設定", - MessageId::OnboardApiKeyStep1 => { - "ステップ 1. https://platform.deepseek.com/api_keys を開いてキーを作成。" - } - MessageId::OnboardApiKeyStep2 => "ステップ 2. 下に貼り付けて Enter を押してください。", - MessageId::OnboardApiKeySavedHint => { - "~/.codewhale/config.toml に保存されるので、どのフォルダからでも有効になります。" - } - MessageId::OnboardApiKeyFormatHint => { - "発行されたキーをそのまま貼り付けてください(空白や改行を含めない)。" - } - MessageId::OnboardApiKeyPlaceholder => "(ここにキーを貼り付け)", - MessageId::OnboardApiKeyLabel => "キー: ", - MessageId::OnboardApiKeyFooter => "Enter で保存、Esc で戻る。", - // Onboarding — workspace trust. - MessageId::OnboardTrustTitle => "ワークスペースを信頼", - MessageId::OnboardTrustQuestion => "このディレクトリの内容を信頼しますか?", - MessageId::OnboardTrustLocationPrefix => "現在の場所: ", - MessageId::OnboardTrustRiskHint => { - "信頼されていない内容を扱うとプロンプトインジェクションのリスクが高くなります。" - } - MessageId::OnboardTrustEffectHint => { - "信頼するとグローバル設定に記録され、信頼済みワークスペースモードが有効になります。" - } - MessageId::OnboardTrustFooterPrefix => "キー ", - MessageId::OnboardTrustFooterMiddle => " で信頼して続行、", - MessageId::OnboardTrustFooterSuffix => " で終了", - // Onboarding — final tips. - MessageId::OnboardTipsTitle => "シンプルに始めよう", - MessageId::OnboardTipsLine1 => { - "タスクを自然な言葉で記入。コマンドが必要な時は /help や Ctrl+K を使ってください。" - } - MessageId::OnboardTipsLine2 => { - "下の入力欄は複数行対応です。Enter で送信、Alt+Enter または Ctrl+J で改行。" - } - MessageId::OnboardTipsLine3 => { - "用途に応じてモードを切り替え:Plan は事前レビュー、Agent は実行、YOLO は自動承認。" - } - MessageId::OnboardTipsLine4 => { - "Ctrl+R で過去のセッションを再開、Esc で現在の入力やオーバーレイをキャンセル。" - } - MessageId::OnboardTipsFooterEnter => "Enter を押す", - MessageId::OnboardTipsFooterAction => " とワークスペースが開きます", - // Context menu. - MessageId::CtxMenuTitle => " 右クリック ", - MessageId::CtxMenuCopySelection => "選択をコピー", - MessageId::CtxMenuCopySelectionDesc => "選択したトランスクリプトのテキストを書き込む", - MessageId::CtxMenuOpenSelection => "選択を開く", - MessageId::CtxMenuOpenSelectionDesc => "選択したテキストをページャで表示", - MessageId::CtxMenuClearSelection => "選択を解除", - MessageId::CtxMenuOpenDetails => "詳細を開く", - MessageId::CtxMenuCopyMessage => "メッセージをコピー", - MessageId::CtxMenuCopyMessageDesc => "クリックしたトランスクリプトセルを書き込む", - MessageId::CtxMenuOpenInEditor => "エディタで開く", - MessageId::CtxMenuOpenInEditorDesc => "$EDITOR で file:line を開く", - MessageId::CtxMenuShowCell => "セルを表示", - MessageId::CtxMenuShowCellDesc => "このトランスクリプトセルを再表示", - MessageId::CtxMenuHideCell => "セルを隠す", - MessageId::CtxMenuHideCellDesc => "このトランスクリプトセルを折りたたむ", - MessageId::CtxMenuShowHidden => "非表示を表示", - MessageId::CtxMenuShowHiddenDesc => "すべての折りたたまれたセルを再表示", - MessageId::CtxMenuPaste => "貼り付け", - MessageId::CtxMenuPasteDesc => "クリップボードをコンポーザに挿入", - MessageId::CtxMenuCmdPalette => "コマンドパレット", - MessageId::CtxMenuCmdPaletteDesc => "コマンド、スキル、ツール", - MessageId::CtxMenuContextInspector => "コンテキストインスペクタ", - MessageId::CtxMenuContextInspectorDesc => "アクティブなコンテキストとキャッシュヒント", - MessageId::CtxMenuHelp => "ヘルプ", - MessageId::CtxMenuHelpDesc => "キー操作とコマンド", - MessageId::FanoutCounts => { - "{done} 完了 · {running} 実行中 · {failed} 失敗 · {pending} 保留" - } - - // App mode picker (prompt, names, hints) and composer vim indicator. - MessageId::ModePickerPrompt => "CodeWhale の動作方法を選択してください:", - MessageId::AppModeAgent => "エージェント", - MessageId::AppModeYolo => "YOLO", - MessageId::AppModePlan => "プラン", - MessageId::AppModeAgentHint => "通常実行(変更前に承認を求めます)", - MessageId::AppModePlanHint => "実行前にまず計画します", - MessageId::AppModeYoloHint => "自動承認・シェル有効(フルアクセス)", - MessageId::VimModeNormal => "-- ノーマル --", - MessageId::VimModeInsert => "-- 挿入 --", - MessageId::VimModeVisual => "-- ビジュアル --", - - // Approval dialog. - MessageId::ApprovalRiskReview => "確認", - MessageId::ApprovalRiskDestructive => "破壊的操作", - MessageId::ApprovalCategorySafe => "安全", - MessageId::ApprovalCategoryFileWrite => "ファイル書き込み", - MessageId::ApprovalCategoryShell => "Bash", - MessageId::ApprovalCategoryNetwork => "ネットワーク", - MessageId::ApprovalCategoryMcpRead => "MCP読み取り", - MessageId::ApprovalCategoryMcpAction => "MCPアクション", - MessageId::ApprovalCategoryUnknown => "未分類", - MessageId::ApprovalFieldType => "種類:", - MessageId::ApprovalFieldAbout => "詳細:", - MessageId::ApprovalFieldImpact => "影響:", - MessageId::ApprovalFieldParams => "パラメータ:", - MessageId::ApprovalOptionApproveOnce => "1回だけ承認", - MessageId::ApprovalOptionApproveAlways => "常に承認(この種類)", - MessageId::ApprovalOptionDeny => "拒否", - MessageId::ApprovalOptionAbortTurn => "中断", - MessageId::ApprovalBlockTitle => "承認", - MessageId::ApprovalControlsHint => " · v: パラメータ表示 · Esc: 中止", - MessageId::ApprovalChooseHint => "選択:", - MessageId::ApprovalChooseAction => "Enterで選択、または y/a/d を直接入力", - MessageId::ApprovalIntentLabel => "意図:", - MessageId::ApprovalMoreLines => " … (+{count} 行)", - // Sandbox elevation dialog. - // Sandbox elevation dialog. - MessageId::ElevationTitleSandboxDenied => " \u{26a0} サンドボックス拒否 ", - MessageId::ElevationTitleRequired => " サンドボックス昇格 ", - MessageId::ElevationFieldTool => " ツール:", - MessageId::ElevationFieldCmd => " コマンド:", - MessageId::ElevationFieldReason => " 理由:", - MessageId::ElevationImpactHeader => " 承認された場合の影響:", - MessageId::ElevationImpactNetwork => { - " - ネットワーク再試行で外部ダウンロードとHTTPリクエストが可能" - } - MessageId::ElevationImpactWrite => { - " - 書き込み再試行でファイルシステムの書き込み範囲が拡大" - } - MessageId::ElevationImpactFullAccess => { - " - フルアクセスでサンドボックス制限を完全に解除" - } - MessageId::ElevationPromptProceed => " 方法を選択:", - MessageId::ElevationOptionNetwork => "外部ネットワークを許可", - MessageId::ElevationOptionWrite => "追加の書き込みアクセスを許可", - MessageId::ElevationOptionFullAccess => "フルアクセス(ファイルシステム + ネットワーク)", - MessageId::ElevationOptionAbort => "中止", - MessageId::ElevationOptionNetworkDesc => { - "外部ネットワークアクセスでこのツール呼び出しを再試行(ダウンロードとHTTPリクエスト用)" - } - MessageId::ElevationOptionWriteDesc => "追加の書き込み可能ファイルシステム範囲で再試行", - MessageId::ElevationOptionFullAccessDesc => { - "サンドボックス制限なしで再試行(ファイルシステムとネットワークへの無制限アクセス)" - } - MessageId::ElevationOptionAbortDesc => "このツール実行をキャンセル", - - MessageId::CtxInspTitle => "コンテキストインスペクタ", - MessageId::CtxInspSessionContext => "セッションコンテキスト", - MessageId::CtxInspSystemPrompt => "システムプロンプト構造", - MessageId::CtxInspReferences => "参照", - MessageId::CtxInspRecentTools => "最近のツール", - MessageId::CtxInspModel => "モデル", - MessageId::CtxInspWorkspace => "ワークスペース", - MessageId::CtxInspSession => "セッション", - MessageId::CtxInspContext => "コンテキスト", - MessageId::CtxInspTranscript => "トランスクリプト", - MessageId::CtxInspWorkspaceStatus => "ワークスペース状態", - MessageId::CtxInspNotSampledYet => "未サンプリング", - MessageId::CtxInspOk => "良好", - MessageId::CtxInspHigh => "高い", - MessageId::CtxInspCritical => "深刻", - MessageId::CtxInspIncluded => "含まれている", - MessageId::CtxInspAttached => "添付済み", - MessageId::CtxInspNotIncluded => "含まれていない", - MessageId::CtxInspOutputCaptured => "出力取得済み", - MessageId::CtxInspNoOutputYet => "未出力", - MessageId::CtxInspNoSystemPrompt => "システムプロンプトが設定されていません。", - MessageId::CtxInspNoReferences => { - "ファイル、ディレクトリ、メディアの参照はまだ記録されていません。" - } - MessageId::CtxInspNoToolActivity => "ツールアクティビティはまだ記録されていません。", - MessageId::CtxInspVHint => "該当するカードを開き、v を押すと詳細が表示されます。", - MessageId::CtxInspCells => "セル", - MessageId::CtxInspApiMessages => "API メッセージ", - MessageId::CtxInspActive => "アクティブ", - MessageId::CtxInspCell => "セル", - MessageId::CtxInspMoreReferences => "その他の参照", - MessageId::CtxInspStablePrefix => "安定プレフィックス", - MessageId::CtxInspVolatileWorkingSet => "揮発性ワーキングセット", - MessageId::CtxInspFirstLine => "最初の行", - MessageId::CtxInspTotal => "合計", - MessageId::CtxInspTextPromptLayers => "テキストプロンプトレイヤー", - MessageId::CtxInspSingleTextBlob => "単一テキストブロブ", - MessageId::CtxInspBlocks => "ブロック", - MessageId::CtxInspBlock => "ブロック", - MessageId::CtxInspTokens => "トークン", - MessageId::CtxInspLayers => "レイヤー", - MessageId::CtxInspNone => "なし", - MessageId::CtxInspEmpty => "(空)", - MessageId::CtxInspCacheFriendly => "キャッシュフレンドリー", - MessageId::CtxInspChangesByTurn => "セッション/ターンごとに変更", - MessageId::CtxInspStablePrefixOnly => "安定プレフィックスのみ", - MessageId::CtxInspCacheTip => { - "ヒント:安定プレフィックスブロックはDeepSeek V4プレフィックスキャッシュの対象です。揮発性ワーキングセットの変更は末尾のキャッシュのみを破壊します。" - } - MessageId::ToolFamilyRead => "読込", - MessageId::ToolFamilyPatch => "パッチ", - MessageId::ToolFamilyRun => "実行", - MessageId::ToolFamilyFind => "検索", - MessageId::ToolFamilyDelegate => "委任", - MessageId::ToolFamilyFanout => "ファンアウト", - MessageId::ToolFamilyRlm => "rlm", - MessageId::ToolFamilyVerify => "検証", - MessageId::ToolFamilyThink => "思考", - MessageId::ToolFamilyGeneric => "ツール", - // Voice commands - MessageId::CmdVoiceDescription => "音声入力の切替:音声を録音してテキストに変換", - MessageId::CmdVoiceSendDescription => { - "音声自動送信の切替:転写が「send it」で終わると自動送信" - } - MessageId::CmdVoiceControlDescription => { - "音声コントロールの切替:入力欄を考慮した AI 音声ディクテーション" - } - MessageId::VoiceEnabled => "音声入力を有効にしました。話すと録音されます。", - MessageId::VoiceDisabled => "音声入力を無効にしました。", - MessageId::VoiceSendEnabled => "音声自動送信を有効にしました。", - MessageId::VoiceSendDisabled => "音声自動送信を無効にしました。", - MessageId::VoiceControlEnabled => "音声コントロールを有効にしました。", - MessageId::VoiceControlDisabled => "音声コントロールを無効にしました。", - MessageId::VoiceErrNoAuth => { - "音声:アクティブなプロバイダーに API キーが設定されていません" - } - MessageId::VoiceErrNoRecorder => { - "音声:録音ツールが見つかりません。sox、arecord、rec のいずれかをインストールしてください" - } - MessageId::VoiceErrNetwork => "音声:文字起こしリクエストに失敗しました", - MessageId::VoiceErrEmptySend => "音声:送信する内容がありません", - MessageId::VoiceErrTooShort => "音声:音声が検出されませんでした。録音が短すぎます", - MessageId::VoiceRecording => "🎙 録音中...お話しください", - MessageId::VoiceProcessing => "🎙 文字起こし中...", - MessageId::VoiceTranscribed => "🎙 文字起こし完了", - }) -} - -fn chinese_simplified(id: MessageId) -> Option<&'static str> { - use std::collections::HashMap; - use std::sync::LazyLock; - - static MAP: LazyLock> = LazyLock::new(|| { - serde_json::from_str(include_str!(concat!( - env!("CARGO_MANIFEST_DIR"), - "/locales/zh-Hans.json" - ))) - .expect("valid zh-Hans.json translations") - }); - - MAP.get(&format!("{id:?}")).map(String::as_str) -} - -fn portuguese_brazil(id: MessageId) -> Option<&'static str> { - Some(match id { - MessageId::ComposerPlaceholder => "Escreva uma tarefa ou use /.", - MessageId::HistorySearchPlaceholder => "Pesquisar histórico de prompts...", - MessageId::HistorySearchTitle => "Busca no histórico", - MessageId::HistoryHintMove => "Up/Down move", - MessageId::HistoryHintAccept => "Enter aceita", - MessageId::HistoryHintRestore => "Esc restaura", - MessageId::HistoryNoMatches => " Sem resultados", - MessageId::StatusPickerTitle => " Linha de status ", - MessageId::StatusPickerInstruction => "Escolha os itens que deseja no rodapé:", - MessageId::StatusPickerActionToggle => "alternar ", - MessageId::StatusPickerActionAll => "todos ", - MessageId::StatusPickerActionNone => "nenhum ", - MessageId::StatusPickerActionSave => "salvar ", - MessageId::StatusPickerActionCancel => "cancelar ", - MessageId::ConfigTitle => "Configuração da sessão", - MessageId::ConfigModalTitle => " Config ", - MessageId::ConfigSearchPlaceholder => "digite para filtrar", - MessageId::ConfigNoSettings => " Nenhuma configuração disponível.", - MessageId::ConfigNoMatchesPrefix => " Nenhuma configuração corresponde a ", - MessageId::ConfigFilteredSettings => " Configurações filtradas", - MessageId::ConfigShowing => " Mostrando", - MessageId::ConfigFooterDefault => { - " digite=filtrar, Up/Down=selecionar, Enter/e=editar, Esc/q=fechar " - } - MessageId::ConfigFooterScrollable => { - " digite=filtrar, Up/Down=selecionar, Enter/e=editar, PgUp/PgDn=rolar, Esc/q=fechar " - } - MessageId::ConfigFooterFiltered => { - " digite=filtrar, Backspace=apagar, Ctrl+U/Esc=limpar, Enter=editar " - } - MessageId::ConfigSectionProvider => "Provedor", - MessageId::ConfigSectionModel => "Modelo", - MessageId::ConfigSectionPermissions => "Permissões", - MessageId::ConfigSectionNetwork => "Rede", - MessageId::ConfigSectionDisplay => "Exibição", - MessageId::ConfigSectionComposer => "Compositor", - MessageId::ConfigSectionSidebar => "Barra lateral", - MessageId::ConfigSectionHistory => "Histórico", - MessageId::ConfigSectionMcp => "MCP", - MessageId::ConfigSectionFleet => "Fleet", - MessageId::ConfigSectionExperimental => "Experimental", - MessageId::ConfigScopeSession => "SESSÃO", - MessageId::ConfigScopeSaved => "SALVO", - MessageId::ConfigEditCancelled => "Edição cancelada", - MessageId::ConfigEditTitlePrefix => "Editar ", - MessageId::ConfigEditScopeLabel => "Escopo: ", - MessageId::ConfigEditCurrentLabel => "Atual: ", - MessageId::ConfigEditHintLabel => "Dica: ", - MessageId::ConfigEditNewLabel => "Novo: ", - MessageId::ConfigEditFooter => { - " Enter=aplicar, Esc=cancelar, Ctrl+U=limpar, Ctrl+A=tudo, \u{2190}/\u{2192}=mover " - } - MessageId::ConfigRowEffective => " (efetivo {currency})", - MessageId::ConfigDefaultValue => "(padrão)", - MessageId::ConfigDefaultReasoning => "(config/padrão)", - MessageId::ConfigUnavailable => "(indisponível)", - MessageId::HelpTitle => "Ajuda", - MessageId::HelpFilterPlaceholder => "Digite para filtrar", - MessageId::HelpFilterPrefix => "Filtro: ", - MessageId::HelpNoMatches => " Sem resultados.", - MessageId::HelpSlashCommands => "Comandos com barra", - MessageId::HelpKeybindings => "Atalhos", - MessageId::HelpFooterTypeFilter => " digite para filtrar ", - MessageId::HelpFooterMove => " Up/Down move ", - MessageId::HelpFooterJump => " PgUp/PgDn salta ", - MessageId::HelpFooterClose => " Esc fecha ", - MessageId::CmdAnchorDescription => { - "Fixar um fato que sobrevive à compactação (injetado automaticamente no contexto)" - } - MessageId::CmdAttachDescription => { - "Anexar imagem ou vídeo; use @path para arquivos de texto ou diretórios" - } - MessageId::CmdCacheDescription => { - "Exibir estatísticas de hit/miss do cache de prefixo DeepSeek nas últimas N rodadas" - } - MessageId::CmdChangeDescription => "Mostrar a entrada mais recente do changelog", - MessageId::CmdChangeHeader => "Changelog Mais Recente", - MessageId::CmdChangeTranslationQueued => { - "As notas de versao em ingles aparecem abaixo. Uma versao traduzida sera solicitada em seguida; se o provedor estiver indisponivel, este texto em ingles sera o fallback." - } - MessageId::CmdChangeTranslationUnavailable => { - "As notas de versao em ingles aparecem abaixo. A traducao esta indisponivel porque a sessao atual nao tem chave de API ou esta offline." - } - MessageId::CmdChangePreviousVersion => { - "Versão anterior: {version} — execute `/change {version}` para visualizar" - } - MessageId::CmdBalanceDescription => "Verificar o saldo da conta do provedor ativo", - MessageId::CmdClearDescription => "Limpar o histórico da conversa", - MessageId::CmdCompactDescription => "Compactar o contexto para liberar espaço", - MessageId::CmdPurgeDescription => { - "Deixe o agente podar cirurgicamente o histórico para liberar espaço de contexto" - } - MessageId::CmdConfigDescription => "Abrir o editor interativo de configuração", - MessageId::CmdContextDescription => "Abrir o inspetor compacto de contexto da sessão", - MessageId::CmdCostDescription => "Exibir o detalhamento de custo da sessão", - MessageId::CmdDiffDescription => "Mostrar alterações em arquivos desde o início da sessão", - MessageId::CmdEditDescription => "Revisar e reenviar a última mensagem", - MessageId::CmdExitDescription => "Sair do aplicativo", - MessageId::CmdExportDescription => "Exportar a conversa para markdown", - MessageId::CmdFeedbackDescription => "Gerar uma URL de feedback no GitHub", - MessageId::CmdHfDescription => "Inspecionar configuracao e conceitos do Hugging Face MCP", - MessageId::CmdHelpDescription => "Exibir informações de ajuda", - MessageId::CmdProfileDescription => "Alternar para um perfil de configuracao nomeado", - MessageId::CmdHomeDescription => "Exibir o painel inicial com estatísticas e ações rápidas", - MessageId::CmdHooksDescription => { - "Listar hooks de ciclo de vida configurados (somente leitura)" - } - MessageId::CmdAgentDescription => { - "Abrir uma sessão persistente de sub-agente: /agent [0-3] " - } - MessageId::CmdGoalDescription => { - "Definir uma meta de sessão com orçamento de tokens opcional" - } - MessageId::CmdInitDescription => "Gerar AGENTS.md para o projeto", - MessageId::CmdLspDescription => "Alternar diagnóstico LSP ligado ou desligado", - MessageId::CmdShareDescription => "Exportar a sessão atual como uma URL web compartilhável", - MessageId::CmdJobsDescription => "Inspecionar e controlar jobs de shell em segundo plano", - MessageId::CmdLinksDescription => { - "Exibir links de tokens, painéis e documentação dos provedores" - } - MessageId::CmdLoadDescription => "Carregar a sessão de um arquivo", - MessageId::CmdLogoutDescription => "Limpar a chave de API e voltar à configuração", - MessageId::CmdMcpDescription => "Abrir ou gerenciar servidores MCP", - MessageId::CmdPluginDescription => "List discovered plugin tools or show details for one", - MessageId::CmdPluginNoneFound => "No plugin tools discovered in {dir}", - MessageId::CmdPluginNotFound => "Plugin '{name}' not found", - MessageId::CmdPluginListHeader => "Plugin tools ({count}):", - MessageId::CmdPluginDetailDescription => "Description: {description}", - MessageId::CmdPluginDetailSchema => "Schema:\n{schema}", - MessageId::CmdPluginDetailApproval => "Approval: {approval}", - MessageId::CmdPluginDetailPath => "Path: {path}", - MessageId::CmdMemoryDescription => { - "Inspecionar ou gerenciar o arquivo persistente de memória do usuário" - } - MessageId::CmdModeDescription => { - "Alternar modo ou abrir seletor: /mode [agent|plan|yolo|1|2|3]" - } - MessageId::CmdModelDescription => "Trocar ou exibir o modelo atual", - MessageId::CmdModelsDescription => "Listar os modelos disponíveis pela API", - MessageId::CmdModelDbDescription => { - "Navegar pelo banco de dados de referência de modelos integrado" - } - MessageId::CmdNetworkDescription => "Gerenciar regras de rede permitidas e bloqueadas", - MessageId::CmdNoteDescription => "Adicionar, listar, editar ou remover notas do workspace", - MessageId::CmdThemeDescription => "Alternar tema: escuro, claro, tons de cinza ou sistema", - MessageId::CmdProviderDescription => { - "Trocar ou exibir o backend LLM ativo (deepseek | nvidia-nim | ollama)" - } - MessageId::CmdQueueDescription => "Ver ou editar mensagens enfileiradas", - MessageId::CmdQueueUsage => "Uso: /queue [list|send |edit |drop |clear]", - MessageId::CmdQueueDraftHeader => "Editando mensagem enfileirada:", - MessageId::CmdQueueNoMessages => "Nenhuma mensagem enfileirada", - MessageId::CmdQueueListHeader => "Mensagens enfileiradas ({count}):", - MessageId::CmdQueueTip => { - "Dica: /queue send para enviar agora, /queue drop para remover" - } - MessageId::CmdQueueAlreadyEditing => { - "Já está editando uma mensagem enfileirada. Envie-a ou use /queue clear para descartar." - } - MessageId::CmdQueueNotFound => "Mensagem enfileirada não encontrada", - MessageId::CmdQueueEditingStatus => "Editando mensagem enfileirada {index}", - MessageId::CmdQueueEditingMessage => { - "Editando mensagem enfileirada {index} (pressione Enter para re-enfileirar/enviar)" - } - MessageId::CmdQueueDropped => "Mensagem enfileirada {index} removida", - MessageId::CmdQueueAlreadyEmpty => "Fila já está vazia", - MessageId::CmdQueueCleared => "Fila limpa", - MessageId::CmdQueueMissingIndex => { - "Índice ausente. Uso: /queue edit ou /queue drop " - } - MessageId::CmdQueueIndexPositive => "O índice deve ser um número positivo", - MessageId::CmdQueueIndexMin => "O índice deve ser >= 1", - MessageId::CmdRelayDescription => "Criar um relay da sessão para um novo thread", - MessageId::CmdRenameDescription => "Renomear a sessão atual", - MessageId::CmdRestoreDescription => { - "Reverter o workspace a um snapshot pré/pós-turno anterior. Sem argumento, lista os snapshots recentes." - } - MessageId::CmdRetryDescription => "Repetir a última requisição", - MessageId::CmdReviewDescription => { - "Executar uma revisão de código estruturada em um arquivo, diff ou PR" - } - MessageId::CmdRlmDescription => { - "Abrir um contexto RLM persistente: /rlm [0-3] " - } - MessageId::CmdSaveDescription => "Salvar a sessão em arquivo", - MessageId::CmdForkDescription => "Bifurcar a conversa ativa para uma sessão irmã", - MessageId::CmdNewDescription => "Iniciar uma nova sessão salva", - MessageId::CmdSessionsDescription => "Abrir seletor de histórico de sessões", - MessageId::CmdSettingsDescription => "Exibir as configurações persistidas", - MessageId::CmdSidebarDescription => "Toggle or focus the right sidebar", - MessageId::CmdSkillDescription => { - "Ativar uma skill, ou instalar/atualizar/desinstalar/confiar em uma skill da comunidade" - } - MessageId::CmdSkillsDescription => { - "Listar skills locais (filtre com `/skills `; --remote navega pelo registro curado)" - } - MessageId::CmdSlopDescription => "Inspect or export the debt ledger", - MessageId::CmdStashDescription => { - "Estacionar ou restaurar rascunho do compositor (Ctrl+S estaciona, /stash list|pop)" - } - MessageId::CmdStatusDescription => "Exibir o status da sessão em execução", - MessageId::CmdStatuslineDescription => "Configurar quais itens aparecem no rodapé", - MessageId::CmdFleetDescription => "Abrir configuração Fleet ou status dos workers", - MessageId::CmdHotbarDescription => "Abrir configuração da Hotbar", - MessageId::CmdSubagentsDescription => "Atalho compatível para /fleet status", - MessageId::CmdSystemDescription => "Exibir o prompt de sistema atual", - MessageId::CmdTaskDescription => "Gerenciar tarefas em segundo plano", - MessageId::CmdTokensDescription => "Exibir o uso de tokens da sessão", - MessageId::CmdTranslateDescription => { - "Alternar tradução de saída para o idioma atual do sistema" - } - MessageId::CmdTranslateOff => { - "Tradução de saída desativada (saída original do modelo exibida)" - } - MessageId::CmdTranslateOn => { - "Tradução de saída ativada: as respostas serão exibidas no idioma do sistema" - } - MessageId::TranslationInProgress => "Traduzindo saída do assistente...", - MessageId::TranslationComplete => "Tradução concluída", - MessageId::TranslationFailed => "Falha na tradução", - MessageId::CmdTrustDescription => { - "Gerenciar a confiança do workspace e a allowlist por caminho (`/trust add `, `/trust list`, `/trust on|off`)" - } - MessageId::CmdWorkspaceDescription => "Mostrar ou trocar o workspace atual", - MessageId::CmdUndoDescription => "Remover o último par de mensagens", - MessageId::CmdVerboseDescription => "Alternar pensamento ao vivo completo no transcript", - MessageId::CmdCacheAdvice => { - "Taxas de hit/miss acima de ~70% a partir do terceiro turno indicam um prefixo de cache estável;\n\ - valores menores em sessões longas sugerem instabilidade no prefixo, vale investigar (#263)." - } - MessageId::CmdCacheFootnote => { - "* miss inferido a partir de entrada − hit quando o provedor não o reporta separadamente.\n" - } - MessageId::CmdCacheHeader => { - "Telemetria do cache — últimos {count} de {total} turno(s) (modelo: {model})\n" - } - MessageId::CmdCacheNoData => { - "Histórico do cache: nenhum turno registrado ainda.\n\n\ - O DeepSeek expõe `prompt_cache_hit_tokens` / `prompt_cache_miss_tokens` em cada turno \ - da API onde o modelo suporta (família V4). Execute um turno e tente /cache de novo." - } - MessageId::CmdCacheTotals => { - "Σ entrada: {sum_in} Σ hit: {sum_hit} Σ miss: {sum_miss} taxa média de hit: {avg}\n" - } - MessageId::CmdCostReport => { - "Custo da sessão:\n\ - ─────────────────────────────\n\ - Total aproximado: {cost}\n\n\ - Estimativas de custo são aproximadas e usam a telemetria de uso do provedor quando disponível.\n\n\ - Preços da API DeepSeek:\n\ - ─────────────────────────────\n\ - Os detalhes de preço não estão configurados nesta CLI." - } - MessageId::CmdTokensCacheBoth => "{hit} hit / {miss} miss", - MessageId::CmdTokensCacheHitOnly => "{hit} hit / miss não reportado", - MessageId::CmdTokensCacheMissOnly => "hit não reportado / {miss} miss", - MessageId::CmdTokensContextUnknownWindow => "~{estimated} / janela desconhecida", - MessageId::CmdTokensContextWithWindow => "~{used} / {window} ({percent}%)", - MessageId::FooterAgentSingular => "1 sub-agente", - MessageId::FooterAgentsPlural => "{count} sub-agentes", - MessageId::FooterPressCtrlCAgain => "Pressione Ctrl+C novamente para sair", - MessageId::FooterWorking => "trabalhando", - MessageId::FooterBalancePrefix => "saldo", - MessageId::HelpSectionActions => "Ações", - MessageId::HelpSectionClipboard => "Área de transferência", - MessageId::HelpSectionEditing => "Edição de entrada", - MessageId::HelpSectionHelp => "Ajuda", - MessageId::HelpSectionModes => "Modos", - MessageId::HelpSectionNavigation => "Navegação", - MessageId::HelpSectionSessions => "Sessões", - MessageId::CmdTokensNotReported => "não reportado", - MessageId::CmdTokensReport => { - "Uso de tokens:\n\ - ─────────────────────────────\n\ - Contexto ativo: {active}\n\ - Última entrada da API: {input} (telemetria por turno; pode contar o mesmo prefixo várias vezes em rodadas com ferramentas)\n\ - Última saída da API: {output}\n\ - Hit/miss do cache: {cache} (apenas para telemetria/custo)\n\ - Tokens acumulados: {total} (telemetria de uso da sessão)\n\ - Custo aproximado: {cost}\n\ - Mensagens da API: {api_messages}\n\ - Mensagens do chat: {chat_messages}\n\ - Modelo: {model}" - } - MessageId::KbScrollTranscript => { - "Rolar transcrição, navegar histórico de entrada ou selecionar anexos do compositor" - } - MessageId::KbNavigateHistory => "Navegar histórico de entrada", - MessageId::KbBrowseHistory => "Navegar histórico da conversa", - MessageId::KbScrollTranscriptAlt => "Rolar transcrição", - MessageId::KbScrollPage => "Rolar transcrição por página", - MessageId::KbJumpTopBottom => "Pular para topo / fim da transcrição", - MessageId::KbJumpTopBottomEmpty => "Pular para topo / fim (quando entrada vazia)", - MessageId::KbJumpToolBlocks => "Pular entre blocos de saída de ferramentas", - MessageId::KbMoveCursor => "Mover cursor no compositor", - MessageId::KbJumpLineStartEnd => "Pular para início / fim da linha", - MessageId::KbDeleteChar => { - "Excluir caractere antes / depois do cursor, ou remover anexo selecionado" - } - MessageId::KbClearDraft => "Limpar rascunho atual", - MessageId::KbStashDraft => "Estacionar rascunho atual (`/stash pop` restaura)", - MessageId::KbSearchHistory => "Buscar histórico de prompts e recuperar rascunhos locais", - MessageId::KbInsertNewline => "Inserir nova linha no compositor", - MessageId::KbSendDraft => "Enviar rascunho atual", - MessageId::KbCloseMenu => { - "Fechar menu, cancelar requisição, descartar rascunho ou limpar entrada" - } - MessageId::KbCancelOrExit => "Cancelar requisição ou sair quando ocioso", - MessageId::KbShellControls => "Enviar o comando em primeiro plano para segundo plano", - MessageId::KbExitEmpty => "Sair quando entrada vazia", - MessageId::KbCommandPalette => "Abrir paleta de comandos", - MessageId::KbCancelBackgroundShellJobs => { - "Cancelar todos os trabalhos shell em segundo plano em execução (barra lateral Tasks)" - } - MessageId::KbFuzzyFilePicker => { - "Abrir seletor de arquivo fuzzy (insere @path ao pressionar Enter)" - } - MessageId::KbCompactInspector => "Abrir inspetor compacto de contexto da sessão", - MessageId::KbLastMessagePager => { - "Abrir paginador para última mensagem (quando entrada vazia)" - } - MessageId::KbSelectedDetails => { - "Abrir detalhes da ferramenta ou mensagem selecionada (quando entrada vazia)" - } - MessageId::KbToolDetailsPager => "Abrir paginador de detalhes da ferramenta", - MessageId::KbThinkingPager => "Abrir Activity Detail", - MessageId::KbLiveTranscript => "Abrir sobreposição de transcrição ao vivo (auto-scroll)", - MessageId::KbBacktrackMessage => { - "Retroceder para mensagem anterior do usuário (esquerda/direita, Enter para rebobinar)" - } - MessageId::KbCompleteCycleModes => { - "Completar /command, enfileirar follow-up, ciclar modos; Shift+Tab cicla esforço de raciocínio" - } - MessageId::KbJumpPlanAgentYolo => "Acionar slots da hotbar", - MessageId::KbAltJumpPlanAgentYolo => "Salto alternativo para modo Plan / Agent / YOLO", - MessageId::KbFocusSidebar => { - "Focar barra lateral Pinned / Tasks / Agents / Context / Auto / Ocultar" - } - MessageId::KbSessionPicker => "Abrir seletor de sessões", - MessageId::KbPasteAttach => "Colar texto ou anexar imagem da área de transferência", - MessageId::KbCopySelection => "Copiar seleção atual (Cmd+C no macOS)", - MessageId::KbContextMenu => { - "Abrir ações de contexto para colar, seleção, detalhes, contexto e ajuda" - } - MessageId::KbAttachPath => "Adicionar arquivo ou diretório local ao contexto", - MessageId::KbHelpOverlay => "Abrir esta sobreposição de ajuda (quando entrada vazia)", - MessageId::KbToggleHelp => "Alternar sobreposição de ajuda", - MessageId::KbToggleHelpSlash => "Alternar sobreposição de ajuda", - MessageId::HelpUsageLabel => "Uso:", - MessageId::HelpAliasesLabel => "Apelidos:", - MessageId::SettingsTitle => "Configurações:", - MessageId::SettingsConfigFile => "Arquivo de configuração:", - MessageId::ClearConversation => "Conversa limpa", - MessageId::ClearConversationBusy => { - "Conversa limpa (estado do plano ocupado; execute /clear novamente se necessário)" - } - MessageId::ModelChanged => "Modelo alterado: {old} \u{2192} {new}", - MessageId::LinksTitle => "Links dos provedores:", - MessageId::LinksDashboard => "Painel:", - MessageId::LinksDocs => "Documentação:", - MessageId::LinksTip => { - "Dica: use a variável de ambiente mostrada para seu provedor ou salve a chave com `codewhale auth set --provider `." - } - MessageId::SubagentsFetching => "Buscando status dos workers Fleet...", - MessageId::HelpUnknownCommand => "Comando desconhecido: {topic}", - MessageId::HomeDashboardTitle => "Painel Inicial do codewhale", - MessageId::HomeModel => "Modelo:", - MessageId::HomeMode => "Modo:", - MessageId::HomeWorkspace => "Workspace:", - MessageId::HomeHistory => "Histórico:", - MessageId::HomeTokens => "Tokens:", - MessageId::HomeQueued => "Enfileirado:", - MessageId::HomeSubagents => "Workers Fleet:", - MessageId::HomeSkill => "Skill:", - MessageId::HomeQuickActions => "Ações Rápidas", - MessageId::HomeQuickLinks => "/links - Links do painel e API", - MessageId::HomeQuickSkills => "/skills - Listar skills disponíveis", - MessageId::HomeQuickConfig => "/config - Abrir editor interativo de configuração", - MessageId::HomeQuickSettings => "/settings - Exibir configurações persistentes", - MessageId::HomeQuickModel => "/model - Alternar ou visualizar modelo", - MessageId::HomeQuickSubagents => "/fleet status - Status dos workers Fleet", - MessageId::HomeQuickTaskList => "/task list - Exibir fila de tarefas em segundo plano", - MessageId::HomeQuickHelp => "/help - Exibir ajuda", - MessageId::HomeModeTips => "Dicas de Modo", - MessageId::HomeAgentModeTip => "Modo Agent - Use ferramentas para tarefas autônomas", - MessageId::HomeAgentModeReviewTip => " Digite /mode plan para revisar antes de executar", - MessageId::HomeAgentModeYoloTip => { - " Digite /mode yolo para habilitar acesso total às ferramentas" - } - MessageId::HomeYoloModeTip => "Modo YOLO - Acesso total a ferramentas, sem aprovações", - MessageId::HomeYoloModeCaution => " Tenha cuidado com operações destrutivas!", - MessageId::HomePlanModeTip => "Modo Plan - Planeje antes de implementar", - MessageId::HomePlanModeChecklistTip => { - " Use /mode plan para criar checklists estruturados" - } - MessageId::HomeGoalModeTip => { - "Rastreamento de Goal - Use /goal para rastrear um objetivo persistente" - } - // Onboarding — language picker. - MessageId::OnboardLanguageTitle => "Escolha o idioma", - MessageId::OnboardLanguageBlurb => { - "Escolha o idioma da interface. Você pode mudá-lo a qualquer momento com `/settings set locale `." - } - MessageId::OnboardLanguageFooter => { - "Pressione 1-7 para escolher, ou Enter para manter a configuração atual" - } - // Onboarding — API key entry. - MessageId::OnboardApiKeyTitle => "Conecte sua chave de API DeepSeek", - MessageId::OnboardApiKeyStep1 => { - "Passo 1. Abra https://platform.deepseek.com/api_keys e crie uma chave." - } - MessageId::OnboardApiKeyStep2 => "Passo 2. Cole abaixo e pressione Enter.", - MessageId::OnboardApiKeySavedHint => { - "Salvo em ~/.codewhale/config.toml para funcionar em qualquer pasta." - } - MessageId::OnboardApiKeyFormatHint => { - "Cole a chave inteira como foi emitida (sem espaços ou quebras de linha)." - } - MessageId::OnboardApiKeyPlaceholder => "(cole a chave aqui)", - MessageId::OnboardApiKeyLabel => "Chave: ", - MessageId::OnboardApiKeyFooter => "Enter para salvar, Esc para voltar.", - // Onboarding — workspace trust. - MessageId::OnboardTrustTitle => "Confiar no diretório", - MessageId::OnboardTrustQuestion => "Você confia no conteúdo deste diretório?", - MessageId::OnboardTrustLocationPrefix => "Você está em ", - MessageId::OnboardTrustRiskHint => { - "Trabalhar com conteúdo não confiável aumenta o risco de injeção de prompt." - } - MessageId::OnboardTrustEffectHint => { - "Confiar neste diretório o registra na configuração global e habilita o modo workspace confiável." - } - MessageId::OnboardTrustFooterPrefix => "Pressione ", - MessageId::OnboardTrustFooterMiddle => " para confiar e continuar, ", - MessageId::OnboardTrustFooterSuffix => " para sair", - // Onboarding — final tips. - MessageId::OnboardTipsTitle => "Comece simples", - MessageId::OnboardTipsLine1 => { - "Escreva a tarefa em linguagem natural. Use /help ou Ctrl+K para comandos." - } - MessageId::OnboardTipsLine2 => { - "O composer inferior é multilinhas: Enter envia, Alt+Enter ou Ctrl+J adiciona uma nova linha." - } - MessageId::OnboardTipsLine3 => { - "Mude de modo apenas quando o trabalho mudar: Plan para revisar antes, Agent para execução, YOLO para auto-aprovação." - } - MessageId::OnboardTipsLine4 => { - "Ctrl+R retoma sessões anteriores, e Esc cancela o rascunho ou overlay atual." - } - MessageId::OnboardTipsFooterEnter => "Pressione Enter", - MessageId::OnboardTipsFooterAction => " para abrir o workspace", - // Context menu. - MessageId::CtxMenuTitle => " Clique direito ", - MessageId::CtxMenuCopySelection => "Copiar seleção", - MessageId::CtxMenuCopySelectionDesc => "copiar texto selecionado da transcrição", - MessageId::CtxMenuOpenSelection => "Abrir seleção", - MessageId::CtxMenuOpenSelectionDesc => "mostrar texto selecionado no visualizador", - MessageId::CtxMenuClearSelection => "Limpar seleção", - MessageId::CtxMenuOpenDetails => "Abrir detalhes", - MessageId::CtxMenuCopyMessage => "Copiar mensagem", - MessageId::CtxMenuCopyMessageDesc => "copiar célula da transcrição clicada", - MessageId::CtxMenuOpenInEditor => "Abrir no editor", - MessageId::CtxMenuOpenInEditorDesc => "abrir file:line no $EDITOR", - MessageId::CtxMenuShowCell => "Mostrar célula", - MessageId::CtxMenuShowCellDesc => "reexibir esta célula da transcrição", - MessageId::CtxMenuHideCell => "Ocultar célula", - MessageId::CtxMenuHideCellDesc => "recolher esta célula da transcrição", - MessageId::CtxMenuShowHidden => "Mostrar ocultas", - MessageId::CtxMenuShowHiddenDesc => "reexibir todas as células recolhidas", - MessageId::CtxMenuPaste => "Colar", - MessageId::CtxMenuPasteDesc => "inserir área de transferência no compositor", - MessageId::CtxMenuCmdPalette => "Paleta de comandos", - MessageId::CtxMenuCmdPaletteDesc => "comandos, habilidades e ferramentas", - MessageId::CtxMenuContextInspector => "Inspetor de contexto", - MessageId::CtxMenuContextInspectorDesc => "contexto ativo e dicas de cache", - MessageId::CtxMenuHelp => "Ajuda", - MessageId::CtxMenuHelpDesc => "atalhos de teclado e comandos", - MessageId::FanoutCounts => { - "{done} concluído · {running} em execução · {failed} falhou · {pending} pendente" - } - - // App mode picker (prompt, names, hints) and composer vim indicator. - MessageId::ModePickerPrompt => "Escolha como o CodeWhale deve operar:", - MessageId::AppModeAgent => "Agente", - MessageId::AppModeYolo => "YOLO", - MessageId::AppModePlan => "Plano", - MessageId::AppModeAgentHint => "Execução normal com aprovações", - MessageId::AppModePlanHint => "Planeje antes de executar", - MessageId::AppModeYoloHint => "Aprovação automática; shell habilitado", - MessageId::VimModeNormal => "-- NORMAL --", - MessageId::VimModeInsert => "-- INSERIR --", - MessageId::VimModeVisual => "-- VISUAL --", - - // Approval dialog. - MessageId::ApprovalRiskReview => "REVISÃO", - MessageId::ApprovalRiskDestructive => "DESTRUTIVO", - MessageId::ApprovalCategorySafe => "Seguro", - MessageId::ApprovalCategoryFileWrite => "Escrita de Arquivo", - MessageId::ApprovalCategoryShell => "Bash", - MessageId::ApprovalCategoryNetwork => "Rede", - MessageId::ApprovalCategoryMcpRead => "Leitura MCP", - MessageId::ApprovalCategoryMcpAction => "Ação MCP", - MessageId::ApprovalCategoryUnknown => "Desconhecido", - MessageId::ApprovalFieldType => "Tipo:", - MessageId::ApprovalFieldAbout => "Sobre:", - MessageId::ApprovalFieldImpact => "Impacto:", - MessageId::ApprovalFieldParams => "Parâmetros:", - MessageId::ApprovalOptionApproveOnce => "Aprovar uma vez", - MessageId::ApprovalOptionApproveAlways => "Aprovar sempre para este tipo", - MessageId::ApprovalOptionDeny => "Negar esta chamada", - MessageId::ApprovalOptionAbortTurn => "Abortar turno", - MessageId::ApprovalBlockTitle => "aprovação", - MessageId::ApprovalControlsHint => " · v: parâmetros · Esc: abortar", - MessageId::ApprovalChooseHint => "Escolha: ", - MessageId::ApprovalChooseAction => "Enter para selecionar, ou pressione y/a/d diretamente", - MessageId::ApprovalIntentLabel => "Intenção: ", - MessageId::ApprovalMoreLines => " … (+{count} linhas)", - // Sandbox elevation dialog. - // Sandbox elevation dialog. - MessageId::ElevationTitleSandboxDenied => " \u{26a0} Sandbox Negado ", - MessageId::ElevationTitleRequired => " Elevação de Sandbox Necessária ", - MessageId::ElevationFieldTool => " Ferramenta: ", - MessageId::ElevationFieldCmd => " Comando: ", - MessageId::ElevationFieldReason => " Motivo: ", - MessageId::ElevationImpactHeader => " Impacto se aprovado:", - MessageId::ElevationImpactNetwork => { - " - retry de rede permite downloads externos e requisições HTTP" - } - MessageId::ElevationImpactWrite => { - " - retry de escrita expande o escopo do sistema de arquivos para esta chamada" - } - MessageId::ElevationImpactFullAccess => { - " - acesso total remove todas as restrições de sandbox para este retry" - } - MessageId::ElevationPromptProceed => " Escolha como prosseguir:", - MessageId::ElevationOptionNetwork => "Permitir rede externa", - MessageId::ElevationOptionWrite => "Permitir acesso extra de escrita", - MessageId::ElevationOptionFullAccess => "Acesso total (sistema de arquivos + rede)", - MessageId::ElevationOptionAbort => "Abortar", - MessageId::ElevationOptionNetworkDesc => { - "Retry esta chamada com acesso de rede externa para downloads e requisições HTTP" - } - MessageId::ElevationOptionWriteDesc => { - "Retry esta chamada com escopo adicional de sistema de arquivos gravável" - } - MessageId::ElevationOptionFullAccessDesc => { - "Retry sem limites de sandbox; concede acesso irrestrito ao sistema de arquivos e rede" - } - MessageId::ElevationOptionAbortDesc => "Cancelar esta execução de ferramenta", - - MessageId::CtxInspTitle => "Inspetor de contexto", - MessageId::CtxInspSessionContext => "Contexto da sessão", - MessageId::CtxInspSystemPrompt => "Estrutura do prompt do sistema", - MessageId::CtxInspReferences => "Referências", - MessageId::CtxInspRecentTools => "Ferramentas recentes", - MessageId::CtxInspModel => "Modelo", - MessageId::CtxInspWorkspace => "Espaço de trabalho", - MessageId::CtxInspSession => "Sessão", - MessageId::CtxInspContext => "Contexto", - MessageId::CtxInspTranscript => "Transcrição", - MessageId::CtxInspWorkspaceStatus => "Status do espaço de trabalho", - MessageId::CtxInspNotSampledYet => "ainda não amostrado", - MessageId::CtxInspOk => "ok", - MessageId::CtxInspHigh => "alto", - MessageId::CtxInspCritical => "crítico", - MessageId::CtxInspIncluded => "incluído", - MessageId::CtxInspAttached => "anexado", - MessageId::CtxInspNotIncluded => "não incluído", - MessageId::CtxInspOutputCaptured => "saída capturada", - MessageId::CtxInspNoOutputYet => "nenhuma saída ainda", - MessageId::CtxInspNoSystemPrompt => "Nenhum prompt de sistema definido.", - MessageId::CtxInspNoReferences => { - "Nenhuma referência de arquivo, diretório ou mídia registrada ainda." - } - MessageId::CtxInspNoToolActivity => "Nenhuma atividade de ferramenta registrada ainda.", - MessageId::CtxInspVHint => { - "Abra o cartão correspondente e pressione v para detalhes completos." - } - MessageId::CtxInspCells => "células", - MessageId::CtxInspApiMessages => "mensagens da API", - MessageId::CtxInspActive => "ativo", - MessageId::CtxInspCell => "célula", - MessageId::CtxInspMoreReferences => "mais referência(s)", - MessageId::CtxInspStablePrefix => "Prefixo estável", - MessageId::CtxInspVolatileWorkingSet => "Conjunto de trabalho volátil", - MessageId::CtxInspFirstLine => "Primeira linha", - MessageId::CtxInspTotal => "Total", - MessageId::CtxInspTextPromptLayers => "Camadas de prompt de texto", - MessageId::CtxInspSingleTextBlob => "Bloco de texto único", - MessageId::CtxInspBlocks => "bloco(s)", - MessageId::CtxInspBlock => "bloco", - MessageId::CtxInspTokens => "token(s)", - MessageId::CtxInspLayers => "camada(s)", - MessageId::CtxInspNone => "nenhum", - MessageId::CtxInspEmpty => "(vazio)", - MessageId::CtxInspCacheFriendly => "amigável ao cache", - MessageId::CtxInspChangesByTurn => "muda por sessão/turno", - MessageId::CtxInspStablePrefixOnly => "apenas prefixo estável", - MessageId::CtxInspCacheTip => { - "Dica: Blocos de prefixo estável são elegíveis para cache de prefixo DeepSeek V4. Alterações no conjunto de trabalho volátil quebram o cache apenas no final." - } - MessageId::ToolFamilyRead => "ler", - MessageId::ToolFamilyPatch => "corrigir", - MessageId::ToolFamilyRun => "executar", - MessageId::ToolFamilyFind => "buscar", - MessageId::ToolFamilyDelegate => "delegar", - MessageId::ToolFamilyFanout => "fanout", - MessageId::ToolFamilyRlm => "rlm", - MessageId::ToolFamilyVerify => "verificar", - MessageId::ToolFamilyThink => "pensar", - MessageId::ToolFamilyGeneric => "ferramenta", - // Voice commands - MessageId::CmdVoiceDescription => { - "Alternar entrada de voz: gravar fala e transcrever para texto" - } - MessageId::CmdVoiceSendDescription => { - "Alternar envio automático por voz: envia quando a transcrição termina com \"send it\"" - } - MessageId::CmdVoiceControlDescription => { - "Alternar controle por voz: ditado assistido por IA" - } - MessageId::VoiceEnabled => "Entrada de voz ativada. Fale para gravar.", - MessageId::VoiceDisabled => "Entrada de voz desativada.", - MessageId::VoiceSendEnabled => "Envio automático por voz ativado.", - MessageId::VoiceSendDisabled => "Envio automático por voz desativado.", - MessageId::VoiceControlEnabled => "Controle por voz ativado.", - MessageId::VoiceControlDisabled => "Controle por voz desativado.", - MessageId::VoiceErrNoAuth => "Voz: nenhuma chave de API configurada para o provedor ativo", - MessageId::VoiceErrNoRecorder => { - "Voz: nenhuma ferramenta de gravação encontrada. Instale sox, arecord ou rec." - } - MessageId::VoiceErrNetwork => "Voz: falha na solicitação de transcrição", - MessageId::VoiceErrEmptySend => "Voz: nada para enviar", - MessageId::VoiceErrTooShort => "Voz: nenhuma fala detectada, gravação muito curta", - MessageId::VoiceRecording => "🎙 Gravando... fale agora", - MessageId::VoiceProcessing => "🎙 Transcrevendo...", - MessageId::VoiceTranscribed => "🎙 Transcrito", - }) -} - -fn spanish_latin_america(id: MessageId) -> Option<&'static str> { - Some(match id { - MessageId::ComposerPlaceholder => "Escribe una tarea o usa /.", - MessageId::HistorySearchPlaceholder => "Buscar en el historial de prompts...", - MessageId::HistorySearchTitle => "Búsqueda en el historial", - MessageId::HistoryHintMove => "Arriba/Abajo mover", - MessageId::HistoryHintAccept => "Enter aceptar", - MessageId::HistoryHintRestore => "Esc restaurar", - MessageId::HistoryNoMatches => " Sin resultados", - MessageId::StatusPickerTitle => " Línea de estado ", - MessageId::StatusPickerInstruction => "Elige los elementos que quieres en el pie:", - MessageId::StatusPickerActionToggle => "alternar ", - MessageId::StatusPickerActionAll => "todos ", - MessageId::StatusPickerActionNone => "ninguno ", - MessageId::StatusPickerActionSave => "guardar ", - MessageId::StatusPickerActionCancel => "cancelar ", - MessageId::ConfigTitle => "Configuración de la sesión", - MessageId::ConfigModalTitle => " Config ", - MessageId::ConfigSearchPlaceholder => "escribe para filtrar", - MessageId::ConfigNoSettings => " No hay configuraciones disponibles.", - MessageId::ConfigNoMatchesPrefix => " Ninguna configuración coincide con ", - MessageId::ConfigFilteredSettings => " Configuraciones filtradas", - MessageId::ConfigShowing => " Mostrando", - MessageId::ConfigFooterDefault => { - " escribir=filtrar, Arriba/Abajo=seleccionar, Enter/e=editar, Esc/q=cerrar " - } - MessageId::ConfigFooterScrollable => { - " escribir=filtrar, Arriba/Abajo=seleccionar, Enter/e=editar, PgUp/PgDn=desplazar, Esc/q=cerrar " - } - MessageId::ConfigFooterFiltered => { - " escribir=filtrar, Backspace=borrar, Ctrl+U/Esc=limpiar, Enter=editar " - } - MessageId::ConfigSectionProvider => "Proveedor", - MessageId::ConfigSectionModel => "Modelo", - MessageId::ConfigSectionPermissions => "Permisos", - MessageId::ConfigSectionNetwork => "Red", - MessageId::ConfigSectionDisplay => "Pantalla", - MessageId::ConfigSectionComposer => "Compositor", - MessageId::ConfigSectionSidebar => "Barra lateral", - MessageId::ConfigSectionHistory => "Historial", - MessageId::ConfigSectionMcp => "MCP", - MessageId::ConfigSectionFleet => "Fleet", - MessageId::ConfigSectionExperimental => "Experimental", - MessageId::ConfigScopeSession => "SESIÓN", - MessageId::ConfigScopeSaved => "GUARDADO", - MessageId::ConfigEditCancelled => "Edición cancelada", - MessageId::ConfigEditTitlePrefix => "Editar ", - MessageId::ConfigEditScopeLabel => "Ámbito: ", - MessageId::ConfigEditCurrentLabel => "Actual: ", - MessageId::ConfigEditHintLabel => "Pista: ", - MessageId::ConfigEditNewLabel => "Nuevo: ", - MessageId::ConfigEditFooter => { - " Enter=aplicar, Esc=cancelar, Ctrl+U=limpiar, Ctrl+A=todo, \u{2190}/\u{2192}=mover " - } - MessageId::ConfigRowEffective => " (efectivo {currency})", - MessageId::ConfigDefaultValue => "(predeterminado)", - MessageId::ConfigDefaultReasoning => "(config/predeterminado)", - MessageId::ConfigUnavailable => "(no disponible)", - MessageId::HelpTitle => "Ayuda", - MessageId::HelpFilterPlaceholder => "Escribe para filtrar", - MessageId::HelpFilterPrefix => "Filtro: ", - MessageId::HelpNoMatches => " Sin resultados.", - MessageId::HelpSlashCommands => "Comandos con barra", - MessageId::HelpKeybindings => "Atajos de teclado", - MessageId::HelpFooterTypeFilter => " escribir para filtrar ", - MessageId::HelpFooterMove => " Arriba/Abajo mover ", - MessageId::HelpFooterJump => " PgUp/PgDn saltar ", - MessageId::HelpFooterClose => " Esc cerrar ", - MessageId::CmdAnchorDescription => { - "Fijar un dato que sobrevive a la compactación (inyectado automáticamente en el contexto)" - } - MessageId::CmdAttachDescription => { - "Adjuntar imagen o video; usa @ruta para archivos de texto o directorios" - } - MessageId::CmdCacheDescription => { - "Mostrar estadísticas de hit/miss del caché de prefijo DeepSeek en las últimas N rondas" - } - MessageId::CmdChangeDescription => "Mostrar la entrada más reciente del changelog", - MessageId::CmdChangeHeader => "Changelog más reciente", - MessageId::CmdChangeTranslationQueued => { - "Las notas de la versión en inglés se muestran abajo. Se solicitará una versión traducida a continuación; si el proveedor no está disponible, este texto en inglés será el fallback." - } - MessageId::CmdChangeTranslationUnavailable => { - "Las notas de la versión en inglés se muestran abajo. La traducción no está disponible porque la sesión actual no tiene clave de API o está offline." - } - MessageId::CmdChangePreviousVersion => { - "Versión anterior: {version} — ejecuta `/change {version}` para verla" - } - MessageId::CmdBalanceDescription => "Consultar el saldo de la cuenta del proveedor activo", - MessageId::CmdClearDescription => "Limpiar el historial de la conversación", - MessageId::CmdCompactDescription => "Compactar el contexto para liberar espacio", - MessageId::CmdPurgeDescription => { - "Permite al agente eliminar quirúrgicamente historial innecesario para liberar espacio de contexto" - } - MessageId::CmdConfigDescription => "Abrir el editor interactivo de configuración", - MessageId::CmdContextDescription => "Abrir el inspector compacto de contexto de la sesión", - MessageId::CmdCostDescription => "Mostrar el desglose de costo de la sesión", - MessageId::CmdDiffDescription => "Mostrar cambios en archivos desde el inicio de la sesión", - MessageId::CmdEditDescription => "Revisar y reenviar el último mensaje", - MessageId::CmdExitDescription => "Salir de la aplicación", - MessageId::CmdExportDescription => "Exportar la conversación a markdown", - MessageId::CmdFeedbackDescription => "Generar una URL de feedback en GitHub", - MessageId::CmdHfDescription => "Inspeccionar configuracion y conceptos de Hugging Face MCP", - MessageId::CmdHelpDescription => "Mostrar información de ayuda", - MessageId::CmdProfileDescription => "Cambiar a un perfil de configuración con nombre", - MessageId::CmdHomeDescription => { - "Mostrar el panel inicial con estadísticas y acciones rápidas" - } - MessageId::CmdHooksDescription => { - "Listar hooks de ciclo de vida configurados (solo lectura)" - } - MessageId::CmdAgentDescription => { - "Abrir una sesión persistente de sub-agente: /agent [0-3] " - } - MessageId::CmdGoalDescription => { - "Definir una meta de sesión con presupuesto de tokens opcional" - } - MessageId::CmdInitDescription => "Generar AGENTS.md para el proyecto", - MessageId::CmdLspDescription => "Alternar diagnóstico LSP encendido o apagado", - MessageId::CmdShareDescription => "Exportar la sesión actual como una URL web compartible", - MessageId::CmdJobsDescription => { - "Inspeccionar y controlar trabajos de shell en segundo plano" - } - MessageId::CmdLinksDescription => { - "Mostrar enlaces de tokens, paneles y documentación de proveedores" - } - MessageId::CmdLoadDescription => "Cargar la sesión desde un archivo", - MessageId::CmdLogoutDescription => "Limpiar la clave de API y volver a la configuración", - MessageId::CmdMcpDescription => "Abrir o gestionar servidores MCP", - MessageId::CmdPluginDescription => "List discovered plugin tools or show details for one", - MessageId::CmdPluginNoneFound => "No plugin tools discovered in {dir}", - MessageId::CmdPluginNotFound => "Plugin '{name}' not found", - MessageId::CmdPluginListHeader => "Plugin tools ({count}):", - MessageId::CmdPluginDetailDescription => "Description: {description}", - MessageId::CmdPluginDetailSchema => "Schema:\n{schema}", - MessageId::CmdPluginDetailApproval => "Approval: {approval}", - MessageId::CmdPluginDetailPath => "Path: {path}", - MessageId::CmdMemoryDescription => { - "Inspeccionar o gestionar el archivo persistente de memoria del usuario" - } - MessageId::CmdModeDescription => { - "Alternar modo o abrir selector: /mode [agent|plan|yolo|1|2|3]" - } - MessageId::CmdModelDescription => "Cambiar o mostrar el modelo actual", - MessageId::CmdModelsDescription => "Listar los modelos disponibles por la API", - MessageId::CmdModelDbDescription => { - "Explorar la base de datos de referencia de modelos integrada" - } - MessageId::CmdNetworkDescription => "Gestionar reglas de red permitidas y bloqueadas", - MessageId::CmdNoteDescription => { - "Agregar nota al archivo persistente (.codewhale/notes.md)" - } - MessageId::CmdThemeDescription => "Alternar entre tema claro y oscuro", - MessageId::CmdProviderDescription => { - "Cambiar o mostrar el backend LLM activo (deepseek | nvidia-nim | ollama)" - } - MessageId::CmdQueueDescription => "Ver o editar mensajes en cola", - MessageId::CmdQueueUsage => "Uso: /queue [list|send |edit |drop |clear]", - MessageId::CmdQueueDraftHeader => "Editando mensaje en cola:", - MessageId::CmdQueueNoMessages => "No hay mensajes en cola", - MessageId::CmdQueueListHeader => "Mensajes en cola ({count}):", - MessageId::CmdQueueTip => { - "Consejo: /queue send para enviar ahora, /queue drop para eliminar" - } - MessageId::CmdQueueAlreadyEditing => { - "Ya estás editando un mensaje en cola. Envíalo o usa /queue clear para descartarlo." - } - MessageId::CmdQueueNotFound => "Mensaje en cola no encontrado", - MessageId::CmdQueueEditingStatus => "Editando mensaje en cola {index}", - MessageId::CmdQueueEditingMessage => { - "Editando mensaje en cola {index} (presiona Enter para re-encolar/enviar)" - } - MessageId::CmdQueueDropped => "Mensaje en cola {index} eliminado", - MessageId::CmdQueueAlreadyEmpty => "La cola ya está vacía", - MessageId::CmdQueueCleared => "Cola limpiada", - MessageId::CmdQueueMissingIndex => { - "Índice faltante. Uso: /queue edit o /queue drop " - } - MessageId::CmdQueueIndexPositive => "El índice debe ser un número positivo", - MessageId::CmdQueueIndexMin => "El índice debe ser >= 1", - MessageId::CmdRelayDescription => "Crear un relay de sesión (接力) para un hilo nuevo", - MessageId::CmdRenameDescription => "Renombrar la sesión actual", - MessageId::CmdRestoreDescription => { - "Revertir el workspace a un snapshot pre/post-turno anterior. Sin argumento, lista los snapshots recientes." - } - MessageId::CmdRetryDescription => "Repetir la última solicitud", - MessageId::CmdReviewDescription => { - "Ejecutar una revisión de código estructurada en un archivo, diff o PR" - } - MessageId::CmdRlmDescription => { - "Turno del Recursive Language Model (RLM) — guarda el prompt en un REPL Python y deja que el modelo escriba el código que lo procesa; usa `llm_query()` / `sub_rlm()` para llamadas a sub-LLMs." - } - MessageId::CmdSaveDescription => "Guardar la sesión en archivo", - MessageId::CmdForkDescription => "Bifurcar la conversación activa a una sesión hermana", - MessageId::CmdNewDescription => "Iniciar una nueva sesión guardada", - MessageId::CmdSessionsDescription => "Abrir el selector de sesiones", - MessageId::CmdSettingsDescription => "Mostrar las configuraciones persistidas", - MessageId::CmdSidebarDescription => "Toggle or focus the right sidebar", - MessageId::CmdSkillDescription => { - "Activar una skill, o instalar/actualizar/desinstalar/confiar en una skill de la comunidad" - } - MessageId::CmdSkillsDescription => { - "Listar skills locales (filtra con `/skills `; --remote navega el registro curado)" - } - MessageId::CmdSlopDescription => "Inspect or export the debt ledger", - MessageId::CmdStashDescription => { - "Estacionar o restaurar borrador del compositor (Ctrl+S estaciona, /stash list|pop)" - } - MessageId::CmdStatusDescription => "Mostrar el estado de la sesión en ejecución", - MessageId::CmdStatuslineDescription => { - "Configurar qué elementos aparecen en el pie de página" - } - MessageId::CmdFleetDescription => "Abrir configuración Fleet o estado de workers", - MessageId::CmdHotbarDescription => "Abrir configuración de Hotbar", - MessageId::CmdSubagentsDescription => "Atajo compatible para /fleet status", - MessageId::CmdSystemDescription => "Mostrar el prompt de sistema actual", - MessageId::CmdTaskDescription => "Gestionar tareas en segundo plano", - MessageId::CmdTokensDescription => "Mostrar el uso de tokens de la sesión", - MessageId::CmdTranslateDescription => { - "Activar o desactivar la traducción de salida al idioma actual del sistema" - } - MessageId::CmdTranslateOff => { - "Traducción de salida desactivada (se muestra la salida original del modelo)" - } - MessageId::CmdTranslateOn => { - "Traducción de salida activada: las respuestas del modelo se mostrarán en el idioma del sistema" - } - MessageId::TranslationInProgress => "Traduciendo la salida del asistente...", - MessageId::TranslationComplete => "Traducción completada", - MessageId::TranslationFailed => "Traducción fallida", - MessageId::CmdTrustDescription => { - "Gestionar la confianza del workspace y la lista de paths permitidos (`/trust add `, `/trust list`, `/trust on|off`)" - } - MessageId::CmdWorkspaceDescription => "Mostrar o cambiar el workspace actual", - MessageId::CmdUndoDescription => "Eliminar el último par de mensajes", - MessageId::CmdVerboseDescription => { - "Alternar pensamiento en vivo completo en la transcripción" - } - MessageId::CmdCacheAdvice => { - "Tasas de hit/miss arriba del ~70% a partir del tercer turno indican un prefijo de caché estable;\n\ - valores menores en sesiones largas sugieren inestabilidad en el prefijo, vale investigar (#263)." - } - MessageId::CmdCacheFootnote => { - "* miss inferido a partir de entrada − hit cuando el proveedor no lo reporta por separado.\n" - } - MessageId::CmdCacheHeader => { - "Telemetría del caché — últimos {count} de {total} turno(s) (modelo: {model})\n" - } - MessageId::CmdCacheNoData => { - "Historial del caché: ningún turno registrado todavía.\n\n\ - DeepSeek expone `prompt_cache_hit_tokens` / `prompt_cache_miss_tokens` en cada turno \ - de la API donde el modelo lo soporta (familia V4). Ejecuta un turno y prueba /cache de nuevo." - } - MessageId::CmdCacheTotals => { - "Σ entrada: {sum_in} Σ hit: {sum_hit} Σ miss: {sum_miss} tasa promedio de hit: {avg}\n" - } - MessageId::CmdCostReport => { - "Costo de la sesión:\n\ - ─────────────────────────────\n\ - Total aproximado: {cost}\n\n\ - Las estimaciones de costo son aproximadas y usan la telemetría de uso del proveedor cuando está disponible.\n\n\ - Precios de la API DeepSeek:\n\ - ─────────────────────────────\n\ - Los detalles de precio no están configurados en esta CLI." - } - MessageId::CmdTokensCacheBoth => "{hit} hit / {miss} miss", - MessageId::CmdTokensCacheHitOnly => "{hit} hit / miss no reportado", - MessageId::CmdTokensCacheMissOnly => "hit no reportado / {miss} miss", - MessageId::CmdTokensContextUnknownWindow => "~{estimated} / ventana desconocida", - MessageId::CmdTokensContextWithWindow => "~{used} / {window} ({percent}%)", - MessageId::FooterAgentSingular => "1 sub-agente", - MessageId::FooterAgentsPlural => "{count} sub-agentes", - MessageId::FooterPressCtrlCAgain => "Presiona Ctrl+C de nuevo para salir", - MessageId::FooterWorking => "trabajando", - MessageId::FooterBalancePrefix => "saldo", - MessageId::HelpSectionActions => "Acciones", - MessageId::HelpSectionClipboard => "Portapapeles", - MessageId::HelpSectionEditing => "Edición de entrada", - MessageId::HelpSectionHelp => "Ayuda", - MessageId::HelpSectionModes => "Modos", - MessageId::HelpSectionNavigation => "Navegación", - MessageId::HelpSectionSessions => "Sesiones", - MessageId::CmdTokensNotReported => "no reportado", - MessageId::CmdTokensReport => { - "Uso de tokens:\n\ - ─────────────────────────────\n\ - Contexto activo: {active}\n\ - Última entrada de API: {input} (telemetría por turno; puede contar el mismo prefijo varias veces en rondas con herramientas)\n\ - Última salida de API: {output}\n\ - Hit/miss del caché: {cache} (solo para telemetría/costo)\n\ - Tokens acumulados: {total} (telemetría de uso de la sesión)\n\ - Costo aproximado: {cost}\n\ - Mensajes de API: {api_messages}\n\ - Mensajes del chat: {chat_messages}\n\ - Modelo: {model}" - } - MessageId::KbScrollTranscript => { - "Desplazar transcripción, navegar historial de entrada o seleccionar adjuntos del compositor" - } - MessageId::KbNavigateHistory => "Navegar historial de entrada", - MessageId::KbBrowseHistory => "Explorar historial de conversación", - MessageId::KbScrollTranscriptAlt => "Desplazar transcripción", - MessageId::KbScrollPage => "Desplazar transcripción por página", - MessageId::KbJumpTopBottom => "Saltar al inicio / fin de la transcripción", - MessageId::KbJumpTopBottomEmpty => "Saltar al inicio / fin (cuando la entrada está vacía)", - MessageId::KbJumpToolBlocks => "Saltar entre bloques de salida de herramientas", - MessageId::KbMoveCursor => "Mover cursor en el compositor", - MessageId::KbJumpLineStartEnd => "Saltar al inicio / fin de la línea", - MessageId::KbDeleteChar => { - "Eliminar carácter antes / después del cursor, o quitar adjunto seleccionado" - } - MessageId::KbClearDraft => "Limpiar borrador actual", - MessageId::KbStashDraft => "Estacionar borrador actual (`/stash pop` restaura)", - MessageId::KbSearchHistory => "Buscar historial de prompts y recuperar borradores locales", - MessageId::KbInsertNewline => "Insertar nueva línea en el compositor", - MessageId::KbSendDraft => "Enviar borrador actual", - MessageId::KbCloseMenu => { - "Cerrar menú, cancelar solicitud, descartar borrador o limpiar entrada" - } - MessageId::KbCancelOrExit => "Cancelar solicitud o salir cuando está inactivo", - MessageId::KbShellControls => "Enviar el comando en primer plano a segundo plano", - MessageId::KbExitEmpty => "Salir cuando la entrada está vacía", - MessageId::KbCommandPalette => "Abrir paleta de comandos", - MessageId::KbCancelBackgroundShellJobs => { - "Cancelar todos los trabajos shell en segundo plano en ejecución (barra lateral Tasks)" - } - MessageId::KbFuzzyFilePicker => { - "Abrir selector de archivo fuzzy (inserta @ruta al presionar Enter)" - } - MessageId::KbCompactInspector => "Abrir inspector compacto de contexto de la sesión", - MessageId::KbLastMessagePager => { - "Abrir paginador para el último mensaje (cuando la entrada está vacía)" - } - MessageId::KbSelectedDetails => { - "Abrir detalles de la herramienta o mensaje seleccionado (cuando la entrada está vacía)" - } - MessageId::KbToolDetailsPager => "Abrir paginador de detalles de la herramienta", - MessageId::KbThinkingPager => "Abrir paginador de razonamiento", - MessageId::KbLiveTranscript => "Abrir superposición de transcripción en vivo (auto-scroll)", - MessageId::KbBacktrackMessage => { - "Retroceder al mensaje anterior del usuario (izquierda/derecha, Enter para rebobinar)" - } - MessageId::KbCompleteCycleModes => { - "Completar /command, encolar follow-up, ciclar modos; Shift+Tab cicla esfuerzo de razonamiento" - } - MessageId::KbJumpPlanAgentYolo => "Activar ranuras de la hotbar", - MessageId::KbAltJumpPlanAgentYolo => "Salto alternativo a modo Plan / Agent / YOLO", - MessageId::KbFocusSidebar => { - "Enfocar barra lateral Pinned / Tasks / Agents / Context / Auto / Ocultar" - } - MessageId::KbSessionPicker => "Abrir selector de sesiones", - MessageId::KbPasteAttach => "Pegar texto o adjuntar imagen del portapapeles", - MessageId::KbCopySelection => "Copiar selección actual (Cmd+C en macOS)", - MessageId::KbContextMenu => { - "Abrir acciones de contexto para pegar, selección, detalles, contexto y ayuda" - } - MessageId::KbAttachPath => "Agregar archivo o directorio local al contexto", - MessageId::KbHelpOverlay => { - "Abrir esta superposición de ayuda (cuando la entrada está vacía)" - } - MessageId::KbToggleHelp => "Alternar superposición de ayuda", - MessageId::KbToggleHelpSlash => "Alternar superposición de ayuda", - MessageId::HelpUsageLabel => "Uso:", - MessageId::HelpAliasesLabel => "Alias:", - MessageId::SettingsTitle => "Configuraciones:", - MessageId::SettingsConfigFile => "Archivo de configuración:", - MessageId::ClearConversation => "Conversación limpia", - MessageId::ClearConversationBusy => { - "Conversación limpia (estado del plan ocupado; ejecuta /clear de nuevo si es necesario)" - } - MessageId::ModelChanged => "Modelo cambiado: {old} \u{2192} {new}", - MessageId::LinksTitle => "Enlaces de proveedores:", - MessageId::LinksDashboard => "Panel:", - MessageId::LinksDocs => "Documentación:", - MessageId::LinksTip => { - "Tip: usa la variable de entorno mostrada para tu proveedor o guarda la clave con `codewhale auth set --provider `." - } - MessageId::SubagentsFetching => "Obteniendo estado de workers Fleet...", - MessageId::HelpUnknownCommand => "Comando desconocido: {topic}", - MessageId::HomeDashboardTitle => "Panel Inicial de codewhale", - MessageId::HomeModel => "Modelo:", - MessageId::HomeMode => "Modo:", - MessageId::HomeWorkspace => "Workspace:", - MessageId::HomeHistory => "Historial:", - MessageId::HomeTokens => "Tokens:", - MessageId::HomeQueued => "En cola:", - MessageId::HomeSubagents => "Workers Fleet:", - MessageId::HomeSkill => "Skill:", - MessageId::HomeQuickActions => "Acciones Rápidas", - MessageId::HomeQuickLinks => "/links - Enlaces del panel y API", - MessageId::HomeQuickSkills => "/skills - Listar skills disponibles", - MessageId::HomeQuickConfig => "/config - Abrir editor interactivo de configuración", - MessageId::HomeQuickSettings => "/settings - Mostrar configuraciones persistentes", - MessageId::HomeQuickModel => "/model - Alternar o visualizar modelo", - MessageId::HomeQuickSubagents => "/fleet status - Estado de workers Fleet", - MessageId::HomeQuickTaskList => "/task list - Mostrar fila de tareas en segundo plano", - MessageId::HomeQuickHelp => "/help - Mostrar ayuda", - MessageId::HomeModeTips => "Tips de Modo", - MessageId::HomeAgentModeTip => "Modo Agent - Usar herramientas para tareas autónomas", - MessageId::HomeAgentModeReviewTip => " Escribe /mode plan para revisar antes de ejecutar", - MessageId::HomeAgentModeYoloTip => { - " Escribe /mode yolo para habilitar acceso total a las herramientas" - } - MessageId::HomeYoloModeTip => "Modo YOLO - Acceso total a herramientas, sin aprobaciones", - MessageId::HomeYoloModeCaution => " ¡Ten cuidado con operaciones destructivas!", - MessageId::HomePlanModeTip => "Modo Plan - Planear antes de implementar", - MessageId::HomePlanModeChecklistTip => { - " Usa /mode plan para crear checklists estructurados" - } - MessageId::HomeGoalModeTip => { - "Seguimiento de Goal - Usa /goal para seguir un objetivo persistente" - } - MessageId::OnboardLanguageTitle => "Elige el idioma", - MessageId::OnboardLanguageBlurb => { - "Elige el idioma de la interfaz. Puedes cambiarlo en cualquier momento con `/settings set locale `." - } - MessageId::OnboardLanguageFooter => { - "Presiona 1-7 para elegir, o Enter para mantener la configuración actual" - } - MessageId::OnboardApiKeyTitle => "Conecta tu clave de API DeepSeek", - MessageId::OnboardApiKeyStep1 => { - "Paso 1. Abre https://platform.deepseek.com/api_keys y crea una clave." - } - MessageId::OnboardApiKeyStep2 => "Paso 2. Pégala abajo y presiona Enter.", - MessageId::OnboardApiKeySavedHint => { - "Guardada en ~/.codewhale/config.toml para funcionar en cualquier carpeta." - } - MessageId::OnboardApiKeyFormatHint => { - "Pega la clave completa tal como fue emitida (sin espacios ni saltos de línea)." - } - MessageId::OnboardApiKeyPlaceholder => "(pega la clave acá)", - MessageId::OnboardApiKeyLabel => "Clave: ", - MessageId::OnboardApiKeyFooter => "Enter para guardar, Esc para volver.", - MessageId::OnboardTrustTitle => "Confiar en el directorio", - MessageId::OnboardTrustQuestion => "¿Confías en el contenido de este directorio?", - MessageId::OnboardTrustLocationPrefix => "Estás en ", - MessageId::OnboardTrustRiskHint => { - "Trabajar con contenido no confiable aumenta el riesgo de inyección de prompt." - } - MessageId::OnboardTrustEffectHint => { - "Confiar en este directorio lo registra en la configuración global y habilita el modo workspace confiable." - } - MessageId::OnboardTrustFooterPrefix => "Presiona ", - MessageId::OnboardTrustFooterMiddle => " para confiar y continuar, ", - MessageId::OnboardTrustFooterSuffix => " para salir", - MessageId::OnboardTipsTitle => "Empieza simple", - MessageId::OnboardTipsLine1 => { - "Escribe la tarea en lenguaje natural. Usa /help o Ctrl+K para comandos." - } - MessageId::OnboardTipsLine2 => { - "El composer inferior es multilínea: Enter envía, Alt+Enter o Ctrl+J agrega una nueva línea." - } - MessageId::OnboardTipsLine3 => { - "Cambia de modo solo cuando el trabajo cambie: Plan para revisar antes, Agent para ejecución, YOLO para auto-aprobación." - } - MessageId::OnboardTipsLine4 => { - "Ctrl+R retoma sesiones anteriores, y Esc cancela el borrador o superposición actual." - } - MessageId::OnboardTipsFooterEnter => "Presiona Enter", - MessageId::OnboardTipsFooterAction => " para abrir el workspace", - // Context menu. - MessageId::CtxMenuTitle => " Clic derecho ", - MessageId::CtxMenuCopySelection => "Copiar selección", - MessageId::CtxMenuCopySelectionDesc => "copiar texto seleccionado de la transcripción", - MessageId::CtxMenuOpenSelection => "Abrir selección", - MessageId::CtxMenuOpenSelectionDesc => "mostrar texto seleccionado en el visor", - MessageId::CtxMenuClearSelection => "Limpiar selección", - MessageId::CtxMenuOpenDetails => "Abrir detalles", - MessageId::CtxMenuCopyMessage => "Copiar mensaje", - MessageId::CtxMenuCopyMessageDesc => "copiar celda de transcripción seleccionada", - MessageId::CtxMenuOpenInEditor => "Abrir en editor", - MessageId::CtxMenuOpenInEditorDesc => "abrir file:line en $EDITOR", - MessageId::CtxMenuShowCell => "Mostrar celda", - MessageId::CtxMenuShowCellDesc => "volver a mostrar esta celda de transcripción", - MessageId::CtxMenuHideCell => "Ocultar celda", - MessageId::CtxMenuHideCellDesc => "colapsar esta celda de transcripción", - MessageId::CtxMenuShowHidden => "Mostrar ocultas", - MessageId::CtxMenuShowHiddenDesc => "volver a mostrar todas las celdas colapsadas", - MessageId::CtxMenuPaste => "Pegar", - MessageId::CtxMenuPasteDesc => "insertar portapapeles en el compositor", - MessageId::CtxMenuCmdPalette => "Paleta de comandos", - MessageId::CtxMenuCmdPaletteDesc => "comandos, habilidades y herramientas", - MessageId::CtxMenuContextInspector => "Inspector de contexto", - MessageId::CtxMenuContextInspectorDesc => "contexto activo y sugerencias de caché", - MessageId::CtxMenuHelp => "Ayuda", - MessageId::CtxMenuHelpDesc => "atajos de teclado y comandos", - MessageId::FanoutCounts => { - "{done} completado · {running} ejecutando · {failed} falló · {pending} pendiente" - } - - // App mode picker (prompt, names, hints) and composer vim indicator. - MessageId::ModePickerPrompt => "Elige cómo debe funcionar CodeWhale:", - MessageId::AppModeAgent => "Agente", - MessageId::AppModeYolo => "YOLO", - MessageId::AppModePlan => "Plan", - MessageId::AppModeAgentHint => "Ejecución normal con aprobaciones", - MessageId::AppModePlanHint => "Planifica antes de ejecutar", - MessageId::AppModeYoloHint => "Aprobación automática; shell habilitado", - MessageId::VimModeNormal => "-- NORMAL --", - MessageId::VimModeInsert => "-- INSERTAR --", - MessageId::VimModeVisual => "-- VISUAL --", - - // Approval dialog. - MessageId::ApprovalRiskReview => "REVISAR", - MessageId::ApprovalRiskDestructive => "DESTRUCTIVO", - MessageId::ApprovalCategorySafe => "Seguro", - MessageId::ApprovalCategoryFileWrite => "Escritura de Archivo", - MessageId::ApprovalCategoryShell => "Bash", - MessageId::ApprovalCategoryNetwork => "Red", - MessageId::ApprovalCategoryMcpRead => "Lectura MCP", - MessageId::ApprovalCategoryMcpAction => "Acción MCP", - MessageId::ApprovalCategoryUnknown => "Desconocido", - MessageId::ApprovalFieldType => "Tipo:", - MessageId::ApprovalFieldAbout => "Acerca de:", - MessageId::ApprovalFieldImpact => "Impacto:", - MessageId::ApprovalFieldParams => "Parámetros:", - MessageId::ApprovalOptionApproveOnce => "Aprobar una vez", - MessageId::ApprovalOptionApproveAlways => "Aprobar siempre para este tipo", - MessageId::ApprovalOptionDeny => "Denegar esta llamada", - MessageId::ApprovalOptionAbortTurn => "Abortar turno", - MessageId::ApprovalBlockTitle => "aprobación", - MessageId::ApprovalControlsHint => " · v: parámetros · Esc: abortar", - MessageId::ApprovalChooseHint => "Elegir: ", - MessageId::ApprovalChooseAction => "Enter para seleccionar, o presione y/a/d directamente", - MessageId::ApprovalIntentLabel => "Intención: ", - MessageId::ApprovalMoreLines => " … (+{count} líneas)", - // Sandbox elevation dialog. - // Sandbox elevation dialog. - MessageId::ElevationTitleSandboxDenied => " \u{26a0} Sandbox Denegado ", - MessageId::ElevationTitleRequired => " Elevación de Sandbox Requerida ", - MessageId::ElevationFieldTool => " Herramienta: ", - MessageId::ElevationFieldCmd => " Comando: ", - MessageId::ElevationFieldReason => " Motivo: ", - MessageId::ElevationImpactHeader => " Impacto si se aprueba:", - MessageId::ElevationImpactNetwork => { - " - reintento de red permite descargas y solicitudes HTTP externas" - } - MessageId::ElevationImpactWrite => { - " - reintento de escritura expande el ámbito del sistema de archivos para esta llamada" - } - MessageId::ElevationImpactFullAccess => { - " - acceso total elimina todas las restricciones de sandbox para este reintento" - } - MessageId::ElevationPromptProceed => " Elige cómo proceder:", - MessageId::ElevationOptionNetwork => "Permitir red externa", - MessageId::ElevationOptionWrite => "Permitir acceso extra de escritura", - MessageId::ElevationOptionFullAccess => "Acceso total (sistema de archivos + red)", - MessageId::ElevationOptionAbort => "Abortar", - MessageId::ElevationOptionNetworkDesc => { - "Reintenta esta llamada con acceso de red externa para descargas y solicitudes HTTP" - } - MessageId::ElevationOptionWriteDesc => { - "Reintenta esta llamada con ámbito adicional de sistema de archivos grabable" - } - MessageId::ElevationOptionFullAccessDesc => { - "Reintenta sin límites de sandbox; concede acceso sin restricciones al sistema de archivos y red" - } - MessageId::ElevationOptionAbortDesc => "Cancelar esta ejecución de herramienta", - - MessageId::CtxInspTitle => "Inspector de contexto", - MessageId::CtxInspSessionContext => "Contexto de la sesión", - MessageId::CtxInspSystemPrompt => "Estructura del prompt del sistema", - MessageId::CtxInspReferences => "Referencias", - MessageId::CtxInspRecentTools => "Herramientas recientes", - MessageId::CtxInspModel => "Modelo", - MessageId::CtxInspWorkspace => "Espacio de trabajo", - MessageId::CtxInspSession => "Sesión", - MessageId::CtxInspContext => "Contexto", - MessageId::CtxInspTranscript => "Transcripción", - MessageId::CtxInspWorkspaceStatus => "Estado del espacio de trabajo", - MessageId::CtxInspNotSampledYet => "aún no muestreado", - MessageId::CtxInspOk => "bien", - MessageId::CtxInspHigh => "alto", - MessageId::CtxInspCritical => "crítico", - MessageId::CtxInspIncluded => "incluido", - MessageId::CtxInspAttached => "adjunto", - MessageId::CtxInspNotIncluded => "no incluido", - MessageId::CtxInspOutputCaptured => "salida capturada", - MessageId::CtxInspNoOutputYet => "sin salida aún", - MessageId::CtxInspNoSystemPrompt => "No hay prompt de sistema establecido.", - MessageId::CtxInspNoReferences => { - "Aún no se han registrado referencias de archivos, directorios o medios." - } - MessageId::CtxInspNoToolActivity => "Aún no se ha registrado actividad de herramientas.", - MessageId::CtxInspVHint => { - "Abra la tarjeta correspondiente y presione v para ver los detalles completos." - } - MessageId::CtxInspCells => "celdas", - MessageId::CtxInspApiMessages => "mensajes de API", - MessageId::CtxInspActive => "activo", - MessageId::CtxInspCell => "celda", - MessageId::CtxInspMoreReferences => "más referencia(s)", - MessageId::CtxInspStablePrefix => "Prefijo estable", - MessageId::CtxInspVolatileWorkingSet => "Conjunto de trabajo volátil", - MessageId::CtxInspFirstLine => "Primera línea", - MessageId::CtxInspTotal => "Total", - MessageId::CtxInspTextPromptLayers => "Capas de prompt de texto", - MessageId::CtxInspSingleTextBlob => "Bloque de texto único", - MessageId::CtxInspBlocks => "bloque(s)", - MessageId::CtxInspBlock => "bloque", - MessageId::CtxInspTokens => "token(es)", - MessageId::CtxInspLayers => "capa(s)", - MessageId::CtxInspNone => "ninguno", - MessageId::CtxInspEmpty => "(vacío)", - MessageId::CtxInspCacheFriendly => "amigable con caché", - MessageId::CtxInspChangesByTurn => "cambia por sesión/turno", - MessageId::CtxInspStablePrefixOnly => "solo prefijo estable", - MessageId::CtxInspCacheTip => { - "Consejo: Los bloques de prefijo estable son elegibles para caché de prefijo DeepSeek V4. Los cambios en el conjunto de trabajo volátil solo rompen la caché al final." - } - MessageId::ToolFamilyRead => "leer", - MessageId::ToolFamilyPatch => "parchear", - MessageId::ToolFamilyRun => "ejecutar", - MessageId::ToolFamilyFind => "buscar", - MessageId::ToolFamilyDelegate => "delegar", - MessageId::ToolFamilyFanout => "fanout", - MessageId::ToolFamilyRlm => "rlm", - MessageId::ToolFamilyVerify => "verificar", - MessageId::ToolFamilyThink => "pensar", - MessageId::ToolFamilyGeneric => "herramienta", - // Voice commands - MessageId::CmdVoiceDescription => { - "Alternar entrada de voz: grabar voz y transcribir a texto" - } - MessageId::CmdVoiceSendDescription => { - "Alternar envío automático por voz: envía cuando la transcripción termina con \"send it\"" - } - MessageId::CmdVoiceControlDescription => { - "Alternar control por voz: dictado asistido por IA" - } - MessageId::VoiceEnabled => "Entrada de voz activada. Habla para grabar.", - MessageId::VoiceDisabled => "Entrada de voz desactivada.", - MessageId::VoiceSendEnabled => "Envío automático por voz activado.", - MessageId::VoiceSendDisabled => "Envío automático por voz desactivado.", - MessageId::VoiceControlEnabled => "Control por voz activado.", - MessageId::VoiceControlDisabled => "Control por voz desactivado.", - MessageId::VoiceErrNoAuth => { - "Voz: no hay clave de API configurada para el proveedor activo" - } - MessageId::VoiceErrNoRecorder => { - "Voz: no se encontró herramienta de grabación. Instala sox, arecord o rec." - } - MessageId::VoiceErrNetwork => "Voz: falló la solicitud de transcripción", - MessageId::VoiceErrEmptySend => "Voz: nada que enviar", - MessageId::VoiceErrTooShort => "Voz: no se detectó voz, grabación demasiado corta", - MessageId::VoiceRecording => "🎙 Grabando... habla ahora", - MessageId::VoiceProcessing => "🎙 Transcribiendo...", - MessageId::VoiceTranscribed => "🎙 Transcrito", - }) -} - #[cfg(test)] mod tests { use super::*; @@ -4725,6 +1334,14 @@ mod tests { assert_eq!(resolve_locale_with_env("auto", |_| None), Locale::En); } + pub fn missing_message_ids(locale: Locale) -> Vec { + ALL_MESSAGE_IDS + .iter() + .copied() + .filter(|id| tr(locale, *id).eq(&format!("{id:?}"))) + .collect() + } + #[test] fn shipped_first_pack_has_no_missing_core_messages() { for locale in Locale::shipped() { @@ -4773,14 +1390,6 @@ mod tests { ); } - #[test] - fn missing_translation_falls_back_to_english() { - assert_eq!( - fallback_translation(None, MessageId::ComposerPlaceholder), - english(MessageId::ComposerPlaceholder) - ); - } - #[test] fn provider_description_is_present_for_all_locales() { for locale in Locale::shipped() { diff --git a/crates/tui/src/main.rs b/crates/tui/src/main.rs index f811046576..a5cf9bd960 100644 --- a/crates/tui/src/main.rs +++ b/crates/tui/src/main.rs @@ -16,6 +16,9 @@ use wait_timeout::ChildExt; use crate::dependencies::ExternalTool; +use rust_i18n::i18n; +i18n!("locales", fallback = ["en"]); + mod acp_server; mod artifacts; mod audit; diff --git a/crates/tui/src/tui/app.rs b/crates/tui/src/tui/app.rs index fb0ae7b400..f733d6a517 100644 --- a/crates/tui/src/tui/app.rs +++ b/crates/tui/src/tui/app.rs @@ -1,5 +1,6 @@ //! Application state for the `DeepSeek` TUI. +use std::borrow::Cow; use std::collections::{HashMap, HashSet, VecDeque}; use std::path::{Path, PathBuf}; use std::time::{Duration, Instant}; @@ -958,7 +959,7 @@ impl AppMode { /// Localized short name for the mode picker (user-facing surface only). #[must_use] - pub fn display_name_localized(self, locale: Locale) -> &'static str { + pub fn display_name_localized(self, locale: Locale) -> Cow<'static, str> { tr( locale, match self { @@ -971,7 +972,7 @@ impl AppMode { /// Localized one-line hint for the mode picker (user-facing surface only). #[must_use] - pub fn picker_hint_localized(self, locale: Locale) -> &'static str { + pub fn picker_hint_localized(self, locale: Locale) -> Cow<'static, str> { tr( locale, match self { @@ -1163,7 +1164,7 @@ pub enum VimMode { impl VimMode { /// Localized status-bar label shown in the composer border (user-facing). #[must_use] - pub fn label_localized(self, locale: Locale) -> &'static str { + pub fn label_localized(self, locale: Locale) -> Cow<'static, str> { tr( locale, match self { @@ -2219,7 +2220,7 @@ impl App { self.last_pinned_prefix_hash = None; } - pub fn tr(&self, id: MessageId) -> &'static str { + pub fn tr(&self, id: MessageId) -> Cow<'static, str> { tr(self.ui_locale, id) } diff --git a/crates/tui/src/tui/command_palette.rs b/crates/tui/src/tui/command_palette.rs index 637614eb32..a9500c0200 100644 --- a/crates/tui/src/tui/command_palette.rs +++ b/crates/tui/src/tui/command_palette.rs @@ -1452,7 +1452,7 @@ mod tests { assert!( entry .description - .contains(command.description_for(Locale::En)), + .contains(&*command.description_for(Locale::En)), "/{} palette description should include command help text", command.name ); diff --git a/crates/tui/src/tui/context_inspector.rs b/crates/tui/src/tui/context_inspector.rs index b4a4c21d96..b85d27cf5e 100644 --- a/crates/tui/src/tui/context_inspector.rs +++ b/crates/tui/src/tui/context_inspector.rs @@ -1,5 +1,6 @@ //! Compact session context inspector. +use std::borrow::Cow; use std::collections::HashSet; use std::fmt::Write; @@ -70,7 +71,7 @@ enum PromptLayerKind { } impl PromptLayerKind { - fn label(self, locale: Locale) -> &'static str { + fn label(self, locale: Locale) -> Cow<'static, str> { match self { Self::Static => tr(locale, MessageId::CtxInspCacheFriendly), Self::Dynamic => tr(locale, MessageId::CtxInspChangesByTurn), @@ -139,7 +140,7 @@ pub fn build_context_inspector_text(app: &App, locale: Locale) -> String { tr(locale, MessageId::CtxInspWorkspaceStatus), app.workspace_context .as_deref() - .unwrap_or(tr(locale, MessageId::CtxInspNotSampledYet)) + .unwrap_or(&*tr(locale, MessageId::CtxInspNotSampledYet)) ); let _ = writeln!(out); @@ -244,7 +245,7 @@ fn push_system_prompt_structure(out: &mut String, app: &App, locale: Locale) { let _ = writeln!( out, " {first_line_lbl}: {}", - block.text.lines().next().unwrap_or(empty_lbl) + block.text.lines().next().unwrap_or(&*empty_lbl) ); } else { let _ = writeln!(out, " {volatile_lbl}: {none_lbl}"); @@ -401,7 +402,7 @@ fn push_tools(out: &mut String, app: &App, locale: Locale) { let mut rendered = 0usize; for detail in app.active_tool_details.values() { let location = tr(locale, MessageId::CtxInspActive); - push_tool_row(out, locale, location, detail); + push_tool_row(out, locale, &location, detail); rendered += 1; if rendered >= MAX_TOOL_ROWS { return; diff --git a/crates/tui/src/tui/keybindings.rs b/crates/tui/src/tui/keybindings.rs index fb9b0f4821..6b85074ffd 100644 --- a/crates/tui/src/tui/keybindings.rs +++ b/crates/tui/src/tui/keybindings.rs @@ -21,6 +21,8 @@ //! pairs (`↑/↓`) or families (`1-8`) that don't map cleanly to a single //! chord. +use std::borrow::Cow; + #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum KeybindingSection { Navigation, @@ -33,7 +35,7 @@ pub enum KeybindingSection { } impl KeybindingSection { - pub fn label(self, locale: crate::localization::Locale) -> &'static str { + pub fn label(self, locale: crate::localization::Locale) -> Cow<'static, str> { use crate::localization::{MessageId, tr}; let id = match self { Self::Navigation => MessageId::HelpSectionNavigation, diff --git a/crates/tui/src/tui/views/help.rs b/crates/tui/src/tui/views/help.rs index 33947430ef..6852d0165c 100644 --- a/crates/tui/src/tui/views/help.rs +++ b/crates/tui/src/tui/views/help.rs @@ -12,6 +12,8 @@ //! ten rows, `Home`/`End` jump to ends, and `Esc` closes. Pressing `?` again //! at the call-site (`tui::ui`) also toggles the overlay closed. +use std::borrow::Cow; + use crossterm::event::{KeyCode, KeyEvent, KeyModifiers, MouseEvent, MouseEventKind}; use ratatui::{ buffer::Buffer, @@ -36,7 +38,7 @@ enum HelpSection { } impl HelpSection { - fn label(self, locale: Locale) -> &'static str { + fn label(self, locale: Locale) -> Cow<'static, str> { match self { Self::Command => tr(locale, MessageId::HelpSlashCommands), Self::Keybinding => tr(locale, MessageId::HelpKeybindings), @@ -107,7 +109,7 @@ impl HelpView { view } - fn tr(&self, id: MessageId) -> &'static str { + fn tr(&self, id: MessageId) -> Cow<'static, str> { tr(self.locale, id) } diff --git a/crates/tui/src/tui/views/mod.rs b/crates/tui/src/tui/views/mod.rs index fefe20b091..ec6df833c9 100644 --- a/crates/tui/src/tui/views/mod.rs +++ b/crates/tui/src/tui/views/mod.rs @@ -1,5 +1,6 @@ use crossterm::event::{KeyCode, KeyEvent, KeyModifiers, MouseButton, MouseEvent, MouseEventKind}; use ratatui::{buffer::Buffer, layout::Rect}; +use std::borrow::Cow; use std::cell::{Cell, RefCell}; use std::fmt; @@ -393,7 +394,7 @@ enum ConfigScope { } impl ConfigScope { - fn label(self, locale: Locale) -> &'static str { + fn label(self, locale: Locale) -> Cow<'static, str> { tr( locale, match self { @@ -433,7 +434,7 @@ enum ConfigSection { } impl ConfigSection { - fn label(self, locale: Locale) -> &'static str { + fn label(self, locale: Locale) -> Cow<'static, str> { tr( locale, match self { @@ -522,7 +523,7 @@ impl ConfigView { value: settings .default_model .as_deref() - .unwrap_or(tr(app.ui_locale, MessageId::ConfigDefaultValue)) + .unwrap_or(&*tr(app.ui_locale, MessageId::ConfigDefaultValue)) .to_string(), editable: true, scope: ConfigScope::Saved, @@ -813,7 +814,7 @@ impl ConfigView { } } - fn tr(&self, id: MessageId) -> &'static str { + fn tr(&self, id: MessageId) -> Cow<'static, str> { tr(self.locale, id) } @@ -1714,7 +1715,7 @@ impl ModalView for ConfigView { let value = truncate_view_text(&self.row_display_value(row), value_column_width); let scope = - truncate_view_text(row.scope.label(self.locale), scope_column_width); + truncate_view_text(&row.scope.label(self.locale), scope_column_width); let mut line = Line::from(format!( " {key: Vec<&'static str> { + fn visible_section_labels(view: &ConfigView) -> Vec> { view.visible_items() .into_iter() .filter_map(|item| match item { @@ -3260,7 +3262,7 @@ base_url = "https://api.xiaomimimo.com/v1" assert!(view.editing.is_none()); assert_eq!( view.status.as_deref(), - Some(tr(Locale::En, MessageId::ConfigEditCancelled)) + Some(&*tr(Locale::En, MessageId::ConfigEditCancelled)) ); } diff --git a/crates/tui/src/tui/views/mode_picker.rs b/crates/tui/src/tui/views/mode_picker.rs index a0220793c6..00e1d7eb22 100644 --- a/crates/tui/src/tui/views/mode_picker.rs +++ b/crates/tui/src/tui/views/mode_picker.rs @@ -151,7 +151,7 @@ impl ModalView for ModePickerView { let name = mode.display_name_localized(self.locale); // Pad by terminal columns, not scalar count, so wide (CJK) mode // names keep the hint column aligned. - let pad = " ".repeat(7usize.saturating_sub(UnicodeWidthStr::width(name))); + let pad = " ".repeat(7usize.saturating_sub(UnicodeWidthStr::width(&*name))); lines.push(Line::from(vec![ Span::styled( diff --git a/crates/tui/src/tui/widgets/footer.rs b/crates/tui/src/tui/widgets/footer.rs index 6c5c2c726b..637e66b311 100644 --- a/crates/tui/src/tui/widgets/footer.rs +++ b/crates/tui/src/tui/widgets/footer.rs @@ -146,7 +146,7 @@ pub fn footer_working_label(frame: u64, locale: Locale) -> String { let dots = (frame % 4) as usize; let base = tr(locale, MessageId::FooterWorking); let mut out = String::with_capacity(base.len() + dots); - out.push_str(base); + out.push_str(&base); for _ in 0..dots { out.push('.'); } diff --git a/crates/tui/src/tui/widgets/mod.rs b/crates/tui/src/tui/widgets/mod.rs index 9c05e88a2e..4268b64bbb 100644 --- a/crates/tui/src/tui/widgets/mod.rs +++ b/crates/tui/src/tui/widgets/mod.rs @@ -22,6 +22,7 @@ pub use footer::{ pub use header::{HeaderData, HeaderWidget, header_status_indicator_frame}; pub use renderable::Renderable; +use std::borrow::Cow; use std::collections::HashSet; use std::time::Duration; @@ -744,15 +745,18 @@ impl Renderable for ComposerWidget<'_> { .border_style(Style::default().fg(border_color)) .style(background); if self.app.is_history_search_active() || is_draft_mode { - block = block.title(Line::from(Span::styled( - if self.app.is_history_search_active() { + block = if self.app.is_history_search_active() { + block.title(Line::from(Span::styled( self.app - .tr(crate::localization::MessageId::HistorySearchTitle) - } else { - "Draft" - }, - Style::default().fg(palette::TEXT_MUTED), - ))); + .tr(crate::localization::MessageId::HistorySearchTitle), + Style::default().fg(palette::TEXT_MUTED), + ))) + } else { + block.title(Line::from(Span::styled( + "Draft", + Style::default().fg(palette::TEXT_MUTED), + ))) + }; } // Top-right corner: editor state plus transient turn receipts. // Receipts are lifecycle chrome, not transcript content; they @@ -827,10 +831,12 @@ impl Renderable for ComposerWidget<'_> { let placeholder: &str = if let Some(ref suggestion) = self.app.prompt_suggestion { suggestion.as_str() } else if self.app.is_history_search_active() { - self.app + &self + .app .tr(crate::localization::MessageId::HistorySearchPlaceholder) } else { - self.app + &self + .app .tr(crate::localization::MessageId::ComposerPlaceholder) }; placeholder_visual_lines_for(placeholder, content_width) @@ -1134,10 +1140,12 @@ impl Renderable for ComposerWidget<'_> { let placeholder: &str = if let Some(ref suggestion) = self.app.prompt_suggestion { suggestion.as_str() } else if self.app.is_history_search_active() { - self.app + &self + .app .tr(crate::localization::MessageId::HistorySearchPlaceholder) } else { - self.app + &self + .app .tr(crate::localization::MessageId::ComposerPlaceholder) }; placeholder_visual_lines_for(placeholder, content_width) @@ -1306,7 +1314,11 @@ impl Renderable for ApprovalWidget<'_> { let summary_lines: Vec<&str> = summary.lines().collect(); let intent_lines = if compact_vertical { 1 } else { 3 }; for (i, sline) in summary_lines.iter().take(intent_lines).enumerate() { - let prefix = if i == 0 { intent_label } else { " " }; + let prefix = if i == 0 { + intent_label.clone() + } else { + Cow::Borrowed(" ") + }; let truncated = crate::utils::truncate_with_ellipsis(sline, max_width, "..."); lines.push(Line::from(vec![ Span::raw(" "), @@ -1567,14 +1579,14 @@ fn approval_option_style(is_selected: bool, color: Color) -> Style { } } -fn risk_badge_text(risk: RiskLevel, locale: Locale) -> &'static str { +fn risk_badge_text(risk: RiskLevel, locale: Locale) -> Cow<'static, str> { match risk { RiskLevel::Benign => tr(locale, MessageId::ApprovalRiskReview), RiskLevel::Destructive => tr(locale, MessageId::ApprovalRiskDestructive), } } -fn category_label_for(category: ToolCategory, locale: Locale) -> (&'static str, Color) { +fn category_label_for(category: ToolCategory, locale: Locale) -> (Cow<'static, str>, Color) { let label = match category { ToolCategory::Safe => tr(locale, MessageId::ApprovalCategorySafe), ToolCategory::FileWrite => tr(locale, MessageId::ApprovalCategoryFileWrite), @@ -1596,23 +1608,23 @@ fn category_label_for(category: ToolCategory, locale: Locale) -> (&'static str, (label, color) } -fn approval_word(locale: Locale) -> &'static str { +fn approval_word(locale: Locale) -> Cow<'static, str> { tr(locale, MessageId::ApprovalBlockTitle) } -fn label_type(locale: Locale) -> &'static str { +fn label_type(locale: Locale) -> Cow<'static, str> { tr(locale, MessageId::ApprovalFieldType) } -fn label_about(locale: Locale) -> &'static str { +fn label_about(locale: Locale) -> Cow<'static, str> { tr(locale, MessageId::ApprovalFieldAbout) } -fn label_impact(locale: Locale) -> &'static str { +fn label_impact(locale: Locale) -> Cow<'static, str> { tr(locale, MessageId::ApprovalFieldImpact) } -fn label_params(locale: Locale) -> &'static str { +fn label_params(locale: Locale) -> Cow<'static, str> { tr(locale, MessageId::ApprovalFieldParams) } @@ -1768,7 +1780,7 @@ fn destructive_approval_semantics(locale: Locale) -> [(&'static str, &'static st } } -fn footer_controls(locale: Locale) -> &'static str { +fn footer_controls(locale: Locale) -> Cow<'static, str> { tr(locale, MessageId::ApprovalControlsHint) } @@ -1779,16 +1791,16 @@ fn save_ask_rule_hint(locale: Locale) -> &'static str { } } -fn selection_hint_prefix(locale: Locale) -> &'static str { +fn selection_hint_prefix(locale: Locale) -> Cow<'static, str> { tr(locale, MessageId::ApprovalChooseHint) } -fn selection_hint_value(locale: Locale) -> &'static str { +fn selection_hint_value(locale: Locale) -> Cow<'static, str> { tr(locale, MessageId::ApprovalChooseAction) } struct ApprovalOptionRow { - label: &'static str, + label: Cow<'static, str>, key_hint: &'static str, dangerous: bool, } @@ -1819,19 +1831,19 @@ fn approval_options_for(risk: RiskLevel, locale: Locale) -> [ApprovalOptionRow; ] } -fn option_approve_once(locale: Locale) -> &'static str { +fn option_approve_once(locale: Locale) -> Cow<'static, str> { tr(locale, MessageId::ApprovalOptionApproveOnce) } -fn option_approve_always(locale: Locale) -> &'static str { +fn option_approve_always(locale: Locale) -> Cow<'static, str> { tr(locale, MessageId::ApprovalOptionApproveAlways) } -fn option_deny(locale: Locale) -> &'static str { +fn option_deny(locale: Locale) -> Cow<'static, str> { tr(locale, MessageId::ApprovalOptionDeny) } -fn option_abort(locale: Locale) -> &'static str { +fn option_abort(locale: Locale) -> Cow<'static, str> { tr(locale, MessageId::ApprovalOptionAbortTurn) } @@ -2253,7 +2265,7 @@ fn composer_top_right_chrome(app: &App, area_width: u16) -> Option let receipt_text = receipt.trim(); if app.composer.vim_enabled { let vim_label = app.composer.vim_mode.label_localized(app.ui_locale); - let vim_width = UnicodeWidthStr::width(vim_label); + let vim_width = UnicodeWidthStr::width(&*vim_label); let sep_width = UnicodeWidthStr::width(" · "); if vim_width + sep_width + 4 <= max_width { let receipt_width = max_width.saturating_sub(vim_width + sep_width); @@ -2278,7 +2290,7 @@ fn composer_top_right_chrome(app: &App, area_width: u16) -> Option if app.composer.vim_enabled { spans.push(Span::styled( truncate_display_width( - app.composer.vim_mode.label_localized(app.ui_locale), + &app.composer.vim_mode.label_localized(app.ui_locale), max_width, ), vim_mode_style(app.composer.vim_mode), @@ -4125,7 +4137,7 @@ mod tests { assert!(!normal_rendered.contains("Draft")); assert!( !normal_rendered - .contains(normal_app.tr(crate::localization::MessageId::HistorySearchTitle)) + .contains(&*normal_app.tr(crate::localization::MessageId::HistorySearchTitle)) ); let mut draft_app = create_test_app(); @@ -4146,7 +4158,7 @@ mod tests { search_widget.render(area, &mut search_buf); assert!( buffer_text(&search_buf, area) - .contains(search_app.tr(crate::localization::MessageId::HistorySearchTitle)) + .contains(&*search_app.tr(crate::localization::MessageId::HistorySearchTitle)) ); }