import type { TranslationSchema } from "./types.js";

export const zhCN: TranslationSchema = {
  common: {
    error: "错误",
    warning: "警告",
    loading: "加载中...",
    done: "完成",
    cancel: "取消",
    confirm: "确认",
    back: "返回",
    next: "下一步",
    tool: "工具",
    running: "运行中",
    noTurns: "(暂无对话)",
  },
  cli: {
    description: "Carbon Code — 中文优先的 DeepSeek 终端代码智能体。",
    continue: "恢复最近使用的聊天会话，不显示选择器。",
    setup: "交互式向导 — API 密钥、预设、MCP 服务器。随时重新运行以重新配置。",
    code: "代码编辑聊天 — 以 <dir>（默认：cwd）为根的文件系统工具，编码系统提示词，deepseek-v4-flash 基线。",
    chat: "具有实时缓存/成本面板的交互式 Ink TUI。",
    run: "以非交互方式运行单个任务，流式输出。",
    stats: "显示使用情况仪表板。",
    doctor: "一键健康检查。",
    commit: "从暂存的差异中起草提交消息。",
    sessions: "列出保存的聊天会话，或按名称检查。",
    pruneSessions: "删除空闲 ≥N 天的已保存会话（默认 90）。使用 --dry-run 预览。",
    events: "美化打印内核事件日志侧边文件。",
    replay: "交互式 Ink TUI，用于浏览转录稿。",
    diff: "在分栏 Ink TUI 中比较两个转录稿。",
    mcp: "模型上下文协议 (MCP) 助手 — 发现服务器，测试您的设置。",
    version: "打印 Carbon Code 版本。",
    update: "检查较新版本的 Carbon Code 并安装。",
    index: "构建（或增量刷新）本地语义搜索索引。",
  },
  stats: {
    usageHint:
      "运行 `carboncode chat`、`carboncode code` 或 `carboncode run <task>` — 每次对话都会记录",
    usageDetail: "每次对话在日志中追加一行，`carboncode stats` 会将其汇总统计。",
  },
  run: {
    missingApiKey:
      "未设置 DEEPSEEK_API_KEY 且标准输入不是 TTY（无法交互式输入）。\n" +
      "请设置环境变量，或先运行 `carboncode chat` 交互一次以保存密钥。\n",
  },
  sessions: {
    emptyHint:
      "暂无已保存的会话 — 运行 `carboncode chat`（会话会自动保存，除非使用了 --no-session）。",
  },
  ui: {
    welcome: "随时运行 `carboncode` 开始聊天 — 您的设置将被记住。",
    taglineChat: "终端代码智能体",
    taglineCode: "终端代码智能体",
    taglineSub: "读取仓库、编辑文件、运行验证",
    startSessionHint: "输入任务开始",
    inputPlaceholder: "输入任何内容... (输入 / 使用命令, @ 引用文件)",
    busy: "思考中...",
    thinking: "▸ 思考中...",
    activityWaitingForModel: "等待模型…",
    activityThinking: "思考中…",
    activityProcessing: "处理中…",
    undo: "撤消",
    undoHint: "在 5 秒内按 u 撤消",
    applied: "已应用",
    rejected: "已拒绝",
    noDashboard: "禁止自动启动嵌入式 Web 仪表板。",
    openDashboardHint:
      "服务就绪后立即在默认浏览器中打开仪表板地址。设置了 --no-dashboard 时不生效。",
    dashboardPortHint:
      "将仪表板绑定到固定端口 (1–65535)。重启后保持稳定 — SSH 隧道访问必需。默认为临时端口。",
    dashboardPortInvalid:
      "▲ 忽略 --dashboard-port={value} (必须为 1–65535 之间的整数) — 回退到临时端口",
    dashboardAutoStartFailed:
      "▲ 仪表板自动启动失败 ({reason}) — 尝试 /dashboard，或传递 --no-dashboard 以静默",
    systemAppendHint: "追加指令到代码系统提示词。不替换默认提示词 — 在其后添加。",
    systemAppendFileHint:
      "追加文件内容到代码系统提示词。不替换默认提示词。UTF-8，相对于 cwd 或绝对路径。",
    resumedSession:
      '▸ 已恢复会话 "{name}"，包含 {count} 条历史消息 · /new 重新开始 · /sessions 管理',
    newSession: '▸ 会话 "{name}" (新) — 随聊随存 · /sessions 重命名或删除',
    ephemeralSession: "▸ 临时聊天 (不保存会话) — 去掉 --no-session 以启用保存",
    restoredEdits:
      "▸ 从中断的运行中恢复了 {count} 个待处理的编辑块 — /apply 提交或 /discard 放弃。",
    resumedPlan: "已恢复计划 · {when}{summary}",
    tipEditBindings: {
      topic: "编辑门控快捷键",
      sections: [
        {
          rows: [
            { key: "y / n", text: "接受或放弃待处理的编辑" },
            { key: "Shift+Tab", text: "切换 预览 ↔ 自动（持久化；自动模式立即应用）" },
            { key: "u", text: "撤销上次自动应用的批处理（5 秒横幅内）" },
          ],
        },
      ],
      footer: "当前模式显示在底部状态栏 · /keys 查看完整快捷键参考",
    },
    tipMouseClipboard: {
      topic: "鼠标 + 剪贴板",
      sections: [
        {
          rows: [
            { key: "拖动", text: "直接选中文本 — 终端原生，不需要按 Shift" },
            {
              key: "右键",
              text: "终端原生菜单（Windows Terminal 等的复制 / 粘贴）",
            },
            { key: "滚轮", text: "滚动聊天记录（Web / 云端 / SSH 终端也能用）" },
            {
              key: "↑ / ↓",
              text: "滚动聊天 · 输入框历史 + 多行光标用 Ctrl+P / Ctrl+N",
            },
          ],
        },
      ],
      footer: "运行 /keys 查看完整键盘 + 鼠标参考",
    },
    keysReference: {
      topic: "Carbon Code 键盘 + 鼠标参考",
      sections: [
        {
          title: "键盘",
          rows: [
            { key: "Enter", text: "提交输入" },
            { key: "Shift+Enter", text: "在输入框中插入换行" },
            { key: "↑ / ↓", text: "滚动聊天记录（鼠标滚轮也走这条路径）" },
            {
              key: "Ctrl+P / Ctrl+N",
              text: "上一条 / 下一条输入历史 · 多行草稿中按行移动光标",
            },
            { key: "Ctrl+A / Ctrl+E", text: "跳到当前行的开头 / 结尾" },
            { key: "Ctrl+W", text: "删除光标前的一个词" },
            { key: "Ctrl+U", text: "清空整个输入缓冲区" },
            { key: "Tab", text: "补全 @-mention · 进入文件夹 · 接受 slash 命令" },
            { key: "Shift+Tab", text: "编辑门控：切换 预览 ↔ 自动 模式" },
            { key: "Esc", text: "关闭弹出选择器 · 中止当前模型回合" },
            { key: "Ctrl+C", text: "中止当前模型回合（不是复制 — 见剪贴板段）" },
            { key: "PgUp / PgDn", text: "整页滚动聊天记录" },
            { key: "End", text: "跳到聊天的最新一行" },
          ],
        },
        {
          title: "鼠标",
          rows: [
            { key: "滚轮", text: "滚动聊天记录（Web / 云端 / SSH 终端也能用）" },
            { key: "拖动", text: "原生选中文本 — 直接复制，不需要修饰键" },
            { key: "右键", text: "终端原生（Windows Terminal 等的粘贴菜单）" },
          ],
        },
        {
          title: "复制 / 粘贴",
          rows: [
            { key: "选中文字", text: "直接拖动 — 终端原生（不需要任何修饰键）" },
            {
              key: "/copy",
              text: "vim/tmux 风格复制模式 — SSH / mosh / tmux 下拖选越过可视区无效时用这个",
            },
            {
              key: "复制",
              text: "Ctrl+Shift+C（Win/Linux）· Cmd+C（macOS）— 或选中即复制（看终端设置）",
            },
            { key: "粘贴", text: "Ctrl+V 或 Ctrl+Shift+V（Win/Linux）· Cmd+V（macOS）" },
            {
              key: "bracketed paste",
              text: "多行粘贴整体进入 — 中间换行不会触发提交",
            },
          ],
        },
        {
          title: "编辑门控（仅 code 模式）",
          rows: [
            { key: "y / n", text: "在预览模态中接受或放弃待处理的编辑" },
            { key: "Shift+Tab", text: "切换 预览 ↔ 自动（持久化）" },
            { key: "u", text: "撤销上次自动应用的批处理（5 秒横幅内）" },
          ],
        },
      ],
      footer:
        "通过 DECSET 1007（alternate-scroll），终端把滚轮翻译成 ↑/↓ 发给应用 — 大多数终端（含 Web / 云端 / SSH）都能滚，且不影响终端原生选区。直接拖动选中文本无需 Shift。传入 --no-mouse 可关闭。",
    },
    tipShownOnce: "仅显示一次",
    modelOverride: "覆盖默认模型",
    noSession: "禁用本次运行的会话持久化",
    resumeHint: "强制恢复指定会话（即使空闲）",
    newHint: "强制创建新会话（忽略 --session / --continue）",
    transcriptHint: "JSONL 转录稿的写入路径",
    budgetHint: "会话美元上限 — 80% 时警告，100% 时拒绝下一轮",
    modelIdHint: "DeepSeek 模型 ID（例如 deepseek-v4-flash）",
    systemPromptHint: "覆盖默认系统提示词",
    presetHint: "模型组合 — auto|flash|pro",
    sessionNameHint: "会话名称（默认：'default'）",
    ephemeralHint: "禁用本次运行的会话持久化",
    mcpSpecHint: "MCP 服务器规格（可重复）",
    mcpPrefixHint: "用此字符串为 MCP 工具名添加前缀",
    noConfigHint: "本次运行忽略 ~/.carboncode/config.json",
    presetHintShort: "模型组合 — auto|flash|pro",
    budgetHintShort: "会话美元上限",
    transcriptHintShort: "JSONL 转录稿路径",
    mcpSpecHintShort: "MCP 服务器规格（可重复）",
    mcpPrefixHintShort: "MCP 工具名前缀",
    dryRunHint: "显示将要安装的内容但不实际安装",
    rebuildHint: "从头重建索引",
    embedModelHint: "嵌入模型名称",
    projectDirHint: "项目根目录",
    ollamaUrlHint: "Ollama 服务器 URL",
    skipPromptsHint: "跳过确认提示",
    verboseHint: "显示完整的会话元数据",
    pruneDaysHint: "删除空闲此天数或更多的会话（默认 90）",
    pruneDryRunHint: "列出将要删除的内容但不实际删除",
    eventTypeHint: "按事件类型过滤",
    eventSinceHint: "从此事件 ID 开始",
    eventTailHint: "仅显示最后 N 个事件",
    jsonHint: "以 JSON 格式输出",
    projectionHint: "显示每个事件的投影状态",
    printHint: "打印到标准输出而非 TUI",
    headHint: "仅显示前 N 个事件",
    tailHint: "仅显示最后 N 个事件",
    mdReportHint: "将 markdown 差异报告写入此路径",
    printHintTable: "打印表格到标准输出",
    tuiHint: "打开交互式 TUI",
    labelAHint: "左侧面板的标签",
    labelBHint: "右侧面板的标签",
    mcpListDescription: "浏览 MCP 注册表（官方 → Smithery 第三方目录 → 本地备选）",
    mcpInspectDescription: "检查 MCP 服务器规格（工具、资源、提示）",
    mcpSearchDescription: "在 MCP 注册表中搜索匹配的服务器",
    mcpInstallDescription: "按名称安装 MCP 服务器（将其规格写入配置）",
    mcpBrowseDescription: "交互式市场浏览器 — 输入过滤、回车安装",
    mcpLocalHint: "只显示内置的离线目录",
    mcpRefreshHint: "忽略 24 小时缓存，强制刷新",
    mcpLimitHint: "最多显示多少条",
    mcpPagesHint: "一次性预加载多少页（默认 1）",
    mcpAllHint: "加载全部页（首次较慢）",
    mcpMaxPagesHint: "搜索时最多走多少页（默认 20）",
    jsonHintCatalog: "以 JSON 格式输出",
    jsonHintReport: "以 JSON 格式输出检查报告",
    modelOverrideFlash: "覆盖模型（默认：deepseek-v4-flash）",
    skipConfirmHint: "跳过确认提示",
    yoloHint: "自动批准本次调用的计划检查点（等同于 editMode=yolo，但不修改配置文件）",
    ruleSummaryLabel: "规则",
  },
  code: {
    workspaceConflict:
      "⚠ 工作区包含另一个智能体平台的文件 ({platforms})。Carbon Code 可能会将其作为项目内容读取；如果不是您想要的，请使用 --dir <your-project> 重新启动。\n",
    systemAppendEmpty: "--system-append 为空 — 不会追加任何提示文本\n",
    systemAppendFileReadError: '错误：无法读取 --system-append-file "{filePath}"：{errorDetails}\n',
  },
  slash: {
    help: { description: "显示完整命令参考" },
    copy: {
      description: "进入 vim/tmux 风格复制模式 — j/k 移动、v 起选区、y 复制到剪贴板",
    },
    status: { description: "当前模型、标志、上下文、会话" },
    preset: {
      description: "模型组合 — 自动在 flash → pro 之间切换，或锁定 flash/pro",
      argsHint: "<auto|flash|pro>",
    },
    model: { description: "切换 DeepSeek 模型 ID", argsHint: "<id>" },
    models: { description: "列出从 DeepSeek /models 获取的可用模型" },
    theme: {
      description: "显示或持久化终端主题偏好。无参数时打开选择器。",
      argsHint: "[auto|default|dark|light|tokyo-night|github-dark|github-light|high-contrast]",
    },
    language: {
      description: "切换运行时语言",
      argsHint: "<en|zh-CN>",
      success: "语言已切换为简体中文。",
      unsupported: "不支持的语言代码：{code}。支持的语言：{supported}。",
    },
    pro: {
      description: "仅为下一轮启用 v4-pro（一次性 · 自动解除）",
      argsHint: "[off]",
    },
    budget: {
      description: "会话美元上限 — 80% 时警告，100% 时拒绝下一轮。默认关闭。单独 /budget 显示状态",
      argsHint: "[usd|off]",
    },
    mcp: { description: "列出附加到此会话的 MCP 服务器 + 工具" },
    resource: {
      description: "浏览 + 读取 MCP 资源（无参数 → 列出 URI；<uri> → 获取内容）",
      argsHint: "[uri]",
    },
    prompt: {
      description: "浏览 + 获取 MCP 提示（无参数 → 列出名称；<name> → 渲染提示）",
      argsHint: "[name]",
    },
    memory: {
      description: "显示 / 管理固定记忆（CARBON.md + ~/.carboncode/CARBON.md）",
      argsHint: "[list|show <name>|forget <name>|clear <scope> confirm]",
    },
    skill: {
      description: "列出 / 运行用户技能（项目 + 自定义 + 全局 + 内置）",
      argsHint: "[list|paths|show <name>|<name> [args]]",
    },
    hooks: {
      description: "列出活跃的 hooks（.carboncode/ 下的 settings.json）· reload 从磁盘重新读取",
      argsHint: "[reload]",
    },
    permissions: {
      description: "显示 / 编辑 shell 允许列表（内置只读 · 项目级：~/.carboncode/config.json）",
      argsHint: "[list|add <prefix>|remove <prefix|N>|clear confirm]",
    },
    dashboard: {
      description: "启动嵌入式 Web 仪表板（127.0.0.1，token 保护）",
      argsHint: "[stop]",
    },
    update: { description: "显示当前版本与最新版本及升级命令" },
    stats: {
      description: "跨会话成本仪表板（今日 / 本周 / 本月 / 全部 · 缓存命中 · 与 Claude 对比）",
    },
    cost: {
      description: "空 → 上一轮花费（使用卡片）；带文本 → 估算发送成本（最坏情况 + 可能缓存命中）",
      argsHint: "[text]",
    },
    doctor: {
      description: "健康检查（api / config / api-reach / index / hooks / project）",
    },
    context: { description: "显示上下文窗口分解（系统 / 工具 / 日志 / 输入）" },
    retry: { description: "截断并重发您的最后一条消息（重新采样）" },
    compact: {
      description: "缩小日志中过大的工具结果和工具调用参数；上限为 tokens，默认 4000",
      argsHint: "[tokens]",
    },
    keys: { description: "键盘 + 鼠标 + 复制粘贴参考" },
    cwd: {
      description:
        "切换工作区根目录 — 重新指向文件/Shell/记忆工具，重载项目 hooks，刷新 @ 引用遍历器",
      argsHint: "[path]",
    },
    stop: { description: "中止当前模型回合（按 Esc 的替代方式）" },
    feedback: { description: "打开 GitHub Issue，诊断信息已复制到剪贴板" },
    plans: { description: "列出此会话的活跃 + 归档计划（最新在前）" },
    replay: {
      description: "加载归档计划为只读的时间旅行快照（默认：最新）",
      argsHint: "[N]",
    },
    sessions: { description: "列出已保存的会话（当前标记为 ▸）" },
    title: { description: "让模型根据当前对话重命名此会话" },
    qq: {
      description: "连接、查看或断开当前会话的 QQ 通道",
      argsHint: "[connect [appId appSecret [sandbox]]|status|disconnect]",
    },
    setup: { description: "提醒您退出并运行 `carboncode setup`" },
    semantic: {
      description: "显示 semantic_search 状态 — 已构建？Ollama 已安装？如何启用",
    },
    clear: { description: "仅清除可见的滚动回放（日志/上下文保留）" },
    new: { description: "开始全新对话（清除上下文 + 滚动回放）" },
    loop: {
      description: "每 <interval> 自动重新提交 <prompt>，直到您输入 / Esc / /loop stop",
      argsHint: "<5s..6h> <prompt>  ·  stop  ·  （无参数 = 状态）",
    },
    exit: { description: "退出 TUI" },
    init: {
      description:
        "扫描项目并合成基线 CARBON.md（模型写入；使用 /apply 审查）。`force` 覆盖已有文件。",
      argsHint: "[force]",
    },
    apply: {
      description:
        "将待处理的编辑块提交到磁盘（无参数 → 全部；`1`、`1,3` 或 `1-4` → 该子集，其余保持待处理）",
      argsHint: "[N|N,M|N-M]",
    },
    discard: {
      description: "丢弃待处理的编辑块而不写入（无参数 → 全部；索引 → 该子集）",
      argsHint: "[N|N,M|N-M]",
    },
    walk: {
      description: "逐块逐步处理待处理的编辑（git-add-p 风格：每块 y/n，a 应用剩余，A 切换 AUTO）",
    },
    undo: { description: "回滚最后应用的编辑批处理" },
    history: {
      description: "列出此会话的每个编辑批处理（用于 /show 的 ID，撤消标记）",
    },
    show: {
      description: "转储存储的编辑差异（省略 id 时为最新未撤消的）",
      argsHint: "[id]",
    },
    commit: { description: "git add -A && git commit -m ...", argsHint: '"msg"' },
    checkpoint: {
      description: "快照会话涉及的每个文件（Cursor 风格内部存储，非 git）。单独 /checkpoint 列出。",
      argsHint: "[name|list|forget <id>]",
    },
    restore: {
      description: "将文件回滚到命名的检查点（见 /checkpoint list）",
      argsHint: "<name|id>",
    },
    plan: {
      description: "切换只读计划模式（写入被弹回直到 submit_plan + 审批）",
      argsHint: "[on|off]",
    },
    mode: {
      description:
        "编辑门控：review（排队）· auto（应用+撤消）· yolo（应用+自动 shell）。Shift+Tab 循环。",
      argsHint: "[review|auto|yolo]",
    },
    jobs: { description: "列出 run_background 启动的后台作业" },
    kill: {
      description: "按 ID 停止后台作业（SIGTERM → 宽限期后 SIGKILL）",
      argsHint: "<id>",
    },
    logs: {
      description: "跟踪后台作业的输出（默认最后 80 行）",
      argsHint: "<id> [lines]",
    },
    btw: {
      description: "顺便问一下 — 从空白上下文回答，不写入会话历史",
      argsHint: "<question>",
    },
    "search-engine": {
      description:
        "切换网络搜索后端 — mojeek（默认，无依赖）、searxng（自托管）或 metaso（每日 100 次免费额度）",
      argsHint: "<mojeek|searxng|metaso> [<endpoint>]",
    },
  },
  wizard: {
    languageTitle: "选择语言",
    languageSubtitle: "已根据系统语言自动选中。之后可用 /language 切换。",
    languageDetectedHint: "（已检测）",
    welcomeTitle: "欢迎使用 Carbon Code。",
    apiKeyPrompt: "粘贴你的 DeepSeek API key 开始使用。",
    apiKeyGetOne: "在此获取：https://platform.deepseek.com/api_keys",
    apiKeySavedLocally: "保存在本地：{path}",
    apiKeyInputLabel: "key › ",
    apiKeyInvalid: "key 长度不足——请粘贴完整 token（16+ 字符，不含空格）。",
    apiKeyChecking: "正在检查 API key…",
    apiKeyRejected: "DeepSeek 拒绝了这个 API key。请粘贴有效 key，或按 Esc 取消设置。",
    apiKeyCheckFailed: "暂时无法验证 API key（{message}）。请检查网络后重试。",
    apiKeyPreview: "预览：{redacted}",
    themeTitle: "选择主题",
    themeSubtitle: "方向键切换时即时预览效果，之后可用 /theme 更改。",
    themeSampleHeading: "示例",
    themeFooter: "[↑↓] 移动 · [Enter] 确认 · [Esc] 取消",
    themeCaption: {
      default: "GitHub 深色（默认）",
      dark: "深色调",
      light: "清爽浅色",
      "tokyo-night": "东京夜色",
      "github-dark": "GitHub 深色",
      "github-light": "GitHub 浅色",
      "high-contrast": "高对比度（无障碍）",
    },
    presetDescriptions: {
      auto: {
        headline: "困难轮次从 flash 升级到 pro",
        cost: "默认 · 大多数轮次使用 flash · 需要时才启用 pro",
      },
      flash: {
        headline: "始终使用 v4-flash",
        cost: "最便宜 · 可预测 · 仍可用 /pro 临时提升一轮",
      },
      pro: {
        headline: "始终使用 v4-pro",
        cost: "约 3 倍 flash（5/31 折扣）/ 原价约 12 倍 · 适合困难的多轮工作",
      },
    },
    mcpCatalog: {
      filesystem: {
        summary: "在沙箱目录内读取、写入和搜索文件",
        note: "该目录是严格沙箱 — 服务器会拒绝访问目录外的路径",
      },
      memory: {
        summary: "跨会话保存持久化键值记忆",
      },
      github: {
        summary: "读取 issues、PR 和代码搜索（需要 GITHUB_PERSONAL_ACCESS_TOKEN）",
        note: "启动前请在环境变量中设置 GITHUB_PERSONAL_ACCESS_TOKEN",
      },
      puppeteer: {
        summary: "浏览器自动化 — 截图、点击、输入",
        note: "首次运行会下载 Chromium（约 200 MB）",
      },
      everything: {
        summary: "官方测试服务器 — 覆盖所有 MCP 功能",
        note: "适合调试 Carbon Code 设置",
      },
    },
    reviewLabelTheme: "主题",
    presetTitle: "选择预设",
    mcpTitle: "Carbon Code 要为你接入哪些 MCP 服务器？",
    mcpUserArgsHint: "（需要你提供 {arg}）",
    mcpFooterMulti: "[↑↓] 移动  ·  [空格] 选择  ·  [Enter] 确认  ·  [Esc] 取消  ·  全不选 = 跳过",
    mcpArgsTitle: "配置 {name}",
    mcpArgsDirMissing: "目录 {path} 不存在。",
    mcpArgsDirCreateHint: "[Y/Enter] 创建（mkdir -p）· [N/Esc] 输入其他路径",
    mcpArgsDirCreateFailed: "无法创建 {path}：{message}",
    mcpArgsRequiredParam: "必填参数：",
    mcpArgsEmpty: "{name} 需要一个值 — 不能为空。",
    mcpArgsNotADir: "{path} 存在但不是目录。",
    mcpArgsFilesystemPlaceholder: "例如：/tmp/carboncode-sandbox",
    mcpArgsSqlitePlaceholder: "例如：./notes.sqlite",
    mcpArgsFilesystemSummary: "在沙盒目录内读写和搜索文件",
    mcpArgsFilesystemNote: "该目录是严格沙盒，服务器会拒绝访问目录外的内容",
    reviewTitle: "确认保存",
    reviewLabelApiKey: "API key",
    reviewLabelLanguage: "语言",
    reviewLabelPreset: "预设",
    reviewLabelMcp: "MCP",
    reviewMcpNone: "（无）",
    reviewMcpServers: "{count} 个服务器",
    reviewSavesTo: "保存到 {path}",
    reviewSaveError: "保存配置失败：{message}",
    reviewFooter: "[Enter] 保存 · [Esc] 取消",
    savedTitle: "▸ 已保存。",
    savedFooter: "[Enter] 退出",
    selectFooter: "[↑↓] 移动 · [Enter] 确认 · [Esc] 取消",
    stepCounter: "步骤 {step}/{total} · ",
    exitHint: "/exit 中止",
    apiKeyPlaceholder: "sk-...",
    themeSampleReasoning: "推理中",
  },
  themePicker: {
    header: "选择主题",
    footer: "↑↓ 选择 · ⏎ 确认 · Esc 取消",
    currentPref: "当前偏好",
    activeNow: "当前生效",
    autoDesc: "使用 CARBONCODE_THEME 或默认主题",
    autoLabel: "自动",
    defaultLabel: "默认",
    darkLabel: "深色",
    lightLabel: "浅色",
    tokyoNightLabel: "东京夜色",
    githubDarkLabel: "GitHub 深色",
    githubLightLabel: "GitHub 浅色",
    highContrastLabel: "高对比度",
  },
  planFlow: {
    approveCardTitle: "确认计划",
    approveCardMetaRight: "等待中",
    openQuestionsBanner:
      "▲ 计划中标记了待确认的问题或风险 —— 请选 {refine} 给出明确答案，再让模型继续。",
    openQuestionsHeader: "待确认 / 风险",
    truncatedBodyMore: "… 还有 {n} 行在上方滚动历史中",
    truncatedBodyMorePlural: "… 还有 {n} 行在上方滚动历史中",
    picker: {
      accept: "采纳",
      acceptHint: "立即按顺序执行",
      refine: "细化",
      refineHint: "给模型更多指引，重新出一版计划",
      revise: "改写",
      reviseHint: "在执行前就地编辑计划（跳过 / 重排步骤）",
      reject: "驳回",
      rejectHint: "丢弃，让模型从头再来",
    },
    refineFooter: "⏎ 发送  ·  esc 返回选项",
    refineQuestionsHeading: "回答以下问题，或直接说明你想要的修改：",
    modes: {
      approve: {
        title: "采纳 —— 还有补充指示吗？",
        hint: "回答计划中的问题、补充约束，或直接回车按现状采纳。",
        blankHint: "（留空回车 = 不附加指示直接采纳。）",
      },
      refine: {
        title: "细化 —— 模型应该改什么？",
        hint: "说明问题在哪、缺什么，或者回答计划提出的疑问。",
        blankHint: "（留空回车 = 让模型对所有待确认问题选用安全默认。）",
      },
      reject: {
        title: "驳回 —— 告诉模型原因（可选）",
        hint: "说明模型对你的目标理解错在哪里，或你真正想要什么。",
        blankHint: "（留空回车 = 不解释直接取消；模型会反过来问你想要什么。）",
      },
      "checkpoint-revise": {
        title: "改写 —— 下一步前要调整什么？",
        hint: "范围调整、跳过步骤、换个思路 —— 模型会据此修改剩余步骤。",
        blankHint: "（留空回车 = 按当前计划继续。）",
      },
      "choice-custom": {
        title: "自定义回答 —— 想说什么都行",
        hint: "自由文本。模型会原样读取并继续 —— 不必匹配候选项。",
        blankHint: "（留空回车 = 让模型反过来问你想要什么。）",
      },
    },
    checkpoint: {
      title: "检查点 —— 当前步骤已完成",
      continue: "继续 —— 执行下一步",
      continueHint: "模型从下一步继续。",
      revise: "调整 —— 在下一步前给反馈",
      reviseHint: "先暂停，输入指引；模型会调整剩余计划。",
      stop: "停止 —— 在此结束计划",
      stopHint: "模型总结已完成的工作并结束。",
    },
    stepList: {
      counter: "{total} 个步骤",
      counterSingular: "{total} 个步骤",
      counterDone: "{done}/{total} 已完成（{pct}%） · 共 {total} 步",
      counterDoneSingular: "{done}/{total} 已完成（{pct}%） · 共 {total} 步",
    },
    noPlanSummary: "尚未提交计划内容。",
    detailCollapsedHint: "Ctrl+P 展开完整计划详情。",
    detailExpandedHint: "Ctrl+P 收起详情。",
    detailHeader: "计划详情",
    detailWindow: "显示第 {start}-{end} 行，共 {total} 行",
    detailScrollHint: "PgUp/PgDn 滚动详情 · Home/End 跳转",
    reviseTitle: "修改计划",
    reviseSteps: "{count} 个步骤",
    reviseFooter:
      "\u2191\u2193 焦点  \u00b7  空格切换跳过  \u00b7  k/j 移动  \u00b7  \u23ce 确认  \u00b7  Esc 取消",
    riskMed: " 中",
    riskHigh: " 高",
    completeMsg:
      "\u25b8 \u8ba1\u5212\u5b8c\u6210 \u2014 \u5168\u90e8 {total} \u4e2a\u6b65\u9aa4\u5df2\u5b8c\u6210 \u00b7 \u5df2\u5f52\u6863",
  },
  app: {
    walkCancelledRemaining: "▸ 浏览已取消 — 还有 {count} 个待处理编辑块。",
    walkCancelled: "▸ 浏览已取消。",
    turnInterrupted: "▸ 本轮已中断 — 输入后续内容可继续。",
    editModeYolo:
      "▸ 编辑模式：YOLO — 编辑和 shell 命令都自动执行。/undo 仍可撤销编辑。请谨慎使用。",
    editModeAuto:
      "▸ 编辑模式：AUTO — 编辑立即应用；5 秒内按 u 撤销（空格暂停计时）。shell 命令仍会询问。",
    editModeReview: "▸ 编辑模式：review — 编辑入队待 /apply（或 y）/ /discard（或 n）",
    rejectedEdit: "▸ 拒绝了对 {path} 的编辑{context}",
    autoApprovingRest: "▸ 本轮剩余编辑自动批准",
    flippedAutoSession: "▸ 已切换到 AUTO 模式（本会话剩余生效，已持久化）",
    flippedAutoWalk: "▸ 已切换到 AUTO 模式 — 后续编辑立即应用。浏览模式退出。",
    dashboardStopped: "▸ 仪表板已停止。",
    notedMemory: "▸ 已记录（{scope}）— {verb} {path}",
    notedScopeProject: "项目",
    notedScopeGlobal: "全局",
    notedVerbCreated: "创建",
    notedVerbAppended: "追加到",
    memoryWriteFailed: "# 记忆写入失败",
    commandFailed: "! 命令失败",
    btwUsage: "▸ /btw <问题> — 顺便问个题外话，不会写入当前会话上下文。",
    btwHeader: "≫ btw",
    btwFailed: "/btw 调用失败",
    restoreCodeOnly: "▸ /restore 仅在代码模式可用",
    hookUserPromptSubmit: "UserPromptSubmit 钩子",
    hookStop: "Stop 钩子",
    atMentions: "▸ @mentions：{parts}",
    atUrl: "▸ @url：{parts}",
    atUrlFailed: "@url 展开失败",
    sessionTitleNoSession: "▸ 当前没有启用持久化会话，无法重命名。",
    sessionTitleNoContent: "▸ 当前对话内容还不够，暂时无法命名会话。",
    sessionTitleNoTitle: "▸ 模型没有返回可用的会话标题。",
    sessionTitleUpdated: '▸ 会话标题已更新："{title}"',
    sessionTitleRenameFailed: '▸ 无法按标题 "{title}" 重命名会话。',
    sessionTitleRenamed: '▸ 会话已重命名为 "{name}" — {title}',
    sessionTitleAutoRenamed: '▸ 已自动命名会话 "{name}" — {title}',
    workspaceSwitched: "▸ 工作区已切换到 {root}",
    semanticRepointed: "▸ semantic_search 已指向 {root}",
    semanticDisabledForRoot: "▸ semantic_search 已禁用（{root} 没有兼容索引）",
    semanticRebootstrapFailed: "▸ semantic_search 重新初始化失败：{reason}",
    denied: "▸ 已拒绝：{cmd}{context}",
    alwaysAllowed: '▸ 已对 {dir} 永久允许 "{prefix}"',
    runningCommand: "▸ 正在执行：{cmd}",
    startingBackground: "▸ 后台启动：{cmd}",
    checkpointSaved: "⛁ 已保存检查点 · {id} · {count} 个文件 · /restore {id} 可回滚此步",
    continuingAfter: "▸ 在 {label}{counter} 之后继续",
    planStoppedAt: "▸ 计划在 {label}{counter} 处停止",
    revisingAfter: "▸ 在 {label} 之后修订 — {feedback}",
    historyScrollHint: " ↑ 正在查看历史 · End / PgDn 返回底部 · ↓ 向下滚动一行",
  },
  hooks: {
    head: "钩子 {tag} `{cmd}` {decision}{truncTag}",
    headWithDetail: "钩子 {tag} `{cmd}` {decision}{truncTag}：{detail}",
    truncated: "（输出在 256KB 处截断）",
    decisionBlock: "拦截",
    decisionWarn: "告警",
    decisionTimeout: "超时",
    decisionError: "错误",
  },
  summary: {
    status: "正在总结已收集的内容…",
    hallucinatedFallback:
      "（模型生成了伪造的工具调用标记而非纯文本总结 — 试试 /retry 换个更窄的问题，或 /think 查看 R1 的推理）",
    failedAfterReason:
      "{label}，且回退的总结调用也失败：{message}。请运行 /clear 后用更窄的问题重试，或提高 --max-tool-iters。",
  },
  loop: {
    budgetExhausted:
      "会话预算已用完 — 已花费 ${spent} ≥ 上限 ${cap}。用 /budget <usd> 提高上限，/budget off 清除上限，或结束会话。",
    budget80Pct: "▲ 预算已用 80% — ${spent} / ${cap}。下一两轮可能就触顶。",
    proArmed: "⇧ /pro 已装备 — 本轮使用 deepseek-v4-pro（一次性 · 本轮后自动解除）",
    abortedAtIter: "在第 {iter} 次工具调用处中断 — 未生成总结即停止（按 ↑ + Enter 或 /retry 恢复）",
    toolUploadStatus: "工具结果已上传 · 模型在生成下一条响应前思考中…",
    preflightTruncateStatus: "预检：上下文接近上限，正在裁剪最早历史…",
    preflightTruncated:
      "预检：请求约 {estimate}/{ctxMax} tokens（{pct}%）— 已裁剪 {beforeMessages} 条消息 → {afterMessages}。发送中。",
    preflightTruncatedStillFull:
      "预检：裁剪 {beforeMessages} 条消息 → {afterMessages} 后，请求仍约 {estimate}/{ctxMax} tokens（{pct}%）— DeepSeek 大概率会返回 400。请运行 /clear 或 /new 重新开始。",
    preflightNoFold:
      "预检：请求约 {estimate}/{ctxMax} tokens（{pct}%）且没有可裁剪的内容 — DeepSeek 大概率会返回 400。请运行 /clear 或 /new 重新开始。",
    flashEscalation: "⇧ flash 请求升级 — 本轮改用 {model}{reasonSuffix}",
    harvestStatus: "正在从推理过程提取计划状态…",
    repeatToolCallWarning: "拦截到重复工具调用 — 让模型察觉问题并换种方式重试。",
    stormStuck:
      "已停止卡死的重试循环 — 模型在自纠提示后仍以相同参数重复调用同一工具。请尝试 /retry、换种说法，或排查底层阻塞。",
    stormSuppressed: "已抑制 {count} 次重复工具调用 — 同一名称 + 参数触发 3 次以上。",
    compactingHistoryStatus: "正在压缩历史{aggressiveTag}…",
    aggressiveTag: "（激进）",
    foldedHistory:
      "上下文 {before}/{ctxMax}（{pct}%）— 已折叠 {beforeMessages} 条消息 → {afterMessages}（总结 {summaryChars} 字）。继续。",
    aggressivelyFoldedHistory:
      "上下文 {before}/{ctxMax}（{pct}%）— 已激进折叠 {beforeMessages} 条消息 → {afterMessages}（总结 {summaryChars} 字）。继续。",
    forcingSummary:
      "上下文 {before}/{ctxMax}（{pct}%）— 基于已收集到的内容强制总结。请运行 /compact、/clear 或 /new 重置。",
  },
  errors: {
    contextOverflow:
      "上下文溢出（DeepSeek 400）：会话历史已达 {requested}，超出模型 prompt 上限（V4：1M tokens；旧版 chat/reasoner：131k）。通常是单个工具结果太大。Carbon Code 默认将新工具结果限制在 8k tokens，并在会话加载时自动修复超大历史 — 重启常能清掉。如果仍然溢出，运行 /new 重新开始，或打开 /sessions 选中后按 [d] 删除该会话。",
    contextOverflowTooMany: "tokens 数量过多",
    auth401:
      "认证失败（DeepSeek 401）：{inner}。你的 API key 被拒绝。运行 `carboncode setup` 或 `export DEEPSEEK_API_KEY=sk-...` 修复。在 https://platform.deepseek.com/api_keys 获取 key。",
    balance402:
      "余额不足（DeepSeek 402）。请在 https://platform.deepseek.com/top_up 充值；充值到账后重新发送。",
    badparam422: "参数错误（DeepSeek 422）：{inner}",
    badrequest400: "请求错误（DeepSeek 400）：{inner}",
    deepseek5xxHead:
      "DeepSeek 服务不可用（{status}） — 这是 DeepSeek 服务端问题，不是 Carbon Code 故障。已按指数退避重试 4 次。",
    deepseek5xxReachable:
      " DeepSeek 主 API 健康检查通过，但 /chat/completions 在挂 — 他们那边部分服务异常。",
    deepseek5xxUnreachable:
      " 无法从你的网络访问 DeepSeek API — 可能是 DS 整体故障，也可能是本地网络问题。",
    deepseek5xxActionNetwork:
      " 建议：(1) 检查网络，(2) 等 30 秒后重试，(3) 查看状态页 https://status.deepseek.com。",
    deepseek5xxActionRetry:
      " 建议：(1) 等 30 秒后重试，(2) 用 /preset 切换模型，(3) 查看状态页 https://status.deepseek.com。",
    innerNoMessage: "（无错误信息）",
    reasonAborted: "[用户已中断（Esc） — 正在总结到目前为止的发现]",
    reasonContextGuard: "[上下文额度即将耗尽 — 在下一次调用溢出之前先总结]",
    reasonStuck: "[卡在重复的工具调用上 — 说明已尝试的方法以及阻塞点]",
    labelAborted: "用户中断",
    labelContextGuard: "触发上下文保护（prompt > 80% 窗口）",
    labelStuck: "卡死（重复工具调用被反风暴机制抑制）",
  },
  handlers: {
    basic: {
      newInfo: "▸ 新对话 — 已从上下文中丢弃 {count} 条消息。同一会话，全新开始。",
      newInfoArchived:
        "▸ 新对话 — 已从上下文中丢弃 {count} 条消息。原对话已归档为「{archived}」，可在 Sessions 面板查看。",
      newInfoSystemReloaded: " · 项目记忆已重新加载（下一轮一次性 cache miss）",
      helpTitle: "命令：",
      helpShellTitle: "Shell 快捷方式：",
      helpShell: "  !<cmd>                   在沙箱根目录运行 <cmd>；输出进入对话",
      helpShellDetail: "                             以便模型在下一轮看到。无允许列表限制。",
      helpShellConsent: "                             用户输入 = 明确同意。",
      helpShellExample: "                             示例：!git status   !ls src/   !npm test",
      helpMemoryTitle: "快速记忆：",
      helpMemoryPin: "  #<note>                  将 <note> 追加到 <project>/CARBON.md（可提交）。",
      helpMemoryPinEx: "                             示例：#findByEmail 必须区分大小写",
      helpMemoryGlobal:
        "  #g <note>                将 <note> 追加到 ~/.carboncode/CARBON.md（全局，不提交）。",
      helpMemoryGlobalEx: "                             示例：#g 始终使用 pnpm 而非 npm",
      helpMemoryPinBoth:
        "                             两者都固定到每个未来会话的前缀中。比 /memory 更快。",
      helpMemoryEscape: "                             使用 `\\#text` 发送字面量 `#text` 给模型。",
      helpFileTitle: "文件引用（代码模式）：",
      helpFile: "  @path/to/file            发送时将文件内容内联到 [Referenced files] 下。",
      helpFilePicker:
        "                             输入 `@` 打开选择器（↑↓ 导航，Tab/Enter 选择）。",
      helpUrlTitle: "URL 引用：",
      helpUrl: "  @https://example.com     获取 URL，剥离 HTML，内联到 [Referenced URLs] 下。",
      helpUrlCache: "                             同一会话中相同 URL 只获取一次（内存缓存）。",
      helpUrlPunct: "                             自动剥离尾部标点符号（./,/））。",
      helpPresetsTitle: "预设（branch + harvest 永远不会自动启用 — 仅手动选择）：",
      helpPresetAuto: "  auto   v4-flash → v4-pro 在困难轮次切换  ← 默认 · 简单时便宜，困难时智能",
      helpPresetFlash: "  flash  始终使用 v4-flash                  最便宜 · 每轮成本可预测",
      helpPresetPro:
        "  pro    始终使用 v4-pro                     约 3 倍 flash · 用于困难的多轮工作",
      helpSessionsTitle: "会话（默认自动启用，命名为 'default'）：",
      helpSessionCustom: "  carboncode chat --session <name>   使用不同的命名会话",
      helpSessionNone: "  carboncode chat --no-session       禁用本次运行的持久化",
      retryNone: "没有可重试的内容 — 此会话日志中没有先前的用户消息。",
      retryInfo: '▸ 重试中："{preview}"',
      loopTuiOnly: "/loop 仅在交互式 TUI 中可用（不在 run/replay 中）。",
      loopStopped: "▸ 循环已停止。",
      loopNoActive: "没有活动的循环可停止。",
      loopNoActiveHint:
        "没有活动的循环。使用 `/loop <interval> <prompt>` 启动一个（例如 /loop 30s npm test）。\n取消方式：/loop stop · Esc · /clear /new · 任何用户输入的提示。",
      loopStarted:
        '▸ 循环已启动 — 每 {duration} 重新提交 "{prompt}"。输入任何内容（或 /loop stop）取消。',
      keysNeedsTui: "/keys 需要 TUI 上下文（postKeys 已连接）。",
      unknownCommand: "未知命令：/{cmd} — 你是不是想用 {list}？",
      unknownCommandShort: "未知命令：/{cmd}  （试试 /help）",
    },
    sessions: {
      titleUnavailable: "/title 只能在已启用会话持久化的 TUI 会话中使用。",
      titleStarted: "▸ 正在命名会话…",
      titleFailed: "▸ 会话命名失败：{reason}",
    },
    theme: {
      saved: "主题已保存：{theme}\n下次启动时生效：{active}",
      unknownTheme: "未知主题：{theme}\n可用主题：{available}",
    },
    admin: {
      doctorNeedsTui: "/doctor 需要 TUI 上下文（postDoctor 已连接）。",
      doctorRunning: "⚕ 健康检查 — 正在运行…",
      hooksReloadUnavailable: "/hooks reload 在此上下文中不可用（无重载回调）。",
      hooksReloaded: "▸ 已重载 hooks · {count} 个活跃",
      hooksUsage:
        "用法：/hooks            列出活跃的 hooks\n       /hooks reload     重新读取 settings.json 文件",
      hooksNone: "未配置 hooks。",
      hooksDropHint: "将包含 `hooks` 键的 settings.json 放入以下任一位置：",
      hooksProject: "  · {path}（项目）",
      hooksProjectFallback: "  · <project>/.carboncode/settings.json（项目）",
      hooksGlobal: "  · {path}（全局）",
      hooksEvents: "事件：PreToolUse, PostToolUse, UserPromptSubmit, Stop",
      hooksExitCodes: "exit 0 = 通过 · exit 2 = 阻止（Pre*）· 其他 = 警告",
      hooksLoaded: "▸ 已加载 {count} 个 hook",
      hooksSources: "来源：project={project} · global={global}",
      updateCurrent: "当前：carboncode {version}",
      updateLatestPending: "最新：（尚未解析 — 后台检查进行中或离线）",
      updateRetryHint: "已触发新的注册表获取 — 几秒后重试 `/update`，",
      updateRetryHint2: "或在另一个终端运行 `carboncode update` 强制同步执行。",
      updateLatest: "最新：carboncode {version}",
      updateUpToDate: "您已是最新版本。无需操作。",
      updateNpxHint: "您正在通过 npx 运行 — 下次 `npx @carboncode/cli ...` 启动时将自动获取。",
      updateNpxForce: "要强制刷新：`npm cache clean --force`。",
      updateUpgradeHint: "要升级，请退出此会话并运行：",
      updateUpgradeCmd1: "  carboncode update           （交互式，支持 --dry-run 预览）",
      updateUpgradeCmd2: "  {command}   （直接安装）",
      updateInSessionDisabled: "会话内安装被刻意禁用 — 安装命令会",
      updateInSessionDisabled2: "破坏此 TUI 的渲染，且 Windows 可能锁定运行中的二进制文件。",
      statsNoData: "尚无使用数据。",
      statsEveryTurn: "您在此运行的每一轮都会追加一条记录 — 此会话的轮次",
      statsWillAppear: "将在您发送消息后显示在仪表板中。",
    },
    edits: {
      undoCodeOnly: "/undo 仅在 `carboncode code` 中可用 — 聊天模式不应用编辑。",
      historyCodeOnly: "/history 仅在 `carboncode code` 中可用。",
      showCodeOnly: "/show 仅在 `carboncode code` 中可用。",
      applyCodeOnly: "/apply 仅在 `carboncode code` 中可用（此处无内容可应用）。",
      discardCodeOnly: "/discard 仅在 `carboncode code` 中可用。",
      planCodeOnly: "/plan 仅在 `carboncode code` 中可用 — 聊天模式不限制工具写入。",
      planOn:
        "▸ 计划模式开启 — 写入工具被限制；模型必须先调用 `submit_plan` 才能执行任何操作。（模型也可以在计划模式关闭时自主调用 submit_plan 处理大型任务 — 此开关是更强的显式约束。）输入 /plan off 退出。",
      planOff: "▸ 计划模式关闭 — 写入工具再次可用。模型仍可为大型任务自主提出计划。",
      modeCodeOnly: "/mode 仅在 `carboncode code` 中可用。",
      modeUsage: "用法：/mode <review|auto|yolo>   （Shift+Tab 也可循环）",
      modeYolo:
        "▸ 编辑模式：YOLO — 编辑和 Shell 命令自动运行，无提示。/undo 仍可回滚编辑。请谨慎使用。",
      modeAuto:
        "▸ 编辑模式：AUTO — 编辑立即应用；在 5 秒内按 u 撤消，或稍后使用 /undo。Shell 命令仍会询问。",
      modeReview: "▸ 编辑模式：review — 编辑排队等待 /apply（或 y）/ /discard（或 n）",
      commitCodeOnly: "/commit 仅在 `carboncode code` 中可用（需要有根的 git 仓库）。",
      commitUsage: '用法：/commit "提交消息"  — 在 {root} 中运行 `git add -A && git commit -m "…"`',
      walkCodeOnly: "/walk 仅在 `carboncode code` 中可用。",
      checkpointCodeOnly: "/checkpoint 仅在 `carboncode code` 中可用 — 聊天模式不应用编辑。",
      checkpointNone:
        "尚无检查点 — `/checkpoint <name>` 快照会话涉及的每个文件。稍后使用 `/restore <name>` 恢复。",
      checkpointHeader: "◈ 检查点 · 已存储 {count} 个",
      checkpointRestoreHint:
        "  /restore <name|id> · /checkpoint forget <id> · /checkpoint <name> 添加",
      checkpointForgetUsage: "用法：/checkpoint forget <id|name>",
      checkpointNoMatch: '▸ 未找到匹配 "{name}" 的检查点 — 见 /checkpoint list',
      checkpointDeleted: "▸ 已删除检查点 {id}（{name}）",
      checkpointDeleteFailed: "▸ 删除 {id} 失败（已消失？）",
      checkpointSaveUsage: "用法：/checkpoint <name>   （或 /checkpoint list 查看现有）",
      checkpointSavedEmpty:
        '▸ 检查点 "{name}" 已保存（{id}）— 但尚未涉及任何文件，因此是空基线。此后的编辑将可撤消。',
      checkpointSaved:
        '▸ 检查点 "{name}" 已保存（{id}）— {files} 个文件，{size} KB。恢复：/restore {name}',
      restoreCodeOnly: "/restore 仅在 `carboncode code` 中可用。",
      restoreUsage: "用法：/restore <name|id>   （见 /checkpoint list 获取 ID）",
      restoreNoMatch: '▸ 未找到匹配 "{target}" 的检查点 — 尝试 /checkpoint list',
      restoreInfo: '▸ 已恢复 "{name}"（{id}），来自 {when}',
      restoreWrote: "  · 写回了 {count} 个文件",
      restoreRemoved: "  · 移除了 {count} 个文件（检查点时不存在）",
      restoreSkipped: "  ✗ 跳过了 {count} 个文件：",
      cwdCodeOnly: "/cwd 仅在 `carboncode code` 中可用。",
      cwdUsage:
        "用法：/cwd <path>   （当前根目录：{current}）。重新指向 filesystem / shell / memory 工具到 <path>。",
      cwdUsageNoCurrent: "用法：/cwd <path>   将工作区根目录切换到 <path>。",
    },
    model: {
      modelHint: "尝试 deepseek-v4-flash 或 deepseek-v4-pro — 运行 /models 获取实时列表",
      modelUsage: "用法：/model <id>   （{hint}）",
      modelNotInCatalog:
        "模型 → {id}   （⚠ 不在获取的目录中：{list}。如果这是错误的，下次调用将返回 400 — 运行 /models 刷新。）",
      modelSet: "模型 → {id}",
      presetAuto: "预设 → auto  （deepseek-v4-flash → deepseek-v4-pro 在困难轮次切换 · 默认）",
      presetFlash: "预设 → flash  （始终使用 deepseek-v4-flash · 最便宜 · /pro 仍可临时提升一轮）",
      presetPro: "预设 → pro  （始终使用 deepseek-v4-pro · 约 3 倍 flash · 用于困难的多轮工作）",
      presetUsage: "用法：/preset <auto|flash|pro>",
      proNothingArmed: "未启用 — /pro 不带参数将为下一轮启用 pro",
      proDisarmed: "▸ /pro 已解除 — 下一轮回退到当前预设",
      proUsage:
        "用法：/pro       为下一轮启用 pro（一次性，自动解除）\n       /pro off  在下一轮前取消启用状态",
      proArmed:
        "▸ /pro 已启用 — 您的下一条消息将在 {model} 上运行，无论预设如何。一轮后自动解除。使用 /preset max 进行持久切换。",
      budgetNoCap:
        "未设置会话预算 — Carbon Code 将持续运行直到您停止。使用以下方式设置：/budget <usd>   （例如 /budget 5）",
      budgetStatus: "预算：${spent} / ${cap}（{pct}%）· /budget off 清除，/budget <usd> 更改",
      budgetOff: "budget → 关闭（无上限）",
      budgetUsage:
        '用法：/budget <usd>   （收到 "{arg}" — 必须是正数，例如 /budget 5 或 /budget 12.50）',
      budgetExhausted:
        "▲ budget → ${cap} 但已花费 ${spent}。下一轮将被拒绝 — 提高上限以继续，或结束会话。",
      budgetSet:
        "budget → ${cap}  （迄今：${spent} · 80% 时警告，100% 时拒绝下一轮 · /budget off 清除）",
    },
    permissions: {
      mutateCodeOnly:
        "/permissions add / remove / clear 仅在 `carboncode code` 中可用 — 它们编辑项目范围的允许列表（`~/.carboncode/config.json` projects[<root>].shellAllowed）。",
      addUsage:
        '用法：/permissions add <prefix>   （多 token 可用：/permissions add "git push origin"）',
      addAlready: "▸ 已允许：{prefix}",
      addBuiltin: "▸ `{prefix}` 已在内置允许列表中 — 无需项目条目。（内置条目始终开启。）",
      addInfo: "▸ 已添加：{prefix}\n  → 在此项目中，下次 `{prefix}` 调用将无需提示。",
      removeUsage:
        "用法：/permissions remove <prefix-or-index>   （例如 /permissions remove 3，或 /permissions remove npm）",
      removeEmpty: "▸ 没有项目允许列表条目可移除。",
      removeIndexOob: "▸ 索引超出范围：{idx}（项目列表有 {count} 个条目）",
      removeNothing: "▸ 无内容可移除。",
      removeBuiltin:
        "▸ `{prefix}` 在内置允许列表中（只读）。内置条目无法在运行时移除 — 它们已编译到二进制文件中。",
      removeInfo: "▸ 已移除：{prefix}",
      removeNotFound: "▸ 无此项目条目：{prefix}   （尝试 /permissions list 查看已存储的内容）",
      clearAlready: "▸ 项目允许列表已为空。",
      clearConfirm:
        "即将丢弃 {root} 的 {count} 个项目允许列表条目。重新运行并附带 'confirm' 一词以继续：/permissions clear confirm",
      clearedNone: "▸ 项目允许列表已为空 — 无变化。",
      cleared: "▸ 已清除 {count} 个项目允许列表条目。",
      usage:
        '用法：/permissions [list]                   显示当前状态\n       /permissions add <prefix>            持久化（例如 "npm run build"）\n       /permissions remove <prefix-or-N>    删除一个条目\n       /permissions clear confirm           清除所有项目条目',
      modeYolo:
        "▸ 编辑模式：YOLO  — 每个 shell 命令自动运行，允许列表被绕过。/mode review 重新启用提示。",
      modeAuto:
        "▸ 编辑模式：auto  — 编辑自动应用，shell 仍受允许列表限制（或非允许列表的 ShellConfirm 提示）。",
      modeReview: "▸ 编辑模式：review — 编辑和非允许列表的 shell 命令在运行前都会询问。",
      projectHeader: "项目允许列表（{count}）— {root}",
      projectNone1: '  （无 — 在 ShellConfirm 提示中选择 "always allow" 添加一个，',
      projectNone2: "   或直接 `/permissions add <prefix>`。）",
      projectNoRoot: "项目允许列表 — （无项目根目录；聊天模式仅显示内置条目）",
      builtinHeader: "内置允许列表（{count}）— 只读，已编译",
      subcommands:
        "子命令：/permissions add <prefix> · /permissions remove <prefix-or-N> · /permissions clear confirm",
    },
    dashboard: {
      notAvailable: "/dashboard 在此上下文中不可用（无 startDashboard 回调）。",
      stopNoCallback: "/dashboard stop：无停止回调。",
      notRunning: "▸ 仪表板未运行。",
      stopping: "▸ 仪表板正在停止…",
      alreadyRunning: "▸ 仪表板已在运行：",
      alreadyRunningHint: "在任何浏览器中打开它。输入 `/dashboard stop` 关闭。",
      ready: "▸ 仪表板就绪：",
      readyHint: "仅 127.0.0.1 · token 保护。输入 `/dashboard stop` 关闭。",
      failed: "▸ 仪表板启动失败：{reason}",
      starting: "▸ 正在启动仪表板服务器…",
    },
    observability: {
      contextInfo: "上下文：~{total} / {max}（{pct}%）· 系统 {sys} · 工具 {tools} · 日志 {log}",
      compactStarting: "▸ 正在折叠旧轮次为摘要…",
      compactNoop: "▸ 无需折叠 — 日志已足够小，或最近轮次本身已超过预算。",
      compactDone: "▸ 已折叠 {before} 条消息 → {after}（摘要 {chars} 字符）。继续。",
      compactFailed: "▸ 折叠失败：{reason}",
      costNoTurn: "尚无轮次 — `/cost` 显示最近一轮的 token + 花费明细。",
      costNeedsTui: "/cost 需要 TUI 上下文（postUsage 已连接）。",
      costNoPricing: '▸ /cost：模型 "{model}" 无定价表。请在 telemetry/stats.ts 中添加。',
      costEstimate:
        "▸ /cost 估算 · {model} · {prompt} prompt tokens（系统 {sys} + 工具 {tools} + 日志 {log} + 消息 {msg}）",
      costWorstCase:
        "  最坏情况（完全未命中）：{input} 输入 + ~{output} 输出（{avg} 平均）≈ {total}",
      costLikely: "  可能（{pct}% 会话缓存命中）：{input} 输入 + ~{output} 输出 ≈ {total}",
      costLikelyCold: "  可能：在缓存填充前与最坏情况相同（无已完成的轮次）",
      statusModel: "  模型    {model}",
      statusFlags: "  标志    stream={stream} · effort={effort}",
      statusCtx: "  上下文  {bar} {used}/{max}（{pct}%）",
      statusCtxNone: "  上下文  尚无轮次",
      statusCost: "  成本    ${cost} · 缓存 {bar} {pct}% · 轮次 {turns}",
      statusCostCold: "  成本    ${cost} · 轮次 {turns}（缓存预热中）",
      statusBudget: "  预算    ${spent} / ${cap}（{pct}%）{tag}",
      statusSession: '  会话    "{name}" · 日志中 {count} 条消息（恢复了 {resumed} 条）',
      statusSessionEphemeral: "  会话    （临时 — 无持久化）",
      statusWorkspace: "  工作区  {path} · 启动时锁定（用 --dir <path> 重新启动以切换）",
      statusMcp: "  MCP     {servers} 个服务器，注册表中 {tools} 个工具",
      statusEdits: "  编辑    {count} 个待处理（/apply 提交，/discard 丢弃）",
      statusPlan: "  计划    开启 — 写入受限（submit_plan + 审批）",
      statusModeYolo:
        "  模式    YOLO — 编辑 + shell 自动运行，无提示（/undo 仍可回滚 · Shift+Tab 切换）",
      statusModeAuto: "  模式    AUTO — 编辑立即应用（5 秒内按 u 撤消 · Shift+Tab 切换）",
      statusModeReview: "  模式    review — 编辑排队等待 /apply 或 y（Shift+Tab 切换）",
      statusDash: "  仪表板  {url}（在浏览器中打开 · /dashboard stop）",
    },
    plans: {
      noSession: "未附加会话 — `/plans` 是按会话的。在项目中运行 `carboncode code` 以获取会话。",
      activePlan: "▸ 活跃计划{label} — {done}/{total} 步骤已完成 · 最后触及 {when}",
      activeNone: "▸ 活跃计划：（无）",
      noArchives: "此会话尚无归档计划 — 当每个步骤完成时自动归档",
      archivedHeader: "已归档（{count}）：",
      replayNoSession:
        "未附加会话 — `/replay` 是按会话的。在项目中运行 `carboncode code` 以获取会话。",
      replayNoArchives:
        "此会话尚无归档计划 — `/replay` 在计划完成后启用（每个步骤完成时自动归档）。",
      replayInvalidIndex:
        "无效索引 — `/replay` 接受 1..{max}（最新 = 1）。使用 `/plans` 查看列表。",
      archivedRow: "  ✓ {when}  {total}步 · {completion}  {label}",
      completionComplete: "已完成",
      stopAborted: "▸ 计划已停止 — 模型已中止；输入后续内容继续，或开始新任务。",
      doneUsage:
        "用法：/plans done <stepId>  ·  /plans done all — 模型忘记调用 mark_step_complete 时的手动兜底",
      doneUnavailable: "/plans done 仅在活跃会话内可用。",
      doneNoPlan: "当前无活跃计划 — 没有可标记的内容。",
      doneNotInPlan: "步骤 `{id}` 不在当前计划中。运行 /plans 查看步骤 id。",
      doneAlready: "步骤 `{id}` 已被标记为完成。",
      doneOk: "▸ 已将步骤 `{id}` 标记为完成。",
      doneAllNoop: "所有步骤均已完成。",
      doneAllOk: "▸ 已标记 {count} 个步骤为完成。",
    },
    jobs: {
      codeOnly: "/jobs 仅在 `carboncode code` 中可用。",
      killCodeOnly: "/kill 仅在 `carboncode code` 中可用。",
      logsCodeOnly: "/logs 仅在 `carboncode code` 中可用。",
      empty:
        "◈ 作业 · 0 运行中 · 共 0 个\n  （run_background 生成一个 — 开发服务器、监视器、长时间运行的脚本）",
      header: "◈ 作业 · {running} 运行中 · 共 {total} 个",
      footer: "  /logs <id> 跟踪 · /kill <id> SIGTERM → SIGKILL",
      killUsage: "用法：/kill <id>   （见 /jobs 获取 ID）",
      killNotFound: "作业 {id}：未找到",
      killAlreadyExited: "作业 {id} 已退出（{code}）",
      killStopping:
        "▸ 正在停止作业 {id}（树终止：SIGTERM → 2 秒宽限期后 SIGKILL；Windows：taskkill /T /F）",
      killStatus: "▸ 作业 {id} {status}",
      killStillAlive: "SIGKILL 后仍存活 (!) — 请将此作为 bug 报告",
      logsUsage: "用法：/logs <id> [lines]   （默认最后 80 行）",
      logsNotFound: "作业 {id}：未找到",
      logsStatus: "[作业 {id} · {status}]\n$ {command}",
      logsRunning: "运行中 · pid {pid}",
      logsExited: "已退出 {code}",
      logsFailed: "失败（{reason}）",
      logsStopped: "已停止",
    },
    memory: {
      disabled:
        "记忆已禁用（环境变量 CARBONCODE_MEMORY=off）。取消设置该变量以重新启用 — 此期间不会固定任何 CARBON.md、AGENTS.md 或 ~/.carboncode/memory 内容。",
      noRoot: "此会话无工作目录 — `/memory` 需要一个根目录来解析项目记忆。（在测试环境中运行？）",
      listEmpty:
        "尚无用户记忆。模型可以调用 `remember` 保存一个，或您可以在 ~/.carboncode/memory/global/ 或项目子目录中手动创建文件。",
      listHeader: "用户记忆（{count}）：",
      listFooter: "查看正文：/memory show <name>   删除：/memory forget <name>",
      showUsage: "用法：/memory show <name>  或  /memory show <scope>/<name>",
      showNotFound: "未找到记忆：{target}",
      showFailed: "显示失败：{reason}",
      forgetUsage: "用法：/memory forget <name>  或  /memory forget <scope>/<name>",
      forgetNotFound: "未找到记忆：{target}",
      forgetInfo: "▸ 已遗忘 {scope}/{name}。下次 /new 或启动时将不可见。",
      forgetFailed: "无法遗忘 {scope}/{name}（已消失？）",
      forgetError: "遗忘失败：{reason}",
      clearUsage: "用法：/memory clear <global|project> confirm",
      clearConfirm:
        "即将删除 scope={scope} 中的每个记忆。重新运行并附带 'confirm' 一词以继续：/memory clear {scope} confirm",
      cleared: "▸ 已清除 scope={scope} — 删除了 {count} 个记忆文件。",
      noMemory: "在 {root} 中未固定记忆。",
      layers: "可用的三个层级：",
      layerProject: "  1. {file} — 可提交的团队记忆（在仓库中）。",
      layerGlobal: "  2. ~/.carboncode/memory/global/ — 您的跨项目私有记忆。",
      layerProjectHash: "  3. ~/.carboncode/memory/<project-hash>/ — 此项目的私有记忆。",
      askModel: "让模型 `remember` 某些内容，或直接手编辑文件。",
      changesNote: "更改在下次 /new 或启动时生效 — 系统提示词每会话哈希一次以保持前缀缓存热度。",
      subcommands:
        "子命令：/memory list | /memory show <name> | /memory forget <name> | /memory clear <scope> confirm",
      changesNoteShort:
        "更改在下次 /new 或启动时生效。子命令：/memory list | show | forget | clear",
    },
    mcp: {
      noServers:
        '未附加 MCP 服务器。运行 `carboncode setup` 选择一些，或使用 --mcp "<spec>" 启动。`carboncode mcp list` 显示目录。',
      toolsLabel: "  工具     {count}",
      resourcesHint: "`/resource` 浏览+读取",
      promptsHint: "`/prompt` 浏览+获取",
      awarenessOnly: "聊天模式目前消耗工具；资源+提示在此展示供了解。",
      catalogHint: "完整目录：`carboncode mcp list` · 深度诊断：`carboncode mcp inspect <spec>`。",
      fallbackServers: "MCP 服务器（{count}）：",
      fallbackTools: "注册表中的工具（{count}）：",
      fallbackChange: "要更改此设置，请退出并运行 `carboncode setup`。",
      usageDisableEnable:
        "用法：/mcp {action} <name>  ·  从 /mcp 列表中挑一个名字（匿名服务器无法按名切换）。",
      usageReconnect: "用法：/mcp reconnect <name>  ·  从 /mcp 列表中挑一个名字。",
      unknownServer: '未知 MCP 服务器 "{name}"。已知：{list}。',
      noneList: "（无）",
      reconnectNoTui: "/mcp reconnect 需要交互式 TUI（postInfo 未连接）。",
      liveTab: "已连接",
      marketplaceTab: "市场",
      tabHint: "按 tab 切换",
    },
    init: {
      codeOnly:
        "/init 仅在代码模式下工作（需要文件系统工具）。\n运行 `carboncode code [path]` 启动一个以您要初始化的项目为根的会话，\n然后运行 /init。",
      exists: "▸ 项目记忆已存在于 {path}",
      existsForce: "  /init force   从头重新生成（覆盖）",
      existsEdit: "  或手动编辑 — 它只是 markdown。当前文件已",
      existsPinned: "  固定到每次启动的系统提示词中。",
      info: "▸ /init — 模型将扫描项目并合成 CARBON.md。\n  结果将作为待处理的编辑；使用 /apply 或 /walk 审查。",
    },
    webSearchEngine: {
      currentEngine: "当前网页搜索引擎：{engine}",
      endpoint: "SearXNG 端点：{url}",
      usageHeader: "用法：",
      usageMojeek: "  /search-engine mojeek            使用 Mojeek（默认，无外部依赖）",
      usageSearxng: "  /search-engine searxng            使用 SearXNG 默认端点",
      usageSearxngUrl: "  /search-engine searxng <url>      使用 SearXNG 自定义端点",
      usageMetaso:
        "  /search-engine metaso              使用 Metaso API（每天 100 次免费，配置你自己的 API 密钥可提升限额）",
      alias: "别名：/se",
      searxngInfo: "SearXNG 是一个自托管的元搜索引擎（https://github.com/searxng/searxng）。",
      searxngInstall: "安装命令：  docker run -d -p 8080:8080 searxng/searxng",
      switched: '已切换网页搜索引擎为 "{engine}"。{note}',
      switchedSearxngNote: " 请确保 SearXNG 在 {endpoint} 运行。",
      switchedMetasoNote: " 每日限额 100 次（配置你自己的 API 密钥可提升限额）。",
      confirmed: '✓ 网页搜索引擎已设为 "{engine}"{detail}。下一轮模型调用将生效。',
      confirmedDetail: "（{endpoint}）",
    },
    skill: {
      listEmpty: "未找到技能。Carbon Code 从以下位置读取技能：",
      listProjectScope:
        "  · <project>/.carboncode/skills/<name>/SKILL.md  （或 <name>.md） — 项目范围",
      listGlobalScope: "  · ~/.carboncode/skills/<name>/SKILL.md  （或 <name>.md） — 全局范围",
      listProjectOnly: "  （项目范围仅在 `carboncode code` 中活跃）",
      listFrontmatter: "每个文件的 frontmatter 至少需要 `name` 和 `description`。",
      listInvoke: "使用 `/skill <name> [args]` 调用技能，或让模型调用 `run_skill`。",
      listHeader: "用户技能（{count}）：",
      listFooter: "查看：/skill show <name>   运行：/skill <name> [args]   新建：/skill new <name>",
      listEmptyNewHint:
        "用 `/skill new <name>` 在项目范围下生成一个空白模板 — 暂无在线市场，技能需要自己写。",
      showUsage: "用法：/skill show <name>",
      showNotFound: "未找到技能：{name}",
      runNotFound: "未找到技能：{name}  （尝试 /skill list）",
      runInfo: "▸ 正在运行技能：{name}{args}",
      newUsage: "用法：/skill new <name> [--global]",
      newCreated: "▸ 已创建技能：{name}\n  {path}\n  编辑后用 `/skill {name}` 调用",
      newError: "▲ /skill new 失败：{reason}",
      pathsHeader: "技能路径（按优先级）：",
      pathsPriority:
        "优先级：项目 > 配置顺序中的自定义路径 > 全局 > 内置。更改会在下次 /new 或新会话刷新系统提示词时生效。",
      pathsUsage:
        "用法：/skill paths [list]\n       /skill paths add <path>\n       /skill paths remove <path|N>",
      pathsAddUsage: "用法：/skill paths add <path>",
      pathsRemoveUsage: "用法：/skill paths remove <path|N>",
      pathsAdded: "▸ 已添加自定义技能路径：{path}",
      pathsAlready: "▸ 自定义技能路径已存在：{path}",
      pathsRemoved: "▸ 已移除自定义技能路径：{path}",
      pathsRemoveNotFound: "▸ 没有匹配的自定义技能路径：{target}",
      pathsRestartHint: "当前会话的系统提示词不会热更新；运行 /new 或启动新会话以刷新技能索引。",
    },
  },
  statusBar: {
    turn: "轮",
    cache: "缓存",
    spent: "已花费",
    left: " 剩余",
    slow: "慢速",
    disconnect: "断开",
    reconnecting: "重连中…",
    approvingIn: "即将批准，",
    escToInterrupt: "秒 · Esc 中断",
    recordingGlyph: "●REC",
    mb: " MB",
    evt: " 事件",
    editsLabel: "编辑:",
    mcpLoading: "MCP",
    ctx: "上下文",
  },
  editMode: {
    plan: "计划",
    yolo: "自由",
    auto: "自动",
    review: "审查",
    writesGated: "   已限制写入 · /plan off 解除",
    editsShellAuto: "编辑 + Shell 自动 · /undo 可回滚",
    editsLandNow: "编辑已生效 · 按 u 撤消",
    queuedApplyDiscard: "{count} 个待处理 · y 应用 · n 丢弃",
    editsQueued: "编辑已排队 · y 应用 · n 丢弃",
    shiftTabFlip: "   {mid} · Shift+Tab 切换",
    queuedDots: "排队中…",
    undoApplied: "已应用 {ok}/{total}",
    undoHint: "u 撤消 · Space 暂停",
    undoPausedHint: "u 撤消 · Space 继续",
  },
  composer: {
    placeholder: "输入任务",
    waitingForResponse: "…等待响应…",
    hintSend: "发送",
    hintNewline: "换行",
    hintClear: "清空",
    hintScroll: "滚动",
    hintHistory: "历史",
    hintAbort: "中止",
    hintQuit: "退出",
    abortedHint: "用户已中止本轮 · 再按 Esc 清除 · ⏎ 继续提问",
    editorNoRawMode: "外部编辑器不可用 — 当前终端不支持 raw-mode 切换",
    editorFailed: "外部编辑器：",
    editorMissing:
      "未设置 $EDITOR / $VISUAL / $GIT_EDITOR — 请导出环境变量（例如 `export EDITOR=nano`）后重试",
    editorExited: "编辑器异常退出，返回码 {code}",
    typeaheadStaged: "\u25b8 {count} 行已暂存 \u00b7 esc 召回",
  },
  pathConfirm: {
    title: "沙箱外路径",
    subtitleRead: "{tool} 想要读取沙箱外的文件",
    subtitleWrite: "{tool} 想要写入沙箱外的文件",
    awaiting: "等待中",
    denyTitle: "拒绝 — 提供原因",
    optional: "可选",
    denyFooter: "输入原因 · ⏎ 提交 · Esc 跳过（直接拒绝）",
    pickFooter: "↑↓ 选择 · ⏎ 确认 · Esc 取消",
    allowOnce: "允许一次",
    allowOnceDesc: "本次允许，本会话内此目录不再询问",
    allowAlways: "始终允许",
    allowAlwaysDesc: "记住 `{prefix}`，本项目永久允许（写入 ~/.carboncode/config.json）",
    deny: "拒绝",
    denyDesc: "按 Tab 添加说明，告诉模型原因",
    pathLabel: "路径",
    sandboxLabel: "沙箱",
    allowPrefixLabel: "前缀",
  },
  shellConfirm: {
    title: "Shell 命令",
    bgTitle: "后台进程",
    subtitle: "模型请求执行 Shell 命令",
    bgSubtitle: "长时间运行 — 批准后持续运行，/kill 可停止",
    denyTitle: "拒绝 — 提供原因",
    optional: "可选",
    denyFooter: "输入原因 · ⏎ 提交 · Esc 跳过（直接拒绝）",
    awaiting: "等待中",
    pickFooter: "↑↓ 选择 · ⏎ 确认 · Esc 取消",
    allowOnce: "允许一次",
    allowOnceDesc: "执行此命令，下次再问",
    allowAlways: "始终允许",
    allowAlwaysDesc: "记住 `{prefix}`，本项目内不再询问",
    deny: "拒绝",
    denyDesc: "按 Tab 添加说明，告诉模型原因",
    cwdLabel: "工作目录",
    timeoutLabel: "超时",
    waitLabel: "等待",
    previewMore: "… 还有 {n} 行未显示 — 按 esc 取消，让模型拆分后再试",
    previewMorePlural: "… 还有 {n} 行未显示 — 按 esc 取消，让模型拆分后再试",
  },
  editConfirm: {
    footer: "Enter 应用 · n 拒绝 · ↑↓ 滚动 · Esc 取消",
    newTag: "新增",
    editTag: "编辑",
    linesCount: "-{removed} +{added} 行",
    viewingRange: "正在查看 {start}-{end}/{total}",
    denyFooter: "⏎ 提交 · Esc 跳过（直接拒绝）",
    oldLabel: "  旧内容",
    newLabel: "  新内容",
    sideBySide: "  左右对比 · 左侧删除，右侧新增 · 按偏移配对",
    linesAbove: "  ↑ 上方 {count} 行（↑/k 或 PgUp）",
    linesAbovePlural: "  ↑ 上方 {count} 行（↑/k 或 PgUp）",
    linesBelow: "  ↓ 下方 {count} 行（↓/j 或 Space/PgDn）",
    linesBelowPlural: "  ↓ 下方 {count} 行（↓/j 或 Space/PgDn）",
  },
  sessionPicker: {
    header: " ◈ CARBON CODE · 选择会话 ",
    title: "选择会话 — {workspace}",
    messages: "{count} 条消息",
    messagesPlural: "{count} 条消息",
    turns: "{count} 轮",
    pickerHint: "↑↓ 选择 · / 搜索 · ⏎ 打开 · [n] 新建 · [d] 删除 · [r] 重命名 · Esc 退出",
    empty: "  此工作区暂无已保存的会话 — 按 ",
    emptyNew: " 开始新会话",
    renamePrompt: '  重命名 "{from}" → ',
    renameHint: "  ⏎ 确认重命名 · Esc 取消",
    searchPrompt: "  搜索会话：/",
    searchHint: "  输入过滤 · ⏎ 打开匹配项 · Esc 清除",
    searchEmpty: "  没有匹配的会话",
    emptyHint: "  ⏎ 新建会话 · Esc 退出",
    justNow: "刚刚",
    minAgo: "{count} 分钟前",
    yesterday: "昨天",
    hoursAgo: "{count} 小时前",
    daysAgo: "{count} 天前",
  },
  workspacePicker: {
    header: " ◈ CARBON CODE · 选择工作区 ",
    title: "选择工作区 — {workspace}",
    sessions: "{count} 个会话",
    sessionsPlural: "{count} 个会话",
    current: "当前",
    pickerHint: "↑↓ 选择 · / 搜索 · ⏎ 切换并选择会话 · Esc 退出 · /cwd <path> 添加",
    empty: "  暂无已知工作区 — 先运行一次 /cwd <path> 添加",
    searchPrompt: "  搜索工作区：/",
    searchHint: "  输入过滤 · ⏎ 切换并选择会话 · Esc 清除",
    searchEmpty: "  没有匹配的工作区",
  },
  modelPicker: {
    header: " ◈ CARBON CODE · 选择配置 ",
    loading: "  ·  加载目录…",
    catalogEmpty: "  ·  目录为空 — 使用已知备选",
    modelsAvailable: "  ·  {count} 个模型可用",
    presetsHeader: "    预设  ·  推荐 — 模型 + 强度 + 自动升级",
    modelsHeader: "    模型  ·  直接选择 — 自动升级保持不变",
    pickerFooter: "  ↑↓ 选择 · ⏎ 确认 · [r] 刷新 · Esc 取消",
    currentLabel: "  · 当前",
  },
  slashSuggestions: {
    noMatch: "没有匹配此前缀的斜杠命令",
    backspaceHint: " — 按 Backspace 修改，或 /help 查看完整列表",
    commandCount: "{count} 个命令",
    commandCountPlural: "{count} 个命令",
    aboveLabel: "   ↑ {count} 个以上",
    belowLabel: "   ↓ {count} 个以下",
    advancedHint: "  + {count} 个高级命令 ·  输入字母搜索",
    footerHint: "  ↑↓ 导航 · Tab / ⏎ 选择 · Esc 取消",
    groupChat: "聊天",
    groupSetup: "设置",
    groupInfo: "信息",
    groupSession: "会话",
    groupExtend: "扩展",
    groupCode: "代码",
    groupJobs: "任务",
    groupAdvanced: "高级",
    groupDetailSetup: "模型 + 成本",
    groupDetailInfo: "当前状态",
    groupDetailChat: "日常聊天操作",
    groupDetailExtend: "MCP, 记忆, 技能",
    groupDetailSession: "已保存的会话",
    groupDetailCode: "编辑 + 计划 (代码模式)",
    groupDetailJobs: "后台进程 (代码模式)",
    groupDetailAdvanced: "高级或一次性设置",
  },
  atMentions: {
    loading: "加载中…",
    entrySingular: "{count} 条",
    entryPlural: "{count} 条",
    searching: "搜索中…",
    scanned: "已扫描",
    match: "个匹配",
    matches: "个匹配",
    forFilter: '匹配 "{filter}"',
    noMatch: '没有匹配 "{filter}" 的文件',
    emptyDir: "空目录",
    scanning: "正在扫描目录树…",
    footerBrowse: "↑↓ 导航 · Tab 进入文件夹 · ⏎ 插入 · Esc 取消",
    footerBrowseSearch: "↑↓ 导航 · Tab / ⏎ 以 @path 插入 · Esc 取消",
    footerInsert: "↑↓ 导航 · Tab / ⏎ 以 @path 插入 · Esc 取消",
  },
  statsPanel: {
    modePlan: "计划",
    modeYolo: "自由",
    modeAuto: "自动",
    modeReview: "审查",
    pro: "⇧ 专业",
    budget: "  预算  ",
  },
  welcomeBanner: {
    workspace: "▸ 工作区",
    relaunchHint: "（重启时用 --dir <path> 切换）",
    dashboard: "▸ 网页",
  },
  ctxBreakdown: {
    title: "▣ 上下文",
    compactHint: "  /compact 折叠（超过 50% 自动触发）· /new 清空日志",
    topTools: "  常用工具（按成本排序，{count} 个）：",
    msg: "条",
    turnLabel: "轮",
  },
  startup: {
    codeRooted:
      '▸ carboncode code：根目录 {rootDir}，会话 "{session}" · {tools} 个原生工具{semantic}',
    ephemeral: "（临时）",
    semanticOn: " · 语义搜索已开启",
    updateAvailable:
      "▸ 有新版本可用：{current} -> {latest}\n  运行 `npm install -g @carboncode/cli` 更新。",
  },
  doctorErrors: {
    unreadable: "{path} 无法读取 — {message}",
    cannotList: "无法列出 — {message}",
    parseFailed: "无法解析 settings.json — {message}",
    probeFailed: "探测失败 — {message}",
  },
  doctorReport: {
    labels: {
      apiKey: "API 密钥",
      config: "配置",
      proxy: "HTTP 代理",
      apiReach: "API 连通",
      tokenizer: "分词器",
      sessions: "会话",
      hooks: "钩子",
      semantic: "语义索引",
      project: "项目",
    },
    details: {
      proxyDirect: "未设置 HTTPS_PROXY / HTTP_PROXY / ALL_PROXY — 直连",
      proxyRouting: "请求将通过代理 {url}",
      apiKeyEnv: "通过环境变量 DEEPSEEK_API_KEY 设置（{tail}）",
      apiKeyConfig: "来自 {path}（{tail}）",
      apiKeyMissing:
        "未设置 — 运行 `carboncode setup` 保存，或设置环境变量 DEEPSEEK_API_KEY。可在 https://platform.deepseek.com/api_keys 获取 key",
      configMissing: "配置文件缺失 — 当前使用默认设置。运行 `carboncode setup` 会写入配置。",
      apiReachSkipped: "已跳过 — 没有可用于测试的 API key",
      apiReachNull: "/user/balance 返回空结果 — 可能是认证失败或网络被阻断",
      apiReachUnavailable: "账号当前不可用（{summary}）— 请充值，或在 DeepSeek 控制台检查账号状态",
      apiReachOk: "/user/balance 正常",
      apiReachOkWithBalance: "/user/balance 正常 — {summary}",
      tokenizerMissing: "未找到 data/deepseek-tokenizer.json.gz — token 统计将退回到字符数估算",
      sessionsZero: "0 个已保存会话",
      sessionsSummary: "{count} 个已保存 · {size} · 最早 {days} 天前",
      sessionsStale: "{detail} · {stale} 个已闲置 ≥90 天（运行 `carboncode prune-sessions` 清理）",
      hooksSummary: "{global} 个全局，{project} 个项目",
      semanticNoIndex: "未启用（没有构建语义索引；运行 `carboncode index` 可启用）",
      semanticMismatch:
        "索引使用 {indexProvider}/{indexModel}，但当前配置是 {configProvider}/{configModel} — 搜索前请重建索引",
      semanticOpenaiOk: "openai-compat · {baseUrl} · 模型 {model} · API key 已配置",
      semanticOllamaMissing:
        "PATH 中找不到 ollama — semantic_search 将不可用；请从 https://ollama.com 安装",
      semanticOllamaStopped:
        "ollama 服务未运行 — 执行 `ollama serve`，或在 TUI 中调用 /semantic 自动启动",
      semanticOllamaModelMissing: "模型 {model} 尚未拉取 — 执行 `ollama pull {model}`",
      semanticOllamaReady: "ollama 服务运行中 · 模型 {model} 已就绪",
      projectMissing:
        "{path} 中没有 {markers} 等项目标记 — `carboncode code` 仍可运行，但 @ 引用和项目记忆缺少锚点",
      projectOk: "{path}（{markers}）",
    },
  },
  webErrors: {
    status:
      "web_search {status} — try: 搜索后端返回错误；请改写查询，或使用 /search-engine mojeek|searxng 切换引擎",
    rateLimit429:
      "web_search 429 — try: 等待 10 秒后重试，或改写查询；搜索后端正在对该客户端进行限流",
    forbidden403:
      "web_search 403 — try: 搜索后端拒绝该客户端访问；使用 /search-engine mojeek|searxng 切换引擎，或稍后重试",
    serverError5xx:
      "web_search {status} — try: 在浏览器中打开搜索 URL；若能加载则属临时故障，等 30 秒重试即可",
    mojeekBlocked:
      "web_search: Mojeek 反爬页面 — 频率限制或被屏蔽 — try: 等待 30 秒后重试，或使用 /search-engine searxng 切换引擎",
    mojeekNoResults:
      "web_search: 返回 0 条结果但响应看起来不是正常空结果页（{chars} 字符，前 120 字符：{preview}）— try: 使用更简单的关键词改写查询，或使用 /search-engine searxng 切换引擎",
    invalidEndpoint:
      'web_search: 无效的 SearXNG 端点 "{endpoint}" — try: 使用 /search-endpoint http://host:port 设置有效的 URL',
    endpointMustBeHttp:
      "web_search: SearXNG 端点必须是 http(s) 协议，当前为 {protocol} — try: 使用 /search-endpoint http://host:port 设置有效的 URL",
    cannotReach:
      "web_search: 无法访问 SearXNG 服务器 {endpoint} — try: 安装并启动 SearXNG（https://github.com/searxng/searxng，例如 `docker run -d -p 8080:8080 searxng/searxng`），或使用 /search-engine mojeek 切换到默认引擎",
    searxngNoResults:
      "web_search: 返回 0 条结果但 SearXNG 响应看起来不是正常空结果页（{chars} 字符）— try: 使用更简单的关键词改写查询，或使用 /search-engine mojeek 切换引擎",
    metasoDailyLimit:
      "web_search: 默认 API 密钥的每日搜索次数已达上限 — 设置 METASO_API_KEY 环境变量，或在 https://metaso.cn/search-api/playground 获取自己的密钥",
    metasoUnauthorized:
      "web_search: Metaso API 密钥被拒绝 — 检查 METASO_API_KEY，或在 https://metaso.cn/search-api/playground 获取密钥",
    metasoRateLimit:
      "web_search: Metaso 请求频率限制 — 等待后重试，或在 https://metaso.cn/search-api/playground 获取自己的密钥",
    metasoServerError:
      "web_search: Metaso 服务器错误（{status}）— 稍后重试，或使用 /search-engine mojeek 切换引擎",
    metasoParseError: "web_search: Metaso 返回无法解析的响应（HTTP {status}）— 稍后重试",
    metasoApiError: "web_search: Metaso API 错误（code {code}: {message}）— 稍后重试",
    fetchStatus:
      "web_fetch {status} for {url} — try: 在浏览器中确认该 URL 能否访问；该状态码表明目标主机返回了错误页面",
    fetchRateLimit429:
      "web_fetch 429 for {url} — try: 等待 10 秒后重试；目标主机正在对该客户端进行限流",
    fetchForbidden403:
      "web_fetch 403 for {url} — try: 目标主机拒绝该客户端访问；该页面可能需要登录或屏蔽爬虫 — 改用 web_search 摘要",
    fetchServerError5xx:
      "web_fetch {status} for {url} — try: 在浏览器中打开该 URL；若能加载则属临时故障，等 30 秒重试即可",
    fetchTimeout:
      "web_fetch: timed out after {ms}ms for {url} — try: 更短的 URL 或更小的内容；可能是 CDN 较慢，或重试一次",
    fetchTooLarge:
      "web_fetch 拒绝：content-length {len} 字节超过上限 {cap} 字节（{url}）— try: 改换其他 URL 获取较小的内容；该页面过大无法获取",
    fetchBodyTooLarge:
      "web_fetch 拒绝：响应体超过 {cap} 字节上限（已接收 {seen} 字节）— try: 改换其他 URL 获取较小的内容；该页面流式传输超出大小上限",
    fetchInvalidUrl:
      "web_fetch: URL 必须以 http:// 或 https:// 开头 — try: 传入绝对的 http(s) URL（该 URL 格式错误或使用了不支持的协议）",
  },
  choiceConfirm: {
    customLabel: "自定义回答",
    customDesc: "以上选项都不合适 — 输入自由格式回复，模型会原样读取",
    cancelLabel: "取消 — 放弃问题",
    cancelDesc: "模型停止并询问你真正的需求",
  },
  cardTitles: {
    usage: "用量",
    context: "上下文",
    search: "搜索",
    subagent: "子代理",
    reply: "回复",
    reasoning: "推理中",
    reasoningAborted: "推理（已中止）",
    reasoningEllipsis: "推理中…",
    error: "错误",
    doctor: "环境诊断",
    you: "你",
    task: "任务",
  },
  cardLabels: {
    prompt: "提示",
    reason: "推理",
    output: "输出",
    cache: "缓存",
    session: "会话",
    balance: "余额",
    turn: "轮",
    system: "系统",
    tools: "工具",
    log: "日志",
    input: "输入",
    topTools: "常用工具",
    logMsgs: "日志消息",
    hitSingular: "{count} 条结果 · {files} 个文件",
    hitsPlural: "{count} 条结果 · {files} 个文件",
    moreHitSingular: "⋮ +{count} 条结果",
    moreHitsPlural: "⋮ +{count} 条结果",
    earlierLine: "⋮ 前 {count} 行（使用 /tool 阅读全文）",
    earlierLines: "⋮ 前 {count} 行（使用 /tool 阅读全文）",
    earlierStackLine: "⋮ 前 {count} 行堆栈已隐藏",
    earlierStackLines: "⋮ 前 {count} 行堆栈已隐藏",
    agent: "代理 · {name}",
    response: "回复",
    writing: "输出中 …",
    tok: "tok",
    pilcrow: "¶",
    aborted: "已中止",
    truncatedByEsc: "[已被 Esc 截断]",
    rejected: "已拒绝",
    exit: "退出码 {code}",
    bytesIn: "{bytes} 输入",
    elapsedSec: "{secs}秒",
    stackTrace: "堆栈跟踪",
    retries: "次重试",
    reasoningLabel: "推理 · {count} ¶",
    runningLabel: "运行中",
    workingLabel: "处理中",
    defaultFooter: "↑↓ 选择 · ⏎ 确认 · Esc 取消",
    applyAction: "[a] 应用",
    skipAction: "[s] 跳过",
    rejectAction: "[r] 拒绝",
    levelOk: "正常",
    levelWarn: "警告",
    levelFail: "失败",
    checksLabel: "检查项",
    passed: "通过",
    warnTag: "警告",
    failTag: "失败",
    stepLabel: "步骤",
    done: "已完成",
    inProgress: "← 进行中",
    upcoming: "待处理",
    resumed: "已恢复 · ",
    archive: "⏪ 归档 · ",
    more: "⋮ +{count} 更多",
    categoryUser: "用户",
    categoryFeedback: "反馈",
    categoryProject: "项目",
    categoryReference: "参考",
  },
  copyMode: {
    title: "── 复制模式 ──",
    help: "j/k 或 ↑/↓ 移动 · v 起选区 · y 复制 · g/G 顶/底 · q 退出",
    statusBar: "第 {cur}/{total} 行 · 选区：{sel}",
    statusYanked: "已复制 {size} 字符（osc52={osc52}）",
    statusEmpty: "未选中内容",
    empty: "（还没有聊天内容 — 先和模型说点什么）",
    labelUser: "你",
    labelAssistant: "助手",
    labelReasoning: "推理",
    yankedToast: "▸ 已复制 {size} 字符到剪贴板 (osc52)",
    yankedToastFile: "▸ 已复制 {size} 字符 · 文件：{path}",
  },
  mcpHealth: {
    noData: "无检查数据",
    healthy: "正常 \u00b7 {ms}ms",
    slow: "缓慢 \u00b7 {ms}ms",
    verySlow: "非常慢 \u00b7 {ms}ms",
    slowToast: "\u26a0 MCP `{name}` 响应缓慢 \u00b7 P95 {seconds}s \u00b7 最近 {sampleSize} 次调用",
    emptyHint:
      "\u2139 未配置 MCP 服务器 —— 可尝试：`carboncode setup` 重新选择，或 `carboncode mcp install filesystem`",
  },
  denyContextInput: {
    description: "告诉模型你为什么拒绝了。模型下次会看到你的理由作为额外的上下文。",
  },
  cardStream: {
    scrollAbove: " \u2191 {scroll}/{max} 行",
    scrollAbovePlural: " \u2191 {scroll}/{max} 行",
    scrollMore: " \u2014 还有 {remaining} 行",
    scrollPgUp: " \u00b7 PgUp/\u6eda\u8f6e/\u2191",
  },
  slashArgPicker: {
    noMatch: '\u6ca1\u6709\u5339\u914d "{partial}"',
    keepTyping: " \u2014 \u7ee7\u7eed\u8f93\u5165\uff0c\u6216 Backspace \u4fee\u6539",
    above: "   \u2191 \u8fd8\u6709 {hidden} \u4e2a",
    below: "   \u2193 \u8fd8\u6709 {hidden} \u4e2a",
    footer: "  \u2191\u2193 \u5bfc\u822a \u00b7 Tab/\u23ce \u9009\u62e9 \u00b7 Esc \u53d6\u6d88",
  },
  mcpMarketplace: {
    title: "MCP 市场",
    filter: "筛选：",
    filterPlaceholder: "（输入筛选）",
    matchSingular: "{n} 条匹配",
    matchPlural: "{n} 条匹配",
    loading: "加载中…",
    noEntries: "无条目",
    opening: "正在打开注册表…",
    cached: " · 已缓存",
    exhausted: " · 已耗尽",
    loadingMore: "加载更多…",
    allLoaded: "所有页面已加载",
    fetchingDetail: "正在获取 smithery 详情…",
    noInstallInfo: "没有 {name} 的安装信息 — 试试 `npx -y @smithery/cli install {name}`",
    alreadyInstalled: "已安装：{spec}",
    installed: "已安装 → {spec}",
    uninstalled: "已卸载 {name}",
    installFailed: "安装失败：{message}",
    notInstalled: "未安装：{name}",
    bridged: "✓ 已安装 {name} — 已桥接",
    bridgeFailed: "▲ 已安装 {name} — 桥接失败：{reason}",
    bridgeReloadFailed: "✓ 已安装 {name} — 重启 `carboncode code` 以桥接（重载失败：{message}）",
    restartBridge: "✓ 已安装 {name} — 重启 `carboncode code` 以桥接",
    needsEnv: "  ·  需要环境变量：{env}",
    badgeOfficial: "[官方]",
    badgeSmithery: "[三方]",
    badgeLocal: "[本地]",
    footerHint: "输入筛选 · ↑↓ 选择 · ⏎ 安装/切换 · PgDn 加载更多 · Esc 关闭",
    specLine: "配置：{runtime} {id} \u00b7 {transport}",
    smitheryDetail: "（smithery 列表 \u2014 按 Enter 获取安装详情）",
    statusError: "错误：{message}",
  },
  mcpBrowser: {
    title: "◈ MCP 浏览器",
    empty: "没有挂载 MCP 服务器。运行 `carboncode setup` 选择一些，或使用 --mcp 启动。",
    serverCount: "{count} 个服务器",
    footer: "↑↓ 选择 · [r] 重连 · [d] 禁用 · Esc 退出",
  },
  mcpLifecycle: {
    handshake: "握手中…",
    connected: "已连接",
    failed: "失败",
    disabled: "已禁用",
    reconnect: "重连中…",
    initDetail: "初始化 → tools/list → resources/list",
    reconnectDetail: "断开旧连接 · 重新握手 · 列出工具",
    disabledDetail: "通过 /mcp disable {name}",
    failedSetupHint:
      "→ 运行 `carboncode setup` 移除此条目，或修复底层问题（缺少 npm 包、网络等）。",
    failedSetupConfigHint: "→ 运行 `carboncode setup` 从已保存配置中移除损坏的条目。",
  },
  checkpointPicker: {
    title: "恢复检查点 \u2014 {workspace}",
    header: " \u25c8 CARBON CODE \u00b7 选择检查点 ",
    empty: "  此工作区暂无检查点 — 参见 /checkpoint 创建",
    more: "     … 还有 {hidden} 个",
    footer: "  ↑↓ 选择  ·  ⏎ 恢复  ·  [d] 删除  ·  Esc 退出",
    footerEmpty: "  Esc 退出",
  },
  planReviseConfirm: {
    title: "计划修改已提交",
    metaRight: "−{removed}  +{added}  ·  {kept} 个保留",
    updatedSummary: "更新摘要：{summary}",
    acceptLabel: "接受修改 — 应用新的步骤列表",
    acceptHint: "用新步骤替换剩余计划。已完成的步骤不变。",
    rejectLabel: "拒绝 — 保留原计划",
    rejectHint: "放弃修改。模型继续按原步骤执行。",
  },
  diffApp: {
    title: "carboncode diff",
    turnLabel: "第 {turn} 轮（{current}/{total}）",
    turnsAligned: "{count} 轮已对齐",
    paneEmpty: "（此轮该侧无记录）",
    kindMatch: "✓ 一致",
    kindDiverge: "★ 分歧",
    kindOnlyInA: "← 仅 A 有",
    kindOnlyInB: "→ 仅 B 有",
  },
  recordView: {
    userPrefix: "你 › ",
    assistant: "助手",
    toolPrefix: "tool<",
    argsLabel: "  参数：",
    resultArrow: "  → ",
    error: "错误 ",
    cache: "  · 缓存 ",
    toolCallOnly: "（仅工具调用响应）",
    truncateExtra: "（+{extra} 字符）",
  },
  replayApp: {
    emptyTranscript: "空记录",
    turnProgress: "第 {current}/{total} 轮",
    noRecords: "无记录",
    untracked: "（未追踪）",
    churned: "（已变更 ×{count}）",
  },
};
