package i18n

// Chinese is the zh-Hans catalogue. Keep the %s placeholders in the same order
// as English unless a phrase genuinely demands re-ordering — call sites pass
// arguments positionally and won't reshuffle.
var Chinese = Messages{
	WelcomeTitleFmt: "欢迎使用 %s",
	NoConfigYet:     "还没有配置 — 现在来设置一下吧。",

	InitHint: "项目记忆（AGENTS.md）在会话内由模型生成：运行 `reasonix`，然后 `/init` —— 模型会分析代码库并写入。配置请用 `reasonix setup`。",

	ChatTip:                "对话上下文将跨轮保留。输入 'exit' 或按 Ctrl-D 退出。",
	TurnCancelled:          "已取消 — 回到提示符",
	InterruptedRecovery:    "本轮已中断。部分输出会永久保留供查看；只有完整工具调用及结果和有界恢复摘要会进入模型下一轮。继续或回滚前请先检查当前工作区。",
	FinalReadinessRecovery: "剩余任务或收尾检查已暂停。运行 /continue-checks 可保留已完成证据并继续剩余工作。",
	ReadinessContinuing:    "Reasonix 正在自动完成剩余任务或检查。",
	RecoveryPaused:         "已暂停自动重试。Reasonix 已停止重复尝试，并保留已完成的工作。发送“继续”即可开始新一轮，也可以补充要求来调整方向。",
	CompletionUncertain:    "完成状态未确认。当前结果和已完成工作均已保留。发送“继续”可接着完成，也可以补充说明需要调整的内容。",
	ReceiptVerified:        "没有未经验证的部分",
	ReceiptGapsHeader:      "未验证:",
	ReceiptRisksHeader:     "已申报的风险:",
	ReceiptMore:            "另有 %d 项",
	ReceiptGapKinds: map[string]string{
		"unbacked_claim":      "声称过但账本不支持",
		"unproven_criterion":  "验收项没有证据",
		"missing_check":       "预期的检查从未通过",
		"failed_verification": "验证失败",
		"stale_verification":  "验证早于最后一次改动",
		"unverified_change":   "改动了但没有任何验证",
		"unreviewed_change":   "改动后再没看过",
		"declared_unverified": "自己申报未验证",
	},
	NoSessionToResume: "没有可恢复的会话 — 用 `reasonix` 开一个新的",
	ResumeRequiresTTY: "--resume 需要交互式终端；用 --continue 直接恢复最近一次",
	PickSessionLabel:  "恢复哪个会话？",

	ResumeBusy:          "请先完成或取消当前这一轮再恢复会话",
	ResumeBadIndexFmt:   "请选择 1–%d 的会话（用 /resume 查看列表）",
	ResumeAlreadyActive: "已在该会话中",
	ResumedTitle:        "已恢复会话",

	RenameUsage:            "用法：/rename <新名称>  或  /rename <序号> <新名称>",
	RenameNoSession:        "当前没有活跃会话可重命名",
	RenameDoneFmt:          "会话已重命名为 %q",
	ResumePickTitle:        "选择要恢复的会话",
	ResumePickHint:         "↑/↓ 移动 · Enter 恢复 · Esc 取消",
	ResumeRecoveryBadgeFmt: "[冲突副本 · 父会话 %s]",

	ChatThinking:                           "思考中…",
	ChatThoughtForFmt:                      "思考了 %d 秒",
	ChatStatusThinkingFmt:                  "%s 思考中… (%d 秒 · Esc 取消)",
	TurnPhaseWorking:                       "工作中",
	TurnPhaseChecking:                      "检查中",
	TurnPhaseVerifying:                     "验证中",
	TurnPhaseReviewing:                     "复审中",
	CompletionSummaryBlocked:               "本轮任务受阻，请查看改动详情。",
	CompletionSummaryNeedsAttention:        "本轮仍有验证或复审缺口。",
	ChatToolWorkingFmt:                     "%s 运行中 · %d 秒",
	ChatSubagentPhaseQueued:                "排队中",
	ChatSubagentPhaseRunning:               "运行中",
	ChatSubagentPhaseReasoning:             "思考中",
	ChatSubagentPhaseResponding:            "生成中",
	ChatSubagentPhaseTool:                  "使用工具",
	ChatSubagentPhaseRetrying:              "重试中",
	ChatSubagentPhaseCompleted:             "已完成",
	ChatSubagentPhaseFailed:                "失败",
	ChatSubagentPhaseCancelled:             "已取消",
	ChatSubagentProgressFmt:                "%s · %d 秒 · %d 秒前",
	ChatSubagentProgressDoneFmt:            "%s · %d 秒",
	ChatSubagentPreviewLabel:               "▎",
	ChatStatusRetryingFmt:                  "%s 正在重试 (%d/%d)… (Esc 取消)",
	ChatStatusCancellingFmt:                "%s 正在停止… (%d 秒 · Ctrl+C 退出)",
	ChatStatusIdle:                         "就绪",
	ChatStatusYoloIdle:                     "已跳过工具批准",
	ChatStatusCycleHint:                    "Shift+Tab 循环询问/自动/计划 · Ctrl+Y YOLO",
	ChatStatusCycleHintCompact:             "Shift+Tab 询问/自动/计划 · Ctrl+Y YOLO",
	ChatTurnReceiptLabel:                   "本轮",
	RateBandPeak:                           "高峰",
	RateBandOffPeak:                        "低峰",
	RateBandMixed:                          "混合档位",
	ChatStatusModelLabel:                   "模型",
	ChatStatusEffortLabel:                  "强度",
	ChatStatusCacheLabel:                   "缓存",
	ChatStatusContextLabel:                 "上下文",
	ChatStatusCompactLabel:                 "压缩",
	ChatStatusJobsLabel:                    "任务",
	ChatStatusBalanceLabel:                 "余额",
	ChatStatusCostLabel:                    "费用",
	ChatStatusCacheNowFmt:                  "本次命中 %s",
	ChatStatusCacheAvgFmt:                  "平均 %s",
	ChatStatusPlanApproval:                 "1 开始执行 · 2 修改计划 · 3 暂不执行并退出 · n/Esc 继续规划 · PgUp/PgDn/Ctrl+Home/End 滚动",
	PlanApprovalPrompt:                     "计划已生成（见上方）— 请选择下一步操作",
	PlanApprovalChoices:                    "1. 开始执行\n2. 修改计划（继续规划）\n3. 暂不执行，退出计划模式\n选择 [1/2/3]（y 开始执行；n/Esc 继续规划）",
	ChatStatusToolApproval:                 "1 本次允许 · 2 本会话允许此范围 · 提供时 3/4 为前缀或保存 · n/Esc 拒绝 · Ctrl-C 取消本轮",
	AskTypeSomething:                       "自己输入",
	AskTypingHint:                          "输入后按 Enter 确认",
	AskChatInstead:                         "先不选择，直接回复",
	ChatStatusQuestion:                     "↑/↓ 选 · 数字快选 · 空格多选 · Enter 确认 · ←/→ 切换问题 · Esc 取消",
	StatusResumePicker:                     "↑/↓ 移动 · Enter 恢复 · Esc 取消",
	AskSubmitTitle:                         "提交答案",
	AskUnanswered:                          "(未答)",
	AskSubmitHint:                          "Enter 提交 · ← 返回修改",
	ElicitURLHint:                          "o 打开链接 · Enter 接受 · d 拒绝 · Esc 取消",
	ElicitConfirmOnly:                      "Enter 确认;d 拒绝;Esc 取消。",
	ElicitUnanswered:                       "(未填写)",
	ElicitSubmit:                           "提交",
	ElicitSubmitHint:                       "Enter 编辑字段 · tab 下一项 · 提交行:Enter 接受、d 拒绝、Esc 取消",
	ToolApprovalPromptFmt:                  "需要你的许可\n\n将调用工具 %s%s。\n%s\n%s",
	ToolApprovalChoices:                    "1. 本次允许\n2. 本会话允许 %s\n3. 总是允许 %s（保存到配置）\n4. 拒绝\n选择 [1/2/3/4]（兼容 y/a/p/n）",
	BashPrefixChoices:                      "1. 本次允许\n2. 本会话允许 %s\n3. 总是允许 %s（保存到配置）\n4. 拒绝\n选择 [1/2/3/4]（兼容 y/a/p/n）",
	PlanModeReadOnlyCommandChoices:         "1. 本次信任\n2. 本会话信任此前缀\n3. 总是在计划模式信任此前缀（保存到配置）\n4. 拒绝\n选择 [1/2/3/4]（兼容 y/a/p/n）",
	FreshHumanApprovalChoices:              "1. 本次允许\n2. 拒绝\n选择 [1/2]（兼容 y/n）",
	RecoveryApprovalChoices:                "1. 继续一次\n2. 换个方案",
	RecoveryPlanChangeChoices:              "1. 采用新计划并继续\n2. 不采用，让 Auto 调整",
	RecoveryPlanDecisionPrompt:             "执行计划需要你的决定",
	RecoveryPlanBeforeFmt:                  "原计划：%s",
	RecoveryPlanAfterFmt:                   "新计划：%s",
	RecoveryTaskGrantChoices:               "1. 继续一次\n2. 继续，并在本任务内允许同类操作\n3. 换个方案",
	SandboxEscapeApprovalChoices:           "1. 允许一次\n2. 本会话使用真实环境\n3. 拒绝\n选择 [1/2/3]（兼容 y/a/n）",
	ApprovalNeededFmt:                      "需要审批：%s",
	ApprovalNeededWithSubjectFmt:           "需要审批：%s %s",
	ToolApprovalSourceFmt:                  "来源: %s",
	ToolApprovalBuiltIn:                    "内置工具",
	ToolApprovalImageUse:                   "将读取提供的图片用于图像理解。",
	ApprovalToolLabelBash:                  "bash",
	ApprovalToolLabelEditFile:              "编辑文件",
	ApprovalToolLabelWriteFile:             "写入文件",
	ApprovalToolLabelMultiEdit:             "批量编辑",
	ApprovalToolLabelMoveFile:              "移动文件",
	ApprovalToolLabelWebFetch:              "读取网页",
	ApprovalToolLabelRunSkill:              "运行技能",
	ApprovalToolLabelRemember:              "保存记忆",
	ApprovalToolLabelForget:                "删除记忆",
	ApprovalToolLabelSandboxEscape:         "bash 沙箱降级审批",
	ApprovalToolLabelPlanModeReadOnly:      "计划模式只读命令",
	MemoryApprovalSaveUpdate:               "保存/更新记忆",
	MemoryApprovalBodyLabel:                "正文",
	MemoryApprovalArchiveFmt:               "归档记忆 %q",
	PlanModeBashTrustSubjectFmt:            "在计划模式中信任 %q 为只读命令前缀\n命令：%s",
	PlanModeBashTrustReason:                "这条 bash 命令不在 Reasonix 内置只读集合中。只有在确认这个精确前缀用于计划和研究时是只读的，才应批准。自动/YOLO 审批不能回答这个信任提示。",
	PlanModeBashTrustDeclined:              "用户拒绝将这条 bash 命令信任为计划模式只读命令；不要重试它，请继续使用其它已信任的只读工具，或询问用户希望如何继续。",
	SandboxEscapeSubjectFallback:           "仅本次不进沙箱运行 shell 命令",
	SandboxEscapeSubjectPrefix:             "仅本次不进沙箱运行：",
	SandboxEscapeWrapReason:                "Windows 不提供这条命令所需的 OS 级 Bash 沙箱。是否仅本次不受限运行？这只会对此命令绕过 OS 隔离。",
	SandboxEscapeRuntimeReason:             "OS 沙箱无法启动这条命令。是否仅本次不受限运行？这只会对此命令绕过 OS 隔离。",
	SandboxEscapeDeclined:                  "用户拒绝在没有 OS 沙箱的情况下运行这条命令；不要不进沙箱重试，请询问用户希望如何继续。",
	ApprovalToolLabelConfigWrite:           "Reasonix 配置写入审批",
	ConfigWriteSubjectPrefix:               "写入 Reasonix 配置：",
	ConfigWriteReason:                      "这次写入的目标是工作区之外的 Reasonix 托管配置文件。它可以改变后续会话的模型服务商、沙箱规则、权限和 MCP 服务器，因此需要你的明确批准。",
	ConfigWriteDeclined:                    "用户拒绝了这次 Reasonix 配置写入；不要重试，请询问用户希望如何继续。",
	ConfigWriteApprovalChoices:             "1. 允许一次\n2. 本会话允许\n3. 拒绝\n选择 [1/2/3]（兼容 y/a/n）",
	WriteAccessApprovalChoices:             "1. 仅本次允许\n2. 本会话允许这些目录\n3. 加入项目允许目录（写入 reasonix.toml）\n4. 拒绝\n选择 [1/2/3/4]（兼容 y/a/p/n）",
	WriteAccessHomeWarning:                 "这将授权写入整个用户主目录。Reasonix 会话和运行时状态文件仍受保护。",
	WriteAccessMergedPermissionHint:        "此选择也会授权当前匹配的工具操作。",
	WriteAccessProjectHint:                 "加入项目会把 [sandbox].allow_write（以及需要时的权限规则）写入当前工作区的 reasonix.toml。",
	PermissionSavedFmt:                     "授权已保存到 %s：%s",
	PermissionAlreadyAllowedFmt:            "授权已由 %s 中的规则覆盖：%s",
	PermissionSaveFailedFmt:                "保存授权 %s 失败：%v",
	PlanModeReadOnlyCommandTrustSavedFmt:   "计划模式只读命令信任已保存到 %s：%s",
	PlanModeReadOnlyCommandTrustAlreadyFmt: "计划模式只读命令信任已保存在 %s：%s",
	PlanModeReadOnlyCommandTrustFailedFmt:  "保存计划模式只读命令信任 %s 失败：%v",
	DiffFoldedFmt:                          "… 还有 %d 行",
	DiffFoldEnabledFmt:                     "diff 已折叠至 %d 行（/diff-fold 展开）",
	DiffFoldDisabled:                       "diff 已展开 — 显示全部行（/diff-fold 折叠）",

	OutputStyleNone:           "没有可用的输出风格",
	ThemeHeader:               "主题：",
	ThemeHint:                 "使用 /theme <auto|light|dark|style> 切换",
	ThemeChangedFmt:           "已切换主题为 %s / %s",
	ThemeUnknownFmt:           "未知主题 %q",
	LanguageHeader:            "语言：",
	LanguageHint:              "使用 /language <auto|en|zh> 切换",
	LanguageChangedFmt:        "语言已设为 %s（当前解析为：%s）",
	CurrencyHeader:            "费用展示币种：",
	CurrencyHint:              "使用 /currency <auto|CNY|USD> 切换",
	CurrencyChangedFmt:        "费用展示币种已设为 %s（当前解析为：%s）",
	RuntimeRefreshBusy:        "请先完成或取消当前工作，并停止后台任务后再修改此设置",
	RuntimeRefreshUnavailable: "本会话不支持刷新运行时",

	CompactionWorking: "正在压缩对话…",
	CompactionTitle:   "上下文已压缩",
	CompactionUnit:    "条消息",
	CompactionAuto:    "自动",
	CompactionManual:  "手动",

	ExtFormFieldsHint:         "字段将通过逐项提问收集",
	ExtRunActionFmt:           "运行 %s",
	SlashCompactFailed:        "压缩失败",
	SlashNewDone:              "已开启新会话 — 之前的对话已存档",
	SlashNewFailed:            "新建会话失败",
	SlashClearPrompt:          "清空当前上下文且不保存？",
	SlashClearDone:            "已清空当前上下文",
	SlashClearFailed:          "清空当前上下文失败",
	SlashClsDone:              "已清屏（LLM 上下文保留）",
	SlashUnknown:              "未知命令",
	SlashUnknownSentAsMessage: "已作为普通消息发送",
	SlashTodoCleared:          "已清除任务清单",

	SkillPickerAvailableFmt:      "%d 个可用",
	SkillPickerMatchingFmt:       "%d 个匹配 · 共 %d 个",
	SkillPickerHint:              "↑↓ 移动 · Space 开关 · Enter 保存 · / 搜索 · s 来源 · r 重新扫描 · Esc 取消",
	SkillPickerDetailHint:        "↑↓ 移动 · Enter 选择 · Space 开关 · Esc 返回",
	SkillPickerSearchEmpty:       "没有匹配的 skill",
	SkillPickerSearchPlaceholder: "搜索 skills...",
	SkillPickerSourceTitle:       "来源",
	SkillPickerSourceActiveFmt:   "%d 个有效",
	SkillPickerSourceHint:        "↑↓ 移动 · Enter 查看技能 · d 诊断 · s skills · r 重新扫描 · Esc 关闭",
	SkillPickerDiagHidden:        "d 展开诊断",
	SkillPickerDiagShown:         "d 收起诊断",
	SkillPickerBuiltinSource:     "内置",
	SkillPickerRescanned:         "已重新扫描 skills",
	SkillPickerNoDescription:     "（无描述）",
	SkillPickerScopeProject:      "项目",
	SkillPickerScopeCustom:       "自定义",
	SkillPickerScopeGlobal:       "全局",
	SkillPickerScopeBuiltin:      "内置",
	SkillPickerSubagent:          "子代理",
	SkillPickerAvailableLabel:    "可用",
	SkillPickerDisabledLabel:     "关闭",
	SkillPickerNoChanges:         "Skills 对话框已关闭：没有更改",
	SkillPickerSourceSkillsHint:  "↑↓ 移动 · Space 开关 · Enter 详情 · Esc 返回来源",
	SkillPickerSourceSkillsEmpty: "这个来源下没有 skill",
	SkillPickerActionToggle:      "切换启用状态",
	SkillPickerActionDelete:      "删除 skill",
	SkillPickerDeleteTitleFmt:    "删除 skill /%s？",
	SkillPickerDeleteConfirm:     "删除",
	SkillPickerDeleteCancel:      "取消",
	SkillPickerDeleteHint:        "Enter 确认 · y 删除 · n/Esc 取消",
	SkillPickerDeletedFmt:        "已删除 skill %s",
	SkillPickerMoreAboveFmt:      "↑ 上方还有 %d 个",
	SkillPickerMoreBelowFmt:      "↓ 下方还有 %d 个",
	SkillPickerTokenFmt:          "~%d tok",
	SkillPickerDetailMetaFmt:     "范围: %s  运行方式: %s",
	SkillPickerSkillsUnit:        "个 skill",
	SkillPickerLinesUnit:         "行",
	SkillPickerStatusLabel:       "技能选择器",
	SkillPickerStatusOK:          "有效",
	SkillPickerStatusMissing:     "缺失",
	SkillPickerStatusNotDir:      "非目录",
	SkillPickerStatusUnreadable:  "无权限",
	SlashPromptEmpty:             "该 MCP prompt 没有返回可发送的内容",
	SlashMCPNone:                 "没有配置 MCP 服务器 — 在 reasonix.toml 加一个 [[plugins]] 条目",
	CtrlCQuitHint:                "再按一次 Ctrl+C 退出",
	CompHintSlash:                "↑/↓ 移动 · Tab/Enter 选中 · Esc 关闭",
	CompHintFile:                 "↑/↓ 移动 · Tab/Enter 进入文件夹或选中文件 · Esc 关闭",
	MouseCopiedHint:              "已复制到剪贴板",
	ClipboardCopyOSC52Hint:       "已通过 OSC 52 请求复制 — 可能需要终端授权",
	ClipboardCopyFallbackHint:    "系统剪贴板不可用 — 已回退到 OSC 52",
	ClipboardTextPasteRemoteHint: "SSH 下鼠标粘贴无法读取本地剪贴板或 PRIMARY 选区 — 请使用终端粘贴快捷键或 /mouse",
	ClipboardTextPasteFailedFmt:  "粘贴文本失败：%v",
	ClipboardImagePastingHint:    "正在粘贴图片…",
	ClipboardImagePasteFailedFmt: "粘贴图片失败：%v",
	MouseCaptureOnHint:           "鼠标接管已开启 — 应用内拖拽选中/滚动条/滚轮生效",
	MouseCaptureOffHint:          "鼠标接管已关闭 — 由终端原生处理选中和右键菜单",
	MouseCaptureTag:              "终端原生鼠标",

	ShellExecEmpty:      "用法：!<命令>  （例如 !ls -la）",
	ShellExecFailedFmt:  "Shell 命令执行失败：%v",
	ShellExecTimeoutFmt: "Shell 命令超时（>%s）",
	ShellModeHint:       "Enter 执行 Shell · Esc 取消 · 点击输出展开",

	CmdNew:              "开启新会话并保存历史",
	CmdClear:            "丢弃当前上下文",
	CmdCls:              "清屏（保留 LLM 上下文）",
	CmdCompact:          "压缩上下文",
	CmdContinueChecks:   "继续已暂停的任务收尾检查",
	CmdContext:          "查看上下文窗口、阈值与上次维护结果",
	CmdRewind:           "回滚到更早的一轮",
	CmdTree:             "查看对话分支树",
	CmdBranch:           "创建对话分支",
	CmdSwitchBranch:     "切换对话分支",
	CmdResume:           "恢复已保存的会话",
	CmdRename:           "重命名会话",
	CmdModel:            "切换模型",
	CmdStatus:           "显示会话状态",
	CmdWorkMode:         "已弃用：自适应标准执行",
	CmdDocs:             "搜索与当前版本匹配的内置文档",
	CmdMemory:           "查看指令、记忆与恢复状态",
	CmdMigrate:          "重试旧数据迁移",
	CmdGoal:             "设置或清除当前目标",
	CmdRemember:         "保存一条记忆",
	CmdForget:           "归档一条已存记忆",
	CmdMcp:              "MCP 服务器",
	CmdRemote:           "远程 SSH 主机",
	CmdHooks:            "管理 hooks",
	CmdPlugins:          "管理插件包",
	CmdPasteImage:       "粘贴剪贴板图片",
	CmdOutputStyle:      "列出输出风格",
	CmdTheme:            "切换 CLI 主题",
	CmdLanguage:         "切换 CLI 语言",
	CmdCurrency:         "切换费用展示币种",
	CmdSkill:            "管理 skills",
	CmdVerbose:          "切换 thinking 原文显示",
	CmdReloadCmd:        "重载自定义命令",
	CmdReload:           "重载 agent 运行时（工具、技能、命令、钩子、模型供应商），保留当前会话",
	CmdDiffFold:         "切换 diff 折叠/展开",
	CmdSandbox:          "查看沙箱状态",
	CmdEffort:           "设置推理强度",
	CmdMouse:            "切换鼠标接管（关闭后由终端原生处理选中/右键）",
	CmdReasonLang:       "设置可见思考语言",
	CmdHelp:             "查看命令列表",
	CmdWeb:              "在 Web UI 中继续当前会话",
	CmdTodo:             "清除任务清单",
	CmdQuit:             "退出会话",
	CmdCopy:             "选择回复复制到剪贴板",
	CmdExport:           "将会话导出为 Markdown",
	SlashCopyDone:       "已复制到剪贴板",
	SlashCopyEmpty:      "没有可复制的助手回复",
	SlashCopyListHeader: "选择要复制的回复：",
	SlashExportDoneFmt:  "会话已导出到 %s",
	SlashExportEmpty:    "没有可导出的消息",
	ArgSkillShow:        "查看 skill 内容",
	ArgSkillNew:         "新建一个 skill",
	ArgSkillPaths:       "显示发现路径",
	ArgMcpAdd:           "连接一个服务器",
	ArgMcpRemove:        "断开一个服务器",
	ArgMcpConnected:     "已连接",
	ArgHooksList:        "列出生效的 hooks",
	ArgModelCurrent:     "当前",
	ArgEffortAuto:       "使用模型默认值",
	ArgEffortLow:        "较轻推理",
	ArgEffortMedium:     "均衡推理",
	ArgEffortHigh:       "较深推理",
	ArgEffortXHigh:      "超高推理",
	ArgEffortMax:        "最高推理",
	ArgThemeCurrent:     "当前",
	ArgLanguageAuto:     "从 REASONIX_LANG / 系统 locale 自动检测",
	ArgLanguageEn:       "English",
	ArgLanguageZh:       "中文",

	ListModelsHeaderFmt: "模型（当前：%s）",
	ListModelsHint:      "用底部的模型切换器，或输入 /model <provider/model>",
	ListMemorySaved:     "保存的记忆",
	ListMemoryArchived:  "归档的记忆",
	ListMemoryNone:      "暂无记忆 — 用 “/remember <内容>” 添加，或运行 /init 生成 AGENTS.md",
	ListSkillsHeaderFmt: "skills（%d 个）",
	ListSkillsNone:      "暂无 skill — 调用内置的（如 /init），或用 install_skill 创建一个",
	ListHooksHeaderFmt:  "hooks（生效 %d 个）",
	ListHooksNone:       "无生效 hooks — 在 .reasonix/settings.json（项目）或 <Reasonix home>/settings.json（全局）配置",
	ListMcpHeader:       "MCP 服务器",
	ListMcpNone:         "未连接 MCP 服务器 — 在 reasonix.toml（[[plugins]]）或项目 .mcp.json 中添加",

	MemoryEditHint:               "可直接编辑记忆文档，或输入 “/remember 内容” 快速记录；文档改动会在下次会话生效",
	ForgetUsage:                  "用法：/forget <name> — name 是 /memory 中显示的条目标识",
	ForgetDoneFmt:                "已归档记忆：%s",
	QuickRememberEmpty:           "没有要记录的内容",
	QuickRememberDoneFmt:         "已记住 → %s",
	GoalEmpty:                    "目标：无 — 用 /goal <目标> 设置",
	GoalCurrentFmt:               "目标：%s",
	GoalSetFmt:                   "目标已设置 → %s",
	GoalCleared:                  "目标已清除",
	GoalNotRunning:               "没有运行中的目标可暂停",
	GoalNotPaused:                "没有已暂停或被阻塞的目标可恢复",
	GoalPaused:                   "目标已暂停 — /goal resume 可继续",
	GoalPausedReason:             "用户手动暂停",
	GoalPausedFmt:                "目标已暂停（%s）— 使用 /goal resume 继续",
	GoalRuntimeFmt:               "运行状态：轮次 %d · 请求 %d · token %d · 工作时间 %s",
	GoalRuntimeLastReason:        "最近原因",
	ModelSwitchUnavailable:       "本会话不支持切换模型",
	ModelSwitchBusy:              "请先完成或取消当前工作，并停止后台任务后再切换模型",
	ModelAlreadyOnFmt:            "已经在使用 %s",
	ModelSwitchingFmt:            "正在切换到 %s…",
	ModelSwitchedFmt:             "已切换到 %s（会保留当前对话，但提示词缓存会重新计算）",
	ModelListHeader:              "模型（/model <provider/model> 切换）",
	RuntimeSwitchPending:         "请等待当前运行时切换完成",
	RuntimeReloadQueued:          "已加入重载队列——当前工作完成后执行",
	RuntimeReloaded:              "运行时已重载",
	RuntimeReloadedGenerationFmt: "运行时已重载（构建代号 %d）",
	WorkModeUsage:                "用法：/preset <standard|delivery>",
	WorkModeDeprecatedNotice:     "执行模式已改为会话级质量底线：/preset standard（默认）或 /preset delivery。轻量已并入标准档；自适应策略本就会轻跑轻任务。",
	QualityFloorApplied:          "质量底线已设置：后续轮次将使用交付级完成门槛。",
	RewindNone:                   "暂无可回滚的内容",
	RewindCodeConversation:       "代码 + 对话",
	RewindConversationOnly:       "仅对话",
	RewindCodeOnly:               "仅代码",
	RewindFork:                   "分叉",
	RewindSummarizeFrom:          "压缩此处之后（保留历史）",
	RewindSummarizeUpto:          "压缩此处之前（保留历史）",
	RewindPickTitle:              "⟲ 回滚 — 选择一轮",
	RewindPickHint:               "↑/↓ 移动 · Enter 选择 · Esc 关闭",
	RewindRestoreTitleFmt:        "⟲ 恢复到第 %d 轮 ",
	RewindApplyHint:              "↑/↓ · Enter 应用 · Esc 返回",
	RewindCoverageTitle:          "⚠ 文件覆盖不完整",
	RewindCoverageWarningFmt:     "检测到 %d 个覆盖缺口，部分文件修改可能无法恢复。",
	RewindConfirmHint:            "Enter/y 确认 · Esc 返回",
	RewindUnavailableFmt:         "无法回滚：%s",
	RewindEmpty:                  "(空)",

	EnterAPIKeysHeader:       "输入 API key（回车跳过、稍后再设）：",
	WroteFileFmt:             "已写入 %s",
	SetupComplete:            "设置完成。",
	SetupCancelled:           "设置已取消。",
	TryHintFmt:               "试试: %s",
	NextHint:                 "下一步：设置 API key（运行 `reasonix setup` 或 export DEEPSEEK_API_KEY=...），然后运行 `reasonix run \"你的任务\"`。",
	ConfirmReconfigureFmt:    "%s 已存在。重新配置并覆盖？",
	NotOverwritingFmt:        "%s 已存在，不覆盖",
	SetupManagerTitle:        "供应商配置",
	SetupAddOpenAI:           "添加 OpenAI 兼容供应商",
	SetupAddAnthropic:        "添加 Anthropic 兼容供应商",
	SetupProviderExistsFmt:   "供应商 %q 已存在。请进入现有供应商管理来编辑模型或设置。",
	SetupSaveExit:            "保存并退出",
	SetupSaveExitDesc:        "写入当前暂存的修改",
	SetupCancel:              "取消",
	SetupCancelDesc:          "放弃全部暂存修改",
	SetupModelsUnit:          "个模型",
	SetupKeySet:              "已设置 Key",
	SetupKeyMissing:          "缺少 Key",
	SetupDefaultBadge:        "默认",
	SetupProviderActionsFmt:  "管理 %s",
	SetupEditProvider:        "编辑供应商",
	SetupUpdateKey:           "更新 API Key",
	SetupTestRefresh:         "测试连接 / 刷新模型列表",
	SetupSetDefault:          "设置默认模型",
	SetupRemoveProvider:      "删除供应商",
	SetupBack:                "返回",
	SetupPromptModels:        "模型列表（用逗号分隔）",
	SetupSharedKeyWarningFmt: "%s 已被 %s（%s）使用。确认共享这项凭据？",
	SetupPromptAPIKeyFmt:     "输入 %s 的新值",
	SetupSelectDefaultModel:  "选择默认模型",
	SetupConfirmRemoveFmt:    "确认删除供应商 %s？",
	SetupSummaryTitle:        "待保存修改：",
	SetupSummaryAddedFmt:     "新增：%s",
	SetupSummaryEditedFmt:    "编辑：%s",
	SetupSummaryRemovedFmt:   "删除：%s",
	SetupSummaryDefaultFmt:   "默认模型：%s",
	SetupSummaryKeysFmt:      "更新 API Key：%d 项",
	SetupSummaryNoChanges:    "没有修改",
	SetupConfirmSave:         "保存这些修改？",
	SetupConcurrentChangeFmt: "setup 打开期间配置已被修改（%s）。本次暂存修改未写入，请重新运行 setup 检查最新配置。",

	// model fetching
	FetchingModelsFmt:          "正在获取 %s 的模型列表...",
	FetchModelsSuccessFmt:      "发现 %d 个 %s 模型",
	FetchModelsFailedFmt:       "获取 %s 模型失败: %v",
	FetchModelsUsingPresetsFmt: "无法在线获取 %s 的模型，使用预设列表",
	SelectModelsLabel:          "选择要启用的 %s 模型",
	CustomFetchEmpty:           "/models 返回为空，回退到手动输入",
	AnthropicFetchEmpty:        "/models 返回为空 — Anthropic 兼容服务通常不提供此端点，回退到手动输入",
	APIKeyAlreadySetFmt:        "复用已设置的 %s",
	APIKeyResetPromptFmt:       "重新输入 %s？",
	InvalidAPIKeyEnvFmt:        "%q 不是有效的 API Key 变量名。只能使用字母、数字和下划线（例如 MY_PROVIDER_API_KEY）；这里不要填写模型名。",
	RepairedAPIKeyEnvFmt:       "provider %s：已将无效的 API Key 变量名 %q 修复为 %q",

	// custom provider
	CustomProviderDesc:   "添加第三方 OpenAI 兼容模型",
	CustomAddMethodLabel: "添加第三方 OpenAI 兼容模型 - 选择添加方式",
	CustomMethodManual:   "手动输入模型名称",
	CustomMethodURL:      "从 URL 获取模型列表",
	CustomPromptModel:    "请输入模型名称",
	CustomPromptBaseURL:  "请输入 Base URL",
	CustomPromptKeyEnv:   "API Key 变量名（直接回车使用默认值，不是模型名）",
	CustomPromptAPIKey:   "请输入 API Key",
	CustomPromptWindow:   "上下文窗口(tokens,填得比模型真实窗口小会导致过早压缩)",
	CustomAddedFmt:       "已添加自定义模型: %s",

	// Anthropic 兼容 provider
	AnthropicProviderDesc:          "添加第三方 Anthropic 兼容模型",
	AnthropicAddMethodLabel:        "添加第三方 Anthropic 兼容模型 - 选择添加方式",
	AnthropicMethodManual:          "手动输入模型名称",
	AnthropicMethodURL:             "从 URL 获取模型列表",
	AnthropicPromptModel:           "请输入模型名称",
	AnthropicPromptBaseURL:         "请输入 Base URL",
	AnthropicPromptKeyEnv:          "API Key 变量名（直接回车使用默认值，不是模型名）",
	AnthropicPromptAPIKey:          "请输入 API Key",
	AnthropicAddedFmt:              "已添加 Anthropic 兼容模型: %s",
	AnthropicFetchingModelsFmt:     "正在获取 %s 的模型列表...",
	AnthropicFetchModelsSuccessFmt: "发现 %d 个 %s 模型",
	AnthropicFetchModelsFailedFmt:  "获取 %s 模型失败: %v",
	AnthropicSelectModelsLabel:     "选择要启用的 %s 模型",

	RemoteConnectingFmt:       "正在连接 %s…",
	RemoteConnectedFmt:        "已连接到 %s",
	RemoteReconnectingFmt:     "正在重连 %s（第 %d 次）…",
	RemoteDegradedFmt:         "已连接到 %s，但部分端口转发未建立",
	RemoteDisconnected:        "已断开（远端 serve 仍在运行）",
	RemoteServeReadyFmt:       "远端 serve 就绪：%s",
	RemoteHostKeyPromptFmt:    "未知的主机密钥 %s\n  类型：%s\n  指纹：%s",
	RemotePassphrasePromptFmt: "%s 的密钥口令：",
	RemotePasswordPromptFmt:   "%s 的登录密码：",
	RemoteBootstrapStepFmt:    "远端 serve：%s %s",
	RemoteNoHostsHint:         "尚未配置远程主机；用 `reasonix remote add <名称> [user@]host` 添加",

	UnknownCommandFmt:         "未知命令 %q",
	UsageRunHint:              "用法：reasonix -p [--model NAME] <task>",
	ErrorPrefix:               "错误：",
	ReconfigureOnUnknownModel: "配置的模型已不可用 —— 重新运行引导配置。",
	WriteConfigErr:            "写入配置失败：",
	WriteEnvErr:               "写入 .env 失败：",

	ProviderErrBadRequest:          "请求格式错误 (HTTP 400)：请求体被拒绝，通常是程序缺陷。若持续出现请反馈。",
	ProviderErrContextOverflowFmt:  "请求超出共享上下文窗口：prompt %d + 输出 %d = %d tokens，窗口只有 %d。请压缩、用更小的输出上限重试、分叉或回溯后再发送。",
	ProviderErrAuth:                "认证失败 (HTTP 401)：未读到 API key（缺失或未设置）。请在 .env 中配置密钥，或运行 `reasonix setup`。",
	ProviderErrAuthRejected:        "认证失败 (HTTP 401)：服务端拒绝了你的 API key。可能是 key 错误或已过期，也可能是服务端出现瞬时鉴权/额度问题——已退避重试仍失败。请稍后再试，或检查 .env 中的密钥 / 运行 `reasonix setup`。",
	ProviderErrModelFormatMismatch: "模型/API 格式不匹配：服务端不支持当前模型使用所选 provider 线路。这不是 API key 失效；请选择支持该模型的 provider 线路。",
	ProviderErrOpenCodeGoGrokRoute: "OpenCode Go 的 `grok-4.5` 请使用 OpenCode Go Responses 预设。",
	ProviderErrInsufficientBalance: "余额不足 (HTTP 402)：账户余额不足，请前往充值后重试。",
	ProviderErrUnprocessable:       "参数错误 (HTTP 422)：某个请求参数被拒绝，通常是程序缺陷。若持续出现请反馈。",
	ProviderErrInputSensitive:      "输入被 MiniMax 内容审查拒绝（错误码 1026）。审查对象可能包含会话历史和工具结果；请调整相关内容，或新建会话仅保留必要上下文。原样重试通常无效。",
	ProviderErrOutputSensitive:     "MiniMax 生成的内容被内容审查拒绝（错误码 1027）。请调整请求内容后重试；若持续出现，可改用其他服务商。",
	ProviderErrRateLimited:         "请求速率达到上限 (HTTP 429)：请求过于频繁 (TPM/RPM)。已退避重试，请放慢速率或稍后再试。",
	ProviderErrServer:              "服务器故障 (HTTP 500)：服务端内部错误。已退避重试；若持续失败请稍后再试。",
	ProviderErrServerBusy:          "服务器繁忙 (HTTP 503)：服务端负载过高。已退避重试，请稍后再试。",

	SelectOneHint:  "(↑/↓ · Enter · q 取消；/ 搜索)",
	SelectManyHint: "(↑/↓ · Space · Enter · q；/ 搜索)",

	SelectMoreAboveFmt: "  ↑ 上方还有 %d 个",
	SelectMoreBelowFmt: "  ↓ 下方还有 %d 个",
	SelectSearchHint:   "/ 搜索 · 输入关键词过滤 · Esc 取消搜索",

	CmdProvider:          "切换供应商",
	ProviderListHeader:   "供应商（/provider <名称> 切换）",
	ProviderAlreadyOnFmt: "已经在使用供应商 %s",
	ProviderUnknownFmt:   "未知供应商 %q",
	ProviderPickLabel:    "选择 %s 的一个模型",
	ProviderNoModelsFmt:  "供应商 %s 没有已配置的模型",

	// 自更新
	UpgradeChecking:            "正在检查更新…",
	UpgradeChannelDeprecated:   "发布渠道已停用；将使用最新正式版。",
	UpgradeDevBuild:            "开发版本无法自更新",
	UpgradeFetchFailed:         "检查更新失败：%v",
	UpgradeInvalidVersion:      "远程版本不是有效的 semver",
	UpgradeAlreadyLatest:       "已是最新版本。",
	UpgradeForcing:             "强制重新安装当前版本…",
	UpgradeAvailableFmt:        "当前：%s → 最新：%s",
	UpgradeNoAssetFmt:          "未找到 %s 的安装包",
	UpgradeDownloadingFmt:      "正在下载 %s（%s）…",
	UpgradeDownloadFailed:      "下载失败：%v",
	UpgradeVerifying:           "正在校验 SHA256…",
	UpgradeChecksumFailed:      "无法获取校验文件：%v",
	UpgradeChecksumMismatchFmt: "SHA256 不匹配：得到 %s，期望 %s",
	UpgradeChecksumNotFoundFmt: "SHA256SUMS 中未找到 %s",
	UpgradeExtractFailed:       "解压二进制文件失败：%v",
	UpgradeApplying:            "正在替换二进制文件…",
	UpgradeApplyFailed:         "应用更新失败：%v",
	UpgradeSuccessFmt:          "已更新 %s → %s",

	ReportNoPending:           "没有待处理的 CLI 崩溃报告。",
	ReportHeaderFmt:           "CLI 崩溃报告 %s",
	ReportCapturedFmt:         "捕获时间：%s",
	ReportPreviewOnlyFmt:      "当前仅预览。运行 `reasonix report send %s` 可发送这份报告。",
	ReportSendPrompt:          "将这份已脱敏报告发送到 crash.reasonix.io？",
	ReportKept:                "报告已保留在本地。",
	ReportDeletedFmt:          "已删除 CLI 崩溃报告 %s。",
	ReportSentFmt:             "已发送 CLI 崩溃报告 %s。",
	ReportConfigFailedFmt:     "无法加载网络配置：%v",
	ReportUploadFailedFmt:     "报告上传失败；本地报告已保留：%v",
	ReportSentDeleteFailedFmt: "报告已发送，但无法删除本地副本：%v",
	ReportUsageBody: `用法：
  reasonix report                 预览最新本地报告并确认是否发送
  reasonix report list            列出本地 CLI 崩溃报告
  reasonix report show [ID]       预览报告（省略 ID 时使用最新一份）
  reasonix report send [ID]       发送已审阅报告，成功后删除本地副本
  reasonix report delete [ID]     不发送，直接删除本地报告`,

	CLITelemetryConsentNotice:           "Reasonix 可以向 crash.reasonix.io 发送匿名、完全不含内容的 CLI 使用统计：随机安装 ID、版本、操作系统和固定质量分桶。绝不会发送 prompt、回答、代码、路径、模型或工具内容、环境变量。之后可运行 `reasonix config telemetry off` 关闭。",
	CLITelemetryConsentPrompt:           "允许发送匿名 CLI 使用统计吗？",
	CLITelemetryConsentInvalid:          "请输入 y 或 n。",
	CLITelemetryConsentSaveFailedFmt:    "由于无法保存偏好设置，CLI 使用统计仍保持关闭：%v",
	CLITelemetryConsentCleanupFailedFmt: "CLI 使用统计已关闭，但无法删除待发送统计：%v",

	UsageBody: `reasonix — 由配置和插件驱动的 coding agent（多模型）

用法：
  reasonix [--model NAME] [-c|--continue] [-r|--resume [QUERY]] [--permission-mode MODE] [--effort LEVEL] [--add-dir PATH]   交互式会话
  reasonix -p|--print [--model NAME] [--output-format text|json|stream-json] [--allowed-tools RULES] [--add-dir PATH] <task>
  reasonix run [--model NAME] [--max-steps N] [-c|--continue] [--resume PATH] [--copy] [--output-format FORMAT] <task>
  reasonix run --events-jsonl [--model NAME] <task>      输出脱敏结构化事件 JSONL
  reasonix review [--base BRANCH] [--commit SHA] [--model NAME]  AI 代码审查（基于本地 diff）
  reasonix web [--model NAME] [--addr HOST:PORT] [--no-open]  启动本地 Web UI 并用默认浏览器打开
  reasonix serve [--model NAME] [--addr HOST:PORT] [--auth none|token|password] [--token STR] [--password STR] [--hash-password]  通过 HTTP+SSE 提供服务（支持可选认证）
  reasonix acp [--model NAME]                           通过 stdio 提供 Agent Client Protocol（也可用：reasonix --acp）
  reasonix setup [path]                                 交互式配置向导；生成 reasonix.toml（及 .env）
  reasonix config reasoning-language [auto|zh|en]        配置可见思考语言
  reasonix config compact-ratio [--local] [30..85]       配置自动压缩阈值
  reasonix config telemetry [auto|on|off]                配置不含内容的 CLI 使用统计
  reasonix report [list|show|send|delete] [ID]           审阅并明确发送本地 CLI 崩溃报告
  reasonix mcp <add|remove|list|import>                 管理 reasonix.toml 里的 MCP 服务器
  reasonix subagent <list|create|edit|delete|try|run>   管理和运行隔离子智能体 profile
  reasonix init                                         查看如何生成项目记忆（AGENTS.md）
  reasonix doctor [--json]                              输出脱敏的本地诊断信息
  reasonix doctor session <branch-id> [--zip] [--out PATH]  导出会话冲突诊断 zip
  reasonix session list --json [--dir PATH]             为机器客户端列出脱敏会话
  reasonix session show|status <machine-session-id> --json [--dir PATH]  查询单个脱敏会话
  reasonix session recovery [<machine-session-id>] --json [--dir PATH]  查询脱敏恢复状态
  reasonix hook list|status --json [--dir PATH]         查看脱敏 Hook 状态
  reasonix task list|show|status|events|stop|cancel|monitor|tmux --json [--dir PATH]
                                                         查看或控制脱敏 Task
  reasonix bot start|doctor|weixin-login                多渠道 IM bot 网关
  reasonix upgrade [--check] [--force]                   更新到最新正式版（别名：reasonix update）
  reasonix completion bash|zsh|fish                     打印 shell 补全脚本到 stdout
  reasonix version [--verbose|--json]                   打印版本（单行）或构建元信息
  reasonix --version | -v                               单行版本（脚本安全）
  reasonix help

示例：
  reasonix
  reasonix --continue
  reasonix --resume provider-config
  reasonix web
  reasonix run "把 main.go 里的 TODO 实现掉"
  reasonix run --model mimo-pro "给这个函数补单元测试"
  reasonix -p "总结这个仓库" --output-format json
  reasonix subagent run review "审查当前改动"
  echo "解释这段代码" | reasonix run

配置：
  优先级：flag > ./reasonix.toml > <Reasonix home>/config.toml > 内置默认值
  密钥通过 api_key_env 从环境变量注入（如 DEEPSEEK_API_KEY）。
  运行 'reasonix setup' 生成配置；详见 docs/SPEC.md。
`,
}
