import { defineFieldCopy } from '@/app/settings/field-copy'

import type { Translations } from './types'

export const zh: Translations = {
  common: {
    apply: '应用',
    back: '返回',
    save: '保存',
    saving: '保存中…',
    cancel: '取消',
    change: '更改',
    choose: '选择',
    clear: '清除',
    close: '关闭',
    collapse: '收起',
    confirm: '确认',
    connect: '连接',
    connecting: '连接中',
    continue: '继续',
    copied: '已复制',
    copy: '复制',
    copyFailed: '复制失败',
    delete: '删除',
    docs: '文档',
    done: '完成',
    error: '错误',
    failed: '失败',
    free: '免费',
    loading: '加载中…',
    notSet: '未设置',
    refresh: '刷新',
    remove: '移除',
    replace: '替换',
    retry: '重试',
    run: '运行',
    send: '发送',
    set: '设置',
    skip: '跳过',
    update: '更新',
    on: '开',
    off: '关'
  },

  boot: {
    ready: 'Hermes 桌面版已就绪',
    desktopBootFailedWithMessage: message => `桌面启动失败：${message}`,
    steps: {
      connectingGateway: '正在连接桌面网关',
      loadingSettings: '正在加载 Hermes 设置',
      loadingSessions: '正在加载最近会话',
      startingDesktopConnection: '正在启动桌面连接',
      startingHermesDesktop: '正在启动 Hermes 桌面版…'
    },
    errors: {
      backgroundExited: 'Hermes 后台进程已退出。',
      backgroundExitedDuringStartup: 'Hermes 后台进程在启动期间退出。',
      backendStopped: '后端已停止',
      desktopBootFailed: '桌面启动失败',
      gatewaySignInRequired: '需要登录网关',
      ipcBridgeUnavailable: '桌面 IPC 桥不可用。'
    },
    failure: {
      title: 'Hermes 无法启动',
      description: '后台网关没有启动。请尝试下面的恢复步骤；这里不会删除你的对话或设置。',
      remoteTitle: '需要重新登录远程网关',
      remoteDescription: '你的远程网关会话已过期。请重新登录以恢复连接。这些操作不会删除你的对话或设置。',
      retry: '重试',
      repairInstall: '修复安装',
      useLocalGateway: '使用本地网关',
      openLogs: '打开日志',
      repairHint: '修复会重新运行安装器，在新机器上可能需要几分钟。',
      remoteSignInHint: '打开网关登录窗口。也可以使用本地网关切换到随应用提供的后端。',
      hideRecentLogs: '隐藏最近日志',
      showRecentLogs: '显示最近日志',
      signedInTitle: '已登录',
      signedInMessage: '正在重新连接远程网关…',
      signInIncompleteTitle: '登录未完成',
      signInIncompleteMessage: '登录窗口在认证完成前关闭。',
      signInFailed: '登录失败',
      signInToRemoteGateway: '登录远程网关',
      signInWithProvider: provider => `使用 ${provider} 登录`,
      identityProvider: '你的身份提供方'
    }
  },

  notifications: {
    region: '通知',
    hide: '隐藏',
    show: '显示',
    more: count => `另外 ${count} 条通知`,
    clearAll: '全部清除',
    dismiss: '关闭通知',
    details: '详情',
    copyDetail: '复制详情',
    copyDetailFailed: '无法复制通知详情',
    backendOutOfDateTitle: '后端版本过旧',
    backendOutOfDateMessage: '你的 Hermes 后端早于当前桌面构建，可能无法正常工作。请更新以保持一致。',
    updateHermes: '更新 Hermes',
    updateReadyTitle: '有可用更新',
    updateReadyMessage: count => `有 ${count} 项新更改可用。`,
    seeWhatsNew: '查看更新内容',
    errors: {
      elevenLabsNeedsKey: 'ElevenLabs STT 需要 ELEVENLABS_API_KEY。',
      elevenLabsRejectedKey: 'ElevenLabs 拒绝了该 API key (401)。',
      methodNotAllowed: '桌面后端拒绝了该请求 (405 Method Not Allowed)。请尝试重启 Hermes Desktop。',
      microphonePermission: '麦克风权限已被拒绝。',
      openaiRejectedApiKey: 'OpenAI 拒绝了该 API key。',
      openaiRejectedApiKeyWithStatus: status => `OpenAI 拒绝了该 API key (${status} invalid_api_key)。`,
      openaiTtsNeedsKey: 'OpenAI TTS 需要 VOICE_TOOLS_OPENAI_KEY 或 OPENAI_API_KEY。'
    },
    voice: {
      configureSpeechToText: '配置语音转文字后即可使用语音模式。',
      couldNotStartSession: '无法启动语音会话',
      microphoneAccessDenied: '麦克风访问被拒绝。',
      microphoneConstraintsUnsupported: '此设备不支持当前麦克风约束。',
      microphoneFailed: '麦克风出错',
      microphoneInUse: '麦克风正被其他应用占用。',
      microphonePermissionDenied: '麦克风权限被拒绝。',
      microphoneStartFailed: '无法开始麦克风录音。',
      microphoneUnsupported: '当前运行环境不支持麦克风录音。',
      noMicrophone: '未找到麦克风。',
      noSpeechDetected: '没有检测到语音',
      playbackFailed: '语音播放失败',
      recordingFailed: '语音录制失败',
      transcriptionFailed: '语音转写失败',
      transcriptionUnavailable: '语音转写暂不可用。',
      tryRecordingAgain: '请再录一次。',
      unavailable: '语音不可用'
    },
    native: {
      approvalTitle: '需要批准',
      approveAction: '批准',
      rejectAction: '拒绝',
      inputTitle: '需要输入',
      inputBody: 'Hermes 正在等待你的回应。',
      turnDoneTitle: 'Hermes 已完成',
      turnDoneBody: '回复已就绪。',
      turnErrorTitle: '本轮失败',
      backgroundDoneTitle: '后台任务已完成',
      backgroundFailedTitle: '后台任务失败'
    }
  },

  remoteDisplayBanner: {
    message: reason => `软件渲染已启用 — 检测到远程显示（${reason}）。为防止画面闪烁，已禁用 GPU 加速。`,
    dismiss: '关闭'
  },

  titlebar: {
    hideSidebar: '隐藏侧边栏',
    showSidebar: '显示侧边栏',
    search: '搜索',
    searchTitle: '搜索会话、视图与操作',
    swapSidebarSides: '交换侧边栏位置',
    swapSidebarSidesTitle: '交换会话栏和文件浏览器的位置',
    hideRightSidebar: '隐藏右侧栏',
    showRightSidebar: '显示右侧栏',
    muteHaptics: '关闭触感反馈',
    unmuteHaptics: '开启触感反馈',
    openSettings: '打开设置',
    openKeybinds: '键盘快捷键'
  },

  keybinds: {
    title: '键盘快捷键',
    subtitle: open => `点击快捷键即可重新绑定 · ${open} 可重新打开此面板。`,
    rebind: '重新绑定',
    reset: '恢复默认',
    resetAll: '全部重置',
    pressKey: '请按下按键…',
    set: '设置',
    conflictWith: label => `已绑定到“${label}”`,
    categories: {
      composer: '输入框',
      profiles: '配置',
      session: '会话',
      navigation: '导航',
      view: '视图'
    },
    actions: {
      'keybinds.openPanel': '打开键盘快捷键',
      'nav.commandPalette': '打开命令面板',
      'nav.commandCenter': '打开命令中心',
      'nav.settings': '打开设置',
      'nav.profiles': '打开配置',
      'nav.skills': '打开技能',
      'nav.messaging': '打开消息',
      'nav.artifacts': '打开制品',
      'nav.cron': '打开定时任务',
      'nav.agents': '打开智能体',
      'session.new': '新建会话',
      'session.newWindow': '在新窗口中新建会话',
      'session.next': '下一个会话',
      'session.prev': '上一个会话',
      'session.slot.1': '切换到最近会话 1',
      'session.slot.2': '切换到最近会话 2',
      'session.slot.3': '切换到最近会话 3',
      'session.slot.4': '切换到最近会话 4',
      'session.slot.5': '切换到最近会话 5',
      'session.slot.6': '切换到最近会话 6',
      'session.slot.7': '切换到最近会话 7',
      'session.slot.8': '切换到最近会话 8',
      'session.slot.9': '切换到最近会话 9',
      'session.focusSearch': '搜索会话',
      'session.togglePin': '固定/取消固定当前会话',
      'composer.focus': '聚焦输入框',
      'composer.modelPicker': '打开模型选择器',
      'view.toggleSidebar': '切换会话侧边栏',
      'view.toggleRightSidebar': '切换文件浏览器',
      'view.showFiles': '显示文件浏览器',
      'view.showTerminal': '显示终端',
      'view.terminalSelection': '将终端选区发送到输入框',
      'view.closePreviewTab': '关闭预览标签',
      'view.flipPanes': '交换侧边栏位置',
      'appearance.toggleMode': '切换浅色/深色',
      'profile.default': '切换到默认配置',
      'profile.switch.1': '切换到配置 1',
      'profile.switch.2': '切换到配置 2',
      'profile.switch.3': '切换到配置 3',
      'profile.switch.4': '切换到配置 4',
      'profile.switch.5': '切换到配置 5',
      'profile.switch.6': '切换到配置 6',
      'profile.switch.7': '切换到配置 7',
      'profile.switch.8': '切换到配置 8',
      'profile.switch.9': '切换到配置 9',
      'profile.switch.10': '切换到配置 10',
      'profile.switch.11': '切换到配置 11',
      'profile.switch.12': '切换到配置 12',
      'profile.switch.13': '切换到配置 13',
      'profile.switch.14': '切换到配置 14',
      'profile.switch.15': '切换到配置 15',
      'profile.switch.16': '切换到配置 16',
      'profile.switch.17': '切换到配置 17',
      'profile.switch.18': '切换到配置 18',
      'profile.next': '下一个配置',
      'profile.prev': '上一个配置',
      'profile.toggleAll': '切换全部配置视图',
      'profile.create': '创建配置',
      'composer.send': '发送消息',
      'composer.newline': '插入换行',
      'composer.steer': '引导正在运行的回合',
      'composer.sendQueued': '发送下一条排队消息',
      'composer.mention': '引用文件、文件夹、网址',
      'composer.slash': '斜杠命令面板',
      'composer.help': '快速帮助',
      'composer.history': '切换弹窗/历史',
      'composer.cancel': '关闭弹窗·取消运行'
    }
  },

  language: {
    label: '语言',
    description: '选择桌面界面的语言。',
    saving: '正在保存语言…',
    saveError: '语言更新失败',
    switchTo: '切换语言',
    searchPlaceholder: '搜索语言…',
    noResults: '未找到语言'
  },

  settings: {
    closeSettings: '关闭设置',
    exportConfig: '导出配置',
    importConfig: '导入配置',
    resetToDefaults: '恢复默认',
    resetConfirm: '将所有设置恢复为 Hermes 默认值？',
    exportFailed: '导出失败',
    resetFailed: '重置失败',
    nav: {
      providers: '提供方',
      providerAccounts: '账号',
      providerApiKeys: 'API 密钥',
      gateway: '网关',
      apiKeys: '工具与密钥',
      keysTools: '工具',
      keysSettings: '设置',
      mcp: 'MCP',
      archivedChats: '已归档对话',
      about: '关于',
      notifications: '通知'
    },
    notifications: {
      title: '通知',
      intro: '原生桌面通知，区别于应用内提示。设置按设备保存，每台电脑各自独立。',
      enableAll: '启用通知',
      enableAllDesc: '总开关。关闭后将静音下方所有通知。',
      focusedHint: '完成提醒仅在 Hermes 处于后台时触发。',
      kinds: {
        approval: {
          label: '需要批准',
          description: '有命令正在等待你批准或拒绝。'
        },
        input: {
          label: '需要输入',
          description: 'Hermes 提出了问题，或需要密码或密钥。'
        },
        turnDone: {
          label: '回复就绪',
          description: 'Hermes 在后台时完成了一轮对话。'
        },
        turnError: {
          label: '本轮失败',
          description: '本轮以错误结束。'
        },
        backgroundDone: {
          label: '后台任务完成',
          description: '后台终端命令已完成。'
        }
      },
      test: '发送测试通知',
      testTitle: 'Hermes',
      testBody: '通知工作正常。',
      testSent: '测试已发送。如果没有出现，请检查系统通知权限和专注模式／勿扰模式。',
      testUnsupported: '此系统不支持原生通知。',
      completionSoundTitle: '完成提示音',
      completionSoundDesc: '智能体回合结束时播放。可在此选择预设并预览。',
      completionSoundPreview: '预览'
    },
    sections: {
      model: '模型',
      chat: '对话',
      appearance: '外观',
      workspace: '工作区',
      safety: '安全',
      memory: '记忆与上下文',
      voice: '语音',
      advanced: '高级'
    },
    searchPlaceholder: {
      about: '关于 Hermes Desktop',
      config: '搜索设置…',
      gateway: '网关连接…',
      keys: '搜索 API 密钥…',
      mcp: '搜索 MCP 服务器…',
      sessions: '搜索已归档会话…'
    },
    modeOptions: {
      light: { label: '明亮', description: '明亮的桌面界面' },
      dark: { label: '暗色', description: '低眩光工作区' },
      system: { label: '跟随系统', description: '跟随系统外观' }
    },
    appearance: {
      title: '外观',
      intro: '这些是仅桌面端的显示偏好。模式控制明暗；主题控制强调色与对话界面样式。',
      colorMode: '颜色模式',
      colorModeDesc: '选择固定模式，或让 Hermes 跟随系统设置。',
      toolViewTitle: '工具调用显示',
      toolViewDesc: '产品模式隐藏原始工具数据；技术模式显示完整输入/输出。',
      translucencyTitle: '窗口透明',
      translucencyDesc: '让整个窗口透出桌面。仅支持 macOS 和 Windows。',
      product: '产品',
      productDesc: '易读的工具活动与简洁摘要。',
      technical: '技术',
      technicalDesc: '包含原始工具参数/结果及底层细节。',
      themeTitle: '主题',
      themeDesc: '仅桌面端调色板。所选模式叠加其上。',
      themeProfileNote: profile => `已为「${profile}」配置文件保存——每个配置文件保留各自的主题。`,
      installTitle: '从 VS Code 安装',
      installDesc: '粘贴 Marketplace 扩展 ID（例如 dracula-theme.theme-dracula），将其配色主题转换为桌面调色板。',
      installPlaceholder: 'publisher.extension',
      installButton: '安装',
      installing: '安装中…',
      installError: '无法安装该主题。',
      installed: name => `已安装「${name}」。`,
      removeTheme: '移除主题',
      importedBadge: '已导入'
    },
    fieldLabels: defineFieldCopy({
      model: '默认模型',
      modelContextLength: '上下文窗口',
      fallbackProviders: '备用模型',
      toolsets: '启用的工具集',
      timezone: '时区',
      display: {
        personality: '人格',
        showReasoning: '推理过程块'
      },
      agent: {
        maxTurns: '最大智能体步数',
        imageInputMode: '图片附件',
        apiMaxRetries: 'API 重试次数',
        serviceTier: '服务等级',
        toolUseEnforcement: '工具调用强制'
      },
      terminal: {
        cwd: '工作目录',
        backend: '执行后端',
        timeout: '命令超时',
        persistentShell: '持久化 Shell',
        envPassthrough: '环境变量透传',
        dockerImage: 'Docker 镜像',
        singularityImage: 'Singularity 镜像',
        modalImage: 'Modal 镜像',
        daytonaImage: 'Daytona 镜像'
      },
      fileReadMaxChars: '文件读取上限',
      toolOutput: {
        maxBytes: '终端输出上限',
        maxLines: '文件分页上限',
        maxLineLength: '行长度上限'
      },
      codeExecution: {
        mode: '代码执行模式'
      },
      approvals: {
        mode: '审批模式',
        timeout: '审批超时',
        mcpReloadConfirm: '确认 MCP 重载'
      },
      commandAllowlist: '命令白名单',
      security: {
        redactSecrets: '隐去密钥',
        allowPrivateUrls: '允许私有 URL'
      },
      browser: {
        allowPrivateUrls: '浏览器私有 URL',
        autoLocalForPrivateUrls: '私有 URL 使用本地浏览器'
      },
      checkpoints: {
        enabled: '文件检查点',
        maxSnapshots: '检查点上限'
      },
      voice: {
        recordKey: '语音快捷键',
        maxRecordingSeconds: '最长录音时长',
        autoTts: '朗读回复'
      },
      stt: {
        enabled: '语音转文字',
        provider: '语音转文字提供方',
        local: {
          model: '本地转写模型',
          language: '转写语言'
        },
        openai: {
          model: 'OpenAI STT 模型'
        },
        groq: {
          model: 'Groq STT 模型'
        },
        mistral: {
          model: 'Mistral STT 模型'
        },
        elevenlabs: {
          modelId: 'ElevenLabs STT 模型',
          languageCode: 'ElevenLabs 语言',
          tagAudioEvents: '标记音频事件',
          diarize: '说话人区分'
        }
      },
      tts: {
        provider: '文字转语音提供方',
        edge: {
          voice: 'Edge 语音'
        },
        openai: {
          model: 'OpenAI TTS 模型',
          voice: 'OpenAI 语音'
        },
        elevenlabs: {
          voiceId: 'ElevenLabs 语音',
          modelId: 'ElevenLabs 模型'
        },
        xai: {
          voiceId: 'xAI (Grok) 语音',
          language: 'xAI 语言'
        },
        minimax: {
          model: 'MiniMax TTS 模型',
          voiceId: 'MiniMax 语音'
        },
        mistral: {
          model: 'Mistral TTS 模型',
          voiceId: 'Mistral 语音'
        },
        gemini: {
          model: 'Gemini TTS 模型',
          voice: 'Gemini 语音'
        },
        neutts: {
          model: 'NeuTTS 模型',
          device: 'NeuTTS 设备'
        },
        kittentts: {
          model: 'KittenTTS 模型',
          voice: 'KittenTTS 语音'
        },
        piper: {
          voice: 'Piper 语音'
        }
      },
      memory: {
        memoryEnabled: '持久记忆',
        userProfileEnabled: '用户画像',
        memoryCharLimit: '记忆预算',
        userCharLimit: '画像预算',
        provider: '记忆提供方'
      },
      context: {
        engine: '上下文引擎'
      },
      compression: {
        enabled: '自动压缩',
        threshold: '压缩阈值',
        targetRatio: '压缩目标',
        protectLastN: '保护最近消息'
      },
      delegation: {
        model: '子智能体模型',
        provider: '子智能体提供方',
        maxIterations: '子智能体轮次上限',
        maxConcurrentChildren: '并行子智能体',
        childTimeoutSeconds: '子智能体超时',
        reasoningEffort: '子智能体推理强度'
      },
      updates: {
        nonInteractiveLocalChanges: '应用内更新本地更改'
      }
    }),
    fieldDescriptions: defineFieldCopy({
      model: '用于新对话，除非你在输入框中选择其他模型。',
      modelContextLength: '保持为 0 则使用所选模型检测到的上下文窗口。',
      fallbackProviders: '默认模型失败时尝试的备用 provider:model 条目。',
      display: {
        personality: '新会话的默认助手风格。',
        showReasoning: '当后端提供推理内容时予以显示。'
      },
      timezone: '当 Hermes 需要本地时间上下文时使用。留空则使用系统时区。',
      agent: {
        imageInputMode: '控制图片附件如何发送给模型。',
        maxTurns: 'Hermes 停止一次运行前工具调用轮次的上限。'
      },
      terminal: {
        cwd: '工具与终端操作的默认项目目录。',
        persistentShell: '当后端支持时，在命令之间保留 Shell 状态。',
        envPassthrough: '传入工具执行的环境变量。'
      },
      codeExecution: {
        mode: '代码执行被限定到当前项目的严格程度。'
      },
      fileReadMaxChars: 'Hermes 单次文件读取可读取的最大字符数。',
      approvals: {
        mode: 'Hermes 如何处理需要显式审批的命令。',
        timeout: '审批提示在超时前等待的时长。'
      },
      security: {
        redactSecrets: '尽可能从模型可见内容中隐藏检测到的密钥。'
      },
      checkpoints: {
        enabled: '在文件编辑前创建可回滚的快照。'
      },
      memory: {
        memoryEnabled: '保存有助于未来会话的持久记忆。',
        userProfileEnabled: '维护一份精简的用户偏好画像。'
      },
      context: {
        engine: '在接近上下文上限时管理长对话的策略。'
      },
      compression: {
        enabled: '当对话变大时对较早的上下文进行摘要。'
      },
      voice: {
        autoTts: '自动朗读助手回复。'
      },
      stt: {
        enabled: '启用本地或提供方支持的语音转写。',
        elevenlabs: {
          languageCode: '可选的 ISO-639-3 语言代码。留空让 ElevenLabs 自动检测。'
        }
      },
      updates: {
        nonInteractiveLocalChanges:
          'Hermes 从应用内更新时（无终端提示），保留本地源码修改（暂存）或丢弃（放弃）。通过终端更新时始终会询问。'
      }
    }),
    about: {
      heading: 'Hermes Desktop',
      version: value => `版本 ${value}`,
      versionUnavailable: '版本不可用',
      updates: '更新',
      checkNow: '立即检查',
      checking: '检查中…',
      seeWhatsNew: '查看新增内容',
      updateNow: '立即更新',
      releaseNotes: '发行说明',
      onLatest: '你已是最新版本。',
      installing: '正在安装更新。',
      cantUpdate: '此版本无法在应用内自我更新。',
      cantReach: '无法连接更新服务器。',
      tapCheck: '点击"立即检查"以查找更新。',
      updateReady: count => `已准备好新更新 (包含 ${count} 项更改)。`,
      lastChecked: age => `上次检查:${age}`,
      justNowSuffix: ' · 刚刚',
      automaticUpdates: '自动更新',
      automaticUpdatesDesc: 'Hermes 会在后台自动检查更新，并在有可用更新时通知你。',
      branchCommit: (branch, commit) => `分支 ${branch} · 提交 ${commit}`,
      never: '从未',
      justNow: '刚刚',
      minAgo: count => `${count} 分钟前`,
      hoursAgo: count => `${count} 小时前`,
      daysAgo: count => `${count} 天前`
    },
    config: {
      none: '无',
      noneParen: '(无)',
      notSet: '未设置',
      commaSeparated: '逗号分隔的值',
      loading: '正在加载 Hermes 配置...',
      emptyTitle: '无可配置项',
      emptyDesc: '此分区没有可调整的设置。',
      failedLoad: '设置加载失败',
      autosaveFailed: '自动保存失败',
      imported: '配置已导入',
      invalidJson: '配置 JSON 无效'
    },
    credentials: {
      pasteKey: '粘贴密钥',
      pasteLabelKey: label => `粘贴 ${label} 密钥`,
      optional: '可选',
      enterValueFirst: '请先输入一个值。',
      couldNotSave: '无法保存凭据。',
      remove: '移除',
      or: '或',
      escToCancel: '按 esc 取消',
      getKey: '获取密钥',
      saving: '保存中'
    },
    envActions: {
      actionsFor: label => `${label} 的操作`,
      credentialActions: '凭据操作',
      docs: '文档',
      hideValue: '隐藏值',
      revealValue: '显示值',
      replace: '替换',
      set: '设置',
      clear: '清除'
    },
    gateway: {
      loading: '正在加载网关设置...',
      unavailableTitle: '网关设置不可用',
      unavailableDesc: '桌面 IPC 桥未暴露网关设置。',
      title: '网关连接',
      envOverride: '环境变量覆盖',
      intro:
        'Hermes Desktop 默认会启动自己的本地网关。当你希望此应用控制另一台机器上或可信代理后的现有 Hermes 后端时，可以使用远程网关。下面可按 profile 指定各自的远程主机。',
      appliesTo: '应用于',
      allProfiles: '所有 profile',
      defaultConnection: '默认连接会用于所有没有自定义覆盖的 profile。',
      profileConnection: profile => `仅当“${profile}”是当前 profile 时使用此连接。设为本地即可继承默认连接。`,
      envOverrideTitle: '环境变量正在控制此桌面会话。',
      envOverrideDesc: '取消设置 HERMES_DESKTOP_REMOTE_URL 和 HERMES_DESKTOP_REMOTE_TOKEN 后才会使用下面保存的设置。',
      localTitle: '本地网关',
      localDesc: '在 localhost 启动私有 Hermes 后端。这是默认方式，并且可离线工作。',
      remoteTitle: '远程网关',
      remoteDesc:
        '将此桌面外壳连接到远程 Hermes 后端。托管网关使用 OAuth 或用户名密码；自托管网关也可能使用会话 token。',
      remoteUrlTitle: '远程 URL',
      remoteUrlDesc: '远程 dashboard 后端的基础 URL。支持路径前缀，例如 /hermes。',
      probing: '正在检查此网关的认证方式…',
      probeError: '暂时无法访问此网关。请检查 URL；网关响应后会显示认证方式。',
      signedIn: '已登录',
      signIn: '登录',
      signOut: '退出登录',
      signInWith: provider => `使用 ${provider} 登录`,
      authTitle: '认证',
      authSignedInPassword: '此网关使用用户名和密码。你已登录，会话会自动刷新。',
      authSignedInOauth: '此网关使用 OAuth。你已登录，会话会自动刷新。',
      authNeedsPassword: '此网关使用用户名和密码。请登录以授权此桌面应用。',
      authNeedsOauth: provider => `此网关使用 OAuth。请使用 ${provider} 登录以授权此桌面应用。`,
      tokenTitle: '会话 token',
      tokenDesc: '用于 REST 和 WebSocket 访问的 dashboard 会话 token。留空则保留已保存的 token。',
      existingToken: value => `现有 token ${value}`,
      savedToken: '已保存',
      pasteSessionToken: '粘贴会话 token',
      testRemote: '测试远程',
      saveForRestart: '保存到下次重启',
      saveAndReconnect: '保存并重连',
      diagnostics: '诊断',
      diagnosticsDesc: '在文件管理器中显示 desktop.log，网关启动失败时很有用。',
      openLogs: '打开日志',
      incompleteTitle: '远程网关配置不完整',
      incompleteSignIn: '切换到远程前，请输入远程 URL 并完成登录。',
      incompleteToken: '切换到远程前，请输入远程 URL 和会话 token。',
      incompleteSignInTest: '测试前，请输入远程 URL 并完成登录。',
      incompleteTokenTest: '测试前，请输入远程 URL 和会话 token。',
      enterUrlFirst: '请先输入远程 URL。',
      restartingTitle: '网关连接正在重启',
      savedTitle: '网关设置已保存',
      restartingMessage: 'Hermes Desktop 将使用已保存设置重新连接。',
      savedMessage: '已保存，下一次重启生效。',
      connectedTo: (baseUrl, version) => `已连接到 ${baseUrl}${version ? ` · Hermes ${version}` : ''}`,
      reachableTitle: '远程网关可访问',
      signedOutTitle: '已退出登录',
      signedOutMessage: '已清除远程网关会话。',
      failedLoad: '网关设置加载失败',
      signInFailed: '登录失败',
      signOutFailed: '退出登录失败',
      testFailed: '远程网关测试失败',
      applyFailed: '无法应用网关设置',
      saveFailed: '无法保存网关设置'
    },
    keys: {
      loading: '正在加载 API 密钥和凭据...',
      failedLoad: 'API 密钥加载失败',
      empty: '此类别暂时没有配置项。'
    },
    mcp: {
      loading: '正在加载 MCP 服务器...',
      failedLoad: 'MCP 配置加载失败',
      nameRequiredTitle: '需要名称',
      nameRequiredMessage: '请为此 MCP 服务器提供配置键。',
      objectRequired: '服务器配置必须是 JSON 对象',
      invalidJson: 'MCP JSON 无效',
      saveFailed: '保存失败',
      removeFailed: '移除失败',
      gatewayUnavailableTitle: '网关不可用',
      gatewayUnavailableMessage: '重新加载 MCP 前请先重连网关。',
      reloadedTitle: 'MCP 工具已重新加载',
      reloadedMessage: '新的工具 schema 将应用到后续回合。',
      reloadFailed: 'MCP 重新加载失败',
      savedTitle: 'MCP 服务器已保存',
      savedMessage: name => `${name} 会在 MCP 重新加载后生效。`,
      newServer: '新服务器',
      reload: '重新加载 MCP',
      reloading: '重新加载中...',
      emptyTitle: '没有 MCP 服务器',
      emptyDesc: '添加 stdio 或 HTTP 服务器以暴露 MCP 工具。',
      disabled: '已禁用',
      editServer: '编辑服务器',
      name: '名称',
      serverJson: '服务器 JSON',
      remove: '移除',
      saveServer: '保存服务器'
    },
    model: {
      loading: '正在加载模型配置...',
      appliesDesc: '应用于新会话。可在输入框的模型选择器中临时切换当前对话。',
      provider: '提供方',
      model: '模型',
      applying: '应用中...',
      defaultsLabel: '默认值',
      reasoning: '推理',
      reasoningOff: '关闭',
      defaultsFailed: '保存模型默认值失败',
      auxiliaryTitle: '辅助模型',
      resetAllToMain: '全部重置为主模型',
      auxiliaryDesc: '辅助任务默认使用主模型。你可以为任意任务指定专用模型。',
      setToMain: '设为主模型',
      change: '更改',
      autoUseMain: '自动 · 使用主模型',
      providerDefault: '(提供方默认)',
      tasks: {
        vision: { label: '视觉', hint: '图片分析' },
        web_extract: { label: '网页提取', hint: '页面总结' },
        compression: { label: '压缩', hint: '上下文压缩' },
        skills_hub: { label: '技能中心', hint: '技能搜索' },
        approval: { label: '审批', hint: '智能自动批准' },
        mcp: { label: 'MCP', hint: 'MCP 工具路由' },
        title_generation: { label: '标题生成', hint: '会话标题' },
        curator: { label: '维护器', hint: '技能使用审查' }
      }
    },
    providers: {
      connectAccount: '连接账号',
      haveApiKey: '改用 API 密钥？',
      intro: '使用订阅登录，无需复制 API 密钥。Hermes 会在应用中为你完成浏览器登录。',
      connected: '已连接',
      collapse: '收起',
      connectAnother: '连接其他提供方',
      otherProviders: '其他提供方',
      disconnect: '断开连接',
      disconnectInTerminal: '断开连接（在终端中运行移除命令）',
      removeConfirm: provider => `移除 ${provider}？`,
      removeExternalGeneric: provider => `${provider} 由其自身的 CLI 管理 — 请在那里移除。`,
      removeKeyManaged: provider => `${provider} 由 API 密钥配置。请从 API Keys 中移除。`,
      removeTerminalConfirm: (provider, command) => `断开 ${provider}？这将在终端中运行 "${command}" 以清除凭据。`,
      removeTerminalRunning: provider => `正在终端中断开 ${provider}…`,
      removedTitle: '账号已移除',
      removedMessage: provider => `${provider} 已移除。`,
      failedRemove: provider => `无法移除 ${provider}`,
      noProviderKeys: '没有可用的提供方 API 密钥。',
      searchKeys: '搜索提供方…',
      noKeysMatch: '没有匹配的提供方。',
      loading: '正在加载提供方...'
    },
    sessions: {
      loading: '正在加载已归档会话…',
      archivedTitle: '已归档会话',
      archivedIntro: '已归档对话会从侧边栏隐藏，但会保留全部消息。在侧边栏 Ctrl/⌘ 点击对话即可归档。',
      emptyArchivedTitle: '暂无归档',
      emptyArchivedDesc: '归档一个对话后会显示在这里。',
      unarchive: '取消归档',
      deletePermanently: '永久删除',
      messages: count => `${count} 条消息`,
      restored: '已恢复',
      deleteConfirm: title => `永久删除“${title}”？此操作无法撤销。`,
      defaultDirTitle: '默认项目目录',
      defaultDirDesc: '新会话默认从此文件夹开始，除非你选择其他目录。留空则使用你的 home 目录。',
      defaultDirUpdated: '默认项目目录已更新',
      defaultsTo: label => `默认使用 ${label}。`,
      change: '更改',
      choose: '选择',
      clear: '清除',
      notSet: '未设置',
      failedLoad: '无法加载已归档会话',
      unarchiveFailed: '取消归档失败',
      deleteFailed: '删除失败',
      updateDirFailed: '无法更新默认目录',
      clearDirFailed: '无法清除默认目录'
    },
    toolsets: {
      loadingConfig: '正在加载配置',
      savedTitle: '凭据已保存',
      savedMessage: key => `${key} 已更新。`,
      removedTitle: '凭据已移除',
      removedMessage: key => `${key} 已移除。`,
      failedSave: key => `保存 ${key} 失败`,
      failedRemove: key => `移除 ${key} 失败`,
      failedReveal: key => `显示 ${key} 失败`,
      removeConfirm: key => `从 .env 中移除 ${key}？`,
      set: '已设置',
      notSet: '未设置',
      selectedTitle: '已选择提供方',
      selectedMessage: provider => `${provider} 现在处于活动状态。`,
      failedSelect: provider => `选择 ${provider} 失败`,
      failedLoad: '工具配置加载失败',
      noProviderOptions: '此工具集没有提供方选项；启用后即可使用当前配置。',
      noProviders: '此工具集当前没有可用提供方。',
      ready: '就绪',
      nousIncluded: '包含在 Nous 订阅中；登录 Nous Portal 即可激活。',
      noApiKeyRequired: '不需要 API 密钥。',
      postSetupHint: step => `此后端需要一次性安装 (${step})。将在此机器上执行，可能需要几分钟。`,
      postSetupRun: '运行设置',
      postSetupRunning: '安装中…',
      postSetupStarting: '启动中…',
      postSetupCompleteTitle: '设置完成',
      postSetupCompleteMessage: step => `已安装 ${step}。`,
      postSetupErrorTitle: '设置完成但有错误',
      postSetupErrorMessage: step => `请检查 ${step} 日志。`,
      postSetupFailed: step => `运行 ${step} 设置失败`
    }
  },

  skills: {
    tabSkills: '技能',
    tabToolsets: '工具集',
    all: '全部',
    searchSkills: '搜索技能…',
    searchToolsets: '搜索工具集…',
    refresh: '刷新技能',
    refreshing: '正在刷新技能',
    loading: '正在加载能力…',
    noSkillsTitle: '未找到技能',
    noSkillsDesc: '尝试更宽泛的搜索或其他分类。',
    noToolsetsTitle: '未找到工具集',
    noToolsetsDesc: '尝试更宽泛的搜索词。',
    noDescription: '暂无描述。',
    configured: '已配置',
    needsKeys: '需要密钥',
    toolsetsEnabled: (enabled, total) => `已启用 ${enabled}/${total} 个工具集`,
    configureToolset: label => `配置 ${label}`,
    toggleToolset: label => `切换 ${label} 工具集`,
    skillsLoadFailed: '技能加载失败',
    toolsetsRefreshFailed: '工具集刷新失败',
    skillEnabled: '技能已启用',
    skillDisabled: '技能已禁用',
    toolsetEnabled: '工具集已启用',
    toolsetDisabled: '工具集已禁用',
    appliesToNewSessions: name => `${name} 将应用于新会话。`,
    failedToUpdate: name => `更新 ${name} 失败`
  },

  agents: {
    close: '关闭代理',
    title: '派生树',
    subtitle: '当前回合的子代理实时活动。',
    emptyTitle: '暂无活跃子代理',
    emptyDesc: '当某个回合派发任务时，子代理会在此实时显示进度。',
    running: '运行中',
    failed: '失败',
    done: '完成',
    streaming: '流式传输',
    files: '文件',
    moreFiles: count => `还有 ${count} 个文件`,
    delegation: index => `派发 ${index}`,
    workers: count => `${count} 个工作单元`,
    workersActive: count => `${count} 个活跃`,
    agentsCount: count => `${count} 个代理`,
    activeCount: count => `${count} 个活跃`,
    failedCount: count => `${count} 个失败`,
    toolsCount: count => `${count} 个工具`,
    filesCount: count => `${count} 个文件`,
    updatedAgo: age => `更新于 ${age}`,
    ageNow: '刚刚',
    ageSeconds: seconds => `${seconds} 秒前`,
    ageMinutes: minutes => `${minutes} 分钟前`,
    ageHours: hours => `${hours} 小时前`,
    durationSeconds: seconds => `${seconds} 秒`,
    durationMinutes: (minutes, seconds) => `${minutes} 分 ${seconds} 秒`,
    tokensK: k => `${k}k 词元`,
    tokens: value => `${value} 词元`
  },

  commandCenter: {
    close: '关闭命令中心',
    paletteTitle: '命令面板',
    back: '返回',
    searchPlaceholder: '搜索会话、视图与操作',
    goTo: '前往',
    goToSession: '前往会话',
    commandCenter: '命令中心',
    appearance: '外观',
    settings: '设置',
    changeTheme: '更改主题...',
    changeColorMode: '更改颜色模式...',
    installTheme: {
      title: '安装主题...',
      placeholder: '搜索 VS Code Marketplace...',
      loading: '正在搜索 Marketplace...',
      error: '无法连接到 Marketplace。',
      empty: '没有匹配的主题。',
      install: '安装',
      installing: '安装中...',
      installed: '已安装',
      installs: count => `${count} 次安装`
    },
    settingsFields: '设置字段',
    mcpServers: 'MCP 服务器',
    archivedChats: '已归档对话',
    sections: { sessions: '会话', system: '系统', usage: '用量' },
    sectionDescriptions: {
      sessions: '搜索与管理会话',
      system: '状态、日志与系统操作',
      usage: '一段时间内的词元、成本与技能活动'
    },
    nav: {
      newChat: { title: '新建会话', detail: '开始一个新会话' },
      settings: { title: '设置', detail: '配置 Hermes 桌面端' },
      skills: { title: '技能与工具', detail: '启用技能、工具集与提供方' },
      messaging: { title: '消息平台', detail: '配置 Telegram、Slack、Discord 等' },
      artifacts: { title: '产物', detail: '浏览生成的输出' }
    },
    sectionEntries: {
      sessions: { title: '会话面板', detail: '搜索、置顶与管理会话' },
      system: { title: '系统面板', detail: '网关状态、日志、重启/更新' },
      usage: { title: '用量面板', detail: '词元、成本与技能活动' }
    },
    providerNavigate: '导航',
    providerSessions: '会话',
    refresh: '刷新',
    refreshing: '刷新中…',
    noResults: '未找到匹配结果。',
    pinSession: '置顶会话',
    unpinSession: '取消置顶',
    exportSession: '导出会话',
    deleteSession: '删除会话',
    noSessions: '暂无会话。',
    gatewayRunning: '消息网关运行中',
    gatewayStopped: '消息网关已停止',
    hermesActiveSessions: (version, count) => `Hermes ${version} · 活跃会话 ${count}`,
    restartGateway: '重启网关',
    gatewayRestartFailed: '网关重启失败。',
    updateHermes: '更新 Hermes',
    actionRunning: '运行中',
    actionDone: '完成',
    actionFailed: '失败',
    actionStartedWaiting: '操作已启动，等待状态…',
    loadingStatus: '正在加载状态…',
    recentLogs: '最近日志',
    noLogs: '尚未加载日志。',
    days: count => `${count} 天`,
    statSessions: '会话',
    statApiCalls: 'API 调用',
    statTokens: '输入/输出词元',
    statCost: '预估成本',
    actualCost: cost => `实际 ${cost}`,
    loadingUsage: '正在加载用量…',
    noUsage: period => `最近 ${period} 天暂无用量。`,
    retry: '重试',
    dailyTokens: '每日词元',
    input: '输入',
    output: '输出',
    noDailyActivity: '暂无每日活动。',
    topModels: '常用模型',
    noModelUsage: '暂无模型用量。',
    topSkills: '常用技能',
    noSkillActivity: '暂无技能活动。',
    actions: count => `${count} 次操作`
  },

  messaging: {
    search: '搜索消息平台…',
    loading: '正在加载消息平台…',
    loadFailed: '消息平台加载失败',
    states: {
      connected: '已连接',
      connecting: '连接中',
      disabled: '已禁用',
      fatal: '错误',
      gateway_stopped: '消息网关已停止',
      not_configured: '需要设置',
      pending_restart: '需要重启',
      retrying: '重试中',
      startup_failed: '启动失败'
    },
    unknown: '未知',
    hintPendingRestart: '在状态栏重启网关以应用此更改。',
    hintGatewayStopped: '在状态栏启动网关以建立连接。',
    credentialsSet: '凭据已设置',
    needsSetup: '需要设置',
    gatewayStopped: '消息网关已停止',
    getCredentials: '获取你的凭据',
    openSetupGuide: '打开设置指南',
    required: '必填',
    recommended: '推荐',
    advanced: count => `高级 (${count})`,
    noTokenNeeded: '此平台无需在此填写令牌。请按上方设置指南操作，然后在下方启用。',
    enabled: '已启用',
    disabled: '已禁用',
    unsavedChanges: '有未保存的更改',
    saving: '保存中…',
    saveChanges: '保存更改',
    saved: '已保存',
    replaceValue: '替换当前值',
    openDocs: '打开文档',
    clearField: key => `清除 ${key}`,
    enableAria: name => `启用 ${name}`,
    disableAria: name => `禁用 ${name}`,
    platformEnabled: name => `${name} 已启用`,
    platformDisabled: name => `${name} 已禁用`,
    restartToApply: '此更改将在网关重启后生效。',
    setupSaved: name => `${name} 设置已保存`,
    restartToReconnect: '新凭据将在网关重启后生效。',
    keyCleared: key => `${key} 已清除`,
    setupUpdated: name => `${name} 设置已更新。`,
    failedUpdate: name => `更新 ${name} 失败`,
    failedSave: name => `保存 ${name} 失败`,
    failedClear: key => `清除 ${key} 失败`,
    fieldCopy: {
      TELEGRAM_BOT_TOKEN: {
        label: 'Bot 令牌',
        help: '用 @BotFather 创建一个机器人，然后粘贴它给你的令牌。',
        placeholder: '粘贴 Telegram bot 令牌'
      },
      TELEGRAM_ALLOWED_USERS: {
        label: '允许的 Telegram 用户 ID',
        help: '推荐。来自 @userinfobot 的逗号分隔数字 ID。不设置则任何人都能私信你的机器人。'
      },
      TELEGRAM_PROXY: { label: '代理 URL', help: '仅在 Telegram 被屏蔽的网络中需要。' },
      DISCORD_BOT_TOKEN: { label: 'Bot 令牌', help: '在 Discord 开发者门户创建应用，添加机器人，然后粘贴其令牌。' },
      DISCORD_ALLOWED_USERS: { label: '允许的 Discord 用户 ID', help: '推荐。逗号分隔的 Discord 用户 ID。' },
      DISCORD_REPLY_TO_MODE: { label: '回复方式', help: 'first、all 或 off。' },
      DISCORD_ALLOW_ALL_USERS: {
        label: '允许所有 Discord 用户',
        help: '仅用于开发。为 true 时，任何人都可以私信 bot，不需要允许列表。'
      },
      DISCORD_HOME_CHANNEL: { label: '主页频道 ID', help: 'bot 主动发送消息的频道（cron 输出、提醒等）。' },
      DISCORD_HOME_CHANNEL_NAME: { label: '主页频道名称', help: '日志和状态输出中显示的主页频道名称。' },
      BLUEBUBBLES_ALLOW_ALL_USERS: { label: '允许所有 iMessage 用户', help: '为 true 时跳过 BlueBubbles 允许列表。' },
      MATTERMOST_ALLOW_ALL_USERS: { label: '允许所有 Mattermost 用户' },
      MATTERMOST_HOME_CHANNEL: { label: '主页频道' },
      QQ_ALLOW_ALL_USERS: { label: '允许所有 QQ 用户' },
      QQBOT_HOME_CHANNEL: { label: 'QQ 主页频道', help: 'cron 投递的默认频道或群组。' },
      QQBOT_HOME_CHANNEL_NAME: { label: 'QQ 主页频道名称' },
      SLACK_BOT_TOKEN: {
        label: 'Slack bot 令牌',
        help: '安装 Slack 应用后，在 OAuth & Permissions 中找到 bot 令牌。',
        placeholder: '粘贴 Slack bot 令牌'
      },
      SLACK_APP_TOKEN: {
        label: 'Slack app 令牌',
        help: 'Socket Mode 需要 app 级令牌。',
        placeholder: '粘贴 Slack app 令牌'
      },
      SLACK_ALLOWED_USERS: { label: '允许的 Slack 用户 ID', help: '推荐。逗号分隔的 Slack 用户 ID。' },
      MATTERMOST_URL: { label: '服务器 URL', placeholder: 'https://mattermost.example.com' },
      MATTERMOST_TOKEN: { label: 'Bot 令牌' },
      MATTERMOST_ALLOWED_USERS: { label: '允许的用户 ID', help: '推荐。逗号分隔的 Mattermost 用户 ID。' },
      MATRIX_HOMESERVER: { label: 'Homeserver URL', placeholder: 'https://matrix.org' },
      MATRIX_ACCESS_TOKEN: { label: '访问令牌' },
      MATRIX_USER_ID: { label: 'Bot 用户 ID', placeholder: '@hermes:example.org' },
      MATRIX_ALLOWED_USERS: { label: '允许的 Matrix 用户 ID', help: '推荐。@user:server 格式的逗号分隔用户 ID。' },
      SIGNAL_HTTP_URL: {
        label: 'Signal 桥接 URL',
        placeholder: 'http://127.0.0.1:8080',
        help: '运行中的 signal-cli REST 桥接的 URL。'
      },
      SIGNAL_ACCOUNT: { label: '电话号码', help: '在 signal-cli 桥接中注册的号码。' },
      SIGNAL_ALLOWED_USERS: { label: '允许的 Signal 用户', help: '推荐。逗号分隔的 Signal 标识符。' },
      WHATSAPP_ENABLED: { label: '启用 WhatsApp 桥接', help: '由下方开关自动设置。除非确知需要，否则请勿改动。' },
      WHATSAPP_MODE: { label: '桥接模式' },
      WHATSAPP_ALLOWED_USERS: { label: '允许的 WhatsApp 用户', help: '推荐。逗号分隔的电话号码或 WhatsApp ID。' }
    },
    platformIntro: {
      telegram:
        '在 Telegram 中，与 @BotFather 对话，运行 /newbot，复制它给你的令牌。然后从 @userinfobot 获取你的数字用户 ID。',
      discord:
        '打开 Discord 开发者门户，创建应用，添加 Bot，然后复制其令牌。用正确的权限范围把机器人邀请到你的服务器。',
      slack: '创建 Slack 应用，启用 Socket Mode，安装到你的工作区，然后复制 bot 令牌和 app 级令牌。',
      mattermost: '在你的 Mattermost 服务器上，创建机器人账户或个人访问令牌，然后在此粘贴服务器 URL 和令牌。',
      matrix: '用机器人账户登录你的 homeserver，然后复制访问令牌、用户 ID 和 homeserver URL。',
      signal: '在可访问的位置运行 signal-cli REST 桥接，然后把 Hermes 指向该 URL 和已注册的电话号码。',
      whatsapp: '启动 Hermes 自带的 WhatsApp 桥接，首次运行时扫描二维码，然后启用该平台。',
      bluebubbles:
        '在装有 iMessage 的 Mac 上运行 BlueBubbles Server，暴露其 API，然后用服务器密码把 Hermes 指向该 URL。',
      homeassistant: '在 Home Assistant 中打开你的个人资料并创建长期访问令牌。把它连同你的 HA URL 一起粘贴到这里。',
      email: '使用专用邮箱。对于 Gmail/Workspace,创建应用专用密码并使用 imap.gmail.com / smtp.gmail.com。',
      sms: '从 Twilio 控制台获取你的 Account SID 和 Auth Token，以及一个可发送短信的电话号码。',
      dingtalk: '在开发者控制台创建钉钉应用，然后在此复制 Client ID(App key) 和 Client Secret。',
      feishu: '创建飞书 / Lark 应用，配置机器人能力，复制 App ID、App secret 和事件加密密钥。',
      wecom: '在企业微信中添加群机器人，复制其 webhook key 作为 WECOM_BOT_ID。仅可发送——双向请用企业微信 (应用) 选项。',
      wecom_callback: '设置一个企业微信自建应用，暴露其回调 URL，并提供 corp ID、secret、agent ID 和 AES key。',
      weixin:
        '运行 `hermes gateway setup`，选择 Weixin，然后使用个人微信账号扫描并确认二维码。Hermes 会通过腾讯 iLink Bot API 连接并保存凭据。',
      qqbot: '在 QQ 开放平台 (q.qq.com) 注册一个应用，复制 App ID 和 Client Secret。',
      api_server:
        '把 Hermes 暴露为兼容 OpenAI 的 API。设置一个鉴权密钥，然后把 Open WebUI / LobeChat 等指向 host:port。',
      webhook: '运行一个 HTTP 服务器，供其他工具 (GitHub、GitLab、自定义应用)POST。用 secret 验证签名。'
    }
  },

  profiles: {
    close: '关闭配置档案',
    nameHint: '小写字母、数字、连字符和下划线。必须以字母或数字开头。',
    title: '配置档案',
    count: count => `${count} 个配置档案`,
    loading: '正在加载配置档案…',
    newProfile: '新建配置档案',
    allProfiles: '全部配置档案',
    showAllProfiles: '显示全部配置档案',
    switchToProfile: name => `切换到 ${name}`,
    manageProfiles: '管理配置档案...',
    actionsFor: name => `${name} 的操作`,
    color: '颜色...',
    colorFor: name => `${name} 的颜色`,
    setColor: color => `设置颜色 ${color}`,
    autoColor: '自动',
    noProfiles: '暂无配置档案。',
    selectPrompt: '选择一个配置档案以查看其详情。',
    refresh: '刷新配置档案',
    refreshing: '正在刷新配置档案',
    default: '默认',
    skills: count => `${count} 个技能`,
    env: 'env',
    defaultBadge: '默认',
    rename: '重命名',
    copySetup: '复制安装命令',
    copying: '复制中…',
    modelLabel: '模型',
    skillsLabel: '技能',
    notSet: '未设置',
    soulDesc: '内置于此配置档案的系统提示词与人格指令。',
    soulOptional: '可选',
    soulPlaceholder: mode => `此配置档案的系统提示词 / 人格说明。\n留空则保留${mode}默认值。`,
    soulPlaceholderCloned: '克隆的',
    soulPlaceholderEmpty: '空的',
    unsavedChanges: '有未保存的更改',
    loadingSoul: '正在加载 SOUL.md…',
    emptySoul: '空的 SOUL.md —— 开始撰写人格设定…',
    saving: '保存中…',
    saveSoul: '保存 SOUL.md',
    deleteTitle: '删除配置档案？',
    deleteDescPrefix: '这将删除 ',
    deleteDescMid: ' 并移除其 ',
    deleteDescSuffix: ' 目录。此操作无法撤销。',
    deleting: '删除中…',
    createDesc: '配置档案是相互独立的 Hermes 环境：各自拥有独立的配置、技能和 SOUL.md。',
    nameLabel: '名称',
    cloneFrom: '克隆来源',
    cloneFromNone: '无（空白）',
    cloneFromDesc: '从选中的来源配置档案复制配置、技能和 SOUL.md。',
    cloneFromDefault: '从默认档案克隆',
    cloneFromDefaultDesc: '从你的默认配置档案复制配置、技能和 SOUL.md。',
    invalidName: hint => `名称无效。${hint}`,
    nameRequired: '名称为必填项。',
    creating: '创建中…',
    createAction: '创建配置档案',
    renameTitle: '重命名配置档案',
    renameDescPrefix: '重命名会更新配置档案目录以及 ',
    renameDescSuffix: ' 中的所有包装脚本。',
    newNameLabel: '新名称',
    renaming: '重命名中…',
    created: '配置档案已创建',
    renamed: '配置档案已重命名',
    deleted: '配置档案已删除',
    setupCopied: '安装命令已复制',
    soulSaved: 'SOUL.md 已保存',
    failedLoad: '加载配置档案失败',
    failedDelete: '删除配置档案失败',
    failedCopy: '复制安装命令失败',
    failedLoadSoul: '加载 SOUL.md 失败',
    failedSaveSoul: '保存 SOUL.md 失败',
    failedCreate: '创建配置档案失败',
    failedRename: '重命名配置档案失败'
  },

  cron: {
    close: '关闭定时任务',
    search: '搜索定时任务…',
    loading: '正在加载定时任务…',
    states: {
      enabled: '已启用',
      scheduled: '已排程',
      running: '运行中',
      paused: '已暂停',
      disabled: '已禁用',
      error: '错误',
      completed: '已完成'
    },
    deliveryLabels: {
      local: '此桌面',
      telegram: 'Telegram',
      discord: 'Discord',
      slack: 'Slack',
      email: '电子邮件'
    },
    scheduleLabels: {
      daily: '每天',
      weekdays: '工作日',
      weekly: '每周',
      monthly: '每月',
      hourly: '每小时',
      'every-15-minutes': '每 15 分钟',
      custom: '自定义'
    },
    scheduleHints: {
      daily: '每天上午 9:00',
      weekdays: '周一至周五上午 9:00',
      weekly: '每周一上午 9:00',
      monthly: '每月第一天上午 9:00',
      hourly: '每个整点',
      'every-15-minutes': '每 15 分钟',
      custom: 'Cron 语法或自然语言'
    },
    days: {
      '0': '周日',
      '1': '周一',
      '2': '周二',
      '3': '周三',
      '4': '周四',
      '5': '周五',
      '6': '周六',
      '7': '周日'
    },
    dayFallback: value => `第 ${value} 天`,
    everyDayAt: time => `每天 ${time}`,
    weekdaysAt: time => `工作日 ${time}`,
    everyDayOfWeekAt: (day, time) => `每${day} ${time}`,
    monthlyOnDayAt: (dayOfMonth, time) => `每月 ${dayOfMonth} 日 ${time}`,
    topOfHour: '每个整点',
    everyHourAt: minute => `每小时的 :${minute}`,
    newCron: '新建定时任务',
    emptyDescNew: '按 cron 表达式排程一个提示词。Hermes 会运行它，并把结果发送到你选择的目的地。',
    emptyDescSearch: '尝试更宽泛的搜索词。',
    emptyTitleNew: '暂无排程任务',
    emptyTitleSearch: '无匹配项',
    last: '上次：',
    next: '下次：',
    noRuns: '尚无运行',
    manage: '管理',
    showRuns: '显示运行记录',
    hideRuns: '隐藏运行记录',
    runHistory: '运行记录',
    actionsFor: title => `${title} 的操作`,
    actionsTitle: '定时任务操作',
    resume: '恢复定时任务',
    pause: '暂停定时任务',
    resumeTitle: '恢复',
    pauseTitle: '暂停',
    triggerNow: '立即触发',
    edit: '编辑定时任务',
    deleteTitle: '删除定时任务？',
    deleteDescPrefix: '这将永久移除 ',
    deleteDescSuffix: '。它会立即停止触发。',
    deleting: '删除中…',
    resumed: '定时任务已恢复',
    paused: '定时任务已暂停',
    triggered: '定时任务已触发',
    deleted: '定时任务已删除',
    created: '定时任务已创建',
    updated: '定时任务已更新',
    failedLoad: '加载定时任务失败',
    failedUpdate: '更新定时任务失败',
    failedTrigger: '触发定时任务失败',
    failedDelete: '删除定时任务失败',
    failedSave: '保存定时任务失败',
    editTitle: '编辑定时任务',
    createTitle: '新建定时任务',
    editDesc: '更新排程、提示词或投递目标。更改将在下次运行时生效。',
    createDesc: '排程一个提示词以自动运行。使用 cron 语法或类似"每 15 分钟"的自然语言。',
    nameLabel: '名称',
    namePlaceholder: '晨间简报',
    promptLabel: '提示词',
    promptPlaceholder: '总结我未读的 Slack 话题，并把前 5 条邮件发给我…',
    frequencyLabel: '频率',
    deliverLabel: '投递至',
    customScheduleLabel: '自定义排程',
    customPlaceholder: '0 9 * * * 或 weekdays at 9am',
    customHint: 'Cron 表达式，或类似"每小时""工作日上午 9 点"的短语。',
    optional: '可选',
    promptScheduleRequired: '提示词和排程为必填项。',
    saveChanges: '保存更改',
    createAction: '创建定时任务'
  },

  artifacts: {
    search: '搜索产物…',
    refresh: '刷新产物',
    refreshing: '正在刷新产物',
    indexing: '正在索引最近会话的产物',
    tabAll: '全部',
    tabImages: '图片',
    tabFiles: '文件',
    tabLinks: '链接',
    noArtifactsTitle: '未找到产物',
    noArtifactsDesc: '当会话生成图片和文件输出时，它们会显示在这里。',
    failedLoad: '产物加载失败',
    openFailed: '打开失败',
    itemsImage: '张图片',
    itemsLink: '个链接',
    itemsFile: '个文件',
    itemsGeneric: '项',
    zero: '0',
    rangeOf: (start, end, total) => `${start}-${end},共 ${total}`,
    goToPage: (itemLabel, page) => `前往${itemLabel}第 ${page} 页`,
    colTitleLink: '链接标题',
    colTitleFile: '名称',
    colTitleDefault: '标题 / 名称',
    colLocationLink: 'URL',
    colLocationFile: '路径',
    colLocationDefault: '位置',
    colSession: '会话',
    kindImage: '图片',
    kindFile: '文件',
    kindLink: '链接',
    chat: '对话',
    copyUrl: '复制 URL',
    copyPath: '复制路径'
  },

  sidebar: {
    nav: {
      'new-session': '新建会话',
      skills: '技能与工具',
      messaging: '消息平台',
      artifacts: '产物'
    },
    searchAria: '搜索会话',
    searchPlaceholder: '搜索会话…',
    clearSearch: '清除搜索',
    noMatch: query => `没有会话匹配"${query}"。`,
    results: '结果',
    pinned: '已置顶',
    sessions: '会话',
    cronJobs: '定时任务',
    groupAriaGrouped: '以单一列表显示会话',
    groupAriaUngrouped: '按工作区分组会话',
    groupTitleGrouped: '取消分组',
    groupTitleUngrouped: '按工作区分组',
    allPinned: '这里的全部已置顶。取消置顶某个对话即可在最近中显示。',
    shiftClickHint: 'Shift+ 单击对话以置顶 · 拖动以重新排序',
    noWorkspace: '无工作区',
    newSessionIn: label => `在 ${label} 中新建会话`,
    reorderWorkspace: label => `重新排序工作区 ${label}`,
    showMoreIn: (count, label) => `在 ${label} 中再显示 ${count} 个`,
    loading: '加载中…',
    loadMore: '加载更多',
    loadCount: step => `再加载 ${step} 个`,
    row: {
      pin: '置顶',
      unpin: '取消置顶',
      copyId: '复制 ID',
      export: '导出',
      rename: '重命名',
      archive: '归档',
      newWindow: '新窗口',
      copyIdFailed: '无法复制会话 ID',
      actionsFor: title => `${title} 的操作`,
      sessionActions: '会话操作',
      sessionRunning: '会话运行中',
      needsInput: '需要你输入',
      waitingForAnswer: '正在等待你的回答',
      handoffOrigin: platform => `从 ${platform} 转接`,
      renamed: '已重命名',
      renameFailed: '重命名失败',
      renameTitle: '重命名会话',
      renameDesc: '给这个对话起一个好记的标题。留空则清除。',
      untitledPlaceholder: '无标题会话',
      ageNow: '刚刚',
      ageDay: '天',
      ageHour: '时',
      ageMin: '分'
    }
  },

  composer: {
    message: '消息',
    wakingProfile: profile => `正在唤醒 ${profile}…`,
    placeholderStarting: '正在启动 Hermes…',
    placeholderReconnecting: '正在重新连接 Hermes…',
    placeholderFollowUp: '发送后续消息',
    newSessionPlaceholders: [
      '我们要构建什么？',
      '给 Hermes 一个任务',
      '你在想什么？',
      '描述你需要什么',
      '我们该处理什么？',
      '随便问点什么',
      '从一个目标开始'
    ],
    followUpPlaceholders: [
      '发送后续消息',
      '补充更多上下文',
      '细化这个请求',
      '下一步是什么？',
      '继续推进',
      '再深入一点',
      '调整或继续'
    ],
    startVoice: '开始语音对话',
    queueMessage: '排队消息',
    steer: '引导当前运行',
    stop: '停止',
    send: '发送',
    speaking: '讲话中',
    transcribing: '转写中',
    thinking: '思考中',
    muted: '已静音',
    listening: '聆听中',
    muteMic: '麦克风静音',
    unmuteMic: '取消麦克风静音',
    stopListening: '停止聆听并发送',
    stopShort: '停止',
    endConversation: '结束语音对话',
    endShort: '结束',
    stopDictation: '停止听写',
    transcribingDictation: '正在转写听写',
    voiceDictation: '语音听写',
    lookupLoading: '查找中…',
    lookupNoMatches: '没有匹配项。',
    lookupTry: '试试',
    lookupOr: '或',
    commonCommands: '常用命令',
    hotkeys: '快捷键',
    helpFooter: '打开完整面板 · 退格键关闭',
    commandDescs: {
      '/help': '命令与快捷键的完整列表',
      '/clear': '开始新会话',
      '/resume': '恢复之前的会话',
      '/details': '控制对话记录的详细程度',
      '/copy': '复制所选内容或最后一条助手消息',
      '/quit': '退出 hermes'
    },
    hotkeyDescs: {
      'composer.mention': '引用文件、文件夹、URL、git',
      'composer.slash': '斜杠命令面板',
      'composer.help': '此快速帮助 (删除以关闭)',
      'composer.sendNewline': '发送 · Shift+Enter 换行',
      'composer.sendQueued': '发送下一条排队的回合',
      'keybinds.openPanel': '所有键盘快捷键',
      'composer.cancel': '关闭弹窗 · 取消运行',
      'composer.history': '循环弹窗 / 历史'
    },
    attachUrlTitle: '附加 URL',
    attachUrlDesc: 'Hermes 将抓取该页面并作为本回合的上下文。',
    urlPlaceholder: 'https://example.com/post',
    urlHintPre: '请包含完整 URL，例如 ',
    attach: '附加',
    queued: count => `${count} 条排队`,
    attachmentOnly: '仅附件回合',
    emptyTurn: '空回合',
    attachments: count => `${count} 个附件`,
    editingInComposer: '正在输入框中编辑',
    editingQueuedInComposer: '正在输入框中编辑排队回合',
    queueEdit: '编辑',
    queueSendNext: '下一个',
    queueSend: '发送',
    queueDelete: '删除',
    queueStuckTitle: '排队消息未发送',
    queueStuckBody: '排队的对话多次发送失败。它仍在队列中，请重试发送。',
    previewUnavailable: '预览不可用',
    previewLabel: label => `预览 ${label}`,
    couldNotPreview: label => `无法预览 ${label}`,
    removeAttachment: label => `移除 ${label}`,
    dictating: '听写中',
    preparingAudio: '正在准备音频',
    speakingResponse: '正在朗读回复',
    readingAloud: '朗读中',
    themeSuggestions: '桌面主题建议',
    noMatchingThemes: '没有匹配的主题。',
    themeTryPre: '试试 ',
    themeTryPost: '。',
    attachLabel: '附加',
    files: '文件…',
    folder: '文件夹…',
    images: '图片…',
    pasteImage: '粘贴图片',
    url: 'URL…',
    promptSnippets: '提示词片段…',
    tipPre: '提示：输入 ',
    tipPost: ' 以内联引用文件。',
    snippetsTitle: '提示词片段',
    snippetsDesc: '选择一个起始提示词放入输入框。',
    dropFiles: '拖放文件以附加',
    dropSession: '拖放以链接此对话',
    snippets: {
      codeReview: {
        label: '代码审查',
        description: '审查当前更改是否存在回归、遗漏的边界情况和缺失的测试。',
        text: '请审查这部分是否存在缺陷、回归和缺失的测试。'
      },
      implementationPlan: {
        label: '实现计划',
        description: '在动代码之前先勾勒方案，让 diff 保持聚焦。',
        text: '请在修改代码前制定一个简洁的实现计划。'
      },
      explainThis: {
        label: '解释这段',
        description: '讲解所选代码的工作方式，并链接到关键文件。',
        text: '请解释这是如何工作的，并指给我关键文件。'
      }
    }
  },

  statusStack: {
    agents: '代理',
    background: count => `${count} 个后台任务`,
    subagents: count => `${count} 个子代理`,
    todos: (done, total) => `任务 ${done}/${total}`,
    running: '运行中',
    stop: '停止',
    dismiss: '关闭',
    exit: code => `退出码 ${code}`
  },

  updates: {
    stages: {
      idle: '准备中…',
      prepare: '准备中…',
      fetch: '下载中…',
      pull: '马上完成…',
      pydeps: '收尾中…',
      update: '正在更新 Hermes…',
      rebuild: '正在重新构建桌面应用…',
      restart: '正在重启 Hermes…',
      done: '更新完成',
      manual: '从终端更新',
      guiSkew: '请更新桌面应用',
      error: '更新已暂停'
    },
    checking: '正在检查更新…',
    checkFailedTitle: '无法检查更新',
    tryAgain: '重试',
    notAvailableTitle: '更新不可用',
    unsupportedMessage: '此版本的 Hermes 无法在应用内自行更新。',
    connectionRetry: '请检查网络连接后重试。',
    latestBody: '你正在运行最新版本。',
    latestBodyBackend: '后端正在运行最新版本。',
    allSetTitle: '已是最新',
    availableTitle: '有可用更新',
    availableBody: '新版 Hermes 已可安装。',
    availableTitleBackend: '后端有可用更新',
    availableBodyBackend: '已连接的 Hermes 后端有新版本可安装。',
    availableBodyNoChangelog: '已有新版本可用。此安装方式无法显示更新日志。',
    updateNow: '立即更新',
    maybeLater: '稍后再说',
    moreChanges: count => `另有 ${count} 项更改。`,
    manualTitle: '从终端更新',
    manualBody: '你是从命令行安装的 Hermes，因此更新也需要在那里运行。请将此命令粘贴到终端：',
    manualPickedUp: '下次启动 Hermes 时会使用新版本。',
    guiSkewTitle: '请更新桌面应用',
    guiSkewBody: '后端已更新，但此桌面应用包未更改。请更新或重新安装 Hermes 桌面应用（你的 AppImage / .deb / .rpm）以保持一致。',
    copy: '复制',
    copied: '已复制',
    done: '完成',
    applyingBody: 'Hermes 更新器会在自己的窗口中接管，并在完成后自动重新打开 Hermes。更新期间请不要自行重新打开 Hermes。',
    applyingBodyBackend: '远程后端正在应用更新并将重启。恢复后 Hermes 会自动重新连接。',
    applyingClose: '此窗口会在更新期间关闭，随后 Hermes 会自动重新打开。',
    errorTitle: '更新未完成',
    errorBody: '没有数据丢失。你可以现在重试。',
    notNow: '暂不',
    applyStatus: {
      preparing: '正在更新后端…',
      pulling: '后端更新中…',
      restarting: '后端正在重启以加载更新…',
      notAvailable: '此后端无法更新。',
      failed: '后端更新失败。',
      noReturn: '后端未恢复在线。更新可能未完成——请检查后端主机。'
    }
  },

  install: {
    stageStates: {
      pending: '等待中',
      running: '安装中',
      succeeded: '完成',
      skipped: '已跳过',
      failed: '失败'
    },
    oneTimeTitle: 'Hermes 需要一次性安装',
    unsupportedDesc: platform =>
      `${platform} 暂不支持自动首次启动安装。请打开终端并运行下面的命令，然后重新启动此应用。之后启动会跳过此步骤。`,
    installCommand: '安装命令',
    copyCommand: '复制命令',
    viewDocs: '查看安装文档',
    installTo: '将安装到',
    retryAfterRun: '我已运行 -- 重试',
    failedTitle: '安装失败',
    settingUpTitle: '正在设置 Hermes Agent',
    finishingTitle: '正在收尾',
    failedDesc:
      '某个安装步骤失败。在 Windows 上，如果另一个 Hermes CLI 或桌面实例正在运行，可能会出现这种情况。请停止正在运行的 Hermes 实例后重试。可查看下面的详情或 desktop 日志中的完整记录。',
    activeDesc: '这是一次性设置。Hermes 安装器正在下载依赖并配置你的机器。之后启动会跳过此步骤。',
    progress: (completed, total) => `${completed}/${total} 个步骤已完成`,
    currentStage: stage => ` -- 当前：${stage}`,
    fetchingManifest: '正在获取安装器 manifest...',
    error: '错误',
    hideOutput: '隐藏安装器输出',
    showOutput: '显示安装器输出',
    lines: count => `${count} 行`,
    noOutput: '暂无输出。',
    cancelling: '取消中...',
    cancelInstall: '取消安装',
    transcriptSaved: '完整记录已保存到',
    copiedOutput: '已复制！',
    copyOutput: '复制输出',
    reloadRetry: '重新加载并重试'
  },

  onboarding: {
    headerTitle: '开始设置 Hermes Agent',
    headerDesc: '连接模型提供方即可开始对话。大多数选项只需一次点击。',
    preparingInstall: 'Hermes 正在完成安装。首次运行通常不到一分钟。',
    starting: '正在启动 Hermes…',
    lookingUpProviders: '正在查找提供方...',
    collapse: '收起',
    otherProviders: '其他提供方',
    haveApiKey: '我有 API 密钥',
    chooseLater: '稍后再选择提供方',
    recommended: '推荐',
    connected: '已连接',
    featuredPitch: '一个订阅，300+ 前沿模型 — 运行 Hermes 的推荐方式',
    openRouterPitch: '一个密钥，数百个模型 — 稳妥的默认选择',
    apiKeyOptions: {
      openrouter: { short: '一个密钥，多个模型', description: '用一个密钥访问数百个模型。适合新安装的默认选择。' },
      openai: { short: 'GPT 级模型', description: '直接访问 OpenAI 模型。' },
      gemini: { short: 'Gemini 模型', description: '直接访问 Google Gemini 模型。' },
      xai: { short: 'Grok 模型', description: '直接访问 xAI Grok 模型。' },
      local: {
        short: '自托管',
        description: '将 Hermes 指向本地或自托管的 OpenAI 兼容端点 (vLLM、llama.cpp、Ollama 等)。'
      }
    },
    backToSignIn: '返回登录',
    getKey: '获取密钥',
    replaceCurrent: '替换当前值',
    pasteApiKey: '粘贴 API 密钥',
    localApiKeyPlaceholder: 'API 密钥（可选 — 仅当端点需要时填写）',
    couldNotSave: '无法保存凭据。',
    connecting: '连接中',
    update: '更新',
    flowSubtitles: {
      pkce: '打开浏览器登录，然后回到这里继续',
      device_code: '在浏览器中打开验证页面 — Hermes 会自动连接',
      loopback: '打开浏览器登录 — Hermes 会自动连接',
      external: '先在终端登录一次，然后回来继续对话'
    },
    startingSignIn: provider => `正在为 ${provider} 启动登录...`,
    verifyingCode: provider => `正在通过 ${provider} 验证你的代码...`,
    connectedProvider: provider => `${provider} 已连接`,
    connectedPicking: provider => `${provider} 已连接。正在选择默认模型...`,
    signInFailed: '登录失败，请重试。',
    pickDifferentProvider: '选择其他提供方',
    signInWith: provider => `使用 ${provider} 登录`,
    openedBrowser: provider => `已在浏览器中打开 ${provider}。`,
    authorizeThere: '请在那里授权 Hermes。',
    copyAuthCode: '复制授权码并粘贴到下面。',
    pasteAuthCode: '粘贴授权码',
    reopenAuthPage: '重新打开授权页面',
    autoBrowser: provider => `已在浏览器中打开 ${provider}。请在那里授权 Hermes，连接会自动完成，无需复制或粘贴。`,
    reopenSignInPage: '重新打开登录页面',
    waitingAuthorize: '等待你授权...',
    externalPending: provider => `${provider} 通过自己的 CLI 登录。请在终端运行此命令，然后回来选择“我已登录”：`,
    signedIn: '我已登录',
    deviceCodeOpened: provider => `已在浏览器中打开 ${provider}。请在那里输入此代码：`,
    reopenVerification: '重新打开验证页面',
    copy: '复制',
    defaultModel: '默认模型',
    freeTier: '免费层',
    pro: 'Pro',
    free: '免费',
    price: (input, output) => `${input} 输入 / ${output} 输出每 Mtok`,
    change: '更改',
    startChatting: '开始',
    docs: provider => `${provider} 文档`
  },

  modelPicker: {
    title: '切换模型',
    current: '当前：',
    unknown: '(未知)',
    search: '筛选提供方和模型...',
    noModels: '未找到模型。',
    addProvider: '添加提供方',
    loadFailed: '无法加载模型',
    noAuthenticatedProviders: '没有已认证的提供方。',
    pro: 'Pro',
    proNeedsSubscription: 'Pro 模型需要付费 Nous 订阅。',
    free: '免费',
    freeTier: '免费层',
    priceTitle: '每百万 token 的输入/输出价格'
  },

  modelVisibility: {
    title: '模型',
    search: '搜索模型',
    noAuthenticatedProviders: '没有已认证的提供方。',
    addProvider: '添加提供方…'
  },

  shell: {
    windowControls: '窗口控件',
    paneControls: '面板控件',
    appControls: '应用控件',
    modelMenu: {
      search: '搜索模型',
      noModels: '未找到模型',
      editModels: '编辑模型…',
      refreshModels: '刷新模型',
      fast: '快速',
      medium: '中'
    },
    modelOptions: {
      noOptions: '此模型没有可用选项',
      options: '选项',
      thinking: '思考',
      fast: '快速',
      effort: '推理强度',
      minimal: '最小',
      low: '低',
      medium: '中',
      high: '高',
      max: '最高',
      updateFailed: '模型选项更新失败',
      fastFailed: '快速模式更新失败'
    },
    gatewayMenu: {
      gateway: '网关',
      connected: '已连接',
      connecting: '连接中',
      offline: '离线',
      inferenceReady: '推理已就绪',
      inferenceNotReady: '推理未就绪',
      checkingInference: '正在检查推理',
      disconnected: '已断开',
      openSystem: '打开系统面板',
      connection: label => `连接：${label}`,
      recentActivity: '最近活动',
      viewAllLogs: '查看全部日志 →',
      messagingPlatforms: '消息平台'
    },
    statusbar: {
      unknown: '未知',
      restart: '重启',
      update: '更新',
      updateInProgress: '正在更新',
      commitsBehind: (count, branch) => `落后 ${branch} ${count} 个提交`,
      desktopVersion: version => `Hermes Desktop v${version}`,
      backendVersion: version => `后端 v${version}`,
      clientLabel: version => `客户端 v${version}`,
      backendLabel: version => `后端 v${version}`,
      commit: sha => `提交 ${sha}`,
      branch: branch => `分支 ${branch}`,
      closeCommandCenter: '关闭命令中心',
      openCommandCenter: '打开命令中心',
      showTerminal: '显示终端',
      hideTerminal: '隐藏终端',
      gateway: '网关',
      gatewayReady: '就绪',
      gatewayNeedsSetup: '需要设置',
      gatewayChecking: '检查中',
      gatewayConnecting: '连接中',
      gatewayOffline: '离线',
      gatewayRestarting: '重启中…',
      gatewayTitle: 'Hermes 推理网关状态',
      agents: '代理',
      closeAgents: '关闭代理',
      openAgents: '打开代理',
      subagents: count => `${count} 个子代理`,
      failed: count => `${count} 个失败`,
      running: count => `${count} 个运行中`,
      cron: '排程',
      openCron: '打开排程任务',
      turnRunning: '运行中',
      currentTurnElapsed: '当前回合已用时间',
      contextUsage: '上下文用量',
      session: '会话',
      runtimeSessionElapsed: '运行时会话已用时间',
      yoloOn: 'YOLO 已开启 - 自动批准危险命令。点击关闭。Shift+点击可全局切换。',
      yoloOff: 'YOLO 已关闭 - 点击自动批准危险命令。Shift+点击可全局切换。',
      modelNone: '无',
      noModel: '无模型',
      switchModel: '切换模型',
      openModelPicker: '打开模型选择器',
      modelTitle: (provider, model) => `模型 · ${provider}: ${model}`,
      providerModelTitle: (provider, model) => `${provider} · ${model}`
    }
  },

  rightSidebar: {
    aria: '右侧边栏',
    panelsAria: '右侧边栏面板',
    files: '文件系统',
    terminal: '终端',
    noFolderSelected: '未选择文件夹',
    changeCwdTitle: '更改工作目录',
    remotePickerTitle: '选择远程文件夹',
    remotePickerDescription: '浏览已连接后端上的文件夹。',
    remotePickerSelect: '选择文件夹',
    folderTip: cwd => `${cwd} — 点击更改文件夹`,
    openFolder: '打开文件夹',
    refreshTree: '刷新文件树',
    collapseAll: '折叠所有文件夹',
    previewUnavailable: '预览不可用',
    couldNotPreview: path => `无法预览 ${path}`,
    noProjectTitle: '没有项目',
    noProjectBody: '从状态栏设置工作目录后即可浏览文件。',
    unreadableTitle: '无法读取',
    unreadableBody: error => `无法读取此文件夹 (${error})。`,
    emptyTitle: '空文件夹',
    emptyBody: '此文件夹为空。',
    treeErrorTitle: '文件树错误',
    treeErrorBody: '文件树渲染此文件夹时出错。',
    tryAgain: '重试',
    loadingTree: '正在加载文件树',
    loadingFiles: '正在加载文件',
    terminalHide: '隐藏终端',
    addToChat: '添加到对话'
  },

  preview: {
    tab: '预览',
    closeTab: label => `关闭 ${label}`,
    closePane: '关闭预览面板',
    loading: '正在加载预览',
    unavailable: '预览不可用',
    opening: '正在打开...',
    hide: '隐藏',
    openPreview: '打开预览',
    openInBrowser: '在浏览器中打开',
    sourceLineTitle: '点击选择 · shift 点击扩展 · 拖到输入框',
    source: '源码',
    renderedPreview: '预览',
    unknownSize: '大小未知',
    binaryTitle: '这看起来像二进制文件',
    binaryBody: label => `预览 ${label} 可能会显示不可读文本。`,
    largeTitle: '此文件较大',
    largeBody: (label, size) => `${label} 大小为 ${size}。Hermes 只会显示前 512 KB。`,
    previewAnyway: '仍然预览',
    truncated: '显示前 512 KB。',
    noInlineTitle: '没有内联预览',
    noInlineBody: mimeType => `${mimeType || '此文件类型'} 仍可作为上下文附件。`,
    console: {
      deselect: '取消选择条目',
      select: '选择条目',
      copyFailed: '无法复制控制台输出',
      copyEntry: '复制此条目',
      sendEntry: '将此条目发送到对话',
      messages: count => `${count} 条控制台消息`,
      resize: '调整预览控制台大小',
      title: '预览控制台',
      selected: count => `已选择 ${count} 条`,
      sendToChat: '发送到对话',
      copySelected: '复制所选到剪贴板',
      copyAll: '全部复制到剪贴板',
      copy: '复制',
      clear: '清除',
      empty: '暂无控制台消息。',
      promptHeader: '预览控制台：',
      sentTitle: '已发送到对话',
      sentMessage: count => `已将 ${count} 条日志添加到输入框`
    },
    web: {
      appFailedToBoot: '预览应用启动失败',
      serverNotFound: '未找到服务器',
      failedToLoad: '预览加载失败',
      tryAgain: '重试',
      restarting: 'Hermes 正在重启...',
      askRestart: '让 Hermes 重启服务器',
      lookingRestart: taskId => `Hermes 正在查找要重启的预览服务器 (${taskId})`,
      restartingTitle: '正在重启预览服务器',
      restartingMessage: 'Hermes 正在后台工作。可在预览控制台查看进度。',
      startRestartFailed: message => `无法启动服务器重启：${message}`,
      restartFailed: '服务器重启失败',
      hideConsole: '隐藏预览控制台',
      showConsole: '显示预览控制台',
      hideDevTools: '隐藏预览 DevTools',
      openDevTools: '打开预览 DevTools',
      finishedRestarting: message => `Hermes 已完成预览服务器重启${message ? `: ${message}` : ''}`,
      failedRestarting: message => `服务器重启失败：${message}`,
      unknownError: '未知错误',
      restartedTitle: '预览服务器已重启',
      reloadingNow: '正在重新加载预览。',
      restartFailedTitle: '预览重启失败',
      restartFailedMessage: 'Hermes 无法重启服务器。',
      stillWorking: 'Hermes 仍在工作，但还没有收到重启结果。服务器命令可能正在前台运行。',
      workspaceReloading: '工作区已变更，正在重新加载预览',
      fileChanged: url => `文件已变更，正在重新加载预览：${url}`,
      filesChanged: (count, url) => `${count} 个文件变更，正在重新加载预览：${url}`,
      watchFailed: message => `无法监听预览文件：${message}`,
      moduleMimeDescription:
        '模块脚本使用了错误的 MIME 类型。这通常表示静态文件服务器正在服务 Vite/React 应用，而不是项目开发服务器。',
      loadFailedConsole: (code, message) => `加载失败${code ? ` (${code})` : ''}: ${message}`,
      unreachableDescription: '无法访问预览页面。',
      openTarget: url => `打开 ${url}`,
      fallbackTitle: '预览'
    }
  },

  assistant: {
    thread: {
      loadingSession: '正在加载会话',
      showEarlier: '显示更早的消息',
      loadingResponse: 'Hermes 正在加载回复',
      thinking: '思考中',
      today: time => `今天，${time}`,
      yesterday: time => `昨天，${time}`,
      copy: '复制',
      refresh: '刷新',
      moreActions: '更多操作',
      branchNewChat: '在新对话中分支',
      dismissError: '关闭错误',
      readAloudFailed: '朗读失败',
      preparingAudio: '正在准备音频...',
      stopReading: '停止朗读',
      readAloud: '朗读',
      editMessage: '编辑消息',
      scrollToBottom: '滚动到底部',
      stop: '停止',
      restorePrevious: '恢复上一个检查点',
      restoreCheckpoint: '恢复检查点',
      restoreFromHere: '恢复检查点 — 从此提示重新运行',
      restoreTitle: '恢复到此检查点？',
      restoreBody: '此提示之后的所有消息将从对话中移除，并从此处重新运行该提示。',
      restoreConfirm: '恢复并重新运行',
      restoreNext: '恢复下一个检查点',
      goForward: '前进',
      sendEdited: '发送编辑后的消息',
      attachingFile: '正在附加…'
    },
    approval: {
      gatewayDisconnected: 'Hermes 网关未连接',
      sendFailed: '无法发送审批响应',
      run: '运行',
      command: '命令',
      moreOptions: '更多审批选项',
      allowSession: '允许本会话',
      alwaysAllowMenu: '始终允许…',
      jumpToApproval: '需要审批',
      reject: '拒绝',
      alwaysTitle: '始终允许此命令？',
      alwaysDescription: pattern =>
        `这会将“${pattern}”模式加入永久允许列表 (~/.hermes/config.yaml)。Hermes 对类似命令将不再询问，包括当前会话和未来会话。`,
      alwaysAllow: '始终允许'
    },
    clarify: {
      notReady: '澄清请求尚未就绪',
      gatewayDisconnected: 'Hermes 网关未连接',
      sendFailed: '无法发送澄清响应',
      loadingQuestion: '正在加载问题…',
      other: '其他 (输入你的答案)',
      placeholder: '输入你的答案…',
      shortcutSuffix: ' 发送',
      back: '返回',
      skip: '跳过',
      send: '发送'
    },
    tool: {
      code: '代码',
      copyCode: '复制代码',
      renderingImage: '正在渲染图片',
      copyOutput: '复制输出',
      copyCommand: '复制命令',
      copyContent: '复制内容',
      copyUrl: '复制 URL',
      copyResults: '复制结果',
      copyQuery: '复制查询',
      copyFile: '复制文件',
      copyPath: '复制路径',
      outputAlt: '工具输出',
      rawResponse: '原始响应',
      copyActivity: '复制活动',
      recoveredOne: '在 1 个失败步骤后已恢复',
      recoveredMany: count => `在 ${count} 个失败步骤后已恢复`,
      failedOne: '1 个步骤失败',
      failedMany: count => `${count} 个步骤失败`,
      statusRunning: '运行中',
      statusError: '错误',
      statusRecovered: '已恢复',
      statusDone: '完成'
    }
  },

  prompts: {
    gatewayDisconnected: 'Hermes 网关未连接',
    sudoSendFailed: '无法发送 sudo 密码',
    secretSendFailed: '无法发送密钥',
    sudoTitle: '管理员密码',
    sudoDesc: 'Hermes 需要你的 sudo 密码来运行特权命令。它只会发送给你的本地 agent。',
    sudoPlaceholder: 'sudo 密码',
    secretTitle: '需要密钥',
    secretDesc: 'Hermes 需要一个凭据才能继续。',
    secretPlaceholder: '密钥值'
  },

  desktop: {
    audioReadFailed: '无法读取录制的音频',
    sessionUnavailable: '会话不可用',
    createSessionFailed: '无法创建新会话',
    promptFailed: '提示词发送失败',
    providerCredentialRequired: '发送第一条消息前请先添加提供方凭据。',
    emptySlashCommand: '空 slash 命令',
    desktopCommands: '桌面端命令',
    skillCommandsAvailable: count => `${count} 个技能命令可用。`,
    warningLine: message => `警告：${message}`,
    yoloArmed: '此对话已启用 YOLO',
    yoloOff: 'YOLO 已关闭',
    yoloSystem: active => `此会话 YOLO ${active ? '已开启' : '已关闭'}`,
    yoloTitle: 'YOLO',
    yoloToggleFailed: '无法切换 YOLO',
    profileStatus: current => `配置档案：${current}。使用 /profile <name> 或“新建会话”选择器在其他配置档案中开始对话。`,
    unknownProfile: '未知配置档案',
    noProfileNamed: (target, available) => `没有名为“${target}”的配置档案。可用：${available}`,
    newChatsProfile: name => `新对话将使用配置档案 ${name}。`,
    setProfileFailed: '设置配置档案失败',
    sttDisabled: '设置中已禁用语音转文字。',
    stopFailed: '停止失败',
    regenerateFailed: '重新生成失败',
    editFailed: '编辑失败',
    resumeFailed: '恢复失败',
    resumeStrandedTitle: '无法加载此会话',
    resumeStrandedBody: '与此会话的连接失败，自动重试已停止。请确认网关正在运行，然后重试。',
    resumeRetry: '重试',
    nothingToBranch: '没有可分支的内容',
    branchNeedsChat: '分支前请先开始或恢复一个对话。',
    sessionBusy: '会话忙碌中',
    branchStopCurrent: '分支此对话前请先停止当前回合。',
    branchNoText: '此消息没有可用于分支的文本。',
    branchTitle: '分支',
    branchFailed: '分支失败',
    deleteFailed: '删除失败',
    archived: '已归档',
    archiveFailed: '归档失败',
    cwdChangeFailed: '工作目录更改失败',
    cwdStagedTitle: '工作目录已暂存',
    cwdStagedMessage: '重启桌面后端后，工作目录更改才会应用到当前活跃会话。',
    modelSwitchFailed: '模型切换失败',
    sessionExported: '会话已导出',
    sessionExportFailed: '无法导出会话',
    imageSaved: '图片已保存',
    downloadStarted: '下载已开始',
    restartToUseSaveImage: '重启 Hermes 桌面版后可使用保存图片。',
    restartToSaveImages: '重启 Hermes 桌面版以保存图片',
    imageDownloadFailed: '图片下载失败',
    openImage: '打开图片',
    downloadImage: '下载图片',
    savingImage: '正在保存图片',
    imagePreviewFailed: '图片预览失败',
    imageAttach: '附加图片',
    imageWriteFailed: '无法将图片写入磁盘。',
    imageAttachFailed: '附加图片失败',
    attachImages: '附加图片',
    clipboard: '剪贴板',
    noClipboardImage: '剪贴板中没有图片',
    clipboardPasteFailed: '粘贴剪贴板失败',
    dropFiles: '拖放文件',
    handoff: {
      pickPlatform: '选择目标平台',
      success: platform => `已移交到 ${platform}。随时可在此处恢复。`,
      systemNote: platform => `↻ 已移交到 ${platform} — 随时可在此处恢复。`,
      failed: error => `移交失败：${error}`,
      timedOut: '等待网关超时。`hermes gateway` 是否正在运行？'
    }
  },

  errors: {
    genericFailure: '发生错误',
    boundaryTitle: '界面出错了',
    boundaryDesc: '此视图遇到意外错误。你的对话和设置是安全的。',
    reloadWindow: '重新加载窗口',
    openLogs: '打开日志'
  },

  ui: {
    search: {
      clear: '清除搜索'
    },
    pagination: {
      label: '分页',
      previous: '上一页',
      previousAria: '前往上一页',
      next: '下一页',
      nextAria: '前往下一页'
    },
    sidebar: {
      title: '侧边栏',
      description: '显示移动端侧边栏。',
      toggle: '切换侧边栏'
    }
  }
}
