# Hermes static-message catalog -- English (baseline / source of truth) # # Only user-facing static messages from the CLI approval prompt and a handful # of gateway slash-command replies live here. Agent-generated output, log # lines, error tracebacks, tool outputs, and slash-command descriptions stay # in English and are NOT translated -- see agent/i18n.py for scope rationale. # # Keys are dotted paths; nesting below is purely for readability. Values may # contain {placeholder} tokens for str.format substitution. When adding a # new key, add it to EVERY locale file (en/zh/ja/de/es/fr/tr/uk) in the same commit -- # tests/agent/test_i18n.py asserts catalog parity. approval: # CLI approval prompt -- shown when a dangerous command needs user review. dangerous_header: "⚠️ DANGEROUS COMMAND: {description}" choose_long: " [o]nce | [s]ession | [a]lways | [d]eny" choose_short: " [o]nce | [s]ession | [d]eny" prompt_long: " Choice [o/s/a/D]: " prompt_short: " Choice [o/s/D]: " timeout: " ⏱ Timeout - denying command" allowed_once: " ✓ Allowed once" allowed_session: " ✓ Allowed for this session" allowed_always: " ✓ Added to permanent allowlist" denied: " ✗ Denied" cancelled: " ✗ Cancelled" blocklist_message: "This command is on the unconditional blocklist and cannot be approved." gateway: # Messenger replies to slash commands and implicit state changes. approval_expired: "⚠️ Approval expired (agent is no longer waiting). Ask the agent to try again." draining: "⏳ Draining {count} active agent(s) before restart..." goal_cleared: "✓ Goal cleared." no_active_goal: "No active goal." config_read_failed: "⚠️ Could not read config.yaml: {error}" config_save_failed: "⚠️ Could not save config: {error}" # /model command output -- shown after a model switch or when listing models. # Provider names, model IDs, capability strings, and cost figures are NOT # translated -- they're identifiers/values, not prose. Only the labels # ("Provider:", "Context:", etc.) and the help/footer lines are localized. model: error_prefix: "Error: {error}" switched: "Model switched to `{model}`" provider_label: "Provider: {provider}" context_label: "Context: {tokens} tokens" max_output_label: "Max output: {tokens} tokens" cost_label: "Cost: {cost}" capabilities_label: "Capabilities: {capabilities}" prompt_caching_enabled: "Prompt caching: enabled" warning_prefix: "Warning: {warning}" saved_global: "Saved to config.yaml (`--global`)" session_only_hint: "_(session only — add `--global` to persist)_" current_label: "Current: `{model}` on {provider}" current_tag: " (current)" more_models_suffix: " (+{count} more)" usage_switch_model: "`/model ` — switch model" usage_switch_provider: "`/model --provider ` — switch provider" usage_persist: "`/model --global` — persist" agents: header: "🤖 **Active Agents & Tasks**" active_agents: "**Active agents:** {count}" this_chat: " · this chat" more: "... and {count} more" running_processes: "**Running background processes:** {count}" async_jobs: "**Gateway async jobs:** {count}" none: "No active agents or running tasks." state_starting: "starting" state_running: "running" approve: no_pending: "No pending command to approve." once_singular: "✅ Command approved. The agent is resuming..." once_plural: "✅ Commands approved ({count} commands). The agent is resuming..." session_singular: "✅ Command approved (pattern approved for this session). The agent is resuming..." session_plural: "✅ Commands approved (pattern approved for this session) ({count} commands). The agent is resuming..." always_singular: "✅ Command approved (pattern approved permanently). The agent is resuming..." always_plural: "✅ Commands approved (pattern approved permanently) ({count} commands). The agent is resuming..." background: usage: "Usage: /background \nExample: /background Summarize the top HN stories today\n\nRuns the prompt in a separate session. You can keep chatting — the result will appear here when done." started: "🔄 Background task started: \"{preview}\"\nTask ID: {task_id}\nYou can keep chatting — results will appear when done." branch: db_unavailable: "Session database not available." no_conversation: "No conversation to branch — send a message first." create_failed: "Failed to create branch: {error}" switch_failed: "Branch created but failed to switch to it." branched_one: "⑂ Branched to **{title}** ({count} message copied)\nOriginal: `{parent}`\nBranch: `{new}`\nUse `/resume` to switch back to the original." branched_many: "⑂ Branched to **{title}** ({count} messages copied)\nOriginal: `{parent}`\nBranch: `{new}`\nUse `/resume` to switch back to the original." commands: usage: "Usage: `/commands [page]`" skill_header: "⚡ **Skill Commands**:" default_desc: "Skill command" none: "No commands available." header: "📚 **Commands** ({total} total, page {page}/{total_pages})" nav_prev: "`/commands {page}` ← prev" nav_next: "next → `/commands {page}`" out_of_range: "_(Requested page {requested} was out of range, showing page {page}.)_" compress: not_enough: "Not enough conversation to compress (need at least 4 messages)." no_provider: "No provider configured -- cannot compress." nothing_to_do: "Nothing to compress yet (the transcript is still all protected context)." focus_line: "Focus: \"{topic}\"" summary_failed: "⚠️ Summary generation failed ({error}). {count} historical message(s) were removed and replaced with a placeholder; earlier context is no longer recoverable. Consider checking your auxiliary.compression model configuration." aux_failed: "ℹ️ Configured compression model `{model}` failed ({error}). Recovered using your main model — context is intact — but you may want to check `auxiliary.compression.model` in config.yaml." failed: "Compression failed: {error}" debug: upload_failed: "✗ Failed to upload debug report: {error}" header: "**Debug report uploaded:**" auto_delete: "⏱ Pastes will auto-delete in 6 hours." full_logs_hint: "For full log uploads, use `hermes debug share` from the CLI." share_hint: "Share these links with the Hermes team for support." deny: stale: "❌ Command denied (approval was stale)." no_pending: "No pending command to deny." denied_singular: "❌ Command denied." denied_plural: "❌ Commands denied ({count} commands)." fast: not_supported: "⚡ /fast is only available for OpenAI models that support Priority Processing." status: "⚡ Priority Processing\n\nCurrent mode: `{mode}`\n\n_Usage:_ `/fast `" unknown_arg: "⚠️ Unknown argument: `{arg}`\n\n**Valid options:** normal, fast, status" saved: "⚡ ✓ Priority Processing: **{label}** (saved to config)\n_(takes effect on next message)_" session_only: "⚡ ✓ Priority Processing: **{label}** (this session only)" label_fast: "FAST" label_normal: "NORMAL" status_fast: "fast" status_normal: "normal" footer: status: "📎 Runtime footer: **{state}**\nFields: `{fields}`\nPlatform: `{platform}`" usage: "Usage: `/footer [on|off|status]`" saved: "📎 Runtime footer: **{state}**{example}\n_(saved globally — takes effect on next message)_" example_line: "\nExample: `{preview}`" state_on: "ON" state_off: "OFF" goal: unavailable: "Goals unavailable on this session." no_goal_set: "No goal set." paused: "⏸ Goal paused: {goal}" no_resume: "No goal to resume." resumed: "▶ Goal resumed: {goal}\nSend any message to continue, or wait — I'll take the next step on the next turn." invalid: "Invalid goal: {error}" set: "⊙ Goal set ({budget}-turn budget): {goal}\nI'll keep working until the goal is done, you pause/clear it, or the budget is exhausted.\nControls: /goal status · /goal pause · /goal resume · /goal clear" help: header: "📖 **Hermes Commands**\n" skill_header: "\n⚡ **Skill Commands** ({count} active):" more_use_commands: "\n... and {count} more. Use `/commands` for the full paginated list." insights: invalid_days: "Invalid --days value: {value}" error: "Error generating insights: {error}" kanban: error_prefix: "⚠ kanban error: {error}" subscribed_suffix: "(subscribed — you'll be notified when {task_id} completes or blocks)" truncated_suffix: "… (truncated; use `hermes kanban …` in your terminal for full output)" no_output: "(no output)" personality: none_configured: "No personalities configured in `{path}/config.yaml`" header: "🎭 **Available Personalities**\n" none_option: "• `none` — (no personality overlay)" item: "• `{name}` — {preview}" usage: "\nUsage: `/personality `" save_failed: "⚠️ Failed to save personality change: {error}" cleared: "🎭 Personality cleared — using base agent behavior.\n_(takes effect on next message)_" set_to: "🎭 Personality set to **{name}**\n_(takes effect on next message)_" unknown: "Unknown personality: `{name}`\n\nAvailable: {available}" profile: header: "👤 **Profile:** `{profile}`" home: "📂 **Home:** `{home}`" reasoning: level_default: "medium (default)" level_disabled: "none (disabled)" scope_session: "session override" scope_global: "global config" status: "🧠 **Reasoning Settings**\n\n**Effort:** `{level}`\n**Scope:** {scope}\n**Display:** {display}\n\n_Usage:_ `/reasoning [--global]`" display_on: "on ✓" display_off: "off" display_set_on: "🧠 ✓ Reasoning display: **ON**\nModel thinking will be shown before each response on **{platform}**." display_set_off: "🧠 ✓ Reasoning display: **OFF** for **{platform}**" reset_global_unsupported: "⚠️ `/reasoning reset --global` is not supported. Use `/reasoning --global` to change the global default." reset_done: "🧠 ✓ Session reasoning override cleared; falling back to global config." unknown_arg: "⚠️ Unknown argument: `{arg}`\n\n**Valid levels:** none, minimal, low, medium, high, xhigh\n**Display:** show, hide\n**Persist:** add `--global` to save beyond this session" set_global: "🧠 ✓ Reasoning effort set to `{effort}` (saved to config)\n_(takes effect on next message)_" set_global_save_failed: "🧠 ✓ Reasoning effort set to `{effort}` (session only — config save failed)\n_(takes effect on next message)_" set_session: "🧠 ✓ Reasoning effort set to `{effort}` (session only — add `--global` to persist)\n_(takes effect on next message)_" reload_mcp: cancelled: "🟡 /reload-mcp cancelled. MCP tools unchanged." always_followup: "ℹ️ Future `/reload-mcp` calls will run without confirmation. Re-enable via `approvals.mcp_reload_confirm: true` in config.yaml." confirm_prompt: "⚠️ **Confirm /reload-mcp**\n\nReloading MCP servers rebuilds the tool set for this session and **invalidates the provider prompt cache** — the next message will re-send full input tokens. On long-context or high-reasoning models this can be expensive.\n\nChoose:\n• **Approve Once** — reload now\n• **Always Approve** — reload now and silence this prompt permanently\n• **Cancel** — leave MCP tools unchanged\n\n_Text fallback: reply `/approve`, `/always`, or `/cancel`._" header: "🔄 **MCP Servers Reloaded**\n" reconnected: "♻️ Reconnected: {names}" added: "➕ Added: {names}" removed: "➖ Removed: {names}" none_connected: "No MCP servers connected." tools_available: "\n🔧 {tools} tool(s) available from {servers} server(s)" failed: "❌ MCP reload failed: {error}" reload_skills: header: "🔄 **Skills Reloaded**\n" no_new: "No new skills detected." total: "\n📚 {count} skill(s) available" added_header: "➕ **Added Skills:**" removed_header: "➖ **Removed Skills:**" item_with_desc: " - {name}: {desc}" item_no_desc: " - {name}" failed: "❌ Skills reload failed: {error}" reset: header_default: "✨ Session reset! Starting fresh." header_new: "✨ New session started!" header_titled: "✨ New session started: {title}" title_rejected: "\n⚠️ Title rejected: {error}" title_error_untitled: "\n⚠️ {error} — session started untitled." title_empty_untitled: "\n⚠️ Title is empty after cleanup — session started untitled." tip: "\n✦ Tip: {tip}" restart: in_progress: "⏳ Gateway restart already in progress..." restarting: "♻ Restarting gateway. If you aren't notified within 60 seconds, restart from the console with `hermes gateway restart`." resume: db_unavailable: "Session database not available." no_named_sessions: "No named sessions found.\nUse `/title My Session` to name your current session, then `/resume My Session` to return to it later." list_header: "📋 **Named Sessions**\n" list_item: "• **{title}**{preview_part}" list_preview_suffix: " — _{preview}_" list_footer: "\nUsage: `/resume `" list_failed: "Could not list sessions: {error}" not_found: "No session found matching '**{name}**'.\nUse `/resume` with no arguments to see available sessions." already_on: "📌 Already on session **{name}**." switch_failed: "Failed to switch session." resumed_one: "↻ Resumed session **{title}** ({count} message). Conversation restored." resumed_many: "↻ Resumed session **{title}** ({count} messages). Conversation restored." resumed_no_count: "↻ Resumed session **{title}**. Conversation restored." retry: no_previous: "No previous message to retry." rollback: not_enabled: "Checkpoints are not enabled.\nEnable in config.yaml:\n```\ncheckpoints:\n enabled: true\n```" none_found: "No checkpoints found for {cwd}" invalid_number: "Invalid checkpoint number. Use 1-{max}." restored: "✅ Restored to checkpoint {hash}: {reason}\nA pre-rollback snapshot was saved automatically." restore_failed: "❌ {error}" set_home: save_failed: "Failed to save home channel: {error}" success: "✅ Home channel set to **{name}** (ID: {chat_id}).\nCron jobs and cross-platform messages will be delivered here." status: header: "📊 **Hermes Gateway Status**" session_id: "**Session ID:** `{session_id}`" title: "**Title:** {title}" created: "**Created:** {timestamp}" last_activity: "**Last Activity:** {timestamp}" tokens: "**Tokens:** {tokens}" agent_running: "**Agent Running:** {state}" state_yes: "Yes ⚡" state_no: "No" queued: "**Queued follow-ups:** {count}" platforms: "**Connected Platforms:** {platforms}" stop: stopped_pending: "⚡ Stopped. The agent hadn't started yet — you can continue this session." stopped: "⚡ Stopped. You can continue this session." no_active: "No active task to stop." title: db_unavailable: "Session database not available." warn_prefix: "⚠️ {error}" empty_after_clean: "⚠️ Title is empty after cleanup. Please use printable characters." set_to: "✏️ Session title set: **{title}**" not_found: "Session not found in database." current_with_title: "📌 Session: `{session_id}`\nTitle: **{title}**" current_no_title: "📌 Session: `{session_id}`\nNo title set. Usage: `/title My Session Name`" topic: not_telegram_dm: "The /topic command is only available in Telegram private chats." no_session_db: "Session database not available." unauthorized: "You are not authorized to use /topic on this bot." restore_needs_topic: "To restore a session, first create or open a Telegram topic, then send /topic inside that topic. To create a new topic, open All Messages and send any message there." topics_disabled: "Telegram topics are not enabled for this bot yet.\n\nHow to enable them:\n1. Open @BotFather.\n2. Choose your bot.\n3. Open Bot Settings → Threads Settings.\n4. Turn on Threaded Mode and make sure users are allowed to create new threads.\n\nThen send /topic again." topics_user_disallowed: "Telegram topics are enabled, but users are not allowed to create topics.\n\nOpen @BotFather → choose your bot → Bot Settings → Threads Settings, then turn off 'Disallow users to create new threads'.\n\nThen send /topic again." enable_failed: "Failed to enable Telegram topic mode: {error}" bound_status: "This topic is linked to:\nSession: {label}\nID: {session_id}\n\nUse /new to replace this topic with a fresh session.\nFor parallel work, open All Messages and send a message there to create another topic." thread_ready: "Telegram multi-session topics are enabled.\n\nThis topic will be used as an independent Hermes session. Use /new to replace this topic's current session. For parallel work, open All Messages and send a message there to create another topic." untitled_session: "Untitled session" undo: nothing: "Nothing to undo." removed: "↩️ Undid {count} message(s).\nRemoved: \"{preview}\"" update: platform_not_messaging: "✗ /update is only available from messaging platforms. Run `hermes update` from the terminal." not_git_repo: "✗ Not a git repository — cannot update." hermes_cmd_not_found: "✗ Could not locate the `hermes` command. Hermes is running, but the update command could not find the executable on PATH or via the current Python interpreter. Try running `hermes update` manually in your terminal." start_failed: "✗ Failed to start update: {error}" starting: "⚕ Starting Hermes update… I'll stream progress here." usage: rate_limits: "⏱️ **Rate Limits:** {state}" header_session: "📊 **Session Token Usage**" label_model: "Model: `{model}`" label_input_tokens: "Input tokens: {count}" label_cache_read: "Cache read tokens: {count}" label_cache_write: "Cache write tokens: {count}" label_output_tokens: "Output tokens: {count}" label_total: "Total: {count}" label_api_calls: "API calls: {count}" label_cost: "Cost: {prefix}${amount}" label_cost_included: "Cost: included" label_context: "Context: {used} / {total} ({pct}%)" label_compressions: "Compressions: {count}" header_session_info: "📊 **Session Info**" label_messages: "Messages: {count}" label_estimated_context: "Estimated context: ~{count} tokens" detailed_after_first: "_(Detailed usage available after the first agent response)_" no_data: "No usage data available for this session." verbose: not_enabled: "The `/verbose` command is not enabled for messaging platforms.\n\nEnable it in `config.yaml`:\n```yaml\ndisplay:\n tool_progress_command: true\n```" mode_off: "⚙️ Tool progress: **OFF** — no tool activity shown." mode_new: "⚙️ Tool progress: **NEW** — shown when tool changes (preview length: `display.tool_preview_length`, default 40)." mode_all: "⚙️ Tool progress: **ALL** — every tool call shown (preview length: `display.tool_preview_length`, default 40)." mode_verbose: "⚙️ Tool progress: **VERBOSE** — every tool call with full arguments." saved_suffix: "_(saved for **{platform}** — takes effect on next message)_" save_failed: "_(could not save to config: {error})_" voice: enabled_voice_only: "Voice mode enabled.\nI'll reply with voice when you send voice messages.\nUse /voice tts to get voice replies for all messages." disabled_text: "Voice mode disabled. Text-only replies." tts_enabled: "Auto-TTS enabled.\nAll replies will include a voice message." status_mode: "Voice mode: {label}" status_channel: "Voice channel: #{channel}" status_participants: "Participants: {count}" status_member: " - {name}{status}" speaking: " (speaking)" enabled_short: "Voice mode enabled." disabled_short: "Voice mode disabled." label_off: "Off (text only)" label_voice_only: "On (voice reply to voice messages)" label_all: "TTS (voice reply to all messages)" yolo: disabled: "⚠️ YOLO mode **OFF** for this session — dangerous commands will require approval." enabled: "⚡ YOLO mode **ON** for this session — all commands auto-approved. Use with caution." shared: session_db_unavailable: "Session database not available." session_db_unavailable_prefix: "Session database not available" session_not_found: "Session not found in database." warn_passthrough: "⚠️ {error}"