// ── i18n: locale bundles and t() helper ──────────────────────────────────────
// To add a new language: add an entry to LOCALES below with all keys translated.
// The language code must match a valid BCP 47 tag (used for speech recognition).
// Keys missing in a non-English locale fall back to English automatically.

const LOCALES = {
  en: {
    offline_title: 'Connection lost',
    offline_browser_detail: 'Your browser reports that this device is offline.',
    offline_network_detail: 'Hermes is unreachable from this browser right now.',
    offline_autorefresh: 'I will refresh this page automatically when Hermes is reachable again.',
    offline_check_now: 'Check now',
    offline_checking: 'Checking…',
    offline_stream_waiting: 'Connection lost. Waiting to refresh…',
    _lang: 'en',
    _label: 'English',
    _speech: 'en-US',
    // boot.js
    cancelling: 'Cancelling\u2026',
    cancel_failed: 'Cancel failed: ',
    mic_denied: 'Microphone access denied. Check browser permissions.',
    mic_no_speech: 'No speech detected. Try again.',
    mic_network: 'Speech recognition unavailable.',
    mic_error: 'Voice input error: ',
    // Composer voice buttons (#1488 — distinct labels for dictation vs voice mode)
    voice_dictate: 'Dictate',
    voice_dictate_active: 'Stop dictation',
    voice_recording_active: 'Stop recording',
    voice_mode_toggle: 'Voice mode',
    voice_mode_toggle_active: 'Exit voice mode',
    // Turn-based voice mode (#1333)
    voice_listening: 'Listening…',
    voice_speaking: 'Speaking…',
    voice_thinking: 'Thinking…',
    voice_error: 'Voice not supported in this browser',
    voice_mode_active: 'Voice mode on',
    voice_mode_off: 'Voice mode off',
    session_imported: 'Session imported',
    import_failed: 'Import failed: ',
    import_invalid_json: 'Invalid JSON',
    image_pasted: 'Image pasted: ',
    // messages.js
    edit_message: 'Edit message',
    regenerate: 'Regenerate response',
    copy: 'Copy',
    copied: 'Copied!',
    copy_failed: 'Copy failed',
    selected_text_reply: 'Reply with selection',
    selected_text_reply_title: 'Append selected chat text as quoted context',
    selected_text_reply_appended: 'Selected text added to composer',
    saved_prompts_empty: 'No saved prompts yet.',
    saved_prompts_save_current: 'Save current input as prompt',
    saved_prompts_saved: 'Prompt saved',
    saved_prompts_delete: 'Delete prompt',
    saved_prompts_empty_input: 'Type a prompt to save first',

    diff_loading: 'Loading diff',
    diff_error: 'Could not load patch file',
    diff_too_large: 'Patch file too large to display inline',
    tree_view: 'Tree',
    raw_view: 'Raw',
    parse_failed_note: 'parse failed',
    you: 'You',
    mcp_servers_title: 'MCP Servers',
    mcp_servers_desc: 'View MCP servers configured in config.yaml.',
    mcp_no_servers: 'No MCP servers configured.',
    mcp_add_server: '+ Add Server',
    mcp_field_name: 'Server Name',
    mcp_transport_label: 'Transport Type',
    mcp_field_command: 'Command',
    mcp_field_args: 'Arguments (comma-separated)',
    mcp_field_url: 'URL',
    mcp_field_timeout: 'Timeout (seconds)',
    mcp_save: 'Save',
    mcp_cancel: 'Cancel',
    mcp_name_required: 'Server name is required.',
    mcp_url_required: 'URL is required for HTTP transport.',
    mcp_command_required: 'Command is required for stdio transport.',
    mcp_saved: 'MCP server saved.',
    mcp_save_failed: 'Failed to save MCP server.',
    mcp_delete_confirm_title: 'Delete MCP Server',
    mcp_delete_confirm_message: 'Delete MCP server "{0}"? This action cannot be undone.',
    mcp_deleted: 'MCP server deleted.',
    mcp_delete_failed: 'Failed to delete MCP server.',
    mcp_load_failed: 'Failed to load MCP servers.',
    mcp_restart_hint: 'Server changes are read-only here for now. Edit config.yaml and restart Hermes for changes to take effect.',
    mcp_toggle_followup: 'Enable/disable controls are intentionally deferred until MCP reload semantics are explicit.',
    mcp_status_active: 'Active',
    mcp_status_configured: 'Configured',
    mcp_status_disabled: 'Disabled',
    mcp_status_invalid_config: 'Invalid config',
    mcp_status_unknown: 'Unknown',
    mcp_tool_count: '{0} tools',
    mcp_enabled_yes: 'Enabled',
    mcp_enabled_no: 'Disabled',
    mcp_enable_server: 'Enable this MCP server',
    mcp_disable_server: 'Disable this MCP server',
    mcp_enabled_toast: (name) => `MCP server "${name}" enabled.`,
    mcp_disabled_toast: (name) => `MCP server "${name}" disabled.`,
    mcp_toggle_failed: 'Failed to update MCP server.',
    mcp_tools_title: 'MCP Tools',
    mcp_tools_desc: 'Search known tools across active MCP servers.',
    mcp_tools_search_placeholder: 'Search tools by name, server, or description…',
    mcp_tools_no_tools: 'No MCP tools are available from the active runtime inventory.',
    mcp_tools_no_matches: 'No MCP tools match your search.',
    mcp_tools_load_failed: 'Failed to load MCP tools.',
    mcp_tools_schema_empty: 'No schema parameters.',
    mcp_tools_runtime_note: 'Tool inventory only uses already-known active MCP runtime data; the WebUI does not start or probe servers.',
    mcp_tools_summary_no_matches: (query,total) => `No MCP tools matching “${query}” (${total} total MCP tools).`,
    mcp_tools_summary_none: 'No MCP tools to show.',
    mcp_tools_summary_matching: (query) => ` matching “${query}”`,
    mcp_tools_summary_total_note: (total) => ` (${total} total MCP tools)`,
    mcp_tools_summary_showing: (start,end,filtered,searchNote,totalNote,page,pages) => `Showing ${start}-${end} of ${filtered} MCP tools${searchNote}${totalNote}. Page ${page} of ${pages}.`,
    mcp_tools_page_size_prefix: 'Show',
    mcp_tools_page_size_suffix: 'per page',
    mcp_tools_per_page_aria: 'MCP tools per page',
    mcp_tools_inactive_configured_servers: (servers) => `Configured but inactive in this WebUI runtime: ${servers}.`,
    mcp_tools_pagination_label: 'MCP tools pagination',
    mcp_tools_previous_page: '‹ Prev',
    mcp_tools_previous_page_aria: 'Previous MCP tools page',
    mcp_tools_next_page: 'Next ›',
    mcp_tools_next_page_aria: 'Next MCP tools page',
    // PDF preview (#480)
    pdf_loading: 'Loading PDF {0}…',
    pdf_too_large: 'PDF too large for inline preview',
    pdf_no_pages: 'PDF has no pages',
    pdf_error: 'Failed to render PDF preview',
    pdf_download: 'Download PDF',
    // HTML sandbox preview (#482)
    html_loading: 'Loading HTML preview…',
    html_too_large: 'HTML too large for inline preview',
    html_error: 'Failed to render HTML preview',
    html_open_full: 'Open full page',
    html_sandbox_label: 'HTML Preview (sandboxed)',
    thinking: 'Thinking',
    expand_all: 'Expand all',
    collapse_all: 'Collapse all',
    edit_failed: 'Edit failed: ',
    regen_failed: 'Regenerate failed: ',
    reconnect_active: 'A response is still being generated. Reload when ready?',
    reconnect_finished: 'A response was in progress when you last left. Messages may have updated.',
    // approval card
    approval_heading: 'Approval required',
    approval_desc_prefix: 'Dangerous command detected',
    approval_btn_once: 'Allow once',
    approval_btn_once_title: 'Allow this one command (Enter)',
    approval_btn_session: 'Allow session',
    approval_btn_session_title: 'Allow for this conversation session',
    approval_btn_always: 'Always allow',
    approval_btn_always_title: 'Always allow this command pattern',
    approval_btn_deny: 'Deny',
    approval_btn_deny_title: 'Deny — do not run this command',
    approval_responding: 'Responding\u2026',
    clarify_heading: 'Clarification needed',
    clarify_hint: 'Pick a choice, or type your own answer below.',
    clarify_other: 'Other',
    clarify_send: 'Send',
    clarify_input_placeholder: 'Type your response…',
    clarify_responding: 'Responding\u2026',
    session_attention_approval: (n) => n === 1 ? 'Approval' : `${n} approvals`,
    session_attention_clarify: (n) => n === 1 ? 'Question' : `${n} questions`,
    session_attention_generic: (n) => n === 1 ? 'Attention' : `${n} items`,
    session_attention_approval_title: 'Waiting for permission decision',
    session_attention_clarify_title: 'Waiting for your answer',
    session_attention_generic_title: 'Waiting for user action',
    untitled: 'Untitled',
    n_messages: (n) => `${n} messages`,
    load_older_messages: '↑ Scroll up or click to load older messages',
    session_jump_start: 'Start',
    session_jump_start_label: 'Jump to beginning of session',
    session_jump_end: 'End',
    session_jump_end_label: 'Jump to end of session',
    session_new_message: 'New message',
    session_new_message_label: 'New message available, jump to end',
    jump_to_question: 'to response',
    jump_to_question_label: 'Jump to the start of this response',
    queued_label: 'Sends after response',
    queued_count: (n) => n === 1 ? '1 queued' : `${n} queued`,
    queued_cancel: 'Cancel queued message',
    model_unavailable: ' (unavailable)',
    model_unavailable_title: 'This model is no longer in your current provider list',
    provider_mismatch_warning: (m,p)=>`"${m}" may not work with your configured provider (${p}). Send anyway, or run \`hermes model\` in your terminal to switch.`,
    provider_mismatch_label: 'Provider mismatch',
    gateway_auth_label: 'Gateway authentication failed',
    model_not_found_label: 'Model not found',
    model_custom_label: 'Custom model ID',
    model_custom_placeholder: 'e.g. openai/gpt-5.4',
    model_search_placeholder: 'Search models…',
    model_search_no_results: 'No models found',
    model_group_configured: 'Configured',
    ws_search_placeholder: 'Search workspaces…',
    ws_no_results: 'No workspaces found',
    workspace_new_worktree_conversation: 'New conversation in worktree',
    workspace_new_worktree_conversation_meta: 'Create an isolated git worktree for this workspace.',
    workspace_worktree_created: 'Worktree conversation created',
    workspace_worktree_failed: 'Worktree creation failed: ',
    session_worktree_badge: 'Worktree',
    model_scope_advisory: 'Applies to this conversation from your next message.',
    model_scope_toast: 'Applies to this conversation from your next message.',
    // commands.js
    cmd_clear: 'Clear conversation messages',
    cmd_help: 'Show available slash commands',
    cmd_compress: 'Manually compress conversation context (usage: /compress [focus topic])',
    ctx_compress_hint: 'Compress context to free up space →',
    ctx_compress_action: '⚠ Compress now to free context',
    cmd_compact_alias: 'Legacy alias for /compress',
    cmd_model: 'Switch model (e.g. /model gpt-4o)',
    cmd_workspace: 'Switch workspace by name',
    cmd_terminal: 'Open the workspace terminal',
    cmd_new: 'Start a new chat session',
    cmd_usage: 'Toggle token usage display on/off',
    cmd_theme: 'Switch appearance (theme: system/dark/light, skin: default/ares/mono/graphite/slate/poseidon/sisyphus/charizard/sienna/catppuccin/nous/geist-contrast/zeus/verdigris)',
    cmd_personality: 'Switch agent personality',
    cmd_skills: 'List available Hermes skills',
    cmd_use: 'Force a skill for the next message',
    available_commands: 'Available commands:',
    type_slash: 'Type / to see commands',
    conversation_cleared: 'Conversation cleared',
    command_label: 'Command',
    context_compaction_label: 'Context compaction',
    retrieval_context_label: 'Indexed context',
    retrieval_context_preview: 'Earlier messages are stored and retrievable with context tools',
    preserved_task_list_label: 'Preserved task list',
    reference_only_label: 'Reference only',
    model_usage: 'Usage: /model <name>',
    no_model_match: 'No model matching "',
    model_did_you_mean: (m) => ` — did you mean "${m}"?`,
    switched_to: 'Switched to ',
    workspace_usage: 'Usage: /workspace <name>',
    no_workspace_match: 'No workspace matching "',
    switched_workspace: 'Switched to workspace: ',
    workspace_switch_failed: 'Workspace switch failed: ',
    new_session: 'New session created',
    new_session_creating: 'Creating new conversation…',
    compressing: 'Requesting context compression...',
    compress_running_label: 'Compressing',
    compress_complete_label: 'Compression complete',
    auto_compress_label: 'Automatic compression',
    compress_failed_label: 'Compression failed',
    focus_label: 'Focus',
    token_usage_on: 'Token usage on',
    token_usage_off: 'Token usage off',
    usage_cache_hit_detail: 'Cache: {0}% hit ({1} read / {2} write)',
    usage_cached_percent: '{0}% cached',
    theme_usage: 'Usage: /theme ',
    theme_set: 'Theme: ',
    no_active_session: 'No active session',
    cmd_queue: 'Queue a message for the next turn',
    cmd_goal: 'Set or inspect a persistent goal',
    goal_evaluating_progress: 'Evaluating goal progress…',
    goal_working_toward: 'Working toward goal…',
    goal_continuing_toast: 'Continuing toward goal…',
    goal_status_none: 'No active goal. Set one with /goal <text>.',
    goal_status_active: (turns, max_turns, goal) => `⊙ Goal (active, ${turns}/${max_turns} turns): ${goal}`,
    goal_status_paused: (turns, max_turns, reason, goal) => `⏸ Goal (paused, ${turns}/${max_turns}${reason ? `, ${reason}` : ''}): ${goal}`,
    goal_status_done: (turns, max_turns, goal) => `✓ Goal done (${turns}/${max_turns}): ${goal}`,
    goal_set: (turns, goal) => `⊙ Goal set (${turns}-turn budget): ${goal}`,
    goal_paused: (goal) => `⏸ Goal paused: ${goal}`,
    goal_resumed: (goal) => `▶ Goal resumed: ${goal}`,
    goal_cleared: 'Goal cleared.',
    goal_no_goal: 'No active goal.',
    goal_achieved: (reason) => `✓ Goal achieved: ${reason}`,
    goal_paused_budget_exhausted: (turns, max_turns) => `⏸ Goal paused — ${turns}/${max_turns} turns used. Use /goal resume to keep going, or /goal clear to stop.`,
    goal_continuing: (turns, max_turns, reason) => `↻ Continuing toward goal (${turns}/${max_turns}): ${reason}`,
    cmd_interrupt: 'Cancel current turn and send a new message',
    cmd_steer: 'Inject a mid-turn correction without interrupting the agent',
    cmd_queue_no_msg: 'Usage: /queue <message>',
    cmd_queue_not_busy: 'No active task — just send normally',
    cmd_queue_confirm: 'Message queued',
    cmd_interrupt_no_msg: 'Usage: /interrupt <message>',
    cmd_interrupt_confirm: 'Interrupted — sending new message',
    cmd_steer_no_msg: 'Usage: /steer <message>',
    cmd_steer_fallback: 'Steer unavailable — queued for next turn instead',
    cmd_steer_delivered: 'Steer delivered — agent will see it on its next tool result',
    steer_leftover_queued: 'Steer queued for next turn',
    busy_steer_fallback: 'Steer unavailable — queued for next turn',
    busy_interrupt_confirm: 'Interrupted — sending new message',
    settings_label_busy_input_mode: 'Busy input mode',
    settings_desc_busy_input_mode: 'Controls what happens when you send a message while the agent is running. Queue waits; Interrupt cancels and starts fresh; Steer injects a correction mid-turn without interrupting (falls back to queue when agent or stream unavailable).',
    settings_label_fade_text_effect: 'Fade text effect',
    settings_desc_fade_text_effect: 'Fade newly streamed words in while the assistant is responding. Similar to OpenWebUI; off by default for maximum performance.',
    settings_busy_input_mode_queue: 'Queue follow-up',
    settings_busy_input_mode_interrupt: 'Interrupt current turn',
    settings_busy_input_mode_steer: 'Steer (mid-turn correction)',

  slash_skill_badge:'Skill',
  slash_skill_desc:'Invoke this skill',
  cmd_stop:'Stop the current response',
  cmd_title:'Get or set the session title',
  cmd_retry:'Resend the last message',
  cmd_undo:'Remove the last exchange',
  cmd_btw:'Ask a side question (ephemeral)',
  cmd_btw_usage:'/btw <question> — ask a side question using session context',
   cmd_background:'Run a prompt in background',
   cmd_background_usage:'/background <prompt> — run in parallel without blocking',
   cmd_branch:'Fork this conversation into a new session',
   cmd_branch_usage:'/branch [name] — fork conversation (optionally with a name)',
   branch_forked:'Forked into new session',
   branch_failed:'Fork failed: ',
   fork_from_here:'Fork from here',
   forked_from:'Forked from',
   subagent_children:'Subagent sessions',
   btw_asking:'Asking side question...',
  btw_label:'Side question — not in history',
  btw_done:'Side question answered',
  btw_no_answer:'No answer received.',
  btw_failed:'Side question failed: ',
  bg_running:'Running in background...',
  bg_complete:'Background task complete',
  bg_label:'Background result:',
  bg_no_answer:'(no answer)',
  bg_failed:'Background task failed: ',
  undo_exchange:'Undo last exchange',
  cmd_status:'Show session info',
  cmd_voice:'Toggle microphone input',
  stream_stopped:'Response stopped.',
  no_active_task:'No active task to stop.',
  cancel_unavailable:'Cancel not available.',
  retry_failed:'Retry failed: ',
  undo_failed:'Undo failed: ',
  undid_n_messages:'Removed',
  undid_messages_suffix:'message(s).',
  status_heading:'Session Status',
  status_session_id:'Session ID',
  status_title:'Title',
  status_model:'Model',
  status_provider:'Provider',
  status_workspace:'Workspace',
  status_personality:'Personality',
  status_messages:'Messages',
  status_agent_running:'Agent running',
    status_profile: 'Profile',
    status_hermes_home: 'Hermes home',
    status_started: 'Started',
    status_updated: 'Updated',
    status_tokens: 'Tokens',
    status_ephemeral: 'Ephemeral snapshot — not saved to transcript history.',
    status_no_tokens: 'No tokens used',
    status_unknown: 'Unknown',
  status_yes:'Yes',
  status_no:'No',
  status_load_failed:'Failed to load status: ',
  title_current:'Current title',
  title_change_hint:'Use `/title <new name>` to rename.',
  title_set:'Title set to',
  cmd_webui_only_session:'This command is not available for CLI-imported sessions.',
  cmd_voice_use_mic:'Click the mic button in the composer.',
  usage_heading:'Token Usage',
  usage_default_model:'default',
  usage_unknown:'unknown',
  usage_input_tokens:'Input tokens',
  usage_output_tokens:'Output tokens',
  usage_total:'Total tokens',
  usage_estimated_cost:'Estimated cost',
  usage_settings_tip:'Note: cost estimates are approximate.',
  usage_load_failed:'Failed to load usage: ',
    usage_personality_none:'none',
    // Session toolsets (#493)
    session_toolsets:'Session Toolsets',
    session_toolsets_desc:'Restrict available tools for this session (blank = use global config)',
    session_toolsets_global:'Global (default)',
    session_toolsets_custom:'Custom',
    session_toolsets_placeholder:'tool1, tool2, …',
    session_toolsets_apply:'Apply',
    session_toolsets_clear:'Clear (use global)',
    session_toolsets_applied:'Toolsets updated',
    session_toolsets_cleared:'Toolsets cleared — using global config',
    session_toolsets_failed:'Failed to update toolsets: ',
  untitled:'Untitled',
    no_personalities: 'No personalities found (add them to ~/.hermes/personalities/)',
    available_personalities: 'Available personalities:',
    personality_switch_hint: '\n\nUse `/personality <name>` to switch, or `/personality none` to clear.',
    personalities_load_failed: 'Failed to load personalities',
    personality_cleared: 'Personality cleared',
    personality_set: 'Personality: ',
    failed_colon: 'Failed: ',
    // ui.js
    no_workspace: 'No workspace',
    terminal_open_title: 'Open workspace terminal',
    terminal_no_workspace_title: 'Select a workspace to open terminal',
    terminal_title: 'Terminal',
    terminal_clear: 'Clear',
    terminal_copy_output: 'Copy output',
    terminal_restart: 'Restart',
    terminal_collapse: 'Collapse',
    terminal_expand: 'Expand',
    terminal_close: 'Close',
    terminal_input_placeholder: 'Run a command...',
    terminal_start_failed: 'Terminal start failed: ',
    terminal_input_failed: 'Terminal input failed: ',
    terminal_copy_failed: 'Copy failed: ',
    terminal_error: 'Terminal error',
    terminal_remote_backend_unsupported: 'Embedded terminal is only supported for local terminal backends.',
    workspace_empty_no_path: 'No workspace selected. Set a workspace in Settings \u2192 Workspace to browse files.',
    workspace_empty_dir: 'This workspace is empty.',
    workspace_show_hidden_files: 'Show hidden files',
    workspace_show_hidden_files_desc: 'Include .DS_Store, .git, node_modules, and other hidden / system files in the file tree.',
    workspace_hidden_files_visible: 'hidden visible',
    workspace_hidden_files_visible_title: 'Hidden files are visible — click for options',
    workspace_options: 'Workspace options',
    dialog_confirm_title: 'Confirm action',
    dialog_prompt_title: 'Enter a value',
    dialog_confirm_btn: 'Confirm',
    // workspace.js
    unsaved_confirm: 'You have unsaved changes in the preview. Discard and navigate?',
    discard: 'Discard',
    save: 'Save',
    edit: 'Edit',
    clear: 'Clear',
    create: 'Create',
    remove: 'Remove',
    save_title: 'Save changes',
    edit_title: 'Edit this file',
    saved: 'Saved',
    save_failed: 'Save failed: ',
    image_load_failed: 'Could not load image',
    file_open_failed: 'Could not open file',
    downloading: (name) => `Downloading ${name}\u2026`,
    double_click_rename: 'Double-click to rename',
    session_rename_failed_no_row: 'Could not start rename — row not found.',
    renamed_to: 'Renamed to ',
    rename_failed: 'Rename failed: ',
    moved_to: 'Moved to ',
    move_failed: 'Move failed: ',
    delete_title: 'Delete',
    delete_confirm: (name) => `Delete ${name}?`,
    delete_dir_confirm: (name) => `Delete folder "${name}" and all its contents?`,
    rename_title: 'Rename',
    rename_prompt: 'New name:',
    deleted: 'Deleted ',
    delete_failed: 'Delete failed: ',
     reveal_in_finder: 'Reveal in File Manager',
     reveal_failed: 'Failed to reveal: ',
     copy_file_path: 'Copy file path',
     open_in_vscode: 'Open in VS Code',
     open_in_vscode_failed: 'Failed to open in VS Code: ',
     download_folder: 'Download Folder',
    path_copied: 'File path copied to clipboard',
    path_copy_failed: 'Failed to copy path: ',
    session_rename: 'Rename conversation',
    session_rename_desc: 'Edit the title of this conversation',
    session_title_regenerate: 'Regenerate title',
    session_title_regenerate_desc: 'Ask Hermes to generate a fresh title from the conversation',
    session_title_regenerating: 'Regenerating title…',
    session_title_regenerated: (title) => `Title regenerated: ${title}`,
    session_title_regenerate_failed: 'Regenerate title failed: ',
    session_copy_link: 'Copy conversation link',
    session_copy_link_desc: 'Copy a direct link to this conversation',
    session_link_copied: 'Conversation link copied to clipboard',
    session_link_copy_failed: 'Failed to copy conversation link: ',
    new_file_prompt: 'New file name (e.g. notes.md):',
    new_file: 'New File',
    new_folder: 'New Folder',
    workspace_root: 'workspace root',
    new_file_prompt_title: 'New file name in {0}:',
    new_folder_prompt_title: 'New folder name in {0}:',
    project_name_prompt: 'Project name:',
    created: 'Created ',
    create_failed: 'Create failed: ',
    new_folder_prompt: 'New folder name:',
    folder_created: 'Created folder ',
    folder_create_failed: 'Create folder failed: ',
  workspace_auto_create_folder: 'Create folder if it doesn\'t exist',
  folder_add_as_space_btn: 'Add as Space',
  folder_add_as_space_msg: 'Add this folder as a new space in your workspace list?',
  folder_add_as_space_title: 'Add as Space?',
    remove_title: 'Remove',
    empty_dir: '(empty)',
    upload_failed: 'Upload failed: ',
    upload_too_large: (maxMb, fileMb) => `File is too large (${fileMb} MB). Maximum upload size is ${maxMb} MB.`,
    uploading: 'Uploading…',
    uploaded: 'Uploaded',
    all_uploads_failed: (n) => `All ${n} upload(s) failed`,
    archive_extracted: (n, c) => `Extracted ${n} file(s) from ${c} archive(s)`,
    session_pin: 'Pin conversation',
    session_unpin: 'Unpin conversation',
    session_pin_desc: 'Keep this conversation at the top',
    session_unpin_desc: 'Remove from pinned',
    session_pin_failed: 'Pin failed: ',
    session_move_project: 'Move to project',
    session_move_project_desc_has: 'Change the project for this conversation',
    session_move_project_desc_none: 'Assign a project to this conversation',
    session_archive: 'Archive conversation',
    session_hide_external: 'Hide from list',
    session_restore: 'Restore conversation',
    session_archive_desc: 'Hide this conversation until archived is shown',
    session_archive_worktree_desc: 'Hide this conversation; keep its worktree on disk',
    session_hide_external_desc: 'Hide this imported session from WebUI without deleting the source history.',
    session_restore_desc: 'Bring this conversation back into the main list',
    session_archived: 'Session archived',
    session_archived_worktree: 'Session archived. Worktree remains on disk.',
    session_hidden: 'Session hidden from list',
    session_restored: 'Session restored',
    session_archive_failed: 'Archive failed: ',
    session_duplicate: 'Duplicate conversation',
    session_duplicate_desc: 'Create a copy with the same workspace and model',
    session_duplicated: 'Session duplicated',
    session_duplicate_failed: 'Duplicate failed: ',
    session_stop_response: 'Stop response',
    session_stop_response_desc: 'Cancel the running response for this conversation',
    session_delete: 'Delete conversation',
    session_delete_desc: 'Permanently remove this conversation',
    session_delete_confirm: 'Delete this conversation?',
    session_delete_worktree_desc: 'Delete only the WebUI conversation; keep the worktree on disk',
    session_delete_worktree_confirm: (path) => `Delete this conversation? The worktree at ${path} will remain on disk.`,
    session_deleted: 'Conversation deleted',
    session_deleted_worktree: 'Conversation deleted. Worktree remains on disk.',
    session_worktree_remove: 'Remove worktree',
    session_worktree_remove_desc: (path) => `Delete the git worktree at ${path} from disk`,
    session_worktree_remove_confirm: (path) => `Remove git worktree from disk?\n\nPath: ${path}\n\nThis will delete the entire worktree directory. Session data remains in WebUI.`,
    session_worktree_remove_not_exists: (path) => `The worktree at ${path} no longer exists on disk.`,
    session_worktree_remove_confirm_label: 'Remove',
    session_worktree_removed: 'Worktree removed.',
    session_worktree_remove_failed: 'Failed to remove worktree: ',
    session_worktree_remove_status_failed: 'Failed to read worktree status: ',
    session_worktree_remove_locked_by_stream: 'Cannot remove — an active streaming session is using this worktree.',
    session_worktree_remove_locked_by_terminal: 'Cannot remove — an active terminal session is using this worktree.',
    session_worktree_remove_unsafe_blocked: 'Resolve local changes or unpushed commits before removing this worktree.',
    session_worktree_remove_dirty_warning: 'WARNING: This worktree has uncommitted changes which will be lost.',
    session_worktree_remove_untracked_warning: (count) => `${count} untracked file(s) will be permanently deleted.`,
    session_worktree_remove_ahead_warning: (ahead) => `${ahead} unpushed commit(s) will be lost.`,
    session_select_mode: 'Select',
    session_select_mode_desc: 'Select conversations to batch manage',
    session_select_all: 'Select all',
    session_deselect_all: 'Deselect all',
    session_selected_count: '{0} selected',
    session_batch_archive: 'Archive',
    session_batch_delete: 'Delete',
    session_batch_move: 'Move to project',
    session_batch_delete_confirm: 'Delete {0} conversations?',
    session_batch_archive_confirm: 'Archive {0} conversations?',
    session_batch_delete_worktree_confirm: 'Delete {0} conversations? {1} worktree-backed conversation(s) will leave their worktree directories on disk.',
    session_batch_archive_worktree_confirm: 'Archive {0} conversations? {1} worktree-backed conversation(s) will keep their worktree directories on disk.',
    session_no_selection: 'No conversations selected',
    // settings panel
    settings_heading_title: 'Control Center',
    settings_heading_subtitle: 'Preferences, conversation tools, and system controls.',
    settings_section_conversation_title: 'Conversation',
    settings_section_appearance_title: 'Appearance',
    settings_section_appearance_meta: 'Theme, accent colors, and visual style.',
    settings_section_preferences_title: 'Preferences',
    settings_section_preferences_meta: 'Defaults and UI behavior for Hermes Web UI.',
    settings_section_system_title: 'System',
    settings_section_system_meta: 'Instance version and access controls.',
    settings_check_now: 'Check now',
    settings_checking: 'Checking\u2026',
    settings_up_to_date: 'Up to date \u2713',
    settings_updates_available: '{count} update(s) available',
    settings_updates_disabled: 'Update checks disabled',
    settings_update_check_failed: 'Update check failed',
    settings_label_workspace_panel_open: 'Keep workspace panel open by default',
    settings_desc_workspace_panel_open: 'When enabled, the workspace / file browser panel opens automatically with each new session. You can still close it manually at any time.',
    settings_label_session_jump_buttons: 'Show session jump buttons',
    settings_desc_session_jump_buttons: 'Show floating Start and End buttons while reading long session histories.',
    settings_label_terminal_auto_expand: 'Auto-expand terminal on output',
    settings_desc_terminal_auto_expand: 'Expand the collapsed terminal panel automatically when a running command emits new output.',

    settings_label_session_endless_scroll: 'Load older messages while scrolling up',

    settings_desc_session_endless_scroll: 'When enabled, older messages load automatically as you scroll upward. When disabled, use the older-messages button.',
    settings_label_auto_scroll_follow: 'Auto-follow new content',
    settings_desc_auto_scroll_follow: 'When enabled, the view scrolls to the bottom as new tokens stream in. When disabled, you control the scroll position manually.',
    settings_label_worklog_details_expanded_default: 'Open Worklog details automatically',
    settings_desc_worklog_details_expanded_default: 'When enabled, new Worklog details start expanded so tool, thinking, and progress cards are visible without an extra click. When off, Worklog details stay folded by default; per-turn manual collapse/expand choices still win.',
    settings_label_chat_activity_display_mode: 'Activity display',
    settings_desc_chat_activity_display_mode: 'Compact Worklog groups supporting activity into a quiet summary. Transparent Stream keeps each thinking/tool event as its own chronological expandable row.',
    first_token_time: 'Time to first token',
    done: 'Done',
    settings_option_compact_worklog: 'Compact Worklog',
    settings_option_transparent_stream: 'Transparent Stream',

    settings_label_tab_visibility: 'Sidebar tabs',
    settings_desc_tab_visibility: 'Choose which tabs appear in the sidebar and rail. Drag chips to reorder them. Chat and Settings are always visible.',
    open_in_browser: 'Open in browser',
    settings_dropdown_conversation: 'Conversation',
    settings_dropdown_appearance: 'Appearance',
    settings_dropdown_preferences: 'Preferences',
    settings_dropdown_providers: 'Providers',
    settings_dropdown_system: 'System',
    settings_tab_conversation: 'Conversation',
    settings_tab_appearance: 'Appearance',
    settings_tab_preferences: 'Preferences',
    settings_tab_plugins: 'Plugins',
    settings_plugins_title: 'Plugins',
    plugins_enable_toggle: 'Enable',
    settings_plugins_meta: 'View installed Hermes plugins and the lifecycle hooks they register. This panel is read-only.',
    settings_plugins_empty: 'No Hermes plugins are currently visible. Install or enable plugins from the Hermes CLI/config to see them here.',
    plugins_unnamed: 'Unnamed plugin',
    plugins_no_description: 'No description provided.',
    plugins_no_hooks: 'No registered lifecycle hooks',
    plugins_registered_hooks: 'Registered hooks',
    plugins_enabled: 'Enabled',
    plugins_disabled: 'Disabled',
    plugins_active_provider: 'Active (provider)',
    plugins_provider_no_hooks: 'Provider plugin — no agent-visibility hooks',
    plugins_load_failed: 'Failed to load plugins: ',
    settings_tab_system: 'System',
    settings_tab_help: 'Help',
    settings_help_meta: 'Resources and support for Hermes WebUI.',
    settings_help_docs_label: 'Documentation',
    settings_help_docs_desc: 'Guides, configuration reference, and the full Hermes WebUI README.',
    settings_help_docs_link: 'Open Documentation',
    settings_help_issue_label: 'Having an issue?',
    settings_help_issue_desc: 'Search existing reports or open a new one on GitHub.',
    settings_help_issue_link: 'Open GitHub Issues',
    settings_title: 'Settings',
    settings_save_btn: 'Save Settings',
    settings_label_model: 'Default Model',
    settings_desc_model: 'Used for new conversations. Existing conversations keep their selected model.',
    settings_label_auxiliary_models: 'Auxiliary Models',
    settings_desc_auxiliary_models: 'Side-task routing for vision, compression, title generation, etc. "Auto" uses your main chat model.',
    settings_btn_reset_aux_models: 'Reset all to auto',
    settings_btn_apply_aux_models: 'Apply changes',
    settings_aux_provider_auto: 'use main model',
    settings_aux_model_auto: 'auto (use provider default)',
    settings_aux_model_custom: 'Custom model…',
    settings_aux_model_custom_prompt: 'Enter model ID:',
    settings_aux_loading: 'Loading auxiliary models…',
    settings_aux_load_failed: 'Could not load auxiliary model settings. Make sure the agent API is available.',
    settings_aux_reset_confirm_title: 'Reset auxiliary models?',
    settings_aux_reset_confirm_msg: 'This will set all auxiliary tasks to auto (use main model).',
    settings_aux_reset_done: 'Auxiliary models reset to auto',
    settings_aux_save_failed: 'Failed to save auxiliary model',
    settings_aux_saved: 'Auxiliary models updated',
    settings_aux_no_changes: 'No changes to apply',
    settings_label_send_key: 'Send Key',
    settings_label_theme: 'Theme',
    settings_label_skin: 'Skin',
    settings_label_font_size: 'Font size',
    font_size_small: 'Small',
    font_size_default: 'Default',
    font_size_large: 'Large',
    font_size_xlarge: 'Extra Large',
    settings_autosave_saving: 'Saving…',
    settings_autosave_saved: 'Saved',
    settings_autosave_failed: 'Save failed',
    settings_autosave_retry: 'Retry',
    settings_label_language: 'Language',
    settings_label_quota_chip: 'Show provider quota chip in composer',
    settings_desc_quota_chip: 'Displays an ambient remaining-quota indicator (e.g. OpenRouter credit balance) in the composer footer. Default off. Only visible on wide displays (≥1400px) when enabled, to keep the composer uncluttered on laptop and standard desktop widths.',
    settings_label_conversation_outline: 'Show conversation outline',
    settings_desc_conversation_outline: 'Show a desktop-only jump list for user questions in the current conversation. Off by default.',
    settings_label_hide_suggestions: 'Hide new-chat suggestions',
    settings_desc_hide_suggestions: 'Hide the three default suggestion buttons on the empty new-chat screen to avoid accidental taps.',
    settings_label_token_usage: 'Show token usage',
    settings_label_token_speed: 'Show token speed (TPS)',
    settings_desc_token_speed: 'Displays tokens per second in assistant message headers while streaming and after a response completes. Off by default.',
    settings_label_sidebar_density: 'Sidebar density',
    cmd_reasoning: 'Toggle thinking visibility (show/hide), set effort level, or check current status',
    settings_label_external_sessions: 'Show non-WebUI sessions',
    settings_label_cron_sessions: 'Show cron sessions',
    settings_label_previous_messaging_sessions: 'Show previous messaging sessions',
    settings_label_sync_insights: 'Sync to insights',
    settings_label_check_updates: 'Check for updates',
    settings_label_ignore_agent_updates: 'Ignore Agent updates',
    settings_label_whats_new_summary: "Summarize What's New with AI",
    settings_label_bot_name: 'Default assistant name',
    settings_label_password: 'Access Password',
    settings_label_pinned_limit: 'Pinned conversations limit',
    settings_desc_pinned_limit: 'Maximum number of active conversations that can be pinned in the sidebar. Default is 3.',
    settings_label_dashboard_mode: 'Official Hermes Dashboard',
    settings_desc_dashboard_mode: 'Show a nav-rail link when the official hermes dashboard is reachable. Public reverse-proxy URLs are stored as browser-only links and are never server-probed.',
    settings_dashboard_mode_auto: 'Auto-detect',
    settings_dashboard_mode_always: 'Always show',
    settings_dashboard_mode_never: 'Never show',
    settings_dashboard_save: 'Save dashboard link settings',
    settings_label_gateway_status: 'Gateway Status',
    settings_desc_gateway_status: 'Status of the Hermes gateway (Telegram, Discord, Slack, etc.)',
    gateway_not_configured: 'Gateway not configured',
    gateway_metadata_stale: 'Gateway metadata stale',
    gateway_endpoint_unreachable: 'Gateway endpoint not reachable',
    gateway_not_running: 'Gateway not running',
    gateway_running_label: 'Running',
    gateway_last_active: 'Last active: ',
    gateway_session_count: (n) => `${n} ${n === 1 ? 'session' : 'sessions'}`,
    gateway_load_failed: 'Failed to load gateway status',
    settings_saved: 'Settings saved',
    settings_save_failed: 'Save failed: ',
    settings_load_failed: 'Failed to load settings: ',
    settings_saved_pw: 'Settings saved — password protection enabled and this browser stays signed in',
    settings_saved_pw_updated: 'Settings saved — password updated',
    // login page (used server-side via /api/i18n/login endpoint)
    login_title: 'Sign in',
    login_subtitle: 'Enter your password to continue',
    login_placeholder: 'Password',
    login_btn: 'Sign in',
    login_invalid_pw: 'Invalid password',
    login_conn_failed: 'Connection failed',
    dialog_confirm_title: 'Confirm action',
    dialog_prompt_title: 'Enter a value',
    dialog_confirm_btn: 'Confirm',
    discard: 'Discard',
    clear: 'Clear',
    create: 'Create',
    remove: 'Remove',
    project_name_prompt: 'Project name:',
    // Sidebar & Tabs
    tab_chat: 'Chat',
    tab_tasks: 'Tasks',
    tab_skills: 'Skills',
    tab_memory: 'Memory',
    tab_workspaces: 'Spaces',
    tab_profiles: 'Profiles',
    tab_kanban: 'Kanban',
    kanban_board: 'Board',
    kanban_visible_tasks: '{0} visible tasks',
    kanban_search_tasks: 'Search tasks',
    kanban_all_assignees: 'All assignees',
    kanban_all_tenants: 'All tenants',
    kanban_include_archived: 'Include archived',
    kanban_no_matching_tasks: 'No matching tasks',
    kanban_no_data: 'No Kanban data',
    kanban_work_queue_hint: 'This is the Hermes Agent work queue. Create or triage a task, assign it, move it to Ready, then let the dispatcher claim it.',
    kanban_unavailable: 'Kanban unavailable',
    kanban_read_only: 'Read-only view',
    kanban_empty: 'Empty',
    kanban_task: 'Task',
    kanban_no_description: 'No description',
    kanban_refresh: 'Refresh',
    kanban_status_triage: 'Triage',
    kanban_status_todo: 'Todo',
    kanban_status_ready: 'Ready',
    kanban_status_running: 'Running',
    kanban_status_blocked: 'Blocked',
    kanban_status_done: 'Done',
    kanban_comments_count: 'Comments ({0})',
    kanban_events_count: 'Events ({0})',
    kanban_links: 'Links',
    kanban_parents: 'Parents',
    kanban_children: 'Children',
    kanban_runs_count: 'Runs ({0})',
    kanban_no_comments: 'No comments',
    kanban_no_events: 'No events',
    kanban_no_runs: 'No runs',
    kanban_title: 'Title',
    kanban_description: 'Description',
    kanban_description_placeholder: 'Optional — what needs to happen, acceptance criteria, links',
    kanban_status: 'Status',
    kanban_assignee: 'Assignee',
    kanban_assignee_placeholder: 'Optional — leave blank for any worker',
    kanban_tenant: 'Tenant',
    kanban_tenant_placeholder: 'Optional — project or team slug',
    kanban_priority: 'Priority',
    kanban_priority_hint: 'Higher numbers run first. Default 0.',
    kanban_title_required: 'Title is required.',
    kanban_new_task: 'New task',
    kanban_edit_task: 'Edit task',
    kanban_status_original_hint: 'Actual status: {0}. This dialog only supports Triage/Todo/Ready edits.',
    kanban_run_dispatcher: 'Run dispatcher',
    kanban_run_dispatcher_confirm: 'This will claim Ready tasks on this board and spawn worker subprocesses (one per task, up to 8 per click). Continue?',
    kanban_assignee_profiles_label: 'Hermes profiles',
    kanban_assignee_other_label: 'Other (CLI lanes / removed profiles)',
    kanban_assignee_unassigned: '— Unassigned (won\u2019t auto-run) —',
    kanban_ready_needs_assignee: 'You picked Unassigned + Ready. The dispatcher will skip this task. Submit again to confirm, or pick a profile.',
    kanban_dispatch_preview_prefix: 'Preview:',
    kanban_dispatch_run_prefix: 'Dispatched:',
    kanban_dispatch_spawned: 'spawned',
    kanban_dispatch_promoted: 'promoted',
    kanban_dispatch_reclaimed: 'reclaimed',
    kanban_dispatch_skipped_unassigned: 'skipped (no assignee)',
    kanban_dispatch_skipped_nonspawnable: 'skipped (unknown profile)',
    kanban_dispatch_auto_blocked: 'auto-blocked',
    kanban_dispatch_timed_out: 'timed out',
    kanban_dispatch_crashed: 'crashed',
    kanban_add_comment: 'Add comment',
      kanban_only_mine: 'Only mine',
      kanban_bulk_action: 'Bulk action',
      kanban_nudge_dispatcher: 'Preview dispatcher',
      kanban_stats: 'Stats',
      kanban_worker_log: 'Worker log',
      kanban_block: 'Block',
      kanban_unblock: 'Unblock',
      kanban_back_to_board: 'Back to board',
      kanban_lanes_by_profile: 'Lanes by profile',
      kanban_new_board: 'New board…',
      kanban_rename_board: 'Rename current board…',
      kanban_archive_board: 'Archive current board…',
      kanban_archive_board_confirm: 'Archive board "{name}"? Tasks remain on disk and the board can be restored from kanban/boards/_archived/.',
      kanban_board_archived: 'Board archived',
      kanban_board_name: 'Name',
      kanban_board_slug: 'Slug (lowercase, hyphens)',
      kanban_board_description: 'Description (optional)',
      kanban_board_icon: 'Icon (emoji, optional)',
      kanban_board_color: 'Color (optional)',
      kanban_board_name_required: 'Name is required',
      kanban_board_slug_required: 'Slug is required',
      kanban_card_complete: 'complete',
      kanban_card_archive: 'archive',
      kanban_unassigned: 'unassigned',
    kanban_status_archived: 'Archived',
    tab_todos: 'Todos',
    tab_insights: 'Insights',
    tab_dashboard: 'Hermes Dashboard',
    dashboard_loopback_warning: 'Dashboard is loopback-only on the server. Either browse from the server itself or restart it with --host 0.0.0.0 (insecure).',
    tab_logs: 'Logs',
    tab_settings: 'Settings',
    new_conversation: 'New conversation',
    filter_conversations: 'Filter conversations...',
    markdown_table_filter: 'Filter table',
    markdown_table_sort_column: 'Sort column',
    session_time_unknown: 'Unknown',
    session_time_minutes_ago: (n) => `${n}m`,
    session_time_hours_ago: (n) => `${n}h`,
    session_time_days_ago: (n) => `${n}d`,
    session_time_last_week: '1w',
    session_time_bucket_today: 'Today',
    session_time_bucket_yesterday: 'Yesterday',
    session_time_bucket_this_week: 'This week',
    session_time_bucket_last_week: 'Last week',
    session_time_bucket_older: 'Older',
    scheduled_jobs: 'Scheduled jobs',
    new_job: 'New job',
    loading: 'Loading...',
    search_skills: 'Search skills...',
    new_skill: 'New skill',
    personal_memory: 'Personal memory',
    current_task_list: 'Current task list',
    // Logs
    logs_title: 'Logs',
    logs_file: 'File',
    logs_tail: 'Tail',
    logs_auto_refresh: 'Auto-refresh (5s)',
    logs_wrap: 'Wrap lines',
    logs_copy_all: 'Copy all',
    logs_empty: 'No log lines yet.',
    logs_loading: 'Loading logs…',
    logs_load_failed: 'Logs failed to load',
    logs_status_idle: 'Choose a log file to view recent lines.',
    logs_no_mtime: 'not written yet',
    logs_truncated_hint: 'Showing the tail of a large log file; older bytes were skipped to keep memory bounded.',
    logs_copied: 'Logs copied',
    logs_severity: 'Severity',
    logs_severity_all: 'All',
    logs_severity_errors: 'Errors',
    logs_severity_warnings: 'Warnings+',
    logs_filter_active: 'shown (filter active)',

    // Insights
    insights_title: 'Usage Analytics',
    insights_sessions: 'Sessions',
    insights_messages: 'Messages',
    insights_tokens: 'Tokens',
    insights_cost: 'Estimated Cost',
    insights_no_cost: 'N/A',
    insights_models: 'Models',
    insights_activity_by_day: 'Activity by Day',
    insights_activity_by_hour: 'Activity by Hour',
    insights_peak_hour: 'Peak: {hour}',
    insights_token_breakdown: 'Token Breakdown',
    insights_input_tokens: 'Input',
    insights_output_tokens: 'Output',
    insights_total: 'Total',
    insights_daily_tokens: 'Daily Tokens',
    insights_model_name: 'Model',
    insights_model_sessions: 'Sessions',
    insights_model_tokens: 'Tokens',
    insights_model_cost: 'Cost',
    insights_model_share: 'Share',
    insights_no_usage_data: 'No usage data yet',
    insights_footer: 'Showing data from the last {days} days',
    insights_skill_usage_title: 'Skill Usage',
    insights_skill_usage_sub: 'Tool invocation frequency',
    insights_skill_usage_total: 'Total invocations',
    insights_skill_usage_skills_used: 'Skills used',
    insights_skill_usage_no_data: 'No skill usage data yet',
    insights_skill_usage_no_data_hint: 'Skills will appear here once used in conversations.',
    insights_skill_usage_footer: 'Counts from ~/.hermes/skills/',
    insights_skill_usage_col_skill: 'Skill',
    insights_skill_usage_col_uses: 'Uses',
    insights_skill_usage_col_views: 'Views',
    insights_skill_usage_col_share: 'Usage %',
    insights_skill_usage_col_patches: 'Patches',
    workspace_desc: 'Add and switch workspaces for your sessions.',
    session_meta_messages: (n) => `${n} msg${n === 1 ? '' : 's'}`,
    session_meta_children: (n) => `${n} child${n === 1 ? '' : 'ren'}`,
    // Softened label: avoids exposing the technical internal term
    // 'segment' in the default visible badge. User-facing copy remains
    // translatable for locales that prefer a different wording. (#2155)
    session_meta_segments: (n) => `${n} prior turn${n === 1 ? '' : 's'}`,
    session_lineage_toggle_hint: '{0} — earlier context turns are collapsed here. Click to show or hide them.',
    session_lineage_static_hint: '{0} — earlier context turns are collapsed here.',
    session_child_toggle_hint: '{0} — child conversations spawned from this session. Click to show or hide them.',
    session_readonly_title_hint: 'Read-only imported session — {0}',
    session_lineage_segment_untitled: 'Untitled segment',
    session_lineage_segment_open: 'Open lineage segment',
    new_profile: 'New profile',
    transcript: 'Transcript',
    download_transcript: 'Download as Markdown',
    import: 'Import',
    export_session_json: 'JSON',
    export_session_json_tooltip: 'Export full session as JSON',
    import_session_json_tooltip: 'Import session from JSON',
    clear_conversation_btn_tooltip: 'Clear all messages in this conversation',
    // Settings detail
    settings_label_rtl: 'Right-to-left chat layout',
    settings_desc_rtl: 'Flips alignment of chat messages and the composer input for languages like Arabic or Hebrew. Affects only the chat area — sidebar and other panels stay left-to-right.',
    settings_label_sound: 'Notification sound',
    settings_desc_sound: 'Play a sound when the assistant finishes a response.',
    // TTS (#499)
    tts_listen: 'Listen',
    tts_not_supported: 'Speech synthesis not supported in this browser.',
    settings_label_tts: 'Text-to-Speech for responses',
    settings_desc_tts: "Show a speaker button on each assistant message to read it aloud using your browser's speech synthesis.",
    settings_label_tts_auto_read: 'Auto-read responses aloud',
    settings_desc_tts_auto_read: 'Automatically speak each new assistant response when it finishes. Pauses when you start typing.',
    // Composer voice-mode pref (#1488)
    settings_label_voice_mode: 'Hands-free voice mode button',
    settings_desc_voice_mode: 'Show the voice-mode button (audio waveform) next to the dictation mic. Lets you speak naturally — Hermes auto-sends after a pause and reads replies aloud. Requires a browser that supports both speech recognition and TTS.',
    settings_label_raw_audio: 'Send raw audio instead of transcribing',
    settings_desc_raw_audio: 'Record and send the original audio file to the agent instead of converting it to text first. The agent can then transcribe it or process the raw audio (emotion, background noise, custom STT). Like Telegram\'s voice message behavior.',
    voice_send_raw: 'Send raw audio',
    voice_raw_attached: 'Audio attached. Press Send or type more.',
    settings_label_tts_voice: 'Voice',
    settings_desc_tts_voice: "Preferred voice. Populated from your browser's available voices.",
    settings_label_tts_rate: 'Speech rate',
    settings_label_tts_pitch: 'Speech pitch',
    settings_label_tts_engine: 'TTS Engine',
    settings_desc_tts_engine: 'Choose speech engine. Edge TTS uses Microsoft neural voices via the server.',
    settings_label_notifications: 'Browser notifications',
    settings_desc_notifications: 'Show a system notification when a response completes while the app is in the background.',
    notifications_enable_btn: 'Enable notifications',
    notifications_test_btn: 'Send test',
    notifications_permission_status: (status) => `Permission: ${status}`,
    notifications_enabled_toast: 'Notifications enabled.',
    notifications_denied: 'Notifications are blocked in this browser. Enable them in browser settings.',
    notifications_unsupported: 'Notifications are not supported in this browser.',
    settings_desc_token_usage: 'Displays input/output token count below each assistant reply. Also toggled with /usage.',
    settings_label_api_redact: 'Redact sensitive data in API responses',
    settings_desc_api_redact: 'Self-hosted users can disable for transparency (not recommended for shared instances).',
    settings_sidebar_density_compact: 'Compact',
    settings_sidebar_density_detailed: 'Detailed',
    settings_desc_sidebar_density: 'Controls how much metadata the session list shows in the left sidebar.',
    settings_label_auto_title_refresh: 'Adaptive title refresh',
    settings_auto_title_refresh_off: 'Off',
    settings_auto_title_refresh_5: 'Every 5 exchanges',
    settings_auto_title_refresh_10: 'Every 10 exchanges',
    settings_auto_title_refresh_20: 'Every 20 exchanges',
    settings_desc_auto_title_refresh: 'Automatically re-generates the session title based on the latest exchange, keeping it relevant as the conversation evolves. Requires an LLM title generation model to be configured.',
    settings_desc_external_sessions: 'Show conversations from CLI, Telegram, Discord, Slack, and other channels in the session list. Click to import and continue.',
    settings_desc_cron_sessions: 'Surface cron job output as conversations in the sidebar. Only active when non-WebUI sessions are enabled. Defaults off; high-frequency jobs can flood the sidebar.',
    settings_desc_previous_messaging_sessions: 'Show older Discord, Telegram, Slack, and Weixin sessions that were replaced by reset or compression.',
    settings_desc_sync_insights: 'Mirrors WebUI token usage to state.db so hermes /insights includes browser session data. Off by default.',
    settings_desc_check_updates: 'Show a banner when newer versions of the WebUI or Agent are available. Runs a background git fetch periodically.',
    settings_desc_ignore_agent_updates: 'Keep WebUI update checks on, but hide Agent update notices and skip Agent update fetches.',
    settings_desc_whats_new_summary: "Changes the What's New action from opening the raw diff first to generating a short, human-readable summary. The regular diff comparison stays available after the summary.",
    settings_desc_bot_name: 'Used for the default profile only. Other profiles use their own profile names.',
    settings_desc_password: 'Enter a new password to set or change it. Leave blank to keep current setting.',
    password_placeholder: 'Enter new password…',
    password_env_var_locked: 'The HERMES_WEBUI_PASSWORD environment variable is currently set and takes precedence. Unset it and restart the server to manage the password from here.',
    password_env_var_locked_placeholder: 'Locked: HERMES_WEBUI_PASSWORD env var is set',
    disable_auth: 'Disable Auth',
    sign_out: 'Sign Out',
    settings_label_shutdown: 'Stop the Hermes WebUI server',
    settings_desc_shutdown_before_cmd: 'Gracefully stops the local WebUI server. Useful if you launched via ',
    settings_desc_shutdown_between_cmds: ' and want to stop without switching to a terminal. You\u2019ll need to relaunch the server (',
    settings_desc_shutdown_after_cmd: ' or the native app) before the WebUI is reachable again.',
    settings_btn_shutdown: 'Stop server',
    settings_shutdown_confirm_title: 'Stop Hermes WebUI',
    settings_shutdown_confirm_message: 'Stop the Hermes WebUI server?',
    settings_shutdown_confirm_btn: 'Stop',
    settings_shutdown_stopped_message: 'Server stopped. You can close this tab.',
    // Providers panel
    providers_tab_title: 'Providers',
    providers_section_title: 'Providers',
    providers_section_meta: 'Manage API keys for AI providers. Changes take effect immediately.',
    providers_status_configured: 'API key configured',
    providers_status_not_configured: 'No API key',
    providers_status_oauth: 'OAuth',
    providers_status_api_key: 'API key',
    providers_status_not_configured_label: 'Not configured',
    providers_oauth_hint: 'Authenticated via OAuth. No API key needed.',
    providers_oauth_config_yaml_hint: 'Token configured via config.yaml. To update, edit the providers section in your config.yaml or run hermes auth.',
    providers_oauth_not_configured_hint: 'Not authenticated. Run hermes auth in the terminal to configure this provider.',
    providers_save: 'Save',
    providers_refresh_models: 'Refresh models',
    providers_refreshing: 'Refreshing…',
    providers_models_refreshed: 'Models refreshed',
    providers_remove: 'Remove',
    providers_saving: 'Saving…',
    providers_removing: 'Removing…',
    providers_enter_key: 'Please enter an API key',
    providers_empty: 'No configurable providers found.',
    providers_key_updated: 'API key saved',
    providers_key_removed: 'API key removed',
    providers_key_placeholder_new: 'sk-...',
    providers_key_placeholder_replace: 'Enter new key to replace…',
    provider_quota_title: 'Active provider quota',
    provider_quota_active_provider: 'Active provider',
    provider_quota_last_checked_after_refresh: 'Last checked after refresh',
    provider_quota_last_checked: 'Last checked {0}',
    provider_quota_refresh_usage: 'Refresh usage',
    provider_quota_refreshing: 'Refreshing...',
    provider_quota_refresh_title: 'Refresh provider usage limits now',
    provider_quota_refresh_succeeded: 'Provider usage refreshed',
    provider_quota_refresh_failed: 'Provider usage refresh failed',
    provider_quota_session_limit: '5-hour limit',
    provider_quota_weekly_limit: 'Weekly limit',
    provider_quota_window_fallback: 'Window',
    provider_quota_metric_remaining: 'Remaining',
    provider_quota_metric_used: 'Used',
    provider_quota_metric_limit: 'Limit',
    provider_quota_status_available: 'available',
    provider_quota_status_exhausted: 'exhausted',
    provider_quota_status_unavailable: 'unavailable',
    provider_quota_status_failed: 'failed',
    provider_quota_status_checked: 'checked',
    provider_quota_status_no_key: 'no key',
    provider_quota_status_invalid_key: 'invalid key',
    provider_quota_status_unsupported: 'unsupported',
    provider_quota_used_meta: '{0} used',
    provider_quota_resets_meta: 'resets {0}',
    provider_quota_credential_pool: 'Credential pool',
    provider_quota_credential_label: 'Credential {0}',
    provider_quota_pool_plans: 'Plans: {0}',
    provider_quota_pool_no_windows: 'No account-limit windows reported.',
    provider_quota_account_limits_loaded: 'Account limits loaded.',
    provider_quota_unavailable: 'Quota status unavailable',
    provider_quota_retry_after: 'Retry after {0}',
    provider_quota_pool_summary_available: '{0}/{1} available',
    provider_quota_pool_summary_exhausted: '{0} exhausted',
    provider_quota_pool_summary_failed: '{0} failed',
    provider_quota_pool_summary_checked: '{0} checked',
    cancel: 'Cancel',
    create_job: 'Create job',
    save_skill: 'Save skill',
    editing: 'Editing',
    // Empty state
    empty_title: 'What can I help with?',
    empty_subtitle: 'Ask anything, run commands, explore files, or manage your scheduled tasks.',
    suggest_files: 'What files are in this workspace?',
    suggest_schedule: "What's on my schedule today?",
    suggest_plan: 'Help me plan a small project.',
    // onboarding
    onboarding_badge: 'FIRST RUN',
    onboarding_title: 'Welcome to Hermes Web UI',
    onboarding_lead: 'A quick guided setup will verify Hermes, save a real provider configuration, choose a workspace and model, and optionally protect the app with a password.',
    onboarding_back: 'Back',
    onboarding_continue: 'Continue',
    onboarding_skip: 'Skip setup',
    onboarding_skipped: 'Setup skipped — using existing config.',
    onboarding_open: 'Open Hermes',
    onboarding_step_system_title: 'System check',
    onboarding_step_system_desc: 'Verify Hermes Agent and config visibility.',
    onboarding_step_setup_title: 'Provider setup',
    onboarding_step_setup_desc: 'Save the minimum Hermes provider config.',
    onboarding_step_workspace_title: 'Workspace + model',
    onboarding_step_workspace_desc: 'Pick defaults for new sessions and chat.',
    onboarding_step_password_title: 'Optional password',
    onboarding_step_password_desc: 'Protect the Web UI before sharing it.',
    onboarding_step_finish_title: 'Finish',
    onboarding_step_finish_desc: 'Review and enter the app.',
    onboarding_notice_system_ready: 'Hermes Agent looks reachable from the Web UI.',
    onboarding_notice_system_unavailable: 'Hermes Agent is not fully available yet. Bootstrap can install it, but provider setup may still require a terminal.',
    onboarding_check_agent: 'Hermes Agent',
    onboarding_check_agent_ready: 'Detected and importable',
    onboarding_check_agent_missing: 'Missing or partially importable',
    onboarding_check_password: 'Password',
    onboarding_check_password_enabled: 'Already enabled',
    onboarding_check_password_disabled: 'Not enabled yet',
    onboarding_check_provider: 'Provider config',
    onboarding_check_provider_ready: 'Ready to chat',
    onboarding_check_provider_partial: 'Saved but incomplete',
    onboarding_check_provider_pending: 'Needs verification',
    onboarding_config_file: 'Config file:',
    onboarding_env_file: '.env file:',
    onboarding_unknown: 'Unknown',
    onboarding_current_provider: 'Current setup:',
    onboarding_missing_imports: 'Missing imports:',
    onboarding_notice_setup_required: 'Choose a simple provider path here. Advanced OAuth flows still belong in the Hermes CLI for now.',
    onboarding_notice_setup_already_ready: 'A working Hermes provider setup is already detected. You can keep it or replace it here.',
    onboarding_oauth_provider_ready_title: 'Provider already authenticated',
    onboarding_oauth_provider_ready_body: 'This instance is configured to use an OAuth provider (<strong>{provider}</strong>) that was set up via the Hermes CLI. No API key is needed here — click Continue to finish setup.',
    onboarding_oauth_provider_not_ready_title: 'OAuth provider not yet authenticated',
    onboarding_oauth_provider_not_ready_body: 'This instance is configured to use <strong>{provider}</strong>, which uses OAuth rather than an API key. Run <code>hermes auth</code> or <code>hermes model</code> in a terminal to authenticate, then reload the Web UI.',
    onboarding_oauth_switch_hint: 'Or choose a different provider below to switch to an API-key setup:',
    oauth_login_codex: 'Login with Codex (ChatGPT)',
    oauth_codex_step1: 'Step 1: Visit this URL and enter the code',
    oauth_codex_step2: 'Step 2: Enter this code on the page',
    oauth_codex_polling: 'Waiting for authorization...',
    oauth_codex_success: 'Codex OAuth login successful!',
    oauth_codex_error: 'OAuth login failed',
    oauth_codex_expired: 'Code expired, please try again',
    onboarding_notice_workspace: 'These values reuse the same settings APIs as the normal app.',
    onboarding_workspace_label: 'Workspace',
    onboarding_workspace_or_path: 'Or enter a workspace path',
    onboarding_workspace_placeholder: '/home/you/workspace',
    onboarding_provider_label: 'Setup mode',
    onboarding_quick_setup_badge: 'quick setup',
    provider_category_easy_start: 'Easy start',
    provider_category_self_hosted: 'Open / self-hosted',
    provider_category_specialized: 'Specialized',
    onboarding_api_key_label: 'API key',
    onboarding_api_key_placeholder: 'Leave blank to keep an existing saved key',
    onboarding_api_key_label_optional: 'API key (optional)',
    onboarding_api_key_placeholder_optional: 'Leave blank for keyless servers',
    onboarding_api_key_help_keyless: 'Most LM Studio / Ollama / vLLM installs run keyless — leave this blank if your server doesn\'t require authentication. Use the Test connection button to verify.',
    onboarding_api_key_help_prefix: 'Saved as a secret in your Hermes .env file using',
    onboarding_base_url_label: 'Base URL',
    onboarding_base_url_placeholder: 'https://your-endpoint.example/v1',
    onboarding_base_url_help: 'Use this for OpenAI-compatible routers, self-hosted servers, LiteLLM, Ollama, LM Studio, vLLM, or similar endpoints.',
    onboarding_model_label: 'Default model',
    onboarding_workspace_help: 'Pick the model Hermes should use for new chats after setup completes.',
    onboarding_custom_model_placeholder: 'your-model-name',
    onboarding_custom_model_help: 'For custom endpoints, enter the exact model ID your server expects.',
    onboarding_notice_password_enabled: 'A password is already configured. Enter a new one only if you want to replace it.',
    onboarding_notice_password_recommended: 'Optional but recommended if you will expose the UI beyond localhost.',
    onboarding_password_label: 'Password (optional)',
    onboarding_password_placeholder: 'Leave blank to skip',
    onboarding_password_help: 'Passwords are stored through the existing settings API and hashed server-side.',
    onboarding_notice_finish: 'You can reopen Settings later to change any of this.',
    onboarding_not_set: 'Not set',
    onboarding_password_will_enable: 'Will be enabled',
    onboarding_password_will_replace: 'Will be replaced',
    onboarding_password_keep_existing: 'Keep current password',
    onboarding_password_remains_disabled: 'Will remain disabled',
    onboarding_password_skipped: 'Skipped for now',
    onboarding_finish_help: 'Finishing stores <code>onboarding_completed</code> in settings and drops you into the normal app.',
    onboarding_error_choose_workspace: 'Choose a workspace before continuing.',
    onboarding_error_choose_model: 'Choose a model before continuing.',
    onboarding_error_provider_required: 'Choose a setup mode before continuing.',
    onboarding_error_base_url_required: 'Base URL is required for custom endpoints.',
    onboarding_probe_test_button: 'Test connection',
    onboarding_probe_probing: 'Testing connection…',
    onboarding_probe_ok: 'Connected. {n} model(s) available.',
    onboarding_probe_error_generic: 'Could not reach the configured base URL.',
    onboarding_probe_error_invalid_url: 'Base URL must start with http:// or https://.',
    onboarding_probe_error_dns: 'Could not resolve the host. Check the URL or use the host\'s IP address.',
    onboarding_probe_error_connect_refused: 'Connection refused — the server may not be running on that address. From inside Docker, try the host IP instead of localhost.',
    onboarding_probe_error_timeout: 'The endpoint did not respond in time. Check that the server is running and the URL is correct.',
    onboarding_probe_error_http_4xx: 'The endpoint returned a client error. Check authentication and the URL path (typically ends in /v1).',
    onboarding_probe_error_http_5xx: 'The endpoint returned a server error. Check the LM Studio / Ollama server logs.',
    onboarding_probe_error_parse: 'The endpoint did not return a model list in the expected shape. Verify the URL points to the OpenAI-compatible API root.',
    onboarding_probe_error_unreachable: 'Could not reach the configured base URL.',
    onboarding_error_probe_failed: 'Could not validate the configured base URL.',
    onboarding_error_workspace_required: 'Workspace is required.',
    onboarding_error_model_required: 'Model is required.',
    onboarding_complete: 'Onboarding complete',

    // panel/runtime i18n
    error_prefix: 'Error: ',
    default: 'default',
    search: 'Search',
    not_available: 'N/A',
    never: 'never',
    add: 'Add',
    add_failed: 'Add failed: ',
    remove_failed: 'Remove failed: ',
    switch_failed: 'Switch failed: ',
    name_required: 'Name is required',
    content_required: 'Content is required',
    view: 'View',
    dismiss: 'Dismiss',
    disable: 'Disable',
    cron_no_jobs: 'No scheduled jobs found.',
    cron_status_off: 'off',
    cron_status_paused: 'paused',
    cron_status_error: 'error',
    cron_status_active: 'active',
    cron_status_running: 'running\u2026',
    cron_status_needs_attention: 'needs attention',
    cron_attention_desc: 'This recurring job has no next run time. The scheduler may have failed to compute its next run.',
    cron_attention_croniter_hint: 'The Gateway runtime may be missing the croniter package. Restart the Gateway with cron support, then resume this job.',
    cron_attention_resume: 'Resume and recalculate',
    cron_jobs_project: 'Cron Jobs',
    cron_attention_run_once: 'Run once now',
    cron_attention_copy_diagnostics: 'Copy diagnostics',
    cron_diagnostics_copied: 'Cron diagnostics copied',
    cron_next: 'Next',
    cron_last: 'Last',
    cron_run_now: 'Run now',
    cron_pause: 'Pause',
    cron_resume: 'Resume',
    cron_job_name_placeholder: 'Job name',
    cron_schedule_placeholder: 'Schedule',
    cron_prompt_placeholder: 'Prompt',
    cron_last_output: 'Last output',
    cron_expand_prompt: 'Expand prompt',
    cron_collapse_prompt: 'Collapse prompt',
    cron_expand_output: 'Expand output',
    cron_collapse_output: 'Collapse output',
    cron_mode_agent: 'Agent',
    cron_mode_script: 'Script',
    cron_mode_label: 'Mode',
    cron_script_job_banner: 'Runs a script on schedule — stdout is delivered to the target. No agent, prompt, or skills.',
    cron_script_card_title: 'Script',
    cron_script_output: 'Script output',
    cron_script_path_label: 'Script path',
    cron_script_path_hint: 'Resolved under ~/.hermes/scripts/ unless an absolute path. Edit the script file on the server to change behavior.',
    cron_script_badge_title: 'Script job (no agent)',
    cron_workdir_label: 'Working directory',
    cron_view_full_output: 'View full output',
    cron_all_runs: 'All runs',
    cron_hide_runs: 'Hide runs',
    cron_no_runs_yet: '(no runs yet)',
    cron_schedule_required_example: 'Schedule is required (e.g. "0 9 * * *" or "every 1h")',
    cron_schedule_required: 'Schedule is required',
    cron_prompt_required: 'Prompt is required',
    cron_job_created: 'Job created',
    cron_duplicate: 'Duplicate',
    cron_duplicated: 'Job duplicated (paused)',
    cron_job_triggered: 'Job triggered',
    cron_job_paused: 'Job paused',
    cron_job_resumed: 'Job resumed',
    cron_job_updated: 'Job updated',
    cron_model_label: 'Model Override',
    cron_model_hint: 'Override the default model for this job.',
    cron_model_use_default: 'Default (use profile/system default)',
    cron_delete_confirm_title: 'Delete cron job',
    cron_delete_confirm_message: 'This cannot be undone.',
    cron_job_deleted: 'Job deleted',
    cron_completion_status: (name, status) => `Cron "${name}" ${status}`,
    status_failed: 'failed',
    status_completed: 'completed',
    todos_no_active: 'No active task list in this session.',
    clear_conversation_title: 'Clear conversation',
    clear_conversation_message: 'Clear all messages? This cannot be undone.',
    clear_failed: 'Clear failed: ',
    skills_no_match: 'No skills match.',
    skill_enabled: 'Enabled',
    skill_disabled: 'Disabled',
    skill_toggle_failed: 'Failed to toggle skill: ',
    linked_files: 'Linked Files',
    skill_load_failed: 'Could not load skill: ',
    skill_file_load_failed: 'Could not load file: ',
    skill_name_required: 'Skill name is required',
    skill_updated: 'Skill updated',
    skill_created: 'Skill created',
    skill_deleted: 'Skill deleted',
    skill_delete_confirm: 'Delete skill "{0}"?',
    skills_empty_title: 'Select a skill',
    skills_empty_sub: 'Pick a skill from the sidebar to view its contents, or create a new one.',
    skills_edit: 'Edit',
    skills_delete: 'Delete',
    skills_back_to: 'Back to {0}',
    tasks_empty_title: 'Select a scheduled job',
    tasks_empty_sub: 'Pick a job from the sidebar to view its details and runs, or create a new one.',
    workspaces_empty_title: 'Select a space',
    workspaces_empty_sub: 'Pick a space from the sidebar to view its files and settings, or add a new one.',
    profiles_empty_title: 'Select a profile',
    profiles_empty_sub: 'Pick an agent profile from the sidebar to view and edit its settings, or create a new one.',
    memory_notes_label: 'memory (notes)',
    memory_saved: 'Memory saved',
    my_notes: 'My Notes',
    user_profile: 'User Profile',
    external_notes_sources: 'Third-party notes',
    external_notes_empty: 'No note or knowledge MCP sources are visible yet. Configure Joplin, Obsidian, Notion, llm-wiki, or another notes server to list it here.',
    external_notes_auto_recall_hint: 'Automatic session recall is unchanged; this drawer only shows configured sources and available read/search tools.',
    external_notes_no_tools: 'No read/search tools are currently visible for this source.',
    external_notes_tool_count: (count) => `${count} note tool${Number(count)===1?'':'s'} available`,
    external_notes_configured_hint: 'Tool names are expected from this configured source; live schemas will appear when the WebUI runtime exposes them.',
    external_notes_recent_ai: 'Recently used by AI',
    external_notes_auto: 'auto',
    external_notes_recent_ai_reason: 'Automatic recall',
    external_notes_search_placeholder: 'Search notes…',
    external_notes_search_empty: 'Search a configured notes source to preview notes here.',
    source_active: 'active',
    source_configured: 'configured',
    no_notes_yet: 'No notes yet.',
    no_profile_yet: 'No profile yet.',
    agent_soul: 'Agent Soul',
    no_soul_yet: 'No soul defined yet.',
    workspace_choose_path: 'Choose workspace path',
    workspace_choose_path_meta: 'Add a validated path and switch this conversation',
    workspace_manage: 'Manage workspaces',
    workspace_manage_meta: 'Open the Spaces panel',
    workspace_use_title: 'Use in current session',
    workspace_use: 'Use',
    workspace_add_path_placeholder: 'Add workspace path (e.g. /home/user/my-project)',
    workspace_paths_validated_hint: 'Paths are validated as existing directories before saving.',

    workspace_drag_hint: 'Drag to reorder',
    workspace_reorder_failed: 'Reorder failed',
    workspace_added: 'Workspace added',
    workspace_renamed: 'Workspace renamed',
    workspace_remove_confirm_title: 'Remove workspace',
    workspace_remove_confirm_message: (path) => `Remove "${path}"?`,
    workspace_removed: 'Workspace removed',
    workspace_switch_prompt_title: 'Switch workspace',
    workspace_switch_prompt_message: 'Enter an absolute workspace path to add and switch this conversation to.',
    workspace_switch_prompt_confirm: 'Switch',
    workspace_switch_prompt_placeholder: '/Users/you/project',
    workspace_not_added: 'Workspace was not added',
    workspace_already_saved: 'Workspace already saved — choose it from the list',
    workspace_busy_switch: 'Cannot switch workspace while agent is running',
    discard_file_edits_title: 'Discard file edits?',
    discard_file_edits_message: 'Switching workspaces will discard unsaved file edits in the preview.',
    workspace_switched_to: (name) => `Switched to ${name}`,
    profiles_no_profiles: 'No profiles found.',
    profile_api_keys_configured: 'API keys configured',
    profile_gateway_running: 'Gateway running',
    profile_gateway_stopped: 'Gateway stopped',
    profile_active: 'ACTIVE',
    profile_no_configuration: 'No configuration',
    profile_skill_count: (count) => `${count} skill${count === 1 ? '' : 's'}`,
    profile_use: 'Use',
    profile_switch_title: 'Switch to this profile',
    profile_delete_title: 'Delete this profile',
    profile_default_label: '(default)',
    profile_name_placeholder: 'Profile name (lowercase, a-z 0-9 hyphens)',
    profile_clone_label: 'Clone config from active profile',
    profile_model_label: 'Model / provider',
    profile_model_hint: 'Choose from configured providers and models for this new profile.',
    profile_model_use_default: 'Use active profile default',
    profile_base_url_placeholder: 'Base URL (optional, e.g. http://localhost:11434)',
    profile_api_key_placeholder: 'API key (optional)',
    manage_profiles: 'Manage profiles',
    profiles_load_failed: 'Failed to load profiles',
    profile_switched_new_conversation: (name) => `Switched to profile: ${name} — new conversation started`,
    profile_switched: (name) => `Switched to profile: ${name}`,
    profile_name_rule: 'Lowercase letters, numbers, hyphens, underscores only',
    profile_base_url_rule: 'Base URL must start with http:// or https://',
    profile_created: (name) => `Profile created: ${name}`,
    profile_delete_confirm_title: (name) => `Delete profile "${name}"?`,
    profile_delete_confirm_message: 'All sessions, config, skills, and memory for this profile will be permanently deleted. This cannot be undone.',
    profile_deleted: (name) => `Profile deleted: ${name}`,
    active_conversation_none: 'No active conversation selected.',
    active_conversation_meta: (title, count) => `${title} · ${count} message${count === 1 ? '' : 's'}`,
    settings_unsaved_changes: 'You have unsaved changes.',
    sign_out_failed: 'Sign out failed: ',
    disable_auth_confirm_title: 'Disable password protection',
    disable_auth_confirm_message: 'Anyone will be able to access this instance.',
    auth_disabled: 'Auth disabled — password protection removed',
    disable_auth_failed: 'Failed to disable auth: ',
    bg_error_single: (title) => `"${title}" has encountered an error`,
    bg_error_multi: (count) => `${count} sessions have encountered an error`,
    // skill form
    skill_name: 'Name',
    skill_category: 'Category',
    skill_category_placeholder: 'Optional, e.g. devops',
    skill_content: 'SKILL.md content',
    skill_content_placeholder: 'YAML frontmatter + markdown body',
    skill_rename_not_supported: 'Renaming a skill is not supported. Create a new skill and delete the old one to rename.',
    skill_metadata: 'Metadata',
    // cron form
    cron_name_label: 'Name',
    cron_name_placeholder: 'Optional',
    cron_schedule_label: 'Schedule',
    cron_schedule_hint: "Use 'every 1h' or a cron expression for recurring jobs. Bare durations like '30m' run once.",
    cron_schedule_once_warning: "Duration forms like '30m' run once and are removed after running. Use 'every 30m' to keep a recurring job.",
    cron_prompt_label: 'Prompt',
    cron_deliver_label: 'Deliver output to',
    cron_deliver_local: 'Local (save output only)',
    cron_deliver_custom: 'Custom delivery target',
    cron_profile_label: 'Profile',
    cron_profile_server_default: 'server default',
    cron_profile_server_default_hint: 'Uses the WebUI server default profile at run time. Existing jobs without a profile keep this legacy behavior.',
    cron_toast_notifications_label: 'Completion toasts',
    cron_toast_notifications_hint: 'Show a toast when this cron finishes. The Tasks badge and new-run marker still update when this is off.',
    cron_toast_notifications_enabled: 'Enabled',
    cron_toast_notifications_disabled: 'Disabled',
    cron_skills_label: 'Skills',
    cron_skills_placeholder: 'Add skills (optional)…',
    cron_skills_edit_hint: 'Skill list is not editable after creation.',
    // workspace form
    workspace_name_label: 'Name',
    workspace_name_placeholder: 'Optional friendly name',
    workspace_path_label: 'Path',
    workspace_path_required: 'Path is required',
    workspace_path_readonly: 'Path cannot be changed. Rename only.',
    workspace_new_title: 'New space',
    // profile form
    profile_name_label: 'Name',
    profile_base_url_label: 'Base URL',
    profile_api_key_label: 'API key',
    cmd_yolo: 'Toggle YOLO mode (skip approvals)',
    yolo_no_session: 'No active session',
    yolo_enabled: '⚡ YOLO mode ON — approvals skipped this session',
    yolo_disabled: 'YOLO mode OFF',
    yolo_pill_label: 'YOLO',
    yolo_pill_title_active: 'YOLO mode active — click to disable',
    approval_skip_all: '⚡ Skip all this session',
    approval_skip_all_title: 'Skip all approval prompts for this session',
    // composer action tooltips
    composer_send: 'Send message',
    composer_queue: 'Queue message',
    composer_interrupt: 'Interrupt and send',
    composer_steer: 'Steer current response',
    composer_stop: 'Stop generation',
    composer_disabled_clarify: 'Respond to the clarification request',
    composer_disabled_compression: 'Waiting for compression to finish',
    composer_compression_will_queue: 'Type a message — it will queue and send after compression',
    composer_disabled_empty: 'Type a message to send',
    composer_mobile_workspace: 'Workspace',
    composer_mobile_model: 'Model',
    composer_mobile_reasoning: 'Reasoning',
    composer_mobile_context: 'Context',
    media_audio_label: 'Audio',
    media_svg_label: 'Diagram',
    media_video_label: 'Video',
    media_download: 'Download',
    csv_loading: 'Loading CSV',
    csv_too_large: 'CSV file too large for inline rendering',
    csv_no_data: 'CSV file has insufficient data to render as table',
    csv_error: 'Failed to load CSV file',
    csv_header_note: 'First row shown as table header',
    excalidraw_loading: 'Loading diagram',
    excalidraw_too_large: 'Excalidraw file too large for inline rendering',
    excalidraw_invalid: 'Invalid Excalidraw file format',
    excalidraw_error: 'Failed to load Excalidraw file',
    excalidraw_label: 'Diagram',
    excalidraw_download: 'Download',
    excalidraw_empty: 'Empty diagram',
    excalidraw_render_error: 'Failed to render diagram',
    excalidraw_simplified: 'Simplified SVG preview — not pixel-identical to Excalidraw canvas',
    // ── Checkpoints / Rollback ──
    checkpoint_title: 'Checkpoints',
    checkpoint_empty: 'No checkpoints found for this workspace.',
    checkpoint_loading: 'Loading checkpoints…',
    checkpoint_error: 'Failed to load checkpoints',
    checkpoint_date: 'Date',
    checkpoint_message: 'Message',
    checkpoint_files: 'Files',
    checkpoint_view_diff: 'View diff',
    checkpoint_restore: 'Restore',
    checkpoint_restore_confirm_title: 'Restore checkpoint?',
    checkpoint_restore_confirm_message: (ckpt) => `Restore workspace to checkpoint "${ckpt}"? This will overwrite files with the saved versions. Files added after this checkpoint will not be deleted.`,
    checkpoint_restored: 'Checkpoint restored',
    checkpoint_diff_title: 'Changes in checkpoint',
    checkpoint_diff_no_changes: 'No differences found between this checkpoint and the current workspace.',
    checkpoint_diff_files_changed: (n) => `${n} file${n === 1 ? '' : 's'} changed`,
    // ── Conversation Outline (#2124) ──
    outline_title: 'Outline',
    outline_empty: 'No questions yet.',
    outline_loading: 'Loading…',
  },

  it: {
    offline_title: 'Connessione persa',
    offline_browser_detail: 'Il browser segnala che questo dispositivo è offline.',
    offline_network_detail: 'Hermes non è raggiungibile da questo browser al momento.',
    offline_autorefresh: 'Aggiornerò automaticamente la pagina quando Hermes sarà di nuovo raggiungibile.',
    offline_check_now: 'Verifica ora',
    offline_checking: 'Verifica in corso…',
    offline_stream_waiting: 'Connessione persa. In attesa di aggiornare…',
    _lang: 'it',
    _label: 'Italiano',
    _speech: 'it-IT',
    // boot.js
    cancelling: 'Annullamento\u2026',
    cancel_failed: 'Annullamento fallito: ',
    mic_denied: 'Accesso al microfono negato. Controlla i permessi del browser.',
    mic_no_speech: 'Nessuna voce rilevata. Riprova.',
    mic_network: 'Riconoscimento vocale non disponibile.',
    mic_error: 'Errore input vocale: ',
    // Composer voice buttons (#1488 — distinct labels for dictation vs voice mode)
    voice_dictate: 'Detta',
    voice_dictate_active: 'Interrompi dettatura',
    voice_recording_active: 'Interrompi registrazione',
    voice_mode_toggle: 'Modalità vocale',
    voice_mode_toggle_active: 'Esci dalla modalità vocale',
    // Turn-based voice mode (#1333)
    voice_listening: 'In ascolto…',
    voice_speaking: 'Sto parlando…',
    voice_thinking: 'Pensando…',
    voice_error: 'Voce non supportata in questo browser',
    voice_mode_active: 'Modalità vocale attiva',
    voice_mode_off: 'Modalità vocale disattiva',
    session_imported: 'Sessione importata',
    import_failed: 'Importazione fallita: ',
    import_invalid_json: 'JSON non valido',
    image_pasted: 'Immagine incollata: ',
    // messages.js
    edit_message: 'Modifica messaggio',
    regenerate: 'Rigenera risposta',
    copy: 'Copia',
    copied: 'Copiato!',
    copy_failed: 'Copia fallita',
    selected_text_reply: 'Rispondi con selezione',
    selected_text_reply_title: 'Aggiungi il testo della chat selezionato come contesto citato',
    selected_text_reply_appended: 'Testo selezionato aggiunto al compositore',
    saved_prompts_empty: 'Nessun prompt salvato.',
    saved_prompts_save_current: 'Salva input corrente come prompt',
    saved_prompts_saved: 'Prompt salvato',
    saved_prompts_delete: 'Elimina prompt',
    saved_prompts_empty_input: 'Digita un prompt da salvare prima',

    diff_loading: 'Caricamento diff',
    diff_error: 'Impossibile caricare il file patch',
    diff_too_large: 'File patch troppo grande per la visualizzazione inline',
    tree_view: 'Albero',
    raw_view: 'Raw',
    parse_failed_note: 'parsing fallito',
    you: 'Tu',
    mcp_servers_title: 'Server MCP',
    mcp_servers_desc: 'Visualizza i server MCP configurati in config.yaml.',
    mcp_no_servers: 'Nessun server MCP configurato.',
    mcp_add_server: '+ Aggiungi Server',
    mcp_field_name: 'Nome Server',
    mcp_transport_label: 'Tipo Trasporto',
    mcp_field_command: 'Comando',
    mcp_field_args: 'Argomenti (separati da virgola)',
    mcp_field_url: 'URL',
    mcp_field_timeout: 'Timeout (secondi)',
    mcp_save: 'Salva',
    mcp_cancel: 'Annulla',
    mcp_name_required: 'Il nome del server è obbligatorio.',
    mcp_url_required: "L'URL è obbligatorio per il trasporto HTTP.",
    mcp_command_required: 'Il comando è obbligatorio per il trasporto stdio.',
    mcp_saved: 'Server MCP salvato.',
    mcp_save_failed: 'Salvataggio server MCP fallito.',
    mcp_delete_confirm_title: 'Elimina Server MCP',
    mcp_delete_confirm_message: 'Eliminare il server MCP "{0}"? Questa azione non può essere annullata.',
    mcp_deleted: 'Server MCP eliminato.',
    mcp_delete_failed: 'Eliminazione server MCP fallita.',
    mcp_load_failed: 'Caricamento server MCP fallito.',
    mcp_restart_hint: 'Le modifiche ai server sono in sola lettura qui. Modifica config.yaml e riavvia Hermes per applicare le modifiche.',
    mcp_toggle_followup: 'I controlli abilita/disabilita sono rinviati finché la semantica di ricaricamento MCP non sarà esplicita.',
    mcp_status_active: 'Attivo',
    mcp_status_configured: 'Configurato',
    mcp_status_disabled: 'Disabilitato',
    mcp_status_invalid_config: 'Configurazione non valida',
    mcp_status_unknown: 'Sconosciuto',
    mcp_tool_count: '{0} strumenti',
    mcp_enabled_yes: 'Abilitato',
    mcp_enabled_no: 'Disabilitato',
    mcp_enable_server: 'Enable this MCP server',
    mcp_disable_server: 'Disable this MCP server',
    mcp_enabled_toast: (name) => `MCP server "${name}" enabled.`,
    mcp_disabled_toast: (name) => `MCP server "${name}" disabled.`,
    mcp_toggle_failed: 'Failed to update MCP server.',
    mcp_tools_title: 'Strumenti MCP',
    mcp_tools_desc: 'Cerca strumenti noti tra i server MCP attivi.',
    mcp_tools_search_placeholder: 'Cerca strumenti per nome, server o descrizione…',
    mcp_tools_no_tools: "Nessuno strumento MCP disponibile dall'inventario runtime attivo.",
    mcp_tools_no_matches: 'Nessuno strumento MCP corrisponde alla ricerca.',
    mcp_tools_load_failed: 'Caricamento strumenti MCP fallito.',
    mcp_tools_schema_empty: 'Nessun parametro schema.',
    mcp_tools_runtime_note: "L'inventario strumenti usa solo dati runtime MCP già noti; la WebUI non avvia né interroga i server.",
    mcp_tools_summary_no_matches: (query,total) => `No MCP tools matching “${query}” (${total} total MCP tools).`,
    mcp_tools_summary_none: 'No MCP tools to show.',
    mcp_tools_summary_matching: (query) => ` matching “${query}”`,
    mcp_tools_summary_total_note: (total) => ` (${total} total MCP tools)`,
    mcp_tools_summary_showing: (start,end,filtered,searchNote,totalNote,page,pages) => `Showing ${start}-${end} of ${filtered} MCP tools${searchNote}${totalNote}. Page ${page} of ${pages}.`,
    mcp_tools_page_size_prefix: 'Show',
    mcp_tools_page_size_suffix: 'per page',
    mcp_tools_per_page_aria: 'MCP tools per page',
    mcp_tools_inactive_configured_servers: (servers) => `Configured but inactive in this WebUI runtime: ${servers}.`,
    mcp_tools_pagination_label: 'MCP tools pagination',
    mcp_tools_previous_page: '‹ Prev',
    mcp_tools_previous_page_aria: 'Previous MCP tools page',
    mcp_tools_next_page: 'Next ›',
    mcp_tools_next_page_aria: 'Next MCP tools page',
    // PDF preview (#480)
    pdf_loading: 'Caricamento PDF {0}…',
    pdf_too_large: "PDF troppo grande per l'anteprima inline",
    pdf_no_pages: 'Il PDF non ha pagine',
    pdf_error: 'Rendering anteprima PDF fallito',
    pdf_download: 'Scarica PDF',
    // HTML sandbox preview (#482)
    html_loading: 'Caricamento anteprima HTML…',
    html_too_large: "HTML troppo grande per l'anteprima inline",
    html_error: 'Rendering anteprima HTML fallito',
    html_open_full: 'Apri pagina intera',
    html_sandbox_label: 'Anteprima HTML (sandbox)',
    thinking: 'Pensando',
    expand_all: 'Espandi tutto',
    collapse_all: 'Comprimi tutto',
    edit_failed: 'Modifica fallita: ',
    regen_failed: 'Rigenerazione fallita: ',
    reconnect_active: 'Una risposta è ancora in generazione. Ricaricare quando pronta?',
    reconnect_finished: 'Una risposta era in corso quando hai lasciato. I messaggi potrebbero essere aggiornati.',
    // approval card
    approval_heading: 'Approvazione richiesta',
    approval_desc_prefix: 'Comando pericoloso rilevato',
    approval_btn_once: 'Consenti una volta',
    approval_btn_once_title: 'Consenti questo comando (Invio)',
    approval_btn_session: 'Consenti sessione',
    approval_btn_session_title: 'Consenti per questa sessione di conversazione',
    approval_btn_always: 'Consenti sempre',
    approval_btn_always_title: 'Consenti sempre questo tipo di comando',
    approval_btn_deny: 'Nega',
    approval_btn_deny_title: 'Nega — non eseguire questo comando',
    approval_responding: 'Rispondendo\u2026',
    clarify_heading: 'Chiarimento necessario',
    clarify_hint: "Scegli un'opzione o scrivi la tua risposta qui sotto.",
    clarify_other: 'Altro',
    clarify_send: 'Invia',
    clarify_input_placeholder: 'Scrivi la tua risposta…',
    clarify_responding: 'Rispondendo\u2026',
    session_attention_approval: (n) => n === 1 ? 'Approvazione' : `${n} approvazioni`,
    session_attention_clarify: (n) => n === 1 ? 'Domanda' : `${n} domande`,
    session_attention_generic: (n) => n === 1 ? 'Attenzione' : `${n} elementi`,
    session_attention_approval_title: 'In attesa di una decisione di approvazione',
    session_attention_clarify_title: 'In attesa della tua risposta',
    session_attention_generic_title: 'In attesa di un’azione dell’utente',
    untitled: 'Senza titolo',
    n_messages: (n) => n === 1 ? `${n} messaggio` : `${n} messaggi`,
    load_older_messages: '↑ Scorri in alto o clicca per caricare i messaggi precedenti',
    session_jump_start: 'Inizio',
    session_jump_start_label: "Vai all'inizio della sessione",
    session_jump_end: 'Fine',
    session_jump_end_label: 'Vai alla fine della sessione',
    session_new_message: 'Nuovo messaggio',
    session_new_message_label: 'Nuovo messaggio disponibile, vai alla fine',
    jump_to_question: 'alla risposta',
    jump_to_question_label: 'Vai all\'inizio di questa risposta',
    queued_label: 'Inviato dopo la risposta',
    queued_count: (n) => n === 1 ? '1 in coda' : `${n} in coda`,
    queued_cancel: 'Annulla messaggio in coda',
    model_unavailable: ' (non disponibile)',
    model_unavailable_title: 'Questo modello non è più nella lista provider attuale',
    provider_mismatch_warning: (m,p)=>`"${m}" potrebbe non funzionare con il provider configurato (${p}). Invia comunque, o esegui \`hermes model\` nel terminale per cambiare.`,
    provider_mismatch_label: 'Provider non corrispondente',
    gateway_auth_label: 'Autenticazione Gateway non riuscita',
    model_not_found_label: 'Modello non trovato',
    model_custom_label: 'ID modello personalizzato',
    model_custom_placeholder: 'es. openai/gpt-5.4',
    model_search_placeholder: 'Cerca modelli…',
    model_search_no_results: 'Nessun modello trovato',
    model_group_configured: 'Configurato',
    ws_search_placeholder: 'Cerca workspace…',
    ws_no_results: 'Nessun workspace trovato',
    workspace_new_worktree_conversation: 'Nuova conversazione in worktree',
    workspace_new_worktree_conversation_meta: 'Crea un worktree git isolato per questo workspace.',
    workspace_worktree_created: 'Conversazione worktree creata',
    workspace_worktree_failed: 'Creazione worktree fallita: ',
    session_worktree_badge: 'Worktree',
    model_scope_advisory: 'Si applica a questa conversazione dal prossimo messaggio.',
    model_scope_toast: 'Si applica a questa conversazione dal prossimo messaggio.',
    // commands.js
    cmd_clear: 'Cancella i messaggi della conversazione',
    cmd_help: 'Show available slash commands',
    cmd_compress: 'Comprimi manualmente il contesto della conversazione (uso: /compress [argomento])',
    ctx_compress_hint: 'Comprimi il contesto per liberare spazio →',
    ctx_compress_action: '⚠ Comprimi ora per liberare contesto',
    cmd_compact_alias: 'Alias legacy per /compress',
    cmd_model: 'Cambia modello (es. /model gpt-4o)',
    cmd_workspace: 'Cambia workspace per nome',
    cmd_terminal: 'Apri il terminale del workspace',
    cmd_new: 'Avvia una nuova sessione di chat',
    cmd_usage: 'Attiva/disattiva visualizzazione uso token',
    cmd_theme: 'Cambia aspetto (tema: system/dark/light, skin: default/ares/mono/graphite/slate/poseidon/sisyphus/charizard/sienna/catppuccin/nous/geist-contrast/zeus/verdigris)',
    cmd_personality: "Cambia personalità dell'agente",
    cmd_skills: 'Elenca le skill Hermes disponibili',
    cmd_use: 'Forza una skill per il prossimo messaggio',
    available_commands: 'Comandi disponibili:',
    type_slash: 'Digita / per vedere i comandi',
    conversation_cleared: 'Conversazione cancellata',
    command_label: 'Comando',
    context_compaction_label: 'Compattazione contesto',
    retrieval_context_label: 'Contesto indicizzato',
    retrieval_context_preview: 'I messaggi precedenti sono archiviati e recuperabili con gli strumenti di contesto',
    preserved_task_list_label: 'Lista task preservata',
    reference_only_label: 'Solo riferimento',
    model_usage: 'Uso: /model <nome>',
    no_model_match: 'Nessun modello corrispondente a "',
    model_did_you_mean: (m) => ` — intendevi "${m}"?`,
    switched_to: 'Passato a ',
    workspace_usage: 'Uso: /workspace <nome>',
    no_workspace_match: 'Nessun workspace corrispondente a "',
    switched_workspace: 'Passato al workspace: ',
    workspace_switch_failed: 'Cambio workspace fallito: ',
    new_session: 'Nuova sessione creata',
    new_session_creating: 'Creazione nuova conversazione…',
    compressing: 'Richiesta compressione contesto...',
    compress_running_label: 'Compressione in corso',
    compress_complete_label: 'Compressione completata',
    auto_compress_label: 'Compressione automatica',
    compress_failed_label: 'Compressione fallita',
    focus_label: 'Focus',
    token_usage_on: 'Uso token attivo',
    token_usage_off: 'Uso token disattivo',
    usage_cache_hit_detail: 'Cache: {0}% in cache ({1} letti / {2} scritti)',
    usage_cached_percent: '{0}% in cache',
    theme_usage: 'Uso: /theme ',
    theme_set: 'Tema: ',
    no_active_session: 'Nessuna sessione attiva',
    cmd_queue: 'Metti in coda un messaggio per il prossimo turno',
    cmd_goal: 'Imposta o controlla un obiettivo persistente',
    goal_evaluating_progress: 'Valutazione progresso obiettivo…',
    goal_working_toward: "Lavorando verso l'obiettivo…",
    goal_continuing_toast: "Proseguendo verso l'obiettivo…",
    goal_status_none: 'Nessun obiettivo attivo. Impostane uno con /goal <testo>.',
    goal_status_active: (turns, max_turns, goal) => `⊙ Obiettivo (attivo, ${turns}/${max_turns} turni): ${goal}`,
    goal_status_paused: (turns, max_turns, reason, goal) => `⏸ Obiettivo (in pausa, ${turns}/${max_turns}${reason ? `, ${reason}` : ''}): ${goal}`,
    goal_status_done: (turns, max_turns, goal) => `✓ Obiettivo completato (${turns}/${max_turns}): ${goal}`,
    goal_set: (turns, goal) => `⊙ Obiettivo impostato (budget ${turns} turni): ${goal}`,
    goal_paused: (goal) => `⏸ Obiettivo in pausa: ${goal}`,
    goal_resumed: (goal) => `▶ Obiettivo ripreso: ${goal}`,
    goal_cleared: 'Obiettivo rimosso.',
    goal_no_goal: 'Nessun obiettivo attivo.',
    goal_achieved: (reason) => `✓ Obiettivo raggiunto: ${reason}`,
    goal_paused_budget_exhausted: (turns, max_turns) => `⏸ Obiettivo in pausa — ${turns}/${max_turns} turni usati. Usa /goal resume per continuare, o /goal clear per fermarti.`,
    goal_continuing: (turns, max_turns, reason) => `↻ Proseguendo verso l'obiettivo (${turns}/${max_turns}): ${reason}`,
    cmd_interrupt: 'Annulla il turno corrente e invia un nuovo messaggio',
    cmd_steer: "Inietta una correzione a metà turno senza interrompere l'agente",
    cmd_queue_no_msg: 'Uso: /queue <messaggio>',
    cmd_queue_not_busy: 'Nessun task attivo — invia normalmente',
    cmd_queue_confirm: 'Messaggio in coda',
    cmd_interrupt_no_msg: 'Uso: /interrupt <messaggio>',
    cmd_interrupt_confirm: 'Interrotto — invio nuovo messaggio',
    cmd_steer_no_msg: 'Uso: /steer <messaggio>',
    cmd_steer_fallback: 'Steer non disponibile — messaggio in coda per il prossimo turno',
    cmd_steer_delivered: "Steer consegnato — l'agente lo vedrà al prossimo risultato strumento",
    steer_leftover_queued: 'Steer in coda per il prossimo turno',
    busy_steer_fallback: 'Steer non disponibile — messaggio in coda per il prossimo turno',
    busy_interrupt_confirm: 'Interrotto — invio nuovo messaggio',
    settings_label_busy_input_mode: 'Modalità input occupato',
    settings_desc_busy_input_mode: "Controlla cosa succede quando invii un messaggio mentre l'agente è in esecuzione. Coda attende; Interrompi annulla e ricomincia; Steer inietta una correzione a metà turno senza interrompere (fallback a coda se agente o stream non disponibili).",
    settings_label_fade_text_effect: 'Effetto dissolvenza testo',
    settings_desc_fade_text_effect: 'Dissolve gradualmente le nuove parole trasmesse in streaming mentre l’assistente risponde. Simile a OpenWebUI; disattivato per impostazione predefinita per massime prestazioni.',
    settings_busy_input_mode_queue: 'Accoda follow-up',
    settings_busy_input_mode_interrupt: 'Interrompi turno corrente',
    settings_busy_input_mode_steer: 'Steer (correzione a metà turno)',

  slash_skill_badge:'Skill',
  slash_skill_desc:'Invoca questa skill',
  cmd_stop:'Ferma la risposta corrente',
  cmd_title:'Mostra o imposta il titolo della sessione',
  cmd_retry:"Reinvia l'ultimo messaggio",
  cmd_undo:"Rimuovi l'ultimo scambio",
  cmd_btw:'Fai una domanda laterale (effimera)',
  cmd_btw_usage:'/btw <domanda> — fai una domanda laterale usando il contesto della sessione',
   cmd_background:'Esegui un prompt in background',
   cmd_background_usage:'/background <prompt> — esegui in parallelo senza bloccare',
   cmd_branch:'Dirama questa conversazione in una nuova sessione',
   cmd_branch_usage:'/branch [nome] — dirama la conversazione (opzionalmente con un nome)',
   branch_forked:'Diramata in nuova sessione',
   branch_failed:'Diramazione fallita: ',
   fork_from_here:'Dirama da qui',
   forked_from:'Diramata da',
   subagent_children:'Sessioni subagente',
   btw_asking:'Domanda laterale in corso...',
  btw_label:'Domanda laterale — non nella cronologia',
  btw_done:'Domanda laterale risposta',
  btw_no_answer:'Nessuna risposta ricevuta.',
  btw_failed:'Domanda laterale fallita: ',
  bg_running:'In esecuzione in background...',
  bg_complete:'Task in background completato',
  bg_label:'Risultato background:',
  bg_no_answer:'(nessuna risposta)',
  bg_failed:'Task in background fallito: ',
  undo_exchange:'Annulla ultimo scambio',
  cmd_status:'Mostra info sessione',
  cmd_voice:'Attiva/disattiva input microfono',
  stream_stopped:'Risposta fermata.',
  no_active_task:'Nessun task attivo da fermare.',
  cancel_unavailable:'Annullamento non disponibile.',
  retry_failed:'Riprova fallito: ',
  undo_failed:'Annulla fallito: ',
  undid_n_messages:'Rimossi',
  undid_messages_suffix:'messaggio/i.',
  status_heading:'Stato Sessione',
  status_session_id:'ID Sessione',
  status_title:'Titolo',
  status_model:'Modello',
  status_provider:'Provider',
  status_workspace:'Workspace',
  status_personality:'Personalità',
  status_messages:'Messaggi',
  status_agent_running:'Agente in esecuzione',
    status_profile: 'Profilo',
    status_hermes_home: 'Home Hermes',
    status_started: 'Avviato',
    status_updated: 'Aggiornato',
    status_tokens: 'Token',
    status_ephemeral: 'Snapshot effimero — non salvato nella cronologia trascrizioni.',
    status_no_tokens: 'Nessun token usato',
    status_unknown: 'Sconosciuto',
  status_yes:'Sì',
  status_no:'No',
  status_load_failed:'Caricamento stato fallito: ',
  title_current:'Titolo attuale',
  title_change_hint:'Usa `/title <nuovo nome>` per rinominare.',
  title_set:'Titolo impostato a',
  cmd_webui_only_session:'Questo comando non è disponibile per sessioni importate da CLI.',
  cmd_voice_use_mic:'Clicca il pulsante microfono nel compositore.',
  usage_heading:'Uso Token',
  usage_default_model:'predefinito',
  usage_unknown:'sconosciuto',
  usage_input_tokens:'Token input',
  usage_output_tokens:'Token output',
  usage_total:'Token totali',
  usage_estimated_cost:'Costo stimato',
  usage_settings_tip:'Nota: le stime dei costi sono approssimative.',
  usage_load_failed:'Caricamento uso fallito: ',
    usage_personality_none:'nessuna',
    // Session toolsets (#493)
    session_toolsets:'Strumenti Sessione',
    session_toolsets_desc:'Limita gli strumenti disponibili per questa sessione (vuoto = usa config globale)',
    session_toolsets_global:'Globale (predefinito)',
    session_toolsets_custom:'Personalizzato',
    session_toolsets_placeholder:'strumento1, strumento2, …',
    session_toolsets_apply:'Applica',
    session_toolsets_clear:'Pulisci (usa globale)',
    session_toolsets_applied:'Strumenti aggiornati',
    session_toolsets_cleared:'Strumenti azzerati — uso config globale',
    session_toolsets_failed:'Aggiornamento strumenti fallito: ',
  untitled:'Senza titolo',
    no_personalities: 'Nessuna personalità trovata (aggiungile in ~/.hermes/personalities/)',
    available_personalities: 'Personalità disponibili:',
    personality_switch_hint: '\\n\\nUsa `/personality <nome>` per cambiare, o `/personality none` per rimuovere.',
    personalities_load_failed: 'Caricamento personalità fallito',
    personality_cleared: 'Personalità rimossa',
    personality_set: 'Personalità: ',
    failed_colon: 'Fallito: ',
    // ui.js
    no_workspace: 'Nessun workspace',
    terminal_open_title: 'Apri terminale workspace',
    terminal_no_workspace_title: 'Seleziona un workspace per aprire il terminale',
    terminal_title: 'Terminale',
    terminal_clear: 'Pulisci',
    terminal_copy_output: 'Copia output',
    terminal_restart: 'Riavvia',
    terminal_collapse: 'Comprimi',
    terminal_expand: 'Espandi',
    terminal_close: 'Chiudi',
    terminal_input_placeholder: 'Esegui un comando...',
    terminal_start_failed: 'Avvio terminale fallito: ',
    terminal_input_failed: 'Input terminale fallito: ',
    terminal_copy_failed: 'Copia fallita: ',
    terminal_error: 'Errore terminale',
    terminal_remote_backend_unsupported: 'Il terminale incorporato è supportato solo per backend terminali locali.',
    workspace_empty_no_path: 'Nessun workspace selezionato. Imposta un workspace in Impostazioni \u2192 Workspace per esplorare i file.',
    workspace_empty_dir: 'Questo workspace è vuoto.',
    workspace_show_hidden_files: 'Mostra file nascosti',
    workspace_show_hidden_files_desc: "Includi .DS_Store, .git, node_modules e altri file nascosti/di sistema nell'albero dei file.",
    workspace_hidden_files_visible: 'nascosti visibili',
    workspace_hidden_files_visible_title: 'I file nascosti sono visibili — clicca per opzioni',
    workspace_options: 'Opzioni workspace',
    dialog_confirm_title: 'Conferma azione',
    dialog_prompt_title: 'Inserisci un valore',
    dialog_confirm_btn: 'Conferma',
    // workspace.js
    unsaved_confirm: "Hai modifiche non salvate nell'anteprima. Scartare e navigare?",
    discard: 'Scarta',
    save: 'Salva',
    edit: 'Modifica',
    clear: 'Pulisci',
    create: 'Crea',
    remove: 'Rimuovi',
    save_title: 'Salva modifiche',
    edit_title: 'Modifica questo file',
    saved: 'Salvato',
    save_failed: 'Salvataggio fallito: ',
    image_load_failed: "Impossibile caricare l'immagine",
    file_open_failed: 'Impossibile aprire il file',
    downloading: (name) => `Scaricamento ${name}\u2026`,
    double_click_rename: 'Doppio clic per rinominare',
    session_rename_failed_no_row: 'Could not start rename — row not found.',
    renamed_to: 'Rinominato in ',
    rename_failed: 'Rinomina fallita: ',
    moved_to: 'Spostato in ',
    move_failed: 'Spostamento fallito: ',
    delete_title: 'Elimina',
    delete_confirm: (name) => `Eliminare ${name}?`,
    delete_dir_confirm: (name) => `Eliminare la cartella "${name}" e tutto il suo contenuto?`,
    rename_title: 'Rinomina',
    rename_prompt: 'Nuovo nome:',
    deleted: 'Eliminato ',
    delete_failed: 'Eliminazione fallita: ',
     reveal_in_finder: 'Mostra nel File Manager',
     reveal_failed: 'Mostra fallito: ',
     copy_file_path: 'Copia percorso file',
     open_in_vscode: 'Apri in VS Code',
     open_in_vscode_failed: 'Apertura in VS Code fallita: ',
     download_folder: 'Download Folder', // TODO: translate
    path_copied: 'Percorso file copiato negli appunti',
    path_copy_failed: 'Copia percorso fallita: ',
    session_rename: 'Rinomina conversazione',
    session_rename_desc: 'Modifica il titolo di questa conversazione',
    session_title_regenerate: 'Rigenera titolo',
    session_title_regenerate_desc: 'Chiedi a Hermes di generare un nuovo titolo dalla conversazione',
    session_title_regenerating: 'Rigenerazione del titolo…',
    session_title_regenerated: (title) => `Titolo rigenerato: ${title}`,
    session_title_regenerate_failed: 'Rigenerazione del titolo non riuscita: ',
    session_copy_link: 'Copia link conversazione',
    session_copy_link_desc: 'Copia un link diretto a questa conversazione',
    session_link_copied: 'Link conversazione copiato negli appunti',
    session_link_copy_failed: 'Impossibile copiare il link della conversazione: ',
    new_file_prompt: 'Nuovo nome file (es. note.md):',
    new_file: 'Nuovo file',
    new_folder: 'Nuova cartella',
    workspace_root: 'root del workspace',
    new_file_prompt_title: 'Nuovo nome file in {0}:',
    new_folder_prompt_title: 'Nuovo nome cartella in {0}:',
    project_name_prompt: 'Nome progetto:',
    created: 'Creato ',
    create_failed: 'Creazione fallita: ',
    new_folder_prompt: 'Nuovo nome cartella:',
    folder_created: 'Cartella creata ',
    folder_create_failed: 'Creazione cartella fallita: ',
  workspace_auto_create_folder: 'Crea cartella se non esiste',
  folder_add_as_space_btn: 'Aggiungi come Spazio',
  folder_add_as_space_msg: 'Aggiungere questa cartella come nuovo spazio nella lista workspace?',
  folder_add_as_space_title: 'Aggiungere come Spazio?',
    remove_title: 'Rimuovi',
    empty_dir: '(vuota)',
    upload_failed: 'Upload fallito: ',
    upload_too_large: (maxMb, fileMb) => `File troppo grande (${fileMb} MB). La dimensione massima è ${maxMb} MB.`,
    uploading: 'Caricamento…',
    uploaded: 'Caricato',
    all_uploads_failed: (n) => `Tutti gli ${n} upload sono falliti`,
    archive_extracted: (n, c) => `Estratti ${n} file da ${c} archivio/i`,
    session_pin: 'Fissa conversazione',
    session_unpin: 'Sblocca conversazione',
    session_pin_desc: 'Mantieni questa conversazione in cima',
    session_unpin_desc: 'Rimuovi dalle fissate',
    session_pin_failed: 'Fissa fallito: ',
    session_move_project: 'Sposta nel progetto',
    session_move_project_desc_has: 'Cambia il progetto per questa conversazione',
    session_move_project_desc_none: 'Assegna un progetto a questa conversazione',
    session_archive: 'Archivia conversazione',
    session_hide_external: 'Nascondi dalla lista',
    session_restore: 'Ripristina conversazione',
    session_archive_desc: 'Nascondi questa conversazione fino a mostrare archiviate',
    session_archive_worktree_desc: 'Nascondi questa conversazione; mantieni il suo worktree su disco',
    session_hide_external_desc: 'Nascondi questa sessione importata dalla WebUI senza eliminare lo storico originale.',
    session_restore_desc: 'Riporta questa conversazione nella lista principale',
    session_archived: 'Sessione archiviata',
    session_archived_worktree: 'Sessione archiviata. Il worktree rimane su disco.',
    session_hidden: 'Sessione nascosta dalla lista',
    session_restored: 'Sessione ripristinata',
    session_archive_failed: 'Archiviazione fallita: ',
    session_duplicate: 'Duplica conversazione',
    session_duplicate_desc: 'Crea una copia con lo stesso workspace e modello',
    session_duplicated: 'Sessione duplicata',
    session_duplicate_failed: 'Duplicazione fallita: ',
    session_stop_response: 'Ferma risposta',
    session_stop_response_desc: 'Annulla la risposta in corso per questa conversazione',
    session_delete: 'Elimina conversazione',
    session_delete_desc: 'Rimuovi permanentemente questa conversazione',
    session_delete_confirm: 'Eliminare questa conversazione?',
    session_delete_worktree_desc: 'Elimina solo la conversazione di WebUI; mantieni il worktree su disco',
    session_delete_worktree_confirm: (path) => `Eliminare questa conversazione? Il worktree in ${path} rimarrà su disco.`,
    session_deleted: 'Conversazione eliminata',
    session_deleted_worktree: 'Conversazione eliminata. Il worktree rimane su disco.',
    session_worktree_remove: 'Rimuovi worktree',
    session_worktree_remove_desc: (path) => `Elimina il git worktree in ${path} dal disco`,
    session_worktree_remove_confirm: (path) => `Rimuovere il git worktree dal disco?\n\nPercorso: ${path}\n\nVerrà eliminata l'intera directory del worktree. I dati della sessione restano in WebUI.`,
    session_worktree_remove_not_exists: (path) => `Il worktree in ${path} non esiste più sul disco.`,
    session_worktree_remove_confirm_label: 'Rimuovi',
    session_worktree_removed: 'Worktree rimosso.',
    session_worktree_remove_failed: 'Rimozione worktree fallita: ',
    session_worktree_remove_status_failed: 'Lettura stato worktree fallita: ',
    session_worktree_remove_locked_by_stream: 'Impossibile rimuovere — una sessione di streaming attiva sta usando questo worktree.',
    session_worktree_remove_locked_by_terminal: 'Impossibile rimuovere — una sessione terminale attiva sta usando questo worktree.',
    session_worktree_remove_unsafe_blocked: 'Risolvi le modifiche locali o i commit non inviati prima di rimuovere questo worktree.',
    session_worktree_remove_dirty_warning: 'ATTENZIONE: Questo worktree ha modifiche non committate che andranno perse.',
    session_worktree_remove_untracked_warning: (count) => `${count} file non tracciati verranno eliminati definitivamente.`,
    session_worktree_remove_ahead_warning: (ahead) => `${ahead} commit non inviati andranno persi.`,
    session_select_mode: 'Seleziona',
    session_select_mode_desc: 'Seleziona conversazioni per gestione in blocco',
    session_select_all: 'Seleziona tutto',
    session_deselect_all: 'Deseleziona tutto',
    session_selected_count: '{0} selezionate',
    session_batch_archive: 'Archivia',
    session_batch_delete: 'Elimina',
    session_batch_move: 'Sposta nel progetto',
    session_batch_delete_confirm: 'Eliminare {0} conversazioni?',
    session_batch_archive_confirm: 'Archiviare {0} conversazioni?',
    session_batch_delete_worktree_confirm: 'Eliminare {0} conversazioni? {1} conversazioni con worktree lasceranno le loro directory worktree su disco.',
    session_batch_archive_worktree_confirm: 'Archiviare {0} conversazioni? {1} conversazioni con worktree manterranno le loro directory worktree su disco.',
    session_no_selection: 'Nessuna conversazione selezionata',
    // settings panel
    settings_heading_title: 'Pannello di Controllo',
    settings_heading_subtitle: 'Preferenze, strumenti di conversazione e controlli di sistema.',
    settings_section_conversation_title: 'Conversazione',
    settings_section_appearance_title: 'Aspetto',
    settings_section_appearance_meta: 'Tema, colori accento e stile visivo.',
    settings_section_preferences_title: 'Preferenze',
    settings_section_preferences_meta: 'Predefiniti e comportamento UI per Hermes Web UI.',
    settings_section_system_title: 'Sistema',
    settings_section_system_meta: 'Versione istanza e controlli di accesso.',
    settings_check_now: 'Verifica ora',
    settings_checking: 'Verifica in corso\u2026',
    settings_up_to_date: 'Aggiornato \u2713',
    settings_updates_available: '{count} aggiornamento/i disponibile/i',
    settings_updates_disabled: 'Verifica aggiornamenti disabilitata',
    settings_update_check_failed: 'Verifica aggiornamenti fallita',
    settings_label_workspace_panel_open: 'Mantieni il pannello workspace aperto per impostazione predefinita',
    settings_desc_workspace_panel_open: 'Se abilitato, il pannello workspace/esplora file si apre automaticamente a ogni nuova sessione. Puoi comunque chiuderlo manualmente in qualsiasi momento.',
    settings_label_session_jump_buttons: 'Mostra pulsanti salto sessione',
    settings_desc_session_jump_buttons: 'Mostra pulsanti fluttuanti Inizio e Fine durante la lettura di sessioni lunghe.',
    settings_label_terminal_auto_expand: 'Espandi automaticamente il terminale sull\'output',
    settings_desc_terminal_auto_expand: 'Espandi automaticamente il pannello terminale compresso quando un comando in esecuzione emette nuovo output.',

    settings_label_session_endless_scroll: 'Carica messaggi precedenti scorrendo in alto',

    settings_desc_session_endless_scroll: 'Se abilitato, i messaggi precedenti si caricano automaticamente scorrendo in alto. Se disabilitato, usa il pulsante messaggi precedenti.',
    settings_label_auto_scroll_follow: 'Segui automaticamente i nuovi contenuti',
    settings_desc_auto_scroll_follow: 'Se abilitato, la vista scorre verso il basso man mano che arrivano nuovi token. Se disabilitato, controlli tu la posizione di scorrimento.',
    settings_label_worklog_details_expanded_default: 'Open Worklog details automatically',
    settings_desc_worklog_details_expanded_default: 'When enabled, new Worklog details start expanded so tool, thinking, and progress cards are visible without an extra click. When off, Worklog details stay folded by default; per-turn manual collapse/expand choices still win.',
    settings_label_chat_activity_display_mode: 'Activity display',
    settings_desc_chat_activity_display_mode: 'Compact Worklog groups supporting activity into a quiet summary. Transparent Stream keeps each thinking/tool event as its own chronological expandable row.',
    first_token_time: 'Time to first token',
    done: 'Done',
    settings_option_compact_worklog: 'Compact Worklog',
    settings_option_transparent_stream: 'Transparent Stream',

    settings_label_tab_visibility: 'Schede della barra laterale',
    settings_desc_tab_visibility: 'Scegli quali schede mostrare nella barra laterale e nel rail. Chat e Impostazioni sono sempre visibili.',
    open_in_browser: 'Apri nel browser',
    settings_dropdown_conversation: 'Conversazione',
    settings_dropdown_appearance: 'Aspetto',
    settings_dropdown_preferences: 'Preferenze',
    settings_dropdown_providers: 'Provider',
    settings_dropdown_system: 'Sistema',
    settings_tab_conversation: 'Conversazione',
    settings_tab_appearance: 'Aspetto',
    settings_tab_preferences: 'Preferenze',
    settings_tab_plugins: 'Plugin',
    settings_plugins_title: 'Plugins',  // TODO: translate
    plugins_enable_toggle: 'Abilita',
    settings_plugins_meta: 'View installed Hermes plugins and the lifecycle hooks they register. This panel is read-only.',  // TODO: translate
    settings_plugins_empty: 'No Hermes plugins are currently visible. Install or enable plugins from the Hermes CLI/config to see them here.',  // TODO: translate
    plugins_unnamed: 'Unnamed plugin',  // TODO: translate
    plugins_no_description: 'No description provided.',  // TODO: translate
    plugins_no_hooks: 'No registered lifecycle hooks',  // TODO: translate
    plugins_registered_hooks: 'Registered hooks',  // TODO: translate
    plugins_enabled: 'Enabled',  // TODO: translate
    plugins_disabled: 'Disabled',  // TODO: translate
    plugins_active_provider: 'Active (provider)',  // TODO: translate
    plugins_provider_no_hooks: 'Provider plugin — no agent-visibility hooks',  // TODO: translate
    plugins_load_failed: 'Failed to load plugins: ',  // TODO: translate
    settings_tab_system: 'Sistema',
    settings_tab_help: 'Help',
    settings_help_meta: 'Resources and support for Hermes WebUI.',
    settings_help_docs_label: 'Documentation',
    settings_help_docs_desc: 'Guides, configuration reference, and the full Hermes WebUI README.',
    settings_help_docs_link: 'Open Documentation',
    settings_help_issue_label: 'Having an issue?',
    settings_help_issue_desc: 'Search existing reports or open a new one on GitHub.',
    settings_help_issue_link: 'Open GitHub Issues',
    settings_title: 'Impostazioni',
    settings_save_btn: 'Salva Impostazioni',
    settings_label_model: 'Modello Predefinito',
    settings_desc_model: 'Usato per le nuove conversazioni. Le conversazioni esistenti mantengono il modello selezionato.',
    settings_label_auxiliary_models: 'Modelli Ausiliari',
    settings_desc_auxiliary_models: 'Routing per attività secondarie come visione, compressione, generazione titoli, ecc. "Auto" utilizza il modello chat principale.',
    settings_btn_reset_aux_models: 'Ripristina tutto ad auto',
    settings_btn_apply_aux_models: 'Applica modifiche',
    settings_aux_provider_auto: 'usa modello principale',
    settings_aux_model_auto: 'auto (usa predefinito del provider)',
    settings_aux_model_custom: 'Modello personalizzato…',
    settings_aux_model_custom_prompt: 'Inserisci ID modello:',
    settings_aux_loading: 'Caricamento modelli ausiliari…',
    settings_aux_load_failed: 'Impossibile caricare le impostazioni dei modelli ausiliari. Assicurati che l’API dell’agent sia disponibile.',
    settings_aux_reset_confirm_title: 'Ripristinare modelli ausiliari?',
    settings_aux_reset_confirm_msg: 'Questo imposterà tutte le attività ausiliarie ad auto (usa modello principale).',
    settings_aux_reset_done: 'Modelli ausiliari ripristinati ad auto',
    settings_aux_save_failed: 'Salvataggio del modello ausiliario non riuscito',
    settings_aux_saved: 'Modelli ausiliari aggiornati',
    settings_aux_no_changes: 'Nessuna modifica da applicare',
    settings_label_send_key: 'Tasto Invio',
    settings_label_theme: 'Tema',
    settings_label_skin: 'Skin',
    settings_label_font_size: 'Dimensione font',
    font_size_small: 'Piccolo',
    font_size_default: 'Predefinito',
    font_size_large: 'Grande',
    font_size_xlarge: 'Molto grande',
    settings_autosave_saving: 'Salvataggio…',
    settings_autosave_saved: 'Salvato',
    settings_autosave_failed: 'Salvataggio fallito',
    settings_autosave_retry: 'Riprova',
    settings_label_language: 'Lingua',
    settings_label_quota_chip: 'Mostra il chip della quota del provider nel compositore',
    settings_desc_quota_chip: "Mostra un indicatore di quota residua (es. saldo crediti OpenRouter) nel piè di pagina del compositore. Predefinito disattivato. Visibile solo su schermi larghi (≥1400px) quando attivato, per mantenere il compositore non affollato su laptop e desktop standard.",
    settings_label_conversation_outline: 'Mostra struttura conversazione',
    settings_desc_conversation_outline: 'Mostra un elenco di salto solo desktop per le domande utente nella conversazione corrente. Disattivato per impostazione predefinita.',
    settings_label_hide_suggestions: 'Hide new-chat suggestions',
    settings_desc_hide_suggestions: 'Hide the three default suggestion buttons on the empty new-chat screen to avoid accidental taps.',
    settings_label_token_usage: 'Mostra uso token',
    settings_label_token_speed: 'Mostra velocità token (TPS)',
    settings_desc_token_speed: 'Mostra i token al secondo nelle intestazioni dei messaggi dell\'assistente durante lo streaming e al completamento della risposta. Disattivato per impostazione predefinita.',
    settings_label_sidebar_density: 'Densità sidebar',
    cmd_reasoning: 'Mostra/nascondi ragionamento, imposta livello sforzo o controlla stato attuale',
    settings_label_external_sessions: 'Mostra sessioni non-WebUI',
    settings_label_cron_sessions: 'Show cron sessions',
    settings_label_previous_messaging_sessions: 'Mostra sessioni di messaggistica precedenti',
    settings_label_sync_insights: 'Sincronizza con insights',
    settings_label_check_updates: 'Verifica aggiornamenti',
    settings_label_ignore_agent_updates: 'Ignore Agent updates',
    settings_label_whats_new_summary: "Summarize What's New with AI",
    settings_label_bot_name: 'Nome assistente predefinito',
    settings_label_password: 'Password di Accesso',
    settings_label_pinned_limit: 'Limite conversazioni fissate',
    settings_desc_pinned_limit: 'Numero massimo di conversazioni attive che possono essere fissate nella barra laterale. Predefinito 3.',
    settings_label_dashboard_mode: 'Dashboard ufficiale Hermes',
    settings_desc_dashboard_mode: 'Mostra un link nella nav-rail quando il dashboard ufficiale hermes è raggiungibile. Gli URL del reverse proxy pubblico sono memorizzati solo come link nel browser e non vengono mai verificati dal server.',
    settings_dashboard_mode_auto: 'Rilevamento automatico',
    settings_dashboard_mode_always: 'Mostra sempre',
    settings_dashboard_mode_never: 'Non mostrare mai',
    settings_dashboard_save: 'Salva impostazioni link dashboard',
    settings_label_gateway_status: 'Stato del Gateway',
    settings_desc_gateway_status: 'Stato del gateway Hermes (Telegram, Discord, Slack, ecc.)',
    gateway_not_configured: 'Gateway non configurato',
    gateway_metadata_stale: 'Metadati del gateway obsoleti',
    gateway_endpoint_unreachable: 'Endpoint del gateway non raggiungibile',
    gateway_not_running: 'Gateway non in esecuzione',
    gateway_running_label: 'In esecuzione',
    gateway_last_active: 'Ultima attività: ',
    gateway_session_count: (n) => `${n} ${n === 1 ? 'sessione' : 'sessioni'}`,
    gateway_load_failed: 'Impossibile caricare lo stato del gateway',
    settings_saved: 'Impostazioni salvate',
    settings_save_failed: 'Salvataggio fallito: ',
    settings_load_failed: 'Caricamento impostazioni fallito: ',
    settings_saved_pw: 'Impostazioni salvate — protezione password abilitata e questo browser rimane autenticato',
    settings_saved_pw_updated: 'Impostazioni salvate — password aggiornata',
    // login page (used server-side via /api/i18n/login endpoint)
    login_title: 'Accedi',
    login_subtitle: 'Inserisci la password per continuare',
    login_placeholder: 'Password',
    login_btn: 'Accedi',
    login_invalid_pw: 'Password non valida',
    login_conn_failed: 'Connessione fallita',
    dialog_confirm_title: 'Conferma azione',
    dialog_prompt_title: 'Inserisci un valore',
    dialog_confirm_btn: 'Conferma',
    discard: 'Scarta',
    clear: 'Pulisci',
    create: 'Crea',
    remove: 'Rimuovi',
    project_name_prompt: 'Nome progetto:',
    // Sidebar & Tabs
    tab_chat: 'Chat',
    tab_tasks: 'Task',
    tab_skills: 'Skill',
    tab_memory: 'Memoria',
    tab_workspaces: 'Spazi',
    tab_profiles: 'Profili',
    tab_kanban: 'Kanban',
    kanban_board: 'Bacheca',
    kanban_visible_tasks: '{0} task visibili',
    kanban_search_tasks: 'Cerca task',
    kanban_all_assignees: 'Tutti gli assegnatari',
    kanban_all_tenants: 'Tutti i tenant',
    kanban_include_archived: 'Includi archiviati',
    kanban_no_matching_tasks: 'Nessun task corrispondente',
    kanban_no_data: 'Nessun dato Kanban',
    kanban_work_queue_hint: 'Questa è la coda di lavoro di Hermes Agent. Crea o classifica un task, assegnalo, spostalo in Pronto, poi lascia che il dispatcher lo reclami.',
    kanban_unavailable: 'Kanban non disponibile',
    kanban_read_only: 'Vista sola lettura',
    kanban_empty: 'Vuoto',
    kanban_task: 'Task',
    kanban_no_description: 'Nessuna descrizione',
    kanban_refresh: 'Aggiorna',
    kanban_status_triage: 'Triage',
    kanban_status_todo: 'Da fare',
    kanban_status_ready: 'Pronto',
    kanban_status_running: 'In esecuzione',
    kanban_status_blocked: 'Bloccato',
    kanban_status_done: 'Completato',
    kanban_comments_count: 'Commenti ({0})',
    kanban_events_count: 'Eventi ({0})',
    kanban_links: 'Link',
    kanban_parents: 'Genitori',
    kanban_children: 'Figli',
    kanban_runs_count: 'Esecuzioni ({0})',
    kanban_no_comments: 'Nessun commento',
    kanban_no_events: 'Nessun evento',
    kanban_no_runs: 'Nessuna esecuzione',
    kanban_title: 'Titolo',
    kanban_description: 'Descrizione',
    kanban_description_placeholder: 'Opzionale — cosa deve succedere, criteri di accettazione, link',
    kanban_status: 'Stato',
    kanban_assignee: 'Assegnatario',
    kanban_assignee_placeholder: 'Opzionale — lascia vuoto per qualsiasi worker',
    kanban_tenant: 'Tenant',
    kanban_tenant_placeholder: 'Opzionale — slug progetto o team',
    kanban_priority: 'Priorità',
    kanban_priority_hint: 'I numeri più alti vengono eseguiti prima. Predefinito 0.',
    kanban_title_required: 'Il titolo è obbligatorio.',
    kanban_new_task: 'Nuovo task',
    kanban_edit_task: 'Modifica task',
    kanban_status_original_hint: 'Stato effettivo: {0}. Questa finestra supporta solo modifiche Triage/Da fare/Pronto.',
    kanban_run_dispatcher: 'Avvia dispatcher',
    kanban_run_dispatcher_confirm: 'Questo reclamerà i task Pronti su questa bacheca e avvierà sottoprocessi worker (uno per task, fino a 8 per clic). Continuare?',
    kanban_assignee_profiles_label: 'Profili Hermes',
    kanban_assignee_other_label: 'Altro (canali CLI / profili rimossi)',
    kanban_assignee_unassigned: '— Non assegnato (non verrà eseguito automaticamente) —',
    kanban_ready_needs_assignee: 'Hai scelto Non assegnato + Pronto. Il dispatcher salterà questo task. Invia di nuovo per confermare, o scegli un profilo.',
    kanban_dispatch_preview_prefix: 'Anteprima:',
    kanban_dispatch_run_prefix: 'Smistato:',
    kanban_dispatch_spawned: 'avviato',
    kanban_dispatch_promoted: 'promosso',
    kanban_dispatch_reclaimed: 'reclamato',
    kanban_dispatch_skipped_unassigned: 'saltato (nessun assegnatario)',
    kanban_dispatch_skipped_nonspawnable: 'saltato (profilo sconosciuto)',
    kanban_dispatch_auto_blocked: 'auto-bloccato',
    kanban_dispatch_timed_out: 'scaduto',
    kanban_dispatch_crashed: 'crash',
    kanban_add_comment: 'Aggiungi commento',
      kanban_only_mine: 'Solo miei',
      kanban_bulk_action: 'Azione in blocco',
      kanban_nudge_dispatcher: 'Anteprima dispatcher',
      kanban_stats: 'Statistiche',
      kanban_worker_log: 'Log worker',
      kanban_block: 'Blocca',
      kanban_unblock: 'Sblocca',
      kanban_back_to_board: 'Torna alla bacheca',
      kanban_lanes_by_profile: 'Corsie per profilo',
      kanban_new_board: 'Nuova bacheca…',
      kanban_rename_board: 'Rinomina bacheca attuale…',
      kanban_archive_board: 'Archivia bacheca attuale…',
      kanban_archive_board_confirm: 'Archiviare la bacheca "{name}"? I task rimangono su disco e la bacheca può essere ripristinata da kanban/boards/_archived/.',
      kanban_board_archived: 'Bacheca archiviata',
      kanban_board_name: 'Nome',
      kanban_board_slug: 'Slug (minuscole, trattini)',
      kanban_board_description: 'Descrizione (opzionale)',
      kanban_board_icon: 'Icona (emoji, opzionale)',
      kanban_board_color: 'Colore (opzionale)',
      kanban_board_name_required: 'Il nome è obbligatorio',
      kanban_board_slug_required: 'Lo slug è obbligatorio',
      kanban_card_complete: 'completato',
      kanban_card_archive: 'archivia',
      kanban_unassigned: 'non assegnato',
    kanban_status_archived: 'Archiviato',
    tab_todos: 'Todos',
    tab_insights: 'Insights',
    tab_dashboard: 'Dashboard Hermes',
    dashboard_loopback_warning: 'La dashboard è solo loopback sul server. Naviga dal server stesso o riavvialo con --host 0.0.0.0 (non sicuro).',
    tab_logs: 'Log',
    tab_settings: 'Impostazioni',
    new_conversation: 'Nuova conversazione',
    filter_conversations: 'Filtra conversazioni...',
    markdown_table_filter: 'Filtra tabella',
    markdown_table_sort_column: 'Ordina colonna',
    session_time_unknown: 'Sconosciuto',
    session_time_minutes_ago: (n) => `${n}m`,
    session_time_hours_ago: (n) => `${n}h`,
    session_time_days_ago: (n) => `${n}g`,
    session_time_last_week: '1sett',
    session_time_bucket_today: 'Oggi',
    session_time_bucket_yesterday: 'Ieri',
    session_time_bucket_this_week: 'Questa settimana',
    session_time_bucket_last_week: 'Settimana scorsa',
    session_time_bucket_older: 'Precedenti',
    scheduled_jobs: 'Job pianificati',
    new_job: 'Nuovo job',
    loading: 'Caricamento...',
    search_skills: 'Cerca skill...',
    new_skill: 'Nuova skill',
    personal_memory: 'Memoria personale',
    current_task_list: 'Lista task corrente',
    // Logs
    logs_title: 'Log',
    logs_file: 'File',
    logs_tail: 'Coda',
    logs_auto_refresh: 'Aggiornamento automatico (5s)',
    logs_wrap: 'A capo automatico',
    logs_copy_all: 'Copia tutto',
    logs_empty: 'Nessuna riga di log.',
    logs_loading: 'Caricamento log…',
    logs_load_failed: 'Caricamento log fallito',
    logs_status_idle: 'Scegli un file di log per vedere le righe recenti.',
    logs_no_mtime: 'non ancora scritto',
    logs_truncated_hint: 'Visualizzazione della coda di un file di log grande; i byte precedenti sono stati saltati per contenere la memoria.',
    logs_copied: 'Log copiati',

    // Insights
    insights_title: 'Analitiche di Utilizzo',
    insights_sessions: 'Sessioni',
    insights_messages: 'Messaggi',
    insights_tokens: 'Token',
    insights_cost: 'Costo Stimato',
    insights_no_cost: 'N/D',
    insights_models: 'Modelli',
    insights_activity_by_day: 'Attività per Giorno',
    insights_activity_by_hour: 'Attività per Ora',
    insights_peak_hour: 'Picco: {hour}',
    insights_token_breakdown: 'Ripartizione Token',
    insights_input_tokens: 'Input',
    insights_output_tokens: 'Output',
    insights_total: 'Totale',
    insights_daily_tokens: 'Token Giornalieri',
    insights_model_name: 'Modello',
    insights_model_sessions: 'Sessioni',
    insights_model_tokens: 'Token',
    insights_model_cost: 'Costo',
    insights_model_share: 'Quota',
    insights_no_usage_data: 'Nessun dato di utilizzo',
    insights_footer: 'Dati mostrati dagli ultimi {days} giorni',
    insights_skill_usage_title: 'Utilizzo Skill',
    insights_skill_usage_sub: 'Frequenza di invocazione strumenti',
    insights_skill_usage_total: 'Invocazioni totali',
    insights_skill_usage_skills_used: 'Skill usate',
    insights_skill_usage_no_data: 'Nessun dato di utilizzo skill ancora',
    insights_skill_usage_no_data_hint: 'Le skill appariranno qui dopo essere state usate nelle conversazioni.',
    insights_skill_usage_footer: 'Conteggi da ~/.hermes/skills/',
    insights_skill_usage_col_skill: 'Abilità',
    insights_skill_usage_col_uses: 'Usi',
    insights_skill_usage_col_views: 'Visualizzazioni',
    insights_skill_usage_col_share: 'Utilizzo %',
    insights_skill_usage_col_patches: 'Patch',
    workspace_desc: 'Aggiungi e cambia workspace per le tue sessioni.',
    session_meta_messages: (n) => `${n} msg`,
    session_meta_children: (n) => `${n} figli${n === 1 ? 'o' : ''}`,
    session_meta_segments: (n) => `${n} segment${n === 1 ? 'o' : 'i'}`,
    session_lineage_toggle_hint: '{0} — i turni di contesto precedenti sono compressi qui. Fai clic per mostrarli o nasconderli.',
    session_lineage_static_hint: '{0} — i turni di contesto precedenti sono compressi qui.',
    session_child_toggle_hint: '{0} — conversazioni figlie generate da questa sessione. Fai clic per mostrarle o nasconderle.',
    session_readonly_title_hint: 'Sessione importata in sola lettura — {0}',
    session_lineage_segment_untitled: 'Segmento senza titolo',
    session_lineage_segment_open: 'Apri segmento genealogia',
    new_profile: 'Nuovo profilo',
    transcript: 'Trascrizione',
    download_transcript: 'Scarica come Markdown',
    import: 'Importa',
    export_session_json: 'JSON',
    export_session_json_tooltip: 'Esporta sessione completa come JSON',
    import_session_json_tooltip: 'Importa sessione da JSON',
    clear_conversation_btn_tooltip: 'Cancella tutti i messaggi in questa conversazione',
    // Settings detail
    settings_label_rtl: 'Layout chat da destra a sinistra',
    settings_desc_rtl: "Inverte l'allineamento dei messaggi e dell'input del compositore per lingue come arabo o ebraico. Influisce solo sull'area chat — la barra laterale e gli altri pannelli rimangono da sinistra a destra.",
    settings_label_sound: 'Suono notifica',
    settings_desc_sound: 'Riproduci un suono quando l\'assistente termina una risposta.',
    // TTS (#499)
    tts_listen: 'Ascolta',
    tts_not_supported: 'Sintesi vocale non supportata in questo browser.',
    settings_label_tts: 'Sintesi vocale per le risposte',
    settings_desc_tts: 'Mostra un pulsante altoparlante su ogni messaggio dell\'assistente per leggerlo ad alta voce usando la sintesi vocale del browser.',
    settings_label_tts_auto_read: 'Leggi automaticamente le risposte ad alta voce',
    settings_desc_tts_auto_read: 'Leggi automaticamente ogni nuova risposta dell\'assistente quando termina. In pausa quando inizi a scrivere.',
    // Composer voice-mode pref (#1488)
    settings_label_voice_mode: 'Pulsante modalità vocale a mani libere',
    settings_desc_voice_mode: 'Mostra il pulsante modalità vocale (forma d\'onda audio) accanto al microfono di dettatura. Ti permette di parlare naturalmente — Hermes invia automaticamente dopo una pausa e legge le risposte ad alta voce. Richiede un browser che supporti sia il riconoscimento vocale che la sintesi vocale.',
    settings_label_raw_audio: 'Invia l\'audio originale invece di trascriverlo',
    settings_desc_raw_audio: 'Registra e invia il file audio originale all\'agente invece di convertirlo prima in testo. L\'agente può trascriverlo o elaborare l\'audio grezzo (emozioni, rumore di fondo, STT personalizzato). Come il comportamento dei messaggi vocali di Telegram.',
    voice_send_raw: 'Invia audio originale',
    voice_raw_attached: 'Audio allegato. Premi Invia o aggiungi testo.',
    settings_label_tts_voice: 'Voce',
    settings_desc_tts_voice: 'Voce preferita. Popolata dalle voci disponibili nel browser.',
    settings_label_tts_rate: 'Velocità voce',
    settings_label_tts_pitch: 'Tono voce',
    settings_label_tts_engine: 'Motore TTS',
    settings_desc_tts_engine: 'Scegli il motore vocale. Edge TTS utilizza le voci neurali Microsoft tramite il server.',
    settings_label_notifications: 'Notifiche browser',
    settings_desc_notifications: 'Mostra una notifica di sistema quando una risposta termina mentre l\'app è in background.',
    notifications_enable_btn: 'Enable notifications',
    notifications_test_btn: 'Send test',
    notifications_permission_status: (status) => `Permission: ${status}`,
    notifications_enabled_toast: 'Notifications enabled.',
    notifications_denied: 'Notifications are blocked in this browser. Enable them in browser settings.',
    notifications_unsupported: 'Notifications are not supported in this browser.',
    settings_desc_token_usage: 'Mostra il conteggio token input/output sotto ogni risposta dell\'assistente. Attivabile anche con /usage.',
    settings_label_api_redact: 'Oscura dati sensibili nelle risposte API',
    settings_desc_api_redact: 'Gli utenti self-hosted possono disabilitare per trasparenza (sconsigliato per istanze condivise).',
    settings_sidebar_density_compact: 'Compatta',
    settings_sidebar_density_detailed: 'Dettagliata',
    settings_desc_sidebar_density: 'Controlla quanti metadati mostra la lista sessioni nella sidebar sinistra.',
    settings_label_auto_title_refresh: 'Aggiornamento adattivo titolo',
    settings_auto_title_refresh_off: 'Off',
    settings_auto_title_refresh_5: 'Ogni 5 scambi',
    settings_auto_title_refresh_10: 'Ogni 10 scambi',
    settings_auto_title_refresh_20: 'Ogni 20 scambi',
    settings_desc_auto_title_refresh: 'Rigenera automaticamente il titolo della sessione in base all\'ultimo scambio, mantenendolo pertinente mentre la conversazione evolve. Richiede un modello LLM per la generazione titoli.',
    settings_desc_external_sessions: 'Mostra conversazioni da CLI, Telegram, Discord, Slack e altri canali nella lista sessioni. Clicca per importare e continuare.',
    settings_desc_cron_sessions: 'Surface cron job output as conversations in the sidebar. Only active when non-WebUI sessions are enabled. Defaults off; high-frequency jobs can flood the sidebar.',
    settings_desc_previous_messaging_sessions: 'Mostra sessioni Discord, Telegram, Slack e Weixin più vecchie sostituite da reset o compressione.',
    settings_desc_sync_insights: 'Rispecchia l\'uso token WebUI su state.db così hermes /insights include i dati delle sessioni browser. Disattivato per impostazione predefinita.',
    settings_desc_check_updates: 'Mostra un banner quando sono disponibili versioni più recenti della WebUI o dell\'Agente. Esegue un git fetch in background periodicamente.',
    settings_desc_ignore_agent_updates: 'Keep WebUI update checks on, but hide Agent update notices and skip Agent update fetches.',
    settings_desc_whats_new_summary: "Changes the What's New action from opening the raw diff first to generating a short, human-readable summary. The regular diff comparison stays available after the summary.",
    settings_desc_bot_name: 'Usato solo per il profilo predefinito. Gli altri profili usano i propri nomi.',
    settings_desc_password: 'Inserisci una nuova password per impostarla o cambiarla. Lascia vuoto per mantenere l\'impostazione attuale.',
    password_placeholder: 'Inserisci nuova password…',
    password_env_var_locked: 'La variabile d\'ambiente HERMES_WEBUI_PASSWORD è attualmente impostata e ha la precedenza. Rimuovila e riavvia il server per gestire la password da qui.',
    password_env_var_locked_placeholder: 'Bloccato: variabile d\'ambiente HERMES_WEBUI_PASSWORD impostata',
    disable_auth: 'Disabilita Auth',
    sign_out: 'Esci',
    settings_label_shutdown: 'Arresta il server Hermes WebUI',
    settings_desc_shutdown_before_cmd: 'Arresta in modo controllato il server WebUI locale. Utile se hai avviato tramite ',
    settings_desc_shutdown_between_cmds: ' e vuoi fermarlo senza passare al terminale. Per rendere nuovamente raggiungibile la WebUI dovrai riavviare il server (',
    settings_desc_shutdown_after_cmd: ' o l\'app nativa).',
    settings_btn_shutdown: 'Arresta server',
    settings_shutdown_confirm_title: 'Arresta Hermes WebUI',
    settings_shutdown_confirm_message: 'Vuoi arrestare il server Hermes WebUI?',
    settings_shutdown_confirm_btn: 'Arresta',
    settings_shutdown_stopped_message: 'Server arrestato. Puoi chiudere questa scheda.',
    // Providers panel
    providers_tab_title: 'Provider',
    providers_section_title: 'Provider',
    providers_section_meta: 'Gestisci le chiavi API per i provider AI. Le modifiche hanno effetto immediato.',
    providers_status_configured: 'Chiave API configurata',
    providers_status_not_configured: 'Nessuna chiave API',
    providers_status_oauth: 'OAuth',
    providers_status_api_key: 'Chiave API',
    providers_status_not_configured_label: 'Non configurato',
    providers_oauth_hint: 'Autenticato via OAuth. Nessuna chiave API necessaria.',
    providers_oauth_config_yaml_hint: 'Token configurato via config.yaml. Per aggiornare, modifica la sezione providers in config.yaml o esegui hermes auth.',
    providers_oauth_not_configured_hint: 'Non autenticato. Esegui hermes auth nel terminale per configurare questo provider.',
    providers_save: 'Salva',
    providers_refresh_models: 'Refresh models',
    providers_refreshing: 'Refreshing…',
    providers_models_refreshed: 'Models refreshed',
    providers_remove: 'Rimuovi',
    providers_saving: 'Salvataggio…',
    providers_removing: 'Rimozione…',
    providers_enter_key: 'Inserisci una chiave API',
    providers_empty: 'Nessun provider configurabile trovato.',
    providers_key_updated: 'Chiave API salvata',
    providers_key_removed: 'Chiave API rimossa',
    providers_key_placeholder_new: 'sk-...',
    providers_key_placeholder_replace: 'Inserisci nuova chiave da sostituire…',
    provider_quota_title: 'Quota del provider attivo',
    provider_quota_active_provider: 'Provider attivo',
    provider_quota_last_checked_after_refresh: 'Ultimo controllo dopo l’aggiornamento',
    provider_quota_last_checked: 'Ultimo controllo {0}',
    provider_quota_refresh_usage: 'Aggiorna utilizzo',
    provider_quota_refreshing: 'Aggiornamento...',
    provider_quota_refresh_title: 'Aggiorna ora i limiti di utilizzo del provider',
    provider_quota_refresh_succeeded: 'Utilizzo del provider aggiornato',
    provider_quota_refresh_failed: 'Aggiornamento dell’utilizzo del provider non riuscito',
    provider_quota_session_limit: 'Limite di 5 ore',
    provider_quota_weekly_limit: 'Limite settimanale',
    provider_quota_window_fallback: 'Finestra',
    provider_quota_metric_remaining: 'Rimanente',
    provider_quota_metric_used: 'Usato',
    provider_quota_metric_limit: 'Limite',
    provider_quota_status_available: 'disponibile',
    provider_quota_status_exhausted: 'esaurito',
    provider_quota_status_unavailable: 'non disponibile',
    provider_quota_status_failed: 'non riuscito',
    provider_quota_status_checked: 'controllato',
    provider_quota_status_no_key: 'nessuna chiave',
    provider_quota_status_invalid_key: 'chiave non valida',
    provider_quota_status_unsupported: 'non supportato',
    provider_quota_used_meta: '{0} usato',
    provider_quota_resets_meta: 'si reimposta {0}',
    provider_quota_credential_pool: 'Pool di credenziali',
    provider_quota_credential_label: 'Credenziale {0}',
    provider_quota_pool_plans: 'Piani: {0}',
    provider_quota_pool_no_windows: 'Nessuna finestra di limite account segnalata.',
    provider_quota_account_limits_loaded: 'Limiti account caricati.',
    provider_quota_unavailable: 'Stato quota non disponibile',
    provider_quota_retry_after: 'Riprova dopo {0}',
    provider_quota_pool_summary_available: '{0}/{1} disponibili',
    provider_quota_pool_summary_exhausted: '{0} esauriti',
    provider_quota_pool_summary_failed: '{0} non riusciti',
    provider_quota_pool_summary_checked: '{0} controllati',
    cancel: 'Annulla',
    create_job: 'Crea job',
    save_skill: 'Salva skill',
    editing: 'Modifica in corso',
    // Empty state
    empty_title: 'Cosa posso fare per te?',
    empty_subtitle: 'Chiedi qualsiasi cosa, esegui comandi, esplora file o gestisci i tuoi task pianificati.',
    suggest_files: 'Quali file ci sono in questo workspace?',
    suggest_schedule: 'Cosa ho in programma oggi?',
    suggest_plan: 'Aiutami a pianificare un piccolo progetto.',
    // onboarding
    onboarding_badge: 'PRIMO AVVIO',
    onboarding_title: 'Benvenuto in Hermes Web UI',
    onboarding_lead: 'Una configurazione guidata rapida verificherà Hermes, salverà una configurazione provider reale, sceglierà un workspace e un modello e opzionalmente proteggerà l\'app con una password.',
    onboarding_back: 'Indietro',
    onboarding_continue: 'Continua',
    onboarding_skip: 'Salta configurazione',
    onboarding_skipped: 'Configurazione saltata — uso configurazione esistente.',
    onboarding_open: 'Apri Hermes',
    onboarding_step_system_title: 'Verifica sistema',
    onboarding_step_system_desc: 'Verifica Hermes Agent e visibilità configurazione.',
    onboarding_step_setup_title: 'Configurazione provider',
    onboarding_step_setup_desc: 'Salva la configurazione minima provider Hermes.',
    onboarding_step_workspace_title: 'Workspace + modello',
    onboarding_step_workspace_desc: 'Scegli le impostazioni predefinite per nuove sessioni e chat.',
    onboarding_step_password_title: 'Password opzionale',
    onboarding_step_password_desc: 'Proteggi la Web UI prima di condividerla.',
    onboarding_step_finish_title: 'Fine',
    onboarding_step_finish_desc: 'Rivedi e accedi all\'app.',
    onboarding_notice_system_ready: 'Hermes Agent sembra raggiungibile dalla Web UI.',
    onboarding_notice_system_unavailable: 'Hermes Agent non è ancora completamente disponibile. Bootstrap può installarlo, ma la configurazione provider potrebbe richiedere un terminale.',
    onboarding_check_agent: 'Hermes Agent',
    onboarding_check_agent_ready: 'Rilevato e importabile',
    onboarding_check_agent_missing: 'Mancante o parzialmente importabile',
    onboarding_check_password: 'Password',
    onboarding_check_password_enabled: 'Già abilitata',
    onboarding_check_password_disabled: 'Non ancora abilitata',
    onboarding_check_provider: 'Configurazione provider',
    onboarding_check_provider_ready: 'Pronto per chattare',
    onboarding_check_provider_partial: 'Salvata ma incompleta',
    onboarding_check_provider_pending: 'Necessita verifica',
    onboarding_config_file: 'File config:',
    onboarding_env_file: 'File .env:',
    onboarding_unknown: 'Sconosciuto',
    onboarding_current_provider: 'Configurazione attuale:',
    onboarding_missing_imports: 'Import mancanti:',
    onboarding_notice_setup_required: 'Scegli un percorso provider semplice qui. I flussi OAuth avanzati rimangono nella CLI di Hermes per ora.',
    onboarding_notice_setup_already_ready: 'Una configurazione provider Hermes funzionante è già stata rilevata. Puoi mantenerla o sostituirla qui.',
    onboarding_oauth_provider_ready_title: 'Provider già autenticato',
    onboarding_oauth_provider_ready_body: 'Questa istanza è configurata per usare un provider OAuth (<strong>{provider}</strong>) impostato tramite la CLI di Hermes. Nessuna chiave API necessaria — clicca Continua per finire.',
    onboarding_oauth_provider_not_ready_title: 'Provider OAuth non ancora autenticato',
    onboarding_oauth_provider_not_ready_body: 'Questa istanza è configurata per usare <strong>{provider}</strong>, che usa OAuth invece di una chiave API. Esegui <code>hermes auth</code> o <code>hermes model</code> in un terminale per autenticarti, poi ricarica la Web UI.',
    onboarding_oauth_switch_hint: 'Oppure scegli un provider diverso qui sotto per passare a una configurazione con chiave API:',
    oauth_login_codex: 'Accedi con Codex (ChatGPT)',
    oauth_codex_step1: 'Passo 1: Visita questo URL e inserisci il codice',
    oauth_codex_step2: 'Passo 2: Inserisci questo codice nella pagina',
    oauth_codex_polling: 'In attesa di autorizzazione...',
    oauth_codex_success: 'Accesso Codex OAuth riuscito!',
    oauth_codex_error: 'Accesso OAuth fallito',
    oauth_codex_expired: 'Codice scaduto, riprova',
    onboarding_notice_workspace: 'Questi valori usano le stesse API di impostazioni dell\'app normale.',
    onboarding_workspace_label: 'Workspace',
    onboarding_workspace_or_path: 'Oppure inserisci un percorso workspace',
    onboarding_workspace_placeholder: '/home/tu/workspace',
    onboarding_provider_label: 'Modalità configurazione',
    onboarding_quick_setup_badge: 'configurazione rapida',
    provider_category_easy_start: 'Avvio facile',
    provider_category_self_hosted: 'Open / self-hosted',
    provider_category_specialized: 'Specializzato',
    onboarding_api_key_label: 'Chiave API',
    onboarding_api_key_placeholder: 'Lascia vuoto per mantenere una chiave salvata esistente',
    onboarding_api_key_label_optional: 'Chiave API (opzionale)',
    onboarding_api_key_placeholder_optional: 'Lascia vuoto per server senza chiave',
    onboarding_api_key_help_keyless: 'La maggior parte delle installazioni LM Studio / Ollama / vLLM funzionano senza chiave — lascia vuoto se il tuo server non richiede autenticazione. Usa il pulsante Test connessione per verificare.',
    onboarding_api_key_help_prefix: 'Salvato come segreto nel tuo file .env di Hermes usando',
    onboarding_base_url_label: 'URL Base',
    onboarding_base_url_placeholder: 'https://tuo-endpoint.example/v1',
    onboarding_base_url_help: 'Usa questo per router compatibili OpenAI, server self-hosted, LiteLLM, Ollama, LM Studio, vLLM o endpoint simili.',
    onboarding_model_label: 'Modello predefinito',
    onboarding_workspace_help: 'Scegli il modello che Hermes userà per le nuove chat dopo la configurazione.',
    onboarding_custom_model_placeholder: 'nome-tuo-modello',
    onboarding_custom_model_help: 'Per endpoint personalizzati, inserisci l\'ID esatto del modello che il tuo server si aspetta.',
    onboarding_notice_password_enabled: 'Una password è già configurata. Inseriscine una nuova solo se vuoi sostituirla.',
    onboarding_notice_password_recommended: 'Opzionale ma consigliato se esporrai l\'interfaccia oltre localhost.',
    onboarding_password_label: 'Password (opzionale)',
    onboarding_password_placeholder: 'Lascia vuoto per saltare',
    onboarding_password_help: 'Le password sono salvate tramite le API impostazioni esistenti e hashate lato server.',
    onboarding_notice_finish: 'Puoi riaprire le Impostazioni più tardi per modificare tutto questo.',
    onboarding_not_set: 'Non impostato',
    onboarding_password_will_enable: 'Sarà abilitata',
    onboarding_password_will_replace: 'Sarà sostituita',
    onboarding_password_keep_existing: 'Mantieni password attuale',
    onboarding_password_remains_disabled: 'Rimarrà disabilitata',
    onboarding_password_skipped: 'Saltata per ora',
    onboarding_finish_help: 'Completare salva <code>onboarding_completed</code> nelle impostazioni e ti porta nell\'app normale.',
    onboarding_error_choose_workspace: 'Scegli un workspace prima di continuare.',
    onboarding_error_choose_model: 'Scegli un modello prima di continuare.',
    onboarding_error_provider_required: 'Scegli una modalità di configurazione prima di continuare.',
    onboarding_error_base_url_required: 'L\'URL Base è obbligatorio per endpoint personalizzati.',
    onboarding_probe_test_button: 'Test connessione',
    onboarding_probe_probing: 'Test connessione in corso…',
    onboarding_probe_ok: 'Connesso. {n} modello/i disponibile/i.',
    onboarding_probe_error_generic: 'Impossibile raggiungere l\'URL base configurato.',
    onboarding_probe_error_invalid_url: 'L\'URL base deve iniziare con http:// o https://.',
    onboarding_probe_error_dns: 'Impossibile risolvere l\'host. Controlla l\'URL o usa l\'indirizzo IP dell\'host.',
    onboarding_probe_error_connect_refused: 'Connessione rifiutata — il server potrebbe non essere in esecuzione su quell\'indirizzo. Da dentro Docker, prova l\'IP host invece di localhost.',
    onboarding_probe_error_timeout: 'L\'endpoint non ha risposto in tempo. Verifica che il server sia in esecuzione e che l\'URL sia corretto.',
    onboarding_probe_error_http_4xx: 'L\'endpoint ha restituito un errore client. Controlla l\'autenticazione e il percorso URL (tipicamente termina in /v1).',
    onboarding_probe_error_http_5xx: 'L\'endpoint ha restituito un errore server. Controlla i log del server LM Studio / Ollama.',
    onboarding_probe_error_parse: 'L\'endpoint non ha restituito una lista modelli nel formato atteso. Verifica che l\'URL punti alla root API compatibile OpenAI.',
    onboarding_probe_error_unreachable: 'Impossibile raggiungere l\'URL base configurato.',
    onboarding_error_probe_failed: 'Impossibile validare l\'URL base configurato.',
    onboarding_error_workspace_required: 'Il workspace è obbligatorio.',
    onboarding_error_model_required: 'Il modello è obbligatorio.',
    onboarding_complete: 'Configurazione completata',

    // panel/runtime i18n
    error_prefix: 'Errore: ',
    default: 'default',
    search: 'Search',
    not_available: 'N/D',
    never: 'mai',
    add: 'Aggiungi',
    add_failed: 'Aggiunta fallita: ',
    remove_failed: 'Rimozione fallita: ',
    switch_failed: 'Cambio fallito: ',
    name_required: 'Il nome è obbligatorio',
    content_required: 'Il contenuto è obbligatorio',
    view: 'Visualizza',
    dismiss: 'Ignora',
    disable: 'Disabilita',
    cron_no_jobs: 'Nessun job pianificato trovato.',
    cron_status_off: 'spento',
    cron_status_paused: 'in pausa',
    cron_status_error: 'errore',
    cron_status_active: 'attivo',
    cron_status_running: 'in esecuzione\u2026',
    cron_status_needs_attention: 'richiede attenzione',
    cron_attention_desc: 'Questo job ricorrente non ha una prossima esecuzione. Lo scheduler potrebbe non essere riuscito a calcolare la prossima esecuzione.',
    cron_attention_croniter_hint: 'Il runtime Gateway potrebbe non avere il pacchetto croniter. Riavvia il Gateway con supporto cron, poi riprendi questo job.',
    cron_attention_resume: 'Riprendi e ricalcola',
    cron_jobs_project: 'Job Pianificati',
    cron_attention_run_once: 'Esegui una volta ora',
    cron_attention_copy_diagnostics: 'Copia diagnostica',
    cron_diagnostics_copied: 'Diagnostica copiata',
    cron_next: 'Prossimo',
    cron_last: 'Ultimo',
    cron_run_now: 'Esegui ora',
    cron_pause: 'Pausa',
    cron_resume: 'Riprendi',
    cron_job_name_placeholder: 'Nome job',
    cron_schedule_placeholder: 'Pianificazione',
    cron_prompt_placeholder: 'Prompt',
    cron_last_output: 'Ultimo output',
    cron_expand_prompt: 'Espandi prompt',
    cron_collapse_prompt: 'Comprimi prompt',
    cron_expand_output: 'Espandi output',
    cron_collapse_output: 'Comprimi output',
    cron_mode_agent: 'Agente',
    cron_mode_script: 'Script',
    cron_mode_label: 'Modalità',
    cron_script_job_banner: 'Esegue uno script a intervalli — stdout viene consegnato alla destinazione. Nessun agente, prompt o skill.',
    cron_script_card_title: 'Script',
    cron_script_output: 'Output script',
    cron_script_path_label: 'Percorso script',
    cron_script_path_hint: 'Risolto sotto ~/.hermes/scripts/ salvo percorso assoluto. Modifica lo script sul server per cambiare il comportamento.',
    cron_script_badge_title: 'Job script (senza agente)',
    cron_workdir_label: 'Directory di lavoro',
    cron_view_full_output: 'View full output',
    cron_all_runs: 'Tutte le esecuzioni',
    cron_hide_runs: 'Nascondi esecuzioni',
    cron_no_runs_yet: '(nessuna esecuzione)',
    cron_schedule_required_example: 'La pianificazione è obbligatoria (es. "0 9 * * *" o "every 1h")',
    cron_schedule_required: 'La pianificazione è obbligatoria',
    cron_prompt_required: 'Il prompt è obbligatorio',
    cron_job_created: 'Job creato',
    cron_duplicate: 'Duplica',
    cron_duplicated: 'Job duplicato (in pausa)',
    cron_job_triggered: 'Job avviato',
    cron_job_paused: 'Job in pausa',
    cron_job_resumed: 'Job ripreso',
    cron_job_updated: 'Job aggiornato',
    cron_model_label: 'Override del modello',
    cron_model_hint: 'Sostituisce il modello predefinito per questo processo.',
    cron_model_use_default: 'Predefinito (usa il profilo/sistema predefinito)',
    cron_delete_confirm_title: 'Elimina job pianificato',
    cron_delete_confirm_message: 'Questa azione non può essere annullata.',
    cron_job_deleted: 'Job eliminato',
    cron_completion_status: (name, status) => `Cron "${name}" ${status}`,
    status_failed: 'fallito',
    status_completed: 'completato',
    todos_no_active: 'Nessuna lista task attiva in questa sessione.',
    clear_conversation_title: 'Cancella conversazione',
    clear_conversation_message: 'Cancellare tutti i messaggi? Questa azione non può essere annullata.',
    clear_failed: 'Cancellazione fallita: ',
    skills_no_match: 'Nessuna skill corrispondente.',
    skill_enabled: 'Abilitato',
    skill_disabled: 'Disabilitato',
    skill_toggle_failed: 'Errore nell\'attivare la skill: ',
    linked_files: 'File Collegati',
    skill_load_failed: 'Impossibile caricare la skill: ',
    skill_file_load_failed: 'Impossibile caricare il file: ',
    skill_name_required: 'Il nome della skill è obbligatorio',
    skill_updated: 'Skill aggiornata',
    skill_created: 'Skill creata',
    skill_deleted: 'Skill eliminata',
    skill_delete_confirm: 'Eliminare la skill "{0}"?',
    skills_empty_title: 'Seleziona una skill',
    skills_empty_sub: 'Scegli una skill dalla sidebar per vederne i contenuti, o creane una nuova.',
    skills_edit: 'Modifica',
    skills_delete: 'Elimina',
    skills_back_to: 'Torna a {0}',
    tasks_empty_title: 'Seleziona un job pianificato',
    tasks_empty_sub: 'Scegli un job dalla sidebar per vederne dettagli ed esecuzioni, o creane uno nuovo.',
    workspaces_empty_title: 'Seleziona uno spazio',
    workspaces_empty_sub: 'Scegli uno spazio dalla sidebar per vederne file e impostazioni, o aggiungine uno nuovo.',
    profiles_empty_title: 'Seleziona un profilo',
    profiles_empty_sub: 'Scegli un profilo agente dalla sidebar per vedere e modificare le sue impostazioni, o creane uno nuovo.',
    memory_notes_label: 'memoria (note)',
    memory_saved: 'Memoria salvata',
    my_notes: 'Le Mie Note',
    user_profile: 'Profilo Utente',
    external_notes_sources: 'Note di terze parti',
    external_notes_empty: 'Nessuna fonte MCP di note o conoscenza è ancora visibile. Configura Joplin, Obsidian, Notion, llm-wiki o un altro server di note per mostrarlo qui.',
    external_notes_auto_recall_hint: 'Il richiamo automatico della sessione non cambia; questo pannello mostra solo fonti configurate e strumenti di lettura/ricerca disponibili.',
    external_notes_no_tools: 'Nessuno strumento di lettura/ricerca è attualmente visibile per questa fonte.',
    external_notes_tool_count: (count) => `${count} strument${Number(count)===1?'o':'i'} per note disponibile${Number(count)===1?'':'i'}`,
    external_notes_configured_hint: 'I nomi degli strumenti sono attesi da questa fonte configurata; gli schemi live appariranno quando il runtime WebUI li esporrà.',
    external_notes_recent_ai: 'Usate di recente dall’AI',
    external_notes_auto: 'auto',
    external_notes_recent_ai_reason: 'Richiamo automatico',
    external_notes_search_placeholder: 'Cerca note…',
    external_notes_search_empty: 'Cerca in una fonte di note configurata per visualizzare anteprime qui.',
    source_active: 'active',
    source_configured: 'configured',
    no_notes_yet: 'Ancora nessuna nota.',
    no_profile_yet: 'Ancora nessun profilo.',
    agent_soul: 'Anima dell\'Agente',
    no_soul_yet: 'Nessuna anima definita.',
    workspace_choose_path: 'Scegli percorso workspace',
    workspace_choose_path_meta: 'Aggiungi un percorso validato e cambia questa conversazione',
    workspace_manage: 'Gestisci workspace',
    workspace_manage_meta: 'Apri il pannello Spazi',
    workspace_use_title: 'Usa nella sessione corrente',
    workspace_use: 'Usa',
    workspace_add_path_placeholder: 'Aggiungi percorso workspace (es. /home/utente/mio-progetto)',
    workspace_paths_validated_hint: 'I percorsi sono validati come directory esistenti prima del salvataggio.',

    workspace_drag_hint: 'Trascina per riordinare',
    workspace_reorder_failed: 'Riordino fallito',
    workspace_added: 'Workspace aggiunto',
    workspace_renamed: 'Workspace rinominato',
    workspace_remove_confirm_title: 'Rimuovi workspace',
    workspace_remove_confirm_message: (path) => `Rimuovere "${path}"?`,
    workspace_removed: 'Workspace rimosso',
    workspace_switch_prompt_title: 'Cambia workspace',
    workspace_switch_prompt_message: 'Inserisci un percorso workspace assoluto da aggiungere e a cui passare questa conversazione.',
    workspace_switch_prompt_confirm: 'Cambia',
    workspace_switch_prompt_placeholder: '/Users/tu/progetto',
    workspace_not_added: 'Workspace non aggiunto',
    workspace_already_saved: 'Workspace già salvato — sceglilo dalla lista',
    workspace_busy_switch: 'Impossibile cambiare workspace mentre l\'agente è in esecuzione',
    discard_file_edits_title: 'Scartare le modifiche ai file?',
    discard_file_edits_message: 'Cambiare workspace scarterà le modifiche non salvate nell\'anteprima.',
    workspace_switched_to: (name) => `Passato a ${name}`,
    profiles_no_profiles: 'Nessun profilo trovato.',
    profile_api_keys_configured: 'Chiavi API configurate',
    profile_gateway_running: 'Gateway in esecuzione',
    profile_gateway_stopped: 'Gateway fermo',
    profile_active: 'ATTIVO',
    profile_no_configuration: 'Nessuna configurazione',
    profile_skill_count: (count) => `${count} skill`,
    profile_use: 'Usa',
    profile_switch_title: 'Passa a questo profilo',
    profile_delete_title: 'Elimina questo profilo',
    profile_default_label: '(predefinito)',
    profile_name_placeholder: 'Nome profilo (minuscole, a-z 0-9 trattini)',
    profile_clone_label: 'Clona config dal profilo attivo',
    profile_model_label: 'Modello / provider',
    profile_model_hint: 'Scegli tra provider e modelli configurati per questo nuovo profilo.',
    profile_model_use_default: 'Usa il default del profilo attivo',
    profile_base_url_placeholder: 'Base URL (opzionale, es. http://localhost:11434)',
    profile_api_key_placeholder: 'Chiave API (opzionale)',
    manage_profiles: 'Gestisci profili',
    profiles_load_failed: 'Caricamento profili fallito',
    profile_switched_new_conversation: (name) => `Passato al profilo: ${name} — nuova conversazione avviata`,
    profile_switched: (name) => `Passato al profilo: ${name}`,
    profile_name_rule: 'Solo lettere minuscole, numeri, trattini, underscore',
    profile_base_url_rule: 'L\'URL Base deve iniziare con http:// o https://',
    profile_created: (name) => `Profilo creato: ${name}`,
    profile_delete_confirm_title: (name) => `Eliminare il profilo "${name}"?`,
    profile_delete_confirm_message: 'Tutte le sessioni, configurazioni, skill e memoria per questo profilo saranno eliminate permanentemente. Questa azione non può essere annullata.',
    profile_deleted: (name) => `Profilo eliminato: ${name}`,
    active_conversation_none: 'Nessuna conversazione attiva selezionata.',
    active_conversation_meta: (title, count) => `${title} · ${count} messaggi${count === 1 ? 'o' : ''}`,
    settings_unsaved_changes: 'Hai modifiche non salvate.',
    sign_out_failed: 'Disconnessione fallita: ',
    disable_auth_confirm_title: 'Disabilita protezione password',
    disable_auth_confirm_message: 'Chiunque potrà accedere a questa istanza.',
    auth_disabled: 'Auth disabilitata — protezione password rimossa',
    disable_auth_failed: 'Disabilitazione auth fallita: ',
    bg_error_single: (title) => `"${title}" ha incontrato un errore`,
    bg_error_multi: (count) => `${count} sessioni hanno incontrato un errore`,
    // skill form
    skill_name: 'Nome',
    skill_category: 'Categoria',
    skill_category_placeholder: 'Opzionale, es. devops',
    skill_content: 'Contenuto SKILL.md',
    skill_content_placeholder: 'Frontmatter YAML + corpo markdown',
    skill_rename_not_supported: 'Rinominare una skill non è supportato. Crea una nuova skill ed elimina la vecchia per rinominare.',
    skill_metadata: 'Metadati',
    // cron form
    cron_name_label: 'Nome',
    cron_name_placeholder: 'Opzionale',
    cron_schedule_label: 'Pianificazione',
    cron_schedule_hint: 'Usa \'every 1h\' o un\'espressione cron per job ricorrenti. Durate semplici come \'30m\' vengono eseguite una volta sola.',
    cron_schedule_once_warning: 'Forme di durata come \'30m\' vengono eseguite una volta e rimosse dopo l\'esecuzione. Usa \'every 30m\' per mantenere un job ricorrente.',
    cron_prompt_label: 'Prompt',
    cron_deliver_label: 'Recapita output a',
    cron_deliver_local: 'Locale (solo salva output)',
    cron_deliver_custom: 'Destinazione personalizzata',
    cron_profile_label: 'Profilo',
    cron_profile_server_default: 'predefinito server',
    cron_profile_server_default_hint: 'Usa il profilo predefinito del server WebUI a runtime. I job esistenti senza profilo mantengono questo comportamento legacy.',
    cron_toast_notifications_label: 'Notifiche di completamento',
    cron_toast_notifications_hint: 'Mostra un avviso al termine di questo cron. Il badge Task e il segnalibro nuovo-run continuano ad aggiornarsi anche con questa opzione disattivata.',
    cron_toast_notifications_enabled: 'Abilitato',
    cron_toast_notifications_disabled: 'Disabilitato',
    cron_skills_label: 'Skill',
    cron_skills_placeholder: 'Aggiungi skill (opzionale)…',
    cron_skills_edit_hint: 'La lista skill non è modificabile dopo la creazione.',
    // workspace form
    workspace_name_label: 'Nome',
    workspace_name_placeholder: 'Nome descrittivo opzionale',
    workspace_path_label: 'Percorso',
    workspace_path_required: 'Il percorso è obbligatorio',
    workspace_path_readonly: 'Il percorso non può essere cambiato. Solo rinomina.',
    workspace_new_title: 'Nuovo spazio',
    // profile form
    profile_name_label: 'Nome',
    profile_base_url_label: 'URL Base',
    profile_api_key_label: 'Chiave API',
    cmd_yolo: 'Attiva/disattiva modalità YOLO (salta approvazioni)',
    yolo_no_session: 'Nessuna sessione attiva',
    yolo_enabled: '⚡ Modalità YOLO ON — approvazioni saltate questa sessione',
    yolo_disabled: 'Modalità YOLO OFF',
    yolo_pill_label: 'YOLO',
    yolo_pill_title_active: 'Modalità YOLO attiva — clicca per disabilitare',
    approval_skip_all: '⚡ Salta tutto questa sessione',
    approval_skip_all_title: 'Salta tutte le richieste di approvazione per questa sessione',
    // composer action tooltips
    composer_send: 'Invia messaggio',
    composer_queue: 'Accoda messaggio',
    composer_interrupt: 'Interrompi e invia',
    composer_steer: 'Correggi risposta in corso',
    composer_stop: 'Ferma generazione',
    composer_disabled_clarify: 'Rispondi alla richiesta di chiarimento',
    composer_disabled_compression: 'In attesa del completamento della compressione',
    composer_compression_will_queue: 'Type a message — it will queue and send after compression',
    composer_disabled_empty: 'Scrivi un messaggio da inviare',
    composer_mobile_workspace: 'Workspace',
    composer_mobile_model: 'Modello',
    composer_mobile_reasoning: 'Ragionamento',
    composer_mobile_context: 'Contesto',
    media_audio_label: 'Audio',
    media_svg_label: 'Diagramma',
    media_video_label: 'Video',
    media_download: 'Scarica',
    csv_loading: 'Caricamento CSV',
    csv_too_large: 'File CSV troppo grande per il rendering inline',
    csv_no_data: 'Il file CSV ha dati insufficienti per il rendering come tabella',
    csv_error: 'Caricamento file CSV fallito',
    csv_header_note: 'Prima riga mostrata come intestazione tabella',
    excalidraw_loading: 'Caricamento diagramma',
    excalidraw_too_large: 'File Excalidraw troppo grande per il rendering inline',
    excalidraw_invalid: 'Formato file Excalidraw non valido',
    excalidraw_error: 'Caricamento file Excalidraw fallito',
    excalidraw_label: 'Diagramma',
    excalidraw_download: 'Scarica',
    excalidraw_empty: 'Diagramma vuoto',
    excalidraw_render_error: 'Rendering diagramma fallito',
    excalidraw_simplified: 'Anteprima SVG semplificata — non identica al canvas Excalidraw',
    // ── Checkpoints / Rollback ──
    checkpoint_title: 'Checkpoint',
    checkpoint_empty: 'Nessun checkpoint trovato per questo workspace.',
    checkpoint_loading: 'Caricamento checkpoint…',
    checkpoint_error: 'Caricamento checkpoint fallito',
    checkpoint_date: 'Data',
    checkpoint_message: 'Messaggio',
    checkpoint_files: 'File',
    checkpoint_view_diff: 'Vedi diff',
    checkpoint_restore: 'Ripristina',
    checkpoint_restore_confirm_title: 'Ripristinare checkpoint?',
    checkpoint_restore_confirm_message: (ckpt) => `Ripristinare il workspace al checkpoint "${ckpt}"? Questo sovrascriverà i file con le versioni salvate. I file aggiunti dopo questo checkpoint non saranno eliminati.`,
    checkpoint_restored: 'Checkpoint ripristinato',
    checkpoint_diff_title: 'Modifiche nel checkpoint',
    checkpoint_diff_no_changes: 'Nessuna differenza trovata tra questo checkpoint e il workspace attuale.',
    checkpoint_diff_files_changed: (n) => `${n} file modificat${n === 1 ? 'o' : 'i'}`,
    outline_title: 'Struttura',
    outline_empty: 'Nessuna domanda ancora.',
    outline_loading: 'Caricamento…',
  },

  ja: {
    offline_title: '接続が切断されました',
    offline_browser_detail: 'ブラウザはこのデバイスがオフラインだと報告しています。',
    offline_network_detail: '現在、このブラウザからHermesに到達できません。',
    offline_autorefresh: 'Hermesに再接続できたら、このページを自動的に更新します。',
    offline_check_now: '今すぐ確認',
    offline_checking: '確認中…',
    offline_stream_waiting: '接続が切断されました。更新を待っています…',
    _lang: 'ja',
    _label: '日本語',
    _speech: 'ja-JP',
    // boot.js
    cancelling: 'キャンセル中…',
    cancel_failed: 'キャンセル失敗: ',
    mic_denied: 'マイクへのアクセスが拒否されました。ブラウザの権限を確認してください。',
    mic_no_speech: '音声が検出されませんでした。もう一度お試しください。',
    mic_network: '音声認識を利用できません。',
    mic_error: '音声入力エラー: ',
    // Turn-based voice mode (#1333)
    // Composer voice buttons (#1488)
    voice_dictate: 'ディクテーション',
    voice_dictate_active: 'ディクテーション停止',
    voice_recording_active: '録音を停止',
    voice_mode_toggle: '音声モード',
    voice_mode_toggle_active: '音声モードを終了',
    voice_listening: '聞き取り中…',
    voice_speaking: '発話中…',
    voice_thinking: '考え中…',
    voice_error: 'このブラウザでは音声入力に対応していません',
    voice_mode_active: '音声モード ON',
    voice_mode_off: '音声モード OFF',
    session_imported: 'セッションをインポートしました',
    import_failed: 'インポート失敗: ',
    import_invalid_json: '無効な JSON',
    image_pasted: '画像を貼り付けました: ',
    // messages.js
    edit_message: 'メッセージを編集',
    regenerate: '応答を再生成',
    copy: 'コピー',
    copied: 'コピーしました!',
    copy_failed: 'コピー失敗',
    selected_text_reply: '選択範囲で返信',
    selected_text_reply_title: '選択したチャットテキストを引用コンテキストとして追加',
    selected_text_reply_appended: '選択したテキストを入力欄に追加しました',
    saved_prompts_empty: '保存済みプロンプトはありません。',
    saved_prompts_save_current: '現在の入力をプロンプトとして保存',
    saved_prompts_saved: 'プロンプトを保存しました',
    saved_prompts_delete: 'プロンプトを削除',
    saved_prompts_empty_input: '保存するプロンプトを先に入力してください',

    diff_loading: '差分を読み込み中',
    diff_error: 'パッチファイルを読み込めませんでした',
    diff_too_large: 'パッチファイルが大きすぎてインライン表示できません',
    tree_view: 'ツリー',
    raw_view: '生データ',
    parse_failed_note: '解析失敗',
    you: 'あなた',
    mcp_servers_title: 'MCPサーバー',
    mcp_servers_desc: 'config.yaml で設定された MCP サーバーを管理します。',
    mcp_no_servers: 'MCPサーバーは設定されていません。',
    mcp_add_server: '+ サーバーを追加',
    mcp_field_name: 'サーバー名',
    mcp_transport_label: 'トランスポート種別',
    mcp_field_command: 'コマンド',
    mcp_field_args: '引数 (カンマ区切り)',
    mcp_field_url: 'URL',
    mcp_field_timeout: 'タイムアウト (秒)',
    mcp_save: '保存',
    mcp_cancel: 'キャンセル',
    mcp_name_required: 'サーバー名は必須です。',
    mcp_url_required: 'HTTP トランスポートには URL が必要です。',
    mcp_command_required: 'stdio トランスポートにはコマンドが必要です。',
    mcp_saved: 'MCPサーバーを保存しました。',
    mcp_save_failed: 'MCPサーバーの保存に失敗しました。',
    mcp_delete_confirm_title: 'MCPサーバーを削除',
    mcp_delete_confirm_message: 'MCPサーバー "{0}" を削除しますか? この操作は取り消せません。',
    mcp_deleted: 'MCPサーバーを削除しました。',
    mcp_delete_failed: 'MCPサーバーの削除に失敗しました。',
    mcp_load_failed: 'MCPサーバーの読み込みに失敗しました。',
    mcp_restart_hint: 'ここでのサーバー変更は現状読み取り専用です。反映するには config.yaml を編集して Hermes を再起動してください。',
    mcp_toggle_followup: '有効/無効の切り替えは、MCP のリロード仕様が明確になるまで意図的に保留しています。',
    mcp_status_active: 'アクティブ',
    mcp_status_configured: '設定済み',
    mcp_status_disabled: '無効',
    mcp_status_invalid_config: '不正な設定',
    mcp_status_unknown: '不明',
    mcp_tool_count: '{0} 個のツール',
    mcp_enabled_yes: '有効',
    mcp_enabled_no: '無効',
    mcp_enable_server: 'このMCPサーバーを有効化',
    mcp_disable_server: 'このMCPサーバーを無効化',
    mcp_enabled_toast: (name) => `MCPサーバー「${name}」を有効化しました。`,
    mcp_disabled_toast: (name) => `MCPサーバー「${name}」を無効化しました。`,
    mcp_toggle_failed: 'MCPサーバーの更新に失敗しました。',
    mcp_tools_title: 'MCP ツール',
    mcp_tools_desc: 'アクティブな MCP サーバー全体から既知のツールを検索します。',
    mcp_tools_search_placeholder: '名前、サーバー、説明でツールを検索…',
    mcp_tools_no_tools: 'アクティブなランタイムに利用可能な MCP ツールがありません。',
    mcp_tools_no_matches: '一致する MCP ツールはありません。',
    mcp_tools_load_failed: 'MCP ツールの読み込みに失敗しました。',
    mcp_tools_schema_empty: 'スキーマパラメータはありません。',
    mcp_tools_runtime_note: 'ツール一覧は既知の MCP ランタイム情報のみを使用します。WebUI はサーバーの起動や探索を行いません。',
    mcp_tools_summary_no_matches: (query,total) => `「${query}」に一致するMCPツールはありません（全${total}個）。`,
    mcp_tools_summary_none: '表示するMCPツールはありません。',
    mcp_tools_summary_matching: (query) => ` 「${query}」に一致`,
    mcp_tools_summary_total_note: (total) => ` （全${total}個のMCPツール）`,
    mcp_tools_summary_showing: (start,end,filtered,searchNote,totalNote,page,pages) => `${filtered}個のMCPツール${searchNote}${totalNote}のうち${start}〜${end}件を表示。${page}/${pages}ページ。`,
    mcp_tools_page_size_prefix: '表示件数:',
    mcp_tools_page_size_suffix: '件/ページ',
    mcp_tools_per_page_aria: '1ページあたりのMCPツール数',
    mcp_tools_inactive_configured_servers: (servers) => `このWebUIランタイムで設定済みだが非アクティブ: ${servers}。`,
    mcp_tools_pagination_label: 'MCPツールのページ送り',
    mcp_tools_previous_page: '‹ 前へ',
    mcp_tools_previous_page_aria: '前のMCPツールページ',
    mcp_tools_next_page: '次へ ›',
    mcp_tools_next_page_aria: '次のMCPツールページ',
    // PDF preview (#480)
    pdf_loading: 'PDF {0} を読み込み中…',
    pdf_too_large: 'PDF が大きすぎてインラインプレビューできません',
    pdf_no_pages: 'PDF にページがありません',
    pdf_error: 'PDF プレビューの描画に失敗しました',
    pdf_download: 'PDF をダウンロード',
    // HTML sandbox preview (#482)
    html_loading: 'HTML プレビューを読み込み中…',
    html_too_large: 'HTML が大きすぎてインラインプレビューできません',
    html_error: 'HTML プレビューの描画に失敗しました',
    html_open_full: 'フルページを開く',
    html_sandbox_label: 'HTML プレビュー (サンドボックス)',
    thinking: '考え中',
    expand_all: 'すべて展開',
    collapse_all: 'すべて折りたたむ',
    edit_failed: '編集失敗: ',
    regen_failed: '再生成失敗: ',
    reconnect_active: '応答を生成中です。準備ができたら再読み込みしますか?',
    reconnect_finished: '前回離脱時に応答が進行中でした。メッセージが更新されている可能性があります。',
    // approval card
    approval_heading: '承認が必要',
    approval_desc_prefix: '危険なコマンドを検出しました',
    approval_btn_once: '今回だけ許可',
    approval_btn_once_title: 'このコマンド1回だけ許可 (Enter)',
    approval_btn_session: 'セッション中許可',
    approval_btn_session_title: 'この会話セッション中は許可',
    approval_btn_always: '常に許可',
    approval_btn_always_title: 'このコマンドパターンを常に許可',
    approval_btn_deny: '拒否',
    approval_btn_deny_title: '拒否 — このコマンドを実行しない',
    approval_responding: '応答中…',
    clarify_heading: '確認が必要',
    clarify_hint: '選択肢を選ぶか、下に独自の回答を入力してください。',
    clarify_other: 'その他',
    clarify_send: '送信',
    clarify_input_placeholder: '回答を入力…',
    clarify_responding: '応答中…',
    session_attention_approval: (n) => n === 1 ? '承認' : `${n} 件の承認`,
    session_attention_clarify: (n) => n === 1 ? '質問' : `${n} 件の質問`,
    session_attention_generic: (n) => n === 1 ? '注意' : `${n} 件`,
    session_attention_approval_title: '権限判断を待っています',
    session_attention_clarify_title: '回答を待っています',
    session_attention_generic_title: 'ユーザー操作を待っています',
    untitled: '無題',
    n_messages: (n) => `${n} 件のメッセージ`,
    load_older_messages: '↑ 上にスクロール、またはクリックして過去のメッセージを読み込む',
    session_jump_start: '開始',
    session_jump_start_label: 'セッションの先頭へ移動',
    session_jump_end: '末尾',
    session_jump_end_label: 'セッションの末尾へ移動',
    session_new_message: '新着メッセージ',
    session_new_message_label: '新着メッセージがあります。末尾へ移動',
    jump_to_question: '回答へ',
    jump_to_question_label: 'この回答の先頭へ移動',
    queued_label: '応答後に送信',
    queued_count: (n) => `${n} 件キュー中`,
    queued_cancel: 'キューに入れたメッセージをキャンセル',
    model_unavailable: ' (利用不可)',
    model_unavailable_title: 'このモデルは現在のプロバイダ一覧に含まれていません',
    provider_mismatch_warning: (m,p)=>`"${m}" は設定されたプロバイダ (${p}) で動作しない可能性があります。このまま送信するか、ターミナルで \`hermes model\` を実行して切り替えてください。`,
    provider_mismatch_label: 'プロバイダ不一致',
    gateway_auth_label: 'ゲートウェイ認証に失敗しました',
    model_not_found_label: 'モデルが見つかりません',
    model_custom_label: 'カスタムモデルID',
    model_custom_placeholder: '例: openai/gpt-5.4',
    model_search_placeholder: 'モデルを検索…',
    model_search_no_results: 'モデルが見つかりません',
    model_group_configured: '設定済み',
    ws_search_placeholder: 'ワークスペースを検索…',
    ws_no_results: 'ワークスペースが見つかりません',
    workspace_new_worktree_conversation: 'worktree で新しい会話',
    workspace_new_worktree_conversation_meta: 'このワークスペース用に隔離された git worktree を作成します。',
    workspace_worktree_created: 'worktree 会話を作成しました',
    workspace_worktree_failed: 'worktree の作成に失敗しました: ',
    session_worktree_badge: 'Worktree（作業ツリー）',
    model_scope_advisory: '次回のメッセージからこの会話に適用されます。',
    model_scope_toast: '次回のメッセージからこの会話に適用されます。',
    // commands.js
    cmd_clear: '会話メッセージをクリア',
    cmd_help: '使用可能なスラッシュコマンドを表示',
    cmd_compress: '会話コンテキストを手動で圧縮 (使い方: /compress [トピック])',
    ctx_compress_hint: 'コンテキストを圧縮して空きを確保 →',
    ctx_compress_action: '⚠ 今すぐ圧縮してコンテキストを確保',
    cmd_compact_alias: '/compress の旧エイリアス',
    cmd_model: 'モデルを切り替え (例: /model gpt-4o)',
    cmd_workspace: '名前でワークスペースを切り替え',
    cmd_terminal: 'ワークスペースのターミナルを開く',
    cmd_new: '新しいチャットセッションを開始',
    cmd_usage: 'トークン使用量表示の ON/OFF を切り替え',
    cmd_theme: '外観を切り替え (theme: system/dark/light, skin: default/ares/mono/graphite/slate/poseidon/sisyphus/charizard/sienna/catppuccin/nous/geist-contrast/zeus/verdigris)',
    cmd_personality: 'エージェントのパーソナリティを切り替え',
    cmd_skills: '利用可能な Hermes スキルを一覧表示',
    cmd_use: '次のメッセージにスキルを強制適用',
    available_commands: '利用可能なコマンド:',
    type_slash: '/ を入力するとコマンド一覧',
    conversation_cleared: '会話をクリアしました',
    command_label: 'コマンド',
    context_compaction_label: 'コンテキスト圧縮',
    retrieval_context_label: 'インデックス済みコンテキスト',
    retrieval_context_preview: '以前のメッセージは保存され、コンテキストツールで取得できます',
    preserved_task_list_label: '保持されたタスクリスト',
    reference_only_label: '参照専用',
    model_usage: '使い方: /model <名前>',
    no_model_match: '一致するモデルなし: "',
    model_did_you_mean: (m) => `（もしかして "${m}"？）`,
    switched_to: '切り替えました: ',
    workspace_usage: '使い方: /workspace <名前>',
    no_workspace_match: '一致するワークスペースなし: "',
    switched_workspace: 'ワークスペースを切り替えました: ',
    workspace_switch_failed: 'ワークスペース切替失敗: ',
    new_session: '新しいセッションを作成しました',
    new_session_creating: '新しい会話を作成中…',
    compressing: 'コンテキスト圧縮を要求中...',
    compress_running_label: '圧縮中',
    compress_complete_label: '圧縮完了',
    auto_compress_label: '自動圧縮',
    compress_failed_label: '圧縮失敗',
    focus_label: 'フォーカス',
    token_usage_on: 'トークン使用量: ON',
    token_usage_off: 'トークン使用量: OFF',
    usage_cache_hit_detail: 'キャッシュ: {0}% ヒット（読み取り {1} / 書き込み {2}）',
    usage_cached_percent: '{0}% キャッシュ済み',
    theme_usage: '使い方: /theme ',
    theme_set: 'テーマ: ',
    no_active_session: 'アクティブなセッションがありません',
    cmd_queue: '次のターン用にメッセージをキュー',
    cmd_goal: '永続ゴールを設定または確認',
    goal_evaluating_progress: 'ゴールの進捗を評価中…',
    goal_working_toward: 'ゴールに向けて実行中…',
    goal_continuing_toast: 'ゴールに向けて継続中…',
    goal_status_none: 'アクティブなゴールはありません。/goal <テキスト> で設定してください。',
    goal_status_active: (turns, max_turns, goal) => `⊙ ゴール（実行中、${turns}/${max_turns}ターン）: ${goal}`,
    goal_status_paused: (turns, max_turns, reason, goal) => `⏸ ゴール（一時停止、${turns}/${max_turns}${reason ? `、${reason}` : ''}）: ${goal}`,
    goal_status_done: (turns, max_turns, goal) => `✓ ゴール完了（${turns}/${max_turns}）: ${goal}`,
    goal_set: (turns, goal) => `⊙ ゴール設定（${turns}ターン予算）: ${goal}`,
    goal_paused: (goal) => `⏸ ゴール一時停止: ${goal}`,
    goal_resumed: (goal) => `▶ ゴール再開: ${goal}`,
    goal_cleared: 'ゴールをクリアしました。',
    goal_no_goal: 'アクティブなゴールはありません。',
    goal_achieved: (reason) => `✓ ゴール達成: ${reason}`,
    goal_paused_budget_exhausted: (turns, max_turns) => `⏸ ゴール一時停止 — ${turns}/${max_turns}ターンを使用しました。継続するには /goal resume、停止するには /goal clear を使ってください。`,
    goal_continuing: (turns, max_turns, reason) => `↻ ゴールに向けて継続中（${turns}/${max_turns}）: ${reason}`,
    cmd_interrupt: '現在のターンをキャンセルして新規メッセージを送信',
    cmd_steer: 'エージェントを中断せずにターン中に修正を注入',
    cmd_queue_no_msg: '使い方: /queue <メッセージ>',
    cmd_queue_not_busy: 'アクティブなタスクなし — 通常通り送信してください',
    cmd_queue_confirm: 'メッセージをキューに入れました',
    cmd_interrupt_no_msg: '使い方: /interrupt <メッセージ>',
    cmd_interrupt_confirm: '中断 — 新しいメッセージを送信中',
    cmd_steer_no_msg: '使い方: /steer <メッセージ>',
    cmd_steer_fallback: 'ステア利用不可 — 代わりに次のターンへキュー',
    cmd_steer_delivered: 'ステア送信完了 — 次のツール結果でエージェントが認識します',
    steer_leftover_queued: 'ステアを次のターンへキュー',
    busy_steer_fallback: 'ステア利用不可 — 次のターンへキュー',
    busy_interrupt_confirm: '中断 — 新しいメッセージを送信中',
    settings_label_busy_input_mode: 'ビジー時の入力モード',
    settings_desc_busy_input_mode: 'エージェント実行中にメッセージを送信した時の動作を制御します。Queue は待機、Interrupt はキャンセルして再開、Steer は中断せずにターン中に修正を注入します (エージェントやストリームが利用不可ならキューにフォールバック)。',
    settings_label_fade_text_effect: 'テキストのフェード効果',
    settings_desc_fade_text_effect: 'アシスタントの応答中に新しくストリーミングされた単語をフェードインします。OpenWebUI に似た表示です。最大パフォーマンスのため既定ではオフです。',
    settings_busy_input_mode_queue: 'フォローアップをキュー',
    settings_busy_input_mode_interrupt: '現在のターンを中断',
    settings_busy_input_mode_steer: 'ステア (ターン中の修正)',

  slash_skill_badge:'スキル',
  slash_skill_desc:'このスキルを呼び出す',
  cmd_stop:'現在の応答を停止',
  cmd_title:'セッションタイトルを取得・設定',
  cmd_retry:'最後のメッセージを再送信',
  cmd_undo:'最後のやり取りを削除',
  cmd_btw:'サイド質問 (一時的)',
  cmd_btw_usage:'/btw <質問> — セッション文脈でサイド質問',
   cmd_background:'プロンプトをバックグラウンド実行',
   cmd_background_usage:'/background <プロンプト> — ブロックせずに並列実行',
   cmd_branch:'この会話を新しいセッションへ分岐',
   cmd_branch_usage:'/branch [名前] — 会話を分岐 (任意で名前指定)',
   branch_forked:'新しいセッションへ分岐しました',
   branch_failed:'分岐失敗: ',
   fork_from_here:'ここから分岐',
   forked_from:'分岐元',
   subagent_children:'サブエージェントセッション',
   btw_asking:'サイド質問を問い合わせ中...',
  btw_label:'サイド質問 — 履歴に残らない',
  btw_done:'サイド質問に回答しました',
  btw_no_answer:'回答が得られませんでした。',
  btw_failed:'サイド質問失敗: ',
  bg_running:'バックグラウンド実行中...',
  bg_complete:'バックグラウンドタスク完了',
  bg_label:'バックグラウンド結果:',
  bg_no_answer:'(回答なし)',
  bg_failed:'バックグラウンドタスク失敗: ',
  undo_exchange:'最後のやり取りを取り消す',
  cmd_status:'セッション情報を表示',
  cmd_voice:'マイク入力を切り替え',
  stream_stopped:'応答を停止しました。',
  no_active_task:'停止できるアクティブタスクがありません。',
  cancel_unavailable:'キャンセルできません。',
  retry_failed:'再試行失敗: ',
  undo_failed:'取り消し失敗: ',
  undid_n_messages:'削除',
  undid_messages_suffix:'件のメッセージ。',
  status_heading:'セッションステータス',
  status_session_id:'セッションID',
  status_title:'タイトル',
  status_model:'モデル',
  status_provider:'プロバイダー',
  status_workspace:'ワークスペース',
  status_personality:'パーソナリティ',
  status_messages:'メッセージ',
  status_agent_running:'エージェント実行中',
    status_profile: 'プロファイル',
    status_hermes_home: 'Hermes ホーム',
    status_started: '開始',
    status_tokens: 'トークン',
    status_updated: '更新',
    status_ephemeral: '一時的なスナップショット — 履歴には保存されません。',
    status_no_tokens: 'トークン未使用',
    status_unknown: '不明',
  status_yes:'はい',
  status_no:'いいえ',
  status_load_failed:'ステータス読み込み失敗: ',
  title_current:'現在のタイトル',
  title_change_hint:'`/title <新しい名前>` で改名できます。',
  title_set:'タイトルを設定: ',
  cmd_webui_only_session:'CLI からインポートしたセッションでは使えません。',
  cmd_voice_use_mic:'コンポーザーのマイクボタンをクリックしてください。',
  usage_heading:'トークン使用量',
  usage_default_model:'デフォルト',
  usage_unknown:'不明',
  usage_input_tokens:'入力トークン',
  usage_output_tokens:'出力トークン',
  usage_total:'合計トークン',
  usage_estimated_cost:'推定コスト',
  usage_settings_tip:'注: コスト推定はおおよその値です。',
  usage_load_failed:'使用量読み込み失敗: ',
    usage_personality_none:'なし',
    // Session toolsets (#493)
    session_toolsets:'セッションツールセット',
    session_toolsets_desc:'このセッションで利用可能なツールを制限 (空欄=グローバル設定を使用)',
    session_toolsets_global:'グローバル (デフォルト)',
    session_toolsets_custom:'カスタム',
    session_toolsets_placeholder:'tool1, tool2, …',
    session_toolsets_apply:'適用',
    session_toolsets_clear:'クリア (グローバルを使用)',
    session_toolsets_applied:'ツールセットを更新しました',
    session_toolsets_cleared:'ツールセットをクリアしました — グローバル設定を使用',
    session_toolsets_failed:'ツールセット更新失敗: ',
  untitled:'無題',
    no_personalities: 'パーソナリティが見つかりません (~/.hermes/personalities/ に追加してください)',
    available_personalities: '利用可能なパーソナリティ:',
    personality_switch_hint: '\n\n`/personality <名前>` で切り替え、`/personality none` でクリアします。',
    personalities_load_failed: 'パーソナリティの読み込みに失敗しました',
    personality_cleared: 'パーソナリティをクリアしました',
    personality_set: 'パーソナリティ: ',
    failed_colon: '失敗: ',
    // ui.js
    no_workspace: 'ワークスペースなし',
    terminal_open_title: 'ワークスペースのターミナルを開く',
    terminal_no_workspace_title: 'ターミナルを開くにはワークスペースを選択してください',
    terminal_title: 'ターミナル',
    terminal_clear: 'クリア',
    terminal_copy_output: '出力をコピー',
    terminal_restart: '再起動',
    terminal_collapse: '折りたたむ',
    terminal_expand: '展開',
    terminal_close: '閉じる',
    terminal_input_placeholder: 'コマンドを実行...',
    terminal_start_failed: 'ターミナル起動失敗: ',
    terminal_input_failed: 'ターミナル入力失敗: ',
    terminal_copy_failed: 'コピー失敗: ',
    terminal_error: 'ターミナルエラー',
    terminal_remote_backend_unsupported: '埋め込みターミナルはローカルのターミナルバックエンドでのみ利用できます。',
    workspace_empty_no_path: 'ワークスペースが選択されていません。設定 → ワークスペースで選択してください。',
    workspace_empty_dir: 'このワークスペースは空です。',
    workspace_show_hidden_files: '隠しファイルを表示',
    workspace_show_hidden_files_desc: '.DS_Store、.git、node_modules などの隠しファイル・システムファイルをファイルツリーに表示します。',
    workspace_hidden_files_visible: '隠しファイル表示中',
    workspace_hidden_files_visible_title: '隠しファイルが表示されています — クリックでオプション',
    workspace_options: 'ワークスペースオプション',
    dialog_confirm_title: '操作の確認',
    dialog_prompt_title: '値を入力',
    dialog_confirm_btn: '確認',
    // workspace.js
    unsaved_confirm: 'プレビューに未保存の変更があります。破棄して移動しますか?',
    discard: '破棄',
    save: '保存',
    edit: '編集',
    clear: 'クリア',
    create: '作成',
    remove: '削除',
    save_title: '変更を保存',
    edit_title: 'このファイルを編集',
    saved: '保存しました',
    save_failed: '保存失敗: ',
    image_load_failed: '画像を読み込めませんでした',
    file_open_failed: 'ファイルを開けませんでした',
    downloading: (name) => `${name} をダウンロード中…`,
    double_click_rename: 'ダブルクリックで名前変更',
    session_rename_failed_no_row: '名前変更を開始できませんでした — 行が見つかりません。',
    renamed_to: '名前を変更: ',
    rename_failed: '名前変更失敗: ',
    moved_to: '移動先: ',
    move_failed: '移動失敗: ',
    delete_title: '削除',
    delete_confirm: (name) => `${name} を削除しますか?`,
    delete_dir_confirm: (name) => `フォルダ "${name}" とその内容をすべて削除しますか?`,
    rename_title: '名前変更',
    rename_prompt: '新しい名前:',
    deleted: '削除しました: ',
    delete_failed: '削除失敗: ',
     reveal_in_finder: 'ファイルマネージャーで表示',
     reveal_failed: '表示に失敗しました: ',
     copy_file_path: 'ファイルパスをコピー',
     open_in_vscode: 'VS Codeで開く',
     open_in_vscode_failed: 'VS Codeで開けませんでした: ',
     download_folder: 'フォルダをダウンロード',
    path_copied: 'ファイルパスをクリップボードにコピーしました',
    path_copy_failed: 'パスのコピーに失敗しました: ',
    session_rename: '会話の名前を変更',
    session_rename_desc: 'この会話のタイトルを編集',
    session_title_regenerate: 'タイトルを再生成',
    session_title_regenerate_desc: '会話から新しいタイトルを生成するよう Hermes に依頼します',
    session_title_regenerating: 'タイトルを再生成中…',
    session_title_regenerated: (title) => `タイトルを再生成しました: ${title}`,
    session_title_regenerate_failed: 'タイトルの再生成に失敗しました: ',
    session_copy_link: '会話リンクをコピー',
    session_copy_link_desc: 'この会話への直接リンクをコピー',
    session_link_copied: '会話リンクをクリップボードにコピーしました',
    session_link_copy_failed: '会話リンクをコピーできませんでした: ',
    new_file_prompt: '新しいファイル名 (例: notes.md):',
    new_file: '新規ファイル',
    new_folder: '新規フォルダ',
    workspace_root: 'ワークスペースのルート',
    new_file_prompt_title: '{0} の新しいファイル名:',
    new_folder_prompt_title: '{0} の新しいフォルダ名:',
    project_name_prompt: 'プロジェクト名:',
    created: '作成しました: ',
    create_failed: '作成失敗: ',
    new_folder_prompt: '新しいフォルダ名:',
    folder_created: 'フォルダを作成しました: ',
    folder_create_failed: 'フォルダ作成失敗: ',
  workspace_auto_create_folder: 'フォルダが存在しなければ作成',
  folder_add_as_space_btn: 'スペースとして追加',
  folder_add_as_space_msg: 'このフォルダをワークスペース一覧に新しいスペースとして追加しますか?',
  folder_add_as_space_title: 'スペースとして追加?',
    remove_title: '削除',
    empty_dir: '(空)',
    upload_failed: 'アップロード失敗: ',
    upload_too_large: (maxMb, fileMb) => `ファイルが大きすぎます (${fileMb} MB)。最大アップロードサイズは ${maxMb} MB です。`,
    uploading: 'アップロード中…',
    uploaded: 'アップロード完了',
    all_uploads_failed: (n) => `${n} 件のアップロードがすべて失敗しました`,
    archive_extracted: (n, c) => `${c} 個のアーカイブから ${n} 件のファイルを展開しました`,
    session_pin: '会話をピン留め',
    session_unpin: 'ピン留めを解除',
    session_pin_desc: 'この会話を上部に固定',
    session_unpin_desc: 'ピン留めから外す',
    session_pin_failed: 'ピン留め失敗: ',
    session_move_project: 'プロジェクトへ移動',
    session_move_project_desc_has: 'この会話のプロジェクトを変更',
    session_move_project_desc_none: 'この会話にプロジェクトを割り当て',
    session_archive: '会話をアーカイブ',
    session_hide_external: 'リストから非表示',
    session_restore: '会話を復元',
    session_archive_desc: 'アーカイブを表示するまでこの会話を非表示にする',
    session_archive_worktree_desc: 'この会話を非表示にし、worktree はディスク上に残します',
    session_hide_external_desc: '元の履歴を削除せずに、この取り込んだセッションを WebUI のリストから非表示にします。',
    session_restore_desc: 'この会話をメイン一覧に戻す',
    session_archived: 'セッションをアーカイブしました',
    session_archived_worktree: 'セッションをアーカイブしました。Worktree はディスク上に残ります。',
    session_hidden: 'セッションをリストから非表示にしました',
    session_restored: 'セッションを復元しました',
    session_archive_failed: 'アーカイブ失敗: ',
    session_duplicate: '会話を複製',
    session_duplicate_desc: '同じワークスペースとモデルでコピーを作成',
    session_duplicated: 'セッションを複製しました',
    session_duplicate_failed: '複製失敗: ',
    session_stop_response: '応答を停止',
    session_stop_response_desc: 'この会話の実行中の応答をキャンセルします',
    session_delete: '会話を削除',
    session_delete_desc: 'この会話を完全に削除',
    session_delete_confirm: 'この会話を削除しますか?',
    session_delete_worktree_desc: 'WebUI の会話だけを削除し、worktree はディスク上に残します',
    session_delete_worktree_confirm: (path) => `この会話を削除しますか? ${path} の worktree はディスク上に残ります。`,
    session_deleted: '会話を削除しました',
    session_deleted_worktree: '会話を削除しました。Worktree はディスク上に残ります。',
    session_worktree_remove: 'ワークツリーを削除',
    session_worktree_remove_desc: (path) => `${path} のgitワークツリーをディスクから削除します`,
    session_worktree_remove_confirm: (path) => `gitワークツリーをディスクから削除しますか？\n\nパス: ${path}\n\nワークツリーディレクトリ全体が削除されます。セッションデータはWebUIに残ります。`,
    session_worktree_remove_not_exists: (path) => `${path} のワークツリーはディスク上に存在しません。`,
    session_worktree_remove_confirm_label: '削除',
    session_worktree_removed: 'ワークツリーを削除しました。',
    session_worktree_remove_failed: 'ワークツリーの削除に失敗: ',
    session_worktree_remove_status_failed: 'ワークツリー状態の読み取りに失敗: ',
    session_worktree_remove_locked_by_stream: '削除できません — アクティブなストリーミングセッションがこのワークツリーを使用中です。',
    session_worktree_remove_locked_by_terminal: '削除できません — アクティブな端末セッションがこのワークツリーを使用中です。',
    session_worktree_remove_unsafe_blocked: 'このワークツリーを削除する前に、ローカル変更または未プッシュのコミットを解消してください。',
    session_worktree_remove_dirty_warning: '警告: このワークツリーにはコミットされていない変更があり、失われます。',
    session_worktree_remove_untracked_warning: (count) => `${count}件の追跡されていないファイルが完全に削除されます。`,
    session_worktree_remove_ahead_warning: (ahead) => `${ahead}件の未プッシュコミットが失われます。`,
    session_select_mode: '選択',
    session_select_mode_desc: '会話を選択して一括管理',
    session_select_all: 'すべて選択',
    session_deselect_all: '選択解除',
    session_selected_count: '{0} 件選択',
    session_batch_archive: 'アーカイブ',
    session_batch_delete: '削除',
    session_batch_move: 'プロジェクトへ移動',
    session_batch_delete_confirm: '{0} 件の会話を削除しますか?',
    session_batch_archive_confirm: '{0} 件の会話をアーカイブしますか?',
    session_batch_delete_worktree_confirm: '{0} 件の会話を削除しますか? {1} 件の worktree 付き会話は、worktree ディレクトリをディスク上に残します。',
    session_batch_archive_worktree_confirm: '{0} 件の会話をアーカイブしますか? {1} 件の worktree 付き会話は、worktree ディレクトリをディスク上に保持します。',
    session_no_selection: '会話が選択されていません',
    // settings panel
    settings_heading_title: 'コントロールセンター',
    settings_heading_subtitle: '環境設定、会話ツール、システム制御。',
    settings_section_conversation_title: '会話',
    settings_section_appearance_title: '外観',
    settings_section_appearance_meta: 'テーマ、アクセントカラー、ビジュアルスタイル。',
    settings_section_preferences_title: '環境設定',
    settings_section_preferences_meta: 'Hermes Web UI のデフォルトと UI 動作。',
    settings_section_system_title: 'システム',
    settings_section_system_meta: 'インスタンスのバージョンとアクセス制御。',
    settings_check_now: '今すぐ確認',
    settings_checking: '確認中…',
    settings_up_to_date: '最新です ✓',
    settings_updates_available: '{count} 件のアップデートあり',
    settings_update_check_failed: 'アップデート確認失敗',
    settings_updates_disabled: 'アップデート確認は無効です',
    settings_label_workspace_panel_open: 'ワークスペースパネルをデフォルトで開いておく',
    settings_desc_workspace_panel_open: '有効にすると、新しいセッションごとにワークスペース/ファイルブラウザパネルが自動で開きます。手動でいつでも閉じられます。',
    settings_label_session_jump_buttons: 'セッションジャンプボタンを表示',
    settings_desc_session_jump_buttons: '長いセッション履歴を読むときに、浮動表示の「開始」と「末尾」ボタンを表示します。',
    settings_label_terminal_auto_expand: '出力時にターミナルを自動展開',
    settings_desc_terminal_auto_expand: '実行中のコマンドが新しい出力を生成したときに、折りたたまれたターミナルパネルを自動的に展開します。',

    settings_label_session_endless_scroll: '上スクロールで古いメッセージを読み込む',

    settings_desc_session_endless_scroll: '有効にすると、上にスクロールしたとき古いメッセージを自動で読み込みます。無効の場合は古いメッセージボタンを使います。',
    settings_label_auto_scroll_follow: '新しい内容を自動で追従',
    settings_desc_auto_scroll_follow: '有効にすると、ストリーミング中に画面が自動で一番下までスクロールします。無効にすると、スクロール位置を自分で操作できます。',
    settings_label_worklog_details_expanded_default: 'Worklog の詳細を自動的に開く',
    settings_desc_worklog_details_expanded_default: '有効にすると、新しい Worklog の詳細が展開された状態で始まり、ツール、Thinking、進捗カードをクリックなしで確認できます。無効の場合、Worklog の詳細はデフォルトで折りたたまれます。ターンごとの手動折りたたみ/展開は優先されます。',
    settings_label_chat_activity_display_mode: 'Activity display',
    settings_desc_chat_activity_display_mode: 'Compact Worklog groups supporting activity into a quiet summary. Transparent Stream keeps each thinking/tool event as its own chronological expandable row.',
    first_token_time: 'Time to first token',
    done: 'Done',
    settings_option_compact_worklog: 'Compact Worklog',
    settings_option_transparent_stream: 'Transparent Stream',

    settings_label_tab_visibility: 'サイドバータブ',
    settings_desc_tab_visibility: 'サイドバーとレールに表示するタブを選択します。チャットと設定は常に表示されます。',
    open_in_browser: 'ブラウザで開く',
    settings_dropdown_conversation: '会話',
    settings_dropdown_appearance: '外観',
    settings_dropdown_preferences: '環境設定',
    settings_dropdown_providers: 'プロバイダ',
    settings_dropdown_system: 'システム',
    settings_tab_conversation: '会話',
    settings_tab_appearance: '外観',
    settings_tab_preferences: '環境設定',
    settings_tab_plugins: 'プラグイン',
    settings_plugins_title: 'プラグイン',
    plugins_enable_toggle: '有効化',
    settings_plugins_meta: 'インストール済みのHermesプラグインと登録されているライフサイクルフックを確認できます。このパネルは読み取り専用です。',
    settings_plugins_empty: '現在表示できるHermesプラグインがありません。Hermes CLI/configからプラグインをインストールまたは有効化すると、ここに表示されます。',
    plugins_unnamed: '名前なしプラグイン',
    plugins_no_description: '説明がありません。',
    plugins_no_hooks: '登録済みのライフサイクルフックはありません',
    plugins_registered_hooks: '登録済みフック',
    plugins_enabled: '有効',
    plugins_disabled: '無効',
    plugins_active_provider: 'アクティブ（プロバイダー）',
    plugins_provider_no_hooks: 'プロバイダープラグイン — エージェント可視フックなし',
    plugins_load_failed: 'プラグインの読み込みに失敗しました: ',
    settings_tab_system: 'システム',
    settings_tab_help: 'ヘルプ',
    settings_help_meta: 'Hermes WebUI のリソースとサポート。',
    settings_help_docs_label: 'ドキュメント',
    settings_help_docs_desc: 'ガイド、設定リファレンス、および Hermes WebUI README の全文。',
    settings_help_docs_link: 'ドキュメントを開く',
    settings_help_issue_label: '問題が発生しましたか？',
    settings_help_issue_desc: 'GitHub で既存のレポートを検索するか、新しく報告を作成します。',
    settings_help_issue_link: 'GitHub Issues を開く',
    settings_title: '設定',
    settings_save_btn: '設定を保存',
    settings_label_model: 'デフォルトモデル',
    settings_desc_model: '新しい会話で使用されます。既存の会話は選択済みモデルを保持します。',
    settings_label_auxiliary_models: '補助モデル',
    settings_desc_auxiliary_models: 'ビジョン、圧縮、タイトル生成などの補助タスクのルーティング。「自動」はメインチャットモデルを使用します。',
    settings_btn_reset_aux_models: 'すべて自動にリセット',
    settings_btn_apply_aux_models: '変更を適用',
    settings_aux_provider_auto: 'メインモデルを使用',
    settings_aux_model_auto: '自動（プロバイダーのデフォルトを使用）',
    settings_aux_model_custom: 'カスタムモデル…',
    settings_aux_model_custom_prompt: 'モデルIDを入力：',
    settings_aux_loading: '補助モデルを読み込み中…',
    settings_aux_load_failed: '補助モデル設定を読み込めませんでした。エージェントAPIが利用可能であることを確認してください。',
    settings_aux_reset_confirm_title: '補助モデルをリセットしますか？',
    settings_aux_reset_confirm_msg: 'すべての補助タスクを自動（メインモデルを使用）に設定します。',
    settings_aux_reset_done: '補助モデルを自動にリセットしました',
    settings_aux_save_failed: '補助モデルの保存に失敗しました',
    settings_aux_saved: '補助モデルを更新しました',
    settings_aux_no_changes: '適用する変更はありません',
    settings_label_send_key: '送信キー',
    settings_label_theme: 'テーマ',
    settings_label_skin: 'スキン',
    settings_label_font_size: 'フォントサイズ',
    font_size_small: '小',
    font_size_default: 'デフォルト',
    font_size_large: '大',
    font_size_xlarge: '特大',
    settings_autosave_saving: '保存中…',
    settings_autosave_saved: '保存しました',
    settings_autosave_failed: '保存失敗',
    settings_autosave_retry: '再試行',
    settings_label_language: '言語',
    settings_label_quota_chip: 'コンポーザーにプロバイダーのクォータチップを表示',
    settings_desc_quota_chip: 'コンポーザーのフッターに残りクォータインジケーター（例: OpenRouter のクレジット残高）を表示します。デフォルトはオフ。有効にした場合、ラップトップや標準デスクトップの幅でコンポーザーが混雑しないよう、ワイドディスプレイ（≥1400px）でのみ表示されます。',
    settings_label_conversation_outline: '会話アウトラインを表示',
    settings_desc_conversation_outline: '現在の会話内のユーザー質問へ移動するデスクトップ専用リストを表示します。デフォルトはオフです。',
    settings_label_hide_suggestions: '新規チャットの候補を非表示',
    settings_desc_hide_suggestions: '空の新規チャット画面に表示されるデフォルトの候補ボタン3つを非表示にして、誤タップを防ぎます。',
    settings_label_token_usage: 'トークン使用量を表示',
    settings_label_token_speed: 'トークン速度 (TPS) を表示',
    settings_desc_token_speed: 'ストリーミング中および応答完了後にアシスタントメッセージヘッダーにトークン/秒を表示します。デフォルトではオフ。',
    settings_label_sidebar_density: 'サイドバー密度',
    cmd_reasoning: '思考表示の切り替え (表示/非表示)、努力レベル設定、現在状態の確認',
    settings_label_external_sessions: '非WebUIセッションを表示',
    settings_label_cron_sessions: 'Cronセッションを表示',
    settings_label_previous_messaging_sessions: '以前のメッセージングセッションを表示',
    settings_label_sync_insights: 'インサイトに同期',
    settings_label_check_updates: 'アップデートを確認',
    settings_label_ignore_agent_updates: 'Agentのアップデートを無視',
    settings_label_whats_new_summary: "What's New をAIで要約",
    settings_label_bot_name: 'デフォルトのアシスタント名',
    settings_label_password: 'アクセスパスワード',
    settings_label_pinned_limit: 'ピン留め会話の上限',
    settings_desc_pinned_limit: 'サイドバーにピン留めできるアクティブな会話の最大数。デフォルトは3。',
    settings_label_dashboard_mode: '公式Hermesダッシュボード',
    settings_desc_dashboard_mode: '公式hermesダッシュボードが到達可能な場合にナビゲーションレールにリンクを表示します。公開リバースプロキシURLはブラウザのみのリンクとして保存され、サーバーによるプローブは行われません。',
    settings_dashboard_mode_auto: '自動検出',
    settings_dashboard_mode_always: '常に表示',
    settings_dashboard_mode_never: '表示しない',
    settings_dashboard_save: 'ダッシュボードリンク設定を保存',
    settings_label_gateway_status: 'ゲートウェイステータス',
    settings_desc_gateway_status: 'Hermesゲートウェイのステータス（Telegram、Discord、Slackなど）',
    gateway_not_configured: 'ゲートウェイが未設定です',
    gateway_metadata_stale: 'ゲートウェイのメタデータが古いです',
    gateway_endpoint_unreachable: 'ゲートウェイのエンドポイントに到達できません',
    gateway_not_running: 'ゲートウェイが停止中',
    gateway_running_label: '実行中',
    gateway_last_active: '最終アクティブ: ',
    gateway_session_count: (n) => `${n} セッション`,
    gateway_load_failed: 'ゲートウェイのステータスを読み込めませんでした',
    settings_saved: '設定を保存しました',
    settings_save_failed: '保存失敗: ',
    settings_load_failed: '設定の読み込みに失敗: ',
    settings_saved_pw: '設定を保存 — パスワード保護を有効化、このブラウザはサインイン状態を維持します',
    settings_saved_pw_updated: '設定を保存 — パスワードを更新しました',
    // login page (used server-side via /api/i18n/login endpoint)
    login_title: 'サインイン',
    login_subtitle: 'パスワードを入力して続行',
    login_placeholder: 'パスワード',
    login_btn: 'サインイン',
    login_invalid_pw: 'パスワードが無効です',
    login_conn_failed: '接続失敗',
    dialog_confirm_title: '操作の確認',
    dialog_prompt_title: '値を入力',
    dialog_confirm_btn: '確認',
    discard: '破棄',
    clear: 'クリア',
    create: '作成',
    remove: '削除',
    project_name_prompt: 'プロジェクト名:',
    // Sidebar & Tabs
    tab_chat: 'チャット',
    tab_tasks: 'タスク',
    tab_skills: 'スキル',
    tab_memory: 'メモリ',
    tab_workspaces: 'スペース',
    tab_profiles: 'プロファイル',
    tab_kanban: 'カンバン',
    kanban_board: 'ボード',
    kanban_visible_tasks: '表示中のタスク: {0}',
    kanban_search_tasks: 'タスクを検索',
    kanban_all_assignees: '担当者: すべて',
    kanban_all_tenants: 'テナント: すべて',
    kanban_include_archived: 'アーカイブを含める',
    kanban_no_matching_tasks: '一致するタスクがありません',
    kanban_no_data: 'カンバンデータがありません',
    kanban_work_queue_hint: 'これは Hermes Agent のワークキューです。タスクを作成またはトリアージし、担当者を割り当て、Ready に移動すると、ディスパッチャーがそれをクレームします。',
    kanban_unavailable: 'カンバンを利用できません',
    kanban_read_only: '読み取り専用',
    kanban_empty: '空',
    kanban_task: 'タスク',
    kanban_no_description: '説明なし',
    kanban_refresh: '更新',
    kanban_status_triage: 'トリアージ',
    kanban_status_todo: 'ToDo',
    kanban_status_ready: '準備完了',
    kanban_status_running: '実行中',
    kanban_status_blocked: 'ブロック中',
    kanban_status_done: '完了',
    kanban_status_original_hint: '実際のステータス: {0}。このダイアログはトリアージ/ToDo/準備完了の編集のみ対応しています。',
    kanban_comments_count: 'コメント ({0})',
    kanban_events_count: 'イベント ({0})',
    kanban_links: 'リンク',
    kanban_parents: '親',
    kanban_children: '子',
    kanban_runs_count: '実行 ({0})',
    kanban_no_comments: 'コメントなし',
    kanban_no_events: 'イベントなし',
    kanban_no_runs: '実行なし',
    kanban_title: 'タイトル',
    kanban_description: '説明',
    kanban_description_placeholder: '任意 — 何をすべきか、受け入れ基準、リンク',
    kanban_status: 'ステータス',
    kanban_assignee: '担当者',
    kanban_assignee_placeholder: '任意 — 空欄で任意のワーカーに',
    kanban_tenant: 'テナント',
    kanban_tenant_placeholder: '任意 — プロジェクトまたはチームのスラッグ',
    kanban_priority: '優先度',
    kanban_priority_hint: '値が大きいほど優先されます。既定値は 0。',
    kanban_title_required: 'タイトルは必須です。',
    kanban_edit_task: 'タスクを編集',
    kanban_run_dispatcher: 'ディスパッチャーを実行',
    kanban_run_dispatcher_confirm: 'このボードの「Ready」タスクを取得し、ワーカーサブプロセスを起動します(クリック1回につき最大8件)。続行しますか?',
    kanban_assignee_profiles_label: 'Hermes プロファイル',
    kanban_assignee_other_label: 'その他 (CLI レーン / 削除されたプロファイル)',
    kanban_assignee_unassigned: '— 未割当 (自動実行されません) —',
    kanban_ready_needs_assignee: '担当者「未割当」+「Ready」を選択しました。ディスパッチャーはこのタスクをスキップします。続行するにはもう一度送信するか、プロファイルを選んでください。',
    kanban_dispatch_preview_prefix: 'プレビュー:',
    kanban_dispatch_run_prefix: '実行:',
    kanban_dispatch_spawned: '起動',
    kanban_dispatch_promoted: '昇格',
    kanban_dispatch_reclaimed: '再取得',
    kanban_dispatch_skipped_unassigned: 'スキップ (担当者なし)',
    kanban_dispatch_skipped_nonspawnable: 'スキップ (不明なプロファイル)',
    kanban_dispatch_auto_blocked: '自動ブロック',
    kanban_dispatch_timed_out: 'タイムアウト',
    kanban_dispatch_crashed: 'クラッシュ',
    kanban_new_task: '新規タスク',
    kanban_add_comment: 'コメント追加',
      kanban_only_mine: '自分のみ',
      kanban_bulk_action: '一括操作',
      kanban_nudge_dispatcher: 'ディスパッチャープレビュー',
      kanban_stats: '統計',
      kanban_worker_log: 'ワーカーログ',
      kanban_block: 'ブロック',
      kanban_unblock: 'ブロック解除',
      kanban_back_to_board: 'ボードに戻る',
      kanban_lanes_by_profile: 'プロファイル別レーン',
      kanban_new_board: '新規ボード…',
      kanban_rename_board: '現在のボード名を変更…',
      kanban_archive_board: '現在のボードをアーカイブ…',
      kanban_archive_board_confirm: 'ボード "{name}" をアーカイブしますか? タスクはディスク上に残り、kanban/boards/_archived/ から復元できます。',
      kanban_board_archived: 'ボードをアーカイブしました',
      kanban_board_name: '名前',
      kanban_board_slug: 'スラッグ (小文字・ハイフン)',
      kanban_board_description: '説明 (任意)',
      kanban_board_icon: 'アイコン (絵文字、任意)',
      kanban_board_color: '色 (任意)',
      kanban_board_name_required: '名前は必須です',
      kanban_board_slug_required: 'スラッグは必須です',
      kanban_card_complete: '完了',
      kanban_card_archive: 'アーカイブ',
      kanban_unassigned: '未割り当て',
    kanban_status_archived: 'アーカイブ済み',
    tab_todos: 'ToDo',
    tab_insights: 'インサイト',
    tab_dashboard: 'Hermes ダッシュボード',
    dashboard_loopback_warning: 'ダッシュボードはサーバー上のループバック専用です。サーバー上で閲覧するか、--host 0.0.0.0（安全ではありません）で再起動してください。',
    tab_logs: 'ログ',
    tab_settings: '設定',
    new_conversation: '新しい会話',
    filter_conversations: '会話を絞り込み...',
    markdown_table_filter: 'テーブルをフィルター',
    markdown_table_sort_column: '列を並べ替え',
    session_time_unknown: '不明',
    session_time_minutes_ago: (n) => `${n}分前`,
    session_time_hours_ago: (n) => `${n}時間前`,
    session_time_days_ago: (n) => `${n}日前`,
    session_time_last_week: '1週間前',
    session_time_bucket_today: '今日',
    session_time_bucket_yesterday: '昨日',
    session_time_bucket_this_week: '今週',
    session_time_bucket_last_week: '先週',
    session_time_bucket_older: 'それ以前',
    scheduled_jobs: 'スケジュールジョブ',
    new_job: '新規ジョブ',
    loading: '読み込み中...',
    search_skills: 'スキルを検索...',
    new_skill: '新規スキル',
    personal_memory: '個人メモリ',
    current_task_list: '現在のタスクリスト',
    // Logs
    logs_title: 'ログ',
    logs_file: 'ファイル',
    logs_tail: '末尾',
    logs_auto_refresh: '自動更新 (5秒)',
    logs_wrap: '行を折り返す',
    logs_copy_all: 'すべてコピー',
    logs_empty: 'ログはまだありません。',
    logs_loading: 'ログを読み込み中…',
    logs_load_failed: 'ログの読み込みに失敗しました',
    logs_status_idle: 'ログファイルを選択すると最近の行を表示します。',
    logs_no_mtime: '未書き込み',
    logs_truncated_hint: '大きなログファイルの末尾を表示しています。メモリ使用量を抑えるため、古いデータは省略されました。',
    logs_copied: 'ログをコピーしました',
    logs_severity: '重大度',
    logs_severity_all: 'すべて',
    logs_severity_errors: 'エラー',
    logs_severity_warnings: '警告+',
    logs_filter_active: '表示中（フィルター有効）',

    // Insights
    insights_title: '使用状況分析',
    insights_sessions: 'セッション',
    insights_messages: 'メッセージ',
    insights_tokens: 'トークン',
    insights_cost: '推定コスト',
    insights_no_cost: 'N/A',
    insights_models: 'モデル',
    insights_activity_by_day: '日別アクティビティ',
    insights_activity_by_hour: '時間別アクティビティ',
    insights_peak_hour: 'ピーク: {hour}',
    insights_token_breakdown: 'トークン内訳',
    insights_input_tokens: '入力',
    insights_output_tokens: '出力',
    insights_total: '合計',
    insights_daily_tokens: '日別トークン',
    insights_model_name: 'モデル',
    insights_model_sessions: 'セッション',
    insights_model_tokens: 'トークン',
    insights_model_cost: 'コスト',
    insights_model_share: 'シェア',
    insights_no_usage_data: '使用データはまだありません',
    insights_footer: '直近 {days} 日間のデータを表示',
    insights_skill_usage_title: 'スキル使用状況',
    insights_skill_usage_sub: 'ツール呼び出し頻度',
    insights_skill_usage_total: '総呼び出し数',
    insights_skill_usage_skills_used: '使用スキル数',
    insights_skill_usage_no_data: 'スキル使用データがまだありません',
    insights_skill_usage_no_data_hint: '会話でスキルを使用すると、ここに表示されます。',
    insights_skill_usage_footer: 'データ元: ~/.hermes/skills/',
    insights_skill_usage_col_skill: 'スキル',
    insights_skill_usage_col_uses: '使用回数',
    insights_skill_usage_col_views: '閲覧数',
    insights_skill_usage_col_share: '使用率',
    insights_skill_usage_col_patches: 'パッチ',
    workspace_desc: 'セッション用のワークスペースを追加・切り替えします。',
    session_meta_messages: (n) => `${n} 件`,
    session_meta_children: (n) => `${n} 子`,
    session_meta_segments: (n) => `${n} セグメント`,
    session_lineage_toggle_hint: '{0} — 以前のコンテキストターンはここに折りたたまれています。クリックして表示/非表示を切り替えます。',
    session_lineage_static_hint: '{0} — 以前のコンテキストターンはここに折りたたまれています。',
    session_child_toggle_hint: '{0} — このセッションから作成された子会話です。クリックして表示/非表示を切り替えます。',
    session_readonly_title_hint: '読み取り専用のインポート済みセッション — {0}',
    session_lineage_segment_untitled: '無題のセグメント',
    session_lineage_segment_open: '系譜セグメントを開く',
    new_profile: '新規プロファイル',
    transcript: 'トランスクリプト',
    download_transcript: 'Markdown としてダウンロード',
    import: 'インポート',
    export_session_json: 'JSON',
    export_session_json_tooltip: 'セッション全体をJSONとしてエクスポート',
    import_session_json_tooltip: 'JSONからセッションをインポート',
    clear_conversation_btn_tooltip: 'この会話のすべてのメッセージをクリア',
    // Settings detail
    settings_label_rtl: 'チャットの右から左へのレイアウト',
    settings_desc_rtl: 'アラビア語やヘブライ語のような言語向けに、チャットメッセージとコンポーザー入力の配置を反転します。チャット領域のみに影響し、サイドバーや他のパネルは左から右のままです。',
    settings_label_sound: '通知音',
    settings_desc_sound: 'アシスタントが応答を完了したときに音を鳴らします。',
    // TTS (#499)
    tts_listen: '読み上げ',
    tts_not_supported: 'このブラウザは音声合成に対応していません。',
    settings_label_tts: '応答の読み上げ (TTS)',
    settings_desc_tts: 'アシスタントの各メッセージにスピーカーボタンを表示し、ブラウザの音声合成で読み上げます。',
    settings_label_tts_auto_read: '応答を自動で読み上げ',
    settings_desc_tts_auto_read: '新しいアシスタント応答が完了するたびに自動で読み上げます。入力中は一時停止します。',
    // Composer voice-mode pref (#1488)
    settings_label_voice_mode: 'ハンズフリー音声モードのボタン',
    settings_desc_voice_mode: '音声波形ボタンをディクテーションマイクの隣に表示します。発話の合間に自動送信し、返答を読み上げます。音声認識と TTS の両方をサポートするブラウザが必要です。',
    settings_label_raw_audio: '文字起こしせずに生の音声を送信',
    settings_desc_raw_audio: '音声をテキストに変換せず、元の音声ファイルをそのままエージェントに送信します。エージェントは文字起こしをするか、生の音声を処理（感情分析、背景ノイズ、カスタムSTT）できます。Telegramの音声メッセージと同様の動作です。',
    voice_send_raw: '生の音声を送信',
    voice_raw_attached: '音声を添付しました。送信するかテキストを追加してください。',
    settings_label_tts_voice: '声',
    settings_desc_tts_voice: '優先する声。ブラウザで利用可能な声から選択されます。',
    settings_label_tts_rate: '読み上げ速度',
    settings_label_tts_pitch: '読み上げピッチ',
    settings_label_tts_engine: 'TTSエンジン',
    settings_desc_tts_engine: '音声エンジンを選択してください。Edge TTSはサーバー経由でMicrosoftのニューラル音声を使用します。',
    settings_label_notifications: 'ブラウザ通知',
    settings_desc_notifications: 'アプリがバックグラウンドの間に応答が完了したらシステム通知を表示します。',
    notifications_enable_btn: 'Enable notifications',
    notifications_test_btn: 'Send test',
    notifications_permission_status: (status) => `Permission: ${status}`,
    notifications_enabled_toast: 'Notifications enabled.',
    notifications_denied: 'Notifications are blocked in this browser. Enable them in browser settings.',
    notifications_unsupported: 'Notifications are not supported in this browser.',
    settings_desc_token_usage: 'アシスタント応答の下に入力/出力トークン数を表示します。/usage でも切替可能。',
    settings_label_api_redact: 'API 応答内の機密データをマスク',
    settings_desc_api_redact: 'セルフホスト利用者は透明性のため無効化できます (共有インスタンスでは非推奨)。',
    settings_sidebar_density_compact: 'コンパクト',
    settings_sidebar_density_detailed: '詳細',
    settings_desc_sidebar_density: '左サイドバーのセッション一覧に表示するメタデータ量を制御します。',
    settings_label_auto_title_refresh: 'タイトル自動更新',
    settings_auto_title_refresh_off: 'オフ',
    settings_auto_title_refresh_5: '5 回ごと',
    settings_auto_title_refresh_10: '10 回ごと',
    settings_auto_title_refresh_20: '20 回ごと',
    settings_desc_auto_title_refresh: '最新のやり取りに基づいてセッションタイトルを自動再生成し、会話の進行に合わせて適切に保ちます。LLM タイトル生成モデルの設定が必要です。',
    settings_desc_external_sessions: 'CLI、Telegram、Discord、Slack その他のチャネルからの会話をセッション一覧に表示します。クリックでインポートして続行できます。',
    settings_desc_cron_sessions: 'Cronジョブの出力をサイドバーの会話として表示します。WebUI以外のセッションが有効な場合のみ機能します。デフォルトはオフ。高頻度のジョブはサイドバーを溢れさせる可能性があります。',
    settings_desc_previous_messaging_sessions: 'reset または compression によって置き換えられた以前の Discord、Telegram、Slack、Weixin セッションを表示します。',
    settings_desc_sync_insights: 'WebUI のトークン使用量を state.db にミラーし、hermes /insights にブラウザセッションのデータを含めます。デフォルトはオフ。',
    settings_desc_check_updates: 'WebUI または Agent の新しいバージョンが利用可能な時にバナーを表示します。バックグラウンドで定期的に git fetch を実行します。',
    settings_desc_ignore_agent_updates: 'WebUIのアップデート確認は継続しますが、Agentのアップデート通知を非表示にし、Agentのアップデート取得をスキップします。',
    settings_desc_whats_new_summary: "What's Newの動作を、未加工の差分を最初に開く代わりに短い人間が読みやすい要約を生成するよう変更します。通常の差分比較は要約の後も引き続き利用できます。",
    settings_desc_bot_name: 'デフォルトプロファイルでのみ使用されます。他のプロファイルはそれぞれのプロファイル名を使用します。',
    settings_desc_password: '新しいパスワードを入力すると設定または変更します。空欄なら現在の設定を維持。',
    password_placeholder: '新しいパスワードを入力…',
    password_env_var_locked: '現在 HERMES_WEBUI_PASSWORD 環境変数が設定されており優先されます。ここで管理するには変数を解除してサーバーを再起動してください。',
    password_env_var_locked_placeholder: 'ロック中: HERMES_WEBUI_PASSWORD 環境変数が設定されています',
    disable_auth: '認証を無効化',
    sign_out: 'サインアウト',
    settings_label_shutdown: 'Hermes WebUI サーバーを停止',
    settings_desc_shutdown_before_cmd: 'ローカルの WebUI サーバーを正常に停止します。',
    settings_desc_shutdown_between_cmds: ' で起動していて、ターミナルに切り替えずに停止したいときに便利です。再度 WebUI にアクセスするにはサーバー（',
    settings_desc_shutdown_after_cmd: ' またはネイティブアプリ）を再起動する必要があります。',
    settings_btn_shutdown: 'サーバーを停止',
    settings_shutdown_confirm_title: 'Hermes WebUI を停止',
    settings_shutdown_confirm_message: 'Hermes WebUI サーバーを停止しますか？',
    settings_shutdown_confirm_btn: '停止',
    settings_shutdown_stopped_message: 'サーバーは停止しました。このタブを閉じて構いません。',
    // Providers panel
    providers_tab_title: 'プロバイダ',
    providers_section_title: 'プロバイダ',
    providers_section_meta: 'AI プロバイダの APIキー を管理します。変更は即時反映されます。',
    providers_status_configured: 'APIキー設定済み',
    providers_status_not_configured: 'APIキーなし',
    providers_status_oauth: 'OAuth（認証済み）',
    providers_status_api_key: 'APIキー',
    providers_status_not_configured_label: '未設定',
    providers_oauth_hint: 'OAuth 認証済み。APIキーは不要です。',
    providers_oauth_config_yaml_hint: 'config.yaml でトークンが設定されています。更新するには config.yaml の providers セクションを編集するか hermes auth を実行してください。',
    providers_oauth_not_configured_hint: '未認証です。ターミナルで hermes auth を実行してこのプロバイダを設定してください。',
    providers_save: '保存',
    providers_refresh_models: 'モデルを更新',
    providers_refreshing: '更新中…',
    providers_models_refreshed: 'モデルを更新しました',
    providers_remove: '削除',
    providers_saving: '保存中…',
    providers_removing: '削除中…',
    providers_enter_key: 'APIキーを入力してください',
    providers_empty: '設定可能なプロバイダが見つかりません。',
    providers_key_updated: 'APIキーを保存しました',
    providers_key_removed: 'APIキーを削除しました',
    providers_key_placeholder_new: 'sk-...',
    providers_key_placeholder_replace: '置き換える新しいキーを入力…',
    provider_quota_title: 'アクティブなプロバイダーのクォータ',
    provider_quota_active_provider: 'アクティブなプロバイダー',
    provider_quota_last_checked_after_refresh: '更新後に最終確認',
    provider_quota_last_checked: '最終確認 {0}',
    provider_quota_refresh_usage: '使用量を更新',
    provider_quota_refreshing: '更新中...',
    provider_quota_refresh_title: 'プロバイダーの使用制限を今すぐ更新',
    provider_quota_refresh_succeeded: 'プロバイダーの使用量を更新しました',
    provider_quota_refresh_failed: 'プロバイダーの使用量の更新に失敗しました',
    provider_quota_session_limit: '5時間制限',
    provider_quota_weekly_limit: '週間制限',
    provider_quota_window_fallback: 'ウィンドウ',
    provider_quota_metric_remaining: '残り',
    provider_quota_metric_used: '使用済み',
    provider_quota_metric_limit: '制限',
    provider_quota_status_available: '利用可能',
    provider_quota_status_exhausted: '使い切り済み',
    provider_quota_status_unavailable: '利用不可',
    provider_quota_status_failed: '失敗',
    provider_quota_status_checked: '確認済み',
    provider_quota_status_no_key: 'キーなし',
    provider_quota_status_invalid_key: '無効なキー',
    provider_quota_status_unsupported: '未対応',
    provider_quota_used_meta: '{0} 使用済み',
    provider_quota_resets_meta: '{0} にリセット',
    provider_quota_credential_pool: '認証情報プール',
    provider_quota_credential_label: '認証情報 {0}',
    provider_quota_pool_plans: 'プラン: {0}',
    provider_quota_pool_no_windows: 'アカウント制限ウィンドウは報告されていません。',
    provider_quota_account_limits_loaded: 'アカウント制限を読み込みました。',
    provider_quota_unavailable: 'クォータ状態は利用できません',
    provider_quota_retry_after: '{0} 以降に再試行',
    provider_quota_pool_summary_available: '{0}/{1} 利用可能',
    provider_quota_pool_summary_exhausted: '{0} 使い切り済み',
    provider_quota_pool_summary_failed: '{0} 失敗',
    provider_quota_pool_summary_checked: '{0} 確認済み',
    cancel: 'キャンセル',
    create_job: 'ジョブを作成',
    save_skill: 'スキルを保存',
    editing: '編集中',
    // Empty state
    empty_title: '何をお手伝いしましょう?',
    empty_subtitle: '何でも質問する、コマンド実行、ファイル探索、スケジュールタスク管理ができます。',
    suggest_files: 'このワークスペースにあるファイルは?',
    suggest_schedule: '今日のスケジュールは?',
    suggest_plan: '小さなプロジェクトの計画を手伝って。',
    // onboarding
    onboarding_badge: '初回起動',
    onboarding_title: 'Hermes Web UI へようこそ',
    onboarding_lead: 'クイックガイドで Hermes を確認し、プロバイダ設定を保存し、ワークスペースとモデルを選択し、必要ならパスワードでアプリを保護します。',
    onboarding_back: '戻る',
    onboarding_continue: '続ける',
    onboarding_skip: 'セットアップをスキップ',
    onboarding_skipped: 'セットアップをスキップ — 既存設定を使用します。',
    onboarding_open: 'Hermes を開く',
    onboarding_step_system_title: 'システム確認',
    onboarding_step_system_desc: 'Hermes Agent と設定の可視性を確認します。',
    onboarding_step_setup_title: 'プロバイダ設定',
    onboarding_step_setup_desc: '最低限の Hermes プロバイダ設定を保存します。',
    onboarding_step_workspace_title: 'ワークスペース + モデル',
    onboarding_step_workspace_desc: '新規セッションとチャットのデフォルトを選択します。',
    onboarding_step_password_title: 'パスワード (任意)',
    onboarding_step_password_desc: '共有前に Web UI を保護します。',
    onboarding_step_finish_title: '完了',
    onboarding_step_finish_desc: '確認してアプリに入ります。',
    onboarding_notice_system_ready: 'Web UI から Hermes Agent へ到達できそうです。',
    onboarding_notice_system_unavailable: 'Hermes Agent はまだ完全には利用できません。Bootstrap でインストールできますが、プロバイダ設定にはターミナルが必要な場合があります。',
    onboarding_check_agent: 'Hermes Agent',
    onboarding_check_agent_ready: '検出済み・インポート可能',
    onboarding_check_agent_missing: '不在または部分的にしかインポートできません',
    onboarding_check_password: 'パスワード',
    onboarding_check_password_enabled: '既に有効',
    onboarding_check_password_disabled: '未有効',
    onboarding_check_provider: 'プロバイダ設定',
    onboarding_check_provider_ready: 'チャット可能',
    onboarding_check_provider_partial: '保存済みだが不完全',
    onboarding_check_provider_pending: '検証が必要',
    onboarding_config_file: '設定ファイル:',
    onboarding_env_file: '.env ファイル:',
    onboarding_unknown: '不明',
    onboarding_current_provider: '現在の設定:',
    onboarding_missing_imports: '不足しているインポート:',
    onboarding_notice_setup_required: 'シンプルなプロバイダ経路をここで選んでください。高度な OAuth フローは現状 Hermes CLI 側で扱います。',
    onboarding_notice_setup_already_ready: '動作する Hermes プロバイダ設定が既に検出されています。維持するか、ここで置き換えできます。',
    onboarding_oauth_provider_ready_title: 'プロバイダは認証済み',
    onboarding_oauth_provider_ready_body: 'このインスタンスは Hermes CLI で設定された OAuth プロバイダ (<strong>{provider}</strong>) を使用します。APIキーは不要 — 続けるをクリックしてセットアップを完了してください。',
    onboarding_oauth_provider_not_ready_title: 'OAuth プロバイダは未認証',
    onboarding_oauth_provider_not_ready_body: 'このインスタンスは <strong>{provider}</strong> を使用しますが、これは APIキー ではなく OAuth を使用します。ターミナルで <code>hermes auth</code> または <code>hermes model</code> を実行して認証し、Web UI を再読み込みしてください。',
    onboarding_oauth_switch_hint: 'または下から別のプロバイダを選び、APIキー設定に切り替え:',
    oauth_login_codex: 'Codex (ChatGPT) でログイン',
    oauth_codex_step1: 'ステップ 1: この URL にアクセスしてコードを入力',
    oauth_codex_step2: 'ステップ 2: ページにこのコードを入力',
    oauth_codex_polling: '認可待ち...',
    oauth_codex_success: 'Codex OAuth ログインに成功しました!',
    oauth_codex_error: 'OAuth ログインに失敗しました',
    oauth_codex_expired: 'コードの有効期限が切れました。もう一度お試しください',
    onboarding_notice_workspace: 'これらの値は通常アプリと同じ設定 API を使用します。',
    onboarding_workspace_label: 'ワークスペース',
    onboarding_workspace_or_path: 'またはワークスペースのパスを入力',
    onboarding_workspace_placeholder: '/home/ユーザー名/workspace',
    onboarding_provider_label: 'セットアップモード',
    onboarding_quick_setup_badge: 'クイックセットアップ',
    provider_category_easy_start: '簡単スタート',
    provider_category_self_hosted: 'オープン / セルフホスト',
    provider_category_specialized: '専門用途',
    onboarding_api_key_label: 'APIキー',
    onboarding_api_key_placeholder: '空欄で既存の保存済みキーを維持',
    onboarding_api_key_label_optional: 'APIキー (任意)',
    onboarding_api_key_placeholder_optional: 'キー不要のサーバーの場合は空欄にしてください',
    onboarding_api_key_help_keyless: 'LM Studio / Ollama / vLLM の多くはキーなしで動作します。認証が不要なサーバーの場合は空欄にしてください。『接続テスト』で確認できます。',
    onboarding_api_key_help_prefix: 'Hermes の .env ファイルにシークレットとして保存されます — 使用変数:',
    onboarding_base_url_label: 'ベース URL',
    onboarding_base_url_placeholder: 'https://your-endpoint.example/v1',
    onboarding_base_url_help: 'OpenAI 互換ルーター、セルフホストサーバー、LiteLLM、Ollama、LM Studio、vLLM、または同様のエンドポイントで使用してください。',
    onboarding_model_label: 'デフォルトモデル',
    onboarding_workspace_help: 'セットアップ完了後の新規チャットで Hermes が使用するモデルを選択してください。',
    onboarding_custom_model_placeholder: 'モデル名を入力',
    onboarding_custom_model_help: 'カスタムエンドポイントの場合、サーバーが期待する正確なモデル ID を入力してください。',
    onboarding_notice_password_enabled: 'パスワードは既に設定済みです。置き換える場合のみ新しいものを入力してください。',
    onboarding_notice_password_recommended: '任意ですが、localhost 以外で UI を公開する場合は推奨します。',
    onboarding_password_label: 'パスワード (任意)',
    onboarding_password_placeholder: '空欄でスキップ',
    onboarding_password_help: 'パスワードは既存の設定 API 経由で保存され、サーバー側でハッシュ化されます。',
    onboarding_notice_finish: '後で設定からいつでも変更できます。',
    onboarding_not_set: '未設定',
    onboarding_password_will_enable: '有効化されます',
    onboarding_password_will_replace: '置き換えられます',
    onboarding_password_keep_existing: '現在のパスワードを維持',
    onboarding_password_remains_disabled: '無効のまま',
    onboarding_password_skipped: '今回はスキップ',
    onboarding_finish_help: '完了すると <code>onboarding_completed</code> が設定に保存され、通常アプリへ入ります。',
    onboarding_error_choose_workspace: '続行する前にワークスペースを選択してください。',
    onboarding_error_choose_model: '続行する前にモデルを選択してください。',
    onboarding_error_provider_required: '続行する前にセットアップモードを選択してください。',
    onboarding_error_base_url_required: 'カスタムエンドポイントにはベース URL が必要です。',
    onboarding_probe_test_button: '接続テスト',
    onboarding_probe_probing: '接続をテスト中…',
    onboarding_probe_ok: '接続成功。{n} 個のモデルが利用可能です。',
    onboarding_probe_error_generic: '設定されたベース URL に到達できません。',
    onboarding_probe_error_invalid_url: 'ベース URL は http:// または https:// で始まる必要があります。',
    onboarding_probe_error_dns: 'ホストを名前解決できませんでした。URL を確認するか、ホストの IP アドレスを使用してください。',
    onboarding_probe_error_connect_refused: '接続が拒否されました。サーバーが起動していない可能性があります。Docker 内からは localhost ではなくホスト IP を試してください。',
    onboarding_probe_error_timeout: '時間内に応答がありません。サーバーが起動しているか、URL が正しいか確認してください。',
    onboarding_probe_error_http_4xx: 'クライアントエラーが返されました。認証設定と URL パス (通常は /v1) を確認してください。',
    onboarding_probe_error_http_5xx: 'サーバーエラーが返されました。LM Studio / Ollama のログを確認してください。',
    onboarding_probe_error_parse: 'モデル一覧が期待する形式で返されませんでした。URL が OpenAI 互換 API のルートを指しているか確認してください。',
    onboarding_probe_error_unreachable: '設定されたベース URL に到達できません。',
    onboarding_error_probe_failed: 'ベース URL を検証できませんでした。',
    onboarding_error_workspace_required: 'ワークスペースは必須です。',
    onboarding_error_model_required: 'モデルは必須です。',
    onboarding_complete: 'オンボーディング完了',

    // panel/runtime i18n
    error_prefix: 'エラー: ',
    default: 'デフォルト',
    search: '検索',
    not_available: 'N/A',
    never: 'なし',
    add: '追加',
    add_failed: '追加失敗: ',
    remove_failed: '削除失敗: ',
    switch_failed: '切替失敗: ',
    name_required: '名前は必須です',
    content_required: '内容は必須です',
    view: '表示',
    dismiss: '閉じる',
    disable: '無効化',
    cron_no_jobs: 'スケジュールジョブが見つかりません。',
    cron_status_off: 'オフ',
    cron_status_paused: '一時停止',
    cron_status_error: 'エラー',
    cron_status_active: '有効',
    cron_status_running: '実行中…',
    cron_status_needs_attention: '要対応',
    cron_attention_desc: 'この繰り返しジョブには次回実行時刻がありません。スケジューラが次回実行時刻を計算できなかった可能性があります。',
    cron_attention_croniter_hint: 'Gateway ランタイムに croniter パッケージが不足している可能性があります。cron サポート付きで Gateway を再起動し、ジョブを再開してください。',
    cron_attention_resume: '再開して再計算',
    cron_jobs_project: 'Cronジョブ',
    cron_attention_run_once: '今すぐ1回実行',
    cron_attention_copy_diagnostics: '診断情報をコピー',
    cron_diagnostics_copied: 'Cron 診断情報をコピーしました',
    cron_next: '次回',
    cron_last: '前回',
    cron_run_now: '今すぐ実行',
    cron_pause: '一時停止',
    cron_resume: '再開',
    cron_job_name_placeholder: 'ジョブ名',
    cron_schedule_placeholder: 'スケジュール',
    cron_prompt_placeholder: 'プロンプト',
    cron_last_output: '前回の出力',
    cron_expand_prompt: 'プロンプトを展開',
    cron_collapse_prompt: 'プロンプトを折りたたむ',
    cron_expand_output: '出力を展開',
    cron_collapse_output: '出力を折りたたむ',
    cron_mode_agent: 'エージェント',
    cron_mode_script: 'スクリプト',
    cron_mode_label: 'モード',
    cron_script_job_banner: 'スケジュールでスクリプトを実行し、stdout を配信先へ送ります。エージェント・プロンプト・スキルは使いません。',
    cron_script_card_title: 'スクリプト',
    cron_script_output: 'スクリプト出力',
    cron_script_path_label: 'スクリプトパス',
    cron_script_path_hint: '絶対パスでない限り ~/.hermes/scripts/ から解決されます。動作を変えるにはサーバー上のスクリプトを編集してください。',
    cron_script_badge_title: 'スクリプトジョブ（エージェントなし）',
    cron_workdir_label: '作業ディレクトリ',
    cron_view_full_output: '全出力を表示',
    cron_all_runs: 'すべての実行',
    cron_hide_runs: '実行履歴を隠す',
    cron_no_runs_yet: '(まだ実行されていません)',
    cron_schedule_required_example: 'スケジュールは必須です (例: "0 9 * * *" または "every 1h")',
    cron_schedule_required: 'スケジュールは必須です',
    cron_prompt_required: 'プロンプトは必須です',
    cron_job_created: 'ジョブを作成しました',
    cron_duplicate: '複製',
    cron_duplicated: 'ジョブを複製しました (一時停止)',
    cron_job_triggered: 'ジョブを起動しました',
    cron_job_paused: 'ジョブを一時停止しました',
    cron_job_resumed: 'ジョブを再開しました',
    cron_job_updated: 'ジョブを更新しました',
    cron_model_label: 'モデルの上書き',
    cron_model_hint: 'このジョブのデフォルトモデルを上書きします。',
    cron_model_use_default: 'デフォルト（プロファイル/システムの既定を使用）',
    cron_delete_confirm_title: 'Cronジョブを削除',
    cron_delete_confirm_message: 'この操作は取り消せません。',
    cron_job_deleted: 'ジョブを削除しました',
    cron_completion_status: (name, status) => `Cron「${name}」${status}`,
    status_failed: '失敗',
    status_completed: '完了',
    todos_no_active: 'このセッションにアクティブなタスクリストがありません。',
    clear_conversation_title: '会話をクリア',
    clear_conversation_message: 'すべてのメッセージをクリアしますか? この操作は取り消せません。',
    clear_failed: 'クリア失敗: ',
    skills_no_match: '一致するスキルがありません。',
    skill_enabled: '有効',
    skill_disabled: '無効',
    skill_toggle_failed: 'スキルの切り替えに失敗しました: ',
    linked_files: 'リンクされたファイル',
    skill_load_failed: 'スキルを読み込めませんでした: ',
    skill_file_load_failed: 'ファイルを読み込めませんでした: ',
    skill_name_required: 'スキル名は必須です',
    skill_updated: 'スキルを更新しました',
    skill_created: 'スキルを作成しました',
    skill_deleted: 'スキルを削除しました',
    skill_delete_confirm: 'スキル "{0}" を削除しますか?',
    skills_empty_title: 'スキルを選択',
    skills_empty_sub: 'サイドバーからスキルを選んで内容を表示するか、新しいスキルを作成してください。',
    skills_edit: '編集',
    skills_delete: '削除',
    skills_back_to: '{0} に戻る',
    tasks_empty_title: 'スケジュールジョブを選択',
    tasks_empty_sub: 'サイドバーからジョブを選んで詳細と実行履歴を表示するか、新規作成してください。',
    workspaces_empty_title: 'スペースを選択',
    workspaces_empty_sub: 'サイドバーからスペースを選んでファイルと設定を表示するか、新しく追加してください。',
    profiles_empty_title: 'プロファイルを選択',
    profiles_empty_sub: 'サイドバーからエージェントプロファイルを選んで設定を表示・編集するか、新規作成してください。',
    memory_notes_label: 'メモリ (ノート)',
    memory_saved: 'メモリを保存しました',
    my_notes: 'マイノート',
    user_profile: 'ユーザープロファイル',
    external_notes_sources: 'サードパーティのノート',
    external_notes_empty: 'ノートまたはナレッジ用の MCP ソースはまだ表示されていません。Joplin、Obsidian、Notion、llm-wiki、または別のノートサーバーを設定するとここに表示されます。',
    external_notes_auto_recall_hint: '自動セッションリコールは変更されません。このドロワーには、設定済みソースと利用可能な読み取り/検索ツールだけが表示されます。',
    external_notes_no_tools: 'このソースで利用できる読み取り/検索ツールは現在表示されていません。',
    external_notes_tool_count: (count) => `${count} 個のノートツールが利用可能`,
    external_notes_configured_hint: 'この設定済みソースからツール名が想定されています。WebUI ランタイムが公開するとライブスキーマが表示されます。',
    external_notes_recent_ai: 'AI が最近使用',
    external_notes_auto: '自動',
    external_notes_recent_ai_reason: '自動リコール',
    external_notes_search_placeholder: 'ノートを検索…',
    external_notes_search_empty: '設定済みのノートソースを検索すると、ここにプレビューが表示されます。',
    source_active: 'アクティブ',
    source_configured: '設定済み',
    no_notes_yet: 'まだノートはありません。',
    no_profile_yet: 'まだプロファイルはありません。',
    agent_soul: 'エージェントソウル',
    no_soul_yet: 'ソウルがまだ定義されていません。',
    workspace_choose_path: 'ワークスペースのパスを選択',
    workspace_choose_path_meta: '検証済みパスを追加してこの会話を切り替え',
    workspace_manage: 'ワークスペースを管理',
    workspace_manage_meta: 'スペースパネルを開く',
    workspace_use_title: '現在のセッションで使用',
    workspace_use: '使用',
    workspace_add_path_placeholder: 'ワークスペースパスを追加 (例: /home/user/my-project)',
    workspace_paths_validated_hint: '保存前に既存ディレクトリとして検証されます。',

    workspace_drag_hint: 'ドラッグして並び替え',
    workspace_reorder_failed: '並び替え失敗',
    workspace_added: 'ワークスペースを追加しました',
    workspace_renamed: 'ワークスペース名を変更しました',
    workspace_remove_confirm_title: 'ワークスペースを削除',
    workspace_remove_confirm_message: (path) => `"${path}" を削除しますか?`,
    workspace_removed: 'ワークスペースを削除しました',
    workspace_switch_prompt_title: 'ワークスペースを切り替え',
    workspace_switch_prompt_message: '追加してこの会話を切り替える絶対パスを入力してください。',
    workspace_switch_prompt_confirm: '切り替え',
    workspace_switch_prompt_placeholder: '/Users/ユーザー名/project',
    workspace_not_added: 'ワークスペースは追加されませんでした',
    workspace_already_saved: 'ワークスペースは既に保存済み — 一覧から選択してください',
    workspace_busy_switch: 'エージェント実行中はワークスペースを切り替えできません',
    discard_file_edits_title: 'ファイル編集を破棄しますか?',
    discard_file_edits_message: 'ワークスペース切替でプレビュー内の未保存編集が破棄されます。',
    workspace_switched_to: (name) => `${name} に切り替えました`,
    profiles_no_profiles: 'プロファイルが見つかりません。',
    profile_api_keys_configured: 'APIキー設定済み',
    profile_gateway_running: 'Gateway 実行中',
    profile_gateway_stopped: 'Gateway 停止中',
    profile_active: 'アクティブ',
    profile_no_configuration: '設定なし',
    profile_skill_count: (count) => `${count} 件のスキル`,
    profile_use: '使用',
    profile_switch_title: 'このプロファイルに切り替え',
    profile_delete_title: 'このプロファイルを削除',
    profile_default_label: '(デフォルト)',
    profile_name_placeholder: 'プロファイル名 (小文字 a-z 0-9 ハイフン)',
    profile_clone_label: 'アクティブプロファイルから設定をコピー',
    profile_model_label: 'モデル / プロバイダー',
    profile_model_hint: 'この新しいプロファイルで使う設定済みプロバイダーとモデルを選択します。',
    profile_model_use_default: 'アクティブプロファイルのデフォルトを使用',
    profile_base_url_placeholder: 'ベース URL (任意、例: http://localhost:11434)',
    profile_api_key_placeholder: 'APIキー (任意)',
    manage_profiles: 'プロファイルを管理',
    profiles_load_failed: 'プロファイルの読み込みに失敗しました',
    profile_switched_new_conversation: (name) => `プロファイルを切替: ${name} — 新しい会話を開始しました`,
    profile_switched: (name) => `プロファイルを切替: ${name}`,
    profile_name_rule: '小文字、数字、ハイフン、アンダースコアのみ',
    profile_base_url_rule: 'ベース URL は http:// または https:// で始める必要があります',
    profile_created: (name) => `プロファイルを作成: ${name}`,
    profile_delete_confirm_title: (name) => `プロファイル "${name}" を削除しますか?`,
    profile_delete_confirm_message: 'このプロファイルのすべてのセッション、設定、スキル、メモリが完全に削除されます。この操作は取り消せません。',
    profile_deleted: (name) => `プロファイルを削除: ${name}`,
    active_conversation_none: 'アクティブな会話が選択されていません。',
    active_conversation_meta: (title, count) => `${title} · ${count} 件のメッセージ`,
    settings_unsaved_changes: '未保存の変更があります。',
    sign_out_failed: 'サインアウト失敗: ',
    disable_auth_confirm_title: 'パスワード保護を無効化',
    disable_auth_confirm_message: '誰でもこのインスタンスにアクセスできるようになります。',
    auth_disabled: '認証無効化 — パスワード保護を解除しました',
    disable_auth_failed: '認証の無効化に失敗: ',
    bg_error_single: (title) => `"${title}" でエラーが発生しました`,
    bg_error_multi: (count) => `${count} 件のセッションでエラーが発生しました`,
    // skill form
    skill_name: '名前',
    skill_category: 'カテゴリ',
    skill_category_placeholder: '任意、例: devops',
    skill_content: 'SKILL.md の内容',
    skill_content_placeholder: 'YAML フロントマター + Markdown 本文',
    skill_rename_not_supported: 'スキルの名前変更には対応していません。新しいスキルを作成し、古いものを削除してください。',
    skill_metadata: 'メタデータ',
    // cron form
    cron_name_label: '名前',
    cron_name_placeholder: '任意',
    cron_schedule_label: 'スケジュール',
    cron_schedule_hint: "繰り返し実行には 'every 1h' または Cron 式を使います。'30m' のような期間だけの指定は 1 回だけ実行されます。",
    cron_schedule_once_warning: "'30m' のような期間指定は 1 回だけ実行され、実行後に削除されます。繰り返すには 'every 30m' を使ってください。",
    cron_prompt_label: 'プロンプト',
    cron_deliver_label: '出力先',
    cron_deliver_local: 'ローカル (出力を保存のみ)',
    cron_deliver_custom: 'カスタム配信先',
    cron_profile_label: 'プロフィール',
    cron_profile_server_default: 'サーバーデフォルト',
    cron_profile_server_default_hint: '実行時に WebUI サーバーのデフォルトプロフィールを使用します。プロフィールのない既存ジョブはこの従来の動作を維持します。',
    cron_toast_notifications_label: '完了トースト',
    cron_toast_notifications_hint: 'この Cron が完了したときにトーストを表示します。オフでもタスクバッジと新規実行マーカーは更新されます。',
    cron_toast_notifications_enabled: '有効',
    cron_toast_notifications_disabled: '無効',
    cron_skills_label: 'スキル',
    cron_skills_placeholder: 'スキルを追加 (任意)…',
    cron_skills_edit_hint: 'スキル一覧は作成後に編集できません。',
    // workspace form
    workspace_name_label: '名前',
    workspace_name_placeholder: '任意の表示名',
    workspace_path_label: 'パス',
    workspace_path_required: 'パスは必須です',
    workspace_path_readonly: 'パスは変更できません。名前変更のみ可能です。',
    workspace_new_title: '新規スペース',
    // profile form
    profile_name_label: '名前',
    profile_base_url_label: 'ベース URL',
    profile_api_key_label: 'APIキー',
    cmd_yolo: 'YOLO モード切替 (承認スキップ)',
    yolo_no_session: 'アクティブなセッションがありません',
    yolo_enabled: '⚡ YOLO モード ON — このセッションは承認をスキップ',
    yolo_disabled: 'YOLO モード OFF',
    yolo_pill_label: 'YOLO',
    yolo_pill_title_active: 'YOLO モード有効 — クリックで無効化',
    approval_skip_all: '⚡ このセッションはすべてスキップ',
    approval_skip_all_title: 'このセッションのすべての承認プロンプトをスキップ',
    // composer action tooltips
    composer_send: 'メッセージを送信',
    composer_queue: 'メッセージをキュー',
    composer_interrupt: '中断して送信',
    composer_steer: '現在の応答をステア',
    composer_stop: '生成を停止',
    composer_disabled_clarify: '確認要求に応答してください',
    composer_disabled_compression: '圧縮の完了待ち',
    composer_compression_will_queue: 'メッセージを入力してください — 圧縮完了後にキューに追加され、送信されます',
    composer_disabled_empty: '送信するメッセージを入力してください',
    composer_mobile_workspace: 'ワークスペース',
    composer_mobile_model: 'モデル',
    composer_mobile_reasoning: '思考',
    composer_mobile_context: 'コンテキスト',
    media_audio_label: '音声',
    media_svg_label: '図',
    media_video_label: '動画',
    media_download: 'ダウンロード',
    csv_loading: 'CSV を読み込み中',
    csv_too_large: 'CSV ファイルが大きすぎてインライン表示できません',
    csv_no_data: 'CSV ファイルのデータが不足しているためテーブル表示できません',
    csv_error: 'CSV ファイルの読み込みに失敗しました',
    csv_header_note: '先頭行をテーブルヘッダーとして表示',
    excalidraw_loading: '図を読み込み中',
    excalidraw_too_large: 'Excalidraw ファイルが大きすぎてインライン表示できません',
    excalidraw_invalid: '無効な Excalidraw ファイル形式',
    excalidraw_error: 'Excalidraw ファイルの読み込みに失敗しました',
    excalidraw_label: '図',
    excalidraw_download: 'ダウンロード',
    excalidraw_empty: '空の図',
    excalidraw_render_error: '図の描画に失敗しました',
    excalidraw_simplified: '簡略化された SVG プレビュー — Excalidraw キャンバスとピクセル単位では一致しません',
    // ── Checkpoints / Rollback ──
    checkpoint_title: 'チェックポイント',
    checkpoint_empty: 'このワークスペースのチェックポイントが見つかりません。',
    checkpoint_loading: 'チェックポイントを読み込み中…',
    checkpoint_error: 'チェックポイントの読み込みに失敗しました',
    checkpoint_date: '日時',
    checkpoint_message: 'メッセージ',
    checkpoint_files: 'ファイル',
    checkpoint_view_diff: '差分を表示',
    checkpoint_restore: '復元',
    checkpoint_restore_confirm_title: 'チェックポイントを復元しますか?',
    checkpoint_restore_confirm_message: (ckpt) => `ワークスペースをチェックポイント "${ckpt}" に復元しますか? ファイルが保存版で上書きされます。このチェックポイント後に追加されたファイルは削除されません。`,
    checkpoint_restored: 'チェックポイントを復元しました',
    checkpoint_diff_title: 'チェックポイントの変更内容',
    checkpoint_diff_no_changes: 'このチェックポイントと現在のワークスペースの間に差分はありません。',
    checkpoint_diff_files_changed: (n) => `${n} 件のファイルが変更されました`,
    outline_title: 'アウトライン',
    outline_empty: 'まだ質問はありません。',
    outline_loading: '読み込み中…',
  },

  ru: {
    offline_title: 'Соединение потеряно',
    offline_browser_detail: 'Браузер сообщает, что это устройство офлайн.',
    offline_network_detail: 'Hermes сейчас недоступен из этого браузера.',
    offline_autorefresh: 'Я автоматически обновлю страницу, когда Hermes снова станет доступен.',
    offline_check_now: 'Проверить сейчас',
    offline_checking: 'Проверка…',
    offline_stream_waiting: 'Соединение потеряно. Ожидаю обновления…',
    _lang: 'ru',
    _label: 'Русский',
    _speech: 'ru-RU',
    cancelling: 'Отменяю…',
    cancel_failed: 'Не удалось отменить: ',
    mic_denied: 'Доступ к микрофону запрещён. Проверьте разрешения браузера.',
    mic_no_speech: 'Речь не распознана. Попробуйте ещё раз.',
    mic_network: 'Распознавание речи недоступно.',
    mic_error: 'Ошибка ввода речи: ',
    // Composer voice buttons (#1488)
    voice_dictate: 'Диктовка',
    voice_dictate_active: 'Остановить диктовку',
    voice_recording_active: 'Остановить запись',
    voice_mode_toggle: 'Голосовой режим',
    voice_mode_toggle_active: 'Выйти из голосового режима',
    voice_listening: 'Слушаю…',
    voice_speaking: 'Говорю…',
    voice_thinking: 'Думаю…',
    voice_error: 'Голосовой ввод не поддерживается в этом браузере',
    voice_mode_active: 'Голосовой режим включён',
    voice_mode_off: 'Голосовой режим выключен',
    session_imported: 'Сеанс импортирован',
    import_failed: 'Не удалось импортировать: ',
    import_invalid_json: 'Неверный JSON',
    image_pasted: 'Изображение вставлено: ',
    edit_message: 'Редактировать сообщение',
    regenerate: 'Сгенерировать ответ заново',
    copy: 'Копировать',
    copied: 'Скопировано!',
    copy_failed: '\u041e\u0448\u0438\u0431\u043a\u0430 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f',
    selected_text_reply: 'Ответить с выделенным',
    selected_text_reply_title: 'Добавить выделенный текст чата как цитируемый контекст',
    selected_text_reply_appended: 'Выделенный текст добавлен в поле ввода',
    saved_prompts_empty: 'Сохранённых подсказок пока нет.',
    saved_prompts_save_current: 'Сохранить текущий ввод как подсказку',
    saved_prompts_saved: 'Подсказка сохранена',
    saved_prompts_delete: 'Удалить подсказку',
    saved_prompts_empty_input: 'Сначала введите подсказку для сохранения',

    diff_loading: 'Загрузка diff',
    diff_error: 'Не удалось загрузить файл патча',
    diff_too_large: 'Файл патча слишком большой для отображения',
    tree_view: '樹狀',
    raw_view: '原始',
    parse_failed_note: 'parse failed',
    you: 'Вы',
    mcp_servers_title: 'MCP 伺服器',
    mcp_servers_desc: '管理 config.yaml 中設定的 MCP 伺服器。',
    mcp_no_servers: '未設定 MCP 伺服器。',
    mcp_add_server: '+ 新增伺服器',
    mcp_field_name: '伺服器名稱',
    mcp_transport_label: '傳輸類型',
    mcp_field_command: '命令',
    mcp_field_args: '參數（逗號分隔）',
    mcp_field_url: 'URL',
    mcp_field_timeout: '逾時（秒）',
    mcp_save: '儲存',
    mcp_cancel: '取消',
    mcp_name_required: '需要伺服器名稱。',
    mcp_url_required: 'HTTP 傳輸需要 URL。',
    mcp_command_required: 'stdio 傳輸需要命令。',
    mcp_saved: 'MCP 伺服器已儲存。',
    mcp_save_failed: '儲存 MCP 伺服器失敗。',
    mcp_delete_confirm_title: '刪除 MCP 伺服器',
    mcp_delete_confirm_message: '刪除 MCP 伺服器「{0}」？此操作無法撤銷。',
    mcp_deleted: 'MCP 伺服器已刪除。',
    mcp_delete_failed: '刪除 MCP 伺服器失敗。',
    mcp_load_failed: '載入 MCP 伺服器失敗。',
    mcp_restart_hint: 'Server changes are read-only here for now. Edit config.yaml and restart Hermes for changes to take effect.',
    mcp_toggle_followup: 'Enable/disable controls are intentionally deferred until MCP reload semantics are explicit.',
    mcp_status_active: 'Active',
    mcp_status_configured: 'Configured',
    mcp_status_disabled: 'Disabled',
    mcp_status_invalid_config: 'Invalid config',
    mcp_status_unknown: 'Unknown',
    mcp_tool_count: '{0} tools',
    mcp_enabled_yes: 'Enabled',
    mcp_enabled_no: 'Disabled',
    mcp_enable_server: 'Enable this MCP server',
    mcp_disable_server: 'Disable this MCP server',
    mcp_enabled_toast: (name) => `MCP server "${name}" enabled.`,
    mcp_disabled_toast: (name) => `MCP server "${name}" disabled.`,
    mcp_toggle_failed: 'Failed to update MCP server.',
    mcp_tools_title: 'MCP Tools',
    mcp_tools_desc: 'Search known tools across active MCP servers.',
    mcp_tools_search_placeholder: 'Search tools by name, server, or description…',
    mcp_tools_no_tools: 'No MCP tools are available from the active runtime inventory.',
    mcp_tools_no_matches: 'No MCP tools match your search.',
    mcp_tools_load_failed: 'Failed to load MCP tools.',
    mcp_tools_schema_empty: 'No schema parameters.',
    mcp_tools_runtime_note: 'Tool inventory only uses already-known active MCP runtime data; the WebUI does not start or probe servers.',
    mcp_tools_summary_no_matches: (query,total) => `No MCP tools matching “${query}” (${total} total MCP tools).`,
    mcp_tools_summary_none: 'No MCP tools to show.',
    mcp_tools_summary_matching: (query) => ` matching “${query}”`,
    mcp_tools_summary_total_note: (total) => ` (${total} total MCP tools)`,
    mcp_tools_summary_showing: (start,end,filtered,searchNote,totalNote,page,pages) => `Showing ${start}-${end} of ${filtered} MCP tools${searchNote}${totalNote}. Page ${page} of ${pages}.`,
    mcp_tools_page_size_prefix: 'Show',
    mcp_tools_page_size_suffix: 'per page',
    mcp_tools_per_page_aria: 'MCP tools per page',
    mcp_tools_inactive_configured_servers: (servers) => `Configured but inactive in this WebUI runtime: ${servers}.`,
    mcp_tools_pagination_label: 'MCP tools pagination',
    mcp_tools_previous_page: '‹ Prev',
    mcp_tools_previous_page_aria: 'Previous MCP tools page',
    mcp_tools_next_page: 'Next ›',
    mcp_tools_next_page_aria: 'Next MCP tools page',
    thinking: 'Думаю',
    expand_all: 'Развернуть всё',
    collapse_all: 'Свернуть всё',
    edit_failed: 'Не удалось отредактировать: ',
    regen_failed: 'Не удалось сгенерировать заново: ',
    reconnect_active: 'Ответ всё ещё генерируется. Обновить, когда будет готово?',
    reconnect_finished: 'Когда вы уходили, ответ ещё генерировался. Сообщения могли обновиться.',
    approval_heading: 'Требуется подтверждение',
    approval_desc_prefix: 'Обнаружена опасная команда',
    approval_btn_once: 'Разрешить один раз',
    approval_btn_once_title: 'Разрешить только эту команду (Enter)',
    approval_btn_session: 'Разрешить на этот сеанс',
    approval_btn_session_title: 'Разрешить для этого сеанса разговора',
    approval_btn_always: 'Всегда разрешать',
    approval_btn_always_title: 'Всегда разрешать команды по этому шаблону',
    approval_btn_deny: 'Запретить',
    approval_btn_deny_title: 'Запретить — не выполнять эту команду',
    approval_responding: 'Отвечаю…',
    untitled: 'Без названия',
    n_messages: (n) => `${n} сообщений`,
    load_older_messages: '↑ Прокрутите вверх или нажмите, чтобы загрузить ранние сообщения',
    session_jump_start: 'Начало',
    session_jump_start_label: 'Перейти к началу сессии',
    session_jump_end: 'Конец',
    session_jump_end_label: 'Перейти к концу сессии',
    session_new_message: 'Новое сообщение',
    session_new_message_label: 'Новое сообщение доступно, перейти к концу',
    jump_to_question: 'к ответу',
    jump_to_question_label: 'Перейти к началу этого ответа',
    queued_label: 'Отправить после ответа',
    queued_count: (n) => n === 1 ? '1 в очереди' : `${n} в очереди`,
    queued_cancel: 'Отменить сообщение',
    model_unavailable: ' (недоступна)',
    model_unavailable_title: 'Эта модель больше не входит в ваш текущий список провайдеров',
    provider_mismatch_warning: (m, p) =>
    `"${m}" может не работать с вашим настроенным провайдером (${p}). Всё равно отправить или запустите \`hermes model\` в терминале, чтобы переключиться.`,
    provider_mismatch_label: 'Несовпадение провайдера',
    gateway_auth_label: 'Сбой аутентификации Gateway',
    model_not_found_label: 'Модель не найдена',
    model_custom_label: 'Пользовательский ID модели',
    model_custom_placeholder: 'например, openai/gpt-5.4',
    cmd_help: 'Показать доступные команды',
    cmd_clear: 'Очистить сообщения беседы',
    cmd_compact: 'Сжать контекст беседы',
    cmd_model: 'Переключить модель (например, /model gpt-4o)',
    cmd_workspace: 'Переключить рабочее пространство по названию',
    cmd_terminal: 'Открыть терминал рабочей области',
    cmd_new: 'Начать новую сессию чата',
    cmd_usage: 'Показать или скрыть использование токенов',
    cmd_theme: 'Переключить внешний вид (тема: system/dark/light, скин: default/ares/mono/graphite/slate/poseidon/sisyphus/charizard/sienna/catppuccin/nous/geist-contrast/zeus/verdigris)',
    cmd_personality: 'Переключить личность агента',
    cmd_skills: 'Показать доступные навыки Hermes',
    cmd_use: 'Принудительно применить навык к следующему сообщению',
    available_commands: 'Доступные команды:',
    type_slash: 'Введите /, чтобы увидеть команды',
    conversation_cleared: 'Беседа очищена',
    model_usage: 'Использование: /model <name>',
    no_model_match: 'Нет модели, соответствующей "',
    model_did_you_mean: (m) => ` — возможно, вы имели в виду "${m}"?`,
    switched_to: 'Переключено на ',
    workspace_usage: 'Использование: /workspace <name>',
    no_workspace_match: 'Нет рабочего пространства, соответствующего "',
    switched_workspace: 'Переключено на рабочее пространство: ',
    workspace_switch_failed: 'Не удалось переключить рабочее пространство: ',
    new_session: 'Новая сессия создана',
    new_session_creating: 'Создаём новую беседу…',
    compressing: 'Запрашиваю сжатие контекста...',
    token_usage_on: 'Отображение токенов включено',
    usage_personality_none: 'none', // TODO: translate
    token_usage_off: 'Отображение токенов выключено',
    usage_cache_hit_detail: 'Кэш: {0}% попаданий ({1} чтение / {2} запись)',
    usage_cached_percent: '{0}% из кэша',
    theme_usage: 'Использование: /theme ',
    theme_set: 'Тема: ',
    no_active_session: 'Нет активной сессии',
    cmd_queue: 'Поставить сообщение в очередь на следующий оборот',
    cmd_goal: 'Задать или проверить постоянную цель',
    goal_evaluating_progress: 'Evaluating goal progress…',
    goal_working_toward: 'Working toward goal…',
    goal_continuing_toast: 'Continuing toward goal…',
    goal_status_none: 'No active goal. Set one with /goal <text>.',
    goal_status_active: (turns, max_turns, goal) => `⊙ Goal (active, ${turns}/${max_turns} turns): ${goal}`,
    goal_status_paused: (turns, max_turns, reason, goal) => `⏸ Goal (paused, ${turns}/${max_turns}${reason ? `, ${reason}` : ''}): ${goal}`,
    goal_status_done: (turns, max_turns, goal) => `✓ Goal done (${turns}/${max_turns}): ${goal}`,
    goal_set: (turns, goal) => `⊙ Goal set (${turns}-turn budget): ${goal}`,
    goal_paused: (goal) => `⏸ Goal paused: ${goal}`,
    goal_resumed: (goal) => `▶ Goal resumed: ${goal}`,
    goal_cleared: 'Goal cleared.',
    goal_no_goal: 'No active goal.',
    goal_achieved: (reason) => `✓ Goal achieved: ${reason}`,
    goal_paused_budget_exhausted: (turns, max_turns) => `⏸ Goal paused — ${turns}/${max_turns} turns used. Use /goal resume to keep going, or /goal clear to stop.`,
    goal_continuing: (turns, max_turns, reason) => `↻ Continuing toward goal (${turns}/${max_turns}): ${reason}`,
    cmd_interrupt: 'Прервать текущий оборот и отправить новое сообщение',
    cmd_steer: 'Направить агента исправлением (переходит к прерыванию)',
    cmd_queue_no_msg: 'Использование: /queue <сообщение>',
    cmd_queue_not_busy: 'Нет активной задачи — просто отправьте',
    cmd_queue_confirm: 'Сообщение в очереди',
    cmd_interrupt_no_msg: 'Использование: /interrupt <сообщение>',
    cmd_interrupt_confirm: 'Прервано — отправка нового сообщения',
    cmd_steer_no_msg: 'Использование: /steer <сообщение>',
    cmd_steer_fallback: 'Steer недоступен — прервано и поставлено в очередь',
    cmd_steer_delivered: 'Steer доставлен — агент увидит его в следующем ответе инструмента',
    steer_leftover_queued: 'Steer поставлен в очередь на следующий ход',
    busy_steer_fallback: 'Steer недоступен — прервано',
    busy_interrupt_confirm: 'Прервано — отправка нового сообщения',
    settings_label_busy_input_mode: 'Режим ввода при занятости',
    settings_desc_busy_input_mode: 'Определяет поведение при отправке сообщения во время работы агента. Очередь ждёт; Прерывание отменяет и начинает заново; Steer внедряет коррекцию без прерывания.',
    settings_label_fade_text_effect: 'Эффект плавного появления текста',
    settings_desc_fade_text_effect: 'Плавно показывает новые слова во время ответа ассистента. Похоже на OpenWebUI; по умолчанию выключено для максимальной производительности.',
    settings_busy_input_mode_queue: 'Поставить в очередь',
    settings_busy_input_mode_interrupt: 'Прервать текущий оборот',
    settings_busy_input_mode_steer: 'Steer (прерывание + отправка)',

    no_personalities: 'Личности не найдены (добавьте их в ~/.hermes/personalities/)',
    clarify_heading: 'Требуется уточнение',
    clarify_hint: 'Выберите вариант или введите свой ответ ниже.',
    clarify_input_placeholder: 'Введите ответ…',
    clarify_other: 'Другое',
    clarify_responding: 'Отвечаю…',
    session_attention_approval: (n) => n === 1 ? 'Одобрение' : `${n} одобр.`,
    session_attention_clarify: (n) => n === 1 ? 'Вопрос' : `${n} вопрос.`,
    session_attention_generic: (n) => n === 1 ? 'Внимание' : `${n} элем.`,
    session_attention_approval_title: 'Ожидается решение по разрешению',
    session_attention_clarify_title: 'Ожидается ваш ответ',
    session_attention_generic_title: 'Ожидается действие пользователя',
    clarify_send: 'Отправить',
    cmd_compact_alias: 'Устаревший псевдоним для /compress',
    cmd_compress: 'Сжать контекст беседы (использование: /compress [тема])',
    ctx_compress_hint: 'Сжать контекст для освобождения места →',
    ctx_compress_action: '⚠ Сжать сейчас для освобождения контекста',
    command_label: 'Команда',
    compress_complete_label: 'Сжатие завершено',
    auto_compress_label: 'Автосжатие',
    compress_failed_label: 'Ошибка сжатия',
    compress_running_label: 'Сжатие…',
    context_compaction_label: 'Сжатие контекста',
    retrieval_context_label: 'Индексированный контекст',
    retrieval_context_preview: 'Предыдущие сообщения сохранены и доступны через инструменты контекста',
    preserved_task_list_label: 'Сохранённый список задач',
    focus_label: 'Фокус',
    model_search_no_results: 'Модели не найдены',
    model_group_configured: 'Настроенные',
    ws_search_placeholder: 'Поиск рабочих пространств…',
    ws_no_results: 'Рабочие пространства не найдены',
    workspace_new_worktree_conversation: 'Новый разговор в worktree',
    workspace_new_worktree_conversation_meta: 'Создать изолированный git worktree для этого рабочего пространства.',
    workspace_worktree_created: 'Разговор в worktree создан',
    workspace_worktree_failed: 'Не удалось создать worktree: ',
    session_worktree_badge: 'Worktree',
    model_search_placeholder: 'Поиск моделей…',
    model_scope_advisory: 'Применяется к этой беседе со следующего сообщения.',
    session_toolsets: 'Session Toolsets', // TODO: translate
    session_toolsets_desc: 'Restrict available tools for this session (blank = use global config)', // TODO: translate
    session_toolsets_global: 'Global (default)', // TODO: translate
    session_toolsets_custom: 'Custom', // TODO: translate
    session_toolsets_placeholder: 'tool1, tool2, \u2026', // TODO: translate
    session_toolsets_apply: 'Apply', // TODO: translate
    session_toolsets_clear: 'Clear (use global)', // TODO: translate
    session_toolsets_applied: 'Toolsets updated', // TODO: translate
    session_toolsets_cleared: 'Toolsets cleared — using global config', // TODO: translate
    session_toolsets_failed: 'Failed to update toolsets: ', // TODO: translate
    model_scope_toast: 'Применяется к этой беседе со следующего сообщения.',
    reference_only_label: 'Только справка',
    settings_label_skin: 'Скин',
    settings_label_font_size: 'Размер шрифта',
    font_size_small: 'Маленький',
    font_size_default: 'Стандарт',
    font_size_large: 'Большой',
    font_size_xlarge: 'Очень большой',
    settings_autosave_saving: 'Сохранение…',
    settings_autosave_saved: 'Сохранено',
    settings_autosave_failed: 'Не удалось сохранить',
    settings_autosave_retry: 'Повторить',
    workspace_empty_dir: 'Это рабочее пространство пусто.',
    workspace_show_hidden_files: 'Показывать скрытые файлы',
    workspace_show_hidden_files_desc: 'Include .DS_Store, .git, node_modules, and other hidden / system files in the file tree.',
    workspace_hidden_files_visible: 'hidden visible',
    workspace_hidden_files_visible_title: 'Hidden files are visible — click for options',
    workspace_options: 'Workspace options',
    workspace_empty_no_path: 'Рабочее пространство не выбрано. Настройте его в Настройки → Рабочее пространство.',
    available_personalities: 'Доступные личности:',
    personality_switch_hint: '\n\nИспользуйте `/personality <name>` для переключения или `/personality none` для сброса.',
    personalities_load_failed: 'Не удалось загрузить личности',
    personality_cleared: 'Личность очищена',
    personality_set: 'Личность: ',
    failed_colon: 'Не удалось: ',
    no_workspace: 'Нет рабочего пространства',
    terminal_open_title: 'Открыть терминал рабочей области',
    terminal_no_workspace_title: 'Выберите рабочую область, чтобы открыть терминал',
    terminal_title: 'Терминал',
    terminal_clear: 'Очистить',
    terminal_copy_output: 'Копировать вывод',
    terminal_restart: 'Перезапустить',
    terminal_collapse: 'Свернуть',
    terminal_expand: 'Развернуть',
    terminal_close: 'Закрыть',
    terminal_input_placeholder: 'Введите команду...',
    terminal_start_failed: 'Не удалось запустить терминал: ',
    terminal_input_failed: 'Ошибка ввода терминала: ',
    terminal_copy_failed: 'Не удалось скопировать: ',
    terminal_error: 'Ошибка терминала',
    terminal_remote_backend_unsupported: 'Встроенный терминал поддерживается только для локальных терминальных бэкендов.',
    dialog_confirm_title: 'Подтвердить действие',
    dialog_prompt_title: 'Введите значение',
    dialog_confirm_btn: 'Подтвердить',
    unsaved_confirm: 'У вас есть несохранённые изменения в предпросмотре. Отменить и перейти дальше?',
    discard: 'Отменить',
    save: 'Сохранить',
    edit: 'Редактировать',
    clear: 'Очистить',
    create: 'Создать',
    remove: 'Удалить',
    save_title: 'Сохранить изменения',
    edit_title: 'Редактировать этот файл',
    saved: 'Сохранено',
    save_failed: 'Не удалось сохранить: ',
    image_load_failed: 'Не удалось загрузить изображение',
    file_open_failed: 'Не удалось открыть файл',
    downloading: (name) => `Скачиваю ${name}…`,
    double_click_rename: 'Дважды щёлкните, чтобы переименовать',
    session_rename_failed_no_row: 'Could not start rename — row not found.',
    renamed_to: 'Переименовано в ',
    rename_failed: 'Не удалось переименовать: ',
    moved_to: 'Перемещено в ',
    move_failed: 'Не удалось переместить: ',
    delete_title: 'Удалить',
    delete_confirm: (name) => `Удалить ${name}?`,
    delete_dir_confirm: (name) => `Удалить папку "${name}" и всё её содержимое?`,
    rename_title: 'Переименовать',
    rename_prompt: 'Новое имя:',
    deleted: 'Удалено ',
    delete_failed: 'Не удалось удалить: ',
     reveal_in_finder: 'Показать в файловом менеджере',
     reveal_failed: 'Не удалось открыть: ',
     copy_file_path: 'Копировать путь к файлу',
     open_in_vscode: 'Открыть в VS Code',
     open_in_vscode_failed: 'Не удалось открыть в VS Code: ',
     download_folder: 'Download Folder', // TODO: translate
    path_copied: 'Путь к файлу скопирован в буфер обмена',
    path_copy_failed: 'Не удалось скопировать путь: ',
    session_rename: 'Переименовать беседу',
    session_rename_desc: 'Изменить название этой беседы',
    session_title_regenerate: 'Сгенерировать название заново',
    session_title_regenerate_desc: 'Попросить Hermes сгенерировать новое название на основе беседы',
    session_title_regenerating: 'Повторная генерация названия…',
    session_title_regenerated: (title) => `Название сгенерировано заново: ${title}`,
    session_title_regenerate_failed: 'Не удалось сгенерировать название заново: ',
    session_copy_link: 'Скопировать ссылку на беседу',
    session_copy_link_desc: 'Скопировать прямую ссылку на эту беседу',
    session_link_copied: 'Ссылка на беседу скопирована в буфер обмена',
    session_link_copy_failed: 'Не удалось скопировать ссылку на беседу: ',
    new_file_prompt: 'Имя нового файла (например, notes.md):',
    new_file: 'Новый файл',
    new_folder: 'Новая папка',
    workspace_root: 'корень рабочей области',
    new_file_prompt_title: 'Имя нового файла в {0}:',
    new_folder_prompt_title: 'Имя новой папки в {0}:',
    project_name_prompt: 'Имя проекта:',
    created: 'Создано ',
    create_failed: 'Не удалось создать: ',
    new_folder_prompt: 'Имя новой папки:',
    folder_created: 'Папка создана ',
    folder_create_failed: 'Не удалось создать папку: ',
  workspace_auto_create_folder: 'Создать папку, если она не существует',
  folder_add_as_space_btn: 'Добавить',
  folder_add_as_space_msg: 'Добавить эту папку как новое пространство?',
  folder_add_as_space_title: 'Добавить как пространство?',
    remove_title: 'Удаление',
    empty_dir: '(пусто)',
    upload_failed: 'Не удалось загрузить: ',
    upload_too_large: (maxMb, fileMb) => `Файл слишком большой (${fileMb} МБ). Максимальный размер загрузки: ${maxMb} МБ.`,
    uploading: 'Загрузка…',
    uploaded: 'Загружено',
    all_uploads_failed: (n) => `Не удалось загрузить все ${n} файлов`,
    archive_extracted: (n, c) => `Извлечено ${n} файл(ов) из ${c} архив(ов)`,
    settings_title: 'Настройки',
    settings_save_btn: 'Сохранить настройки',
    settings_label_model: 'Модель по умолчанию',
    settings_desc_model: 'Используется для новых бесед. Существующие беседы сохраняют выбранную модель.',
    settings_label_auxiliary_models: 'Вспомогательные модели',
    settings_desc_auxiliary_models: 'Маршрутизация побочных задач: зрение, сжатие, генерация заголовков и т.д. «Авто» использует основную модель чата.',
    settings_btn_reset_aux_models: 'Сбросить всё на авто',
    settings_btn_apply_aux_models: 'Применить изменения',
    settings_aux_provider_auto: 'использовать основную модель',
    settings_aux_model_auto: 'авто (по умолчанию провайдера)',
    settings_aux_model_custom: 'Пользовательская модель…',
    settings_aux_model_custom_prompt: 'Введите ID модели:',
    settings_aux_loading: 'Загрузка вспомогательных моделей…',
    settings_aux_load_failed: 'Не удалось загрузить настройки вспомогательных моделей. Убедитесь, что API агента доступен.',
    settings_aux_reset_confirm_title: 'Сбросить вспомогательные модели?',
    settings_aux_reset_confirm_msg: 'Все вспомогательные задачи будут установлены на «авто» (использовать основную модель).',
    settings_aux_reset_done: 'Вспомогательные модели сброшены на авто',
    settings_aux_save_failed: 'Не удалось сохранить вспомогательную модель',
    settings_aux_saved: 'Вспомогательные модели обновлены',
    settings_aux_no_changes: 'Нет изменений для применения',
    settings_label_send_key: 'Клавиша отправки',
    settings_label_theme: 'Тема',
    settings_label_language: 'Язык',
    settings_label_quota_chip: 'Показывать чип квоты провайдера в композиторе',
    settings_desc_quota_chip: 'Отображает фоновый индикатор остатка квоты (например, баланс кредитов OpenRouter) в подвале композитора. По умолчанию отключено. Виден только на широких экранах (≥1400px) при включении, чтобы не загромождать композитор на ноутбуках и стандартных мониторах.',
    settings_label_conversation_outline: 'Показывать структуру беседы',
    settings_desc_conversation_outline: 'Показывает на рабочем столе список переходов к вопросам пользователя в текущей беседе. По умолчанию отключено.',
    settings_label_hide_suggestions: 'Hide new-chat suggestions',
    settings_desc_hide_suggestions: 'Hide the three default suggestion buttons on the empty new-chat screen to avoid accidental taps.',
    settings_label_token_usage: 'Показывать использование токенов',
    settings_label_token_speed: 'Показывать скорость токенов (TPS)',
    settings_desc_token_speed: 'Отображает количество токенов в секунду в заголовках сообщений ассистента во время потоковой передачи и после завершения ответа. Выключено по умолчанию.',
    settings_label_sidebar_density: 'Плотность боковой панели',
    cmd_reasoning: 'Toggle thinking visibility (show/hide), set effort level, or check current status',
    settings_label_external_sessions: 'Показывать внешние сеансы',
    settings_label_cron_sessions: 'Show cron sessions',
    settings_label_previous_messaging_sessions: 'Показывать предыдущие сеансы обмена сообщениями',
    settings_label_sync_insights: 'Синхронизировать с Insights',
    settings_label_check_updates: 'Проверять обновления',
    settings_label_ignore_agent_updates: 'Ignore Agent updates',
    settings_label_whats_new_summary: "Summarize What's New with AI",
    settings_label_bot_name: 'Имя помощника по умолчанию',
    settings_label_password: 'Пароль доступа',
    settings_label_pinned_limit: 'Лимит закреплённых бесед',
    settings_desc_pinned_limit: 'Максимальное количество активных бесед, которые можно закрепить в боковой панели. По умолчанию 3.',
    settings_label_dashboard_mode: 'Официальная панель Hermes',
    settings_desc_dashboard_mode: 'Показывать ссылку в навигационной панели, когда официальная панель hermes доступна. URL публичного обратного прокси хранятся только как ссылки в браузере и никогда не проверяются сервером.',
    settings_dashboard_mode_auto: 'Автоопределение',
    settings_dashboard_mode_always: 'Всегда показывать',
    settings_dashboard_mode_never: 'Никогда не показывать',
    settings_dashboard_save: 'Сохранить настройки ссылки панели',
    settings_label_gateway_status: 'Статус шлюза',
    settings_desc_gateway_status: 'Статус шлюза Hermes (Telegram, Discord, Slack и т.д.)',
    gateway_not_configured: 'Шлюз не настроен',
    gateway_metadata_stale: 'Метаданные шлюза устарели',
    gateway_endpoint_unreachable: 'Конечная точка шлюза недоступна',
    gateway_not_running: 'Шлюз не запущен',
    gateway_running_label: 'Работает',
    gateway_last_active: 'Последняя активность: ',
    gateway_session_count: (n) => `${n} ${n === 1 ? 'сессия' : n < 5 ? 'сессии' : 'сессий'}`,
    gateway_load_failed: 'Не удалось загрузить статус шлюза',
    settings_saved: 'Настройки сохранены',
    settings_save_failed: 'Не удалось сохранить: ',
    settings_load_failed: 'Не удалось загрузить настройки: ',
    settings_saved_pw: 'Настройки сохранены (пароль задан — теперь требуется вход)',
    settings_saved_pw_updated: 'Настройки сохранены (пароль обновлён)',
    login_title: 'Вход',
    login_subtitle: 'Введите пароль, чтобы продолжить',
    login_placeholder: 'Пароль',
    login_btn: 'Войти',
    login_invalid_pw: 'Неверный пароль',
    login_conn_failed: 'Не удалось подключиться',
    tab_chat: 'Чат',
    tab_tasks: 'Задачи',
    tab_skills: 'Навыки',
    tab_memory: 'Память',
    tab_workspaces: 'Рабочие пространства',
    tab_profiles: 'Профили',
    tab_kanban: 'Kanban',
    kanban_board: 'Board',
    kanban_visible_tasks: '{0} visible tasks',
    kanban_search_tasks: 'Search tasks',
    kanban_all_assignees: 'All assignees',
    kanban_all_tenants: 'All tenants',
    kanban_include_archived: 'Include archived',
    kanban_no_matching_tasks: 'No matching tasks',
    kanban_no_data: 'No Kanban data',
    kanban_work_queue_hint: 'This is the Hermes Agent work queue. Create or triage a task, assign it, move it to Ready, then let the dispatcher claim it.',
    kanban_unavailable: 'Kanban unavailable',
    kanban_read_only: 'Read-only view',
    kanban_empty: 'Empty',
    kanban_task: 'Task',
    kanban_no_description: 'No description',
    kanban_refresh: 'Refresh',
    kanban_status_triage: 'Triage',
    kanban_status_todo: 'Todo',
    kanban_status_ready: 'Ready',
    kanban_status_running: 'Running',
    kanban_status_blocked: 'Blocked',
    kanban_status_done: 'Done',
    kanban_status_original_hint: 'Actual status: {0}. This dialog only supports Triage/Todo/Ready edits.',
    kanban_comments_count: 'Comments ({0})',
    kanban_events_count: 'Events ({0})',
    kanban_links: 'Links',
    kanban_parents: 'Parents',
    kanban_children: 'Children',
    kanban_runs_count: 'Runs ({0})',
    kanban_no_comments: 'No comments',
    kanban_no_events: 'No events',
    kanban_no_runs: 'No runs',
    kanban_title: 'Заголовок',
    kanban_description: 'Описание',
    kanban_description_placeholder: 'Необязательно — что нужно сделать, критерии приёмки, ссылки',
    kanban_status: 'Статус',
    kanban_assignee: 'Исполнитель',
    kanban_assignee_placeholder: 'Необязательно — оставьте пустым для любого исполнителя',
    kanban_tenant: 'Арендатор',
    kanban_tenant_placeholder: 'Необязательно — слаг проекта или команды',
    kanban_priority: 'Приоритет',
    kanban_priority_hint: 'Большие числа выполняются первыми. По умолчанию 0.',
    kanban_title_required: 'Заголовок обязателен.',
    kanban_edit_task: 'Редактировать задачу',
    kanban_run_dispatcher: 'Запустить диспетчер',
    kanban_run_dispatcher_confirm: 'Это захватит задачи в состоянии Ready на этой доске и запустит подпроцессы-исполнители (по одному на задачу, до 8 за нажатие). Продолжить?',
    kanban_assignee_profiles_label: 'Профили Hermes',
    kanban_assignee_other_label: 'Другие (CLI каналы / удалённые профили)',
    kanban_assignee_unassigned: '— Не назначено (не запустится автоматически) —',
    kanban_ready_needs_assignee: 'Вы выбрали «Не назначено» + «Ready». Диспетчер пропустит эту задачу. Отправьте ещё раз для подтверждения или выберите профиль.',
    kanban_dispatch_preview_prefix: 'Предпросмотр:',
    kanban_dispatch_run_prefix: 'Отправлено:',
    kanban_dispatch_spawned: 'запущено',
    kanban_dispatch_promoted: 'повышено',
    kanban_dispatch_reclaimed: 'возвращено',
    kanban_dispatch_skipped_unassigned: 'пропущено (без исполнителя)',
    kanban_dispatch_skipped_nonspawnable: 'пропущено (неизвестный профиль)',
    kanban_dispatch_auto_blocked: 'автоблок',
    kanban_dispatch_timed_out: 'таймаут',
    kanban_dispatch_crashed: 'падение',
    kanban_new_task: 'New task',
    kanban_add_comment: 'Add comment',
      kanban_only_mine: 'Only mine',
      kanban_bulk_action: 'Bulk action',
      kanban_nudge_dispatcher: 'Preview dispatcher',
      kanban_stats: 'Stats',
      kanban_worker_log: 'Worker log',
      kanban_block: 'Block',
      kanban_unblock: 'Unblock',
      kanban_back_to_board: 'Back to board',
      kanban_lanes_by_profile: 'Lanes by profile',
      kanban_new_board: 'New board…',
      kanban_rename_board: 'Rename current board…',
      kanban_archive_board: 'Archive current board…',
      kanban_archive_board_confirm: 'Archive board "{name}"? Tasks remain on disk and the board can be restored from kanban/boards/_archived/.',
      kanban_board_archived: 'Board archived',
      kanban_board_name: 'Name',
      kanban_board_slug: 'Slug (lowercase, hyphens)',
      kanban_board_description: 'Description (optional)',
      kanban_board_icon: 'Icon (emoji, optional)',
      kanban_board_color: 'Color (optional)',
      kanban_board_name_required: 'Name is required',
      kanban_board_slug_required: 'Slug is required',
      kanban_card_complete: 'complete',
      kanban_card_archive: 'archive',
      kanban_unassigned: 'unassigned',
    kanban_status_archived: 'Archived',
    tab_todos: 'Список дел',
    tab_insights: 'Аналитика',
    tab_dashboard: 'Панель Hermes',
    dashboard_loopback_warning: 'Панель доступна только через loopback на сервере. Откройте её с самого сервера или перезапустите с --host 0.0.0.0 (небезопасно).',
    tab_logs: 'Logs',
    tab_settings: 'Настройки',

    logs_title: 'Logs',  // TODO: translate
    logs_file: 'File',  // TODO: translate
    logs_tail: 'Tail',  // TODO: translate
    logs_auto_refresh: 'Auto-refresh (5s)',  // TODO: translate
    logs_wrap: 'Wrap lines',  // TODO: translate
    logs_copy_all: 'Copy all',  // TODO: translate
    logs_empty: 'No log lines yet.',  // TODO: translate
    logs_loading: 'Loading logs…',  // TODO: translate
    logs_load_failed: 'Logs failed to load',  // TODO: translate
    logs_status_idle: 'Choose a log file to view recent lines.',  // TODO: translate
    logs_no_mtime: 'not written yet',  // TODO: translate
    logs_truncated_hint: 'Showing the tail of a large log file; older bytes were skipped to keep memory bounded.',  // TODO: translate
    logs_copied: 'Logs copied',  // TODO: translate
    logs_severity: 'Уровень',
    logs_severity_all: 'Все',
    logs_severity_errors: 'Ошибки',
    logs_severity_warnings: 'Предупреждения+',
    logs_filter_active: 'показано (фильтр активен)',
    new_conversation: 'Новая беседа',
    filter_conversations: 'Фильтр бесед...',
    markdown_table_filter: 'Фильтр таблицы',
    markdown_table_sort_column: 'Сортировать столбец',
    session_time_unknown: 'Неизвестно',
    session_time_minutes_ago: (n) => `${n}м`,
    session_time_hours_ago: (n) => `${n}ч`,
    session_time_days_ago: (n) => `${n}д`,
    session_time_last_week: '1н',
    session_time_bucket_today: 'Сегодня',
    session_time_bucket_yesterday: 'Вчера',
    session_time_bucket_this_week: 'На этой неделе',
    session_time_bucket_last_week: 'На прошлой неделе',
    session_time_bucket_older: 'Ранее',
    scheduled_jobs: 'Запланированные задания',
    new_job: 'Новое задание',
    loading: 'Загрузка...',
    search_skills: 'Поиск навыков...',
    new_skill: 'Новый навык',
    personal_memory: 'Личная память',
    current_task_list: 'Текущий список задач',
    workspace_desc: 'Добавляйте рабочие пространства и переключайтесь между ними в своих сеансах.',
    session_meta_messages: (n) => `${n} сообщ.`,
    session_meta_children: (n) => `${n} ${n === 1 ? 'дочерн.' : 'дочерн.'}`,
    session_meta_segments: (n) => `${n} сегм.`,
    session_lineage_toggle_hint: '{0} — предыдущие ходы контекста свернуты здесь. Нажмите, чтобы показать или скрыть их.',
    session_lineage_static_hint: '{0} — предыдущие ходы контекста свернуты здесь.',
    session_child_toggle_hint: '{0} — дочерние разговоры, созданные из этого сеанса. Нажмите, чтобы показать или скрыть их.',
    session_readonly_title_hint: 'Импортированный сеанс только для чтения — {0}',
    session_lineage_segment_untitled: 'Сегмент без названия',
    session_lineage_segment_open: 'Открыть сегмент цепочки',
    new_profile: 'Новый профиль',
    transcript: 'Транскрипт',
    download_transcript: 'Скачать как Markdown',
    import: 'Импорт',
    export_session_json: 'JSON',
    export_session_json_tooltip: 'Экспортировать сессию как JSON',
    import_session_json_tooltip: 'Импортировать сессию из JSON',
    clear_conversation_btn_tooltip: 'Очистить все сообщения в этой беседе',
    settings_label_rtl: 'Раскладка чата справа налево',
    settings_desc_rtl: 'Переворачивает выравнивание сообщений чата и поля ввода для языков вроде арабского или иврита. Влияет только на область чата — боковая панель и другие панели остаются слева направо.',
    settings_label_sound: 'Звук уведомления',
    settings_desc_sound: 'Проигрывать звук, когда помощник завершает ответ.',
    settings_label_notifications: 'Уведомления браузера',
    settings_desc_notifications: 'Показывать системное уведомление, когда ответ готов, а вкладка находится в фоне.',
    notifications_enable_btn: 'Enable notifications',
    notifications_test_btn: 'Send test',
    notifications_permission_status: (status) => `Permission: ${status}`,
    notifications_enabled_toast: 'Notifications enabled.',
    notifications_denied: 'Notifications are blocked in this browser. Enable them in browser settings.',
    notifications_unsupported: 'Notifications are not supported in this browser.',
    settings_desc_token_usage: 'Показывает количество входных и выходных токенов под каждым ответом помощника. Также переключается через /usage.',
    settings_sidebar_density_compact: 'Компактно',
    settings_sidebar_density_detailed: 'Подробно',
    settings_desc_sidebar_density: 'Управляет тем, сколько метаданных показывается в списке сеансов на левой панели.',
    settings_label_auto_title_refresh: 'Адаптивное обновление заголовка',
    settings_auto_title_refresh_off: 'Выкл',
    settings_auto_title_refresh_5: 'Каждые 5 обменов',
    settings_auto_title_refresh_10: 'Каждые 10 обменов',
    settings_auto_title_refresh_20: 'Каждые 20 обменов',
    settings_desc_auto_title_refresh: 'Автоматически переформулирует заголовок сессии на основе последнего обмена, чтобы он оставался актуальным по мере развития беседы. Требует настроенную модель генерации заголовков.',
    settings_desc_external_sessions: 'Показать беседы из CLI, Telegram, Discord, Slack и других каналов в списке сеансов. Нажмите для импорта и продолжения.',
    settings_desc_cron_sessions: 'Surface cron job output as conversations in the sidebar. Only active when non-WebUI sessions are enabled. Defaults off; high-frequency jobs can flood the sidebar.',
    settings_desc_previous_messaging_sessions: 'Показывать предыдущие сеансы Discord, Telegram, Slack и Weixin, замененные сбросом или сжатием.',
    settings_desc_sync_insights: 'Синхронизирует использование токенов WebUI в state.db, чтобы Hermes /insights включал данные браузерных сеансов. Выключено по умолчанию.',
    settings_desc_check_updates: 'Показывает баннер, когда доступны более новые версии WebUI или Agent. Периодически выполняет git fetch в фоне.',
    settings_desc_ignore_agent_updates: 'Keep WebUI update checks on, but hide Agent update notices and skip Agent update fetches.',
    settings_desc_whats_new_summary: "Changes the What's New action from opening the raw diff first to generating a short, human-readable summary. The regular diff comparison stays available after the summary.",
    settings_desc_bot_name: 'Используется только для профиля по умолчанию. Другие профили используют свои имена.',
    settings_desc_password: 'Введите новый пароль, чтобы задать или изменить его. Оставьте пустым, чтобы сохранить текущую настройку.',
    password_placeholder: 'Введите новый пароль…',
    password_env_var_locked: 'Переменная окружения HERMES_WEBUI_PASSWORD сейчас задана и имеет приоритет. Сбросьте её и перезапустите сервер, чтобы управлять паролем отсюда.',
    password_env_var_locked_placeholder: 'Заблокировано: задана переменная HERMES_WEBUI_PASSWORD',
    disable_auth: 'Отключить авторизацию',
    sign_out: 'Выйти',
    settings_label_shutdown: 'Остановить сервер Hermes WebUI',
    settings_desc_shutdown_before_cmd: 'Корректно останавливает локальный сервер WebUI. Полезно, если вы запустили его через ',
    settings_desc_shutdown_between_cmds: ' и хотите остановить, не переключаясь в терминал. Чтобы WebUI снова стал доступен, потребуется перезапустить сервер (',
    settings_desc_shutdown_after_cmd: ' или родное приложение).',
    settings_btn_shutdown: 'Остановить сервер',
    settings_shutdown_confirm_title: 'Остановить Hermes WebUI',
    settings_shutdown_confirm_message: 'Остановить сервер Hermes WebUI?',
    settings_shutdown_confirm_btn: 'Остановить',
    settings_shutdown_stopped_message: 'Сервер остановлен. Можно закрыть эту вкладку.',
    // Providers panel (English fallback — native translations welcome in follow-up PRs)
    providers_tab_title: 'Providers',
    providers_section_title: 'Providers',
    providers_section_meta: 'Manage API keys for AI providers. Changes take effect immediately.',
    providers_status_configured: 'API key configured',
    providers_status_not_configured: 'No API key',
    providers_status_oauth: 'OAuth',
    providers_status_api_key: 'API key',
    providers_status_not_configured_label: 'Not configured',
    providers_oauth_hint: 'Authenticated via OAuth. No API key needed.',
    providers_oauth_config_yaml_hint: 'Token configured via config.yaml. To update, edit the providers section in your config.yaml or run hermes auth.',
    providers_oauth_not_configured_hint: 'Not authenticated. Run hermes auth in the terminal to configure this provider.',
    providers_save: 'Save',
    providers_refresh_models: 'Refresh models',
    providers_refreshing: 'Refreshing…',
    providers_models_refreshed: 'Models refreshed',
    providers_remove: 'Remove',
    providers_saving: 'Saving…',
    providers_removing: 'Removing…',
    providers_enter_key: 'Please enter an API key',
    providers_empty: 'No configurable providers found.',
    providers_key_updated: 'API key saved',
    providers_key_removed: 'API key removed',
    providers_key_placeholder_new: 'sk-...',
    providers_key_placeholder_replace: 'Enter new key to replace…',
    provider_quota_title: 'Квота активного провайдера',
    provider_quota_active_provider: 'Активный провайдер',
    provider_quota_last_checked_after_refresh: 'Последняя проверка после обновления',
    provider_quota_last_checked: 'Последняя проверка: {0}',
    provider_quota_refresh_usage: 'Обновить использование',
    provider_quota_refreshing: 'Обновление...',
    provider_quota_refresh_title: 'Обновить лимиты использования провайдера сейчас',
    provider_quota_refresh_succeeded: 'Использование провайдера обновлено',
    provider_quota_refresh_failed: 'Не удалось обновить использование провайдера',
    provider_quota_session_limit: 'Лимит на 5 часов',
    provider_quota_weekly_limit: 'Недельный лимит',
    provider_quota_window_fallback: 'Окно',
    provider_quota_metric_remaining: 'Осталось',
    provider_quota_metric_used: 'Использовано',
    provider_quota_metric_limit: 'Лимит',
    provider_quota_status_available: 'доступно',
    provider_quota_status_exhausted: 'исчерпано',
    provider_quota_status_unavailable: 'недоступно',
    provider_quota_status_failed: 'ошибка',
    provider_quota_status_checked: 'проверено',
    provider_quota_status_no_key: 'нет ключа',
    provider_quota_status_invalid_key: 'недействительный ключ',
    provider_quota_status_unsupported: 'не поддерживается',
    provider_quota_used_meta: 'использовано {0}',
    provider_quota_resets_meta: 'сброс {0}',
    provider_quota_credential_pool: 'Пул учетных данных',
    provider_quota_credential_label: 'Учетные данные {0}',
    provider_quota_pool_plans: 'Планы: {0}',
    provider_quota_pool_no_windows: 'Окна лимитов аккаунта не переданы.',
    provider_quota_account_limits_loaded: 'Лимиты аккаунта загружены.',
    provider_quota_unavailable: 'Статус квоты недоступен',
    provider_quota_retry_after: 'Повторить после {0}',
    provider_quota_pool_summary_available: 'доступно {0}/{1}',
    provider_quota_pool_summary_exhausted: '{0} исчерпано',
    provider_quota_pool_summary_failed: '{0} с ошибкой',
    provider_quota_pool_summary_checked: '{0} проверено',
    cancel: 'Отмена',
    create_job: 'Создать задание',
    save_skill: 'Сохранить навык',
    editing: 'Редактирование',
    empty_title: 'Чем я могу помочь?',
    empty_subtitle: 'Спрашивайте что угодно, запускайте команды, изучайте файлы или управляйте запланированными задачами.',
    suggest_files: 'Какие файлы есть в этом рабочем пространстве?',
    suggest_schedule: 'Что у меня сегодня в расписании?',
    suggest_plan: 'Помоги спланировать небольшой проект.',
    onboarding_badge: 'ПЕРВЫЙ ЗАПУСК',
    onboarding_title: 'Добро пожаловать в Hermes Web UI',
    onboarding_lead: 'Краткая пошаговая настройка проверит Hermes, сохранит рабочую конфигурацию провайдера, выберет рабочее пространство и модель и при желании защитит приложение паролем.',
    onboarding_back: 'Назад',
    onboarding_continue: 'Продолжить',
    onboarding_skip: 'Пропустить настройку',
    onboarding_skipped: 'Настройка пропущена — используется существующая конфигурация.',
    onboarding_open: 'Открыть Hermes',
    onboarding_step_system_title: 'Проверка системы',
    onboarding_step_system_desc: 'Проверить Hermes Agent и видимость конфигурации.',
    onboarding_step_setup_title: 'Настройка провайдера',
    onboarding_step_setup_desc: 'Сохранить минимальную рабочую конфигурацию провайдера Hermes.',
    onboarding_step_workspace_title: 'Рабочее пространство и модель',
    onboarding_step_workspace_desc: 'Выбрать значения по умолчанию для новых сеансов и чатов.',
    onboarding_step_password_title: 'Необязательный пароль',
    onboarding_step_password_desc: 'Защитить Web UI перед тем, как делиться им.',
    onboarding_step_finish_title: 'Готово',
    onboarding_step_finish_desc: 'Проверьте настройки и войдите в приложение.',
    onboarding_notice_system_ready: 'Hermes Agent, похоже, доступен из Web UI.',
    onboarding_notice_system_unavailable: 'Hermes Agent ещё не полностью доступен. Bootstrap может установить его, но для настройки провайдера всё ещё может понадобиться терминал.',
    onboarding_check_agent: 'Hermes Agent',
    onboarding_check_agent_ready: 'Обнаружен и доступен для импорта',
    onboarding_check_agent_missing: 'Отсутствует или доступен только частично',
    onboarding_check_password: 'Пароль',
    onboarding_check_password_enabled: 'Уже включён',
    onboarding_check_password_disabled: 'Пока не включён',
    onboarding_check_provider: 'Конфигурация провайдера',
    onboarding_check_provider_ready: 'Готова к чату',
    onboarding_check_provider_partial: 'Сохранена, но не завершена',
    onboarding_check_provider_pending: 'Требует проверки',
    onboarding_config_file: 'Файл конфигурации:',
    onboarding_env_file: 'Файл .env:',
    onboarding_unknown: 'Неизвестно',
    onboarding_current_provider: 'Текущая конфигурация:',
    onboarding_missing_imports: 'Отсутствующие импорты:',
    onboarding_notice_setup_required: 'Выберите здесь простой путь настройки провайдера. Продвинутые OAuth-сценарии пока остаются в Hermes CLI.',
    onboarding_notice_setup_already_ready: 'Уже обнаружена рабочая конфигурация провайдера Hermes. Вы можете оставить её или заменить здесь.',
    onboarding_oauth_provider_ready_title: 'Провайдер уже авторизован',
    onboarding_oauth_provider_ready_body: 'Этот экземпляр настроен на использование OAuth-провайдера (<strong>{provider}</strong>), настроенного через Hermes CLI. API-ключ здесь не нужен — нажмите «Продолжить», чтобы завершить настройку.',
    onboarding_oauth_provider_not_ready_title: 'OAuth-провайдер ещё не авторизован',
    onboarding_oauth_provider_not_ready_body: 'Этот экземпляр настроен на использование <strong>{provider}</strong>, который работает через OAuth, а не через API-ключ. Запустите <code>hermes auth</code> или <code>hermes model</code> в терминале, чтобы пройти авторизацию, затем обновите Web UI.',
    onboarding_oauth_switch_hint: 'Или выберите ниже другой провайдер, чтобы перейти на настройку с ключом API:',
    onboarding_notice_workspace: 'Эти значения используют те же API настроек, что и обычное приложение.',
    onboarding_workspace_label: 'Рабочее пространство',
    onboarding_workspace_or_path: 'Или укажите путь к рабочему пространству',
    onboarding_workspace_placeholder: '/home/you/workspace',
    onboarding_provider_label: 'Режим настройки',
    onboarding_quick_setup_badge: 'Быстрая настройка',
    provider_category_easy_start: 'Быстрый старт',
    provider_category_self_hosted: 'Локальные / Open source',
    provider_category_specialized: 'Специализированные',
    onboarding_api_key_label: 'Ключ API',
    onboarding_api_key_placeholder: 'Оставьте пустым, чтобы сохранить уже сохранённый ключ',
    onboarding_api_key_label_optional: 'API key (optional)', // TODO: translate
    onboarding_api_key_placeholder_optional: 'Leave blank for keyless servers', // TODO: translate
    onboarding_api_key_help_keyless: 'Most LM Studio / Ollama / vLLM installs run keyless — leave this blank if your server doesn\'t require authentication. Use the Test connection button to verify.', // TODO: translate
    oauth_login_codex: 'Login with Codex (ChatGPT)', // TODO: translate
    oauth_codex_step1: 'Step 1: Visit this URL and enter the code', // TODO: translate
    oauth_codex_step2: 'Step 2: Enter this code on the page', // TODO: translate
    oauth_codex_polling: 'Waiting for authorization...', // TODO: translate
    oauth_codex_success: 'Codex OAuth login successful!', // TODO: translate
    oauth_codex_error: 'OAuth login failed', // TODO: translate
    oauth_codex_expired: 'Code expired, please try again', // TODO: translate
    onboarding_api_key_help_prefix: 'Сохраняется как секрет в вашем файле `.env` Hermes с помощью',
    onboarding_base_url_label: 'Базовый URL',
    onboarding_base_url_placeholder: 'https://your-endpoint.example/v1',
    onboarding_base_url_help: 'Используйте это для OpenAI-compatible маршрутизаторов, self-hosted серверов, LiteLLM, Ollama, LM Studio, vLLM и похожих endpoint-ов.',
    onboarding_model_label: 'Модель по умолчанию',
    onboarding_workspace_help: 'Выберите модель, которую Hermes должен использовать для новых чатов после завершения настройки.',
    onboarding_custom_model_placeholder: 'имя_вашей_модели',
    onboarding_custom_model_help: 'Для собственных endpoint-ов укажите точный ID модели, который ожидает ваш сервер.',
    onboarding_notice_password_enabled: 'Пароль уже настроен. Вводите новый только если хотите заменить текущий.',
    onboarding_notice_password_recommended: 'Необязательно, но рекомендуется, если вы собираетесь открывать UI не только на localhost.',
    onboarding_password_label: 'Пароль (необязательно)',
    onboarding_password_placeholder: 'Оставьте пустым, чтобы пропустить',
    onboarding_password_help: 'Пароли сохраняются через существующий API настроек и хэшируются на сервере.',
    onboarding_notice_finish: 'Позже вы сможете снова открыть настройки и изменить любое из этих значений.',
    onboarding_not_set: 'Не задано',
    onboarding_password_will_enable: 'Будет включён',
    onboarding_password_will_replace: 'Будет заменён текущий пароль',
    onboarding_password_keep_existing: 'Оставить текущий пароль',
    onboarding_password_remains_disabled: 'Останется отключённым',
    onboarding_password_skipped: 'Пропустить пока',
    onboarding_finish_help: 'После завершения в настройках сохранится <code>onboarding_completed</code>, и вы попадёте в обычное приложение.',
    onboarding_error_choose_workspace: 'Выберите рабочее пространство перед продолжением.',
    onboarding_error_choose_model: 'Выберите модель перед продолжением.',
    onboarding_error_provider_required: 'Выберите режим настройки перед продолжением.',
    onboarding_error_base_url_required: 'Для собственных endpoint-ов требуется базовый URL.',
    onboarding_probe_test_button: 'Test connection', // TODO: translate
    onboarding_probe_probing: 'Testing connection…', // TODO: translate
    onboarding_probe_ok: 'Connected. {n} model(s) available.', // TODO: translate
    onboarding_probe_error_generic: 'Could not reach the configured base URL.', // TODO: translate
    onboarding_probe_error_invalid_url: 'Base URL must start with http:// or https://.', // TODO: translate
    onboarding_probe_error_dns: 'Could not resolve the host. Check the URL or use the host\'s IP address.', // TODO: translate
    onboarding_probe_error_connect_refused: 'Connection refused — the server may not be running on that address. From inside Docker, try the host IP instead of localhost.', // TODO: translate
    onboarding_probe_error_timeout: 'The endpoint did not respond in time. Check that the server is running and the URL is correct.', // TODO: translate
    onboarding_probe_error_http_4xx: 'The endpoint returned a client error. Check authentication and the URL path (typically ends in /v1).', // TODO: translate
    onboarding_probe_error_http_5xx: 'The endpoint returned a server error. Check the LM Studio / Ollama server logs.', // TODO: translate
    onboarding_probe_error_parse: 'The endpoint did not return a model list in the expected shape. Verify the URL points to the OpenAI-compatible API root.', // TODO: translate
    onboarding_probe_error_unreachable: 'Could not reach the configured base URL.', // TODO: translate
    onboarding_error_probe_failed: 'Could not validate the configured base URL.', // TODO: translate
    onboarding_error_workspace_required: 'Рабочее пространство обязательно.',
    onboarding_error_model_required: 'Модель обязательна.',
    onboarding_complete: 'Первичная настройка завершена',
    error_prefix: 'Ошибка: ',
    default: 'default',
    search: 'Search',
    not_available: 'н/д',
    never: 'никогда',
    add: 'Добавить',
    add_failed: 'Не удалось добавить: ',
    remove_failed: 'Не удалось удалить: ',
    switch_failed: 'Не удалось переключить: ',
    name_required: 'Требуется имя',
    content_required: 'Требуется содержимое',
    view: 'Просмотр',
    dismiss: 'Скрыть',
    disable: 'Отключить',
    cron_no_jobs: 'Запланированные задания не найдены.',
    cron_status_off: 'неактивно',
    cron_status_paused: 'на паузе',
    cron_status_error: 'ошибка',
    cron_status_active: 'активно',
    cron_status_running: 'выполняется\u2026',
    cron_status_needs_attention: 'требует внимания',
    cron_attention_desc: 'У этого повторяющегося задания нет времени следующего запуска. Планировщик мог не суметь вычислить следующий запуск.',
    cron_attention_croniter_hint: 'В окружении Gateway может отсутствовать пакет croniter. Перезапустите Gateway с поддержкой cron, затем возобновите это задание.',
    cron_attention_resume: 'Возобновить и пересчитать',
    cron_jobs_project: 'Задания Cron',
    cron_attention_run_once: 'Запустить один раз сейчас',
    cron_attention_copy_diagnostics: 'Скопировать диагностику',
    cron_diagnostics_copied: 'Диагностика cron скопирована',
    cron_next: 'Следующий',
    cron_last: 'Последний',
    cron_run_now: 'Запустить сейчас',
    cron_pause: 'Пауза',
    cron_resume: 'Возобновить',
    cron_job_name_placeholder: 'Имя задания',
    cron_schedule_placeholder: 'Расписание',
    cron_prompt_placeholder: 'Промпт',
    cron_last_output: 'Последний вывод',
    cron_expand_prompt: 'Развернуть промпт',
    cron_collapse_prompt: 'Свернуть промпт',
    cron_expand_output: 'Развернуть вывод',
    cron_collapse_output: 'Свернуть вывод',
    cron_mode_agent: 'Агент',
    cron_mode_script: 'Скрипт',
    cron_mode_label: 'Режим',
    cron_script_job_banner: 'По расписанию запускается скрипт — stdout доставляется в канал. Агент, промпт и skills не используются.',
    cron_script_card_title: 'Скрипт',
    cron_script_output: 'Вывод скрипта',
    cron_script_path_label: 'Путь к скрипту',
    cron_script_path_hint: 'Ищется в ~/.hermes/scripts/, если не указан абсолютный путь. Логику меняй в файле скрипта на сервере.',
    cron_script_badge_title: 'Скриптовая задача (без агента)',
    cron_workdir_label: 'Рабочая директория',
    cron_view_full_output: 'View full output',
    cron_all_runs: 'Все запуски',
    cron_hide_runs: 'Скрыть запуски',
    cron_no_runs_yet: '(пока запусков нет)',
    cron_schedule_required_example: 'Требуется расписание (например, "0 9 * * *" или "every 1h")',
    cron_schedule_required: 'Требуется расписание',
    cron_prompt_required: 'Требуется промпт',
    cron_job_created: 'Задание создано',
    cron_duplicate: 'Дублировать',
    cron_duplicated: 'Задание дублировано (приостановлено)',
    cron_job_triggered: 'Задание запущено',
    cron_job_paused: 'Задание поставлено на паузу',
    cron_job_resumed: 'Задание возобновлено',
    cron_job_updated: 'Задание обновлено',
    cron_model_label: 'Переопределение модели',
    cron_model_hint: 'Переопределяет модель по умолчанию для этого задания.',
    cron_model_use_default: 'По умолчанию (профиль/системная модель)',
    cron_delete_confirm_title: 'Удалить cron-задание',
    cron_delete_confirm_message: 'Это действие нельзя отменить.',
    cron_job_deleted: 'Задание удалено',
    cron_completion_status: (name, status) => `Cron-задание «${name}» — ${status}`,
    status_failed: 'неудачно',
    status_completed: 'завершено',
    todos_no_active: 'В этой сессии нет активного списка задач.',
    clear_conversation_title: 'Очистить беседу',
    clear_conversation_message: 'Очистить все сообщения? Это действие нельзя отменить.',
    clear_failed: 'Не удалось очистить: ',
    skills_no_match: 'Подходящих навыков не найдено.',
    skill_enabled: 'Включено',
    skill_disabled: 'Отключено',
    skill_toggle_failed: 'Не удалось переключить навык: ',
    linked_files: 'Связанные файлы',
    skill_load_failed: 'Не удалось загрузить навык: ',
    skill_file_load_failed: 'Не удалось загрузить файл: ',
    skill_name_required: 'Требуется имя навыка',
    skill_updated: 'Навык обновлён',
    skill_created: 'Навык создан',
    memory_notes_label: 'память (заметки)',
    memory_saved: 'Память сохранена',
    my_notes: 'Мои заметки',
    user_profile: 'Пользовательский профиль',
    external_notes_sources: 'Сторонние заметки',
    external_notes_empty: 'Источники заметок или знаний MCP пока не видны. Настройте Joplin, Obsidian, Notion, llm-wiki или другой сервер заметок, чтобы он появился здесь.',
    external_notes_auto_recall_hint: 'Автоматический вызов контекста сеанса не меняется; эта панель показывает только настроенные источники и доступные инструменты чтения/поиска.',
    external_notes_no_tools: 'Для этого источника сейчас не видно инструментов чтения/поиска.',
    external_notes_tool_count: (count) => `Доступно инструментов заметок: ${count}`,
    external_notes_configured_hint: 'От этого настроенного источника ожидаются имена инструментов; живые схемы появятся, когда WebUI runtime их предоставит.',
    external_notes_recent_ai: 'Недавно использовано AI',
    external_notes_auto: 'auto',
    external_notes_recent_ai_reason: 'Автоматический вызов',
    external_notes_search_placeholder: 'Искать заметки…',
    external_notes_search_empty: 'Выполните поиск по настроенному источнику заметок, чтобы увидеть предпросмотр здесь.',
    source_active: 'active',
    source_configured: 'configured',
    no_notes_yet: 'Пока нет заметок.',
    no_profile_yet: 'Пока нет профиля.',
    agent_soul: 'Душа агента',
    no_soul_yet: 'Душа пока не задана.',
    workspace_choose_path: 'Выберите путь к рабочему пространству',
    workspace_choose_path_meta: 'Добавьте проверенный путь и переключите эту беседу',
    workspace_manage: 'Управление рабочими пространствами',
    workspace_manage_meta: 'Открыть панель Spaces',
    workspace_use_title: 'Использовать в текущем сеансе',
    workspace_use: 'Использовать',
    workspace_add_path_placeholder: 'Добавьте путь к рабочему пространству (например, /Users/you/project)',
    workspace_paths_validated_hint: 'Перед сохранением пути проверяются на существование.',

    workspace_drag_hint: 'Перетащите для изменения порядка',
    workspace_reorder_failed: 'Не удалось изменить порядок',
    workspace_added: 'Рабочее пространство добавлено',
    workspace_renamed: 'Рабочее пространство переименовано',
    workspace_remove_confirm_title: 'Удалить рабочее пространство',
    workspace_remove_confirm_message: (path) => `Удалить «${path}»?`,
    workspace_removed: 'Рабочее пространство удалено',
    workspace_switch_prompt_title: 'Переключить рабочее пространство',
    workspace_switch_prompt_message: 'Введите абсолютный путь к рабочему пространству, чтобы добавить его и переключить эту беседу.',
    workspace_switch_prompt_confirm: 'Переключить',
    workspace_switch_prompt_placeholder: '/Users/you/project',
    workspace_not_added: 'Рабочее пространство не добавлено',
    workspace_already_saved: 'Рабочее пространство уже сохранено — выберите его из списка',
    workspace_busy_switch: 'Нельзя переключать рабочее пространство, пока агент работает',
    discard_file_edits_title: 'Отменить изменения файлов?',
    discard_file_edits_message: 'При переключении рабочих пространств несохранённые изменения в предпросмотре будут потеряны.',
    workspace_switched_to: (name) => `Переключено на ${name}`,
    profiles_no_profiles: 'Профили не найдены.',
    profile_api_keys_configured: 'API-ключи настроены',
    profile_gateway_running: 'Gateway запущен',
    profile_gateway_stopped: 'Gateway остановлен',
    profile_active: 'АКТИВЕН',
    profile_no_configuration: 'Нет конфигурации',
    profile_skill_count: (count) => {
    const mod10 = count % 10;
    const mod100 = count % 100;
    const word = mod10 === 1 && mod100 !== 11
      ? 'навык'
      : (mod10 >= 2 && mod10 <= 4 && (mod100 < 10 || mod100 >= 20)
        ? 'навыка'
        : 'навыков');
    return `${count} ${word}`;
  },
    profile_use: 'Использовать',
    profile_switch_title: 'Переключиться на этот профиль',
    profile_delete_title: 'Удалить этот профиль',
    profile_default_label: '(по умолчанию)',
    profile_name_placeholder: 'Название профиля (строчные буквы, a-z, 0-9, дефисы)',
    profile_clone_label: 'Скопировать конфигурацию из активного профиля',
    profile_model_label: 'Модель / провайдер',
    profile_model_hint: 'Выберите настроенного провайдера и модель для этого нового профиля.',
    profile_model_use_default: 'Использовать значение активного профиля',
    profile_base_url_placeholder: 'Базовый URL (необязательно, например http://localhost:11434)',
    profile_api_key_placeholder: 'API-ключ (необязательно)',
    manage_profiles: 'Управление профилями',
    profiles_load_failed: 'Не удалось загрузить профили',
    profile_switched_new_conversation: (name) => `Переключено на профиль: ${name} — начата новая беседа`,
    profile_switched: (name) => `Переключено на профиль: ${name}`,
    profile_name_rule: 'Только строчные буквы, цифры, дефисы и подчёркивания',
    profile_base_url_rule: 'Базовый URL должен начинаться с http:// или https://',
    profile_created: (name) => `Профиль создан: ${name}`,
    profile_delete_confirm_title: (name) => `Удалить профиль «${name}»?`,
    profile_delete_confirm_message: 'Все сеансы, конфигурация, навыки и память этого профиля будут удалены безвозвратно. Это действие невозможно отменить.',
    profile_deleted: (name) => `Профиль удалён: ${name}`,
    active_conversation_none: 'Активная беседа не выбрана.',
    active_conversation_meta: (title, count) => {
    const mod10 = count % 10;
    const mod100 = count % 100;
    const word = mod10 === 1 && mod100 !== 11
      ? 'сообщение'
      : (mod10 >= 2 && mod10 <= 4 && (mod100 < 10 || mod100 >= 20)
        ? 'сообщения'
        : 'сообщений');
    return `${title} · ${count} ${word}`;
  },
    settings_unsaved_changes: 'У вас есть несохранённые изменения.',
    sign_out_failed: 'Не удалось выйти: ',
    disable_auth_confirm_title: 'Отключить защиту паролем',
    disable_auth_confirm_message: 'Любой сможет получить доступ к этому экземпляру.',
    auth_disabled: 'Авторизация отключена — защита паролем снята',
    disable_auth_failed: 'Не удалось отключить авторизацию: ',
    bg_error_single: (title) => `В "${title}" возникла ошибка`,
    bg_error_multi: (count) => `${count} сеансов столкнулись с ошибкой`,
    skill_deleted: 'Навык удалён',
    skill_delete_confirm: 'Удалить навык "{0}"?',
    skills_empty_title: 'Выберите навык',
    skills_empty_sub: 'Выберите навык на боковой панели, чтобы просмотреть его содержимое, или создайте новый.',
    skills_edit: 'Редактировать',
    skills_delete: 'Удалить',
    skills_back_to: 'Назад к {0}',
    tasks_empty_title: 'Выберите запланированное задание',
    tasks_empty_sub: 'Выберите задание на боковой панели, чтобы просмотреть его детали и запуски, или создайте новое.',
    workspaces_empty_title: 'Выберите пространство',
    workspaces_empty_sub: 'Выберите пространство на боковой панели, чтобы просмотреть его файлы и настройки, или добавьте новое.',
    profiles_empty_title: 'Выберите профиль',
    profiles_empty_sub: 'Выберите профиль агента на боковой панели, чтобы просмотреть и изменить его настройки, или создайте новый.',
    // skill form
    skill_name: 'Имя',
    skill_category: 'Категория',
    skill_category_placeholder: 'Необязательно, например devops',
    skill_content: 'Содержимое SKILL.md',
    skill_content_placeholder: 'YAML-заголовок + тело markdown',
    skill_rename_not_supported: 'Переименование навыка не поддерживается. Создайте новый навык и удалите старый.',
    skill_metadata: 'Метаданные',
    // cron form
    cron_name_label: 'Имя',
    cron_name_placeholder: 'Необязательно',
    cron_schedule_label: 'Расписание',
    cron_schedule_hint: "Для повторяющихся заданий используйте 'every 1h' или cron-выражение. Простые интервалы вроде '30m' выполняются один раз.",
    cron_schedule_once_warning: "Интервалы вроде '30m' выполняются один раз и удаляются после запуска. Используйте 'every 30m' для повторяющегося задания.",
    cron_prompt_label: 'Запрос',
    cron_deliver_label: 'Доставлять вывод',
    cron_deliver_local: 'Локально (только сохранение)',
    cron_deliver_custom: 'Пользовательская доставка',
    cron_profile_label: 'Профиль',
    cron_profile_server_default: 'по умолчанию сервера',
    cron_profile_server_default_hint: 'Использует профиль WebUI-сервера по умолчанию во время запуска. Существующие задания без профиля сохраняют это поведение.',
    cron_toast_notifications_label: 'Уведомления о завершении',
    cron_toast_notifications_hint: 'Показывать toast, когда это cron-задание завершается. Значок задач и маркер нового запуска всё равно обновляются.',
    cron_toast_notifications_enabled: 'Включено',
    cron_toast_notifications_disabled: 'Отключено',
    cron_skills_label: 'Навыки',
    cron_skills_placeholder: 'Добавить навыки (необязательно)…',
    cron_skills_edit_hint: 'Список навыков нельзя изменить после создания.',
    // workspace form
    workspace_name_label: 'Имя',
    workspace_name_placeholder: 'Необязательное понятное имя',
    workspace_path_label: 'Путь',
    workspace_path_required: 'Путь обязателен',
    workspace_path_readonly: 'Путь нельзя изменить. Только переименование.',
    workspace_new_title: 'Новое пространство',
    // profile form
    profile_name_label: 'Имя',
    profile_base_url_label: 'Базовый URL',
    profile_api_key_label: 'API-ключ',
  
    // Session management and settings keys (en fallback — pending translation)
    session_archive: 'Archive conversation',
    session_hide_external: 'Скрыть из списка',
    session_archive_desc: 'Hide this conversation until archived is shown',
    session_archive_worktree_desc: 'Hide this conversation; keep its worktree on disk',
    session_hide_external_desc: 'Скрыть эту импортированную сессию из WebUI без удаления исходной истории.',
    session_archive_failed: 'Archive failed: ',
    session_archived: 'Session archived',
    session_archived_worktree: 'Session archived. Worktree remains on disk.',
    session_hidden: 'Сессия скрыта из списка',
    session_delete: 'Delete conversation',
    session_delete_desc: 'Permanently remove this conversation',
    session_delete_confirm: 'Delete this conversation?',
    session_delete_worktree_desc: 'Delete only the WebUI conversation; keep the worktree on disk',
    session_delete_worktree_confirm: (path) => `Delete this conversation? The worktree at ${path} will remain on disk.`,
    session_deleted: 'Conversation deleted',
    session_deleted_worktree: 'Conversation deleted. Worktree remains on disk.',
    session_worktree_remove: 'Remove worktree',
    session_worktree_remove_desc: (path) => `Delete the git worktree at ${path} from disk`,
    session_worktree_remove_confirm: (path) => `Remove git worktree from disk?\n\nPath: ${path}\n\nThis will delete the entire worktree directory. Session data remains in WebUI.`,
    session_worktree_remove_not_exists: (path) => `The worktree at ${path} no longer exists on disk.`,
    session_worktree_remove_confirm_label: 'Remove',
    session_worktree_removed: 'Worktree removed.',
    session_worktree_remove_failed: 'Failed to remove worktree: ',
    session_worktree_remove_status_failed: 'Failed to read worktree status: ',
    session_worktree_remove_locked_by_stream: 'Cannot remove — an active streaming session is using this worktree.',
    session_worktree_remove_locked_by_terminal: 'Cannot remove — an active terminal session is using this worktree.',
    session_worktree_remove_unsafe_blocked: 'Resolve local changes or unpushed commits before removing this worktree.',
    session_worktree_remove_dirty_warning: 'WARNING: This worktree has uncommitted changes which will be lost.',
    session_worktree_remove_untracked_warning: (count) => `${count} untracked file(s) will be permanently deleted.`,
    session_worktree_remove_ahead_warning: (ahead) => `${ahead} unpushed commit(s) will be lost.`,
    session_duplicate: 'Duplicate conversation',
    session_duplicate_desc: 'Create a copy with the same workspace and model',
    session_duplicate_failed: 'Duplicate failed: ',
    session_stop_response: 'Stop response',
    session_stop_response_desc: 'Cancel the running response for this conversation',
    session_duplicated: 'Session duplicated',
    session_move_project: 'Move to project',
    session_move_project_desc_has: 'Change the project for this conversation',
    session_move_project_desc_none: 'Assign a project to this conversation',
    session_pin: 'Pin conversation',
    session_pin_desc: 'Keep this conversation at the top',
    session_pin_failed: 'Pin failed: ',
    session_restore: 'Restore conversation',
    session_restore_desc: 'Bring this conversation back into the main list',
    session_restored: 'Session restored',
    session_unpin: 'Unpin conversation',
    session_unpin_desc: 'Remove from pinned',
    session_select_mode: 'Выбрать',
    session_select_mode_desc: 'Выберите беседы для массового управления',
    session_select_all: 'Выбрать все',
    session_deselect_all: 'Снять выделение',
    session_selected_count: '{0} выбрано',
    session_batch_archive: 'В архив',
    session_batch_delete: 'Удалить',
    session_batch_move: 'Переместить в проект',
    session_batch_delete_confirm: 'Удалить {0} бесед(ы)?',
    session_batch_archive_confirm: 'Архивировать {0} бесед(ы)?',
    session_batch_delete_worktree_confirm: 'Удалить {0} бесед(ы)? У {1} бесед с worktree каталоги worktree останутся на диске.',
    session_batch_archive_worktree_confirm: 'Архивировать {0} бесед(ы)? У {1} бесед с worktree каталоги worktree останутся на диске.',
    session_no_selection: 'Ничего не выбрано',
    settings_dropdown_appearance: 'Appearance',
    settings_dropdown_conversation: 'Conversation',
    settings_dropdown_preferences: 'Preferences',
    settings_dropdown_providers: 'Providers',
    settings_dropdown_system: 'System',
    settings_heading_subtitle: 'Preferences, conversation tools, and system controls.',
    settings_heading_title: 'Control Center',
    settings_section_appearance_meta: 'Theme, accent colors, and visual style.',
    settings_section_appearance_title: 'Appearance',
    settings_section_conversation_title: 'Conversation',
    settings_section_preferences_meta: 'Defaults and UI behavior for Hermes Web UI.',
    settings_section_preferences_title: 'Preferences',
    settings_section_system_meta: 'Instance version and access controls.',
    settings_check_now: 'Проверить',
    settings_checking: 'Проверка\u2026',
    settings_up_to_date: 'Актуально \u2713',
    settings_updates_available: 'Доступно обновлений: {count}',
    settings_updates_disabled: 'Проверка обновлений отключена',
    settings_update_check_failed: 'Ошибка проверки обновлений',
    settings_label_workspace_panel_open: 'Открывать панель рабочей области по умолчанию',
    settings_desc_workspace_panel_open: 'При включении панель файлов будет открываться автоматически в каждой новой сессии.',
    settings_label_session_jump_buttons: 'Показывать кнопки перехода по сессии',
    settings_desc_session_jump_buttons: 'Показывать плавающие кнопки «Начало» и «Конец» при чтении длинных историй сессий.',
    settings_label_terminal_auto_expand: 'Автораскрытие терминала при выводе',
    settings_desc_terminal_auto_expand: 'Автоматически разворачивать свёрнутую панель терминала, когда запущенная команда выдаёт новый вывод.',

    settings_label_session_endless_scroll: 'Загружать старые сообщения при прокрутке вверх',

    settings_desc_session_endless_scroll: 'Если включено, старые сообщения загружаются автоматически при прокрутке вверх. Если выключено, используйте кнопку загрузки старых сообщений.',
    settings_label_auto_scroll_follow: 'Автопрокрутка к новому содержимому',
    settings_desc_auto_scroll_follow: 'Если включено, область прокручивается вниз по мере поступления новых токенов. Если выключено, вы сами управляете прокруткой.',
    settings_label_worklog_details_expanded_default: 'Open Worklog details automatically',
    settings_desc_worklog_details_expanded_default: 'When enabled, new Worklog details start expanded so tool, thinking, and progress cards are visible without an extra click. When off, Worklog details stay folded by default; per-turn manual collapse/expand choices still win.',
    settings_label_chat_activity_display_mode: 'Activity display',
    settings_desc_chat_activity_display_mode: 'Compact Worklog groups supporting activity into a quiet summary. Transparent Stream keeps each thinking/tool event as its own chronological expandable row.',
    first_token_time: 'Time to first token',
    done: 'Done',
    settings_option_compact_worklog: 'Compact Worklog',
    settings_option_transparent_stream: 'Transparent Stream',

    settings_label_tab_visibility: 'Вкладки боковой панели',
    settings_desc_tab_visibility: 'Выберите, какие вкладки отображаются на боковой панели и в рейле. Чат и настройки всегда видны.',
    open_in_browser: 'Открыть в браузере',
    settings_section_system_title: 'System',
    settings_tab_appearance: 'Appearance',
    settings_tab_conversation: 'Conversation',
    settings_tab_preferences: 'Preferences',
    settings_tab_plugins: 'Плагины',
    settings_plugins_title: 'Plugins',  // TODO: translate
    plugins_enable_toggle: 'Включить',
    settings_plugins_meta: 'View installed Hermes plugins and the lifecycle hooks they register. This panel is read-only.',  // TODO: translate
    settings_plugins_empty: 'No Hermes plugins are currently visible. Install or enable plugins from the Hermes CLI/config to see them here.',  // TODO: translate
    plugins_unnamed: 'Unnamed plugin',  // TODO: translate
    plugins_no_description: 'No description provided.',  // TODO: translate
    plugins_no_hooks: 'No registered lifecycle hooks',  // TODO: translate
    plugins_registered_hooks: 'Registered hooks',  // TODO: translate
    plugins_enabled: 'Enabled',  // TODO: translate
    plugins_disabled: 'Disabled',  // TODO: translate
    plugins_active_provider: 'Active (provider)',  // TODO: translate
    plugins_provider_no_hooks: 'Provider plugin — no agent-visibility hooks',  // TODO: translate
    plugins_load_failed: 'Failed to load plugins: ',  // TODO: translate
    settings_tab_system: 'System',
    settings_tab_help: 'Help',
    settings_help_meta: 'Resources and support for Hermes WebUI.',
    settings_help_docs_label: 'Documentation',
    settings_help_docs_desc: 'Guides, configuration reference, and the full Hermes WebUI README.',
    settings_help_docs_link: 'Open Documentation',
    settings_help_issue_label: 'Having an issue?',
    settings_help_issue_desc: 'Search existing reports or open a new one on GitHub.',
    settings_help_issue_link: 'Open GitHub Issues',
    status_updated: 'Updated',
    status_ephemeral: 'Ephemeral snapshot — not saved to transcript history.',
    status_no_tokens: 'No token data',
    status_profile: 'Profile',
    status_hermes_home: 'Hermes home',
    status_started: 'Started',
    status_tokens: 'Tokens',
    status_unknown: 'Unknown',
    cmd_branch:'Fork this conversation into a new session',
    cmd_branch_usage:'/branch [name] — fork conversation (optionally with a name)',
    branch_forked:'Forked into new session',
    branch_failed:'Fork failed: ',
    fork_from_here:'Fork from here',
    forked_from:'Forked from',
    cmd_yolo: 'Переключить YOLO режим (без подтверждений)',
    yolo_no_session: 'Нет активного сеанса',
    yolo_enabled: '⚡ YOLO режим ВКЛ — подтверждения пропущены',
    yolo_disabled: 'YOLO режим ВЫКЛ',
    yolo_pill_label: 'YOLO',
    yolo_pill_title_active: 'YOLO режим активен — нажмите для отключения',
    approval_skip_all: '⚡ Пропустить все в этом сеансе',
    approval_skip_all_title: 'Пропустить все запросы подтверждения в этом сеансе',
    // composer action tooltips
    composer_send: 'Отправить сообщение',
    composer_queue: 'Поставить в очередь',
    composer_interrupt: 'Прервать и отправить',
    composer_steer: 'Направить ответ',
    composer_stop: 'Остановить генерацию',
    composer_disabled_clarify: 'Ответьте на запрос о разъяснении',
    composer_disabled_compression: 'Ожидание завершения сжатия',
    composer_compression_will_queue: 'Type a message — it will queue and send after compression',
    composer_disabled_empty: 'Введите сообщение для отправки',
    composer_mobile_workspace: 'Рабочее пространство',
    composer_mobile_model: 'Модель',
    composer_mobile_reasoning: 'Рассуждение',
    composer_mobile_context: 'Контекст',
    media_audio_label: 'Аудио',
    media_svg_label: 'Диаграмма',
    media_video_label: 'Видео',
    media_download: 'Скачать',
    csv_loading: 'Загрузка CSV',
    csv_too_large: 'CSV-файл слишком большой для встроенного отображения',
    csv_no_data: 'Недостаточно данных в CSV-файле',
    csv_error: 'Не удалось загрузить CSV-файл',
    csv_header_note: 'Первая строка отображается как заголовок таблицы',
    excalidraw_loading: 'Загрузка диаграммы',
    excalidraw_too_large: 'Файл Excalidraw слишком большой для отображения',
    excalidraw_invalid: 'Неверный формат файла Excalidraw',
    excalidraw_error: 'Не удалось загрузить файл Excalidraw',
    excalidraw_label: 'Диаграмма',
    excalidraw_download: 'Скачать',
    excalidraw_empty: 'Пустая диаграмма',
    excalidraw_render_error: 'Не удалось отобразить диаграмму',
    excalidraw_simplified: 'Упрощённый предпросмотр SVG — не полностью идентичен оригиналу Excalidraw',
    pdf_loading: 'Загрузка PDF {0}…',
    pdf_too_large: 'PDF слишком большой для встроенного просмотра',
    pdf_no_pages: 'Не удалось отобразить предварительный просмотр PDF',
    pdf_error: 'Не удалось загрузить PDF',
    pdf_download: 'Скачать PDF',
    html_loading: 'Загрузка предпросмотра HTML…',
    html_too_large: 'HTML слишком большой для встроенного просмотра',
    html_error: 'Не удалось загрузить предпросмотр HTML',
    html_open_full: 'Открыть на всю страницу',
    html_sandbox_label: 'Предпросмотр HTML',
    // TTS (#499)
    tts_listen: 'Прослушать',
    tts_not_supported: 'Синтез речи не поддерживается',
    settings_label_tts: 'Синтез речи для ответов',
    settings_desc_tts: 'Показать кнопку динамика на сообщениях ассистента',
    settings_label_tts_auto_read: 'Авто-чтение ответов',
    settings_desc_tts_auto_read: 'Автоматически озвучивать ответы ассистента',
    // Composer voice-mode pref (#1488)
    settings_label_voice_mode: 'Кнопка режима свободных рук',
    settings_desc_voice_mode: 'Показывать кнопку голосового режима (аудиоволны) рядом с микрофоном диктовки. Hermes автоматически отправляет реплики после паузы и зачитывает ответы вслух. Требуется браузер с поддержкой распознавания речи и TTS.',
    settings_label_raw_audio: 'Отправлять сырую аудиозапись вместо расшифровки',
    settings_desc_raw_audio: 'Записывать и отправлять агенту исходный аудиофайл вместо преобразования в текст. Агент может расшифровать его или обработать сырое аудио (эмоции, фоновый шум, пользовательский STT). Как голосовые сообщения в Telegram.',
    voice_send_raw: 'Отправить сырое аудио',
    voice_raw_attached: 'Аудио прикреплено. Нажмите Отправить или добавьте текст.',
    settings_label_tts_voice: 'Голос',
    settings_desc_tts_voice: 'Выберите голос для синтеза речи',
    settings_label_tts_rate: 'Скорость речи',
    settings_label_tts_pitch: 'Тон речи',
    settings_label_tts_engine: 'Движок TTS',
    settings_desc_tts_engine: 'Выберите движок синтеза речи. Edge TTS использует нейронные голоса Microsoft через сервер.',

    checkpoint_date: 'Date',  // TODO: translate
    checkpoint_diff_files_changed: (n) => `${n} file${n === 1 ? '' : 's'} changed`,  // TODO: translate
    checkpoint_diff_no_changes: 'No differences found between this checkpoint and the current workspace.',  // TODO: translate
    checkpoint_diff_title: 'Changes in checkpoint',  // TODO: translate
    checkpoint_empty: 'No checkpoints found for this workspace.',  // TODO: translate
    checkpoint_error: 'Failed to load checkpoints',  // TODO: translate
    checkpoint_files: 'Files',  // TODO: translate
    checkpoint_loading: 'Loading checkpoints…',  // TODO: translate
    checkpoint_message: 'Message',  // TODO: translate
    checkpoint_restore: 'Restore',  // TODO: translate
    checkpoint_restore_confirm_message: (ckpt) => `Restore workspace to checkpoint "${ckpt}"? This will overwrite files with the saved versions. Files added after this checkpoint will not be deleted.`,  // TODO: translate
    checkpoint_restore_confirm_title: 'Restore checkpoint?',  // TODO: translate
    checkpoint_restored: 'Checkpoint restored',  // TODO: translate
    checkpoint_title: 'Checkpoints',  // TODO: translate
    checkpoint_view_diff: 'View diff',  // TODO: translate
    insights_activity_by_day: 'Activity by Day',  // TODO: translate
    insights_activity_by_hour: 'Activity by Hour',  // TODO: translate
    insights_cost: 'Estimated Cost',  // TODO: translate
    insights_daily_tokens: 'Daily Tokens',
    insights_model_name: 'Model',
    insights_model_sessions: 'Sessions',
    insights_model_tokens: 'Tokens',
    insights_model_cost: 'Cost',
    insights_model_share: 'Share',
    insights_no_usage_data: 'No usage data yet',
    insights_footer: 'Showing data from the last {days} days',  // TODO: translate
    insights_skill_usage_title: 'Skill Usage',  // TODO: translate
    insights_skill_usage_sub: 'Tool invocation frequency',  // TODO: translate
    insights_skill_usage_total: 'Total invocations',  // TODO: translate
    insights_skill_usage_skills_used: 'Skills used',  // TODO: translate
    insights_skill_usage_no_data: 'No skill usage data yet',  // TODO: translate
    insights_skill_usage_no_data_hint: 'Skills will appear here once used in conversations.',  // TODO: translate
    insights_skill_usage_footer: 'Counts from ~/.hermes/skills/',  // TODO: translate
    insights_skill_usage_col_skill: 'Skill',  // TODO: translate
    insights_skill_usage_col_uses: 'Uses',  // TODO: translate
    insights_skill_usage_col_views: 'Views',  // TODO: translate
    insights_skill_usage_col_share: 'Usage %',  // TODO: translate
    insights_skill_usage_col_patches: 'Patches',  // TODO: translate
    insights_input_tokens: 'Input',  // TODO: translate
    insights_messages: 'Messages',  // TODO: translate
    insights_models: 'Models',  // TODO: translate
    insights_no_cost: 'N/A',  // TODO: translate
    insights_output_tokens: 'Output',  // TODO: translate
    insights_peak_hour: 'Peak: {hour}',  // TODO: translate
    insights_sessions: 'Sessions',  // TODO: translate
    insights_title: 'Usage Analytics',  // TODO: translate
    insights_token_breakdown: 'Token Breakdown',  // TODO: translate
    insights_tokens: 'Tokens',  // TODO: translate
    insights_total: 'Total',  // TODO: translate
    settings_desc_api_redact: 'Self-hosted users can disable for transparency (not recommended for shared instances).',  // TODO: translate
    settings_label_api_redact: 'Redact sensitive data in API responses',  // TODO: translate
    subagent_children: 'Subagent sessions',  // TODO: translate
    outline_title: 'Outline',  // TODO: translate
    outline_empty: 'No questions yet.',  // TODO: translate
    outline_loading: 'Loading…',  // TODO: translate
  },

  es: {
    offline_title: 'Conexión perdida',
    offline_browser_detail: 'Tu navegador indica que este dispositivo está sin conexión.',
    offline_network_detail: 'Hermes no está disponible desde este navegador ahora mismo.',
    offline_autorefresh: 'Actualizaré esta página automáticamente cuando Hermes vuelva a estar disponible.',
    offline_check_now: 'Comprobar ahora',
    offline_checking: 'Comprobando…',
    offline_stream_waiting: 'Conexión perdida. Esperando para actualizar…',
    _lang: 'es',
    _label: 'Español',
    _speech: 'es-ES',
    // boot.js
    cancelling: 'Cancelando…',
    cancel_failed: 'Error al cancelar: ',
    mic_denied: 'Acceso al micrófono denegado. Revisa los permisos del navegador.',
    mic_no_speech: 'No se detectó voz. Inténtalo de nuevo.',
    mic_network: 'El reconocimiento de voz no está disponible.',
    mic_error: 'Error de entrada por voz: ',
    session_imported: 'Sesión importada',
    import_failed: 'Error al importar: ',
    import_invalid_json: 'JSON inválido',
    image_pasted: 'Imagen pegada: ',
    // messages.js
    edit_message: 'Editar mensaje',
    regenerate: 'Regenerar respuesta',
    copy: 'Copiar',
    copied: '¡Copiado!',
    copy_failed: 'Error al copiar',
    selected_text_reply: 'Responder con selección',
    selected_text_reply_title: 'Añadir el texto del chat seleccionado como contexto citado',
    selected_text_reply_appended: 'Texto seleccionado añadido al compositor',
    saved_prompts_empty: 'No hay indicaciones guardadas todavía.',
    saved_prompts_save_current: 'Guardar entrada actual como indicación',
    saved_prompts_saved: 'Indicación guardada',
    saved_prompts_delete: 'Eliminar indicación',
    saved_prompts_empty_input: 'Escribe una indicación para guardar primero',

    diff_loading: 'Cargando diff',
    diff_error: 'No se pudo cargar el archivo de parche',
    diff_too_large: 'Archivo de parche demasiado grande para mostrar',
    tree_view: '树形',
    raw_view: '原始',
    parse_failed_note: 'parse failed',
    you: 'Tú',
    mcp_servers_title: 'MCP 服务器',
    mcp_servers_desc: '管理 config.yaml 中配置的 MCP 服务器。',
    mcp_no_servers: '未配置 MCP 服务器。',
    mcp_add_server: '+ 添加服务器',
    mcp_field_name: '服务器名称',
    mcp_transport_label: '传输类型',
    mcp_field_command: '命令',
    mcp_field_args: '参数（逗号分隔）',
    mcp_field_url: 'URL',
    mcp_field_timeout: '超时（秒）',
    mcp_save: '保存',
    mcp_cancel: '取消',
    mcp_name_required: '需要服务器名称。',
    mcp_url_required: 'HTTP 传输需要 URL。',
    mcp_command_required: 'stdio 传输需要命令。',
    mcp_saved: 'MCP 服务器已保存。',
    mcp_save_failed: '保存 MCP 服务器失败。',
    mcp_delete_confirm_title: '删除 MCP 服务器',
    mcp_delete_confirm_message: '删除 MCP 服务器「{0}」？此操作无法撤销。',
    mcp_deleted: 'MCP 服务器已删除。',
    mcp_delete_failed: '删除 MCP 服务器失败。',
    mcp_load_failed: '加载 MCP 服务器失败。',
    mcp_restart_hint: 'Server changes are read-only here for now. Edit config.yaml and restart Hermes for changes to take effect.',
    mcp_toggle_followup: 'Enable/disable controls are intentionally deferred until MCP reload semantics are explicit.',
    mcp_status_active: 'Active',
    mcp_status_configured: 'Configured',
    mcp_status_disabled: 'Disabled',
    mcp_status_invalid_config: 'Invalid config',
    mcp_status_unknown: 'Unknown',
    mcp_tool_count: '{0} tools',
    mcp_enabled_yes: 'Enabled',
    mcp_enabled_no: 'Disabled',
    mcp_enable_server: 'Enable this MCP server',
    mcp_disable_server: 'Disable this MCP server',
    mcp_enabled_toast: (name) => `MCP server "${name}" enabled.`,
    mcp_disabled_toast: (name) => `MCP server "${name}" disabled.`,
    mcp_toggle_failed: 'Failed to update MCP server.',
    mcp_tools_title: 'MCP Tools',
    mcp_tools_desc: 'Search known tools across active MCP servers.',
    mcp_tools_search_placeholder: 'Search tools by name, server, or description…',
    mcp_tools_no_tools: 'No MCP tools are available from the active runtime inventory.',
    mcp_tools_no_matches: 'No MCP tools match your search.',
    mcp_tools_load_failed: 'Failed to load MCP tools.',
    mcp_tools_schema_empty: 'No schema parameters.',
    mcp_tools_runtime_note: 'Tool inventory only uses already-known active MCP runtime data; the WebUI does not start or probe servers.',
    mcp_tools_summary_no_matches: (query,total) => `No MCP tools matching “${query}” (${total} total MCP tools).`,
    mcp_tools_summary_none: 'No MCP tools to show.',
    mcp_tools_summary_matching: (query) => ` matching “${query}”`,
    mcp_tools_summary_total_note: (total) => ` (${total} total MCP tools)`,
    mcp_tools_summary_showing: (start,end,filtered,searchNote,totalNote,page,pages) => `Showing ${start}-${end} of ${filtered} MCP tools${searchNote}${totalNote}. Page ${page} of ${pages}.`,
    mcp_tools_page_size_prefix: 'Show',
    mcp_tools_page_size_suffix: 'per page',
    mcp_tools_per_page_aria: 'MCP tools per page',
    mcp_tools_inactive_configured_servers: (servers) => `Configured but inactive in this WebUI runtime: ${servers}.`,
    mcp_tools_pagination_label: 'MCP tools pagination',
    mcp_tools_previous_page: '‹ Prev',
    mcp_tools_previous_page_aria: 'Previous MCP tools page',
    mcp_tools_next_page: 'Next ›',
    mcp_tools_next_page_aria: 'Next MCP tools page',
    thinking: 'Pensando',
    expand_all: 'Expandir todo',
    collapse_all: 'Contraer todo',
    edit_failed: 'Error al editar: ',
    regen_failed: 'Error al regenerar: ',
    reconnect_active: 'Todavía se está generando una respuesta. ¿Recargar cuando termine?',
    reconnect_finished: 'Había una respuesta en curso cuando te fuiste. Puede que los mensajes se hayan actualizado.',
    // approval card
    approval_heading: 'Se requiere aprobación',
    approval_desc_prefix: 'Se detectó un comando peligroso',
    approval_btn_once: 'Permitir una vez',
    approval_btn_once_title: 'Permitir solo este comando (Enter)',
    approval_btn_session: 'Permitir en la sesión',
    approval_btn_session_title: 'Permitir durante esta sesión de conversación',
    approval_btn_always: 'Permitir siempre',
    approval_btn_always_title: 'Permitir siempre este patrón de comando',
    approval_btn_deny: 'Denegar',
    approval_btn_deny_title: 'Denegar — no ejecutar este comando',
    approval_responding: 'Respondiendo…',
    clarify_heading: 'Se necesita aclaración',
    clarify_hint: 'Elige una opción o escribe tu propia respuesta abajo.',
    clarify_other: 'Otra',
    clarify_send: 'Enviar',
    clarify_input_placeholder: 'Escribe tu respuesta…',
    clarify_responding: 'Respondiendo…',
    session_attention_approval: (n) => n === 1 ? 'Aprobación' : `${n} aprobaciones`,
    session_attention_clarify: (n) => n === 1 ? 'Pregunta' : `${n} preguntas`,
    session_attention_generic: (n) => n === 1 ? 'Atención' : `${n} elementos`,
    session_attention_approval_title: 'Esperando una decisión de permiso',
    session_attention_clarify_title: 'Esperando tu respuesta',
    session_attention_generic_title: 'Esperando una acción del usuario',
    untitled: 'Sin título',
    n_messages: (n) => `${n} mensajes`,
    load_older_messages: '↑ Desplázate hacia arriba o haz clic para cargar mensajes anteriores',
    session_jump_start: 'Inicio',
    session_jump_start_label: 'Saltar al inicio de la sesión',
    session_jump_end: 'Fin',
    session_jump_end_label: 'Saltar al final de la sesión',
    session_new_message: 'Mensaje nuevo',
    session_new_message_label: 'Mensaje nuevo disponible, saltar al final',
    jump_to_question: 'a la respuesta',
    jump_to_question_label: 'Saltar al inicio de esta respuesta',
    queued_label: 'Enviar después de la respuesta',
    queued_count: (n) => n === 1 ? '1 en cola' : `${n} en cola`,
    queued_cancel: 'Cancelar mensaje en cola',
    model_unavailable: ' (no disponible)',
    model_unavailable_title: 'Este modelo ya no está en tu lista actual de proveedores',
    provider_mismatch_warning: (m,p)=>`"${m}" puede no funcionar con tu proveedor configurado (${p}). Envía de todas formas, o ejecuta \`hermes model\` en la terminal para cambiar.`,
    provider_mismatch_label: 'Proveedor incompatible',
    gateway_auth_label: 'Error de autenticación de Gateway',
    model_not_found_label: 'Modelo no encontrado',
    model_custom_label: 'ID de modelo personalizado',
    model_custom_placeholder: 'p. ej. openai/gpt-5.4',
    model_search_placeholder: 'Buscar modelos…',
    model_search_no_results: 'No se encontraron modelos',
    model_group_configured: 'Configurados',
    ws_search_placeholder: 'Buscar espacios de trabajo…',
    ws_no_results: 'No se encontraron espacios de trabajo',
    workspace_new_worktree_conversation: 'Nueva conversación en worktree',
    workspace_new_worktree_conversation_meta: 'Crear un git worktree aislado para este espacio de trabajo.',
    workspace_worktree_created: 'Conversación en worktree creada',
    workspace_worktree_failed: 'Error al crear worktree: ',
    session_worktree_badge: 'Worktree',
    session_toolsets: 'Session Toolsets', // TODO: translate
    session_toolsets_desc: 'Restrict available tools for this session (blank = use global config)', // TODO: translate
    session_toolsets_global: 'Global (default)', // TODO: translate
    session_toolsets_custom: 'Custom', // TODO: translate
    session_toolsets_placeholder: 'tool1, tool2, \u2026', // TODO: translate
    session_toolsets_apply: 'Apply', // TODO: translate
    session_toolsets_clear: 'Clear (use global)', // TODO: translate
    session_toolsets_applied: 'Toolsets updated', // TODO: translate
    session_toolsets_cleared: 'Toolsets cleared — using global config', // TODO: translate
    session_toolsets_failed: 'Failed to update toolsets: ', // TODO: translate
    model_scope_advisory: 'Se aplica a esta conversación desde tu próximo mensaje.',
    model_scope_toast: 'Se aplica a esta conversación desde tu próximo mensaje.',
    // commands.js
    cmd_help: 'Listar los comandos disponibles',
    cmd_clear: 'Borrar los mensajes de la conversación',
    cmd_compress: 'Comprimir manualmente el contexto de la conversación (uso: /compress [tema])',
    ctx_compress_hint: 'Comprimir contexto para liberar espacio →',
    ctx_compress_action: '⚠ Comprimir ahora para liberar contexto',
    cmd_compact_alias: 'Alias antiguo de /compress',
    cmd_compact: 'Comprimir contexto de la conversación',
    cmd_model: 'Cambiar de modelo (p. ej. /model gpt-4o)',
    cmd_workspace: 'Cambiar de espacio de trabajo por nombre',
    cmd_terminal: 'Abrir terminal del espacio de trabajo',
    cmd_new: 'Iniciar una nueva sesión de chat',
    cmd_usage: 'Activar o desactivar el uso de tokens',
    cmd_theme: 'Cambiar apariencia (tema: system/dark/light, skin: default/ares/mono/graphite/slate/poseidon/sisyphus/charizard/sienna/catppuccin/nous/geist-contrast/zeus/verdigris)',
    cmd_personality: 'Cambiar la personalidad del agente',
    cmd_skills: 'Listar las skills de Hermes disponibles',
    cmd_use: 'Forzar una skill para el próximo mensaje',
    available_commands: 'Comandos disponibles:',
    type_slash: 'Escribe / para ver los comandos',
    conversation_cleared: 'Conversación borrada',
    command_label: 'Comando',
    context_compaction_label: 'Compacción de contexto',
    retrieval_context_label: 'Contexto indexado',
    retrieval_context_preview: 'Los mensajes anteriores se almacenan y se pueden recuperar con herramientas de contexto',
    preserved_task_list_label: 'Lista de tareas conservada',
    reference_only_label: 'Solo referencia',
    model_usage: 'Uso: /model <name>',
    no_model_match: 'No hay ningún modelo que coincida con "',
    model_did_you_mean: (m) => ` — ¿quisiste decir "${m}"?`,
    switched_to: 'Se cambió a ',
    workspace_usage: 'Uso: /workspace <name>',
    no_workspace_match: 'No hay ningún espacio de trabajo que coincida con "',
    switched_workspace: 'Se cambió al espacio de trabajo: ',
    workspace_switch_failed: 'Error al cambiar de espacio de trabajo: ',
    new_session: 'Nueva sesión creada',
    new_session_creating: 'Creando nueva conversación…',
    compressing: 'Solicitando compresión del contexto...',
    compress_running_label: 'Comprimiendo',
    compress_complete_label: 'Compresión completa',
    auto_compress_label: 'Compresión automática',
    compress_failed_label: 'La compresión falló',
    focus_label: 'Tema',
    token_usage_on: 'Uso de tokens activado',
    usage_personality_none: 'none', // TODO: translate
    token_usage_off: 'Uso de tokens desactivado',
    usage_cache_hit_detail: 'Caché: {0}% de acierto ({1} lectura / {2} escritura)',
    usage_cached_percent: '{0}% en caché',
    theme_usage: 'Uso: /theme ',
    theme_set: 'Tema: ',
    no_active_session: 'No hay ninguna sesión activa',
    cmd_queue: 'Poner mensaje en cola para el siguiente turno',
    cmd_goal: 'Definir o consultar un objetivo persistente',
    goal_evaluating_progress: 'Evaluating goal progress…',
    goal_working_toward: 'Working toward goal…',
    goal_continuing_toast: 'Continuing toward goal…',
    goal_status_none: 'No active goal. Set one with /goal <text>.',
    goal_status_active: (turns, max_turns, goal) => `⊙ Goal (active, ${turns}/${max_turns} turns): ${goal}`,
    goal_status_paused: (turns, max_turns, reason, goal) => `⏸ Goal (paused, ${turns}/${max_turns}${reason ? `, ${reason}` : ''}): ${goal}`,
    goal_status_done: (turns, max_turns, goal) => `✓ Goal done (${turns}/${max_turns}): ${goal}`,
    goal_set: (turns, goal) => `⊙ Goal set (${turns}-turn budget): ${goal}`,
    goal_paused: (goal) => `⏸ Goal paused: ${goal}`,
    goal_resumed: (goal) => `▶ Goal resumed: ${goal}`,
    goal_cleared: 'Goal cleared.',
    goal_no_goal: 'No active goal.',
    goal_achieved: (reason) => `✓ Goal achieved: ${reason}`,
    goal_paused_budget_exhausted: (turns, max_turns) => `⏸ Goal paused — ${turns}/${max_turns} turns used. Use /goal resume to keep going, or /goal clear to stop.`,
    goal_continuing: (turns, max_turns, reason) => `↻ Continuing toward goal (${turns}/${max_turns}): ${reason}`,
    cmd_interrupt: 'Cancelar turno actual y enviar nuevo mensaje',
    cmd_steer: 'Inyectar una corrección a mitad del turno sin interrumpir al agente',
    cmd_queue_no_msg: 'Uso: /queue <mensaje>',
    cmd_queue_not_busy: 'Sin tarea activa \u2014 env\u00eda normalmente',
    cmd_queue_confirm: 'Mensaje en cola',
    cmd_interrupt_no_msg: 'Uso: /interrupt <mensaje>',
    cmd_interrupt_confirm: 'Interrumpido \u2014 enviando nuevo mensaje',
    cmd_steer_no_msg: 'Uso: /steer <mensaje>',
    cmd_steer_fallback: 'Steer no disponible — en cola para el siguiente turno',
    cmd_steer_delivered: 'Steer entregado \u2014 el agente lo ver\u00e1 en su pr\u00f3ximo resultado de herramienta',
    steer_leftover_queued: 'Steer en cola para el pr\u00f3ximo turno',
    busy_steer_fallback: 'Steer no disponible — en cola para el siguiente turno',
    busy_interrupt_confirm: 'Interrumpido \u2014 enviando nuevo mensaje',
    settings_label_busy_input_mode: 'Modo de entrada ocupada',
    settings_desc_busy_input_mode: 'Controla qué sucede al enviar mensajes mientras el agente está activo. Cola espera; Interrumpir cancela y empieza de nuevo; Steer inyecta una corrección sin interrumpir (usa cola si el agente no está disponible).',
    settings_label_fade_text_effect: 'Efecto de desvanecimiento de texto',
    settings_desc_fade_text_effect: 'Hace aparecer gradualmente las palabras nuevas mientras el asistente responde. Similar a OpenWebUI; desactivado por defecto para máximo rendimiento.',
    settings_busy_input_mode_queue: 'Poner en cola',
    settings_busy_input_mode_interrupt: 'Interrumpir turno actual',
    settings_busy_input_mode_steer: 'Steer (corrección a mitad de turno)',
    no_personalities: 'No se encontraron personalidades (añádelas a ~/.hermes/personalities/)',
    available_personalities: 'Personalidades disponibles:',
    personality_switch_hint: '\n\nUsa `/personality <name>` para cambiar, o `/personality none` para limpiar.',
    personalities_load_failed: 'No se pudieron cargar las personalidades',
    personality_cleared: 'Personalidad borrada',
    personality_set: 'Personalidad: ',
    failed_colon: 'Error: ',
    // ui.js
    no_workspace: 'Sin espacio de trabajo',
    terminal_open_title: 'Abrir terminal del espacio de trabajo',
    terminal_no_workspace_title: 'Selecciona un espacio de trabajo para abrir el terminal',
    terminal_title: 'Terminal',
    terminal_clear: 'Limpiar',
    terminal_copy_output: 'Copiar salida',
    terminal_restart: 'Reiniciar',
    terminal_collapse: 'Contraer',
    terminal_expand: 'Expandir',
    terminal_close: 'Cerrar',
    terminal_input_placeholder: 'Ejecuta un comando...',
    terminal_start_failed: 'Error al iniciar el terminal: ',
    terminal_input_failed: 'Error de entrada del terminal: ',
    terminal_copy_failed: 'Error al copiar: ',
    terminal_error: 'Error del terminal',
    terminal_remote_backend_unsupported: 'El terminal integrado solo es compatible con backends de terminal locales.',
    workspace_empty_no_path: 'No hay espacio de trabajo seleccionado. Configure un espacio de trabajo en Ajustes \u2192 Workspace para explorar archivos.',
    workspace_empty_dir: 'Este espacio de trabajo está vacío.',
    workspace_show_hidden_files: 'Mostrar archivos ocultos',
    workspace_show_hidden_files_desc: 'Include .DS_Store, .git, node_modules, and other hidden / system files in the file tree.',
    workspace_hidden_files_visible: 'hidden visible',
    workspace_hidden_files_visible_title: 'Hidden files are visible — click for options',
    workspace_options: 'Workspace options',
    // workspace.js
    unsaved_confirm: 'Tienes cambios sin guardar en la vista previa. ¿Descartar y navegar?',
    save: 'Guardar',
    edit: 'Editar',
    save_title: 'Guardar cambios',
    edit_title: 'Editar este archivo',
    saved: 'Guardado',
    save_failed: 'Error al guardar: ',
    image_load_failed: 'No se pudo cargar la imagen',
    file_open_failed: 'No se pudo abrir el archivo',
    downloading: (name) => `Descargando ${name}…`,
    double_click_rename: 'Haz doble clic para renombrar',
    session_rename_failed_no_row: 'Could not start rename — row not found.',
    renamed_to: 'Renombrado a ',
    rename_failed: 'Error al renombrar: ',
    moved_to: 'Movido a ',
    move_failed: 'Error al mover: ',
    delete_title: 'Eliminar',
    delete_confirm: (name) => `¿Eliminar ${name}?`,
    delete_dir_confirm: (name) => `¿Eliminar carpeta "${name}" y todo su contenido?`,
    rename_title: 'Renombrar',
    rename_prompt: 'Nuevo nombre:',
    deleted: 'Eliminado ',
    delete_failed: 'Error al eliminar: ',
     reveal_in_finder: 'Mostrar en el gestor de archivos',
     reveal_failed: 'Error al mostrar: ',
     copy_file_path: 'Copiar ruta del archivo',
     open_in_vscode: 'Abrir en VS Code',
     open_in_vscode_failed: 'Error al abrir en VS Code: ',
     download_folder: 'Download Folder', // TODO: translate
    path_copied: 'Ruta del archivo copiada al portapapeles',
    path_copy_failed: 'Error al copiar la ruta: ',
    session_rename: 'Renombrar conversación',
    session_rename_desc: 'Editar el título de esta conversación',
    session_title_regenerate: 'Regenerar título',
    session_title_regenerate_desc: 'Pide a Hermes que genere un título nuevo a partir de la conversación',
    session_title_regenerating: 'Regenerando título…',
    session_title_regenerated: (title) => `Título regenerado: ${title}`,
    session_title_regenerate_failed: 'Error al regenerar el título: ',
    session_copy_link: 'Copiar enlace de conversación',
    session_copy_link_desc: 'Copia un enlace directo a esta conversación',
    session_link_copied: 'Enlace de conversación copiado al portapapeles',
    session_link_copy_failed: 'No se pudo copiar el enlace de conversación: ',
    new_file_prompt: 'Nombre del archivo nuevo (p. ej. notes.md):',
    new_file: 'Nuevo archivo',
    new_folder: 'Nueva carpeta',
    workspace_root: 'raíz del espacio de trabajo',
    new_file_prompt_title: 'Nombre del archivo nuevo en {0}:',
    new_folder_prompt_title: 'Nombre de la carpeta nueva en {0}:',
    created: 'Creado ',
    create_failed: 'Error al crear: ',
    new_folder_prompt: 'Nombre de la carpeta nueva:',
    folder_created: 'Carpeta creada ',
    folder_create_failed: 'Error al crear la carpeta: ',
  workspace_auto_create_folder: 'Crear carpeta si no existe',
  folder_add_as_space_btn: 'Añadir como espacio',
  folder_add_as_space_msg: '¿Añadir esta carpeta como un nuevo espacio?',
  folder_add_as_space_title: '¿Añadir como espacio?',
    remove_title: 'Quitar',
    empty_dir: '(vacío)',
    upload_failed: 'Error al subir: ',
    upload_too_large: (maxMb, fileMb) => `El archivo es demasiado grande (${fileMb} MB). El tamaño máximo de subida es ${maxMb} MB.`,
    uploading: 'Subiendo…',
    uploaded: 'Subido',
    all_uploads_failed: (n) => `Fallaron las ${n} subida(s)`,
    archive_extracted: (n, c) => `${n} archivo(s) extraído(s) de ${c} archivo(s) comprimido(s)`,
    // settings panel
    settings_title: 'Configuración',
    settings_save_btn: 'Guardar configuración',
    settings_label_model: 'Modelo predeterminado',
    settings_desc_model: 'Se usa para conversaciones nuevas. Las conversaciones existentes conservan su modelo seleccionado.',
    settings_label_auxiliary_models: 'Modelos auxiliares',
    settings_desc_auxiliary_models: 'Enrutamiento para tareas secundarias como visión, compresión, generación de títulos, etc. «Auto» usa el modelo de chat principal.',
    settings_btn_reset_aux_models: 'Restablecer todo a auto',
    settings_btn_apply_aux_models: 'Aplicar cambios',
    settings_aux_provider_auto: 'usar modelo principal',
    settings_aux_model_auto: 'auto (usar predeterminado del proveedor)',
    settings_aux_model_custom: 'Modelo personalizado…',
    settings_aux_model_custom_prompt: 'Ingrese ID del modelo:',
    settings_aux_loading: 'Cargando modelos auxiliares…',
    settings_aux_load_failed: 'No se pudieron cargar las configuraciones de modelos auxiliares. Asegúrese de que la API del agente esté disponible.',
    settings_aux_reset_confirm_title: '¿Restablecer modelos auxiliares?',
    settings_aux_reset_confirm_msg: 'Esto establecerá todas las tareas auxiliares en auto (usar modelo principal).',
    settings_aux_reset_done: 'Modelos auxiliares restablecidos a auto',
    settings_aux_save_failed: 'Error al guardar el modelo auxiliar',
    settings_aux_saved: 'Modelos auxiliares actualizados',
    settings_aux_no_changes: 'Sin cambios para aplicar',
    settings_label_send_key: 'Tecla de envío',
    settings_label_theme: 'Tema',
    settings_label_skin: 'Piel',
    settings_label_font_size: 'Tamaño de fuente',
    font_size_small: 'Pequeño',
    font_size_default: 'Por defecto',
    font_size_large: 'Grande',
    font_size_xlarge: 'Extra grande',
    settings_autosave_saving: 'Guardando…',
    settings_autosave_saved: 'Guardado',
    settings_autosave_failed: 'Error al guardar',
    settings_autosave_retry: 'Reintentar',
    settings_label_language: 'Idioma',
    settings_label_quota_chip: 'Mostrar el chip de cuota del proveedor en el compositor',
    settings_desc_quota_chip: 'Muestra un indicador ambiental de cuota restante (por ejemplo, saldo de crédito de OpenRouter) en el pie del compositor. Predeterminado: desactivado. Solo visible en pantallas anchas (≥1400px) cuando se activa, para mantener el compositor despejado en portátiles y monitores estándar.',
    settings_label_conversation_outline: 'Mostrar esquema de conversación',
    settings_desc_conversation_outline: 'Muestra una lista de salto solo en escritorio para las preguntas del usuario en la conversación actual. Desactivado de forma predeterminada.',
    settings_label_hide_suggestions: 'Hide new-chat suggestions',
    settings_desc_hide_suggestions: 'Hide the three default suggestion buttons on the empty new-chat screen to avoid accidental taps.',
    settings_label_token_usage: 'Mostrar uso de tokens',
    settings_label_token_speed: 'Mostrar velocidad de tokens (TPS)',
    settings_desc_token_speed: 'Muestra tokens por segundo en los encabezados de mensajes del asistente durante la transmisión y después de completar una respuesta. Desactivado por defecto.',
    settings_label_sidebar_density: 'Densidad de la barra lateral',
    cmd_reasoning: 'Toggle thinking visibility (show/hide), set effort level, or check current status',
    settings_label_external_sessions: 'Mostrar sesiones externas',
    settings_label_cron_sessions: 'Show cron sessions',
    settings_label_previous_messaging_sessions: 'Mostrar sesiones de mensajería anteriores',
    settings_label_sync_insights: 'Sincronizar con insights',
    settings_label_check_updates: 'Buscar actualizaciones',
    settings_label_ignore_agent_updates: 'Ignore Agent updates',
    settings_label_whats_new_summary: "Summarize What's New with AI",
    settings_label_bot_name: 'Nombre predeterminado del asistente',
    settings_label_password: 'Contraseña de acceso',
    settings_label_pinned_limit: 'Límite de conversaciones fijadas',
    settings_desc_pinned_limit: 'Número máximo de conversaciones activas que se pueden fijar en la barra lateral. Por defecto es 3.',
    settings_label_dashboard_mode: 'Panel oficial de Hermes',
    settings_desc_dashboard_mode: 'Mostrar un enlace en la barra de navegación cuando el panel oficial de hermes esté accesible. Las URL de proxy inverso público se almacenan solo como enlaces en el navegador y nunca son sondeadas por el servidor.',
    settings_dashboard_mode_auto: 'Detección automática',
    settings_dashboard_mode_always: 'Mostrar siempre',
    settings_dashboard_mode_never: 'No mostrar nunca',
    settings_dashboard_save: 'Guardar configuración del enlace del panel',
    settings_label_gateway_status: 'Estado del Gateway',
    settings_desc_gateway_status: 'Estado del gateway de Hermes (Telegram, Discord, Slack, etc.)',
    gateway_not_configured: 'Gateway no configurado',
    gateway_metadata_stale: 'Metadatos del gateway obsoletos',
    gateway_endpoint_unreachable: 'Punto final del gateway no accesible',
    gateway_not_running: 'Gateway no está funcionando',
    gateway_running_label: 'Funcionando',
    gateway_last_active: 'Última actividad: ',
    gateway_session_count: (n) => `${n} ${n === 1 ? 'sesión' : 'sesiones'}`,
    gateway_load_failed: 'Error al cargar el estado del gateway',
    settings_saved: 'Configuración guardada',
    settings_save_failed: 'Error al guardar: ',
    settings_load_failed: 'Error al cargar la configuración: ',
    settings_saved_pw: 'Configuración guardada — la contraseña queda activada y este navegador sigue autenticado',
    settings_saved_pw_updated: 'Configuración guardada — contraseña actualizada',
    // login page (used server-side via /api/i18n/login endpoint)
    login_title: 'Iniciar sesión',
    login_subtitle: 'Introduce tu contraseña para continuar',
    login_placeholder: 'Contraseña',
    login_btn: 'Entrar',
    login_invalid_pw: 'Contraseña inválida',
    login_conn_failed: 'Error de conexión',
    dialog_confirm_title: 'Confirmar acción',
    dialog_prompt_title: 'Introduce un valor',
    dialog_confirm_btn: 'Confirmar',
    discard: 'Descartar',
    clear: 'Borrar',
    create: 'Crear',
    remove: 'Quitar',
    project_name_prompt: 'Nombre del proyecto:',
    // Sidebar & Tabs
    tab_chat: 'Chat',
    tab_tasks: 'Tareas',
    tab_skills: 'Habilidades',
    tab_memory: 'Memoria',
    tab_workspaces: 'Espacios',
    tab_profiles: 'Perfiles',
    tab_kanban: 'Kanban',
    kanban_board: 'Board',
    kanban_visible_tasks: '{0} visible tasks',
    kanban_search_tasks: 'Search tasks',
    kanban_all_assignees: 'All assignees',
    kanban_all_tenants: 'All tenants',
    kanban_include_archived: 'Include archived',
    kanban_no_matching_tasks: 'No matching tasks',
    kanban_no_data: 'No Kanban data',
    kanban_work_queue_hint: 'This is the Hermes Agent work queue. Create or triage a task, assign it, move it to Ready, then let the dispatcher claim it.',
    kanban_unavailable: 'Kanban unavailable',
    kanban_read_only: 'Read-only view',
    kanban_empty: 'Empty',
    kanban_task: 'Task',
    kanban_no_description: 'No description',
    kanban_refresh: 'Refresh',
    kanban_status_triage: 'Triage',
    kanban_status_todo: 'Todo',
    kanban_status_ready: 'Ready',
    kanban_status_running: 'Running',
    kanban_status_blocked: 'Blocked',
    kanban_status_done: 'Done',
    kanban_status_original_hint: 'Actual status: {0}. This dialog only supports Triage/Todo/Ready edits.',
    kanban_comments_count: 'Comments ({0})',
    kanban_events_count: 'Events ({0})',
    kanban_links: 'Links',
    kanban_parents: 'Parents',
    kanban_children: 'Children',
    kanban_runs_count: 'Runs ({0})',
    kanban_no_comments: 'No comments',
    kanban_no_events: 'No events',
    kanban_no_runs: 'No runs',
    kanban_title: 'Título',
    kanban_description: 'Descripción',
    kanban_description_placeholder: 'Opcional — qué hay que hacer, criterios de aceptación, enlaces',
    kanban_status: 'Estado',
    kanban_assignee: 'Responsable',
    kanban_assignee_placeholder: 'Opcional — déjalo en blanco para cualquier trabajador',
    kanban_tenant: 'Tenant',
    kanban_tenant_placeholder: 'Opcional — slug del proyecto o equipo',
    kanban_priority: 'Prioridad',
    kanban_priority_hint: 'Los números más altos se ejecutan primero. Predeterminado: 0.',
    kanban_title_required: 'El título es obligatorio.',
    kanban_edit_task: 'Editar tarea',
    kanban_run_dispatcher: 'Ejecutar despachador',
    kanban_run_dispatcher_confirm: 'Esto reclamará tareas Ready en este tablero y generará subprocesos worker (uno por tarea, hasta 8 por clic). ¿Continuar?',
    kanban_assignee_profiles_label: 'Perfiles Hermes',
    kanban_assignee_other_label: 'Otros (carriles CLI / perfiles eliminados)',
    kanban_assignee_unassigned: '— Sin asignar (no se ejecutará automáticamente) —',
    kanban_ready_needs_assignee: 'Elegiste «Sin asignar» + «Ready». El despachador omitirá esta tarea. Envía de nuevo para confirmar o selecciona un perfil.',
    kanban_dispatch_preview_prefix: 'Vista previa:',
    kanban_dispatch_run_prefix: 'Despachado:',
    kanban_dispatch_spawned: 'generadas',
    kanban_dispatch_promoted: 'promovidas',
    kanban_dispatch_reclaimed: 'recuperadas',
    kanban_dispatch_skipped_unassigned: 'omitidas (sin asignar)',
    kanban_dispatch_skipped_nonspawnable: 'omitidas (perfil desconocido)',
    kanban_dispatch_auto_blocked: 'auto-bloqueadas',
    kanban_dispatch_timed_out: 'expiradas',
    kanban_dispatch_crashed: 'fallaron',
    kanban_new_task: 'New task',
    kanban_add_comment: 'Add comment',
      kanban_only_mine: 'Only mine',
      kanban_bulk_action: 'Bulk action',
      kanban_nudge_dispatcher: 'Preview dispatcher',
      kanban_stats: 'Stats',
      kanban_worker_log: 'Worker log',
      kanban_block: 'Block',
      kanban_unblock: 'Unblock',
      kanban_back_to_board: 'Back to board',
      kanban_lanes_by_profile: 'Lanes by profile',
      kanban_new_board: 'New board…',
      kanban_rename_board: 'Rename current board…',
      kanban_archive_board: 'Archive current board…',
      kanban_archive_board_confirm: 'Archive board "{name}"? Tasks remain on disk and the board can be restored from kanban/boards/_archived/.',
      kanban_board_archived: 'Board archived',
      kanban_board_name: 'Name',
      kanban_board_slug: 'Slug (lowercase, hyphens)',
      kanban_board_description: 'Description (optional)',
      kanban_board_icon: 'Icon (emoji, optional)',
      kanban_board_color: 'Color (optional)',
      kanban_board_name_required: 'Name is required',
      kanban_board_slug_required: 'Slug is required',
      kanban_card_complete: 'complete',
      kanban_card_archive: 'archive',
      kanban_unassigned: 'unassigned',
    kanban_status_archived: 'Archived',
    tab_todos: 'Todos',
    tab_insights: 'Analíticas',
    tab_dashboard: 'Panel de Hermes',
    dashboard_loopback_warning: 'El panel solo usa loopback en el servidor. Navega desde el propio servidor o reinícialo con --host 0.0.0.0 (inseguro).',
    tab_logs: 'Logs',
    tab_settings: 'Ajustes',

    logs_title: 'Logs',  // TODO: translate
    logs_file: 'File',  // TODO: translate
    logs_tail: 'Tail',  // TODO: translate
    logs_auto_refresh: 'Auto-refresh (5s)',  // TODO: translate
    logs_wrap: 'Wrap lines',  // TODO: translate
    logs_copy_all: 'Copy all',  // TODO: translate
    logs_empty: 'No log lines yet.',  // TODO: translate
    logs_loading: 'Loading logs…',  // TODO: translate
    logs_load_failed: 'Logs failed to load',  // TODO: translate
    logs_status_idle: 'Choose a log file to view recent lines.',  // TODO: translate
    logs_no_mtime: 'not written yet',  // TODO: translate
    logs_truncated_hint: 'Showing the tail of a large log file; older bytes were skipped to keep memory bounded.',  // TODO: translate
    logs_copied: 'Logs copied',  // TODO: translate
    logs_severity: 'Severidad',
    logs_severity_all: 'Todo',
    logs_severity_errors: 'Errores',
    logs_severity_warnings: 'Advertencias+',
    logs_filter_active: 'mostrados (filtro activo)',
    new_conversation: 'Nueva conversación',
    filter_conversations: 'Filtrar conversaciones...',
    markdown_table_filter: 'Filtrar tabla',
    markdown_table_sort_column: 'Ordenar columna',
    session_time_unknown: 'Desconocido',
    session_time_minutes_ago: (n) => `${n}m`,
    session_time_hours_ago: (n) => `${n}h`,
    session_time_days_ago: (n) => `${n}d`,
    session_time_last_week: '1sem',
    session_time_bucket_today: 'Hoy',
    session_time_bucket_yesterday: 'Ayer',
    session_time_bucket_this_week: 'Esta semana',
    session_time_bucket_last_week: 'La semana pasada',
    session_time_bucket_older: 'Más antiguo',
    scheduled_jobs: 'Tareas programadas',
    new_job: 'Nueva tarea',
    loading: 'Cargando...',
    search_skills: 'Buscar skills...',
    new_skill: 'Nueva skill',
    personal_memory: 'Memoria personal',
    current_task_list: 'Lista de tareas actual',
    workspace_desc: 'Añade y cambia espacios de trabajo para tus sesiones.',
    session_meta_messages: (n) => `${n} mens.`,
    session_meta_children: (n) => `${n} ${n === 1 ? 'hijo' : 'hijos'}`,
    session_meta_segments: (n) => `${n} ${n === 1 ? 'segmento' : 'segmentos'}`,
    session_lineage_toggle_hint: '{0} — los turnos de contexto anteriores están contraídos aquí. Haz clic para mostrarlos u ocultarlos.',
    session_lineage_static_hint: '{0} — los turnos de contexto anteriores están contraídos aquí.',
    session_child_toggle_hint: '{0} — conversaciones hijas creadas desde esta sesión. Haz clic para mostrarlas u ocultarlas.',
    session_readonly_title_hint: 'Sesión importada de solo lectura — {0}',
    session_lineage_segment_untitled: 'Segmento sin título',
    session_lineage_segment_open: 'Abrir segmento de linaje',
    new_profile: 'Nuevo perfil',
    transcript: 'Transcripción',
    download_transcript: 'Descargar como Markdown',
    import: 'Importar',
    export_session_json: 'JSON',
    export_session_json_tooltip: 'Exportar sesión completa como JSON',
    import_session_json_tooltip: 'Importar sesión desde JSON',
    clear_conversation_btn_tooltip: 'Borrar todos los mensajes de esta conversación',
    // Settings detail
    settings_label_rtl: 'Diseño de chat de derecha a izquierda',
    settings_desc_rtl: 'Invierte la alineación de los mensajes y la entrada del compositor para idiomas como árabe o hebreo. Afecta solo al área del chat — la barra lateral y otros paneles siguen de izquierda a derecha.',
    settings_label_sound: 'Sonido de notificación',
    settings_desc_sound: 'Reproduce un sonido cuando el asistente termina una respuesta.',
    settings_label_notifications: 'Notificaciones del navegador',
    settings_desc_notifications: 'Muestra una notificación del sistema cuando una respuesta termina mientras la pestaña está en segundo plano.',
    notifications_enable_btn: 'Enable notifications',
    notifications_test_btn: 'Send test',
    notifications_permission_status: (status) => `Permission: ${status}`,
    notifications_enabled_toast: 'Notifications enabled.',
    notifications_denied: 'Notifications are blocked in this browser. Enable them in browser settings.',
    notifications_unsupported: 'Notifications are not supported in this browser.',
    settings_desc_token_usage: 'Muestra el conteo de tokens de entrada/salida debajo de cada respuesta del asistente. También se puede alternar con /usage.',
    settings_sidebar_density_compact: 'Compacta',
    settings_sidebar_density_detailed: 'Detallada',
    settings_desc_sidebar_density: 'Controla cuántos metadatos muestra la lista de sesiones en la barra lateral izquierda.',
    settings_label_auto_title_refresh: 'Actualización adaptativa del título',
    settings_auto_title_refresh_off: 'Desactivado',
    settings_auto_title_refresh_5: 'Cada 5 intercambios',
    settings_auto_title_refresh_10: 'Cada 10 intercambios',
    settings_auto_title_refresh_20: 'Cada 20 intercambios',
    settings_desc_auto_title_refresh: 'Regenera automáticamente el título de la sesión basándose en el último intercambio, manteniéndolo relevante a medida que evoluciona la conversación. Requiere un modelo LLM de generación de títulos configurado.',
    settings_desc_external_sessions: 'Mostrar conversaciones de CLI, Telegram, Discord, Slack y otros canales en la lista de sesiones. Haz clic para importar y continuar.',
    settings_desc_cron_sessions: 'Surface cron job output as conversations in the sidebar. Only active when non-WebUI sessions are enabled. Defaults off; high-frequency jobs can flood the sidebar.',
    settings_desc_previous_messaging_sessions: 'Mostrar sesiones antiguas de Discord, Telegram, Slack y Weixin reemplazadas por reset o compresión.',
    settings_desc_sync_insights: 'Refleja el uso de tokens de la WebUI en state.db para que hermes /insights incluya datos de sesiones del navegador. Desactivado por defecto.',
    settings_desc_check_updates: 'Muestra un banner cuando haya versiones más nuevas de la WebUI o del Agent. Ejecuta periódicamente un git fetch en segundo plano.',
    settings_desc_ignore_agent_updates: 'Keep WebUI update checks on, but hide Agent update notices and skip Agent update fetches.',
    settings_desc_whats_new_summary: "Changes the What's New action from opening the raw diff first to generating a short, human-readable summary. The regular diff comparison stays available after the summary.",
    settings_desc_bot_name: 'Solo se usa para el perfil predeterminado. Los otros perfiles usan sus propios nombres.',
    settings_desc_password: 'Introduce una nueva contraseña para establecerla o cambiarla. Déjalo en blanco para mantener la configuración actual.',
    password_placeholder: 'Introduce una contraseña nueva…',
    password_env_var_locked: 'La variable de entorno HERMES_WEBUI_PASSWORD está definida y tiene prioridad. Quítala y reinicia el servidor para gestionar la contraseña desde aquí.',
    password_env_var_locked_placeholder: 'Bloqueado: la variable HERMES_WEBUI_PASSWORD está definida',
    disable_auth: 'Desactivar autenticación',
    sign_out: 'Cerrar sesión',
    settings_label_shutdown: 'Detener el servidor Hermes WebUI',
    settings_desc_shutdown_before_cmd: 'Detiene de forma controlada el servidor WebUI local. Útil si lo iniciaste con ',
    settings_desc_shutdown_between_cmds: ' y quieres detenerlo sin cambiar al terminal. Para volver a acceder a la WebUI deberás reiniciar el servidor (',
    settings_desc_shutdown_after_cmd: ' o la aplicación nativa).',
    settings_btn_shutdown: 'Detener servidor',
    settings_shutdown_confirm_title: 'Detener Hermes WebUI',
    settings_shutdown_confirm_message: '¿Detener el servidor Hermes WebUI?',
    settings_shutdown_confirm_btn: 'Detener',
    settings_shutdown_stopped_message: 'Servidor detenido. Puedes cerrar esta pestaña.',
    // Providers panel (English fallback — native translations welcome in follow-up PRs)
    providers_tab_title: 'Providers',
    providers_section_title: 'Providers',
    providers_section_meta: 'Manage API keys for AI providers. Changes take effect immediately.',
    providers_status_configured: 'API key configured',
    providers_status_not_configured: 'No API key',
    providers_status_oauth: 'OAuth',
    providers_status_api_key: 'API key',
    providers_status_not_configured_label: 'Not configured',
    providers_oauth_hint: 'Authenticated via OAuth. No API key needed.',
    providers_oauth_config_yaml_hint: 'Token configured via config.yaml. To update, edit the providers section in your config.yaml or run hermes auth.',
    providers_oauth_not_configured_hint: 'Not authenticated. Run hermes auth in the terminal to configure this provider.',
    providers_save: 'Save',
    providers_refresh_models: 'Refresh models',
    providers_refreshing: 'Refreshing…',
    providers_models_refreshed: 'Models refreshed',
    providers_remove: 'Remove',
    providers_saving: 'Saving…',
    providers_removing: 'Removing…',
    providers_enter_key: 'Please enter an API key',
    providers_empty: 'No configurable providers found.',
    providers_key_updated: 'API key saved',
    providers_key_removed: 'API key removed',
    providers_key_placeholder_new: 'sk-...',
    providers_key_placeholder_replace: 'Enter new key to replace…',
    provider_quota_title: 'Cuota del proveedor activo',
    provider_quota_active_provider: 'Proveedor activo',
    provider_quota_last_checked_after_refresh: 'Última comprobación tras actualizar',
    provider_quota_last_checked: 'Última comprobación {0}',
    provider_quota_refresh_usage: 'Actualizar uso',
    provider_quota_refreshing: 'Actualizando...',
    provider_quota_refresh_title: 'Actualizar ahora los límites de uso del proveedor',
    provider_quota_refresh_succeeded: 'Uso del proveedor actualizado',
    provider_quota_refresh_failed: 'Error al actualizar el uso del proveedor',
    provider_quota_session_limit: 'Límite de 5 horas',
    provider_quota_weekly_limit: 'Límite semanal',
    provider_quota_window_fallback: 'Ventana',
    provider_quota_metric_remaining: 'Restante',
    provider_quota_metric_used: 'Usado',
    provider_quota_metric_limit: 'Límite',
    provider_quota_status_available: 'disponible',
    provider_quota_status_exhausted: 'agotado',
    provider_quota_status_unavailable: 'no disponible',
    provider_quota_status_failed: 'fallido',
    provider_quota_status_checked: 'comprobado',
    provider_quota_status_no_key: 'sin clave',
    provider_quota_status_invalid_key: 'clave no válida',
    provider_quota_status_unsupported: 'no compatible',
    provider_quota_used_meta: '{0} usado',
    provider_quota_resets_meta: 'se restablece {0}',
    provider_quota_credential_pool: 'Grupo de credenciales',
    provider_quota_credential_label: 'Credencial {0}',
    provider_quota_pool_plans: 'Planes: {0}',
    provider_quota_pool_no_windows: 'No se informaron ventanas de límite de cuenta.',
    provider_quota_account_limits_loaded: 'Límites de cuenta cargados.',
    provider_quota_unavailable: 'Estado de cuota no disponible',
    provider_quota_retry_after: 'Reintentar después de {0}',
    provider_quota_pool_summary_available: '{0}/{1} disponibles',
    provider_quota_pool_summary_exhausted: '{0} agotadas',
    provider_quota_pool_summary_failed: '{0} fallidas',
    provider_quota_pool_summary_checked: '{0} comprobadas',
    cancel: 'Cancelar',
    create_job: 'Crear tarea',
    save_skill: 'Guardar skill',
    editing: 'Editando',
    // Empty state
    empty_title: '¿En qué puedo ayudarte?',
    empty_subtitle: 'Pregunta lo que quieras, ejecuta comandos, explora archivos o gestiona tus tareas programadas.',
    suggest_files: '¿Qué archivos hay en este espacio de trabajo?',
    suggest_schedule: '¿Qué tengo hoy en mi agenda?',
    suggest_plan: 'Ayúdame a planificar un proyecto pequeño.',
    // onboarding
    onboarding_badge: 'PRIMER USO',
    onboarding_title: 'Bienvenido a Hermes Web UI',
    onboarding_lead: 'Una guía rápida verificará Hermes, guardará una configuración real del proveedor, elegirá un espacio de trabajo y un modelo, y opcionalmente protegerá la app con una contraseña.',
    onboarding_back: 'Atrás',
    onboarding_continue: 'Continuar',
    onboarding_skip: 'Omitir configuración',
    onboarding_skipped: 'Configuración omitida — se usa la configuración existente.',
    onboarding_open: 'Abrir Hermes',
    onboarding_step_system_title: 'Comprobación del sistema',
    onboarding_step_system_desc: 'Verifica Hermes Agent y la visibilidad de la configuración.',
    onboarding_step_setup_title: 'Configuración del proveedor',
    onboarding_step_setup_desc: 'Guarda la configuración mínima real de Hermes.',
    onboarding_step_workspace_title: 'Espacio de trabajo + modelo',
    onboarding_step_workspace_desc: 'Elige los valores predeterminados para nuevas sesiones y chats.',
    onboarding_step_password_title: 'Contraseña opcional',
    onboarding_step_password_desc: 'Protege la Web UI antes de compartirla.',
    onboarding_step_finish_title: 'Finalizar',
    onboarding_step_finish_desc: 'Revisa todo y entra en la app.',
    onboarding_notice_system_ready: 'Parece que Hermes Agent está accesible desde la Web UI.',
    onboarding_notice_system_unavailable: 'Hermes Agent todavía no está totalmente disponible. Bootstrap puede instalarlo, pero la configuración del proveedor quizá aún requiera una terminal.',
    onboarding_check_agent: 'Hermes Agent',
    onboarding_check_agent_ready: 'Detectado e importable',
    onboarding_check_agent_missing: 'Falta o solo es parcialmente importable',
    onboarding_check_password: 'Contraseña',
    onboarding_check_password_enabled: 'Ya está activada',
    onboarding_check_password_disabled: 'Todavía no está activada',
    onboarding_check_provider: 'Configuración del proveedor',
    onboarding_check_provider_ready: 'Listo para chatear',
    onboarding_check_provider_partial: 'Guardado pero incompleto',
    onboarding_check_provider_pending: 'Necesita verificación',
    onboarding_config_file: 'Archivo de configuración:',
    onboarding_env_file: 'Archivo .env:',
    onboarding_unknown: 'Desconocido',
    onboarding_current_provider: 'Configuración actual:',
    onboarding_missing_imports: 'Importaciones faltantes:',
    onboarding_notice_setup_required: 'Elige aquí una ruta simple de proveedor. Los flujos OAuth avanzados siguen siendo del CLI de Hermes por ahora.',
    onboarding_notice_setup_already_ready: 'Ya se detectó una configuración funcional del proveedor de Hermes. Puedes conservarla o reemplazarla aquí.',
    onboarding_oauth_provider_ready_title: 'Proveedor ya autenticado',
    onboarding_oauth_provider_ready_body: 'Esta instancia está configurada para usar un proveedor OAuth (<strong>{provider}</strong>) configurado mediante la CLI de Hermes. No se necesita clave API aquí — haz clic en Continuar para finalizar la configuración.',
    onboarding_oauth_provider_not_ready_title: 'Proveedor OAuth no autenticado aún',
    onboarding_oauth_provider_not_ready_body: 'Esta instancia está configurada para usar <strong>{provider}</strong>, que utiliza OAuth en lugar de una clave API. Ejecuta <code>hermes auth</code> o <code>hermes model</code> en una terminal para autenticarte y recarga la interfaz web.',
    onboarding_oauth_switch_hint: 'O elige un proveedor diferente a continuación para cambiar a la configuración con clave API:',
    onboarding_notice_workspace: 'Estos valores reutilizan las mismas APIs de configuración que la app normal.',
    onboarding_workspace_label: 'Espacio de trabajo',
    onboarding_workspace_or_path: 'O introduce la ruta de un espacio de trabajo',
    onboarding_workspace_placeholder: '/home/you/workspace',
    onboarding_provider_label: 'Modo de configuración',
    onboarding_quick_setup_badge: 'configuración rápida',
    provider_category_easy_start: 'Inicio rápido',
    provider_category_self_hosted: 'Local / Open source',
    provider_category_specialized: 'Especializados',
    onboarding_api_key_label: 'API key',
    onboarding_api_key_placeholder: 'Déjala en blanco para conservar una key ya guardada',
    onboarding_api_key_label_optional: 'API key (optional)', // TODO: translate
    onboarding_api_key_placeholder_optional: 'Leave blank for keyless servers', // TODO: translate
    onboarding_api_key_help_keyless: 'Most LM Studio / Ollama / vLLM installs run keyless — leave this blank if your server doesn\'t require authentication. Use the Test connection button to verify.', // TODO: translate
    oauth_login_codex: 'Login with Codex (ChatGPT)', // TODO: translate
    oauth_codex_step1: 'Step 1: Visit this URL and enter the code', // TODO: translate
    oauth_codex_step2: 'Step 2: Enter this code on the page', // TODO: translate
    oauth_codex_polling: 'Waiting for authorization...', // TODO: translate
    oauth_codex_success: 'Codex OAuth login successful!', // TODO: translate
    oauth_codex_error: 'OAuth login failed', // TODO: translate
    oauth_codex_expired: 'Code expired, please try again', // TODO: translate
    onboarding_api_key_help_prefix: 'Se guarda como secreto en tu archivo .env de Hermes usando',
    onboarding_base_url_label: 'Base URL',
    onboarding_base_url_placeholder: 'https://tu-endpoint.example/v1',
    onboarding_base_url_help: 'Úsalo para routers OpenAI-compatible, servidores autoalojados, LiteLLM, Ollama, LM Studio, vLLM o endpoints parecidos.',
    onboarding_model_label: 'Modelo predeterminado',
    onboarding_workspace_help: 'Elige el modelo que Hermes debe usar para nuevos chats cuando termine la configuración.',
    onboarding_custom_model_placeholder: 'tu-modelo',
    onboarding_custom_model_help: 'Para endpoints personalizados, introduce el identificador exacto del modelo que espera tu servidor.',
    onboarding_notice_password_enabled: 'Ya hay una contraseña configurada. Introduce una nueva solo si quieres reemplazarla.',
    onboarding_notice_password_recommended: 'Es opcional, pero recomendable si vas a exponer la UI más allá de localhost.',
    onboarding_password_label: 'Contraseña (opcional)',
    onboarding_password_placeholder: 'Déjala en blanco para omitirla',
    onboarding_password_help: 'Las contraseñas se guardan mediante la API de configuración existente y se hashean en el servidor.',
    onboarding_notice_finish: 'Puedes volver a abrir Configuración más tarde para cambiar cualquiera de estos valores.',
    onboarding_not_set: 'Sin definir',
    onboarding_password_will_enable: 'Se activará',
    onboarding_password_will_replace: 'Se reemplazará',
    onboarding_password_keep_existing: 'Mantener la contraseña actual',
    onboarding_password_remains_disabled: 'Seguirá desactivada',
    onboarding_password_skipped: 'Se omitirá por ahora',
    onboarding_finish_help: 'Al finalizar se guarda <code>onboarding_completed</code> en la configuración y entras en la app normal.',
    onboarding_error_choose_workspace: 'Elige un espacio de trabajo antes de continuar.',
    onboarding_error_choose_model: 'Elige un modelo antes de continuar.',
    onboarding_error_provider_required: 'Elige un modo de configuración antes de continuar.',
    onboarding_error_base_url_required: 'La base URL es obligatoria para endpoints personalizados.',
    onboarding_probe_test_button: 'Test connection', // TODO: translate
    onboarding_probe_probing: 'Testing connection…', // TODO: translate
    onboarding_probe_ok: 'Connected. {n} model(s) available.', // TODO: translate
    onboarding_probe_error_generic: 'Could not reach the configured base URL.', // TODO: translate
    onboarding_probe_error_invalid_url: 'Base URL must start with http:// or https://.', // TODO: translate
    onboarding_probe_error_dns: 'Could not resolve the host. Check the URL or use the host\'s IP address.', // TODO: translate
    onboarding_probe_error_connect_refused: 'Connection refused — the server may not be running on that address. From inside Docker, try the host IP instead of localhost.', // TODO: translate
    onboarding_probe_error_timeout: 'The endpoint did not respond in time. Check that the server is running and the URL is correct.', // TODO: translate
    onboarding_probe_error_http_4xx: 'The endpoint returned a client error. Check authentication and the URL path (typically ends in /v1).', // TODO: translate
    onboarding_probe_error_http_5xx: 'The endpoint returned a server error. Check the LM Studio / Ollama server logs.', // TODO: translate
    onboarding_probe_error_parse: 'The endpoint did not return a model list in the expected shape. Verify the URL points to the OpenAI-compatible API root.', // TODO: translate
    onboarding_probe_error_unreachable: 'Could not reach the configured base URL.', // TODO: translate
    onboarding_error_probe_failed: 'Could not validate the configured base URL.', // TODO: translate
    onboarding_error_workspace_required: 'El espacio de trabajo es obligatorio.',
    onboarding_error_model_required: 'El modelo es obligatorio.',
    onboarding_complete: 'Onboarding completado',

    // panel/runtime i18n
    error_prefix: 'Error: ',
    default: 'default',
    search: 'Search',
    not_available: 'N/A',
    never: 'never',
    add: 'Add',
    add_failed: 'Add failed: ',
    remove_failed: 'Remove failed: ',
    switch_failed: 'Switch failed: ',
    name_required: 'Name is required',
    content_required: 'Content is required',
    view: 'View',
    dismiss: 'Dismiss',
    disable: 'Disable',
    cron_no_jobs: 'No scheduled jobs found.',
    cron_status_off: 'off',
    cron_status_paused: 'paused',
    cron_status_error: 'error',
    cron_status_active: 'active',
    cron_status_running: 'ejecutándose\u2026',
    cron_status_needs_attention: 'needs attention',
    cron_attention_desc: 'This recurring job has no next run time. The scheduler may have failed to compute its next run.',
    cron_attention_croniter_hint: 'The Gateway runtime may be missing the croniter package. Restart the Gateway with cron support, then resume this job.',
    cron_attention_resume: 'Resume and recalculate',
    cron_jobs_project: 'Tareas Programadas',
    cron_attention_run_once: 'Run once now',
    cron_attention_copy_diagnostics: 'Copy diagnostics',
    cron_diagnostics_copied: 'Cron diagnostics copied',
    cron_next: 'Next',
    cron_last: 'Last',
    cron_run_now: 'Run now',
    cron_pause: 'Pause',
    cron_resume: 'Resume',
    cron_job_name_placeholder: 'Job name',
    cron_schedule_placeholder: 'Schedule',
    cron_prompt_placeholder: 'Prompt',
    cron_last_output: 'Last output',
    cron_expand_prompt: 'Expand prompt',
    cron_collapse_prompt: 'Collapse prompt',
    cron_expand_output: 'Expand output',
    cron_collapse_output: 'Collapse output',
    cron_mode_agent: 'Agent',
    cron_mode_script: 'Script',
    cron_mode_label: 'Mode',
    cron_script_job_banner: 'Runs a script on schedule — stdout is delivered to the target. No agent, prompt, or skills.',
    cron_script_card_title: 'Script',
    cron_script_output: 'Script output',
    cron_script_path_label: 'Script path',
    cron_script_path_hint: 'Resolved under ~/.hermes/scripts/ unless an absolute path. Edit the script file on the server to change behavior.',
    cron_script_badge_title: 'Script job (no agent)',
    cron_workdir_label: 'Working directory',
    cron_view_full_output: 'View full output',
    cron_all_runs: 'All runs',
    cron_hide_runs: 'Hide runs',
    cron_no_runs_yet: '(no runs yet)',
    cron_schedule_required_example: 'Schedule is required (e.g. "0 9 * * *" or "every 1h")',
    cron_schedule_required: 'Schedule is required',
    cron_prompt_required: 'Prompt is required',
    cron_job_created: 'Job created',
    cron_duplicate: 'Duplicar',
    cron_duplicated: 'Trabajo duplicado (en pausa)',
    cron_job_triggered: 'Job triggered',
    cron_job_paused: 'Job paused',
    cron_job_resumed: 'Job resumed',
    cron_job_updated: 'Job updated',
    cron_model_label: 'Model Override',
    cron_model_hint: 'Override the default model for this job.',
    cron_model_use_default: 'Default (use profile/system default)',
    cron_delete_confirm_title: 'Delete cron job',
    cron_delete_confirm_message: 'This cannot be undone.',
    cron_job_deleted: 'Job deleted',
    cron_completion_status: (name, status) => `Cron "${name}" ${status}`,
    status_failed: 'failed',
    status_completed: 'completed',
    todos_no_active: 'No active task list in this session.',
    clear_conversation_title: 'Clear conversation',
    clear_conversation_message: 'Clear all messages? This cannot be undone.',
    clear_failed: 'Clear failed: ',
    skills_no_match: 'No skills match.',
    skill_enabled: 'Habilitado',
    skill_disabled: 'Deshabilitado',
    skill_toggle_failed: 'Error al cambiar skill: ',
    linked_files: 'Linked Files',
    skill_load_failed: 'Could not load skill: ',
    skill_file_load_failed: 'Could not load file: ',
    skill_name_required: 'Skill name is required',
    skill_updated: 'Skill updated',
    skill_created: 'Skill created',
    skill_deleted: 'Skill deleted',
    skill_delete_confirm: 'Delete skill "{0}"?',
    skills_empty_title: 'Select a skill',
    skills_empty_sub: 'Pick a skill from the sidebar to view its contents, or create a new one.',
    skills_edit: 'Edit',
    skills_delete: 'Delete',
    skills_back_to: 'Back to {0}',
    tasks_empty_title: 'Select a scheduled job',
    tasks_empty_sub: 'Pick a job from the sidebar to view its details and runs, or create a new one.',
    workspaces_empty_title: 'Select a space',
    workspaces_empty_sub: 'Pick a space from the sidebar to view its files and settings, or add a new one.',
    profiles_empty_title: 'Select a profile',
    profiles_empty_sub: 'Pick an agent profile from the sidebar to view and edit its settings, or create a new one.',
    memory_notes_label: 'memory (notes)',
    memory_saved: 'Memory saved',
    my_notes: 'My Notes',
    user_profile: 'User Profile',
    external_notes_sources: 'Notas de terceros',
    external_notes_empty: 'Aún no hay fuentes MCP de notas o conocimiento visibles. Configura Joplin, Obsidian, Notion, llm-wiki u otro servidor de notas para mostrarlo aquí.',
    external_notes_auto_recall_hint: 'El recuerdo automático de la sesión no cambia; este panel solo muestra fuentes configuradas y herramientas de lectura/búsqueda disponibles.',
    external_notes_no_tools: 'No hay herramientas de lectura/búsqueda visibles actualmente para esta fuente.',
    external_notes_tool_count: (count) => `${count} herramienta${Number(count)===1?'':'s'} de notas disponible${Number(count)===1?'':'s'}`,
    external_notes_configured_hint: 'Se esperan nombres de herramientas de esta fuente configurada; los esquemas en vivo aparecerán cuando el runtime de WebUI los exponga.',
    external_notes_recent_ai: 'Usado recientemente por la IA',
    external_notes_auto: 'auto',
    external_notes_recent_ai_reason: 'Recuerdo automático',
    external_notes_search_placeholder: 'Buscar notas…',
    external_notes_search_empty: 'Busca en una fuente de notas configurada para previsualizar notas aquí.',
    source_active: 'active',
    source_configured: 'configured',
    no_notes_yet: 'No notes yet.',
    no_profile_yet: 'No profile yet.',
    agent_soul: 'Agent Soul',
    no_soul_yet: 'No soul defined yet.',
    workspace_choose_path: 'Choose workspace path',
    workspace_choose_path_meta: 'Add a validated path and switch this conversation',
    workspace_manage: 'Manage workspaces',
    workspace_manage_meta: 'Open the Spaces panel',
    workspace_use_title: 'Use in current session',
    workspace_use: 'Use',
    workspace_add_path_placeholder: 'Add workspace path (e.g. /home/user/my-project)',
    workspace_paths_validated_hint: 'Paths are validated as existing directories before saving.',

    workspace_drag_hint: 'Arrastra para reordenar',
    workspace_reorder_failed: 'Error al reordenar',
    workspace_added: 'Workspace added',
    workspace_renamed: 'Espacio renombrado',
    workspace_remove_confirm_title: 'Remove workspace',
    workspace_remove_confirm_message: (path) => `Remove "${path}"?`,
    workspace_removed: 'Workspace removed',
    workspace_switch_prompt_title: 'Switch workspace',
    workspace_switch_prompt_message: 'Enter an absolute workspace path to add and switch this conversation to.',
    workspace_switch_prompt_confirm: 'Switch',
    workspace_switch_prompt_placeholder: '/Users/you/project',
    workspace_not_added: 'Workspace was not added',
    workspace_already_saved: 'Workspace already saved — choose it from the list',
    workspace_busy_switch: 'Cannot switch workspace while agent is running',
    discard_file_edits_title: 'Discard file edits?',
    discard_file_edits_message: 'Switching workspaces will discard unsaved file edits in the preview.',
    workspace_switched_to: (name) => `Switched to ${name}`,
    profiles_no_profiles: 'No profiles found.',
    profile_api_keys_configured: 'API keys configured',
    profile_gateway_running: 'Gateway running',
    profile_gateway_stopped: 'Gateway stopped',
    profile_active: 'ACTIVE',
    profile_no_configuration: 'No configuration',
    profile_skill_count: (count) => `${count} habilidad${count === 1 ? '' : 'es'}`,
    profile_use: 'Use',
    profile_switch_title: 'Switch to this profile',
    profile_delete_title: 'Eliminar este perfil',
    profile_default_label: '(predeterminado)',
    profile_name_placeholder: 'Nombre del perfil (minúsculas, a-z, 0-9, guiones)',
    profile_clone_label: 'Clonar configuración del perfil activo',
    profile_model_label: 'Modelo / proveedor',
    profile_model_hint: 'Elige entre proveedores y modelos configurados para este nuevo perfil.',
    profile_model_use_default: 'Usar el valor predeterminado del perfil activo',
    profile_base_url_placeholder: 'URL base (opcional, p. ej. http://localhost:11434)',
    profile_api_key_placeholder: 'Clave API (opcional)',
    manage_profiles: 'Manage profiles',
    profiles_load_failed: 'Failed to load profiles',
    profile_switched_new_conversation: (name) => `Switched to profile: ${name} — new conversation started`,
    profile_switched: (name) => `Switched to profile: ${name}`,
    profile_name_rule: 'Lowercase letters, numbers, hyphens, underscores only',
    profile_base_url_rule: 'Base URL must start with http:// or https://',
    profile_created: (name) => `Profile created: ${name}`,
    profile_delete_confirm_title: (name) => `Delete profile "${name}"?`,
    profile_delete_confirm_message: 'Todas las sesiones, configuración, habilidades y memoria de este perfil se eliminarán de forma permanente. Esta acción no se puede deshacer.',
    profile_deleted: (name) => `Profile deleted: ${name}`,
    active_conversation_none: 'No active conversation selected.',
    active_conversation_meta: (title, count) => `${title} · ${count} message${count === 1 ? '' : 's'}`,
    settings_unsaved_changes: 'You have unsaved changes.',
    sign_out_failed: 'Error al cerrar sesión: ',
    disable_auth_confirm_title: 'Desactivar protección por contraseña',
    disable_auth_confirm_message: 'Anyone will be able to access this instance.',
    auth_disabled: 'Autenticación desactivada — protección por contraseña eliminada',
    disable_auth_failed: 'Failed to disable auth: ',
    bg_error_single: (title) => `"${title}" has encountered an error`,
    bg_error_multi: (count) => `${count} sessions have encountered an error`,
    // skill form
    skill_name: 'Nombre',
    skill_category: 'Categoría',
    skill_category_placeholder: 'Opcional, p. ej. devops',
    skill_content: 'Contenido de SKILL.md',
    skill_content_placeholder: 'Frontmatter YAML + cuerpo markdown',
    skill_rename_not_supported: 'No se admite renombrar una habilidad. Crea una nueva y elimina la anterior.',
    skill_metadata: 'Metadatos',
    // cron form
    cron_name_label: 'Nombre',
    cron_name_placeholder: 'Opcional',
    cron_schedule_label: 'Programación',
    cron_schedule_hint: "Usa 'every 1h' o una expresión cron para trabajos recurrentes. Duraciones como '30m' se ejecutan una sola vez.",
    cron_schedule_once_warning: "Las duraciones como '30m' se ejecutan una vez y se eliminan después de correr. Usa 'every 30m' para mantener un trabajo recurrente.",
    cron_prompt_label: 'Prompt',
    cron_deliver_label: 'Entregar salida a',
    cron_deliver_local: 'Local (solo guardar salida)',
    cron_deliver_custom: 'Destino personalizado',
    cron_profile_label: 'Perfil',
    cron_profile_server_default: 'predeterminado del servidor',
    cron_profile_server_default_hint: 'Usa el perfil predeterminado del servidor WebUI durante la ejecución. Los trabajos existentes sin perfil conservan este comportamiento heredado.',
    cron_toast_notifications_label: 'Avisos de finalización',
    cron_toast_notifications_hint: 'Muestra un toast cuando este cron termina. La insignia de Tareas y el marcador de nueva ejecución se actualizan aunque esté desactivado.',
    cron_toast_notifications_enabled: 'Activado',
    cron_toast_notifications_disabled: 'Desactivado',
    cron_skills_label: 'Habilidades',
    cron_skills_placeholder: 'Añadir habilidades (opcional)…',
    cron_skills_edit_hint: 'La lista de habilidades no es editable después de crear.',
    // workspace form
    workspace_name_label: 'Nombre',
    workspace_name_placeholder: 'Nombre opcional',
    workspace_path_label: 'Ruta',
    workspace_path_required: 'La ruta es obligatoria',
    workspace_path_readonly: 'La ruta no se puede cambiar. Solo renombrar.',
    workspace_new_title: 'Nuevo espacio',
    // profile form
    profile_name_label: 'Nombre',
    profile_base_url_label: 'URL base',
    profile_api_key_label: 'Clave API',
  
    cmd_status: 'Show session info',
    // Session management and settings keys (en fallback — pending translation)
    session_archive: 'Archive conversation',
    session_hide_external: 'Ocultar de la lista',
    session_archive_desc: 'Hide this conversation until archived is shown',
    session_archive_worktree_desc: 'Ocultar esta conversación; conservar su worktree en disco',
    session_hide_external_desc: 'Ocultar esta sesión importada de WebUI sin eliminar el historial original.',
    session_archive_failed: 'Archive failed: ',
    session_archived: 'Session archived',
    session_archived_worktree: 'Sesión archivada. El worktree permanece en disco.',
    session_hidden: 'Sesión ocultada de la lista',
    session_delete: 'Delete conversation',
    session_delete_desc: 'Permanently remove this conversation',
    session_delete_confirm: '¿Eliminar esta conversación?',
    session_delete_worktree_desc: 'Eliminar solo la conversación de WebUI; conservar el worktree en disco',
    session_delete_worktree_confirm: (path) => `¿Eliminar esta conversación? El worktree en ${path} permanecerá en disco.`,
    session_deleted: 'Conversación eliminada',
    session_deleted_worktree: 'Conversación eliminada. El worktree permanece en disco.',
    session_worktree_remove: 'Eliminar worktree',
    session_worktree_remove_desc: (path) => `Eliminar el git worktree en ${path} del disco`,
    session_worktree_remove_confirm: (path) => `¿Eliminar el git worktree del disco?\n\nRuta: ${path}\n\nSe eliminará todo el directorio del worktree. Los datos de la sesión permanecen en WebUI.`,
    session_worktree_remove_not_exists: (path) => `El worktree en ${path} ya no existe en el disco.`,
    session_worktree_remove_confirm_label: 'Eliminar',
    session_worktree_removed: 'Worktree eliminado.',
    session_worktree_remove_failed: 'Error al eliminar worktree: ',
    session_worktree_remove_status_failed: 'Error al leer el estado del worktree: ',
    session_worktree_remove_locked_by_stream: 'No se puede eliminar — una sesión de streaming activa está usando este worktree.',
    session_worktree_remove_locked_by_terminal: 'No se puede eliminar — una sesión de terminal activa está usando este worktree.',
    session_worktree_remove_unsafe_blocked: 'Resuelve los cambios locales o los commits no enviados antes de eliminar este worktree.',
    session_worktree_remove_dirty_warning: 'ADVERTENCIA: Este worktree tiene cambios no confirmados que se perderán.',
    session_worktree_remove_untracked_warning: (count) => `${count} archivo(s) no rastreados se eliminarán permanentemente.`,
    session_worktree_remove_ahead_warning: (ahead) => `${ahead} commit(s) no enviados se perderán.`,
    session_duplicate: 'Duplicate conversation',
    session_duplicate_desc: 'Create a copy with the same workspace and model',
    session_duplicate_failed: 'Duplicate failed: ',
    session_stop_response: 'Stop response',
    session_stop_response_desc: 'Cancel the running response for this conversation',
    session_duplicated: 'Session duplicated',
    session_move_project: 'Move to project',
    session_move_project_desc_has: 'Change the project for this conversation',
    session_move_project_desc_none: 'Assign a project to this conversation',
    session_pin: 'Pin conversation',
    session_pin_desc: 'Keep this conversation at the top',
    session_pin_failed: 'Pin failed: ',
    session_restore: 'Restore conversation',
    session_restore_desc: 'Bring this conversation back into the main list',
    session_restored: 'Session restored',
    session_unpin: 'Unpin conversation',
    session_unpin_desc: 'Remove from pinned',
    session_select_mode: 'Seleccionar',
    session_select_mode_desc: 'Selecciona conversaciones para gestión masiva',
    session_select_all: 'Seleccionar todo',
    session_deselect_all: 'Deseleccionar todo',
    session_selected_count: '{0} seleccionadas',
    session_batch_archive: 'Archivar',
    session_batch_delete: 'Eliminar',
    session_batch_move: 'Mover al proyecto',
    session_batch_delete_confirm: '¿Eliminar {0} conversaciones?',
    session_batch_archive_confirm: '¿Archivar {0} conversaciones?',
    session_batch_delete_worktree_confirm: '¿Eliminar {0} conversaciones? {1} conversaciones con worktree dejarán sus directorios de worktree en disco.',
    session_batch_archive_worktree_confirm: '¿Archivar {0} conversaciones? {1} conversaciones con worktree conservarán sus directorios de worktree en disco.',
    session_no_selection: 'Ninguna conversación seleccionada',
    settings_dropdown_appearance: 'Appearance',
    settings_dropdown_conversation: 'Conversation',
    settings_dropdown_preferences: 'Preferences',
    settings_dropdown_providers: 'Providers',
    settings_dropdown_system: 'System',
    settings_heading_subtitle: 'Preferences, conversation tools, and system controls.',
    settings_heading_title: 'Control Center',
    settings_section_appearance_meta: 'Theme, accent colors, and visual style.',
    settings_section_appearance_title: 'Appearance',
    settings_section_conversation_title: 'Conversation',
    settings_section_preferences_meta: 'Defaults and UI behavior for Hermes Web UI.',
    settings_section_preferences_title: 'Preferences',
    settings_section_system_meta: 'Instance version and access controls.',
    settings_check_now: 'Comprobar ahora',
    settings_checking: 'Comprobando\u2026',
    settings_up_to_date: 'Actualizado \u2713',
    settings_updates_available: '{count} actualización(es) disponible(s)',
    settings_updates_disabled: 'Comprobación de actualizaciones desactivada',
    settings_update_check_failed: 'Error al comprobar actualizaciones',
    settings_label_workspace_panel_open: 'Mantener panel de espacio abierto',
    settings_desc_workspace_panel_open: 'Al activar, el panel de archivos se abre automáticamente en cada nueva sesión. Aún puedes cerrarlo manualmente.',
    settings_label_session_jump_buttons: 'Mostrar botones de salto de sesión',
    settings_desc_session_jump_buttons: 'Muestra botones flotantes de Inicio y Fin al leer historiales de sesión largos.',
    settings_label_terminal_auto_expand: 'Expandir terminal automáticamente al recibir salida',
    settings_desc_terminal_auto_expand: 'Expandir automáticamente el panel de terminal contraído cuando un comando en ejecución emite nueva salida.',

    settings_label_session_endless_scroll: 'Cargar mensajes antiguos al desplazarse hacia arriba',

    settings_desc_session_endless_scroll: 'Si está activado, los mensajes antiguos se cargan automáticamente al desplazarte hacia arriba. Si está desactivado, usa el botón de mensajes antiguos.',
    settings_label_auto_scroll_follow: 'Seguir automáticamente el contenido nuevo',
    settings_desc_auto_scroll_follow: 'Si está activado, la vista se desplaza hacia abajo a medida que llegan nuevos tokens. Si está desactivado, controlas tú la posición de desplazamiento.',
    settings_label_worklog_details_expanded_default: 'Open Worklog details automatically',
    settings_desc_worklog_details_expanded_default: 'When enabled, new Worklog details start expanded so tool, thinking, and progress cards are visible without an extra click. When off, Worklog details stay folded by default; per-turn manual collapse/expand choices still win.',
    settings_label_chat_activity_display_mode: 'Activity display',
    settings_desc_chat_activity_display_mode: 'Compact Worklog groups supporting activity into a quiet summary. Transparent Stream keeps each thinking/tool event as its own chronological expandable row.',
    first_token_time: 'Time to first token',
    done: 'Done',
    settings_option_compact_worklog: 'Compact Worklog',
    settings_option_transparent_stream: 'Transparent Stream',

    settings_label_tab_visibility: 'Pestañas de la barra lateral',
    settings_desc_tab_visibility: 'Elige qué pestañas aparecen en la barra lateral y el rail. Chat y Configuración siempre están visibles.',
    open_in_browser: 'Abrir en el navegador',
    settings_section_system_title: 'System',
    settings_tab_appearance: 'Appearance',
    settings_tab_conversation: 'Conversation',
    settings_tab_preferences: 'Preferences',
    settings_tab_plugins: 'Plugins',
    settings_plugins_title: 'Plugins',  // TODO: translate
    plugins_enable_toggle: 'Activar',
    settings_plugins_meta: 'View installed Hermes plugins and the lifecycle hooks they register. This panel is read-only.',  // TODO: translate
    settings_plugins_empty: 'No Hermes plugins are currently visible. Install or enable plugins from the Hermes CLI/config to see them here.',  // TODO: translate
    plugins_unnamed: 'Unnamed plugin',  // TODO: translate
    plugins_no_description: 'No description provided.',  // TODO: translate
    plugins_no_hooks: 'No registered lifecycle hooks',  // TODO: translate
    plugins_registered_hooks: 'Registered hooks',  // TODO: translate
    plugins_enabled: 'Enabled',  // TODO: translate
    plugins_disabled: 'Disabled',  // TODO: translate
    plugins_active_provider: 'Active (provider)',  // TODO: translate
    plugins_provider_no_hooks: 'Provider plugin — no agent-visibility hooks',  // TODO: translate
    plugins_load_failed: 'Failed to load plugins: ',  // TODO: translate
    settings_tab_system: 'System',
    settings_tab_help: 'Help',
    settings_help_meta: 'Resources and support for Hermes WebUI.',
    settings_help_docs_label: 'Documentation',
    settings_help_docs_desc: 'Guides, configuration reference, and the full Hermes WebUI README.',
    settings_help_docs_link: 'Open Documentation',
    settings_help_issue_label: 'Having an issue?',
    settings_help_issue_desc: 'Search existing reports or open a new one on GitHub.',
    settings_help_issue_link: 'Open GitHub Issues',
    status_updated: 'Updated',
    status_ephemeral: 'Ephemeral snapshot — not saved to transcript history.',
    status_no_tokens: 'No token data',
    status_profile: 'Profile',
    status_hermes_home: 'Hermes home',
    status_started: 'Started',
    status_tokens: 'Tokens',
    status_unknown: 'Unknown',
    cmd_yolo: 'Alternar modo YOLO (saltar aprobaciones)',
    cmd_branch:'Fork this conversation into a new session',
    cmd_branch_usage:'/branch [name] — fork conversation (optionally with a name)',
    branch_forked:'Forked into new session',
    branch_failed:'Fork failed: ',
    fork_from_here:'Fork from here',
    forked_from:'Forked from',
    yolo_no_session: 'No hay sesión activa',
    yolo_enabled: '⚡ Modo YOLO activado — aprobaciones omitidas',
    yolo_disabled: 'Modo YOLO desactivado',
    yolo_pill_label: 'YOLO',
    yolo_pill_title_active: 'Modo YOLO activo — haz clic para desactivar',
    approval_skip_all: '⚡ Saltar todo en esta sesión',
    approval_skip_all_title: 'Saltar todas las solicitudes de aprobación en esta sesión',
    // composer action tooltips
    composer_send: 'Enviar mensaje',
    composer_queue: 'Poner en cola',
    composer_interrupt: 'Interrumpir y enviar',
    composer_steer: 'Dirigir respuesta actual',
    composer_stop: 'Detener generación',
    composer_disabled_clarify: 'Responde a la solicitud de aclaración',
    composer_disabled_compression: 'Esperando a que finalice la compresión',
    composer_compression_will_queue: 'Type a message — it will queue and send after compression',
    composer_disabled_empty: 'Escribe un mensaje para enviar',
    composer_mobile_workspace: 'Espacio de trabajo',
    composer_mobile_model: 'Modelo',
    composer_mobile_reasoning: 'Razonamiento',
    composer_mobile_context: 'Contexto',
    media_audio_label: 'Audio',
    media_svg_label: 'Diagrama',
    media_video_label: 'Vídeo',
    media_download: 'Descargar',
    csv_loading: 'Cargando CSV',
    csv_too_large: 'Archivo CSV demasiado grande para mostrar en línea',
    csv_no_data: 'El archivo CSV no tiene suficientes datos para mostrar como tabla',
    csv_error: 'Error al cargar el archivo CSV',
    csv_header_note: 'La primera fila se muestra como encabezado de tabla',
    excalidraw_loading: 'Cargando diagrama',
    excalidraw_too_large: 'Archivo Excalidraw demasiado grande para mostrar en línea',
    excalidraw_invalid: 'Formato de archivo Excalidraw no válido',
    excalidraw_error: 'Error al cargar archivo Excalidraw',
    excalidraw_label: 'Diagrama',
    excalidraw_download: 'Descargar',
    excalidraw_empty: 'Diagrama vacío',
    excalidraw_render_error: 'Error al renderizar el diagrama',
    excalidraw_simplified: 'Vista previa SVG simplificada — no es idéntica al lienzo de Excalidraw',
    pdf_loading: 'Cargando PDF {0}…',
    pdf_too_large: 'PDF demasiado grande para vista previa',
    pdf_no_pages: 'No se pudo renderizar la vista previa del PDF',
    pdf_error: 'Error al cargar el PDF',
    pdf_download: 'Descargar PDF',
    html_loading: 'Cargando vista previa de HTML…',
    html_too_large: 'HTML demasiado grande para vista previa',
    html_error: 'Error al cargar la vista previa de HTML',
    html_open_full: 'Abrir página completa',
    html_sandbox_label: 'Vista previa de HTML',
    // TTS (#499)
    tts_listen: 'Escuchar',
    tts_not_supported: 'Síntesis de voz no disponible',
    settings_label_tts: 'Texto a voz para respuestas',
    settings_desc_tts: 'Mostrar botón de altavoz en mensajes del asistente',
    settings_label_tts_auto_read: 'Leer respuestas automáticamente',
    settings_desc_tts_auto_read: 'Leer en voz alta las respuestas del asistente automáticamente',
    // Composer voice-mode pref (#1488)
    settings_label_voice_mode: 'Hands-free voice mode button',  // TODO: translate
    settings_desc_voice_mode: 'Show the voice-mode button (audio waveform) next to the dictation mic. Lets you speak naturally — Hermes auto-sends after a pause and reads replies aloud. Requires a browser that supports both speech recognition and TTS.',
    settings_label_raw_audio: 'Send raw audio instead of transcribing',
    settings_desc_raw_audio: 'Record and send the original audio file to the agent instead of converting it to text first. The agent can then transcribe it or process the raw audio (emotion, background noise, custom STT). Like Telegram\'s voice message behavior.',
    voice_send_raw: 'Send raw audio',
    voice_raw_attached: 'Audio attached. Press Send or type more.',  // TODO: translate
    settings_label_tts_voice: 'Voz',
    settings_desc_tts_voice: 'Seleccionar voz para síntesis de voz',
    settings_label_tts_rate: 'Velocidad de voz',
    settings_label_tts_pitch: 'Tono de voz',
    settings_label_tts_engine: 'Motor TTS',
    settings_desc_tts_engine: 'Elija el motor de voz. Edge TTS utiliza voces neuronales de Microsoft a través del servidor.',
    checkpoint_date: 'Date',  // TODO: translate
    checkpoint_diff_files_changed: (n) => `${n} file${n === 1 ? '' : 's'} changed`,  // TODO: translate
    checkpoint_diff_no_changes: 'No differences found between this checkpoint and the current workspace.',  // TODO: translate
    checkpoint_diff_title: 'Changes in checkpoint',  // TODO: translate
    checkpoint_empty: 'No checkpoints found for this workspace.',  // TODO: translate
    checkpoint_error: 'Failed to load checkpoints',  // TODO: translate
    checkpoint_files: 'Files',  // TODO: translate
    checkpoint_loading: 'Loading checkpoints…',  // TODO: translate
    checkpoint_message: 'Message',  // TODO: translate
    checkpoint_restore: 'Restore',  // TODO: translate
    checkpoint_restore_confirm_message: (ckpt) => `Restore workspace to checkpoint "${ckpt}"? This will overwrite files with the saved versions. Files added after this checkpoint will not be deleted.`,  // TODO: translate
    checkpoint_restore_confirm_title: 'Restore checkpoint?',  // TODO: translate
    checkpoint_restored: 'Checkpoint restored',  // TODO: translate
    checkpoint_title: 'Checkpoints',  // TODO: translate
    checkpoint_view_diff: 'View diff',  // TODO: translate
    insights_activity_by_day: 'Activity by Day',  // TODO: translate
    insights_activity_by_hour: 'Activity by Hour',  // TODO: translate
    insights_cost: 'Estimated Cost',  // TODO: translate
    insights_daily_tokens: 'Daily Tokens',
    insights_model_name: 'Model',
    insights_model_sessions: 'Sessions',
    insights_model_tokens: 'Tokens',
    insights_model_cost: 'Cost',
    insights_model_share: 'Share',
    insights_no_usage_data: 'No usage data yet',
    insights_footer: 'Showing data from the last {days} days',  // TODO: translate
    insights_skill_usage_title: 'Skill Usage',  // TODO: translate
    insights_skill_usage_sub: 'Tool invocation frequency',  // TODO: translate
    insights_skill_usage_total: 'Total invocations',  // TODO: translate
    insights_skill_usage_skills_used: 'Skills used',  // TODO: translate
    insights_skill_usage_no_data: 'No skill usage data yet',  // TODO: translate
    insights_skill_usage_no_data_hint: 'Skills will appear here once used in conversations.',  // TODO: translate
    insights_skill_usage_footer: 'Counts from ~/.hermes/skills/',  // TODO: translate
    insights_skill_usage_col_skill: 'Skill',  // TODO: translate
    insights_skill_usage_col_uses: 'Uses',  // TODO: translate
    insights_skill_usage_col_views: 'Views',  // TODO: translate
    insights_skill_usage_col_share: 'Usage %',  // TODO: translate
    insights_skill_usage_col_patches: 'Patches',  // TODO: translate
    insights_input_tokens: 'Input',  // TODO: translate
    insights_messages: 'Messages',  // TODO: translate
    insights_models: 'Models',  // TODO: translate
    insights_no_cost: 'N/A',  // TODO: translate
    insights_output_tokens: 'Output',  // TODO: translate
    insights_peak_hour: 'Peak: {hour}',  // TODO: translate
    insights_sessions: 'Sessions',  // TODO: translate
    insights_title: 'Usage Analytics',  // TODO: translate
    insights_token_breakdown: 'Token Breakdown',  // TODO: translate
    insights_tokens: 'Tokens',  // TODO: translate
    insights_total: 'Total',  // TODO: translate
    settings_desc_api_redact: 'Self-hosted users can disable for transparency (not recommended for shared instances).',  // TODO: translate
    settings_label_api_redact: 'Redact sensitive data in API responses',  // TODO: translate
    voice_error: 'Voice not supported in this browser',  // TODO: translate
    voice_listening: 'Listening…',  // TODO: translate
    voice_mode_active: 'Voice mode on',  // TODO: translate
    voice_mode_off: 'Voice mode off',  // TODO: translate
    voice_speaking: 'Speaking…',  // TODO: translate
    voice_thinking: 'Thinking…',  // TODO: translate
    // Composer voice buttons (#1488)
    voice_dictate: 'Dictate',  // TODO: translate
    voice_dictate_active: 'Stop dictation',
    voice_recording_active: 'Detener grabación',  // TODO: translate
    voice_mode_toggle: 'Voice mode',  // TODO: translate
    voice_mode_toggle_active: 'Exit voice mode',  // TODO: translate
    subagent_children: 'Subagent sessions',  // TODO: translate
    outline_title: 'Esquema',
    outline_empty: 'Aún no hay preguntas.',
    outline_loading: 'Cargando…',
  },

  de: {
    offline_title: 'Verbindung verloren',
    offline_browser_detail: 'Dein Browser meldet, dass dieses Gerät offline ist.',
    offline_network_detail: 'Hermes ist von diesem Browser aus gerade nicht erreichbar.',
    offline_autorefresh: 'Ich aktualisiere diese Seite automatisch, sobald Hermes wieder erreichbar ist.',
    offline_check_now: 'Jetzt prüfen',
    offline_checking: 'Prüfe…',
    offline_stream_waiting: 'Verbindung verloren. Warte auf Aktualisierung…',
    _lang: 'de',
    _label: 'Deutsch',
    _speech: 'de-DE',
    // boot.js
    cancelling: 'Wird abgebrochen\u2026',
    cancel_failed: 'Abbrechen fehlgeschlagen: ',
    mic_denied: 'Mikrofonzugriff verweigert. Überprüfen Sie die Browserberechtigungen.',
    mic_no_speech: 'Keine Sprache erkannt. Versuchen Sie es erneut.',
    mic_network: 'Spracherkennung nicht verfügbar.',
    mic_error: 'Spracheingabefehler: ',
    session_imported: 'Sitzung importiert',
    import_failed: 'Import fehlgeschlagen: ',
    import_invalid_json: 'Ungültiges JSON',
    image_pasted: 'Bild eingefügt: ',
    // messages.js
    edit_message: 'Nachricht bearbeiten',
    regenerate: 'Antwort regenerieren',
    copy: 'Kopieren',
    copied: 'Kopiert!',
    copy_failed: 'Kopieren fehlgeschlagen',
    selected_text_reply: 'Mit Auswahl antworten',
    selected_text_reply_title: 'Ausgewählten Chattext als Zitatkontext anhängen',
    selected_text_reply_appended: 'Auswahl zum Composer hinzugefügt',
    saved_prompts_empty: 'Noch keine gespeicherten Eingabeaufforderungen.',
    saved_prompts_save_current: 'Aktuelle Eingabe als Eingabeaufforderung speichern',
    saved_prompts_saved: 'Eingabeaufforderung gespeichert',
    saved_prompts_delete: 'Eingabeaufforderung löschen',
    saved_prompts_empty_input: 'Gib zuerst eine Eingabeaufforderung ein',

    diff_loading: 'Lade Diff',
    diff_error: 'Patch-Datei konnte nicht geladen werden',
    diff_too_large: 'Patch-Datei zu groß für Inline-Anzeige',
    tree_view: 'Baum',
    raw_view: 'Rohdaten',
    parse_failed_note: 'parse failed',
    you: 'Du',
    mcp_servers_title: 'MCP-Server',
    mcp_servers_desc: 'MCP-Server in config.yaml verwalten.',
    mcp_no_servers: 'Keine MCP-Server konfiguriert.',
    mcp_add_server: '+ Server hinzufügen',
    mcp_field_name: 'Servername',
    mcp_transport_label: 'Transporttyp',
    mcp_field_command: 'Befehl',
    mcp_field_args: 'Argumente (kommagetrennt)',
    mcp_field_url: 'URL',
    mcp_field_timeout: 'Timeout (Sekunden)',
    mcp_save: 'Speichern',
    mcp_cancel: 'Abbrechen',
    mcp_name_required: 'Servername ist erforderlich.',
    mcp_url_required: 'URL für HTTP-Transport erforderlich.',
    mcp_command_required: 'Befehl für stdio-Transport erforderlich.',
    mcp_saved: 'MCP-Server gespeichert.',
    mcp_save_failed: 'Fehler beim Speichern.',
    mcp_delete_confirm_title: 'MCP-Server löschen',
    mcp_delete_confirm_message: 'MCP-Server «{0}» löschen? Dies kann nicht rückgängig gemacht werden.',
    mcp_deleted: 'MCP-Server gelöscht.',
    mcp_delete_failed: 'Fehler beim Löschen.',
    mcp_load_failed: 'Fehler beim Laden.',
    mcp_restart_hint: 'Server changes are read-only here for now. Edit config.yaml and restart Hermes for changes to take effect.',
    mcp_toggle_followup: 'Enable/disable controls are intentionally deferred until MCP reload semantics are explicit.',
    mcp_status_active: 'Active',
    mcp_status_configured: 'Configured',
    mcp_status_disabled: 'Disabled',
    mcp_status_invalid_config: 'Invalid config',
    mcp_status_unknown: 'Unknown',
    mcp_tool_count: '{0} tools',
    mcp_enabled_yes: 'Enabled',
    mcp_enabled_no: 'Disabled',
    mcp_enable_server: 'Enable this MCP server',
    mcp_disable_server: 'Disable this MCP server',
    mcp_enabled_toast: (name) => `MCP server "${name}" enabled.`,
    mcp_disabled_toast: (name) => `MCP server "${name}" disabled.`,
    mcp_toggle_failed: 'Failed to update MCP server.',
    mcp_tools_title: 'MCP Tools',
    mcp_tools_desc: 'Search known tools across active MCP servers.',
    mcp_tools_search_placeholder: 'Search tools by name, server, or description…',
    mcp_tools_no_tools: 'No MCP tools are available from the active runtime inventory.',
    mcp_tools_no_matches: 'No MCP tools match your search.',
    mcp_tools_load_failed: 'Failed to load MCP tools.',
    mcp_tools_schema_empty: 'No schema parameters.',
    mcp_tools_runtime_note: 'Tool inventory only uses already-known active MCP runtime data; the WebUI does not start or probe servers.',
    mcp_tools_summary_no_matches: (query,total) => `No MCP tools matching “${query}” (${total} total MCP tools).`,
    mcp_tools_summary_none: 'No MCP tools to show.',
    mcp_tools_summary_matching: (query) => ` matching “${query}”`,
    mcp_tools_summary_total_note: (total) => ` (${total} total MCP tools)`,
    mcp_tools_summary_showing: (start,end,filtered,searchNote,totalNote,page,pages) => `Showing ${start}-${end} of ${filtered} MCP tools${searchNote}${totalNote}. Page ${page} of ${pages}.`,
    mcp_tools_page_size_prefix: 'Show',
    mcp_tools_page_size_suffix: 'per page',
    mcp_tools_per_page_aria: 'MCP tools per page',
    mcp_tools_inactive_configured_servers: (servers) => `Configured but inactive in this WebUI runtime: ${servers}.`,
    mcp_tools_pagination_label: 'MCP tools pagination',
    mcp_tools_previous_page: '‹ Prev',
    mcp_tools_previous_page_aria: 'Previous MCP tools page',
    mcp_tools_next_page: 'Next ›',
    mcp_tools_next_page_aria: 'Next MCP tools page',
    thinking: 'Nachdenken',
    expand_all: 'Alle ausklappen',
    collapse_all: 'Alle einklappen',
    edit_failed: 'Bearbeiten fehlgeschlagen: ',
    regen_failed: 'Regeneration fehlgeschlagen: ',
    reconnect_active: 'Eine Antwort wird noch generiert. Neu laden, wenn bereit?',
    reconnect_finished: 'Eine Antwort war in Arbeit, als Sie zuletzt gegangen sind. Nachrichten könnten aktualisiert worden sein.',
    // approval card
    approval_heading: 'Genehmigung erforderlich',
    approval_desc_prefix: 'Gefährlicher Befehl erkannt',
    approval_btn_once: 'Einmal zulassen',
    approval_btn_once_title: 'Diesen einen Befehl zulassen (Enter)',
    approval_btn_session: 'Sitzung zulassen',
    approval_btn_session_title: 'Für diese Konversationssitzung zulassen',
    approval_btn_always: 'Immer zulassen',
    approval_btn_always_title: 'Dieses Befehlsmuster immer zulassen',
    approval_btn_deny: 'Ablehnen',
    approval_btn_deny_title: 'Ablehnen \u2014 diesen Befehl nicht ausführen',
    approval_responding: 'Antwortet\u2026',
    clarify_heading: 'Klärung erforderlich',
    clarify_hint: 'Wähle eine Option oder schreibe deine eigene Antwort unten.',
    clarify_other: 'Andere',
    clarify_send: 'Senden',
    clarify_input_placeholder: 'Gib deine Antwort ein…',
    clarify_responding: 'Antwortet\u2026',
    session_attention_approval: (n) => n === 1 ? 'Freigabe' : `${n} Freigaben`,
    session_attention_clarify: (n) => n === 1 ? 'Frage' : `${n} Fragen`,
    session_attention_generic: (n) => n === 1 ? 'Achtung' : `${n} Hinweise`,
    session_attention_approval_title: 'Wartet auf deine Freigabeentscheidung',
    session_attention_clarify_title: 'Wartet auf deine Antwort',
    session_attention_generic_title: 'Wartet auf eine Benutzeraktion',
    untitled: 'Unbenannt',
    n_messages: (n) => `${n} Nachrichten`,
    load_older_messages: '↑ Nach oben scrollen oder klicken, um ältere Nachrichten zu laden',
    session_jump_start: 'Anfang',
    session_jump_start_label: 'Zum Anfang der Sitzung springen',
    session_jump_end: 'Ende',
    session_jump_end_label: 'Zum Ende der Sitzung springen',
    session_new_message: 'Neue Nachricht',
    session_new_message_label: 'Neue Nachricht verfügbar, zum Ende springen',
    jump_to_question: 'zur Antwort',
    jump_to_question_label: 'Zum Anfang dieser Antwort springen',
    queued_label: 'Wird nach Antwort gesendet',
    queued_count: (n) => n === 1 ? '1 in Warteschlange' : `${n} in Warteschlange`,
    queued_cancel: 'Nachricht abbrechen',
    model_unavailable: ' (nicht verfügbar)',
    model_unavailable_title: 'Dieses Modell ist nicht mehr in Ihrer aktuellen Provider-Liste',
    provider_mismatch_warning: (m,p)=>`"${m}" funktioniert möglicherweise nicht mit Ihrem konfigurierten Provider (${p}). Trotzdem senden, oder \`hermes model\` im Terminal ausführen.`,
    provider_mismatch_label: 'Provider-Konflikt',
    gateway_auth_label: 'Gateway-Authentifizierung fehlgeschlagen',
    model_not_found_label: 'Modell nicht gefunden',
    // commands.js
    cmd_help: 'Verfügbare Befehle auflisten',
    archive_extracted: (n, c) => `${n} Datei(en) aus ${c} Archiv(en) entpackt`,
    cmd_clear: 'Konversationsverlauf löschen',
    cmd_compress: 'Kontext manuell komprimieren (Nutzung: /compress [Thema])',
    ctx_compress_hint: 'Kontext komprimieren um Platz zu schaffen →',
    ctx_compress_action: '⚠ Jetzt komprimieren um Kontext freizugeben',
    cmd_compact_alias: 'Alte Alias für /compress',
    cmd_model: 'Modell wechseln (z.B. /model gpt-4o)',
    cmd_workspace: 'Workspace nach Namen wechseln',
    cmd_terminal: 'Workspace-Terminal öffnen',
    cmd_new: 'Neue Chat-Sitzung starten',
    cmd_usage: 'Token-Verbrauchsanzeige umschalten',
    cmd_theme: 'Darstellung wechseln (Theme: system/dark/light, Skin: default/ares/mono/graphite/slate/poseidon/sisyphus/charizard/sienna/catppuccin/nous/geist-contrast/zeus/verdigris)',
    cmd_personality: 'Agenten-Persönlichkeit wechseln',
    cmd_skills: 'Verfügbare Hermes-Skills auflisten',
    cmd_use: 'Einen Skill für die nächste Nachricht erzwingen',
    available_commands: 'Verfügbare Befehle:',
    type_slash: 'Tippe / für Befehle',
    conversation_cleared: 'Konversation gelöscht',
    command_label: 'Befehl',
    context_compaction_label: 'Kontextkomprimierung',
    retrieval_context_label: 'Indizierter Kontext',
    retrieval_context_preview: 'Frühere Nachrichten sind gespeichert und über Kontextwerkzeuge abrufbar',
    preserved_task_list_label: 'Beibehaltene Aufgabenliste',
    reference_only_label: 'Nur Referenz',
    model_usage: 'Nutzung: /model <name>',
    no_model_match: 'Kein Modell gefunden für "',
    model_did_you_mean: (m) => ` — meintest du "${m}"?`,
    switched_to: 'Gewechselt zu ',
    workspace_usage: 'Nutzung: /workspace <name>',
    no_workspace_match: 'Kein Workspace gefunden für "',
    switched_workspace: 'Gewechselt zu Workspace: ',
    workspace_switch_failed: 'Workspace-Wechsel fehlgeschlagen: ',
    new_session: 'Neue Sitzung erstellt',
    new_session_creating: 'Neue Unterhaltung wird erstellt…',
    compressing: 'Kontext-Komprimierung wird angefordert...',
    compress_running_label: 'Komprimierung',
    compress_complete_label: 'Komprimierung abgeschlossen',
    auto_compress_label: 'Automatische Komprimierung',
    compress_failed_label: 'Komprimierung fehlgeschlagen',
    focus_label: 'Thema',
    token_usage_on: 'Token-Verbrauch an',
    usage_personality_none: 'none', // TODO: translate
    token_usage_off: 'Token-Verbrauch aus',
    usage_cache_hit_detail: 'Cache: {0}% Treffer ({1} gelesen / {2} geschrieben)',
    usage_cached_percent: '{0}% im Cache',
    theme_usage: 'Nutzung: /theme ',
    theme_set: 'Theme: ',
    no_active_session: 'Keine aktive Sitzung',
    model_scope_advisory: 'Gilt für diesen Chat ab Ihrer nächsten Nachricht.',
    model_scope_toast: 'Gilt für diesen Chat ab Ihrer nächsten Nachricht.',
    cmd_queue: 'Nachricht f\u00fcr den n\u00e4chsten Durchgang einreihen',
    cmd_goal: 'Ein dauerhaftes Ziel setzen oder prüfen',
    goal_evaluating_progress: 'Evaluating goal progress…',
    goal_working_toward: 'Working toward goal…',
    goal_continuing_toast: 'Continuing toward goal…',
    goal_status_none: 'No active goal. Set one with /goal <text>.',
    goal_status_active: (turns, max_turns, goal) => `⊙ Goal (active, ${turns}/${max_turns} turns): ${goal}`,
    goal_status_paused: (turns, max_turns, reason, goal) => `⏸ Goal (paused, ${turns}/${max_turns}${reason ? `, ${reason}` : ''}): ${goal}`,
    goal_status_done: (turns, max_turns, goal) => `✓ Goal done (${turns}/${max_turns}): ${goal}`,
    goal_set: (turns, goal) => `⊙ Goal set (${turns}-turn budget): ${goal}`,
    goal_paused: (goal) => `⏸ Goal paused: ${goal}`,
    goal_resumed: (goal) => `▶ Goal resumed: ${goal}`,
    goal_cleared: 'Goal cleared.',
    goal_no_goal: 'No active goal.',
    goal_achieved: (reason) => `✓ Goal achieved: ${reason}`,
    goal_paused_budget_exhausted: (turns, max_turns) => `⏸ Goal paused — ${turns}/${max_turns} turns used. Use /goal resume to keep going, or /goal clear to stop.`,
    goal_continuing: (turns, max_turns, reason) => `↻ Continuing toward goal (${turns}/${max_turns}): ${reason}`,
    cmd_interrupt: 'Aktuellen Durchgang abbrechen und neue Nachricht senden',
    cmd_steer: 'Korrektursignal einf\u00fcgen ohne Unterbrechung',
    cmd_queue_no_msg: 'Verwendung: /queue <Nachricht>',
    cmd_queue_not_busy: 'Keine aktive Aufgabe \u2014 normal senden',
    cmd_queue_confirm: 'Nachricht eingereiht',
    cmd_interrupt_no_msg: 'Verwendung: /interrupt <Nachricht>',
    cmd_interrupt_confirm: 'Unterbrochen \u2014 neue Nachricht wird gesendet',
    cmd_steer_no_msg: 'Verwendung: /steer <Nachricht>',
    cmd_steer_fallback: 'Steer nicht verf\u00fcgbar \u2014 f\u00fcr n\u00e4chsten Durchgang eingereiht',
    cmd_steer_delivered: 'Steer geliefert \u2014 der Agent sieht es bei seinem n\u00e4chsten Tool-Ergebnis',
    steer_leftover_queued: 'Steer f\u00fcr n\u00e4chsten Durchgang eingereiht',
    busy_steer_fallback: 'Steer nicht verf\u00fcgbar \u2014 f\u00fcr n\u00e4chsten Durchgang eingereiht',
    busy_interrupt_confirm: 'Unterbrochen \u2014 neue Nachricht wird gesendet',
    settings_label_busy_input_mode: 'Eingabemodus bei Besch\u00e4ftigung',
    settings_desc_busy_input_mode: 'Steuert, was passiert, wenn Sie w\u00e4hrend der Agentenaktivit\u00e4t eine Nachricht senden. Warteschlange wartet; Unterbrechen bricht ab und startet neu; Steer f\u00fcgt eine Korrektur ein ohne zu unterbrechen.',
    settings_label_fade_text_effect: 'Text-Fade-Effekt',
    settings_desc_fade_text_effect: 'Blendet neu gestreamte Wörter während der Antwort des Assistenten sanft ein. Ähnlich wie OpenWebUI; für maximale Leistung standardmäßig deaktiviert.',
    settings_busy_input_mode_queue: 'In Warteschlange einreihen',
    settings_busy_input_mode_interrupt: 'Aktuellen Durchgang unterbrechen',
    settings_busy_input_mode_steer: 'Steer (Korrektur ohne Unterbrechung)',
    no_personalities: 'Keine Persönlichkeiten gefunden (füge sie in ~/.hermes/personalities/ hinzu)',
    available_personalities: 'Verfügbare Persönlichkeiten:',
    personality_switch_hint: '\n\nNutze `/personality <name>` zum Wechseln, oder `/personality none` zum Löschen.',
    personalities_load_failed: 'Fehler beim Laden der Persönlichkeiten',
    personality_cleared: 'Persönlichkeit gelöscht',
    personality_set: 'Persönlichkeit: ',
    failed_colon: 'Fehlgeschlagen: ',
    // ui.js
    no_workspace: 'Kein Workspace',
    terminal_open_title: 'Workspace-Terminal öffnen',
    terminal_no_workspace_title: 'Wähle einen Workspace, um das Terminal zu öffnen',
    terminal_title: 'Terminal',
    terminal_clear: 'Leeren',
    terminal_copy_output: 'Ausgabe kopieren',
    terminal_restart: 'Neu starten',
    terminal_collapse: 'Einklappen',
    terminal_expand: 'Ausklappen',
    terminal_close: 'Schließen',
    terminal_input_placeholder: 'Befehl ausführen...',
    terminal_start_failed: 'Terminal konnte nicht gestartet werden: ',
    terminal_input_failed: 'Terminal-Eingabe fehlgeschlagen: ',
    terminal_copy_failed: 'Kopieren fehlgeschlagen: ',
    terminal_error: 'Terminalfehler',
    terminal_remote_backend_unsupported: 'Das eingebettete Terminal wird nur für lokale Terminal-Backends unterstützt.',
    workspace_empty_no_path: 'Kein Workspace ausgewählt. Wähle einen Workspace unter Einstellungen \u2192 Workspace, um Dateien zu durchsuchen.',
    workspace_empty_dir: 'Dieser Workspace ist leer.',
    workspace_show_hidden_files: 'Versteckte Dateien anzeigen',
    workspace_show_hidden_files_desc: '.DS_Store, .git, node_modules und weitere versteckte / Systemdateien im Dateibaum anzeigen.',
    workspace_hidden_files_visible: 'versteckt sichtbar',
    workspace_hidden_files_visible_title: 'Versteckte Dateien sind sichtbar — Klicken für Optionen',
    workspace_options: 'Arbeitsbereich-Optionen',
    dialog_confirm_title: 'Aktion bestätigen',
    dialog_prompt_title: 'Wert eingeben',
    dialog_confirm_btn: 'Bestätigen',
    // workspace.js
    unsaved_confirm: 'Sie haben ungespeicherte Änderungen in der Vorschau. Verwerfen und fortfahren?',
    discard: 'Verwerfen',
    save: 'Speichern',
    edit: 'Bearbeiten',
    clear: 'Leeren',
    create: 'Erstellen',
    remove: 'Entfernen',
    save_title: 'Änderungen speichern',
    edit_title: 'Diese Datei bearbeiten',
    saved: 'Gespeichert',
    save_failed: 'Speichern fehlgeschlagen: ',
    image_load_failed: 'Bild konnte nicht geladen werden',
    file_open_failed: 'Datei konnte nicht geöffnet werden',
    downloading: (name) => `Lade ${name} herunter\u2026`,
    double_click_rename: 'Doppelklick zum Umbenennen',
    session_rename_failed_no_row: 'Could not start rename — row not found.',
    renamed_to: 'Umbenannt in ',
    rename_failed: 'Umbenennen fehlgeschlagen: ',
    moved_to: 'Verschoben nach ',
    move_failed: 'Verschieben fehlgeschlagen: ',
    delete_title: 'Löschen',
    delete_confirm: (name) => `${name} löschen?`,
    delete_dir_confirm: (name) => `Ordner "${name}" und gesamten Inhalt löschen?`,
    rename_title: 'Umbenennen',
    rename_prompt: 'Neuer Name:',
    deleted: 'Gelöscht ',
    delete_failed: 'Löschen fehlgeschlagen: ',
     reveal_in_finder: 'Im Dateimanager anzeigen',
     reveal_failed: 'Anzeige fehlgeschlagen: ',
     copy_file_path: 'Dateipfad kopieren',
     open_in_vscode: 'In VS Code öffnen',
     open_in_vscode_failed: 'In VS Code öffnen fehlgeschlagen: ',
     download_folder: 'Download Folder', // TODO: translate
    path_copied: 'Dateipfad in die Zwischenablage kopiert',
    path_copy_failed: 'Pfad konnte nicht kopiert werden: ',
    session_rename: 'Unterhaltung umbenennen',
    session_rename_desc: 'Titel dieser Unterhaltung bearbeiten',
    session_title_regenerate: 'Titel neu generieren',
    session_title_regenerate_desc: 'Hermes bitten, einen neuen Titel aus der Unterhaltung zu generieren',
    session_title_regenerating: 'Titel wird neu generiert…',
    session_title_regenerated: (title) => `Titel neu generiert: ${title}`,
    session_title_regenerate_failed: 'Titel neu generieren fehlgeschlagen: ',
    session_copy_link: 'Unterhaltungslink kopieren',
    session_copy_link_desc: 'Direkten Link zu dieser Unterhaltung kopieren',
    session_link_copied: 'Unterhaltungslink in die Zwischenablage kopiert',
    session_link_copy_failed: 'Unterhaltungslink konnte nicht kopiert werden: ',
    new_file_prompt: 'Neuer Dateiname (z.B. notes.md):',
    new_file: 'Neue Datei',
    new_folder: 'Neuer Ordner',
    workspace_root: 'Arbeitsbereich-Root',
    new_file_prompt_title: 'Neuer Dateiname in {0}:',
    new_folder_prompt_title: 'Neuer Ordnername in {0}:',
    project_name_prompt: 'Projektname:',
    created: 'Erstellt ',
    create_failed: 'Erstellen fehlgeschlagen: ',
    new_folder_prompt: 'Neuer Ordnername:',
    folder_created: 'Ordner erstellt ',
    folder_create_failed: 'Ordner erstellen fehlgeschlagen: ',
  workspace_auto_create_folder: 'Ordner erstellen, falls nicht vorhanden',
  folder_add_as_space_btn: 'Als Bereich hinzufügen',
  folder_add_as_space_msg: 'Diesen Ordner als neuen Bereich zur Liste hinzufügen?',
  folder_add_as_space_title: 'Als Bereich hinzufügen?',
    remove_title: 'Entfernen',
    empty_dir: '(leer)',
    upload_failed: 'Upload fehlgeschlagen: ',
    upload_too_large: (maxMb, fileMb) => `Datei ist zu groß (${fileMb} MB). Die maximale Uploadgröße beträgt ${maxMb} MB.`,
    uploading: 'Wird hochgeladen…',
    uploaded: 'Hochgeladen',
    all_uploads_failed: (n) => `Alle ${n} Upload(s) fehlgeschlagen`,
    // settings panel
    settings_title: 'Einstellungen',
    settings_save_btn: 'Einstellungen speichern',
    settings_label_model: 'Standard-Modell',
    settings_desc_model: 'Wird für neue Chats verwendet. Bestehende Chats behalten ihr ausgewähltes Modell.',
    settings_label_auxiliary_models: 'Hilfsmodelle',
    settings_desc_auxiliary_models: 'Routing für Nebenaufgaben wie Vision, Komprimierung, Titelgenerierung usw. „Auto" verwendet das Haupt-Chat-Modell.',
    settings_btn_reset_aux_models: 'Alle auf auto zurücksetzen',
    settings_btn_apply_aux_models: 'Änderungen anwenden',
    settings_aux_provider_auto: 'Hauptmodell verwenden',
    settings_aux_model_auto: 'auto (Provider-Standard verwenden)',
    settings_aux_model_custom: 'Benutzerdefiniertes Modell…',
    settings_aux_model_custom_prompt: 'Modell-ID eingeben:',
    settings_aux_loading: 'Hilfsmodelle werden geladen…',
    settings_aux_load_failed: 'Hilfsmodelle-Einstellungen konnten nicht geladen werden. Stellen Sie sicher, dass die Agent-API verfügbar ist.',
    settings_aux_reset_confirm_title: 'Hilfsmodelle zurücksetzen?',
    settings_aux_reset_confirm_msg: 'Dies setzt alle Hilfsaufgaben auf auto (Hauptmodell verwenden).',
    settings_aux_reset_done: 'Hilfsmodelle auf auto zurückgesetzt',
    settings_aux_save_failed: 'Hilfsmodell konnte nicht gespeichert werden',
    settings_aux_saved: 'Hilfsmodelle aktualisiert',
    settings_aux_no_changes: 'Keine Änderungen anzuwenden',
    settings_label_send_key: 'Sende-Taste',
    settings_label_theme: 'Theme',
    settings_label_skin: 'Skin',
    settings_label_font_size: 'Font size',
    font_size_small: 'Small',
    font_size_default: 'Default',
    font_size_large: 'Large',
    font_size_xlarge: 'Extra Large',
    settings_autosave_saving: 'Wird gespeichert…',
    settings_autosave_saved: 'Gespeichert',
    settings_autosave_failed: 'Speichern fehlgeschlagen',
    settings_autosave_retry: 'Wiederholen',
    settings_label_language: 'Sprache',
    settings_label_quota_chip: 'Anbieter-Kontingent-Chip im Editor anzeigen',
    settings_desc_quota_chip: 'Zeigt einen Hintergrund-Indikator des verbleibenden Kontingents (z. B. OpenRouter-Guthaben) in der Editor-Fußzeile an. Standardmäßig deaktiviert. Bei Aktivierung nur auf breiten Bildschirmen (≥1400px) sichtbar, damit der Editor auf Laptops und Standard-Desktops übersichtlich bleibt.',
    settings_label_conversation_outline: 'Konversationsgliederung anzeigen',
    settings_desc_conversation_outline: 'Zeigt eine Desktop-Sprungliste für Benutzerfragen in der aktuellen Konversation. Standardmäßig deaktiviert.',
    settings_label_hide_suggestions: 'Hide new-chat suggestions',
    settings_desc_hide_suggestions: 'Hide the three default suggestion buttons on the empty new-chat screen to avoid accidental taps.',
    settings_label_token_usage: 'Token-Verbrauch anzeigen',
    settings_label_token_speed: 'Token-Geschwindigkeit (TPS) anzeigen',
    settings_desc_token_speed: 'Zeigt Token pro Sekunde in den Assistenten-Nachrichtenkopfzeilen während des Streamings und nach Abschluss einer Antwort an. Standardmäßig aus.',
    settings_label_sidebar_density: 'Seitenleistendichte',
    cmd_reasoning: 'Toggle thinking visibility (show/hide), set effort level, or check current status',
    settings_label_external_sessions: 'Externe Sitzungen anzeigen',
    settings_label_cron_sessions: 'Show cron sessions',
    settings_label_previous_messaging_sessions: 'Vorherige Messaging-Sitzungen anzeigen',
    settings_label_sync_insights: 'Mit Insights synchronisieren',
    settings_label_check_updates: 'Nach Updates suchen',
    settings_label_ignore_agent_updates: 'Ignore Agent updates',
    settings_label_whats_new_summary: "Summarize What's New with AI",
    settings_label_bot_name: 'Standard-Assistentenname',
    settings_label_password: 'Zugangspasswort',
    settings_label_pinned_limit: 'Limit für angeheftete Unterhaltungen',
    settings_desc_pinned_limit: 'Maximale Anzahl aktiver Unterhaltungen, die in der Seitenleiste angeheftet werden können. Standard ist 3.',
    settings_label_dashboard_mode: 'Offizielles Hermes-Dashboard',
    settings_desc_dashboard_mode: 'Zeigt einen Link in der Navigationsleiste an, wenn das offizielle Hermes-Dashboard erreichbar ist. Öffentliche Reverse-Proxy-URLs werden nur als Browser-Links gespeichert und nie vom Server geprüft.',
    settings_dashboard_mode_auto: 'Automatisch erkennen',
    settings_dashboard_mode_always: 'Immer anzeigen',
    settings_dashboard_mode_never: 'Nie anzeigen',
    settings_dashboard_save: 'Dashboard-Link-Einstellungen speichern',
    settings_label_gateway_status: 'Gateway-Status',
    settings_desc_gateway_status: 'Status des Hermes-Gateways (Telegram, Discord, Slack, usw.)',
    gateway_not_configured: 'Gateway nicht konfiguriert',
    gateway_metadata_stale: 'Gateway-Metadaten veraltet',
    gateway_endpoint_unreachable: 'Gateway-Endpunkt nicht erreichbar',
    gateway_not_running: 'Gateway läuft nicht',
    gateway_running_label: 'Läuft',
    gateway_last_active: 'Zuletzt aktiv: ',
    gateway_session_count: (n) => `${n} ${n === 1 ? 'Sitzung' : 'Sitzungen'}`,
    gateway_load_failed: 'Gateway-Status konnte nicht geladen werden',
    settings_saved: 'Einstellungen gespeichert',
    settings_save_failed: 'Speichern fehlgeschlagen: ',
    settings_load_failed: 'Laden der Einstellungen fehlgeschlagen: ',
    settings_saved_pw: 'Einstellungen gespeichert — Passwortschutz aktiviert und dieser Browser bleibt angemeldet',
    settings_saved_pw_updated: 'Einstellungen gespeichert — Passwort aktualisiert',
    // login page
    login_title: 'Anmelden',
    login_subtitle: 'Geben Sie Ihr Passwort ein, um fortzufahren',
    login_placeholder: 'Passwort',
    login_btn: 'Anmelden',
    login_invalid_pw: 'Ungültiges Passwort',
    login_conn_failed: 'Verbindung fehlgeschlagen',
    dialog_confirm_title: 'Aktion bestätigen',
    dialog_prompt_title: 'Wert eingeben',
    dialog_confirm_btn: 'Bestätigen',
    discard: 'Verwerfen',
    clear: 'Leeren',
    create: 'Erstellen',
    remove: 'Entfernen',
    project_name_prompt: 'Projektname:',
    // Sidebar & Tabs
    tab_chat: 'Chat',
    tab_tasks: 'Aufgaben',
    tab_skills: 'Skills',
    tab_memory: 'Gedächtnis',
    tab_workspaces: 'Spaces',
    tab_profiles: 'Profile',
    tab_kanban: 'Kanban',
    kanban_board: 'Board',
    kanban_visible_tasks: '{0} visible tasks',
    kanban_search_tasks: 'Search tasks',
    kanban_all_assignees: 'All assignees',
    kanban_all_tenants: 'All tenants',
    kanban_include_archived: 'Include archived',
    kanban_no_matching_tasks: 'No matching tasks',
    kanban_no_data: 'No Kanban data',
    kanban_work_queue_hint: 'This is the Hermes Agent work queue. Create or triage a task, assign it, move it to Ready, then let the dispatcher claim it.',
    kanban_unavailable: 'Kanban unavailable',
    kanban_read_only: 'Read-only view',
    kanban_empty: 'Empty',
    kanban_task: 'Task',
    kanban_no_description: 'No description',
    kanban_refresh: 'Refresh',
    kanban_status_triage: 'Triage',
    kanban_status_todo: 'Todo',
    kanban_status_ready: 'Ready',
    kanban_status_running: 'Running',
    kanban_status_blocked: 'Blocked',
    kanban_status_done: 'Done',
    kanban_status_original_hint: 'Actual status: {0}. This dialog only supports Triage/Todo/Ready edits.',
    kanban_comments_count: 'Comments ({0})',
    kanban_events_count: 'Events ({0})',
    kanban_links: 'Links',
    kanban_parents: 'Parents',
    kanban_children: 'Children',
    kanban_runs_count: 'Runs ({0})',
    kanban_no_comments: 'No comments',
    kanban_no_events: 'No events',
    kanban_no_runs: 'No runs',
    kanban_title: 'Titel',
    kanban_description: 'Beschreibung',
    kanban_description_placeholder: 'Optional — was zu tun ist, Akzeptanzkriterien, Links',
    kanban_status: 'Status',
    kanban_assignee: 'Zugewiesen an',
    kanban_assignee_placeholder: 'Optional — leer lassen für beliebigen Worker',
    kanban_tenant: 'Mandant',
    kanban_tenant_placeholder: 'Optional — Projekt- oder Team-Slug',
    kanban_priority: 'Priorität',
    kanban_priority_hint: 'Höhere Zahlen laufen zuerst. Standard: 0.',
    kanban_title_required: 'Titel ist erforderlich.',
    kanban_edit_task: 'Aufgabe bearbeiten',
    kanban_run_dispatcher: 'Dispatcher ausführen',
    kanban_run_dispatcher_confirm: 'Dies beansprucht Ready-Aufgaben auf diesem Board und startet Worker-Subprozesse (einen pro Aufgabe, bis zu 8 pro Klick). Fortfahren?',
    kanban_assignee_profiles_label: 'Hermes-Profile',
    kanban_assignee_other_label: 'Andere (CLI-Bahnen / entfernte Profile)',
    kanban_assignee_unassigned: '— Nicht zugewiesen (läuft nicht automatisch) —',
    kanban_ready_needs_assignee: 'Du hast „Nicht zugewiesen“ + „Ready“ gewählt. Der Dispatcher überspringt diese Aufgabe. Erneut senden zum Bestätigen oder ein Profil wählen.',
    kanban_dispatch_preview_prefix: 'Vorschau:',
    kanban_dispatch_run_prefix: 'Gestartet:',
    kanban_dispatch_spawned: 'gestartet',
    kanban_dispatch_promoted: 'befördert',
    kanban_dispatch_reclaimed: 'zurückgenommen',
    kanban_dispatch_skipped_unassigned: 'übersprungen (kein Bearbeiter)',
    kanban_dispatch_skipped_nonspawnable: 'übersprungen (unbekanntes Profil)',
    kanban_dispatch_auto_blocked: 'auto-blockiert',
    kanban_dispatch_timed_out: 'Zeitüberschreitung',
    kanban_dispatch_crashed: 'abgestürzt',
    kanban_new_task: 'New task',
    kanban_add_comment: 'Add comment',
      kanban_only_mine: 'Only mine',
      kanban_bulk_action: 'Bulk action',
      kanban_nudge_dispatcher: 'Preview dispatcher',
      kanban_stats: 'Stats',
      kanban_worker_log: 'Worker log',
      kanban_block: 'Block',
      kanban_unblock: 'Unblock',
      kanban_back_to_board: 'Back to board',
      kanban_lanes_by_profile: 'Lanes by profile',
      kanban_new_board: 'New board…',
      kanban_rename_board: 'Rename current board…',
      kanban_archive_board: 'Archive current board…',
      kanban_archive_board_confirm: 'Archive board "{name}"? Tasks remain on disk and the board can be restored from kanban/boards/_archived/.',
      kanban_board_archived: 'Board archived',
      kanban_board_name: 'Name',
      kanban_board_slug: 'Slug (lowercase, hyphens)',
      kanban_board_description: 'Description (optional)',
      kanban_board_icon: 'Icon (emoji, optional)',
      kanban_board_color: 'Color (optional)',
      kanban_board_name_required: 'Name is required',
      kanban_board_slug_required: 'Slug is required',
      kanban_card_complete: 'complete',
      kanban_card_archive: 'archive',
      kanban_unassigned: 'unassigned',
    kanban_status_archived: 'Archived',
    tab_todos: 'Todos',
    tab_insights: 'Statistiken',
    tab_dashboard: 'Hermes-Dashboard',
    dashboard_loopback_warning: 'Das Dashboard ist auf dem Server nur per Loopback erreichbar. Öffne es direkt auf dem Server oder starte es mit --host 0.0.0.0 neu (unsicher).',
    tab_logs: 'Logs',
    tab_settings: 'Einstellungen',

    logs_title: 'Logs',  // TODO: translate
    logs_file: 'File',  // TODO: translate
    logs_tail: 'Tail',  // TODO: translate
    logs_auto_refresh: 'Auto-refresh (5s)',  // TODO: translate
    logs_wrap: 'Wrap lines',  // TODO: translate
    logs_copy_all: 'Copy all',  // TODO: translate
    logs_empty: 'No log lines yet.',  // TODO: translate
    logs_loading: 'Loading logs…',  // TODO: translate
    logs_load_failed: 'Logs failed to load',  // TODO: translate
    logs_status_idle: 'Choose a log file to view recent lines.',  // TODO: translate
    logs_no_mtime: 'not written yet',  // TODO: translate
    logs_truncated_hint: 'Showing the tail of a large log file; older bytes were skipped to keep memory bounded.',  // TODO: translate
    logs_copied: 'Logs copied',  // TODO: translate
    logs_severity: 'Schweregrad',
    logs_severity_all: 'Alle',
    logs_severity_errors: 'Fehler',
    logs_severity_warnings: 'Warnungen+',
    logs_filter_active: 'angezeigt (Filter aktiv)',
    new_conversation: 'Neuer Chat',
    filter_conversations: 'Chats filtern...',
    markdown_table_filter: 'Tabelle filtern',
    markdown_table_sort_column: 'Spalte sortieren',
    scheduled_jobs: 'Geplante Aufgaben',
    new_job: 'Neuer Job',
    loading: 'Lädt...',
    search_skills: 'Skills suchen...',
    new_skill: 'Neuer Skill',
    personal_memory: 'Persönliches Gedächtnis',
    current_task_list: 'Aktuelle Aufgabenliste',
    workspace_desc: 'Workspaces hinzufügen und wechseln.',
    session_meta_messages: (n) => `${n} Nachr.`,
    session_meta_children: (n) => `${n} ${n === 1 ? 'Subagent' : 'Subagents'}`,
    session_meta_segments: (n) => `${n} Segment${n === 1 ? '' : 'e'}`,
    session_lineage_toggle_hint: '{0} — frühere Kontext-Turns sind hier eingeklappt. Klicken, um sie ein- oder auszublenden.',
    session_lineage_static_hint: '{0} — frühere Kontext-Turns sind hier eingeklappt.',
    session_child_toggle_hint: '{0} — aus dieser Sitzung erzeugte Kind-Unterhaltungen. Klicken, um sie ein- oder auszublenden.',
    session_readonly_title_hint: 'Schreibgeschützte importierte Sitzung — {0}',
    session_lineage_segment_untitled: 'Unbenanntes Segment',
    session_lineage_segment_open: 'Liniensegment öffnen',
    new_profile: 'Neues Profil',
    transcript: 'Protokoll',
    download_transcript: 'Als Markdown herunterladen',
    import: 'Importieren',
    export_session_json: 'JSON',
    export_session_json_tooltip: 'Gesamte Sitzung als JSON exportieren',
    import_session_json_tooltip: 'Sitzung aus JSON importieren',
    clear_conversation_btn_tooltip: 'Alle Nachrichten in dieser Konversation löschen',
    // Settings detail
    settings_label_rtl: 'Chat-Layout von rechts nach links',
    settings_desc_rtl: 'Kehrt die Ausrichtung von Chat-Nachrichten und Eingabefeld für Sprachen wie Arabisch oder Hebräisch um. Betrifft nur den Chat-Bereich — Seitenleiste und andere Panels bleiben von links nach rechts.',
    settings_label_sound: 'Benachrichtigungston',
    settings_desc_sound: 'Spielt einen Ton ab, wenn der Assistent eine Antwort beendet.',
    settings_label_notifications: 'Browser-Benachrichtigungen',
    settings_desc_notifications: 'Zeigt eine Systembenachrichtigung an, wenn eine Antwort fertiggestellt wird, während der Tab im Hintergrund ist.',
    notifications_enable_btn: 'Enable notifications',
    notifications_test_btn: 'Send test',
    notifications_permission_status: (status) => `Permission: ${status}`,
    notifications_enabled_toast: 'Notifications enabled.',
    notifications_denied: 'Notifications are blocked in this browser. Enable them in browser settings.',
    notifications_unsupported: 'Notifications are not supported in this browser.',
    settings_desc_token_usage: 'Zeigt die Anzahl der Input/Output-Token unter jeder Antwort des Assistenten an. Auch umschaltbar mit /usage.',
    settings_sidebar_density_compact: 'Kompakt',
    settings_sidebar_density_detailed: 'Detailliert',
    settings_desc_sidebar_density: 'Steuert, wie viele Metadaten die Sitzungsliste in der linken Seitenleiste anzeigt.',
    settings_label_auto_title_refresh: 'Adaptive Titelaktualisierung',
    settings_auto_title_refresh_off: 'Aus',
    settings_auto_title_refresh_5: 'Alle 5 Antworten',
    settings_auto_title_refresh_10: 'Alle 10 Antworten',
    settings_auto_title_refresh_20: 'Alle 20 Antworten',
    settings_desc_auto_title_refresh: 'Generiert den Sitzungstitel automatisch anhand des letzten Austauschs neu und hält ihn so aktuell, während sich das Gespräch entwickelt. Erfordert ein konfiguriertes LLM-Titelgenerierungsmodell.',
    settings_desc_external_sessions: 'Zeigt Gespräche von CLI, Telegram, Discord, Slack und anderen Kanälen in der Sitzungsliste an. Klicken zum Importieren und Fortsetzen.',
    settings_desc_cron_sessions: 'Surface cron job output as conversations in the sidebar. Only active when non-WebUI sessions are enabled. Defaults off; high-frequency jobs can flood the sidebar.',
    settings_desc_previous_messaging_sessions: 'Zeigt ältere Discord-, Telegram-, Slack- und Weixin-Sitzungen, die durch Reset oder Compression ersetzt wurden.',
    settings_desc_sync_insights: 'Spiegelt den WebUI-Token-Verbrauch in die state.db, sodass hermes /insights Browser-Sitzungsdaten enthält. Standardmäßig aus.',
    settings_desc_check_updates: 'Zeigt ein Banner an, wenn neuere Versionen der WebUI oder des Agenten verfügbar sind. Führt regelmäßig einen Git-Fetch im Hintergrund aus.',
    settings_desc_ignore_agent_updates: 'Keep WebUI update checks on, but hide Agent update notices and skip Agent update fetches.',
    settings_desc_whats_new_summary: "Changes the What's New action from opening the raw diff first to generating a short, human-readable summary. The regular diff comparison stays available after the summary.",
    settings_desc_bot_name: 'Wird nur für das Standardprofil verwendet. Andere Profile verwenden ihre eigenen Namen.',
    settings_desc_password: 'Geben Sie ein neues Passwort ein, um es zu setzen oder zu ändern. Leer lassen, um die aktuelle Einstellung beizubehalten.',
    password_placeholder: 'Neues Passwort eingeben…',
    password_env_var_locked: 'Die Umgebungsvariable HERMES_WEBUI_PASSWORD ist gesetzt und hat Vorrang. Entferne sie und starte den Server neu, um das Passwort hier zu verwalten.',
    password_env_var_locked_placeholder: 'Gesperrt: HERMES_WEBUI_PASSWORD-Umgebungsvariable ist gesetzt',
    disable_auth: 'Authentifizierung deaktivieren',
    sign_out: 'Abmelden',
    settings_label_shutdown: 'Hermes WebUI-Server stoppen',
    settings_desc_shutdown_before_cmd: 'Beendet den lokalen WebUI-Server kontrolliert. Praktisch, wenn du ihn über ',
    settings_desc_shutdown_between_cmds: ' gestartet hast und ihn stoppen möchtest, ohne in ein Terminal zu wechseln. Um die WebUI wieder erreichbar zu machen, musst du den Server neu starten (',
    settings_desc_shutdown_after_cmd: ' oder die native App).',
    settings_btn_shutdown: 'Server stoppen',
    settings_shutdown_confirm_title: 'Hermes WebUI stoppen',
    settings_shutdown_confirm_message: 'Hermes WebUI-Server stoppen?',
    settings_shutdown_confirm_btn: 'Stoppen',
    settings_shutdown_stopped_message: 'Server gestoppt. Du kannst diesen Tab schließen.',
    // Providers panel (English fallback — native translations welcome in follow-up PRs)
    providers_tab_title: 'Providers',
    providers_section_title: 'Providers',
    providers_section_meta: 'Manage API keys for AI providers. Changes take effect immediately.',
    providers_status_configured: 'API key configured',
    providers_status_not_configured: 'No API key',
    providers_status_oauth: 'OAuth',
    providers_status_api_key: 'API key',
    providers_status_not_configured_label: 'Not configured',
    providers_oauth_hint: 'Authenticated via OAuth. No API key needed.',
    providers_oauth_config_yaml_hint: 'Token configured via config.yaml. To update, edit the providers section in your config.yaml or run hermes auth.',
    providers_oauth_not_configured_hint: 'Not authenticated. Run hermes auth in the terminal to configure this provider.',
    providers_save: 'Save',
    providers_refresh_models: 'Refresh models',
    providers_refreshing: 'Refreshing…',
    providers_models_refreshed: 'Models refreshed',
    providers_remove: 'Remove',
    providers_saving: 'Saving…',
    providers_removing: 'Removing…',
    providers_enter_key: 'Please enter an API key',
    providers_empty: 'No configurable providers found.',
    providers_key_updated: 'API key saved',
    providers_key_removed: 'API key removed',
    providers_key_placeholder_new: 'sk-...',
    providers_key_placeholder_replace: 'Enter new key to replace…',
    provider_quota_title: 'Kontingent des aktiven Anbieters',
    provider_quota_active_provider: 'Aktiver Anbieter',
    provider_quota_last_checked_after_refresh: 'Zuletzt nach Aktualisierung geprüft',
    provider_quota_last_checked: 'Zuletzt geprüft {0}',
    provider_quota_refresh_usage: 'Nutzung aktualisieren',
    provider_quota_refreshing: 'Wird aktualisiert...',
    provider_quota_refresh_title: 'Nutzungslimits des Anbieters jetzt aktualisieren',
    provider_quota_refresh_succeeded: 'Anbieternutzung aktualisiert',
    provider_quota_refresh_failed: 'Aktualisierung der Anbieternutzung fehlgeschlagen',
    provider_quota_session_limit: '5-Stunden-Limit',
    provider_quota_weekly_limit: 'Wöchentliches Limit',
    provider_quota_window_fallback: 'Fenster',
    provider_quota_metric_remaining: 'Verbleibend',
    provider_quota_metric_used: 'Verwendet',
    provider_quota_metric_limit: 'Limit',
    provider_quota_status_available: 'verfügbar',
    provider_quota_status_exhausted: 'ausgeschöpft',
    provider_quota_status_unavailable: 'nicht verfügbar',
    provider_quota_status_failed: 'fehlgeschlagen',
    provider_quota_status_checked: 'geprüft',
    provider_quota_status_no_key: 'kein Schlüssel',
    provider_quota_status_invalid_key: 'ungültiger Schlüssel',
    provider_quota_status_unsupported: 'nicht unterstützt',
    provider_quota_used_meta: '{0} verwendet',
    provider_quota_resets_meta: 'Zurücksetzung {0}',
    provider_quota_credential_pool: 'Anmeldedatenpool',
    provider_quota_credential_label: 'Anmeldedaten {0}',
    provider_quota_pool_plans: 'Pläne: {0}',
    provider_quota_pool_no_windows: 'Keine Kontolimit-Fenster gemeldet.',
    provider_quota_account_limits_loaded: 'Kontolimits geladen.',
    provider_quota_unavailable: 'Kontingentstatus nicht verfügbar',
    provider_quota_retry_after: 'Nach {0} erneut versuchen',
    provider_quota_pool_summary_available: '{0}/{1} verfügbar',
    provider_quota_pool_summary_exhausted: '{0} ausgeschöpft',
    provider_quota_pool_summary_failed: '{0} fehlgeschlagen',
    provider_quota_pool_summary_checked: '{0} geprüft',
    cancel: 'Abbrechen',
    create_job: 'Job erstellen',
    save_skill: 'Skill speichern',
    editing: 'Bearbeitung',
    // Empty state
    empty_title: 'Wie kann ich helfen?',
    empty_subtitle: 'Frage mich alles, führe Befehle aus, erkunde Dateien oder verwalte deine Aufgaben.',
    suggest_files: 'Welche Dateien sind in diesem Workspace?',
    suggest_schedule: 'Was steht heute auf meinem Plan?',
    suggest_plan: 'Hilf mir, ein kleines Projekt zu planen.',
    onboarding_password_will_enable: 'Wird aktiviert',
    onboarding_password_will_replace: 'Wird ersetzt',
    onboarding_password_keep_existing: 'Aktuelles Passwort beibehalten',
    onboarding_password_remains_disabled: 'Bleibt deaktiviert',
    profile_delete_confirm_message: 'Alle Sitzungen, Konfigurationen, Fähigkeiten und Erinnerungen dieses Profils werden dauerhaft gelöscht. Diese Aktion kann nicht rückgängig gemacht werden.',
    // skill form
    skill_name: 'Name',
    skill_category: 'Kategorie',
    skill_category_placeholder: 'Optional, z. B. devops',
    skill_content: 'SKILL.md-Inhalt',
    skill_content_placeholder: 'YAML-Frontmatter + Markdown-Text',
    skill_rename_not_supported: 'Umbenennen einer Fähigkeit wird nicht unterstützt. Erstelle eine neue und lösche die alte.',
    skill_metadata: 'Metadaten',
    // cron form
    cron_name_label: 'Name',
    cron_duplicate: 'Duplizieren',
    cron_duplicated: 'Aufgabe dupliziert (pausiert)',
    cron_name_placeholder: 'Optional',
    cron_schedule_label: 'Zeitplan',
    cron_schedule_hint: "Für wiederkehrende Aufgaben 'every 1h' oder einen Cron-Ausdruck verwenden. Reine Dauern wie '30m' laufen einmal.",
    cron_schedule_once_warning: "Dauerangaben wie '30m' laufen einmal und werden nach der Ausführung entfernt. Verwende 'every 30m' für eine wiederkehrende Aufgabe.",
    cron_prompt_label: 'Prompt',
    cron_deliver_label: 'Ausgabe senden an',
    cron_deliver_local: 'Lokal (nur speichern)',
    cron_deliver_custom: 'Benutzerdefiniertes Ziel',
    cron_profile_label: 'Profil',
    cron_profile_server_default: 'Serverstandard',
    cron_profile_server_default_hint: 'Verwendet zur Laufzeit das Standardprofil des WebUI-Servers. Bestehende Jobs ohne Profil behalten dieses Legacy-Verhalten.',
    cron_toast_notifications_label: 'Abschluss-Toasts',
    cron_toast_notifications_hint: 'Zeigt einen Toast, wenn dieser Cron fertig ist. Aufgaben-Badge und Marker für neue Läufe werden trotzdem aktualisiert.',
    cron_toast_notifications_enabled: 'Aktiviert',
    cron_toast_notifications_disabled: 'Deaktiviert',
    cron_skills_label: 'Fähigkeiten',
    cron_skills_placeholder: 'Fähigkeiten hinzufügen (optional)…',
    cron_skills_edit_hint: 'Die Fähigkeitenliste kann nach der Erstellung nicht bearbeitet werden.',
    cron_status_running: 'läuft\u2026',
    // workspace form
    workspace_name_label: 'Name',
    workspace_name_placeholder: 'Optionaler Anzeigename',
    workspace_path_label: 'Pfad',
    workspace_path_required: 'Pfad ist erforderlich',
    workspace_path_readonly: 'Pfad kann nicht geändert werden. Nur umbenennen.',
    workspace_new_title: 'Neuer Bereich',
    // profile form
    profile_name_label: 'Name',
    profile_base_url_label: 'Basis-URL',
    profile_api_key_label: 'API-Schlüssel',
  
    // Session management and settings keys (en fallback — pending translation)
    session_archive: 'Archive conversation',
    session_hide_external: 'Aus Liste ausblenden',
    session_archive_desc: 'Hide this conversation until archived is shown',
    session_archive_worktree_desc: 'Diese Konversation ausblenden; den Worktree auf der Festplatte behalten',
    session_hide_external_desc: 'Diese importierte Sitzung aus der WebUI-Liste ausblenden, ohne den ursprünglichen Verlauf zu löschen.',
    session_archive_failed: 'Archive failed: ',
    session_archived: 'Session archived',
    session_archived_worktree: 'Sitzung archiviert. Der Worktree bleibt auf der Festplatte.',
    session_hidden: 'Sitzung aus Liste ausgeblendet',
    session_delete: 'Delete conversation',
    session_delete_desc: 'Permanently remove this conversation',
    session_delete_confirm: 'Diese Konversation löschen?',
    session_delete_worktree_desc: 'Nur die WebUI-Konversation löschen; den Worktree auf der Festplatte behalten',
    session_delete_worktree_confirm: (path) => `Diese Konversation löschen? Der Worktree unter ${path} bleibt auf der Festplatte.`,
    session_deleted: 'Konversation gelöscht',
    session_deleted_worktree: 'Konversation gelöscht. Der Worktree bleibt auf der Festplatte.',
    session_worktree_remove: 'Worktree entfernen',
    session_worktree_remove_desc: (path) => `Git-Worktree unter ${path} von der Festplatte löschen`,
    session_worktree_remove_confirm: (path) => `Git-Worktree von der Festplatte entfernen?\n\nPfad: ${path}\n\nDas gesamte Worktree-Verzeichnis wird gelöscht. Sitzungsdaten bleiben in WebUI.`,
    session_worktree_remove_not_exists: (path) => `Der Worktree unter ${path} existiert nicht mehr auf der Festplatte.`,
    session_worktree_remove_confirm_label: 'Entfernen',
    session_worktree_removed: 'Worktree entfernt.',
    session_worktree_remove_failed: 'Fehler beim Entfernen des Worktree: ',
    session_worktree_remove_status_failed: 'Fehler beim Lesen des Worktree-Status: ',
    session_worktree_remove_locked_by_stream: 'Entfernen nicht möglich — eine aktive Streaming-Sitzung verwendet diesen Worktree.',
    session_worktree_remove_locked_by_terminal: 'Entfernen nicht möglich — eine aktive Terminal-Sitzung verwendet diesen Worktree.',
    session_worktree_remove_unsafe_blocked: 'Löse lokale Änderungen oder nicht gepushte Commits, bevor du diesen Worktree entfernst.',
    session_worktree_remove_dirty_warning: 'WARNUNG: Dieser Worktree hat nicht festgeschriebene Änderungen, die verloren gehen.',
    session_worktree_remove_untracked_warning: (count) => `${count} nicht verfolgte Datei(en) werden dauerhaft gelöscht.`,
    session_worktree_remove_ahead_warning: (ahead) => `${ahead} nicht gepushte Commit(s) gehen verloren.`,
    session_duplicate: 'Duplicate conversation',
    session_duplicate_desc: 'Create a copy with the same workspace and model',
    session_duplicate_failed: 'Duplicate failed: ',
    session_stop_response: 'Stop response',
    session_stop_response_desc: 'Cancel the running response for this conversation',
    session_duplicated: 'Session duplicated',
    session_move_project: 'Move to project',
    session_move_project_desc_has: 'Change the project for this conversation',
    session_move_project_desc_none: 'Assign a project to this conversation',
    session_pin: 'Pin conversation',
    session_pin_desc: 'Keep this conversation at the top',
    session_pin_failed: 'Pin failed: ',
    session_restore: 'Restore conversation',
    session_restore_desc: 'Bring this conversation back into the main list',
    session_restored: 'Session restored',
    session_unpin: 'Unpin conversation',
    session_unpin_desc: 'Remove from pinned',
    session_select_mode: 'Auswählen',
    session_select_mode_desc: 'Konversationen für Massenverwaltung auswählen',
    session_select_all: 'Alle auswählen',
    session_deselect_all: 'Auswahl aufheben',
    session_selected_count: '{0} ausgewählt',
    session_batch_archive: 'Archivieren',
    session_batch_delete: 'Löschen',
    session_batch_move: 'Zum Projekt verschieben',
    session_batch_delete_confirm: '{0} Konversationen löschen?',
    session_batch_archive_confirm: '{0} Konversationen archivieren?',
    session_batch_delete_worktree_confirm: '{0} Konversationen löschen? {1} worktree-gestützte Konversation(en) behalten ihre Worktree-Verzeichnisse auf der Festplatte.',
    session_batch_archive_worktree_confirm: '{0} Konversationen archivieren? {1} worktree-gestützte Konversation(en) behalten ihre Worktree-Verzeichnisse auf der Festplatte.',
    session_no_selection: 'Keine Konversationen ausgewählt',
    settings_dropdown_appearance: 'Appearance',
    settings_dropdown_conversation: 'Conversation',
    settings_dropdown_preferences: 'Preferences',
    settings_dropdown_providers: 'Providers',
    settings_dropdown_system: 'System',
    settings_heading_subtitle: 'Preferences, conversation tools, and system controls.',
    settings_heading_title: 'Control Center',
    settings_section_appearance_meta: 'Theme, accent colors, and visual style.',
    settings_section_appearance_title: 'Appearance',
    settings_section_conversation_title: 'Conversation',
    settings_section_preferences_meta: 'Defaults and UI behavior for Hermes Web UI.',
    settings_section_preferences_title: 'Preferences',
    settings_section_system_meta: 'Instance version and access controls.',
    settings_check_now: 'Jetzt prüfen',
    settings_checking: 'Prüfung\u2026',
    settings_up_to_date: 'Aktuell \u2713',
    settings_updates_available: '{count} Update(s) verfügbar',
    settings_updates_disabled: 'Update-Prüfung deaktiviert',
    settings_update_check_failed: 'Update-Prüfung fehlgeschlagen',
    settings_label_workspace_panel_open: 'Arbeitsbereich-Panel standardmäßig öffnen',
    settings_desc_workspace_panel_open: 'Wenn aktiviert, wird der Datei-Browser bei jeder neuen Sitzung automatisch geöffnet. Er kann jederzeit manuell geschlossen werden.',
    settings_label_session_jump_buttons: 'Sitzungs-Sprungtasten anzeigen',
    settings_desc_session_jump_buttons: 'Zeigt beim Lesen langer Sitzungsverläufe schwebende Anfang- und Ende-Tasten an.',
    settings_label_terminal_auto_expand: 'Terminal bei Ausgabe automatisch aufklappen',
    settings_desc_terminal_auto_expand: 'Das eingeklappte Terminal-Panel automatisch aufklappen, wenn ein laufender Befehl neue Ausgaben erzeugt.',

    settings_label_session_endless_scroll: 'Ältere Nachrichten beim Hochscrollen laden',

    settings_desc_session_endless_scroll: 'Wenn aktiviert, werden ältere Nachrichten beim Hochscrollen automatisch geladen. Wenn deaktiviert, nutzt du den Button für ältere Nachrichten.',
    settings_label_auto_scroll_follow: 'Neuen Inhalten automatisch folgen',
    settings_desc_auto_scroll_follow: 'Wenn aktiviert, scrollt die Ansicht nach unten, während neue Tokens eintreffen. Wenn deaktiviert, steuerst du die Scrollposition selbst.',
    settings_label_worklog_details_expanded_default: 'Open Worklog details automatically',
    settings_desc_worklog_details_expanded_default: 'When enabled, new Worklog details start expanded so tool, thinking, and progress cards are visible without an extra click. When off, Worklog details stay folded by default; per-turn manual collapse/expand choices still win.',
    settings_label_chat_activity_display_mode: 'Activity display',
    settings_desc_chat_activity_display_mode: 'Compact Worklog groups supporting activity into a quiet summary. Transparent Stream keeps each thinking/tool event as its own chronological expandable row.',
    first_token_time: 'Time to first token',
    done: 'Done',
    settings_option_compact_worklog: 'Compact Worklog',
    settings_option_transparent_stream: 'Transparent Stream',

    settings_label_tab_visibility: 'Seitenleiste-Tabs',
    settings_desc_tab_visibility: 'Wähle, welche Tabs in der Seitenleiste und im Rail angezeigt werden. Ziehe die Chips, um die Reihenfolge zu ändern. Chat und Einstellungen sind immer sichtbar.',

    workspace_drag_hint: 'Ziehen zum Neuordnen',
    workspace_reorder_failed: 'Neuordnen fehlgeschlagen',
    open_in_browser: 'Im Browser öffnen',
    settings_section_system_title: 'System',
    settings_tab_appearance: 'Appearance',
    settings_tab_conversation: 'Conversation',
    settings_tab_preferences: 'Preferences',
    settings_tab_plugins: 'Plugins',
    settings_plugins_title: 'Plugins',  // TODO: translate
    plugins_enable_toggle: 'Aktivieren',
    settings_plugins_meta: 'View installed Hermes plugins and the lifecycle hooks they register. This panel is read-only.',  // TODO: translate
    settings_plugins_empty: 'No Hermes plugins are currently visible. Install or enable plugins from the Hermes CLI/config to see them here.',  // TODO: translate
    plugins_unnamed: 'Unnamed plugin',  // TODO: translate
    plugins_no_description: 'No description provided.',  // TODO: translate
    plugins_no_hooks: 'No registered lifecycle hooks',  // TODO: translate
    plugins_registered_hooks: 'Registered hooks',  // TODO: translate
    plugins_enabled: 'Enabled',  // TODO: translate
    plugins_disabled: 'Disabled',  // TODO: translate
    plugins_active_provider: 'Active (provider)',  // TODO: translate
    plugins_provider_no_hooks: 'Provider plugin — no agent-visibility hooks',  // TODO: translate
    plugins_load_failed: 'Failed to load plugins: ',  // TODO: translate
    settings_tab_system: 'System',
    settings_tab_help: 'Help',
    settings_help_meta: 'Resources and support for Hermes WebUI.',
    settings_help_docs_label: 'Documentation',
    settings_help_docs_desc: 'Guides, configuration reference, and the full Hermes WebUI README.',
    settings_help_docs_link: 'Open Documentation',
    settings_help_issue_label: 'Having an issue?',
    settings_help_issue_desc: 'Search existing reports or open a new one on GitHub.',
    settings_help_issue_link: 'Open GitHub Issues',
    status_updated: 'Updated',
    status_ephemeral: 'Ephemeral snapshot — not saved to transcript history.',
    status_no_tokens: 'No token data',
    status_profile: 'Profile',
    status_hermes_home: 'Hermes home',
    status_started: 'Started',
    status_tokens: 'Tokens',
    status_unknown: 'Unknown',
    cmd_yolo: 'YOLO-Modus umschalten',
    yolo_no_session: 'Keine aktive Sitzung',
    cmd_branch:'Fork this conversation into a new session',
    cmd_branch_usage:'/branch [name] — fork conversation (optionally with a name)',
    branch_forked:'Forked into new session',
    branch_failed:'Fork failed: ',
    fork_from_here:'Fork from here',
    forked_from:'Forked from',
    yolo_enabled: '⚡ YOLO-Modus AN — Genehmigungen übersprungen',
    yolo_disabled: 'YOLO-Modus AUS',
    yolo_pill_label: 'YOLO',
    yolo_pill_title_active: 'YOLO-Modus aktiv — Klicken zum Deaktivieren',
    approval_skip_all: '⚡ Alle in dieser Sitzung überspringen',
    approval_skip_all_title: 'Alle Genehmigungsanfragen in dieser Sitzung überspringen',
    // composer action tooltips
    composer_send: 'Nachricht senden',
    composer_queue: 'Nachricht einreihen',
    composer_interrupt: 'Unterbrechen und senden',
    composer_steer: 'Antwort steuern',
    composer_stop: 'Generierung stoppen',
    composer_disabled_clarify: 'Auf die Klärungsanfrage antworten',
    composer_disabled_compression: 'Warte auf Abschluss der Komprimierung',
    composer_compression_will_queue: 'Type a message — it will queue and send after compression',
    composer_disabled_empty: 'Nachricht eingeben zum Senden',
    composer_mobile_workspace: 'Arbeitsbereich',
    composer_mobile_model: 'Modell',
    composer_mobile_reasoning: 'Reasoning',
    composer_mobile_context: 'Kontext',
    model_custom_label: 'Benutzerdefinierte Modell-ID',
    model_custom_placeholder: 'z.B. openai/gpt-5.4',
    model_search_placeholder: 'Modelle suchen…',
    model_search_no_results: 'Keine Modelle gefunden',
    model_group_configured: 'Konfiguriert',
    ws_search_placeholder: 'Arbeitsbereiche suchen…',
    ws_no_results: 'Keine Arbeitsbereiche gefunden',
    workspace_new_worktree_conversation: 'Neue Unterhaltung in Worktree',
    workspace_new_worktree_conversation_meta: 'Erstellt einen isolierten git worktree für diesen Arbeitsbereich.',
    workspace_worktree_created: 'Worktree-Unterhaltung erstellt',
    workspace_worktree_failed: 'Worktree-Erstellung fehlgeschlagen: ',
    session_worktree_badge: 'Worktree',
    session_toolsets: 'Session Toolsets', // TODO: translate
    session_toolsets_desc: 'Restrict available tools for this session (blank = use global config)', // TODO: translate
    session_toolsets_global: 'Global (default)', // TODO: translate
    session_toolsets_custom: 'Custom', // TODO: translate
    session_toolsets_placeholder: 'tool1, tool2, \u2026', // TODO: translate
    session_toolsets_apply: 'Apply', // TODO: translate
    session_toolsets_clear: 'Clear (use global)', // TODO: translate
    session_toolsets_applied: 'Toolsets updated', // TODO: translate
    session_toolsets_cleared: 'Toolsets cleared — using global config', // TODO: translate
    session_toolsets_failed: 'Failed to update toolsets: ', // TODO: translate
    session_time_unknown: 'Unbekannt',
    session_time_minutes_ago: (n) => `Vor ${n} Minuten`,
    session_time_hours_ago: (n) => `Vor ${n} Stunden`,
    session_time_days_ago: (n) => `Vor ${n} Tagen`,
    session_time_last_week: 'Letzte Woche',
    session_time_bucket_today: 'Heute',
    session_time_bucket_yesterday: 'Gestern',
    session_time_bucket_this_week: 'Diese Woche',
    session_time_bucket_last_week: 'Letzte Woche',
    session_time_bucket_older: 'Älter',
    onboarding_badge: 'Ersteinrichtung',
    onboarding_title: 'Willkommen bei Hermes',
    onboarding_lead: 'Lassen Sie uns Ihren Agenten einrichten.',
    onboarding_back: 'Zurück',
    onboarding_continue: 'Weiter',
    onboarding_skip: 'Überspringen',
    onboarding_skipped: 'Einrichtung übersprungen',
    onboarding_open: 'Einrichtung öffnen',
    onboarding_step_system_title: 'Agent-Status',
    onboarding_step_system_desc: 'Hermes Agent muss installiert und erreichbar sein.',
    onboarding_step_setup_title: 'Einrichtung',
    onboarding_step_setup_desc: 'Konfigurieren Sie einen Anbieter und ein Modell.',
    onboarding_step_workspace_title: 'Arbeitsbereich',
    onboarding_step_workspace_desc: 'Wählen Sie einen Arbeitsbereich für Ihre Dateien.',
    onboarding_step_password_title: 'Passwort (optional)',
    onboarding_step_password_desc: 'Sichern Sie den Zugriff mit einem Passwort.',
    onboarding_step_finish_title: 'Fertig!',
    onboarding_step_finish_desc: 'Ihr Agent ist bereit.',
    onboarding_notice_system_ready: 'Agent ist bereit und erreichbar.',
    onboarding_notice_system_unavailable: 'Agent nicht erreichbar. Bitte starten Sie Hermes Agent.',
    onboarding_check_agent: 'Agent-Verbindung',
    onboarding_check_agent_ready: 'Agent erreichbar',
    onboarding_check_agent_missing: 'Agent nicht erreichbar',
    onboarding_check_password: 'Passwortschutz',
    onboarding_check_password_enabled: 'Passwort aktiviert',
    onboarding_check_password_disabled: 'Kein Passwort',
    onboarding_check_provider: 'Modellanbieter',
    onboarding_check_provider_ready: 'Anbieter konfiguriert',
    onboarding_check_provider_partial: 'Teilweise konfiguriert',
    onboarding_check_provider_pending: 'Nicht konfiguriert',
    onboarding_config_file: 'Konfigurationsdatei',
    onboarding_env_file: 'Umgebungsdatei',
    onboarding_unknown: 'Unbekannt',
    onboarding_current_provider: 'Aktueller Anbieter',
    onboarding_missing_imports: 'Fehlende Abhängigkeiten',
    onboarding_notice_setup_required: 'Einrichtung erforderlich',
    onboarding_notice_setup_already_ready: 'Bereits eingerichtet',
    onboarding_oauth_provider_ready_title: 'Anbieter bereit',
    onboarding_oauth_provider_ready_body: '{provider} ist konfiguriert. Kein API-Schlüssel erforderlich.',
    onboarding_oauth_provider_not_ready_title: 'Anbieter nicht eingerichtet',
    onboarding_oauth_provider_not_ready_body: '{provider} erfordert einen API-Schlüssel.',
    onboarding_oauth_switch_hint: 'Zu OAuth wechseln',
    onboarding_notice_workspace: 'Arbeitsbereich empfohlen',
    onboarding_workspace_label: 'Arbeitsbereich',
    onboarding_workspace_or_path: 'Name oder Pfad',
    onboarding_workspace_placeholder: 'z.B. ~/projects/my-app',
    onboarding_provider_label: 'Anbieter',
    onboarding_quick_setup_badge: 'Schnelleinrichtung',
    provider_category_easy_start: 'Einfach starten',
    provider_category_self_hosted: 'Selbst gehostet',
    provider_category_specialized: 'Spezialisiert',
    onboarding_api_key_label: 'API-Schlüssel',
    onboarding_api_key_placeholder: 'sk-…',
    onboarding_api_key_label_optional: 'API key (optional)', // TODO: translate
    onboarding_api_key_placeholder_optional: 'Leave blank for keyless servers', // TODO: translate
    onboarding_api_key_help_keyless: 'Most LM Studio / Ollama / vLLM installs run keyless — leave this blank if your server doesn\'t require authentication. Use the Test connection button to verify.', // TODO: translate
    oauth_login_codex: 'Login with Codex (ChatGPT)', // TODO: translate
    oauth_codex_step1: 'Step 1: Visit this URL and enter the code', // TODO: translate
    oauth_codex_step2: 'Step 2: Enter this code on the page', // TODO: translate
    oauth_codex_polling: 'Waiting for authorization...', // TODO: translate
    oauth_codex_success: 'Codex OAuth login successful!', // TODO: translate
    oauth_codex_error: 'OAuth login failed', // TODO: translate
    oauth_codex_expired: 'Code expired, please try again', // TODO: translate
    onboarding_api_key_help_prefix: 'Gefunden unter',
    onboarding_base_url_label: 'Base URL',
    onboarding_base_url_placeholder: 'https://api.openai.com/v1',
    onboarding_base_url_help: 'Verwenden Sie dies für OpenAI-kompatible Router, selbst gehostete Server, LiteLLM, Ollama, LM Studio, vLLM oder ähnliche Endpunkte.',
    onboarding_model_label: 'Modell',
    onboarding_workspace_help: 'Der Arbeitsbereich ist das Stammverzeichnis für Dateien und Terminal-Befehle.',
    onboarding_custom_model_placeholder: 'Exakte Modell-ID eingeben',
    onboarding_custom_model_help: 'Geben Sie die genaue Modell-ID ein, die Ihr Server erwartet.',
    onboarding_notice_password_enabled: 'Passwortschutz aktiviert.',
    onboarding_notice_password_recommended: 'Empfohlen für den öffentlichen Zugriff.',
    onboarding_password_label: 'Passwort',
    onboarding_password_placeholder: 'Passwort festlegen',
    onboarding_password_help: 'Passwörter werden über die Einstellungs-API gespeichert und serverseitig gehasht.',
    onboarding_notice_finish: 'Ihr Agent ist bereit!',
    onboarding_not_set: 'Nicht festgelegt',
    onboarding_password_skipped: 'Übersprungen',
    onboarding_finish_help: 'Sie können dies später in den Einstellungen ändern.',
    onboarding_error_choose_workspace: 'Bitte wählen Sie einen Arbeitsbereich.',
    onboarding_error_choose_model: 'Bitte wählen Sie ein Modell.',
    onboarding_error_provider_required: 'Anbieter erforderlich.',
    onboarding_error_base_url_required: 'Base URL erforderlich.',
    onboarding_probe_test_button: 'Test connection', // TODO: translate
    onboarding_probe_probing: 'Testing connection…', // TODO: translate
    onboarding_probe_ok: 'Connected. {n} model(s) available.', // TODO: translate
    onboarding_probe_error_generic: 'Could not reach the configured base URL.', // TODO: translate
    onboarding_probe_error_invalid_url: 'Base URL must start with http:// or https://.', // TODO: translate
    onboarding_probe_error_dns: 'Could not resolve the host. Check the URL or use the host\'s IP address.', // TODO: translate
    onboarding_probe_error_connect_refused: 'Connection refused — the server may not be running on that address. From inside Docker, try the host IP instead of localhost.', // TODO: translate
    onboarding_probe_error_timeout: 'The endpoint did not respond in time. Check that the server is running and the URL is correct.', // TODO: translate
    onboarding_probe_error_http_4xx: 'The endpoint returned a client error. Check authentication and the URL path (typically ends in /v1).', // TODO: translate
    onboarding_probe_error_http_5xx: 'The endpoint returned a server error. Check the LM Studio / Ollama server logs.', // TODO: translate
    onboarding_probe_error_parse: 'The endpoint did not return a model list in the expected shape. Verify the URL points to the OpenAI-compatible API root.', // TODO: translate
    onboarding_probe_error_unreachable: 'Could not reach the configured base URL.', // TODO: translate
    onboarding_error_probe_failed: 'Could not validate the configured base URL.', // TODO: translate
    onboarding_error_workspace_required: 'Arbeitsbereich erforderlich.',
    onboarding_error_model_required: 'Modell erforderlich.',
    onboarding_complete: 'Einrichtung abgeschlossen!',
    error_prefix: 'Fehler: ',
    default: 'default',
    search: 'Search',
    not_available: 'Nicht verfügbar',
    never: 'Nie',
    add: 'Hinzufügen',
    add_failed: 'Hinzufügen fehlgeschlagen',
    remove_failed: 'Entfernen fehlgeschlagen',
    switch_failed: 'Wechsel fehlgeschlagen',
    name_required: 'Name erforderlich.',
    content_required: 'Inhalt erforderlich.',
    view: 'Anzeigen',
    dismiss: 'Verwerfen',
    disable: 'Deaktivieren',
    cron_no_jobs: 'Keine geplanten Aufgaben.',
    cron_status_off: 'Inaktiv',
    cron_status_paused: 'Pausiert',
    cron_status_error: 'Fehler',
    cron_status_active: 'Aktiv',
    cron_status_needs_attention: 'Erfordert Aufmerksamkeit',
    cron_attention_desc: 'Dieser Job hat Probleme.',
    cron_attention_croniter_hint: 'Der Croniter-Ausdruck ist möglicherweise ungültig.',
    cron_attention_resume: 'Fortsetzen',
    cron_jobs_project: 'Cron-Jobs',
    cron_attention_run_once: 'Einmal ausführen',
    cron_attention_copy_diagnostics: 'Diagnose kopieren',
    cron_diagnostics_copied: 'Diagnoseinformationen kopiert.',
    cron_next: 'Nächstes: ',
    cron_last: 'Letztes: ',
    cron_run_now: 'Jetzt ausführen',
    cron_pause: 'Pausieren',
    cron_resume: 'Fortsetzen',
    cron_job_name_placeholder: 'Aufgabenname',
    cron_schedule_placeholder: '0 9 * * *',
    cron_prompt_placeholder: 'Aufgabenbeschreibung',
    cron_last_output: 'Letzte Ausgabe',
    cron_expand_prompt: 'Prompt erweitern',
    cron_collapse_prompt: 'Prompt einklappen',
    cron_expand_output: 'Ausgabe erweitern',
    cron_collapse_output: 'Ausgabe einklappen',
    cron_mode_agent: 'Agent',
    cron_mode_script: 'Skript',
    cron_mode_label: 'Modus',
    cron_script_job_banner: 'Führt ein Skript nach Plan aus — stdout wird zugestellt. Kein Agent, Prompt oder Skills.',
    cron_script_card_title: 'Skript',
    cron_script_output: 'Skriptausgabe',
    cron_script_path_label: 'Skriptpfad',
    cron_script_path_hint: 'Wird unter ~/.hermes/scripts/ aufgelöst, sofern kein absoluter Pfad. Verhalten über die Skriptdatei auf dem Server ändern.',
    cron_script_badge_title: 'Skript-Job (ohne Agent)',
    cron_workdir_label: 'Arbeitsverzeichnis',
    cron_view_full_output: 'View full output',
    cron_all_runs: 'Alle Ausführungen',
    cron_hide_runs: 'Ausführungen ausblenden',
    cron_no_runs_yet: 'Noch keine Ausführungen.',
    cron_schedule_required_example: 'z.B. 0 9 * * *, every 2h, 30m',
    cron_schedule_required: 'Zeitplan erforderlich.',
    cron_prompt_required: 'Beschreibung erforderlich.',
    cron_job_created: 'Aufgabe erstellt.',
    cron_job_triggered: 'Aufgabe gestartet.',
    cron_job_paused: 'Aufgabe pausiert.',
    cron_job_resumed: 'Aufgabe fortgesetzt.',
    cron_job_updated: 'Aufgabe aktualisiert.',
    cron_model_label: 'Modell-Überschreibung',
    cron_model_hint: 'Überschreibt das Standardmodell für diesen Auftrag.',
    cron_model_use_default: 'Standard (Profil-/Systemstandard verwenden)',
    cron_delete_confirm_title: 'Aufgabe löschen',
    cron_delete_confirm_message: 'Sind Sie sicher?',
    cron_job_deleted: 'Aufgabe gelöscht.',
    cron_completion_status: 'Abschlussstatus',
    status_failed: 'Fehlgeschlagen',
    status_completed: 'Abgeschlossen',
    todos_no_active: 'Keine aktiven Aufgaben.',
    clear_conversation_title: 'Konversation löschen',
    clear_conversation_message: 'Alle Nachrichten werden gelöscht.',
    clear_failed: 'Löschen fehlgeschlagen.',
    skills_no_match: 'Keine passende Fähigkeit.',
    skill_enabled: 'Aktiviert',
    skill_disabled: 'Deaktiviert',
    skill_toggle_failed: 'Fehler beim Umschalten der Fähigkeit: ',
    linked_files: 'Verknüpfte Dateien',
    skill_load_failed: 'Fähigkeit konnte nicht geladen werden.',
    skill_file_load_failed: 'Datei konnte nicht geladen werden.',
    skill_name_required: 'Name erforderlich.',
    skill_updated: 'Fähigkeit aktualisiert.',
    skill_created: 'Fähigkeit erstellt.',
    skill_deleted: 'Fähigkeit gelöscht.',
    skill_delete_confirm: 'Fähigkeit wirklich löschen?',
    skills_empty_title: 'Keine Fähigkeiten',
    skills_empty_sub: 'Installieren Sie Fähigkeiten.',
    skills_edit: 'Bearbeiten',
    skills_delete: 'Löschen',
    skills_back_to: 'Zurück',
    tasks_empty_title: 'Keine Aufgaben',
    tasks_empty_sub: 'Verwalten Sie geplante Aufgaben.',
    workspaces_empty_title: 'Keine Arbeitsbereiche',
    workspaces_empty_sub: 'Richten Sie Arbeitsbereiche ein.',
    profiles_empty_title: 'Keine Profile',
    profiles_empty_sub: 'Erstellen Sie Profile.',
    memory_notes_label: 'Notizen',
    memory_saved: 'Notiz gespeichert.',
    my_notes: 'Meine Notizen',
    user_profile: 'Benutzerprofil',
    external_notes_sources: 'Notizen von Drittanbietern',
    external_notes_empty: 'Noch sind keine MCP-Quellen für Notizen oder Wissen sichtbar. Konfiguriere Joplin, Obsidian, Notion, llm-wiki oder einen anderen Notizen-Server, um ihn hier anzuzeigen.',
    external_notes_auto_recall_hint: 'Der automatische Sitzungsabruf bleibt unverändert; diese Leiste zeigt nur konfigurierte Quellen und verfügbare Lese-/Suchwerkzeuge.',
    external_notes_no_tools: 'Für diese Quelle sind derzeit keine Lese-/Suchwerkzeuge sichtbar.',
    external_notes_tool_count: (count) => `${count} Notizwerkzeug${Number(count)===1?'':'e'} verfügbar`,
    external_notes_configured_hint: 'Werkzeugnamen werden von dieser konfigurierten Quelle erwartet; Live-Schemas erscheinen, wenn die WebUI-Laufzeit sie bereitstellt.',
    external_notes_recent_ai: 'Zuletzt von der KI verwendet',
    external_notes_auto: 'auto',
    external_notes_recent_ai_reason: 'Automatischer Abruf',
    external_notes_search_placeholder: 'Notizen suchen…',
    external_notes_search_empty: 'Durchsuche eine konfigurierte Notizenquelle, um hier eine Vorschau zu sehen.',
    source_active: 'active',
    source_configured: 'configured',
    no_notes_yet: 'Noch keine Notizen.',
    no_profile_yet: 'Noch kein Profil.',
    agent_soul: 'Agenten-Seele',
    no_soul_yet: 'Noch keine Seele definiert.',
    workspace_choose_path: 'Arbeitsbereich wählen',
    workspace_choose_path_meta: 'Wählen Sie ein Verzeichnis.',
    workspace_manage: 'Arbeitsbereiche verwalten',
    workspace_manage_meta: 'Hinzufügen, Umbenennen, Entfernen.',
    workspace_use_title: 'Arbeitsbereich verwenden',
    workspace_use: 'Arbeitsbereich',
    workspace_add_path_placeholder: '~/projects/my-app',
    workspace_paths_validated_hint: 'Pfad ist gültig.',
    workspace_added: 'Arbeitsbereich hinzugefügt.',
    workspace_renamed: 'Arbeitsbereich umbenannt.',
    workspace_remove_confirm_title: 'Arbeitsbereich entfernen',
    workspace_remove_confirm_message: 'Arbeitsbereich entfernen?',
    workspace_removed: 'Arbeitsbereich entfernt.',
    workspace_switch_prompt_title: 'Zum Arbeitsbereich wechseln',
    workspace_switch_prompt_message: 'Wechsel zum Arbeitsbereich?',
    workspace_switch_prompt_confirm: 'Wechseln',
    workspace_switch_prompt_placeholder: 'Arbeitsbereichsname',
    workspace_not_added: 'Arbeitsbereich nicht hinzugefügt.',
    workspace_already_saved: 'Arbeitsbereich bereits vorhanden.',
    workspace_busy_switch: 'Arbeitsbereich kann nicht gewechselt werden.',
    discard_file_edits_title: 'Änderungen verwerfen',
    discard_file_edits_message: 'Ungespeicherte Änderungen verwerfen?',
    workspace_switched_to: 'Arbeitsbereich gewechselt zu: ',
    profiles_no_profiles: 'Keine Profile vorhanden.',
    profile_api_keys_configured: 'API-Schlüssel konfiguriert',
    profile_gateway_running: 'Gateway läuft',
    profile_gateway_stopped: 'Gateway gestoppt',
    profile_active: 'Aktiv',
    profile_no_configuration: 'Keine Konfiguration',
    profile_skill_count: (count) => `${count} Fähigkeit${count === 1 ? '' : 'en'}`,
    profile_use: 'Verwenden',
    profile_switch_title: 'Profil wechseln',
    profile_delete_title: 'Profil löschen',
    profile_default_label: 'Standard',
    profile_name_placeholder: 'Profilname',
    profile_clone_label: 'Klonen',
    profile_model_label: 'Modell / Anbieter',
    profile_model_hint: 'Wähle konfigurierte Anbieter und Modelle für dieses neue Profil.',
    profile_model_use_default: 'Standard des aktiven Profils verwenden',
    profile_base_url_placeholder: 'https://api.openai.com/v1',
    profile_api_key_placeholder: 'sk-…',
    manage_profiles: 'Profile verwalten',
    profiles_load_failed: 'Profile konnten nicht geladen werden.',
    profile_switched_new_conversation: 'Profil gewechselt. Neue Konversation.',
    profile_switched: 'Profil gewechselt.',
    profile_name_rule: 'Nur alphanumerische Zeichen.',
    profile_base_url_rule: 'Muss mit http:// oder https:// beginnen.',
    profile_created: 'Profil erstellt.',
    profile_delete_confirm_title: 'Profil löschen',
    profile_deleted: 'Profil gelöscht.',
    active_conversation_none: 'Keine aktive Konversation',
    active_conversation_meta: 'Aktive Konversation',
    settings_unsaved_changes: 'Ungespeicherte Änderungen',
    sign_out_failed: 'Abmeldung fehlgeschlagen.',
    disable_auth_confirm_title: 'Passwortschutz deaktivieren',
    disable_auth_confirm_message: 'Zugriff ohne Authentifizierung?',
    auth_disabled: 'Passwortschutz deaktiviert.',
    disable_auth_failed: 'Deaktivieren fehlgeschlagen.',
    bg_error_single: 'Hinterfrage {count} fehlgeschlagen.',
    bg_error_multi: '{count} Hinterfragen fehlgeschlagen.',
    media_audio_label: 'Audio',
    media_svg_label: 'Diagramm',
    media_video_label: 'Video',
    media_download: 'Herunterladen',
    csv_loading: 'CSV wird geladen',
    csv_too_large: 'CSV-Datei zu groß für Inline-Anzeige',
    csv_no_data: 'CSV-Datei enthält nicht genügend Daten',
    csv_error: 'CSV-Datei konnte nicht geladen werden',
    csv_header_note: 'Erste Zeile wird als Tabellenüberschrift angezeigt',
    excalidraw_loading: 'Diagramm wird geladen',
    excalidraw_too_large: 'Excalidraw-Datei zu groß für Inline-Anzeige',
    excalidraw_invalid: 'Ungültiges Excalidraw-Dateiformat',
    excalidraw_error: 'Excalidraw-Datei konnte nicht geladen werden',
    excalidraw_label: 'Diagramm',
    excalidraw_download: 'Herunterladen',
    excalidraw_empty: 'Leeres Diagramm',
    excalidraw_render_error: 'Diagramm konnte nicht gerendert werden',
    excalidraw_simplified: 'Vereinfachte SVG-Vorschau — nicht pixelgenau zum Excalidraw-Canvas',
    pdf_loading: 'PDF wird geladen {0}…',
    pdf_too_large: 'PDF zu groß für Inline-Vorschau',
    pdf_no_pages: 'PDF-Vorschau konnte nicht gerendert werden',
    pdf_error: 'PDF konnte nicht geladen werden',
    pdf_download: 'PDF herunterladen',
    html_loading: 'HTML-Vorschau wird geladen…',
    html_too_large: 'HTML zu groß für Inline-Vorschau',
    html_error: 'HTML-Vorschau konnte nicht geladen werden',
    html_open_full: 'Vollständige Seite öffnen',
    html_sandbox_label: 'HTML-Vorschau',
    // TTS (#499)
    tts_listen: 'Anhören',
    tts_not_supported: 'Sprachsynthese nicht verfügbar',
    settings_label_tts: 'Text-zu-Sprache für Antworten',
    settings_desc_tts: 'Lautsprecher-Symbol auf Assistenten-Nachrichten anzeigen',
    settings_label_tts_auto_read: 'Antworten automatisch vorlesen',
    settings_desc_tts_auto_read: 'Assistenten-Antworten automatisch vorlesen',
    // Composer voice-mode pref (#1488)
    settings_label_voice_mode: 'Hands-free voice mode button',  // TODO: translate
    settings_desc_voice_mode: 'Show the voice-mode button (audio waveform) next to the dictation mic. Lets you speak naturally — Hermes auto-sends after a pause and reads replies aloud. Requires a browser that supports both speech recognition and TTS.',
    settings_label_raw_audio: 'Send raw audio instead of transcribing',
    settings_desc_raw_audio: 'Record and send the original audio file to the agent instead of converting it to text first. The agent can then transcribe it or process the raw audio (emotion, background noise, custom STT). Like Telegram\'s voice message behavior.',
    voice_send_raw: 'Send raw audio',
    voice_raw_attached: 'Audio attached. Press Send or type more.',  // TODO: translate
    settings_label_tts_voice: 'Stimme',
    settings_desc_tts_voice: 'Stimme für Sprachsynthese auswählen',
    settings_label_tts_rate: 'Sprechgeschwindigkeit',
    settings_label_tts_pitch: 'Tonhöhe',
    settings_label_tts_engine: 'TTS-Engine',
    settings_desc_tts_engine: 'Sprach-Engine auswählen. Edge TTS verwendet Microsoft Neural Voices über den Server.',

    checkpoint_date: 'Date',  // TODO: translate
    checkpoint_diff_files_changed: (n) => `${n} file${n === 1 ? '' : 's'} changed`,  // TODO: translate
    checkpoint_diff_no_changes: 'No differences found between this checkpoint and the current workspace.',  // TODO: translate
    checkpoint_diff_title: 'Changes in checkpoint',  // TODO: translate
    checkpoint_empty: 'No checkpoints found for this workspace.',  // TODO: translate
    checkpoint_error: 'Failed to load checkpoints',  // TODO: translate
    checkpoint_files: 'Files',  // TODO: translate
    checkpoint_loading: 'Loading checkpoints…',  // TODO: translate
    checkpoint_message: 'Message',  // TODO: translate
    checkpoint_restore: 'Restore',  // TODO: translate
    checkpoint_restore_confirm_message: (ckpt) => `Restore workspace to checkpoint "${ckpt}"? This will overwrite files with the saved versions. Files added after this checkpoint will not be deleted.`,  // TODO: translate
    checkpoint_restore_confirm_title: 'Restore checkpoint?',  // TODO: translate
    checkpoint_restored: 'Checkpoint restored',  // TODO: translate
    checkpoint_title: 'Checkpoints',  // TODO: translate
    checkpoint_view_diff: 'View diff',  // TODO: translate
    insights_activity_by_day: 'Activity by Day',  // TODO: translate
    insights_activity_by_hour: 'Activity by Hour',  // TODO: translate
    insights_cost: 'Estimated Cost',  // TODO: translate
    insights_daily_tokens: 'Daily Tokens',
    insights_model_name: 'Model',
    insights_model_sessions: 'Sessions',
    insights_model_tokens: 'Tokens',
    insights_model_cost: 'Cost',
    insights_model_share: 'Share',
    insights_no_usage_data: 'No usage data yet',
    insights_footer: 'Showing data from the last {days} days',  // TODO: translate
    insights_skill_usage_title: 'Skill Usage',  // TODO: translate
    insights_skill_usage_sub: 'Tool invocation frequency',  // TODO: translate
    insights_skill_usage_total: 'Total invocations',  // TODO: translate
    insights_skill_usage_skills_used: 'Skills used',  // TODO: translate
    insights_skill_usage_no_data: 'No skill usage data yet',  // TODO: translate
    insights_skill_usage_no_data_hint: 'Skills will appear here once used in conversations.',  // TODO: translate
    insights_skill_usage_footer: 'Counts from ~/.hermes/skills/',  // TODO: translate
    insights_skill_usage_col_skill: 'Skill',  // TODO: translate
    insights_skill_usage_col_uses: 'Uses',  // TODO: translate
    insights_skill_usage_col_views: 'Views',  // TODO: translate
    insights_skill_usage_col_share: 'Usage %',  // TODO: translate
    insights_skill_usage_col_patches: 'Patches',  // TODO: translate
    insights_input_tokens: 'Input',  // TODO: translate
    insights_messages: 'Messages',  // TODO: translate
    insights_models: 'Models',  // TODO: translate
    insights_no_cost: 'N/A',  // TODO: translate
    insights_output_tokens: 'Output',  // TODO: translate
    insights_peak_hour: 'Peak: {hour}',  // TODO: translate
    insights_sessions: 'Sessions',  // TODO: translate
    insights_title: 'Usage Analytics',  // TODO: translate
    insights_token_breakdown: 'Token Breakdown',  // TODO: translate
    insights_tokens: 'Tokens',  // TODO: translate
    insights_total: 'Total',  // TODO: translate
    settings_desc_api_redact: 'Self-hosted users can disable for transparency (not recommended for shared instances).',  // TODO: translate
    settings_label_api_redact: 'Redact sensitive data in API responses',  // TODO: translate
    voice_error: 'Voice not supported in this browser',  // TODO: translate
    voice_listening: 'Listening…',  // TODO: translate
    voice_mode_active: 'Voice mode on',  // TODO: translate
    voice_mode_off: 'Voice mode off',  // TODO: translate
    voice_speaking: 'Speaking…',  // TODO: translate
    voice_thinking: 'Thinking…',  // TODO: translate
    // Composer voice buttons (#1488)
    voice_dictate: 'Dictate',  // TODO: translate
    voice_dictate_active: 'Stop dictation',
    voice_recording_active: 'Aufnahme stoppen',  // TODO: translate
    voice_mode_toggle: 'Voice mode',  // TODO: translate
    voice_mode_toggle_active: 'Exit voice mode',  // TODO: translate
    subagent_children: 'Subagent sessions',  // TODO: translate
    outline_title: 'Gliederung',
    outline_empty: 'Noch keine Fragen.',
    outline_loading: 'Laden…',
  },

  zh: {
    offline_title: '连接已断开',
    offline_browser_detail: '浏览器报告此设备当前离线。',
    offline_network_detail: '此浏览器当前无法连接到 Hermes。',
    offline_autorefresh: '当 Hermes 可访问时，我会自动刷新此页面。',
    offline_check_now: '立即检查',
    offline_checking: '正在检查…',
    offline_stream_waiting: '连接已断开。正在等待刷新…',
    _lang: 'zh',
    _label: '\u7b80\u4f53\u4e2d\u6587',
    _speech: 'zh-CN',
    // boot.js
    cancelling: '正在取消...',
    cancel_failed: '取消失败：',
    mic_denied: '麦克风访问被拒绝，请检查浏览器权限。',
    mic_no_speech: '没有检测到语音，请再试一次。',
    mic_network: '语音识别当前不可用。',
    mic_error: '语音输入出错：',
    session_imported: '会话已导入',
    import_failed: '导入失败：',
    import_invalid_json: 'JSON 无效',
    image_pasted: '已粘贴图片：',
    // messages.js
    edit_message: '编辑消息',
    regenerate: '重新生成回复',
    copy: '复制',
    copied: '已复制',
    copy_failed: '复制失败',
    selected_text_reply: '用所选内容回复',
    selected_text_reply_title: '将所选聊天文本作为引用上下文追加',
    selected_text_reply_appended: '已将所选文本添加到输入框',
    saved_prompts_empty: '暂无保存的提示。',
    saved_prompts_save_current: '将当前输入保存为提示',
    saved_prompts_saved: '提示已保存',
    saved_prompts_delete: '删除提示',
    saved_prompts_empty_input: '请先输入要保存的提示',

    diff_loading: '加载 diff',
    diff_error: '无法加载 patch 文件',
    diff_too_large: 'Patch 文件过大，无法内联显示',
    tree_view: '树形',
    raw_view: '原始',
    parse_failed_note: '解析失败',
    you: '你',
    mcp_servers_title: 'MCP 服务器',
    mcp_servers_desc: '管理 config.yaml 中配置的 MCP 服务器。',
    mcp_no_servers: '未配置 MCP 服务器。',
    mcp_add_server: '+ 添加服务器',
    mcp_field_name: '服务器名称',
    mcp_transport_label: '传输类型',
    mcp_field_command: '命令',
    mcp_field_args: '参数（逗号分隔）',
    mcp_field_url: 'URL',
    mcp_field_timeout: '超时（秒）',
    mcp_save: '保存',
    mcp_cancel: '取消',
    mcp_name_required: '服务器名称为必填项。',
    mcp_url_required: 'HTTP 传输需要 URL。',
    mcp_command_required: 'stdio 传输需要命令。',
    mcp_saved: 'MCP 服务器已保存。',
    mcp_save_failed: 'MCP 服务器保存失败。',
    mcp_delete_confirm_title: '删除 MCP 服务器',
    mcp_delete_confirm_message: '确定删除 MCP 服务器「{0}」吗？此操作不可撤销。',
    mcp_deleted: 'MCP 服务器已删除。',
    mcp_delete_failed: 'MCP 服务器删除失败。',
    mcp_load_failed: 'MCP 服务器加载失败。',
    mcp_restart_hint: '服务器更改目前为只读。请编辑 config.yaml 并重启 Hermes。',
    mcp_toggle_followup: '在 MCP 的重新加载规范明确之前，我们有意暂缓启用/禁用的切换。',
    mcp_status_active: '运行中',
    mcp_status_configured: '已配置',
    mcp_status_disabled: '已禁用',
    mcp_status_invalid_config: '配置无效',
    mcp_status_unknown: '未知',
    mcp_tool_count: '{0} 个工具',
    mcp_enabled_yes: '已启用',
    mcp_enabled_no: '已禁用',
    mcp_enable_server: '启用此 MCP 服务器',
    mcp_disable_server: '禁用此 MCP 服务器',
    mcp_enabled_toast: (name) => `MCP 服务器「${name}」已启用。`,
    mcp_disabled_toast: (name) => `MCP 服务器「${name}」已禁用。`,
    mcp_toggle_failed: '更新 MCP 服务器失败。',
    mcp_tools_title: 'MCP 工具',
    mcp_tools_desc: '搜索活跃 MCP 服务器中的已知工具。',
    mcp_tools_search_placeholder: '按名称、服务器或描述搜索工具…',
    mcp_tools_no_tools: '当前运行时清单中没有可用的 MCP 工具。',
    mcp_tools_no_matches: '没有匹配的 MCP 工具。',
    mcp_tools_load_failed: '加载 MCP 工具失败。',
    mcp_tools_schema_empty: '无参数。',
    mcp_tools_runtime_note: '工具清单仅使用已知的活跃 MCP 运行时数据；WebUI 不会启动或探测服务器。',
    mcp_tools_summary_no_matches: (query,total) => `没有匹配「${query}」的 MCP 工具（共 ${total} 个）。`,
    mcp_tools_summary_none: '没有 MCP 工具可显示。',
    mcp_tools_summary_matching: (query) => ` 匹配「${query}」`,
    mcp_tools_summary_total_note: (total) => `（共 ${total} 个）`,
    mcp_tools_summary_showing: (start,end,filtered,searchNote,totalNote,page,pages) => `显示第 ${start}-${end} 个，共 ${filtered} 个 MCP 工具${searchNote}${totalNote}。第 ${page}/${pages} 页。`,
    mcp_tools_page_size_prefix: '每页显示',
    mcp_tools_page_size_suffix: '个',
    mcp_tools_per_page_aria: '每页 MCP 工具数',
    mcp_tools_inactive_configured_servers: (servers) => `已配置但在此 WebUI 运行环境中未激活：${servers}。`,
    mcp_tools_pagination_label: 'MCP 工具分页',
    mcp_tools_previous_page: '‹ 上一页',
    mcp_tools_previous_page_aria: '上一页 MCP 工具',
    mcp_tools_next_page: '下一页 ›',
    mcp_tools_next_page_aria: '下一页 MCP 工具',
    thinking: '思考过程',
    expand_all: '全部展开',
    collapse_all: '全部折叠',
    edit_failed: '编辑失败：',
    regen_failed: '重新生成失败：',
    reconnect_active: '回复仍在生成中，准备好后要重新加载吗？',
    reconnect_finished: '你离开时有回复正在生成，消息内容可能已经更新。',
    // approval card
    approval_heading: '需要审批',
    approval_desc_prefix: '检测到危险命令',
    approval_btn_once: '允许一次',
    approval_btn_once_title: '允许执行此命令一次（Enter）',
    approval_btn_session: '本次允许',
    approval_btn_session_title: '本次会话期间允许',
    approval_btn_always: '始终允许',
    approval_btn_always_title: '始终允许此命令模式',
    approval_btn_deny: '拒绝',
    approval_btn_deny_title: '拒绝 — 不执行此命令',
    approval_responding: '处理中…',
    clarify_heading: '需要澄清',
    clarify_hint: '请选择一个选项，或在下方输入你自己的回答。',
    clarify_other: '其他',
    clarify_send: '发送',
    clarify_input_placeholder: '请输入你的回答…',
    clarify_responding: '处理中…',
    session_attention_approval: (n) => n === 1 ? '审批' : `${n} 个审批`,
    session_attention_clarify: (n) => n === 1 ? '问题' : `${n} 个问题`,
    session_attention_generic: (n) => n === 1 ? '注意' : `${n} 项`,
    session_attention_approval_title: '等待权限决定',
    session_attention_clarify_title: '等待你的回答',
    session_attention_generic_title: '等待用户操作',
    untitled: '未命名',
    n_messages: (n) => `${n} 条消息`,
    load_older_messages: '↑ 向上滚动或点击加载更早的消息',
    session_jump_start: '开头',
    session_jump_start_label: '跳转到会话开头',
    session_jump_end: '结尾',
    session_jump_end_label: '跳转到会话结尾',
    session_new_message: '新消息',
    session_new_message_label: '有新消息，跳转到结尾',
    jump_to_question: '回到回答',
    jump_to_question_label: '跳转到这条回答的开头',
    queued_label: '响应后发送',
    queued_count: (n) => n === 1 ? '1 条排队' : `${n} 条排队`,
    queued_cancel: '取消排队消息',
    model_unavailable: '（不可用）',
    model_unavailable_title: '这个模型已经不在当前 provider 列表中',
    provider_mismatch_warning: (m,p)=>`\"${m}\" 可能无法在当前配置的提供商 (${p}) 下工作。直接发送，或在终端运行 \`hermes model\` 切换。`,
    provider_mismatch_label: '提供商不匹配',
    gateway_auth_label: 'Gateway 身份验证失败',
    model_not_found_label: '未找到模型',
    model_custom_label: '自定义模型 ID',
    model_custom_placeholder: '例如 openai/gpt-5.4',
    model_search_placeholder: '搜索模型…',
    model_search_no_results: '未找到模型',
    model_group_configured: '已配置',
    ws_search_placeholder: '搜索工作区…',
    ws_no_results: '未找到工作区',
    workspace_new_worktree_conversation: '在 worktree 中新建对话',
    workspace_new_worktree_conversation_meta: '为此工作区创建隔离的 git worktree。',
    workspace_worktree_created: '已创建 worktree 对话',
    workspace_worktree_failed: 'Worktree 创建失败：',
    session_worktree_badge: 'Worktree',
    session_toolsets: 'Session 工具集',
    session_toolsets_desc: '限制此会话可用工具（留空 = 使用全局配置）',
    session_toolsets_global: '全局（默认）',
    session_toolsets_custom: '自定义',
    session_toolsets_placeholder: 'tool1, tool2, …', // 保持英文——这是占位符示例
    session_toolsets_apply: '应用',
    session_toolsets_clear: '清除（使用全局）',
    session_toolsets_applied: '工具集已更新',
    session_toolsets_cleared: '工具集已清除 — 使用全局配置',
    session_toolsets_failed: '更新工具集失败：',
    model_scope_advisory: '从下一条消息起应用于当前对话。',
    model_scope_toast: '从下一条消息起应用于当前对话。',
    // commands.js
    cmd_help: '查看可用命令',
    cmd_clear: '清空当前对话消息',
    cmd_compress: '手动压缩对话上下文（用法：/compress [主题]）',
    ctx_compress_hint: '压缩上下文以释放空间 →',
    ctx_compress_action: '⚠ 立即压缩以释放上下文',
    cmd_compact_alias: '旧别名：/compress',
    cmd_model: '切换模型（例如 /model gpt-4o）',
    cmd_workspace: '按名称切换工作区',
    cmd_terminal: '打开工作区 Terminal',
    cmd_new: '新建聊天会话',
    cmd_usage: '切换 token 用量显示',
    cmd_theme: '切换外观（主题：system/dark/light，皮肤：default/ares/mono/graphite/slate/poseidon/sisyphus/charizard/sienna/catppuccin/nous/geist-contrast/zeus/verdigris）',
    cmd_personality: '切换 Agent 人设',
    cmd_skills: '列出可用的 Hermes 技能',
    cmd_use: '为下一条消息强制使用技能',
    available_commands: '可用命令：',
    type_slash: '输入 / 可查看命令',
    conversation_cleared: '对话已清空',
    command_label: '命令',
    context_compaction_label: '上下文压缩',
    retrieval_context_label: '已索引上下文',
    retrieval_context_preview: '较早消息已存储，可通过上下文工具检索',
    preserved_task_list_label: '保留的任务列表',
    reference_only_label: '仅供参考',
    model_usage: '用法：/model <name>',
    no_model_match: '没有匹配“',
    model_did_you_mean: (m) => `，您是否想选择“${m}”？`,
    switched_to: '已切换到 ',
    workspace_usage: '用法：/workspace <name>',
    no_workspace_match: '没有匹配“',
    switched_workspace: '已切换工作区：',
    workspace_switch_failed: '工作区切换失败：',
    new_session: '已新建会话',
    new_session_creating: '正在创建新会话…',
    compressing: '正在请求压缩上下文...',
    compress_running_label: '压缩中',
    compress_complete_label: '压缩完成',
    auto_compress_label: '自动压缩',
    compress_failed_label: '压缩失败',
    focus_label: '主题',
    token_usage_on: 'Token 用量显示已开启',
    usage_personality_none: '无',
    token_usage_off: 'Token 用量显示已关闭',
    usage_cache_hit_detail: '缓存：{0}% 命中（读取 {1} / 写入 {2}）',
    usage_cached_percent: '{0}% 已缓存',
    theme_usage: '用法：/theme ',
    theme_set: '主题：',
    no_active_session: '当前没有活动会话',
    cmd_queue: '将消息加入下一轮的队列',
    cmd_goal: '设置或查看持久目标',
    goal_evaluating_progress: 'Evaluating goal progress…',
    goal_working_toward: 'Working toward goal…',
    goal_continuing_toast: 'Continuing toward goal…',
    goal_status_none: 'No active goal. Set one with /goal <text>.',
    goal_status_active: (turns, max_turns, goal) => `⊙ Goal (active, ${turns}/${max_turns} turns): ${goal}`,
    goal_status_paused: (turns, max_turns, reason, goal) => `⏸ Goal (paused, ${turns}/${max_turns}${reason ? `, ${reason}` : ''}): ${goal}`,
    goal_status_done: (turns, max_turns, goal) => `✓ Goal done (${turns}/${max_turns}): ${goal}`,
    goal_set: (turns, goal) => `⊙ Goal set (${turns}-turn budget): ${goal}`,
    goal_paused: (goal) => `⏸ Goal paused: ${goal}`,
    goal_resumed: (goal) => `▶ Goal resumed: ${goal}`,
    goal_cleared: 'Goal cleared.',
    goal_no_goal: 'No active goal.',
    goal_achieved: (reason) => `✓ Goal achieved: ${reason}`,
    goal_paused_budget_exhausted: (turns, max_turns) => `⏸ Goal paused — ${turns}/${max_turns} turns used. Use /goal resume to keep going, or /goal clear to stop.`,
    goal_continuing: (turns, max_turns, reason) => `↻ Continuing toward goal (${turns}/${max_turns}): ${reason}`,
    cmd_interrupt: '取消当前回合并发送新消息',
    cmd_steer: '用纠正信息引导代理（回退为中断）',
    cmd_queue_no_msg: '用法：/queue <消息>',
    cmd_queue_not_busy: '没有活动任务 — 直接发送即可',
    cmd_queue_confirm: '消息已加入队列',
    cmd_interrupt_no_msg: '用法：/interrupt <消息>',
    cmd_interrupt_confirm: '已中断 — 正在发送新消息',
    cmd_steer_no_msg: '用法：/steer <消息>',
    cmd_steer_fallback: 'Steer 不可用 — 已中断并加入队列',
    cmd_steer_delivered: 'Steer 已交付 — 代理将在下一个工具结果中看到',
    steer_leftover_queued: 'Steer 已加入下轮队列',
    busy_steer_fallback: 'Steer 不可用 — 已中断',
    busy_interrupt_confirm: '已中断 — 正在发送新消息',
    settings_label_busy_input_mode: '忙碌输入模式',
    settings_desc_busy_input_mode: '控制当代理正在运行时你发送消息会发生什么。队列会等待；中断会取消并重新开始；引导会在不中断的情况下注入中间修正（当流不可用时回退到队列）。',
    settings_label_fade_text_effect: '淡入文字效果',
    settings_desc_fade_text_effect: '在助手回复时淡入新流式单词。类似于 OpenWebUI；默认关闭以获得最佳性能。',
    settings_busy_input_mode_queue: '队列后续消息',
    settings_busy_input_mode_interrupt: '中断当前轮次',
    settings_busy_input_mode_steer: '引导（中间修正）',
    settings_plugins_title: '插件',
    plugins_enable_toggle: '启用',
    settings_plugins_meta: '查看已安装的 Hermes 插件及其注册的生命周期挂钩。此面板为只读。',
    settings_plugins_empty: '当前没有可见的 Hermes 插件。通过 Hermes CLI/配置文件安装或启用插件后即可在此查看。',
    plugins_unnamed: '未命名插件',
    plugins_no_description: '未提供描述信息。',
    plugins_no_hooks: '未注册生命周期挂钩',
    plugins_registered_hooks: '已注册的挂钩',
    plugins_enabled: '已启用',
    plugins_disabled: '已禁用',
    plugins_active_provider: '激活（提供方）',
    plugins_provider_no_hooks: '提供方插件 — 无代理可见挂钩',
    plugins_load_failed: '加载插件失败：',
    workspace_empty_no_path: '未选择工作区。请在 设置 → 工作区 中设置工作区以浏览文件。',
    workspace_empty_dir: '此工作区为空。',
    workspace_show_hidden_files: '显示隐藏文件',
    workspace_show_hidden_files_desc: '将 .DS_Store、.git、node_modules 以及其他隐藏文件/系统文件包含在文件树中。',
    workspace_hidden_files_visible: '隐藏 显示',
    workspace_hidden_files_visible_title: '隐藏文件已显示 — 点击查看选项',
    workspace_options: '工作区选项',
    no_personalities: '没有找到人设（可添加到 ~/.hermes/personalities/）',
    available_personalities: '可用人设：',
    personality_switch_hint: '\n\n使用 `/personality <name>` 切换，或用 `/personality none` 清空。',
    personalities_load_failed: '加载人设失败',
    personality_cleared: '人设已清空',
    personality_set: '当前人设：',
    failed_colon: '失败：',
    // ui.js
    no_workspace: '未选择工作区',
    terminal_open_title: '打开工作区 Terminal',
    terminal_no_workspace_title: '请先选择工作区再打开 Terminal',
    terminal_title: '终端',
    terminal_clear: '清屏',
    terminal_copy_output: '复制输出',
    terminal_restart: '重启',
    terminal_collapse: '折叠',
    terminal_expand: '展开',
    terminal_close: '关闭',
    terminal_input_placeholder: '输入命令...',
    terminal_start_failed: '终端启动失败：',
    terminal_input_failed: '终端输入失败：',
    terminal_copy_failed: '复制失败：',
    terminal_error: '终端错误',
    terminal_remote_backend_unsupported: '嵌入式终端仅支持本地终端后端。',
    dialog_confirm_title: '确认操作',
    dialog_prompt_title: '输入内容',
    dialog_confirm_btn: '确认',
    // workspace.js
    unsaved_confirm: '预览区有未保存修改，要放弃更改并继续跳转吗？',
    discard: '放弃',
    save: '保存',
    edit: '编辑',
    clear: '清空',
    create: '创建',
    remove: '移除',
    save_title: '保存修改',
    edit_title: '编辑此文件',
    saved: '已保存',
    save_failed: '保存失败：',
    image_load_failed: '图片加载失败',
    file_open_failed: '无法打开文件',
    downloading: (name) => `正在下载 ${name}...`,
    double_click_rename: '双击重命名',
    session_rename_failed_no_row: 'Could not start rename — row not found.',
    renamed_to: '已重命名为 ',
    rename_failed: '重命名失败：',
    moved_to: '已移动到 ',
    move_failed: '移动失败：',
    delete_title: '删除',
    delete_confirm: (name) => `要删除 ${name} 吗？`,
    delete_dir_confirm: (name) => `删除文件夹 "${name}" 及其所有内容？`,
    rename_title: '重命名',
    rename_prompt: '新名称:',
    deleted: '已删除 ',
    delete_failed: '删除失败：',
     reveal_in_finder: '在文件管理器中显示',
     reveal_failed: '显示失败：',
     copy_file_path: '\u590d\u5236\u6587\u4ef6\u8def\u5f84',
     open_in_vscode: '在VS Code中打开',
     open_in_vscode_failed: '在VS Code中打开失败：',
     download_folder: '下载文件夹',
    path_copied: '\u6587\u4ef6\u8def\u5f84\u5df2\u590d\u5236\u5230\u526a\u8d34\u677f',
    path_copy_failed: '\u590d\u5236\u8def\u5f84\u5931\u8d25\uff1a',
    session_rename: '\u91cd\u547d\u540d\u5bf9\u8bdd',
    session_rename_desc: '\u7f16\u8f91\u6b64\u5bf9\u8bdd\u7684\u6807\u9898',
    session_title_regenerate: '\u91cd\u65b0\u751f\u6210\u6807\u9898',
    session_title_regenerate_desc: '\u8ba9 Hermes \u6839\u636e\u5bf9\u8bdd\u751f\u6210\u65b0\u7684\u6807\u9898',
    session_title_regenerating: '\u6b63\u5728\u91cd\u65b0\u751f\u6210\u6807\u9898\u2026',
    session_title_regenerated: (title) => `\u6807\u9898\u5df2\u91cd\u65b0\u751f\u6210\uff1a${title}`,
    session_title_regenerate_failed: '\u91cd\u65b0\u751f\u6210\u6807\u9898\u5931\u8d25\uff1a',
    session_copy_link: '复制对话链接',
    session_copy_link_desc: '复制此对话的直接链接',
    session_link_copied: '对话链接已复制到剪贴板',
    session_link_copy_failed: '无法复制对话链接：',
    new_file_prompt: '新文件名（例如 notes.md）：',
    new_file: '新建文件',
    new_folder: '新建文件夹',
    workspace_root: '工作区根目录',
    new_file_prompt_title: '在 {0} 中新建文件名：',
    new_folder_prompt_title: '在 {0} 中新建文件夹名称：',
    project_name_prompt: '项目名称：',
    created: '已创建 ',
    create_failed: '创建失败：',
    new_folder_prompt: '新文件夹名称：',
    folder_created: '已创建文件夹 ',
    folder_create_failed: '创建文件夹失败：',
  workspace_auto_create_folder: '如果文件夹不存在则创建',
  folder_add_as_space_btn: '添加为工作区',
  folder_add_as_space_msg: '是否将此文件夹添加为新的工作区？',
  folder_add_as_space_title: '添加为工作区？',
    remove_title: '移除',
    empty_dir: '(空)',
    upload_failed: '上传失败：',
    upload_too_large: (maxMb, fileMb) => `\u6587\u4ef6\u8fc7\u5927\uff08${fileMb} MB\uff09\u3002\u6700\u5927\u4e0a\u4f20\u5927\u5c0f\u4e3a ${maxMb} MB\u3002`,
    uploading: '上传中…',
    uploaded: '已上传',
    all_uploads_failed: (n) => `${n} 个文件全部上传失败`,
    // settings panel
    settings_title: '设置',
    settings_save_btn: '保存设置',
    settings_label_model: '默认模型',
    settings_desc_model: '用于新对话。现有对话保持各自选定的模型。',
    settings_label_auxiliary_models: '辅助模型',
    settings_desc_auxiliary_models: '视觉分析、上下文压缩、标题生成等辅助任务的路由。"自动"表示使用主聊天模型。',
    settings_btn_reset_aux_models: '全部重置为自动',
    settings_btn_apply_aux_models: '应用更改',
    settings_aux_provider_auto: '使用主模型',
    settings_aux_model_auto: '自动（使用提供商默认）',
    settings_aux_model_custom: '自定义模型…',
    settings_aux_model_custom_prompt: '输入模型 ID：',
    settings_aux_loading: '正在加载辅助模型…',
    settings_aux_load_failed: '无法加载辅助模型设置，请确保 Agent API 可用。',
    settings_aux_reset_confirm_title: '重置辅助模型？',
    settings_aux_reset_confirm_msg: '这将把所有辅助任务设置为自动（使用主模型）。',
    settings_aux_reset_done: '辅助模型已重置为自动',
    settings_aux_save_failed: '辅助模型保存失败',
    settings_aux_saved: '辅助模型已更新',
    settings_aux_no_changes: '没有需要应用的更改',
    settings_label_send_key: '发送快捷键',
    settings_label_theme: '主题',
    settings_label_skin: '皮肤',
    settings_label_font_size: '字体大小',
    font_size_small: '小',
    font_size_default: '默认',
    font_size_large: '大',
    font_size_xlarge: '超大',
    settings_autosave_saving: '保存中…',
    settings_autosave_saved: '已保存',
    settings_autosave_failed: '保存失败',
    settings_autosave_retry: '重试',
    settings_label_language: '语言',
    settings_label_quota_chip: '在编辑器中显示供应商配额标签',
    settings_desc_quota_chip: '在编辑器底部显示剩余配额指示器（如 OpenRouter 信用余额）。默认关闭。启用时仅在宽屏（≥1400px）显示，以保持笔记本和标准桌面屏幕上编辑器的整洁。',
    settings_label_conversation_outline: '显示会话大纲',
    settings_desc_conversation_outline: '显示仅限桌面的跳转列表，用于跳转到当前会话中的用户问题。默认关闭。',
    settings_label_hide_suggestions: 'Hide new-chat suggestions',
    settings_desc_hide_suggestions: 'Hide the three default suggestion buttons on the empty new-chat screen to avoid accidental taps.',
    settings_label_token_usage: '显示 token 用量',
    settings_label_token_speed: '显示 token 速度 (TPS)',
    settings_desc_token_speed: '在流式传输期间和响应完成后，在助手消息标题中显示每秒 token 数。默认关闭。',
    settings_label_sidebar_density: '侧边栏密度',
    cmd_reasoning: '切换思维可见性（显示/隐藏）、设置工作强度或查看当前状态',
    settings_label_external_sessions: '显示外部会话',
    settings_label_cron_sessions: 'Show cron sessions',
    settings_label_previous_messaging_sessions: '显示以前的消息会话',
    settings_label_sync_insights: '同步到 insights',
    settings_label_check_updates: '检查更新',
    settings_label_ignore_agent_updates: 'Ignore Agent updates',
    settings_label_whats_new_summary: "Summarize What's New with AI",
    settings_label_bot_name: '默认助手名称',
    settings_label_password: '访问密码',
    settings_label_pinned_limit: '置顶对话数量限制',
    settings_desc_pinned_limit: '侧边栏中可置顶的活跃会话的最大数量。默认为 3。',
    settings_label_dashboard_mode: '官方 Hermes 仪表盘',
    settings_desc_dashboard_mode: '当官方 hermes 仪表盘可访问时，在导航栏显示链接。公开反向代理 URL 仅作为浏览器链接存储，不会由服务器探测。',
    settings_dashboard_mode_auto: '自动检测',
    settings_dashboard_mode_always: '始终显示',
    settings_dashboard_mode_never: '从不显示',
    settings_dashboard_save: '保存仪表盘链接设置',
    settings_label_gateway_status: '网关状态',
    settings_desc_gateway_status: 'Hermes 网关状态（Telegram、Discord、Slack 等）',
    gateway_not_configured: '网关未配置',
    gateway_metadata_stale: '网关元数据已过时',
    gateway_endpoint_unreachable: '网关端点无法访问',
    gateway_not_running: '网关未运行',
    gateway_running_label: '运行中',
    gateway_last_active: '最后活跃时间：',
    gateway_session_count: (n) => `${n} 个会话`,
    gateway_load_failed: '无法加载网关状态',
    settings_saved: '设置已保存',
    settings_save_failed: '保存失败：',
    settings_load_failed: '设置加载失败：',
    settings_saved_pw: '设置已保存，已启用密码保护，当前浏览器会保持登录',
    settings_saved_pw_updated: '设置已保存，密码已更新',
    // login page
    login_title: '登录',
    login_subtitle: '输入密码继续使用',
    login_placeholder: '密码',
    login_btn: '登录',
    login_invalid_pw: '密码错误',
    login_conn_failed: '连接失败',
    // sidebar & navigation
    tab_chat: '聊天',
    tab_memory: '记忆',
    tab_skills: '技能',
    tab_tasks: '任务',
    tab_kanban: '看板',
    kanban_board: '看板',
    kanban_visible_tasks: '{0} 个可见任务',
    kanban_search_tasks: '搜索任务',
    kanban_all_assignees: '所有负责人',
    kanban_all_tenants: '所有租户',
    kanban_include_archived: '包含已归档',
    kanban_no_matching_tasks: '没有匹配的任务',
    kanban_no_data: '无看板数据',
    kanban_work_queue_hint: '这是 Hermes Agent 的工作队列。创建或分类任务，分配任务，将其移至“就绪”状态，然后让调度员认领任务。',
    kanban_unavailable: '看板不可用',
    kanban_read_only: '只读视图',
    kanban_empty: '空',
    kanban_task: '任务',
    kanban_no_description: '无描述',
    kanban_refresh: '刷新',
    kanban_status_triage: '待分类',
    kanban_status_todo: '待办',
    kanban_status_ready: '就绪',
    kanban_status_running: '进行中',
    kanban_status_blocked: '阻塞',
    kanban_status_done: '完成',
    kanban_status_original_hint: '实际状态：{0}。此对话框仅支持编辑 Triage/Todo/Ready。',
    kanban_comments_count: '评论 ({0})',
    kanban_events_count: '事件 ({0})',
    kanban_links: '链接',
    kanban_parents: '父任务',
    kanban_children: '子任务',
    kanban_runs_count: '运行 ({0})',
    kanban_no_comments: '无评论',
    kanban_no_events: '无事件',
    kanban_no_runs: '无运行记录',
    kanban_title: '标题',
    kanban_description: '描述',
    kanban_description_placeholder: '可选 — 需要做什么、验收标准、链接',
    kanban_status: '状态',
    kanban_assignee: '负责人',
    kanban_assignee_placeholder: '可选 — 留空表示任意工作器',
    kanban_tenant: '租户',
    kanban_tenant_placeholder: '可选 — 项目或团队标识',
    kanban_priority: '优先级',
    kanban_priority_hint: '数值越高越先执行,默认为 0。',
    kanban_title_required: '标题为必填项。',
    kanban_edit_task: '编辑任务',
    kanban_run_dispatcher: '运行调度器',
    kanban_run_dispatcher_confirm: '将认领此看板的 Ready 任务并生成工作子进程(每次点击最多 8 个)。是否继续?',
    kanban_assignee_profiles_label: 'Hermes 配置',
    kanban_assignee_other_label: '其他 (CLI 通道 / 已删除的配置)',
    kanban_assignee_unassigned: '— 未分配 (不会自动运行) —',
    kanban_ready_needs_assignee: '您选择了「未分配」+「Ready」。调度器将跳过此任务。再次提交以确认,或选择一个配置。',
    kanban_dispatch_preview_prefix: '预览:',
    kanban_dispatch_run_prefix: '已调度:',
    kanban_dispatch_spawned: '已启动',
    kanban_dispatch_promoted: '已提升',
    kanban_dispatch_reclaimed: '已收回',
    kanban_dispatch_skipped_unassigned: '跳过 (未分配)',
    kanban_dispatch_skipped_nonspawnable: '跳过 (未知配置)',
    kanban_dispatch_auto_blocked: '自动阻止',
    kanban_dispatch_timed_out: '超时',
    kanban_dispatch_crashed: '崩溃',
    kanban_new_task: '新建任务',
    kanban_add_comment: '添加评论',
      kanban_only_mine: '仅我的',
      kanban_bulk_action: '批量操作',
      kanban_nudge_dispatcher: '提醒调度器',
      kanban_stats: '统计',
      kanban_worker_log: '工作日志',
      kanban_block: '阻塞',
      kanban_unblock: '解除阻塞',
      kanban_back_to_board: '返回看板',
      kanban_lanes_by_profile: '按配置文件分列',
      kanban_new_board: '新建看板…',
      kanban_rename_board: '重命名当前看板…',
      kanban_archive_board: '归档当前看板…',
      kanban_archive_board_confirm: '归档看板 "{name}"？任务仍保存在磁盘上，并且可以从 kanban/boards/_archived/ 恢复该看板。',
      kanban_board_archived: '看板已归档',
      kanban_board_name: '名称',
      kanban_board_slug: '标识（小写，连字符）',
      kanban_board_description: '描述（可选）',
      kanban_board_icon: '图标（emoji，可选）',
      kanban_board_color: '颜色（可选）',
      kanban_board_name_required: '名称为必填',
      kanban_board_slug_required: '标识为必填',
      kanban_card_complete: '完成',
      kanban_card_archive: '归档',
      kanban_unassigned: '未分配',
    kanban_status_archived: '已归档',
    tab_todos: '待办',
    tab_insights: '统计',
    tab_dashboard: 'Hermes 仪表盘',
    dashboard_loopback_warning: '仪表盘在服务器上仅限 loopback 访问。请从服务器本机浏览，或使用 --host 0.0.0.0 重启（不安全）。',
    tab_workspaces: '工作区',
    tab_profiles: '配置',
    tab_logs: '日志',
    tab_settings: '设置',

    logs_title: '日志',
    logs_file: '文件',
    logs_tail: '末尾',
    logs_auto_refresh: '自动刷新（5秒）',
    logs_wrap: '自动换行',
    logs_copy_all: '全部复制',
    logs_empty: '暂无日志。',
    logs_loading: '加载日志中…',
    logs_load_failed: '日志加载失败',
    logs_status_idle: '选择日志文件以查看最新内容。',
    logs_no_mtime: '尚未写入',
    logs_truncated_hint: '此处显示的是日志文件的末尾内容。为节省内存，已省略较早的数据。',
    logs_copied: '日志已复制',
    logs_severity: '严重性',
    logs_severity_all: '全部',
    logs_severity_errors: '错误',
    logs_severity_warnings: '警告+',
    logs_filter_active: '已显示（筛选器已启用）',
    new_conversation: '新建对话',
    filter_conversations: '筛选对话…',
    markdown_table_filter: '筛选表格',
    markdown_table_sort_column: '列排序',
    session_time_unknown: '未知',
    session_time_minutes_ago: (n) => `${n}分钟前`,
    session_time_hours_ago: (n) => `${n}小时前`,
    session_time_days_ago: (n) => `${n}天前`,
    session_time_last_week: '上周',
    session_time_bucket_today: '今天',
    session_time_bucket_yesterday: '昨天',
    session_time_bucket_this_week: '本周',
    session_time_bucket_last_week: '上周',
    session_time_bucket_older: '更早',
    scheduled_jobs: '定时任务',
    new_job: '新任务',
    search_skills: '搜索技能…',
    new_skill: '新技能',
    save_skill: '保存技能',
    personal_memory: '个人记忆',
    current_task_list: '当前任务列表',
    workspace_desc: '为你的会话添加并切换工作区。',
    session_meta_messages: (n) => `${n} 条消息`,
    session_meta_children: (n) => `${n} 子会话`,
    session_meta_segments: (n) => `${n} 段`,
    session_lineage_toggle_hint: '{0} — 较早的上下文轮次已折叠在这里。点击显示或隐藏。',
    session_lineage_static_hint: '{0} — 较早的上下文轮次已折叠在这里。',
    session_child_toggle_hint: '{0} — 从此会话派生的子对话。点击显示或隐藏。',
    session_readonly_title_hint: '只读导入会话 — {0}',
    session_lineage_segment_untitled: '未命名段',
    session_lineage_segment_open: '打开脉络段',
    new_profile: '新配置',
    transcript: '记录',
    download_transcript: '下载为 Markdown',
    import: '导入',
    export_session_json: 'JSON',
    export_session_json_tooltip: '将会话完整导出为 JSON',
    import_session_json_tooltip: '从 JSON 导入会话',
    clear_conversation_btn_tooltip: '清空此会话中的所有消息',
    editing: '编辑中',
    empty_title: '有什么可以帮您？',
    empty_subtitle: '随时提问、运行命令、浏览文件或管理定时任务。',
    cancel: '取消',
    loading: '加载中…',
    create_job: '创建任务',
    suggest_plan: '帮我规划一个小项目。',
    suggest_schedule: '今天有什么安排？',
    suggest_files: '这个工作区有哪些文件？',
    sign_out: '退出登录',
    settings_label_shutdown: '停止 Hermes WebUI 服务器',
    settings_desc_shutdown_before_cmd: '优雅地停止本地 WebUI 服务器。如果你通过 ',
    settings_desc_shutdown_between_cmds: ' 启动，并希望不切换到终端就停止它，这会很有用。要再次访问 WebUI，需要重新启动服务器（',
    settings_desc_shutdown_after_cmd: ' 或原生应用）。',
    settings_btn_shutdown: '停止服务器',
    settings_shutdown_confirm_title: '停止 Hermes WebUI',
    settings_shutdown_confirm_message: '停止 Hermes WebUI 服务器？',
    settings_shutdown_confirm_btn: '停止',
    settings_shutdown_stopped_message: '服务器已停止。你可以关闭此标签页。',
    // Providers panel (English fallback — native translations welcome in follow-up PRs)
    providers_tab_title: '提供商',
    providers_section_title: '提供商',
    providers_section_meta: '管理 AI 提供商的 API 密钥。更改立即生效。',
    providers_status_configured: 'API 密钥已配置',
    providers_status_not_configured: '无 API 密钥',
    providers_status_oauth: 'OAuth',
    providers_status_api_key: 'API 密钥',
    providers_status_not_configured_label: '未配置',
    providers_oauth_hint: '通过 OAuth 认证。无需 API 密钥。',
    providers_oauth_config_yaml_hint: '通过 config.yaml 配置的令牌。如需更新，请编辑 config.yaml 中的 providers 部分或运行 hermes auth。',
    providers_oauth_not_configured_hint: '未认证。在终端中运行 hermes auth 以配置此提供商。',
    providers_save: '保存',
    providers_refresh_models: 'Refresh models',
    providers_refreshing: 'Refreshing…',
    providers_models_refreshed: 'Models refreshed',
    providers_remove: '移除',
    providers_saving: '保存中…',
    providers_removing: '移除中…',
    providers_enter_key: '请输入 API 密钥',
    providers_empty: '未找到可配置的提供商。',
    providers_key_updated: 'API 密钥已保存',
    providers_key_removed: 'API 密钥已移除',
    providers_key_placeholder_new: 'sk-...',
    providers_key_placeholder_replace: '输入新密钥以替换…',
    provider_quota_title: '当前提供商配额',
    provider_quota_active_provider: '当前提供商',
    provider_quota_last_checked_after_refresh: '刷新后检查',
    provider_quota_last_checked: '上次检查 {0}',
    provider_quota_refresh_usage: '刷新用量',
    provider_quota_refreshing: '正在刷新...',
    provider_quota_refresh_title: '立即刷新提供商用量限制',
    provider_quota_refresh_succeeded: '提供商用量已刷新',
    provider_quota_refresh_failed: '提供商用量刷新失败',
    provider_quota_session_limit: '5 小时限制',
    provider_quota_weekly_limit: '每周限制',
    provider_quota_window_fallback: '窗口',
    provider_quota_metric_remaining: '剩余',
    provider_quota_metric_used: '已用',
    provider_quota_metric_limit: '限额',
    provider_quota_status_available: '可用',
    provider_quota_status_exhausted: '已耗尽',
    provider_quota_status_unavailable: '不可用',
    provider_quota_status_failed: '失败',
    provider_quota_status_checked: '已检查',
    provider_quota_status_no_key: '无密钥',
    provider_quota_status_invalid_key: '无效密钥',
    provider_quota_status_unsupported: '不支持',
    provider_quota_used_meta: '已用 {0}',
    provider_quota_resets_meta: '重置于 {0}',
    provider_quota_credential_pool: '凭据池',
    provider_quota_credential_label: '凭据 {0}',
    provider_quota_pool_plans: '方案：{0}',
    provider_quota_pool_no_windows: '未报告账户限制窗口。',
    provider_quota_account_limits_loaded: '账户限制已加载。',
    provider_quota_unavailable: '配额状态不可用',
    provider_quota_retry_after: '重试时间 {0}',
    provider_quota_pool_summary_available: '{0}/{1} 可用',
    provider_quota_pool_summary_exhausted: '{0} 个已耗尽',
    provider_quota_pool_summary_failed: '{0} 个失败',
    provider_quota_pool_summary_checked: '已检查 {0} 个',
    password_placeholder: '输入新密码…',
    password_env_var_locked: '当前已设置 HERMES_WEBUI_PASSWORD 环境变量并具有优先级。请取消该变量并重启服务器，才能在此管理密码。',
    password_env_var_locked_placeholder: '已锁定：已设置 HERMES_WEBUI_PASSWORD 环境变量',
    disable_auth: '停用认证',
    settings_label_rtl: '从右到左聊天布局',
    settings_desc_rtl: '为阿拉伯语或希伯来语等语言翻转聊天消息和编辑器输入的对齐方式。仅影响聊天区域 — 侧边栏和其他面板保持从左到右。',
    settings_label_sound: '通知声音',
    settings_label_notifications: '浏览器通知',
    settings_desc_sound: '助手完成回复时播放提示音。',
    settings_desc_notifications: '当标签页在后台时，回复完成后显示系统通知。',
    notifications_enable_btn: 'Enable notifications',
    notifications_test_btn: 'Send test',
    notifications_permission_status: (status) => `Permission: ${status}`,
    notifications_enabled_toast: 'Notifications enabled.',
    notifications_denied: 'Notifications are blocked in this browser. Enable them in browser settings.',
    notifications_unsupported: 'Notifications are not supported in this browser.',
    settings_desc_token_usage: '在助手每次回复下方显示输入/输出 token 数量。也可以用 /usage 切换。',
    settings_sidebar_density_compact: '紧凑',
    settings_sidebar_density_detailed: '详细',
    settings_desc_sidebar_density: '控制左侧会话列表展示多少元信息。',
    settings_label_auto_title_refresh: '自适应标题更新',
    settings_auto_title_refresh_off: '关闭',
    settings_auto_title_refresh_5: '每 5 轮对话',
    settings_auto_title_refresh_10: '每 10 轮对话',
    settings_auto_title_refresh_20: '每 20 轮对话',
    settings_desc_auto_title_refresh: '基于最新对话自动重新生成会话标题，使其随对话发展保持相关。需要配置 LLM 标题生成模型。',
    settings_desc_external_sessions: '在会话列表中显示来自 CLI、Telegram、Discord、Slack 等渠道的对话。点击可导入并继续对话。',
    settings_desc_cron_sessions: 'Surface cron job output as conversations in the sidebar. Only active when non-WebUI sessions are enabled. Defaults off; high-frequency jobs can flood the sidebar.',
    settings_desc_previous_messaging_sessions: '显示被 reset 或 compression 替换的较旧的 Discord、Telegram、Slack 和 Weixin 会话。',
    settings_desc_sync_insights: '将 WebUI token 使用情况同步到 state.db，使 hermes /insights 包含浏览器会话数据。默认关闭。',
    settings_desc_check_updates: '当有更新的 WebUI 或助手版本时显示横幅。会在后台定期执行 git fetch。',
    settings_desc_ignore_agent_updates: 'Keep WebUI update checks on, but hide Agent update notices and skip Agent update fetches.',
    settings_desc_whats_new_summary: "Changes the What's New action from opening the raw diff first to generating a short, human-readable summary. The regular diff comparison stays available after the summary.",
    settings_desc_bot_name: '仅用于默认个人资料。其他个人资料会使用各自的名称。',
    settings_desc_password: '输入新密码以设置或更改。留空保持当前设置。',
    // onboarding
    onboarding_badge: '首次运行',
    onboarding_title: '欢迎使用 Hermes Web UI',
    archive_extracted: (n, c) => `从 ${c} 个压缩包中解压了 ${n} 个文件`,
    onboarding_lead: '快速引导将验证 Hermes、保存真实的提供商配置、选择工作区和模型，并可选设置密码保护应用。',
    onboarding_back: '返回',
    onboarding_continue: '继续',
    onboarding_skip: '跳过设置',
    onboarding_skipped: '设置已跳过 — 使用现有配置。',
    onboarding_open: '打开 Hermes',
    onboarding_step_system_title: '系统检查',
    onboarding_step_system_desc: '验证 Hermes Agent 与配置可见性。',
    onboarding_step_setup_title: '提供商设置',
    onboarding_step_setup_desc: '保存最小可用的 Hermes 提供商配置。',
    onboarding_step_workspace_title: '工作区 + 模型',
    onboarding_step_workspace_desc: '为新会话和聊天选择默认值。',
    onboarding_step_password_title: '可选密码',
    onboarding_step_password_desc: '在分享前为 Web UI 添加保护。',
    onboarding_step_finish_title: '完成',
    onboarding_step_finish_desc: '确认信息并进入应用。',
    onboarding_notice_system_ready: 'Hermes Agent 看起来可从 Web UI 访问。',
    onboarding_notice_system_unavailable: 'Hermes Agent 尚未完全可用。Bootstrap 可以安装它，但提供商设置可能仍需要终端。',
    onboarding_check_agent: 'Hermes Agent',
    onboarding_check_agent_ready: '已检测且可导入',
    onboarding_check_agent_missing: '缺失或仅部分可导入',
    onboarding_check_password: '密码',
    onboarding_check_password_enabled: '已启用',
    onboarding_check_password_disabled: '尚未启用',
    onboarding_check_provider: '提供商配置',
    onboarding_check_provider_ready: '可开始聊天',
    onboarding_check_provider_partial: '已保存但不完整',
    onboarding_check_provider_pending: '需要验证',
    onboarding_config_file: '配置文件：',
    onboarding_env_file: '.env 文件：',
    onboarding_unknown: '未知',
    onboarding_current_provider: '当前配置：',
    onboarding_missing_imports: '缺失导入：',
    onboarding_notice_setup_required: '请先在此选择一个简单的提供商路径。高级 OAuth 流程暂时仍建议在 Hermes CLI 中完成。',
    onboarding_notice_setup_already_ready: '已检测到可用的 Hermes 提供商配置。你可以保留它，或在这里替换。',
    onboarding_oauth_provider_ready_title: '提供商已完成认证',
    onboarding_oauth_provider_ready_body: '此实例已配置为使用通过 Hermes CLI 设置的 OAuth 提供商（<strong>{provider}</strong>）。这里不需要 API key，点击继续即可完成设置。',
    onboarding_oauth_provider_not_ready_title: 'OAuth 提供商尚未认证',
    onboarding_oauth_provider_not_ready_body: '此实例已配置为使用 <strong>{provider}</strong>，该提供商使用 OAuth 而非 API key。请在终端运行 <code>hermes auth</code> 或 <code>hermes model</code> 完成认证，然后重新加载 Web UI。',
    onboarding_oauth_switch_hint: '或者在下方选择其他提供商，切换到 API key 配置：',
    onboarding_notice_workspace: '这些值复用与正式应用相同的设置 API。',
    onboarding_workspace_label: '工作区',
    onboarding_workspace_or_path: '或输入工作区路径',
    onboarding_workspace_placeholder: '/home/you/workspace',
    onboarding_provider_label: '设置模式',
    onboarding_quick_setup_badge: '快速设置',
    provider_category_easy_start: '快速开始',
    provider_category_self_hosted: '本地 / 开源',
    provider_category_specialized: '专业服务',
    onboarding_api_key_label: 'API key',
    onboarding_api_key_placeholder: '留空可保留已保存的 key',
    onboarding_api_key_label_optional: 'API 密钥（可选）',
    onboarding_api_key_placeholder_optional: '留空用于无需密钥的服务器',
    onboarding_api_key_help_keyless: '大多数 LM Studio / Ollama / vLLM 安装无需密钥即可运行。',
    oauth_login_codex: '使用 Codex (ChatGPT) 登录',
    oauth_codex_step1: '步骤 1：访问此 URL 并输入代码',
    oauth_codex_step2: '步骤 2：在页面上输入此代码',
    oauth_codex_polling: '等待授权…',
    oauth_codex_success: 'Codex OAuth 登录成功！',
    oauth_codex_error: 'OAuth 登录失败',
    oauth_codex_expired: '代码已过期，请重试',
    onboarding_api_key_help_prefix: '会作为密钥保存到 Hermes .env 文件中，变量名为',
    onboarding_base_url_label: 'Base URL',
    onboarding_base_url_placeholder: 'https://your-endpoint.example/v1',
    onboarding_base_url_help: '用于 OpenAI 兼容路由、自托管服务、LiteLLM、Ollama、LM Studio、vLLM 或类似端点。',
    onboarding_model_label: '默认模型',
    onboarding_workspace_help: '选择设置完成后 Hermes 在新聊天中使用的模型。',
    onboarding_custom_model_placeholder: 'your-model-name',
    onboarding_custom_model_help: '对于自定义端点，请填写服务端要求的精确模型 ID。',
    onboarding_notice_password_enabled: '已配置密码。仅在你想替换时输入新密码。',
    onboarding_notice_password_recommended: '可选，但如果你会把 UI 暴露到 localhost 之外，建议设置。',
    onboarding_password_label: '密码（可选）',
    onboarding_password_placeholder: '留空则跳过',
    onboarding_password_help: '密码通过现有设置 API 保存，并在服务端进行哈希处理。',
    onboarding_notice_finish: '你之后仍可在设置中修改这些选项。',
    onboarding_not_set: '未设置',
    onboarding_password_will_enable: '将启用',
    onboarding_password_will_replace: '将被替换',
    onboarding_password_keep_existing: '保留当前密码',
    onboarding_password_remains_disabled: '将保持禁用',
    onboarding_password_skipped: '暂时跳过',
    onboarding_finish_help: '完成后会在设置中写入 <code>onboarding_completed</code>，并进入常规应用界面。',
    onboarding_error_choose_workspace: '继续前请先选择工作区。',
    onboarding_error_choose_model: '继续前请先选择模型。',
    onboarding_error_provider_required: '继续前请先选择设置模式。',
    onboarding_error_base_url_required: '自定义端点必须填写 Base URL。',
    onboarding_probe_test_button: '测试连接',
    onboarding_probe_probing: '正在测试连接…',
    onboarding_probe_ok: '已连接。{n} 个模型可用。',
    onboarding_probe_error_generic: '无法访问配置的基础 URL。',
    onboarding_probe_error_invalid_url: '基础 URL 必须以 http:// 或 https:// 开头。',
    onboarding_probe_error_dns: '无法解析主机名。请检查 URL，或在 Docker 中使用主机 IP 而非 localhost。',
    onboarding_probe_error_connect_refused: '连接被拒绝 — 该地址上可能没有运行服务器。在 Docker 容器内，请使用主机 IP 而非 localhost。',
    onboarding_probe_error_timeout: '端点未及时响应。请确认服务器正在运行且 URL 正确。',
    onboarding_probe_error_http_4xx: '端点返回客户端错误。请检查认证信息和 URL 路径（通常以 /v1 结尾）。',
    onboarding_probe_error_http_5xx: '端点返回服务器错误。请检查 LM Studio / Ollama 服务器日志。',
    onboarding_probe_error_parse: '端点未返回预期的模型列表格式。请确认 URL 指向 OpenAI 兼容的 API 根路径。',
    onboarding_probe_error_unreachable: '无法访问配置的基础 URL。',
    onboarding_error_probe_failed: '无法验证配置的基础 URL。',
    onboarding_error_workspace_required: '必须填写工作区。',
    onboarding_error_model_required: '必须填写模型。',
    onboarding_complete: '引导完成',

    // panel/runtime i18n
    error_prefix: '错误：',
    default: 'default',
    search: 'Search',
    not_available: '无',
    never: '从未',
    add: '添加',
    add_failed: '添加失败：',
    remove_failed: '移除失败：',
    switch_failed: '切换失败：',
    name_required: '名称不能为空',
    content_required: '内容不能为空',
    view: '查看',
    dismiss: '忽略',
    disable: '停用',
    cron_no_jobs: '未找到定时任务。',
    cron_status_off: '关闭',
    cron_status_paused: '暂停',
    cron_status_error: '错误',
    cron_status_active: '已启用',
    cron_status_running: '执行中\u2026',
    cron_status_needs_attention: '需要处理',
    cron_attention_desc: '这个重复定时任务没有下次运行时间。调度器可能没能计算出下一次运行。',
    cron_attention_croniter_hint: 'Gateway 运行环境可能缺少 croniter 包。请用支持 cron 的环境重启 Gateway，然后恢复这个任务。',
    cron_attention_resume: '恢复并重新计算',
    cron_jobs_project: '定时任务',
    cron_attention_run_once: '立即运行一次',
    cron_attention_copy_diagnostics: '复制诊断信息',
    cron_diagnostics_copied: '定时任务诊断信息已复制',
    cron_next: '下次',
    cron_last: '上次',
    cron_run_now: '立即运行',
    cron_pause: '暂停',
    cron_resume: '恢复',
    cron_job_name_placeholder: '任务名称',
    cron_schedule_placeholder: '调度表达式',
    cron_prompt_placeholder: '提示词',
    cron_last_output: '最近输出',
    cron_expand_prompt: '展开提示词',
    cron_collapse_prompt: '收起提示词',
    cron_expand_output: '展开输出',
    cron_collapse_output: '收起输出',
    cron_mode_agent: '代理',
    cron_mode_script: '脚本',
    cron_mode_label: '模式',
    cron_script_job_banner: '按计划运行脚本，stdout 会投递到目标。不使用代理、提示词或技能。',
    cron_script_card_title: '脚本',
    cron_script_output: '脚本输出',
    cron_script_path_label: '脚本路径',
    cron_script_path_hint: '除非是绝对路径，否则在 ~/.hermes/scripts/ 下解析。请在服务器上编辑脚本文件以更改行为。',
    cron_script_badge_title: '脚本任务（无代理）',
    cron_workdir_label: '工作目录',
    cron_view_full_output: 'View full output',
    cron_all_runs: '全部运行记录',
    cron_hide_runs: '隐藏记录',
    cron_no_runs_yet: '（暂无运行记录）',
    cron_schedule_required_example: '必须填写调度（例如 "0 9 * * *" 或 "every 1h"）',
    cron_schedule_required: '必须填写调度',
    cron_prompt_required: '必须填写提示词',
    cron_job_created: '任务已创建',
    cron_job_triggered: '任务已触发',
    cron_job_paused: '任务已暂停',
    cron_job_resumed: '任务已恢复',
    cron_job_updated: '任务已更新',
    cron_model_label: '模型覆盖',
    cron_model_hint: '覆盖此任务的默认模型。',
    cron_model_use_default: '默认（使用配置/系统默认）',
    cron_delete_confirm_title: '删除定时任务',
    cron_delete_confirm_message: '此操作无法撤销。',
    cron_job_deleted: '任务已删除',
    cron_completion_status: (name, status) => `定时任务“${name}”${status}`,
    status_failed: '失败',
    status_completed: '完成',
    todos_no_active: '此会话暂无活动任务列表。',
    clear_conversation_title: '清空对话',
    clear_conversation_message: '要清空所有消息吗？此操作无法撤销。',
    clear_failed: '清空失败：',
    skills_no_match: '没有匹配的技能。',
    skill_enabled: '已启用',
    skill_disabled: '已禁用',
    skill_toggle_failed: '切换技能失败：',
    linked_files: '关联文件',
    skill_load_failed: '加载技能失败：',
    skill_file_load_failed: '加载文件失败：',
    skill_name_required: '技能名称不能为空',
    skill_updated: '技能已更新',
    skill_created: '技能已创建',
    memory_notes_label: '记忆（备注）',
    memory_saved: '记忆已保存',
    my_notes: '我的备注',
    user_profile: '用户画像',
    external_notes_sources: '第三方笔记',
    external_notes_empty: '还没有可见的笔记或知识 MCP 来源。配置 Joplin、Obsidian、Notion、llm-wiki 或其他笔记服务器后会显示在这里。',
    external_notes_auto_recall_hint: '自动会话召回保持不变；这个抽屉只显示已配置的来源和可用的读取/搜索工具。',
    external_notes_no_tools: '此来源当前没有可见的读取/搜索工具。',
    external_notes_tool_count: (count) => `${count} 个笔记工具可用`,
    external_notes_configured_hint: '此已配置来源应提供工具名称；当 WebUI 运行时暴露实时 schema 后会显示在这里。',
    external_notes_recent_ai: 'AI 最近使用',
    external_notes_auto: 'auto',
    external_notes_recent_ai_reason: '自动召回',
    external_notes_search_placeholder: '搜索笔记…',
    external_notes_search_empty: '搜索已配置的笔记来源后，可在这里预览笔记。',
    source_active: 'active',
    source_configured: 'configured',
    no_notes_yet: '暂无备注。',
    no_profile_yet: '暂无用户画像。',
    agent_soul: '智能体灵魂',
    no_soul_yet: '暂无灵魂定义。',
    workspace_choose_path: '选择工作区路径',
    workspace_choose_path_meta: '添加已校验路径并切换当前会话',
    workspace_manage: '管理工作区',
    workspace_manage_meta: '打开 Spaces 面板',
    workspace_use_title: '用于当前会话',
    workspace_use: '使用',
    workspace_add_path_placeholder: '添加工作区路径（例如 /home/user/my-project）',
    workspace_paths_validated_hint: '保存前会校验路径是否为已存在目录。',

    workspace_drag_hint: '拖动以重新排序',
    workspace_reorder_failed: '重新排序失败',
    workspace_added: '工作区已添加',
    workspace_renamed: '工作区已重命名',
    workspace_remove_confirm_title: '移除工作区',
    workspace_remove_confirm_message: (path) => `要移除"${path}"吗？`,
    workspace_removed: '工作区已移除',
    workspace_switch_prompt_title: '切换工作区',
    workspace_switch_prompt_message: '输入绝对路径以添加并切换当前会话的工作区。',
    workspace_switch_prompt_confirm: '切换',
    workspace_switch_prompt_placeholder: '/Users/you/project',
    workspace_not_added: '工作区未添加成功',
    workspace_already_saved: '工作区已存在，请在列表中选择',
    workspace_busy_switch: 'Agent 运行中，无法切换工作区',
    discard_file_edits_title: '放弃文件编辑？',
    discard_file_edits_message: '切换工作区将丢弃预览区未保存的文件修改。',
    workspace_switched_to: (name) => `已切换到 ${name}`,
    profiles_no_profiles: '未找到配置档。',
    profile_api_keys_configured: '已配置 API 密钥',
    profile_gateway_running: '网关运行中',
    profile_gateway_stopped: '网关已停止',
    profile_active: '当前',
    profile_no_configuration: '无配置',
    profile_skill_count: (count) => `${count} 个技能`,
    profile_use: '使用',
    profile_switch_title: '切换到此配置档',
    profile_delete_title: '删除此配置档',
    profile_default_label: '（默认）',
    profile_name_placeholder: '配置档名称（小写字母、a-z、0-9、连字符）',
    profile_clone_label: '复制当前配置档的配置',
    profile_model_label: '模型 / 提供商',
    profile_model_hint: '为这个新配置档选择已配置的提供商和模型。',
    profile_model_use_default: '使用当前配置档默认值',
    profile_base_url_placeholder: 'Base URL（可选，例如 http://localhost:11434）',
    profile_api_key_placeholder: 'API 密钥（可选）',
    manage_profiles: '管理配置档',
    profiles_load_failed: '加载配置档失败',
    profile_switched_new_conversation: (name) => `已切换到配置档：${name}，并新建对话`,
    profile_switched: (name) => `已切换到配置档：${name}`,
    profile_name_rule: '仅允许小写字母、数字、连字符和下划线',
    profile_base_url_rule: 'Base URL 必须以 http:// 或 https:// 开头',
    profile_created: (name) => `配置档已创建：${name}`,
    profile_delete_confirm_title: (name) => `删除配置档“${name}”？`,
    profile_delete_confirm_message: '该配置档的所有会话、配置、技能和记忆将被永久删除。此操作无法撤销。',
    profile_deleted: (name) => `配置档已删除：${name}`,
    active_conversation_none: '当前未选择活动会话。',
    active_conversation_meta: (title, count) => `${title} · ${count} 条消息`,
    settings_unsaved_changes: '你有未保存的更改。',
    sign_out_failed: '退出登录失败：',
    disable_auth_confirm_title: '停用密码保护',
    disable_auth_confirm_message: '任何人都可以访问此实例。',
    auth_disabled: '认证已停用，密码保护已移除',
    disable_auth_failed: '停用认证失败：',
    bg_error_single: (title) => `“${title}”出现错误`,
    bg_error_multi: (count) => `${count} 个会话出现错误`,
    skill_deleted: '技能已删除',
    skill_delete_confirm: '删除技能 "{0}"？',
    skills_empty_title: '选择一个技能',
    skills_empty_sub: '从侧边栏中选择一个技能以查看其内容，或创建一个新技能。',
    skills_edit: '编辑',
    skills_delete: '删除',
    skills_back_to: '返回 {0}',
    tasks_empty_title: '选择一个计划任务',
    tasks_empty_sub: '从侧边栏中选择一个任务以查看其详情和运行记录，或创建一个新任务。',
    workspaces_empty_title: '选择一个空间',
    workspaces_empty_sub: '从侧边栏中选择一个空间以查看其文件和设置，或添加一个新空间。',
    profiles_empty_title: '选择一个配置文件',
    profiles_empty_sub: '从侧边栏中选择一个代理配置文件以查看和编辑其设置，或创建一个新配置文件。',
    // skill form
    skill_name: '名称',
    skill_category: '分类',
    skill_category_placeholder: '可选，例如 devops',
    skill_content: 'SKILL.md 内容',
    skill_content_placeholder: 'YAML frontmatter + markdown 正文',
    skill_rename_not_supported: '不支持重命名技能。请创建新技能并删除旧技能。',
    skill_metadata: '元数据',
    // cron form
    cron_name_label: '名称',
    cron_name_placeholder: '可选',
    cron_schedule_label: '计划',
    cron_schedule_hint: "循环任务请用 'every 1h' 或 Cron 表达式。像 '30m' 这样的裸时长只会运行一次。",
    cron_schedule_once_warning: "像 '30m' 这样的时长写法只会运行一次，并在运行后移除。要保留循环任务，请使用 'every 30m'。",
    cron_prompt_label: '提示词',
    cron_deliver_label: '输出位置',
    cron_deliver_local: '本地（仅保存输出）',
    cron_deliver_custom: '自定义推送目标',
    cron_profile_label: '配置档',
    cron_profile_server_default: '服务器默认',
    cron_profile_server_default_hint: '运行时使用 WebUI 服务器默认配置档。没有配置档的现有作业会保留此旧行为。',
    cron_toast_notifications_label: '完成提示',
    cron_toast_notifications_hint: '此 Cron 完成时显示 toast。关闭后，任务徽标和新运行标记仍会更新。',
    cron_toast_notifications_enabled: '已启用',
    cron_toast_notifications_disabled: '已禁用',
    cron_skills_label: '技能',
    cron_skills_placeholder: '添加技能（可选）…',
    cron_skills_edit_hint: '创建后无法再编辑技能列表。',
    cron_duplicate: '复制',
    cron_duplicated: '任务已复制（已暂停）',
    // workspace form
    workspace_name_label: '名称',
    workspace_name_placeholder: '可选的友好名称',
    workspace_path_label: '路径',
    workspace_path_required: '路径是必填项',
    workspace_path_readonly: '路径不可更改。只能重命名。',
    workspace_new_title: '新空间',
    // profile form
    profile_name_label: '名称',
    profile_base_url_label: '基础 URL',
    profile_api_key_label: 'API 密钥',
  
    // Session management and settings keys (en fallback — pending translation)
    session_archive: '归档会话',
    session_hide_external: '从列表中隐藏',
    session_archive_desc: '隐藏此会话，直到显示归档',
    session_archive_worktree_desc: '隐藏此会话；保留磁盘上的 worktree',
    session_hide_external_desc: '从 WebUI 列表中隐藏此导入的会话，不删除原始历史记录。',
    session_archive_failed: '归档失败：',
    session_archived: '会话已归档',
    session_archived_worktree: '会话已归档。Worktree 仍保留在磁盘上。',
    session_hidden: '已从列表中隐藏会话',
    session_delete: '删除会话',
    session_delete_desc: '永久删除此会话',
    session_delete_confirm: '删除此会话？',
    session_delete_worktree_desc: '仅删除 WebUI 会话；保留磁盘上的 worktree',
    session_delete_worktree_confirm: (path) => `删除此会话？位于 ${path} 的 worktree 将保留在磁盘上。`,
    session_deleted: '会话已删除',
    session_deleted_worktree: '会话已删除。Worktree 仍保留在磁盘上。',
    session_worktree_remove: '删除 worktree',
    session_worktree_remove_desc: (path) => `删除位于 ${path} 的 git worktree`,
    session_worktree_remove_confirm: (path) => `确定从磁盘删除 git worktree？\n\n路径：${path}\n\n整个 worktree 目录将被删除，WebUI 中的会话数据保留。`,
    session_worktree_remove_not_exists: (path) => `位于 ${path} 的 worktree 在磁盘上已不存在。`,
    session_worktree_remove_confirm_label: '删除',
    session_worktree_removed: 'Worktree 已删除。',
    session_worktree_remove_failed: '删除 worktree 失败：',
    session_worktree_remove_status_failed: '读取 worktree 状态失败：',
    session_worktree_remove_locked_by_stream: '无法删除 — 存在活跃的流式会话正在使用此 worktree。',
    session_worktree_remove_locked_by_terminal: '无法删除 — 存在活跃的终端会话正在使用此 worktree。',
    session_worktree_remove_unsafe_blocked: '请先处理本地更改或未推送提交，再删除此 worktree。',
    session_worktree_remove_dirty_warning: '⚠️ 此 worktree 有未提交的更改，将被永久删除。',
    session_worktree_remove_untracked_warning: (count) => `${count} 个未追踪文件将被永久删除。`,
    session_worktree_remove_ahead_warning: (ahead) => `${ahead} 个未推送的提交将丢失。`,
    session_duplicate: '复制会话',
    session_duplicate_desc: '用相同工作区和模型创建副本',
    session_duplicate_failed: '复制失败：',
    session_stop_response: '停止回复',
    session_stop_response_desc: '取消此会话正在进行的回复',
    session_duplicated: '会话已复制',
    session_move_project: '移至项目',
    session_move_project_desc_has: '更改此会话的项目',
    session_move_project_desc_none: '为此会话分配项目',
    session_pin: '置顶会话',
    session_pin_desc: '将此会话保持在顶部',
    session_pin_failed: '置顶失败：',
    session_restore: '恢复会话',
    session_restore_desc: '将会话恢复到主列表',
    session_restored: '会话已恢复',
    session_unpin: '取消置顶',
    session_unpin_desc: '从置顶中移除',
    session_select_mode: '选择',
    session_select_mode_desc: '选择会话以批量管理',
    session_select_all: '全选',
    session_deselect_all: '取消全选',
    session_selected_count: '已选 {0} 个',
    session_batch_archive: '归档',
    session_batch_delete: '删除',
    session_batch_move: '移动到项目',
    session_batch_delete_confirm: '删除 {0} 个会话？',
    session_batch_archive_confirm: '归档 {0} 个会话？',
    session_batch_delete_worktree_confirm: '删除 {0} 个会话？其中 {1} 个 worktree 会话会把 worktree 目录保留在磁盘上。',
    session_batch_archive_worktree_confirm: '归档 {0} 个会话？其中 {1} 个 worktree 会话会把 worktree 目录保留在磁盘上。',
    session_no_selection: '未选择任何会话',
    settings_dropdown_appearance: '外观',
    settings_dropdown_conversation: '对话',
    settings_dropdown_preferences: '偏好',
    settings_dropdown_providers: '提供商',
    settings_dropdown_system: '系统',
    settings_heading_subtitle: '偏好设置、对话工具和系统控制。',
    settings_heading_title: '控制中心',
    settings_section_appearance_meta: '主题、强调色和视觉风格。',
    settings_section_appearance_title: '外观',
    settings_section_conversation_title: '对话',
    settings_section_preferences_meta: 'Hermes WebUI 的默认和 UI 行为。',
    settings_section_preferences_title: '偏好',
    settings_section_system_meta: '实例版本和访问控制。',
    settings_check_now: '立即检查',
    settings_checking: '检查中\u2026',
    settings_up_to_date: '已是最新 \u2713',
    settings_updates_available: '有 {count} 个更新可用',
    settings_updates_disabled: '更新检查已禁用',
    settings_update_check_failed: '更新检查失败',
    settings_label_workspace_panel_open: '默认保持工作区面板打开',
    settings_desc_workspace_panel_open: '启用后，工作区/文件浏览器面板会在每次新会话时自动打开。您仍可随时手动关闭。',
    settings_label_session_jump_buttons: '显示会话跳转按钮',
    settings_desc_session_jump_buttons: '阅读较长会话历史时显示悬浮的开头和结尾按钮。',
    settings_label_terminal_auto_expand: '输出时自动展开终端',
    settings_desc_terminal_auto_expand: '当运行中的命令产生新输出时，自动展开已折叠的终端面板。',

    settings_label_session_endless_scroll: '向上滚动时加载更早的消息',

    settings_desc_session_endless_scroll: '启用后，向上滚动时会自动加载更早的消息。禁用时请使用加载更早消息按钮。',
    settings_label_auto_scroll_follow: '自动跟随新内容',
    settings_desc_auto_scroll_follow: '启用后，流式输出时页面会自动滚动到底部。禁用后，你可以自由控制滚动位置，阅读答案不会被拽到底部。',
    settings_label_worklog_details_expanded_default: 'Open Worklog details automatically',
    settings_desc_worklog_details_expanded_default: 'When enabled, new Worklog details start expanded so tool, thinking, and progress cards are visible without an extra click. When off, Worklog details stay folded by default; per-turn manual collapse/expand choices still win.',
    settings_label_chat_activity_display_mode: 'Activity display',
    settings_desc_chat_activity_display_mode: 'Compact Worklog groups supporting activity into a quiet summary. Transparent Stream keeps each thinking/tool event as its own chronological expandable row.',
    first_token_time: 'Time to first token',
    done: 'Done',
    settings_option_compact_worklog: 'Compact Worklog',
    settings_option_transparent_stream: 'Transparent Stream',

    settings_label_tab_visibility: '侧边栏标签',
    settings_desc_tab_visibility: '选择在侧边栏和导航栏中显示哪些标签。聊天和设置始终可见。',
    open_in_browser: '在浏览器中打开',
    settings_section_system_title: '系统',
    settings_tab_appearance: '外观',
    settings_tab_conversation: '对话',
    settings_tab_preferences: '偏好',
    settings_tab_plugins: '插件',
    settings_tab_system: '系统',
    settings_tab_help: 'Help',
    settings_help_meta: 'Resources and support for Hermes WebUI.',
    settings_help_docs_label: 'Documentation',
    settings_help_docs_desc: 'Guides, configuration reference, and the full Hermes WebUI README.',
    settings_help_docs_link: 'Open Documentation',
    settings_help_issue_label: 'Having an issue?',
    settings_help_issue_desc: 'Search existing reports or open a new one on GitHub.',
    settings_help_issue_link: 'Open GitHub Issues',
    status_updated: '已更新',
    status_ephemeral: '临时快照 — 不会保存到对话记录。',
    status_no_tokens: '无令牌数据',
    status_profile: '配置文件',
    status_hermes_home: 'Hermes 主目录',
    status_started: '开始时间',
    status_tokens: '令牌',
    status_unknown: '未知',
    cmd_yolo: 'YOLO 模式切换',
    yolo_no_session: '无活动会话',
    yolo_enabled: '⚡ YOLO 模式已开启 — 将跳过所有审批',
    cmd_branch: '将此对话分叉到新会话',
    cmd_branch_usage:'/branch [名称] — 分叉会话（可选择添加名称）',
    branch_forked: '已创建新分叉',
    branch_failed: '分叉失败：',
    fork_from_here: '从此处分叉',
    forked_from: '分叉自',
    yolo_disabled: 'YOLO 模式已关闭',
    yolo_pill_label: 'YOLO',
    yolo_pill_title_active: 'YOLO 模式激活 — 点击关闭',
    approval_skip_all: '⚡ 本次会话全部跳过',
    approval_skip_all_title: '跳过本次会话的所有审批提示',
    // composer action tooltips
    composer_send: '发送消息',
    composer_queue: '消息加入队列',
    composer_interrupt: '中断并发送',
    composer_steer: '引导当前响应',
    composer_stop: '停止生成',
    composer_disabled_clarify: '请回复上方的澄清请求',
    composer_disabled_compression: '等待压缩完成',
    composer_compression_will_queue: 'Type a message — it will queue and send after compression',
    composer_disabled_empty: '请输入消息后发送',
    composer_mobile_workspace: '工作区',
    composer_mobile_model: '模型',
    composer_mobile_reasoning: '推理',
    composer_mobile_context: '上下文',

    pdf_loading: '正在加载 PDF {0}…',
    pdf_too_large: 'PDF 文件过大，无法内联预览',
    pdf_no_pages: '无法渲染 PDF 预览',
    pdf_error: 'PDF 加载失败',
    pdf_download: '下载 PDF',
    html_loading: '正在加载 HTML 预览…',
    html_too_large: 'HTML 文件过大，无法内联预览',
    html_error: 'HTML 预览加载失败',
    html_open_full: '打开完整页面',
    html_sandbox_label: 'HTML 预览',
    media_audio_label: '音频',
    media_svg_label: '图表',
    media_video_label: '视频',
    media_download: '下载',
    csv_loading: '加载 CSV',
    csv_too_large: 'CSV 文件过大，无法内联渲染',
    csv_no_data: 'CSV 文件数据不足，无法渲染为表格',
    csv_error: '加载 CSV 文件失败',
    csv_header_note: '第一行显示为表格标题',
    excalidraw_loading: '加载图表',
    excalidraw_too_large: 'Excalidraw 文件过大，无法内联渲染',
    excalidraw_invalid: '无效的 Excalidraw 文件格式',
    excalidraw_error: '加载 Excalidraw 文件失败',
    excalidraw_label: '图表',
    excalidraw_download: '下载',
    excalidraw_empty: '空图表',
    excalidraw_render_error: '渲染图表失败',
    excalidraw_simplified: '简化 SVG 预览 — 与 Excalidraw 画布不完全相同',
    // TTS (#499)
    tts_listen: '收听',
    tts_not_supported: '语音合成不可用',
    settings_label_tts: '回复语音合成',
    settings_desc_tts: '在助手消息上显示扬声器按钮',
    settings_label_tts_auto_read: '自动朗读回复',
    settings_desc_tts_auto_read: '自动朗读助手回复',
    // Composer voice-mode pref (#1488)
    settings_label_voice_mode: '免提语音模式按钮',
    settings_desc_voice_mode: '在听写麦克风旁显示语音模式按钮（音频波形）。让您自然说话 — Hermes 会在停顿后自动发送并朗读回复。需要支持语音识别和 TTS 的浏览器。',
    settings_label_raw_audio: '发送原始音频而非转写为文字',
    settings_desc_raw_audio: '录制并将原始音频文件发送给代理，而不是先转换为文本。代理可以转写它或处理原始音频（情绪、背景噪音、自定义语音识别）。类似Telegram的语音消息行为。',
    voice_send_raw: '发送原始音频',
    voice_raw_attached: '音频已附加。按发送或输入更多内容。',
    settings_label_tts_voice: '语音',
    settings_desc_tts_voice: '选择语音合成声音',
    settings_label_tts_rate: '语速',
    settings_label_tts_pitch: '音调',
    settings_label_tts_engine: 'TTS 引擎',
    settings_desc_tts_engine: '选择语音引擎。Edge TTS 通过服务器使用微软神经语音。',
    checkpoint_date: '日期',
    checkpoint_diff_files_changed: (n) => `${n} 个文件已更改`,
    checkpoint_diff_no_changes: '此检查点与当前工作区之间无差异。',
    checkpoint_diff_title: '检查点变更',
    checkpoint_empty: '此工作区未找到检查点。',
    checkpoint_error: '加载检查点失败',
    checkpoint_files: '文件',
    checkpoint_loading: '加载检查点中…',
    checkpoint_message: '消息',
    checkpoint_restore: '恢复',
    checkpoint_restore_confirm_message: (ckpt) => `将工作区恢复到检查点 "${ckpt}"？此操作将用已保存版本覆盖文件。此检查点之后添加的文件不会被删除。`,
    checkpoint_restore_confirm_title: '恢复检查点？',
    checkpoint_restored: '检查点已恢复',
    checkpoint_title: '检查点',
    checkpoint_view_diff: '查看差异',
    insights_activity_by_day: '按日活动',
    insights_activity_by_hour: '按时活动',
    insights_cost: '预估费用',
    insights_daily_tokens: '每日令牌',
    insights_model_name: '模型',
    insights_model_sessions: '会话',
    insights_model_tokens: '令牌',
    insights_model_cost: '费用',
    insights_model_share: '占比',
    insights_no_usage_data: '暂无使用数据',
    insights_footer: '显示最近 {days} 天的数据',
    insights_skill_usage_title: '技能使用统计',
    insights_skill_usage_sub: '工具调用频次',
    insights_skill_usage_total: '总调用次数',
    insights_skill_usage_skills_used: '已使用技能',
    insights_skill_usage_no_data: '暂无技能使用数据',
    insights_skill_usage_no_data_hint: '在对话中使用技能后，数据将在此显示。',
    insights_skill_usage_footer: '数据来源于 ~/.hermes/skills/',
    insights_skill_usage_col_skill: '技能',
    insights_skill_usage_col_uses: '使用次数',
    insights_skill_usage_col_views: '查看次数',
    insights_skill_usage_col_share: '使用占比',
    insights_skill_usage_col_patches: '补丁',
    insights_input_tokens: '输入',
    insights_messages: '消息',
    insights_models: '模型',
    insights_no_cost: 'N/A',
    insights_output_tokens: '输出',
    insights_peak_hour: '高峰：{hour}时',
    insights_sessions: '会话',
    insights_title: '使用分析',
    insights_token_breakdown: '令牌分解',
    insights_tokens: '令牌',
    insights_total: '总计',
    settings_desc_api_redact: '自托管用户可禁用以实现透明（不推荐用于共享实例）。',
    settings_label_api_redact: '在 API 响应中隐藏敏感数据',
    voice_error: '此浏览器不支持语音功能',
    voice_listening: '正在聆听…',
    voice_mode_active: '语音模式已开启',
    voice_mode_off: '语音模式已关闭',
    voice_speaking: '正在说话…',
    voice_thinking: '思考中…',
    // Composer voice buttons (#1488)
    voice_dictate: '听写',
    voice_dictate_active: '停止听写',
    voice_recording_active: '停止录音',
    voice_mode_toggle: '语音模式',
    voice_mode_toggle_active: '退出语音模式',
    subagent_children: '子代理会话',
    outline_title: '大纲',
    outline_empty: '暂无问题。',
    outline_loading: '加载中…',
  },

  // Traditional Chinese (zh-Hant)
  'zh-Hant': {

    offline_title: '連線中斷',
    offline_browser_detail: '瀏覽器回報此裝置目前離線。',
    offline_network_detail: 'Hermes 目前無法從這個瀏覽器連上。',
    offline_autorefresh: 'Hermes 重新連線後，系統會自動重新整理此頁面。',
    offline_check_now: '立即檢查',
    offline_checking: '正在檢查…',
    offline_stream_waiting: '連線中斷。等待重新整理…',
    _lang: 'zh-Hant',
    _label: '繁體中文',
    _speech: 'zh-TW',
    // boot.js
    cancelling: '正在取消……',
    cancel_failed: '取消失敗：',
    mic_denied: '麥克風存取遭拒。請檢查瀏覽器權限。',
    mic_no_speech: '未偵測到語音。請再試一次。',
    mic_network: '語音辨識無法使用。',
    mic_error: '語音輸入錯誤：',
    // Composer voice buttons (#1488 — distinct labels for dictation vs voice mode)
    voice_dictate: '聽寫',
    voice_dictate_active: '停止聽寫',
    voice_recording_active: '停止錄音',
    voice_mode_toggle: '語音模式',
    voice_mode_toggle_active: '離開語音模式',
    // Turn-based voice mode (#1333)
    voice_listening: '正在聆聽…',
    voice_speaking: '正在說話…',
    voice_thinking: '正在思考…',
    voice_error: '此瀏覽器不支援語音功能',
    voice_mode_active: '語音模式已開啟',
    voice_mode_off: '語音模式已關閉',
    session_imported: '已匯入對話',
    import_failed: '匯入失敗：',
    import_invalid_json: '無效的 JSON',
    image_pasted: '已貼上圖片：',
    // messages.js
    edit_message: '編輯訊息',
    regenerate: '重新產生回覆',
    copy: '複製',
    copied: '已複製！',
    copy_failed: '複製失敗',
    selected_text_reply: '用所選內容回覆',
    selected_text_reply_title: '將所選聊天文字附加為引用脈絡',
    selected_text_reply_appended: '已將所選文字加入輸入框',
    saved_prompts_empty: '尚無已儲存的提示。',
    saved_prompts_save_current: '將目前輸入儲存為提示',
    saved_prompts_saved: '提示已儲存',
    saved_prompts_delete: '刪除提示',
    saved_prompts_empty_input: '請先輸入要儲存的提示',

    diff_loading: '載入 diff',
    diff_error: '無法載入 patch 檔案',
    diff_too_large: 'Patch 檔案太大，無法直接顯示',
    tree_view: '樹狀',
    raw_view: '原始',
    parse_failed_note: '解析失敗',
    you: '你',
    mcp_servers_title: 'MCP 伺服器',
    mcp_servers_desc: '檢視 config.yaml 中設定的 MCP 伺服器。',
    mcp_no_servers: '未設定 MCP 伺服器。',
    mcp_add_server: '+ 新增伺服器',
    mcp_field_name: '伺服器名稱',
    mcp_transport_label: '傳輸類型',
    mcp_field_command: '命令',
    mcp_field_args: '參數（以逗號分隔）',
    mcp_field_url: 'URL',
    mcp_field_timeout: '逾時（秒）',
    mcp_save: '儲存',
    mcp_cancel: '取消',
    mcp_name_required: '伺服器名稱為必填。',
    mcp_url_required: 'HTTP 傳輸需要 URL。',
    mcp_command_required: 'stdio 傳輸需要命令。',
    mcp_saved: 'MCP 伺服器已儲存。',
    mcp_save_failed: '儲存 MCP 伺服器失敗。',
    mcp_delete_confirm_title: '刪除 MCP 伺服器',
    mcp_delete_confirm_message: '刪除 MCP 伺服器「{0}」？此操作無法復原。',
    mcp_deleted: 'MCP 伺服器已刪除。',
    mcp_delete_failed: '刪除 MCP 伺服器失敗。',
    mcp_load_failed: '載入 MCP 伺服器失敗。',
    mcp_restart_hint: '伺服器變更目前在此為唯讀。請編輯 config.yaml 並重新啟動 Hermes，讓變更生效。',
    mcp_toggle_followup: '啟用／停用控制項會等到 MCP 重新載入語意明確後再加入。',
    mcp_status_active: '作用中',
    mcp_status_configured: '已設定',
    mcp_status_disabled: '已停用',
    mcp_status_invalid_config: '設定無效',
    mcp_status_unknown: '未知',
    mcp_tool_count: '{0} 個工具',
    mcp_enabled_yes: '已啟用',
    mcp_enabled_no: '已停用',
    mcp_enable_server: '啟用此 MCP 伺服器',
    mcp_disable_server: '停用此 MCP 伺服器',
    mcp_enabled_toast: (name) => `MCP 伺服器「${name}」已啟用。`,
    mcp_disabled_toast: (name) => `MCP 伺服器「${name}」已停用。`,
    mcp_toggle_failed: '更新 MCP 伺服器失敗。',
    mcp_tools_title: 'MCP 工具',
    mcp_tools_desc: '搜尋作用中 MCP 伺服器中的已知工具。',
    mcp_tools_search_placeholder: '依名稱、伺服器或描述搜尋工具…',
    mcp_tools_no_tools: '作用中 runtime inventory 沒有可用的 MCP 工具。',
    mcp_tools_no_matches: '沒有符合搜尋條件的 MCP 工具。',
    mcp_tools_load_failed: '載入 MCP 工具失敗。',
    mcp_tools_schema_empty: '沒有 schema 參數。',
    mcp_tools_runtime_note: '工具清單只使用已知且作用中的 MCP runtime 資料；WebUI 不會啟動或探測伺服器。',
    mcp_tools_summary_no_matches: (query,total) => `沒有符合「${query}」的 MCP 工具（共 ${total} 個 MCP 工具）。`,
    mcp_tools_summary_none: '沒有可顯示的 MCP 工具。',
    mcp_tools_summary_matching: (query) => `，符合「${query}」`,
    mcp_tools_summary_total_note: (total) => `（共 ${total} 個 MCP 工具）`,
    mcp_tools_summary_showing: (start,end,filtered,searchNote,totalNote,page,pages) => `顯示第 ${start}-${end} 個，共 ${filtered} 個 MCP 工具${searchNote}${totalNote}。第 ${page} / ${pages} 頁。`,
    mcp_tools_page_size_prefix: '每頁顯示',
    mcp_tools_page_size_suffix: '筆',
    mcp_tools_per_page_aria: '每頁 MCP 工具數量',
    mcp_tools_inactive_configured_servers: (servers) => `已設定但未在此 WebUI runtime 中作用：${servers}。`,
    mcp_tools_pagination_label: 'MCP 工具分頁',
    mcp_tools_previous_page: '‹ 上一頁',
    mcp_tools_previous_page_aria: '上一頁 MCP 工具',
    mcp_tools_next_page: '下一頁 ›',
    mcp_tools_next_page_aria: '下一頁 MCP 工具',
    // PDF preview (#480)
    pdf_loading: '正在載入 PDF {0}…',
    pdf_too_large: 'PDF 太大，無法直接預覽',
    pdf_no_pages: 'PDF 沒有頁面',
    pdf_error: 'PDF 預覽轉譯失敗',
    pdf_download: '下載 PDF',
    // HTML sandbox preview (#482)
    html_loading: '正在載入 HTML 預覽…',
    html_too_large: 'HTML 太大，無法直接預覽',
    html_error: 'HTML 預覽轉譯失敗',
    html_open_full: '開啟完整頁面',
    html_sandbox_label: 'HTML 預覽（沙盒）',
    thinking: '思考中',
    expand_all: '全部展開',
    collapse_all: '全部收合',
    edit_failed: '編輯失敗：',
    regen_failed: '重新產生失敗：',
    reconnect_active: '回覆仍在產生中。完成後要重新載入嗎？',
    reconnect_finished: '離開時仍有回覆正在處理。訊息可能已經更新。',
    // approval card
    approval_heading: '需要核准',
    approval_desc_prefix: '偵測到危險命令',
    approval_btn_once: '允許一次',
    approval_btn_once_title: '允許這一道命令（Enter）',
    approval_btn_session: '允許本次對話',
    approval_btn_session_title: '允許本次對話工作階段',
    approval_btn_always: '一律允許',
    approval_btn_always_title: '一律允許這個命令模式',
    approval_btn_deny: '拒絕',
    approval_btn_deny_title: '拒絕，不要執行這道命令',
    approval_responding: '正在回應……',
    clarify_heading: '需要釐清',
    clarify_hint: '請選擇一個選項，或在下方輸入回答。',
    clarify_other: '其他',
    clarify_send: '送出',
    clarify_input_placeholder: '輸入回答…',
    clarify_responding: '處理中…',
    session_attention_approval: (n) => n === 1 ? '核准' : `${n} 項核准`,
    session_attention_clarify: (n) => n === 1 ? '問題' : `${n} 個問題`,
    session_attention_generic: (n) => n === 1 ? '待處理' : `${n} 個事項`,
    session_attention_approval_title: '等待權限決定',
    session_attention_clarify_title: '等待回覆',
    session_attention_generic_title: '等待使用者操作',
    n_messages: (n) => `${n} 則訊息`,
    load_older_messages: '↑ 向上捲動或點選以載入較早的訊息',
    session_jump_start: '開頭',
    session_jump_start_label: '跳至對話開頭',
    session_jump_end: '結尾',
    session_jump_end_label: '跳至對話結尾',
    session_new_message: '新訊息',
    session_new_message_label: '有新訊息，跳至結尾',
    jump_to_question: '回到回答',
    jump_to_question_label: '跳至這則回答的開頭',
    queued_label: '回應後傳送',
    queued_count: (n) => n === 1 ? '1 已排隊' : `${n} 已排隊`,
    queued_cancel: '取消排隊訊息',
    model_unavailable: '（無法使用）',
    model_unavailable_title: '這個模型已不在目前的供應商清單中',
    provider_mismatch_warning: (m,p)=>`「${m}」可能無法搭配已設定的供應商（${p}）使用。仍要送出，或在終端機執行 \`hermes model\` 來切換。`,
    provider_mismatch_label: '供應商不相符',
    gateway_auth_label: 'Gateway 驗證失敗',
    model_not_found_label: '未找到模型',
    model_custom_label: '自訂模型 ID',
    model_custom_placeholder: '例如 openai/gpt-5.4',
    model_search_placeholder: '搜尋模型…',
    model_search_no_results: '找不到模型',
    model_group_configured: '已設定',
    ws_search_placeholder: '搜尋工作區…',
    ws_no_results: '找不到工作區',
    workspace_new_worktree_conversation: '在 worktree 中新增對話',
    workspace_new_worktree_conversation_meta: '為此工作區建立隔離的 git worktree。',
    workspace_worktree_created: '已建立 worktree 對話',
    workspace_worktree_failed: '建立 worktree 失敗：',
    session_worktree_badge: 'Worktree',
    model_scope_advisory: '從下一則訊息起適用於此對話。',
    model_scope_toast: '從下一則訊息起適用於此對話。',
    // commands.js
    cmd_clear: '清除對話訊息',
    cmd_help: '列出可用命令',
    cmd_compress: '手動壓縮對話脈絡（用法：/compress [主題]）',
    ctx_compress_hint: '壓縮脈絡以釋放空間 →',
    ctx_compress_action: '⚠ 立即壓縮以釋放脈絡',
    cmd_compact_alias: '舊別名：/compress',
    cmd_model: '切換模型（例如 /model gpt-4o）',
    cmd_workspace: '依名稱切換工作區',
    cmd_terminal: '開啟工作區 Terminal',
    cmd_new: '開始新的聊天對話',
    cmd_usage: '開啟或關閉 token 用量顯示',
    cmd_theme: '切換外觀（主題：system/dark/light，skin：default/ares/mono/graphite/slate/poseidon/sisyphus/charizard/sienna/catppuccin/nous/geist-contrast/zeus/verdigris）',
    cmd_personality: '切換 Agent 角色',
    cmd_skills: '列出可用的 Hermes 技能',
    cmd_use: '為下一則訊息強制使用技能',
    available_commands: '可用命令：',
    type_slash: '輸入 / 檢視命令',
    conversation_cleared: '已清除對話',
    command_label: '命令',
    context_compaction_label: '脈絡壓縮',
    retrieval_context_label: '已索引的脈絡',
    retrieval_context_preview: '較早的訊息已儲存，可透過脈絡工具擷取',
    preserved_task_list_label: '保留的任務清單',
    reference_only_label: '僅供參考',
    model_usage: '用法：/model <name>',
    no_model_match: '沒有符合的模型：',
    model_did_you_mean: (m) => `，您是否想選擇「${m}」？`,
    switched_to: '已切換到 ',
    workspace_usage: '用法：/workspace <name>',
    no_workspace_match: '沒有符合的工作區：',
    switched_workspace: '已切換至工作區：',
    workspace_switch_failed: '工作區切換失敗：',
    new_session: '已建立新對話',
    new_session_creating: '正在建立新對話…',
    compressing: '正在要求壓縮脈絡……',
    compress_running_label: '壓縮中',
    compress_complete_label: '壓縮完成',
    auto_compress_label: '自動壓縮',
    compress_failed_label: '壓縮失敗',
    focus_label: '主題',
    token_usage_on: 'Token 用量顯示已開啟',
    token_usage_off: 'Token 用量顯示已關閉',
    usage_cache_hit_detail: '快取：{0}% 命中（讀取 {1} / 寫入 {2}）',
    usage_cached_percent: '{0}% 已快取',
    theme_usage: '用法：/theme ',
    theme_set: '主題：',
    no_active_session: '沒有使用中的對話',
    cmd_queue: '將訊息加入下一輪的佇列',
    cmd_goal: '設定或檢視持久目標',
    goal_evaluating_progress: '正在評估目標進度…',
    goal_working_toward: '正在朝目標執行…',
    goal_continuing_toast: '正在繼續目標…',
    goal_status_none: '沒有使用中的目標。請使用 /goal <text> 設定。',
    goal_status_active: (turns, max_turns, goal) => `⊙ 目標（進行中，${turns}/${max_turns} 回合）：${goal}`,
    goal_status_paused: (turns, max_turns, reason, goal) => `⏸ 目標（已暫停，${turns}/${max_turns}${reason ? `，${reason}` : ''}）：${goal}`,
    goal_status_done: (turns, max_turns, goal) => `✓ 目標完成（${turns}/${max_turns}）：${goal}`,
    goal_set: (turns, goal) => `⊙ 已設定目標（${turns} 回合預算）：${goal}`,
    goal_paused: (goal) => `⏸ 目標已暫停：${goal}`,
    goal_resumed: (goal) => `▶ 目標已恢復：${goal}`,
    goal_cleared: '目標已清除。',
    goal_no_goal: '沒有使用中的目標。',
    goal_achieved: (reason) => `✓ 目標已達成：${reason}`,
    goal_paused_budget_exhausted: (turns, max_turns) => `⏸ 目標已暫停，已使用 ${turns}/${max_turns} 回合。使用 /goal resume 繼續，或使用 /goal clear 停止。`,
    goal_continuing: (turns, max_turns, reason) => `↻ 繼續目標（${turns}/${max_turns}）：${reason}`,
    cmd_interrupt: '取消目前回合並傳送新訊息',
    cmd_steer: '在回合進行中注入修正，不中斷 Agent',
    cmd_queue_no_msg: '用法：/queue <訊息>',
    cmd_queue_not_busy: '沒有活動任務 — 直接傳送即可',
    cmd_queue_confirm: '訊息已加入佇列',
    cmd_interrupt_no_msg: '用法：/interrupt <訊息>',
    cmd_interrupt_confirm: '已中斷，正在傳送新訊息',
    cmd_steer_no_msg: '用法：/steer <訊息>',
    cmd_steer_fallback: 'Steer 不可用 — 已加入下一輪佇列',
    cmd_steer_delivered: 'Steer 已送達，Agent 會在下一個工具結果中看到',
    steer_leftover_queued: 'Steer 已加入下一輪佇列',
    busy_steer_fallback: 'Steer 不可用 — 已加入下一輪佇列',
    busy_interrupt_confirm: '已中斷，正在傳送新訊息',
    settings_label_busy_input_mode: '忙碌輸入模式',
    settings_desc_busy_input_mode: '控制 Agent 執行時送出訊息的行為。佇列會等待；中斷會取消並重新開始；Steer 會中途注入修正且不中斷（Agent 或串流無法使用時會退回佇列）。',
    settings_label_fade_text_effect: '文字淡入效果',
    settings_desc_fade_text_effect: '在助理回覆時讓新串流輸出的詞語淡入顯示。類似 OpenWebUI；為獲得最佳效能預設關閉。',
    settings_busy_input_mode_queue: '加入佇列',
    settings_busy_input_mode_interrupt: '中斷目前回合',
    settings_busy_input_mode_steer: 'Steer（中途修正）',

    slash_skill_badge: '技能',
    slash_skill_desc: '叫用此技能',
    cmd_stop: '停止目前回應',
    cmd_title: '取得或設定對話標題',
    cmd_retry: '重新送出上一則訊息',
    cmd_undo: '移除上一組問答',
    cmd_btw: '提出旁支問題（暫時）',
    cmd_btw_usage: '/btw <question> — 使用對話脈絡提出旁支問題',
    cmd_background: '在背景執行提示詞',
    cmd_background_usage: '/background <prompt> — 平行執行，不阻塞目前工作',
    cmd_branch: '將此對話分支成新的對話',
    cmd_branch_usage: '/branch [name] — 分支對話（可選擇命名）',
    branch_forked: '已分支成新的對話',
    branch_failed: '分支失敗：',
    fork_from_here: '從這裡分支',
    forked_from: '分支來源',
    subagent_children: '子 Agent 對話',
    btw_asking: '正在詢問旁支問題…',
    btw_label: '旁支問題，不會寫入記錄',
    btw_done: '旁支問題已回答',
    btw_no_answer: '未收到回答。',
    btw_failed: '旁支問題失敗：',
    bg_running: '正在背景執行…',
    bg_complete: '背景任務已完成',
    bg_label: '背景結果：',
    bg_no_answer: '（沒有回答）',
    bg_failed: '背景任務失敗：',
    undo_exchange: '復原上一組問答',
    cmd_status: '顯示對話資訊',
    cmd_voice: '切換麥克風輸入',
    stream_stopped: '回應已停止。',
    no_active_task: '沒有可停止的使用中任務。',
    cancel_unavailable: '無法取消。',
    retry_failed: '重試失敗：',
    undo_failed: '復原失敗：',
    undid_n_messages: '已移除',
    undid_messages_suffix: '則訊息。',
    status_heading: '對話狀態',
    status_session_id: '對話 ID',
    status_title: '標題',
    status_model: '模型',
    status_provider: '供應商',
    status_workspace: '工作區',
    status_personality: '角色',
    status_messages: '訊息',
    status_agent_running: 'Agent 執行中',
    status_profile: '個人資料',
    status_hermes_home: 'Hermes 主目錄',
    status_started: '開始時間',
    status_updated: '已更新',
    status_tokens: 'Token',
    status_ephemeral: '暫時快照，未儲存到對話記錄。',
    status_no_tokens: '未使用 Token',
    status_unknown: '未知',
    status_yes: '是',
    status_no: '否',
    status_load_failed: '載入狀態失敗：',
    title_current: '目前標題',
    title_change_hint: '使用 `/title <new name>` 重新命名。',
    title_set: '標題已設定為',
    cmd_webui_only_session: '此命令無法用於從 CLI 匯入的對話。',
    cmd_voice_use_mic: '請點選輸入框中的麥克風按鈕。',
    usage_heading: 'Token 用量',
    usage_default_model: '預設',
    usage_unknown: '未知',
    usage_input_tokens: '輸入 Token',
    usage_output_tokens: '輸出 Token',
    usage_total: 'Token 總計',
    usage_estimated_cost: '估計成本',
    usage_settings_tip: '注意：成本估計僅供參考。',
    usage_load_failed: '載入用量失敗：',
    usage_personality_none: '無',
    // Session toolsets (#493)
    session_toolsets: '對話工具集',
    session_toolsets_desc: '限制此對話可用的工具（留空即使用全域設定）',
    session_toolsets_global: '全域（預設）',
    session_toolsets_custom: '自訂',
    session_toolsets_placeholder: 'tool1, tool2, …',
    session_toolsets_apply: '套用',
    session_toolsets_clear: '清除（使用全域）',
    session_toolsets_applied: '工具集已更新',
    session_toolsets_cleared: '工具集已清除，改用全域設定',
    session_toolsets_failed: '更新工具集失敗：',
    untitled: '未命名',
    no_personalities: '找不到角色（可新增至 ~/.hermes/personalities/）',
    available_personalities: '可用角色：',
    personality_switch_hint: '\n\n使用 `/personality <name>` 切換，或使用 `/personality none` 清除。',
    personalities_load_failed: '載入角色失敗',
    personality_cleared: '已清除角色',
    personality_set: '角色：',
    failed_colon: '失敗：',
    // ui.js
    no_workspace: '沒有工作區',
    terminal_open_title: '開啟工作區 Terminal',
    terminal_no_workspace_title: '請先選擇工作區再開啟 Terminal',
    terminal_title: 'Terminal',
    terminal_clear: '清空',
    terminal_copy_output: '複製輸出',
    terminal_restart: '重新啟動',
    terminal_collapse: '收合',
    terminal_expand: '展開',
    terminal_close: '關閉',
    terminal_input_placeholder: '輸入命令……',
    terminal_start_failed: 'Terminal 啟動失敗：',
    terminal_input_failed: 'Terminal 輸入失敗：',
    terminal_copy_failed: '複製失敗：',
    terminal_error: 'Terminal 錯誤',
    terminal_remote_backend_unsupported: '嵌入式 Terminal 僅支援本機終端後端。',
    workspace_empty_no_path: '未選擇工作區。請在 設定 → 工作區 中設定工作區以瀏覽檔案。',
    workspace_empty_dir: '此工作區為空。',
    workspace_show_hidden_files: '顯示隱藏檔案',
    workspace_show_hidden_files_desc: '在檔案樹中包含 .DS_Store、.git、node_modules 與其他隱藏／系統檔案。',
    workspace_hidden_files_visible: '顯示隱藏檔',
    workspace_hidden_files_visible_title: '隱藏檔已顯示，點選可檢視選項',
    workspace_options: '工作區選項',
    // workspace.js
    unsaved_confirm: '預覽中有未儲存的變更。要捨棄並前往其他位置嗎？',
    save: '儲存',
    edit: '編輯',
    save_title: '儲存變更',
    edit_title: '編輯這個檔案',
    saved: '已儲存',
    save_failed: '儲存失敗：',
    image_load_failed: '無法載入圖片',
    file_open_failed: '無法開啟檔案',
    downloading: (name) => `正在下載 ${name}…`,
    double_click_rename: '按兩下即可重新命名',
    session_rename_failed_no_row: '無法開始重新命名，找不到資料列。',
    renamed_to: '已重新命名為 ',
    rename_failed: '重新命名失敗：',
    moved_to: '已移動到 ',
    move_failed: '移動失敗：',
    delete_title: '刪除',
    delete_confirm: (name) => `要刪除 ${name} 嗎？`,
    delete_dir_confirm: (name) => `刪除資料夾「${name}」及其所有內容？`,
    rename_title: '重新命名',
    rename_prompt: '新名稱：',
    deleted: '已刪除 ',
    delete_failed: '刪除失敗：',
    reveal_in_finder: '在檔案管理員中顯示',
    reveal_failed: '顯示失敗：',
    copy_file_path: '複製檔案路徑',
    open_in_vscode: '在 VS Code 中開啟',
    open_in_vscode_failed: '在 VS Code 中開啟失敗：',
    download_folder: '下載資料夾',
    path_copied: '檔案路徑已複製到剪貼簿',
    path_copy_failed: '複製路徑失敗：',
    session_rename: '重新命名對話',
    session_rename_desc: '編輯此對話的標題',
    session_title_regenerate: '重新產生標題',
    session_title_regenerate_desc: '請 Hermes 依對話產生新的標題',
    session_title_regenerating: '正在重新產生標題…',
    session_title_regenerated: (title) => `標題已重新產生：${title}`,
    session_title_regenerate_failed: '重新產生標題失敗：',
    session_copy_link: '複製對話連結',
    session_copy_link_desc: '複製此對話的直接連結',
    session_link_copied: '對話連結已複製到剪貼簿',
    session_link_copy_failed: '無法複製對話連結：',
    new_file_prompt: '新檔案名稱（例如 notes.md）：',
    new_file: '新建檔案',
    new_folder: '新建資料夾',
    workspace_root: '工作區根目錄',
    new_file_prompt_title: '在 {0} 中新建檔案名稱：',
    new_folder_prompt_title: '在 {0} 中新建資料夾名稱：',
    created: '已建立 ',
    create_failed: '建立失敗：',
    new_folder_prompt: '新資料夾名稱：',
    folder_created: '已建立資料夾 ',
    folder_create_failed: '建立資料夾失敗：',
    workspace_auto_create_folder: '資料夾不存在時自動建立',
    folder_add_as_space_btn: '新增為空間',
    folder_add_as_space_msg: '要將此資料夾新增為工作區清單中的新空間嗎？',
    folder_add_as_space_title: '要新增為空間嗎？',
    remove_title: '移除',
    empty_dir: '（空）',
    upload_failed: '上傳失敗：',
    upload_too_large: (maxMb, fileMb) => `檔案過大（${fileMb} MB）。最大上傳大小為 ${maxMb} MB。`,
    uploading: '上傳中…',
    uploaded: '已上傳',
    all_uploads_failed: (n) => `全部 ${n} 個上傳都失敗`,
    archive_extracted: (n, c) => `從 ${c} 個壓縮包中解壓縮了 ${n} 個檔案`,
    session_pin: '釘選對話',
    session_unpin: '取消釘選',
    session_pin_desc: '將此對話置頂',
    session_unpin_desc: '從置頂移除',
    session_pin_failed: '釘選失敗：',
    session_move_project: '移至專案',
    session_move_project_desc_has: '變更此對話的專案',
    session_move_project_desc_none: '為此對話指定專案',
    session_archive: '封存對話',
    session_hide_external: '從清單中隱藏',
    session_restore: '還原對話',
    session_archive_desc: '隱藏此對話，直到開啟顯示封存',
    session_archive_worktree_desc: '隱藏此對話；保留磁碟上的 worktree',
    session_hide_external_desc: '從 WebUI 清單中隱藏此匯入的對話，不刪除原始歷史記錄。',
    session_restore_desc: '將此對話移回主清單',
    session_archived: '對話已封存',
    session_archived_worktree: '對話已封存。Worktree 仍保留在磁碟上。',
    session_hidden: '已從清單中隱藏對話',
    session_restored: '對話已還原',
    session_archive_failed: '封存失敗：',
    session_duplicate: '複製對話',
    session_duplicate_desc: '建立一個相同工作區與模型的副本',
    session_duplicated: '對話已複製',
    session_duplicate_failed: '複製失敗：',
    session_stop_response: '停止回應',
    session_stop_response_desc: '取消此對話中正在執行的回應',
    session_delete: '刪除對話',
    session_delete_desc: '永久移除這個對話',
    session_delete_confirm: '刪除此對話？',
    session_delete_worktree_desc: '只刪除 WebUI 對話；保留磁碟上的 worktree',
    session_delete_worktree_confirm: (path) => `刪除此對話？位於 ${path} 的 worktree 將保留在磁碟上。`,
    session_deleted: '對話已刪除',
    session_deleted_worktree: '對話已刪除。Worktree 仍保留在磁碟上。',
    session_worktree_remove: '刪除 worktree',
    session_worktree_remove_desc: (path) => `刪除位於 ${path} 的 git worktree`,
    session_worktree_remove_confirm: (path) => `確定從磁碟刪除 git worktree？\n\n路徑：${path}\n\n整個 worktree 目錄將被刪除，WebUI 中的工作階段資料保留。`,
    session_worktree_remove_not_exists: (path) => `位於 ${path} 的 worktree 在磁碟上已不存在。`,
    session_worktree_remove_confirm_label: '刪除',
    session_worktree_removed: 'Worktree 已刪除。',
    session_worktree_remove_failed: '刪除 worktree 失敗：',
    session_worktree_remove_status_failed: '讀取 worktree 狀態失敗：',
    session_worktree_remove_locked_by_stream: '無法刪除 — 存在活躍的串流工作階段正在使用此 worktree。',
    session_worktree_remove_locked_by_terminal: '無法刪除 — 存在活躍的終端機工作階段正在使用此 worktree。',
    session_worktree_remove_unsafe_blocked: '請先處理本機變更或未推送提交，再刪除此 worktree。',
    session_worktree_remove_dirty_warning: '⚠️ 此 worktree 有未提交的變更，將被永久刪除。',
    session_worktree_remove_untracked_warning: (count) => `${count} 個未追蹤檔案將被永久刪除。`,
    session_worktree_remove_ahead_warning: (ahead) => `${ahead} 個未推送的提交會遺失。`,
    session_select_mode: '選取',
    session_select_mode_desc: '選取對話以批次管理',
    session_select_all: '全選',
    session_deselect_all: '取消全選',
    session_selected_count: '已選 {0} 個',
    session_batch_archive: '封存',
    session_batch_delete: '刪除',
    session_batch_move: '移至專案',
    session_batch_delete_confirm: '要刪除 {0} 個對話嗎？',
    session_batch_archive_confirm: '要封存 {0} 個對話嗎？',
    session_batch_delete_worktree_confirm: '要刪除 {0} 個對話嗎？其中 {1} 個 worktree 對話會把 worktree 目錄保留在磁碟上。',
    session_batch_archive_worktree_confirm: '要封存 {0} 個對話嗎？其中 {1} 個 worktree 對話會把 worktree 目錄保留在磁碟上。',
    session_no_selection: '未選取任何對話',
    // settings panel
    settings_heading_title: '控制中心',
    settings_heading_subtitle: '偏好設定、對話工具與系統控制。',
    settings_section_conversation_title: '對話',
    settings_section_appearance_title: '外觀',
    settings_section_appearance_meta: '主題、強調色與視覺風格。',
    settings_section_preferences_title: '偏好設定',
    settings_section_preferences_meta: 'Hermes Web UI 的預設值與介面行為。',
    settings_section_system_title: '系統',
    settings_section_system_meta: '執行個體版本與存取控制。',
    settings_check_now: '立即檢查',
    settings_checking: '檢查中…',
    settings_up_to_date: '已是最新 ✓',
    settings_updates_available: '有 {count} 個更新可用',
    settings_updates_disabled: '更新檢查已停用',
    settings_update_check_failed: '更新檢查失敗',
    settings_label_workspace_panel_open: '預設保持工作區面板開啟',
    settings_desc_workspace_panel_open: '啟用後，工作區／檔案瀏覽器面板會在每次新對話時自動開啟。仍可隨時手動關閉。',
    settings_label_session_jump_buttons: '顯示對話跳轉按鈕',
    settings_desc_session_jump_buttons: '閱讀較長對話記錄時，顯示浮動的開頭與結尾按鈕。',
    settings_label_terminal_auto_expand: '輸出時自動展開終端',
    settings_desc_terminal_auto_expand: '當運行中的命令產生新輸出時，自動展開已折疊的終端面板。',

    settings_label_session_endless_scroll: '向上捲動時載入較早訊息',

    settings_desc_session_endless_scroll: '啟用後，向上捲動時會自動載入較早訊息。停用時請使用載入較早訊息按鈕。',
    settings_label_auto_scroll_follow: '自動跟隨新內容',
    settings_desc_auto_scroll_follow: '啟用後，串流輸出時畫面會自動捲動到底部。停用後，你可以自由控制捲動位置。',
    settings_label_worklog_details_expanded_default: 'Open Worklog details automatically',
    settings_desc_worklog_details_expanded_default: 'When enabled, new Worklog details start expanded so tool, thinking, and progress cards are visible without an extra click. When off, Worklog details stay folded by default; per-turn manual collapse/expand choices still win.',
    settings_label_chat_activity_display_mode: 'Activity display',
    settings_desc_chat_activity_display_mode: 'Compact Worklog groups supporting activity into a quiet summary. Transparent Stream keeps each thinking/tool event as its own chronological expandable row.',
    first_token_time: 'Time to first token',
    done: 'Done',
    settings_option_compact_worklog: 'Compact Worklog',
    settings_option_transparent_stream: 'Transparent Stream',

    settings_label_tab_visibility: '側邊欄標籤',
    settings_desc_tab_visibility: '選擇在側邊欄和導覽列中顯示哪些標籤。聊天和設定始終可見。',
    open_in_browser: '在瀏覽器中開啟',
    settings_dropdown_conversation: '對話',
    settings_dropdown_appearance: '外觀',
    settings_dropdown_preferences: '偏好設定',
    settings_dropdown_providers: '供應商',
    settings_dropdown_system: '系統',
    settings_tab_conversation: '對話',
    settings_tab_appearance: '外觀',
    settings_tab_preferences: '偏好設定',
    settings_tab_plugins: '外掛',
    settings_plugins_title: '外掛',
    plugins_enable_toggle: '啟用',
    settings_plugins_meta: '檢視已安裝的 Hermes 外掛及其註冊的生命週期掛鉤。此面板為唯讀。',
    settings_plugins_empty: '目前沒有可見的 Hermes 外掛。透過 Hermes CLI/設定檔安裝或啟用外掛後即可在此檢視。',
    plugins_unnamed: '未命名外掛',
    plugins_no_description: '未提供描述。',
    plugins_no_hooks: '未註冊生命週期掛鉤',
    plugins_registered_hooks: '已註冊的掛鉤',
    plugins_enabled: '已啟用',
    plugins_disabled: '已停用',
    plugins_active_provider: '啟用中（提供者）',
    plugins_provider_no_hooks: '供應商外掛，沒有 Agent 可見的掛鉤',
    plugins_load_failed: '載入外掛失敗：',
    settings_tab_system: '系統',
    settings_tab_help: 'Help',
    settings_help_meta: 'Resources and support for Hermes WebUI.',
    settings_help_docs_label: 'Documentation',
    settings_help_docs_desc: 'Guides, configuration reference, and the full Hermes WebUI README.',
    settings_help_docs_link: 'Open Documentation',
    settings_help_issue_label: 'Having an issue?',
    settings_help_issue_desc: 'Search existing reports or open a new one on GitHub.',
    settings_help_issue_link: 'Open GitHub Issues',
    settings_title: '設定',
    settings_save_btn: '儲存設定',
    settings_label_model: '預設模型',
    settings_desc_model: '用於新對話。現有對話會保留各自選定的模型。',
    settings_label_auxiliary_models: '輔助模型',
    settings_desc_auxiliary_models: '視覺分析、脈絡壓縮、標題產生等輔助任務的路由。「自動」表示使用主要聊天模型。',
    settings_btn_reset_aux_models: '全部重置為自動',
    settings_btn_apply_aux_models: '應用變更',
    settings_aux_provider_auto: '使用主模型',
    settings_aux_model_auto: '自動（使用供應商預設值）',
    settings_aux_model_custom: '自訂模型…',
    settings_aux_model_custom_prompt: '輸入模型 ID：',
    settings_aux_loading: '正在載入輔助模型…',
    settings_aux_load_failed: '無法載入輔助模型設定，請確保 Agent API 可用。',
    settings_aux_reset_confirm_title: '重置輔助模型？',
    settings_aux_reset_confirm_msg: '這將把所有輔助任務設定為自動（使用主模型）。',
    settings_aux_reset_done: '輔助模型已重置為自動',
    settings_aux_save_failed: '輔助模型儲存失敗',
    settings_aux_saved: '輔助模型已更新',
    settings_aux_no_changes: '沒有需要應用的變更',
    settings_label_send_key: '送出按鍵',
    settings_label_theme: '主題',
    settings_label_skin: '佈景',
    settings_label_font_size: '字型大小',
    font_size_small: '小',
    font_size_default: '預設',
    font_size_large: '大',
    font_size_xlarge: '超大',
    settings_autosave_saving: '儲存中…',
    settings_autosave_saved: '已儲存',
    settings_autosave_failed: '儲存失敗',
    settings_autosave_retry: '重試',
    settings_label_language: '語言',
    settings_label_quota_chip: '在編輯器中顯示供應商配額標籤',
    settings_desc_quota_chip: '在編輯器底部顯示剩餘配額指示器（如 OpenRouter 點數餘額）。預設關閉。啟用時僅在寬螢幕（≥1400px）顯示，以保持筆記型電腦和標準桌面螢幕上編輯器的整潔。',
    settings_label_conversation_outline: '顯示對話大綱',
    settings_desc_conversation_outline: '顯示僅限桌面的跳轉清單，用於跳轉到目前對話中的使用者問題。預設關閉。',
    settings_label_hide_suggestions: '隱藏新聊天建議',
    settings_desc_hide_suggestions: '隱藏空白新聊天畫面上的三個預設建議按鈕，避免誤觸。',
    settings_label_token_usage: '顯示 token 用量',
    settings_label_token_speed: '顯示 token 速度 (TPS)',
    settings_desc_token_speed: '在串流期間和回應完成後，在助理訊息標題中顯示每秒 token 數。預設關閉。',
    settings_label_sidebar_density: '側邊欄密度',
    cmd_reasoning: '切換思考內容可見性（顯示／隱藏）、設定推理強度，或檢查目前狀態',
    settings_label_external_sessions: '顯示外部對話',
    settings_label_cron_sessions: 'Show cron sessions',
    settings_label_previous_messaging_sessions: '顯示以前的訊息對話',
    settings_label_sync_insights: '同步至 insights',
    settings_label_check_updates: '檢查更新',
    settings_label_ignore_agent_updates: '忽略 Agent 更新',
    settings_label_whats_new_summary: '使用 AI 摘要新版內容',
    settings_label_bot_name: '助理名稱',
    settings_label_password: '存取密碼',
    settings_label_pinned_limit: '置頂對話數量限制',
    settings_desc_pinned_limit: '側邊欄中可置頂的活躍對話的最大數量。預設為 3。',
    settings_label_dashboard_mode: '官方 Hermes 儀表板',
    settings_desc_dashboard_mode: '當官方 hermes 儀表板可存取時，在導航欄顯示連結。公開反向代理 URL 僅作為瀏覽器連結儲存，不會由伺服器探測。',
    settings_dashboard_mode_auto: '自動偵測',
    settings_dashboard_mode_always: '總是顯示',
    settings_dashboard_mode_never: '從不顯示',
    settings_dashboard_save: '儲存儀表板連結設定',
    settings_label_gateway_status: '閘道狀態',
    settings_desc_gateway_status: 'Hermes 閘道狀態（Telegram、Discord、Slack 等）',
    gateway_not_configured: '閘道未配置',
    gateway_metadata_stale: '閘道元資料已過時',
    gateway_endpoint_unreachable: '閘道端點無法存取',
    gateway_not_running: '閘道未執行',
    gateway_running_label: '執行中',
    gateway_last_active: '最後活躍時間：',
    gateway_session_count: (n) => `${n} 個對話`,
    gateway_load_failed: '無法載入閘道狀態',
    settings_saved: '設定已儲存',
    settings_save_failed: '儲存失敗：',
    settings_load_failed: '載入設定失敗：',
    settings_saved_pw: '設定已儲存，密碼保護已啟用，此瀏覽器會維持登入狀態',
    settings_saved_pw_updated: '設定已儲存，密碼已更新',
    // login page (used server-side via /api/i18n/login endpoint)
    login_title: '登入',
    login_subtitle: '輸入密碼繼續使用',
    login_placeholder: '密碼',
    login_btn: '登入',
    login_invalid_pw: '密碼錯誤',
    login_conn_failed: '連線失敗',
    dialog_confirm_title: '確認操作',
    dialog_prompt_title: '輸入值',
    dialog_confirm_btn: '確認',
    discard: '捨棄',
    clear: '清除',
    create: '建立',
    remove: '移除',
    project_name_prompt: '專案名稱：',
    // Sidebar & Tabs
    tab_chat: '聊天',
    tab_tasks: '任務',
    tab_skills: '技能',
    tab_memory: '記憶',
    tab_workspaces: '工作區',
    tab_profiles: '設定檔',
    tab_kanban: '看板',
    kanban_board: '看板',
    kanban_visible_tasks: '{0} 個可見任務',
    kanban_search_tasks: '搜尋任務',
    kanban_all_assignees: '所有指派對象',
    kanban_all_tenants: '所有租戶',
    kanban_include_archived: '包含已封存',
    kanban_no_matching_tasks: '沒有符合的任務',
    kanban_no_data: '沒有看板資料',
    kanban_work_queue_hint: '這是 Hermes Agent 的工作佇列。建立或分類任務、指派對象、移至 Ready，然後讓調度器認領。',
    kanban_unavailable: '看板無法使用',
    kanban_read_only: '唯讀檢視',
    kanban_empty: '空',
    kanban_task: '任務',
    kanban_no_description: '無描述',
    kanban_refresh: '重新整理',
    kanban_status_triage: '分類',
    kanban_status_todo: '待辦',
    kanban_status_ready: '準備就緒',
    kanban_status_running: '執行中',
    kanban_status_blocked: '已封鎖',
    kanban_status_done: '完成',
    kanban_comments_count: '留言 ({0})',
    kanban_events_count: '事件 ({0})',
    kanban_links: '連結',
    kanban_parents: '父任務',
    kanban_children: '子任務',
    kanban_runs_count: '執行 ({0})',
    kanban_no_comments: '沒有留言',
    kanban_no_events: '沒有事件',
    kanban_no_runs: '沒有執行紀錄',
    kanban_title: '標題',
    kanban_description: '描述',
    kanban_description_placeholder: '選填 — 需要完成的事項、驗收標準、連結',
    kanban_status: '狀態',
    kanban_assignee: '指派對象',
    kanban_assignee_placeholder: '選填 — 個人資料或名稱',
    kanban_tenant: '租戶',
    kanban_tenant_placeholder: '選填，專案或團隊 slug',
    kanban_priority: '優先順序',
    kanban_priority_hint: '數字越大越先執行。預設為 0。',
    kanban_title_required: '標題為必填。',
    kanban_new_task: '新任務',
    kanban_edit_task: '編輯任務',
    kanban_status_original_hint: '實際狀態：{0}。此對話框僅支援編輯 Triage/Todo/Ready。',
    kanban_run_dispatcher: '執行調度器',
    kanban_run_dispatcher_confirm: '將認領此看板的 Ready 任務並產生工作子程序（每次點選最多 8 個）。是否繼續？',
    kanban_assignee_profiles_label: 'Hermes 設定檔',
    kanban_assignee_other_label: '其他（CLI 通道 / 已刪除的設定檔）',
    kanban_assignee_unassigned: '— 未指派（不會自動執行）—',
    kanban_ready_needs_assignee: '已選擇「未指派」＋「Ready」。調度器將跳過此任務。再次送出以確認，或選擇一個設定檔。',
    kanban_dispatch_preview_prefix: '預覽：',
    kanban_dispatch_run_prefix: '已調度：',
    kanban_dispatch_spawned: '已啟動',
    kanban_dispatch_promoted: '已提升',
    kanban_dispatch_reclaimed: '已收回',
    kanban_dispatch_skipped_unassigned: '跳過（未指派）',
    kanban_dispatch_skipped_nonspawnable: '跳過（未知設定檔）',
    kanban_dispatch_auto_blocked: '自動封鎖',
    kanban_dispatch_timed_out: '逾時',
    kanban_dispatch_crashed: '當機',
    kanban_add_comment: '新增留言',
    kanban_only_mine: '只看我的',
    kanban_bulk_action: '批次動作',
    kanban_nudge_dispatcher: '預覽調度器',
    kanban_stats: '統計',
    kanban_worker_log: 'Worker 記錄',
    kanban_block: '封鎖',
    kanban_unblock: '解除封鎖',
    kanban_back_to_board: '回到看板',
    kanban_lanes_by_profile: '依設定檔分欄',
    kanban_new_board: '新增看板…',
    kanban_rename_board: '重新命名目前看板…',
    kanban_archive_board: '封存目前看板…',
    kanban_archive_board_confirm: '封存看板「{name}」？任務仍會保留在磁碟上，且可從 kanban/boards/_archived/ 還原看板。',
    kanban_board_archived: '看板已封存',
    kanban_board_name: '名稱',
    kanban_board_slug: 'Slug（小寫、連字號）',
    kanban_board_description: '描述（選填）',
    kanban_board_icon: '圖示（emoji，選填）',
    kanban_board_color: '顏色（選填）',
    kanban_board_name_required: '名稱為必填',
    kanban_board_slug_required: 'Slug 為必填',
    kanban_card_complete: '完成',
    kanban_card_archive: '封存',
    kanban_unassigned: '未指派',
    kanban_status_archived: '已封存',
    tab_todos: '待辦',
    tab_insights: '統計',
    tab_dashboard: 'Hermes 儀表板',
    dashboard_loopback_warning: '儀表板在伺服器上僅限 loopback 存取。請從伺服器本機瀏覽，或使用 --host 0.0.0.0 重新啟動（不安全）。',
    tab_logs: '記錄',
    tab_settings: '設定',
    new_conversation: '新增對話',
    filter_conversations: '篩選對話……',
    markdown_table_filter: '篩選表格',
    markdown_table_sort_column: '欄排序',
    session_time_unknown: '未知',
    session_time_minutes_ago: (m) => `${m}分`,
    session_time_hours_ago: (h) => `${h}小時`,
    session_time_days_ago: (d) => `${d}天`,
    session_time_last_week: '1週',
    session_time_bucket_today: '今天',
    session_time_bucket_yesterday: '昨天',
    session_time_bucket_this_week: '本週',
    session_time_bucket_last_week: '上週',
    session_time_bucket_older: '更早',
    scheduled_jobs: '排程工作',
    new_job: '新任務',
    loading: '載入中……',
    search_skills: '搜尋技能……',
    new_skill: '新技能',
    personal_memory: '個人記憶',
    current_task_list: '目前任務清單',
    // Logs
    logs_title: '記錄',
    logs_file: '記錄檔',
    logs_tail: '追蹤記錄',
    logs_auto_refresh: '自動重新整理',
    logs_wrap: '自動換行',
    logs_copy_all: '複製全部',
    logs_empty: '沒有記錄可顯示。',
    logs_loading: '正在載入記錄…',
    logs_load_failed: '載入記錄失敗：',
    logs_status_idle: '請選擇記錄檔以檢視最近幾行。',
    logs_no_mtime: '修改時間未知',
    logs_truncated_hint: '正在顯示大型記錄檔的尾端；較早的位元組已略過，以限制記憶體用量。',
    logs_copied: '已複製記錄',
    logs_severity: '嚴重性',
    logs_severity_all: '全部',
    logs_severity_errors: '錯誤',
    logs_severity_warnings: '警告+',
    logs_filter_active: '已顯示（篩選器已啟用）',

    // Insights
    insights_title: '用量分析',
    insights_sessions: '對話',
    insights_messages: '訊息',
    insights_tokens: 'Token',
    insights_cost: '估計成本',
    insights_no_cost: 'N/A',
    insights_models: '模型',
    insights_activity_by_day: '每日活動',
    insights_activity_by_hour: '每小時活動',
    insights_peak_hour: '高峰：{hour}',
    insights_token_breakdown: 'Token 明細',
    insights_input_tokens: '輸入',
    insights_output_tokens: '輸出',
    insights_total: '總計',
    insights_daily_tokens: '每日 Token',
    insights_model_name: '模型',
    insights_model_sessions: '對話',
    insights_model_tokens: 'Token',
    insights_model_cost: '成本',
    insights_model_share: '占比',
    insights_no_usage_data: '尚無用量資料',
    insights_footer: '顯示最近 {days} 天的資料',
    insights_skill_usage_title: '技能使用情況',
    insights_skill_usage_sub: '工具呼叫頻率',
    insights_skill_usage_total: '呼叫總數',
    insights_skill_usage_skills_used: '已使用技能',
    insights_skill_usage_no_data: '尚無技能使用資料',
    insights_skill_usage_no_data_hint: '在對話中使用技能後，資料會顯示在這裡。',
    insights_skill_usage_footer: '資料來源：~/.hermes/skills/',
    insights_skill_usage_col_skill: '技能',
    insights_skill_usage_col_uses: '使用次數',
    insights_skill_usage_col_views: '檢視次數',
    insights_skill_usage_col_share: '使用占比',
    insights_skill_usage_col_patches: 'Patch',
    workspace_desc: '新增工作區，並為對話切換工作區。',
    session_meta_messages: (n) => `${n} 則訊息`,
    session_meta_children: (n) => `${n} 則子`,
    // Softened label: avoids exposing the technical internal term
    // 'segment' in the default visible badge. User-facing copy remains
    // translatable for locales that prefer a different wording. (#2155)
    session_meta_segments: (n) => `${n} 段`,
    session_lineage_toggle_hint: '{0} — 較早的脈絡回合已摺疊在這裡。點選可顯示或隱藏。',
    session_lineage_static_hint: '{0} — 較早的脈絡回合已摺疊在這裡。',
    session_child_toggle_hint: '{0} — 從此對話衍生的子對話。點選可顯示或隱藏。',
    session_readonly_title_hint: '唯讀匯入工作階段 — {0}',
    session_lineage_segment_untitled: '未命名段',
    session_lineage_segment_open: '開啟脈絡段',
    new_profile: '新增設定檔',
    transcript: '對話記錄',
    download_transcript: '下載為 Markdown',
    import: '匯入',
    export_session_json: 'JSON',
    export_session_json_tooltip: '將對話完整匯出為 JSON',
    import_session_json_tooltip: '從 JSON 匯入對話',
    clear_conversation_btn_tooltip: '清空此對話中的所有訊息',
    // Settings detail
    settings_label_rtl: '從右到左聊天版面',
    settings_desc_rtl: '為阿拉伯語或希伯來語等語言翻轉聊天訊息和編輯器輸入的對齊方式。僅影響聊天區域 — 側邊欄和其他面板保持從左到右。',
    settings_label_sound: '通知聲音',
    settings_desc_sound: '助理完成回覆時播放音效。',
    // TTS (#499)
    tts_listen: '收聽',
    tts_not_supported: '語音合成無法使用',
    settings_label_tts: '回覆語音合成',
    settings_desc_tts: '在每則助理訊息上顯示喇叭按鈕，使用瀏覽器語音合成功能朗讀內容。',
    settings_label_tts_auto_read: '自動朗讀回覆',
    settings_desc_tts_auto_read: '每則新的助理回覆完成時自動朗讀。開始輸入時會暫停。',
    // Composer voice-mode pref (#1488)
    settings_label_voice_mode: '免持語音模式按鈕',
    settings_desc_voice_mode: '在聽寫麥克風旁顯示語音模式按鈕（音訊波形）。可自然說話，Hermes 會在停頓後自動送出並朗讀回覆。需要同時支援語音辨識與 TTS 的瀏覽器。',
    settings_label_raw_audio: '傳送原始音訊，而不是先轉寫',
    settings_desc_raw_audio: '錄製並將原始音訊檔傳送給 Agent，而不是先轉成文字。Agent 接著可以轉寫音訊，或處理原始音訊（情緒、背景噪音、自訂 STT）。行為類似 Telegram 語音訊息。',
    voice_send_raw: '傳送原始音訊',
    voice_raw_attached: '已附加音訊。請按 [送出] 或繼續輸入。',
    settings_label_tts_voice: '語音',
    settings_desc_tts_voice: '偏好的語音。系統會從瀏覽器可用的語音中填入。',
    settings_label_tts_rate: '語速',
    settings_label_tts_pitch: '音調',
    settings_label_tts_engine: 'TTS 引擎',
    settings_desc_tts_engine: '選擇語音引擎。Edge TTS 會透過伺服器使用 Microsoft 神經語音。',
    settings_label_notifications: '瀏覽器通知',
    settings_desc_notifications: '分頁在背景中時，回覆完成後顯示系統通知。',
    notifications_enable_btn: 'Enable notifications',
    notifications_test_btn: 'Send test',
    notifications_permission_status: (status) => `Permission: ${status}`,
    notifications_enabled_toast: 'Notifications enabled.',
    notifications_denied: 'Notifications are blocked in this browser. Enable them in browser settings.',
    notifications_unsupported: 'Notifications are not supported in this browser.',
    settings_desc_token_usage: '在每則助理回覆下方顯示輸入／輸出 token 數量。也可以使用 /usage 切換。',
    settings_label_api_redact: '在 API 回應中遮蔽敏感資料',
    settings_desc_api_redact: '自行託管使用者可以為了透明度停用此功能（不建議在共用執行個體中停用）。',
    settings_sidebar_density_compact: '精簡',
    settings_sidebar_density_detailed: '詳細',
    settings_desc_sidebar_density: '控制左側對話清單要顯示多少額外資訊。',
    settings_label_auto_title_refresh: '自動調整標題更新',
    settings_auto_title_refresh_off: '關閉',
    settings_auto_title_refresh_5: '每 5 輪對話',
    settings_auto_title_refresh_10: '每 10 輪對話',
    settings_auto_title_refresh_20: '每 20 輪對話',
    settings_desc_auto_title_refresh: '根據最新對話自動重新產生對話標題，讓標題隨對話發展保持相關。需要設定 LLM 標題產生模型。',
    settings_desc_external_sessions: '在對話清單中顯示來自 CLI、Telegram、Discord、Slack 等管道的對話。點選即可匯入並繼續對話。',
    settings_desc_cron_sessions: 'Surface cron job output as conversations in the sidebar. Only active when non-WebUI sessions are enabled. Defaults off; high-frequency jobs can flood the sidebar.',
    settings_desc_previous_messaging_sessions: '顯示被 reset 或 compression 替換的較舊的 Discord、Telegram、Slack 和 Weixin 對話。',
    settings_desc_sync_insights: '將 WebUI token 用量鏡射到 state.db，讓 hermes /insights 納入瀏覽器工作階段資料。預設為關閉。',
    settings_desc_check_updates: '有較新版 WebUI 或 Agent 時顯示橫幅。系統會定期在背景執行 git fetch。',
    settings_desc_ignore_agent_updates: '保留 WebUI 更新檢查，但隱藏 Agent 更新通知，並略過 Agent 更新 fetch。',
    settings_desc_whats_new_summary: '將 [新版內容] 動作改為先產生簡短、易讀的摘要，而不是先開啟原始 diff。摘要完成後仍可使用一般 diff 比較。',
    settings_desc_bot_name: '助理在整個 UI 中顯示的名稱。預設為 Hermes。',
    settings_desc_password: '輸入新密碼即可設定或變更密碼。留空會保留目前設定。',
    password_placeholder: '輸入新密碼……',
    password_env_var_locked: '目前已設定 HERMES_WEBUI_PASSWORD 環境變數且優先生效。請取消設定並重新啟動伺服器，才能在此管理密碼。',
    password_env_var_locked_placeholder: '已鎖定：已設定 HERMES_WEBUI_PASSWORD 環境變數',
    disable_auth: '停用驗證',
    sign_out: '登出',
    settings_label_shutdown: '停止 Hermes WebUI 伺服器',
    settings_desc_shutdown_before_cmd: '正常停止本機 WebUI 伺服器。適合透過 ',
    settings_desc_shutdown_between_cmds: ' 啟動，且想要不切換到終端機就停止伺服器的情境。要再次進入 WebUI，需要重新啟動伺服器（',
    settings_desc_shutdown_after_cmd: ' 或原生應用程式）。',
    settings_btn_shutdown: '停止伺服器',
    settings_shutdown_confirm_title: '停止 Hermes WebUI',
    settings_shutdown_confirm_message: '停止 Hermes WebUI 伺服器？',
    settings_shutdown_confirm_btn: '停止',
    settings_shutdown_stopped_message: '伺服器已停止。可以關閉這個分頁。',
    // Providers panel
    providers_tab_title: '供應商',
    providers_section_title: '供應商',
    providers_section_meta: '管理 AI 提供者的 API 金鑰。變更會立即生效。',
    providers_status_configured: 'API 金鑰已設定',
    providers_status_not_configured: '無 API 金鑰',
    providers_status_oauth: 'OAuth',
    providers_status_api_key: 'API 金鑰',
    providers_status_not_configured_label: '未設定',
    providers_oauth_hint: '已透過 OAuth 驗證。無需 API 金鑰。',
    providers_oauth_config_yaml_hint: '已透過 config.yaml 設定權證。要更新，請編輯 config.yaml 中的 providers 區段，或執行 hermes auth。',
    providers_oauth_not_configured_hint: '尚未驗證。請在終端機執行 hermes auth 以設定此提供者。',
    providers_save: '儲存',
    providers_refresh_models: '重新整理模型',
    providers_refreshing: '正在重新整理…',
    providers_models_refreshed: '模型已重新整理',
    providers_remove: '移除',
    providers_saving: '儲存中…',
    providers_removing: '移除中…',
    providers_enter_key: '請輸入 API 金鑰',
    providers_empty: '找不到可設定的提供者。',
    providers_key_updated: 'API 金鑰已儲存',
    providers_key_removed: 'API 金鑰已移除',
    providers_key_placeholder_new: 'sk-...',
    providers_key_placeholder_replace: '輸入新金鑰以取代…',
    provider_quota_title: '目前提供者配額',
    provider_quota_active_provider: '目前提供者',
    provider_quota_last_checked_after_refresh: '重新整理後檢查',
    provider_quota_last_checked: '上次檢查 {0}',
    provider_quota_refresh_usage: '重新整理用量',
    provider_quota_refreshing: '正在重新整理……',
    provider_quota_refresh_title: '立即重新整理提供者用量限制',
    provider_quota_refresh_succeeded: '提供者用量已重新整理',
    provider_quota_refresh_failed: '提供者用量重新整理失敗',
    provider_quota_session_limit: '5 小時限制',
    provider_quota_weekly_limit: '每週限制',
    provider_quota_window_fallback: '視窗',
    provider_quota_metric_remaining: '剩餘',
    provider_quota_metric_used: '已用',
    provider_quota_metric_limit: '限制',
    provider_quota_status_available: '可用',
    provider_quota_status_exhausted: '已耗盡',
    provider_quota_status_unavailable: '不可用',
    provider_quota_status_failed: '失敗',
    provider_quota_status_checked: '已檢查',
    provider_quota_status_no_key: '無金鑰',
    provider_quota_status_invalid_key: '金鑰無效',
    provider_quota_status_unsupported: '不支援',
    provider_quota_used_meta: '已用 {0}',
    provider_quota_resets_meta: '重設於 {0}',
    provider_quota_credential_pool: '憑證池',
    provider_quota_credential_label: '憑證 {0}',
    provider_quota_pool_plans: '方案：{0}',
    provider_quota_pool_no_windows: '未回報帳戶限制視窗。',
    provider_quota_account_limits_loaded: '帳戶限制已載入。',
    provider_quota_unavailable: '配額狀態不可用',
    provider_quota_retry_after: '重試時間 {0}',
    provider_quota_pool_summary_available: '{0}/{1} 可用',
    provider_quota_pool_summary_exhausted: '{0} 個已耗盡',
    provider_quota_pool_summary_failed: '{0} 個失敗',
    provider_quota_pool_summary_checked: '已檢查 {0} 個',
    cancel: '取消',
    create_job: '建立工作',
    save_skill: '儲存技能',
    editing: '編輯中',
    // Empty state
    empty_title: '需要什麼協助？',
    empty_subtitle: '可以提問、執行命令、瀏覽檔案，或管理排程工作。',
    suggest_files: '這個工作區有哪些檔案？',
    suggest_schedule: '今天有哪些行程？',
    suggest_plan: '協助我規劃一個小專案。',
    // onboarding
    onboarding_badge: '首次使用',
    onboarding_title: '歡迎使用 Hermes Web UI',
    onboarding_lead: '快速設定精靈會驗證 Hermes、儲存實際的供應商設定、選擇工作區與模型，並可選擇用密碼保護應用程式。',
    onboarding_back: '上一頁',
    onboarding_continue: '繼續',
    onboarding_skip: '跳過設定',
    onboarding_skipped: '已略過設定，使用現有設定。',
    onboarding_open: '開啟 Hermes',
    onboarding_step_system_title: '系統檢查',
    onboarding_step_system_desc: '驗證 Hermes Agent 與設定可見性。',
    onboarding_step_setup_title: '供應商設定',
    onboarding_step_setup_desc: '儲存最低限度的 Hermes 供應商設定。',
    onboarding_step_workspace_title: '工作區與模型',
    onboarding_step_workspace_desc: '選擇新工作階段與聊天的預設值。',
    onboarding_step_password_title: '選用密碼',
    onboarding_step_password_desc: '分享 Web UI 前先保護它。',
    onboarding_step_finish_title: '完成',
    onboarding_step_finish_desc: '檢查設定並進入應用程式。',
    onboarding_notice_system_ready: 'Hermes Agent 看起來可由 Web UI 存取。',
    onboarding_notice_system_unavailable: 'Hermes Agent 尚未完全可用。Bootstrap 可以安裝它，但供應商設定可能仍需要使用終端機。',
    onboarding_check_agent: 'Hermes Agent',
    onboarding_check_agent_ready: '已偵測到且可匯入',
    onboarding_check_agent_missing: '缺少或僅能部分匯入',
    onboarding_check_password: '密碼',
    onboarding_check_password_enabled: '已啟用',
    onboarding_check_password_disabled: '尚未啟用',
    onboarding_check_provider: '供應商設定',
    onboarding_check_provider_ready: '已可聊天',
    onboarding_check_provider_partial: '已儲存但不完整',
    onboarding_check_provider_pending: '需要驗證',
    onboarding_config_file: '設定檔：',
    onboarding_env_file: '.env 檔案：',
    onboarding_unknown: '未知',
    onboarding_current_provider: '目前設定：',
    onboarding_missing_imports: '缺少的匯入內容：',
    onboarding_notice_setup_required: '請在這裡選擇簡易供應商路徑。進階 OAuth 流程目前仍需使用 Hermes CLI 處理。',
    onboarding_notice_setup_already_ready: '已偵測到可用的 Hermes 供應商設定。可以保留或在這裡替換。',
    onboarding_oauth_provider_ready_title: '供應商已完成驗證',
    onboarding_oauth_provider_ready_body: '這個執行個體已設定為使用 Hermes CLI 設定的 OAuth 供應商（<strong>{provider}</strong>）。這裡不需要 API 金鑰，請點選 [繼續] 完成設定。',
    onboarding_oauth_provider_not_ready_title: 'OAuth 供應商尚未完成驗證',
    onboarding_oauth_provider_not_ready_body: '這個執行個體已設定為使用 <strong>{provider}</strong>，此供應商使用 OAuth 而不是 API 金鑰。請在終端機執行 <code>hermes auth</code> 或 <code>hermes model</code> 完成驗證，然後重新載入 Web UI。',
    onboarding_oauth_switch_hint: '或在下方選擇其他供應商，切換為 API 金鑰設定：',
    oauth_login_codex: '使用 Codex（ChatGPT）登入',
    oauth_codex_step1: '步驟 1：前往此 URL 並輸入驗證碼',
    oauth_codex_step2: '步驟 2：在頁面上輸入此驗證碼',
    oauth_codex_polling: '正在等待授權…',
    oauth_codex_success: 'Codex OAuth 登入成功！',
    oauth_codex_error: 'OAuth 登入失敗',
    oauth_codex_expired: '驗證碼已過期，請再試一次',
    onboarding_notice_workspace: '這些值會重複使用一般應用程式相同的設定 API。',
    onboarding_workspace_label: '工作區',
    onboarding_workspace_or_path: '或輸入工作區路徑',
    onboarding_workspace_placeholder: '/home/you/workspace',
    onboarding_provider_label: '設定模式',
    onboarding_quick_setup_badge: '快速設定',
    provider_category_easy_start: '快速開始',
    provider_category_self_hosted: '開源／自行託管',
    provider_category_specialized: '專業服務',
    onboarding_api_key_label: 'API 金鑰',
    onboarding_api_key_placeholder: '留空可保留現有已儲存金鑰',
    onboarding_api_key_label_optional: 'API 金鑰（選用）',
    onboarding_api_key_placeholder_optional: '無需金鑰的伺服器可留空',
    onboarding_api_key_help_keyless: '多數 LM Studio / Ollama / vLLM 安裝不需要金鑰；如果伺服器不需要驗證，請留空。請使用 [測試連線] 按鈕確認。',
    onboarding_api_key_help_prefix: '系統會使用以下名稱，將它以祕密值形式儲存在 Hermes .env 檔案中',
    onboarding_base_url_label: 'Base URL',
    onboarding_base_url_placeholder: 'https://your-endpoint.example/v1',
    onboarding_base_url_help: '可用於 OpenAI 相容路由器、自行託管伺服器、LiteLLM、Ollama、LM Studio、vLLM 或類似端點。',
    onboarding_model_label: '預設模型',
    onboarding_workspace_help: '選擇設定完成後 Hermes 應在新聊天中使用的模型。',
    onboarding_custom_model_placeholder: 'your-model-name',
    onboarding_custom_model_help: '自訂端點請輸入伺服器預期的確切模型 ID。',
    onboarding_notice_password_enabled: '已設定密碼。只有要替換時才需要輸入新密碼。',
    onboarding_notice_password_recommended: '建議設定密碼，尤其是要將 UI 暴露到 localhost 以外時。',
    onboarding_password_label: '密碼（選用）',
    onboarding_password_placeholder: '留空可略過',
    onboarding_password_help: '密碼會透過既有設定 API 儲存，並在伺服器端雜湊。',
    onboarding_notice_finish: '之後可以重新開啟 [設定] 變更這些值。',
    onboarding_not_set: '未設定',
    onboarding_password_will_enable: '將會啟用',
    onboarding_password_will_replace: '將取代',
    onboarding_password_keep_existing: '保留目前密碼',
    onboarding_password_remains_disabled: '將保持停用',
    onboarding_password_skipped: '暫時略過',
    onboarding_finish_help: '完成後會在設定中儲存 <code>onboarding_completed</code>，並進入一般應用程式。',
    onboarding_error_choose_workspace: '請先選擇工作區再繼續。',
    onboarding_error_choose_model: '請先選擇模型再繼續。',
    onboarding_error_provider_required: '請先選擇設定模式再繼續。',
    onboarding_error_base_url_required: '自訂端點必須提供 Base URL。',
    onboarding_probe_test_button: '測試連線',
    onboarding_probe_probing: '正在測試連線…',
    onboarding_probe_ok: '已連線。共有 {n} 個模型可用。',
    onboarding_probe_error_generic: '無法連上設定的 Base URL。',
    onboarding_probe_error_invalid_url: 'Base URL 必須以 http:// 或 https:// 開頭。',
    onboarding_probe_error_dns: '無法解析主機。請檢查 URL，或改用主機的 IP 位址。',
    onboarding_probe_error_connect_refused: '連線遭拒；伺服器可能沒有在該位址執行。若在 Docker 內使用，請嘗試以主機 IP 取代 localhost。',
    onboarding_probe_error_timeout: '端點未及時回應。請確認伺服器正在執行，且 URL 正確。',
    onboarding_probe_error_http_4xx: '端點回傳請求端錯誤。請檢查驗證資訊與 URL 路徑（通常以 /v1 結尾）。',
    onboarding_probe_error_http_5xx: '端點回傳伺服器錯誤。請檢查 LM Studio / Ollama 伺服器記錄。',
    onboarding_probe_error_parse: '端點未回傳預期格式的模型清單。請確認 URL 指向 OpenAI 相容 API 根路徑。',
    onboarding_probe_error_unreachable: '無法連上設定的 Base URL。',
    onboarding_error_probe_failed: '無法驗證設定的 Base URL。',
    onboarding_error_workspace_required: '工作區為必填。',
    onboarding_error_model_required: '模型為必填。',
    onboarding_complete: '初始設定已完成',

    // panel/runtime i18n
    error_prefix: '錯誤：',
    default: '預設',
    search: '搜尋',
    not_available: '無',
    never: '從不',
    add: '新增',
    add_failed: '新增失敗：',
    remove_failed: '移除失敗：',
    switch_failed: '切換失敗：',
    name_required: '需要名稱',
    content_required: '需要內容',
    view: '檢視',
    dismiss: '關閉',
    disable: '停用',
    cron_no_jobs: '找不到排程任務。',
    cron_status_off: '未啟用',
    cron_status_paused: '已暫停',
    cron_status_error: '錯誤',
    cron_status_active: '已啟用',
    cron_status_running: '執行中…',
    cron_status_needs_attention: '需要處理',
    cron_attention_desc: '這個重複排程任務沒有下次執行時間。排程器可能無法計算下一次執行。',
    cron_attention_croniter_hint: 'Gateway 執行環境可能缺少 croniter 套件。請用支援 cron 的環境重啟 Gateway，然後恢復這個任務。',
    cron_attention_resume: '恢復並重新計算',
    cron_jobs_project: '定時任務',
    cron_attention_run_once: '立即執行一次',
    cron_attention_copy_diagnostics: '複製診斷資訊',
    cron_diagnostics_copied: '排程任務診斷資訊已複製',
    cron_next: '下次',
    cron_last: '上次',
    cron_run_now: '立即執行',
    cron_pause: '暫停',
    cron_resume: '恢復',
    cron_job_name_placeholder: '任務名稱',
    cron_schedule_placeholder: '排程',
    cron_prompt_placeholder: '提示詞',
    cron_last_output: '最後輸出',
    cron_expand_prompt: '展開提示詞',
    cron_collapse_prompt: '收起提示詞',
    cron_expand_output: '展開輸出',
    cron_collapse_output: '收起輸出',
    cron_mode_agent: '代理',
    cron_mode_script: '腳本',
    cron_mode_label: '模式',
    cron_script_job_banner: '依排程執行腳本，stdout 會送到交付目標。不使用代理、提示詞或技能。',
    cron_script_card_title: '腳本',
    cron_script_output: '腳本輸出',
    cron_script_path_label: '腳本路徑',
    cron_script_path_hint: '除非為絕對路徑，否則會在 ~/.hermes/scripts/ 下解析。請在伺服器上編輯腳本檔以變更行為。',
    cron_script_badge_title: '腳本任務（無代理）',
    cron_workdir_label: '工作目錄',
    cron_view_full_output: '檢視完整輸出',
    cron_all_runs: '所有執行',
    cron_hide_runs: '隱藏執行記錄',
    cron_no_runs_yet: '（尚無執行記錄）',
    cron_schedule_required_example: '需要排程（例如「0 9 * * *」或「every 1h」）',
    cron_schedule_required: '需要排程',
    cron_prompt_required: '需要提示詞',
    cron_job_created: '排程任務已建立',
    cron_duplicate: '複製',
    cron_duplicated: '任務已複製（已暫停）',
    cron_job_triggered: '排程任務已觸發',
    cron_job_paused: '排程任務已暫停',
    cron_job_resumed: '排程任務已恢復',
    cron_job_updated: '排程任務已更新',
    cron_model_label: '模型覆寫',
    cron_model_hint: '覆寫此工作的預設模型。',
    cron_model_use_default: '預設（使用設定檔／系統預設）',
    cron_delete_confirm_title: '刪除排程任務',
    cron_delete_confirm_message: '此操作無法復原。',
    cron_job_deleted: '排程任務已刪除',
    cron_completion_status: (name, status) => `排程「${name}」${status}`,
    status_failed: '失敗',
    status_completed: '已完成',
    todos_no_active: '此對話中沒有使用中的任務清單。',
    clear_conversation_title: '清除對話',
    clear_conversation_message: '清除所有訊息？此操作無法復原。',
    clear_failed: '清除失敗：',
    skills_no_match: '找不到符合的技能。',
    skill_enabled: '技能已啟用',
    skill_disabled: '技能已停用',
    skill_toggle_failed: '切換技能狀態失敗：',
    linked_files: '關聯檔案',
    skill_load_failed: '載入技能失敗：',
    skill_file_load_failed: '載入檔案失敗：',
    skill_name_required: '需要技能名稱',
    skill_updated: '技能已更新',
    skill_created: '技能已建立',
    skill_deleted: '技能已刪除',
    skill_delete_confirm: '要刪除技能「{0}」嗎？',
    skills_empty_title: '選擇技能',
    skills_empty_sub: '從側邊欄選擇技能以檢視內容，或建立新技能。',
    skills_edit: '編輯',
    skills_delete: '刪除',
    skills_back_to: '回到 {0}',
    tasks_empty_title: '選擇排程任務',
    tasks_empty_sub: '從側邊欄選擇任務以檢視詳細資料與執行記錄，或建立新任務。',
    workspaces_empty_title: '選擇工作區',
    workspaces_empty_sub: '從側邊欄選擇工作區以檢視其檔案與設定，或新增工作區。',
    profiles_empty_title: '選擇設定檔',
    profiles_empty_sub: '從側邊欄選擇 Agent 設定檔以檢視並編輯設定，或建立新設定檔。',
    memory_notes_label: '記憶（備註）',
    memory_saved: '記憶已儲存',
    my_notes: '我的備註',
    user_profile: '使用者設定檔',
    external_notes_sources: '第三方筆記',
    external_notes_empty: '尚未看到任何筆記或知識 MCP 來源。設定 Joplin、Obsidian、Notion、llm-wiki 或其他筆記伺服器後，會顯示在這裡。',
    external_notes_auto_recall_hint: '自動對話召回維持不變；這個抽屜只顯示已設定的來源，以及可用的讀取／搜尋工具。',
    external_notes_no_tools: '此來源目前沒有可見的讀取/搜尋工具。',
    external_notes_tool_count: (count) => `${count} 個筆記工具可用`,
    external_notes_configured_hint: '此已設定來源應提供工具名稱；當 WebUI 執行階段提供即時 schema 時會顯示在這裡。',
    external_notes_recent_ai: 'AI 最近使用',
    external_notes_auto: '自動',
    external_notes_recent_ai_reason: '自動召回',
    external_notes_search_placeholder: '搜尋筆記…',
    external_notes_search_empty: '搜尋已設定的筆記來源後，可在這裡預覽筆記。',
    source_active: '使用中',
    source_configured: '已設定',
    no_notes_yet: '尚無備註。',
    no_profile_yet: '尚無設定檔。',
    agent_soul: 'Agent 靈魂',
    no_soul_yet: '尚無靈魂定義。',
    workspace_choose_path: '選擇工作區路徑',
    workspace_choose_path_meta: '新增驗證過的路徑並切換此對話',
    workspace_manage: '管理工作區',
    workspace_manage_meta: '開啟 Spaces 面板',
    workspace_use_title: '在目前對話中使用',
    workspace_use: '使用',
    workspace_add_path_placeholder: '新增工作區路徑（例如 /home/user/my-project）',
    workspace_paths_validated_hint: '路徑會先驗證是否存在再儲存。',

    workspace_drag_hint: '拖曳以重新排列',
    workspace_reorder_failed: '重新排列失敗',
    workspace_added: '工作區已新增',
    workspace_renamed: '工作區已重新命名',
    workspace_remove_confirm_title: '移除工作區',
    workspace_remove_confirm_message: (name) => `移除工作區「${name}」？`,
    workspace_removed: '工作區已移除',
    workspace_switch_prompt_title: '切換工作區',
    workspace_switch_prompt_message: '輸入工作區的絕對路徑以新增並切換此對話。',
    workspace_switch_prompt_confirm: '切換',
    workspace_switch_prompt_placeholder: '/Users/you/project',
    workspace_not_added: '工作區未新增',
    workspace_already_saved: '工作區已儲存 — 從清單中選取',
    workspace_busy_switch: 'Agent 執行中無法切換工作區',
    discard_file_edits_title: '放棄檔案編輯？',
    discard_file_edits_message: '切換工作區將放棄未儲存的預覽變更。',
    workspace_switched_to: (name) => `已切換到 ${name}`,
    profiles_no_profiles: '找不到設定檔。',
    profile_api_keys_configured: 'API 金鑰已設定',
    profile_gateway_running: 'Gateway 執行中',
    profile_gateway_stopped: 'Gateway 已停止',
    profile_active: '啟用中',
    profile_no_configuration: '沒有設定',
    profile_skill_count: (n) => `${n} 個技能`,
    profile_use: '使用',
    profile_switch_title: '切換到此設定檔',
    profile_delete_title: '刪除此設定檔',
    profile_default_label: '（預設）',
    profile_name_placeholder: '設定檔名稱（小寫字母、數字、連字號）',
    profile_clone_label: '從啟用中的設定檔複製設定',
    profile_model_label: '模型 / 供應商',
    profile_model_hint: '為這個新設定檔選擇已設定的供應商和模型。',
    profile_model_use_default: '使用啟用中設定檔的預設值',
    profile_base_url_placeholder: '基本 URL（選填，例如 http://localhost:11434）',
    profile_api_key_placeholder: 'API 金鑰（選填）',
    manage_profiles: '管理設定檔',
    profiles_load_failed: '載入設定檔失敗',
    profile_switched_new_conversation: (name) => `已切換至設定檔：${name}，並開始新對話`,
    profile_switched: (name) => `已切換至設定檔：${name}`,
    profile_name_rule: '僅限小寫字母、數字、連字號和底線',
    profile_base_url_rule: '基本 URL 必須以 http:// 或 https:// 開頭',
    profile_created: (name) => `設定檔 ${name} 已建立`,
    profile_delete_confirm_title: (name) => `刪除設定檔「${name}」？`,
    profile_delete_confirm_message: '此設定檔的所有對話、設定、技能和記憶將被永久刪除。此操作無法復原。',
    profile_deleted: (name) => `設定檔 ${name} 已刪除`,
    active_conversation_none: '未選取使用中的對話。',
    active_conversation_meta: (title, count) => `${title} · ${count} 則訊息`,
    settings_unsaved_changes: '有未儲存的變更。',
    sign_out_failed: '登出失敗：',
    disable_auth_confirm_title: '停用密碼保護',
    disable_auth_confirm_message: '任何人都可以存取此執行個體。',
    auth_disabled: '驗證已停用 — 密碼保護已關閉',
    disable_auth_failed: '停用驗證失敗：',
    bg_error_single: (title) => `「${title}」發生錯誤`,
    bg_error_multi: (count) => `${count} 個對話發生錯誤`,
    // skill form
    skill_name: '名稱',
    skill_category: '類別',
    skill_category_placeholder: '選填，例如 devops',
    skill_content: 'SKILL.md 內容',
    skill_content_placeholder: 'YAML frontmatter + Markdown 內文',
    skill_rename_not_supported: '不支援重新命名技能。若要重新命名，請建立新技能並刪除舊技能。',
    skill_metadata: '中繼資料',
    // cron form
    cron_name_label: '任務名稱',
    cron_name_placeholder: '選填',
    cron_schedule_label: '排程',
    cron_schedule_hint: '週期性任務請用「every 1h」或 Cron 表示式。像「30m」這樣的裸時長只會執行一次。',
    cron_schedule_once_warning: '像「30m」這樣的時長寫法只會執行一次，並在執行後移除。要保留週期性任務，請使用「every 30m」。',
    cron_prompt_label: '提示',
    cron_deliver_label: '傳送至',
    cron_deliver_local: '本機（僅儲存輸出）',
    cron_deliver_custom: '自訂推送目標',
    cron_profile_label: '設定檔',
    cron_profile_server_default: '伺服器預設',
    cron_profile_server_default_hint: '執行時使用 WebUI 伺服器預設設定檔。沒有設定檔的既有工作會保留此舊行為。',
    cron_toast_notifications_label: '完成 toast 通知',
    cron_toast_notifications_hint: '此排程工作完成時顯示 toast 通知。即使關閉此選項，Tasks 徽章與新執行標記仍會更新。',
    cron_toast_notifications_enabled: '已啟用',
    cron_toast_notifications_disabled: '已停用',
    cron_skills_label: '技能',
    cron_skills_placeholder: '新增技能（選填）…',
    cron_skills_edit_hint: '技能清單建立後無法編輯。',
    // workspace form
    workspace_name_label: '名稱',
    workspace_name_placeholder: '選填的顯示名稱',
    workspace_path_label: '路徑',
    workspace_path_required: '工作區路徑為必填',
    workspace_path_readonly: '路徑無法變更，只能重新命名。',
    workspace_new_title: '新增工作區',
    // profile form
    profile_name_label: '名稱',
    profile_base_url_label: 'Base URL',
    profile_api_key_label: 'API 金鑰',
    cmd_yolo: '切換 YOLO 模式（略過核准）',
    yolo_no_session: '無活動工作階段',
    yolo_enabled: '⚡ YOLO 模式已開啟，將略過所有核准',
    yolo_disabled: 'YOLO 模式已關閉',
    yolo_pill_label: 'YOLO',
    yolo_pill_title_active: 'YOLO 模式已啟用，點選即可關閉',
    approval_skip_all: '⚡ 本次工作階段全部跳過',
    approval_skip_all_title: '略過本次工作階段的所有核准提示',
    // composer action tooltips
    composer_send: '傳送訊息',
    composer_queue: '訊息加入佇列',
    composer_interrupt: '中斷並傳送',
    composer_steer: '引導目前回應',
    composer_stop: '停止產生',
    composer_disabled_clarify: '請回覆上方的澄清要求',
    composer_disabled_compression: '等待壓縮完成',
    composer_compression_will_queue: 'Type a message — it will queue and send after compression',
    composer_disabled_empty: '請輸入訊息後傳送',
    composer_mobile_workspace: '工作區',
    composer_mobile_model: '模型',
    composer_mobile_reasoning: '推理',
    composer_mobile_context: '脈絡',
    media_audio_label: '音訊',
    media_svg_label: '圖表',
    media_video_label: '影片',
    media_download: '下載',
    csv_loading: '載入 CSV',
    csv_too_large: 'CSV 檔案過大，無法內嵌渲染',
    csv_no_data: 'CSV 檔案資料不足，無法渲染為表格',
    csv_error: '載入 CSV 檔案失敗',
    csv_header_note: '第一列顯示為表格標題',
    excalidraw_loading: '載入圖表',
    excalidraw_too_large: 'Excalidraw 檔案過大，無法內嵌渲染',
    excalidraw_invalid: '無效的 Excalidraw 檔案格式',
    excalidraw_error: '載入 Excalidraw 檔案失敗',
    excalidraw_label: '圖表',
    excalidraw_download: '下載',
    excalidraw_empty: '空圖表',
    excalidraw_render_error: '渲染圖表失敗',
    excalidraw_simplified: '簡化 SVG 預覽 — 與 Excalidraw 畫布不完全相同',
    // ── Checkpoints / Rollback ──
    checkpoint_title: '檢查點',
    checkpoint_empty: '此工作區沒有檢查點。',
    checkpoint_loading: '正在載入檢查點…',
    checkpoint_error: '載入檢查點失敗',
    checkpoint_date: '日期',
    checkpoint_message: '訊息',
    checkpoint_files: '檔案',
    checkpoint_view_diff: '檢視差異',
    checkpoint_restore: '還原',
    checkpoint_restore_confirm_title: '要還原檢查點嗎？',
    checkpoint_restore_confirm_message: (ckpt) => `要將工作區還原到檢查點「${ckpt}」嗎？這會用已儲存版本覆寫檔案。此檢查點之後新增的檔案不會被刪除。`,
    checkpoint_restored: '已還原檢查點',
    checkpoint_diff_title: '檢查點中的變更',
    checkpoint_diff_no_changes: '這個檢查點與目前工作區沒有差異。',
    checkpoint_diff_files_changed: (n) => `已變更 ${n} 個檔案`,
    outline_title: '大綱',
    outline_empty: '尚無問題。',
    outline_loading: '載入中…',

  },

  pt: {
    offline_title: 'Conexão perdida',
    offline_browser_detail: 'O navegador informa que este dispositivo está offline.',
    offline_network_detail: 'O Hermes está inacessível neste navegador agora.',
    offline_autorefresh: 'Vou atualizar esta página automaticamente quando o Hermes voltar a responder.',
    offline_check_now: 'Verificar agora',
    offline_checking: 'Verificando…',
    offline_stream_waiting: 'Conexão perdida. Aguardando para atualizar…',
    _lang: 'pt',
    _label: 'Português',
    _speech: 'pt-BR',
    // boot.js
    cancelling: 'Cancelando…',
    cancel_failed: 'Falha ao cancelar: ',
    mic_denied: 'Acesso ao microfone negado. Verifique as permissões do navegador.',
    mic_no_speech: 'Nenhuma fala detectada. Tente novamente.',
    mic_network: 'Reconhecimento de fala indisponível.',
    mic_error: 'Erro no input de voz: ',
    session_imported: 'Sessão importada',
    import_failed: 'Falha na importação: ',
    import_invalid_json: 'JSON inválido',
    image_pasted: 'Imagem colada: ',
    // messages.js
    edit_message: 'Editar mensagem',
    regenerate: 'Regenerar resposta',
    copy: 'Copiar',
    copied: 'Copiado!',
    copy_failed: 'Falha ao copiar',
    selected_text_reply: 'Responder com seleção',
    selected_text_reply_title: 'Anexar o texto selecionado do chat como contexto citado',
    selected_text_reply_appended: 'Texto selecionado adicionado ao compositor',
    saved_prompts_empty: 'Nenhum prompt salvo ainda.',
    saved_prompts_save_current: 'Salvar entrada atual como prompt',
    saved_prompts_saved: 'Prompt salvo',
    saved_prompts_delete: 'Excluir prompt',
    saved_prompts_empty_input: 'Digite um prompt para salvar primeiro',
    you: 'Você',
    thinking: 'Pensando',
    expand_all: 'Expandir tudo',
    collapse_all: 'Recolher tudo',
    edit_failed: 'Falha ao editar: ',
    regen_failed: 'Falha ao regenerar: ',
    reconnect_active: 'Uma resposta ainda está sendo gerada. Recarregar quando estiver pronto?',
    reconnect_finished: 'Uma resposta estava em andamento quando você saiu. As mensagens podem ter atualizado.',
    // approval card
    approval_heading: 'Aprovação necessária',
    approval_desc_prefix: 'Comando perigoso detectado',
    approval_btn_once: 'Permitir uma vez',
    approval_btn_once_title: 'Permitir este comando (Enter)',
    approval_btn_session: 'Permitir sessão',
    approval_btn_session_title: 'Permitir para esta sessão de conversa',
    approval_btn_always: 'Sempre permitir',
    approval_btn_always_title: 'Sempre permitir este padrão de comando',
    approval_btn_deny: 'Negar',
    approval_btn_deny_title: 'Negar — não executar este comando',
    approval_responding: 'Respondendo…',
    clarify_heading: 'Esclarecimento necessário',
    clarify_hint: 'Escolha uma opção ou digite sua resposta abaixo.',
    clarify_other: 'Outro',
    clarify_send: 'Enviar',
    clarify_input_placeholder: 'Digite sua resposta…',
    clarify_responding: 'Respondendo…',
    session_attention_approval: (n) => n === 1 ? 'Aprovação' : `${n} aprovações`,
    session_attention_clarify: (n) => n === 1 ? 'Pergunta' : `${n} perguntas`,
    session_attention_generic: (n) => n === 1 ? 'Atenção' : `${n} itens`,
    session_attention_approval_title: 'Aguardando decisão de permissão',
    session_attention_clarify_title: 'Aguardando sua resposta',
    session_attention_generic_title: 'Aguardando ação do usuário',
    untitled: 'Sem título',
    n_messages: (n) => `${n} mensagens`,
    load_older_messages: '↑ Role para cima ou clique para carregar mensagens mais antigas',
    session_jump_start: 'Início',
    session_jump_start_label: 'Ir para o início da sessão',
    session_jump_end: 'Fim',
    session_jump_end_label: 'Ir para o fim da sessão',
    session_new_message: 'Nova mensagem',
    session_new_message_label: 'Nova mensagem disponível, ir para o fim',
    jump_to_question: 'para a resposta',
    jump_to_question_label: 'Ir para o início desta resposta',
    queued_label: 'Envia após a resposta',
    queued_count: (n) => n === 1 ? '1 na fila' : `${n} na fila`,
    queued_cancel: 'Cancelar mensagem na fila',
    model_unavailable: ' (indisponível)',
    model_unavailable_title: 'Este modelo não está mais na sua lista de provedores',
    provider_mismatch_warning: (m,p)=>`"${m}" pode não funcionar com seu provedor configurado (${p}). Enviar assim mesmo, ou execute \`hermes model\` no terminal para trocar.`,
    provider_mismatch_label: 'Provedor incompatível',
    gateway_auth_label: 'Falha na autenticação do Gateway',
    model_not_found_label: 'Modelo não encontrado',
    composer_mobile_workspace: 'Workspace',
    composer_mobile_model: 'Modelo',
    composer_mobile_reasoning: 'Raciocínio',
    composer_mobile_context: 'Contexto',
    model_custom_label: 'ID de modelo customizado',
    model_custom_placeholder: 'ex: openai/gpt-5.4',
    model_search_placeholder: 'Buscar modelos…',
    session_toolsets: 'Session Toolsets', // TODO: translate
    session_toolsets_desc: 'Restrict available tools for this session (blank = use global config)', // TODO: translate
    session_toolsets_global: 'Global (default)', // TODO: translate
    session_toolsets_custom: 'Custom', // TODO: translate
    session_toolsets_placeholder: 'tool1, tool2, \u2026', // TODO: translate
    session_toolsets_apply: 'Apply', // TODO: translate
    session_toolsets_clear: 'Clear (use global)', // TODO: translate
    session_toolsets_applied: 'Toolsets updated', // TODO: translate
    session_toolsets_cleared: 'Toolsets cleared — using global config', // TODO: translate
    session_toolsets_failed: 'Failed to update toolsets: ', // TODO: translate
    model_search_no_results: 'Nenhum modelo encontrado',
    model_group_configured: 'Configurados',
    ws_search_placeholder: 'Buscar espaços de trabalho…',
    ws_no_results: 'Nenhum espaço de trabalho encontrado',
    workspace_new_worktree_conversation: 'Nova conversa em worktree',
    workspace_new_worktree_conversation_meta: 'Cria um git worktree isolado para este espaço de trabalho.',
    workspace_worktree_created: 'Conversa em worktree criada',
    workspace_worktree_failed: 'Falha ao criar worktree: ',
    session_worktree_badge: 'Worktree',
    // commands.js
    cmd_clear: 'Limpar mensagens da conversa',
    cmd_help: 'Show available slash commands',
    cmd_compress: 'Comprimir manualmente o contexto (uso: /compress [tópico])',
    cmd_compact_alias: 'Alias legado para /compress',
    cmd_model: 'Trocar modelo (ex: /model gpt-4o)',
    cmd_workspace: 'Trocar workspace por nome',
    cmd_new: 'Iniciar nova sessão de chat',
    cmd_usage: 'Alternar exibição de uso de tokens',
    cmd_theme: 'Trocar aparência (tema: system/dark/light, skin: default/ares/mono/graphite/slate/poseidon/sisyphus/charizard/sienna/catppuccin/nous/geist-contrast/zeus/verdigris)',
    cmd_personality: 'Trocar personalidade do agente',
    cmd_skills: 'Listar skills disponíveis do Hermes',
    cmd_use: 'Forçar uma skill para a próxima mensagem',
    available_commands: 'Comandos disponíveis:',
    type_slash: 'Digite / para ver comandos',
    conversation_cleared: 'Conversa limpa',
    command_label: 'Comando',
    context_compaction_label: 'Compactação de contexto',
    preserved_task_list_label: 'Lista de tarefas preservada',
    reference_only_label: 'Apenas referência',
    model_usage: 'Uso: /model <nome>',
    no_model_match: 'Nenhum modelo correspondendo "',
    model_did_you_mean: (m) => ` — você quis dizer "${m}"?`,
    switched_to: 'Trocado para ',
    workspace_usage: 'Uso: /workspace <nome>',
    no_workspace_match: 'Nenhum workspace correspondendo "',
    switched_workspace: 'Trocado para workspace: ',
    workspace_switch_failed: 'Falha ao trocar workspace: ',
    new_session: 'Nova sessão criada',
    new_session_creating: 'Criando nova conversa…',
    compressing: 'Solicitando compressão de contexto...',
    compress_running_label: 'Comprimindo',
    compress_complete_label: 'Compressão completa',
    auto_compress_label: 'Compressão automática',
    compress_failed_label: 'Falha na compressão',
    focus_label: 'Foco',
    token_usage_on: 'Uso de tokens ligado',
    token_usage_off: 'Uso de tokens desligado',
    usage_cache_hit_detail: 'Cache: {0}% de acerto ({1} leitura / {2} escrita)',
    usage_cached_percent: '{0}% em cache',
    theme_usage: 'Uso: /theme ',
    theme_set: 'Tema: ',
    no_active_session: 'Nenhuma sessão ativa',
    cmd_queue: 'Enfileirar mensagem para o próximo turno',
    cmd_goal: 'Definir ou consultar uma meta persistente',
    goal_evaluating_progress: 'Evaluating goal progress…',
    goal_working_toward: 'Working toward goal…',
    goal_continuing_toast: 'Continuing toward goal…',
    goal_status_none: 'No active goal. Set one with /goal <text>.',
    goal_status_active: (turns, max_turns, goal) => `⊙ Goal (active, ${turns}/${max_turns} turns): ${goal}`,
    goal_status_paused: (turns, max_turns, reason, goal) => `⏸ Goal (paused, ${turns}/${max_turns}${reason ? `, ${reason}` : ''}): ${goal}`,
    goal_status_done: (turns, max_turns, goal) => `✓ Goal done (${turns}/${max_turns}): ${goal}`,
    goal_set: (turns, goal) => `⊙ Goal set (${turns}-turn budget): ${goal}`,
    goal_paused: (goal) => `⏸ Goal paused: ${goal}`,
    goal_resumed: (goal) => `▶ Goal resumed: ${goal}`,
    goal_cleared: 'Goal cleared.',
    goal_no_goal: 'No active goal.',
    goal_achieved: (reason) => `✓ Goal achieved: ${reason}`,
    goal_paused_budget_exhausted: (turns, max_turns) => `⏸ Goal paused — ${turns}/${max_turns} turns used. Use /goal resume to keep going, or /goal clear to stop.`,
    goal_continuing: (turns, max_turns, reason) => `↻ Continuing toward goal (${turns}/${max_turns}): ${reason}`,
    cmd_interrupt: 'Cancelar turno atual e enviar nova mensagem',
    cmd_steer: 'Injetar correção no meio do turno sem interromper',
    cmd_queue_no_msg: 'Uso: /queue <mensagem>',
    cmd_queue_not_busy: 'Nenhuma tarefa ativa — apenas envie normalmente',
    cmd_queue_confirm: 'Mensagem enfileirada',
    cmd_interrupt_no_msg: 'Uso: /interrupt <mensagem>',
    cmd_interrupt_confirm: 'Interrompido — enviando nova mensagem',
    cmd_steer_no_msg: 'Uso: /steer <mensagem>',
    cmd_steer_fallback: 'Steer indisponível — enfileirado para próximo turno',
    cmd_steer_delivered: 'Steer entregue — agente verá no próximo resultado',
    steer_leftover_queued: 'Steer enfileirado para próximo turno',
    busy_steer_fallback: 'Steer indisponível — enfileirado para próximo turno',
    busy_interrupt_confirm: 'Interrompido — enviando nova mensagem',
    settings_label_busy_input_mode: 'Modo de input ocupado',
    settings_desc_busy_input_mode: 'Controla o que acontece ao enviar mensagem com agente rodando. Fila espera; Interromper cancela; Steer injeta correção.',
    settings_label_fade_text_effect: 'Efeito de fade no texto',
    settings_desc_fade_text_effect: 'Faz novas palavras aparecerem gradualmente enquanto o assistente responde. Similar ao OpenWebUI; desativado por padrão para melhor desempenho.',
    settings_busy_input_mode_queue: 'Enfileirar follow-up',
    settings_busy_input_mode_interrupt: 'Interromper turno atual',
    settings_busy_input_mode_steer: 'Steer (correção no meio do turno)',

    slash_skill_badge: 'Skill',
    slash_skill_desc: 'Invocar esta skill',
    cmd_stop: 'Parar resposta atual',
    cmd_title: 'Obter ou definir título da sessão',
    cmd_retry: 'Reenviar última mensagem',
    cmd_undo: 'Remover última troca',
    cmd_btw: 'Fazer pergunta lateral (efêmera)',
    cmd_btw_usage: '/btw <pergunta> — fazer pergunta lateral',
    cmd_background: 'Rodar prompt em background',
    cmd_background_usage: '/background <prompt> — rodar em paralelo',
    btw_asking: 'Fazendo pergunta lateral...',
    btw_label: 'Pergunta lateral — não no histórico',
    btw_done: 'Pergunta lateral respondida',
    btw_no_answer: 'Nenhuma resposta recebida.',
    btw_failed: 'Pergunta lateral falhou: ',
    cmd_branch:'Fork this conversation into a new session',
    cmd_branch_usage:'/branch [name] — fork conversation (optionally with a name)',
    branch_forked:'Forked into new session',
    branch_failed:'Fork failed: ',
    fork_from_here:'Fork from here',
    forked_from:'Forked from',
    bg_running: 'Rodando em background...',
    bg_complete: 'Tarefa de background completa',
    bg_label: 'Resultado de background:',
    bg_no_answer: '(sem resposta)',
    bg_failed: 'Tarefa de background falhou: ',
    undo_exchange: 'Desfazer última troca',
    cmd_status: 'Mostrar info da sessão',
    cmd_voice: 'Alternar input de microfone',
    stream_stopped: 'Resposta parada.',
    no_active_task: 'Nenhuma tarefa ativa para parar.',
    cancel_unavailable: 'Cancelar indisponível.',
    retry_failed: 'Retry falhou: ',
    undo_failed: 'Undo falhou: ',
    undid_n_messages: 'Removido',
    undid_messages_suffix: 'mensagem(s).',
    status_heading: 'Status da Sessão',
    status_session_id: 'ID da Sessão',
    status_title: 'Título',
    status_model: 'Modelo',
    status_provider: 'Provedor',
    status_workspace: 'Workspace',
    status_personality: 'Personalidade',
    status_messages: 'Mensagens',
    status_agent_running: 'Agente rodando',
    status_profile: 'Perfil',
    status_hermes_home: 'Diretório Hermes',
    status_started: 'Iniciado',
    status_tokens: 'Tokens',
    status_updated: 'Atualizado',
    status_ephemeral: 'Instantâneo efêmero — não salvo no histórico.',
    status_no_tokens: 'Nenhum token usado',
    status_unknown: 'Desconhecido',
    status_yes: 'Sim',
    status_no: 'Não',
    status_load_failed: 'Falha ao carregar status: ',
    title_current: 'Título atual',
    title_change_hint: 'Use `/title <novo nome>` para renomear.',
    title_set: 'Título definido como',
    cmd_webui_only_session: 'Comando indisponível para sessões CLI.',
    cmd_voice_use_mic: 'Clique no botão de mic no composer.',
    usage_heading: 'Uso de Tokens',
    usage_default_model: 'padrão',
    usage_unknown: 'desconhecido',
    usage_input_tokens: 'Tokens de input',
    usage_output_tokens: 'Tokens de output',
    usage_total: 'Total de tokens',
    usage_estimated_cost: 'Custo estimado',
    usage_settings_tip: 'Nota: estimativas são aproximadas.',
    usage_load_failed: 'Falha ao carregar uso: ',
    usage_personality_none: 'nenhuma',

    no_personalities: 'Nenhuma personalidade encontrada (adicione em ~/.hermes/personalities/)',
    available_personalities: 'Personalidades disponíveis:',
    personality_switch_hint: '\n\nUse `/personality <nome>` para trocar, ou `/personality none` para limpar.',
    personalities_load_failed: 'Falha ao carregar personalidades',
    personality_cleared: 'Personalidade limpa',
    personality_set: 'Personalidade: ',
    failed_colon: 'Falhou: ',
    // ui.js
    no_workspace: 'Nenhum workspace',
    workspace_empty_no_path: 'Nenhum workspace selecionado. Configure em Configurações → Workspace.',
    workspace_empty_dir: 'Este workspace está vazio.',
    workspace_show_hidden_files: 'Mostrar arquivos ocultos',
    workspace_show_hidden_files_desc: 'Include .DS_Store, .git, node_modules, and other hidden / system files in the file tree.',
    workspace_hidden_files_visible: 'hidden visible',
    workspace_hidden_files_visible_title: 'Hidden files are visible — click for options',
    workspace_options: 'Workspace options',
    dialog_confirm_title: 'Confirmar ação',
    dialog_prompt_title: 'Digite um valor',
    dialog_confirm_btn: 'Confirmar',
    // workspace.js
    unsaved_confirm: 'Você tem mudanças não salvas. Descartar e navegar?',
    discard: 'Descartar',
    save: 'Salvar',
    edit: 'Editar',
    clear: 'Limpar',
    create: 'Criar',
    remove: 'Remover',
    save_title: 'Salvar mudanças',
    edit_title: 'Editar este arquivo',
    saved: 'Salvo',
    save_failed: 'Falha ao salvar: ',
    image_load_failed: 'Não foi possível carregar imagem',
    file_open_failed: 'Não foi possível abrir arquivo',
    downloading: (name) => `Baixando ${name}…`,
    double_click_rename: 'Duplo clique para renomear',
    session_rename_failed_no_row: 'Could not start rename — row not found.',
    renamed_to: 'Renomeado para ',
    rename_failed: 'Falha ao renomear: ',
    moved_to: 'Movido para ',
    move_failed: 'Falha ao mover: ',
    delete_title: 'Excluir',
    delete_confirm: (name) => `Excluir ${name}?`,
    deleted: 'Excluído ',
    delete_failed: 'Falha ao excluir: ',
     reveal_in_finder: 'Mostrar no gerenciador de arquivos',
     reveal_failed: 'Falha ao mostrar: ',
     copy_file_path: 'Copiar caminho do arquivo',
     open_in_vscode: 'Abrir no VS Code',
     open_in_vscode_failed: 'Falha ao abrir no VS Code: ',
     download_folder: 'Download Folder', // TODO: translate
    path_copied: 'Caminho do arquivo copiado para a área de transferência',
    path_copy_failed: 'Falha ao copiar caminho: ',
    session_rename: 'Renomear conversa',
    session_rename_desc: 'Editar o título desta conversa',
    session_title_regenerate: 'Regenerar título',
    session_title_regenerate_desc: 'Peça ao Hermes para gerar um novo título a partir da conversa',
    session_title_regenerating: 'Regenerando título…',
    session_title_regenerated: (title) => `Título regenerado: ${title}`,
    session_title_regenerate_failed: 'Falha ao regenerar o título: ',
    session_copy_link: 'Copiar link da conversa',
    session_copy_link_desc: 'Copia um link direto para esta conversa',
    session_link_copied: 'Link da conversa copiado para a área de transferência',
    session_link_copy_failed: 'Falha ao copiar link da conversa: ',
    new_file_prompt: 'Nome do novo arquivo (ex: notes.md):',
    new_file: 'Novo arquivo',
    new_folder: 'Nova pasta',
    workspace_root: 'raiz do espaço de trabalho',
    new_file_prompt_title: 'Nome do novo arquivo em {0}:',
    new_folder_prompt_title: 'Nome da nova pasta em {0}:',
    project_name_prompt: 'Nome do projeto:',
    created: 'Criado ',
    create_failed: 'Falha ao criar: ',
    new_folder_prompt: 'Nome da nova pasta:',
    folder_created: 'Pasta criada ',
    folder_create_failed: 'Falha ao criar pasta: ',
    workspace_auto_create_folder: 'Criar pasta se não existir',
    folder_add_as_space_btn: 'Adicionar como Space',
    folder_add_as_space_msg: 'Adicionar esta pasta como novo space?',
    folder_add_as_space_title: 'Adicionar como Space?',
    remove_title: 'Remover',
    empty_dir: '(vazio)',
    upload_failed: 'Falha ao upload: ',
    upload_too_large: (maxMb, fileMb) => `O arquivo é grande demais (${fileMb} MB). O tamanho máximo de upload é ${maxMb} MB.`,
    uploading: 'Enviando…',
    uploaded: 'Enviado',
    all_uploads_failed: (n) => `Todos ${n} upload(s) falharam`,
    session_pin: 'Fixar conversa',
    session_unpin: 'Desfixar conversa',
    session_pin_desc: 'Manter esta conversa no topo',
    session_unpin_desc: 'Remover dos fixados',
    session_pin_failed: 'Falha ao fixar: ',
    session_move_project: 'Mover para projeto',
    session_move_project_desc_has: 'Mudar projeto desta conversa',
    session_move_project_desc_none: 'Atribuir projeto a esta conversa',
    session_archive: 'Arquivar conversa',
    session_hide_external: 'Ocultar da lista',
    session_restore: 'Restaurar conversa',
    session_archive_desc: 'Esconder conversa até mostrar arquivados',
    session_archive_worktree_desc: 'Esconder esta conversa; manter o worktree no disco',
    session_hide_external_desc: 'Ocultar esta sessão importada do WebUI sem excluir o histórico original.',
    session_restore_desc: 'Trazer conversa de volta à lista principal',
    session_archived: 'Sessão arquivada',
    session_archived_worktree: 'Sessão arquivada. O worktree permanece no disco.',
    session_hidden: 'Sessão ocultada da lista',
    session_restored: 'Sessão restaurada',
    session_archive_failed: 'Falha ao arquivar: ',
    session_duplicate: 'Duplicar conversa',
    session_duplicate_desc: 'Criar cópia com mesmo workspace e modelo',
    session_duplicated: 'Sessão duplicada',
    session_duplicate_failed: 'Falha ao duplicar: ',
    session_stop_response: 'Stop response',
    session_stop_response_desc: 'Cancel the running response for this conversation',
    session_delete: 'Excluir conversa',
    session_delete_desc: 'Remover permanentemente esta conversa',
    session_delete_confirm: 'Excluir esta conversa?',
    session_delete_worktree_desc: 'Excluir apenas a conversa no WebUI; manter o worktree no disco',
    session_delete_worktree_confirm: (path) => `Excluir esta conversa? O worktree em ${path} permanecerá no disco.`,
    session_deleted: 'Conversa excluída',
    session_deleted_worktree: 'Conversa excluída. O worktree permanece no disco.',
    session_worktree_remove: 'Remover worktree',
    session_worktree_remove_desc: (path) => `Excluir o git worktree em ${path} do disco`,
    session_worktree_remove_confirm: (path) => `Remover git worktree do disco?\n\nCaminho: ${path}\n\nTodo o diretório do worktree será excluído. Dados da sessão permanecem no WebUI.`,
    session_worktree_remove_not_exists: (path) => `O worktree em ${path} não existe mais no disco.`,
    session_worktree_remove_confirm_label: 'Remover',
    session_worktree_removed: 'Worktree removido.',
    session_worktree_remove_failed: 'Falha ao remover worktree: ',
    session_worktree_remove_status_failed: 'Falha ao ler o status do worktree: ',
    session_worktree_remove_locked_by_stream: 'Não é possível remover — uma sessão de streaming ativa está usando este worktree.',
    session_worktree_remove_locked_by_terminal: 'Não é possível remover — uma sessão de terminal ativa está usando este worktree.',
    session_worktree_remove_unsafe_blocked: 'Resolva alterações locais ou commits não enviados antes de remover este worktree.',
    session_worktree_remove_dirty_warning: 'AVISO: Este worktree tem alterações não confirmadas que serão perdidas.',
    session_worktree_remove_untracked_warning: (count) => `${count} arquivo(s) não rastreados serão excluídos permanentemente.`,
    session_worktree_remove_ahead_warning: (ahead) => `${ahead} commit(s) não enviados serão perdidos.`,
    session_batch_delete_worktree_confirm: 'Excluir {0} conversas? {1} conversa(s) com worktree manterão seus diretórios de worktree no disco.',
    session_batch_archive_worktree_confirm: 'Arquivar {0} conversas? {1} conversa(s) com worktree manterão seus diretórios de worktree no disco.',
    session_batch_delete_confirm: 'Excluir {0} conversas?',
    session_batch_archive_confirm: 'Arquivar {0} conversas?',
    session_select_mode: 'Selecionar',
    session_select_mode_desc: 'Selecionar conversas para gerenciamento em lote',
    session_select_all: 'Selecionar todas',
    session_selected_count: '{0} selecionadas',
    session_no_selection: 'Nenhuma conversa selecionada',
    // settings panel
    settings_heading_title: 'Control Center',
    settings_heading_subtitle: 'Preferências, ferramentas de conversa e controles do sistema.',
    settings_section_conversation_title: 'Conversa',
    settings_section_appearance_title: 'Aparência',
    settings_section_appearance_meta: 'Tema, cores de destaque e estilo visual.',
    settings_section_preferences_title: 'Preferências',
    settings_section_preferences_meta: 'Padrões e comportamento UI do Hermes Web UI.',
    settings_section_system_title: 'Sistema',
    settings_section_system_meta: 'Versão da instância e controles de acesso.',
    settings_check_now: 'Verificar agora',
    settings_checking: 'Verificando…',
    settings_up_to_date: 'Atualizado ✓',
    settings_updates_available: '{count} atualização(ões) disponível(is)',
    settings_updates_disabled: 'Verificação de updates desativada',
    settings_update_check_failed: 'Falha ao verificar updates',
    settings_label_workspace_panel_open: 'Manter painel workspace aberto por padrão',
    settings_desc_workspace_panel_open: 'Quando ativo, o painel workspace abre automaticamente com cada nova sessão.',
    settings_label_session_jump_buttons: 'Mostrar botões de salto da sessão',
    settings_desc_session_jump_buttons: 'Mostra botões flutuantes Início e Fim ao ler históricos longos de sessão.',
    settings_label_terminal_auto_expand: 'Expandir terminal automaticamente na saída',
    settings_desc_terminal_auto_expand: 'Expandir automaticamente o painel de terminal recolhido quando um comando em execução emite nova saída.',

    settings_label_session_endless_scroll: 'Carregar mensagens antigas ao rolar para cima',

    settings_desc_session_endless_scroll: 'Quando ativado, mensagens antigas carregam automaticamente ao rolar para cima. Quando desativado, use o botão de mensagens antigas.',
    settings_label_auto_scroll_follow: 'Acompanhar automaticamente o novo conteúdo',
    settings_desc_auto_scroll_follow: 'Quando ativado, a visualização rola para baixo conforme novos tokens chegam. Quando desativado, você controla a posição de rolagem.',
    settings_label_worklog_details_expanded_default: 'Open Worklog details automatically',
    settings_desc_worklog_details_expanded_default: 'When enabled, new Worklog details start expanded so tool, thinking, and progress cards are visible without an extra click. When off, Worklog details stay folded by default; per-turn manual collapse/expand choices still win.',
    settings_label_chat_activity_display_mode: 'Activity display',
    settings_desc_chat_activity_display_mode: 'Compact Worklog groups supporting activity into a quiet summary. Transparent Stream keeps each thinking/tool event as its own chronological expandable row.',
    first_token_time: 'Time to first token',
    done: 'Done',
    settings_option_compact_worklog: 'Compact Worklog',
    settings_option_transparent_stream: 'Transparent Stream',

    settings_label_tab_visibility: 'Abas da barra lateral',
    settings_desc_tab_visibility: 'Escolha quais abas aparecem na barra lateral e no rail. Chat e Configurações estão sempre visíveis.',
    open_in_browser: 'Abrir no navegador',
    settings_dropdown_conversation: 'Conversa',
    settings_dropdown_appearance: 'Aparência',
    settings_dropdown_preferences: 'Preferências',
    settings_dropdown_providers: 'Provedores',
    settings_dropdown_system: 'Sistema',
    settings_tab_conversation: 'Conversa',
    settings_tab_appearance: 'Aparência',
    settings_tab_preferences: 'Preferências',
    settings_tab_plugins: 'Plugins',
    settings_plugins_title: 'Plugins',  // TODO: translate
    plugins_enable_toggle: 'Ativar',
    settings_plugins_meta: 'View installed Hermes plugins and the lifecycle hooks they register. This panel is read-only.',  // TODO: translate
    settings_plugins_empty: 'No Hermes plugins are currently visible. Install or enable plugins from the Hermes CLI/config to see them here.',  // TODO: translate
    plugins_unnamed: 'Unnamed plugin',  // TODO: translate
    plugins_no_description: 'No description provided.',  // TODO: translate
    plugins_no_hooks: 'No registered lifecycle hooks',  // TODO: translate
    plugins_registered_hooks: 'Registered hooks',  // TODO: translate
    plugins_enabled: 'Enabled',  // TODO: translate
    plugins_disabled: 'Disabled',  // TODO: translate
    plugins_active_provider: 'Active (provider)',  // TODO: translate
    plugins_provider_no_hooks: 'Provider plugin — no agent-visibility hooks',  // TODO: translate
    plugins_load_failed: 'Failed to load plugins: ',  // TODO: translate
    settings_tab_system: 'Sistema',
    settings_tab_help: 'Help',
    settings_help_meta: 'Resources and support for Hermes WebUI.',
    settings_help_docs_label: 'Documentation',
    settings_help_docs_desc: 'Guides, configuration reference, and the full Hermes WebUI README.',
    settings_help_docs_link: 'Open Documentation',
    settings_help_issue_label: 'Having an issue?',
    settings_help_issue_desc: 'Search existing reports or open a new one on GitHub.',
    settings_help_issue_link: 'Open GitHub Issues',
    settings_title: 'Configurações',
    settings_save_btn: 'Salvar Configurações',
    settings_label_model: 'Modelo Padrão',
    settings_desc_model: 'Usado para novas conversas. Conversas existentes mantêm o modelo selecionado.',
    settings_label_auxiliary_models: 'Modelos auxiliares',
    settings_desc_auxiliary_models: 'Roteamento para tarefas secundárias como visão, compressão, geração de títulos, etc. "Auto" usa o modelo de chat principal.',
    settings_btn_reset_aux_models: 'Restaurar tudo para auto',
    settings_btn_apply_aux_models: 'Aplicar alterações',
    settings_aux_provider_auto: 'usar modelo principal',
    settings_aux_model_auto: 'auto (usar padrão do provedor)',
    settings_aux_model_custom: 'Modelo personalizado…',
    settings_aux_model_custom_prompt: 'Insira o ID do modelo:',
    settings_aux_loading: 'Carregando modelos auxiliares…',
    settings_aux_load_failed: 'Não foi possível carregar as configurações de modelos auxiliares. Certifique-se de que a API do agente esteja disponível.',
    settings_aux_reset_confirm_title: 'Restaurar modelos auxiliares?',
    settings_aux_reset_confirm_msg: 'Isso definirá todas as tarefas auxiliares para auto (usar modelo principal).',
    settings_aux_reset_done: 'Modelos auxiliares restaurados para auto',
    settings_aux_save_failed: 'Falha ao salvar o modelo auxiliar',
    settings_aux_saved: 'Modelos auxiliares atualizados',
    settings_aux_no_changes: 'Nenhuma alteração para aplicar',
    settings_label_send_key: 'Tecla de Envio',
    settings_label_theme: 'Tema',
    settings_label_skin: 'Skin',
    settings_label_font_size: 'Tamanho da fonte',
    font_size_small: 'Pequeno',
    font_size_default: 'Padrão',
    font_size_large: 'Grande',
    font_size_xlarge: 'Extra grande',
    settings_autosave_saving: 'Salvando…',
    settings_autosave_saved: 'Salvo',
    settings_autosave_failed: 'Falha ao salvar',
    settings_autosave_retry: 'Tentar novamente',
    settings_label_language: 'Idioma',
    settings_label_quota_chip: 'Mostrar o chip de cota do provedor no compositor',
    settings_desc_quota_chip: 'Exibe um indicador ambiente de cota restante (por exemplo, saldo de crédito do OpenRouter) no rodapé do compositor. Desativado por padrão. Visível apenas em telas largas (≥1400px) quando ativado, para manter o compositor livre em laptops e monitores padrão.',
    settings_label_conversation_outline: 'Mostrar estrutura da conversa',
    settings_desc_conversation_outline: 'Mostra uma lista de atalhos somente no desktop para as perguntas do usuário na conversa atual. Desativado por padrão.',
    settings_label_hide_suggestions: 'Hide new-chat suggestions',
    settings_desc_hide_suggestions: 'Hide the three default suggestion buttons on the empty new-chat screen to avoid accidental taps.',
    settings_label_token_usage: 'Mostrar uso de tokens',
    settings_label_token_speed: 'Mostrar velocidade de tokens (TPS)',
    settings_desc_token_speed: 'Exibe tokens por segundo nos cabeçalhos das mensagens do assistente durante o streaming e após a conclusão de uma resposta. Desativado por padrão.',
    settings_label_sidebar_density: 'Densidade da sidebar',
    cmd_reasoning: 'Alternar visibilidade do pensamento (mostrar/ocultar)',
    settings_label_external_sessions: 'Mostrar sessões externas',
    settings_label_cron_sessions: 'Show cron sessions',
    settings_label_previous_messaging_sessions: 'Mostrar sessões de mensagens anteriores',
    settings_label_sync_insights: 'Sincronizar para insights',
    settings_label_check_updates: 'Verificar atualizações',
    settings_label_ignore_agent_updates: 'Ignore Agent updates',
    settings_label_whats_new_summary: "Summarize What's New with AI",
    settings_label_bot_name: 'Nome padrão do assistente',
    settings_label_password: 'Senha de Acesso',
    settings_label_pinned_limit: 'Limite de conversas fixadas',
    settings_desc_pinned_limit: 'Número máximo de conversas ativas que podem ser fixadas na barra lateral. O padrão é 3.',
    settings_label_dashboard_mode: 'Painel oficial Hermes',
    settings_desc_dashboard_mode: 'Mostra um link na barra de navegação quando o painel oficial hermes estiver acessível. URLs de proxy reverso público são armazenadas apenas como links no navegador e nunca são sondadas pelo servidor.',
    settings_dashboard_mode_auto: 'Detecção automática',
    settings_dashboard_mode_always: 'Mostrar sempre',
    settings_dashboard_mode_never: 'Nunca mostrar',
    settings_dashboard_save: 'Salvar configurações do link do painel',
    settings_label_gateway_status: 'Status do Gateway',
    settings_desc_gateway_status: 'Status do gateway Hermes (Telegram, Discord, Slack, etc.)',
    gateway_not_configured: 'Gateway não configurado',
    gateway_metadata_stale: 'Metadados do gateway desatualizados',
    gateway_endpoint_unreachable: 'Endpoint do gateway inacessível',
    gateway_not_running: 'Gateway não está rodando',
    gateway_running_label: 'Rodando',
    gateway_last_active: 'Última atividade: ',
    gateway_session_count: (n) => `${n} ${n === 1 ? 'sessão' : 'sessões'}`,
    gateway_load_failed: 'Falha ao carregar status do gateway',
    settings_saved: 'Configurações salvas',
    settings_save_failed: 'Falha ao salvar: ',
    settings_load_failed: 'Falha ao carregar configurações: ',
    settings_saved_pw: 'Configurações salvas — senha ativada e navegador permanece logado',
    settings_saved_pw_updated: 'Configurações salvas — senha atualizada',
    // login page
    login_title: 'Entrar',
    login_subtitle: 'Digite sua senha para continuar',
    login_placeholder: 'Senha',
    login_btn: 'Entrar',
    login_invalid_pw: 'Senha inválida',
    login_conn_failed: 'Falha na conexão',

    // Sidebar & Tabs
    tab_chat: 'Chat',
    tab_tasks: 'Tarefas',
    tab_skills: 'Skills',
    tab_memory: 'Memória',
    tab_workspaces: 'Spaces',
    tab_profiles: 'Perfis',
    tab_kanban: 'Kanban',
    kanban_board: 'Board',
    kanban_visible_tasks: '{0} visible tasks',
    kanban_search_tasks: 'Search tasks',
    kanban_all_assignees: 'All assignees',
    kanban_all_tenants: 'All tenants',
    kanban_include_archived: 'Include archived',
    kanban_no_matching_tasks: 'No matching tasks',
    kanban_no_data: 'No Kanban data',
    kanban_work_queue_hint: 'This is the Hermes Agent work queue. Create or triage a task, assign it, move it to Ready, then let the dispatcher claim it.',
    kanban_unavailable: 'Kanban unavailable',
    kanban_read_only: 'Read-only view',
    kanban_empty: 'Empty',
    kanban_task: 'Task',
    kanban_no_description: 'No description',
    kanban_refresh: 'Refresh',
    kanban_status_triage: 'Triage',
    kanban_status_todo: 'Todo',
    kanban_status_ready: 'Ready',
    kanban_status_running: 'Running',
    kanban_status_blocked: 'Blocked',
    kanban_status_done: 'Done',
    kanban_status_original_hint: 'Actual status: {0}. This dialog only supports Triage/Todo/Ready edits.',
    kanban_comments_count: 'Comments ({0})',
    kanban_events_count: 'Events ({0})',
    kanban_links: 'Links',
    kanban_parents: 'Parents',
    kanban_children: 'Children',
    kanban_runs_count: 'Runs ({0})',
    kanban_no_comments: 'No comments',
    kanban_no_events: 'No events',
    kanban_no_runs: 'No runs',
    kanban_title: 'Título',
    kanban_description: 'Descrição',
    kanban_description_placeholder: 'Opcional — o que precisa ser feito, critérios de aceitação, links',
    kanban_status: 'Status',
    kanban_assignee: 'Responsável',
    kanban_assignee_placeholder: 'Opcional — deixe em branco para qualquer worker',
    kanban_tenant: 'Tenant',
    kanban_tenant_placeholder: 'Opcional — slug do projeto ou equipe',
    kanban_priority: 'Prioridade',
    kanban_priority_hint: 'Números maiores executam primeiro. Padrão: 0.',
    kanban_title_required: 'O título é obrigatório.',
    kanban_edit_task: 'Editar tarefa',
    kanban_run_dispatcher: 'Executar despachador',
    kanban_run_dispatcher_confirm: 'Isso reivindicará tarefas Ready neste quadro e gerará subprocessos worker (um por tarefa, até 8 por clique). Continuar?',
    kanban_assignee_profiles_label: 'Perfis Hermes',
    kanban_assignee_other_label: 'Outros (faixas CLI / perfis removidos)',
    kanban_assignee_unassigned: '— Não atribuído (não rodará automaticamente) —',
    kanban_ready_needs_assignee: 'Você selecionou «Não atribuído» + «Ready». O despachador pulará esta tarefa. Envie novamente para confirmar ou escolha um perfil.',
    kanban_dispatch_preview_prefix: 'Prévia:',
    kanban_dispatch_run_prefix: 'Despachado:',
    kanban_dispatch_spawned: 'iniciadas',
    kanban_dispatch_promoted: 'promovidas',
    kanban_dispatch_reclaimed: 'reclamadas',
    kanban_dispatch_skipped_unassigned: 'puladas (sem responsável)',
    kanban_dispatch_skipped_nonspawnable: 'puladas (perfil desconhecido)',
    kanban_dispatch_auto_blocked: 'auto-bloqueadas',
    kanban_dispatch_timed_out: 'tempo esgotado',
    kanban_dispatch_crashed: 'falharam',
    kanban_new_task: 'New task',
    kanban_add_comment: 'Add comment',
      kanban_only_mine: 'Only mine',
      kanban_bulk_action: 'Bulk action',
      kanban_nudge_dispatcher: 'Preview dispatcher',
      kanban_stats: 'Stats',
      kanban_worker_log: 'Worker log',
      kanban_block: 'Block',
      kanban_unblock: 'Unblock',
      kanban_back_to_board: 'Back to board',
      kanban_lanes_by_profile: 'Lanes by profile',
      kanban_new_board: 'New board…',
      kanban_rename_board: 'Rename current board…',
      kanban_archive_board: 'Archive current board…',
      kanban_archive_board_confirm: 'Archive board "{name}"? Tasks remain on disk and the board can be restored from kanban/boards/_archived/.',
      kanban_board_archived: 'Board archived',
      kanban_board_name: 'Name',
      kanban_board_slug: 'Slug (lowercase, hyphens)',
      kanban_board_description: 'Description (optional)',
      kanban_board_icon: 'Icon (emoji, optional)',
      kanban_board_color: 'Color (optional)',
      kanban_board_name_required: 'Name is required',
      kanban_board_slug_required: 'Slug is required',
      kanban_card_complete: 'complete',
      kanban_card_archive: 'archive',
      kanban_unassigned: 'unassigned',
    kanban_status_archived: 'Archived',
    tab_todos: 'Todos',
    tab_insights: 'Estatísticas',
    tab_dashboard: 'Painel Hermes',
    dashboard_loopback_warning: 'O painel é somente loopback no servidor. Navegue pelo próprio servidor ou reinicie com --host 0.0.0.0 (inseguro).',
    tab_logs: 'Logs',
    tab_settings: 'Configurações',

    logs_title: 'Logs',  // TODO: translate
    logs_file: 'File',  // TODO: translate
    logs_tail: 'Tail',  // TODO: translate
    logs_auto_refresh: 'Auto-refresh (5s)',  // TODO: translate
    logs_wrap: 'Wrap lines',  // TODO: translate
    logs_copy_all: 'Copy all',  // TODO: translate
    logs_empty: 'No log lines yet.',  // TODO: translate
    logs_loading: 'Loading logs…',  // TODO: translate
    logs_load_failed: 'Logs failed to load',  // TODO: translate
    logs_status_idle: 'Choose a log file to view recent lines.',  // TODO: translate
    logs_no_mtime: 'not written yet',  // TODO: translate
    logs_truncated_hint: 'Showing the tail of a large log file; older bytes were skipped to keep memory bounded.',  // TODO: translate
    logs_copied: 'Logs copied',  // TODO: translate
    logs_severity: 'Severidade',
    logs_severity_all: 'Todos',
    logs_severity_errors: 'Erros',
    logs_severity_warnings: 'Avisos+',
    logs_filter_active: 'exibidos (filtro ativo)',
    new_conversation: 'Nova conversa',
    filter_conversations: 'Filtrar conversas...',
    markdown_table_filter: 'Filtrar tabela',
    markdown_table_sort_column: 'Ordenar coluna',
    session_time_unknown: 'Desconhecido',
    session_time_minutes_ago: (n) => `${n}m`,
    session_time_hours_ago: (n) => `${n}h`,
    session_time_days_ago: (n) => `${n}d`,
    session_time_last_week: '1s',
    session_time_bucket_today: 'Hoje',
    session_time_bucket_yesterday: 'Ontem',
    session_time_bucket_this_week: 'Esta semana',
    session_time_bucket_last_week: 'Semana passada',
    session_time_bucket_older: 'Antigo',
    scheduled_jobs: 'Tarefas agendadas',
    new_job: 'Nova tarefa',
    loading: 'Carregando...',
    search_skills: 'Buscar skills...',
    new_skill: 'Nova skill',
    personal_memory: 'Memória pessoal',
    current_task_list: 'Lista de tarefas atual',
    workspace_desc: 'Adicionar e trocar workspaces para suas sessões.',
    session_meta_messages: (n) => `${n} msg${n === 1 ? '' : 's'}`,
    session_meta_children: (n) => `${n} child${n === 1 ? '' : 'ren'}`,
    session_meta_segments: (n) => `${n} segment${n === 1 ? '' : 's'}`,
    session_lineage_toggle_hint: '{0} — turnos de contexto anteriores estão recolhidos aqui. Clique para mostrar ou ocultar.',
    session_lineage_static_hint: '{0} — turnos de contexto anteriores estão recolhidos aqui.',
    session_child_toggle_hint: '{0} — conversas filhas criadas a partir desta sessão. Clique para mostrar ou ocultar.',
    session_readonly_title_hint: 'Sessão importada somente leitura — {0}',
    session_lineage_segment_untitled: 'Segmento sem título',
    session_lineage_segment_open: 'Abrir segmento de linhagem',
    new_profile: 'Novo perfil',
    transcript: 'Transcrição',
    download_transcript: 'Baixar como Markdown',
    import: 'Importar',
    export_session_json: 'JSON',
    export_session_json_tooltip: 'Exportar sessão completa como JSON',
    import_session_json_tooltip: 'Importar sessão de JSON',
    clear_conversation_btn_tooltip: 'Limpar todas as mensagens nesta conversa',
    // Settings detail
    settings_label_rtl: 'Layout de chat da direita para a esquerda',
    settings_desc_rtl: 'Inverte o alinhamento das mensagens do chat e da entrada do compositor para idiomas como árabe ou hebraico. Afeta apenas a área do chat — a barra lateral e outros painéis permanecem da esquerda para a direita.',
    settings_label_sound: 'Som de notificação',
    settings_desc_sound: 'Tocar som quando assistente finalizar resposta.',
    settings_label_notifications: 'Notificações do navegador',
    settings_desc_notifications: 'Mostrar notificação quando resposta completar com app em background.',
    notifications_enable_btn: 'Enable notifications',
    notifications_test_btn: 'Send test',
    notifications_permission_status: (status) => `Permission: ${status}`,
    notifications_enabled_toast: 'Notifications enabled.',
    notifications_denied: 'Notifications are blocked in this browser. Enable them in browser settings.',
    notifications_unsupported: 'Notifications are not supported in this browser.',
    settings_desc_token_usage: 'Exibe contagem de tokens abaixo de cada resposta. Também com /usage.',
    settings_sidebar_density_compact: 'Compacto',
    settings_sidebar_density_detailed: 'Detalhado',
    settings_desc_sidebar_density: 'Controla quanto metadado a lista de sessões mostra na sidebar.',
    settings_label_auto_title_refresh: 'Atualização adaptativa de título',
    settings_auto_title_refresh_off: 'Desligado',
    settings_auto_title_refresh_5: 'A cada 5 trocas',
    settings_auto_title_refresh_10: 'A cada 10 trocas',
    settings_auto_title_refresh_20: 'A cada 20 trocas',
    settings_desc_auto_title_refresh: 'Re-gera título da sessão baseado na última troca.',
    settings_desc_external_sessions: 'Mostrar conversas de CLI, Telegram, Discord, Slack e outros canais na lista de sessões. Clique para importar e continuar.',
    settings_desc_cron_sessions: 'Surface cron job output as conversations in the sidebar. Only active when non-WebUI sessions are enabled. Defaults off; high-frequency jobs can flood the sidebar.',
    settings_desc_previous_messaging_sessions: 'Mostrar sessões antigas de Discord, Telegram, Slack e Weixin substituídas por reset ou compressão.',
    settings_desc_sync_insights: 'Espelha uso de tokens para state.db.',
    settings_desc_check_updates: 'Mostrar banner quando versões mais novas estiverem disponíveis.',
    settings_desc_ignore_agent_updates: 'Keep WebUI update checks on, but hide Agent update notices and skip Agent update fetches.',
    settings_desc_whats_new_summary: "Changes the What's New action from opening the raw diff first to generating a short, human-readable summary. The regular diff comparison stays available after the summary.",
    settings_desc_bot_name: 'Usado apenas para o perfil padrão. Outros perfis usam seus próprios nomes.',
    settings_desc_password: 'Digite nova senha para definir ou trocar. Deixe em branco para manter.',
    password_placeholder: 'Digite nova senha…',
    password_env_var_locked: 'A variável de ambiente HERMES_WEBUI_PASSWORD está definida e tem prioridade. Remova-a e reinicie o servidor para gerenciar a senha aqui.',
    password_env_var_locked_placeholder: 'Bloqueado: variável HERMES_WEBUI_PASSWORD está definida',
    disable_auth: 'Desativar Auth',
    sign_out: 'Sair',
    settings_label_shutdown: 'Parar o servidor Hermes WebUI',
    settings_desc_shutdown_before_cmd: 'Encerra de forma controlada o servidor WebUI local. Útil se você iniciou via ',
    settings_desc_shutdown_between_cmds: ' e quer parar sem precisar trocar para o terminal. Para acessar o WebUI novamente, será necessário reiniciar o servidor (',
    settings_desc_shutdown_after_cmd: ' ou o app nativo).',
    settings_btn_shutdown: 'Parar servidor',
    settings_shutdown_confirm_title: 'Parar Hermes WebUI',
    settings_shutdown_confirm_message: 'Parar o servidor Hermes WebUI?',
    settings_shutdown_confirm_btn: 'Parar',
    settings_shutdown_stopped_message: 'Servidor parado. Você pode fechar esta aba.',
    // Providers panel
    providers_tab_title: 'Provedores',
    providers_section_title: 'Provedores',
    providers_section_meta: 'Gerenciar API keys. Mudanças fazem efeito imediatamente.',
    providers_status_configured: 'API key configurada',
    providers_status_not_configured: 'Sem API key',
    providers_status_oauth: 'OAuth',
    providers_status_api_key: 'API key',
    providers_status_not_configured_label: 'Não configurado',
    providers_oauth_hint: 'Autenticado via OAuth. Sem API key necessária.',
    providers_oauth_config_yaml_hint: 'Token configurado via config.yaml. Para atualizar, edite config.yaml ou rode hermes auth.',
    providers_oauth_not_configured_hint: 'Não autenticado. Rode hermes auth no terminal.',
    providers_save: 'Salvar',
    providers_refresh_models: 'Refresh models',
    providers_refreshing: 'Refreshing…',
    providers_models_refreshed: 'Models refreshed',
    providers_remove: 'Remover',
    providers_saving: 'Salvando…',
    providers_removing: 'Removendo…',
    providers_enter_key: 'Por favor digite uma API key',
    providers_empty: 'Nenhum provedor configurável encontrado.',
    providers_key_updated: 'API key salva',
    providers_key_removed: 'API key removida',
    providers_key_placeholder_new: 'sk-...',
    providers_key_placeholder_replace: 'Digite nova key para substituir…',
    provider_quota_title: 'Cota do provedor ativo',
    provider_quota_active_provider: 'Provedor ativo',
    provider_quota_last_checked_after_refresh: 'Última verificação após atualizar',
    provider_quota_last_checked: 'Última verificação {0}',
    provider_quota_refresh_usage: 'Atualizar uso',
    provider_quota_refreshing: 'Atualizando...',
    provider_quota_refresh_title: 'Atualizar agora os limites de uso do provedor',
    provider_quota_refresh_succeeded: 'Uso do provedor atualizado',
    provider_quota_refresh_failed: 'Falha ao atualizar uso do provedor',
    provider_quota_session_limit: 'Limite de 5 horas',
    provider_quota_weekly_limit: 'Limite semanal',
    provider_quota_window_fallback: 'Janela',
    provider_quota_metric_remaining: 'Restante',
    provider_quota_metric_used: 'Usado',
    provider_quota_metric_limit: 'Limite',
    provider_quota_status_available: 'disponível',
    provider_quota_status_exhausted: 'esgotado',
    provider_quota_status_unavailable: 'indisponível',
    provider_quota_status_failed: 'falhou',
    provider_quota_status_checked: 'verificado',
    provider_quota_status_no_key: 'sem chave',
    provider_quota_status_invalid_key: 'chave inválida',
    provider_quota_status_unsupported: 'não compatível',
    provider_quota_used_meta: '{0} usado',
    provider_quota_resets_meta: 'reinicia {0}',
    provider_quota_credential_pool: 'Pool de credenciais',
    provider_quota_credential_label: 'Credencial {0}',
    provider_quota_pool_plans: 'Planos: {0}',
    provider_quota_pool_no_windows: 'Nenhuma janela de limite da conta informada.',
    provider_quota_account_limits_loaded: 'Limites da conta carregados.',
    provider_quota_unavailable: 'Status da cota indisponível',
    provider_quota_retry_after: 'Tente novamente após {0}',
    provider_quota_pool_summary_available: '{0}/{1} disponíveis',
    provider_quota_pool_summary_exhausted: '{0} esgotadas',
    provider_quota_pool_summary_failed: '{0} com falha',
    provider_quota_pool_summary_checked: '{0} verificadas',
    cancel: 'Cancelar',
    create_job: 'Criar tarefa',
    save_skill: 'Salvar skill',
    editing: 'Editando',
    // Empty state
    empty_title: 'Como posso ajudar?',
    empty_subtitle: 'Pergunte qualquer coisa, rode comandos, explore arquivos ou gerencie tarefas.',
    suggest_files: 'Quais arquivos estão neste workspace?',
    suggest_schedule: 'O que tenho na agenda hoje?',
    suggest_plan: 'Me ajude a planejar um pequeno projeto.',
    // onboarding
    onboarding_badge: 'PRIMEIRO ACESSO',
    onboarding_title: 'Bem-vindo ao Hermes Web UI',
    onboarding_lead: 'Uma configuração rápida vai verificar Hermes, salvar provedor, escolher workspace e modelo, e opcionalmente proteger com senha.',
    onboarding_back: 'Voltar',
    onboarding_continue: 'Continuar',
    onboarding_skip: 'Pular configuração',
    onboarding_skipped: 'Configuração pulada — usando config existente.',
    onboarding_open: 'Abrir Hermes',
    onboarding_step_system_title: 'Verificação do sistema',
    onboarding_step_system_desc: 'Verificar Hermes Agent e visibilidade da config.',
    onboarding_step_setup_title: 'Configuração do provedor',
    onboarding_step_setup_desc: 'Salvar config mínima do provedor Hermes.',
    onboarding_step_workspace_title: 'Workspace + modelo',
    onboarding_step_workspace_desc: 'Escolher padrões para novas sessões e chat.',
    onboarding_step_password_title: 'Senha opcional',
    onboarding_step_password_desc: 'Proteger Web UI antes de compartilhar.',
    onboarding_step_finish_title: 'Finalizar',
    onboarding_step_finish_desc: 'Revisar e entrar no app.',
    onboarding_notice_system_ready: 'Hermes Agent parece acessível pela Web UI.',
    onboarding_notice_system_unavailable: 'Hermes Agent não está totalmente disponível. Bootstrap pode instalar, mas setup do provedor pode requerer terminal.',
    onboarding_check_agent: 'Hermes Agent',
    onboarding_check_agent_ready: 'Detectado e importável',
    onboarding_check_agent_missing: 'Ausente ou parcialmente importável',
    onboarding_check_password: 'Senha',
    onboarding_check_password_enabled: 'Já ativada',
    onboarding_check_password_disabled: 'Não ativada ainda',
    onboarding_check_provider: 'Config do provedor',
    onboarding_check_provider_ready: 'Pronto para conversar',
    onboarding_check_provider_partial: 'Salvo mas incompleto',
    onboarding_check_provider_pending: 'Precisa verificação',
    onboarding_config_file: 'Arquivo de config:',
    onboarding_env_file: 'Arquivo .env:',
    onboarding_unknown: 'Desconhecido',
    onboarding_current_provider: 'Config atual:',
    onboarding_missing_imports: 'Imports ausentes:',
    onboarding_notice_setup_required: 'Escolha caminho simples de provedor aqui. OAuth avançado ainda pertence ao Hermes CLI.',
    onboarding_notice_setup_already_ready: 'Setup de provedor Hermes já detectado. Pode manter ou substituir.',
    onboarding_oauth_provider_ready_title: 'Provedor já autenticado',
    onboarding_oauth_provider_ready_body: 'Esta instância usa provedor OAuth (<strong>{provider}</strong>) configurado via CLI. Sem API key necessária.',
    onboarding_oauth_provider_not_ready_title: 'Provedor OAuth não autenticado',
    onboarding_oauth_provider_not_ready_body: 'Esta instância usa <strong>{provider}</strong> com OAuth. Rode `hermes auth` no terminal.',
    onboarding_oauth_switch_hint: 'Ou escolha provedor diferente abaixo para trocar para API-key:',
    onboarding_notice_workspace: 'Estes valores reusam as mesmas APIs de settings do app normal.',
    onboarding_workspace_label: 'Workspace',
    onboarding_workspace_or_path: 'Ou digite path do workspace',
    onboarding_workspace_placeholder: '/home/voce/workspace',
    onboarding_provider_label: 'Modo de setup',
    onboarding_quick_setup_badge: 'setup rápido',
    provider_category_easy_start: 'Início fácil',
    provider_category_self_hosted: 'Open / self-hosted',
    provider_category_specialized: 'Especializado',
    onboarding_api_key_label: 'API key',
    oauth_login_codex: 'Login with Codex (ChatGPT)', // TODO: translate
    oauth_codex_step1: 'Step 1: Visit this URL and enter the code', // TODO: translate
    oauth_codex_step2: 'Step 2: Enter this code on the page', // TODO: translate
    oauth_codex_polling: 'Waiting for authorization...', // TODO: translate
    oauth_codex_success: 'Codex OAuth login successful!', // TODO: translate
    oauth_codex_error: 'OAuth login failed', // TODO: translate
    oauth_codex_expired: 'Code expired, please try again', // TODO: translate
    onboarding_api_key_placeholder: 'Deixe em branco para manter key existente',
    onboarding_api_key_label_optional: 'API key (optional)', // TODO: translate
    onboarding_api_key_placeholder_optional: 'Leave blank for keyless servers', // TODO: translate
    onboarding_api_key_help_keyless: 'Most LM Studio / Ollama / vLLM installs run keyless — leave this blank if your server doesn\'t require authentication. Use the Test connection button to verify.', // TODO: translate
    onboarding_api_key_help_prefix: 'Salvo como segredo no .env do Hermes usando',
    onboarding_base_url_label: 'Base URL',
    onboarding_base_url_placeholder: 'https://seu-endpoint.exemplo/v1',
    onboarding_base_url_help: 'Use para endpoints OpenAI-compatible, self-hosted, LiteLLM, Ollama, LM Studio, vLLM.',
    onboarding_model_label: 'Modelo padrão',
    onboarding_workspace_help: 'Escolha modelo que Hermes deve usar para novos chats.',
    onboarding_custom_model_placeholder: 'nome-do-seu-modelo',
    onboarding_custom_model_help: 'Para endpoints customizados, digite ID exato que seu servidor espera.',
    onboarding_notice_password_enabled: 'Senha já configurada. Digite nova apenas se quiser substituir.',
    onboarding_notice_password_recommended: 'Opcional mas recomendado se expor UI além de localhost.',
    onboarding_password_label: 'Senha (opcional)',
    onboarding_password_placeholder: 'Deixe em branco para pular',
    onboarding_password_help: 'Senhas são salvas via settings API e hasheadas no servidor.',
    onboarding_notice_finish: 'Pode reabrir Configurações depois para mudar qualquer coisa.',
    onboarding_not_set: 'Não definido',
    onboarding_password_will_enable: 'Será ativada',
    onboarding_password_will_replace: 'Será substituída',
    onboarding_password_keep_existing: 'Manter senha atual',
    onboarding_password_remains_disabled: 'Permanecerá desativada',
    onboarding_password_skipped: 'Pulado por enquanto',
    onboarding_finish_help: 'Finalizar guarda <code>onboarding_completed</code> em settings e leva ao app normal.',
    onboarding_error_choose_workspace: 'Escolha workspace antes de continuar.',
    onboarding_error_choose_model: 'Escolha modelo antes de continuar.',
    onboarding_error_provider_required: 'Escolha modo de setup antes de continuar.',
    onboarding_error_base_url_required: 'Base URL é necessária para endpoints customizados.',
    onboarding_probe_test_button: 'Test connection', // TODO: translate
    onboarding_probe_probing: 'Testing connection…', // TODO: translate
    onboarding_probe_ok: 'Connected. {n} model(s) available.', // TODO: translate
    onboarding_probe_error_generic: 'Could not reach the configured base URL.', // TODO: translate
    onboarding_probe_error_invalid_url: 'Base URL must start with http:// or https://.', // TODO: translate
    onboarding_probe_error_dns: 'Could not resolve the host. Check the URL or use the host\'s IP address.', // TODO: translate
    onboarding_probe_error_connect_refused: 'Connection refused — the server may not be running on that address. From inside Docker, try the host IP instead of localhost.', // TODO: translate
    onboarding_probe_error_timeout: 'The endpoint did not respond in time. Check that the server is running and the URL is correct.', // TODO: translate
    onboarding_probe_error_http_4xx: 'The endpoint returned a client error. Check authentication and the URL path (typically ends in /v1).', // TODO: translate
    onboarding_probe_error_http_5xx: 'The endpoint returned a server error. Check the LM Studio / Ollama server logs.', // TODO: translate
    onboarding_probe_error_parse: 'The endpoint did not return a model list in the expected shape. Verify the URL points to the OpenAI-compatible API root.', // TODO: translate
    onboarding_probe_error_unreachable: 'Could not reach the configured base URL.', // TODO: translate
    onboarding_error_probe_failed: 'Could not validate the configured base URL.', // TODO: translate
    onboarding_error_workspace_required: 'Workspace é necessário.',
    onboarding_error_model_required: 'Modelo é necessário.',
    onboarding_complete: 'Configuração completa',

    // panel/runtime i18n
    error_prefix: 'Erro: ',
    default: 'default',
    search: 'Search',
    not_available: 'N/D',
    never: 'nunca',
    add: 'Adicionar',
    add_failed: 'Falha ao adicionar: ',
    remove_failed: 'Falha ao remover: ',
    switch_failed: 'Falha ao trocar: ',
    name_required: 'Nome é necessário',
    content_required: 'Conteúdo é necessário',
    view: 'Ver',
    dismiss: 'Dispensar',
    disable: 'Desativar',
    cron_no_jobs: 'Nenhuma tarefa agendada encontrada.',
    cron_status_off: 'desligado',
    cron_status_paused: 'pausado',
    cron_status_error: 'erro',
    cron_status_active: 'ativo',
    cron_status_running: 'rodando…',
    cron_status_needs_attention: 'precisa atenção',
    cron_attention_desc: 'Esta tarefa não tem próxima execução. Scheduler pode não ter calculado.',
    cron_attention_croniter_hint: 'Gateway pode não ter pacote croniter. Reinicie com cron support.',
    cron_attention_resume: 'Retomar e recalcular',
    cron_jobs_project: 'Tarefas Agendadas',
    cron_attention_run_once: 'Rodar uma vez agora',
    cron_attention_copy_diagnostics: 'Copiar diagnóstico',
    cron_diagnostics_copied: 'Diagnóstico copiado',
    cron_next: 'Próxima',
    cron_last: 'Última',
    cron_run_now: 'Rodar agora',
    cron_pause: 'Pausar',
    cron_resume: 'Retomar',
    cron_job_name_placeholder: 'Nome da tarefa',
    cron_schedule_placeholder: 'Agendamento',
    cron_prompt_placeholder: 'Prompt',
    cron_last_output: 'Último output',
    cron_expand_prompt: 'Expandir prompt',
    cron_collapse_prompt: 'Contraer prompt',
    cron_expand_output: 'Expandir saída',
    cron_collapse_output: 'Contraer saída',
    cron_mode_agent: 'Agente',
    cron_mode_script: 'Script',
    cron_mode_label: 'Modo',
    cron_script_job_banner: 'Executa um script no agendamento — stdout é entregue ao destino. Sem agente, prompt ou skills.',
    cron_script_card_title: 'Script',
    cron_script_output: 'Saída do script',
    cron_script_path_label: 'Caminho do script',
    cron_script_path_hint: 'Resolvido em ~/.hermes/scripts/ salvo caminho absoluto. Edite o script no servidor para alterar o comportamento.',
    cron_script_badge_title: 'Tarefa script (sem agente)',
    cron_workdir_label: 'Diretório de trabalho',
    cron_view_full_output: 'View full output',
    cron_all_runs: 'Todas execuções',
    cron_hide_runs: 'Esconder execuções',
    cron_no_runs_yet: '(sem execuções ainda)',
    cron_schedule_required_example: 'Agendamento necessário (ex: "0 9 * * *" ou "every 1h")',
    cron_schedule_required: 'Agendamento é necessário',
    cron_prompt_required: 'Prompt é necessário',
    cron_job_created: 'Tarefa criada',
    cron_job_triggered: 'Tarefa acionada',
    cron_job_paused: 'Tarefa pausada',
    cron_job_resumed: 'Tarefa retomada',
    cron_job_updated: 'Tarefa atualizada',
    cron_model_label: 'Substituir modelo',
    cron_model_hint: 'Substitui o modelo padrão para esta tarefa.',
    cron_model_use_default: 'Padrão (usar perfil/sistema padrão)',
    cron_delete_confirm_title: 'Excluir tarefa cron',
    cron_delete_confirm_message: 'Isso não pode ser desfeito.',
    cron_job_deleted: 'Tarefa excluída',
    cron_completion_status: (name, status) => `Cron "${name}" ${status}`,
    status_failed: 'falhou',
    status_completed: 'completou',
    todos_no_active: 'Nenhuma lista de tarefas ativa nesta sessão.',
    clear_conversation_title: 'Limpar conversa',
    clear_conversation_message: 'Limpar todas mensagens? Isso não pode ser desfeito.',
    clear_failed: 'Falha ao limpar: ',
    skills_no_match: 'Nenhuma skill corresponde.',
    skill_enabled: 'Habilitado',
    skill_disabled: 'Desabilitado',
    skill_toggle_failed: 'Falha ao alternar skill: ',
    linked_files: 'Arquivos vinculados',
    skill_load_failed: 'Não foi possível carregar skill: ',
    skill_file_load_failed: 'Não foi possível carregar arquivo: ',
    skills_empty_title: 'Selecione uma skill',
    skills_empty_sub: 'Escolha skill da sidebar para ver conteúdo, ou crie nova.',
    skills_edit: 'Editar',
    skills_delete: 'Excluir',
    skills_back_to: 'Voltar para {0}',
    tasks_empty_title: 'Selecione tarefa agendada',
    tasks_empty_sub: 'Escolha tarefa da sidebar para ver detalhes e execuções.',
    workspaces_empty_title: 'Selecione um space',
    workspaces_empty_sub: 'Escolha space da sidebar para ver arquivos e settings.',
    profiles_empty_title: 'Selecione um perfil',
    profiles_empty_sub: 'Escolha perfil da sidebar para ver e editar settings.',
    memory_notes_label: 'memória (notas)',
    memory_saved: 'Memória salva',
    my_notes: 'Minhas Notas',
    user_profile: 'Perfil do Usuário',
    external_notes_sources: 'Notas de terceiros',
    external_notes_empty: 'Nenhuma fonte MCP de notas ou conhecimento está visível ainda. Configure Joplin, Obsidian, Notion, llm-wiki ou outro servidor de notas para listá-lo aqui.',
    external_notes_auto_recall_hint: 'A recuperação automática da sessão não muda; esta gaveta mostra apenas fontes configuradas e ferramentas de leitura/pesquisa disponíveis.',
    external_notes_no_tools: 'Nenhuma ferramenta de leitura/pesquisa está visível para esta fonte no momento.',
    external_notes_tool_count: (count) => `${count} ferramenta${Number(count)===1?'':'s'} de notas ${Number(count)===1?'disponível':'disponíveis'}`,
    external_notes_configured_hint: 'Nomes de ferramentas são esperados desta fonte configurada; esquemas ao vivo aparecerão quando o runtime do WebUI os expuser.',
    external_notes_recent_ai: 'Usado recentemente pela IA',
    external_notes_auto: 'auto',
    external_notes_recent_ai_reason: 'Recuperação automática',
    external_notes_search_placeholder: 'Pesquisar notas…',
    external_notes_search_empty: 'Pesquise em uma fonte de notas configurada para pré-visualizar notas aqui.',
    source_active: 'active',
    source_configured: 'configured',
    no_notes_yet: 'Nenhuma nota ainda.',
    no_profile_yet: 'Nenhum perfil definido.',
    agent_soul: 'Alma do Agente',
    no_soul_yet: 'Nenhuma alma definida.',
    // skill form
    skill_name: 'Nome',
    skill_category: 'Categoria',
    skill_category_placeholder: 'Opcional, ex: devops',
    skill_content: 'Conteúdo SKILL.md',
    skill_content_placeholder: 'YAML frontmatter + markdown body',
    skill_rename_not_supported: 'Renomear skill não suportado. Crie nova e exclua antiga.',
    skill_metadata: 'Metadados',
    // cron form
    cron_name_label: 'Nome',
    cron_name_placeholder: 'Opcional',
    cron_schedule_label: 'Agendamento',
    cron_schedule_hint: "Use 'every 1h' ou uma expressão Cron para tarefas recorrentes. Durações como '30m' rodam uma vez.",
    cron_schedule_once_warning: "Durações como '30m' rodam uma vez e são removidas após executar. Use 'every 30m' para manter uma tarefa recorrente.",
    cron_prompt_label: 'Prompt',
    cron_deliver_label: 'Entregar output para',
    cron_deliver_local: 'Local (salvar output apenas)',
    cron_deliver_custom: 'Destino personalizado',
    cron_profile_label: 'Perfil',
    cron_profile_server_default: 'padrão do servidor',
    cron_profile_server_default_hint: 'Usa o perfil padrão do servidor WebUI no momento da execução. Tarefas existentes sem perfil mantêm esse comportamento legado.',
    cron_toast_notifications_label: 'Toasts de conclusão',
    cron_toast_notifications_hint: 'Mostra um toast quando este cron termina. O emblema de Tarefas e o marcador de nova execução ainda são atualizados quando desligado.',
    cron_toast_notifications_enabled: 'Ativado',
    cron_toast_notifications_disabled: 'Desativado',
    cron_deliver_origin: 'Origem (mesmo chat)',
    cron_deliver_telegram: 'Telegram',
    cron_deliver_discord: 'Discord',
    cron_skills_label: 'Skills',
    cron_skills_placeholder: 'Adicionar skills (opcional)…',
    cron_skills_edit_hint: 'Lista de skills não editável após criação.',
    // workspace form
    workspace_name_label: 'Nome',
    workspace_name_placeholder: 'Nome amigável opcional',
    workspace_path_label: 'Path',
    workspace_path_required: 'Path é necessário',
    workspace_path_readonly: 'Path não pode mudar. Apenas renomear.',
    workspace_new_title: 'Novo space',
    workspace_rename_title: 'Renomear space',
    // profile form
    profile_name_label: 'Nome',
    profile_name_required: 'Nome é necessário',
    profile_name_placeholder: 'ex: Trabalho, Pessoal',
    profile_provider_label: 'Provedor',
    profile_model_label: 'Modelo',
    profile_model_hint: 'Escolha provedores e modelos configurados para este novo perfil.',
    profile_model_use_default: 'Usar o padrão do perfil ativo',
    profile_model_required: 'Modelo é necessário',
    profile_base_url_label: 'Base URL',
    profile_base_url_placeholder: 'Opcional, ex: http://localhost:11434',
    profile_api_key_label: 'API key',
    profile_api_key_placeholder: 'Opcional',
    manage_profiles: 'Gerenciar perfis',
    profiles_load_failed: 'Falha ao carregar perfis',
    profile_switched_new_conversation: (name) => `Trocado para perfil: ${name} — nova conversa iniciada`,
    profile_switched: (name) => `Trocado para perfil: ${name}`,
    profile_delete_confirm: (name) => `Excluir perfil "${name}"?`,
    profile_deleted: 'Perfil excluído',
    profile_delete_failed: 'Falha ao excluir perfil: ',
    profile_create_failed: 'Falha ao criar perfil: ',
    profile_update_failed: 'Falha ao atualizar perfil: ',
    profile_already_exists: 'Perfil já existe',
    // workspace switch dialog
    workspace_switch_prompt_title: 'Trocar workspace',
    workspace_switch_prompt_message: 'Digite path absoluto do workspace para adicionar e trocar.',
    workspace_switch_prompt_confirm: 'Trocar',
    workspace_switch_prompt_placeholder: '/Users/voce/projeto',
    workspace_not_added: 'Workspace não adicionado',
    workspace_already_saved: 'Workspace já salvo — escolha da lista',
    workspace_busy_switch: 'Não pode trocar workspace com agente rodando',
    discard_file_edits_title: 'Descartar edições de arquivo?',
    discard_file_edits_message: 'Trocar workspace descarta edições não salvas no preview.',
    workspace_switched_to: (name) => `Trocado para ${name}`,
    workspace_use: 'Usar',
    workspace_use_title: 'Usar nesta conversa',
    workspace_add_title: 'Adicionar workspace',
    // Approval card
    approval_skip: 'Pular',
    approval_skip_title: 'Pular este prompt de aprovação',
    approval_skip_all: 'Pular todos',
    approval_skip_all_title: 'Pular todos prompts de aprovação nesta sessão',
    // TTS (#499)
    tts_listen: 'Ouvir',
    tts_not_supported: 'Síntese de voz não disponível',
    settings_label_tts: 'Texto para voz nas respostas',
    settings_desc_tts: 'Mostrar botão de alto-falante nas mensagens do assistente',
    settings_label_tts_auto_read: 'Ler respostas automaticamente',
    settings_desc_tts_auto_read: 'Ler automaticamente as respostas do assistente',
    // Composer voice-mode pref (#1488)
    settings_label_voice_mode: 'Hands-free voice mode button',  // TODO: translate
    settings_desc_voice_mode: 'Show the voice-mode button (audio waveform) next to the dictation mic. Lets you speak naturally — Hermes auto-sends after a pause and reads replies aloud. Requires a browser that supports both speech recognition and TTS.',
    settings_label_raw_audio: 'Send raw audio instead of transcribing',
    settings_desc_raw_audio: 'Record and send the original audio file to the agent instead of converting it to text first. The agent can then transcribe it or process the raw audio (emotion, background noise, custom STT). Like Telegram\'s voice message behavior.',
    voice_send_raw: 'Send raw audio',
    voice_raw_attached: 'Audio attached. Press Send or type more.',  // TODO: translate
    settings_label_tts_voice: 'Voz',
    settings_desc_tts_voice: 'Selecionar voz para síntese de voz',
    settings_label_tts_rate: 'Velocidade da fala',
    settings_label_tts_pitch: 'Tom da fala',
    settings_label_tts_engine: 'Motor TTS',
    settings_desc_tts_engine: 'Escolha o mecanismo de fala. Edge TTS usa vozes neurais da Microsoft através do servidor.',
    checkpoint_date: 'Date',  // TODO: translate
    checkpoint_diff_files_changed: (n) => `${n} file${n === 1 ? '' : 's'} changed`,  // TODO: translate
    checkpoint_diff_no_changes: 'No differences found between this checkpoint and the current workspace.',  // TODO: translate
    checkpoint_diff_title: 'Changes in checkpoint',  // TODO: translate
    checkpoint_empty: 'No checkpoints found for this workspace.',  // TODO: translate
    checkpoint_error: 'Failed to load checkpoints',  // TODO: translate
    checkpoint_files: 'Files',  // TODO: translate
    checkpoint_loading: 'Loading checkpoints…',  // TODO: translate
    checkpoint_message: 'Message',  // TODO: translate
    checkpoint_restore: 'Restore',  // TODO: translate
    checkpoint_restore_confirm_message: (ckpt) => `Restore workspace to checkpoint "${ckpt}"? This will overwrite files with the saved versions. Files added after this checkpoint will not be deleted.`,  // TODO: translate
    checkpoint_restore_confirm_title: 'Restore checkpoint?',  // TODO: translate
    checkpoint_restored: 'Checkpoint restored',  // TODO: translate
    checkpoint_title: 'Checkpoints',  // TODO: translate
    checkpoint_view_diff: 'View diff',  // TODO: translate
    insights_activity_by_day: 'Activity by Day',  // TODO: translate
    insights_activity_by_hour: 'Activity by Hour',  // TODO: translate
    insights_cost: 'Estimated Cost',  // TODO: translate
    insights_footer: 'Showing data from the last {days} days',  // TODO: translate
    insights_skill_usage_title: 'Skill Usage',  // TODO: translate
    insights_skill_usage_sub: 'Tool invocation frequency',  // TODO: translate
    insights_skill_usage_total: 'Total invocations',  // TODO: translate
    insights_skill_usage_skills_used: 'Skills used',  // TODO: translate
    insights_skill_usage_no_data: 'No skill usage data yet',  // TODO: translate
    insights_skill_usage_no_data_hint: 'Skills will appear here once used in conversations.',  // TODO: translate
    insights_skill_usage_footer: 'Counts from ~/.hermes/skills/',  // TODO: translate
    insights_skill_usage_col_skill: 'Skill',  // TODO: translate
    insights_skill_usage_col_uses: 'Uses',  // TODO: translate
    insights_skill_usage_col_views: 'Views',  // TODO: translate
    insights_skill_usage_col_share: 'Usage %',  // TODO: translate
    insights_skill_usage_col_patches: 'Patches',  // TODO: translate
    insights_input_tokens: 'Input',  // TODO: translate
    insights_messages: 'Messages',  // TODO: translate
    insights_models: 'Models',  // TODO: translate
    insights_no_cost: 'N/A',  // TODO: translate
    insights_output_tokens: 'Output',  // TODO: translate
    insights_peak_hour: 'Peak: {hour}',  // TODO: translate
    insights_sessions: 'Sessions',  // TODO: translate
    insights_title: 'Usage Analytics',  // TODO: translate
    insights_token_breakdown: 'Token Breakdown',  // TODO: translate
    insights_tokens: 'Tokens',  // TODO: translate
    insights_total: 'Total',  // TODO: translate
    settings_desc_api_redact: 'Self-hosted users can disable for transparency (not recommended for shared instances).',  // TODO: translate
    settings_label_api_redact: 'Redact sensitive data in API responses',  // TODO: translate
    voice_error: 'Voice not supported in this browser',  // TODO: translate
    voice_listening: 'Listening…',  // TODO: translate
    voice_mode_active: 'Voice mode on',  // TODO: translate
    voice_mode_off: 'Voice mode off',  // TODO: translate
    voice_speaking: 'Speaking…',  // TODO: translate
    voice_thinking: 'Thinking…',  // TODO: translate
    // Composer voice buttons (#1488)
    voice_dictate: 'Dictate',  // TODO: translate
    voice_dictate_active: 'Stop dictation',
    voice_recording_active: 'Parar gravação',  // TODO: translate
    voice_mode_toggle: 'Voice mode',  // TODO: translate
    voice_mode_toggle_active: 'Exit voice mode',  // TODO: translate
    subagent_children: 'Subagent sessions',  // TODO: translate
    // login-flow keys (issue #1442)
    sign_out_failed: 'Falha ao sair: ',
    auth_disabled: 'Autenticação desativada — proteção por senha removida',
    disable_auth_confirm_title: 'Desativar proteção por senha',
    outline_title: 'Esboço',
    outline_empty: 'Ainda não há perguntas.',
    outline_loading: 'Carregando…',
  },
  ko: {
    offline_title: '연결이 끊겼습니다',
    offline_browser_detail: '브라우저가 이 장치가 오프라인이라고 보고합니다.',
    offline_network_detail: '현재 이 브라우저에서 Hermes에 연결할 수 없습니다.',
    offline_autorefresh: 'Hermes에 다시 연결되면 이 페이지를 자동으로 새로고침합니다.',
    offline_check_now: '지금 확인',
    offline_checking: '확인 중…',
    offline_stream_waiting: '연결이 끊겼습니다. 새로고침을 기다리는 중…',
    _lang: 'ko',
    _label: '한국어',
    _speech: 'ko-KR',
    // boot.js
    cancelling: '취소 중\u2026',
    cancel_failed: '취소 실패: ',
    mic_denied: '마이크 접근이 거부되었습니다. 브라우저 권한을 확인하세요.',
    mic_no_speech: '음성이 감지되지 않았습니다. 다시 시도하세요.',
    mic_network: '음성 인식을 사용할 수 없습니다.',
    mic_error: '음성 입력 오류: ',
    session_imported: '세션을 가져왔습니다',
    import_failed: '가져오기 실패: ',
    import_invalid_json: '잘못된 JSON입니다',
    image_pasted: '붙여넣은 이미지: ',
    // messages.js
    edit_message: '메시지 편집',
    regenerate: '응답 다시 생성',
    copy: '복사',
    copied: '복사됨!',
    copy_failed: '복사 실패',
    selected_text_reply: '선택 항목으로 답장',
    selected_text_reply_title: '선택한 채팅 텍스트를 인용 컨텍스트로 추가',
    selected_text_reply_appended: '선택한 텍스트가 입력창에 추가되었습니다',
    saved_prompts_empty: '저장된 프롬프트가 없습니다.',
    saved_prompts_save_current: '현재 입력을 프롬프트로 저장',
    saved_prompts_saved: '프롬프트가 저장되었습니다',
    saved_prompts_delete: '프롬프트 삭제',
    saved_prompts_empty_input: '먼저 저장할 프롬프트를 입력하세요',

    diff_loading: 'diff 불러오는 중',
    diff_error: '패치 파일을 로드할 수 없습니다',
    diff_too_large: '패치 파일이 너무 커서 인라인으로 표시할 수 없습니다',
    tree_view: 'Tree',
    raw_view: 'Raw',
    parse_failed_note: 'parse failed',
    you: '나',
    mcp_servers_title: 'MCP Servers',
    mcp_servers_desc: 'Manage Model Context Protocol servers configured in config.yaml.',
    mcp_no_servers: 'No MCP servers configured.',
    mcp_add_server: '+ Add Server',
    mcp_field_name: 'Server Name',
    mcp_transport_label: 'Transport Type',
    mcp_field_command: 'Command',
    mcp_field_args: 'Arguments (comma-separated)',
    mcp_field_url: 'URL',
    mcp_field_timeout: 'Timeout (seconds)',
    mcp_save: 'Save',
    mcp_cancel: 'Cancel',
    mcp_name_required: 'Server name is required.',
    mcp_url_required: 'URL is required for HTTP transport.',
    mcp_command_required: 'Command is required for stdio transport.',
    mcp_saved: 'MCP server saved.',
    mcp_save_failed: 'Failed to save MCP server.',
    mcp_delete_confirm_title: 'Delete MCP Server',
    mcp_delete_confirm_message: 'Delete MCP server "{0}"? This cannot be undone.',
    mcp_deleted: 'MCP server deleted.',
    mcp_delete_failed: 'Failed to delete MCP server.',
    mcp_load_failed: 'Failed to load MCP servers.',
    mcp_restart_hint: 'Server changes are read-only here for now. Edit config.yaml and restart Hermes for changes to take effect.',
    mcp_toggle_followup: 'Enable/disable controls are intentionally deferred until MCP reload semantics are explicit.',
    mcp_status_active: 'Active',
    mcp_status_configured: 'Configured',
    mcp_status_disabled: 'Disabled',
    mcp_status_invalid_config: 'Invalid config',
    mcp_status_unknown: 'Unknown',
    mcp_tool_count: '{0} tools',
    mcp_enabled_yes: 'Enabled',
    mcp_enabled_no: 'Disabled',
    mcp_enable_server: 'Enable this MCP server',
    mcp_disable_server: 'Disable this MCP server',
    mcp_enabled_toast: (name) => `MCP server "${name}" enabled.`,
    mcp_disabled_toast: (name) => `MCP server "${name}" disabled.`,
    mcp_toggle_failed: 'Failed to update MCP server.',
    mcp_tools_title: 'MCP Tools',
    mcp_tools_desc: 'Search known tools across active MCP servers.',
    mcp_tools_search_placeholder: 'Search tools by name, server, or description…',
    mcp_tools_no_tools: 'No MCP tools are available from the active runtime inventory.',
    mcp_tools_no_matches: 'No MCP tools match your search.',
    mcp_tools_load_failed: 'Failed to load MCP tools.',
    mcp_tools_schema_empty: 'No schema parameters.',
    mcp_tools_runtime_note: 'Tool inventory only uses already-known active MCP runtime data; the WebUI does not start or probe servers.',
    mcp_tools_summary_no_matches: (query,total) => `No MCP tools matching “${query}” (${total} total MCP tools).`,
    mcp_tools_summary_none: 'No MCP tools to show.',
    mcp_tools_summary_matching: (query) => ` matching “${query}”`,
    mcp_tools_summary_total_note: (total) => ` (${total} total MCP tools)`,
    mcp_tools_summary_showing: (start,end,filtered,searchNote,totalNote,page,pages) => `Showing ${start}-${end} of ${filtered} MCP tools${searchNote}${totalNote}. Page ${page} of ${pages}.`,
    mcp_tools_page_size_prefix: 'Show',
    mcp_tools_page_size_suffix: 'per page',
    mcp_tools_per_page_aria: 'MCP tools per page',
    mcp_tools_inactive_configured_servers: (servers) => `Configured but inactive in this WebUI runtime: ${servers}.`,
    mcp_tools_pagination_label: 'MCP tools pagination',
    mcp_tools_previous_page: '‹ Prev',
    mcp_tools_previous_page_aria: 'Previous MCP tools page',
    mcp_tools_next_page: 'Next ›',
    mcp_tools_next_page_aria: 'Next MCP tools page',
    thinking: '생각 중',
    expand_all: '모두 펼치기',
    collapse_all: '모두 접기',
    edit_failed: 'Edit failed: ',
    regen_failed: 'Regenerate failed: ',
    reconnect_active: 'A response is still being generated. Reload when ready?',
    reconnect_finished: 'A response was in progress when you last left. Messages may have updated.',
    // approval card
    approval_heading: '승인 필요',
    approval_desc_prefix: '위험한 명령이 감지되었습니다',
    approval_btn_once: '한 번 허용',
    approval_btn_once_title: '이 명령만 허용(Enter)',
    approval_btn_session: '세션 허용',
    approval_btn_session_title: '이 대화 세션 동안 허용',
    approval_btn_always: '항상 허용',
    approval_btn_always_title: '이 명령 패턴을 항상 허용',
    approval_btn_deny: '거부',
    approval_btn_deny_title: '거부 — 이 명령을 실행하지 않음',
    approval_responding: '응답 중\u2026',
    clarify_heading: '확인 필요',
    clarify_hint: '선택지를 고르거나 아래에 직접 입력하세요.',
    clarify_other: '기타',
    clarify_send: '보내기',
    clarify_input_placeholder: '응답을 입력하세요…',
    clarify_responding: '응답 중\u2026',
    session_attention_approval: (n) => n === 1 ? '승인' : `${n}개 승인`,
    session_attention_clarify: (n) => n === 1 ? '질문' : `${n}개 질문`,
    session_attention_generic: (n) => n === 1 ? '주의' : `${n}개 항목`,
    session_attention_approval_title: '권한 결정을 기다리는 중',
    session_attention_clarify_title: '답변을 기다리는 중',
    session_attention_generic_title: '사용자 작업을 기다리는 중',
    untitled: '제목 없음',
    n_messages: (n) => `${n}개 메시지`,
    load_older_messages: '↑ 위로 스크롤하거나 클릭하여 이전 메시지 불러오기',
    session_jump_start: '시작',
    session_jump_start_label: '세션 시작으로 이동',
    session_jump_end: '끝',
    session_jump_end_label: '세션 끝으로 이동',
    session_new_message: '새 메시지',
    session_new_message_label: '새 메시지가 있습니다, 끝으로 이동',
    jump_to_question: '응답으로',
    jump_to_question_label: '이 응답의 시작으로 이동',
    queued_label: 'Sends after response',
    queued_count: (n) => n === 1 ? '1 queued' : `${n} queued`,
    queued_cancel: 'Cancel queued message',
    model_unavailable: ' (unavailable)',
    model_unavailable_title: 'This model is no longer in your current provider list',
    provider_mismatch_warning: (m,p)=>`"${m}" may not work with your configured provider (${p}). Send anyway, or run \`hermes model\` in your terminal to switch.`,
    provider_mismatch_label: 'Provider mismatch',
    gateway_auth_label: 'Gateway 인증 실패',
    model_not_found_label: 'Model not found',
    model_custom_label: 'Custom model ID',
    model_custom_placeholder: 'e.g. openai/gpt-5.4',
    model_search_placeholder: 'Search models…',
    session_toolsets: 'Session Toolsets', // TODO: translate
    session_toolsets_desc: 'Restrict available tools for this session (blank = use global config)', // TODO: translate
    session_toolsets_global: 'Global (default)', // TODO: translate
    session_toolsets_custom: 'Custom', // TODO: translate
    session_toolsets_placeholder: 'tool1, tool2, \u2026', // TODO: translate
    session_toolsets_apply: 'Apply', // TODO: translate
    session_toolsets_clear: 'Clear (use global)', // TODO: translate
    session_toolsets_applied: 'Toolsets updated', // TODO: translate
    session_toolsets_cleared: 'Toolsets cleared — using global config', // TODO: translate
    session_toolsets_failed: 'Failed to update toolsets: ', // TODO: translate
    model_search_no_results: 'No models found',
    model_group_configured: '구성됨',
    ws_search_placeholder: '워크스페이스 검색…',
    ws_no_results: '워크스페이스를 찾을 수 없습니다',
    workspace_new_worktree_conversation: 'worktree에서 새 대화',
    workspace_new_worktree_conversation_meta: '이 워크스페이스용 격리된 git worktree를 만듭니다.',
    workspace_worktree_created: 'worktree 대화가 생성되었습니다',
    workspace_worktree_failed: 'worktree 생성 실패: ',
    session_worktree_badge: 'Worktree',
    model_scope_advisory: '다음 메시지부터 이 대화에 적용됩니다.',
    model_scope_toast: '다음 메시지부터 이 대화에 적용됩니다.',
    // commands.js
    cmd_clear: '대화 메시지 지우기',
    cmd_help: 'Show available slash commands',
    cmd_compress: 'Manually compress conversation context (usage: /compress [focus topic])',
    ctx_compress_hint: '\ucee8\ud14d\uc2a4\ud2b8 \uc555\ucd95\ud558\uba70 \uacf5\uac04 \ud655\ubcf4 →',
    ctx_compress_action: '\u26a0 \uc9c0\uae08 \uc555\ucd95\ud558\uba70 \ucee8\ud14d\uc2a4\ud2b8 \ud655\ubcf4',
    cmd_compact_alias: 'Legacy alias for /compress',
    cmd_model: '모델 전환(예: /model gpt-4o)',
    cmd_workspace: '이름으로 워크스페이스 전환',
    cmd_terminal: '워크스페이스 터미널 열기',
    cmd_new: '새 채팅 세션 시작',
    cmd_usage: '토큰 사용량 표시 켜기/끄기',
    cmd_theme: 'Switch appearance (theme: system/dark/light, skin: default/ares/mono/graphite/slate/poseidon/sisyphus/charizard/sienna/catppuccin/nous/geist-contrast/zeus/verdigris)',
    cmd_personality: 'Switch agent personality',
    cmd_skills: 'List available Hermes skills',
    cmd_use: 'Force a skill for the next message',
    available_commands: '사용 가능한 명령:',
    type_slash: '/ 를 입력해 명령 보기',
    conversation_cleared: '대화를 지웠습니다',
    command_label: '명령',
    context_compaction_label: 'Context compaction',
    retrieval_context_label: 'Indexed context',
    retrieval_context_preview: 'Earlier messages are stored and retrievable with context tools',
    preserved_task_list_label: '보존된 작업 목록',
    reference_only_label: 'Reference only',
    model_usage: 'Usage: /model <name>',
    no_model_match: 'No model matching "',
    model_did_you_mean: (m) => ` — did you mean "${m}"?`,
    switched_to: 'Switched to ',
    workspace_usage: 'Usage: /workspace <name>',
    no_workspace_match: 'No workspace matching "',
    switched_workspace: 'Switched to workspace: ',
    workspace_switch_failed: 'Workspace switch failed: ',
    new_session: '새 세션을 만들었습니다',
    new_session_creating: '새 대화를 만드는 중…',
    compressing: 'Requesting context compression...',
    compress_running_label: 'Compressing',
    compress_complete_label: 'Compression complete',
    auto_compress_label: '자동 압축',
    compress_failed_label: 'Compression failed',
    focus_label: 'Focus',
    token_usage_on: 'Token usage on',
    token_usage_off: 'Token usage off',
    usage_cache_hit_detail: '캐시: {0}% 적중({1} 읽기 / {2} 쓰기)',
    usage_cached_percent: '{0}% 캐시됨',
    theme_usage: 'Usage: /theme ',
    theme_set: 'Theme: ',
    no_active_session: '활성 세션 없음',
    cmd_queue: 'Queue a message for the next turn',
    cmd_goal: '지속 목표를 설정하거나 확인',
    goal_evaluating_progress: 'Evaluating goal progress…',
    goal_working_toward: 'Working toward goal…',
    goal_continuing_toast: 'Continuing toward goal…',
    goal_status_none: 'No active goal. Set one with /goal <text>.',
    goal_status_active: (turns, max_turns, goal) => `⊙ Goal (active, ${turns}/${max_turns} turns): ${goal}`,
    goal_status_paused: (turns, max_turns, reason, goal) => `⏸ Goal (paused, ${turns}/${max_turns}${reason ? `, ${reason}` : ''}): ${goal}`,
    goal_status_done: (turns, max_turns, goal) => `✓ Goal done (${turns}/${max_turns}): ${goal}`,
    goal_set: (turns, goal) => `⊙ Goal set (${turns}-turn budget): ${goal}`,
    goal_paused: (goal) => `⏸ Goal paused: ${goal}`,
    goal_resumed: (goal) => `▶ Goal resumed: ${goal}`,
    goal_cleared: 'Goal cleared.',
    goal_no_goal: 'No active goal.',
    goal_achieved: (reason) => `✓ Goal achieved: ${reason}`,
    goal_paused_budget_exhausted: (turns, max_turns) => `⏸ Goal paused — ${turns}/${max_turns} turns used. Use /goal resume to keep going, or /goal clear to stop.`,
    goal_continuing: (turns, max_turns, reason) => `↻ Continuing toward goal (${turns}/${max_turns}): ${reason}`,
    cmd_interrupt: 'Cancel current turn and send a new message',
    cmd_steer: 'Inject a mid-turn correction without interrupting the agent',
    cmd_queue_no_msg: 'Usage: /queue <message>',
    cmd_queue_not_busy: 'No active task — just send normally',
    cmd_queue_confirm: 'Message queued',
    cmd_interrupt_no_msg: 'Usage: /interrupt <message>',
    cmd_interrupt_confirm: 'Interrupted — sending new message',
    cmd_steer_no_msg: 'Usage: /steer <message>',
    cmd_steer_fallback: 'Steer unavailable — queued for next turn instead',
    cmd_steer_delivered: 'Steer delivered — agent will see it on its next tool result',
    steer_leftover_queued: 'Steer queued for next turn',
    busy_steer_fallback: 'Steer unavailable — queued for next turn',
    busy_interrupt_confirm: 'Interrupted — sending new message',
    settings_label_busy_input_mode: '작업 중 입력 방식',
    settings_desc_busy_input_mode: '에이전트가 실행 중일 때 메시지를 보내면 어떻게 처리할지 제어합니다. 대기는 다음 차례까지 기다리고, 중단은 현재 작업을 취소하고 새로 시작하며, 조정은 현재 작업을 중단하지 않고 중간 수정 사항을 전달합니다(에이전트 또는 스트림을 사용할 수 없으면 대기로 전환).',
    settings_label_fade_text_effect: '텍스트 페이드 효과',
    settings_desc_fade_text_effect: '어시스턴트가 응답하는 동안 새로 스트리밍되는 단어를 부드럽게 표시합니다. OpenWebUI와 비슷하며, 최대 성능을 위해 기본값은 꺼짐입니다.',
    settings_busy_input_mode_queue: '후속 메시지 대기',
    settings_busy_input_mode_interrupt: '현재 작업 중단',
    settings_busy_input_mode_steer: '조정(중간 수정)',

    slash_skill_badge: '스킬',
    slash_skill_desc: '이 스킬 실행',
    cmd_stop: '현재 응답 중지',
    cmd_title: '세션 제목 보기 또는 설정',
    cmd_retry: '마지막 메시지 다시 보내기',
    cmd_undo: '마지막 교환 제거',
    cmd_btw: '곁질문하기(임시)',
    cmd_btw_usage: '/btw <질문> — 세션 맥락을 사용해 곁질문하기',
    cmd_background: '백그라운드에서 프롬프트 실행',
    cmd_background_usage: '/background <프롬프트> — 차단하지 않고 병렬 실행',
    btw_asking: '곁질문 중...',
    btw_label: '곁질문 — 기록에 저장되지 않음',
    btw_done: '곁질문 답변 완료',
    btw_no_answer: '답변을 받지 못했습니다.',
    btw_failed: '곁질문 실패: ',
    bg_running: '백그라운드에서 실행 중...',
    bg_complete: '백그라운드 작업 완료',
    bg_label: '백그라운드 결과:',
    bg_no_answer: '(답변 없음)',
    bg_failed: '백그라운드 작업 실패: ',
    undo_exchange: '마지막 교환 실행 취소',
    cmd_status: '세션 정보 표시',
    cmd_voice: '마이크 입력 전환',
    stream_stopped: '응답이 중지되었습니다.',
    no_active_task: '중지할 활성 작업이 없습니다.',
    cancel_unavailable: '취소를 사용할 수 없습니다.',
    retry_failed: '재시도 실패: ',
    undo_failed: '실행 취소 실패: ',
    undid_n_messages: '제거됨',
    undid_messages_suffix: '개 메시지.',
    status_heading: '세션 상태',
    status_session_id: '세션 ID',
    status_title: '제목',
    status_model: '모델',
    status_provider: '제공자',
    status_workspace: '워크스페이스',
    status_personality: '페르소나',
    status_messages: '메시지',
    status_agent_running: '에이전트 실행 중',
    status_profile: '프로필',
    status_hermes_home: 'Hermes 홈',
    status_started: '시작 시간',
    status_tokens: '토큰',
    status_updated: '업데이트됨',
    status_ephemeral: '임시 스냅샷 — 대화 기록에 저장되지 않습니다.',
    status_no_tokens: '사용된 토큰 없음',
    status_unknown: '알 수 없음',
    status_yes: '예',
    status_no: '아니요',
    status_load_failed: '상태를 불러오지 못했습니다: ',
    title_current: '현재 제목',
    title_change_hint: '`/title <새 이름>`으로 이름을 변경하세요.',
    title_set: '제목 설정됨:',
    cmd_webui_only_session: '이 명령은 CLI에서 가져온 세션에서 사용할 수 없습니다.',
    cmd_voice_use_mic: '작성창의 마이크 버튼을 클릭하세요.',
    usage_heading: '토큰 사용량',
    usage_default_model: '기본값',
    usage_unknown: '알 수 없음',
    usage_input_tokens: '입력 토큰',
    usage_output_tokens: '출력 토큰',
    usage_total: '총 토큰',
    usage_estimated_cost: '예상 비용',
    usage_settings_tip: '참고: 비용 추정치는 대략적인 값입니다.',
    usage_load_failed: '사용량을 불러오지 못했습니다: ',
    usage_personality_none: '없음',
    no_personalities: 'No personalities found (add them to ~/.hermes/personalities/)',
    available_personalities: 'Available personalities:',
    personality_switch_hint: '\n\nUse `/personality <name>` to switch, or `/personality none` to clear.',
    personalities_load_failed: 'Failed to load personalities',
    personality_cleared: 'Personality cleared',
    personality_set: 'Personality: ',
    failed_colon: 'Failed: ',
    // ui.js
    no_workspace: 'No workspace',
    terminal_open_title: '워크스페이스 터미널 열기',
    terminal_no_workspace_title: '터미널을 열 워크스페이스를 선택하세요',
    terminal_title: '터미널',
    terminal_clear: '지우기',
    terminal_copy_output: '출력 복사',
    terminal_restart: '다시 시작',
    terminal_collapse: '접기',
    terminal_expand: '펼치기',
    terminal_close: '닫기',
    terminal_input_placeholder: '명령 입력...',
    terminal_start_failed: '터미널 시작 실패: ',
    terminal_input_failed: '터미널 입력 실패: ',
    terminal_copy_failed: '복사 실패: ',
    terminal_error: '터미널 오류',
    terminal_remote_backend_unsupported: '임베디드 터미널은 로컬 터미널 백엔드에서만 지원됩니다.',
    workspace_empty_no_path: 'No workspace selected. Set a workspace in Settings \u2192 Workspace to browse files.',
    workspace_empty_dir: 'This workspace is empty.',
    workspace_show_hidden_files: '숨김 파일 표시',
    workspace_show_hidden_files_desc: 'Include .DS_Store, .git, node_modules, and other hidden / system files in the file tree.',
    workspace_hidden_files_visible: 'hidden visible',
    workspace_hidden_files_visible_title: 'Hidden files are visible — click for options',
    workspace_options: 'Workspace options',
    dialog_confirm_title: 'Confirm action',
    dialog_prompt_title: 'Enter a value',
    dialog_confirm_btn: 'Confirm',
    // workspace.js
    unsaved_confirm: 'You have unsaved changes in the preview. Discard and navigate?',
    discard: '버리기',
    save: '저장',
    edit: '편집',
    clear: '지우기',
    create: '만들기',
    remove: '제거',
    save_title: 'Save changes',
    edit_title: 'Edit this file',
    saved: '저장됨',
    save_failed: '저장 실패: ',
    image_load_failed: 'Could not load image',
    file_open_failed: 'Could not open file',
    downloading: (name) => `Downloading ${name}\u2026`,
    double_click_rename: 'Double-click to rename',
    session_rename_failed_no_row: 'Could not start rename — row not found.',
    renamed_to: 'Renamed to ',
    rename_failed: 'Rename failed: ',
    moved_to: '이동됨: ',
    move_failed: '이동 실패: ',
    delete_title: '삭제',
    delete_confirm: (name) => `${name}을(를) 삭제할까요?`,
    delete_dir_confirm: (name) => `"${name}" 폴더와 모든 내용을 삭제할까요?`,
    rename_title: '이름 바꾸기',
    rename_prompt: '새 이름:',
    deleted: '삭제됨: ',
    delete_failed: '삭제 실패: ',
     reveal_in_finder: '파일 관리자에서 열기',
     reveal_failed: '표시 실패: ',
     copy_file_path: '파일 경로 복사',
     open_in_vscode: 'VS Code에서 열기',
     open_in_vscode_failed: 'VS Code에서 열기 실패: ',
     download_folder: 'Download Folder', // TODO: translate
    path_copied: '파일 경로가 클립보드에 복사되었습니다',
    path_copy_failed: '경로 복사 실패: ',
    session_rename: '대화 이름 변경',
    session_rename_desc: '이 대화의 제목 편집',
    session_title_regenerate: '제목 다시 생성',
    session_title_regenerate_desc: 'Hermes에게 대화에서 새 제목을 생성하도록 요청합니다',
    session_title_regenerating: '제목 다시 생성 중…',
    session_title_regenerated: (title) => `제목이 다시 생성됨: ${title}`,
    session_title_regenerate_failed: '제목 다시 생성 실패: ',
    session_copy_link: '대화 링크 복사',
    session_copy_link_desc: '이 대화로 바로 가는 링크 복사',
    session_link_copied: '대화 링크가 클립보드에 복사되었습니다',
    session_link_copy_failed: '대화 링크를 복사하지 못했습니다: ',
    new_file_prompt: 'New file name (e.g. notes.md):',
    new_file: '새 파일',
    new_folder: '새 폴더',
    workspace_root: '워크스페이스 루트',
    new_file_prompt_title: '{0}의 새 파일 이름:',
    new_folder_prompt_title: '{0}의 새 폴더 이름:',
    project_name_prompt: 'Project name:',
    created: '생성됨: ',
    create_failed: '생성 실패: ',
    new_folder_prompt: 'New folder name:',
    folder_created: 'Created folder ',
    folder_create_failed: 'Create folder failed: ',
    workspace_auto_create_folder: '폴더가 없으면 생성',
    folder_add_as_space_btn: '스페이스로 추가',
    folder_add_as_space_msg: '이 폴더를 워크스페이스 목록의 새 스페이스로 추가할까요?',
    archive_extracted: (n, c) => `${c}개 압축 파일에서 ${n}개 파일 압축 해제됨`,
    folder_add_as_space_title: '스페이스로 추가할까요?',
    remove_title: 'Remove',
    empty_dir: '(비어 있음)',
    upload_failed: 'Upload failed: ',
    upload_too_large: (maxMb, fileMb) => `File is too large (${fileMb} MB). Maximum upload size is ${maxMb} MB.`,
    uploading: 'Uploading…',
    uploaded: 'Uploaded',
    all_uploads_failed: (n) => `All ${n} upload(s) failed`,
    session_pin: 'Pin conversation',
    session_unpin: 'Unpin conversation',
    session_pin_desc: 'Keep this conversation at the top',
    session_unpin_desc: 'Remove from pinned',
    session_pin_failed: 'Pin failed: ',
    session_move_project: 'Move to project',
    session_move_project_desc_has: 'Change the project for this conversation',
    session_move_project_desc_none: 'Assign a project to this conversation',
    session_archive: 'Archive conversation',
    session_hide_external: '목록에서 숨기기',
    session_restore: 'Restore conversation',
    session_archive_desc: 'Hide this conversation until archived is shown',
    session_archive_worktree_desc: '이 대화를 숨기고 worktree는 디스크에 유지합니다',
    session_hide_external_desc: '원본 기록은 삭제하지 않고 WebUI 목록에서만 숨깁니다.',
    session_restore_desc: 'Bring this conversation back into the main list',
    session_archived: 'Session archived',
    session_archived_worktree: '세션이 보관되었습니다. Worktree는 디스크에 남아 있습니다.',
    session_hidden: '목록에서 숨겼습니다',
    session_restored: 'Session restored',
    session_archive_failed: 'Archive failed: ',
    session_duplicate: 'Duplicate conversation',
    session_duplicate_desc: 'Create a copy with the same workspace and model',
    session_duplicated: 'Session duplicated',
    session_duplicate_failed: 'Duplicate failed: ',
    session_stop_response: 'Stop response',
    session_stop_response_desc: 'Cancel the running response for this conversation',
    session_delete: 'Delete conversation',
    session_delete_desc: 'Permanently remove this conversation',
    session_delete_confirm: '이 대화를 삭제하시겠습니까?',
    session_delete_worktree_desc: 'WebUI 대화만 삭제하고 worktree는 디스크에 유지합니다',
    session_delete_worktree_confirm: (path) => `이 대화를 삭제하시겠습니까? ${path}의 worktree는 디스크에 남아 있습니다.`,
    session_deleted: '대화가 삭제되었습니다',
    session_deleted_worktree: '대화가 삭제되었습니다. Worktree는 디스크에 남아 있습니다.',
    session_worktree_remove: '워크트리 삭제',
    session_worktree_remove_desc: (path) => `${path}의 git worktree를 디스크에서 삭제합니다`,
    session_worktree_remove_confirm: (path) => `git worktree를 디스크에서 삭제하시겠습니까?\n\n경로: ${path}\n\n전체 worktree 디렉토리가 삭제됩니다. 세션 데이터는 WebUI에 보존됩니다.`,
    session_worktree_remove_not_exists: (path) => `${path}의 worktree가 디스크에 더 이상 존재하지 않습니다.`,
    session_worktree_remove_confirm_label: '삭제',
    session_worktree_removed: '워크트리가 삭제되었습니다.',
    session_worktree_remove_failed: '워크트리 삭제 실패: ',
    session_worktree_remove_status_failed: '워크트리 상태 읽기 실패: ',
    session_worktree_remove_locked_by_stream: '삭제할 수 없습니다 — 활성 스트리밍 세션이 이 worktree를 사용 중입니다.',
    session_worktree_remove_locked_by_terminal: '삭제할 수 없습니다 — 활성 터미널 세션이 이 worktree를 사용 중입니다.',
    session_worktree_remove_unsafe_blocked: '이 worktree를 삭제하기 전에 로컬 변경 사항이나 푸시되지 않은 커밋을 정리하세요.',
    session_worktree_remove_dirty_warning: '경고: 이 worktree에는 커밋되지 않은 변경 사항이 있으며 손실됩니다.',
    session_worktree_remove_untracked_warning: (count) => `${count}개의 추적되지 않은 파일이 영구적으로 삭제됩니다.`,
    session_worktree_remove_ahead_warning: (ahead) => `${ahead}개의 푸시되지 않은 커밋이 손실됩니다.`,
    session_select_mode: '선택',
    session_select_mode_desc: '일괄 관리할 대화를 선택하세요',
    session_select_all: '전체 선택',
    session_deselect_all: '전체 해제',
    session_selected_count: '{0}개 선택됨',
    session_batch_archive: '보관',
    session_batch_delete: '삭제',
    session_batch_move: '프로젝트로 이동',
    session_batch_delete_confirm: '{0}개의 대화를 삭제하시겠습니까?',
    session_batch_archive_confirm: '{0}개의 대화를 보관하시겠습니까?',
    session_batch_delete_worktree_confirm: '{0}개의 대화를 삭제하시겠습니까? worktree가 있는 대화 {1}개는 worktree 디렉터리를 디스크에 남깁니다.',
    session_batch_archive_worktree_confirm: '{0}개의 대화를 보관하시겠습니까? worktree가 있는 대화 {1}개는 worktree 디렉터리를 디스크에 유지합니다.',
    session_no_selection: '선택된 대화가 없습니다',
    // settings panel
    settings_heading_title: '제어 센터',
    settings_heading_subtitle: '환경설정, 대화 도구, 시스템 제어.',
    settings_section_conversation_title: '대화',
    settings_section_appearance_title: '외형',
    settings_section_appearance_meta: '테마, 강조 색상, 시각 스타일.',
    settings_section_preferences_title: '환경설정',
    settings_section_preferences_meta: 'Hermes Web UI의 기본값과 UI 동작.',
    settings_section_system_title: '시스템',
    settings_section_system_meta: '인스턴스 버전과 접근 제어.',
    settings_check_now: '지금 확인',
    settings_checking: '확인 중\u2026',
    settings_up_to_date: '최신 상태 \u2713',
    settings_updates_available: '{count} update(s) available',
    settings_updates_disabled: 'Update checks disabled',
    settings_update_check_failed: 'Update check failed',
    settings_label_workspace_panel_open: '기본으로 워크스페이스 패널 열기',
    settings_desc_workspace_panel_open: '활성화하면 새 세션마다 워크스페이스/파일 브라우저 패널이 자동으로 열립니다. 언제든지 수동으로 닫을 수 있습니다.',
    settings_label_session_jump_buttons: '세션 이동 버튼 표시',
    settings_desc_session_jump_buttons: '긴 세션 기록을 읽을 때 떠 있는 시작 및 끝 버튼을 표시합니다.',
    settings_label_terminal_auto_expand: '출력 시 터미널 자동 펼치기',
    settings_desc_terminal_auto_expand: '실행 중인 명령이 새 출력을 생성할 때 접힌 터미널 패널을 자동으로 펼칩니다.',

    settings_label_session_endless_scroll: '위로 스크롤할 때 이전 메시지 불러오기',

    settings_desc_session_endless_scroll: '활성화하면 위로 스크롤할 때 이전 메시지를 자동으로 불러옵니다. 비활성화하면 이전 메시지 버튼을 사용합니다.',
    settings_label_auto_scroll_follow: '새 내용 자동 따라가기',
    settings_desc_auto_scroll_follow: '활성화하면 토큰이 스트리밍되는 동안 화면이 자동으로 맨 아래로 스크롤됩니다. 비활성화하면 스크롤 위치를 직접 제어합니다.',
    settings_label_worklog_details_expanded_default: 'Open Worklog details automatically',
    settings_desc_worklog_details_expanded_default: 'When enabled, new Worklog details start expanded so tool, thinking, and progress cards are visible without an extra click. When off, Worklog details stay folded by default; per-turn manual collapse/expand choices still win.',
    settings_label_chat_activity_display_mode: 'Activity display',
    settings_desc_chat_activity_display_mode: 'Compact Worklog groups supporting activity into a quiet summary. Transparent Stream keeps each thinking/tool event as its own chronological expandable row.',
    first_token_time: 'Time to first token',
    done: 'Done',
    settings_option_compact_worklog: 'Compact Worklog',
    settings_option_transparent_stream: 'Transparent Stream',

    settings_label_tab_visibility: '사이드바 탭',
    settings_desc_tab_visibility: '사이드바와 레일에 표시할 탭을 선택하세요. 채팅과 설정은 항상 표시됩니다.',
    open_in_browser: '브라우저에서 열기',
    settings_dropdown_conversation: '대화',
    settings_dropdown_appearance: '외형',
    settings_dropdown_preferences: '환경설정',
    settings_dropdown_providers: 'Providers',
    settings_dropdown_system: '시스템',
    settings_tab_conversation: '대화',
    settings_tab_appearance: '외형',
    settings_tab_preferences: '환경설정',
    settings_tab_plugins: '플러그인',
    settings_plugins_title: 'Plugins',  // TODO: translate
    plugins_enable_toggle: '활성화',
    settings_plugins_meta: 'View installed Hermes plugins and the lifecycle hooks they register. This panel is read-only.',  // TODO: translate
    settings_plugins_empty: 'No Hermes plugins are currently visible. Install or enable plugins from the Hermes CLI/config to see them here.',  // TODO: translate
    plugins_unnamed: 'Unnamed plugin',  // TODO: translate
    plugins_no_description: 'No description provided.',  // TODO: translate
    plugins_no_hooks: 'No registered lifecycle hooks',  // TODO: translate
    plugins_registered_hooks: 'Registered hooks',  // TODO: translate
    plugins_enabled: 'Enabled',  // TODO: translate
    plugins_disabled: 'Disabled',  // TODO: translate
    plugins_active_provider: 'Active (provider)',  // TODO: translate
    plugins_provider_no_hooks: 'Provider plugin — no agent-visibility hooks',  // TODO: translate
    plugins_load_failed: 'Failed to load plugins: ',  // TODO: translate
    settings_tab_system: '시스템',
    settings_tab_help: 'Help',
    settings_help_meta: 'Resources and support for Hermes WebUI.',
    settings_help_docs_label: 'Documentation',
    settings_help_docs_desc: 'Guides, configuration reference, and the full Hermes WebUI README.',
    settings_help_docs_link: 'Open Documentation',
    settings_help_issue_label: 'Having an issue?',
    settings_help_issue_desc: 'Search existing reports or open a new one on GitHub.',
    settings_help_issue_link: 'Open GitHub Issues',
    settings_title: '설정',
    settings_save_btn: '설정 저장',
    settings_label_model: '기본 모델',
    settings_desc_model: '새 대화에 사용됩니다. 기존 대화는 선택된 모델을 유지합니다.',
    settings_label_auxiliary_models: '보조 모델',
    settings_desc_auxiliary_models: '비전, 압축, 제목 생성 등 보조 작업 라우팅. "자동"은 기본 채팅 모델을 사용합니다.',
    settings_btn_reset_aux_models: '모두 자동으로 재설정',
    settings_btn_apply_aux_models: '변경 사항 적용',
    settings_aux_provider_auto: '기본 모델 사용',
    settings_aux_model_auto: '자동 (제공자 기본값 사용)',
    settings_aux_model_custom: '사용자 정의 모델…',
    settings_aux_model_custom_prompt: '모델 ID 입력:',
    settings_aux_loading: '보조 모델 로딩 중…',
    settings_aux_load_failed: '보조 모델 설정을 로드할 수 없습니다. 에이전트 API가 사용 가능한지 확인하세요.',
    settings_aux_reset_confirm_title: '보조 모델을 재설정하시겠습니까?',
    settings_aux_reset_confirm_msg: '모든 보조 작업이 자동(기본 모델 사용)으로 설정됩니다.',
    settings_aux_reset_done: '보조 모델이 자동으로 재설정됨',
    settings_aux_save_failed: '보조 모델 저장 실패',
    settings_aux_saved: '보조 모델 업데이트됨',
    settings_aux_no_changes: '적용할 변경 사항 없음',
    settings_label_send_key: '전송 키',
    settings_label_theme: '테마',
    settings_label_skin: '스킨',
    settings_label_font_size: '글꼴 크기',
    font_size_small: '작게',
    font_size_default: '기본',
    font_size_large: '크게',
    font_size_xlarge: '매우 크게',
    settings_autosave_saving: '저장 중…',
    settings_autosave_saved: '저장됨',
    settings_autosave_failed: '저장 실패',
    settings_autosave_retry: '다시 시도',
    settings_label_language: '언어',
    settings_label_quota_chip: '작성기에 공급자 할당량 칩 표시',
    settings_desc_quota_chip: '작성기 푸터에 남은 할당량 표시기(예: OpenRouter 크레딧 잔액)를 표시합니다. 기본값은 끔. 활성화 시 노트북과 표준 데스크톱에서 작성기가 복잡해지지 않도록 와이드 디스플레이(≥1400px)에서만 표시됩니다.',
    settings_label_conversation_outline: '대화 개요 표시',
    settings_desc_conversation_outline: '현재 대화의 사용자 질문으로 이동하는 데스크톱 전용 목록을 표시합니다. 기본값은 꺼짐입니다.',
    settings_label_hide_suggestions: 'Hide new-chat suggestions',
    settings_desc_hide_suggestions: 'Hide the three default suggestion buttons on the empty new-chat screen to avoid accidental taps.',
    settings_label_token_usage: '토큰 사용량 표시',
    settings_label_token_speed: '토큰 속도(TPS) 표시',
    settings_desc_token_speed: '스트리밍 중과 응답 완료 후 어시스턴트 메시지 헤더에 초당 토큰 수를 표시합니다. 기본적으로 꺼져 있습니다.',
    settings_label_sidebar_density: '사이드바 밀도',
    cmd_reasoning: 'Toggle thinking visibility (show/hide), set effort level, or check current status',
    settings_label_external_sessions: '외부 세션 표시',
    settings_label_cron_sessions: 'Show cron sessions',
    settings_label_previous_messaging_sessions: '이전 메시징 세션 표시',
    settings_label_sync_insights: 'Insights에 동기화',
    settings_label_check_updates: '업데이트 확인',
    settings_label_ignore_agent_updates: 'Ignore Agent updates',
    settings_label_whats_new_summary: "Summarize What's New with AI",
    settings_label_bot_name: '기본 Assistant 이름',
    settings_label_password: '접근 비밀번호',
    settings_label_pinned_limit: '고정 대화 제한',
    settings_desc_pinned_limit: '사이드바에 고정할 수 있는 활성 대화의 최대 수입니다. 기본값은 3입니다.',
    settings_label_dashboard_mode: '공식 Hermes 대시보드',
    settings_desc_dashboard_mode: '공식 hermes 대시보드에 연결 가능할 때 내비게이션 레일에 링크를 표시합니다. 공개 리버스 프록시 URL은 브라우저 전용 링크로만 저장되며 서버에서 프로브하지 않습니다.',
    settings_dashboard_mode_auto: '자동 감지',
    settings_dashboard_mode_always: '항상 표시',
    settings_dashboard_mode_never: '표시 안 함',
    settings_dashboard_save: '대시보드 링크 설정 저장',
    settings_label_gateway_status: '게이트웨이 상태',
    settings_desc_gateway_status: 'Hermes 게이트웨이 상태 (Telegram, Discord, Slack 등)',
    gateway_not_configured: '게이트웨이가 설정되지 않았습니다',
    gateway_metadata_stale: '게이트웨이 메타데이터가 오래되었습니다',
    gateway_endpoint_unreachable: '게이트웨이 엔드포인트에 연결할 수 없습니다',
    gateway_not_running: '게이트웨이가 실행 중이 아닙니다',
    gateway_running_label: '실행 중',
    gateway_last_active: '마지막 활동: ',
    gateway_session_count: (n) => `${n}개 세션`,
    gateway_load_failed: '게이트웨이 상태를 불러오지 못했습니다',
    settings_saved: '설정 저장됨',
    settings_save_failed: '설정 저장 실패: ',
    settings_load_failed: '설정 로드 실패: ',
    settings_saved_pw: '설정이 저장되었습니다 — 비밀번호 보호가 활성화되었으며 이 브라우저는 로그인 상태로 유지됩니다',
    settings_saved_pw_updated: '설정이 저장되었습니다 — 비밀번호가 업데이트되었습니다',
    // login page (used server-side via /api/i18n/login endpoint)
    login_title: '로그인',
    login_subtitle: '계속하려면 비밀번호를 입력하세요.',
    login_placeholder: '비밀번호',
    login_btn: '로그인',
    login_invalid_pw: '비밀번호가 올바르지 않습니다',
    login_conn_failed: '연결 실패',
    // Sidebar & Tabs
    tab_chat: '채팅',
    tab_tasks: '작업',
    tab_skills: '스킬',
    tab_memory: '메모리',
    tab_workspaces: '공간',
    tab_profiles: 'Agent 프로필',
    tab_kanban: 'Kanban',
    kanban_board: 'Board',
    kanban_visible_tasks: '{0} visible tasks',
    kanban_search_tasks: 'Search tasks',
    kanban_all_assignees: 'All assignees',
    kanban_all_tenants: 'All tenants',
    kanban_include_archived: 'Include archived',
    kanban_no_matching_tasks: 'No matching tasks',
    kanban_no_data: 'No Kanban data',
    kanban_work_queue_hint: 'This is the Hermes Agent work queue. Create or triage a task, assign it, move it to Ready, then let the dispatcher claim it.',
    kanban_unavailable: 'Kanban unavailable',
    kanban_read_only: 'Read-only view',
    kanban_empty: 'Empty',
    kanban_task: 'Task',
    kanban_no_description: 'No description',
    kanban_refresh: 'Refresh',
    kanban_status_triage: 'Triage',
    kanban_status_todo: 'Todo',
    kanban_status_ready: 'Ready',
    kanban_status_running: 'Running',
    kanban_status_blocked: 'Blocked',
    kanban_status_done: 'Done',
    kanban_status_original_hint: 'Actual status: {0}. This dialog only supports Triage/Todo/Ready edits.',
    kanban_comments_count: 'Comments ({0})',
    kanban_events_count: 'Events ({0})',
    kanban_links: 'Links',
    kanban_parents: 'Parents',
    kanban_children: 'Children',
    kanban_runs_count: 'Runs ({0})',
    kanban_no_comments: 'No comments',
    kanban_no_events: 'No events',
    kanban_no_runs: 'No runs',
    kanban_title: '제목',
    kanban_description: '설명',
    kanban_description_placeholder: '선택 — 해야 할 일, 수락 기준, 링크',
    kanban_status: '상태',
    kanban_assignee: '담당자',
    kanban_assignee_placeholder: '선택 — 비워두면 누구나 가능',
    kanban_tenant: '테넌트',
    kanban_tenant_placeholder: '선택 — 프로젝트 또는 팀 슬러그',
    kanban_priority: '우선순위',
    kanban_priority_hint: '높은 숫자가 먼저 실행됩니다. 기본값: 0.',
    kanban_title_required: '제목은 필수입니다.',
    kanban_edit_task: '작업 편집',
    kanban_run_dispatcher: '디스패처 실행',
    kanban_run_dispatcher_confirm: '이 보드의 Ready 작업을 클레임하고 워커 서브프로세스를 생성합니다(클릭당 최대 8개). 계속할까요?',
    kanban_assignee_profiles_label: 'Hermes 프로필',
    kanban_assignee_other_label: '기타 (CLI 레인 / 삭제된 프로필)',
    kanban_assignee_unassigned: '— 미할당 (자동 실행되지 않음) —',
    kanban_ready_needs_assignee: '«미할당» + «Ready»를 선택했습니다. 디스패처는 이 작업을 건너뜁니다. 확인하려면 다시 제출하거나 프로필을 선택하세요.',
    kanban_dispatch_preview_prefix: '미리보기:',
    kanban_dispatch_run_prefix: '디스패치됨:',
    kanban_dispatch_spawned: '생성됨',
    kanban_dispatch_promoted: '승격됨',
    kanban_dispatch_reclaimed: '재요청됨',
    kanban_dispatch_skipped_unassigned: '건너뜀 (담당자 없음)',
    kanban_dispatch_skipped_nonspawnable: '건너뜀 (알 수 없는 프로필)',
    kanban_dispatch_auto_blocked: '자동 차단',
    kanban_dispatch_timed_out: '시간 초과',
    kanban_dispatch_crashed: '충돌',
    kanban_new_task: 'New task',
    kanban_add_comment: 'Add comment',
      kanban_only_mine: 'Only mine',
      kanban_bulk_action: 'Bulk action',
      kanban_nudge_dispatcher: 'Preview dispatcher',
      kanban_stats: 'Stats',
      kanban_worker_log: 'Worker log',
      kanban_block: 'Block',
      kanban_unblock: 'Unblock',
      kanban_back_to_board: 'Back to board',
      kanban_lanes_by_profile: 'Lanes by profile',
      kanban_new_board: 'New board…',
      kanban_rename_board: 'Rename current board…',
      kanban_archive_board: 'Archive current board…',
      kanban_archive_board_confirm: 'Archive board "{name}"? Tasks remain on disk and the board can be restored from kanban/boards/_archived/.',
      kanban_board_archived: 'Board archived',
      kanban_board_name: 'Name',
      kanban_board_slug: 'Slug (lowercase, hyphens)',
      kanban_board_description: 'Description (optional)',
      kanban_board_icon: 'Icon (emoji, optional)',
      kanban_board_color: 'Color (optional)',
      kanban_board_name_required: 'Name is required',
      kanban_board_slug_required: 'Slug is required',
      kanban_card_complete: 'complete',
      kanban_card_archive: 'archive',
      kanban_unassigned: 'unassigned',
    kanban_status_archived: 'Archived',
    tab_todos: 'Todos',
    tab_insights: '통계',
    tab_dashboard: 'Hermes 대시보드',
    dashboard_loopback_warning: '대시보드는 서버에서 loopback 전용입니다. 서버 자체에서 접속하거나 --host 0.0.0.0(안전하지 않음)으로 다시 시작하세요.',
    tab_logs: 'Logs',
    tab_settings: '설정',

    logs_title: 'Logs',  // TODO: translate
    logs_file: 'File',  // TODO: translate
    logs_tail: 'Tail',  // TODO: translate
    logs_auto_refresh: 'Auto-refresh (5s)',  // TODO: translate
    logs_wrap: 'Wrap lines',  // TODO: translate
    logs_copy_all: 'Copy all',  // TODO: translate
    logs_empty: 'No log lines yet.',  // TODO: translate
    logs_loading: 'Loading logs…',  // TODO: translate
    logs_load_failed: 'Logs failed to load',  // TODO: translate
    logs_status_idle: 'Choose a log file to view recent lines.',  // TODO: translate
    logs_no_mtime: 'not written yet',  // TODO: translate
    logs_truncated_hint: 'Showing the tail of a large log file; older bytes were skipped to keep memory bounded.',  // TODO: translate
    logs_copied: 'Logs copied',  // TODO: translate
    logs_severity: '심각도',
    logs_severity_all: '전체',
    logs_severity_errors: '오류',
    logs_severity_warnings: '경고+',
    logs_filter_active: '표시됨(필터 활성)',
    new_conversation: '새 대화',
    filter_conversations: '대화 필터…',
    markdown_table_filter: '표 필터',
    markdown_table_sort_column: '열 정렬',
    session_time_unknown: 'Unknown',
    session_time_minutes_ago: (n) => `${n}m`,
    session_time_hours_ago: (n) => `${n}h`,
    session_time_days_ago: (n) => `${n}d`,
    session_time_last_week: '1w',
    session_time_bucket_today: 'Today',
    session_time_bucket_yesterday: 'Yesterday',
    session_time_bucket_this_week: 'This week',
    session_time_bucket_last_week: 'Last week',
    session_time_bucket_older: 'Older',
    scheduled_jobs: '예약 작업',
    new_job: '새 작업',
    loading: '로딩 중...',
    search_skills: 'Search skills...',
    new_skill: 'New skill',
    personal_memory: '개인 메모리',
    current_task_list: '현재 작업 목록',
    workspace_desc: '세션용 워크스페이스를 추가하고 전환합니다.',
    session_meta_messages: (n) => `${n} msg${n === 1 ? '' : 's'}`,
    session_meta_children: (n) => `${n} child${n === 1 ? '' : 'ren'}`,
    session_meta_segments: (n) => `${n} segment${n === 1 ? '' : 's'}`,
    session_lineage_toggle_hint: '{0} — 이전 컨텍스트 턴이 여기에 접혀 있습니다. 클릭하여 표시하거나 숨기세요.',
    session_lineage_static_hint: '{0} — 이전 컨텍스트 턴이 여기에 접혀 있습니다.',
    session_child_toggle_hint: '{0} — 이 세션에서 생성된 하위 대화입니다. 클릭하여 표시하거나 숨기세요.',
    session_readonly_title_hint: '읽기 전용으로 가져온 세션 — {0}',
    session_lineage_segment_untitled: '제목 없는 세그먼트',
    session_lineage_segment_open: '계보 세그먼트 열기',
    new_profile: 'New profile',
    transcript: '대화 기록',
    download_transcript: 'Download as Markdown',
    import: '가져오기',
    export_session_json: 'JSON',
    export_session_json_tooltip: '전체 세션을 JSON으로 내보내기',
    import_session_json_tooltip: 'JSON에서 세션 가져오기',
    clear_conversation_btn_tooltip: '이 대화의 모든 메시지 지우기',
    // Settings detail
    settings_label_rtl: '오른쪽에서 왼쪽 채팅 레이아웃',
    settings_desc_rtl: '아랍어나 히브리어 같은 언어를 위해 채팅 메시지와 작성 입력의 정렬을 뒤집습니다. 채팅 영역에만 영향을 주며, 사이드바와 다른 패널은 왼쪽에서 오른쪽으로 유지됩니다.',
    settings_label_sound: '알림음',
    settings_desc_sound: 'Assistant 응답이 끝나면 소리를 재생합니다.',
    settings_label_notifications: '브라우저 알림',
    settings_desc_notifications: '앱이 백그라운드에 있을 때 응답이 완료되면 시스템 알림을 표시합니다.',
    notifications_enable_btn: 'Enable notifications',
    notifications_test_btn: 'Send test',
    notifications_permission_status: (status) => `Permission: ${status}`,
    notifications_enabled_toast: 'Notifications enabled.',
    notifications_denied: 'Notifications are blocked in this browser. Enable them in browser settings.',
    notifications_unsupported: 'Notifications are not supported in this browser.',
    settings_desc_token_usage: '각 Assistant 응답 아래에 입력/출력 토큰 수를 표시합니다. /usage로도 전환할 수 있습니다.',
    settings_sidebar_density_compact: '간결',
    settings_sidebar_density_detailed: '자세히',
    settings_desc_sidebar_density: '왼쪽 사이드바의 세션 목록에 표시할 메타데이터 양을 제어합니다.',
    settings_label_auto_title_refresh: '적응형 제목 새로고침',
    settings_auto_title_refresh_off: '꺼짐',
    settings_auto_title_refresh_5: 'Every 5 exchanges',
    settings_auto_title_refresh_10: 'Every 10 exchanges',
    settings_auto_title_refresh_20: 'Every 20 exchanges',
    settings_desc_auto_title_refresh: '최신 대화를 바탕으로 세션 제목을 자동으로 다시 생성해 대화가 진행되어도 제목을 관련 있게 유지합니다. LLM 제목 생성 모델 설정이 필요합니다.',
    settings_desc_external_sessions: 'CLI, Telegram, Discord, Slack 및 기타 채널의 대화를 세션 목록에 표시합니다. 클릭하여 가져오고 계속하세요.',
    settings_desc_cron_sessions: 'Surface cron job output as conversations in the sidebar. Only active when non-WebUI sessions are enabled. Defaults off; high-frequency jobs can flood the sidebar.',
    settings_desc_previous_messaging_sessions: 'reset 또는 compression으로 교체된 이전 Discord, Telegram, Slack, Weixin 세션을 표시합니다.',
    settings_desc_sync_insights: 'WebUI 토큰 사용량을 state.db에 반영하여 hermes /insights에 브라우저 세션 데이터가 포함되도록 합니다. 기본값은 꺼짐입니다.',
    settings_desc_check_updates: 'WebUI 또는 Agent의 새 버전이 있으면 배너를 표시합니다. 백그라운드에서 주기적으로 git fetch를 실행합니다.',
    settings_desc_ignore_agent_updates: 'Keep WebUI update checks on, but hide Agent update notices and skip Agent update fetches.',
    settings_desc_whats_new_summary: "Changes the What's New action from opening the raw diff first to generating a short, human-readable summary. The regular diff comparison stays available after the summary.",
    settings_desc_bot_name: '기본 프로필에만 사용됩니다. 다른 프로필은 각 프로필 이름을 사용합니다.',
    settings_desc_password: '새 비밀번호를 설정하거나 변경하려면 입력하세요. 현재 설정을 유지하려면 비워 두세요.',
    password_placeholder: '새 비밀번호 입력…',
    password_env_var_locked: '현재 HERMES_WEBUI_PASSWORD 환경 변수가 설정되어 있어 우선 적용됩니다. 변수를 해제하고 서버를 재시작해야 여기에서 비밀번호를 관리할 수 있습니다.',
    password_env_var_locked_placeholder: '잠금: HERMES_WEBUI_PASSWORD 환경 변수가 설정되어 있습니다',
    disable_auth: '인증 비활성화',
    sign_out: '로그아웃',
    settings_label_shutdown: 'Hermes WebUI 서버 중지',
    settings_desc_shutdown_before_cmd: '로컬 WebUI 서버를 정상적으로 중지합니다. ',
    settings_desc_shutdown_between_cmds: ' 로 시작했고 터미널로 전환하지 않고 중지하고 싶을 때 유용합니다. 다시 WebUI에 접근하려면 서버(',
    settings_desc_shutdown_after_cmd: ' 또는 네이티브 앱)를 재시작해야 합니다.',
    settings_btn_shutdown: '서버 중지',
    settings_shutdown_confirm_title: 'Hermes WebUI 중지',
    settings_shutdown_confirm_message: 'Hermes WebUI 서버를 중지할까요?',
    settings_shutdown_confirm_btn: '중지',
    settings_shutdown_stopped_message: '서버가 중지되었습니다. 이 탭을 닫아도 됩니다.',
    // Providers panel
    providers_tab_title: 'Providers',
    providers_section_title: 'Providers',
    providers_section_meta: 'Manage API keys for AI providers. Changes take effect immediately.',
    providers_status_configured: 'API key configured',
    providers_status_not_configured: 'No API key',
    providers_status_oauth: 'OAuth',
    providers_status_api_key: 'API key',
    providers_status_not_configured_label: 'Not configured',
    providers_oauth_hint: 'Authenticated via OAuth. No API key needed.',
    providers_oauth_config_yaml_hint: 'Token configured via config.yaml. To update, edit the providers section in your config.yaml or run hermes auth.',
    providers_oauth_not_configured_hint: 'Not authenticated. Run hermes auth in the terminal to configure this provider.',
    providers_save: 'Save',
    providers_refresh_models: 'Refresh models',
    providers_refreshing: 'Refreshing…',
    providers_models_refreshed: 'Models refreshed',
    providers_remove: 'Remove',
    providers_saving: 'Saving…',
    providers_removing: 'Removing…',
    providers_enter_key: 'Please enter an API key',
    providers_empty: 'No configurable providers found.',
    providers_key_updated: 'API key saved',
    providers_key_removed: 'API key removed',
    providers_key_placeholder_new: 'sk-...',
    providers_key_placeholder_replace: 'Enter new key to replace…',
    provider_quota_title: '활성 제공자 할당량',
    provider_quota_active_provider: '활성 제공자',
    provider_quota_last_checked_after_refresh: '새로고침 후 마지막 확인',
    provider_quota_last_checked: '마지막 확인 {0}',
    provider_quota_refresh_usage: '사용량 새로고침',
    provider_quota_refreshing: '새로고침 중...',
    provider_quota_refresh_title: '제공자 사용 제한을 지금 새로고침',
    provider_quota_refresh_succeeded: '제공자 사용량을 새로고침했습니다',
    provider_quota_refresh_failed: '제공자 사용량 새로고침 실패',
    provider_quota_session_limit: '5시간 제한',
    provider_quota_weekly_limit: '주간 제한',
    provider_quota_window_fallback: '기간',
    provider_quota_metric_remaining: '남음',
    provider_quota_metric_used: '사용됨',
    provider_quota_metric_limit: '제한',
    provider_quota_status_available: '사용 가능',
    provider_quota_status_exhausted: '소진됨',
    provider_quota_status_unavailable: '사용 불가',
    provider_quota_status_failed: '실패',
    provider_quota_status_checked: '확인됨',
    provider_quota_status_no_key: '키 없음',
    provider_quota_status_invalid_key: '잘못된 키',
    provider_quota_status_unsupported: '지원되지 않음',
    provider_quota_used_meta: '{0} 사용됨',
    provider_quota_resets_meta: '{0}에 재설정',
    provider_quota_credential_pool: '자격 증명 풀',
    provider_quota_credential_label: '자격 증명 {0}',
    provider_quota_pool_plans: '플랜: {0}',
    provider_quota_pool_no_windows: '보고된 계정 제한 기간이 없습니다.',
    provider_quota_account_limits_loaded: '계정 제한을 불러왔습니다.',
    provider_quota_unavailable: '할당량 상태를 사용할 수 없습니다',
    provider_quota_retry_after: '{0} 후 다시 시도',
    provider_quota_pool_summary_available: '{0}/{1} 사용 가능',
    provider_quota_pool_summary_exhausted: '{0}개 소진됨',
    provider_quota_pool_summary_failed: '{0}개 실패',
    provider_quota_pool_summary_checked: '{0}개 확인됨',
    cancel: '취소',
    create_job: 'Create job',
    save_skill: 'Save skill',
    editing: 'Editing',
    // Empty state
    empty_title: '무엇을 도와드릴까요?',
    empty_subtitle: '질문하고, 명령을 실행하고, 파일을 탐색하거나 예약 작업을 관리하세요.',
    suggest_files: '이 워크스페이스에는 어떤 파일이 있나요?',
    suggest_schedule: '오늘 일정에는 무엇이 있나요?',
    suggest_plan: '작은 프로젝트 계획을 도와주세요.',
    // onboarding
    onboarding_badge: '첫 실행',
    onboarding_title: 'Hermes Web UI에 오신 것을 환영합니다',
    onboarding_lead: '간단한 안내 설정으로 Hermes 설치를 확인하고, 워크스페이스와 모델을 선택하며, 필요하면 비밀번호로 앱을 보호합니다.',
    onboarding_back: '뒤로',
    onboarding_continue: '계속',
    onboarding_skip: '설정 건너뛰기',
    onboarding_skipped: 'Setup skipped — using existing config.',
    onboarding_open: 'Open Hermes',
    onboarding_step_system_title: 'System check',
    onboarding_step_system_desc: 'Verify Hermes Agent and config visibility.',
    onboarding_step_setup_title: 'Provider setup',
    onboarding_step_setup_desc: 'Save the minimum Hermes provider config.',
    onboarding_step_workspace_title: 'Workspace + model',
    onboarding_step_workspace_desc: 'Pick defaults for new sessions and chat.',
    onboarding_step_password_title: 'Optional password',
    onboarding_step_password_desc: 'Protect the Web UI before sharing it.',
    onboarding_step_finish_title: 'Finish',
    onboarding_step_finish_desc: 'Review and enter the app.',
    onboarding_notice_system_ready: 'Hermes Agent looks reachable from the Web UI.',
    onboarding_notice_system_unavailable: 'Hermes Agent is not fully available yet. Bootstrap can install it, but provider setup may still require a terminal.',
    onboarding_check_agent: 'Hermes Agent',
    onboarding_check_agent_ready: 'Detected and importable',
    onboarding_check_agent_missing: 'Missing or partially importable',
    onboarding_check_password: 'Password',
    onboarding_check_password_enabled: 'Already enabled',
    onboarding_check_password_disabled: 'Not enabled yet',
    onboarding_check_provider: 'Provider config',
    onboarding_check_provider_ready: 'Ready to chat',
    onboarding_check_provider_partial: 'Saved but incomplete',
    onboarding_check_provider_pending: 'Needs verification',
    onboarding_config_file: 'Config file:',
    onboarding_env_file: '.env file:',
    onboarding_unknown: 'Unknown',
    onboarding_current_provider: 'Current setup:',
    onboarding_missing_imports: 'Missing imports:',
    onboarding_notice_setup_required: 'Choose a simple provider path here. Advanced OAuth flows still belong in the Hermes CLI for now.',
    onboarding_notice_setup_already_ready: 'A working Hermes provider setup is already detected. You can keep it or replace it here.',
    onboarding_oauth_provider_ready_title: 'Provider already authenticated',
    onboarding_oauth_provider_ready_body: 'This instance is configured to use an OAuth provider (<strong>{provider}</strong>) that was set up via the Hermes CLI. No API key is needed here — click Continue to finish setup.',
    onboarding_oauth_provider_not_ready_title: 'OAuth provider not yet authenticated',
    onboarding_oauth_provider_not_ready_body: 'This instance is configured to use <strong>{provider}</strong>, which uses OAuth rather than an API key. Run <code>hermes auth</code> or <code>hermes model</code> in a terminal to authenticate, then reload the Web UI.',
    onboarding_oauth_switch_hint: 'Or choose a different provider below to switch to an API-key setup:',
    onboarding_notice_workspace: 'These values reuse the same settings APIs as the normal app.',
    onboarding_workspace_label: 'Workspace',
    onboarding_workspace_or_path: 'Or enter a workspace path',
    onboarding_workspace_placeholder: '/home/you/workspace',
    onboarding_provider_label: 'Setup mode',
    onboarding_quick_setup_badge: 'quick setup',
    provider_category_easy_start: 'Easy start',
    provider_category_self_hosted: 'Open / self-hosted',
    provider_category_specialized: 'Specialized',
    onboarding_api_key_label: 'API key',
    oauth_login_codex: 'Login with Codex (ChatGPT)', // TODO: translate
    oauth_codex_step1: 'Step 1: Visit this URL and enter the code', // TODO: translate
    oauth_codex_step2: 'Step 2: Enter this code on the page', // TODO: translate
    oauth_codex_polling: 'Waiting for authorization...', // TODO: translate
    oauth_codex_success: 'Codex OAuth login successful!', // TODO: translate
    oauth_codex_error: 'OAuth login failed', // TODO: translate
    oauth_codex_expired: 'Code expired, please try again', // TODO: translate
    onboarding_api_key_placeholder: 'Leave blank to keep an existing saved key',
    onboarding_api_key_label_optional: 'API key (optional)', // TODO: translate
    onboarding_api_key_placeholder_optional: 'Leave blank for keyless servers', // TODO: translate
    onboarding_api_key_help_keyless: 'Most LM Studio / Ollama / vLLM installs run keyless — leave this blank if your server doesn\'t require authentication. Use the Test connection button to verify.', // TODO: translate
    onboarding_api_key_help_prefix: 'Saved as a secret in your Hermes .env file using',
    onboarding_base_url_label: 'Base URL',
    onboarding_base_url_placeholder: 'https://your-endpoint.example/v1',
    onboarding_base_url_help: 'Use this for OpenAI-compatible routers, self-hosted servers, LiteLLM, Ollama, LM Studio, vLLM, or similar endpoints.',
    onboarding_model_label: 'Default model',
    onboarding_workspace_help: 'Pick the model Hermes should use for new chats after setup completes.',
    onboarding_custom_model_placeholder: 'your-model-name',
    onboarding_custom_model_help: 'For custom endpoints, enter the exact model ID your server expects.',
    onboarding_notice_password_enabled: 'A password is already configured. Enter a new one only if you want to replace it.',
    onboarding_notice_password_recommended: 'Optional but recommended if you will expose the UI beyond localhost.',
    onboarding_password_label: 'Password (optional)',
    onboarding_password_placeholder: 'Leave blank to skip',
    onboarding_password_help: 'Passwords are stored through the existing settings API and hashed server-side.',
    onboarding_notice_finish: 'You can reopen Settings later to change any of this.',
    onboarding_not_set: 'Not set',
    onboarding_password_will_enable: 'Will be enabled',
    onboarding_password_will_replace: 'Will be replaced',
    onboarding_password_keep_existing: 'Keep current password',
    onboarding_password_remains_disabled: 'Will remain disabled',
    onboarding_password_skipped: 'Skipped for now',
    onboarding_finish_help: 'Finishing stores <code>onboarding_completed</code> in settings and drops you into the normal app.',
    onboarding_error_choose_workspace: 'Choose a workspace before continuing.',
    onboarding_error_choose_model: 'Choose a model before continuing.',
    onboarding_error_provider_required: 'Choose a setup mode before continuing.',
    onboarding_error_base_url_required: 'Base URL is required for custom endpoints.',
    onboarding_probe_test_button: 'Test connection', // TODO: translate
    onboarding_probe_probing: 'Testing connection…', // TODO: translate
    onboarding_probe_ok: 'Connected. {n} model(s) available.', // TODO: translate
    onboarding_probe_error_generic: 'Could not reach the configured base URL.', // TODO: translate
    onboarding_probe_error_invalid_url: 'Base URL must start with http:// or https://.', // TODO: translate
    onboarding_probe_error_dns: 'Could not resolve the host. Check the URL or use the host\'s IP address.', // TODO: translate
    onboarding_probe_error_connect_refused: 'Connection refused — the server may not be running on that address. From inside Docker, try the host IP instead of localhost.', // TODO: translate
    onboarding_probe_error_timeout: 'The endpoint did not respond in time. Check that the server is running and the URL is correct.', // TODO: translate
    onboarding_probe_error_http_4xx: 'The endpoint returned a client error. Check authentication and the URL path (typically ends in /v1).', // TODO: translate
    onboarding_probe_error_http_5xx: 'The endpoint returned a server error. Check the LM Studio / Ollama server logs.', // TODO: translate
    onboarding_probe_error_parse: 'The endpoint did not return a model list in the expected shape. Verify the URL points to the OpenAI-compatible API root.', // TODO: translate
    onboarding_probe_error_unreachable: 'Could not reach the configured base URL.', // TODO: translate
    onboarding_error_probe_failed: 'Could not validate the configured base URL.', // TODO: translate
    onboarding_error_workspace_required: 'Workspace is required.',
    onboarding_error_model_required: 'Model is required.',
    onboarding_complete: '설정 완료',

    // panel/runtime i18n
    error_prefix: 'Error: ',
    default: 'default',
    search: 'Search',
    not_available: 'N/A',
    never: 'never',
    add: 'Add',
    add_failed: 'Add failed: ',
    remove_failed: 'Remove failed: ',
    switch_failed: 'Switch failed: ',
    name_required: 'Name is required',
    content_required: 'Content is required',
    view: 'View',
    dismiss: 'Dismiss',
    disable: 'Disable',
    cron_no_jobs: 'No scheduled jobs found.',
    cron_status_off: 'off',
    cron_status_paused: 'paused',
    cron_status_error: 'error',
    cron_status_active: 'active',
    cron_status_running: '\uc2e4\ud589 \uc911\u2026',
    cron_status_needs_attention: '주의 필요',
    cron_attention_desc: '이 반복 작업에 다음 실행 시간이 없습니다. 스케줄러가 다음 실행을 계산하지 못했을 수 있습니다.',
    cron_attention_croniter_hint: 'Gateway 런타임에 croniter 패키지가 없을 수 있습니다. cron 지원이 포함된 환경으로 Gateway를 재시작한 후 이 작업을 재개하세요.',
    cron_attention_resume: '재개 및 재계산',
    cron_jobs_project: '예약 작업',
    cron_attention_run_once: '지금 한 번 실행',
    cron_attention_copy_diagnostics: '진단 정보 복사',
    cron_diagnostics_copied: '크론 진단 정보가 복사되었습니다',
    cron_next: 'Next',
    cron_last: 'Last',
    cron_run_now: 'Run now',
    cron_pause: 'Pause',
    cron_resume: 'Resume',
    cron_job_name_placeholder: 'Job name',
    cron_schedule_placeholder: 'Schedule',
    cron_prompt_placeholder: 'Prompt',
    cron_last_output: 'Last output',
    cron_expand_prompt: 'Expand prompt',
    cron_collapse_prompt: 'Collapse prompt',
    cron_expand_output: 'Expand output',
    cron_collapse_output: 'Collapse output',
    cron_mode_agent: 'Agent',
    cron_mode_script: 'Script',
    cron_mode_label: 'Mode',
    cron_script_job_banner: 'Runs a script on schedule — stdout is delivered to the target. No agent, prompt, or skills.',
    cron_script_card_title: 'Script',
    cron_script_output: 'Script output',
    cron_script_path_label: 'Script path',
    cron_script_path_hint: 'Resolved under ~/.hermes/scripts/ unless an absolute path. Edit the script file on the server to change behavior.',
    cron_script_badge_title: 'Script job (no agent)',
    cron_workdir_label: 'Working directory',
    cron_view_full_output: 'View full output',
    cron_all_runs: 'All runs',
    cron_hide_runs: 'Hide runs',
    cron_no_runs_yet: '(no runs yet)',
    cron_schedule_required_example: 'Schedule is required (e.g. "0 9 * * *" or "every 1h")',
    cron_schedule_required: 'Schedule is required',
    cron_prompt_required: 'Prompt is required',
    cron_job_created: 'Job created',
    cron_duplicate: 'Duplicate',
    cron_duplicated: 'Job duplicated (paused)',
    cron_job_triggered: 'Job triggered',
    cron_job_paused: 'Job paused',
    cron_job_resumed: 'Job resumed',
    cron_job_updated: 'Job updated',
    cron_model_label: 'Model Override',
    cron_model_hint: 'Override the default model for this job.',
    cron_model_use_default: 'Default (use profile/system default)',
    cron_delete_confirm_title: 'Delete cron job',
    cron_delete_confirm_message: 'This cannot be undone.',
    cron_job_deleted: 'Job deleted',
    cron_completion_status: (name, status) => `Cron "${name}" ${status}`,
    status_failed: 'failed',
    status_completed: 'completed',
    todos_no_active: 'No active task list in this session.',
    clear_conversation_title: 'Clear conversation',
    clear_conversation_message: 'Clear all messages? This cannot be undone.',
    clear_failed: 'Clear failed: ',
    skills_no_match: 'No skills match.',
    skill_enabled: '활성화됨',
    skill_disabled: '비활성화됨',
    skill_toggle_failed: '스킬 전환 실패: ',
    linked_files: 'Linked Files',
    skill_load_failed: 'Could not load skill: ',
    skill_file_load_failed: 'Could not load file: ',
    skill_name_required: 'Skill name is required',
    skill_updated: 'Skill updated',
    skill_created: 'Skill created',
    skill_deleted: 'Skill deleted',
    skill_delete_confirm: 'Delete skill "{0}"?',
    skills_empty_title: 'Select a skill',
    skills_empty_sub: 'Pick a skill from the sidebar to view its contents, or create a new one.',
    skills_edit: 'Edit',
    skills_delete: 'Delete',
    skills_back_to: 'Back to {0}',
    tasks_empty_title: 'Select a scheduled job',
    tasks_empty_sub: 'Pick a job from the sidebar to view its details and runs, or create a new one.',
    workspaces_empty_title: 'Select a space',
    workspaces_empty_sub: 'Pick a space from the sidebar to view its files and settings, or add a new one.',
    profiles_empty_title: 'Select a profile',
    profiles_empty_sub: 'Pick an agent profile from the sidebar to view and edit its settings, or create a new one.',
    memory_notes_label: 'memory (notes)',
    memory_saved: 'Memory saved',
    my_notes: 'My Notes',
    user_profile: 'User Profile',
    external_notes_sources: '타사 노트',
    external_notes_empty: '아직 표시되는 노트 또는 지식 MCP 소스가 없습니다. Joplin, Obsidian, Notion, llm-wiki 또는 다른 노트 서버를 설정하면 여기에 표시됩니다.',
    external_notes_auto_recall_hint: '자동 세션 리콜은 변경되지 않습니다. 이 드로어는 설정된 소스와 사용 가능한 읽기/검색 도구만 보여줍니다.',
    external_notes_no_tools: '이 소스에 대해 현재 표시되는 읽기/검색 도구가 없습니다.',
    external_notes_tool_count: (count) => `${count}개의 노트 도구 사용 가능`,
    external_notes_configured_hint: '이 설정된 소스에서 도구 이름이 제공될 것으로 예상됩니다. WebUI 런타임이 노출하면 실시간 스키마가 표시됩니다.',
    external_notes_recent_ai: 'AI가 최근 사용',
    external_notes_auto: 'auto',
    external_notes_recent_ai_reason: '자동 리콜',
    external_notes_search_placeholder: '노트 검색…',
    external_notes_search_empty: '설정된 노트 소스를 검색하면 여기에 노트 미리보기가 표시됩니다.',
    source_active: 'active',
    source_configured: 'configured',
    no_notes_yet: 'No notes yet.',
    no_profile_yet: 'No profile yet.',
    agent_soul: 'Agent Soul',
    no_soul_yet: 'No soul defined yet.',
    workspace_choose_path: 'Choose workspace path',
    workspace_choose_path_meta: 'Add a validated path and switch this conversation',
    workspace_manage: 'Manage workspaces',
    workspace_manage_meta: 'Open the Spaces panel',
    workspace_use_title: 'Use in current session',
    workspace_use: 'Use',
    workspace_add_path_placeholder: 'Add workspace path (e.g. /home/user/my-project)',
    workspace_paths_validated_hint: 'Paths are validated as existing directories before saving.',

    workspace_drag_hint: '드래그하여 순서 변경',
    workspace_reorder_failed: '순서 변경 실패',
    workspace_added: 'Workspace added',
    workspace_renamed: 'Workspace renamed',
    workspace_remove_confirm_title: 'Remove workspace',
    workspace_remove_confirm_message: (path) => `Remove "${path}"?`,
    workspace_removed: 'Workspace removed',
    workspace_switch_prompt_title: 'Switch workspace',
    workspace_switch_prompt_message: 'Enter an absolute workspace path to add and switch this conversation to.',
    workspace_switch_prompt_confirm: 'Switch',
    workspace_switch_prompt_placeholder: '/Users/you/project',
    workspace_not_added: 'Workspace was not added',
    workspace_already_saved: 'Workspace already saved — choose it from the list',
    workspace_busy_switch: 'Cannot switch workspace while agent is running',
    discard_file_edits_title: 'Discard file edits?',
    discard_file_edits_message: 'Switching workspaces will discard unsaved file edits in the preview.',
    workspace_switched_to: (name) => `Switched to ${name}`,
    profiles_no_profiles: 'No profiles found.',
    profile_api_keys_configured: 'API keys configured',
    profile_gateway_running: 'Gateway running',
    profile_gateway_stopped: 'Gateway stopped',
    profile_active: 'ACTIVE',
    profile_no_configuration: 'No configuration',
    profile_skill_count: (count) => `${count} skill${count === 1 ? '' : 's'}`,
    profile_use: 'Use',
    profile_switch_title: 'Switch to this profile',
    profile_delete_title: 'Delete this profile',
    profile_default_label: '(default)',
    profile_name_placeholder: 'Profile name (lowercase, a-z 0-9 hyphens)',
    profile_clone_label: 'Clone config from active profile',
    profile_model_label: 'Model / provider',
    profile_model_hint: 'Choose from configured providers and models for this new profile.',
    profile_model_use_default: 'Use active profile default',
    profile_base_url_placeholder: 'Base URL (optional, e.g. http://localhost:11434)',
    profile_api_key_placeholder: 'API key (optional)',
    manage_profiles: 'Manage profiles',
    profiles_load_failed: 'Failed to load profiles',
    profile_switched_new_conversation: (name) => `Switched to profile: ${name} — new conversation started`,
    profile_switched: (name) => `Switched to profile: ${name}`,
    profile_name_rule: 'Lowercase letters, numbers, hyphens, underscores only',
    profile_base_url_rule: 'Base URL must start with http:// or https://',
    profile_created: (name) => `Profile created: ${name}`,
    profile_delete_confirm_title: (name) => `Delete profile "${name}"?`,
    profile_delete_confirm_message: 'All sessions, config, skills, and memory for this profile will be permanently deleted. This cannot be undone.',
    profile_deleted: (name) => `Profile deleted: ${name}`,
    active_conversation_none: 'No active conversation selected.',
    active_conversation_meta: (title, count) => `${title} · ${count} message${count === 1 ? '' : 's'}`,
    settings_unsaved_changes: 'You have unsaved changes.',
    sign_out_failed: '로그아웃 실패: ',
    disable_auth_confirm_title: '비밀번호 보호 비활성화',
    disable_auth_confirm_message: 'Anyone will be able to access this instance.',
    auth_disabled: '인증 비활성화 — 비밀번호 보호가 제거되었습니다',
    disable_auth_failed: 'Failed to disable auth: ',
    bg_error_single: (title) => `"${title}" has encountered an error`,
    bg_error_multi: (count) => `${count} sessions have encountered an error`,
    // skill form
    skill_name: 'Name',
    skill_category: 'Category',
    skill_category_placeholder: 'Optional, e.g. devops',
    skill_content: 'SKILL.md content',
    skill_content_placeholder: 'YAML frontmatter + markdown body',
    skill_rename_not_supported: 'Renaming a skill is not supported. Create a new skill and delete the old one to rename.',
    skill_metadata: 'Metadata',
    // cron form
    cron_name_label: 'Name',
    cron_name_placeholder: 'Optional',
    cron_schedule_label: 'Schedule',
    cron_schedule_hint: "Use 'every 1h' or a cron expression for recurring jobs. Bare durations like '30m' run once.",
    cron_schedule_once_warning: "Duration forms like '30m' run once and are removed after running. Use 'every 30m' to keep a recurring job.",
    cron_prompt_label: 'Prompt',
    cron_deliver_label: 'Deliver output to',
    cron_deliver_local: 'Local (save output only)',
    cron_deliver_custom: '사용자 지정 전달 대상',
    cron_profile_label: 'Profile',
    cron_profile_server_default: 'server default',
    cron_profile_server_default_hint: 'Uses the WebUI server default profile at run time. Existing jobs without a profile keep this legacy behavior.',
    cron_toast_notifications_label: '완료 토스트',
    cron_toast_notifications_hint: '이 Cron이 완료되면 토스트를 표시합니다. 꺼져 있어도 Tasks 배지와 새 실행 표시는 계속 업데이트됩니다.',
    cron_toast_notifications_enabled: '사용',
    cron_toast_notifications_disabled: '사용 안 함',
    cron_skills_label: 'Skills',
    cron_skills_placeholder: 'Add skills (optional)…',
    cron_skills_edit_hint: 'Skill list is not editable after creation.',
    // workspace form
    workspace_name_label: 'Name',
    workspace_name_placeholder: 'Optional friendly name',
    workspace_path_label: 'Path',
    workspace_path_required: 'Path is required',
    workspace_path_readonly: 'Path cannot be changed. Rename only.',
    workspace_new_title: 'New space',
    // profile form
    profile_name_label: 'Name',
    profile_base_url_label: 'Base URL',
    profile_api_key_label: 'API key',
    cmd_yolo: 'YOLO 모드 전환',
    cmd_branch: 'Fork this conversation into a new session',
    cmd_branch_usage: '/branch [name] — fork conversation (optionally with a name)',
    branch_forked: 'Forked into new session',
    branch_failed: 'Fork failed: ',
    fork_from_here: 'Fork from here',
    forked_from: 'Forked from',
    yolo_no_session: '활성 세션 없음',
    yolo_enabled: '⚡ YOLO 모드 켜짐 — 이 세션에서 승인 건너뜀',
    yolo_disabled: 'YOLO 모드 꺼짐',
    yolo_pill_label: 'YOLO',
    yolo_pill_title_active: 'YOLO 모드 활성 — 클릭하여 비활성화',
    approval_skip_all: '⚡ 이 세션에서 모두 건너뛰기',
    approval_skip_all_title: '이 세션의 모든 승인 요청 건너뛰기',
    // composer action tooltips
    composer_send: '메시지 보내기',
    composer_queue: '메시지 대기열에 추가',
    composer_interrupt: '중단하고 전송',
    composer_steer: '현재 응답 유도',
    composer_stop: '생성 중지',
    composer_disabled_clarify: '위의 명확화 요청에 응답하세요',
    composer_disabled_compression: '압축 완료 대기 중',
    composer_compression_will_queue: 'Type a message — it will queue and send after compression',
    composer_disabled_empty: '메시지를 입력하세요',
    composer_mobile_workspace: '워크스페이스',
    composer_mobile_model: '모델',
    composer_mobile_reasoning: '추론',
    composer_mobile_context: '컨텍스트',

    pdf_loading: 'PDF {0} 로드 중…',
    pdf_too_large: 'PDF가 인라인 미리보기에 너무 큼',
    pdf_no_pages: 'PDF 미리보기를 렌더링할 수 없음',
    pdf_error: 'PDF 로드 실패',
    pdf_download: 'PDF 다운로드',
    html_loading: 'HTML 미리보기 로드 중…',
    html_too_large: 'HTML이 인라인 미리보기에 너무 큼',
    html_error: 'HTML 미리보기 로드 실패',
    html_open_full: '전체 페이지 열기',
    html_sandbox_label: 'HTML 미리보기',
    media_audio_label: '오디오',
    media_svg_label: '다이어그램',
    media_video_label: '비디오',
    media_download: '다운로드',
    csv_loading: 'CSV 로딩 중',
    csv_too_large: 'CSV 파일이 너무 커서 인라인 렌더링할 수 없습니다',
    csv_no_data: 'CSV 파일에 표시할 데이터가 부족합니다',
    csv_error: 'CSV 파일을 로드하지 못했습니다',
    csv_header_note: '첫 번째 행이 테이블 헤더로 표시됩니다',
    excalidraw_loading: '다이어그램 로딩 중',
    excalidraw_too_large: 'Excalidraw 파일이 너무 커서 인라인 렌더링할 수 없습니다',
    excalidraw_invalid: '잘못된 Excalidraw 파일 형식',
    excalidraw_error: 'Excalidraw 파일을 로드하지 못했습니다',
    excalidraw_label: '다이어그램',
    excalidraw_download: '다운로드',
    excalidraw_empty: '빈 다이어그램',
    excalidraw_render_error: '다이어그램 렌더링 실패',
    excalidraw_simplified: '단순화된 SVG 미리보기 — Excalidraw 캔버스와 픽셀 동일하지 않음',
    // TTS (#499)
    tts_listen: '듣기',
    tts_not_supported: '음성 합성을 사용할 수 없습니다',
    settings_label_tts: '답변 음성 합성',
    settings_desc_tts: '도움말 메시지에 스피커 버튼 표시',
    settings_label_tts_auto_read: '답변 자동 읽기',
    settings_desc_tts_auto_read: '도움말 답변을 자동으로 읽어줌',
    // Composer voice-mode pref (#1488)
    settings_label_voice_mode: 'Hands-free voice mode button',  // TODO: translate
    settings_desc_voice_mode: 'Show the voice-mode button (audio waveform) next to the dictation mic. Lets you speak naturally — Hermes auto-sends after a pause and reads replies aloud. Requires a browser that supports both speech recognition and TTS.',
    settings_label_raw_audio: 'Send raw audio instead of transcribing',
    settings_desc_raw_audio: 'Record and send the original audio file to the agent instead of converting it to text first. The agent can then transcribe it or process the raw audio (emotion, background noise, custom STT). Like Telegram\'s voice message behavior.',
    voice_send_raw: 'Send raw audio',
    voice_raw_attached: 'Audio attached. Press Send or type more.',  // TODO: translate
    settings_label_tts_voice: '음성',
    settings_desc_tts_voice: '음성 합성 음성 선택',
    settings_label_tts_rate: '말 속도',
    settings_label_tts_pitch: '말 톤',
    settings_label_tts_engine: 'TTS 엔진',
    settings_desc_tts_engine: '음성 엔진을 선택하세요. Edge TTS는 서버를 통해 Microsoft 신경 음성을 사용합니다.',
    checkpoint_date: 'Date',  // TODO: translate
    checkpoint_diff_files_changed: (n) => `${n} file${n === 1 ? '' : 's'} changed`,  // TODO: translate
    checkpoint_diff_no_changes: 'No differences found between this checkpoint and the current workspace.',  // TODO: translate
    checkpoint_diff_title: 'Changes in checkpoint',  // TODO: translate
    checkpoint_empty: 'No checkpoints found for this workspace.',  // TODO: translate
    checkpoint_error: 'Failed to load checkpoints',  // TODO: translate
    checkpoint_files: 'Files',  // TODO: translate
    checkpoint_loading: 'Loading checkpoints…',  // TODO: translate
    checkpoint_message: 'Message',  // TODO: translate
    checkpoint_restore: 'Restore',  // TODO: translate
    checkpoint_restore_confirm_message: (ckpt) => `Restore workspace to checkpoint "${ckpt}"? This will overwrite files with the saved versions. Files added after this checkpoint will not be deleted.`,  // TODO: translate
    checkpoint_restore_confirm_title: 'Restore checkpoint?',  // TODO: translate
    checkpoint_restored: 'Checkpoint restored',  // TODO: translate
    checkpoint_title: 'Checkpoints',  // TODO: translate
    checkpoint_view_diff: 'View diff',  // TODO: translate
    insights_activity_by_day: 'Activity by Day',  // TODO: translate
    insights_activity_by_hour: 'Activity by Hour',  // TODO: translate
    insights_cost: 'Estimated Cost',  // TODO: translate
    insights_daily_tokens: '일별 토큰',
    insights_model_name: '모델',
    insights_model_sessions: '세션',
    insights_model_tokens: '토큰',
    insights_model_cost: '비용',
    insights_model_share: '비율',
    insights_no_usage_data: '아직 사용 데이터가 없습니다',
    insights_footer: 'Showing data from the last {days} days',  // TODO: translate
    insights_skill_usage_title: 'Skill Usage',  // TODO: translate
    insights_skill_usage_sub: 'Tool invocation frequency',  // TODO: translate
    insights_skill_usage_total: 'Total invocations',  // TODO: translate
    insights_skill_usage_skills_used: 'Skills used',  // TODO: translate
    insights_skill_usage_no_data: 'No skill usage data yet',  // TODO: translate
    insights_skill_usage_no_data_hint: 'Skills will appear here once used in conversations.',  // TODO: translate
    insights_skill_usage_footer: 'Counts from ~/.hermes/skills/',  // TODO: translate
    insights_skill_usage_col_skill: 'Skill',  // TODO: translate
    insights_skill_usage_col_uses: 'Uses',  // TODO: translate
    insights_skill_usage_col_views: 'Views',  // TODO: translate
    insights_skill_usage_col_share: 'Usage %',  // TODO: translate
    insights_skill_usage_col_patches: 'Patches',  // TODO: translate
    insights_input_tokens: 'Input',  // TODO: translate
    insights_messages: 'Messages',  // TODO: translate
    insights_models: 'Models',  // TODO: translate
    insights_no_cost: 'N/A',  // TODO: translate
    insights_output_tokens: 'Output',  // TODO: translate
    insights_peak_hour: 'Peak: {hour}',  // TODO: translate
    insights_sessions: 'Sessions',  // TODO: translate
    insights_title: 'Usage Analytics',  // TODO: translate
    insights_token_breakdown: 'Token Breakdown',  // TODO: translate
    insights_tokens: 'Tokens',  // TODO: translate
    insights_total: 'Total',  // TODO: translate
    settings_desc_api_redact: 'Self-hosted users can disable for transparency (not recommended for shared instances).',  // TODO: translate
    settings_label_api_redact: 'Redact sensitive data in API responses',  // TODO: translate
    voice_error: 'Voice not supported in this browser',  // TODO: translate
    voice_listening: 'Listening…',  // TODO: translate
    voice_mode_active: 'Voice mode on',  // TODO: translate
    voice_mode_off: 'Voice mode off',  // TODO: translate
    voice_speaking: 'Speaking…',  // TODO: translate
    voice_thinking: 'Thinking…',  // TODO: translate
    // Composer voice buttons (#1488)
    voice_dictate: 'Dictate',  // TODO: translate
    voice_dictate_active: 'Stop dictation',
    voice_recording_active: '녹음 중지',  // TODO: translate
    voice_mode_toggle: 'Voice mode',  // TODO: translate
    voice_mode_toggle_active: 'Exit voice mode',  // TODO: translate
    subagent_children: 'Subagent sessions',  // TODO: translate
    outline_title: '개요',
    outline_empty: '아직 질문이 없습니다.',
    outline_loading: '로딩 중…',
  },

  fr: {
    offline_title: 'Connexion perdue',
    offline_browser_detail: 'Votre navigateur signale que cet appareil est hors ligne.',
    offline_network_detail: 'Hermes est actuellement inaccessible depuis ce navigateur.',
    offline_autorefresh: 'J\'actualiserai automatiquement cette page lorsqu\'Hermès sera à nouveau joignable.',
    offline_check_now: 'Vérifiez maintenant',
    offline_checking: 'Vérification…',
    offline_stream_waiting: 'Connexion perdue. En attendant de rafraîchir…',
    _lang: 'fr',
    _label: 'Français',
    _speech: 'fr-FR',
    cancelling: 'Annulation\u2026',
    cancel_failed: 'Échec de l\'annulation :',
    mic_denied: 'Accès au microphone refusé. Vérifiez les autorisations du navigateur.',
    mic_no_speech: 'Aucune parole détectée. Essayer à nouveau.',
    mic_network: 'Reconnaissance vocale indisponible.',
    mic_error: 'Erreur de saisie vocale :',
    voice_dictate: 'Dicter',
    voice_dictate_active: 'Arrêter la dictée',
    voice_recording_active: 'Arrêter l’enregistrement',
    voice_mode_toggle: 'Mode vocal',
    voice_mode_toggle_active: 'Quitter le mode vocal',
    voice_listening: 'Écoute…',
    voice_speaking: 'Parlant…',
    voice_thinking: 'Pensée…',
    voice_error: 'Voix non prise en charge dans ce navigateur',
    voice_mode_active: 'Mode vocal activé',
    voice_mode_off: 'Mode vocal désactivé',
    session_imported: 'Session importée',
    import_failed: 'Échec de l\'importation :',
    import_invalid_json: 'JSON invalide',
    image_pasted: 'Image collée :',
    edit_message: 'Modifier le message',
    regenerate: 'Régénérer la réponse',
    copy: 'Copie',
    copied: 'Copié!',
    copy_failed: 'Échec de la copie',
    selected_text_reply: 'Répondre avec la sélection',
    selected_text_reply_title: 'Ajouter le texte sélectionné du chat comme contexte cité',
    selected_text_reply_appended: 'Texte sélectionné ajouté au compositeur',
    saved_prompts_empty: 'Aucune invite sauvegardée pour l\'instant.',
    saved_prompts_save_current: 'Sauvegarder l\'entrée actuelle comme invite',
    saved_prompts_saved: 'Invite sauvegardée',
    saved_prompts_delete: 'Supprimer l\'invite',
    saved_prompts_empty_input: 'Tapez d\'abord une invite à sauvegarder',
    diff_loading: 'Chargement des différences',
    diff_error: 'Impossible de charger le fichier de correctif',
    diff_too_large: 'Fichier de correctif trop volumineux pour être affiché en ligne',
    tree_view: 'Arbre',
    raw_view: 'Brut',
    parse_failed_note: 'l\'analyse a échoué',
    you: 'Toi',
    mcp_servers_title: 'Serveurs MCP',
    mcp_servers_desc: 'Affichez les serveurs MCP configurés dans config.yaml.',
    mcp_no_servers: 'Aucun serveur MCP configuré.',
    mcp_add_server: '+ Ajouter un serveur',
    mcp_field_name: 'Nom du serveur',
    mcp_transport_label: 'Type de transport',
    mcp_field_command: 'Commande',
    mcp_field_args: 'Arguments (séparés par des virgules)',
    mcp_field_url: 'URL',
    mcp_field_timeout: 'Délai d\'expiration (secondes)',
    mcp_save: 'Sauvegarder',
    mcp_cancel: 'Annuler',
    mcp_name_required: 'Le nom du serveur est requis.',
    mcp_url_required: 'L\'URL est requise pour le transport HTTP.',
    mcp_command_required: 'La commande est requise pour le transport stdio.',
    mcp_saved: 'Serveur MCP enregistré.',
    mcp_save_failed: 'Échec de l\'enregistrement du serveur MCP.',
    mcp_delete_confirm_title: 'Supprimer le serveur MCP',
    mcp_delete_confirm_message: 'Supprimer le serveur MCP "{0}" ? Cette action ne peut pas être annulée.',
    mcp_deleted: 'Serveur MCP supprimé.',
    mcp_delete_failed: 'Échec de la suppression du serveur MCP.',
    mcp_load_failed: 'Échec du chargement des serveurs MCP.',
    mcp_restart_hint: 'Les modifications apportées au serveur sont en lecture seule ici pour le moment. Modifiez config.yaml et redémarrez Hermes pour que les modifications prennent effet.',
    mcp_toggle_followup: 'Les contrôles d\'activation/désactivation sont intentionnellement différés jusqu\'à ce que la sémantique de rechargement MCP soit explicite.',
    mcp_status_active: 'Actif',
    mcp_status_configured: 'Configuré',
    mcp_status_disabled: 'Désactivé',
    mcp_status_invalid_config: 'Configuration invalide',
    mcp_status_unknown: 'Inconnu',
    mcp_tool_count: '{0} outils',
    mcp_enabled_yes: 'Activé',
    mcp_enabled_no: 'Désactivé',
    mcp_enable_server: 'Enable this MCP server',
    mcp_disable_server: 'Disable this MCP server',
    mcp_enabled_toast: (name) => `MCP server "${name}" enabled.`,
    mcp_disabled_toast: (name) => `MCP server "${name}" disabled.`,
    mcp_toggle_failed: 'Failed to update MCP server.',
    mcp_tools_title: 'Outils MCP',
    mcp_tools_desc: 'Recherchez des outils connus sur les serveurs MCP actifs.',
    mcp_tools_search_placeholder: 'Outils de recherche par nom, serveur ou description…',
    mcp_tools_no_tools: 'Aucun outil MCP n\'est disponible dans l\'inventaire d\'exécution actif.',
    mcp_tools_no_matches: 'Aucun outil MCP ne correspond à votre recherche.',
    mcp_tools_load_failed: 'Échec du chargement des outils MCP.',
    mcp_tools_schema_empty: 'Aucun paramètre de schéma.',
    mcp_tools_runtime_note: 'L\'inventaire des outils utilise uniquement les données d\'exécution MCP actives déjà connues ; le WebUI ne démarre pas et ne sonde pas les serveurs.',
    mcp_tools_summary_no_matches: (query,total) => `No MCP tools matching “${query}” (${total} total MCP tools).`,
    mcp_tools_summary_none: 'No MCP tools to show.',
    mcp_tools_summary_matching: (query) => ` matching “${query}”`,
    mcp_tools_summary_total_note: (total) => ` (${total} total MCP tools)`,
    mcp_tools_summary_showing: (start,end,filtered,searchNote,totalNote,page,pages) => `Showing ${start}-${end} of ${filtered} MCP tools${searchNote}${totalNote}. Page ${page} of ${pages}.`,
    mcp_tools_page_size_prefix: 'Show',
    mcp_tools_page_size_suffix: 'per page',
    mcp_tools_per_page_aria: 'MCP tools per page',
    mcp_tools_inactive_configured_servers: (servers) => `Configured but inactive in this WebUI runtime: ${servers}.`,
    mcp_tools_pagination_label: 'MCP tools pagination',
    mcp_tools_previous_page: '‹ Prev',
    mcp_tools_previous_page_aria: 'Previous MCP tools page',
    mcp_tools_next_page: 'Next ›',
    mcp_tools_next_page_aria: 'Next MCP tools page',
    pdf_loading: 'Chargement du PDF {0}…',
    pdf_too_large: 'PDF trop volumineux pour un aperçu en ligne',
    pdf_no_pages: 'Le PDF n\'a pas de pages',
    pdf_error: 'Échec de l\'affichage de l\'aperçu PDF',
    pdf_download: 'Télécharger le PDF',
    html_loading: 'Chargement de l\'aperçu HTML…',
    html_too_large: 'HTML trop volumineux pour l\'aperçu en ligne',
    html_error: 'Échec de l\'affichage de l\'aperçu HTML',
    html_open_full: 'Ouvrir la page entière',
    html_sandbox_label: 'Aperçu HTML (en bac à sable)',
    thinking: 'Pensée',
    expand_all: 'Tout développer',
    collapse_all: 'Tout réduire',
    edit_failed: 'Échec de la modification :',
    regen_failed: 'Échec de la régénération :',
    reconnect_active: 'Une réponse est toujours en cours de génération. Recharger quand vous êtes prêt ?',
    reconnect_finished: 'Une réponse était en cours lors de votre dernier départ. Les messages ont peut-être été mis à jour.',
    approval_heading: 'Approbation requise',
    approval_desc_prefix: 'Commande dangereuse détectée',
    approval_btn_once: 'Autoriser une fois',
    approval_btn_once_title: 'Autoriser cette commande (Entrée)',
    approval_btn_session: 'Autoriser la session',
    approval_btn_session_title: 'Autoriser cette session de conversation',
    approval_btn_always: 'Toujours autoriser',
    approval_btn_always_title: 'Toujours autoriser ce modèle de commande',
    approval_btn_deny: 'Refuser',
    approval_btn_deny_title: 'Refuser - n\'exécutez pas cette commande',
    approval_responding: 'Répondre\u2026',
    clarify_heading: 'Des éclaircissements sont nécessaires',
    clarify_hint: 'Choisissez un choix ou saisissez votre propre réponse ci-dessous.',
    clarify_other: 'Autre',
    clarify_send: 'Envoyer',
    clarify_input_placeholder: 'Tapez votre réponse…',
    clarify_responding: 'Répondre\u2026',
    session_attention_approval: (n) => n === 1 ? 'Approbation' : `${n} approbations`,
    session_attention_clarify: (n) => n === 1 ? 'Question' : `${n} questions`,
    session_attention_generic: (n) => n === 1 ? 'Attention' : `${n} éléments`,
    session_attention_approval_title: 'En attente d’une décision d’autorisation',
    session_attention_clarify_title: 'En attente de votre réponse',
    session_attention_generic_title: 'En attente d’une action utilisateur',
    untitled: 'Sans titre',
    load_older_messages: '↑ Faites défiler vers le haut ou cliquez pour charger les anciens messages',
    session_jump_start: 'Commencer',
    session_jump_start_label: 'Aller au début de la session',
    session_jump_end: 'Fin',
    session_jump_end_label: 'Aller à la fin de la session',
    session_new_message: 'Nouveau message',
    session_new_message_label: 'Nouveau message disponible, aller à la fin',
    jump_to_question: 'à la réponse',
    jump_to_question_label: 'Aller au début de cette réponse',
    queued_label: 'Envoie après réponse',
    queued_cancel: 'Annuler le message en file d\'attente',
    model_unavailable: '(indisponible)',
    model_unavailable_title: 'Ce modèle ne figure plus dans votre liste de fournisseurs actuelle',
    provider_mismatch_label: 'Inadéquation des fournisseurs',
    gateway_auth_label: 'Échec de l’authentification Gateway',
    model_not_found_label: 'Modèle introuvable',
    model_custom_label: 'ID de modèle personnalisé',
    model_custom_placeholder: 'par ex. openai/gpt-5.4',
    model_search_placeholder: 'Rechercher des modèles…',
    model_search_no_results: 'Aucun modèle trouvé',
    model_group_configured: 'Configuré',
    ws_search_placeholder: 'Rechercher des espaces de travail…',
    ws_no_results: 'Aucun espace de travail trouvé',
    workspace_new_worktree_conversation: 'Nouvelle conversation dans l\'arbre de travail',
    workspace_new_worktree_conversation_meta: 'Créez un arbre de travail git isolé pour cet espace de travail.',
    workspace_worktree_created: 'Conversation Worktree créée',
    workspace_worktree_failed: 'La création de l\'arbre de travail a échoué :',
    session_worktree_badge: 'Arbre de travail',
    model_scope_advisory: 'S\'applique à cette conversation à partir de votre prochain message.',
    model_scope_toast: 'S\'applique à cette conversation à partir de votre prochain message.',
    cmd_clear: 'Messages de conversation clairs',
    cmd_help: 'Show available slash commands',
    cmd_compress: 'Compresser manuellement le contexte de conversation (utilisation : /compress [thème principal])',
    ctx_compress_hint: 'Compresser le contexte pour libérer de l\'espace →',
    ctx_compress_action: '⚠ Compressez maintenant pour libérer le contexte',
    cmd_compact_alias: 'Alias ​​hérité pour /compress',
    cmd_model: 'Changer de modèle (par exemple /model gpt-4o)',
    cmd_workspace: 'Changer d\'espace de travail par nom',
    cmd_terminal: 'Ouvrez le terminal de l\'espace de travail',
    cmd_new: 'Démarrer une nouvelle session de discussion',
    cmd_usage: 'Activer/désactiver l\'affichage de l\'utilisation du jeton',
    cmd_theme: 'Changer d\'apparence (thème : system/dark/light, skin : default/ares/mono/graphite/slate/poseidon/sisyphus/charizard/sienna/catppuccin/nous/geist-contrast/zeus/verdigris)',
    cmd_personality: 'Personnalité de l\'agent de commutation',
    cmd_skills: 'Lister les compétences Hermès disponibles',
    cmd_use: 'Forcer une compétence pour le prochain message',
    available_commands: 'Commandes disponibles :',
    type_slash: 'Tapez / pour voir les commandes',
    conversation_cleared: 'Conversation effacée',
    command_label: 'Commande',
    context_compaction_label: 'Compactage du contexte',
    preserved_task_list_label: 'Liste de tâches préservée',
    reference_only_label: 'Référence seulement',
    model_usage: 'Utilisation : /model <nom>',
    no_model_match: 'Aucun modèle correspondant "',
    model_did_you_mean: (m) => ` — vouliez-vous dire "${m}" ?`,
    switched_to: 'Passé à',
    workspace_usage: 'Utilisation : /espace de travail <nom>',
    no_workspace_match: 'Aucun espace de travail correspondant "',
    switched_workspace: 'Passé à l\'espace de travail :',
    workspace_switch_failed: 'Échec du changement d\'espace de travail :',
    new_session: 'Nouvelle session créée',
    new_session_creating: 'Création d’une nouvelle conversation…',
    compressing: 'Demande de compression de contexte...',
    compress_running_label: 'Compression',
    compress_complete_label: 'Compression terminée',
    auto_compress_label: 'Compression automatique',
    compress_failed_label: 'Échec de la compression',
    focus_label: 'Se concentrer',
    token_usage_on: 'Utilisation du jeton sur',
    token_usage_off: 'Utilisation des jetons désactivée',
    usage_cache_hit_detail: 'Cache : {0}% de réussite ({1} lecture / {2} écriture)',
    usage_cached_percent: '{0}% en cache',
    theme_usage: 'Utilisation : /theme ',
    theme_set: 'Thème:',
    no_active_session: 'Aucune session active',
    provider_mismatch_warning: (m,p)=>`«\u00a0${m}\u00a0» pourrait ne pas fonctionner avec votre fournisseur configuré (${p}). Envoyez quand même, ou exécutez \`hermes model\` dans votre terminal pour changer.`,
    cmd_queue: 'Mettre un message en file d\'attente pour le prochain tour',
    cmd_goal: 'Définir ou inspecter un objectif persistant',
    goal_evaluating_progress: 'Évaluer la progression des objectifs…',
    goal_working_toward: 'Travailler vers l’objectif…',
    goal_continuing_toast: 'Continuer vers l’objectif…',
    goal_status_none: 'Aucun objectif actif. Définissez-en un avec /goal <text>.',
    goal_cleared: 'But dégagé.',
    goal_no_goal: 'Aucun objectif actif.',
    cmd_interrupt: 'Annuler le tour en cours et envoyer un nouveau message',
    cmd_steer: 'Injecter une correction à mi-tour sans interrompre l\'agent',
    cmd_queue_no_msg: 'Utilisation : /queue <message>',
    cmd_queue_not_busy: 'Aucune tâche active - envoyez simplement normalement',
    cmd_queue_confirm: 'Message en file d\'attente',
    cmd_interrupt_no_msg: 'Utilisation : /interruption <message>',
    cmd_interrupt_confirm: 'Interrompu — envoi d\'un nouveau message',
    cmd_steer_no_msg: 'Utilisation : /steer <message>',
    cmd_steer_fallback: 'Steer indisponible – mis en file d’attente pour le prochain tour à la place',
    cmd_steer_delivered: 'Steer livré - l\'agent le verra sur son prochain résultat d\'outil',
    steer_leftover_queued: 'Bœuf en attente pour le prochain tour',
    busy_steer_fallback: 'Steer indisponible – en file d’attente pour le prochain tour',
    busy_interrupt_confirm: 'Interrompu — envoi d\'un nouveau message',
    settings_label_busy_input_mode: 'Mode de saisie occupé',
    settings_desc_busy_input_mode: 'Contrôle ce qui se passe lorsque vous envoyez un message pendant l\'exécution de l\'agent. La file d\'attente attend ; L\'interruption s\'annule et recommence ; Steer injecte une correction à mi-tour sans interrompre (revient en file d\'attente lorsque l\'agent ou le flux est indisponible).',
    settings_label_fade_text_effect: 'Effet de fondu du texte',
    settings_desc_fade_text_effect: 'Affiche progressivement les nouveaux mots diffusés pendant que l’assistant répond. Similaire à OpenWebUI ; désactivé par défaut pour des performances maximales.',
    settings_busy_input_mode_queue: 'Suivi de file d\'attente',
    settings_busy_input_mode_interrupt: 'Interrompre le tour en cours',
    settings_busy_input_mode_steer: 'Direction (correction à mi-virage)',
    status_profile: 'Profil',
    status_hermes_home: 'Maison Hermès',
    status_started: 'Commencé',
    status_updated: 'Mis à jour',
    status_tokens: 'Jetons',
    status_ephemeral: 'Instantané éphémère – non enregistré dans l’historique des transcriptions.',
    status_no_tokens: 'Aucun jeton utilisé',
    status_unknown: 'Inconnu',
    usage_personality_none: 'aucun',
    session_toolsets: 'Ensembles d\'outils de session',
    session_toolsets_desc: 'Restreindre les outils disponibles pour cette session (vide = utiliser la configuration globale)',
    session_toolsets_global: 'Global (par défaut)',
    session_toolsets_custom: 'Coutume',
    session_toolsets_placeholder: 'outil1, outil2, …',
    session_toolsets_apply: 'Appliquer',
    session_toolsets_clear: 'Effacer (utiliser global)',
    session_toolsets_applied: 'Ensembles d\'outils mis à jour',
    session_toolsets_cleared: 'Ensembles d\'outils effacés - à l\'aide de la configuration globale',
    session_toolsets_failed: 'Échec de la mise à jour des ensembles d\'outils :',
    no_personalities: 'Aucune personnalité trouvée (ajoutez-les à ~/.hermes/personalities/)',
    available_personalities: 'Personnalités disponibles :',
    personality_switch_hint: '\\n\\nUtilisez `/personality <name>` pour changer, ou `/personality none` pour effacer.',
    personalities_load_failed: 'Échec du chargement des personnalités',
    personality_cleared: 'Personnalité effacée',
    personality_set: 'Personnalité:',
    failed_colon: 'Échoué:',
    no_workspace: 'Pas d\'espace de travail',
    terminal_open_title: 'Terminal d\'espace de travail ouvert',
    terminal_no_workspace_title: 'Sélectionnez un espace de travail pour ouvrir le terminal',
    terminal_title: 'Terminal',
    terminal_clear: 'Clair',
    terminal_copy_output: 'Copier la sortie',
    terminal_restart: 'Redémarrage',
    terminal_collapse: 'Effondrement',
    terminal_expand: 'Développer',
    terminal_close: 'Fermer',
    terminal_input_placeholder: 'Exécutez une commande...',
    terminal_start_failed: 'Échec du démarrage du terminal :',
    terminal_input_failed: 'L\'entrée du terminal a échoué :',
    terminal_copy_failed: 'Échec de la copie :',
    terminal_error: 'Erreur de terminal',
    terminal_remote_backend_unsupported: 'Le terminal intégré est uniquement pris en charge avec des backends de terminal locaux.',
    workspace_empty_no_path: 'Aucun espace de travail sélectionné. Définissez un espace de travail dans Paramètres \u2192 Espace de travail pour parcourir les fichiers.',
    workspace_empty_dir: 'Cet espace de travail est vide.',
    workspace_show_hidden_files: 'Afficher les fichiers cachés',
    workspace_show_hidden_files_desc: 'Incluez .DS_Store, .git, node_modules et d\'autres fichiers cachés/système dans l\'arborescence des fichiers.',
    workspace_hidden_files_visible: 'caché visible',
    workspace_hidden_files_visible_title: 'Les fichiers cachés sont visibles – cliquez pour les options',
    workspace_options: 'Options de l\'espace de travail',
    dialog_confirm_title: 'Confirmer l\'action',
    dialog_prompt_title: 'Entrez une valeur',
    dialog_confirm_btn: 'Confirmer',
    unsaved_confirm: 'Vous avez des modifications non enregistrées dans l\'aperçu. Supprimer et naviguer ?',
    discard: 'Jeter',
    save: 'Sauvegarder',
    edit: 'Modifier',
    clear: 'Clair',
    create: 'Créer',
    remove: 'Retirer',
    save_title: 'Enregistrer les modifications',
    edit_title: 'Modifier ce fichier',
    saved: 'Enregistré',
    save_failed: 'Échec de l\'enregistrement :',
    image_load_failed: 'Impossible de charger l\'image',
    file_open_failed: 'Impossible d\'ouvrir le fichier',
    double_click_rename: 'Double-cliquez pour renommer',
    session_rename_failed_no_row: 'Could not start rename — row not found.',
    renamed_to: 'Renommé en',
    rename_failed: 'Échec du changement de nom :',
    moved_to: 'Déplacé vers ',
    move_failed: 'Échec du déplacement : ',
    delete_title: 'Supprimer',
    rename_title: 'Rebaptiser',
    rename_prompt: 'Nouveau nom :',
    deleted: 'Supprimé',
    delete_failed: 'Échec de la suppression :',
    reveal_in_finder: 'Révéler dans le gestionnaire de fichiers',
    reveal_failed: 'Échec de la révélation :',
    copy_file_path: 'Copier le chemin du fichier',
    download_folder: 'Download Folder', // TODO: translate
    path_copied: 'Chemin du fichier copié dans le presse-papiers',
    path_copy_failed: 'Échec de la copie du chemin :',
    session_rename: 'Renommer la conversation',
    session_rename_desc: 'Modifier le titre de cette conversation',
    session_title_regenerate: 'Régénérer le titre',
    session_title_regenerate_desc: 'Demander à Hermes de générer un nouveau titre à partir de la conversation',
    session_title_regenerating: 'Régénération du titre…',
    session_title_regenerated: (title) => `Titre régénéré : ${title}`,
    session_title_regenerate_failed: 'Échec de la régénération du titre : ',
    session_copy_link: 'Copier le lien de conversation',
    session_copy_link_desc: 'Copier un lien direct vers cette conversation',
    session_link_copied: 'Lien de conversation copié dans le presse-papiers',
    session_link_copy_failed: 'Impossible de copier le lien de conversation : ',
    new_file_prompt: 'Nouveau nom de fichier (par exemple notes.md) :',
    new_file: 'Nouveau fichier',
    new_folder: 'Nouveau dossier',
    workspace_root: 'racine de l\'espace de travail',
    new_file_prompt_title: 'Nouveau nom de fichier dans {0} :',
    new_folder_prompt_title: 'Nouveau nom de dossier dans {0} :',
    project_name_prompt: 'Nom du projet :',
    created: 'Créé',
    create_failed: 'Échec de la création :',
    new_folder_prompt: 'Nouveau nom de dossier :',
    folder_created: 'Dossier créé',
    folder_create_failed: 'Échec de la création du dossier :',
    remove_title: 'Retirer',
    empty_dir: '(vide)',
    upload_failed: 'Échec du téléchargement :',
    uploading: 'Téléversement…',
    uploaded: 'Téléversé',
    session_pin: 'Épingler la conversation',
    session_unpin: 'Désépingler la conversation',
    session_pin_desc: 'Gardez cette conversation en haut',
    session_unpin_desc: 'Supprimer de l\'épinglé',
    session_pin_failed: 'Échec de la broche :',
    session_move_project: 'Passer au projet',
    session_move_project_desc_has: 'Changer le projet pour cette conversation',
    session_move_project_desc_none: 'Attribuer un projet à cette conversation',
    session_archive: 'Archiver une conversation',
    session_hide_external: 'Masquer de la liste',
    session_restore: 'Restaurer la conversation',
    session_archive_desc: 'Masquer cette conversation jusqu\'à ce que l\'archive soit affichée',
    session_archive_worktree_desc: 'Cachez cette conversation ; garder son arbre de travail sur le disque',
    session_hide_external_desc: 'Masquer cette session importée du WebUI sans supprimer l\'historique d\'origine.',
    session_restore_desc: 'Ramenez cette conversation dans la liste principale',
    session_archived: 'Séance archivée',
    session_archived_worktree: 'Séance archivée. Worktree reste sur le disque.',
    session_hidden: 'Session masquée de la liste',
    session_restored: 'Session restaurée',
    session_archive_failed: 'Échec de l\'archivage :',
    session_duplicate: 'Conversation en double',
    session_duplicate_desc: 'Créer une copie avec le même espace de travail et le même modèle',
    session_duplicated: 'Session dupliquée',
    session_duplicate_failed: 'Échec de la duplication :',
    session_stop_response: 'Arrêter la réponse',
    session_stop_response_desc: 'Annuler la réponse en cours pour cette conversation',
    session_delete: 'Supprimer la conversation',
    session_delete_desc: 'Supprimer définitivement cette conversation',
    session_delete_confirm: 'Supprimer cette conversation ?',
    session_delete_worktree_desc: 'Supprimez uniquement la conversation WebUI ; garder l\'arbre de travail sur le disque',
    session_deleted: 'Conversation supprimée',
    session_deleted_worktree: 'Conversation supprimée. Worktree reste sur le disque.',
    session_worktree_remove: 'Supprimer le worktree',
    session_worktree_remove_desc: (path) => `Supprimer le git worktree à ${path} du disque`,
    session_worktree_remove_confirm: (path) => `Supprimer le git worktree du disque ?\n\nChemin : ${path}\n\nTout le répertoire worktree sera supprimé. Les données de session restent dans WebUI.`,
    session_worktree_remove_not_exists: (path) => `Le worktree à ${path} n'existe plus sur le disque.`,
    session_worktree_remove_confirm_label: 'Supprimer',
    session_worktree_removed: 'Worktree supprimé.',
    session_worktree_remove_failed: 'Échec de la suppression du worktree : ',
    session_worktree_remove_status_failed: 'Échec de la lecture du statut du worktree : ',
    session_worktree_remove_locked_by_stream: 'Impossible de supprimer — une session de streaming active utilise ce worktree.',
    session_worktree_remove_locked_by_terminal: 'Impossible de supprimer — une session de terminal active utilise ce worktree.',
    session_worktree_remove_unsafe_blocked: 'Résolvez les modifications locales ou les commits non poussés avant de supprimer ce worktree.',
    session_worktree_remove_dirty_warning: 'ATTENTION : Ce worktree a des modifications non validées qui seront perdues.',
    session_worktree_remove_untracked_warning: (count) => `${count} fichier(s) non suivi(s) seront définitivement supprimés.`,
    session_worktree_remove_ahead_warning: (ahead) => `${ahead} commit(s) non poussé(s) seront perdus.`,
    session_select_mode: 'Sélectionner',
    session_select_mode_desc: 'Sélectionnez les conversations à gérer par lots',
    session_select_all: 'Tout sélectionner',
    session_deselect_all: 'Tout désélectionner',
    session_selected_count: '{0} sélectionné',
    session_batch_archive: 'Archive',
    session_batch_delete: 'Supprimer',
    session_batch_move: 'Passer au projet',
    session_batch_delete_confirm: 'Supprimer {0} conversations ?',
    session_batch_archive_confirm: 'Archiver {0} conversations ?',
    session_batch_delete_worktree_confirm: 'Supprimer {0} conversations ? {1} conversations basées sur Worktree laisseront leurs répertoires Worktree sur le disque.',
    session_batch_archive_worktree_confirm: 'Archiver {0} conversations ? {1} conversations basées sur un arbre de travail conserveront leurs répertoires d\'arbre de travail sur le disque.',
    session_no_selection: 'Aucune conversation sélectionnée',
    settings_heading_title: 'Centre de contrôle',
    settings_heading_subtitle: 'Préférences, outils de conversation et contrôles système.',
    settings_section_conversation_title: 'Conversation',
    settings_section_appearance_title: 'Apparence',
    settings_section_appearance_meta: 'Thème, couleurs d\'accent et style visuel.',
    settings_section_preferences_title: 'Préférences',
    settings_section_preferences_meta: 'Paramètres par défaut et comportement de l\'interface utilisateur pour Hermes Web UI.',
    settings_section_system_title: 'Système',
    settings_section_system_meta: 'Version de l\'instance et contrôles d\'accès.',
    settings_check_now: 'Vérifiez maintenant',
    settings_checking: 'Vérification\u2026',
    settings_up_to_date: 'À jour \u2713',
    settings_updates_available: '{count} mises à jour disponibles',
    settings_updates_disabled: 'Vérifications de mise à jour désactivées',
    settings_update_check_failed: 'La vérification de la mise à jour a échoué',
    settings_label_workspace_panel_open: 'Garder le panneau de l\'espace de travail ouvert par défaut',
    settings_desc_workspace_panel_open: 'Lorsqu\'il est activé, le panneau de l\'espace de travail/navigateur de fichiers s\'ouvre automatiquement à chaque nouvelle session. Vous pouvez toujours le fermer manuellement à tout moment.',
    settings_label_session_jump_buttons: 'Afficher les boutons de saut de session',
    settings_desc_session_jump_buttons: 'Affichez les boutons flottants de début et de fin lors de la lecture de longs historiques de session.',
    settings_label_terminal_auto_expand: 'Développer automatiquement le terminal en cas de sortie',
    settings_desc_terminal_auto_expand: 'Développer automatiquement le panneau de terminal réduit lorsqu\'une commande en cours d\'exécution émet une nouvelle sortie.',
    settings_label_session_endless_scroll: 'Charger les anciens messages en faisant défiler vers le haut',
    settings_desc_session_endless_scroll: 'Lorsqu\'ils sont activés, les anciens messages se chargent automatiquement lorsque vous faites défiler vers le haut. Lorsqu\'il est désactivé, utilisez le bouton des messages plus anciens.',
    settings_label_auto_scroll_follow: 'Suivre automatiquement le nouveau contenu',
    settings_desc_auto_scroll_follow: 'Lorsque cette option est activée, la vue défile vers le bas à mesure que de nouveaux jetons arrivent. Lorsqu\'elle est désactivée, vous contrôlez la position de défilement.',
    settings_label_worklog_details_expanded_default: 'Open Worklog details automatically',
    settings_desc_worklog_details_expanded_default: 'When enabled, new Worklog details start expanded so tool, thinking, and progress cards are visible without an extra click. When off, Worklog details stay folded by default; per-turn manual collapse/expand choices still win.',
    settings_label_chat_activity_display_mode: 'Activity display',
    settings_desc_chat_activity_display_mode: 'Compact Worklog groups supporting activity into a quiet summary. Transparent Stream keeps each thinking/tool event as its own chronological expandable row.',
    first_token_time: 'Time to first token',
    done: 'Done',
    settings_option_compact_worklog: 'Compact Worklog',
    settings_option_transparent_stream: 'Transparent Stream',

    settings_label_tab_visibility: 'Onglets de la barre latérale',
    settings_desc_tab_visibility: 'Choisissez quels onglets apparaissent dans la barre latérale et le rail. Chat et Paramètres sont toujours visibles.',
    open_in_browser: 'Ouvrir dans le navigateur',
    settings_dropdown_conversation: 'Conversation',
    settings_dropdown_appearance: 'Apparence',
    settings_dropdown_preferences: 'Préférences',
    settings_dropdown_providers: 'Fournisseurs',
    settings_dropdown_system: 'Système',
    settings_tab_conversation: 'Conversation',
    settings_tab_appearance: 'Apparence',
    settings_tab_preferences: 'Préférences',
    settings_tab_plugins: 'Plugins',
    settings_plugins_title: 'Plugins',  // TODO: translate
    plugins_enable_toggle: 'Activer',
    settings_plugins_meta: 'View installed Hermes plugins and the lifecycle hooks they register. This panel is read-only.',  // TODO: translate
    settings_plugins_empty: 'No Hermes plugins are currently visible. Install or enable plugins from the Hermes CLI/config to see them here.',  // TODO: translate
    plugins_unnamed: 'Unnamed plugin',  // TODO: translate
    plugins_no_description: 'No description provided.',  // TODO: translate
    plugins_no_hooks: 'No registered lifecycle hooks',  // TODO: translate
    plugins_registered_hooks: 'Registered hooks',  // TODO: translate
    plugins_enabled: 'Enabled',  // TODO: translate
    plugins_disabled: 'Disabled',  // TODO: translate
    plugins_active_provider: 'Active (provider)',  // TODO: translate
    plugins_provider_no_hooks: 'Provider plugin — no agent-visibility hooks',  // TODO: translate
    plugins_load_failed: 'Failed to load plugins: ',  // TODO: translate
    settings_tab_system: 'Système',
    settings_tab_help: 'Help',
    settings_help_meta: 'Resources and support for Hermes WebUI.',
    settings_help_docs_label: 'Documentation',
    settings_help_docs_desc: 'Guides, configuration reference, and the full Hermes WebUI README.',
    settings_help_docs_link: 'Open Documentation',
    settings_help_issue_label: 'Having an issue?',
    settings_help_issue_desc: 'Search existing reports or open a new one on GitHub.',
    settings_help_issue_link: 'Open GitHub Issues',
    settings_title: 'Paramètres',
    settings_save_btn: 'Enregistrer les paramètres',
    settings_label_model: 'Modèle par défaut',
    settings_desc_model: 'Utilisé pour les nouvelles conversations. Les conversations existantes conservent leur modèle sélectionné.',
    settings_label_auxiliary_models: 'Modèles auxiliaires',
    settings_desc_auxiliary_models: 'Routage des tâches secondaires : vision, compression, génération de titres, etc. « Auto » utilise le modèle de chat principal.',
    settings_btn_reset_aux_models: 'Tout réinitialiser à auto',
    settings_btn_apply_aux_models: 'Appliquer les modifications',
    settings_aux_provider_auto: 'utiliser le modèle principal',
    settings_aux_model_auto: 'auto (utiliser la valeur par défaut du fournisseur)',
    settings_aux_model_custom: 'Modèle personnalisé…',
    settings_aux_model_custom_prompt: 'Entrez l\u2019ID du modèle :',
    settings_aux_loading: 'Chargement des modèles auxiliaires…',
    settings_aux_load_failed: 'Impossible de charger les paramètres des modèles auxiliaires. Vérifiez que l\u2019API de l\u2019agent est disponible.',
    settings_aux_reset_confirm_title: 'Réinitialiser les modèles auxiliaires ?',
    settings_aux_reset_confirm_msg: 'Cela définira toutes les tâches auxiliaires sur auto (utiliser le modèle principal).',
    settings_aux_reset_done: 'Modèles auxiliaires réinitialisés à auto',
    settings_aux_save_failed: 'Échec de la sauvegarde du modèle auxiliaire',
    settings_aux_saved: 'Modèles auxiliaires mis à jour',
    settings_aux_no_changes: 'Aucune modification à appliquer',
    settings_label_send_key: 'Envoyer la clé',
    settings_label_theme: 'Thème',
    settings_label_skin: 'Peau',
    settings_label_font_size: 'Taille de la police',
    font_size_small: 'Petit',
    font_size_default: 'Défaut',
    font_size_large: 'Grand',
    font_size_xlarge: 'Très grand',
    settings_autosave_saving: 'Économie…',
    settings_autosave_saved: 'Enregistré',
    settings_autosave_failed: 'Échec de l\'enregistrement',
    settings_autosave_retry: 'Réessayer',
    settings_label_language: 'Langue',
    settings_label_quota_chip: 'Afficher la pastille de quota du fournisseur dans le compositeur',
    settings_desc_quota_chip: "Affiche un indicateur ambiant de quota restant (par ex. solde de crédit OpenRouter) dans le pied du compositeur. Désactivé par défaut. Visible uniquement sur les écrans larges (≥1400px) lorsqu'activé, pour garder le compositeur dégagé sur les ordinateurs portables et les bureaux standard.",
    settings_label_conversation_outline: 'Afficher le plan de conversation',
    settings_desc_conversation_outline: "Affiche une liste de saut réservée au bureau pour les questions utilisateur de la conversation actuelle. Désactivé par défaut.",
    settings_label_hide_suggestions: 'Hide new-chat suggestions',
    settings_desc_hide_suggestions: 'Hide the three default suggestion buttons on the empty new-chat screen to avoid accidental taps.',
    settings_label_token_usage: 'Afficher l\'utilisation du jeton',
    settings_label_token_speed: 'Afficher la vitesse des jetons (TPS)',
    settings_desc_token_speed: 'Affiche les jetons par seconde dans les en-têtes des messages de l\'assistant pendant la diffusion en continu et après la fin d\'une réponse. Désactivé par défaut.',
    settings_label_sidebar_density: 'Densité de la barre latérale',
    cmd_reasoning: 'Basculez la visibilité de la réflexion (afficher/masquer), définir le niveau d\'effort ou vérifier l\'état actuel',
    settings_label_external_sessions: 'Afficher les sessions non-WebUI',
    settings_label_cron_sessions: 'Show cron sessions',
    settings_label_previous_messaging_sessions: 'Afficher les sessions de messagerie précédentes',
    settings_label_sync_insights: 'Synchroniser avec les insights',
    settings_label_check_updates: 'Vérifier les mises à jour',
    settings_label_ignore_agent_updates: 'Ignore Agent updates',
    settings_label_whats_new_summary: "Summarize What's New with AI",
    settings_label_bot_name: 'Nom par défaut de l\'assistant',
    settings_label_password: 'Mot de passe d\'accès',
    settings_label_pinned_limit: 'Limite de conversations épinglées',
    settings_desc_pinned_limit: 'Nombre maximum de conversations actives pouvant être épinglées dans la barre latérale. Par défaut 3.',
    settings_label_dashboard_mode: 'Tableau de bord officiel Hermes',
    settings_desc_dashboard_mode: 'Afficher un lien dans la barre de navigation lorsque le tableau de bord officiel hermes est accessible. Les URL de proxy inverse public sont stockées uniquement comme liens dans le navigateur et ne sont jamais sondées par le serveur.',
    settings_dashboard_mode_auto: 'Détection automatique',
    settings_dashboard_mode_always: 'Toujours afficher',
    settings_dashboard_mode_never: 'Ne jamais afficher',
    settings_dashboard_save: 'Enregistrer les paramètres du lien du tableau de bord',
    settings_label_gateway_status: 'État de la passerelle',
    settings_desc_gateway_status: 'État de la passerelle Hermes (Telegram, Discord, Slack, etc.)',
    gateway_not_configured: 'Passerelle non configurée',
    gateway_metadata_stale: 'Métadonnées de la passerelle obsolètes',
    gateway_endpoint_unreachable: 'Point de terminaison de la passerelle inaccessible',
    gateway_not_running: 'Passerelle non active',
    gateway_running_label: 'En cours',
    gateway_last_active: 'Dernière activité : ',
    gateway_session_count: (n) => `${n} ${n === 1 ? 'session' : 'sessions'}`,
    gateway_load_failed: 'Échec du chargement de l\'état de la passerelle',
    settings_saved: 'Paramètres enregistrés',
    settings_save_failed: 'Échec de l\'enregistrement :',
    settings_load_failed: 'Échec du chargement des paramètres :',
    settings_saved_pw: 'Paramètres enregistrés : protection par mot de passe activée et ce navigateur reste connecté',
    settings_saved_pw_updated: 'Paramètres enregistrés – mot de passe mis à jour',
    login_title: 'Se connecter',
    login_subtitle: 'Entrez votre mot de passe pour continuer',
    login_placeholder: 'Mot de passe',
    login_btn: 'Se connecter',
    login_invalid_pw: 'Mot de passe invalide',
    login_conn_failed: 'La connexion a échoué',
    dialog_confirm_title: 'Confirmer l\'action',
    dialog_prompt_title: 'Entrez une valeur',
    dialog_confirm_btn: 'Confirmer',
    discard: 'Jeter',
    clear: 'Clair',
    create: 'Créer',
    remove: 'Retirer',
    project_name_prompt: 'Nom du projet :',
    tab_chat: 'Chat',
    tab_tasks: 'Tâches',
    tab_skills: 'Compétences',
    tab_memory: 'Mémoire',
    tab_workspaces: 'Espaces',
    tab_profiles: 'Profils',
    tab_kanban: 'Kanban',
    kanban_board: 'Conseil',
    kanban_visible_tasks: '{0} tâches visibles',
    kanban_search_tasks: 'Tâches de recherche',
    kanban_all_assignees: 'Tous les assignés',
    kanban_all_tenants: 'Tous les locataires',
    kanban_include_archived: 'Inclure archivé',
    kanban_no_matching_tasks: 'Aucune tâche correspondante',
    kanban_no_data: 'Aucune donnée Kanban',
    kanban_work_queue_hint: 'Il s\'agit de la file d\'attente de travail de l\'agent Hermes. Créez ou triez une tâche, attribuez-la, déplacez-la vers Prêt, puis laissez le répartiteur la réclamer.',
    kanban_unavailable: 'Kanban indisponible',
    kanban_read_only: 'Vue en lecture seule',
    kanban_empty: 'Vide',
    kanban_task: 'Tâche',
    kanban_no_description: 'Pas de description',
    kanban_refresh: 'Rafraîchir',
    kanban_status_triage: 'Triage',
    kanban_status_todo: 'Faire',
    kanban_status_ready: 'Prêt',
    kanban_status_running: 'En cours d\'exécution',
    kanban_status_blocked: 'Bloqué',
    kanban_status_done: 'Fait',
    kanban_comments_count: 'Commentaires ({0})',
    kanban_events_count: 'Événements ({0})',
    kanban_links: 'Links',
    kanban_parents: 'Parents',
    kanban_children: 'Enfants',
    kanban_runs_count: 'Exécutions ({0})',
    kanban_no_comments: 'Sans commentaires',
    kanban_no_events: 'Aucun événement',
    kanban_no_runs: 'Aucune course',
    kanban_title: 'Titre',
    kanban_description: 'Description',
    kanban_description_placeholder: 'Facultatif : ce qui doit se passer, les critères d\'acceptation, les liens',
    kanban_status: 'Statut',
    kanban_assignee: 'Cessionnaire',
    kanban_assignee_placeholder: 'Facultatif – laisser vide pour tout travailleur',
    kanban_tenant: 'Locataire',
    kanban_tenant_placeholder: 'Facultatif – slug de projet ou d\'équipe',
    kanban_priority: 'Priorité',
    kanban_priority_hint: 'Les nombres plus élevés sont exécutés en premier. Par défaut 0.',
    kanban_title_required: 'Le titre est requis.',
    kanban_new_task: 'Nouvelle tâche',
    kanban_edit_task: 'Modifier la tâche',
    kanban_status_original_hint: 'Statut actuel : {0}. Cette boîte de dialogue prend uniquement en charge les modifications Triage/Todo/Ready.',
    kanban_run_dispatcher: 'Exécuter le répartiteur',
    kanban_run_dispatcher_confirm: 'Cela réclamera des tâches prêtes sur ce tableau et générera des sous-processus de travail (un par tâche, jusqu\'à 8 par clic). Continuer?',
    kanban_assignee_profiles_label: 'Profils Hermès',
    kanban_assignee_other_label: 'Autre (voies CLI / profils supprimés)',
    kanban_assignee_unassigned: '— Non attribué (ne s\'exécutera pas automatiquement) —',
    kanban_ready_needs_assignee: 'Vous avez sélectionné Non attribué + Prêt. Le répartiteur ignorera cette tâche. Soumettez à nouveau pour confirmer ou choisissez un profil.',
    kanban_dispatch_preview_prefix: 'Aperçu :',
    kanban_dispatch_run_prefix: 'Expédié :',
    kanban_dispatch_spawned: 'engendré',
    kanban_dispatch_promoted: 'promu',
    kanban_dispatch_reclaimed: 'récupéré',
    kanban_dispatch_skipped_unassigned: 'ignoré (pas de destinataire)',
    kanban_dispatch_skipped_nonspawnable: 'ignoré (profil inconnu)',
    kanban_dispatch_auto_blocked: 'auto-bloqué',
    kanban_dispatch_timed_out: 'expiré',
    kanban_dispatch_crashed: 's\'est écrasé',
    kanban_add_comment: 'Ajouter un commentaire',
    kanban_status_archived: 'Archivé',
    tab_todos: 'Toutes les tâches',
    tab_insights: 'Connaissances',
    tab_dashboard: 'Tableau de bord Hermès',
    dashboard_loopback_warning: 'Le tableau de bord est en boucle uniquement sur le serveur. Naviguez depuis le serveur lui-même ou redémarrez-le avec --host 0.0.0.0 (non sécurisé).',
    tab_logs: 'Journaux',
    tab_settings: 'Paramètres',
    new_conversation: 'Nouvelle conversation',
    filter_conversations: 'Filtrer les conversations...',
    markdown_table_filter: 'Filtrer le tableau',
    markdown_table_sort_column: 'Trier la colonne',
    session_time_unknown: 'Inconnu',
    session_time_last_week: '1w',
    session_time_bucket_today: 'Aujourd\'hui',
    session_time_bucket_yesterday: 'Hier',
    session_time_bucket_this_week: 'Cette semaine',
    session_time_bucket_last_week: 'La semaine dernière',
    session_time_bucket_older: 'Plus vieux',
    scheduled_jobs: 'Travaux planifiés',
    new_job: 'Nouvel emploi',
    loading: 'Chargement...',
    search_skills: 'Compétences de recherche...',
    new_skill: 'Nouvelle compétence',
    personal_memory: 'Mémoire personnelle',
    current_task_list: 'Liste de tâches actuelle',
    logs_title: 'Journaux',
    logs_file: 'Déposer',
    logs_tail: 'Queue',
    logs_auto_refresh: 'Actualisation automatique (5s)',
    logs_wrap: 'Enrouler les lignes',
    logs_copy_all: 'Copier tout',
    logs_empty: 'Aucune ligne de journal pour l\'instant.',
    logs_loading: 'Chargement des journaux…',
    logs_load_failed: 'Les journaux n\'ont pas pu être chargés',
    logs_status_idle: 'Choisissez un fichier journal pour afficher les lignes récentes.',
    logs_no_mtime: 'pas encore écrit',
    logs_truncated_hint: 'Afficher la fin d\'un gros fichier journal ; les octets plus anciens ont été ignorés pour limiter la mémoire.',
    logs_copied: 'Journaux copiés',
    logs_severity: 'Gravité',
    logs_severity_all: 'Tous',
    logs_severity_errors: 'Erreurs',
    logs_severity_warnings: 'Avertissements+',
    logs_filter_active: 'affiché (filtre actif)',
    insights_title: 'Analyse d\'utilisation',
    insights_sessions: 'Séances',
    insights_messages: 'Messages',
    insights_tokens: 'Jetons',
    insights_cost: 'Coût estimé',
    insights_no_cost: 'N / A',
    insights_models: 'Modèles',
    insights_activity_by_day: 'Activité par jour',
    insights_activity_by_hour: 'Activité par heure',
    insights_peak_hour: 'Pic : {heure}',
    insights_token_breakdown: 'Répartition des jetons',
    insights_input_tokens: 'Saisir',
    insights_output_tokens: 'Sortir',
    insights_total: 'Total',
    insights_daily_tokens: 'Jetons quotidiens',
    insights_model_name: 'Modèle',
    insights_model_sessions: 'Séances',
    insights_model_tokens: 'Jetons',
    insights_model_cost: 'Coût',
    insights_model_share: 'Partager',
    insights_no_usage_data: 'Aucune donnée d\'utilisation pour l\'instant',
    insights_footer: 'Affichage des données des {days} derniers jours',
    insights_skill_usage_title: 'Utilisation des Skills',
    insights_skill_usage_sub: 'Fréquence d\'invocation des outils',
    insights_skill_usage_total: 'Invocations totales',
    insights_skill_usage_skills_used: 'Skills utilisés',
    insights_skill_usage_no_data: 'Aucune donnée d\'utilisation des skills pour le moment',
    insights_skill_usage_no_data_hint: 'Les skills apparaîtront ici une fois utilisés dans les conversations.',
    insights_skill_usage_footer: 'Comptages depuis ~/.hermes/skills/',
    insights_skill_usage_col_skill: 'Skill',  // TODO: translate
    insights_skill_usage_col_uses: 'Uses',  // TODO: translate
    insights_skill_usage_col_views: 'Views',  // TODO: translate
    insights_skill_usage_col_share: 'Usage %',  // TODO: translate
    insights_skill_usage_col_patches: 'Patches',  // TODO: translate
    workspace_desc: 'Ajoutez et changez d\'espace de travail pour vos sessions.',
    session_lineage_toggle_hint: '{0} — les tours de contexte précédents sont repliés ici. Cliquez pour les afficher ou les masquer.',
    session_lineage_static_hint: '{0} — les tours de contexte précédents sont repliés ici.',
    session_child_toggle_hint: '{0} — conversations enfants créées depuis cette session. Cliquez pour les afficher ou les masquer.',
    session_readonly_title_hint: 'Session importée en lecture seule — {0}',
    session_lineage_segment_untitled: 'Segment sans titre',
    session_lineage_segment_open: 'Segment de lignée ouverte',
    new_profile: 'Nouveau profil',
    transcript: 'Transcription',
    download_transcript: 'Télécharger en Markdown',
    import: 'Importer',
    export_session_json: 'JSON',
    export_session_json_tooltip: 'Exporter la session complète en JSON',
    import_session_json_tooltip: 'Importer une session depuis JSON',
    clear_conversation_btn_tooltip: 'Effacer tous les messages de cette conversation',
    settings_label_rtl: 'Mise en page du chat de droite à gauche',
    settings_desc_rtl: "Inverse l'alignement des messages du chat et de la saisie du compositeur pour des langues comme l'arabe ou l'hébreu. N'affecte que la zone de chat — la barre latérale et les autres panneaux restent de gauche à droite.",
    settings_label_sound: 'Son de notification',
    settings_desc_sound: 'Jouez un son lorsque l\'assistant termine une réponse.',
    tts_listen: 'Écouter',
    tts_not_supported: 'La synthèse vocale n\'est pas prise en charge dans ce navigateur.',
    settings_label_tts: 'Text-to-Speech pour les réponses',
    settings_desc_tts: 'Affichez un bouton haut-parleur sur chaque message de l\'assistant pour le lire à haute voix à l\'aide de la synthèse vocale de votre navigateur.',
    settings_label_tts_auto_read: 'Lecture automatique des réponses à haute voix',
    settings_desc_tts_auto_read: 'Prononcez automatiquement chaque nouvelle réponse de l\'assistant lorsqu\'elle est terminée. S\'arrête lorsque vous commencez à taper.',
    settings_label_voice_mode: 'Bouton du mode vocal mains libres',
    settings_desc_voice_mode: 'Affichez le bouton du mode vocal (forme d\'onde audio) à côté du micro de dictée. Vous permet de parler naturellement : Hermes envoie automatiquement après une pause et lit les réponses à haute voix. Nécessite un navigateur prenant en charge à la fois la reconnaissance vocale et TTS.',
    settings_label_raw_audio: 'Envoyer l\'audio brut au lieu de transcrire',
    settings_desc_raw_audio: 'Enregistre et envoie le fichier audio original à l\'agent au lieu de le convertir d\'abord en texte. L\'agent peut le transcrire ou traiter l\'audio brut (émotion, bruit de fond, STT personnalisé). Comme le comportement des messages vocaux de Telegram.',
    voice_send_raw: 'Envoyer l\'audio brut',
    voice_raw_attached: 'Audio attaché. Appuyez sur Envoyer ou ajoutez du texte.',
    settings_label_tts_voice: 'Voix',
    settings_desc_tts_voice: 'Voix préférée. Rempli à partir des voix disponibles dans votre navigateur.',
    settings_label_tts_rate: 'Taux de parole',
    settings_label_tts_pitch: 'Emplacement du discours',
    settings_label_tts_engine: 'Moteur TTS',
    settings_desc_tts_engine: 'Choisissez le moteur de synthèse vocale. Edge TTS utilise les voix neuronales Microsoft via le serveur.',
    settings_label_notifications: 'Notifications du navigateur',
    settings_desc_notifications: 'Afficher une notification système lorsqu\'une réponse est terminée alors que l\'application est en arrière-plan.',
    notifications_enable_btn: 'Enable notifications',
    notifications_test_btn: 'Send test',
    notifications_permission_status: (status) => `Permission: ${status}`,
    notifications_enabled_toast: 'Notifications enabled.',
    notifications_denied: 'Notifications are blocked in this browser. Enable them in browser settings.',
    notifications_unsupported: 'Notifications are not supported in this browser.',
    settings_desc_token_usage: 'Affiche le nombre de jetons d’entrée/sortie sous chaque réponse de l’assistant. Également basculé avec /usage.',
    settings_label_api_redact: 'Expurger les données sensibles dans les réponses API',
    settings_desc_api_redact: 'Les utilisateurs auto-hébergés peuvent désactiver pour des raisons de transparence (non recommandé pour les instances partagées).',
    settings_sidebar_density_compact: 'Compact',
    settings_sidebar_density_detailed: 'Détaillé',
    settings_desc_sidebar_density: 'Contrôle la quantité de métadonnées que la liste des sessions affiche dans la barre latérale gauche.',
    settings_label_auto_title_refresh: 'Actualisation adaptative du titre',
    settings_auto_title_refresh_off: 'Désactivé',
    settings_auto_title_refresh_5: 'Tous les 5 échanges',
    settings_auto_title_refresh_10: 'Tous les 10 échanges',
    settings_auto_title_refresh_20: 'Tous les 20 échanges',
    settings_desc_auto_title_refresh: 'Régénère automatiquement le titre de la session en fonction du dernier échange, le gardant ainsi pertinent à mesure que la conversation évolue. Nécessite la configuration d’un modèle de génération de titres LLM.',
    settings_desc_external_sessions: 'Affichez les conversations de CLI, Telegram, Discord, Slack et d\'autres chaînes dans la liste des sessions. Cliquez pour importer et continuer.',
    settings_desc_cron_sessions: 'Surface cron job output as conversations in the sidebar. Only active when non-WebUI sessions are enabled. Defaults off; high-frequency jobs can flood the sidebar.',
    settings_desc_previous_messaging_sessions: 'Affichez les anciennes sessions Discord, Telegram, Slack et Weixin remplacées par reset ou compression.',
    settings_desc_sync_insights: 'Met en miroir l\'utilisation du jeton WebUI dans state.db afin que Hermes /insights inclut les données de session du navigateur. Désactivé par défaut.',
    settings_desc_check_updates: 'Afficher une bannière lorsque des versions plus récentes de WebUI ou de l\'agent sont disponibles. Exécute périodiquement une récupération git en arrière-plan.',
    settings_desc_ignore_agent_updates: 'Keep WebUI update checks on, but hide Agent update notices and skip Agent update fetches.',
    settings_desc_whats_new_summary: "Changes the What's New action from opening the raw diff first to generating a short, human-readable summary. The regular diff comparison stays available after the summary.",
    settings_desc_bot_name: 'Utilisé uniquement pour le profil par défaut. Les autres profils utilisent leurs propres noms.',
    settings_desc_password: 'Saisissez un nouveau mot de passe pour le définir ou le modifier. Laissez vide pour conserver le paramètre actuel.',
    password_placeholder: 'Entrez le nouveau mot de passe…',
    password_env_var_locked: 'La variable d\'environnement HERMES_WEBUI_PASSWORD est actuellement définie et est prioritaire. Désactivez-le et redémarrez le serveur pour gérer le mot de passe à partir d\'ici.',
    password_env_var_locked_placeholder: 'Verrouillé : la variable d\'environnement HERMES_WEBUI_PASSWORD est définie',
    disable_auth: 'Désactiver l\'authentification',
    sign_out: 'Se déconnecter',
    settings_label_shutdown: 'Arrêter le serveur Hermes WebUI',
    settings_desc_shutdown_before_cmd: 'Arrête proprement le serveur WebUI local. Pratique si vous l\'avez démarré via ',
    settings_desc_shutdown_between_cmds: ' et que vous voulez l\'arrêter sans passer par un terminal. Pour rendre la WebUI à nouveau accessible, vous devrez redémarrer le serveur (',
    settings_desc_shutdown_after_cmd: ' ou l\'application native).',
    settings_btn_shutdown: 'Arrêter le serveur',
    settings_shutdown_confirm_title: 'Arrêter Hermes WebUI',
    settings_shutdown_confirm_message: 'Arrêter le serveur Hermes WebUI ?',
    settings_shutdown_confirm_btn: 'Arrêter',
    settings_shutdown_stopped_message: 'Serveur arrêté. Vous pouvez fermer cet onglet.',
    providers_tab_title: 'Fournisseurs',
    providers_section_title: 'Fournisseurs',
    providers_section_meta: 'Gérez les clés API pour les fournisseurs d\'IA. Les modifications prennent effet immédiatement.',
    providers_status_configured: 'Clé API configurée',
    providers_status_not_configured: 'Aucune clé API',
    providers_status_oauth: 'OAuth',
    providers_status_api_key: 'Clé API',
    providers_status_not_configured_label: 'Non configuré',
    providers_oauth_hint: 'Authentifié via OAuth. Aucune clé API nécessaire.',
    providers_oauth_config_yaml_hint: 'Jeton configuré via config.yaml. Pour mettre à jour, modifiez la section des fournisseurs dans votre config.yaml ou exécutez Hermes Auth.',
    providers_oauth_not_configured_hint: 'Non authentifié. Exécutez Hermes Auth dans le terminal pour configurer ce fournisseur.',
    providers_save: 'Sauvegarder',
    providers_refresh_models: 'Refresh models',
    providers_refreshing: 'Refreshing…',
    providers_models_refreshed: 'Models refreshed',
    providers_remove: 'Retirer',
    providers_saving: 'Économie…',
    providers_removing: 'Suppression…',
    providers_enter_key: 'Veuillez saisir une clé API',
    providers_empty: 'Aucun fournisseur configurable trouvé.',
    providers_key_updated: 'Clé API enregistrée',
    providers_key_removed: 'Clé API supprimée',
    providers_key_placeholder_new: 'sk-...',
    providers_key_placeholder_replace: 'Entrez une nouvelle clé à remplacer…',
    provider_quota_title: 'Quota du fournisseur actif',
    provider_quota_active_provider: 'Fournisseur actif',
    provider_quota_last_checked_after_refresh: 'Dernière vérification après actualisation',
    provider_quota_last_checked: 'Dernière vérification {0}',
    provider_quota_refresh_usage: 'Actualiser l’utilisation',
    provider_quota_refreshing: 'Actualisation...',
    provider_quota_refresh_title: 'Actualiser maintenant les limites d’utilisation du fournisseur',
    provider_quota_refresh_succeeded: 'Utilisation du fournisseur actualisée',
    provider_quota_refresh_failed: 'Échec de l’actualisation de l’utilisation du fournisseur',
    provider_quota_session_limit: 'Limite de 5 heures',
    provider_quota_weekly_limit: 'Limite hebdomadaire',
    provider_quota_window_fallback: 'Fenêtre',
    provider_quota_metric_remaining: 'Restant',
    provider_quota_metric_used: 'Utilisé',
    provider_quota_metric_limit: 'Limite',
    provider_quota_status_available: 'disponible',
    provider_quota_status_exhausted: 'épuisé',
    provider_quota_status_unavailable: 'indisponible',
    provider_quota_status_failed: 'échec',
    provider_quota_status_checked: 'vérifié',
    provider_quota_status_no_key: 'aucune clé',
    provider_quota_status_invalid_key: 'clé non valide',
    provider_quota_status_unsupported: 'non pris en charge',
    provider_quota_used_meta: '{0} utilisé',
    provider_quota_resets_meta: 'réinitialisation {0}',
    provider_quota_credential_pool: 'Pool d’identifiants',
    provider_quota_credential_label: 'Identifiant {0}',
    provider_quota_pool_plans: 'Plans : {0}',
    provider_quota_pool_no_windows: 'Aucune fenêtre de limite de compte signalée.',
    provider_quota_account_limits_loaded: 'Limites de compte chargées.',
    provider_quota_unavailable: 'Statut du quota indisponible',
    provider_quota_retry_after: 'Réessayer après {0}',
    provider_quota_pool_summary_available: '{0}/{1} disponibles',
    provider_quota_pool_summary_exhausted: '{0} épuisés',
    provider_quota_pool_summary_failed: '{0} en échec',
    provider_quota_pool_summary_checked: '{0} vérifiés',
    cancel: 'Annuler',
    create_job: 'Créer un emploi',
    save_skill: 'Enregistrer la compétence',
    editing: 'Édition',
    empty_title: 'En quoi puis-je aider ?',
    empty_subtitle: 'Demandez n\'importe quoi, exécutez des commandes, explorez des fichiers ou gérez vos tâches planifiées.',
    suggest_files: 'Quels fichiers se trouvent dans cet espace de travail ?',
    suggest_schedule: 'Quel est mon programme aujourd\'hui ?',
    suggest_plan: 'Aide-moi à planifier un petit projet.',
    onboarding_badge: 'PREMIÈRE EXÉCUTION',
    onboarding_title: 'Bienvenue dans l\'interface utilisateur Web Hermès',
    onboarding_lead: 'Une configuration guidée rapide vérifiera Hermes, enregistrera une configuration réelle du fournisseur, choisira un espace de travail et un modèle et protégera éventuellement l\'application avec un mot de passe.',
    onboarding_back: 'Dos',
    onboarding_continue: 'Continuer',
    onboarding_skip: 'Ignorer la configuration',
    onboarding_skipped: 'Configuration ignorée – en utilisant la configuration existante.',
    onboarding_open: 'Hermès ouvert',
    onboarding_step_system_title: 'Vérification du système',
    onboarding_step_system_desc: 'Vérifiez la visibilité de l\'agent Hermes et de la configuration.',
    onboarding_step_setup_title: 'Configuration du fournisseur',
    onboarding_step_setup_desc: 'Enregistrez la configuration minimale du fournisseur Hermes.',
    onboarding_step_workspace_title: 'Espace de travail + modèle',
    onboarding_step_workspace_desc: 'Choisissez les valeurs par défaut pour les nouvelles sessions et le chat.',
    onboarding_step_password_title: 'Mot de passe facultatif',
    onboarding_step_password_desc: 'Protégez l’interface utilisateur Web avant de la partager.',
    onboarding_step_finish_title: 'Finition',
    onboarding_step_finish_desc: 'Vérifiez et entrez dans l\'application.',
    onboarding_notice_system_ready: 'L\'agent Hermes semble accessible depuis l\'interface utilisateur Web.',
    onboarding_notice_system_unavailable: 'Hermes Agent n’est pas encore entièrement disponible. Bootstrap peut l\'installer, mais la configuration du fournisseur peut toujours nécessiter un terminal.',
    onboarding_check_agent: 'Agent Hermès',
    onboarding_check_agent_ready: 'Détecté et importable',
    onboarding_check_agent_missing: 'Manquant ou partiellement importable',
    onboarding_check_password: 'Mot de passe',
    onboarding_check_password_enabled: 'Déjà activé',
    onboarding_check_password_disabled: 'Pas encore activé',
    onboarding_check_provider: 'Configuration du fournisseur',
    onboarding_check_provider_ready: 'Prêt à discuter',
    onboarding_check_provider_partial: 'Enregistré mais incomplet',
    onboarding_check_provider_pending: 'Vérification nécessaire',
    onboarding_config_file: 'Fichier de configuration :',
    onboarding_env_file: 'Fichier .env :',
    onboarding_unknown: 'Inconnu',
    onboarding_current_provider: 'Configuration actuelle :',
    onboarding_missing_imports: 'Importations manquantes :',
    onboarding_notice_setup_required: 'Choisissez ici un chemin de fournisseur simple. Les flux OAuth avancés appartiennent toujours à la CLI Hermes pour le moment.',
    onboarding_notice_setup_already_ready: 'Une configuration de fournisseur Hermes fonctionnelle est déjà détectée. Vous pouvez le conserver ou le remplacer ici.',
    onboarding_oauth_provider_ready_title: 'Fournisseur déjà authentifié',
    onboarding_oauth_provider_ready_body: 'Cette instance est configurée pour utiliser un fournisseur OAuth (<strong>{provider}</strong>) configuré via la CLI Hermes. Aucune clé API n\'est nécessaire ici - cliquez sur Continuer pour terminer la configuration.',
    onboarding_oauth_provider_not_ready_title: 'Fournisseur OAuth pas encore authentifié',
    onboarding_oauth_provider_not_ready_body: 'Cette instance est configurée pour utiliser <strong>{provider}</strong>, qui utilise OAuth plutôt qu\'une clé API. Exécutez <code>hermes auth</code> ou <code>hermes model</code> dans un terminal pour vous authentifier, puis rechargez l\'interface utilisateur Web.',
    onboarding_oauth_switch_hint: 'Ou choisissez un autre fournisseur ci-dessous pour passer à une configuration par clé API :',
    oauth_login_codex: 'Connectez-vous avec Codex (ChatGPT)',
    oauth_codex_step1: 'Étape 1 : Visitez cette URL et entrez le code',
    oauth_codex_step2: 'Étape 2 : Saisissez ce code sur la page',
    oauth_codex_polling: 'En attente d\'autorisation...',
    oauth_codex_success: 'Connexion au Codex OAuth réussie !',
    oauth_codex_error: 'Échec de la connexion OAuth',
    oauth_codex_expired: 'Code expiré, veuillez réessayer',
    onboarding_notice_workspace: 'Ces valeurs réutilisent les mêmes API de paramètres que l\'application normale.',
    onboarding_workspace_label: 'Espace de travail',
    onboarding_workspace_or_path: 'Ou entrez un chemin d\'espace de travail',
    onboarding_workspace_placeholder: '/accueil/vous/espace de travail',
    onboarding_provider_label: 'Mode configuration',
    onboarding_quick_setup_badge: 'configuration rapide',
    provider_category_easy_start: 'Démarrage facile',
    provider_category_self_hosted: 'Ouvert / auto-hébergé',
    provider_category_specialized: 'Spécialisé',
    onboarding_api_key_label: 'Clé API',
    onboarding_api_key_placeholder: 'Laisser vide pour conserver une clé enregistrée existante',
    onboarding_api_key_label_optional: 'Clé API (facultatif)',
    onboarding_api_key_placeholder_optional: 'Laisser vide pour les serveurs sans clé',
    onboarding_api_key_help_keyless: 'La plupart des installations LM Studio / Ollama / vLLM s\'exécutent sans clé — laissez ce champ vide si votre serveur ne nécessite pas d\'authentification. Utilisez le bouton Tester la connexion pour vérifier.',
    onboarding_api_key_help_prefix: 'Enregistré comme secret dans votre fichier Hermes .env en utilisant',
    onboarding_base_url_label: 'URL de base',
    onboarding_base_url_placeholder: 'https://votre-endpoint.example/v1',
    onboarding_base_url_help: 'Utilisez-le pour les routeurs compatibles OpenAI, les serveurs auto-hébergés, LiteLLM, Ollama, LM Studio, vLLM ou des points de terminaison similaires.',
    onboarding_model_label: 'Modèle par défaut',
    onboarding_workspace_help: 'Choisissez le modèle qu\'Hermes doit utiliser pour les nouvelles discussions une fois la configuration terminée.',
    onboarding_custom_model_placeholder: 'votre-nom-de-modèle',
    onboarding_custom_model_help: 'Pour les points de terminaison personnalisés, entrez l’ID de modèle exact attendu par votre serveur.',
    onboarding_notice_password_enabled: 'Un mot de passe est déjà configuré. Saisissez-en un nouveau uniquement si vous souhaitez le remplacer.',
    onboarding_notice_password_recommended: 'Facultatif mais recommandé si vous exposez l\'interface utilisateur au-delà de localhost.',
    onboarding_password_label: 'Mot de passe (facultatif)',
    onboarding_password_placeholder: 'Laisser vide pour sauter',
    onboarding_password_help: 'Les mots de passe sont stockés via l\'API des paramètres existants et hachés côté serveur.',
    onboarding_notice_finish: 'Vous pouvez rouvrir les paramètres plus tard pour modifier tout cela.',
    onboarding_not_set: 'Non défini',
    onboarding_password_will_enable: 'Sera activé',
    onboarding_password_will_replace: 'Sera remplacé',
    onboarding_password_keep_existing: 'Conserver le mot de passe actuel',
    onboarding_password_remains_disabled: 'Restera invalide',
    onboarding_password_skipped: 'Ignoré pour l\'instant',
    onboarding_finish_help: 'La finition stocke <code>onboarding_completed</code> dans les paramètres et vous amène dans l\'application normale.',
    onboarding_error_choose_workspace: 'Choisissez un espace de travail avant de continuer.',
    onboarding_error_choose_model: 'Choisissez un modèle avant de continuer.',
    onboarding_error_provider_required: 'Choisissez un mode de configuration avant de continuer.',
    onboarding_error_base_url_required: 'L\'URL de base est requise pour les points de terminaison personnalisés.',
    onboarding_probe_test_button: 'Tester la connexion',
    onboarding_probe_probing: 'Test de connexion…',
    onboarding_probe_ok: 'Connecté. {n} modèle(s) disponible(s).',
    onboarding_probe_error_generic: 'Impossible d\'atteindre l\'URL de base configurée.',
    onboarding_probe_error_invalid_url: 'L\'URL de base doit commencer par http:// ou https://.',
    onboarding_probe_error_dns: 'Impossible de résoudre l\'hôte. Vérifiez l\'URL ou utilisez l\'adresse IP de l\'hôte.',
    onboarding_probe_error_connect_refused: 'Connexion refusée : le serveur ne fonctionne peut-être pas à cette adresse. Depuis Docker, essayez l’adresse IP de l’hôte au lieu de localhost.',
    onboarding_probe_error_timeout: 'Le point final n’a pas répondu à temps. Vérifiez que le serveur est en cours d\'exécution et que l\'URL est correcte.',
    onboarding_probe_error_http_4xx: 'Le point de terminaison a renvoyé une erreur client. Vérifiez l\'authentification et le chemin de l\'URL (se termine généralement par /v1).',
    onboarding_probe_error_http_5xx: 'Le point de terminaison a renvoyé une erreur de serveur. Vérifiez les journaux du serveur LM Studio / Ollama.',
    onboarding_probe_error_parse: 'Le point de terminaison n’a pas renvoyé une liste de modèles sous la forme attendue. Vérifiez que l\'URL pointe vers la racine de l\'API compatible OpenAI.',
    onboarding_probe_error_unreachable: 'Impossible d\'atteindre l\'URL de base configurée.',
    onboarding_error_probe_failed: 'Impossible de valider l\'URL de base configurée.',
    onboarding_error_workspace_required: 'Un espace de travail est requis.',
    onboarding_error_model_required: 'Un modèle est requis.',
    onboarding_complete: 'Intégration terminée',
    error_prefix: 'Erreur:',
    default: 'default',
    search: 'Search',
    not_available: 'N / A',
    never: 'jamais',
    add: 'Ajouter',
    add_failed: 'Échec de l\'ajout :',
    remove_failed: 'Échec de la suppression :',
    switch_failed: 'Échec du changement :',
    name_required: 'Le nom est requis',
    content_required: 'Le contenu est requis',
    view: 'Voir',
    dismiss: 'Rejeter',
    disable: 'Désactiver',
    cron_no_jobs: 'Aucune tâche planifiée trouvée.',
    cron_status_off: 'désactivé',
    cron_status_paused: 'en pause',
    cron_status_error: 'erreur',
    cron_status_active: 'actif',
    cron_status_running: 'courir\u2026',
    cron_status_needs_attention: 'a besoin d\'attention',
    cron_attention_desc: 'Cette tâche récurrente n\'a pas de prochaine exécution. Le planificateur n\'a peut-être pas réussi à calculer sa prochaine exécution.',
    cron_attention_croniter_hint: 'Il se peut que le package croniter soit manquant dans le runtime Gateway. Redémarrez la passerelle avec la prise en charge de cron, puis reprenez ce travail.',
    cron_attention_resume: 'Reprendre et recalculer',
    cron_jobs_project: 'Emplois Cron',
    cron_attention_run_once: 'Cours une fois maintenant',
    cron_attention_copy_diagnostics: 'Copier les diagnostics',
    cron_diagnostics_copied: 'Diagnostics Cron copiés',
    cron_next: 'Suivant',
    cron_last: 'Dernier',
    cron_run_now: 'Courez maintenant',
    cron_pause: 'Pause',
    cron_resume: 'CV',
    cron_job_name_placeholder: 'Nom du travail',
    cron_schedule_placeholder: 'Calendrier',
    cron_prompt_placeholder: 'Rapide',
    cron_last_output: 'Dernière sortie',
    cron_expand_prompt: 'Développer le prompt',
    cron_collapse_prompt: 'Réduire le prompt',
    cron_expand_output: 'Développer la sortie',
    cron_collapse_output: 'Réduire la sortie',
    cron_mode_agent: 'Agent',
    cron_mode_script: 'Script',
    cron_mode_label: 'Mode',
    cron_script_job_banner: 'Exécute un script selon l\'horaire — stdout est livré à la cible. Pas d\'agent, prompt ni skills.',
    cron_script_card_title: 'Script',
    cron_script_output: 'Sortie du script',
    cron_script_path_label: 'Chemin du script',
    cron_script_path_hint: 'Résolu sous ~/.hermes/scripts/ sauf chemin absolu. Modifiez le script sur le serveur pour changer le comportement.',
    cron_script_badge_title: 'Tâche script (sans agent)',
    cron_workdir_label: 'Répertoire de travail',
    cron_view_full_output: 'View full output',
    cron_all_runs: 'Toutes les courses',
    cron_hide_runs: 'Masquer les courses',
    cron_no_runs_yet: '(pas encore de courses)',
    cron_schedule_required_example: 'Un horaire est requis (par exemple "0 9 * * *" ou "toutes les 1h")',
    cron_schedule_required: 'Un horaire est requis',
    cron_prompt_required: 'Une invite est requise',
    cron_job_created: 'Emploi créé',
    cron_duplicate: 'Double',
    cron_duplicated: 'Tâche dupliquée (en pause)',
    cron_job_triggered: 'Tâche déclenchée',
    cron_job_paused: 'Tâche suspendue',
    cron_job_resumed: 'Travail repris',
    cron_job_updated: 'Emploi mis à jour',
    cron_model_label: 'Remplacement du modèle',
    cron_model_hint: 'Remplace le modèle par défaut pour cette tâche.',
    cron_model_use_default: 'Par défaut (utiliser le profil/le système)',
    cron_delete_confirm_title: 'Supprimer la tâche cron',
    cron_delete_confirm_message: 'Cela ne peut pas être annulé.',
    cron_job_deleted: 'Travail supprimé',
    status_failed: 'échoué',
    status_completed: 'complété',
    todos_no_active: 'Aucune liste de tâches active dans cette session.',
    clear_conversation_title: 'Conversation claire',
    clear_conversation_message: 'Effacer tous les messages ? Cela ne peut pas être annulé.',
    clear_failed: 'Échec de la suppression :',
    skills_no_match: 'Aucune compétence ne correspond.',
    skill_enabled: 'Activé',
    skill_disabled: 'Désactivé',
    skill_toggle_failed: 'Échec du basculement de compétence: ',
    linked_files: 'Fichiers liés',
    skill_load_failed: 'Impossible de charger la compétence :',
    skill_file_load_failed: 'Impossible de charger le fichier :',
    skill_name_required: 'Le nom de la compétence est requis',
    skill_updated: 'Compétence mise à jour',
    skill_created: 'Compétence créée',
    skill_deleted: 'Compétence supprimée',
    skill_delete_confirm: 'Supprimer la compétence "{0}" ?',
    skills_empty_title: 'Sélectionnez une compétence',
    skills_empty_sub: 'Choisissez une compétence dans la barre latérale pour afficher son contenu ou créez-en une nouvelle.',
    skills_edit: 'Modifier',
    skills_delete: 'Supprimer',
    skills_back_to: 'Retour à {0}',
    tasks_empty_title: 'Sélectionnez une tâche planifiée',
    tasks_empty_sub: 'Choisissez une tâche dans la barre latérale pour afficher ses détails et ses exécutions, ou créez-en une nouvelle.',
    workspaces_empty_title: 'Sélectionnez un espace',
    workspaces_empty_sub: 'Choisissez un espace dans la barre latérale pour afficher ses fichiers et paramètres, ou ajoutez-en un nouveau.',
    profiles_empty_title: 'Sélectionnez un profil',
    profiles_empty_sub: 'Choisissez un profil d\'agent dans la barre latérale pour afficher et modifier ses paramètres, ou créez-en un nouveau.',
    memory_notes_label: 'mémoire (notes)',
    memory_saved: 'Mémoire sauvegardée',
    my_notes: 'Mes notes',
    user_profile: 'Profil utilisateur',
    external_notes_sources: 'Notes tierces',
    external_notes_empty: 'Aucune source MCP de notes ou de connaissances n’est encore visible. Configurez Joplin, Obsidian, Notion, llm-wiki ou un autre serveur de notes pour l’afficher ici.',
    external_notes_auto_recall_hint: 'Le rappel automatique de session reste inchangé ; ce tiroir affiche seulement les sources configurées et les outils de lecture/recherche disponibles.',
    external_notes_no_tools: 'Aucun outil de lecture/recherche n’est actuellement visible pour cette source.',
    external_notes_tool_count: (count) => `${count} outil${Number(count)===1?'':'s'} de notes disponible${Number(count)===1?'':'s'}`,
    external_notes_configured_hint: 'Des noms d’outils sont attendus depuis cette source configurée ; les schémas live apparaîtront quand le runtime WebUI les exposera.',
    external_notes_recent_ai: 'Utilisé récemment par l’IA',
    external_notes_auto: 'auto',
    external_notes_recent_ai_reason: 'Rappel automatique',
    external_notes_search_placeholder: 'Rechercher des notes…',
    external_notes_search_empty: 'Recherchez dans une source de notes configurée pour prévisualiser les notes ici.',
    source_active: 'active',
    source_configured: 'configured',
    no_notes_yet: 'Aucune note pour l\'instant.',
    no_profile_yet: 'Pas encore de profil.',
    agent_soul: 'Âme de l\'agent',
    no_soul_yet: 'Pas encore d\'âme définie.',
    workspace_choose_path: 'Choisir le chemin de l\'espace de travail',
    workspace_choose_path_meta: 'Ajoutez un chemin validé et changez cette conversation',
    workspace_manage: 'Gérer les espaces de travail',
    workspace_manage_meta: 'Ouvrez le panneau Espaces',
    workspace_use_title: 'Utiliser dans la session en cours',
    workspace_use: 'Utiliser',
    workspace_add_path_placeholder: 'Ajouter un chemin d\'accès à l\'espace de travail (par exemple /home/user/my-project)',
    workspace_paths_validated_hint: 'Les chemins sont validés en tant que répertoires existants avant d\'être enregistrés.',
    workspace_drag_hint: 'Faites glisser pour réorganiser',
    workspace_reorder_failed: 'Échec de la réorganisation',
    workspace_added: 'Espace de travail ajouté',
    workspace_renamed: 'Espace de travail renommé',
    workspace_remove_confirm_title: 'Supprimer l\'espace de travail',
    workspace_removed: 'Espace de travail supprimé',
    workspace_switch_prompt_title: 'Changer d\'espace de travail',
    workspace_switch_prompt_message: 'Entrez un chemin d’accès absolu à l’espace de travail vers lequel ajouter et basculer cette conversation.',
    workspace_switch_prompt_confirm: 'Changer',
    workspace_switch_prompt_placeholder: '/Utilisateurs/vous/projet',
    workspace_not_added: 'L\'espace de travail n\'a pas été ajouté',
    workspace_already_saved: 'Espace de travail déjà enregistré : choisissez-le dans la liste',
    workspace_busy_switch: 'Impossible de changer d\'espace de travail pendant que l\'agent est en cours d\'exécution',
    discard_file_edits_title: 'Supprimer les modifications du fichier ?',
    discard_file_edits_message: 'Changer d’espace de travail supprimera les modifications de fichiers non enregistrées dans l’aperçu.',
    profiles_no_profiles: 'Aucun profil trouvé.',
    profile_api_keys_configured: 'Clés API configurées',
    profile_gateway_running: 'Passerelle en cours d\'exécution',
    profile_gateway_stopped: 'Passerelle arrêtée',
    profile_active: 'ACTIF',
    profile_no_configuration: 'Aucune configuration',
    profile_use: 'Utiliser',
    profile_switch_title: 'Passer à ce profil',
    profile_delete_title: 'Supprimer ce profil',
    profile_default_label: '(défaut)',
    profile_name_placeholder: 'Nom du profil (minuscules, a-z 0-9 tirets)',
    profile_clone_label: 'Cloner la configuration du profil actif',
    profile_model_label: 'Modèle / fournisseur',
    profile_model_hint: 'Choisissez parmi les fournisseurs et modèles configurés pour ce nouveau profil.',
    profile_model_use_default: 'Utiliser la valeur par défaut du profil actif',
    profile_base_url_placeholder: 'URL de base (facultatif, par exemple http://localhost:11434)',
    profile_api_key_placeholder: 'Clé API (facultatif)',
    manage_profiles: 'Gérer les profils',
    profiles_load_failed: 'Échec du chargement des profils',
    profile_name_rule: 'Lettres minuscules, chiffres, traits d\'union et traits de soulignement uniquement',
    profile_base_url_rule: 'L\'URL de base doit commencer par http:// ou https://',
    profile_delete_confirm_message: 'Toutes les sessions, configurations, compétences et mémoire de ce profil seront définitivement supprimées. Cela ne peut pas être annulé.',
    active_conversation_none: 'Aucune conversation active sélectionnée.',
    settings_unsaved_changes: 'Vous avez des modifications non enregistrées.',
    sign_out_failed: 'Échec de la déconnexion :',
    disable_auth_confirm_title: 'Désactiver la protection par mot de passe',
    disable_auth_confirm_message: 'Tout le monde pourra accéder à cette instance.',
    auth_disabled: 'Authentification désactivée – protection par mot de passe supprimée',
    disable_auth_failed: 'Échec de la désactivation de l\'authentification :',
    skill_name: 'Nom',
    skill_category: 'Catégorie',
    skill_category_placeholder: 'Facultatif, par ex. développeurs',
    skill_content: 'Contenu SKILL.md',
    skill_content_placeholder: 'Frontmatter YAML + corps de démarque',
    skill_rename_not_supported: 'Renommer une compétence n\'est pas pris en charge. Créez une nouvelle compétence et supprimez l\'ancienne pour la renommer.',
    skill_metadata: 'Métadonnées',
    cron_name_label: 'Nom',
    cron_name_placeholder: 'Facultatif',
    cron_schedule_label: 'Calendrier',
    cron_schedule_hint: 'Utilisez « toutes les heures » ou une expression cron pour les tâches récurrentes. Les durées nues comme « 30 m » s\'exécutent une fois.',
    cron_schedule_once_warning: 'Les formulaires de durée tels que « 30 m » s\'exécutent une fois et sont supprimés après l\'exécution. Utilisez « tous les 30 mois » pour conserver une tâche récurrente.',
    cron_prompt_label: 'Rapide',
    cron_deliver_label: 'Livrer la sortie à',
    cron_deliver_local: 'Local (enregistrer la sortie uniquement)',
    cron_deliver_custom: 'Destination personnalisee',
    cron_profile_label: 'Profil',
    cron_profile_server_default: 'serveur par défaut',
    cron_profile_server_default_hint: 'Utilise le profil par défaut du serveur WebUI au moment de l\'exécution. Les tâches existantes sans profil conservent ce comportement hérité.',
    cron_toast_notifications_label: 'Toasts d’achèvement',
    cron_toast_notifications_hint: 'Montrez un toast lorsque ce cron se termine. Le badge Tâches et le marqueur de nouvelle exécution sont toujours mis à jour lorsque cette option est désactivée.',
    cron_toast_notifications_enabled: 'Activé',
    cron_toast_notifications_disabled: 'Désactivé',
    cron_skills_label: 'Compétences',
    cron_skills_placeholder: 'Ajouter des compétences (facultatif)…',
    cron_skills_edit_hint: 'La liste de compétences n\'est pas modifiable après la création.',
    workspace_name_label: 'Nom',
    workspace_name_placeholder: 'Nom convivial facultatif',
    workspace_path_label: 'Chemin',
    workspace_path_required: 'Le chemin est obligatoire',
    workspace_path_readonly: 'Le chemin ne peut pas être modifié. Renommer uniquement.',
    workspace_new_title: 'Nouvel espace',
    profile_name_label: 'Nom',
    profile_base_url_label: 'URL de base',
    profile_api_key_label: 'Clé API',
    cmd_yolo: 'Basculer le mode YOLO (ignorer les approbations)',
    yolo_no_session: 'Aucune session active',
    yolo_enabled: '⚡ Mode YOLO activé – les approbations ont ignoré cette session',
    yolo_disabled: 'Mode YOLO désactivé',
    yolo_pill_label: 'YOLO',
    yolo_pill_title_active: 'Mode YOLO actif — cliquez pour désactiver',
    approval_skip_all: '⚡ Passer toute cette session',
    approval_skip_all_title: 'Ignorer toutes les invites d\'approbation pour cette session',
    composer_send: 'Envoyer un message',
    composer_queue: 'Message de file d\'attente',
    composer_interrupt: 'Interrompre et envoyer',
    composer_steer: 'Piloter la réponse actuelle',
    composer_stop: 'Arrêter la génération',
    composer_disabled_clarify: 'Répondre à la demande de précisions',
    composer_disabled_compression: 'En attendant la fin de la compression',
    composer_compression_will_queue: 'Type a message — it will queue and send after compression',
    composer_disabled_empty: 'Tapez un message à envoyer',
    composer_mobile_workspace: 'Espace de travail',
    composer_mobile_model: 'Modèle',
    composer_mobile_reasoning: 'Raisonnement',
    composer_mobile_context: 'Contexte',
    media_audio_label: 'Audio',
    media_svg_label: 'Diagramme',
    media_video_label: 'Vidéo',
    media_download: 'Télécharger',
    csv_loading: 'Chargement du fichier CSV',
    csv_too_large: 'Fichier CSV trop volumineux pour le rendu en ligne',
    csv_no_data: 'Le fichier CSV ne contient pas suffisamment de données pour être affiché sous forme de tableau',
    csv_error: 'Échec du chargement du fichier CSV',
    csv_header_note: 'Première ligne affichée comme en-tête du tableau',
    excalidraw_loading: 'Diagramme de chargement',
    excalidraw_too_large: 'Fichier Excalidraw trop volumineux pour le rendu en ligne',
    excalidraw_invalid: 'Format de fichier Excalidraw invalide',
    excalidraw_error: 'Échec du chargement du fichier Excalidraw',
    excalidraw_label: 'Diagramme',
    excalidraw_download: 'Télécharger',
    excalidraw_empty: 'Diagramme vide',
    excalidraw_render_error: 'Échec du rendu du diagramme',
    excalidraw_simplified: 'Aperçu SVG simplifié — pas identique au pixel au canevas Excalidraw',
    checkpoint_title: 'Points de contrôle',
    checkpoint_empty: 'Aucun point de contrôle trouvé pour cet espace de travail.',
    checkpoint_loading: 'Chargement des points de contrôle…',
    checkpoint_error: 'Échec du chargement des points de contrôle',
    checkpoint_date: 'Date',
    checkpoint_message: 'Message',
    checkpoint_files: 'Fichiers',
    checkpoint_view_diff: 'Voir la différence',
    checkpoint_restore: 'Restaurer',
    checkpoint_restore_confirm_title: 'Restaurer le point de contrôle ?',
    checkpoint_restored: 'Point de contrôle restauré',
    checkpoint_diff_title: 'Changements au point de contrôle',
    checkpoint_diff_no_changes: 'Aucune différence trouvée entre ce point de contrôle et l\'espace de travail actuel.',

    // === Missing keys (FR translation completion) ===
    bg_complete: 'Tâche en arrière-plan terminée',
    bg_failed: 'Échec de la tâche en arrière-plan : ',
    bg_label: 'Résultat en arrière-plan :',
    bg_no_answer: '(aucune réponse)',
    bg_running: 'Exécution en arrière-plan…',
    branch_failed: 'Échec du fork : ',
    branch_forked: 'Conversation forkée dans une nouvelle session',
    btw_asking: 'Question annexe en cours…',
    btw_done: 'Question annexe répondue',
    btw_failed: 'Échec de la question annexe : ',
    btw_label: 'Question annexe — hors historique',
    btw_no_answer: 'Aucune réponse reçue.',
    cancel_unavailable: 'Annulation indisponible.',
    cmd_background: 'Exécuter une commande en arrière-plan',
    cmd_background_usage: '/background <prompt> — exécute en parallèle sans bloquer',
    cmd_branch: 'Forker cette conversation dans une nouvelle session',
    cmd_branch_usage: '/branch [nom] — forke la conversation (avec un nom optionnel)',
    cmd_btw: 'Poser une question annexe (éphémère)',
    cmd_btw_usage: '/btw <question> — pose une question annexe en utilisant le contexte de la session',
    cmd_retry: 'Renvoyer le dernier message',
    cmd_status: 'Afficher les infos de la session',
    cmd_stop: 'Arrêter la réponse en cours',
    cmd_title: 'Obtenir ou définir le titre de la session',
    cmd_undo: 'Supprimer le dernier échange',
    cmd_voice: 'Activer/désactiver le micro',
    cmd_voice_use_mic: 'Cliquez sur le bouton micro dans le composeur.',
    cmd_webui_only_session: 'Cette commande n\'est pas disponible pour les sessions importées en CLI.',
    folder_add_as_space_btn: 'Ajouter comme espace',
    folder_add_as_space_msg: 'Ajouter ce dossier comme nouvel espace dans votre liste ?',
    folder_add_as_space_title: 'Ajouter comme espace ?',
    fork_from_here: 'Forker à partir d\'ici',
    forked_from: 'Forké depuis',
    kanban_archive_board: 'Archiver le tableau courant…',
    kanban_archive_board_confirm: 'Archiver le tableau « {name} » ? Les tâches restent sur disque et le tableau peut être restauré depuis kanban/boards/_archived/.',
    kanban_back_to_board: 'Retour au tableau',
    kanban_block: 'Bloquer',
    kanban_board_archived: 'Tableau archivé',
    kanban_board_color: 'Couleur (optionnel)',
    kanban_board_description: 'Description (optionnel)',
    kanban_board_icon: 'Icône (emoji, optionnel)',
    kanban_board_name: 'Nom',
    kanban_board_name_required: 'Le nom est requis',
    kanban_board_slug: 'Slug (minuscules, tirets)',
    kanban_board_slug_required: 'Le slug est requis',
    kanban_bulk_action: 'Action groupée',
    kanban_card_archive: 'archiver',
    kanban_card_complete: 'terminer',
    kanban_lanes_by_profile: 'Colonnes par profil',
    kanban_new_board: 'Nouveau tableau…',
    kanban_nudge_dispatcher: 'Aperçu du dispatcher',
    kanban_only_mine: 'Seulement les miennes',
    kanban_rename_board: 'Renommer le tableau courant…',
    kanban_stats: 'Statistiques',
    kanban_unassigned: 'non assigné',
    kanban_unblock: 'Débloquer',
    kanban_worker_log: 'Journal du worker',
    no_active_task: 'Aucune tâche active à arrêter.',
    retrieval_context_label: 'Contexte indexé',
    retrieval_context_preview: 'Les messages plus anciens sont stockés et récupérables via les outils de contexte',
    retry_failed: 'Échec de la nouvelle tentative : ',
    slash_skill_badge: 'Skill',
    slash_skill_desc: 'Invoquer cette skill',
    status_agent_running: 'Agent en cours d\'exécution',
    status_heading: 'État de la session',
    status_load_failed: 'Échec du chargement de l\'état : ',
    status_messages: 'Messages',
    status_model: 'Modèle',
    status_no: 'Non',
    status_personality: 'Personnalité',
    status_provider: 'Fournisseur',
    status_session_id: 'ID de session',
    status_title: 'Titre',
    status_workspace: 'Espace de travail',
    status_yes: 'Oui',
    stream_stopped: 'Réponse arrêtée.',
    subagent_children: 'Sous-sessions de sous-agents',
    title_change_hint: 'Utilisez `/title <nouveau nom>` pour renommer.',
    title_current: 'Titre actuel',
    title_set: 'Titre défini sur',
    undid_messages_suffix: 'message(s).',
    undid_n_messages: 'Supprimé',
    undo_exchange: 'Annuler le dernier échange',
    undo_failed: 'Échec de l\'annulation : ',
    usage_default_model: 'par défaut',
    usage_estimated_cost: 'Coût estimé',
    usage_heading: 'Consommation de tokens',
    usage_input_tokens: 'Tokens d\'entrée',
    usage_load_failed: 'Échec du chargement de la consommation : ',
    usage_output_tokens: 'Tokens de sortie',
    usage_settings_tip: 'Note : les estimations de coût sont approximatives.',
    usage_total: 'Total de tokens',
    usage_unknown: 'inconnu',
    workspace_auto_create_folder: 'Créer le dossier s\'il n\'existe pas',
    outline_title: 'Plan',
    outline_empty: 'Pas encore de questions.',
    outline_loading: 'Chargement…',
  },

  tr: {




    offline_title: 'Bağlantı kesildi',
    offline_browser_detail: 'Tarayıcınız bu cihazın çevrimdışı olduğunu bildiriyor.',
    offline_network_detail: 'Hermes\'e şu anda bu tarayıcıdan ulaşılamıyor.',
    offline_autorefresh: 'Hermes\'e tekrar ulaşılabilir olduğunda bu sayfayı otomatik olarak yenileyeceğim.',
    offline_check_now: 'Şimdi kontrol et',
    offline_checking: 'Kontrol ediliyor\u2026',
    offline_stream_waiting: 'Bağlantı kesildi. Yenilenmesi bekleniyor\u2026',
    _lang: 'tr',
    _label: 'Türkçe',
    _speech: 'tr-TR',
    // boot.js
    cancelling: 'İptal ediliyor\u2026',
    cancel_failed: 'İptal başarısız oldu:',
    mic_denied: 'Mikrofon erişimi reddedildi. Tarayıcı izinlerini kontrol edin.',
    mic_no_speech: 'Konuşma algılanmadı. Tekrar deneyin.',
    mic_network: 'Konuşma tanıma kullanılamıyor.',
    mic_error: 'Ses girişi hatası:',
    voice_dictate: 'Dikte',
    voice_dictate_active: 'Dikteyi durdur',
    voice_recording_active: 'Kaydı durdur',
    voice_mode_toggle: 'Ses modu',
    voice_mode_toggle_active: 'Ses modundan çık',
    voice_listening: 'Dinleniyor\u2026',
    voice_speaking: 'Konuşuyor\u2026',
    voice_thinking: 'Düşünüyor\u2026',
    voice_error: 'Ses bu tarayıcıda desteklenmiyor',
    voice_mode_active: 'Ses modu açık',
    voice_mode_off: 'Ses modu kapalı',
    session_imported: 'Oturum içe aktarıldı',
    import_failed: 'İçe aktarma başarısız oldu:',
    import_invalid_json: 'Geçersiz JSON',
    image_pasted: 'Yapıştırılan resim:',
    // messages.js
    edit_message: 'Mesajı düzenle',
    regenerate: 'Yanıtı yeniden oluştur',
    copy: 'Kopyala',
    copied: 'Kopyalandı!',
    copy_failed: 'Kopyalama başarısız oldu',
    selected_text_reply: 'Seçimle yanıtla',
    selected_text_reply_title: 'Seçilen sohbet metnini alıntılanan bağlam olarak ekle',
    selected_text_reply_appended: 'Seçilen metin besteciye eklendi',
    saved_prompts_empty: 'Henüz kaydedilmiş istem yok.',
    saved_prompts_save_current: 'Mevcut girişi istem olarak kaydet',
    saved_prompts_saved: 'İstem kaydedildi',
    saved_prompts_delete: 'İstemi sil',
    saved_prompts_empty_input: 'Önce kaydedilecek bir istem girin',

    diff_loading: 'Fark yükleniyor',
    diff_error: 'Yama dosyası yüklenemedi',
    diff_too_large: 'Yama dosyası satır içi görüntülenemeyecek kadar büyük',
    tree_view: 'Ağaç',
    raw_view: 'Çiğ',
    parse_failed_note: 'ayrıştırma başarısız oldu',
    you: 'Sen',
    mcp_servers_title: 'MCP Sunucuları',
    mcp_servers_desc: 'config.yaml dosyasında yapılandırılmış MCP sunucularını görüntüleyin.',
    mcp_no_servers: 'Hiçbir MCP sunucusu yapılandırılmadı.',
    mcp_add_server: '+ Sunucu Ekle',
    mcp_field_name: 'Sunucu Adı',
    mcp_transport_label: 'Taşıma Türü',
    mcp_field_command: 'Emretmek',
    mcp_field_args: 'Bağımsız Değişkenler (virgülle ayrılmış)',
    mcp_field_url: 'URL\'si',
    mcp_field_timeout: 'Zaman aşımı (saniye)',
    mcp_save: 'Kaydetmek',
    mcp_cancel: 'İptal etmek',
    mcp_name_required: 'Sunucu adı gerekli.',
    mcp_url_required: 'HTTP aktarımı için URL gereklidir.',
    mcp_command_required: 'Stdio aktarımı için komut gereklidir.',
    mcp_saved: 'MCP sunucusu kaydedildi.',
    mcp_save_failed: 'MCP sunucusu kaydedilemedi.',
    mcp_delete_confirm_title: 'MCP Sunucusunu Sil',
    mcp_delete_confirm_message: '"{0}" MCP sunucusu silinsin mi? Bu eylem geri alınamaz.',
    mcp_deleted: 'MCP sunucusu silindi.',
    mcp_delete_failed: 'MCP sunucusu silinemedi.',
    mcp_load_failed: 'MCP sunucuları yüklenemedi.',
    mcp_restart_hint: 'Sunucu değişiklikleri şimdilik burada salt okunurdur. Değişikliklerin etkili olması için config.yaml dosyasını düzenleyin ve Hermes\'i yeniden başlatın.',
    mcp_enable_server: 'Bu MCP sunucusunu etkinleştir',
    mcp_disable_server: 'Bu MCP sunucusunu devre dışı bırak',
    mcp_enabled_toast: (name) => `"${name}" MCP sunucusu etkinleştirildi.`,
    mcp_disabled_toast: (name) => `"${name}" MCP sunucusu devre dışı bırakıldı.`,
    mcp_toggle_failed: 'MCP sunucusu güncellenemedi.',
    open_in_vscode: 'VS Code\'da aç',
    open_in_vscode_failed: 'VS Code\'da açılamadı: ',
    settings_label_ignore_agent_updates: 'Agent güncellemelerini yoksay',
    settings_desc_ignore_agent_updates: 'WebUI güncelleme denetimlerini açık tutun, ancak Agent güncelleme bildirimlerini gizleyin ve Agent güncelleme getirme işlemlerini atlayın.',
    mcp_toggle_followup: 'Etkinleştirme/devre dışı bırakma kontrolleri, MCP yeniden yükleme semantiği açıkça ortaya çıkana kadar kasıtlı olarak ertelenir.',
    mcp_status_active: 'Aktif',
    mcp_status_configured: 'Yapılandırılmış',
    mcp_status_disabled: 'Engelli',
    mcp_status_invalid_config: 'Geçersiz yapılandırma',
    mcp_status_unknown: 'Bilinmiyor',
    mcp_tool_count: '{0} araç',
    mcp_enabled_yes: 'Etkinleştirilmiş',
    mcp_enabled_no: 'Engelli',
    mcp_tools_title: 'MCP Araçları',
    mcp_tools_desc: 'Aktif MCP sunucularında bilinen araçları arayın.',
    mcp_tools_search_placeholder: 'Araçlarda ada, sunucuya veya açıklamaya göre arama yapın\u2026',
    mcp_tools_no_tools: 'Etkin çalışma zamanı envanterinde hiçbir MCP aracı mevcut değil.',
    mcp_tools_no_matches: 'Aramanızla eşleşen MCP aracı yok.',
    mcp_tools_load_failed: 'MCP araçları yüklenemedi.',
    mcp_tools_schema_empty: 'Şema parametresi yok.',
    mcp_tools_runtime_note: 'Araç envanteri yalnızca önceden bilinen etkin MCP çalışma zamanı verilerini kullanır; WebUI sunucuları başlatmaz veya sorgulamaz.',
    mcp_tools_summary_no_matches: (query,total) => `“${query}” ile eşleşen MCP aracı yok (toplam ${total} MCP araç).`,
    mcp_tools_summary_none: 'Gösterilecek MCP aracı yok.',
    mcp_tools_summary_matching: (query) => `"${query}" ile eşleşen`,
    mcp_tools_summary_total_note: (total) => `(${total} toplam MCP araç)`,
    mcp_tools_summary_showing: (start,end,filtered,searchNote,totalNote,page,pages) => `${start}-${end} / ${filtered} MCPtools${searchNote}${totalNote} gösteriliyor. Sayfa ${page} / ${pages}.`,
    mcp_tools_page_size_prefix: 'Göstermek',
    mcp_tools_page_size_suffix: 'sayfa başına',
    mcp_tools_per_page_aria: 'Sayfa başına MCP araçları',
    mcp_tools_inactive_configured_servers: (servers) => `Yapılandırılmış ancak bu WebUI çalışma zamanında etkin değil: ${servers}.`,
    mcp_tools_pagination_label: 'MCP araçları sayfalandırması',
    mcp_tools_previous_page: '‹ Önceki',
    mcp_tools_previous_page_aria: 'Önceki MCP araçları sayfası',
    mcp_tools_next_page: 'Sonraki >',
    mcp_tools_next_page_aria: 'Sonraki MCP araçları sayfası',
    thinking: 'Düşünme',
    expand_all: 'Tümünü genişlet',
    collapse_all: 'Tümünü daralt',
    edit_failed: 'Düzenleme başarısız oldu:',
    regen_failed: 'Yeniden oluşturma başarısız oldu:',
    reconnect_active: 'Halen bir yanıt oluşturuluyor. Hazır olduğunuzda yeniden yüklensin mi?',
    reconnect_finished: 'En son ayrıldığınızda bir yanıt sürüyordu. Mesajlar güncellenmiş olabilir.',
    // approval card
    approval_heading: 'Onay gerekli',
    approval_desc_prefix: 'Tehlikeli komut algılandı',
    approval_btn_once: 'Bir kez izin ver',
    approval_btn_once_title: 'Bu tek komuta izin ver (Enter)',
    approval_btn_session: 'Oturuma izin ver',
    approval_btn_session_title: 'Bu konuşma oturumuna izin ver',
    approval_btn_always: 'Her zaman izin ver',
    approval_btn_always_title: 'Bu komut düzenine her zaman izin ver',
    approval_btn_deny: 'Reddetmek',
    approval_btn_deny_title: 'Reddet — bu komutu çalıştırma',
    approval_responding: 'Yanıt veriliyor\u2026',
    clarify_heading: 'Açıklama gerekli',
    clarify_hint: 'Bir seçim yapın veya kendi cevabınızı aşağıya yazın.',
    clarify_other: 'Diğer',
    clarify_send: 'Göndermek',
    clarify_input_placeholder: 'Yanıtınızı yazın\u2026',
    clarify_responding: 'Yanıt veriliyor\u2026',
    session_attention_approval: (n) => n === 1 ? 'Onay' : `${n} onay`,
    session_attention_clarify: (n) => n === 1 ? 'Soru' : `${n} soru`,
    session_attention_generic: (n) => n === 1 ? 'Dikkat' : `${n} öğe`,
    session_attention_approval_title: 'İzin kararı bekleniyor',
    session_attention_clarify_title: 'Yanıtınız bekleniyor',
    session_attention_generic_title: 'Kullanıcı eylemi bekleniyor',
    untitled: 'İsimsiz',
    n_messages: (n) => `${n}개 메시지`,
    load_older_messages: '↑ Eski mesajları yüklemek için yukarı kaydırın veya tıklayın',
    session_jump_start: 'Başlangıç',
    session_jump_start_label: 'Oturumun başlangıcına atla',
    session_jump_end: 'Son',
    session_jump_end_label: 'Oturumun sonuna atla',
    session_new_message: 'Yeni mesaj',
    session_new_message_label: 'Yeni mesaj mevcut, sona atla',
    jump_to_question: 'yanıta',
    jump_to_question_label: 'Bu yanıtın başına git',
    queued_label: 'Yanıttan sonra gönderilir',
    queued_count: (n) => n === 1 ? '1 queued' : `${n} queued`,
    queued_cancel: 'Sıraya alınmış mesajı iptal et',
    model_unavailable: '(mevcut değil)',
    model_unavailable_title: 'Bu model artık mevcut sağlayıcı listenizde değil',
    provider_mismatch_warning: (m,p) => `"${m}" yapılandırılmış sağlayıcınızla (${p}) çalışmayabilir. Yine de gönderin veya geçiş yapmak için terminalinizde \`hermes model\` komutunu çalıştırın.`,
    provider_mismatch_label: 'Sağlayıcı uyumsuzluğu',
    gateway_auth_label: 'Gateway kimlik doğrulaması başarısız',
    model_not_found_label: 'Model bulunamadı',
    model_custom_label: 'Özel model kimliği',
    model_custom_placeholder: 'örneğin openai/gpt-5.4',
    model_search_placeholder: 'Modelleri ara\u2026',
    session_toolsets: 'Oturum araç setleri',
    session_toolsets_desc: 'Bu oturum için kullanılabilir araçları kısıtlayın (boş = genel yapılandırma)',
    session_toolsets_global: 'Genel (varsayılan)',
    session_toolsets_custom: 'Özel',
    session_toolsets_placeholder: 'araç1, araç2, \u2026',
    session_toolsets_apply: 'Uygula',
    session_toolsets_clear: 'Temizle (geneli kullan)',
    session_toolsets_applied: 'Araç setleri güncellendi',
    session_toolsets_cleared: 'Araç setleri temizlendi — genel yapılandırma kullanılıyor',
    session_toolsets_failed: 'Araç setleri güncellenemedi: ',
    model_search_no_results: 'Hiçbir model bulunamadı',
    model_group_configured: 'Yapılandırılmış',
    ws_search_placeholder: 'Çalışma alanlarını arayın\u2026',
    ws_no_results: 'Çalışma alanı bulunamadı',
    workspace_new_worktree_conversation: 'Worktree\'de yeni konuşma',
    workspace_new_worktree_conversation_meta: 'Bu çalışma alanı için yalıtılmış bir git çalışma ağacı oluşturun.',
    workspace_worktree_created: 'Worktree görüşmesi oluşturuldu',
    workspace_worktree_failed: 'Çalışma ağacı oluşturma işlemi başarısız oldu:',
    session_worktree_badge: 'Çalışma Ağacı',
    model_scope_advisory: 'Bir sonraki mesajınızdan itibaren bu görüşmeye uygulanır.',
    model_scope_toast: 'Bir sonraki mesajınızdan itibaren bu görüşmeye uygulanır.',
    // commands.js
    cmd_clear: 'Konuşma mesajlarını temizle',
    cmd_help: 'Show available slash commands',
    cmd_compress: 'Konuşma içeriğini manuel olarak sıkıştırın (kullanım: /compress [konuya odaklan])',
    ctx_compress_hint: 'Yer açmak için bağlamı sıkıştırın →',
    ctx_compress_action: '⚠ Şimdi serbest bağlama sıkıştırın',
    cmd_compact_alias: '/compress için eski takma ad',
    cmd_model: 'Modeli değiştir (ör. /model gpt-4o)',
    cmd_workspace: 'Çalışma alanını ada göre değiştir',
    cmd_terminal: 'Çalışma alanı terminalini açın',
    cmd_new: 'Yeni bir sohbet oturumu başlatın',
    cmd_usage: 'Token kullanımı ekranını aç/kapat',
    cmd_theme: 'Görünümü değiştir (tema: system/dark/light, skin: default/ares/mono/graphite/slate/poseidon/sisyphus/charizard/sienna/catppuccin/nous/geist-contrast/zeus/verdigris)',
    cmd_personality: 'Temsilci kişiliğini değiştir',
    cmd_skills: 'Mevcut Hermes becerilerini listele',
    cmd_use: 'Sonraki mesaj için bir beceriyi zorla',
    available_commands: 'Mevcut komutlar:',
    type_slash: 'Komutları görmek için / yazın',
    conversation_cleared: 'Görüşme temizlendi',
    command_label: 'Komut',
    context_compaction_label: 'Bağlam sıkıştırma',
    retrieval_context_label: 'Dizine alınmış bağlam',
    retrieval_context_preview: 'Daha önceki mesajlar depolanır ve bağlam araçlarıyla alınabilir',
    preserved_task_list_label: 'Korunmuş görev listesi',
    reference_only_label: 'Yalnızca referans',
    model_usage: 'Kullanım: /model <isim>',
    no_model_match: 'Eşleşen model yok: "',
    model_did_you_mean: (m) => ` — şunu mu demek istediniz: "${m}"?`,
    switched_to: 'Şuraya geçildi:',
    workspace_usage: 'Kullanım: /workspace <isim>',
    no_workspace_match: 'Eşleşen çalışma alanı yok: "',
    switched_workspace: 'Çalışma alanına geçildi:',
    workspace_switch_failed: 'Çalışma alanı anahtarı başarısız oldu:',
    new_session: 'Yeni oturum oluşturuldu',
    new_session_creating: 'Yeni görüşme oluşturuluyor\u2026',
    compressing: 'Bağlam sıkıştırması isteniyor...',
    compress_running_label: 'Sıkıştırma',
    compress_complete_label: 'Sıkıştırma tamamlandı',
    auto_compress_label: 'Otomatik sıkıştırma',
    compress_failed_label: 'Sıkıştırma başarısız oldu',
    focus_label: 'Odak',
    token_usage_on: 'Jeton kullanımı açık',
    token_usage_off: 'Jeton kullanımı kapalı',
    usage_cache_hit_detail: 'Önbellek: {0}% isabet ({1} okuma / {2} yazma)',
    usage_cached_percent: '{0}% önbelleğe alındı',
    theme_usage: 'Kullanım: /theme ',
    theme_set: 'Tema:',
    no_active_session: 'Aktif oturum yok',
    cmd_queue: 'Bir sonraki dönüş için bir mesajı sıraya koy',
    cmd_goal: 'Kalıcı bir hedef belirleyin veya inceleyin',
    goal_evaluating_progress: 'Hedef ilerlemesi değerlendiriliyor\u2026',
    goal_working_toward: 'Hedefe doğru çalışmak\u2026',
    goal_continuing_toast: 'Hedefe doğru devam\u2026',
    goal_status_none: 'Aktif hedef yok. /goal <text> ile bir tane ayarlayın.',
    goal_status_active: (turns, max_turns, goal) => `⊙ Hedef (aktif, ${turns}/${max_turns} tur): ${goal}`,
    goal_status_paused: (turns, max_turns, reason, goal) => `⏸ Hedef (duraklatıldı, ${turns}/${max_turns}${reason ? `, ${reason}` : ''}): ${goal}`,
    goal_status_done: (turns, max_turns, goal) => `✓ Hedef tamamlandı (${turns}/${max_turns}): ${goal}`,
    goal_set: (turns, goal) => `⊙ Hedef belirlendi (${turns}-dönüş bütçesi): ${goal}`,
    goal_paused: (goal) => `⏸ Hedef duraklatıldı: ${goal}`,
    goal_resumed: (goal) => `▶ Hedef devam ettirildi: ${goal}`,
    goal_cleared: 'Hedef temizlendi.',
    goal_no_goal: 'Aktif hedef yok.',
    goal_achieved: (reason) => `✓ Hedefe ulaşıldı: ${reason}`,
    goal_paused_budget_exhausted: (turns, max_turns) => `⏸ Hedef duraklatıldı — ${turns}/${max_turns} tur kullanıldı. Devam etmek için /goal devamını, durdurmak için /goal clear komutunu kullanın.`,
    goal_continuing: (turns, max_turns, reason) => `↻ Hedefe doğru devam ediyoruz (${turns}/${max_turns}): ${reason}`,
    cmd_interrupt: 'Mevcut dönüşü iptal et ve yeni bir mesaj gönder',
    cmd_steer: 'Temsilciyi kesintiye uğratmadan dönüş ortası düzeltmesi enjekte edin',
    cmd_queue_no_msg: 'Kullanım: /queue <mesaj>',
    cmd_queue_not_busy: 'Etkin görev yok; yalnızca normal şekilde gönderin',
    cmd_queue_confirm: 'İleti sıraya alındı',
    cmd_interrupt_no_msg: 'Kullanım: /interrupt <mesaj>',
    cmd_interrupt_confirm: 'Kesintiye uğradı — yeni mesaj gönderilir',
    cmd_steer_no_msg: 'Kullanım: /steer <mesaj>',
    cmd_steer_fallback: 'Yönlendirme kullanılamıyor - bunun yerine bir sonraki dönüş için sıraya alındı',
    cmd_steer_delivered: 'Yönlendirme teslim edildi — temsilci bunu bir sonraki takım sonucunda görecek',
    steer_leftover_queued: 'Direksiyon bir sonraki dönüş için kuyruğa alındı',
    busy_steer_fallback: 'Yönlendirme kullanılamıyor — bir sonraki dönüş için kuyruğa alındı',
    busy_interrupt_confirm: 'Kesintiye uğradı — yeni mesaj gönderilir',
    settings_label_busy_input_mode: 'Meşgul giriş modu',
    settings_desc_busy_input_mode: 'Aracı çalışırken bir mesaj gönderdiğinizde ne olacağını kontrol eder. Sıra bekler; Interrupt iptal eder ve yeniden başlar; Steer, dönüşün ortasında kesintiye uğramadan bir düzeltme enjekte eder (aracı veya akış mevcut olmadığında kuyruğa geri döner).',
    settings_label_fade_text_effect: 'Metin efektini soldur',
    settings_desc_fade_text_effect: 'Asistan yanıt verirken yeni aktarılan sözcüklerin geçişini sağlayın. OpenWebUI\'ye benzer; Maksimum performans için varsayılan olarak kapalıdır.',
    settings_busy_input_mode_queue: 'Sıra takibi',
    settings_busy_input_mode_interrupt: 'Mevcut dönüşü kes',
    settings_busy_input_mode_steer: 'Yönlendirme (dönüş ortası düzeltme)',

    slash_skill_badge: 'Yetenek',
    slash_skill_desc: 'Bu beceriyi çağır',
    cmd_stop: 'Mevcut yanıtı durdur',
    cmd_title: 'Oturum başlığını alın veya ayarlayın',
    cmd_retry: 'Son mesajı tekrar gönder',
    cmd_undo: 'Son değişimi kaldır',
    cmd_btw: 'Bir yan soru sorun (geçici)',
    cmd_btw_usage: '/btw <soru> — oturum bağlamını kullanarak bir yan soru sorun',
    cmd_background: 'Arka planda bir istem çalıştır',
    cmd_background_usage: '/background <istem> — engellemeden paralel olarak çalıştır',
    btw_asking: 'Yan soruyu sormak...',
    btw_label: 'Yan soru – tarihte değil',
    btw_done: 'Yan soru cevaplandı',
    btw_no_answer: 'Cevap alınmadı.',
    btw_failed: 'Yan soru başarısız oldu:',
    bg_running: 'Arka planda çalışıyor...',
    bg_complete: 'Arka plan görevi tamamlandı',
    bg_label: 'Arka plan sonucu:',
    bg_no_answer: '(cevap yok)',
    bg_failed: 'Arka plan görevi başarısız oldu:',
    undo_exchange: 'Son değişimi geri al',
    cmd_status: 'Oturum bilgilerini göster',
    cmd_voice: 'Mikrofon girişini değiştir',
    stream_stopped: 'Yanıt durduruldu.',
    no_active_task: 'Durdurulacak etkin görev yok.',
    cancel_unavailable: 'İptal kullanılamıyor.',
    retry_failed: 'Yeniden deneme başarısız oldu:',
    undo_failed: 'Geri alma başarısız oldu:',
    undid_n_messages: 'Kaldırıldı',
    undid_messages_suffix: 'mesaj(lar).',
    status_heading: 'Oturum Durumu',
    status_session_id: 'Oturum Kimliği',
    status_title: 'Başlık',
    status_model: 'Modeli',
    status_provider: 'sağlayıcı',
    status_workspace: 'Çalışma alanı',
    status_personality: 'Kişilik',
    status_messages: 'Mesajlar',
    status_agent_running: 'Aracı çalışıyor',
    status_profile: 'Profil',
    status_hermes_home: 'Hermes\'in evi',
    status_started: 'Başlatıldı',
    status_tokens: 'Jetonlar',
    status_updated: 'Güncellendi',
    status_ephemeral: 'Geçici anlık görüntü — transkript geçmişine kaydedilmez.',
    status_no_tokens: 'Hiç jeton kullanılmadı',
    status_unknown: 'Bilinmiyor',
    status_yes: 'Evet',
    status_no: 'HAYIR',
    status_load_failed: 'Durum yüklenemedi:',
    title_current: 'Mevcut başlık',
    title_change_hint: 'Yeniden adlandırmak için `/title <yeni ad>` kullanın.',
    title_set: 'Başlık şu şekilde ayarlandı:',
    cmd_webui_only_session: 'Bu komut CLI\'den içe aktarılan oturumlar için kullanılamaz.',
    cmd_voice_use_mic: 'Bestecideki mikrofon düğmesine tıklayın.',
    usage_heading: 'Jeton Kullanımı',
    usage_default_model: 'varsayılan',
    usage_unknown: 'bilinmiyor',
    usage_input_tokens: 'Giriş jetonları',
    usage_output_tokens: 'Çıkış jetonları',
    usage_total: 'Toplam jeton',
    usage_estimated_cost: 'Tahmini maliyet',
    usage_settings_tip: 'Not: Maliyet tahminleri yaklaşık değerlerdir.',
    usage_load_failed: 'Kullanım yüklenemedi:',
    usage_personality_none: 'hiçbiri',
    no_personalities: 'Hiç kişilik bulunamadı (onları ~/.hermes/personalities/ dosyasına ekleyin)',
    available_personalities: 'Mevcut kişilikler:',
    personality_switch_hint: 'Geçiş yapmak için `/kişilik <ad>` kullanın veya temizlemek için `/kişilik yok` kullanın.',
    personalities_load_failed: 'Kişilikler yüklenemedi',
    personality_cleared: 'Kişilik temizlendi',
    personality_set: 'Kişilik:',
    failed_colon: 'Arızalı:',
    // ui.js
    no_workspace: 'Çalışma alanı yok',
    terminal_open_title: 'Çalışma alanı terminalini aç',
    terminal_no_workspace_title: 'Terminali açmak için bir çalışma alanı seçin',
    terminal_title: 'terminal',
    terminal_clear: 'Temizle',
    terminal_copy_output: 'Çıktıyı kopyala',
    terminal_restart: 'Tekrar başlat',
    terminal_collapse: 'Yıkılmak',
    terminal_expand: 'Genişletmek',
    terminal_close: 'Kapalı',
    terminal_input_placeholder: 'Bir komut çalıştır...',
    terminal_start_failed: 'Terminal başlatma başarısız oldu:',
    terminal_input_failed: 'Terminal girişi başarısız oldu:',
    terminal_copy_failed: 'Kopyalama başarısız oldu:',
    terminal_error: 'Terminal hatası',
    terminal_remote_backend_unsupported: 'Gömülü terminal yalnızca yerel terminal arka uçlarında desteklenir.',
    workspace_empty_no_path: 'Çalışma alanı seçilmedi. Dosyalara göz atmak için Ayarlar \u2192 Çalışma Alanı\'nda bir çalışma alanı ayarlayın.',
    workspace_empty_dir: 'Bu çalışma alanı boş.',
    workspace_show_hidden_files: 'Gizli dosyaları göster',
    workspace_show_hidden_files_desc: 'Dosya ağacına .DS_Store, .git, node_modules ve diğer gizli / sistem dosyalarını ekleyin.',
    workspace_hidden_files_visible: 'gizli görünür',
    workspace_hidden_files_visible_title: 'Gizli dosyalar görünür — seçenekler için tıklayın',
    workspace_options: 'Çalışma alanı seçenekleri',
    dialog_confirm_title: 'İşlemi onayla',
    dialog_prompt_title: 'Bir değer girin',
    dialog_confirm_btn: 'Onaylamak',
    // workspace.js
    unsaved_confirm: 'Önizlemede kaydedilmemiş değişiklikleriniz var. Atılıp gezinilsin mi?',
    discard: 'At',
    save: 'Kaydetmek',
    edit: 'Düzenlemek',
    clear: 'Temizle',
    create: 'Oluştur',
    remove: 'Kaldır',
    save_title: 'Değişiklikleri kaydet',
    edit_title: 'Bu dosyayı düzenle',
    saved: 'Kaydedildi',
    save_failed: 'Kaydetme başarısız oldu:',
    image_load_failed: 'Resim yüklenemedi',
    file_open_failed: 'Dosya açılamadı',
    downloading: (name) => `${name} indiriliyor\u2026`,
    double_click_rename: 'Yeniden adlandırmak için çift tıklayın',
    session_rename_failed_no_row: 'Could not start rename — row not found.',
    renamed_to: 'Yeniden adlandırıldı',
    rename_failed: 'Yeniden adlandırma başarısız oldu:',
    moved_to: 'Taşındı: ',
    move_failed: 'Taşıma başarısız: ',
    delete_title: 'Sil',
    delete_confirm: (name) => `${name} silinsin mi?`,
    delete_dir_confirm: (name) => `"${name}" klasörü ve tüm içeriği silinsin mi?`,
    rename_title: 'Yeniden isimlendirmek',
    rename_prompt: 'Yeni isim:',
    deleted: 'Silindi',
    delete_failed: 'Silinemedi:',
    reveal_in_finder: 'Dosya Yöneticisinde Göster',
    reveal_failed: 'Açıklanamadı:',
    copy_file_path: 'Dosya yolunu kopyala',
    download_folder: 'İndirme klasörü',
    path_copied: 'Dosya yolu panoya kopyalandı',
    path_copy_failed: 'Yol kopyalanamadı:',
    session_rename: 'Konuşmayı yeniden adlandır',
    session_rename_desc: 'Bu görüşmenin başlığını düzenleyin',
    session_title_regenerate: 'Başlığı yeniden oluştur',
    session_title_regenerate_desc: 'Hermes\'ten görüşmeden yeni bir başlık oluşturmasını iste',
    session_title_regenerating: 'Başlık yeniden oluşturuluyor…',
    session_title_regenerated: (title) => `Başlık yeniden oluşturuldu: ${title}`,
    session_title_regenerate_failed: 'Başlık yeniden oluşturma başarısız: ',
    session_copy_link: 'Konuşma bağlantısını kopyala',
    session_copy_link_desc: 'Bu konuşmaya doğrudan bağlantı kopyala',
    session_link_copied: 'Konuşma bağlantısı panoya kopyalandı',
    session_link_copy_failed: 'Konuşma bağlantısı kopyalanamadı: ',
    new_file_prompt: 'Yeni dosya adı (örn. Notes.md):',
    new_file: 'Yeni Dosya',
    new_folder: 'Yeni Klasör',
    workspace_root: 'çalışma alanı kökü',
    new_file_prompt_title: '{0} içindeki yeni dosya adı:',
    new_folder_prompt_title: '{0} içindeki yeni klasör adı:',
    project_name_prompt: 'Proje adı:',
    created: 'Oluşturuldu',
    create_failed: 'Oluşturma başarısız oldu:',
    new_folder_prompt: 'Yeni klasör adı:',
    folder_created: 'Oluşturulan klasör',
    folder_create_failed: 'Klasör oluşturulamadı:',
    workspace_auto_create_folder: 'Mevcut değilse klasör oluşturun',
    folder_add_as_space_btn: 'Alan Olarak Ekle',
    folder_add_as_space_msg: 'Bu klasör çalışma alanı listenize yeni bir alan olarak eklensin mi?',
    archive_extracted: (n, c) => `${c} arşivden ${n} dosya çıkarıldı`,
    folder_add_as_space_title: 'Alan olarak eklensin mi?',
    remove_title: 'Kaldırmak',
    empty_dir: '(boş)',
    upload_failed: 'Yükleme başarısız oldu:',
    upload_too_large: (maxMb, fileMb) => `Dosya çok büyük (${fileMb} MB). Maksimum yükleme boyutu ${maxMb} MB'tır.`,
    uploading: 'Yükleniyor…',
    uploaded: 'Yüklendi',
    all_uploads_failed: (n) => `${n} yüklemenin tümü başarısız oldu`,
    session_pin: 'Görüşmeyi sabitle',
    session_unpin: 'Görüşmenin sabitlemesini kaldır',
    session_pin_desc: 'Bu sohbeti en üstte tut',
    session_unpin_desc: 'Sabitlenenlerden kaldır',
    session_pin_failed: 'Pin başarısız oldu:',
    session_move_project: 'Projeye taşı',
    session_move_project_desc_has: 'Bu görüşmenin projesini değiştirin',
    session_move_project_desc_none: 'Bu görüşmeye bir proje atayın',
    session_archive: 'Konuşmayı arşivle',
    session_hide_external: 'Listeden gizle',
    session_restore: 'Konuşmayı geri yükle',
    session_archive_desc: 'Arşivlendi gösterilene kadar bu konuşmayı gizle',
    session_archive_worktree_desc: 'Bu konuşmayı gizle; çalışma ağacını diskte tut',
    session_hide_external_desc: 'Kaynak geçmişini silmeden içe aktarılan bu oturumu WebUI\'dan gizleyin.',
    session_restore_desc: 'Bu görüşmeyi ana listeye geri getir',
    session_archived: 'Oturum arşivlendi',
    session_archived_worktree: 'Oturum arşivlendi. Worktree diskte kalır.',
    session_hidden: 'Oturum listede gizlendi',
    session_restored: 'Oturum geri yüklendi',
    session_archive_failed: 'Arşivleme başarısız oldu:',
    session_duplicate: 'Yinelenen görüşme',
    session_duplicate_desc: 'Aynı çalışma alanı ve modelle bir kopya oluşturun',
    session_duplicated: 'Oturum kopyalandı',
    session_duplicate_failed: 'Kopyalama başarısız oldu:',
    session_stop_response: 'Yanıtı durdur',
    session_stop_response_desc: 'Bu görüşme için çalışan yanıtı iptal edin',
    session_delete: 'Konuşmayı sil',
    session_delete_desc: 'Bu görüşmeyi kalıcı olarak kaldır',
    session_delete_confirm: 'Bu görüşme silinsin mi?',
    session_delete_worktree_desc: 'Yalnızca WebUI görüşmesini silin; çalışma ağacını diskte tut',
    session_delete_worktree_confirm: (path) => `Bu görüşme silinsin mi? ${path} worktree diske kalır.`,
    session_deleted: 'Görüşme silindi',
    session_deleted_worktree: 'Görüşme silindi. Worktree diskte kalır.',
    session_worktree_remove: 'Çalışma ağacını kaldır',
    session_worktree_remove_desc: (path) => `${path} git worktree'sini diskten siler`,
    session_worktree_remove_confirm: (path) => `Git worktree diskten silinsin mi?\n\nYol: ${path}\n\nTüm worktree dizini silinir. Oturum verileri WebUI'de kalır.`,
    session_worktree_remove_not_exists: (path) => `${path} worktree'si artık diskte yok.`,
    session_worktree_remove_confirm_label: 'Kaldırmak',
    session_worktree_removed: 'Worktree kaldırıldı.',
    session_worktree_remove_failed: 'Çalışma ağacı kaldırılamadı:',
    session_worktree_remove_status_failed: 'Çalışma ağacı durumu okunamadı:',
    session_worktree_remove_locked_by_stream: 'Kaldırılamıyor — etkin bir akış oturumu bu çalışma ağacını kullanıyor.',
    session_worktree_remove_locked_by_terminal: 'Kaldırılamıyor — etkin bir terminal oturumu bu çalışma ağacını kullanıyor.',
    session_worktree_remove_unsafe_blocked: 'Bu çalışma ağacını kaldırmadan önce yerel değişiklikleri veya gönderilmemiş taahhütleri çözümleyin.',
    session_worktree_remove_dirty_warning: 'UYARI: Bu çalışma ağacında kaybolacak kaydedilmemiş değişiklikler var.',
    session_worktree_remove_untracked_warning: (count) => `${count} izlenmeyen dosya kalıcı olarak silinecek.`,
    session_worktree_remove_ahead_warning: (ahead) => `${ahead} gönderilmemiş commit kaybolacak.`,
    session_select_mode: 'Seçme',
    session_select_mode_desc: 'Toplu olarak yönetilecek konuşmaları seçin',
    session_select_all: 'Tümünü seç',
    session_deselect_all: 'Tümünün seçimini kaldır',
    session_selected_count: '{0} seçildi',
    session_batch_archive: 'Arşiv',
    session_batch_delete: 'Silmek',
    session_batch_move: 'Projeye taşı',
    session_batch_delete_confirm: '{0} görüşme silinsin mi?',
    session_batch_archive_confirm: '{0} ileti dizisi arşivlensin mi?',
    session_batch_delete_worktree_confirm: '{0} görüşme silinsin mi? {1} çalışma ağacı destekli konuşma, çalışma ağacı dizinlerini diskte bırakacak.',
    session_batch_archive_worktree_confirm: '{0} ileti dizisi arşivlensin mi? {1} çalışma ağacı destekli görüşme, çalışma ağacı dizinlerini diskte tutacak.',
    session_no_selection: 'Hiçbir görüşme seçilmedi',
    // settings panel
    settings_heading_title: 'Kontrol Merkezi',
    settings_heading_subtitle: 'Tercihler, konuşma araçları ve sistem kontrolleri.',
    settings_section_conversation_title: 'Konuşma',
    settings_section_appearance_title: 'Dış görünüş',
    settings_section_appearance_meta: 'Tema, vurgu renkleri ve görsel stil.',
    settings_section_preferences_title: 'Tercihler',
    settings_section_preferences_meta: 'Hermes Web Kullanıcı Arayüzü için varsayılanlar ve Kullanıcı Arayüzü davranışı.',
    settings_section_system_title: 'Sistem',
    settings_section_system_meta: 'Örnek sürümü ve erişim kontrolleri.',
    settings_check_now: 'Şimdi kontrol et',
    settings_checking: 'Kontrol ediliyor\u2026',
    settings_up_to_date: 'Güncel \u2713',
    settings_updates_available: '{count} güncelleme mevcut',
    settings_updates_disabled: 'Güncelleme kontrolleri devre dışı bırakıldı',
    settings_update_check_failed: 'Güncelleme kontrolü başarısız oldu',
    settings_label_workspace_panel_open: 'Çalışma alanı panelini varsayılan olarak açık tut',
    settings_desc_workspace_panel_open: 'Etkinleştirildiğinde, çalışma alanı / dosya tarayıcı paneli her yeni oturumda otomatik olarak açılır. Yine de istediğiniz zaman manuel olarak kapatabilirsiniz.',
    settings_label_session_jump_buttons: 'Oturum atlama düğmelerini göster',
    settings_desc_session_jump_buttons: 'Uzun oturum geçmişlerini okurken kayan Başlat ve Bitir düğmelerini gösterin.',
    settings_label_terminal_auto_expand: 'Çıktı geldiğinde terminali otomatik genişlet',
    settings_desc_terminal_auto_expand: 'Çalışan bir komut yeni çıktı ürettiğinde daraltılmış terminal panelini otomatik olarak genişletir.',

    settings_label_session_endless_scroll: 'Yukarı kaydırırken eski mesajları yükle',

    settings_desc_session_endless_scroll: 'Etkinleştirildiğinde, yukarı doğru kaydırdığınızda eski mesajlar otomatik olarak yüklenir. Devre dışı bırakıldığında eski mesajlar düğmesini kullanın.',
    settings_label_auto_scroll_follow: 'Yeni içeriği otomatik takip et',
    settings_desc_auto_scroll_follow: 'Etkinleştirildiğinde, yeni belirteçler akarken görünüm en alta kaydırılır. Devre dışı bırakıldığında kaydırma konumunu kendiniz kontrol edersiniz.',
    settings_label_worklog_details_expanded_default: 'Open Worklog details automatically',
    settings_desc_worklog_details_expanded_default: 'When enabled, new Worklog details start expanded so tool, thinking, and progress cards are visible without an extra click. When off, Worklog details stay folded by default; per-turn manual collapse/expand choices still win.',
    settings_label_chat_activity_display_mode: 'Activity display',
    settings_desc_chat_activity_display_mode: 'Compact Worklog groups supporting activity into a quiet summary. Transparent Stream keeps each thinking/tool event as its own chronological expandable row.',
    first_token_time: 'Time to first token',
    done: 'Done',
    settings_option_compact_worklog: 'Compact Worklog',
    settings_option_transparent_stream: 'Transparent Stream',

    settings_label_tab_visibility: 'Kenar çubuğu sekmeleri',
    settings_desc_tab_visibility: 'Kenar çubuğunda ve rayda hangi sekmelerin görüneceğini seçin. Sohbet ve Ayarlar her zaman görünür durumdadır.',
    open_in_browser: 'Tarayıcıda aç',
    settings_dropdown_conversation: 'Konuşma',
    settings_dropdown_appearance: 'Dış görünüş',
    settings_dropdown_preferences: 'Tercihler',
    settings_dropdown_providers: 'Sağlayıcılar',
    settings_dropdown_system: 'Sistem',
    settings_tab_conversation: 'Konuşma',
    settings_tab_appearance: 'Dış görünüş',
    settings_tab_preferences: 'Tercihler',
    settings_tab_plugins: 'Eklentiler',
    settings_plugins_title: 'Eklentiler',
    plugins_enable_toggle: 'Etkinleştir',
    settings_plugins_meta: 'Yüklü Hermes eklentilerini ve yaşam döngüsü kancalarını görüntüleyin. Bu panel salt okunurdur.',
    settings_plugins_empty: 'Görünür Hermes eklentisi yok. Burada görmek için Hermes CLI/config üzerinden yükleyin veya etkinleştirin.',
    plugins_unnamed: 'Adsız eklenti',
    plugins_no_description: 'Açıklama yok.',
    plugins_no_hooks: 'Kayıtlı yaşam döngüsü kancası yok',
    plugins_registered_hooks: 'Kayıtlı kancalar',
    plugins_enabled: 'Etkin',
    plugins_disabled: 'Devre dışı',
    plugins_active_provider: 'Etkin (sağlayıcı)',
    plugins_provider_no_hooks: 'Sağlayıcı eklentisi — agent görünürlük kancası yok',
    plugins_load_failed: 'Eklentiler yüklenemedi: ',
    settings_tab_system: 'Sistem',
    settings_tab_help: 'Help',
    settings_help_meta: 'Resources and support for Hermes WebUI.',
    settings_help_docs_label: 'Documentation',
    settings_help_docs_desc: 'Guides, configuration reference, and the full Hermes WebUI README.',
    settings_help_docs_link: 'Open Documentation',
    settings_help_issue_label: 'Having an issue?',
    settings_help_issue_desc: 'Search existing reports or open a new one on GitHub.',
    settings_help_issue_link: 'Open GitHub Issues',
    settings_title: 'Ayarlar',
    settings_save_btn: 'Ayarları Kaydet',
      settings_label_model: 'Varsayılan Model',
      settings_label_auxiliary_models: 'Yardımcı Modeller',
      settings_desc_auxiliary_models: 'Görü, sıkıştırma, başlık oluşturma vb. yan görevler için yönlendirme. "Otomatik" ana sohbet modelinizi kullanır.',
      settings_aux_loading: 'Yardımcı modeller yükleniyor…',
      settings_aux_load_failed: 'Yardımcı model ayarları yüklenemedi. Agent API\'sinin kullanılabilir olduğundan emin olun.',
      settings_aux_model_auto: 'otomatik (sağlayıcı varsayılanını kullan)',
      settings_aux_provider_auto: 'ana modeli kullan',
      settings_aux_model_custom: 'Özel model…',
      settings_aux_model_custom_prompt: 'Model kimliğini girin:',
      settings_aux_no_changes: 'Uygulanacak değişiklik yok',
      settings_aux_saved: 'Yardımcı modeller güncellendi',
      settings_aux_save_failed: 'Yardımcı model kaydedilemedi',
      settings_aux_reset_confirm_title: 'Yardımcı modeller sıfırlansın mı?',
      settings_aux_reset_confirm_msg: 'Bu, tüm yardımcı görevleri otomatik (ana modeli kullan) olarak ayarlayacaktır.',
      settings_aux_reset_done: 'Yardımcı modeller otomatiğe sıfırlandı',
      settings_btn_apply_aux_models: 'Değişiklikleri uygula',
      settings_btn_reset_aux_models: 'Tümünü otomatiğe sıfırla',
    settings_desc_model: 'Yeni konuşmalar için kullanılır. Mevcut konuşmalar seçilen modellerini korur.',
    settings_label_send_key: 'Anahtar Gönder',
    settings_label_theme: 'Tema',
    settings_label_skin: 'Deri',
    settings_label_font_size: 'Yazı tipi boyutu',
    font_size_small: 'Küçük',
    font_size_default: 'Varsayılan',
    font_size_large: 'Büyük',
    font_size_xlarge: 'Ekstra Büyük',
    settings_autosave_saving: 'Kaydediliyor\u2026',
    settings_autosave_saved: 'Kaydedildi',
    settings_autosave_failed: 'Kaydetme başarısız oldu',
    settings_autosave_retry: 'Yeniden dene',
    settings_label_language: 'Dil',
    settings_label_quota_chip: 'Bestecide sağlayıcı kota çipini göster',
    settings_desc_quota_chip: 'Besteci altbilgisinde bir ortam kalan kota göstergesini (örn. OpenRouter kredi bakiyesi) görüntüler. Varsayılan kapalı. Besteciyi dizüstü bilgisayar ve standart masaüstü genişliklerinde düzenli tutmak için yalnızca etkinleştirildiğinde geniş ekranlarda (≥1400 piksel) görünür.',
    settings_label_conversation_outline: 'Konuşma ana hattını göster',
    settings_desc_conversation_outline: 'Geçerli konuşmadaki kullanıcı soruları için yalnızca masaüstünde görünen bir atlama listesi gösterir. Varsayılan kapalıdır.',
    settings_label_hide_suggestions: 'Yeni sohbet önerilerini gizle',
    settings_desc_hide_suggestions: 'Yanlışlıkla dokunmayı önlemek için boş yeni sohbet ekranındaki üç varsayılan öneri düğmesini gizleyin.',
    settings_label_token_usage: 'Jeton kullanımını göster',
    settings_label_token_speed: 'Jeton hızını (TPS) göster',
    settings_desc_token_speed: 'Akış sırasında ve yanıt tamamlandıktan sonra asistan mesajı başlıklarında saniyedeki jeton sayısını gösterir. Varsayılan olarak kapalıdır.',
    settings_label_sidebar_density: 'Kenar çubuğu yoğunluğu',
    cmd_reasoning: 'Düşünme görünürlüğünü değiştirin (göster/gizle), çaba düzeyini ayarlayın veya mevcut durumu kontrol edin',
    settings_label_external_sessions: 'WebUI olmayan oturumları göster',
    settings_label_cron_sessions: 'Show cron sessions',
    settings_label_previous_messaging_sessions: 'Önceki mesajlaşma oturumlarını göster',
    settings_label_sync_insights: 'Analizlerle senkronize edin',
    settings_label_check_updates: 'Güncellemeleri kontrol edin',
    settings_label_whats_new_summary: "Summarize What's New with AI",
    settings_label_bot_name: 'Varsayılan asistanın adı',
    settings_label_password: 'Erişim Şifresi',
    settings_label_pinned_limit: 'Sabitlenmiş sohbet sınırı',
    settings_desc_pinned_limit: 'Kenar çubuğunda sabitlenebilecek etkin sohbetlerin maksimum sayısı. Varsayılan 3.',
    settings_label_dashboard_mode: 'Resmi Hermes Kontrol Paneli',
    settings_desc_dashboard_mode: 'Resmi hermes kontrol paneli erişilebilir olduğunda gezinme çubuğunda bir bağlantı gösterir. Genel ters proxy URL\'leri yalnızca tarayıcı bağlantısı olarak saklanır ve sunucu tarafından asla araştırılmaz.',
    settings_dashboard_mode_auto: 'Otomatik algıla',
    settings_dashboard_mode_always: 'Her zaman göster',
    settings_dashboard_mode_never: 'Asla gösterme',
    settings_dashboard_save: 'Kontrol paneli bağlantı ayarlarını kaydet',
    settings_label_gateway_status: 'Ağ Geçidi Durumu',
    settings_desc_gateway_status: 'Hermes ağ geçidi durumu (Telegram, Discord, Slack, vb.)',
    gateway_not_configured: 'Ağ geçidi yapılandırılmamış',
    gateway_metadata_stale: 'Ağ geçidi meta verileri güncel değil',
    gateway_endpoint_unreachable: 'Ağ geçidi uç noktası erişilemiyor',
    gateway_not_running: 'Ağ geçidi çalışmıyor',
    gateway_running_label: 'Çalışıyor',
    gateway_last_active: 'Son etkinlik: ',
    gateway_session_count: (n) => `${n} oturum`,
    gateway_load_failed: 'Ağ geçidi durumu yüklenemedi',
    settings_saved: 'Ayarlar kaydedildi',
    settings_save_failed: 'Kaydetme başarısız oldu:',
    settings_load_failed: 'Ayarlar yüklenemedi:',
    settings_saved_pw: 'Ayarlar kaydedildi - şifre koruması etkin ve bu tarayıcıda oturum açık kalıyor',
    settings_saved_pw_updated: 'Ayarlar kaydedildi — şifre güncellendi',
    // login page (used server-side via /api/i18n/login endpoint)
    login_title: 'Oturum aç',
    login_subtitle: 'Devam etmek için şifrenizi girin',
    login_placeholder: 'Şifre',
    login_btn: 'Oturum aç',
    login_invalid_pw: 'Geçersiz şifre',
    login_conn_failed: 'Bağlantı başarısız oldu',
    // Sidebar & Tabs
    tab_chat: 'Sohbet',
    tab_tasks: 'Görevler',
    tab_skills: 'Yetenekler',
    tab_memory: 'Hafıza',
    tab_workspaces: 'Alanlar',
    tab_profiles: 'Agent profilleri',
    tab_kanban: 'Kanban',
    kanban_board: 'Pano',
    kanban_visible_tasks: '{0} görünür görev',
    kanban_search_tasks: 'Görevleri ara',
    kanban_all_assignees: 'Tüm atananlar',
    kanban_all_tenants: 'Tüm kiracılar',
    kanban_include_archived: 'Arşivlenenleri dahil et',
    kanban_no_matching_tasks: 'Eşleşen görev yok',
    kanban_no_data: 'Kanban verisi yok',
    kanban_work_queue_hint: 'Bu Hermes Ajanının iş kuyruğudur. Bir görev oluşturun veya önceliklendirin, atayın, Hazır\'a taşıyın ve sevk görevlisinin görevi talep etmesine izin verin.',
    kanban_unavailable: 'Kanban kullanılamıyor',
    kanban_read_only: 'Salt okunur görünüm',
    kanban_empty: 'Boş',
    kanban_task: 'Görev',
    kanban_no_description: 'Açıklama yok',
    kanban_refresh: 'Yenile',
    kanban_status_triage: 'Triyaj',
    kanban_status_todo: 'Yapılacaklar',
    kanban_status_ready: 'Hazır',
    kanban_status_running: 'Koşma',
    kanban_status_blocked: 'Engellendi',
    kanban_status_done: 'Tamamlamak',
    kanban_status_original_hint: 'Gerçek durum: {0}. Bu iletişim kutusu yalnızca Triyaj/Yapılacak/Hazır düzenlemelerini destekler.',
    kanban_comments_count: 'Yorumlar ({0})',
    kanban_events_count: 'Etkinlikler ({0})',
    kanban_links: 'Bağlantılar',
    kanban_parents: 'Ebeveynler',
    kanban_children: 'Çocuklar',
    kanban_runs_count: 'Çalıştırmalar ({0})',
    kanban_no_comments: 'Yorum yok',
    kanban_no_events: 'Etkinlik yok',
    kanban_no_runs: 'Koşu yok',
    kanban_title: 'Başlık',
    kanban_description: 'Tanım',
    kanban_description_placeholder: 'İsteğe bağlı - ne olması gerekiyor, kabul kriterleri, bağlantılar',
    kanban_status: 'Durum',
    kanban_assignee: 'Vekil',
    kanban_assignee_placeholder: 'İsteğe bağlı — herhangi bir çalışan için boş bırakın',
    kanban_tenant: 'Kiracı',
    kanban_tenant_placeholder: 'İsteğe bağlı – proje veya ekip bilgisi',
    kanban_priority: 'Öncelik',
    kanban_priority_hint: 'Önce yüksek sayılar çalıştırılır. Varsayılan 0.',
    kanban_title_required: 'Başlık gerekli.',
    kanban_edit_task: 'Görevi düzenle',
    kanban_run_dispatcher: 'Dağıtıcıyı çalıştır',
    kanban_run_dispatcher_confirm: 'Bu, bu panodaki Hazır görevleri talep edecek ve çalışan alt süreçlerini oluşturacaktır (görev başına bir, tıklama başına en fazla 8). Devam etmek?',
    kanban_assignee_profiles_label: 'Hermes profilleri',
    kanban_assignee_other_label: 'Diğer (CLI hatları / kaldırılan profiller)',
    kanban_assignee_unassigned: '— Atanmadı (otomatik olarak çalıştırılmayacak) —',
    kanban_ready_needs_assignee: 'Atanmamış + Hazır\'ı seçtiniz. Gönderici bu görevi atlayacaktır. Onaylamak için tekrar gönderin veya bir profil seçin.',
    kanban_dispatch_preview_prefix: 'Önizleme:',
    kanban_dispatch_run_prefix: 'Sevk edilen:',
    kanban_dispatch_spawned: 'yumurtladı',
    kanban_dispatch_promoted: 'terfi ettirildi',
    kanban_dispatch_reclaimed: 'geri kazanılmış',
    kanban_dispatch_skipped_unassigned: 'atlandı (atanan yok)',
    kanban_dispatch_skipped_nonspawnable: 'atlandı (bilinmeyen profil)',
    kanban_dispatch_auto_blocked: 'otomatik olarak engellendi',
    kanban_dispatch_timed_out: 'zaman aşımına uğradı',
    kanban_dispatch_crashed: 'çöktü',
    kanban_new_task: 'Yeni görev',
    kanban_add_comment: 'Yorum ekle',
    kanban_only_mine: 'Sadece benim',
    kanban_bulk_action: 'Toplu işlem',
    kanban_nudge_dispatcher: 'Göndericiyi önizleyin',
    kanban_stats: 'İstatistikler',
    kanban_worker_log: 'İşçi günlüğü',
    kanban_block: 'Engellemek',
    kanban_unblock: 'Engellemeyi kaldır',
    kanban_back_to_board: 'Panoya geri dön',
    kanban_lanes_by_profile: 'Profile göre şeritler',
    kanban_new_board: 'Yeni yönetim kurulu\u2026',
    kanban_rename_board: 'Mevcut panoyu yeniden adlandır\u2026',
    kanban_archive_board: 'Mevcut panoyu arşivle\u2026',
    kanban_archive_board_confirm: 'Arşiv panosu "{name}"? Görevler diskte kalır ve pano kanban/boards/_archived/ adresinden geri yüklenebilir.',
    kanban_board_archived: 'Pano arşivlendi',
    kanban_board_name: 'İsim',
    kanban_board_slug: 'Bilgi notu (küçük harf, kısa çizgi)',
    kanban_board_description: 'Açıklama (isteğe bağlı)',
    kanban_board_icon: 'Simge (emoji, isteğe bağlı)',
    kanban_board_color: 'Renk (isteğe bağlı)',
    kanban_board_name_required: 'Ad gerekli',
    kanban_board_slug_required: 'Slug gerekli',
    kanban_card_complete: 'tamamlamak',
    kanban_card_archive: 'arşiv',
    kanban_unassigned: 'atanmamış',
    kanban_status_archived: 'Arşivlendi',
    tab_todos: 'Yapılacaklar',
    tab_insights: 'Analizler',
    tab_dashboard: 'Hermes Kontrol Paneli',
    dashboard_loopback_warning: 'Kontrol Paneli sunucuda yalnızca geri döngüye sahiptir. Ya sunucunun kendisinden göz atın ya da --host 0.0.0.0 (güvenli değil) ile yeniden başlatın.',
    tab_logs: 'Günlükler',
    tab_settings: 'Ayarlar',

    logs_title: 'Günlükler',
    logs_file: 'Dosya',
    logs_tail: 'Son satırlar',
    logs_auto_refresh: 'Otomatik yenile (5 sn)',
    logs_wrap: 'Satırları kaydır',
    logs_copy_all: 'Tümünü kopyala',
    logs_empty: 'Henüz günlük satırı yok.',
    logs_loading: 'Günlükler yükleniyor\u2026',
    logs_load_failed: 'Günlükler yüklenemedi',
    logs_status_idle: 'Son satırları görmek için bir günlük dosyası seçin.',
    logs_no_mtime: 'henüz yazılmadı',
    logs_truncated_hint: 'Büyük günlük dosyasının sonu gösteriliyor; bellek sınırı için eski veriler atlandı.',
    logs_copied: 'Günlükler kopyalandı',
    logs_severity: 'Şiddet',
    logs_severity_all: 'Tüm',
    logs_severity_errors: 'Hatalar',
    logs_severity_warnings: 'Uyarılar+',
    logs_filter_active: 'gösteriliyor (filtre etkin)',
    new_conversation: 'Yeni görüşme',
    filter_conversations: 'Konuşmaları filtrele...',
    markdown_table_filter: 'Tabloyu filtrele',
    markdown_table_sort_column: 'Sütunu sırala',
    session_time_unknown: 'Bilinmiyor',
    session_time_minutes_ago: (n) => `${n} dk önce`,
    session_time_hours_ago: (n) => `${n} sa önce`,
    session_time_days_ago: (n) => `${n} gün önce`,
    session_time_last_week: 'geçen hafta',
    session_time_bucket_today: 'Bugün',
    session_time_bucket_yesterday: 'Dün',
    session_time_bucket_this_week: 'Bu hafta',
    session_time_bucket_last_week: 'Geçen hafta',
    session_time_bucket_older: 'daha yaşlı',
    scheduled_jobs: 'Planlanmış işler',
    new_job: 'Yeni iş',
    loading: 'Yükleniyor...',
    search_skills: 'Arama becerileri...',
    new_skill: 'Yeni beceri',
    personal_memory: 'Kişisel hafıza',
    current_task_list: 'Mevcut görev listesi',
    workspace_desc: 'Oturumlarınız için çalışma alanları ekleyin ve değiştirin.',
    session_meta_messages: (n) => `${n} mesaj${n === 1 ? '' : 'S'}`,
    session_meta_children: (n) => `${n} çocuk${n === 1 ? '' : 'ren'}`,
    session_meta_segments: (n) => `${n} segment${n === 1 ? '' : 'S'}`,
    session_lineage_toggle_hint: '{0} — önceki bağlam turları burada daraltıldı. Göstermek veya gizlemek için tıklayın.',
    session_lineage_static_hint: '{0} — önceki bağlam turları burada daraltıldı.',
    session_child_toggle_hint: '{0} — bu oturumdan oluşturulan alt konuşmalar. Göstermek veya gizlemek için tıklayın.',
    session_readonly_title_hint: 'Salt okunur içe aktarılmış oturum — {0}',
    session_lineage_segment_untitled: 'Başlıksız segment',
    session_lineage_segment_open: 'Soy segmentini aç',
    new_profile: 'Yeni profil',
    transcript: 'Deşifre metni',
    download_transcript: 'Markdown olarak indir',
    import: 'İçe aktarmak',
    export_session_json: 'JSON',
    export_session_json_tooltip: 'Tüm oturumu JSON olarak dışa aktar',
    import_session_json_tooltip: 'JSON\'dan oturumu içe aktar',
    clear_conversation_btn_tooltip: 'Bu görüşmedeki tüm mesajları temizle',
    // Settings detail
    settings_label_rtl: 'Sağdan sola sohbet düzeni',
    settings_desc_rtl: 'Arapça veya İbranice gibi diller için sohbet mesajlarının ve besteci girişinin hizalamasını değiştirir. Yalnızca sohbet alanını etkiler; kenar çubuğu ve diğer paneller soldan sağa kalır.',
    settings_label_sound: 'Bildirim sesi',
    settings_desc_sound: 'Asistan bir yanıtı bitirdiğinde bir ses çalın.',
    settings_label_notifications: 'Tarayıcı bildirimleri',
    settings_desc_notifications: 'Uygulama arka plandayken bir yanıt tamamlandığında bir sistem bildirimi gösterin.',
    notifications_enable_btn: 'Enable notifications',
    notifications_test_btn: 'Send test',
    notifications_permission_status: (status) => `Permission: ${status}`,
    notifications_enabled_toast: 'Notifications enabled.',
    notifications_denied: 'Notifications are blocked in this browser. Enable them in browser settings.',
    notifications_unsupported: 'Notifications are not supported in this browser.',
    settings_desc_token_usage: 'Her Asistan yanıtının altında giriş/çıkış jeton sayılarını gösterir. /usage ile de değiştirilebilir.',
    settings_sidebar_density_compact: 'Kompakt',
    settings_sidebar_density_detailed: 'Ayrıntılı',
    settings_desc_sidebar_density: 'Oturum listesinin sol kenar çubuğunda ne kadar meta veri göstereceğini kontrol eder.',
    settings_label_auto_title_refresh: 'Uyarlanabilir başlık yenileme',
    settings_auto_title_refresh_off: 'Kapalı',
    settings_auto_title_refresh_5: 'Her 5 değişimde bir',
    settings_auto_title_refresh_10: 'Her 10 değişimde bir',
    settings_auto_title_refresh_20: 'Her 20 değişimde bir',
    settings_desc_auto_title_refresh: 'Oturum başlıklarını en son konuşmaya göre otomatik olarak yeniden oluşturarak konuşma ilerledikçe başlıkların alakalı kalmasını sağlar. LLM başlık oluşturma modeli yapılandırması gerektirir.',
    settings_desc_external_sessions: 'Oturum listesinde CLI, Telegram, Discord, Slack ve diğer kanallardan gelen konuşmaları gösterin. İçe aktarmak ve devam etmek için tıklayın.',
    settings_desc_cron_sessions: 'Surface cron job output as conversations in the sidebar. Only active when non-WebUI sessions are enabled. Defaults off; high-frequency jobs can flood the sidebar.',
    settings_desc_previous_messaging_sessions: 'Sıfırlama veya sıkıştırmayla değiştirilen eski Discord, Telegram, Slack ve Weixin oturumlarını gösterin.',
    settings_desc_sync_insights: 'WebUI belirteci kullanımını state.db\'ye yansıtır, böylece hermes /insights tarayıcı oturum verilerini içerir. Varsayılan olarak kapalıdır.',
    settings_desc_check_updates: 'WebUI veya Agent\'ın daha yeni sürümleri mevcut olduğunda bir banner gösterin. Periyodik olarak bir arka plan git getirme işlemi çalıştırır.',
    settings_desc_whats_new_summary: "Changes the What's New action from opening the raw diff first to generating a short, human-readable summary. The regular diff comparison stays available after the summary.",
    settings_desc_bot_name: 'Yalnızca varsayılan profil için kullanılır. Diğer profiller kendi profil adlarını kullanır.',
    settings_desc_password: 'Ayarlamak veya değiştirmek için yeni bir şifre girin. Geçerli ayarı korumak için boş bırakın.',
    password_placeholder: 'Yeni şifreyi girin\u2026',
    password_env_var_locked: 'HERMES_WEBUI_PASSWORD ortam değişkeni şu anda ayarlıdır ve önceliklidir. Şifreyi buradan yönetmek için ayarı kaldırın ve sunucuyu yeniden başlatın.',
    password_env_var_locked_placeholder: 'Kilitli: HERMES_WEBUI_PASSWORD ortam değişkeni ayarlandı',
    disable_auth: 'Kimlik Doğrulamasını Devre Dışı Bırak',
    sign_out: 'Oturumu Kapat',
    settings_label_shutdown: 'Hermes WebUI sunucusunu durdur',
    settings_desc_shutdown_before_cmd: 'Yerel WebUI sunucusunu düzgün şekilde durdurur. ',
    settings_desc_shutdown_between_cmds: ' ile başlattıysanız ve terminale geçmeden durdurmak istiyorsanız faydalıdır. WebUI\'a yeniden erişmek için sunucuyu yeniden başlatmanız (',
    settings_desc_shutdown_after_cmd: ' veya yerel uygulama) gerekir.',
    settings_btn_shutdown: 'Sunucuyu durdur',
    settings_shutdown_confirm_title: 'Hermes WebUI\'yi durdur',
    settings_shutdown_confirm_message: 'Hermes WebUI sunucusu durdurulsun mu?',
    settings_shutdown_confirm_btn: 'Durdur',
    settings_shutdown_stopped_message: 'Sunucu durduruldu. Bu sekmeyi kapatabilirsiniz.',
    // Providers panel
    providers_tab_title: 'Sağlayıcılar',
    providers_section_title: 'Sağlayıcılar',
    providers_section_meta: 'Yapay zeka sağlayıcıları için API anahtarlarını yönetin. Değişiklikler hemen yürürlüğe girer.',
    providers_status_configured: 'API anahtarı yapılandırıldı',
    providers_status_not_configured: 'API anahtarı yok',
    providers_status_oauth: 'OAuth',
    providers_status_api_key: 'API anahtarı',
    providers_status_not_configured_label: 'Yapılandırılmadı',
    providers_oauth_hint: 'OAuth aracılığıyla kimlik doğrulaması yapıldı. API anahtarına gerek yok.',
    providers_oauth_config_yaml_hint: 'Belirteç config.yaml aracılığıyla yapılandırıldı. Güncellemek için config.yaml dosyanızdaki sağlayıcılar bölümünü düzenleyin veya hermes auth\'u çalıştırın.',
    providers_oauth_not_configured_hint: 'Kimliği doğrulanmadı. Bu sağlayıcıyı yapılandırmak için terminalde Hermes Auth komutunu çalıştırın.',
    providers_save: 'Kaydetmek',
    providers_refresh_models: 'Refresh models',
    providers_refreshing: 'Refreshing…',
    providers_models_refreshed: 'Models refreshed',
    providers_remove: 'Kaldırmak',
    providers_saving: 'Kaydediliyor\u2026',
    providers_removing: 'Kaldırılıyor\u2026',
    providers_enter_key: 'Lütfen bir API anahtarı girin',
    providers_empty: 'Yapılandırılabilir sağlayıcı bulunamadı.',
    providers_key_updated: 'API anahtarı kaydedildi',
    providers_key_removed: 'API anahtarı kaldırıldı',
    providers_key_placeholder_new: 'sk-...',
    providers_key_placeholder_replace: 'Değiştirilecek yeni anahtarı girin\u2026',
    provider_quota_title: 'Etkin sağlayıcı kotası',
    provider_quota_active_provider: 'Aktif sağlayıcı',
    provider_quota_last_checked_after_refresh: 'Yenilemeden sonra son kontrol edildi',
    provider_quota_last_checked: 'Son kontrol edilen {0}',
    provider_quota_refresh_usage: 'Kullanımı yenile',
    provider_quota_refreshing: 'Yenileniyor...',
    provider_quota_refresh_title: 'Sağlayıcı kullanım sınırlarını şimdi yenileyin',
    provider_quota_refresh_succeeded: 'Sağlayıcı kullanımı yenilendi',
    provider_quota_refresh_failed: 'Sağlayıcı kullanımı yenileme başarısız oldu',
    provider_quota_session_limit: '5 saat sınırı',
    provider_quota_weekly_limit: 'Haftalık limit',
    provider_quota_window_fallback: 'Pencere',
    provider_quota_metric_remaining: 'Geriye kalan',
    provider_quota_metric_used: 'Kullanılmış',
    provider_quota_metric_limit: 'Sınır',
    provider_quota_status_available: 'mevcut',
    provider_quota_status_exhausted: 'yorgun',
    provider_quota_status_unavailable: 'müsait değil',
    provider_quota_status_failed: 'arızalı',
    provider_quota_status_checked: 'kontrol edildi',
    provider_quota_status_no_key: 'anahtar yok',
    provider_quota_status_invalid_key: 'geçersiz anahtar',
    provider_quota_status_unsupported: 'desteklenmeyen',
    provider_quota_used_meta: '{0} kullanıldı',
    provider_quota_resets_meta: '{0} sıfırlanır',
    provider_quota_credential_pool: 'Kimlik bilgisi havuzu',
    provider_quota_credential_label: 'Kimlik bilgisi {0}',
    provider_quota_pool_plans: 'Planlar: {0}',
    provider_quota_pool_no_windows: 'Hesap sınırı aralığı bildirilmedi.',
    provider_quota_account_limits_loaded: 'Hesap limitleri yüklendi.',
    provider_quota_unavailable: 'Kota durumu mevcut değil',
    provider_quota_retry_after: '{0} sonrasında yeniden deneyin',
    provider_quota_pool_summary_available: '{0}/{1} mevcut',
    provider_quota_pool_summary_exhausted: '{0} bitkin',
    provider_quota_pool_summary_failed: '{0} başarısız oldu',
    provider_quota_pool_summary_checked: '{0} işaretlendi',
    cancel: 'İptal etmek',
    create_job: 'İş oluştur',
    save_skill: 'Beceriyi kaydet',
    editing: 'Düzenleme',
    // Empty state
    empty_title: 'Hangi konuda yardımcı olabilirim?',
    empty_subtitle: 'İstediğiniz şeyi sorun, komutları çalıştırın, dosyaları keşfedin veya planlanmış görevlerinizi yönetin.',
    suggest_files: 'Bu çalışma alanında hangi dosyalar var?',
    suggest_schedule: 'Nerelerdesiniz?',
    suggest_plan: 'Küçük bir proje planlamama yardım et.',
    // onboarding
    onboarding_badge: 'İLK ÇALIŞMA',
    onboarding_title: 'Hermes Web Kullanıcı Arayüzüne Hoş Geldiniz',
    onboarding_lead: 'Hızlı yönlendirmeli kurulum, Hermes\'i doğrulayacak, gerçek bir sağlayıcı yapılandırmasını kaydedecek, bir çalışma alanı ve modeli seçecek ve isteğe bağlı olarak uygulamayı bir parola ile koruyacaktır.',
    onboarding_back: 'Geri',
    onboarding_continue: 'Devam etmek',
    onboarding_skip: 'Kurulumu atla',
    onboarding_skipped: 'Kurulum atlandı — mevcut yapılandırma kullanılıyor.',
    onboarding_open: 'Hermes\'i aç',
    onboarding_step_system_title: 'Sistem kontrolü',
    onboarding_step_system_desc: 'Hermes Agent\'ı ve yapılandırma görünürlüğünü doğrulayın.',
    onboarding_step_setup_title: 'Sağlayıcı kurulumu',
    onboarding_step_setup_desc: 'Minimum Hermes sağlayıcı yapılandırmasını kaydedin.',
    onboarding_step_workspace_title: 'Çalışma alanı + modeli',
    onboarding_step_workspace_desc: 'Yeni oturumlar ve sohbet için varsayılanları seçin.',
    onboarding_step_password_title: 'İsteğe bağlı şifre',
    onboarding_step_password_desc: 'Web kullanıcı arayüzünü paylaşmadan önce koruyun.',
    onboarding_step_finish_title: 'Sona ermek',
    onboarding_step_finish_desc: 'Uygulamayı inceleyin ve girin.',
    onboarding_notice_system_ready: 'Hermes Agent\'a Web kullanıcı arayüzünden ulaşılabilir görünüyor.',
    onboarding_notice_system_unavailable: 'Hermes Agent henüz tam olarak mevcut değil. Bootstrap bunu kurabilir ancak sağlayıcı kurulumu yine de bir terminal gerektirebilir.',
    onboarding_check_agent: 'Hermes Temsilcisi',
    onboarding_check_agent_ready: 'Tespit edildi ve içe aktarılabilir',
    onboarding_check_agent_missing: 'Eksik veya kısmen içe aktarılabilir',
    onboarding_check_password: 'Şifre',
    onboarding_check_password_enabled: 'Zaten etkin',
    onboarding_check_password_disabled: 'Henüz etkinleştirilmedi',
    onboarding_check_provider: 'Sağlayıcı yapılandırması',
    onboarding_check_provider_ready: 'Sohbete hazır',
    onboarding_check_provider_partial: 'Kaydedildi ancak eksik',
    onboarding_check_provider_pending: 'Doğrulama gerekiyor',
    onboarding_config_file: 'Yapılandırma dosyası:',
    onboarding_env_file: '.env dosyası:',
    onboarding_unknown: 'Bilinmiyor',
    onboarding_current_provider: 'Mevcut kurulum:',
    onboarding_missing_imports: 'Eksik içe aktarmalar:',
    onboarding_notice_setup_required: 'Burada basit bir sağlayıcı yolu seçin. Gelişmiş OAuth akışları şimdilik Hermes CLI\'ye ait olmaya devam ediyor.',
    onboarding_notice_setup_already_ready: 'Çalışan bir Hermes sağlayıcı kurulumu zaten algılandı. Burada saklayabilir veya değiştirebilirsiniz.',
    onboarding_oauth_provider_ready_title: 'Sağlayıcının kimliği zaten doğrulandı',
    onboarding_oauth_provider_ready_body: 'Bu örnek, Hermes CLI aracılığıyla ayarlanmış bir OAuth sağlayıcısını (<strong>{provider}</strong>) kullanacak şekilde yapılandırılmıştır. Burada API anahtarına gerek yoktur; kurulumu tamamlamak için Devam\'a tıklayın.',
    onboarding_oauth_provider_not_ready_title: 'OAuth sağlayıcısının kimliği henüz doğrulanmadı',
    onboarding_oauth_provider_not_ready_body: 'Bu örnek, API anahtarı yerine OAuth kullanan <strong>{provider}</strong> sağlayıcısını kullanır. Kimlik doğrulamak için terminalde <code>hermes auth</code> veya <code>hermes model</code> çalıştırın, ardından WebUI\'yi yeniden yükleyin.',
    onboarding_oauth_switch_hint: 'Veya API anahtarı kurulumuna geçmek için aşağıdan farklı bir sağlayıcı seçin:',
    onboarding_notice_workspace: 'Bu değerler normal uygulamayla aynı ayar API\'lerini yeniden kullanır.',
    onboarding_workspace_label: 'Çalışma alanı',
    onboarding_workspace_or_path: 'Veya bir çalışma alanı yolu girin',
    onboarding_workspace_placeholder: '/ev/siz/çalışma alanı',
    onboarding_provider_label: 'Kurulum modu',
    onboarding_quick_setup_badge: 'hızlı kurulum',
    provider_category_easy_start: 'Kolay başlangıç',
    provider_category_self_hosted: 'Açık / kendi kendine barındırılan',
    provider_category_specialized: 'Uzmanlaşmış',
    onboarding_api_key_label: 'API anahtarı',
    oauth_login_codex: 'Codex (ChatGPT) ile giriş yap',
    oauth_codex_step1: 'Adım 1: Bu URL\'yi ziyaret edin ve kodu girin',
    oauth_codex_step2: 'Adım 2: Bu kodu sayfaya girin',
    oauth_codex_polling: 'Yetkilendirme bekleniyor...',
    oauth_codex_success: 'Codex OAuth girişi başarılı!',
    oauth_codex_error: 'OAuth girişi başarısız',
    oauth_codex_expired: 'Kodun süresi doldu, lütfen tekrar deneyin',
    onboarding_api_key_placeholder: 'Mevcut kayıtlı anahtarı korumak için boş bırakın',
    onboarding_api_key_label_optional: 'API anahtarı (isteğe bağlı)',
    onboarding_api_key_placeholder_optional: 'Anahtarsız sunucular için boş bırakın',
    onboarding_api_key_help_keyless: 'Çoğu LM Studio / Ollama / vLLM kurulumu anahtarsız çalışır — sunucunuz kimlik doğrulama gerektirmiyorsa boş bırakın. Bağlantıyı test et düğmesini kullanın.',
    onboarding_api_key_help_prefix: 'Hermes .env dosyanızda gizli olarak kaydedildi',
    onboarding_base_url_label: 'Temel URL',
    onboarding_base_url_placeholder: 'https://uç noktanız.example/v1',
    onboarding_base_url_help: 'Bunu OpenAI uyumlu yönlendiriciler, şirket içinde barındırılan sunucular, LiteLLM, Ollama, LM Studio, vLLM veya benzer uç noktalar için kullanın.',
    onboarding_model_label: 'Varsayılan model',
    onboarding_workspace_help: 'Kurulum tamamlandıktan sonra Hermes\'in yeni sohbetler için kullanması gereken modeli seçin.',
    onboarding_custom_model_placeholder: 'modelinizin adı',
    onboarding_custom_model_help: 'Özel uç noktalar için sunucunuzun beklediği tam model kimliğini girin.',
    onboarding_notice_password_enabled: 'Bir parola zaten yapılandırılmıştır. Yalnızca değiştirmek istiyorsanız yeni bir tane girin.',
    onboarding_notice_password_recommended: 'İsteğe bağlıdır ancak kullanıcı arayüzünü localhost\'un ötesinde gösterecekseniz önerilir.',
    onboarding_password_label: 'Şifre (isteğe bağlı)',
    onboarding_password_placeholder: 'Atlamak için boş bırakın',
    onboarding_password_help: 'Parolalar, mevcut ayarlar API\'si aracılığıyla ve karma sunucu tarafında saklanır.',
    onboarding_notice_finish: 'Bunlardan herhangi birini değiştirmek için Ayarları daha sonra yeniden açabilirsiniz.',
    onboarding_not_set: 'Ayarlanmadı',
    onboarding_password_will_enable: 'Etkinleştirilecek',
    onboarding_password_will_replace: 'Değiştirilecek',
    onboarding_password_keep_existing: 'Mevcut şifreyi koru',
    onboarding_password_remains_disabled: 'Engelli kalacak',
    onboarding_password_skipped: 'Şimdilik atlandı',
    onboarding_finish_help: 'Bitirme, ayarlarda <code>onboarding_completed</code> kodunu saklar ve sizi normal uygulamaya bırakır.',
    onboarding_error_choose_workspace: 'Devam etmeden önce bir çalışma alanı seçin.',
    onboarding_error_choose_model: 'Devam etmeden önce bir model seçin.',
    onboarding_error_provider_required: 'Devam etmeden önce bir kurulum modu seçin.',
    onboarding_error_base_url_required: 'Özel uç noktalar için temel URL gereklidir.',
    onboarding_probe_test_button: 'Bağlantıyı test et',
    onboarding_probe_probing: 'Bağlantı test ediliyor\u2026',
    onboarding_probe_ok: 'Bağlandı. {n} model mevcut.',
    onboarding_probe_error_generic: 'Yapılandırılmış temel URL\'ye ulaşılamadı.',
    onboarding_probe_error_invalid_url: 'Temel URL http:// veya https:// ile başlamalı.',
    onboarding_probe_error_dns: 'Ana bilgisayar çözülemedi. URL\'yi kontrol edin veya IP adresini kullanın.',
    onboarding_probe_error_connect_refused: 'Bağlantı reddedildi — sunucu bu adreste çalışmıyor olabilir. Docker içinden localhost yerine ana bilgisayar IP\'sini deneyin.',
    onboarding_probe_error_timeout: 'Uç nokta zamanında yanıt vermedi. Sunucunun çalıştığını ve URL\'nin doğru olduğunu kontrol edin.',
    onboarding_probe_error_http_4xx: 'Uç nokta istemci hatası döndürdü. Kimlik doğrulama ve URL yolunu kontrol edin (genelde /v1 ile biter).',
    onboarding_probe_error_http_5xx: 'Uç nokta sunucu hatası döndürdü. LM Studio / Ollama günlüklerini kontrol edin.',
    onboarding_probe_error_parse: 'Uç nokta beklenen biçimde model listesi döndürmedi. URL\'nin OpenAI uyumlu API köküne işaret ettiğini doğrulayın.',
    onboarding_probe_error_unreachable: 'Yapılandırılmış temel URL\'ye ulaşılamadı.',
    onboarding_error_probe_failed: 'Yapılandırılmış temel URL doğrulanamadı.',
    onboarding_error_workspace_required: 'Çalışma alanı gerekli.',
    onboarding_error_model_required: 'Model gerekli.',
    onboarding_complete: 'İlk katılım tamamlandı',

    // panel/runtime i18n
    error_prefix: 'Hata:',
    default: 'default',
    search: 'Search',
    not_available: 'Yok',
    never: 'Asla',
    add: 'Eklemek',
    add_failed: 'Ekleme başarısız oldu:',
    remove_failed: 'Kaldırma başarısız oldu:',
    switch_failed: 'Geçiş başarısız oldu:',
    name_required: 'Ad gerekli',
    content_required: 'İçerik gerekli',
    view: 'Görüş',
    dismiss: 'Azletmek',
    disable: 'Devre dışı bırakmak',
    cron_no_jobs: 'Planlanmış iş bulunamadı.',
    cron_status_off: 'kapalı',
    cron_status_paused: 'duraklatıldı',
    cron_status_error: 'hata',
    cron_status_active: 'aktif',
    cron_status_running: 'koşuyor\u2026',
    cron_status_needs_attention: 'dikkat edilmesi gerekiyor',
    cron_attention_desc: 'Bu yinelenen işin bir sonraki çalışma süresi yoktur. Zamanlayıcı bir sonraki çalıştırmayı hesaplamada başarısız olmuş olabilir.',
    cron_attention_croniter_hint: 'Ağ Geçidi çalışma zamanında croniter paketi eksik olabilir. Ağ Geçidini cron desteğiyle yeniden başlatın, ardından bu işe devam edin.',
    cron_attention_resume: 'Devam ettir ve yeniden hesapla',
    cron_jobs_project: 'Cron İşleri',
    cron_attention_run_once: 'Şimdi bir kez koş',
    cron_attention_copy_diagnostics: 'Tanılamayı kopyala',
    cron_diagnostics_copied: 'Cron teşhisi kopyalandı',
    cron_next: 'Sonraki',
    cron_last: 'Son',
    cron_run_now: 'Şimdi koş',
    cron_pause: 'Duraklat',
    cron_resume: 'Sürdürmek',
    cron_job_name_placeholder: 'İşin adı',
    cron_schedule_placeholder: 'Takvim',
    cron_prompt_placeholder: 'Çabuk',
    cron_last_output: 'Son çıktı',
    cron_expand_prompt: 'İstemi genişlet',
    cron_collapse_prompt: 'İstemi daralt',
    cron_expand_output: 'Çıktıyı genişlet',
    cron_collapse_output: 'Çıktıyı daralt',
    cron_mode_agent: 'Ajan',
    cron_mode_script: 'Betik',
    cron_mode_label: 'Mod',
    cron_script_job_banner: 'Zamanlanmış betiği çalıştırır — stdout hedefe iletilir. Ajan, istem veya beceri yok.',
    cron_script_card_title: 'Betik',
    cron_script_output: 'Betik çıktısı',
    cron_script_path_label: 'Betik yolu',
    cron_script_path_hint: 'Mutlak yol değilse ~/.hermes/scripts/ altında çözülür. Davranışı değiştirmek için sunucudaki betiği düzenleyin.',
    cron_script_badge_title: 'Betik işi (ajan yok)',
    cron_workdir_label: 'Çalışma dizini',
    cron_view_full_output: 'View full output',
    cron_all_runs: 'Tüm koşular',
    cron_hide_runs: 'Çalıştırmaları gizle',
    cron_no_runs_yet: '(henüz koşu yok)',
    cron_schedule_required_example: 'Program gereklidir (ör. "0 9 * * *" veya "her 1 saatte bir")',
    cron_schedule_required: 'Program gerekli',
    cron_prompt_required: 'İstem gerekli',
    cron_job_created: 'İş oluşturuldu',
    cron_duplicate: 'Kopyalamak',
    cron_duplicated: 'İş kopyalandı (duraklatıldı)',
    cron_job_triggered: 'İş tetiklendi',
    cron_job_paused: 'İş duraklatıldı',
    cron_job_resumed: 'İş devam ettirildi',
    cron_job_updated: 'İş güncellendi',
    cron_model_label: 'Model Geçersiz Kılma',
    cron_model_hint: 'Bu iş için varsayılan modeli geçersiz kılar.',
    cron_model_use_default: 'Varsayılan (profil/sistem varsayılanını kullan)',
    cron_delete_confirm_title: 'Cron işini sil',
    cron_delete_confirm_message: 'Bu geri alınamaz.',
    cron_job_deleted: 'İş silindi',
    cron_completion_status: (name, status) => `Cron "${name}" ${status}`,
    status_failed: 'arızalı',
    status_completed: 'tamamlanmış',
    todos_no_active: 'Bu oturumda etkin görev listesi yok.',
    clear_conversation_title: 'Görüşmeyi temizle',
    clear_conversation_message: 'Tüm mesajlar silinsin mi? Bu geri alınamaz.',
    clear_failed: 'Temizleme başarısız oldu:',
    skills_no_match: 'Beceri eşleşmesi yok.',
    skill_enabled: 'Etkinleştirilmiş',
    skill_disabled: 'Engelli',
    skill_toggle_failed: 'Beceri değiştirilemedi:',
    linked_files: 'Bağlantılı Dosyalar',
    skill_load_failed: 'Beceri yüklenemedi:',
    skill_file_load_failed: 'Dosya yüklenemedi:',
    skill_name_required: 'Beceri adı gerekli',
    skill_updated: 'Beceri güncellendi',
    skill_created: 'Beceri oluşturuldu',
    skill_deleted: 'Beceri silindi',
    skill_delete_confirm: '"{0}" becerisi silinsin mi?',
    skills_empty_title: 'Bir beceri seçin',
    skills_empty_sub: 'İçeriğini görüntülemek için kenar çubuğundan bir beceri seçin veya yeni bir beceri oluşturun.',
    skills_edit: 'Düzenlemek',
    skills_delete: 'Silmek',
    skills_back_to: '{0}\'a geri dön',
    tasks_empty_title: 'Planlanmış bir iş seçin',
    tasks_empty_sub: 'Ayrıntılarını ve çalışmalarını görüntülemek için kenar çubuğundan bir iş seçin veya yeni bir iş oluşturun.',
    workspaces_empty_title: 'Bir alan seçin',
    workspaces_empty_sub: 'Dosyalarını ve ayarlarını görüntülemek veya yeni bir tane eklemek için kenar çubuğundan bir alan seçin.',
    profiles_empty_title: 'Bir profil seçin',
    profiles_empty_sub: 'Ayarlarını görüntülemek ve düzenlemek için kenar çubuğundan bir temsilci profili seçin veya yeni bir tane oluşturun.',
    memory_notes_label: 'hafıza (notlar)',
    memory_saved: 'Bellek kaydedildi',
    my_notes: 'Notlarım',
    user_profile: 'Kullanıcı Profili',
    external_notes_sources: 'Üçüncü taraf notlar',
    external_notes_empty: 'Henüz görünür not veya bilgi MCP kaynağı yok. Burada listelemek için Joplin, Obsidian, Notion, llm-wiki veya başka bir not sunucusu yapılandırın.',
    external_notes_auto_recall_hint: 'Otomatik oturum hatırlama değişmedi; bu çekmece yalnızca yapılandırılmış kaynakları ve kullanılabilir okuma/arama araçlarını gösterir.',
    external_notes_no_tools: 'Bu kaynak için şu anda görünür okuma/arama aracı yok.',
    external_notes_tool_count: (count) => `${count} not aracı kullanılabilir`,
    external_notes_configured_hint: 'Bu yapılandırılmış kaynaktan araç adları beklenir; WebUI runtime bunları sunduğunda canlı şemalar görünecek.',
    external_notes_recent_ai: 'AI tarafından yakın zamanda kullanıldı',
    external_notes_auto: 'auto',
    external_notes_recent_ai_reason: 'Otomatik hatırlama',
    external_notes_search_placeholder: 'Notlarda ara…',
    external_notes_search_empty: 'Notları burada önizlemek için yapılandırılmış bir not kaynağında arama yapın.',
    source_active: 'active',
    source_configured: 'configured',
    no_notes_yet: 'Henüz not yok.',
    no_profile_yet: 'Henüz profil yok.',
    agent_soul: 'Ajan Ruhu',
    no_soul_yet: 'Henüz tanımlanmış bir ruh yok.',
    workspace_choose_path: 'Çalışma alanı yolunu seçin',
    workspace_choose_path_meta: 'Doğrulanmış bir yol ekleyin ve bu görüşmeyi değiştirin',
    workspace_manage: 'Çalışma alanlarını yönet',
    workspace_manage_meta: 'Spaces panelini açın',
    workspace_use_title: 'Geçerli oturumda kullan',
    workspace_use: 'Kullanmak',
    workspace_add_path_placeholder: 'Çalışma alanı yolu ekleyin (ör. /home/user/my-project)',
    workspace_paths_validated_hint: 'Yollar, kaydedilmeden önce mevcut dizinler olarak doğrulanır.',

    workspace_drag_hint: 'Yeniden sıralamak için sürükleyin',
    workspace_reorder_failed: 'Yeniden sıralama başarısız oldu',
    workspace_added: 'Çalışma alanı eklendi',
    workspace_renamed: 'Çalışma alanı yeniden adlandırıldı',
    workspace_remove_confirm_title: 'Çalışma alanını kaldır',
    workspace_remove_confirm_message: (path) => `"${path}" kaldırılsın mı?`,
    workspace_removed: 'Çalışma alanı kaldırıldı',
    workspace_switch_prompt_title: 'Çalışma alanını değiştir',
    workspace_switch_prompt_message: 'Bu görüşmeyi eklemek ve bu görüşmeye geçiş yapmak için mutlak bir çalışma alanı yolu girin.',
    workspace_switch_prompt_confirm: 'Anahtar',
    workspace_switch_prompt_placeholder: '/Kullanıcılar/siz/proje',
    workspace_not_added: 'Çalışma alanı eklenmedi',
    workspace_already_saved: 'Çalışma alanı zaten kayıtlı; onu listeden seçin',
    workspace_busy_switch: 'Aracı çalışırken çalışma alanı değiştirilemiyor',
    discard_file_edits_title: 'Dosya düzenlemeleri silinsin mi?',
    discard_file_edits_message: 'Çalışma alanlarının değiştirilmesi, önizlemedeki kaydedilmemiş dosya düzenlemelerinin silinmesine neden olur.',
    workspace_switched_to: (name) => `${name}'a geçildi`,
    profiles_no_profiles: 'Hiçbir profil bulunamadı.',
    profile_api_keys_configured: 'API anahtarları yapılandırıldı',
    profile_gateway_running: 'Ağ geçidi çalışıyor',
    profile_gateway_stopped: 'Ağ geçidi durduruldu',
    profile_active: 'AKTİF',
    profile_no_configuration: 'Yapılandırma yok',
    profile_skill_count: (count) => `${count} beceri${count === 1 ? '' : 'S'}`,
    profile_use: 'Kullanmak',
    profile_switch_title: 'Bu profile geç',
    profile_delete_title: 'Bu profili sil',
    profile_default_label: '(varsayılan)',
    profile_name_placeholder: 'Profil adı (küçük harf, a-z 0-9 kısa çizgiler)',
    profile_clone_label: 'Etkin profilden yapılandırmayı kopyala',
    profile_model_label: 'Model / sağlayıcı',
    profile_model_hint: 'Bu yeni profil için yapılandırılmış sağlayıcılar ve modeller arasından seçim yapın.',
    profile_model_use_default: 'Etkin profil varsayılanını kullan',
    profile_base_url_placeholder: 'Temel URL (isteğe bağlı, örneğin http://localhost:11434)',
    profile_api_key_placeholder: 'API anahtarı (isteğe bağlı)',
    manage_profiles: 'Profilleri yönet',
    profiles_load_failed: 'Profiller yüklenemedi',
    profile_switched_new_conversation: (name) => `Profile geçildi: ${name} — yeni görüşme başladı`,
    profile_switched: (name) => `Profile geçildi: ${name}`,
    profile_name_rule: 'Yalnızca küçük harfler, sayılar, kısa çizgiler ve alt çizgiler',
    profile_base_url_rule: 'Temel URL http:// veya https:// ile başlamalıdır',
    profile_created: (name) => `Profil oluşturuldu: ${name}`,
    profile_delete_confirm_title: (name) => `"${name}" profili silinsin mi?`,
    profile_delete_confirm_message: 'Bu profilin tüm oturumları, yapılandırmaları, becerileri ve belleği kalıcı olarak silinecek. Bu geri alınamaz.',
    profile_deleted: (name) => `Profil silindi: ${name}`,
    active_conversation_none: 'Aktif görüşme seçilmedi.',
    active_conversation_meta: (title, count) => `${title} · ${count} mesaj${count === 1 ? '' : 'S'}`,
    settings_unsaved_changes: 'Kaydedilmemiş değişiklikleriniz var.',
    sign_out_failed: 'Oturumu kapatma başarısız oldu:',
    disable_auth_confirm_title: 'Şifre korumasını devre dışı bırak',
    disable_auth_confirm_message: 'Bu örneğe herkes erişebilecek.',
    auth_disabled: 'Kimlik doğrulama devre dışı bırakıldı — şifre koruması kaldırıldı',
    disable_auth_failed: 'Kimlik doğrulama devre dışı bırakılamadı:',
    bg_error_single: (title) => `"${title}" bir hatayla karşılaştı`,
    bg_error_multi: (count) => `${count} oturum bir hatayla karşılaştı`,
    // skill form
    skill_name: 'İsim',
    skill_category: 'Kategori',
    skill_category_placeholder: 'İsteğe bağlı, ör. devops',
    skill_content: 'SKILL.md içeriği',
    skill_content_placeholder: 'YAML ön maddesi + işaretleme gövdesi',
    skill_rename_not_supported: 'Bir becerinin yeniden adlandırılması desteklenmiyor. Yeni bir beceri oluşturun ve yeniden adlandırmak için eskisini silin.',
    skill_metadata: 'Meta veriler',
    // cron form
    cron_name_label: 'İsim',
    cron_name_placeholder: 'İsteğe bağlı',
    cron_schedule_label: 'Takvim',
    cron_schedule_hint: "Use 'every 1h' or a cron expression for recurring jobs. Bare durations like '30m' run once.",
    cron_schedule_once_warning: "Duration forms like '30m' run once and are removed after running. Use 'every 30m' to keep a recurring job.",
    cron_prompt_label: 'Çabuk',
    cron_deliver_label: 'Çıktıyı şuraya ilet:',
    cron_deliver_local: 'Yerel (yalnızca çıktıyı kaydet)',
    cron_deliver_custom: 'Ozel teslimat hedefi',
    cron_profile_label: 'Profil',
    cron_profile_server_default: 'sunucu varsayılanı',
    cron_profile_server_default_hint: 'Çalışma zamanında WebUI sunucusunun varsayılan profilini kullanır. Profili olmayan mevcut işler bu eski davranışı sürdürüyor.',
    cron_toast_notifications_label: 'Tamamlama kadehleri',
    cron_toast_notifications_hint: 'Bu cron bittiğinde kadeh kaldır. Görevler rozeti ve yeni çalıştırma işaretçisi bu kapalıyken de güncellenir.',
    cron_toast_notifications_enabled: 'Etkinleştirilmiş',
    cron_toast_notifications_disabled: 'Engelli',
    cron_skills_label: 'Yetenekler',
    cron_skills_placeholder: 'Beceri ekleyin (isteğe bağlı)\u2026',
    cron_skills_edit_hint: 'Beceri listesi oluşturulduktan sonra düzenlenemez.',
    // workspace form
    workspace_name_label: 'İsim',
    workspace_name_placeholder: 'İsteğe bağlı kolay ad',
    workspace_path_label: 'Yol',
    workspace_path_required: 'Yol gerekli',
    workspace_path_readonly: 'Yol değiştirilemez. Yalnızca yeniden adlandırın.',
    workspace_new_title: 'Yeni alan',
    // profile form
    profile_name_label: 'İsim',
    profile_base_url_label: 'Temel URL',
    profile_api_key_label: 'API anahtarı',
    cmd_yolo: 'YOLO modunu değiştir (onayları atla)',
    cmd_branch: 'Bu konuşmayı yeni bir oturuma aktarın',
    cmd_branch_usage: '/branch [isim] - konuşmayı çatallayın (isteğe bağlı olarak bir adla)',
    branch_forked: 'Yeni oturuma çatallandı',
    branch_failed: 'Çatal başarısız oldu:',
    fork_from_here: 'Buradan çatal',
    forked_from: 'çatallı',
    yolo_no_session: 'Aktif oturum yok',
    yolo_enabled: '⚡ YOLO modu AÇIK — onaylar bu oturumu atladı',
    yolo_disabled: 'YOLO modu KAPALI',
    yolo_pill_label: 'YOLO',
    yolo_pill_title_active: 'YOLO modu etkin — devre dışı bırakmak için tıklayın',
    approval_skip_all: '⚡ Tüm bu oturumu atla',
    approval_skip_all_title: 'Bu oturuma ilişkin tüm onay istemlerini atla',
    // composer action tooltips
    composer_send: 'Mesaj gönder',
    composer_queue: 'Sıra mesajı',
    composer_interrupt: 'Kes ve gönder',
    composer_steer: 'Akım tepkisini yönlendir',
    composer_stop: 'Üretimi durdur',
    composer_disabled_clarify: 'Açıklama isteğine yanıt verin',
    composer_disabled_compression: 'Sıkıştırmanın bitmesi bekleniyor',
    composer_compression_will_queue: 'Type a message — it will queue and send after compression',
    composer_disabled_empty: 'Göndermek için bir mesaj yazın',
    composer_mobile_workspace: 'Çalışma alanı',
    composer_mobile_model: 'Modeli',
    composer_mobile_reasoning: 'muhakeme',
    composer_mobile_context: 'Bağlam',

    pdf_loading: 'PDF {0} yükleniyor\u2026',
    pdf_too_large: 'PDF satır içi önizleme için çok büyük',
    pdf_no_pages: 'PDF\'de sayfa yok',
    pdf_error: 'PDF önizlemesi oluşturulamadı',
    pdf_download: 'PDF\'yi indir',
    html_loading: 'HTML önizlemesi yükleniyor\u2026',
    html_too_large: 'HTML satır içi önizleme için çok büyük',
    html_error: 'HTML önizlemesi oluşturulamadı',
    html_open_full: 'Tam sayfayı aç',
    html_sandbox_label: 'HTML Önizlemesi (korumalı alan)',
    media_audio_label: 'Ses',
    media_svg_label: 'Diyagram',
    media_video_label: 'Video',
    media_download: 'İndir',
    csv_loading: 'CSV yükleniyor',
    csv_too_large: 'CSV dosyası satır içi oluşturma için çok büyük',
    csv_no_data: 'CSV dosyasında tablo olarak oluşturmak için yeterli veri yok',
    csv_error: 'CSV dosyası yüklenemedi',
    csv_header_note: 'Tablo başlığı olarak gösterilen ilk satır',
    excalidraw_loading: 'Yükleme diyagramı',
    excalidraw_too_large: 'Excalidraw dosyası satır içi oluşturma için çok büyük',
    excalidraw_invalid: 'Geçersiz Excalidraw dosya biçimi',
    excalidraw_error: 'Excalidraw dosyası yüklenemedi',
    excalidraw_label: 'Diyagram',
    excalidraw_download: 'İndirmek',
    excalidraw_empty: 'Boş diyagram',
    excalidraw_render_error: 'Diyagram oluşturulamadı',
    excalidraw_simplified: 'Basitleştirilmiş SVG önizlemesi — Excalidraw tuvaliyle piksel açısından aynı değil',
    // TTS (#499)
    tts_listen: 'Dinlemek',
    tts_not_supported: 'Konuşma sentezi bu tarayıcıda desteklenmiyor.',
    settings_label_tts: 'Yanıtlar için Metinden Konuşmaya',
    settings_desc_tts: 'Yardım mesajlarında hoparlör düğmesini göster',
    settings_label_tts_auto_read: 'Yanıtları sesli olarak otomatik oku',
    settings_desc_tts_auto_read: 'Tamamlandığında her yeni asistanın yanıtını otomatik olarak söyleyin. Yazmaya başladığınızda duraklar.',
    // Composer voice-mode pref (#1488)
    settings_label_voice_mode: 'Eller serbest ses modu düğmesi',
    settings_desc_voice_mode: 'Dikte mikrofonunun yanında ses modu düğmesini gösterir. Duraklamadan sonra Hermes otomatik gönderir ve yanıtları sesli okur. Konuşma tanıma ve TTS destekleyen tarayıcı gerektirir.',
    settings_label_raw_audio: 'Transkripte etmek yerine ham ses gönder',
    settings_desc_raw_audio: 'Sesi önce metne dönüştürmek yerine orijinal ses dosyasını kaydedip aracıya gönderir. Aracı, dosyayı yazıya dökebilir veya ham sesi (duygu, arka plan gürültüsü, özel STT) işleyebilir. Telegram\'ın sesli mesaj davranışı gibidir.',
    voice_send_raw: 'Ham ses gönder',
    voice_raw_attached: 'Ses eklendi. Gönder\'e basın veya metin ekleyin.',
    settings_label_tts_voice: 'Ses',
    settings_desc_tts_voice: 'Ses sentezi sesini seçin',
    settings_label_tts_rate: 'Konuşma hızı',
    settings_label_tts_pitch: 'Konuşma perdesi',
    settings_label_tts_engine: 'TTS Motoru',
    settings_desc_tts_engine: 'Ses motorunu seçin. Edge TTS, sunucu üzerinden Microsoft sinirsel seslerini kullanır.',
    checkpoint_date: 'Tarih',
    checkpoint_diff_files_changed: (n) => `${n} dosya değişti`,
    checkpoint_diff_no_changes: 'Bu kontrol noktası ile mevcut çalışma alanı arasında fark bulunamadı.',
    checkpoint_diff_title: 'Kontrol noktasındaki değişiklikler',
    checkpoint_empty: 'Bu çalışma alanı için kontrol noktası bulunamadı.',
    checkpoint_error: 'Kontrol noktaları yüklenemedi',
    checkpoint_files: 'Dosyalar',
    checkpoint_loading: 'Kontrol noktaları yükleniyor\u2026',
    checkpoint_message: 'Mesaj',
    checkpoint_restore: 'Geri yükle',
    checkpoint_restore_confirm_message: (ckpt) => `Çalışma alanı "${ckpt}" kontrol noktasına geri yüklensin mi? Kayıtlı sürümlerle dosyaların üzerine yazılır. Sonradan eklenen dosyalar silinmez.`,
    checkpoint_restore_confirm_title: 'Kontrol noktası geri yüklensin mi?',
    checkpoint_restored: 'Kontrol noktası geri yüklendi',
    checkpoint_title: 'Kontrol noktaları',
    checkpoint_view_diff: 'Farkı görüntüle',
    insights_activity_by_day: 'Güne göre etkinlik',
    insights_activity_by_hour: 'Saate göre etkinlik',
    insights_cost: 'Tahmini maliyet',
    insights_daily_tokens: 'Günlük Jetonlar',
    insights_model_name: 'Modeli',
    insights_model_sessions: 'Oturumlar',
    insights_model_tokens: 'Jetonlar',
    insights_model_cost: 'Maliyet',
    insights_model_share: 'Paylaşmak',
    insights_no_usage_data: 'Henüz kullanım verisi yok',
    insights_footer: 'Son {days} günün verileri gösteriliyor',
    insights_skill_usage_title: 'Skill Usage',  // TODO: translate
    insights_skill_usage_sub: 'Tool invocation frequency',  // TODO: translate
    insights_skill_usage_total: 'Total invocations',  // TODO: translate
    insights_skill_usage_skills_used: 'Skills used',  // TODO: translate
    insights_skill_usage_no_data: 'No skill usage data yet',  // TODO: translate
    insights_skill_usage_no_data_hint: 'Skills will appear here once used in conversations.',  // TODO: translate
    insights_skill_usage_footer: 'Counts from ~/.hermes/skills/',  // TODO: translate
    insights_skill_usage_col_skill: 'Skill',  // TODO: translate
    insights_skill_usage_col_uses: 'Uses',  // TODO: translate
    insights_skill_usage_col_views: 'Views',  // TODO: translate
    insights_skill_usage_col_share: 'Usage %',  // TODO: translate
    insights_skill_usage_col_patches: 'Patches',  // TODO: translate
    insights_input_tokens: 'Giriş',
    insights_messages: 'Mesajlar',
    insights_models: 'Modeller',
    insights_no_cost: 'Yok',
    insights_output_tokens: 'Çıkış',
    insights_peak_hour: 'Zirve: {hour}',
    insights_sessions: 'Oturumlar',
    insights_title: 'Kullanım analitiği',
    insights_token_breakdown: 'Jeton dağılımı',
    insights_tokens: 'Jetonlar',
    insights_total: 'Toplam',
    settings_desc_api_redact: 'Kendi sunucunuzda şeffaflık için devre dışı bırakılabilir (paylaşımlı örneklerde önerilmez).',
    settings_label_api_redact: 'API yanıtlarında hassas verileri gizle',
    subagent_children: 'Alt agent oturumları',
    outline_title: 'Ana Hat',
    outline_empty: 'Henüz soru yok.',
    outline_loading: 'Yükleniyor…',
  
  
  
  },
  pl: {
    offline_title: 'Połączenie utracone',
    offline_browser_detail: 'Twoja przeglądarka zgłasza, że to urządzenie jest offline.',
    offline_network_detail: 'Hermes jest obecnie nieosiągalny z tej przeglądarki.',
    offline_autorefresh: 'Odświeżę tę stronę automatycznie, gdy Hermes będzie ponownie osiągalny.',
    offline_check_now: 'Sprawdź teraz',
    offline_checking: 'Sprawdzanie…',
    offline_stream_waiting: 'Połączenie utracone. Oczekiwanie na odświeżenie…',
    _lang: 'pl',
    _label: 'Polski',
    _speech: 'pl-PL',
    // boot.js
    cancelling: 'Anulowanie…',
    cancel_failed: 'Anulowanie nie powiodło się: ',
    mic_denied: 'Odmowa dostępu do mikrofonu. Sprawdź uprawnienia przeglądarki.',
    mic_no_speech: 'Nie wykryto mowy. Spróbuj ponownie.',
    mic_network: 'Rozpoznawanie mowy jest niedostępne.',
    mic_error: 'Błąd wejścia głosowego: ',
    // Composer voice buttons (#1488 — distinct labels for dictation vs voice mode)
    voice_dictate: 'Dyktuj',
    voice_dictate_active: 'Zatrzymaj dyktowanie',
    voice_recording_active: 'Zatrzymaj nagrywanie',
    voice_mode_toggle: 'Tryb głosowy',
    voice_mode_toggle_active: 'Wyjdź z trybu głosowego',
    // Turn-based voice mode (#1333)
    voice_listening: 'Słucham…',
    voice_speaking: 'Mówię…',
    voice_thinking: 'Myślę…',
    voice_error: 'Głos nie jest obsługiwany w tej przeglądarce',
    voice_mode_active: 'Tryb głosowy włączony',
    voice_mode_off: 'Tryb głosowy wyłączony',
    session_imported: 'Zaimportowano sesję',
    import_failed: 'Import nie powiódł się: ',
    import_invalid_json: 'Nieprawidłowy JSON',
    image_pasted: 'Wklejono obraz: ',
    // messages.js
    edit_message: 'Edytuj wiadomość',
    regenerate: 'Wygeneruj ponownie odpowiedź',
    copy: 'Kopiuj',
    copied: 'Skopiowano!',
    copy_failed: 'Kopiowanie nie powiodło się',
    selected_text_reply: 'Odpowiedz z zaznaczeniem',
    selected_text_reply_title: 'Dodaj zaznaczony tekst czatu jako cytowany kontekst',
    selected_text_reply_appended: 'Dodano zaznaczony tekst do pola wprowadzania',
    saved_prompts_empty: 'Brak zapisanych promptów.',
    saved_prompts_save_current: 'Zapisz bieżący tekst jako prompt',
    saved_prompts_saved: 'Prompt zapisany',
    saved_prompts_delete: 'Usuń prompt',
    saved_prompts_empty_input: 'Najpierw wpisz prompt do zapisania',

    diff_loading: 'Ładowanie zmian (diff)',
    diff_error: 'Nie można załadować pliku poprawki',
    diff_too_large: 'Plik poprawki jest zbyt duży, aby wyświetlić jego podgląd',
    tree_view: 'Drzewo',
    raw_view: 'Źródło',
    parse_failed_note: 'błąd parsowania',
    you: 'Ty',
    mcp_servers_title: 'Serwery MCP',
    mcp_servers_desc: 'Wyświetl serwery MCP skonfigurowane w config.yaml.',
    mcp_no_servers: 'Brak skonfigurowanych serwerów MCP.',
    mcp_add_server: '+ Dodaj serwer',
    mcp_field_name: 'Nazwa serwera',
    mcp_transport_label: 'Typ transportu',
    mcp_field_command: 'Polecenie',
    mcp_field_args: 'Argumenty (rozdzielone przecinkami)',
    mcp_field_url: 'URL',
    mcp_field_timeout: 'Limit czasu (sekundy)',
    mcp_save: 'Zapisz',
    mcp_cancel: 'Anuluj',
    mcp_name_required: 'Nazwa serwera jest wymagana.',
    mcp_url_required: 'URL jest wymagany dla transportu HTTP.',
    mcp_command_required: 'Polecenie jest wymagane dla transportu stdio.',
    mcp_saved: 'Zapisano serwer MCP.',
    mcp_save_failed: 'Nie udało się zapisać serwera MCP.',
    mcp_delete_confirm_title: 'Usuń serwer MCP',
    mcp_delete_confirm_message: 'Usunąć serwer MCP "{0}"? Tej operacji nie można cofnąć.',
    mcp_deleted: 'Usunięto serwer MCP.',
    mcp_delete_failed: 'Nie udało się usunąć serwera MCP.',
    mcp_load_failed: 'Nie udało się załadować serwerów MCP.',
    mcp_restart_hint: 'Zmiany serwerów są tutaj obecnie tylko do odczytu. Edytuj config.yaml i zrestartuj Hermes, aby zmiany odniosły skutek.',
    mcp_toggle_followup: 'Kontrolki włączania/wyłączania są celowo odłożone, dopóki semantyka przeładowania MCP nie stanie się jasna.',
    mcp_status_active: 'Aktywny',
    mcp_status_configured: 'Skonfigurowany',
    mcp_status_disabled: 'Wyłączony',
    mcp_status_invalid_config: 'Nieprawidłowa konfiguracja',
    mcp_status_unknown: 'Nieznany',
    mcp_tool_count: '{0} narzędzi',
    mcp_enabled_yes: 'Włączone',
    mcp_enabled_no: 'Wyłączone',
    mcp_enable_server: 'Włącz ten serwer MCP',
    mcp_disable_server: 'Wyłącz ten serwer MCP',
    mcp_enabled_toast: (name) => `Serwer MCP "${name}" został włączony.`,
    mcp_disabled_toast: (name) => `Serwer MCP "${name}" został wyłączony.`,
    mcp_toggle_failed: 'Nie udało się zaktualizować serwera MCP.',
    mcp_tools_title: 'Narzędzia MCP',
    mcp_tools_desc: 'Przeszukaj znane narzędzia we wszystkich aktywnych serwerach MCP.',
    mcp_tools_search_placeholder: 'Szukaj narzędzi po nazwie, serwerze lub opisie…',
    mcp_tools_no_tools: 'Brak dostępnych narzędzi MCP w aktywnym inwentarzu środowiska uruchomieniowego.',
    mcp_tools_no_matches: 'Brak narzędzi MCP pasujących do wyszukiwania.',
    mcp_tools_load_failed: 'Nie udało się załadować narzędzi MCP.',
    mcp_tools_schema_empty: 'Brak parametrów schematu.',
    mcp_tools_runtime_note: 'Inwentarz narzędzi korzysta wyłącznie z już znanych aktywnych danych uruchomieniowych MCP; WebUI nie uruchamia ani nie sonduje serwerów.',
    mcp_tools_summary_no_matches: (query,total) => `Brak narzędzi MCP pasujących do „${query}” (łącznie ${total}).`,
    mcp_tools_summary_none: 'Brak narzędzi MCP do wyświetlenia.',
    mcp_tools_summary_matching: (query) => ` pasujących do „${query}”`,
    mcp_tools_summary_total_note: (total) => ` (łącznie ${total})`,
    mcp_tools_summary_showing: (start,end,filtered,searchNote,totalNote,page,pages) => `Wyświetlanie ${start}-${end} z ${filtered} narzędzi MCP${searchNote}${totalNote}. Strona ${page} z ${pages}.`,
    mcp_tools_page_size_prefix: 'Pokaż',
    mcp_tools_page_size_suffix: 'na stronę',
    mcp_tools_per_page_aria: 'Liczba narzędzi MCP na stronę',
    mcp_tools_inactive_configured_servers: (servers) => `Skonfigurowane, ale nieaktywne w tym środowisku WebUI: ${servers}.`,
    mcp_tools_pagination_label: 'Stronicowanie narzędzi MCP',
    mcp_tools_previous_page: '‹ Poprzednia',
    mcp_tools_previous_page_aria: 'Poprzednia strona narzędzi MCP',
    mcp_tools_next_page: 'Następna ›',
    mcp_tools_next_page_aria: 'Następna strona narzędzi MCP',
    // PDF preview (#480)
    pdf_loading: 'Ładowanie PDF {0}…',
    pdf_too_large: 'Plik PDF jest zbyt duży, aby wyświetlić jego podgląd',
    pdf_no_pages: 'Plik PDF nie ma stron',
    pdf_error: 'Nie udało się wyrenderować podglądu PDF',
    pdf_download: 'Pobierz PDF',
    // HTML sandbox preview (#482)
    html_loading: 'Ładowanie podglądu HTML…',
    html_too_large: 'Plik HTML jest zbyt duży, aby wyświetlić jego podgląd',
    html_error: 'Nie udało się wyrenderować podglądu HTML',
    html_open_full: 'Otwórz pełną stronę',
    html_sandbox_label: 'Podgląd HTML (izolowany)',
    thinking: 'Myślenie',
    expand_all: 'Rozwiń wszystko',
    collapse_all: 'Zwiń wszystko',
    edit_failed: 'Edycja nie powiodła się: ',
    regen_failed: 'Ponowne generowanie nie powiodło się: ',
    reconnect_active: 'Odpowiedź jest nadal generowana. Odświeżyć, gdy będzie gotowa?',
    reconnect_finished: 'Podczas Twojej ostatniej wizyty odpowiedź była w toku. Wiadomości mogły zostać zaktualizowane.',
    // approval card
    approval_heading: 'Wymagana aprobata',
    approval_desc_prefix: 'Wykryto niebezpieczne polecenie',
    approval_btn_once: 'Zezwól raz',
    approval_btn_once_title: 'Zezwól na to jedno polecenie (Enter)',
    approval_btn_session: 'Zezwól na sesję',
    approval_btn_session_title: 'Zezwól na tę sesję konwersacji',
    approval_btn_always: 'Zawsze zezwalaj',
    approval_btn_always_title: 'Zawsze zezwalaj na ten wzorzec poleceń',
    approval_btn_deny: 'Odmów',
    approval_btn_deny_title: 'Odmów — nie uruchamiaj tego polecenia',
    approval_responding: 'Odpowiadanie…',
    clarify_heading: 'Wymagane wyjaśnienie',
    clarify_hint: 'Wybierz opcję lub wpisz własną odpowiedź poniżej.',
    clarify_other: 'Inne',
    clarify_send: 'Wyślij',
    clarify_input_placeholder: 'Wpisz swoją odpowiedź…',
    clarify_responding: 'Odpowiadanie…',
    session_attention_approval: (n) => n === 1 ? 'Aprobata' : `Aprobaty (${n})`,
    session_attention_clarify: (n) => n === 1 ? 'Pytanie' : `Pytania (${n})`,
    session_attention_generic: (n) => n === 1 ? 'Wymaga uwagi' : `Wymaga uwagi (${n})`,
    session_attention_approval_title: 'Oczekiwanie na decyzję o zezwoleniu',
    session_attention_clarify_title: 'Oczekiwanie na Twoją odpowiedź',
    session_attention_generic_title: 'Oczekiwanie na działanie użytkownika',
    untitled: 'Bez tytułu',
    n_messages: (n) => n === 1 ? '1 wiadomość' : `${n} wiadomości`,
    load_older_messages: '↑ Przewiń w górę lub kliknij, aby załadować starsze wiadomości',
    session_jump_start: 'Początek',
    session_jump_start_label: 'Przejdź do początku sesji',
    session_jump_end: 'Koniec',
    session_jump_end_label: 'Przejdź do końca sesji',
    session_new_message: 'Nowa wiadomość',
    session_new_message_label: 'Dostępna nowa wiadomość, przejdź do końca',
    jump_to_question: 'do odpowiedzi',
    jump_to_question_label: 'Przejdź do początku tej odpowiedzi',
    queued_label: 'Zostanie wysłane po odpowiedzi',
    queued_count: (n) => n === 1 ? '1 w kolejce' : `${n} w kolejce`,
    queued_cancel: 'Anuluj wiadomości w kolejce',
    model_unavailable: ' (niedostępny)',
    model_unavailable_title: 'Ten model nie znajduje się już na liście Twoich aktywnych dostawców',
    provider_mismatch_warning: (m,p)=>`"${m}" może nie działać z Twoim skonfigurowanym dostawcą (${p}). Wyślij mimo to lub uruchom \`hermes model\` w terminalu, aby przełączyć.`,
    provider_mismatch_label: 'Niezgodność dostawcy',
    gateway_auth_label: 'Uwierzytelnianie bramy nie powiodło się',
    model_not_found_label: 'Model nie został znaleziony',
    model_custom_label: 'Niestandardowy ID modelu',
    model_custom_placeholder: 'np. openai/gpt-5.4',
    model_search_placeholder: 'Szukaj modeli…',
    model_search_no_results: 'Nie znaleziono żadnych modeli',
    model_group_configured: 'Skonfigurowane',
    ws_search_placeholder: 'Szukaj obszarów roboczych…',
    ws_no_results: 'Nie znaleziono żadnych obszarów roboczych',
    workspace_new_worktree_conversation: 'Nowa konwersacja w worktree',
    workspace_new_worktree_conversation_meta: 'Utwórz izolowane git worktree dla tego obszaru roboczego.',
    workspace_worktree_created: 'Utworzono konwersację w worktree',
    workspace_worktree_failed: 'Tworzenie worktree nie powiodło się: ',
    session_worktree_badge: 'Worktree',
    model_scope_advisory: 'Dotyczy tej konwersacji od Twojej następnej wiadomości.',
    model_scope_toast: 'Dotyczy tej konwersacji od Twojej następnej wiadomości.',
    // commands.js
    cmd_clear: 'Wyczyść wiadomości konwersacji',
    cmd_help: 'Pokaż dostępne polecenia ukośnika',
    cmd_compress: 'Ręcznie skompresuj kontekst konwersacji (użycie: /compress [temat])',
    ctx_compress_hint: 'Skompresuj kontekst, aby zwolnić miejsce →',
    ctx_compress_action: '⚠ Skompresuj teraz, aby zwolnić kontekst',
    cmd_compact_alias: 'Starszy alias dla /compress',
    cmd_model: 'Przełącz model (np. /model gpt-4o)',
    cmd_workspace: 'Przełącz obszar roboczy według nazwy',
    cmd_terminal: 'Otwórz terminal obszaru roboczego',
    cmd_new: 'Rozpocznij nową sesję czatu',
    cmd_usage: 'Włącz/wyłącz wyświetlanie zużycia tokenów',
    cmd_theme: 'Przełącz wygląd (motyw: system/dark/light, skórka: default/ares/mono/graphite/slate/poseidon/sisyphus/charizard/sienna/catppuccin/nous/geist-contrast/zeus/verdigris)',
    cmd_personality: 'Przełącz osobowość agenta',
    cmd_skills: 'Lista dostępnych umiejętności Hermes',
    cmd_use: 'Wymuś umiejętność dla następnej wiadomości',
    available_commands: 'Dostępne polecenia:',
    type_slash: 'Wpisz /, aby zobaczyć polecenia',
    conversation_cleared: 'Wyczyszczono konwersację',
    command_label: 'Polecenie',
    context_compaction_label: 'Kompresja kontekstu',
    retrieval_context_label: 'Zindeksowany kontekst',
    retrieval_context_preview: 'Wcześniejsze wiadomości są przechowywane i mogą być pobierane za pomocą narzędzi kontekstowych',
    preserved_task_list_label: 'Zachowana lista zadań',
    reference_only_label: 'Tylko jako odniesienie',
    model_usage: 'Użycie: /model <nazwa>',
    no_model_match: 'Brak modelu pasującego do "',
    model_did_you_mean: (m) => ` — czy chodziło Ci o "${m}"?`,
    switched_to: 'Przełączono na ',
    workspace_usage: 'Użycie: /workspace <nazwa>',
    no_workspace_match: 'Brak obszaru roboczego pasującego do "',
    switched_workspace: 'Przełączono na obszar roboczy: ',
    workspace_switch_failed: 'Przełączanie obszaru roboczego nie powiodło się: ',
    new_session: 'Utworzono nową sesję',
    new_session_creating: 'Tworzenie nowej konwersacji…',
    compressing: 'Żądanie kompresji kontekstu...',
    compress_running_label: 'Kompresowanie',
    compress_complete_label: 'Kompresja zakończona',
    auto_compress_label: 'Automatyczna kompresja',
    compress_failed_label: 'Kompresja nie powiodła się',
    focus_label: 'Skupienie',
    token_usage_on: 'Zużycie tokenów włączone',
    token_usage_off: 'Zużycie tokenów wyłączone',
    usage_cache_hit_detail: 'Pamięć podręczna: {0}% trafień ({1} odczyt / {2} zapis)',
    usage_cached_percent: '{0}% w pamięci podręcznej',
    theme_usage: 'Użycie: /theme ',
    theme_set: 'Motyw: ',
    no_active_session: 'Brak aktywnej sesji',
    cmd_queue: 'Umieść wiadomość w kolejce na następną turę',
    cmd_goal: 'Ustaw lub sprawdź trwały cel',
    goal_evaluating_progress: 'Ocena postępu celu…',
    goal_working_toward: 'Praca nad realizacją celu…',
    goal_continuing_toast: 'Kontynuowanie dążenia do celu…',
    goal_status_none: 'Brak aktywnego celu. Ustaw go za pomocą /goal <tekst>.',
    goal_status_active: (turns, max_turns, goal) => `⊙ Cel (aktywny, ${turns}/${max_turns} tur): ${goal}`,
    goal_status_paused: (turns, max_turns, reason, goal) => `⏸ Cel (wstrzymany, ${turns}/${max_turns}${reason ? `, ${reason}` : ''}): ${goal}`,
    goal_status_done: (turns, max_turns, goal) => `✓ Cel ukończony (${turns}/${max_turns}): ${goal}`,
    goal_set: (turns, goal) => `⊙ Cel ustawiony (budżet ${turns} tur): ${goal}`,
    goal_paused: (goal) => `⏸ Cel wstrzymany: ${goal}`,
    goal_resumed: (goal) => `▶ Cel wznowiony: ${goal}`,
    goal_cleared: 'Cel został wyczyszczony.',
    goal_no_goal: 'Brak aktywnego celu.',
    goal_achieved: (reason) => `✓ Cel osiągnięty: ${reason}`,
    goal_paused_budget_exhausted: (turns, max_turns) => `⏸ Cel wstrzymany — wykorzystano ${turns}/${max_turns} tur. Użyj /goal resume, aby kontynuować, lub /goal clear, aby zatrzymać.`,
    goal_continuing: (turns, max_turns, reason) => `↻ Kontynuowanie dążenia do celu (${turns}/${max_turns}): ${reason}`,
    cmd_interrupt: 'Anuluj bieżącą turę i wyślij nową wiadomość',
    cmd_steer: 'Wprowadź korektę w trakcie tury bez przerywania pracy agenta',
    cmd_queue_no_msg: 'Użycie: /queue <wiadomość>',
    cmd_queue_not_busy: 'Brak aktywnego zadania — po prostu wyślij normalnie',
    cmd_queue_confirm: 'Wiadomość dodana do kolejki',
    cmd_interrupt_no_msg: 'Użycie: /interrupt <wiadomość>',
    cmd_interrupt_confirm: 'Przerwano — wysyłanie nowej wiadomości',
    cmd_steer_no_msg: 'Użycie: /steer <wiadomość>',
    cmd_steer_fallback: 'Korekta niedostępna — dodano do kolejki na następną turę',
    cmd_steer_delivered: 'Korekta dostarczona — agent zobaczy ją przy następnym wyniku narzędzia',
    steer_leftover_queued: 'Korekta dodana do kolejki na następną turę',
    busy_steer_fallback: 'Korekta niedostępna — dodano do kolejki na następną turę',
    busy_interrupt_confirm: 'Przerwano — wysyłanie nowej wiadomości',
    settings_label_busy_input_mode: 'Tryb wprowadzania przy zajętości',
    settings_desc_busy_input_mode: 'Kontroluje, co dzieje się, gdy wysyłasz wiadomość, podczas gdy agent pracuje. Kolejkowanie czeka; Przerwanie anuluje i zaczyna od nowa; Kierowanie (Steer) wprowadza korektę w środku tury bez przerywania (cofa się do kolejkowania, gdy agent lub strumień jest niedostępny).',
    settings_label_fade_text_effect: 'Efekt pojawiania się tekstu',
    settings_desc_fade_text_effect: 'Płynne pojawianie się nowo przesyłanych słów, podczas gdy asystent odpowiada. Podobnie jak w OpenWebUI; domyślnie wyłączone dla maksymalnej wydajności.',
    settings_busy_input_mode_queue: 'Kolejkuj tury',
    settings_busy_input_mode_interrupt: 'Przerwij bieżącą turę',
    settings_busy_input_mode_steer: 'Korekta w trakcie tury (steer)',

    slash_skill_badge: 'Umiejętność',
    slash_skill_desc: 'Wywołaj tę umiejętność',
    cmd_stop: 'Zatrzymaj bieżącą odpowiedź',
    cmd_title: 'Pobierz lub ustaw tytuł sesji',
    cmd_retry: 'Wyślij ponownie ostatnią wiadomość',
    cmd_undo: 'Usuń ostatnią wymianę',
    cmd_btw: 'Zadaj pytanie poboczne (na marginesie)',
    cmd_btw_usage: '/btw <pytanie> — zadaj pytanie poboczne przy użyciu kontekstu konwersacji',
    cmd_background: 'Uruchom zapytanie w tle',
    cmd_background_usage: '/background <zapytanie> — uruchom w tle bez blokowania',
    cmd_branch: 'Rozgałęź tę konwersację na nową sesję',
    cmd_branch_usage: '/branch [nazwa] — rozgałęź konwersację (opcjonalnie z nazwą)',
    branch_forked: 'Rozgałęziono na nową sesję',
    branch_failed: 'Rozgałęzienie nie powiodło się: ',
    fork_from_here: 'Rozgałęź stąd',
    forked_from: 'Rozgałęzione z',
    subagent_children: 'Sesje subagentów',
    btw_asking: 'Zadawanie pytania pobocznego…',
    btw_label: 'Pytanie poboczne — poza historią',
    btw_done: 'Odpowiedziano na pytanie poboczne',
    btw_no_answer: 'Nie otrzymano odpowiedzi.',
    btw_failed: 'Pytanie poboczne nie powiodło się: ',
    bg_running: 'Uruchamianie w tle…',
    bg_complete: 'Zadanie w tle ukończone',
    bg_label: 'Wynik z tła:',
    bg_no_answer: '(brak odpowiedzi)',
    bg_failed: 'Zadanie w tle nie powiodło się: ',
    undo_exchange: 'Cofnij ostatnią wymianę',
    cmd_status: 'Pokaż informacje o sesji',
    cmd_voice: 'Przełącz wejście mikrofonu',
    stream_stopped: 'Generowanie odpowiedzi zatrzymane.',
    no_active_task: 'Brak aktywnego zadania do zatrzymania.',
    cancel_unavailable: 'Anulowanie niedostępne.',
    retry_failed: 'Ponowna próba nie powiodła się: ',
    undo_failed: 'Cofanie nie powiodło się: ',
    undid_n_messages: 'Usunięto',
    undid_messages_suffix: 'wiadomość/wiadomości.',
    status_heading: 'Status sesji',
    status_session_id: 'ID sesji',
    status_title: 'Tytuł',
    status_model: 'Model',
    status_provider: 'Dostawca',
    status_workspace: 'Obszar roboczy',
    status_personality: 'Osobowość',
    status_messages: 'Wiadomości',
    status_agent_running: 'Agent jest uruchomiony',
    status_profile: 'Profil',
    status_hermes_home: 'Katalog domowy Hermes',
    status_started: 'Uruchomiono',
    status_updated: 'Zaktualizowano',
    status_tokens: 'Tokeny',
    status_ephemeral: 'Snapshot ulotny — niezapisywany w historii transkrypcji.',
    status_no_tokens: 'Nie użyto żadnych tokenów',
    status_unknown: 'Nieznany',
    status_yes: 'Tak',
    status_no: 'Nie',
    status_load_failed: 'Nie udało się załadować statusu: ',
    title_current: 'Bieżący tytuł',
    title_change_hint: 'Użyj `/title <nowa nazwa>`, aby zmienić nazwę.',
    title_set: 'Tytuł ustawiony na',
    cmd_webui_only_session: 'To polecenie nie jest dostępne dla sesji zaimportowanych z CLI.',
    cmd_voice_use_mic: 'Kliknij przycisk mikrofonu w kompozytorze.',
    usage_heading: 'Zużycie tokenów',
    usage_default_model: 'domyślny',
    usage_unknown: 'nieznane',
    usage_input_tokens: 'Tokeny wejściowe',
    usage_output_tokens: 'Tokeny wyjściowe',
    usage_total: 'Tokeny łącznie',
    usage_estimated_cost: 'Szacowany koszt',
    usage_settings_tip: 'Uwaga: szacunki kosztów są przybliżone.',
    usage_load_failed: 'Nie udało się załadować zużycia: ',
    usage_personality_none: 'brak',
    // Session toolsets (#493)
    session_toolsets: 'Zestawy narzędzi sesji',
    session_toolsets_desc: 'Ogranicz dostępne narzędzia dla tej sesji (puste = użyj konfiguracji globalnej)',
    session_toolsets_global: 'Globalne (domyślne)',
    session_toolsets_custom: 'Niestandardowe',
    session_toolsets_placeholder: 'narzędzie1, narzędzie2, …',
    session_toolsets_apply: 'Zastosuj',
    session_toolsets_clear: 'Wyczyść (użyj globalnych)',
    session_toolsets_applied: 'Zaktualizowano zestawy narzędzi',
    session_toolsets_cleared: 'Wyczyszczono zestawy narzędzi — używanie konfiguracji globalnej',
    session_toolsets_failed: 'Nie udało się zaktualizować zestawów narzędzi: ',
    no_personalities: 'Nie znaleziono żadnych osobowości (dodaj je do ~/.hermes/personalities/)',
    available_personalities: 'Dostępne osobowości:',
    personality_switch_hint: '\n\nUżyj `/personality <nazwa>`, aby przełączyć, lub `/personality none`, aby wyczyścić.',
    personalities_load_failed: 'Nie udało się załadować osobowości',
    personality_cleared: 'Wyczyszczono osobowość',
    personality_set: 'Osobowość: ',
    failed_colon: 'Nie powiodło się: ',
    // ui.js
    no_workspace: 'Brak obszaru roboczego',
    terminal_open_title: 'Otwórz terminal obszaru roboczego',
    terminal_no_workspace_title: 'Wybierz obszar roboczy, aby otworzyć terminal',
    terminal_title: 'Terminal',
    terminal_clear: 'Wyczyść',
    terminal_copy_output: 'Kopiuj wyjście',
    terminal_restart: 'Uruchom ponownie',
    terminal_collapse: 'Zwiń',
    terminal_expand: 'Rozwiń',
    terminal_close: 'Zamknij',
    terminal_input_placeholder: 'Uruchom polecenie...',
    terminal_start_failed: 'Uruchomienie terminala nie powiodło się: ',
    terminal_input_failed: 'Wprowadzanie w terminalu nie powiodło się: ',
    terminal_copy_failed: 'Kopiowanie nie powiodło się: ',
    terminal_error: 'Błąd terminala',
    terminal_remote_backend_unsupported: 'Wbudowany terminal jest obsługiwany wyłącznie dla lokalnych terminali jako backend.',
    workspace_empty_no_path: 'Nie wybrano obszaru roboczego. Ustaw obszar roboczy w Ustawienia → Obszar roboczy, aby przeglądać pliki.',
    workspace_empty_dir: 'Ten obszar roboczy jest pusty.',
    workspace_show_hidden_files: 'Pokaż ukryte pliki',
    workspace_show_hidden_files_desc: 'Dołącz .DS_Store, .git, node_modules i inne ukryte/systemowe pliki w drzewie plików.',
    workspace_hidden_files_visible: 'ukryte widoczne',
    workspace_hidden_files_visible_title: 'Ukryte pliki są widoczne — kliknij, aby przejść do opcji',
    workspace_options: 'Opcje obszaru roboczego',
    dialog_confirm_title: 'Potwierdź działanie',
    dialog_prompt_title: 'Wpisz wartość',
    dialog_confirm_btn: 'Potwierdź',
    // workspace.js
    unsaved_confirm: 'Masz niezapisane zmiany w podglądzie. Odrzucić i nawigować dalej?',
    discard: 'Odrzuć',
    save: 'Zapisz',
    edit: 'Edytuj',
    clear: 'Wyczyść',
    create: 'Utwórz',
    remove: 'Usuń',
    save_title: 'Zapisz zmiany',
    edit_title: 'Edytuj ten plik',
    saved: 'Zapisano',
    save_failed: 'Zapisywanie nie powiodło się: ',
    image_load_failed: 'Nie można załadować obrazu',
    file_open_failed: 'Nie można otworzyć pliku',
    downloading: (name) => `Pobieranie ${name}…`,
    double_click_rename: 'Kliknij dwukrotnie, aby zmienić nazwę',
    session_rename_failed_no_row: 'Nie można rozpocząć zmiany nazwy — nie znaleziono wiersza.',
    renamed_to: 'Nazwa zmieniona na ',
    rename_failed: 'Zmiana nazwy nie powiodła się: ',
    moved_to: 'Przeniesiono do ',
    move_failed: 'Przeniesienie nie powiodło się: ',
    delete_title: 'Usuń',
    delete_confirm: (name) => `Usunąć ${name}?`,
    delete_dir_confirm: (name) => `Usunąć folder "${name}" wraz z całą jego zawartością?`,
    rename_title: 'Zmień nazwę',
    rename_prompt: 'Nowa nazwa:',
    deleted: 'Usunięto ',
    delete_failed: 'Usuwanie nie powiodło się: ',
    reveal_in_finder: 'Pokaż w Menedżerze Plików',
    reveal_failed: 'Nie udało się pokazać: ',
    copy_file_path: 'Kopiuj ścieżkę pliku',
    open_in_vscode: 'Otwórz w VS Code',
    open_in_vscode_failed: 'Nie udało się otworzyć w VS Code: ',
    download_folder: 'Pobierz folder',
    path_copied: 'Ścieżka pliku została skopiowana do schowka',
    path_copy_failed: 'Nie udało się skopiować ścieżki: ',
    session_rename: 'Zmień nazwę konwersacji',
    session_rename_desc: 'Edytuj tytuł tej konwersacji',
    session_title_regenerate: 'Wygeneruj tytuł ponownie',
    session_title_regenerate_desc: 'Poproś Hermes o wygenerowanie nowego tytułu z konwersacji',
    session_title_regenerating: 'Ponowne generowanie tytułu…',
    session_title_regenerated: (title) => `Tytuł wygenerowany ponownie: ${title}`,
    session_title_regenerate_failed: 'Ponowne generowanie tytułu nie powiodło się: ',
    session_copy_link: 'Kopiuj link do konwersacji',
    session_copy_link_desc: 'Kopiuj bezpośredni link do tej konwersacji',
    session_link_copied: 'Link do konwersacji skopiowany do schowka',
    session_link_copy_failed: 'Nie udało się skopiować linku do konwersacji: ',
    new_file_prompt: 'Nazwa nowego pliku (np. notes.md):',
    new_file: 'Nowy plik',
    new_folder: 'Nowy folder',
    workspace_root: 'katalog główny obszaru roboczego',
    new_file_prompt_title: 'Nazwa nowego pliku w {0}:',
    new_folder_prompt_title: 'Nazwa nowego folderu w {0}:',
    project_name_prompt: 'Nazwa projektu:',
    created: 'Utworzono ',
    create_failed: 'Tworzenie nie powiodło się: ',
    new_folder_prompt: 'Nazwa nowego folderu:',
    folder_created: 'Utworzono folder ',
    folder_create_failed: 'Tworzenie folderu nie powiodło się: ',
    workspace_auto_create_folder: 'Utwórz folder, jeśli nie istnieje',
    folder_add_as_space_btn: 'Dodaj jako przestrzeń',
    folder_add_as_space_msg: 'Dodać ten folder jako nową przestrzeń w liście Twoich obszarów roboczych?',
    folder_add_as_space_title: 'Dodać jako przestrzeń?',
    remove_title: 'Usuń',
    empty_dir: '(pusty)',
    upload_failed: 'Przesyłanie nie powiodło się: ',
    upload_too_large: (maxMb, fileMb) => `Plik jest za duży (${fileMb} MB). Maksymalny rozmiar przesyłania to ${maxMb} MB.`,
    uploading: 'Przesyłanie…',
    uploaded: 'Przesłano',
    all_uploads_failed: (n) => `Wszystkie ${n} przesłane pliki nie powiodły się`,
    archive_extracted: (n, c) => `Wyodrębniono ${n} plików z ${c} archiwów`,
    session_pin: 'Przypnij konwersację',
    session_unpin: 'Odepnij konwersację',
    session_pin_desc: 'Zachowaj tę konwersację na samej górze',
    session_unpin_desc: 'Usuń z przypiętych',
    session_pin_failed: 'Przypinanie nie powiodło się: ',
    session_move_project: 'Przenieś do projektu',
    session_move_project_desc_has: 'Zmień projekt dla tej konwersacji',
    session_move_project_desc_none: 'Przypisz projekt do tej konwersacji',
    session_archive: 'Zarchiwizuj konwersację',
    session_hide_external: 'Ukryj z listy',
    session_restore: 'Przywróć konwersację',
    session_archive_desc: 'Ukryj tę konwersację, dopóki nie zostanie użyty filtr "Zarchiwizowane"',
    session_archive_worktree_desc: 'Ukryj tę konwersację; zachowaj jej worktree na dysku',
    session_hide_external_desc: 'Ukryj tę zaimportowaną sesję z WebUI bez usuwania oryginalnej historii źródłowej.',
    session_restore_desc: 'Przywróć tę konwersację z powrotem do głównej listy',
    session_archived: 'Konwersacja zarchiwizowana',
    session_archived_worktree: 'Konwersacja zarchiwizowana. Worktree pozostaje na dysku.',
    session_hidden: 'Konwersacja ukryta z listy',
    session_restored: 'Konwersacja przywrócona',
    session_archive_failed: 'Archiwizacja nie powiodła się: ',
    session_duplicate: 'Duplikuj konwersację',
    session_duplicate_desc: 'Utwórz kopię konwersacji z tym samym obszarem roboczym i modelem',
    session_duplicated: 'Zduplikowano konwersację',
    session_duplicate_failed: 'Duplikowanie nie powiodło się: ',
    session_stop_response: 'Zatrzymaj odpowiedź',
    session_stop_response_desc: 'Anuluj uruchomioną generację odpowiedzi dla tej konwersacji',
    session_delete: 'Usuń konwersację',
    session_delete_desc: 'Trwale usuń tę konwersację',
    session_delete_confirm: 'Usunąć tę konwersację?',
    session_delete_worktree_desc: 'Usuń tylko konwersację z WebUI; zachowaj worktree na dysku',
    session_delete_worktree_confirm: (path) => `Usunąć tę konwersację? Worktree pod ścieżką ${path} pozostanie na dysku.`,
    session_deleted: 'Konwersacja usunięta',
    session_deleted_worktree: 'Konwersacja usunięta. Worktree pozostaje na dysku.',
    session_worktree_remove: 'Usuń worktree',
    session_worktree_remove_desc: (path) => `Usuń git worktree pod ścieżką ${path} z dysku`,
    session_worktree_remove_confirm: (path) => `Usunąć git worktree z dysku?\n\nŚcieżka: ${path}\n\nTo usunie cały katalog worktree. Dane sesji pozostaną w WebUI.`,
    session_worktree_remove_not_exists: (path) => `Worktree pod ścieżką ${path} już nie istnieje na dysku.`,
    session_worktree_remove_confirm_label: 'Usuń',
    session_worktree_removed: 'Usunięto worktree.',
    session_worktree_remove_failed: 'Nie udało się usunąć worktree: ',
    session_worktree_remove_status_failed: 'Nie udało się odczytać statusu worktree: ',
    session_worktree_remove_locked_by_stream: 'Nie można usunąć — aktywna sesja strumieniowania korzysta z tego worktree.',
    session_worktree_remove_locked_by_terminal: 'Nie można usunąć — aktywna sesja terminala korzysta z tego worktree.',
    session_worktree_remove_unsafe_blocked: 'Rozwiąż lokalne zmiany lub niewypchnięte commity przed usunięciem tego worktree.',
    session_worktree_remove_dirty_warning: 'OSTRZEŻENIE: To worktree zawiera niezatwierdzone zmiany, które zostaną utracone.',
    session_worktree_remove_untracked_warning: (count) => `${count} nieśledzonych plików zostanie trwale usuniętych.`,
    session_worktree_remove_ahead_warning: (ahead) => `${ahead} niewypchniętych commitów zostanie utraconych.`,
    session_select_mode: 'Wybierz',
    session_select_mode_desc: 'Zaznacz konwersacje, aby zarządzać nimi zbiorczo',
    session_select_all: 'Zaznacz wszystko',
    session_deselect_all: 'Odznacz wszystko',
    session_selected_count: '{0} zaznaczonych',
    session_batch_archive: 'Zarchiwizuj',
    session_batch_delete: 'Usuń',
    session_batch_move: 'Przenieś do projektu',
    session_batch_delete_confirm: 'Usunąć {0} konwersacji?',
    session_batch_archive_confirm: 'Zarchiwizować {0} konwersacji?',
    session_batch_delete_worktree_confirm: 'Usunąć {0} konwersacji? {1} konwersacji opartych o worktree pozostawi swoje katalogi worktree na dysku.',
    session_batch_archive_worktree_confirm: 'Zarchiwizować {0} konwersacji? {1} konwersacji opartych o worktree zachowa swoje katalogi worktree na dysku.',
    session_no_selection: 'Brak zaznaczonych konwersacji',
    // settings panel
    settings_heading_title: 'Centrum sterowania',
    settings_heading_subtitle: 'Preferencje, narzędzia konwersacji i sterowanie systemem.',
    settings_section_conversation_title: 'Konwersacja',
    settings_section_appearance_title: 'Wygląd',
    settings_section_appearance_meta: 'Motyw, akcenty kolorystyczne i styl wizualny.',
    settings_section_preferences_title: 'Preferencje',
    settings_section_preferences_meta: 'Domyślne ustawienia i zachowanie UI dla Hermes Web UI.',
    settings_section_system_title: 'System',
    settings_section_system_meta: 'Wersja instancji i kontrola dostępu.',
    settings_check_now: 'Sprawdź teraz',
    settings_checking: 'Sprawdzanie…',
    settings_up_to_date: 'Aktualny ✓',
    settings_updates_available: 'Dostępne aktualizacje ({count})',
    settings_updates_disabled: 'Sprawdzanie aktualizacji wyłączone',
    settings_update_check_failed: 'Sprawdzanie aktualizacji nie powiodło się',
    settings_label_workspace_panel_open: 'Zachowaj panel obszaru roboczego domyślnie otwarty',
    settings_desc_workspace_panel_open: 'Gdy ta opcja jest włączona, panel obszaru roboczego / przeglądarki plików otwiera się automatycznie przy każdej nowej sesji. Nadal możesz go zamknąć ręcznie w dowolnym momencie.',
    settings_label_session_jump_buttons: 'Pokaż przyciski skoku sesji',
    settings_desc_session_jump_buttons: 'Pokaż pływające przyciski Początek i Koniec podczas czytania długich historii sesji.',
    settings_label_terminal_auto_expand: 'Automatycznie rozwiń terminal przy wyjściu',
    settings_desc_terminal_auto_expand: 'Automatycznie rozwija zwinięty panel terminala, gdy uruchomione polecenie generuje nowe wyjście.',

    settings_label_session_endless_scroll: 'Ładuj starsze wiadomości podczas przewijania w górę',

    settings_desc_session_endless_scroll: 'Gdy ta opcja jest włączona, starsze wiadomości ładują się automatycznie przy przewijaniu w górę. Gdy jest wyłączona, użyj przycisku wczytywania starszych wiadomości.',
    settings_label_auto_scroll_follow: 'Automatycznie podążaj za nową treścią',
    settings_desc_auto_scroll_follow: 'Gdy włączone, widok przewija się na dół w miarę napływania nowych tokenów. Gdy wyłączone, sam kontrolujesz pozycję przewijania.',
    settings_label_worklog_details_expanded_default: 'Otwieraj szczegóły Worklog automatycznie',
    settings_desc_worklog_details_expanded_default: 'Gdy ta opcja jest włączona, nowe szczegóły Worklog zaczynają rozwinięte, dzięki czemu karty narzędzi, Thinking i postępu są widoczne bez dodatkowego kliknięcia. Gdy jest wyłączona, szczegóły Worklog pozostają domyślnie zwinięte. Ręczne decyzje o zwinięciu/rozwinięciu w danej turze mają pierwszeństwo.',
    settings_label_chat_activity_display_mode: 'Activity display',
    settings_desc_chat_activity_display_mode: 'Compact Worklog groups supporting activity into a quiet summary. Transparent Stream keeps each thinking/tool event as its own chronological expandable row.',
    first_token_time: 'Time to first token',
    done: 'Done',
    settings_option_compact_worklog: 'Compact Worklog',
    settings_option_transparent_stream: 'Transparent Stream',

    settings_label_tab_visibility: 'Karty paska bocznego',
    settings_desc_tab_visibility: 'Wybierz, które karty pojawiają się na pasku bocznym i szynie. Przeciągnij elementy, aby zmienić ich kolejność. Czat i Ustawienia są zawsze widoczne.',
    open_in_browser: 'Otwórz w przeglądarce',
    settings_dropdown_conversation: 'Konwersacja',
    settings_dropdown_appearance: 'Wygląd',
    settings_dropdown_preferences: 'Preferencje',
    settings_dropdown_providers: 'Dostawcy',
    settings_dropdown_system: 'System',
    settings_tab_conversation: 'Konwersacja',
    settings_tab_appearance: 'Wygląd',
    settings_tab_preferences: 'Preferencje',
    settings_tab_plugins: 'Wtyczki',
    settings_plugins_title: 'Wtyczki',
    plugins_enable_toggle: 'Włącz',
    settings_plugins_meta: 'Zobacz zainstalowane wtyczki Hermes oraz rejestrowane przez nie haki cyklu życia. Ten panel jest tylko do odczytu.',
    settings_plugins_empty: 'Żadne wtyczki Hermes nie są obecnie widoczne. Zainstaluj lub włącz wtyczki z poziomu CLI/konfiguracji Hermes, aby zobaczyć je tutaj.',
    plugins_unnamed: 'Nienazwana wtyczka',
    plugins_no_description: 'Brak opisu.',
    plugins_no_hooks: 'Brak zarejestrowanych haków cyklu życia',
    plugins_registered_hooks: 'Zarejestrowane haki',
    plugins_enabled: 'Włączone',
    plugins_disabled: 'Wyłączone',
    plugins_active_provider: 'Aktywny (dostawca)',
    plugins_provider_no_hooks: 'Wtyczka dostawcy — brak haków widocznych dla agenta',
    plugins_load_failed: 'Nie udało się załadować wtyczek: ',
    settings_tab_system: 'System',
    settings_tab_help: 'Pomoc',
    settings_help_meta: 'Zasoby i wsparcie dla Hermes WebUI.',
    settings_help_docs_label: 'Dokumentacja',
    settings_help_docs_desc: 'Przewodniki, dokumentacja konfiguracji i pełny plik README Hermes WebUI.',
    settings_help_docs_link: 'Otwórz dokumentację',
    settings_help_issue_label: 'Masz problem?',
    settings_help_issue_desc: 'Przeszukaj istniejące zgłoszenia lub utwórz nowe w serwisie GitHub.',
    settings_help_issue_link: 'Otwórz zgłoszenia GitHub',
    settings_title: 'Ustawienia',
    settings_save_btn: 'Zapisz ustawienia',
    settings_label_model: 'Domyślny model',
    settings_desc_model: 'Używany dla nowych konwersacji. Istniejące konwersacje zachowują swój wybrany model.',
    settings_label_auxiliary_models: 'Modele pomocnicze',
    settings_desc_auxiliary_models: 'Pomocnicze trasowanie zadań dla wizji, kompresji, generowania tytułów itp. „Auto” używa Twojego głównego modelu czatu.',
    settings_btn_reset_aux_models: 'Resetuj wszystko do auto',
    settings_btn_apply_aux_models: 'Zastosuj zmiany',
    settings_aux_provider_auto: 'używaj głównego modelu',
    settings_aux_model_auto: 'auto (użyj domyślnego dla dostawcy)',
    settings_aux_model_custom: 'Niestandardowy model…',
    settings_aux_model_custom_prompt: 'Wpisz ID modelu:',
    settings_aux_loading: 'Ładowanie modeli pomocniczych…',
    settings_aux_load_failed: 'Nie można załadować ustawień modeli pomocniczych. Upewnij się, że API agenta jest dostępne.',
    settings_aux_reset_confirm_title: 'Resetować modele pomocnicze?',
    settings_aux_reset_confirm_msg: 'To ustawi wszystkie zadania pomocnicze na auto (użycie głównego modelu).',
    settings_aux_reset_done: 'Modele pomocnicze zresetowane do auto',
    settings_aux_save_failed: 'Nie udało się zapisać modelu pomocniczego',
    settings_aux_saved: 'Zaktualizowano modele pomocnicze',
    settings_aux_no_changes: 'Brak zmian do zastosowania',
    settings_label_send_key: 'Klawisz wysyłania',
    settings_label_theme: 'Motyw',
    settings_label_skin: 'Skórka',
    settings_label_font_size: 'Rozmiar czcionki',
    font_size_small: 'Mała',
    font_size_default: 'Domyślna',
    font_size_large: 'Duża',
    font_size_xlarge: 'Bardzo duża',
    settings_autosave_saving: 'Zapisywanie…',
    settings_autosave_saved: 'Zapisano',
    settings_autosave_failed: 'Zapisywanie nie powiodło się',
    settings_autosave_retry: 'Ponów próbę',
    settings_label_language: 'Język',
    settings_label_quota_chip: 'Pokaż wskaźnik limitu dostawcy w polu wprowadzania',
    settings_desc_quota_chip: 'Wyświetla subtelny wskaźnik pozostałego limitu (np. saldo kredytów OpenRouter) w stopce pola wprowadzania. Domyślnie wyłączone. Widoczne tylko na szerokich ekranach (≥1400px), aby utrzymać pole wprowadzania czytelnym na laptopach i standardowych monitorach.',
    settings_label_conversation_outline: 'Pokaż zarys konwersacji',
    settings_desc_conversation_outline: 'Pokazuje desktopową listę skrótów do pytań użytkownika w bieżącej konwersacji. Domyślnie wyłączone.',
    settings_label_hide_suggestions: 'Ukryj sugestie nowej konwersacji',
    settings_desc_hide_suggestions: 'Ukryj trzy domyślne przyciski sugestii na pustym ekranie nowej konwersacji, aby zapobiec przypadkowym kliknięciom.',
    settings_label_token_usage: 'Pokaż zużycie tokenów',
    settings_label_token_speed: 'Pokaż prędkość tokenów (TPS)',
    settings_desc_token_speed: 'Wyświetla tokeny na sekundę w nagłówkach wiadomości asystenta podczas strumieniowania i po zakończeniu odpowiedzi. Domyślnie wyłączone.',
    settings_label_sidebar_density: 'Gęstość paska bocznego',
    cmd_reasoning: 'Przełącz widoczność myślenia (pokaż/ukryj), ustaw poziom wysiłku lub sprawdź bieżący status',
    settings_label_external_sessions: 'Pokaż sesje inne niż WebUI',
    settings_label_cron_sessions: 'Pokaż sesje cron',
    settings_label_previous_messaging_sessions: 'Pokaż poprzednie sesje komunikatorów',
    settings_label_sync_insights: 'Synchronizuj z Insights',
    settings_label_check_updates: 'Sprawdzaj aktualizacje',
    settings_label_ignore_agent_updates: 'Ignoruj aktualizacje agenta',
    settings_label_whats_new_summary: 'Podsumuj Co Nowego za pomocą AI',
    settings_label_bot_name: 'Domyślna nazwa asystenta',
    settings_label_password: 'Hasło dostępu',
    settings_label_pinned_limit: 'Limit przypiętych rozmów',
    settings_desc_pinned_limit: 'Maksymalna liczba aktywnych rozmów, które można przypiąć na pasku bocznym. Domyślnie 3.',
    settings_label_dashboard_mode: 'Oficjalny panel Hermes',
    settings_desc_dashboard_mode: 'Pokaż link na pasku nawigacyjnym, gdy oficjalny panel hermes jest osiągalny. Publiczne adresy URL reverse proxy są przechowywane wyłącznie jako linki w przeglądarce i nigdy nie są sondowane przez serwer.',
    settings_dashboard_mode_auto: 'Wykryj automatycznie',
    settings_dashboard_mode_always: 'Zawsze pokazuj',
    settings_dashboard_mode_never: 'Nigdy nie pokazuj',
    settings_dashboard_save: 'Zapisz ustawienia linku panelu',
    settings_label_gateway_status: 'Status bramy',
    settings_desc_gateway_status: 'Status bramy Hermes (Telegram, Discord, Slack itp.)',
    gateway_not_configured: 'Brama nie jest skonfigurowana',
    gateway_metadata_stale: 'Metadane bramy są nieaktualne',
    gateway_endpoint_unreachable: 'Punkt końcowy bramy jest nieosiągalny',
    gateway_not_running: 'Brama nie działa',
    gateway_running_label: 'Działa',
    gateway_last_active: 'Ostatnia aktywność: ',
    gateway_session_count: (n) => `${n} ${n === 1 ? 'sesja' : (n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20)) ? 'sesje' : 'sesji'}`,
    gateway_load_failed: 'Nie udało się załadować statusu bramy',
    settings_saved: 'Zapisano ustawienia',
    settings_save_failed: 'Zapisywanie nie powiodło się: ',
    settings_load_failed: 'Nie udało się załadować ustawień: ',
    settings_saved_pw: 'Zapisano ustawienia — ochrona hasłem włączona, ta przeglądarka pozostanie zalogowana',
    settings_saved_pw_updated: 'Zapisano ustawienia — hasło zaktualizowane',
    // login page (used server-side via /api/i18n/login endpoint)
    login_title: 'Zaloguj się',
    login_subtitle: 'Wpisz hasło, aby kontynuować',
    login_placeholder: 'Hasło',
    login_btn: 'Zaloguj się',
    login_invalid_pw: 'Nieprawidłowe hasło',
    login_conn_failed: 'Połączenie nie powiodło się',
    // Sidebar & Tabs
    tab_chat: 'Czat',
    tab_tasks: 'Zadania',
    tab_skills: 'Umiejętności',
    tab_memory: 'Pamięć',
    tab_workspaces: 'Przestrzenie',
    tab_profiles: 'Profile',
    tab_kanban: 'Kanban',
    kanban_board: 'Tablica',
    kanban_visible_tasks: '{0} widocznych zadań',
    kanban_search_tasks: 'Szukaj zadań',
    kanban_all_assignees: 'Wszyscy przypisani',
    kanban_all_tenants: 'Wszyscy dzierżawcy',
    kanban_include_archived: 'Uwzględnij zarchiwizowane',
    kanban_no_matching_tasks: 'Brak pasujących zadań',
    kanban_no_data: 'Brak danych Kanban',
    kanban_work_queue_hint: 'To jest kolejka pracy Agenta Hermes. Utwórz zadanie lub dokonaj triażu, przypisz je, przenieś do statusu "Gotowe", a następnie pozwól dyspozytorowi je pobrać.',
    kanban_unavailable: 'Kanban niedostępny',
    kanban_read_only: 'Widok tylko do odczytu',
    kanban_empty: 'Puste',
    kanban_task: 'Zadanie',
    kanban_no_description: 'Brak opisu',
    kanban_refresh: 'Odśwież',
    kanban_status_triage: 'Do weryfikacji (Triage)',
    kanban_status_todo: 'Do zrobienia',
    kanban_status_ready: 'Gotowe',
    kanban_status_running: 'Uruchomione',
    kanban_status_blocked: 'Zablokowane',
    kanban_status_done: 'Zrobione',
    kanban_comments_count: 'Komentarze ({0})',
    kanban_events_count: 'Zdarzenia ({0})',
    kanban_links: 'Linki',
    kanban_parents: 'Nadrzędne (rodzice)',
    kanban_children: 'Podrzędne (dzieci)',
    kanban_runs_count: 'Uruchomienia ({0})',
    kanban_no_comments: 'Brak komentarzy',
    kanban_no_events: 'Brak zdarzeń',
    kanban_no_runs: 'Brak uruchomień',
    kanban_title: 'Tytuł',
    kanban_description: 'Opis',
    kanban_description_placeholder: 'Opcjonalnie — co musi się wydarzyć, kryteria akceptacji, linki',
    kanban_status: 'Status',
    kanban_assignee: 'Przypisana osoba',
    kanban_assignee_placeholder: 'Opcjonalnie — pozostaw puste dla dowolnego wykonawcy',
    kanban_tenant: 'Dzierżawca (projekt/zespół)',
    kanban_tenant_placeholder: 'Opcjonalnie — identyfikator projektu lub zespołu',
    kanban_priority: 'Priorytet',
    kanban_priority_hint: 'Wyższe liczby są uruchamiane jako pierwsze. Domyślnie 0.',
    kanban_title_required: 'Tytuł jest wymagany.',
    kanban_new_task: 'Nowe zadanie',
    kanban_edit_task: 'Edytuj zadanie',
    kanban_status_original_hint: 'Rzeczywisty status: {0}. To okno dialogowe obsługuje wyłącznie edycję dla "Do weryfikacji" / "Do zrobienia" / "Gotowe".',
    kanban_run_dispatcher: 'Uruchom dyspozytora',
    kanban_run_dispatcher_confirm: 'Spowoduje to przypisanie zadań o statusie "Gotowe" na tej tablicy i uruchomienie procesów pomocniczych (jeden na zadanie, do 8 na kliknięcie). Kontynuować?',
    kanban_assignee_profiles_label: 'Profile Hermes',
    kanban_assignee_other_label: 'Inne (ścieżki CLI / usunięte profile)',
    kanban_assignee_unassigned: '— Nieprzypisane (nie uruchomi się automatycznie) —',
    kanban_ready_needs_assignee: 'Wybrano "Nieprzypisane" + "Gotowe". Dyspozytor pominie to zadanie. Wyślij ponownie, aby potwierdzić, lub wybierz profil.',
    kanban_dispatch_preview_prefix: 'Podgląd:',
    kanban_dispatch_run_prefix: 'Wysłano:',
    kanban_dispatch_spawned: 'uruchomiono',
    kanban_dispatch_promoted: 'awansowano',
    kanban_dispatch_reclaimed: 'odzyskane',
    kanban_dispatch_skipped_unassigned: 'pominięto (brak przypisanego)',
    kanban_dispatch_skipped_nonspawnable: 'pominięto (nieznany profil)',
    kanban_dispatch_auto_blocked: 'automatycznie zablokowane',
    kanban_dispatch_timed_out: 'przekroczono limit czasu',
    kanban_dispatch_crashed: 'awaria',
    kanban_add_comment: 'Dodaj komentarz',
    kanban_only_mine: 'Tylko moje',
    kanban_bulk_action: 'Działanie zbiorcze',
    kanban_nudge_dispatcher: 'Podgląd dyspozytora',
    kanban_stats: 'Statystyki',
    kanban_worker_log: 'Log wykonawcy',
    kanban_block: 'Zablokuj',
    kanban_unblock: 'Odblokuj',
    kanban_back_to_board: 'Powrót do tablicy',
    kanban_lanes_by_profile: 'Tory według profili',
    kanban_new_board: 'Nowa tablica…',
    kanban_rename_board: 'Zmień nazwę bieżącej tablicy…',
    kanban_archive_board: 'Zarchiwizuj bieżącą tablicę…',
    kanban_archive_board_confirm: 'Zarchiwizować tablicę "{name}"? Zadania pozostaną na dysku, a tablica może zostać przywrócona z kanban/boards/_archived/.',
    kanban_board_archived: 'Tablica zarchiwizowana',
    kanban_board_name: 'Nazwa',
    kanban_board_slug: 'Identyfikator (małe litery, myślniki)',
    kanban_board_description: 'Opis (opcjonalnie)',
    kanban_board_icon: 'Ikona (emoji, opcjonalnie)',
    kanban_board_color: 'Kolor (opcjonalnie)',
    kanban_board_name_required: 'Nazwa jest wymagana',
    kanban_board_slug_required: 'Identyfikator (slug) jest wymagany',
    kanban_card_complete: 'ukończone',
    kanban_card_archive: 'archiwizuj',
    kanban_unassigned: 'nieprzypisane',
    kanban_status_archived: 'Zarchiwizowane',
    tab_todos: 'Lista zadań',
    tab_insights: 'Statystyki',
    tab_dashboard: 'Pulpit nawigacyjny Hermes',
    dashboard_loopback_warning: 'Pulpit nawigacyjny na serwerze jest dostępny wyłącznie lokalnie (loopback). Przeglądaj bezpośrednio z serwera lub uruchom go ponownie z flagą --host 0.0.0.0 (niebezpieczne).',
    tab_logs: 'Logi',
    tab_settings: 'Ustawienia',
    new_conversation: 'Nowa konwersacja',
    filter_conversations: 'Filtruj konwersacje...',
    markdown_table_filter: 'Filtruj tabelę',
    markdown_table_sort_column: 'Sortuj kolumnę',
    session_time_unknown: 'Nieznany',
    session_time_minutes_ago: (n) => `${n} min temu`,
    session_time_hours_ago: (n) => `${n} godz. temu`,
    session_time_days_ago: (n) => `${n} dni temu`,
    session_time_last_week: '1 tydz. temu',
    session_time_bucket_today: 'Dzisiaj',
    session_time_bucket_yesterday: 'Wczoraj',
    session_time_bucket_this_week: 'W tym tygodniu',
    session_time_bucket_last_week: 'W zeszłym tygodniu',
    session_time_bucket_older: 'Starsze',
    scheduled_jobs: 'Zaplanowane zadania',
    new_job: 'Nowe zadanie',
    loading: 'Ładowanie...',
    search_skills: 'Szukaj umiejętności...',
    new_skill: 'Nowa umiejętność',
    personal_memory: 'Pamięć osobista',
    current_task_list: 'Bieżąca lista zadań',
    // Logs
    logs_title: 'Logi',
    logs_file: 'Plik',
    logs_tail: 'Śledzenie końcówki',
    logs_auto_refresh: 'Automatyczne odświeżanie (5s)',
    logs_wrap: 'Zawijaj wiersze',
    logs_copy_all: 'Kopiuj wszystko',
    logs_empty: 'Brak wpisów w logach.',
    logs_loading: 'Ładowanie logów…',
    logs_load_failed: 'Nie udało się załadować logów',
    logs_status_idle: 'Wybierz plik logów, aby wyświetlić najnowsze wiersze.',
    logs_no_mtime: 'jeszcze nie zapisano',
    logs_truncated_hint: 'Wyświetlanie końcówki dużego pliku logów; starsze bajty zostały pominięte, aby ograniczyć zużycie pamięci.',
    logs_copied: 'Logi skopiowane',
    logs_severity: 'Poziom ważności',
    logs_severity_all: 'Wszystkie',
    logs_severity_errors: 'Błędy',
    logs_severity_warnings: 'Ostrzeżenia+',
    logs_filter_active: 'wyświetlane (filtr aktywny)',

    // Insights
    insights_title: 'Analityka zużycia',
    insights_sessions: 'Sesje',
    insights_messages: 'Wiadomości',
    insights_tokens: 'Tokeny',
    insights_cost: 'Szacowany koszt',
    insights_no_cost: 'Niedostępne',
    insights_models: 'Modele',
    insights_activity_by_day: 'Aktywność według dni',
    insights_activity_by_hour: 'Aktywność według godzin',
    insights_peak_hour: 'Szczyt: {hour}',
    insights_token_breakdown: 'Podział tokenów',
    insights_input_tokens: 'Wejście',
    insights_output_tokens: 'Wyjście',
    insights_total: 'Łącznie',
    insights_daily_tokens: 'Tokeny dziennie',
    insights_model_name: 'Model',
    insights_model_sessions: 'Sesje',
    insights_model_tokens: 'Tokeny',
    insights_model_cost: 'Koszt',
    insights_model_share: 'Udział',
    insights_no_usage_data: 'Brak danych o zużyciu',
    insights_footer: 'Wyświetlanie danych z ostatnich {days} dni',
    insights_skill_usage_title: 'Użycie umiejętności',
    insights_skill_usage_sub: 'Częstotliwość wywołań narzędzi',
    insights_skill_usage_total: 'Wszystkie wywołania',
    insights_skill_usage_skills_used: 'Użyte umiejętności',
    insights_skill_usage_no_data: 'Brak danych o użyciu umiejętności',
    insights_skill_usage_no_data_hint: 'Umiejętności pojawią się tutaj, gdy zostaną użyte w konwersacjach.',
    insights_skill_usage_footer: 'Liczba wywołań z katalogu ~/.hermes/skills/',
    insights_skill_usage_col_skill: 'Umiejętność',
    insights_skill_usage_col_uses: 'Wywołania',
    insights_skill_usage_col_views: 'Wyświetlenia',
    insights_skill_usage_col_share: 'Użycie %',
    insights_skill_usage_col_patches: 'Poprawki',
    workspace_desc: 'Dodawaj i przełączaj obszary robocze dla swoich sesji.',
    session_meta_messages: (n) => n === 1 ? '1 wiadomość' : `${n} wiadomości`,
    session_meta_children: (n) => n === 1 ? '1 podrzędna' : `${n} podrzędne`,
    session_meta_segments: (n) => n === 1 ? '1 wcześniejsza tura' : `${n} wcześniejszych tur`,
    session_lineage_toggle_hint: '{0} — wcześniejsze tury kontekstu są tutaj zwinięte. Kliknij, aby je pokazać lub ukryć.',
    session_lineage_static_hint: '{0} — wcześniejsze tury kontekstu są tutaj zwinięte.',
    session_child_toggle_hint: '{0} — konwersacje podrzędne wygenerowane z tej sesji. Kliknij, aby je pokazać lub ukryć.',
    session_readonly_title_hint: 'Zaimportowana sesja tylko do odczytu — {0}',
    session_lineage_segment_untitled: 'Nienazwany segment',
    session_lineage_segment_open: 'Otwórz segment genealogii',
    new_profile: 'Nowy profil',
    transcript: 'Transkrypcja',
    download_transcript: 'Pobierz jako Markdown',
    import: 'Importuj',
    export_session_json: 'JSON',
    export_session_json_tooltip: 'Eksportuj pełną sesję jako JSON',
    import_session_json_tooltip: 'Importuj sesję z pliku JSON',
    clear_conversation_btn_tooltip: 'Wyczyść wszystkie wiadomości w tej konwersacji',
    // Settings detail
    settings_label_rtl: 'Układ czatu od prawej do lewej',
    settings_desc_rtl: 'Odwraca wyrównanie wiadomości czatu i pola wprowadzania dla języków takich jak arabski czy hebrajski. Wpływa tylko na obszar czatu — pasek boczny i inne panele pozostają wyrównane od lewej do prawej.',
    settings_label_sound: 'Dźwięk powiadomienia',
    settings_desc_sound: 'Odtwórz dźwięk, gdy asystent zakończy generowanie odpowiedzi.',
    // TTS (#499)
    tts_listen: 'Słuchaj',
    tts_not_supported: 'Synteza mowy nie jest obsługiwana w tej przeglądarce.',
    settings_label_tts: 'Zamiana tekstu na mowę (TTS) dla odpowiedzi',
    settings_desc_tts: 'Pokaż przycisk głośnika przy każdej wiadomości asystenta, aby przeczytać ją na głos przy użyciu syntezy mowy w przeglądarce.',
    settings_label_tts_auto_read: 'Czytaj automatycznie odpowiedzi na głos',
    settings_desc_tts_auto_read: 'Automatycznie odczytuj każdą nową odpowiedź asystenta po jej zakończeniu. Pauzuje podczas pisania.',
    // Composer voice-mode pref (#1488)
    settings_label_voice_mode: 'Przycisk trybu głosowego głośnomówiącego',
    settings_desc_voice_mode: 'Pokaż przycisk trybu głosowego (fala dźwiękowa) obok mikrofonu dyktowania. Pozwala mówić naturalnie — Hermes automatycznie wysyła wiadomość po pauzie i czyta odpowiedzi na głos. Wymaga przeglądarki obsługującej zarówno rozpoznawanie mowy, jak i TTS.',
    settings_label_raw_audio: 'Wyślij surowy dźwięk zamiast transkrypcji',
    settings_desc_raw_audio: 'Nagraj i wyślij oryginalny plik audio do agenta, zamiast najpierw konwertować go na tekst. Agent może go wtedy transkrybować lub przetwarzać surowe audio (emocje, szum tła, własny STT). Podobnie jak wiadomości głosowe w Telegramie.',
    voice_send_raw: 'Wyślij surowe audio',
    voice_raw_attached: 'Dołączono dźwięk. Naciśnij Wyślij lub wpisz więcej tekstu.',
    settings_label_tts_voice: 'Głos',
    settings_desc_tts_voice: 'Preferowany głos. Pobierany z dostępnych głosów w Twojej przeglądarce.',
    settings_label_tts_rate: 'Tempo mowy',
    settings_label_tts_pitch: 'Ton mowy',
    settings_label_tts_engine: 'Silnik TTS',
    settings_desc_tts_engine: 'Wybierz silnik mowy. Edge TTS korzysta z głosów neuronowych Microsoft za pośrednictwem serwera.',
    settings_label_notifications: 'Powiadomienia przeglądarki',
    settings_desc_notifications: 'Pokaż powiadomienie systemowe, gdy odpowiedź zostanie ukończona, podczas gdy aplikacja działa w tle.',
    notifications_enable_btn: 'Włącz powiadomienia',
    notifications_test_btn: 'Wyślij test',
    notifications_permission_status: (status) => `Uprawnienie: ${status}`,
    notifications_enabled_toast: 'Powiadomienia włączone.',
    notifications_denied: 'Powiadomienia są zablokowane w tej przeglądarce. Włącz je w ustawieniach przeglądarki.',
    notifications_unsupported: 'Powiadomienia nie są obsługiwane w tej przeglądarce.',
    settings_desc_token_usage: 'Wyświetla liczbę tokenów wejściowych/wyjściowych pod każdą odpowiedzią asystenta. Można też przełączyć za pomocą /usage.',
    settings_label_api_redact: 'Ukrywaj poufne dane w odpowiedziach API',
    settings_desc_api_redact: 'Użytkownicy korzystający z hostingu własnego mogą wyłączyć to dla przejrzystości (niezalecane dla współdzielonych instancji).',
    outline_title: 'Zarys',
    outline_empty: 'Nie ma jeszcze pytań.',
    outline_loading: 'Ładowanie…',
    settings_sidebar_density_compact: 'Kompaktowa',
    settings_sidebar_density_detailed: 'Szczegółowa',
    settings_desc_sidebar_density: 'Kontroluje, ile metadanych wyświetla lista sesji na lewym pasku bocznym.',
    settings_label_auto_title_refresh: 'Adaptacyjne odświeżanie tytułu',
    settings_auto_title_refresh_off: 'Wyłączone',
    settings_auto_title_refresh_5: 'Co 5 wymian',
    settings_auto_title_refresh_10: 'Co 10 wymian',
    settings_auto_title_refresh_20: 'Co 20 wymian',
    settings_desc_auto_title_refresh: 'Automatycznie generuje na nowo tytuł konwersacji na podstawie najnowszej wymiany, utrzymując go adekwatnym w miarę rozwoju rozmowy. Wymaga skonfigurowanego modelu LLM do generowania tytułów.',
    settings_desc_external_sessions: 'Pokaż konwersacje z CLI, Telegrama, Discorda, Slacka i innych kanałów na liście sesji. Kliknij, aby zaimportować i kontynuować.',
    settings_desc_cron_sessions: 'Wyświetlaj wyjście zadań cron jako konwersacje na pasku bocznym. Aktywne tylko wtedy, gdy włączone są sesje spoza WebUI. Domyślnie wyłączone; zadania o wysokiej częstotliwości mogą zalać pasek boczny.',
    settings_desc_previous_messaging_sessions: 'Pokaż starsze sesje z Discorda, Telegrama, Slacka i Weixin, które zostały zastąpione przez reset lub kompresję.',
    settings_desc_sync_insights: 'Odzwierciedla zużycie tokenów WebUI w state.db, dzięki czemu hermes /insights uwzględnia dane sesji przeglądarki. Domyślnie wyłączone.',
    settings_desc_check_updates: 'Pokaż baner, gdy dostępne są nowsze wersje WebUI lub Agenta. Okresowo uruchamia pobieranie git fetch w tle.',
    settings_desc_ignore_agent_updates: 'Zachowaj sprawdzanie aktualizacji WebUI, ale ukrywaj powiadomienia o aktualizacjach Agenta i pomijaj pobieranie aktualizacji Agenta.',
    settings_desc_whats_new_summary: "Zmienia działanie „Co nowego” z otwierania najpierw surowego diffa na generowanie krótkiego, czytelnego dla człowieka podsumowania przez AI. Zwykłe porównanie diff pozostaje dostępne po podsumowaniu.",
    settings_desc_bot_name: 'Używane tylko dla profilu domyślnego. Inne profile używają własnych nazw profilu.',
    settings_desc_password: 'Wpisz nowe hasło, aby je ustawić lub zmienić. Pozostaw puste, aby zachować obecne ustawienie.',
    password_placeholder: 'Wpisz nowe hasło…',
    password_env_var_locked: 'Zmienna środowiskowa HERMES_WEBUI_PASSWORD jest obecnie ustawiona i ma pierwszeństwo. Usuń ją i zrestartuj serwer, aby zarządzać hasłem stąd.',
    password_env_var_locked_placeholder: 'Zablokowane: zmienna HERMES_WEBUI_PASSWORD jest ustawiona',
    disable_auth: 'Wyłącz uwierzytelnianie',
    sign_out: 'Wyloguj się',
    settings_label_shutdown: 'Zatrzymaj serwer Hermes WebUI',
    settings_desc_shutdown_before_cmd: 'Bezpiecznie zatrzymuje lokalny serwer WebUI. Przydatne, jeśli uruchomiłeś go przez ',
    settings_desc_shutdown_between_cmds: ' i chcesz zatrzymać bez przełączania się do terminala. Będziesz musiał ponownie uruchomić serwer (',
    settings_desc_shutdown_after_cmd: ' lub aplikację natywną), zanim WebUI będzie ponownie osiągalny.',
    settings_btn_shutdown: 'Zatrzymaj serwer',
    settings_shutdown_confirm_title: 'Zatrzymaj Hermes WebUI',
    settings_shutdown_confirm_message: 'Zatrzymać serwer Hermes WebUI?',
    settings_shutdown_confirm_btn: 'Zatrzymaj',
    settings_shutdown_stopped_message: 'Serwer został zatrzymany. Możesz zamknąć tę kartę.',
    // Providers panel
    providers_tab_title: 'Dostawcy',
    providers_section_title: 'Dostawcy',
    providers_section_meta: 'Zarządzaj kluczami API dla dostawców AI. Zmiany wchodzą w życie natychmiast.',
    providers_status_configured: 'Klucz API skonfigurowany',
    providers_status_not_configured: 'Brak klucza API',
    providers_status_oauth: 'OAuth',
    providers_status_api_key: 'Klucz API',
    providers_status_not_configured_label: 'Nieskonfigurowany',
    providers_oauth_hint: 'Uwierzytelniono przez OAuth. Klucz API nie jest wymagany.',
    providers_oauth_config_yaml_hint: 'Token skonfigurowany w config.yaml. Aby zaktualizować, edytuj sekcję providers w config.yaml lub uruchom hermes auth.',
    providers_oauth_not_configured_hint: 'Brak uwierzytelnienia. Uruchom hermes auth w terminalu, aby skonfigurować tego dostawcę.',
    providers_save: 'Zapisz',
    providers_refresh_models: 'Odśwież modele',
    providers_refreshing: 'Odświeżanie…',
    providers_models_refreshed: 'Modele odświeżone',
    providers_remove: 'Usuń',
    providers_saving: 'Zapisywanie…',
    providers_removing: 'Usuwanie…',
    providers_enter_key: 'Wprowadź klucz API',
    providers_empty: 'Nie znaleziono konfigurowalnych dostawców.',
    providers_key_updated: 'Klucz API został zapisany',
    providers_key_removed: 'Klucz API został usunięty',
    providers_key_placeholder_new: 'sk-...',
    providers_key_placeholder_replace: 'Wprowadź nowy klucz, aby zastąpić…',
    provider_quota_title: 'Aktywna kwota dostawcy',
    provider_quota_active_provider: 'Aktywny dostawca',
    provider_quota_last_checked_after_refresh: 'Ostatnio sprawdzono po odświeżeniu',
    provider_quota_last_checked: 'Ostatnio sprawdzono {0}',
    provider_quota_refresh_usage: 'Odśwież zużycie',
    provider_quota_refreshing: 'Odświeżanie...',
    provider_quota_refresh_title: 'Odśwież limity zużycia dostawcy teraz',
    provider_quota_refresh_succeeded: 'Zużycie dostawcy odświeżone',
    provider_quota_refresh_failed: 'Odświeżenie zużycia dostawcy nie powiodło się',
    provider_quota_session_limit: 'Limit 5-godzinny',
    provider_quota_weekly_limit: 'Limit tygodniowy',
    provider_quota_window_fallback: 'Okno',
    provider_quota_metric_remaining: 'Pozostało',
    provider_quota_metric_used: 'Zużyte',
    provider_quota_metric_limit: 'Limit',
    provider_quota_status_available: 'dostępne',
    provider_quota_status_exhausted: 'wyczerpane',
    provider_quota_status_unavailable: 'niedostępne',
    provider_quota_status_failed: 'nie powiodło się',
    provider_quota_status_checked: 'sprawdzone',
    provider_quota_status_no_key: 'brak klucza',
    provider_quota_status_invalid_key: 'nieprawidłowy klucz',
    provider_quota_status_unsupported: 'nieobsługiwane',
    provider_quota_used_meta: 'zużyto {0}',
    provider_quota_resets_meta: 'resetuje się o {0}',
    provider_quota_credential_pool: 'Pula poświadczeń',
    provider_quota_credential_label: 'Poświadczenie {0}',
    provider_quota_pool_plans: 'Plany: {0}',
    provider_quota_pool_no_windows: 'Nie zgłoszono okien limitów konta.',
    provider_quota_account_limits_loaded: 'Załadowano limity konta.',
    provider_quota_unavailable: 'Status kwoty niedostępny',
    provider_quota_retry_after: 'Spróbuj ponownie po {0}',
    provider_quota_pool_summary_available: 'dostępne {0}/{1}',
    provider_quota_pool_summary_exhausted: '{0} wyczerpanych',
    provider_quota_pool_summary_failed: '{0} nie powiodło się',
    provider_quota_pool_summary_checked: '{0} sprawdzonych',
    cancel: 'Anuluj',
    create_job: 'Utwórz zadanie',
    save_skill: 'Zapisz umiejętność',
    editing: 'Edytowanie',
    // Empty state
    empty_title: 'W czym mogę pomóc?',
    empty_subtitle: 'Zadaj dowolne pytanie, uruchamiaj polecenia, przeglądaj pliki lub zarządzaj zaplanowanymi zadaniami.',
    suggest_files: 'Jakie pliki znajdują się w tym obszarze roboczym?',
    suggest_schedule: 'Co mam dziś w harmonogramie?',
    suggest_plan: 'Pomóż mi zaplanować mały projekt.',
    // onboarding
    onboarding_badge: 'PIERWSZE URUCHOMIENIE',
    onboarding_title: 'Witaj w Hermes Web UI',
    onboarding_lead: 'Szybki, prowadzony krok po kroku proces konfiguracji zweryfikuje Hermes, zapisze rzeczywistą konfigurację dostawcy, wybierze obszar roboczy oraz model i opcjonalnie zabezpieczy aplikację hasłem.',
    onboarding_back: 'Wstecz',
    onboarding_continue: 'Dalej',
    onboarding_skip: 'Pomiń konfigurację',
    onboarding_skipped: 'Pominięto konfigurację — używanie istniejącej konfiguracji.',
    onboarding_open: 'Otwórz Hermes',
    onboarding_step_system_title: 'Sprawdzenie systemu',
    onboarding_step_system_desc: 'Zweryfikuj dostępność Agenta Hermes i widoczność konfiguracji.',
    onboarding_step_setup_title: 'Konfiguracja dostawcy',
    onboarding_step_setup_desc: 'Zapisz minimalną konfigurację dostawcy Hermes.',
    onboarding_step_workspace_title: 'Obszar roboczy + model',
    onboarding_step_workspace_desc: 'Wybierz domyślne ustawienia dla nowych sesji i czatu.',
    onboarding_step_password_title: 'Opcjonalne hasło',
    onboarding_step_password_desc: 'Opcjonalnie zabezpiecz Web UI przed udostępnieniem.',
    onboarding_step_finish_title: 'Koniec',
    onboarding_step_finish_desc: 'Przejrzyj i wejdź do aplikacji.',
    onboarding_notice_system_ready: 'Agent Hermes wydaje się osiągalny z poziomu Web UI.',
    onboarding_notice_system_unavailable: 'Agent Hermes nie jest jeszcze w pełni dostępny. Bootstrap może go zainstalować, ale konfiguracja dostawcy może nadal wymagać terminala.',
    onboarding_check_agent: 'Agent Hermes',
    onboarding_check_agent_ready: 'Wykryty i możliwy do zaimportowania',
    onboarding_check_agent_missing: 'Brakujący lub tylko częściowo importowalny',
    onboarding_check_password: 'Hasło',
    onboarding_check_password_enabled: 'Już włączone',
    onboarding_check_password_disabled: 'Jeszcze niewłączone',
    onboarding_check_provider: 'Konfiguracja dostawcy',
    onboarding_check_provider_ready: 'Gotowy do czatu',
    onboarding_check_provider_partial: 'Zapisana, lecz niekompletna',
    onboarding_check_provider_pending: 'Wymaga weryfikacji',
    onboarding_config_file: 'Plik konfiguracyjny:',
    onboarding_env_file: 'Plik .env:',
    onboarding_unknown: 'Nieznany',
    onboarding_current_provider: 'Bieżąca konfiguracja:',
    onboarding_missing_imports: 'Brakujące importy:',
    onboarding_notice_setup_required: 'Wybierz tutaj prostą ścieżkę dostawcy. Zaawansowane przepływy OAuth na razie pozostają w CLI Hermes.',
    onboarding_notice_setup_already_ready: 'Działająca konfiguracja dostawcy Hermes została już wykryta. Możesz ją zachować lub zastąpić tutaj.',
    onboarding_oauth_provider_ready_title: 'Dostawca został już uwierzytelniony',
    onboarding_oauth_provider_ready_body: 'Ta instancja jest skonfigurowana do korzystania z dostawcy OAuth (<strong>{provider}</strong>), który został skonfigurowany za pomocą CLI Hermes. Klucz API nie jest tutaj wymagany — kliknij Dalej, aby ukończyć konfigurację.',
    onboarding_oauth_provider_not_ready_title: 'Dostawca OAuth nie został jeszcze uwierzytelniony',
    onboarding_oauth_provider_not_ready_body: 'Ta instancja jest skonfigurowana do korzystania z <strong>{provider}</strong>, który korzysta z OAuth zamiast klucza API. Uruchom <code>hermes auth</code> lub <code>hermes model</code> w terminalu, aby uwierzytelnić, a następnie odśwież Web UI.',
    onboarding_oauth_switch_hint: 'Lub wybierz innego dostawcę poniżej, aby przełączyć się na konfigurację z kluczem API:',
    oauth_login_codex: 'Zaloguj się przez Codex (ChatGPT)',
    oauth_codex_step1: 'Krok 1: Odwiedź ten URL i wpisz kod',
    oauth_codex_step2: 'Krok 2: Wpisz ten kod na stronie',
    oauth_codex_polling: 'Oczekiwanie na autoryzację...',
    oauth_codex_success: 'Logowanie Codex OAuth powiodło się!',
    oauth_codex_error: 'Logowanie OAuth nie powiodło się',
    oauth_codex_expired: 'Kod wygasł, spróbuj ponownie',
    onboarding_notice_workspace: 'Te wartości używają tych samych API ustawień, co zwykła aplikacja.',
    onboarding_workspace_label: 'Obszar roboczy',
    onboarding_workspace_or_path: 'Lub wprowadź ścieżkę obszaru roboczego',
    onboarding_workspace_placeholder: '/home/uzytkownik/workspace',
    onboarding_provider_label: 'Tryb konfiguracji',
    onboarding_quick_setup_badge: 'szybka konfiguracja',
    provider_category_easy_start: 'Łatwy start',
    provider_category_self_hosted: 'Lokalne / hosting własny',
    provider_category_specialized: 'Specjalistyczne',
    onboarding_api_key_label: 'Klucz API',
    onboarding_api_key_placeholder: 'Pozostaw puste, aby zachować istniejący zapisany klucz',
    onboarding_api_key_label_optional: 'Klucz API (opcjonalny)',
    onboarding_api_key_placeholder_optional: 'Pozostaw puste dla serwerów bez klucza',
    onboarding_api_key_help_keyless: 'Większość instalacji LM Studio / Ollama / vLLM działa bez klucza — pozostaw to pole puste, jeśli Twój serwer nie wymaga uwierzytelniania. Użyj przycisku "Testuj połączenie", aby zweryfikować.',
    onboarding_api_key_help_prefix: 'Zapisano jako klucz tajny w pliku .env aplikacji Hermes przy użyciu',
    onboarding_base_url_label: 'Adres bazowy URL',
    onboarding_base_url_placeholder: 'https://twoj-punkt-koncowy.example/v1',
    onboarding_base_url_help: 'Użyj tego dla routerów zgodnych z OpenAI, serwerów hostowanych samodzielnie, LiteLLM, Ollama, LM Studio, vLLM lub podobnych punktów końcowych.',
    onboarding_model_label: 'Domyślny model',
    onboarding_workspace_help: 'Wybierz model, którego Hermes powinien używać dla nowych czatów po zakończeniu konfiguracji.',
    onboarding_custom_model_placeholder: 'nazwa-twojego-modelu',
    onboarding_custom_model_help: 'Dla niestandardowych punktów końcowych wprowadź dokładny identyfikator modelu oczekiwany przez Twój serwer.',
    onboarding_notice_password_enabled: 'Hasło zostało już skonfigurowane. Wprowadź nowe tylko wtedy, gdy chcesz je zastąpić.',
    onboarding_notice_password_recommended: 'Opcjonalne, lecz zalecane, jeśli udostępniasz interfejs poza localhost.',
    onboarding_password_label: 'Hasło (opcjonalne)',
    onboarding_password_placeholder: 'Pozostaw puste, aby pominąć',
    onboarding_password_help: 'Hasła są przechowywane za pośrednictwem istniejącego API ustawień i haszowane po stronie serwera.',
    onboarding_notice_finish: 'Możesz otworzyć Ustawienia ponownie później, aby to zmienić.',
    onboarding_not_set: 'Nieustawione',
    onboarding_password_will_enable: 'Zostanie włączone',
    onboarding_password_will_replace: 'Zostanie zastąpione',
    onboarding_password_keep_existing: 'Zachowaj obecne hasło',
    onboarding_password_remains_disabled: 'Pozostanie wyłączone',
    onboarding_password_skipped: 'Na razie pominięte',
    onboarding_finish_help: 'Zakończenie zapisuje wartość <code>onboarding_completed</code> w ustawieniach i przenosi Cię do właściwej aplikacji.',
    onboarding_error_choose_workspace: 'Wybierz obszar roboczy przed kontynuowaniem.',
    onboarding_error_choose_model: 'Wybierz model przed kontynuowaniem.',
    onboarding_error_provider_required: 'Wybierz tryb konfiguracji przed kontynuowaniem.',
    onboarding_error_base_url_required: 'URL bazowy jest wymagany dla niestandardowych punktów końcowych.',
    onboarding_probe_test_button: 'Testuj połączenie',
    onboarding_probe_probing: 'Testowanie połączenia…',
    onboarding_probe_ok: 'Połączono. Dostępnych modeli: {n}.',
    onboarding_probe_error_generic: 'Nie można nawiązać połączenia ze skonfigurowanym adresem URL bazy.',
    onboarding_probe_error_invalid_url: 'Adres URL bazy musi zaczynać się od http:// lub https://.',
    onboarding_probe_error_dns: 'Nie można rozpoznać nazwy hosta. Sprawdź adres URL lub użyj adresu IP hosta.',
    onboarding_probe_error_connect_refused: 'Połączenie odrzucone — serwer może nie być uruchomiony pod tym adresem. Przy korzystaniu z Docker spróbuj podać IP hosta zamiast localhost.',
    onboarding_probe_error_timeout: 'Punkt końcowy nie odpowiedział na czas. Sprawdź, czy serwer działa i czy adres URL jest prawidłowy.',
    onboarding_probe_error_http_4xx: 'Punkt końcowy zwrócił błąd klienta. Sprawdź uwierzytelnienie i ścieżkę URL (zazwyczaj kończy się na /v1).',
    onboarding_probe_error_http_5xx: 'Punkt końcowy zwrócił błąd serwera. Sprawdź logi serwera LM Studio / Ollama.',
    onboarding_probe_error_parse: 'Punkt końcowy nie zwrócił listy modeli w oczekiwanym formacie. Zweryfikuj, czy URL wskazuje na główny katalog API zgodnego z OpenAI.',
    onboarding_probe_error_unreachable: 'Nie można nawiązać połączenia ze skonfigurowanym adresem URL bazy.',
    onboarding_error_probe_failed: 'Nie udało się zweryfikować skonfigurowanego adresu URL bazy.',
    onboarding_error_workspace_required: 'Obszar roboczy jest wymagany.',
    onboarding_error_model_required: 'Model jest wymagany.',
    onboarding_complete: 'Konfiguracja wstępna zakończona',

    // panel/runtime i18n
    error_prefix: 'Błąd: ',
    default: 'domyślny',
    search: 'Szukaj',
    not_available: 'Niedostępne',
    never: 'nigdy',
    add: 'Dodaj',
    add_failed: 'Dodawanie nie powiodło się: ',
    remove_failed: 'Usuwanie nie powiodło się: ',
    switch_failed: 'Przełączanie nie powiodło się: ',
    name_required: 'Nazwa jest wymagana',
    content_required: 'Zawartość jest wymagana',
    view: 'Wyświetl',
    dismiss: 'Odrzuć',
    disable: 'Wyłącz',
    cron_no_jobs: 'Nie znaleziono zaplanowanych zadań.',
    cron_status_off: 'wyłączone',
    cron_status_paused: 'wstrzymane',
    cron_status_error: 'błąd',
    cron_status_active: 'aktywne',
    cron_status_running: 'uruchomione…',
    cron_status_needs_attention: 'wymaga uwagi',
    cron_attention_desc: 'To powtarzające się zadanie nie ma zaplanowanego czasu następnego uruchomienia. Harmonogram mógł nie obliczyć prawidłowo kolejnego wywołania.',
    cron_attention_croniter_hint: 'Środowisko uruchomieniowe bramy może nie posiadać pakietu croniter. Zrestartuj bramę z obsługą cron, a następnie wznów to zadanie.',
    cron_attention_resume: 'Wznów i przelicz ponownie',
    cron_jobs_project: 'Zadania Cron',
    cron_attention_run_once: 'Uruchom raz teraz',
    cron_attention_copy_diagnostics: 'Kopiuj diagnostykę',
    cron_diagnostics_copied: 'Skopiowano diagnostykę zadań cron',
    cron_next: 'Następny',
    cron_last: 'Ostatni',
    cron_run_now: 'Uruchom teraz',
    cron_pause: 'Wstrzymaj',
    cron_resume: 'Wznów',
    cron_job_name_placeholder: 'Nazwa zadania',
    cron_schedule_placeholder: 'Harmonogram',
    cron_prompt_placeholder: 'Zapytanie (prompt)',
    cron_last_output: 'Ostatnie wyjście',
    cron_expand_prompt: 'Rozwiń zapytanie',
    cron_collapse_prompt: 'Zwiń zapytanie',
    cron_expand_output: 'Rozwiń wyjście',
    cron_collapse_output: 'Zwiń wyjście',
    cron_mode_agent: 'Agent',
    cron_mode_script: 'Skrypt',
    cron_mode_label: 'Tryb',
    cron_script_job_banner: 'Uruchamia skrypt według harmonogramu — standardowe wyjście jest dostarczane do celu. Bez agenta, promptu ani umiejętności.',
    cron_script_card_title: 'Skrypt',
    cron_script_output: 'Wyjście skryptu',
    cron_script_path_label: 'Ścieżka skryptu',
    cron_script_path_hint: 'Rozwiązywana względem ~/.hermes/scripts/, chyba że podano ścieżkę bezwzględną. Edytuj plik skryptu na serwerze, aby zmienić działanie.',
    cron_script_badge_title: 'Zadanie skryptowe (bez agenta)',
    cron_workdir_label: 'Katalog roboczy',
    cron_view_full_output: 'Wyświetl pełne wyjście',
    cron_all_runs: 'Wszystkie uruchomienia',
    cron_hide_runs: 'Ukryj uruchomienia',
    cron_no_runs_yet: '(brak uruchomień)',
    cron_schedule_required_example: 'Harmonogram jest wymagany (np. "0 9 * * *" lub "every 1h")',
    cron_schedule_required: 'Harmonogram jest wymagany',
    cron_prompt_required: 'Zapytanie (prompt) jest wymagane',
    cron_job_created: 'Utworzono zadanie',
    cron_duplicate: 'Zduplikuj',
    cron_duplicated: 'Zadanie zduplikowane (wstrzymane)',
    cron_job_triggered: 'Zadanie wywołane',
    cron_job_paused: 'Zadanie wstrzymane',
    cron_job_resumed: 'Zadanie wznowione',
    cron_job_updated: 'Zadanie zaktualizowane',
    cron_model_label: 'Zastąpienie modelu',
    cron_model_hint: 'Zastępuje domyślny model dla tego zadania.',
    cron_model_use_default: 'Domyślny (użyj domyślnego profilu/systemu)',
    cron_delete_confirm_title: 'Usuń zadanie cron',
    cron_delete_confirm_message: 'Tej operacji nie można cofnąć.',
    cron_job_deleted: 'Zadanie usunięte',
    cron_completion_status: (name, status) => `Cron "${name}" — ${status}`,
    status_failed: 'nie powiodło się',
    status_completed: 'ukończone',
    todos_no_active: 'Brak aktywnej listy zadań w tej sesji.',
    clear_conversation_title: 'Wyczyść konwersację',
    clear_conversation_message: 'Wyczyścić wszystkie wiadomości? Tej operacji nie można cofnąć.',
    clear_failed: 'Czyszczenie nie powiodło się: ',
    skills_no_match: 'Brak pasujących umiejętności.',
    skill_enabled: 'Włączone',
    skill_disabled: 'Wyłączone',
    skill_toggle_failed: 'Nie udało się przełączyć umiejętności: ',
    linked_files: 'Połączone pliki',
    skill_load_failed: 'Nie można załadować umiejętności: ',
    skill_file_load_failed: 'Nie można załadować pliku: ',
    skill_name_required: 'Nazwa umiejętności jest wymagana',
    skill_updated: 'Umiejętność zaktualizowana',
    skill_created: 'Utworzono umiejętność',
    skill_deleted: 'Umiejętność usunięta',
    skill_delete_confirm: 'Usunąć umiejętność "{0}"?',
    skills_empty_title: 'Wybierz umiejętność',
    skills_empty_sub: 'Wybierz umiejętność z paska bocznego, aby wyświetlić jej zawartość, lub utwórz nową.',
    skills_edit: 'Edytuj',
    skills_delete: 'Usuń',
    skills_back_to: 'Powrót do {0}',
    tasks_empty_title: 'Wybierz zaplanowane zadanie',
    tasks_empty_sub: 'Wybierz zadanie z paska bocznego, aby wyświetlić szczegóły i uruchomienia, lub utwórz nowe.',
    workspaces_empty_title: 'Wybierz przestrzeń',
    workspaces_empty_sub: 'Wybierz przestrzeń z paska bocznego, aby wyświetlić jej pliki i ustawienia, lub dodaj nową.',
    profiles_empty_title: 'Wybierz profil',
    profiles_empty_sub: 'Wybierz profil agenta z paska bocznego, aby przeglądać i edytować jego ustawienia, lub utwórz nowy.',
    memory_notes_label: 'pamięć (notatki)',
    memory_saved: 'Zapisano pamięć',
    my_notes: 'Moje notatki',
    user_profile: 'Profil użytkownika',
    external_notes_sources: 'Notatki zewnętrzne (firm trzecich)',
    external_notes_empty: 'Nie są jeszcze widoczne żadne zewnętrzne źródła notatek ani wiedzy MCP. Skonfiguruj Joplin, Obsidian, Notion, llm-wiki lub inny serwer notatek, aby wyświetlić go na tej liście.',
    external_notes_auto_recall_hint: 'Automatyczne wywoływanie sesji pozostaje bez zmian; ta szuflada wyświetla tylko skonfigurowane źródła oraz dostępne narzędzia odczytu/wyszukiwania.',
    external_notes_no_tools: 'Obecnie brak widocznych narzędzi odczytu/wyszukiwania dla tego źródła.',
    external_notes_tool_count: (count) => count === 1 ? '1 narzędzie do notatek dostępne' : `${count} narzędzi do notatek dostępnych`,
    external_notes_configured_hint: 'Oczekiwane są nazwy narzędzi z tego skonfigurowanego źródła; schematy live pojawią się, gdy środowisko uruchomieniowe WebUI je udostępni.',
    external_notes_recent_ai: 'Ostatnio używane przez AI',
    external_notes_auto: 'auto',
    external_notes_recent_ai_reason: 'Automatyczne przywoływanie',
    external_notes_search_placeholder: 'Szukaj notatek…',
    external_notes_search_empty: 'Przeszukaj skonfigurowane źródło notatek, aby wyświetlić ich podgląd tutaj.',
    source_active: 'aktywne',
    source_configured: 'skonfigurowane',
    no_notes_yet: 'Brak notatek.',
    no_profile_yet: 'Brak profilu.',
    agent_soul: 'Dusza agenta',
    no_soul_yet: 'Dusza nie została jeszcze zdefiniowana.',
    workspace_choose_path: 'Wybierz ścieżkę obszaru roboczego',
    workspace_choose_path_meta: 'Dodaj zweryfikowaną ścieżkę i przełącz tę konwersację',
    workspace_manage: 'Zarządzaj obszarami roboczymi',
    workspace_manage_meta: 'Otwórz panel Przestrzenie',
    workspace_use_title: 'Użyj w bieżącej sesji',
    workspace_use: 'Użyj',
    workspace_add_path_placeholder: 'Dodaj ścieżkę obszaru roboczego (np. /home/uzytkownik/moj-projekt)',
    workspace_paths_validated_hint: 'Ścieżki są weryfikowane jako istniejące katalogi przed zapisaniem.',

    workspace_drag_hint: 'Przeciągnij, aby zmienić kolejność',
    workspace_reorder_failed: 'Zmiana kolejności nie powiodła się',
    workspace_added: 'Dodano obszar roboczy',
    workspace_renamed: 'Zmieniono nazwę obszaru roboczego',
    workspace_remove_confirm_title: 'Usuń obszar roboczy',
    workspace_remove_confirm_message: (path) => `Usunąć „${path}”?`,
    workspace_removed: 'Usunięto obszar roboczy',
    workspace_switch_prompt_title: 'Przełącz obszar roboczy',
    workspace_switch_prompt_message: 'Wprowadź absolutną ścieżkę obszaru roboczego, aby dodać i przełączyć tę konwersację.',
    workspace_switch_prompt_confirm: 'Przełącz',
    workspace_switch_prompt_placeholder: '/Users/uzytkownik/projekt',
    workspace_not_added: 'Obszar roboczy nie został dodany',
    workspace_already_saved: 'Obszar roboczy został już zapisany — wybierz go z listy',
    workspace_busy_switch: 'Nie można przełączyć obszaru roboczego, gdy agent jest uruchomiony',
    discard_file_edits_title: 'Odrzucić edycję plików?',
    discard_file_edits_message: 'Przełączenie obszaru roboczego odrzuci niezapisane edycje plików w podglądzie.',
    workspace_switched_to: (name) => `Przełączono na ${name}`,
    profiles_no_profiles: 'Nie znaleziono profili.',
    profile_api_keys_configured: 'Klucze API skonfigurowane',
    profile_gateway_running: 'Brama jest uruchomiona',
    profile_gateway_stopped: 'Brama została zatrzymana',
    profile_active: 'AKTYWNY',
    profile_no_configuration: 'Brak konfiguracji',
    profile_skill_count: (count) => `${count} umiejętność/umiejętności`,
    profile_use: 'Użyj',
    profile_switch_title: 'Przełącz na ten profil',
    profile_delete_title: 'Usuń ten profil',
    profile_default_label: '(domyślny)',
    profile_name_placeholder: 'Nazwa profilu (małe litery, a-z 0-9, myślniki)',
    profile_clone_label: 'Klonuj konfigurację z aktywnego profilu',
    profile_model_label: 'Model / dostawca',
    profile_model_hint: 'Wybierz spośród skonfigurowanych dostawców i modeli dla tego nowego profilu.',
    profile_model_use_default: 'Użyj domyślnego dla aktywnego profilu',
    profile_base_url_placeholder: 'Adres bazowy URL (opcjonalnie, np. http://localhost:11434)',
    profile_api_key_placeholder: 'Klucz API (opcjonalnie)',
    manage_profiles: 'Zarządzaj profilami',
    profiles_load_failed: 'Nie udało się załadować profili',
    profile_switched_new_conversation: (name) => `Przełączono na profil: ${name} — rozpoczęto nową konwersację`,
    profile_switched: (name) => `Przełączono na profil: ${name}`,
    profile_name_rule: 'Tylko małe litery, cyfry, myślniki i podkreślenia',
    profile_base_url_rule: 'URL bazowy musi zaczynać się od http:// lub https://',
    profile_created: (name) => `Profil utworzony: ${name}`,
    profile_delete_confirm_title: (name) => `Usunąć profil „${name}”?`,
    profile_delete_confirm_message: 'Wszystkie sesje, konfiguracja, umiejętności i pamięć dla tego profilu zostaną trwale usunięte. Tej operacji nie można cofnąć.',
    profile_deleted: (name) => `Profil usunięty: ${name}`,
    active_conversation_none: 'Nie wybrano aktywnej konwersacji.',
    active_conversation_meta: (title, count) => count === 1 ? `${title} · 1 wiadomość` : `${title} · ${count} wiadomości`,
    settings_unsaved_changes: 'Masz niezapisane zmiany.',
    sign_out_failed: 'Wylogowanie nie powiodło się: ',
    disable_auth_confirm_title: 'Wyłącz ochronę hasłem',
    disable_auth_confirm_message: 'Każdy będzie mógł uzyskać dostęp do tej instancji.',
    auth_disabled: 'Uwierzytelnianie wyłączone — usunięto ochronę hasłem',
    disable_auth_failed: 'Wyłączenie uwierzytelniania nie powiodło się: ',
    bg_error_single: (title) => `W „${title}” wystąpił błąd`,
    bg_error_multi: (count) => `W ${count} sesjach wystąpił błąd`,
    // skill form
    skill_name: 'Nazwa',
    skill_category: 'Kategoria',
    skill_category_placeholder: 'Opcjonalnie, np. devops',
    skill_content: 'Zawartość SKILL.md',
    skill_content_placeholder: 'Frontmatter YAML + zawartość Markdown',
    skill_rename_not_supported: 'Zmiana nazwy umiejętności nie jest obsługiwana. Utwórz nową umiejętność i usuń starą, aby zmienić nazwę.',
    skill_metadata: 'Metadane',
    // cron form
    cron_name_label: 'Nazwa',
    cron_name_placeholder: 'Opcjonalnie',
    cron_schedule_label: 'Harmonogram',
    cron_schedule_hint: "Użyj 'every 1h' lub wyrażenia cron dla zadań cyklicznych. Same formy czasu trwania, jak '30m', zostaną uruchomione tylko raz.",
    cron_schedule_once_warning: 'Formy czasu trwania, takie jak \'30m\', są uruchamiane raz i usuwane po uruchomieniu. Użyj \'every 30m\', aby utrzymać zadanie cykliczne.',
    cron_prompt_label: 'Monit',
    cron_deliver_label: 'Dostarcz wyjście do',
    cron_deliver_local: 'Lokalnie (tylko zapisz wyjście)',
    cron_deliver_custom: 'Niestandardowy cel dostarczenia',
    cron_profile_label: 'Profil',
    cron_profile_server_default: 'domyślny serwera',
    cron_profile_server_default_hint: 'Używa domyślnego profilu serwera WebUI w czasie uruchomienia. Istniejące zadania bez przypisanego profilu zachowują to dotychczasowe działanie.',
    cron_toast_notifications_label: 'Powiadomienia o zakończeniu',
    cron_toast_notifications_hint: 'Pokaż powiadomienie (toast), gdy to zadanie cron się zakończy. Plakietka Zadań oraz znacznik nowego uruchomienia będą nadal aktualizowane, nawet gdy ta opcja jest wyłączona.',
    cron_toast_notifications_enabled: 'Włączone',
    cron_toast_notifications_disabled: 'Wyłączone',
    cron_skills_label: 'Umiejętności',
    cron_skills_placeholder: 'Dodaj umiejętności (opcjonalnie)…',
    cron_skills_edit_hint: 'Lista umiejętności nie jest edytowalna po utworzeniu.',
    // workspace form
    workspace_name_label: 'Nazwa',
    workspace_name_placeholder: 'Opcjonalna przyjazna nazwa',
    workspace_path_label: 'Ścieżka',
    workspace_path_required: 'Ścieżka jest wymagana',
    workspace_path_readonly: 'Ścieżka nie może być zmieniona. Możliwa tylko zmiana nazwy.',
    workspace_new_title: 'Nowa przestrzeń',
    // profile form
    profile_name_label: 'Nazwa',
    profile_base_url_label: 'Adres bazowy URL',
    profile_api_key_label: 'Klucz API',
    cmd_yolo: 'Przełącz tryb YOLO (pomiń aprobaty)',
    yolo_no_session: 'Brak aktywnej sesji',
    yolo_enabled: '⚡ Tryb YOLO WŁĄCZONY — pomijanie aprobat w tej sesji',
    yolo_disabled: 'Tryb YOLO WYŁĄCZONY',
    yolo_pill_label: 'YOLO',
    yolo_pill_title_active: 'Tryb YOLO aktywny — kliknij, aby wyłączyć',
    approval_skip_all: '⚡ Pomiń wszystkie w tej sesji',
    approval_skip_all_title: 'Pomiń wszystkie monity o aprobatę w tej sesji',
    // composer action tooltips
    composer_send: 'Wyślij wiadomość',
    composer_queue: 'Kolejkuj wiadomość',
    composer_interrupt: 'Przerwij i wyślij',
    composer_steer: 'Steruj bieżącą odpowiedzią',
    composer_stop: 'Zatrzymaj generowanie',
    composer_disabled_clarify: 'Odpowiedz na prośbę o wyjaśnienie',
    composer_disabled_compression: 'Oczekiwanie na zakończenie kompresji',
    composer_compression_will_queue: 'Wpisz wiadomość — zostanie zakolejkowana i wysłana po zakończeniu kompresji',
    composer_disabled_empty: 'Wpisz wiadomość, aby wysłać',
    composer_mobile_workspace: 'Obszar roboczy',
    composer_mobile_model: 'Model',
    composer_mobile_reasoning: 'Myślenie',
    composer_mobile_context: 'Kontekst',
    media_audio_label: 'Dźwięk',
    media_svg_label: 'Diagram',
    media_video_label: 'Wideo',
    media_download: 'Pobierz',
    csv_loading: 'Ładowanie CSV',
    csv_too_large: 'Plik CSV jest zbyt duży dla renderowania w linii',
    csv_no_data: 'Plik CSV nie zawiera wystarczającej liczby danych, aby wyrenderować go jako tabelę',
    csv_error: 'Nie udało się załadować pliku CSV',
    csv_header_note: 'Pierwszy wiersz wyświetlany jako nagłówek tabeli',
    excalidraw_loading: 'Ładowanie diagramu',
    excalidraw_too_large: 'Plik Excalidraw jest zbyt duży dla renderowania w linii',
    excalidraw_invalid: 'Nieprawidłowy format pliku Excalidraw',
    excalidraw_error: 'Nie udało się załadować pliku Excalidraw',
    excalidraw_label: 'Diagram',
    excalidraw_download: 'Pobierz',
    excalidraw_empty: 'Pusty diagram',
    excalidraw_render_error: 'Nie udało się wyrenderować diagramu',
    excalidraw_simplified: 'Uproszczony podgląd SVG — nie jest identyczny piksel w piksel z obszarem roboczym Excalidraw',
    // ── Checkpoints / Rollback ──
    checkpoint_title: 'Checkpoints (punkty kontrolne)',
    checkpoint_empty: 'Nie znaleziono punktów kontrolnych dla tego obszaru roboczego.',
    checkpoint_loading: 'Ładowanie punktów kontrolnych…',
    checkpoint_error: 'Nie udało się załadować punktów kontrolnych',
    checkpoint_date: 'Data',
    checkpoint_message: 'Wiadomość',
    checkpoint_files: 'Pliki',
    checkpoint_view_diff: 'Wyświetl diff',
    checkpoint_restore: 'Przywróć',
    checkpoint_restore_confirm_title: 'Przywrócić punkt kontrolny?',
    checkpoint_restore_confirm_message: (ckpt) => `Przywrócić obszar roboczy do punktu kontrolnego "${ckpt}"? To nadpisze pliki wersjami zapisanymi. Pliki dodane po tym punkcie kontrolnym nie zostaną usunięte.`,
    checkpoint_restored: 'Punkt kontrolny przywrócony',
    checkpoint_diff_title: 'Zmiany w punkcie kontrolnym',
    checkpoint_diff_no_changes: 'Nie znaleziono różnic między tym punktem kontrolnym a obecnym obszarem roboczym.',
    checkpoint_diff_files_changed: (n) => n === 1 ? '1 plik zmieniony' : `${n} zmienionych plików`,
  },
};

// Active locale — defaults to English; overridden by loadLocale() at boot.
let _locale = LOCALES.en;

/**
 * Resolve an incoming locale tag to a known LOCALES key.
 * Supports exact keys, case-insensitive matches, and a few common aliases
 * (e.g. zh-CN -> zh, zh-TW -> zh-Hant). Returns null when unresolved.
 * @param {string} lang
 * @returns {string|null}
 */
function resolveLocale(lang) {
  if (typeof lang !== 'string') return null;
  const raw = lang.trim();
  if (!raw) return null;
  if (LOCALES[raw]) return raw;

  const lower = raw.toLowerCase().replace(/_/g, '-');

  // Case-insensitive direct match first.
  const direct = Object.keys(LOCALES).find((k) => k.toLowerCase() === lower);
  if (direct) return direct;

  // Common Chinese variants.
  if (lower === 'zh' || lower.startsWith('zh-cn') || lower.startsWith('zh-sg') || lower.startsWith('zh-hans')) {
    return LOCALES.zh ? 'zh' : null;
  }
  if (lower.startsWith('zh-tw') || lower.startsWith('zh-hk') || lower.startsWith('zh-mo') || lower.startsWith('zh-hant')) {
    return LOCALES['zh-Hant'] ? 'zh-Hant' : null;
  }

  // Fallback to base language subtag (e.g. en-US -> en).
  const base = lower.split('-')[0];
  const baseMatch = Object.keys(LOCALES).find((k) => k.toLowerCase() === base);
  return baseMatch || null;
}

/**
 * Resolve locale with precedence:
 * 1) primary (typically server setting)
 * 2) fallback (typically localStorage)
 * 3) English
 * @param {string} primary
 * @param {string} fallback
 * @returns {string}
 */
function resolvePreferredLocale(primary, fallback) {
  return resolveLocale(primary) || resolveLocale(fallback) || 'en';
}

/**
 * Translate a key. Falls back to English if the key is missing in the active locale.
 * Supports function values (for interpolated strings): call t('key', arg).
 * @param {string} key
 * @param {...*} args - forwarded to function-valued translations
 * @returns {string}
 */
function t(key, ...args) {
  const val = _locale[key] ?? LOCALES.en[key];
  if (val === undefined) return key;  // final fallback: return key itself
  if (typeof val === 'function') return val(...args);
  if (args.length) {
    // Locale strings can use numbered placeholders like {0} and {1}.
    return String(val).replace(/\{(\d+)\}/g, (match, idx) => (
      Object.prototype.hasOwnProperty.call(args, idx) ? String(args[idx]) : match
    ));
  }
  return val;
}

/**
 * Switch locale by language code (e.g. 'en', 'zh').
 * Persists to localStorage and updates the <html lang> attribute.
 * @param {string} lang
 */
function setLocale(lang) {
  const resolved = resolveLocale(lang) || 'en';
  _locale = LOCALES[resolved];
  try { localStorage.setItem('hermes-lang', resolved); } catch (_) {}
  document.documentElement.lang = _locale._speech || resolved;
}

/**
 * Load locale from localStorage (called once at boot, before DOMContentLoaded).
 * Server-persisted preference is applied later in loadSettingsPanel().
 */
function loadLocale() {
  let stored = null;
  try { stored = localStorage.getItem('hermes-lang'); } catch (_) {}
  setLocale(resolvePreferredLocale(null, stored));
}

/**
 * Re-stamp all [data-i18n] elements in the DOM with the current locale.
 * Safe to call at any time — missing keys fall back to English.
 * Call after setLocale() to make static HTML text update without a reload.
 */
function applyLocaleToDOM() {
  document.querySelectorAll('[data-i18n]').forEach(el => {
    const key = el.getAttribute('data-i18n');
    const val = t(key);
    if (val && val !== key) el.textContent = val;
  });
  document.querySelectorAll('[data-i18n-title]').forEach(el => {
    const key = el.getAttribute('data-i18n-title');
    const val = t(key);
    if (!val || val === key) return;
    if (el.hasAttribute('data-tooltip')) {
      // Custom CSS tooltip is in use (#1775) — sync it and explicitly clear
      // the native `title` attribute so the slow ~1.5s browser tooltip never
      // co-fires alongside the fast custom tooltip.
      el.setAttribute('data-tooltip', val);
      if (el.hasAttribute('title')) el.removeAttribute('title');
    } else {
      // Element opted out of custom tooltips — fall back to the native title.
      el.title = val;
    }
  });
  document.querySelectorAll('[data-i18n-placeholder]').forEach(el => {
    const key = el.getAttribute('data-i18n-placeholder');
    const val = t(key);
    if (val && val !== key) el.placeholder = val;
  });
  document.querySelectorAll('[data-i18n-aria-label]').forEach(el => {
    const key = el.getAttribute('data-i18n-aria-label');
    const val = t(key);
    if (val && val !== key) el.setAttribute('aria-label', val);
  });
  if (typeof syncAppTitlebar === 'function') syncAppTitlebar();
}

// Apply saved locale immediately so there's no flash of English on reload.
loadLocale();
