import type { Messages } from '../types'; export const zhCNAiMessages: Messages = { // AI Settings 'ai.agentSettings': 'Agent 设置', 'ai.chat.preparing': '准备中…', 'ai.chat.compactingContext': '正在压缩较早的上下文…', 'ai.chat.compactingStep': '正在为下一步整理上下文…', 'ai.chat.compactionRetry': '请求过大,正在压缩上下文并重试…', 'ai.chat.compactionBanner': '上下文已压缩:{before}K → {after}K tokens', 'ai.chat.contextUsage': '上下文使用:{used} / {max} tokens', 'ai.chat.activity.title': 'Agent 活动', 'ai.chat.activity.plan': '计划', 'ai.chat.activity.webSearch': '网页搜索', 'ai.chat.activity.fileChanges': '文件变更', 'ai.chat.activity.status.running': '进行中', 'ai.chat.activity.status.completed': '已完成', 'ai.chat.activity.status.failed': '失败', 'ai.chat.activity.file.add': '新增', 'ai.chat.activity.file.update': '修改', 'ai.chat.activity.file.delete': '删除', 'ai.chat.activity.usage': 'Token', 'ai.chat.activity.usage.input': '输入', 'ai.chat.activity.usage.output': '输出', 'ai.chat.activity.usage.cached': '缓存', 'ai.chat.activity.usage.reasoning': '推理', 'ai.title': 'AI', 'ai.description': '配置 AI 提供商、Agent 和安全设置', 'ai.providers': '提供商', 'ai.agents': 'Agent', 'ai.providers.empty': '尚未配置提供商。添加一个提供商以开始使用。', 'ai.providers.add': '添加提供商', 'ai.providers.active': '活跃', 'ai.providers.apiKeyConfigured': 'API Key 已配置', 'ai.providers.noApiKey': '未设置 API Key', 'ai.providers.configure': '配置', 'ai.providers.remove': '移除', 'ai.providers.name': '显示名称', 'ai.providers.name.placeholder': '例如 我的提供商', 'ai.providers.style': '协议风格', 'ai.providers.style.anthropic': 'Anthropic 兼容', 'ai.providers.style.openai': 'OpenAI 兼容', 'ai.providers.style.google': 'Google 兼容', 'ai.providers.style.inherited': '默认', 'ai.providers.style.help': '决定请求使用哪种 API 格式。当第三方端点的协议与其提供商类型不一致时,可手动覆盖。', 'ai.providers.openaiApi': 'OpenAI 请求格式', 'ai.providers.openaiApi.chat': 'Chat Completions', 'ai.providers.openaiApi.responses': 'Responses', 'ai.providers.openaiApi.help': '默认 Chat Completions,兼容大多数 OpenAI 兼容接口。部分中转站在 Responses(/v1/responses)上缓存命中率更高。', 'ai.providers.icon.change': '修改图标', 'ai.providers.icon.upload': '上传图片', 'ai.providers.icon.reset': '恢复默认', 'ai.providers.icon.close': '收起', 'ai.providers.icon.uploadedNote': '自定义图标(64×64 WebP)', 'ai.providers.icon.errorType': '请选择图片文件。', 'ai.providers.apiKey': 'API Key', 'ai.providers.apiKey.placeholder': '输入 API Key', 'ai.providers.apiKey.decrypting': '解密中...', 'ai.providers.baseUrl': 'Base URL', 'ai.providers.baseUrl.anthropicHelp': 'Anthropic 兼容:可填不带或带 /v1 的主机(例如 https://gateway.example 或 https://gateway.example/v1)。检测与聊天都会请求 /v1/models、/v1/messages。', 'ai.providers.baseUrl.ollamaHelp': '本地 Ollama:http://localhost:11434/v1(无需 API Key)。Ollama Cloud:https://ollama.com/v1,并填写 Cloud API Key。', 'ai.providers.skipTLSVerify': '跳过 TLS 证书验证(用于自签名证书)', 'ai.providers.defaultModel': '默认模型', 'ai.providers.defaultModel.placeholder': '例如 gpt-4o, claude-sonnet-4-20250514', 'ai.providers.contextWindow': '上下文窗口', 'ai.providers.contextWindow.placeholder': '例如 128000', 'ai.providers.contextWindow.help': '留空时优先使用模型列表返回的值;如果没有,NetMesh 会使用安全默认值。', 'ai.providers.contextWindow.error': '请输入正整数,或留空。', 'ai.providers.refreshModels': '刷新模型列表', 'ai.providers.test': '检测', 'ai.providers.test.testing': '检测中…', 'ai.providers.test.ok': '连接正常({latency} ms)', 'ai.providers.test.warn': '已连通,但响应不完整({latency} ms)', 'ai.providers.test.warnSlow': '已连通,但较慢({latency} ms)', 'ai.providers.test.error': '检测失败({detail})', 'ai.providers.test.missingBaseUrl': '请先填写 Base URL', 'ai.providers.test.missingApiKey': '请先填写 API Key', 'ai.providers.test.unavailable': '当前环境无法进行连接检测', 'ai.providers.searchModel': '搜索或输入模型 ID...', 'ai.providers.filterModels': '筛选模型...', 'ai.providers.loadingModels': '加载模型中...', 'ai.providers.noMatchingModels': '没有匹配的模型', 'ai.providers.clickToLoadModels': '点击加载模型', 'ai.providers.showingModels': '显示前 100 个,共 {count} 个模型。输入以筛选。', 'ai.providers.advancedParams': '高级参数', 'ai.providers.advancedParams.hint': '留空则使用提供商默认值。', 'ai.providers.advancedParams.maxTokens.placeholder': '例如 4096', 'ai.providers.advancedParams.default': '提供商默认', // AI Codex 'ai.codex': 'Codex', 'ai.codex.title': 'Codex CLI', 'ai.codex.description': '接入 OpenAI Codex。可以在这里登录 ChatGPT,也可以在设置里启用兼容 OpenAI 的 API Key 和自定义接口地址。', 'ai.codex.appServer.title': '使用 Codex App Server', 'ai.codex.appServer.experimental': '实验性', 'ai.codex.appServer.description': '使用持久化 Codex 协议,提供原生审批、沙箱控制、动态模型和对话中提问。默认仍使用 SDK。', 'ai.codex.appServer.checking': '正在检查 App Server 支持…', 'ai.codex.appServer.available': '当前 Codex CLI 支持 App Server。', 'ai.codex.appServer.modelCatalogWarning': 'Codex 动态模型目录暂不可用,当前将使用内置模型列表。', 'ai.codex.appServer.approval.allowSession': '本会话允许', 'ai.codex.appServer.userInput.title': 'Codex 需要你的输入', 'ai.codex.appServer.userInput.description': '回答以下问题以继续当前任务。', 'ai.codex.appServer.userInput.other': '输入其他答案', 'ai.codex.appServer.userInput.autoResolve': '若未及时回答,Codex 将自动继续。', 'ai.codex.appServer.userInput.skip': '跳过', 'ai.codex.appServer.userInput.submit': '继续', 'ai.codex.steer.addInstruction': '补充指令', 'ai.codex.steer.sending': '正在补充指令…', 'ai.codex.steer.placeholder': '在 Codex 工作时补充指令…', 'ai.codex.steer.notSteerableReview': '当前 Codex 审查任务无法接收补充指令,草稿已保留。', 'ai.codex.steer.notSteerableCompact': '当前 Codex 压缩任务无法接收补充指令,草稿已保留。', 'ai.codex.steer.busy': '已有一条补充指令正在发送给 Codex。', 'ai.codex.steer.inactive': '当前 Codex 任务已经结束,草稿已保留。', 'ai.codex.steer.unsupported': '运行中补充指令仅支持 Codex App Server。', 'ai.codex.steer.failed': 'Codex 未能接收补充指令,草稿已保留。', 'ai.codex.detecting': '检测中...', 'ai.codex.notFound': '未找到', 'ai.codex.awaitingLogin': '等待登录', 'ai.codex.connectedChatGPT': '已通过 ChatGPT 连接', 'ai.codex.connectedApiKey': '已通过 API Key 连接', 'ai.codex.connectedCustomConfig': '使用 ~/.codex/config.toml 自定义 provider', 'ai.codex.customConfigIncomplete': '检测到自定义配置(缺少环境变量)', 'ai.codex.customConfigHint': '使用 ~/.codex/config.toml 中配置的自定义 provider "{provider}",无需 ChatGPT 登录。', 'ai.codex.customConfigMissingEnvKey': '警告:环境变量 {envKey} 未在当前 shell 中设置。请 export 它(或从包含该变量的 shell 启动 NetMesh),否则 Codex 无法鉴权。', 'ai.codex.notConnected': '未连接', 'ai.codex.statusUnknown': '状态未知', 'ai.codex.path': '路径:', 'ai.codex.notFoundHint': '在 PATH 中未找到 codex。请安装或在下方指定可执行文件路径。', 'ai.codex.customPathPlaceholder': '例如 /usr/local/bin/codex', 'ai.codex.check': '检查', 'ai.codex.resetPath': '重置', 'ai.codex.openLogin': '打开登录', 'ai.codex.logout': '退出登录', 'ai.codex.connectChatGPT': '连接 ChatGPT', 'ai.codex.refreshStatus': '刷新状态', // AI Claude Code 'ai.claude.title': 'Claude Code', 'ai.claude.description': 'Anthropic 的智能编程助手。需要系统中已安装 Claude Code CLI。', 'ai.claude.detecting': '检测中...', 'ai.claude.detected': '已检测到', 'ai.claude.notFound': '未找到', 'ai.claude.path': '路径:', 'ai.claude.notFoundHint': '在 PATH 中未找到 claude。请安装或在下方指定可执行文件路径。', 'ai.claude.customPathPlaceholder': '例如 /usr/local/bin/claude', 'ai.claude.configSection': '认证与配置(可选)', 'ai.claude.configDir': '配置目录', 'ai.claude.configDir.placeholder': '~/.claude(留空用默认)', 'ai.claude.configDir.hint': '设置 CLAUDE_CONFIG_DIR —— 指向你已运行 `claude` 登录的目录(含 settings.json 和凭据)。', 'ai.claude.settings': 'Settings 文件', 'ai.claude.settings.placeholder': '~/team-settings.json(路径,或内联 {"model":"..."})', 'ai.claude.settings.hint': '可选。settings.json 路径或内联 JSON,作为 SDK 的 `settings` 传入。与上面的「配置目录」互补且独立(叠加合并,不是替换)。', 'ai.claude.envVars': '环境变量', 'ai.claude.envVars.placeholder': 'ANTHROPIC_BASE_URL=https://...\nANTHROPIC_MODEL=...', 'ai.claude.envVars.hint': '每行一个 KEY=VALUE,传给 Claude agent。明文存在本地——API key/凭据建议用上面的「配置目录」(claude 登录),不要放这里。', 'ai.claude.check': '检查', 'ai.claude.resetPath': '重置', // AI GitHub Copilot CLI 'ai.copilot.title': 'GitHub Copilot CLI', 'ai.copilot.description': '接入 GitHub Copilot CLI。检测到后即可作为外部编程 Agent 使用。', 'ai.copilot.detecting': '检测中...', 'ai.copilot.detected': '已检测到', 'ai.copilot.notFound': '未找到', 'ai.copilot.path': '路径:', 'ai.copilot.notFoundHint': '在 PATH 中未找到 copilot。请安装或在下方指定可执行文件路径。', 'ai.copilot.customPathPlaceholder': '例如 /usr/local/bin/copilot', 'ai.copilot.check': '检查', 'ai.copilot.resetPath': '重置', // AI Cursor SDK 'ai.cursor.title': 'Cursor', 'ai.cursor.description': '使用 Cursor SDK 或本地 Agent CLI 登录。', 'ai.cursor.detecting': '检测中...', 'ai.cursor.detected': '可用', 'ai.cursor.notFound': '不可用', 'ai.cursor.path': '运行环境:', 'ai.cursor.notFoundHint': '填写 API Key,或切换到 CLI 登录模式。', 'ai.cursor.notInstalledHint': '未检测到 Cursor SDK / Agent CLI。', 'ai.cursor.installStatus': 'Cursor 运行时', 'ai.cursor.installed': '已检测到', 'ai.cursor.notInstalled': '未检测到', 'ai.cursor.modeCli': 'CLI 登录', 'ai.cursor.modeApiKey': 'API Key', 'ai.cursor.modeCliHint': '使用本机 `cursor-agent login` 会话与订阅 Auto 额度。已保存的 API Key 会保留,但此模式不会使用。', 'ai.cursor.modeApiKeyHint': '走 Cursor 计量 API。此模式下不会使用 CLI 登录。', 'ai.cursor.cliLoginStatus': 'CLI 登录', 'ai.cursor.cliLoginOk': '已登录', 'ai.cursor.cliLoginAs': '已登录为 {{email}}', 'ai.cursor.cliLoginMissing': '未登录', 'ai.cursor.cliLoginHint': '在终端运行 `cursor-agent login`,然后点击「检查」。', 'ai.cursor.apiKeyStatus': 'API Key', 'ai.cursor.apiKeyConfigured': '已填写', 'ai.cursor.apiKeyMissing': '未填写', 'ai.cursor.apiKeyFromEnv': '来自环境变量', 'ai.cursor.apiKey': 'API Key', 'ai.cursor.apiKeyPlaceholder': '输入 Cursor API Key', 'ai.cursor.apiKeyPlaceholder.env': '已使用 CURSOR_API_KEY;填写后会覆盖', 'ai.cursor.apiKeyEnvHint': '已检测到本机 CURSOR_API_KEY。留空即可继续使用,填写保存后会覆盖它。', 'ai.cursor.apiKeyOverrideHint': '当前优先使用这里保存的 Key;清空保存后会回到 CURSOR_API_KEY。', 'ai.cursor.saveApiKey': '保存', 'ai.cursor.saved': '已保存', 'ai.cursor.showApiKey': '显示 API Key', 'ai.cursor.hideApiKey': '隐藏 API Key', 'ai.cursor.customPathPlaceholder': '例如 /usr/local/bin/cursor', 'ai.cursor.check': '检查', // AI CodeBuddy Code 'ai.codebuddy.title': 'CodeBuddy Code', 'ai.codebuddy.description': '通过官方 Agent SDK(`@tencent-ai/agent-sdk`)接入 CodeBuddy Code。检测到后即可作为外部编程 Agent 使用。', 'ai.codebuddy.detecting': '检测中...', 'ai.codebuddy.detected': '已检测到', 'ai.codebuddy.notFound': '未找到', 'ai.codebuddy.path': '路径:', 'ai.codebuddy.notFoundHint': '在 PATH 中未找到 codebuddy。请安装或在下方指定可执行文件路径。', 'ai.codebuddy.customPathPlaceholder': '例如 /usr/local/bin/codebuddy', 'ai.codebuddy.check': '检查', 'ai.codebuddy.resetPath': '重置', 'ai.codebuddy.configSection': '认证与配置(可选)', 'ai.codebuddy.internetEnv': '网络环境', 'ai.codebuddy.internetEnv.default': '默认(海外)', 'ai.codebuddy.internetEnv.internal': 'Internal', 'ai.codebuddy.internetEnv.ioa': 'IOA', 'ai.codebuddy.internetEnv.hint': '设置 CODEBUDDY_INTERNET_ENVIRONMENT —— 受限网络环境请选择 Internal 或 IOA。', 'ai.codebuddy.envVars': '环境变量', 'ai.codebuddy.envVars.placeholder': 'CODEBUDDY_API_KEY=...\nCODEBUDDY_AUTH_TOKEN=...\nOTHER_VAR=...', 'ai.codebuddy.envVars.hint': '每行一个 KEY=VALUE,传给 CodeBuddy agent。可在此设置 CODEBUDDY_API_KEY 或 CODEBUDDY_AUTH_TOKEN 完成认证。明文存在本地。', 'ai.codebuddy.advancedSection': '高级选项(SDK 0.3.230)', 'ai.codebuddy.effort': '推理力度', 'ai.codebuddy.effort.default': '默认', 'ai.codebuddy.effort.low': 'Low', 'ai.codebuddy.effort.medium': 'Medium', 'ai.codebuddy.effort.high': 'High', 'ai.codebuddy.effort.xhigh': 'XHigh', 'ai.codebuddy.effort.hint': '控制模型推理深度。简单命令用 Low 节省 token,复杂诊断用 High/XHigh。', 'ai.codebuddy.maxTurns': '最大轮次', 'ai.codebuddy.maxTurns.hint': '限制每次请求的最大对话轮次,防止 AI 失控循环。留空使用默认值。', 'ai.codebuddy.maxBudget': '预算上限 (USD)', 'ai.codebuddy.maxBudget.hint': '每次请求的最大花费(美元)。超出后自动停止。留空不限制。', 'ai.codebuddy.sandbox': '沙箱模式', 'ai.codebuddy.sandbox.hint': '在沙箱中执行工具调用,限制文件系统和网络访问。', 'ai.codebuddy.fileCheckpointing': '文件检查点', 'ai.codebuddy.fileCheckpointing.hint': '启用文件操作检查点,AI 修改文件后可回滚。', 'ai.codebuddy.elicitation.title': 'CodeBuddy 需要你的输入', 'ai.codebuddy.elicitation.description': '请确认或填写请求内容以继续当前轮次。', 'ai.codebuddy.elicitation.select': '请选择', 'ai.codebuddy.elicitation.yes': '是', 'ai.codebuddy.elicitation.no': '否', 'ai.codebuddy.elicitation.decline': '拒绝', 'ai.codebuddy.elicitation.accept': '继续', 'ai.codebuddy.elicitation.validation.required': '{field} 为必填项。', 'ai.codebuddy.elicitation.validation.invalidType': '{field} 的值无效。', 'ai.codebuddy.elicitation.validation.integer': '{field} 必须是整数。', 'ai.codebuddy.elicitation.validation.notInteger': '{field} 必须是整数。', 'ai.codebuddy.elicitation.validation.minimum': '{field} 不能小于 {limit}。', 'ai.codebuddy.elicitation.validation.maximum': '{field} 不能大于 {limit}。', 'ai.codebuddy.elicitation.validation.minLength': '{field} 至少需要 {limit} 个字符。', 'ai.codebuddy.elicitation.validation.maxLength': '{field} 最多允许 {limit} 个字符。', 'ai.codebuddy.elicitation.validation.minItems': '{field} 至少选择 {limit} 项。', 'ai.codebuddy.elicitation.validation.maxItems': '{field} 最多选择 {limit} 项。', 'ai.codebuddy.elicitation.validation.format': '{field} 必须符合 {format} 格式。', 'ai.codebuddy.elicitation.validation.option': '请为 {field} 选择有效选项。', // AI OpenCode 'ai.opencode.title': 'OpenCode', 'ai.opencode.description': '通过官方 SDK 接入 OpenCode。先在 OpenCode 里配置 provider 和密钥,检测到后即可作为外部编程 Agent 使用。', 'ai.opencode.detecting': '检测中...', 'ai.opencode.detected': '已检测到', 'ai.opencode.notFound': '未找到', 'ai.opencode.path': '路径:', 'ai.opencode.notFoundHint': '在 PATH 中未找到 opencode。请安装或在下方指定可执行文件路径。', 'ai.opencode.customPathPlaceholder': '例如 /usr/local/bin/opencode', 'ai.opencode.check': '检查', 'ai.opencode.resetPath': '重置', // AI Grok Build(应用内托管 Agent,与 External MCP「添加到 Grok」不同) 'ai.grok.title': 'Grok Build', 'ai.grok.description': 'xAI 的 Grok Build 编程 Agent CLI。安装 Grok CLI,使用 `grok login` 登录或设置 XAI_API_KEY 后,即可作为外部 Agent 选择。', 'ai.grok.detecting': '检测中...', 'ai.grok.detected': '已检测到', 'ai.grok.notFound': '未找到', 'ai.grok.path': '路径:', 'ai.grok.notFoundHint': '在 PATH 中未找到 grok。请安装 Grok Build CLI 或在下方指定可执行文件路径。', 'ai.grok.customPathPlaceholder': '例如 /usr/local/bin/grok', 'ai.grok.check': '检查', 'ai.grok.resetPath': '重置', 'ai.grok.runtime.acp.title': '使用 Grok ACP(agent stdio)', 'ai.grok.runtime.acp.default': '默认', 'ai.grok.runtime.acp.description': '通过 Agent Client Protocol(grok agent stdio)接入 Grok。在 session/new 注入 NetMesh MCP。关闭后使用原始 headless streaming-json CLI 路径。', 'ai.grok.runtime.streamingJson.hint': '当前为 headless streaming-json(grok -p --output-format streaming-json)。MCP 通过项目 .grok/config.toml 注入。', // AI Default Agent 'ai.defaultAgent': '默认 Agent', 'ai.defaultAgent.description': '创建新 AI 会话时使用的 Agent', 'ai.defaultAgent.catty': 'Catty(内置)', 'ai.toolAccess.title': '工具接入', 'ai.toolAccess.mode': 'NetMesh 接入模式', 'ai.toolAccess.description': '选择外部 Agent 访问 NetMesh 会话的方式。MCP 会暴露内置服务器,Skills + CLI 会引导 Agent 读取本地 Skill 并调用 NetMesh CLI。', 'ai.toolAccess.mode.mcp': 'MCP', 'ai.toolAccess.mode.skills': 'Skills + CLI', 'ai.toolAccess.mcpPrompt.title': '喂给 AI 的接入提示词', 'ai.toolAccess.mcpPrompt.description': '把这段提示词粘贴到你的 AI 客户端(Codex、Claude Code 等),它就会帮你完成 NetMesh MCP 的注册。', 'ai.toolAccess.mcpPrompt.enableHint': '先在下方打开对外 MCP 开关,提示词中才会包含 launcher 路径。', 'ai.toolAccess.skills.file': 'Skill 文件', 'ai.toolAccess.skills.description': 'Skills + CLI 模式下,Agent 会自动被指向这个本地 Skill 文件;NetMesh CLI 启动路径会在每个会话中提供给 Agent。', 'ai.toolAccess.skills.unavailable': '暂时无法获取 Skill 文件路径', // External MCP 'ai.externalMcp.title': '对外 MCP', 'ai.externalMcp.description': '把 NetMesh 作为 MCP 服务器暴露给 Codex、Claude Code、Cursor、Grok 等外部客户端。工具面与应用内 Agent 相同(终端、SFTP、Vault、端口转发)。客户端连接期间请保持 NetMesh 运行。', 'ai.externalMcp.sessionsExposed': '作用域内会话:{count}', 'ai.externalMcp.mode': '可用模式', 'ai.externalMcp.mode.temporary': '临时', 'ai.externalMcp.mode.persistent': '常开', 'ai.externalMcp.mode.description': '临时模式会在空闲超时后自动关闭;常开模式会在 NetMesh 启动时恢复对外 MCP。', 'ai.externalMcp.idleTimeout': '空闲超时', 'ai.externalMcp.idleTimeout.description': '临时模式下,若超过该分钟数没有 MCP 操作,将自动关闭对外 MCP。', 'ai.externalMcp.idleTimeout.minutes': '分钟', 'ai.externalMcp.focusOnHostOpen': 'host_open 时激活窗口', 'ai.externalMcp.focusOnHostOpen.description': '当 MCP 客户端打开主机连接时,将主窗口切换到前台。关闭后可不受打扰地继续当前工作。', 'ai.externalMcp.silentSessions': 'AI 会话静默运行', 'ai.externalMcp.silentSessions.description': 'AI 打开的会话不会出现在标签栏,重启后也不会恢复。可随时在托盘面板中查看。', 'ai.externalMcp.sessionIdleTimeout': '已打开会话空闲超时', 'ai.externalMcp.sessionIdleTimeout.description': 'AI 打开的会话若超过该分钟数没有终端或文件操作,将自动关闭。', 'ai.externalMcp.usage.title': '使用说明', 'ai.externalMcp.usage.keepRunning': '1. 打开对外 MCP 开关,并保持 NetMesh 运行。', 'ai.externalMcp.usage.localhost': '2. 客户端通过本地 launcher 连接(仅 127.0.0.1)。关闭开关后会删除 discovery。', 'ai.externalMcp.usage.permissions': '3. 写操作遵循「设置 → AI → 安全」(观察 / 确认 / 自动)以及命令黑名单。', 'ai.externalMcp.usage.capabilities': '4. 完整 catalog 工具可用:终端、SFTP、Vault、端口转发。密码 / 私钥不会返回。', 'ai.externalMcp.help.ariaLabel': '对外 MCP 使用说明', 'ai.externalMcp.security': '安全', 'ai.externalMcp.security.description': '仅监听 127.0.0.1,使用轮换 token,写操作复用 AI 权限模式,关闭时删除 discovery。不做 OAuth——这是本机桌面桥接。', 'ai.externalMcp.permissionMode': '当前权限模式:{mode}', 'ai.externalMcp.permissionMode.label': '写操作权限模式', 'ai.externalMcp.permissionMode.hint': '与「设置 → AI → 安全」为同一项。自动:NetMesh 写操作不再弹本应用审批;确认:每次询问。外部客户端(Codex / Claude / Grok)仍可能有自己的工具审批界面。', 'ai.externalMcp.permissionMode.unknown': '未知', 'ai.externalMcp.discovery': 'Discovery', 'ai.externalMcp.launcher': 'Launcher', 'ai.externalMcp.unavailable': '不可用', 'ai.externalMcp.bridgeUnavailable': '对外 MCP 桥接不可用', 'ai.externalMcp.copy': '复制', 'ai.externalMcp.copied': '已复制', 'ai.externalMcp.copyFailed': '复制失败,请手动复制。', 'ai.externalMcp.refresh': '刷新', 'ai.externalMcp.clientConfiguration': '客户端配置', 'ai.externalMcp.clientConfiguration.description': '选择客户端一键安装,或复制 CLI / 配置片段。', 'ai.externalMcp.client.codex': 'Codex', 'ai.externalMcp.client.claude': 'Claude Code', 'ai.externalMcp.client.grok': 'Grok', 'ai.externalMcp.client.cursor': 'Cursor', 'ai.externalMcp.cliCommand': 'CLI 命令', 'ai.externalMcp.configSnippet': '配置片段', 'ai.externalMcp.addToCodex': '添加到 Codex', 'ai.externalMcp.addToClaude': '添加到 Claude Code', 'ai.externalMcp.addToGrok': '添加到 Grok', 'ai.externalMcp.codexAdded': '已添加 Codex MCP 条目。请重启 Codex 或打开新会话。', 'ai.externalMcp.claudeAdded': '已添加 Claude Code MCP 条目。请重启 Claude Code 或打开新会话。', 'ai.externalMcp.grokAdded': '已添加 Grok MCP 条目。请重启 Grok 或打开新会话。', 'ai.externalMcp.installCodex': '请先单独安装 Codex,然后点击刷新。', 'ai.externalMcp.installClaude': '请先单独安装 Claude Code,然后点击刷新。', 'ai.externalMcp.installGrok': '请先单独安装 Grok CLI,然后点击刷新。', 'ai.externalMcp.conflict.description': '已存在指向其他位置的 NetMesh-external 条目,请手动删除或修改。', 'ai.externalMcp.enableForLauncher': '请先启用对外 MCP,以获取可用的 launcher 路径。', 'ai.externalMcp.cursor.title': 'Cursor / 其他客户端', 'ai.externalMcp.cursor.description': '合并到 MCP 配置文件(例如 ~/.cursor/mcp.json)。若已有其他服务器,请勿整文件覆盖。', 'ai.externalMcp.status.unavailable': '不可用', 'ai.externalMcp.status.disabled': '已关闭', 'ai.externalMcp.status.running': '运行中', 'ai.externalMcp.status.starting': '启动中', 'ai.externalMcp.status.error': '错误', 'ai.externalMcp.status.configured': '已配置', 'ai.externalMcp.status.notConfigured': '未配置', 'ai.externalMcp.status.checking': '检查中', 'ai.externalMcp.status.codexNotFound': '未找到 Codex', 'ai.externalMcp.status.claudeNotFound': '未找到 Claude Code', 'ai.externalMcp.status.grokNotFound': '未找到 Grok', 'ai.externalMcp.status.conflict': '冲突', 'ai.userSkills.title': '用户 Skills', 'ai.userSkills.description': '打开 NetMesh 的 Skills 文件夹以添加你自己的技能目录。NetMesh 会自动扫描这些 skills,默认只注入轻量索引,只有在请求明显命中某个 skill 时才展开正文。', 'ai.userSkills.openFolder': '打开 Skills 文件夹', 'ai.userSkills.reload': '重新加载 Skills', 'ai.userSkills.location': '位置', 'ai.userSkills.loading': '正在扫描用户 skills...', 'ai.userSkills.summary': '已就绪 {ready} 个,警告 {warnings} 个', 'ai.userSkills.empty': '暂未发现用户 skills。打开文件夹后可添加包含 SKILL.md 的技能目录。', 'ai.userSkills.unavailable': '当前环境不支持用户 skills。', 'ai.userSkills.status.ready': '正常', 'ai.userSkills.status.warning': '警告', // AI Quick Messages 'ai.quickMessages.title': '快捷消息', 'ai.quickMessages.description': '创建常用提示词,在 AI 聊天框输入 / 或点击快捷按钮即可插入到输入框。与用户 Skills 不同,快捷消息会直接填入消息内容。', 'ai.quickMessages.add': '添加快捷消息', 'ai.quickMessages.createTitle': '新建快捷消息', 'ai.quickMessages.editTitle': '编辑快捷消息', 'ai.quickMessages.name': '名称', 'ai.quickMessages.name.placeholder': '例如:检查磁盘空间', 'ai.quickMessages.slug': '命令', 'ai.quickMessages.slug.placeholder': 'disk-check', 'ai.quickMessages.descriptionField': '说明(可选)', 'ai.quickMessages.descriptionField.placeholder': '简短描述这条快捷消息的用途', 'ai.quickMessages.content': '消息内容', 'ai.quickMessages.content.placeholder': '输入选择后要插入的完整提示词...', 'ai.quickMessages.empty': '还没有快捷消息。添加几条常用提示,聊天时就能一键插入。', 'ai.quickMessages.confirmDelete': '确定删除快捷消息「{name}」吗?', 'ai.quickMessages.error.nameRequired': '请填写名称。', 'ai.quickMessages.error.invalidSlug': '命令只能包含小写字母、数字和连字符。', 'ai.quickMessages.error.contentRequired': '请填写消息内容。', 'ai.quickMessages.error.slugTaken': '该命令已被其他快捷消息使用。', 'ai.quickMessages.error.slugConflictsWithSkill': '该命令与用户 Skill「/{slug}」冲突,请换一个命令。', 'ai.quickMessages.error.maxItems': '最多只能保存 {max} 条快捷消息。', // AI Chat 'ai.chat.noProvider': '尚未配置 AI 提供商。请前往 **设置 → AI → 提供商** 添加并启用一个提供商。', 'ai.chat.toolDenied': '操作已被用户拒绝。', 'ai.chat.toolApproved': '已批准', 'ai.chat.toolApprovalHint': 'Enter 允许 · Esc 拒绝', 'ai.chat.approve': '批准', 'ai.chat.approveOnce': '允许', 'ai.chat.alwaysAllow': '始终', 'ai.chat.slashStopDesc': '停止当前 AI 回合并取消进行中的工具', 'ai.chat.slashCompactDesc': '压缩较早的会话上下文', 'ai.chat.reject': '拒绝', 'ai.chat.toolLabel': '工具', 'ai.chat.targetLabel': '目标', 'ai.chat.rawCommand': '命令', 'ai.chat.copyCommand': '复制', 'ai.chat.commandCopied': '已复制', 'ai.chat.approvalSession': '会话', 'ai.chat.approvalShell': 'Shell', 'ai.chat.approvalCwd': '目录', 'ai.chat.approvalReason': '原因', 'ai.chat.approvalInvocation': '调用详情', 'ai.chat.permissionRequired': '需要权限', 'ai.chat.permissionDescription': 'AI Agent 希望执行一个需要你批准的工具调用。', 'ai.chat.commandBlocked': '此命令已被安全策略拦截,无法执行。', 'ai.chat.recommendAllow': '允许', 'ai.chat.recommendConfirm': '确认', 'ai.chat.recommendDeny': '拒绝', 'ai.chat.exportConversation': '导出对话', 'ai.chat.exportAs': '导出为', 'ai.chat.exportMarkdown': 'Markdown', 'ai.chat.exportJSON': 'JSON', 'ai.chat.exportPlainText': '纯文本', 'ai.chat.thinking': '思考中', 'ai.chat.thoughtFor': '思考了 {duration}', 'ai.chat.thought': '思考', 'ai.chat.agents': 'Agents', 'ai.chat.detectedOnMachine': '在本机检测到', 'ai.chat.rescan': '重新扫描', 'ai.chat.permObserver': '观察', 'ai.chat.permConfirm': '确认', 'ai.chat.permAuto': '自动', 'ai.chat.permObserverDesc': '只读', 'ai.chat.permConfirmDesc': '写操作前确认', 'ai.chat.permAutoDesc': '自由执行', 'ai.chat.emptyHint': '询问服务器相关问题、执行命令或获取配置帮助。', 'ai.chat.placeholder': '向 {agent} 发送消息 — @ 引用上下文,/ 使用命令', 'ai.chat.placeholderDefault': '向 Catty Agent 发送消息...', 'ai.chat.noModel': '未选择模型', 'ai.chat.noProviderModel': '未配置默认模型——前往 设置 → AI → 提供商 设置。', 'ai.chat.selectProvider': '选择提供商', 'ai.chat.selectProviderAndModel': '选择提供商和模型', 'ai.chat.selectModel': '选择模型', 'ai.chat.searchModels': '搜索模型', 'ai.chat.providers': '提供商', 'ai.chat.models': '模型', 'ai.chat.pinned': '已固定', 'ai.chat.useCustomModel': '使用 “{id}”', 'ai.chat.thinkingLevel': '思考强度', 'ai.chat.thinkingOff': '关闭', 'ai.chat.pinModel': '固定模型', 'ai.chat.unpinModel': '取消固定', 'ai.chat.loadingModels': '正在加载模型...', 'ai.chat.noMatchingModels': '没有匹配的模型', 'ai.chat.recent': '最近', 'ai.chat.viewAll': '查看全部', 'ai.chat.untitled': '无标题', 'ai.chat.justNow': '刚刚', 'ai.chat.minutesAgo': '{n}分钟前', 'ai.chat.hoursAgo': '{n}小时前', 'ai.chat.daysAgo': '{n}天前', 'ai.chat.newChat': '新对话', 'ai.chat.allSessions': '所有会话', 'ai.chat.loadEarlierMessages': '加载更早的消息(还有 {n} 条)', 'ai.chat.jumpNav': '跳转到消息', 'ai.chat.jumpUntitled': '(空消息)', 'ai.chat.usedTools': '已使用 {n} 个工具', 'ai.chat.loadMoreSessions': '加载更多会话(还有 {n} 条)', 'ai.chat.noSessions': '没有历史会话', 'ai.chat.retryHint': '你可以重新发送消息来重试。', 'ai.chat.approvalTimeout': '工具审批已超时(5 分钟)。你可以重新发送消息来重试。', 'ai.chat.menuHosts': '主机', 'ai.chat.menuContext': '上下文', 'ai.chat.menuFiles': '文件', 'ai.chat.menuImage': '图片', 'ai.chat.menuMentionHost': '提及主机', 'ai.chat.menuMentionNote': '提及笔记', 'ai.chat.mentionNoteSearch': '搜索笔记…', 'ai.chat.mentionNoteEmpty': '没有匹配的笔记', 'ai.chat.mentionNoteUnavailable': '当前连接方式下,此 AI 无法读取保险箱笔记。', 'ai.chat.mentionNoteTooMany': '这些笔记无法一起引用,请减少选择。', 'ai.chat.mentionNoteInvalid': '无法附加「{{title}}」:笔记的标识符无效。', 'ai.chat.untitledNote': '未命名笔记', 'ai.chat.menuUserSkills': '用户 Skills', 'ai.chat.menuSlashCommands': '快捷命令', 'ai.chat.slashCommands': '快捷命令', 'ai.chat.slashSystemCommands': '系统命令', 'ai.chat.slashQuickMessages': '快捷消息', 'ai.chat.slashUserSkills': '用户 Skills', 'ai.chat.quickMessages': '快捷命令', 'ai.chat.slashNoResults': '没有匹配的命令', 'ai.chat.slashEmptyHint': '可在 设置 → AI → 快捷消息 中添加常用提示词。', // AI 聊天快捷入口 'ai.chatShortcuts.title': '聊天快捷入口', 'ai.chatShortcuts.selectionAction': '选中终端内容时显示“添加到对话”', 'ai.chatShortcuts.selectionAction.description': '在终端里选中文本后显示 AI 快捷按钮。', // AI Error 'ai.codex.bridgeError': 'Codex 主进程处理器尚未加载。请完全重启 NetMesh 或重启 Electron 开发进程,然后重试。', // AI Web Search 'ai.webSearch.title': '网络搜索', 'ai.webSearch.enable': '启用网络搜索', 'ai.webSearch.enable.description': '允许 AI 代理搜索互联网获取最新信息。', 'ai.webSearch.provider': '搜索供应商', 'ai.webSearch.provider.description': '选择一个网络搜索 API 供应商。', 'ai.webSearch.apiKey': 'API 密钥', 'ai.webSearch.apiKey.description': '所选搜索供应商的 API 密钥。', 'ai.webSearch.apiKey.placeholder': '输入 API 密钥...', 'ai.webSearch.apiHost': 'API 地址', 'ai.webSearch.apiHost.description': '自定义 API 端点。除非使用代理,否则保持默认值。', 'ai.webSearch.apiHost.searxngDescription': 'SearXNG 实例的 URL(必填)。', 'ai.webSearch.maxResults': '最大结果数', 'ai.webSearch.maxResults.description': '搜索返回的最大结果数(1-20)。', // AI Safety Settings 'ai.safety.title': '安全', 'ai.safety.permissionMode': '权限模式', 'ai.safety.permissionMode.description': '控制 AI 通过 NetMesh 访问终端会话的方式。观察者模式会阻止经由 NetMesh 的写操作;外部 Agent CLI 可能仍有自己的本机工具和审批流程。', 'ai.safety.permissionMode.observer': '观察者 - 只读,禁止操作', 'ai.safety.permissionMode.confirm': '确认 - 操作前询问', 'ai.safety.permissionMode.auto': '自动 - 自由执行', 'ai.safety.commandTimeout': '命令超时', 'ai.safety.commandTimeout.description': '通过 NetMesh 执行命令时允许运行的最长秒数,超时将被终止。', 'ai.safety.commandTimeout.unit': '秒', 'ai.safety.responseIdleTimeout': '内置 AI 响应等待时间', 'ai.safety.responseIdleTimeout.description': '内置 AI 请求连续这么多秒没有收到新响应时会被取消。这个设置不控制整段响应总时长,也不影响命令超时。', 'ai.safety.responseIdleTimeout.unit': '秒', 'ai.safety.maxIterations': '最大迭代次数', 'ai.safety.maxIterations.description': '防止 AI 失控执行的最大工具调用循环次数。外部 Agent 可能有自己的内部迭代限制,以其为准。', 'ai.safety.blocklist': '命令黑名单', 'ai.safety.blocklist.description': '用于拦截通过 NetMesh 执行的危险命令的正则表达式。', 'ai.safety.blocklist.placeholder': '正则表达式...', 'ai.safety.blocklist.reset': '恢复默认', 'ai.safety.blocklist.add': '添加规则', 'ai.safety.grants.title': '许可记忆表', 'ai.safety.grants.heading': 'Confirm 模式放行规则', 'ai.safety.grants.description': 'Confirm 模式会先询问再执行;保存为规则后,匹配的同类操作会自动放行。规则对所有终端节点/会话生效,也可手动编辑。', 'ai.safety.grants.empty': '尚无规则。可在审批时选择「一律许可」,或手动添加。', 'ai.safety.grants.capability': '能力', 'ai.safety.grants.sessionPattern': '节点/会话模式', 'ai.safety.grants.commandPattern': '命令模式(可选)', 'ai.safety.grants.note': '备注(可选)', 'ai.safety.grants.add': '添加规则', 'ai.safety.grants.remove': '删除', 'ai.safety.grants.export': '导出 JSON', 'ai.safety.grants.import': '导入 JSON', 'ai.safety.note': '这些安全设置会约束经由 NetMesh 执行的操作。外部 Agent CLI 也可能提供本机工具,那部分由 Agent 自己的控制规则约束。', // 统一终端工作区和顶部标签的 tooltip 文案 (issue #954) 'terminal.layer.addTerminal': '添加终端', 'terminal.layer.switchToSplitView': '切换到分屏视图', 'terminal.layer.sftp': '文件传输', 'terminal.layer.scripts': '脚本', 'terminal.layer.history': '命令历史', 'terminal.layer.theme': '主题', 'terminal.layer.notes': '笔记', 'terminal.layer.aiChat': 'AI 助手', 'terminal.layer.movePanelLeft': '面板移至左侧', 'terminal.layer.movePanelRight': '面板移至右侧', 'terminal.layer.closePanel': '关闭面板', 'terminal.layer.closePane': '关闭分屏', 'terminal.layer.resizeSplit': '调整分屏大小', 'terminal.layer.splitHorizontal': '上下分屏', 'terminal.layer.splitVertical': '左右分屏', 'terminal.layer.openInNewSplit': '在新分屏中打开', 'terminal.layer.hostTree.search': '搜索主机...', 'terminal.layer.hostTree.searchButton': '搜索', 'terminal.layer.hostTree.tagsButton': '按标签筛选', 'terminal.layer.hostTree.newHost': '新建主机', 'terminal.layer.hostTree.newHostInGroup': '在此分组中新建主机', 'terminal.layer.hostTree.editHost': '编辑主机', 'terminal.layer.hostTree.hostSavedNextConnection': '主机已更新,连接设置将在下次连接时生效。', 'terminal.layer.hostTree.newGroup': '新建分组', 'terminal.layer.hostTree.localShell': '本地 Shell', 'terminal.layer.hostTree.tagsEmpty': '暂无标签', 'terminal.layer.hostTree.clearTags': '清除筛选', 'terminal.layer.hostTree.collapse': '收起主机列表', 'terminal.layer.hostTree.expand': '展开主机列表', 'terminal.layer.hostTree.empty': '没有匹配的主机', 'terminal.layer.hostTree.details.host': '主机', 'terminal.layer.hostTree.details.user': '用户', 'terminal.layer.hostTree.details.port': '端口', 'terminal.layer.hostTree.details.protocol': '协议', 'terminal.layer.hostTree.details.group': '分组', 'terminal.layer.hostTree.details.tags': '标签', 'terminal.layer.hostTree.details.lastConnected': '最近连接', 'topTabs.openQuickSwitcher': '打开快速切换', 'topTabs.moreTabs': '更多标签页', 'topTabs.aiAssistant': 'AI 助手', 'topTabs.newLocalTerminal': '新建本地终端', 'topTabs.controlPanel': '快捷控制', 'topTabs.controlPanel.externalMcp': '对外 MCP', 'topTabs.controlPanel.theme': '主题', 'topTabs.controlPanel.theme.light': '浅色', 'topTabs.controlPanel.theme.dark': '深色', 'topTabs.controlPanel.theme.system': '系统', 'topTabs.externalMcp.enable': '启用对外 MCP', 'topTabs.externalMcp.disable': '停用对外 MCP', 'topTabs.windowOpacity': '窗口透明度', 'topTabs.openSettings': '打开设置', 'ai.chat.sessionHistory': '会话历史', 'ai.chat.resizeInput': '拖动调整消息输入框高度', 'ai.chat.attach': '附件', 'ai.chat.terminalSelectionAttachment': '终端选区', 'ai.chat.terminalSelectionLines': '{count} 行', 'ai.chat.collapse': '收起', 'ai.chat.expand': '展开', 'ai.chat.enableAgent': '启用 {name}', 'ai.chat.artifact.noteFallback': 'Vault 笔记', 'ai.chat.artifact.openNotes': '打开笔记', 'ai.chat.artifact.openHosts': '打开主机', 'ai.chat.artifact.notesSummary': 'Vault 中有 {count} 条笔记', 'ai.chat.artifact.hostsSummary': 'Vault 中有 {count} 台主机', 'ai.chat.artifact.hostsAdded': '已添加 {count} 台主机', 'ai.chat.artifact.hostsPreview': '预览 {count} 台主机', 'ai.chat.artifact.failed': 'Vault 操作失败', 'ai.chat.artifact.unavailableTitle': '不可用', 'ai.chat.artifact.noteMissing': '该笔记已不在 Vault 中。', 'ai.chat.artifact.hostMissing': '该主机已不在 Vault 中。', 'ai.chat.artifact.snippetMissing': '该 Snippet 或脚本已不在 Vault 中。', 'ai.chat.artifact.openSnippets': '打开 Snippets', 'ai.chat.artifact.snippetsSummary': 'Vault 中有 {count} 个 Snippet', 'ai.chat.artifact.scriptsSummary': 'Vault 中有 {count} 个脚本', 'ai.chat.artifact.snippetFallback': 'Vault Snippet', 'ai.chat.artifact.scriptFallback': '自动化脚本', 'ai.chat.artifact.scriptLanguage': '{language} 脚本', 'ai.chat.artifact.snippetDeleted': 'Snippet 已删除', 'ai.chat.artifact.scriptDeleted': '脚本已删除', 'ai.chat.artifact.snippetRan': 'Snippet 已执行', 'ai.chat.artifact.scriptStarted': '脚本运行已启动', 'ai.chat.artifact.scriptRunStatus': '脚本运行 {status}', 'ai.chat.artifact.scriptRunsSummary': '{count} 个脚本运行', 'ai.chat.artifact.scriptRunStopped': '脚本运行已停止', 'ai.chat.artifact.scriptRunPaused': '脚本运行已暂停', 'ai.chat.artifact.scriptRunResumed': '脚本运行已恢复', 'ai.chat.artifact.scriptReference': 'nct API 参考', 'zmodem.waitingForRemote': '等待远端...', 'zmodem.uploading': '上传中', 'zmodem.downloading': '下载中', 'zmodem.cancelTransfer': '取消传输 (Ctrl+C)', 'zmodem.overwrite.title': '远端已存在同名文件', 'zmodem.overwrite.applyToRest': '应用到其余冲突文件', 'zmodem.overwrite.overwrite': '覆盖', 'zmodem.overwrite.skip': '跳过', 'zmodem.overwrite.cancel': '取消', 'settings.shortcuts.resetToDefault': '重置为默认', };