export default { app: { title: 'MateClaw - AI 助手', }, common: { save: '保存', saving: '保存中...', saved: '已保存', cancel: '取消', reset: '重置', edit: '编辑', delete: '删除', create: '创建', update: '更新', loading: '加载中...', enabled: '启用', disabled: '停用', default: '默认', view: '查看', copy: '复制', copied: '已复制', copyFailed: '复制失败', confirm: '确认', close: '关闭', add: '添加', search: '搜索', noResults: '没有匹配项', noOptions: '暂无可选项', clear: '清除', expandSidebar: '展开侧边栏', collapseSidebar: '折叠侧边栏', manageWorkspaces: '管理工作区', show: '显示', hide: '隐藏', on: '开启', off: '关闭', yes: '是', no: '否', configure: '配置', enable: '启用', disable: '停用', refresh: '刷新', collapse: '收起', pager: { total: '共 {n} 条', perPage: '{n} 条/页', prev: '上一页', next: '下一页', jumpTo: '前往', pageSuffix: '页', }, iconPicker: { title: '选择图标', tabPixelart: '像素图标', tabEmoji: '表情符号', tabUrl: '图片链接', search: '搜索图标名…', empty: '没有匹配的图标', preview: '预览', none: '不设图标', apply: '应用', emojiHint: '直接输入或粘贴一个 emoji / 文字符号。', emojiPlaceholder: '🎬 / 📊 / 任意符号', urlHint: '使用线上图片作为图标(PNG / SVG / JPG)。', urlPlaceholder: 'https://example.com/icon.svg', pixelartCount: '共 {n} 个像素图标,由 pixelarticons 提供(MIT)', pickerOpen: '打开图标选择器', reprojectionWarning: '提示:若 SKILL.md frontmatter 已声明 icon,下次解析会覆盖此处的修改 — 在正文里改才永久。', }, }, auth: { changePassword: '修改密码', oldPassword: '当前密码', newPassword: '新密码', confirmPassword: '确认新密码', fieldsRequired: '请填写当前密码和新密码', passwordMismatch: '两次输入的新密码不一致', passwordChanged: '密码修改成功', passwordChangeFailed: '密码修改失败', }, chat: { status: { idle: '就绪', streaming: '生成中...', error: '连接断开', }, thinking: '深度思考', thinkingInProgress: '思考中...', stopped: '已停止生成', interrupted: '已中断', expandLines: '展开(还有 {hidden} 行)', collapse: '收起', failed: '生成失败', compressionSummary: '之前的对话已整理为摘要', compressionWithCount: '之前的 {count} 条对话已整理为摘要', loadingOlder: '加载更早的消息...', loadOlderMessages: '点击加载更早的消息', retry: '重试', errorCode: '错误码', error: { rate_limit: { title: '请求过于频繁', description: '您的请求超出了频率限制,服务器暂时无法处理。', action: '请稍等片刻后重试,或减少连续提交次数。', }, auth_expired: { title: '登录已过期', description: '您的登录凭证已失效,需要重新登录。', action: '页面将自动跳转到登录页。', }, provider_auth_error: { title: '模型认证失败', description: '当前模型的 API Key 无效或已失效,与你的登录状态无关。', action: '请到「设置 → 模型」中检查并更新该模型的 API Key。', }, forbidden: { title: '没有权限', description: '您没有执行此操作的权限。', action: '请联系管理员获取访问权限。', }, bad_request: { title: '请求参数有误', description: '发送的请求格式有误,服务器无法理解。', action: '请检查输入内容后重试。如果问题持续,请联系管理员。', }, server_error: { title: '服务器内部错误', description: '服务器处理请求时遇到了问题。', action: '请稍后重试。如果问题持续出现,请联系管理员。', }, service_unavailable: { title: '服务暂时不可用', description: '服务正在维护或暂时过载,无法处理请求。', action: '请稍后再试。', }, timeout: { title: '请求超时', description: '服务器在规定时间内没有响应,可能是网络问题或服务繁忙。', action: '请检查网络连接后重试。', }, network: { title: '网络连接失败', description: '无法连接到服务器,请检查您的网络状况。', action: '请确认网络正常后重试。', }, unknown: { title: '发生了未知错误', description: '请求过程中遇到了意外问题。', action: '请重试。如果问题持续出现,请联系管理员。', }, }, copy: '复制', copied: '已复制', regenerate: '重新生成', replyModel: '本条回复模型: {model}', routing: { kind: { image: '图片', video: '视频', media: '附件', }, tooltip: '本轮对话由「{primary}」处理;图片附件先经「{sidecar}」({sidecarProvider})转成文字后再交给主模型。', hint: { willRoute: '检测到{kind}附件。当前 Agent 模型「{primary}」不支持{kind}输入,将自动调用「{sidecar}」识别(旁路模式,不影响主模型)。', notConfigured: '检测到{kind}附件。当前 Agent 模型不支持{kind}输入,且尚未配置旁路模型。', videoReserved: '检测到视频附件。当前版本暂未接入视频旁路(已预留「{sidecar}」),建议切换到具备视频能力的多模态主模型。', action: { gotoSettings: '前往配置', }, }, }, ttsPlay: '朗读', ttsStop: '停止朗读', conversations: '会话列表', newChat: '新对话', loadingAgents: '加载员工中...', selectAgent: '请选择数字员工', noConversations: '暂无会话', startNewChat: '开始新对话吧', messages: '{count} 条消息', configModel: '配置模型', clearMessages: '清空消息', goToModelSettings: '前往模型设置', configModelFirst: '请先配置模型', modelUnavailable: '当前模型不可用', noActiveModel: '当前没有激活模型。先到模型管理中选择一个可用模型,再开始对话。', providerNotReady: '当前激活模型属于 {name},但这个提供商还没配置完成。请到模型管理中补全 API Key 或 Base URL。', noAvailableModel: '当前没有可用模型。', loadAgentsFailed: '加载员工列表失败', loadModelFailed: '加载模型状态失败', loadConversationsFailed: '加载会话列表失败', loadMessagesFailed: '加载消息记录失败', deleteConversationFailed: '删除会话失败', deleteConfirm: '确定删除这个会话?此操作不可恢复。', switchModelFailed: '切换模型失败', searchModel: '搜索模型…', noMatchModel: '没有匹配的模型', // RFC-073: liveness hints shown in the model dropdown header modelLivenessUnprobed: '正在检查可用性', modelLivenessCooldown: '冷却中({seconds} 秒后自动恢复)', // RFC-074 PR-2: empty-state inside the model dropdown noProvidersConfigured: '还没有可用的模型', goConfigure: '去配置', // Issue #81: liveness-aware popup state machine. prompt: { noActive: { title: '请先选择一个模型', desc: '当前没有激活模型,先到模型管理选一个再开始对话。', }, unconfigured: { title: '{name} 还没配置完', desc: '缺少:{fields}。{hint}', }, removed: { title: '{name} 不可用', descFallback: '上一次探测失败,请检查服务是否在运行。', }, cooldown: { title: '{name} 暂时不可用', desc: '约 {seconds} 秒后自动重试。', }, unprobed: { title: '正在检查模型可用性', desc: '稍候片刻或刷新重试。', }, noModels: { title: '{name} 下没有可用模型', desc: '尝试发现模型或手动添加一个。', }, }, promptAction: { fillBaseUrl: '填写 Base URL', fillApiKey: '填写 API Key', fillRequiredFields: '完成必填项', startOAuth: '登录授权', testConnection: '测试连接', pullModel: '发现模型', waitCooldown: '立即重试', reprobe: '重新探测', switchToModel: '切换到 {name}', fixThis: '修复', }, recoverableBanner: { message: '{name} 暂时不可用,发送时会自动用 {fallback} 兜底', switched: '主模型不可用,已切换到 {fallback}', }, uploadFailed: '文件上传失败', dropToUpload: '拖放文件或文件夹到此处', copyFailed: '复制失败', datePinned: '置顶', dateToday: '今天', dateYesterday: '昨天', dateLast7Days: '近 7 天', dateEarlier: '更早', hasUnread: '有新内容', cronRunning: { executing: '执行中…', fallbackName: '定时任务', }, suggestionIntro: '记住我平时不吃香菜、喜欢喝冰美式,以后点餐时提醒我', suggestionPoem: '帮我搜一下今天科技圈有什么大新闻,用一句话总结', suggestionCode: '让写手帮我润色一段文案,我先把草稿发你', suggestionWeather: '你现在都装了哪些技能和工具?教我怎么给你加新本事', approvalRequired: '需要审批', approve: '批准', deny: '拒绝', approvalHint: '或输入 /approve / /deny', approved: '✅ 已允许', denied: '⛔ 已拒绝', approvalWaiting: '等待输入框确认...', pendingApprovalPlaceholder: '输入 /approve 或 /deny 来回复...', messagePlaceholder: '输入消息... (Enter 发送, Shift+Enter 换行)', thinkingOn: '深度思考已开启', thinkingOff: '点击开启深度思考', thinkingUnsupported: '当前模型不支持深度思考', subtitle: '基于 Spring AI Alibaba 的智能 AI 助手', // 排队相关 queuedSending: '正在发送排队消息...', queuedWillSend: '已排队,当前步骤结束后发送', queuedCancel: '取消', queuedReplace: '消息已排队,按回车替换...', queuedBadge: '{count} 条排队', // 流状态 streamPreparingContext: '准备上下文...', streamReadingMemory: '读取记忆...', streamReasoning: '分析问题...', streamDraftingAnswer: '生成回答...', streamSummarizingObservations: '整理信息...', streamThinking: '思考中...', streamGenerating: '生成中...', streamExecutingTool: '执行工具...', streamAwaitingApproval: '等待审批', streamFinalizing: '正在收尾...', streamFailed: '本轮中断', streamInterrupting: '中断中...', streamQueued: '排队中...', streamReconnecting: '重新连接...', streamStopped: '已停止', streamCompleted: '已完成', // Context compaction (compact_status SSE) compactStart: '正在压缩上下文…', compactPairSafe: '调整边界以保留 tool_call 配对…', compactSummarize: '正在生成压缩摘要…', compactStartWithTokens: '正在压缩上下文… ({tokens})', compactSummarizeWithCount: '正在生成压缩摘要… ({count} 条)', streamPreparingContextDetail: '正在收集当前问题、历史对话和必要配置。', streamReadingMemoryDetail: '正在查找与你当前问题最相关的长期记忆和今日记录。', streamReasoningDetail: '正在基于现有信息进行判断、比较方案并组织回答结构。', streamDraftingAnswerDetail: '已经完成主要分析,正在把结论写成可直接阅读的答案。', streamSummarizingObservationsDetail: '刚刚拿到了较多工具结果,正在提炼重点,避免回答冗长或遗漏关键信息。', streamThinkingDetail: '正在做内部推理,这一步未必会立即产生正文。', streamGeneratingDetail: '已经进入可见输出阶段,会陆续显示结果。', streamExecutingToolDetail: '正在读取文件、查询数据或执行必要操作,以便给出更准确的答案。', streamAwaitingApprovalDetail: '接下来需要你的确认,确认后我会继续执行。', streamFinalizingDetail: '正在保存结果并结束当前响应。', streamFailedDetail: '这次处理没有完整完成,但你可以继续追问或重试。', streamSlowShort: '这一步比平时慢一些,但系统仍在处理中。', streamSlowSummarizing: '正在整理较长的工具结果。因为信息较多,这一步可能需要更久。', streamSlowReasoning: '正在做较复杂的分析和取舍,不是卡住。', streamSlowGeneral: '处理还在继续,当前主要耗时在内部分析,不代表连接中断。', // 首 token 前的生命周期阶段 streamConnecting: '正在连接服务器...', streamStarted: '连接已建立,正在准备上下文...', streamContextPrepared: '上下文已就绪,正在调用 LLM...', streamLlmRequestSent: '等待模型首个响应...', streamElapsedSuffix: '(已等 {sec} 秒)', // 按轮次分组渲染 iterationEmpty: '第 {index} 轮被中断(无输出)', contentRepetitionWarning: '检测到内容尾部重复(疑似模型输出 artifact)', // INCOMPLETE 截断卡片(finishReason=incomplete) incompleteTitle: '回答因检测到重复输出已被自动截断', incompleteDescription: '系统在你看到的部分之后检测到模型开始重复同一段内容(或在思考阶段无产出),已自动截断以避免无效输出。点下方按钮重新生成完整回答,或在输入框补充提示让模型聚焦剩余内容。', incompleteRetry: '重新生成', // EVIDENCE_INSUFFICIENT 提示卡(finishReason=evidence_insufficient) evidenceTitle: '任务已完成,但部分源码引用未被验证', evidenceDescription: '回答全文已保留并展示。底部「[证据不足] …」列出的类/文件并未在本次工具结果里被实际读取,模型可能基于命名推断。如需确认这些引用,请追问让模型逐一读取后再下结论。', // feedback_event card — emitted when a turn ends in a non-transient error. // Buttons are data-driven from the event's `actions` array; labels live // under chat.feedback.{action} so a future backend can ship a new action // (e.g. "switch_model") with a single new translation key. feedback: { title: '本次回答失败', description: '模型调用未能正常完成,已显示错误原因。可点击「重试」让模型用同一条提问再试一次,或「上报问题」复制错误详情用于反馈。', retry: '重试', regenerate: '重新生成', report: '上报问题', reportCopied: '错误详情已复制到剪贴板', reportFailed: '复制失败,请检查浏览器权限', }, // 审批栏 approvalAllow: '允许', approvalExecute: '执行?', // 时间格式 timeJustNow: '刚刚', timeMinutesAgo: '{n} 分钟前', timeHoursAgo: '{n} 小时前', }, nav: { dashboard: '仪表盘', chat: '对话', control: '控制台', channels: '渠道', sessions: '会话', core: '核心', connect: '连接', system: '系统', agent: '智能体', workspace: '工作区', agentContext: '智能体上下文', skills: '技能', wiki: 'Wiki 知识库', enterprise: '企业场景', tools: '工具', plugins: '插件', datasources: '数据源', mcpServers: 'MCP 连接', mcpConnections: 'MCP 连接', toolsCatalog: '工具目录', activity: '活动记录', acpEndpoints: 'ACP 端点', settingsGroup: '设置', agents: '数字员工', backstage: '后台', backstageTooltip: '看看你的数字员工此刻在做什么', security: '安全', tokenUsage: 'Token 统计', cronJobs: '定时任务', workflows: '工作流', triggers: '触发器', settings: '设置', logout: '退出登录', themeLight: '浅色', themeDark: '深色', memory: '记忆', themeSystem: '跟随系统', themeLabel: '外观', languageLabel: '语言', appearance: '外观与语言', roleUser: '用户', roleAdmin: '管理员', }, // Issue #81: provider-level hint / status text shared across chat popup and ModelSelector. provider: { hint: { ollamaBaseUrlExample: '示例:{example}', lmstudioBaseUrlExample: '示例:{example}(LM Studio 默认端口)', llamacppBaseUrlExample: '示例:{example}(llama-server 默认端口)', vllmBaseUrlExample: '示例:{example}', openaiCompatBaseUrlExample: '示例:OpenAI 兼容端点,例如 {example}', }, status: { unconfigured: '未配置', removed: '不可用', cooldown: '{s}s 后重试', unprobed: '检测中', }, }, settings: { title: '设置', kicker: '配置中心', layoutDesc: '调整模型、系统行为与媒体能力,让整个产品在扩张时仍然保持一致。', sections: { model: '模型管理', system: '系统设置', image: '图片生成', tts: '语音合成', stt: '语音识别', music: '音乐生成', video: '视频生成', model3d: '3D 生成', featureFlags: '功能开关', about: '关于', advanced: '高级', }, models: { sidecar: { title: '多模态旁路', hint: '当主模型不支持图片/视频时,自动用下面配置的模型先把附件转成文字,再交给主模型回答。', notConfigured: '未配置(不路由附件)', idle: '未启用', reserved: '预留', vision: { label: '视觉旁路模型', desc: '用户上传图片时调用一次,把图片转成结构化描述。主对话模型不变。', empty: '尚未发现支持图片输入的模型。请到上方"云端模型"中先添加一个视觉模型。', }, video: { label: '视频旁路模型(预留)', desc: '用于未来版本:当用户上传视频时,由该模型负责拆帧和描述。当前版本暂不接入路由。', empty: '尚未发现支持视频输入的模型。', }, }, }, featureFlags: { title: '功能开关', description: '运行时可切换的功能开关。修改后立即在所有节点生效(每实例 30 秒内同步缓存);不需要重启服务。', empty: '当前没有已注册的功能开关。', enabled: '已开启 {key}', disabled: '已关闭 {key}', toggleFailed: '切换失败,请稍后重试', footer: '默认情况下新功能以关闭状态发布。开启后请关注对应模块的指标与日志,确认无回归再扩大灰度。', notWired: '未实装', notWiredTooltip: '该开关已预留但功能尚未实装,开启暂不会生效', scope: { kb: '知识库白名单', user: '用户白名单', rollout: '灰度比例 {pct}%', }, descriptions: { 'wiki.ocr.enabled': '维基上传的图片 OCR / 视觉理解流水线(开启后图片会调用 vision 模型生成事实性描述)', 'wiki.compile.4stage.enabled': '四阶段知识库编译流水线(摘要 / 规划 / 生成 / 索引)', 'wiki.compile.cache.enabled': '维基编译流水线的提示词缓存层(命中后能省 30%+ token)', 'wiki.confidence.enabled': '维基关系与页面的置信度分类(EXTRACTED / INFERRED / AMBIGUOUS / UNVERIFIED)', 'wiki.hot_cache.enabled': '知识库级"最近活动"快照,注入到 Agent 的系统提示', 'wiki.graph.insights.enabled': '维基图谱洞察面板(意外连接 / 知识缺口 / 桥接节点)', 'wiki.graph.adamic_adar.enabled': 'Adamic-Adar 拓扑相似度信号(叠加在现有四个信号之上)', 'wiki.graph.boundary.enabled': '边界分数:让"悬空"页面(出度大入度小)冒头', 'wiki.relation.cache.enabled': '维基页面间关系计算的持久化缓存(默认开启,性能基线)', }, }, modelTitle: '模型管理', modelDesc: '管理模型预设与默认模型选择', systemTitle: '系统设置', systemDesc: '语言与运行行为配置', aboutTitle: '关于 MateClaw', aboutDesc: '版本与系统信息', about: { heroDesc: '一套个人 AI 操作系统,让模型真正进入上下文、记忆、执行、知识和交付的连续流程。', foundationTitle: '技术栈', pillars: { contextTitle: '让上下文保持连续', contextDesc: '模型、知识、工作区和当前任务在同一个语境里运行,而不是每次重新开始。', executionTitle: '让执行成为产品本身', executionDesc: '工具、渠道与异步任务是系统的真实执行面,不是外挂。', memoryTitle: '让记忆产生复利', memoryDesc: '记忆被整理、被召回,在下一次任务里变得更有价值。', }, }, model: { title: '模型管理', desc: '配置模型提供商、凭证和模型列表', addProvider: '新增提供商', localProviders: '本地模型', cloudProviders: '云端模型', active: '当前激活', setActive: '设为激活', configured: '已配置', partial: '部分配置', unavailable: '未就绪', builtin: '内置', custom: '自定义', notSet: '未设置', noModels: '暂无模型', baseUrl: 'Base URL', apiKey: 'API Key', apiKeyInput: '输入 API Key', leaveBlankKeep: '留空则保持当前值不变', modelCount: '{count} 个模型', createTitle: '新增提供商', editTitle: '提供商配置', manageTitle: '管理模型', addModel: '新增模型', // Inline API Key on the provider card — primary entry point for the // 90% case (paste a key, hit save). Modal stays for advanced fields. inlineApiKeyTitle: 'API Key', inlineApiKeyPlaceholder: '粘贴 API Key 后回车保存', inlineApiKeyMasked: '已设置 ••••••••', inlineApiKeyChange: '更换', inlineApiKeySaving: '保存中…', inlineApiKeySaved: 'API Key 已保存', inlineApiKeySaveFailed: 'API Key 保存失败', inlineApiKeyEnvHint: '或在环境变量中设置 {var} 后重启', // Headline status pill on the card — what the user reads first. statusNotSet: '未配置', statusReady: '已就绪', statusError: '连接失败', modelCountAvailable: '可用 {count} 个模型', activeChanged: '激活模型已更新', providerSaved: '提供商配置已保存', providerDeleted: '提供商已删除', modelAdded: '模型已添加', modelRemoved: '模型已移除', modelAddFailed: '模型添加失败', modelRemoveFailed: '模型删除失败', activeChangeFailed: '激活模型切换失败', deleteConfirm: '确认删除提供商“{name}”?', removeConfirm: '确认移除模型 “{name}”?', generateConfigInvalidJson: 'Generate Kwargs 不是合法 JSON', generateConfigMustBeObject: 'Generate Kwargs 必须是 JSON 对象', advancedSettings: '高级设置', protocolHint: '这里选择的是提供商 API 协议,不是前端或后端里的具体类名。', protocolOpenAI: 'OpenAI 兼容(Chat Completions)', protocolAnthropic: 'Anthropic(Messages API)', protocolGemini: 'Gemini 原生', protocolDashScope: 'DashScope 原生', advancedHint: '用于补充 temperature、max_tokens、top_p 等生成参数。', requireApiKeyHint: '公司内部或本地 OpenAI 兼容服务如果不需要鉴权,可以关闭此项;测试连接时将不会发送 Authorization 头。', fallbackPriorityHint: '池内尝试顺序(数字越小越先):0 = 不参与;1 = 第一顺位;2 = 第二顺位,依此类推。多个提供商共用同一数字时按 ID 字典序。', fallbackBadge: '偏好 #{priority}', fallbackBadgeTitle: '可用池内的尝试顺序,数字越小越先尝试', // RFC-009 Phase 4: provider pool status badges poolBadgeInPool: '可用', poolBadgeInPoolTitle: '已通过启动体检,参与失败切换', poolBadgeRemoved: '已下线', poolBadgeRemovedTitle: '已从可用池移除({source}):{message}', poolBadgeCooldown: '冷却中', poolBadgeCooldownTitle: '近期连续失败,{seconds} 秒后自动恢复', poolSourceAuthError: 'API Key 失效', poolSourceBilling: '余额/计费问题', poolSourceModelNotFound: '模型不存在', poolSourceInitProbe: '启动体检失败', poolSourceManual: '手动移除', poolReprobe: '重新检测', poolReprobing: '检测中...', poolReprobeOk: '检测通过,已重新加入可用池', poolReprobeFail: '检测失败:{error}', // RFC-073: status-pill labels driven by Liveness livenessLive: '可用', livenessCooldown: '冷却中', livenessRemoved: '未连接', livenessUnprobed: '检测中', livenessUnprobedTooltip: '启动后正在检测可用性,稍候自动更新', livenessUnconfigured: '需要配置', // RFC-074 PR-2: enable / disable / drawer enableProviderCta: '+ 启用提供商', addCustomProvider: '+ 自定义提供商', enable: '启用', disable: '禁用', alreadyEnabled: '已启用', disableConfirm: '确定禁用提供商"{name}"?它将从下拉中消失,但配置保留,可随时再启用。', defaultSwitchedToast: '已将默认模型切换到 {provider} / {model}', addProviderDrawerTitle: '添加提供商', addProviderDrawerSubtitle: '启用后会出现在模型下拉中。如果是云端提供商,启用后还需要填 API Key。', catalogEmpty: '目录为空', catalogSearchPlaceholder: '搜索提供商…', catalogSearchEmpty: '没有匹配“{query}”的提供商', enabledToast: '已启用 {name}', emptyTitle: '还没有可用的提供商', emptyDesc: '从内置目录中启用一个,或新建一个自定义提供商。', searchHint: '开启后,大模型将在回答时自动调用内置搜索引擎获取实时信息(DashScope/Kimi/OpenAI 支持)。', searchStrategyDefault: '默认', oauthTitle: 'OpenAI OAuth 登录', oauthLogin: 'OAuth 登录', oauthConnected: '已连接', oauthDisconnected: '未连接', oauthDisconnect: '断开连接', oauthHint: '通过 OAuth 登录 OpenAI 账号,使用 ChatGPT Plus/Pro 会员额度(非 API 额度)。', oauthLoginSuccess: 'OpenAI OAuth 登录成功', oauthRevokeSuccess: '已断开 OpenAI OAuth 连接', // Device Authorization Grant (used for remote deployments where the browser // cannot reach localhost:1455 for the PKCE callback). oauthDeviceTitle: '使用设备授权登录 ChatGPT', oauthDeviceStep1: '1. 在任意浏览器或手机打开下面的链接:', oauthDeviceStep2: '2. 输入下方验证码完成授权:', oauthDeviceStep3: '完成后此页面将自动连接({seconds} 秒内有效)', oauthDeviceExpired: '设备授权码已过期,请重试', copy: '复制', copied: '已复制', copyFailed: '浏览器拒绝复制,请手动选取', // RFC-062:Claude Code OAuth(订阅复用) claudeCodeOauthDetect: '检测 Claude Code 登录态', claudeCodeOauthHint: '复用本地 Claude Code Pro/Max 订阅。请先在 Claude Code 客户端中登录,再点击"检测"读取凭据。', claudeCodeOauthInstructions: '未检测到 Claude Code 凭据。请安装 Claude Code 客户端,使用 Pro/Max 账号登录后再点击检测。', claudeCodeOauthRevokeHint: '请在 Claude Code 客户端中退出登录。MateClaw 不会修改 Claude Code 的本地凭据。', providerIdPlaceholder: '例如:my-local-gemma', providerIdHint: 'ID 仅作内部 key 使用,建议小写英文/数字,可含 . _ -,不要含斜杠或空格(创建后不可修改)。', providerIdInvalid: 'Provider ID 只能包含字母、数字、点、下划线、连字符(不允许斜杠或空格),首字符必须是字母或数字,长度 1-64。', fields: { providerId: '提供商 ID', providerName: '提供商名称', defaultBaseUrl: '默认 Base URL', apiKeyPrefix: 'API Key 前缀', requireApiKey: '需要 API Key', protocol: '协议', generateKwargs: 'Generate Kwargs (JSON)', fallbackPriority: '池内尝试顺序', enableSearch: '内置搜索', searchStrategy: '搜索策略', modelId: '模型 ID', modelDisplayName: '显示名称', }, actions: { manageModels: '管理模型', providerSettings: '配置', }, hints: { openai: 'OpenAI 默认使用 https://api.openai.com/v1', azureOpenai: 'Azure OpenAI 请填写资源级 endpoint,例如 https://.openai.azure.com/openai/v1', anthropic: 'Anthropic 默认使用 https://api.anthropic.com', ollama: 'Ollama 本地默认地址通常是 http://localhost:11434', lmstudio: 'LM Studio 本地默认 OpenAI 兼容地址通常是 http://localhost:1234/v1', gemini: 'Gemini 默认使用 https://generativelanguage.googleapis.com', openrouter: 'OpenRouter 默认使用 https://openrouter.ai/api/v1,支持聚合多家模型', zhipu: '智谱 AI 默认使用 https://open.bigmodel.cn/api/paas/v4', zhipuIntl: '智谱 AI 国际版使用 https://open.z.ai/api/paas/v4', volcengine: '火山引擎(豆包)默认使用 https://ark.cn-beijing.volces.com/api/v3,需要在火山方舟平台创建接入点', xiaomiMimo: '小米 MiMo 默认使用 https://api.xiaomimimo.com/v1,OpenAI 兼容协议,API Key 在 platform.xiaomimimo.com 申请', openaiCompatible: '兼容 OpenAI 协议的服务通常使用 /v1 结尾的 Base URL', }, discovery: { discover: '发现模型', discovering: '正在发现...', testConnection: '测试连接', testing: '测试中...', testModel: '测试', testingModel: '测试中...', discoveredTitle: '发现的新模型', discoveredCount: '发现 {total} 个模型,其中 {count} 个为新模型', noNewModels: '未发现新模型,所有远端模型均已存在', selectAll: '全选', addSelected: '添加选中模型', adding: '添加中...', addedCount: '已添加 {count} 个模型', connectionOk: '连接成功', connectionFail: '连接失败', latency: '延迟 {ms}ms', modelOk: '模型可用', modelFail: '模型不可用', probeVerified: '已验证', probeVerifiedTitle: '已验证可达', probeFailedBanner: '⚠ {count} 个模型未通过可达性检测,未列入上方列表:', probeUnreachable: '无法连接', }, }, fields: { name: '显示名称', provider: '提供商', modelName: '模型标识', description: '描述', temperature: '温度', maxTokens: '最大 Token', topP: 'Top P', language: '界面语言', streamEnabled: '流式响应', debugMode: '调试模式', searchEnabled: '启用搜索', searchProvider: '搜索提供商', searchFallbackEnabled: '失败回退', serperApiKey: 'Serper API Key', serperBaseUrl: 'Serper 接口地址', tavilyApiKey: 'Tavily API Key', tavilyBaseUrl: 'Tavily 接口地址', duckduckgoEnabled: 'DuckDuckGo(免 Key)', searxngBaseUrl: 'SearXNG 地址', // STT 语音识别 sttEnabled: '启用语音识别', sttProvider: '首选 STT 提供商', sttFallbackEnabled: '提供商回退', // Issue #76: OpenAI-compat STT 端点路由 sttOpenAiCompatProviderId: 'OpenAI 兼容凭证', sttOpenAiCompatModel: 'OpenAI 兼容模型名', // 音乐生成 musicEnabled: '启用音乐生成', musicProvider: '首选音乐提供商', musicFallbackEnabled: '提供商回退', // 3D 模型生成 model3dEnabled: '启用 3D 模型生成', model3dProvider: '首选 3D 提供商', model3dFallbackEnabled: '提供商回退', // TTS 语音合成 ttsEnabled: '启用语音合成', ttsProvider: '首选 TTS 提供商', ttsFallbackEnabled: '提供商回退', ttsAutoMode: '自动朗读模式', ttsSpeed: '语速', // 图片生成 imageEnabled: '启用图片生成', imageProvider: '首选图片提供商', imageFallbackEnabled: '提供商回退', openaiStatus: 'OpenAI 状态', // 视频生成 videoEnabled: '启用视频生成', videoProvider: '首选视频提供商', videoFallbackEnabled: '提供商回退', dashscopeStatus: 'DashScope 状态', zhipuApiKey: '智谱 API Key', zhipuBaseUrl: '智谱 API 地址', falApiKey: 'fal.ai API Key', klingAccessKey: '可灵 Access Key', klingSecretKey: '可灵 Secret Key', runwayApiKey: 'Runway API Key', minimaxApiKey: 'MiniMax API Key', minimaxRegion: 'MiniMax API 区域', }, hints: { provider: '当前版本会把 DashScope 模型参数真实应用到 Agent 调用链路。', language: '界面语言会持久化到后端设置中。', streamEnabled: '用于控制前端默认流式响应偏好。', debugMode: '预留给后续执行明细展示。', searchEnabled: '关闭后搜索工具将不可用,Agent 无法联网搜索。', searchProvider: '选择主搜索提供商,调用搜索工具时优先使用。', searchFallbackEnabled: '主提供商调用失败时,自动回退到另一个提供商。', serperApiKey: '用于 Google Serper 搜索服务,从 serper.dev 获取。', serperBaseUrl: '通常无需修改,除非使用自定义代理地址。', tavilyApiKey: '用于 Tavily 搜索服务,从 tavily.com 获取。', tavilyBaseUrl: '通常无需修改,除非使用自定义代理地址。', duckduckgoEnabled: '免费搜索兜底,无需 API Key。默认开启,作为零配置下的搜索降级方案。', searxngBaseUrl: '自部署 SearXNG 实例地址。Docker 部署时自动配置。', // STT 语音识别 sttEnabled: '开启后支持语音消息转文字。OpenAI Whisper 和 DashScope Paraformer 均复用已有 Key。', sttProvider: '选择首选 STT 提供商,auto 模式自动选择可用的提供商。', sttFallbackEnabled: '首选提供商失败时自动尝试其他已配置的提供商。', openaiSttInfo: '复用模型管理中的 OpenAI API Key。使用 Whisper 模型,支持多语言自动识别。', dashscopeSttInfo: '复用模型管理中的 DashScope API Key。使用 Paraformer Realtime(WebSocket 流式),中文识别效果优秀,亚秒级延迟。', // Issue #76 sttOpenAiCompatProviderId: '从模型管理选一个 OpenAI 兼容 provider 行作为凭证(baseUrl + API Key)来源。除官方 OpenAI 外,FunASR 私有部署 / 硅基流动 / Groq / Together / 火山 / 七牛等都可以用——在模型管理新增自定义 provider 后即可在此选用。', sttOpenAiCompatModel: '发送给端点的模型名(multipart "model" 字段)。OpenAI 默认 whisper-1;FunASR 通常是 paraformer-large;其他厂商按其文档填写。', sttOpenAiCompatNote: '提示:要接私有 ASR 服务,先去模型管理 → 新增自定义 provider → 协议选 "OpenAI 兼容" → 填 Base URL + 可选 API Key,然后回到这里选它。', // 音乐生成 musicEnabled: '开启后 Agent 可通过 music_generate 工具生成音乐。Google Lyria 复用 Google Key。', musicProvider: '选择首选音乐提供商,auto 模式优先使用 Google Lyria。', musicFallbackEnabled: '首选提供商失败时自动尝试其他已配置的提供商。', googleLyriaInfo: '复用模型管理中的 Google API Key。Lyria 3 模型,支持歌词谱曲和纯音乐生成。', minimaxMusicInfo: '复用视频生成中的 MiniMax API Key。music-2.5+ 模型,支持歌词和纯音乐。', // 3D 模型生成 model3dEnabled: '开启后 Agent 可通过 model3d_generate 工具生成 3D 模型 (.glb)。需先在「模型与凭据」配置 hunyuan-3d 的 SecretId:SecretKey。', model3dProvider: '选择首选 3D 提供商,auto 模式按优先级自动选用。', model3dFallbackEnabled: '首选提供商失败时自动尝试其他已配置的提供商。', hunyuan3dInfo: '腾讯混元 3D(ai3d.tencentcloudapi.com)。HY-3D-3.1 / HY-3D-3.0 走 Pro 接口,HY-3D-Express 走 Rapid 极速接口。在「模型与凭据」中以 SecretId:SecretKey 格式保存。', // TTS 语音合成 ttsEnabled: '开启后可通过消息朗读按钮或自动模式使用语音合成。Edge TTS 免费无需 Key。', ttsProvider: '选择首选 TTS 提供商,auto 模式优先使用免费的 Edge TTS。', ttsFallbackEnabled: '首选提供商失败时自动尝试其他已配置的提供商。', ttsAutoMode: 'off = 仅手动朗读,always = 每条 AI 回复自动播放语音。', ttsSpeed: '语音播放速度,1.0 为正常速度。', edgeTtsInfo: '微软 Edge 内置 TTS 服务,免费使用,支持中文、英文、日文等多语言。自动根据文本语言切换语音。', dashscopeTtsInfo: '复用模型管理中的 DashScope API Key。使用 CosyVoice 模型,支持多种中文语音。', openaiTtsInfo: '复用模型管理中的 OpenAI API Key。支持 alloy、echo、nova 等多种语音风格。', // 图片生成 imageEnabled: '开启后 Agent 可使用图片生成工具。需至少配置一个图片提供商的 API Key。', imageProvider: '选择首选图片生成提供商,auto 模式自动选择第一个可用的。', imageFallbackEnabled: '首选提供商失败时自动尝试其他已配置的提供商。', dashscopeImageStatus: '复用模型管理中配置的 DashScope API Key,无需额外配置。', openaiImageStatus: '复用模型管理中配置的 OpenAI API Key,无需额外配置。', zhipuImageApiKey: '从 bigmodel.cn 获取。CogView-3-Flash 模型免费。与视频生成共用同一 Key。', falImageApiKey: '从 fal.ai 获取,支持 Flux 系列图片生成模型。与视频生成共用同一 Key。', googleImagenInfo: '复用模型管理中的 Google API Key。支持 Gemini 图片生成和 Imagen 4.0 模型。', minimaxImageInfo: '复用视频生成中的 MiniMax API Key。image-01 模型,支持多种画面比例,最多 9 张。', // 视频生成 videoEnabled: '开启后 Agent 可使用视频生成工具。需至少配置一个视频提供商的 API Key。', videoProvider: '选择首选视频生成提供商,auto 模式自动选择第一个可用的。', videoFallbackEnabled: '首选提供商失败时自动尝试其他已配置的提供商。', dashscopeVideoStatus: '复用模型管理中配置的 DashScope API Key,无需额外配置。', zhipuApiKey: '从 bigmodel.cn 获取,CogVideoX-Flash 模型免费。', zhipuBaseUrl: '通常无需修改,除非使用自定义代理地址。', falApiKey: '从 fal.ai 获取,一个 Key 可访问 Kling、Runway、Luma 等多个模型。', klingAccessKey: '从快手开放平台获取,用于调用可灵视频生成 API。', klingSecretKey: '与 Access Key 配对使用,用于 JWT 签名鉴权。', runwayApiKey: '从 runwayml.com 获取。支持 gen4.5、gen4_turbo 等旗舰模型。', minimaxApiKey: '从 minimaxi.com 获取。海螺 Hailuo 视频,有免费额度,中文场景优秀。', minimaxRegion: '选择 API 入口域名。中国账号用 CN,海外账号用 Global。', }, searchTitle: '搜索服务', searchDesc: '配置内置搜索工具的提供商与 API 凭证', sttTitle: '语音识别', sttDesc: '配置 STT 语音转文字,支持 OpenAI Whisper 和 DashScope Paraformer', sttProviderOptions: { auto: '自动选择' }, sttProviderTags: { reuseLlmKey: '复用 LLM API Key' }, musicTitle: '音乐生成', musicDesc: '配置 AI 音乐生成,支持 Google Lyria 和 MiniMax Music', musicProviderOptions: { auto: '自动选择' }, musicProviderTags: { reuseLlmKey: '复用 LLM API Key', sharedWithVideo: '与视频共用' }, model3dTitle: '3D 模型生成', model3dDesc: '配置 AI 3D 模型生成,支持腾讯混元 3D(HY-3D-3.1 / HY-3D-3.0 / HY-3D-Express)', model3dProviderOptions: { auto: '自动选择', hunyuan: '腾讯混元 3D' }, model3dProviderTags: { requiresKey: '需配置 SecretId:SecretKey' }, ttsTitle: '语音合成', ttsDesc: '配置 TTS 语音合成,支持 Edge TTS(免费)、OpenAI TTS、DashScope CosyVoice', ttsProviderOptions: { auto: '自动选择', }, ttsProviderTags: { free: '免费', noKeyNeeded: '无需 API Key', reuseLlmKey: '复用 LLM API Key', }, ttsAutoModeOptions: { off: '关闭(仅手动朗读)', always: '始终自动朗读', }, imageTitle: '图片生成', imageDesc: '配置 AI 图片生成能力,支持 DashScope、OpenAI DALL-E、fal.ai Flux、智谱 CogView', imageProviderOptions: { auto: '自动选择', }, imageProviderTags: { reuseLlmKey: '复用 LLM API Key', freeQuota: '有免费额度', configuredInModels: '前往模型设置查看', sharedWithVideo: '与视频共用', }, videoTitle: '视频生成', videoDesc: '配置 AI 视频生成能力,支持文字生成视频和图片生成视频', videoProviderOptions: { auto: '自动选择', }, videoProviderTags: { reuseLlmKey: '复用 LLM API Key', freeQuota: '有免费额度', configuredInModels: '前往模型设置查看', }, minimaxRegionGlobal: '海外(api.minimax.io)', minimaxRegionCn: '中国大陆(api.minimaxi.com)', actions: { setDefault: '设为默认', saveSystem: '保存系统设置', }, messages: { loadFailed: '加载设置失败', saveSuccess: '设置已保存', saveFailed: '保存设置失败', deleteConfirm: '确认删除该模型预设?', modelSaved: '模型预设已保存', modelDeleted: '模型预设已删除', defaultChanged: '默认模型已更新', }, languageOptions: { zhCN: '简体中文', enUS: 'English', }, }, agentContext: { kicker: '上下文工作面', title: '智能体上下文', desc: '管理智能体的提示文件和记忆', selectAgent: '选择智能体', noAgent: '请先选择一个智能体', files: '文件列表', coreFiles: '核心文件', coreFilesDesc: '启用的文件将按顺序拼接为 Agent 系统提示词', newFile: '新建文件', noFiles: '暂无文件', selectFile: '选择左侧文件查看内容', fileContent: '在此编辑 Markdown 内容...', preview: '预览', editOnly: '编辑', splitView: '分栏', modified: '已修改', saveSuccess: '保存成功', saveFailed: '保存失败', deleteConfirm: '确认删除文件 "{name}" 吗?', deleteSuccess: '文件已删除', deleteFailed: '删除失败', promptUpdated: '系统提示文件配置已更新', promptUpdateFailed: '更新系统提示文件配置失败', newFileTitle: '新建文件', newFilePlaceholder: '输入文件名(如 AGENTS.md)', newFileHint: '文件名必须以 .md 结尾', fileExists: '文件名已存在', invalidFilename: '请输入有效的 .md 文件名', loadFailed: '加载文件列表失败', loadFileFailed: '加载文件内容失败', }, agents: { kicker: '员工工作室', title: '数字员工', desc: '招募、培训和管理你的数字员工', newAgent: '新员工', live: { atWork: '{n} 个在干活 · 看现场', needsAttention: '{n} 个需要看看 · 去现场', }, templates: { title: '选择岗位', desc: '从一份岗位说明书快速招聘,或从空白开始。', skip: '从空白开始', applied: '员工已上岗', }, search: '搜索员工...', tabs: { all: '全部', react: 'ReAct', planExecute: 'Plan-Execute', enabled: '已启用', disabled: '已停用', basic: '基本信息', skills: '技能', tools: '工具', providers: '偏好提供商', context: '上下文', }, columns: { name: '名称', description: '描述', agentType: '类型', modelName: '模型', tags: '标签', enabled: '状态', updateTime: '更新时间', actions: '操作', }, status: { enabled: '已启用', disabled: '已停用', }, emptyTitle: '还没有员工', emptyDesc: '招聘第一位员工开始', modal: { newTitle: '新员工', editTitle: '编辑员工', }, fields: { name: '名称', icon: '图标', type: '类型', description: '描述', systemPrompt: '系统提示词', role: '岗位(Role)', roleHint: '一句话的职业身份。例:数据分析师、客服助理。', goal: '目标(Goal)', goalHint: '这个员工存在的理由——他帮你达成什么。', taglinePreview: '卡片预览:', backstory: '背景(Backstory)', backstoryHint: '用户看不见,但每一次对话都能感觉到。写他的经验、信念、做事原则。', extraInstructions: '高级:补充指令', extraInstructionsHint: '可选。用于细化输出格式、流程清单或边界规则。', maxIterations: '最大迭代次数', defaultThinkingLevel: '默认思考深度', modelName: '模型', modelGlobalDefault: '使用全局默认模型', modelHint: '为该员工单独指定模型,留空则跟随「设置 → 模型」中的全局默认。', tags: '标签', enabled: '启用', }, thinkingLevels: { auto: '跟随模型', off: '关闭', low: '低', medium: '标准', high: '深度', max: '极限', }, types: { react: 'ReAct(工具调用)', planExecute: 'Plan-and-Execute', }, actions: { chat: '对话', edit: '编辑', delete: '删除', create: '创建', update: '保存', }, placeholders: { name: '员工名字', icon: 'Emoji 或 URL', description: '简短描述', systemPrompt: '你是一个有帮助的 AI 助手...', role: '例:数据分析师', goal: '例:把数据变成可执行洞察', backstory: '例:在数据里待了十年,相信先问对问题再写 SQL...', extraInstructions: '可选:补充输出格式、流程清单或边界规则...', tags: 'tag1,tag2', }, messages: { noDescription: '暂无描述', noTagline: '还没填岗位与目标', deleteConfirm: '确认让该员工离职吗?删除后不可恢复。', loadFailed: '加载员工列表失败', saveFailed: '保存员工失败', saveSuccess: '员工已保存', deleteFailed: '删除员工失败', deleteSuccess: '员工已离职', toggleFailed: '切换状态失败', toggleSuccess: '状态已更新', }, binding: { skillsKicker: '受过培训的工作流程', skillsTagline: '技能 = 一段流程,一份工作手册。LLM 按手册执行一系列连贯动作。', skillsHint: '选择此智能体可使用的技能。留空则使用所有已启用的技能。', toolsKicker: '会用的原子工具', toolsTagline: '工具 = 一次调用,做一件事。由 LLM 自主决定何时调用。', toolsHint: '选择此智能体可使用的工具。留空则使用所有已启用的工具。', searchSkills: '搜索技能名称、描述或版本', searchTools: '搜索工具名称、描述、来源或分组', advancedToolsTitle: '高级:手选原子工具', advancedToolsHint: 'Skill 绑定已自动展开 allowed-tools。此处仅用于未打包成 Skill 的内置微工具(如 datetime、delegate_agent)。', toolUnionHint: '直选工具会与已绑定技能提供的工具合并生效。MCP 服务在系统层启用后默认对此 Agent 可用,勾选 MCP 行只是显式记录绑定,不勾也能调用。需要禁用某个 MCP 工具请到「安全 → 工具防护」配置黑名单。', mcpAutoIncludedBadge: '自动可用', mcpAutoIncludedTooltip: 'MCP 服务在系统中启用后,其工具对所有 Agent 默认可用。勾选只用于记录显式绑定,不勾不会限制此 Agent 调用。如需禁用,请在「安全 → 工具防护」配置。', toolStaleBadge: '离线缓存', toolStaleTooltip: '该 MCP 服务当前未连接,工具列表来自上次连接时的快照;连接恢复前 LLM 不会调用这个工具。', toolUnavailableBadge: '不可用', toolUnavailableTooltip: '此工具的命名与同服务下的另一个工具冲突,无法绑定({reason})。请在上游 MCP 服务中重命名后重试。', toolOrphanGroup: '已绑定但当前不可用', toolOrphanDescription: '此工具在以前绑定过,但已不在当前可用工具列表中(如所属 MCP 服务被删除或工具被上游下线)。取消勾选并保存可清理掉这条遗留绑定。', providersHint: '此智能体优先使用的提供商顺序(数字越小越先尝试)。留空则按全局可用池顺序回退。提供商进入冷却或被移出池时仍会被自动跳过。', providersAddHint: '点击下方提供商加入偏好列表:', noSkills: '暂无可用技能', noTools: '暂无可用工具', noMatchingSkills: '没有匹配的技能', noMatchingTools: '没有匹配的工具', noProviderPreferences: '尚未配置偏好顺序,将按全局回退链顺序使用。', contextHint: '管理此智能体的上下文文件(如 AGENT.md),定义智能体的行为、知识和指令。', goToContext: '前往编辑上下文', }, }, security: { title: '安全管理', kicker: '治理中心', layoutDesc: '边界、审批、审计和工作区治理必须在这里说同一种语言,否则系统不值得被信任。', sections: { toolGuard: '工具防护', fileGuard: '文件防护', auditLogs: '审计日志', members: '成员管理', workspaces: '工作区', activity: '操作日志', }, activity: { title: '活动', desc: '谁做了什么,一句话讲清楚。点开任意一行看完整故事。', allActions: '全部操作', allResources: '全部资源', allSources: '全部', sourceAudit: '审计', sourceApproval: '审批', detailTitle: '事件详情', detailDetails: '详情', loading: '加载中…', noEvents: '暂无操作记录', emptyHint: '创建智能体、绑定技能、审批工具调用都会出现在这里。', moreFilters: '更多筛选', changes: '改动', environment: '环境', absoluteTime: '绝对时间', noValue: '(空)', rawPayload: '原始数据', today: '今天', yesterday: '昨天', justNow: '刚刚', minutesAgo: '{n} 分钟前', hoursAgo: '{n} 小时前', daysAgo: '{n} 天前', verbs: { create: '创建了', update: '更新了', delete: '删除了', enable: '启用了', disable: '停用了', login: '登录了', logout: '退出了', approvalGranted: '批准了', approvalDenied: '拒绝了', approvalPending: '请求了', }, resources: { agent: '智能体', channel: '频道', skill: '技能', wiki: 'Wiki 页', member: '成员', workspace: '工作区', toolApproval: '工具调用', }, columns: { time: '时间', source: '来源', user: '用户', action: '操作', resource: '资源类型', name: '名称', ip: 'IP', }, }, members: { title: '工作区成员', desc: '管理当前工作区的成员和角色。', addMember: '添加成员', noMembers: '暂无成员。', loading: '加载中...', columns: { user: '用户', role: '角色', joined: '加入时间', actions: '操作', }, roles: { owner: '所有者', admin: '管理员', member: '成员', viewer: '查看者', }, addDialog: { title: '添加成员', userId: '用户 ID', userIdPlaceholder: '输入用户 ID', user: '选择用户', userPlaceholder: '搜索用户名…', username: '用户名', usernamePlaceholder: '输入用户名', usernameHint: '如果用户不存在,将自动创建账号', password: '密码', passwordPlaceholder: '新用户需填写密码', passwordHint: '已有用户无需填写,新用户必填', nickname: '昵称', nicknamePlaceholder: '可选,用户显示名称', role: '角色', }, actions: { remove: '移除', cancel: '取消', confirm: '确认', }, messages: { addSuccess: '成员添加成功', addFailed: '添加成员失败', updateSuccess: '角色更新成功', updateFailed: '更新角色失败', removeConfirm: '确定要移除该成员吗?', removeSuccess: '成员已移除', removeFailed: '移除成员失败', }, }, workspaces: { title: '工作区管理', desc: '管理组织的工作区。', manage: '管理工作区', newWorkspace: '新建工作区', loading: '加载中...', noWorkspaces: '暂无工作区。', current: '当前', columns: { name: '名称', slug: '标识', description: '描述', basePath: '活动目录', created: '创建时间', actions: '操作', }, createDialog: { title: '新建工作区', name: '名称', namePlaceholder: '例如:工程团队', slug: '标识', slugPlaceholder: '例如:engineering', slugHint: '标识创建后不可修改。', description: '描述', descriptionPlaceholder: '可选描述', basePath: '活动目录', basePathPlaceholder: '例如:/home/user/project 或 D:\\codes\\MyProject', basePathHint: '限制 Agent 文件操作的根目录,留空不限制。', }, editDialog: { title: '编辑工作区', }, deleteDialog: { title: '删除工作区', confirm: '确定要删除 {name} 吗?这将移除该工作区下的所有资源。', }, actions: { edit: '编辑', delete: '删除', cancel: '取消', create: '创建', save: '保存', }, messages: { saveSuccess: '工作区保存成功', saveFailed: '保存工作区失败', deleteSuccess: '工作区已删除', deleteFailed: '删除工作区失败', }, }, toolGuard: { title: '工具防护', desc: '管理工具调用安全规则和全局防护配置', enabled: '启用工具防护', enabledHint: '开启后将对工具调用进行安全检查和规则匹配', guardScope: '防护范围', scopeAll: '所有工具', scopeSelected: '指定工具', guardedTools: '受保护工具', guardedToolsPlaceholder: '输入工具名后回车', deniedTools: '禁止调用工具', deniedToolsPlaceholder: '输入工具名后回车', rules: '安全规则', rulesDesc: '管理内置和自定义安全规则', addRule: '新增规则', editRule: '编辑规则', columns: { name: '规则名称', severity: '严重度', category: '分类', pattern: '匹配模式', decision: '决策', enabled: '状态', builtin: '类型', actions: '操作', }, builtinBadge: '内置', customBadge: '自定义', deleteConfirm: '确认删除规则 "{name}" 吗?', fields: { ruleId: '规则 ID', name: '名称', description: '描述', toolName: '目标工具', pattern: '正则模式', excludePattern: '排除模式', category: '分类', severity: '严重度', decision: '决策', remediation: '修复建议', priority: '优先级', }, messages: { ruleIdRequired: '规则 ID 不能为空', nameRequired: '名称不能为空', patternRequired: '正则模式不能为空', ruleIdDuplicate: '规则 ID 已存在', saveFailed: '保存规则失败', }, }, fileGuard: { title: '文件防护', desc: '管理敏感文件路径保护', enabled: '启用文件防护', enabledHint: '开启后将保护敏感文件路径免受未授权访问', sensitivePaths: '敏感路径', sensitivePathsDesc: '配置需要保护的文件路径(支持通配符)', addPath: '添加路径', pathPlaceholder: '输入路径后回车 (例: ~/.ssh/)', }, audit: { title: '审计日志', desc: '查看工具安全检查记录', config: { title: '审计配置', enabled: '启用审计日志', enabledHint: '关闭后将不再记录工具调用审计日志', minSeverity: '最低记录等级', minSeverityHint: '仅记录达到此等级及以上的审计事件', retentionDays: '保留天数', retentionDaysHint: '超过此天数的审计日志将被自动清理(0=永不清理)', }, stats: { total: '总检查', blocked: '已阻止', needsApproval: '需审批', allowed: '已放行', }, filters: { toolName: '工具名称', decision: '决策', severity: '严重度', conversationId: '会话 ID', }, columns: { time: '时间', tool: '工具', decision: '决策', severity: '严重度', conversationId: '会话', }, noLogs: '暂无审计记录', expandFindings: '展开详情', }, severity: { CRITICAL: '严重', HIGH: '高', MEDIUM: '中', LOW: '低', INFO: '信息', }, decision: { ALLOW: '放行', NEEDS_APPROVAL: '需审批', BLOCK: '阻止', }, messages: { loadFailed: '加载安全配置失败', saveSuccess: '安全配置已保存', saveFailed: '保存安全配置失败', ruleCreated: '规则已创建', ruleUpdated: '规则已更新', ruleDeleted: '规则已删除', ruleToggled: '规则状态已更新', }, approval: { title: '需要审批', severity: '风险等级', summary: '摘要', findings: '发现的问题', remediation: '修复建议', approved: '已批准', denied: '已拒绝', hint: '输入 /approve 批准执行,或输入 /deny 拒绝', }, }, tokenUsage: { kicker: '运行成本', title: 'Token 统计', desc: '查看 Token 使用量和模型调用统计', refresh: '刷新', startDate: '开始日期', endDate: '结束日期', promptTokens: 'Prompt Tokens', completionTokens: 'Completion Tokens', assistantMessages: 'Assistant Messages', byModel: '按模型统计', byDate: '按日期统计', model: '模型', provider: '提供商', date: '日期', messageCount: '消息数', loadFailed: '加载 Token 统计失败', noData: '暂无 Token 使用数据', }, acp: { kicker: '外部 Agent', title: 'ACP 端点', desc: '通过 stdio 委派给外部编码 Agent(codex / claude-code / opencode / qwen-code)。安装对应 CLI 后开启该入口。', addEndpoint: '新增端点', builtin: '内置', test: '测试', testing: '测试中…', statusUnknown: '未测试', empty: '暂无 ACP 端点。', loadFailed: '加载 ACP 端点列表失败', saveFailed: '保存端点失败', deleteTitle: '确认删除', deleteConfirm: '确认删除 ACP 端点 "{name}"?内置端点不可删除。', deleteFailed: '删除端点失败', toggleFailed: '切换端点状态失败', invalidJson: 'JSON 格式错误', columns: { name: '端点', command: '命令', status: '最近一次测试', enabled: '启用', actions: '操作', }, fields: { name: '标识 (slug)', displayName: '显示名', description: '描述', command: '命令', args: '参数 (JSON 数组)', env: '环境变量', toolParseMode: 'Tool 解析模式', enabled: '启用', }, env: { formMode: '编辑 JSON', jsonMode: '回到表单', suggested: '推荐', addRow: '添加变量', keyPlaceholder: 'KEY_NAME', valuePlaceholder: '值(如 sk-…)', show: '显示', hide: '隐藏', remove: '移除', hints: { anthropic: 'Anthropic API key(sk-ant-…)。申请: https://console.anthropic.com/settings/keys', openai: 'OpenAI API key(sk-…)。申请: https://platform.openai.com/api-keys', dashscope: '阿里云 DashScope key — 跟 MateClaw .env 里的 DASHSCOPE_API_KEY 同一个值', google: 'Google AI Studio API key。申请: https://aistudio.google.com/apikey', claudeOauth: '注意: claude-code 的 OAuth 登录(~/.claude/ 里那个)在这里不能用——更糟的是 Claude Agent SDK 会"优先读 OAuth、再读 API key",导致你下面填的 key 被静默忽略。如果你这台机器上跑过 `claude login`,先清钥匙串: (macOS) `claude logout` 或 `security delete-generic-password -s "Claude Code-credentials"`;(Linux/Windows) 删 ~/.claude/credentials.json。然后再回来填真正的 API key(sk-ant-…)。或者改用 qwen-code / opencode 复用各自 CLI 的本地登录态。', }, }, modal: { newTitle: '新增 ACP 端点', editTitle: '编辑 ACP 端点', }, }, mcp: { kicker: '能力桥接', title: 'MCP 连接', desc: '管理 MCP (Model Context Protocol) 服务器连接', addServer: '添加连接', refreshAll: '全量刷新', columns: { name: '名称', transport: '协议', enabled: '状态', lastStatus: '连接状态', lastConnectedTime: '最后连接', toolCount: '工具数', description: '描述', actions: '操作', }, status: { connected: '已连接', disconnected: '未连接', error: '连接失败', }, transport: { stdio: 'Stdio', sse: 'SSE', streamable_http: 'HTTP', }, modal: { newTitle: '添加 MCP 连接', editTitle: '编辑 MCP 连接', }, fields: { name: '名称', description: '描述', transport: '传输协议', url: 'URL', headers: 'HTTP Headers (JSON)', command: '命令', args: '参数 (JSON 数组)', env: '环境变量 (JSON)', cwd: '工作目录', connectTimeout: '连接超时 (秒)', readTimeout: '读取超时 (秒)', enabled: '启用', }, placeholders: { name: '服务名称', description: '简短描述', url: 'http://localhost:8080/sse', headers: '', command: 'npx', args: '', env: '', cwd: '/path/to/dir', }, actions: { test: '测试连接', testing: '测试中...', }, testResult: { success: '连接成功', failed: '连接失败', tools: '发现 {count} 个工具', latency: '延迟 {ms}ms', }, messages: { loadFailed: '加载 MCP 连接列表失败', createSuccess: 'MCP 连接已创建', updateSuccess: 'MCP 连接已更新', deleteSuccess: 'MCP 连接已删除', deleteConfirm: '确认删除 MCP 连接 "{name}" 吗?', toggleSuccess: '状态已更新', refreshSuccess: '全量刷新完成', saveFailed: '保存失败', empty: '暂无 MCP 连接', emptyDesc: '添加一个 MCP 连接来扩展 Agent 的能力', }, }, sessions: { title: '会话管理', desc: '查看和管理所有会话', search: '搜索会话...', columns: { session: '会话', source: '来源', agent: 'Agent', messages: '消息', status: '状态', lastActive: '最后活跃', actions: '操作', }, status: { active: '活跃', closed: '已关闭', }, empty: '暂无会话', loadFailed: '加载会话列表失败', deleteConfirm: '确定要删除这个会话吗?', deleteTitle: '确认删除', deleteFailed: '删除会话失败', time: { justNow: '刚刚', minutesAgo: '{n} 分钟前', hoursAgo: '{n} 小时前', }, }, tools: { kicker: '开发者目录', title: '工具目录', desc: '已安装 Skill 暴露的原子动作。终端绑定请使用 Skills 页。', registerButton: '注册工具', columns: { tool: '工具', beanName: 'Bean 名称', type: '类型', status: '状态', actions: '操作', }, empty: '暂无已注册工具', modal: { editTitle: '编辑工具', newTitle: '注册工具', }, fields: { name: '名称', beanName: 'Bean 名称', type: '类型', description: '描述', }, placeholders: { name: '工具名称', beanName: 'Spring Bean 名称', description: '工具描述', }, types: { builtin: '内置', mcp: 'MCP', custom: '自定义', }, messages: { saveFailed: '保存工具失败', deleteConfirm: '确定要删除这个工具吗?', deleteTitle: '确认删除', deleteFailed: '删除工具失败', toggleFailed: '切换工具状态失败', }, }, skillTemplates: { kicker: '创作向导', title: 'Skill 模板库', desc: '选一个起步模板,填几个字段,模板向导会在你的工作区里生成一个标准 manifest skill。', backToSkills: '← 返回 Skills', backToGallery: '返回模板列表', fields: '个字段', useTemplate: '使用模板', empty: '暂无可用模板。', step1: '填写参数', step2: '预览', step3: '完成', next: '下一步', back: '上一步', selectKb: '— 选择知识库 —', previewHint: '即将生成的 SKILL.md 预览。确认无误后点 Install Skill 创建。', installSkill: '安装 Skill', installing: '安装中...', installFailed: '安装失败', installed: 'Skill 已安装', installedDesc: '{name} 已添加到你的工作区。', installAnother: '再装一个', viewInSkills: '到 Skills 查看', }, plugins: { title: '插件', desc: '管理从 JAR 文件加载的外部插件', refresh: '刷新', type: '类型', author: '作者', status: '状态', tools: '工具', channels: '渠道', provider: '提供商', memoryProvider: '记忆', noDescription: '暂无描述', emptyTitle: '暂无已安装插件', emptyHint: '将插件 JAR 文件放入 ~/.mateclaw/plugins/ 目录后重启服务', loading: '加载插件中...', loadFailed: '加载插件失败', enabled: '{name} 已启用', disabled: '{name} 已禁用', toggleFailed: '切换插件状态失败', }, datasources: { kicker: '数据接入', title: '数据源管理', desc: '管理外部数据库连接,用于自然语言查数', addButton: '添加数据源', empty: '暂无数据源,点击添加开始配置', columns: { name: '名称', type: '类型', connection: '连接', status: '状态', actions: '操作', }, sections: { basic: '基本信息', connection: '连接信息', auth: '认证', advanced: '高级配置', }, modal: { editTitle: '编辑数据源', newTitle: '添加数据源', }, fields: { name: '名称', dbType: '数据库类型', host: '主机', port: '端口', databaseName: '数据库名', schemaName: 'Schema', username: '用户名', password: '密码', description: '描述', extraParams: 'JDBC 参数', }, placeholders: { name: '例如:业务数据库', host: '127.0.0.1', port: '3306', databaseName: '数据库名', schemaName: 'public(默认)', username: '数据库用户名', password: '数据库密码', description: '数据源用途说明(可选)', extraParams: 'useSSL=false&serverTimezone=UTC', }, hints: { extraParams: 'JDBC URL 附加参数,多个参数用 & 分隔', }, testButton: '测试连接', messages: { saveFailed: '保存数据源失败', deleteConfirm: '确定要删除这个数据源吗?删除后 Agent 将无法访问此数据源。', deleteTitle: '确认删除', deleteFailed: '删除数据源失败', toggleFailed: '切换数据源状态失败', testSuccess: '连接成功', testFailed: '连接失败,请检查配置', }, }, backstage: { kicker: '后台', title: '看看你的数字员工在做什么', attention: '有几个需要你看看', unknownAgent: '员工', aTool: '某个工具', orphan: '没人在听', orphanHint: '聊天窗口已关闭,但这个员工仍在工作。', subagentsBadge: '{n} 个帮手', headline: { loading: '正在看看...', allQuiet: '一片安静。当前没有员工在工作。', working: '你的 {n} 个员工正在干活。', someoneNeedsAttention: '有 {n} 个需要你看看。', workingAlone: '{running} 个在干活 — 其中 {orphan} 个没人在听。', }, status: { running: '{n} 个在跑', stuck: '{n} 个卡住', orphan: '{n} 个无人看', helpers: '{n} 个帮手', }, filters: { all: '全部', working: '工作中', attention: '需关注', quiet: '无人看', }, saying: { thinking: '正在思考...', replying: '正在写回复...', planning: '正在规划下一步...', summarizing: '正在收尾...', usingToolBare: '正在使用', usingSomething: '正在使用某个工具...', awaitingApproval: '在等你审批。', toolSilentBare: '卡在工具上,没有进展。', idleSilent: '安静太久了。', hardCap: '已经跑了太久。', }, callout: { toolSilent: '{tool} 已经 {time} 没有动静了,看起来是卡住了。', idleSilent: '{time} 没有任何活动迹象。', hardCap: '已经跑了 {time},明显超出正常范围。', }, dotTitle: { healthy: '工作正常', stuck: '看起来卡住了', orphan: '在没人看的情况下运行', }, detail: { who: '谁', doing: '在做什么', runningFor: '已运行', lastHeard: '最后一次有动静', ago: '前', audience: '观众', noOneListening: '当前没有人在看这个对话。', peopleListening: '{n} 人在看', helpers: '帮手', session: '会话', }, actions: { live: '实时', paused: '已暂停', pauseRefresh: '暂停自动刷新', resumeRefresh: '恢复自动刷新', tidyUp: '清理一下', stop: '停下', stopHint: '让它在下个检查点停下来。', endIt: '强制结束', endHint: '立即强制停止。', close: '关闭', }, confirm: { stopTitle: '让这位员工停下吗?', stopBody: '让 {name} 收尾。它会先把当前的步骤做完。', endTitle: '强制 {name} 立即停止?', endBody: '这会立即终止该员工,正在进行的工作会丢失。用户会看到「已被管理员停止」。', subTitle: '停下这个帮手?', subBody: '停止 {name}。负责的员工会继续运行。', sweepTitle: '清理卡住的员工?', sweepBody: '有 {n} 个员工看起来卡住了,全部停掉吗?', }, toast: { stopped: '已要求停止。', ended: '已停止。', subStopped: '帮手已停止。', swept: '已清理 {n} 个员工。', }, empty: { allQuiet: '一片安静。', hint: '当前没有员工在工作。一旦有,这里就会亮起来。', }, time: { justNow: '刚刚', seconds: '{n} 秒', minutes: '{n} 分 {s} 秒', hours: '{n} 时 {m} 分', }, errors: { loadFailed: '无法加载运行时状态。', }, }, doctor: { title: '系统诊断', checking: '检查中...', allGood: '所有系统正常', hasWarnings: '{count} 个警告', hasErrors: '{count} 个问题', refresh: '重新检查', lastChecked: '{time} 前检查', diagnose: '诊断问题', }, wiki: { kicker: '知识引擎', desc: 'AI 驱动的结构化知识库,自动消化原始材料为 Wiki 页面', createKB: '新建知识库', knowledgeBases: '知识库', noKB: '暂无知识库', selectKB: '请选择一个知识库', library: { countLabel: '{count} 个知识库', searchPlaceholder: '搜索知识库...', empty: '还没有知识库', emptyHint: '点击右上角"新建知识库"开始组织你的知识', noMatch: '没有匹配的知识库', open: '进入', pages: '{count} 页', raws: '{count} 材料', noDescription: '暂无描述', updatedAt: '更新于 {time}', sortRecent: '最近更新', sortName: '名称', sortPages: '页面数', backToLibrary: '返回库', }, selectPage: '从左侧选择一个页面查看', pageKicker: '知识页面', confirmDelete: '确认删除页面「{title}」?此操作不可撤销。', confirmBatchDelete: '确认删除 {count} 个页面?此操作不可撤销。', batchSelect: '批量选择', selectAll: '全选', kbName: '名称', kbNamePlaceholder: '输入知识库名称', kbDescription: '描述', kbDescPlaceholder: '简要描述知识库用途', rawMaterials: '原始材料', pages: 'Wiki 页面', config: '处理配置', transformations: { tab: '加工器', title: '加工器(Transformations)', desc: '可复用的 prompt 模板。每个模板针对单个原始材料运行,生成的内容会落到此处可查。开启「默认运行」后,材料处理完成会自动触发。', empty: '尚无加工器模板,新建一个开始。', createBtn: '新建加工器', editBtn: '编辑', deleteBtn: '删除', deleteConfirm: '确认删除该加工器?历史运行记录会保留。', enabled: '启用', disabled: '已停用', applyDefault: '默认运行', applyDefaultOn: '每次新材料完成后自动跑', applyDefaultOff: '仅在手动 / Agent 调用时运行', modelLabel: '模型', modelDefault: '默认(KB / 系统默认)', modelHelp: '默认走 KB 绑定模型或系统默认 chat 模型;选定后该模板始终使用指定模型', outputTargetLabel: '输出去向', outputTargetNone: '不保存(仅留在运行历史)', outputTargetPage: '保存为 Wiki 页面(可被搜索 / Agent / 关系图引用)', outputTargetPageBadge: '自动落页', outputFormatLabel: '输出格式', outputFormatMarkdown: 'Markdown(默认,适合人读)', outputFormatJson: 'JSON(结构化,便于下游程序消费;失败会自动重试 1 次)', outputFormatJsonBadge: 'JSON', outputSchemaLabel: 'JSON Schema(可选)', outputSchemaHelp: '写在这里的 JSON Schema 会注入到 prompt,并在解析后做必填字段校验。留空表示不校验。', outputSchemaPlaceholder: '{\n "type": "object",\n "required": ["title", "items"],\n "properties": {\n "title": { "type": "string" },\n "items": { "type": "array" }\n }\n}', outputSchemaBadge: 'Schema', saveAsPageBtn: '保存为页面', saving: '保存中…', savedAsPage: '已保存:', saveAsPageDone: '已保存为 Wiki 页面', saveAsPageFailed: '保存为页面失败', openPage: '查看页面', scope: '范围', scopeKb: '仅限此知识库', scopeWorkspace: '工作区全局', name: '标识名', namePlaceholder: '例如:risk-extract', nameHelp: '只用于 Agent 调用,小写字母 / 数字 / 连字符', title2: '显示名', titlePlaceholder: '例如:合同风险点提取', description: '描述', descriptionPlaceholder: '一句话说明这个加工器是做什么的', prompt: '提示词模板', promptHelp: '可使用 {input_text} 和 {title} 占位符', saveBtn: '保存', cancelBtn: '取消', compareBtn: '对比所选', compareHint: '再选 1 条即可对比', compareCheckTip: '勾选 2 条已完成运行可并排对比', compareTitle: '运行结果对比', aggregateBtn: '聚合所有运行', aggregating: '聚合中…', aggregateDone: '聚合页已生成', aggregateFailed: '聚合失败', aggregateNoRuns: '当前模板还没有任何完成的运行可供聚合', runs: '运行历史', rerunBtn: '重新运行', rerunning: '重新运行中…', cancelRunBtn: '取消', cancelling: '取消中…', cancelDone: '已取消', cancelFailed: '取消失败', runOn: '运行于', runStatus: '状态', runDuration: '耗时', runOutput: '输出', runError: '错误', runApply: '运行', running: '运行中…', runFailed: '运行失败', pickRaw: '选择材料', pickRawHint: '从知识库的原始材料中选择一个作为输入', noRuns: '尚无运行记录。', }, hotCache: { tab: '近况快照', title: '近况快照(Hot Cache)', desc: '该知识库最近发生了什么的滚动 markdown 摘要,会被自动注入到 Agent 的系统提示,让对话不必每次都重新检索。事件触发后台异步重建,5 分钟去抖。', empty: '尚未生成快照——绑定的 Agent 完成一次对话后会自动构建。', contentEmpty: '(快照内容为空)', regenerate: '立即重建', regenerating: '重建中…', regenerateQueued: '已加入重建队列,几秒后刷新', regenerateFailed: '重建调度失败', reset: '清除快照', resetConfirm: '确认清除当前快照?下次 Agent 对话会重新生成。', resetDone: '已清除', resetFailed: '清除失败', lastUpdated: '上次更新', updateReason: '触发原因', rebuildCount: '累计重建次数', lastDuration: '上次耗时', lastError: '最近一次错误', footer: '关闭 wiki.hot_cache.enabled 后注入路径短路;该面板的"立即重建"会绕过去抖,方便调试。', }, searchPages: '搜索页面...', dropFiles: '拖拽文件到此处或点击上传', dropToUpload: '松开即开始上传', uploading: '上传中…', uploadFailed: '上传失败:{name}', addText: '添加文本', noRawMaterials: '暂无原始材料', reprocess: '重新处理', resume: '继续生成', cancel: '取消处理', cancelling: '正在取消…', cancelledHint: '用户已取消处理', download: '下载原始文件', downloadFailed: '下载失败', processAll: '处理所有待处理材料', materialTitle: '标题', materialContent: '内容', pasteContent: '粘贴或输入文本内容...', backlinks: '反向链接', generatedByAi: 'AI 生成', editedManually: '人工编辑', configTitle: '知识库处理规则', configDesc: '配置 AI 消化原始材料时遵循的规则', configPlaceholder: '在此编辑 Wiki 处理规则...', pageCount: '{count} 页', sourceCount: '{count} 份材料', dirPlaceholder: '输入本地目录路径,如 /Users/me/docs', scan: '扫描', scanning: '扫描中...', scanResult: '已扫描 {scanned} 个文件,新增 {added} 个,跳过 {skipped} 个', saving: '保存中...', status: { active: '启用', uploading: '上传中', processing: '处理中', error: '错误', pending: '待处理', completed: '已完成', partial: '部分完成', failed: '失败', cancelled: '已取消', cancelling: '正在取消…', }, progress: { preparing: '准备中…', uploading: '上传 {pct}%', }, jobStage: { queued: '排队中', routing: '选择模型', phase_a_running: '分析中', phase_a_done: '分析完成', phase_b_running: '生成页面', enriching: '补充链接', embedding: '向量化', completed: '已完成', failed: '处理失败', cancelled: '已取消', }, jobInfo: { currentModel: '当前模型', fallbackActive: '已启用备用模型', elapsedTime: '已用时', pagesProgress: '已生成 {done}/{total} 页', }, page: { type: { entity: '实体', concept: '概念', source: '来源', synthesis: '综合', }, enriched: '已链接', notEnriched: '未链接', enrich: '添加交叉链接', repair: '修复页面', citations: '来源 {count} 个 chunk', noCitations: '未找到来源引用', citationUnknownSource: '未知来源', citationChunkN: '第 {n} 段', citationChunkUnknown: '段落未知', citationOffset: '偏移 {start}–{end}', }, relation: { shared_chunk: '共享片段', shared_raw: '共享来源', direct_link: '直接引用', semantic_near: '语义相近', relatedPages: '相关页面', explainRelation: '查看关联原因', }, configPanel: { embeddingModel: '向量化模型', embeddingModelHint: '语义搜索模型,留空使用系统默认', ingestMode: '入库模式', ingestModeEager: '立即生成页面', ingestModeLazy: '先入索引', ingestModeEagerHint: '上传后立即调用 LLM 生成完整 Wiki 页面。', ingestModeLazyHint: '上传仅抽取、切片、向量化,跳过页面生成;上传即可搜索,页面按需编译。', modelStrategy: '模型策略', globalDefault: '跟随全局默认', selectModel: '选择可用模型…', otherProvider: '其他', searchModel: '搜索模型…', noModelMatch: '未找到匹配模型', addFallback: '+ 添加备选', stepModel: { route: '分析/路由', create_page: '页面生成', merge_page: '页面合并', enrich: '链接标注', summary: '摘要更新', }, fallbackModels: '备选模型', searchPreview: '检索测试', searchPreviewPlaceholder: '输入用户消息,预览 Agent 检索结果…', searchPreviewRun: '测试', }, stats: { enrichedRatio: '{enriched}/{total} 已链接', failedJobs: '{count} 个失败', }, noPages: '暂无页面', noResults: '未找到匹配页面', loadMore: '加载更多 {n} 条', filteredByRaw: '按原始材料过滤', clearFilter: '清除过滤', systemPageBadge: '系统页', systemPageHint: 'overview / log 是知识库自带的系统页,无法删除', lockedPageBadge: '已锁定', lockedPageHint: '该页被手动锁定,AI 工具与批量操作不会修改或删除', archivedSection: '已归档', noArchived: '没有已归档的页面', unarchive: '恢复', pageTypes: { concept: '概念', person: '人物', place: '地点', event: '事件', technology: '技术', organization: '组织', product: '产品', term: '术语', process: '流程', other: '其他', }, graph: { tab: '知识图谱', nodes: '节点', edges: '连接', orphans: '孤立节点', showOrphans: '显示孤立节点', allTypes: '全部类型', resetView: '重置视图', fullscreen: '全屏', exitFullscreen: '退出全屏', linksTo: '链接到', openPage: '打开页面', empty: '暂无图谱数据,请先处理原始材料', }, }, cronJobs: { kicker: '自动执行', title: '定时任务', desc: '定时触发 Agent 执行消息或目标任务', createJob: '新建任务', editJob: '编辑任务', noJobs: '暂无定时任务', createFirst: '新建第一个定时任务', columns: { name: '任务名称', agent: '关联 Agent', taskType: '类型', cron: 'Cron 表达式', timezone: '时区', nextRun: '下次执行', lastRun: '上次执行', enabled: '启用', actions: '操作', // RFC-063r §2.14: 列表页"最近投递"列 lastDelivery: '最近投递', // RFC-063r post-deploy: 关联渠道列 channel: '关联渠道', targetId: '投递目标', }, // RFC-063r §2.14: delivery_status 状态机展示 lastDelivery: { none: '无投递', pending: '投递中', delivered: '已送达', not_delivered: '投递失败', }, taskTypes: { text: '文字消息', reminder: '提醒', agent: 'Agent 目标' }, cronTypes: { hourly: '每小时', daily: '每天', weekly: '每周', custom: '自定义' }, days: { mon: '周一', tue: '周二', wed: '周三', thu: '周四', fri: '周五', sat: '周六', sun: '周日' }, fields: { name: '任务名称', namePlaceholder: '输入任务名称', agent: '关联 Agent', agentPlaceholder: '选择执行的 Agent', taskType: '任务类型', triggerMessage: '触发消息', triggerMessagePlaceholder: '输入发送给 Agent 的消息', reminderText: '提醒内容', reminderTextPlaceholder: '输入到点要原样推送的提醒内容(不会经过 LLM 改写)', requestBody: '执行目标', requestBodyPlaceholder: '直接描述 Agent 要完成的目标', cronFrequency: '执行频率', cronTime: '执行时间', cronDays: '执行星期', cronExpression: '自定义表达式', cronExpressionPlaceholder: '分 时 日 月 周,如: 0 9 * * 1-5', timezone: '时区', enabled: '立即启用', }, actions: { runNow: '立即执行', edit: '编辑', delete: '删除' }, messages: { createSuccess: '定时任务创建成功', updateSuccess: '定时任务更新成功', deleteSuccess: '定时任务删除成功', deleteConfirm: '确定删除任务「{name}」?删除后不可恢复。', runTriggered: '任务已触发,请到会话列表查看「cron_{id}」对应对话', enableSuccess: '任务已启用', disableSuccess: '任务已停用', invalidCron: 'Cron 表达式格式不正确,请使用 5 字段格式(分 时 日 月 周)', agentRequired: '请选择关联 Agent', textRequired: '触发消息不能为空', goalRequired: '执行目标不能为空', }, }, workflows: { kicker: '工作流', title: '工作流编辑器', desc: '编排多步骤工作流:边写边存草稿,编译查看诊断,准备好后发布版本。', newWorkflow: '+ 新建工作流', defined: '已定义 ({count})', refresh: '刷新', unnamed: '(未命名)', draftBadge: '草稿', publishedBadge: 'v{rev}', listEmpty: '还没有任何工作流,新建一个开始吧。', namePlaceholder: '工作流名称', descPlaceholder: '可选描述', actions: { saveMeta: '保存元数据', saveDraft: '保存草稿', compile: '编译', publish: '发布', delete: '删除', }, bodyPlaceholder: '{\'{"steps":[{"name":"step-a","agentId":1,"mode":{"type":"sequential"},"promptTemplate":"..."}]}\'}', compileErrorsTitle: '{count} 条编译错误', templates: { label: '插入模板', placeholder: '选择步骤模板', sequential: '顺序步骤', fan_out: '并行扇出', collect: '汇聚结果', conditional: '条件分支', await_approval: '等待审批', dispatch_channel: '消息分发', write_memory: '写入记忆', }, jsonInvalid: 'JSON 解析失败:{msg}', jsonOk: 'JSON 语法 OK。', tabs: { canvas: '画布视图', json: 'JSON 编辑', }, canvas: { empty: '当前草稿没有任何步骤,先在 JSON 编辑器中添加步骤或选择一个模板。', layoutLR: '横向布局', layoutTB: '纵向布局', stats: '{nodes} 节点 · {edges} 连线', parseError: 'JSON 解析失败:{msg}', fullscreenEnter: '全屏', fullscreenExit: '退出全屏', addNode: '+ 添加节点', modeLabel: '模式', nodeAgent: '数字员工', nodeExpression: '条件', nodeApprovalKind: '审批类型', nodeChannels: '渠道', nodeMergeStrategy: '合并策略', approvalDefault: '人工审批', channelsEmpty: '未指定', modeLabels: { sequential: '顺序', fan_out: '扇出', collect: '汇聚', conditional: '条件', await_approval: '等待审批', dispatch_channel: '分发渠道', write_memory: '写入记忆', }, inspector: { title: '步骤属性', empty: '点击画布上的节点查看详情。', rawHeader: '原始 JSON', shared: '通用字段', modeFields: '{mode} 字段', modeNoFields: '此模式没有额外字段。', duplicate: '复制此步骤', delete: '删除此步骤', }, fields: { name: '名称', namePlaceholder: 'step-name', agentPlaceholder: '选择数字员工', agentMissing: '当前数字员工不在列表中:{name}', promptTemplate: 'Prompt 模板', promptPlaceholder: 'Hello {{ inputs.payload }}', outputVar: '输出变量名', outputVarPlaceholder: 'data', outputContentType: '输出类型', approvalKind: '审批种类', approverChannels: '通知渠道(逗号分隔)', approvalMessage: '审批消息', timeoutSecs: '超时(秒)', channels: '分发渠道', channelsEmptyHint: '当前工作区没有可用渠道,请先在渠道管理中启用渠道。', channelsUnknown: '草稿里有不可用渠道:{channels}', dispatchTarget: '{channel} 目标', dispatchTargetPlaceholder: '群 ID / 用户 ID / 会话 ID', dispatchContent: '消息内容', employeeId: '员工 ID', memoryFile: '记忆文件', memoryContent: '内容模板', }, }, dialogs: { createTitle: '新建工作流', fieldName: '名称', namePlaceholder: '例如:employee-onboarding', fieldDescription: '描述', descriptionPlaceholder: '可选,用一两句话说明这条工作流要解决什么问题', createSubmit: '创建', publishTitle: '发布工作流', publishHint: '发布会编译当前草稿,固化为新的 revision;正在运行的实例不会回退。', publishNote: '发布备注', publishNotePlaceholder: '可选,简述这次变更的内容', deleteTitle: '删除工作流', deleteContent: '将删除工作流「{name}」?此操作可通过审计日志撤销。', }, selectHint: '在左侧选择一个工作流,或点击「新建工作流」开始。', generate: { entryButton: '从描述生成', title: '从自然语言生成工作流草稿', hint: '用一句话描述你的业务流程,AI 会生成 workflow JSON 草稿。生成后会保留为草稿,需要你确认后再发布;不会自动启用任何触发器。', placeholder: '例如:每周一早上 9 点让销售员工汇总上周数据,老板确认后发到飞书运营群', submit: '生成草稿', running: '生成中...', retry: '重试', accept: '采用并打开编辑器', compileOk: '编译预校验通过', compileFail: '编译预校验未通过 ({count})', compileChecking: '正在校验…', compileError: '编译错误', missing: '缺失', warning: '警告', previewDraft: '预览生成的 JSON', failed: '生成失败:{msg}', acceptedWithTriggers: '已生成草稿并创建 {count} 个触发器(默认未启用)', acceptedSomeTriggersFailed: '已生成草稿,{ok} 个触发器创建成功,{fail} 个失败', triggersTitle: '建议的触发器', triggersHint: '默认 enabled=false;可在 Triggers 页面随时启用或调整。', applyTemplate: '套用模板(直接生成,跳过 AI)', applyTemplatePlaceholder: '— 选择一个常用模板 —', }, paused: { header: '待恢复运行 ({count})', empty: '当前没有暂停中的运行。', pauseTokenLabel: 'pause token', deadlineLabel: '超时时间', pausedAtLabel: '暂停于', runHash: 'Run #{id}', resumeApproved: '通过', resumeRejected: '拒绝', resumeTimeout: '标记超时', resumeCancelled: '取消', resumeOk: '运行已恢复 ({outcome})。', resumeFailed: '恢复失败:{msg}', }, runs: { header: '近期运行 ({count})', empty: '暂无运行记录。', detailTitle: 'Run #{id} — {state}', runHash: 'run #{id}', }, prompts: { newName: '新工作流名称:', defaultName: 'untitled-workflow', publishNote: '可选发布备注:', deleteConfirm: '删除工作流「{name}」?此操作可通过审计日志撤销。', }, status: { metaSaved: '元数据已保存。', draftSaved: '草稿已保存。', compileOk: '编译通过。', published: '已发布。', deleted: '已删除。', createFailed: '创建失败:{msg}', saveFailed: '保存失败:{msg}', saveDraftFailed: '草稿保存失败:{msg}', deleteFailed: '删除失败:{msg}', compileFailed: '{count} 条编译错误,详见下方面板。', compileFallback: '编译/发布失败。', }, }, triggers: { kicker: '触发器', title: '工作流触发器', desc: '把 cron 调度和渠道事件接到已发布的工作流上。每次修改 cron 表达式都会让 pattern_version 自增,多节点部署据此协调。', newTrigger: '+ 新建触发器', columns: { name: '名称', pattern: '模式', target: '目标工作流', rate: '速率', fires: '触发次数', patternVersion: 'pattern_v', lastFired: '上次触发', state: '状态', actions: '操作', }, targetWorkflowSelect: '选择已发布的工作流', targetWorkflowEmpty: '尚无已发布的工作流。', lastDispatchedAt: '最近一次尝试', patternTypeLabels: { cron: '定时任务', channel_message: '渠道消息', content_match: '内容匹配', agent_lifecycle: '智能体生命周期', workflow_completion: '工作流完成', webhook: 'Webhook', }, patternHints: { cron: '示例:{"cron":"0 0 * * * *","timezone":"Asia/Shanghai"} —— 每次修改 cron 都会让 pattern_version 自增。', channel_message: '可填 channelType(如 feishu)、senderEquals 与 contentContains 进一步过滤。', webhook: '透传匹配,请确保 HTTP 入口已校验 webhook 密钥。', content_match: '需要 substring(不区分大小写)。空字符串将拒绝触发。', agent_lifecycle: '可选 agentId 和 phase(spawned / terminated / crashed)。', workflow_completion: '可选 sourceWorkflowId 和 stateFilter(completed / failed / any)。', }, pattern: { cronExpression: 'Cron 表达式', cronExpressionPlaceholder: '0 0 * * * *', cronExpressionHint: '5 字段(分 时 日 月 周)或 6 字段(含秒)。修改后 pattern_version 自增。', cronTimezone: '时区', cronTimezonePlaceholder: 'Asia/Shanghai', channelType: '渠道类型', channelTypeAny: '任意渠道', senderEquals: '发送者匹配', senderEqualsPlaceholder: '可选,发送者 ID', senderEqualsHint: '留空表示任意发送者;填写后只匹配该发送者的消息。', contentContains: '消息包含关键字', contentContainsPlaceholder: '可选关键字', contentContainsHint: '对消息正文做不区分大小写的子串匹配;留空表示不限。', substring: '子串匹配', substringPlaceholder: '订单 / order', substringHint: '不区分大小写。空字符串将拒绝触发(避免无意义广播)。', agentId: '智能体 ID', agentIdPlaceholder: '0 表示任意', agentIdHint: '留空或填 0 表示任意智能体。', phase: '生命周期阶段', phaseAny: '任意阶段', sourceWorkflowId: '上游工作流', sourceWorkflowAny: '任意上游', stateFilter: '完成状态', stateFilterAny: '任意状态', stateFilterHint: 'completed 等价于 succeeded;failed 仅匹配失败结束。', webhookHeader: 'Webhook 透传匹配', webhookBody: '此模式不在前端做过滤——请确保 HTTP 入口校验 webhook 密钥;通过校验的请求会全部进入触发器。', rawHeader: '原始 pattern_json(高级)', errCronRequired: 'Cron 表达式不能为空', errCronShape: 'Cron 表达式格式不正确(5 ~ 7 字段)', errSubstringRequired: '子串不能为空,否则触发器不会激活', }, unnamed: '(未命名)', rateUnit: '{count}/分钟', enabled: '已启用', disabled: '已停用', empty: '暂无触发器配置。', actions: { edit: '编辑', delete: '删除', cancel: '取消', save: '保存', close: '关闭', }, formTitleNew: '新建触发器', formTitleEdit: '编辑触发器', fields: { name: '名称', namePlaceholder: 'hourly-cleanup', patternType: '模式类型', patternJson: '模式 JSON', patternJsonPlaceholder: '{\'{"cron":"0 0 * * * *","timezone":"UTC"}\'}', targetType: '目标类型', targetId: '目标 ID', ratePerMin: '每分钟速率', dedupWindowSecs: '去重窗口(秒)', maxFires: '最大触发数(0 = 不限)', botSelfFilter: 'Bot 自循环过滤(推荐)', payloadTemplate: '载荷模板(Pebble)', payloadTemplatePlaceholder: '{\'{"who":"{{ event.who }}"}\'}', enabled: '启用', }, deleteConfirm: '删除触发器「{name}」?', saveFailed: '保存失败:{msg}', toggleFailed: '切换失败:{msg}', deleteFailed: '删除失败:{msg}', }, login: { kicker: 'AI Operating System', subtitle: '你的智能 AI 助手', heroTitle: '让 AI 不止会回答,而是真正进入持续工作的系统。', heroDesc: 'MateClaw 的重点不是把更多能力堆进聊天框,而是把上下文、知识、执行和记忆收拢成一个可靠的工作面。', pointContext: '上下文保持连续', pointKnowledge: '知识被组织起来', pointExecution: '能力真正能执行', cardTitle: '登录并进入工作面', cardDesc: '从这里进入你的 AI 工作系统。模型、知识、工作区和运行状态会在同一个界面里协同。 ', fields: { username: '用户名', password: '密码', }, placeholders: { username: '请输入用户名', password: '请输入密码', }, signIn: '登录', hint: '默认账号: admin / admin123', failed: '登录失败,请检查账号密码', }, enterprise: { eyebrow: '企业场景', title: '企业 AI 工作台', subtitle: '把 AI 判断、证据引用、审批责任一体化 —— 让 AI 进入企业流程,而不是又一个聊天框。', tabs: { overview: '总览', contract: '合同审查', account: '客户情报', approvals: '审批', audit: '审计', }, risk: { high: '高风险', medium: '中等', low: '低' }, status: { aiReviewed: 'AI 已审', pendingLegal: '法务待审', approved: '已批准', signal: '情报信号', }, overview: { metricPending: '待处理', metricHighRisk: '高风险', metricAccounts: '关注客户', metricCited: '引用覆盖', queueTitle: '工作队列', queueDesc: '今天需要法务、销售、合规处理的事项;每条都附带 AI 判断和证据出处', evidenceTitle: '近期证据', evidenceDesc: 'AI 判断引用的原文、Playbook 条款、历史先例', coverageNote: '本周 AI 判断的引用覆盖率', tagSource: '原文', tagPlaybook: 'Playbook', tagPrecedent: '先例', filterAll: '全部', filterHighRisk: '高风险', filterPending: '待法务', filterToday: '今天', pipelineTitle: '合同审查流水', pipelineDesc: '从上传到归档的标准流程,每一步都留痕', step1: '上传', step1Desc: '法务或销售拖拽合同 PDF', step2: '提取', step2Desc: 'OCR / 文本提取', step3: 'AI 审查', step3Desc: '条款级风险与 Playbook 偏离', step4: '法务复核', step4Desc: '人工最终把关', step5: '审批 / 归档', step5Desc: '审批链 + 审计留痕', }, contract: { listTitle: '合同列表', filterAll: '全部', filterHigh: '高风险', filterPending: '待审', clausesFound: '条款偏离', deviation: '偏离', suggestion: 'AI 建议改写', approvalChain: '审批链', btnApprove: '批准', btnReject: '驳回', btnRequestRevision: '要求修订', evidenceTitle: '证据', sourceContract: '原合同', playbookRule: 'Playbook 条款', precedents: '历史先例', confidence: '置信度', model: '模型', }, account: { listTitle: '客户列表', filterAll: '全部', filterHot: '高分', filterCooling: '降温', opportunityScore: '机会分', aum: '体量', keyPeople: '关键人', timelineTitle: '账户时间线', tlAll: '全部', tlPublic: '公开信号', tlMeeting: '会议', tlDoc: '内部资料', evidence: '证据', actionsTitle: '推荐动作', actionsSub: 'AI 根据时间线信号生成的下一步建议;按优先级排序', btnDoIt: '去执行', btnSnooze: '稍后', stage: { prospect: '潜在', qualified: '确认意向', proposal: '方案中', negotiation: '谈判中', won: '已成交', }, role: { decider: '决策者', influencer: '影响者', user: '使用者', procurement: '采购', }, eventKind: { news: '新闻', hiring: '招聘', funding: '融资', product: '产品', meeting: '会议', doc: '资料', competitor: '竞品', }, priority: { high: '高优', medium: '中优', low: '低优' }, }, approvals: { queueTitle: '我的审批队列', queueDesc: '需要你点头才能继续的事项 —— AI 判断已就绪,等你把关', filterMine: '我的', filterAll: '全部', filterHigh: '高风险', requester: '发起人', target: '对象', reason: '原因', evidence: '证据', btnApprove: '批准', btnReject: '驳回', btnDelegate: '转交', kind: { contract: '合同', tool: '工具', transformation: '加工器', access: '权限', }, slaTitle: 'SLA 监控', slaDesc: '审批响应时间与自动批准比例 —— 数据越细,越容易发现"卡审批"的瓶颈', slaAvg: '平均响应', slaWithin: '按时完成', slaOverdue: '逾期', slaAutoApproved: '已自动批准', slaAutoNote: '满足白名单规则', }, audit: { title: '审计追溯', desc: '每一次 AI 判断、人工操作、工具调用都有时间戳和证据。这是企业部署 AI 的最低门槛。', scopeAll: '全部事件', scopeContract: '合同相关', scopeAccount: '客户相关', scopeTool: 'AI / 工具', evidence: '关联证据', kind: { review: 'AI 审查', approve: '批准', reject: '驳回', tool: '工具调用', access: '权限', modify: '修改', agent: 'Agent 行为', }, }, }, channels: { title: '渠道管理', desc: '将数字员工连接到各消息平台和 API', newChannel: '新建渠道', addChannel: '添加渠道', status: { active: '已启用', inactive: '未启用', }, configure: '配置', enable: '启用', disable: '停用', empty: { title: '连接第一个渠道', desc: '把你的数字员工接入团队已经在用的 IM 工具——Slack、企业微信、Telegram 等。', cta: '连接一个渠道', }, stats: { active: '{n} 个运行中', reconnecting: '{n} 个重连中', errors: '{n} 个出错', disabled: '{n} 个已停用', }, cardDesc: { connectedAs: '已连接:{account}', connectedAsIn: '已连接:{account}({team})', // Per-type fallback used when the row has no user-provided description // and the adapter hasn't written identity_json yet. Keeps every card // visually populated instead of leaving a blank middle area. typeFallback: { web: '默认 Web 控制台渠道,通过浏览器 SSE 流式交互', dingtalk: '钉钉机器人渠道,通过 Outgoing Webhook / Stream 接收消息', wecom: '企业微信应用渠道,接收并回复成员消息', weixin: '微信公众号渠道,处理用户消息与事件回调', feishu: '飞书 / Lark 渠道,通过事件订阅接收消息', telegram: 'Telegram 机器人渠道,通过 long polling 接收', slack: 'Slack Bot 渠道,通过 Events API 接收', discord: 'Discord 机器人渠道,通过 Gateway 长连接', qq: 'QQ / QQ 频道机器人渠道', matrix: 'Matrix 房间渠道,通过 client-server API', qqbot: 'QQ 频道机器人渠道(官方 API)', yuanbao: '腾讯元宝渠道', }, empty: '点「配置」可补充该渠道的描述', }, catalog: { subtitle: '选一个服务接入,配置项稍后还能改。', groups: { im: 'IM 平台', enterprise: '企业平台', web: '网页与 API', }, descriptions: { telegram: '长轮询接入,无需公网 IP', discord: 'Gateway WebSocket,无需公网 IP', slack: 'Socket Mode 接入', qq: 'WebSocket 长连接,无需公网 IP', wecom: '企业微信智能机器人,扫码即用', weixin: '微信个人号(iLink Bot)', feishu: '飞书 / Lark 应用,扫码一键创建', dingtalk: '钉钉机器人,扫码一键创建', web: '默认浏览器渠道,始终可用', webchat: '可嵌入网页的聊天小组件', webhook: '通用 HTTP 接入端点', }, }, modal: { editTitle: '编辑渠道', newTitle: '新建渠道', }, fields: { name: '名称', type: '类型', description: '描述', bindAgent: '绑定员工', }, placeholders: { name: '渠道名称', description: '渠道用途说明', selectAgent: '选择员工...', }, types: { web: 'Web API', dingtalk: '钉钉', feishu: '飞书', telegram: 'Telegram', discord: 'Discord', wecom: '企业微信', weixin: '微信', qq: 'QQ', slack: 'Slack', webchat: '网页嵌入', webhook: 'Webhook', }, tabs: { form: '表单配置', json: '原始 JSON', }, webhook: { url: 'Webhook URL', copy: '复制', copied: '已复制', copyFailed: '复制失败,请手动复制', localhostWarn: '当前为本地开发环境,IM 平台无法回调 localhost。请使用 ngrok、frp 等内网穿透工具将本地服务暴露到公网后,将公网地址替换上方 URL 中的 host 部分。', }, weixin: { authHint: '点击下方按钮获取微信登录二维码,使用微信扫一扫确认后 Bot Token 将自动填入。需要 iLink Bot 内测资格。', qrcodeButton: '获取登录二维码', rescanButton: '重新扫码(将替换当前账号)', qrcodeLoading: '正在获取...', qrcodeFailed: '获取二维码失败,请检查网络连接', qrcodeExpired: '二维码已过期,请重新获取', scanHint: '请使用微信扫描二维码登录', polling: '等待扫码...', scanned: '已扫码,请在手机上确认', confirmed: '登录成功', expired: '二维码已过期', loginSuccess: '微信扫码登录成功,Token 已自动填入', replaceWarning: '重新扫码将替换当前绑定的微信账号。如需绑定额外的微信账号,请点击下方按钮添加新渠道。', addNewAccount: '绑定新微信账号(添加新渠道)', newAccountName: '微信', }, wecom: { authHint: '点击按钮后会弹出企业微信二维码窗口,使用企业微信扫码确认后 Bot ID 与 Secret 将自动填入。', authButton: '扫码授权企业微信机器人', authLoading: '正在加载...', authSuccess: '企业微信机器人授权成功', sdkFailed: '企业微信 SDK 加载失败,请检查网络连接', windowBlocked: '弹窗被浏览器拦截,请允许弹窗后重试', authCancelled: '授权已取消', authFailed: '授权失败', }, webHint: 'Web 渠道使用内置 SSE 通信,无需额外配置。', webchatHint: 'WebChat 用于把 MateClaw 聊天挂件嵌入外部网站。请配置 API Key、标题和主题色,然后在网站中引入 WebChat SDK。', webchatApiKeyGenerated: '保存后平台会自动生成 API Key。创建完成后返回此页面即可复制。', webchatApiKeyReadOnly: '该 API Key 由平台自动生成并托管,你只能复制,不能手动修改。', webhookHint: 'Webhook 渠道配置请在下方「原始 JSON」标签页中编辑。', jsonHint: '直接编辑渠道的完整 JSON 配置。切换到「表单配置」标签页时会自动同步。', advanced: '高级配置', accessControl: { title: '访问控制', dmPolicy: '私聊策略', dmPolicyTooltip: '控制是否允许用户与机器人私聊', groupPolicy: '群聊策略', groupPolicyTooltip: '控制是否在群聊中响应消息', policyOpen: '开放', policyClosed: '关闭', allowFrom: '允许的用户', allowFromTooltip: '逗号分隔的用户 ID 白名单,留空则允许所有人', allowFromPlaceholder: '逗号分隔用户 ID(留空 = 全部允许)', denyMessage: '拒绝提示', denyMessagePlaceholder: '抱歉,您没有使用权限', requireMention: "需要 {'@'}提及", requireMentionTooltip: "群聊中是否需要 {'@'}机器人才响应", }, messageFilter: { title: '消息过滤', filterThinking: '过滤思维链', filterThinkingTooltip: '发送给用户前过滤 标签内容', filterToolMessages: '过滤工具消息', filterToolMessagesTooltip: '过滤 tool_call / tool_result 和 ReAct Action/Observation 行', messageFormat: '消息格式', formatAuto: '自动', formatMarkdown: 'Markdown', formatText: '纯文本', formatHtml: 'HTML', }, feishuPermissions: { title: '所需飞书权限', goToPermissions: '前往权限管理 →', }, connection: { connected: '已连接', reconnecting: '重连中', error: '断开', disconnected: '未连接', outOfService: '未启动', retryCount: '重试 #{n}', errorLabel: '错误', }, messages: { loadFailed: '加载渠道列表失败', saveFailed: '保存渠道失败', saveSuccess: '渠道已保存', deleteFailed: '删除渠道失败', deleteConfirm: '确定要删除这个渠道吗?', deleteTitle: '确认删除', toggleFailed: '切换渠道状态失败', invalidJson: '配置 JSON 格式不正确', }, guide: { dingtalk: { step1: '在 钉钉开放平台 创建机器人,填入 AppKeyAppSecret', step2: 'Stream 模式(推荐):消息接收模式选「Stream 模式」,无需公网 IP 即可使用', step3: 'Webhook 模式:消息接收模式选「HTTP 模式」,将 Webhook URL 填入回调地址', }, feishu: { step1: '前往 飞书开放平台 创建企业自建应用', step2: '将应用的 App IDApp Secret 填入下方配置', webhookStep: '在飞书后台「事件订阅」中将请求地址设置为上方 Webhook URL,订阅 im.message.receive_v1 事件', websocketStep: '在飞书后台「事件订阅」中选择「长连接」订阅方式,订阅 im.message.receive_v1 事件(无需公网 IP)', permissionStep: '如需昵称显示,请在「权限管理」中申请 contact:user.base:readonly 权限', }, telegram: { step1: '在 Telegram 中搜索 {at}BotFather,发送 /newbot 创建 Bot', step2: '将 BotFather 返回的 Bot Token 填入下方配置', step3: 'Long-Polling 模式(推荐):启动后自动通过 getUpdates 轮询接收消息,无需公网 IP', step4: 'Webhook 模式:需要公网可访问的回调地址,切换接入模式后填入 Webhook URL', }, discord: { step1: '前往 Discord Developer Portal 创建 Application', step2: '在 Bot 页面创建 Bot 并复制 Bot Token 填入下方配置', step3: '在 Bot 页面开启 MESSAGE CONTENT Intent(Privileged Gateway Intents 区域)', step4: '在 OAuth2 → URL Generator 中勾选 bot scope 和 Send Messages / Read Message History 权限,生成邀请链接将 Bot 添加到目标服务器', step5: '启动后通过 Gateway WebSocket 自动接收消息,无需公网 IP 和回调 URL', }, wecom: { step1: '前往 企业微信管理后台,进入「应用管理 → 智能机器人」创建一个新的智能机器人', step2: '在机器人配置中选择「API 模式 → 配置长连接」', step3: '记录机器人的 Bot IDSecret,填入下方配置', step4: '启动渠道后即可在企业微信中扫码添加机器人对话,无需公网 IP 和回调 URL', }, weixin: { step1: '确保已获得微信 iLink Bot 内测资格(目前为受邀内测阶段)', step2: '点击下方「获取登录二维码」按钮,用微信扫码登录', step3: '扫码成功后系统自动获取 bot_token 并填入配置', step4: '启动渠道后通过 HTTP 长轮询自动接收消息,无需公网 IP 和回调 URL', }, qq: { step1: '前往 QQ 开放平台 创建机器人应用', step2: '在应用管理页面获取 AppIDAppSecret,填入下方配置', step3: "在「功能配置 → 消息订阅」中开启需要的消息类型(C2C 消息、群聊 {'@'}消息、频道消息等)", step4: '启动渠道后通过 WebSocket 长连接自动接收消息,无需公网 IP 和回调 URL', }, }, dingtalkRegister: { title: '一键创建钉钉机器人', hint: '点击按钮获取二维码,使用钉钉扫一扫并授权后,会自动在你的企业里创建机器人应用,Client ID / Client Secret 自动填入下方。', button: '扫码自动创建机器人', buttonLoading: '正在准备二维码…', qrcodeLoading: '正在生成二维码', scanHint: '请使用钉钉 App 扫描上方二维码并确认授权', confirmed: '机器人创建成功,Client ID 和 Secret 已自动填入', expired: '二维码已过期,请重新生成', denied: '授权被拒绝', startFailed: '获取二维码失败,请检查网络', }, feishuRegister: { title: '一键创建飞书应用', hint: '点击按钮获取二维码,使用飞书扫一扫并确认授权后,会自动在你的企业里创建自建应用,App ID / App Secret 自动填入下方。', button: '扫码自动创建应用', buttonLoading: '正在准备二维码…', qrcodeLoading: '正在生成二维码', scanHint: '请使用飞书 App 扫描上方二维码并确认授权', confirmed: '应用创建成功,App ID 和 Secret 已自动填入', expired: '二维码已过期,请重新生成', denied: '授权被拒绝', error: '注册过程出错,请稍后重试', startFailed: '获取二维码失败,请检查网络', }, feishu: { perm: { message: '获取与发送单聊、群组消息', messageReason: '基础:收发消息', receive: '接收消息事件', receiveReason: '基础:接收用户消息', resource: '获取消息中的资源文件', resourceReason: 'WebSocket 模式下获取消息内容', reactions: '管理消息表情回复', reactionsReason: '消息反应:添加 👍 表情', contact: '获取用户基本信息', contactReason: '昵称获取:显示用户真实姓名', media: '获取消息中的资源文件', mediaReason: '媒体下载:下载图片和文件', }, }, wizard: { step1: '配置', step2: '验证', step3: '就绪', configureSubtitle: '填入凭证以连接 {service}', howToGet: '如何获取凭证', saveAndTest: '保存并测试', back: '返回', continue: '继续', done: '完成', verifying: '正在与 {service} 通信…', verifySuccess: '连接成功', verifySuccessHeadline: '已连接 — {service} 接受了凭证', verifyFailed: '验证失败', verifySkipped: '无需在线验证', verifySkippedDetail: '该渠道类型没有需要验证的凭证,可以直接保存并启用。', durationMs: '({n} ms)', fixIt: '修复', retry: '重试', readyHeadline: '一切就绪', readySubtitle: '绑定一个员工,发条测试消息确认。', bindAgentLabel: '绑定员工', sendTest: '发送测试消息', sendTestHint: '打开 {service} 给机器人发条消息——回复应该几秒内到达。', saveFailed: '渠道保存失败', noVerifierHint: '{type} 暂未支持在线验证。保存会直接启动渠道,请关注卡片上的连接状态指示。', oauthScanHint: '扫码完成后会自动填充并验证凭证——你不需要手动复制任何东西。', identity: { accountId: '账号 ID', accountName: '账号', firstName: '名字', team: '团队', teamId: '团队 ID', botId: '机器人 ID', transport: '接入方式', region: '地区', tokenTtl: 'Token 有效期', baseUrl: '接口地址', isBot: '机器人账号', verified: '已认证', canJoinGroups: '可加入群聊', canReadAllGroupMessages: '可读全部群消息', }, }, }, skills: { title: '技能管理', desc: '管理 Agent 可用的工具和技能', newSkill: '新建技能', importSkill: '导入技能', browseTemplates: '浏览模板', refreshRuntime: '刷新运行时', refreshing: '刷新中...', refreshSuccess: '运行时技能已刷新', refreshFailed: '刷新运行时失败', tabs: { all: '全部', builtin: '内置', mcp: 'MCP', acp: 'ACP', dynamic: '动态', }, search: { placeholder: '搜索技能名称、描述或标签...', }, filter: { all: '全部状态', enabled: '已启用', disabled: '已禁用', scanFailed: '扫描失败', }, sort: { recommended: '推荐排序', name: '按名称', status: '按状态', source: '按来源', updated: '最近更新', }, security: { scanned: '已扫描', scanFailed: '扫描失败', notScanned: '未扫描', findingsTitle: '安全扫描失败', rescan: '重新扫描', rescanning: '扫描中...', rescanPassed: '重新扫描通过', rescanStillFailed: '重新扫描仍未通过,请查看详情', rescanFailed: '重新扫描失败', noPersistedFindings: '本次尚无持久化的扫描详情,点击"重新扫描"以重新生成。', fix: '修复建议', }, status: { ready: '就绪', setupNeeded: '需配置', blocked: '已拦截', unresolved: '未解析', disabled: '已禁用', checking: '检查中…', }, empty: '暂无技能', emptyDesc: '添加技能以增强 Agent 的能力', noDescription: '暂无描述', // Issue #83: shown on the padlock that replaces the toggle for MCP/ACP virtual skills. virtualReadonlyHint: 'MCP / ACP 衍生技能不能在此切换,请到 Settings ▸ 连接页面操作对应的服务', modal: { configureTitle: '配置技能', newTitle: '新建技能', newSimpleHint: '先建好骨架,下一步在详情面板里继续配置图标、正文和工具。', }, fields: { name: '名称', nameZh: '中文显示名', nameEn: '英文显示名', type: '类型', icon: '图标', version: '版本', author: '作者', tags: '标签', description: '描述', configJson: '配置 (JSON)', skillContent: '技能内容 (SKILL.md)', sourceCode: '源代码 / 脚本', }, placeholders: { name: '技能名称', nameZh: '可选 — 留空则显示原始 name', nameEn: 'Optional — leave blank to show the slug', icon: '🛠️ (emoji 或 URL)', version: '1.0.0', author: '作者名称', tags: 'tag1,tag2,tag3', description: '这个技能做什么?', configJson: '', sourceCode: '# Python 或脚本内容...', }, hints: { directorySkill: '— 目录技能:当目录不可用时用作备用', primaryContent: '— Agent 提示注入的主要内容', }, types: { builtin: '内置', mcp: 'MCP', acp: 'ACP', dynamic: '动态', }, source: { builtin: '内置', synthesized: 'AI 合成', local: '本地', }, usedByTitle: '已绑定此技能的 Agent 数量', lessonsCountTitle: '已记录的经验数 — 点击查看', actions: { configure: '配置', view: '查看', setUp: '配置就绪', delete: '删除', saveChanges: '保存更改', createSkill: '创建技能', edit: '编辑', save: '保存', cancel: '取消', }, preflight: { title: '装前检查', allMet: '所有依赖已满足', allMetDesc: '该 skill 已就绪,绑定到 agent 即可使用。', setupNeeded: '{count} 项依赖待处理', setupNeededDesc: '按下方提示安装所需依赖,安装完成后点重新检查。', requirements: '依赖项', features: '特性', installCommands: '安装命令', optional: '可选', noManifest: '该 skill 未提供 v3 manifest,状态回退到旧依赖检查模式。', recheck: '重新检查', loadFailed: '加载预检数据失败', }, detail: { title: '技能详情', overview: '概览', body: '正文', manifest: 'Manifest', tools: '工具', features: '特性', security: '安全', lessons: '经验', secrets: '密钥', memory: '记忆', scanStatus: '扫描状态', missingDeps: '缺失依赖', runtimeError: '运行时错误', path: '解析路径', synthesized: '来源', identitySection: '身份', manifestProjectedSection: '来自 SKILL.md', manifestProjectedHint: '这些字段是 SKILL.md frontmatter 的镜像 — 直接改 row 不持久(下次解析时被覆盖)。要改请编辑下方 SKILL.md 正文。', displayOverridesSection: '显示与标签', displayOverridesHint: '仅存于数据库,不会被解析器覆盖。', bodyHint: 'SKILL.md 正文 — 部署后注入到 LLM 的系统提示。', sourceCodeHint: '执行体(仅 dynamic 类型)。修改后下次调用立即生效。', viewRawManifest: '查看解析后的运行时 manifest', noBody: '尚未提供 SKILL.md 正文。', builtinReadonly: '内置技能:仅 nameZh / nameEn / 标签 / description / 正文可改。', virtualReadonly: 'MCP 派生的虚拟技能不可在此编辑,请去 MCP 连接页修改。', editSource: '编辑 SKILL.md', editingSource: '编辑 SKILL.md', sourceSavedReprojection: '已保存。下次解析将根据新 frontmatter 同步 icon/version/author 等字段。', noManifest: '该技能未声明 v3 manifest,使用旧字段。', noTools: '该 skill 未声明 allowed-tools。绑定到 agent 时 LLM 将回退到全局工具集。', noFeatures: '未声明 features[] 矩阵,技能被视为单一默认特性。', noLessons: '尚未记录任何经验。经验由 LLM 通过 record_lesson 工具写入 — 在对话中告诉 agent「请把这条经验记录到「{skill 名}」技能下」即可触发。', noEmployees: '该 skill 当前没有任何 Agent 可以使用。要么在 Agent 的 Skills tab 中显式绑定,要么把 skill 设为全局启用让无显式绑定的 Agent 自动可见。', toolsHint: 'Skill 绑定到 agent 时,这些工具名将合并进 LLM 的 allowed-tools。SETUP_NEEDED 特性下的工具保持隐藏。', lessonsHint: '该 skill 累积的经验(LESSONS.md)。下次加载时自动注入到 SKILL.md 正文之后,让 agent 越用越熟。', memoryHint: '可使用此 skill 的 Agents。显式绑定 = 在 Agent Skills tab 中明确选中;隐式可见 = 该 Agent 未做任何 Skill 显式绑定,自动可见所有全局启用的 skill。', openMemory: '查看 Agent 记忆', bindingExplicit: '显式绑定', bindingImplicit: '隐式可见', clearLessons: '全部清空', clearLessonsConfirm: '删除该 skill 的全部经验?操作不可撤销。', secretsHint: '这些键值会作为环境变量注入 skill 脚本子进程。明文加密落盘,从不通过接口回传。例如腾讯会议技能需要 TENCENT_MEETING_TOKEN。', secretsEmpty: '该 skill 还没有配置任何密钥。', secretKey: '键名', secretValue: '值', secretUpdatedAt: '最近更新', secretAdd: '+ 新增密钥', secretAddTitle: '新增密钥', secretEditTitle: '修改密钥', secretEdit: '修改', secretDelete: '删除', secretDialogHint: '保存后立即生效,下次执行 skill 脚本时注入到子进程环境。', secretKeyPlaceholder: '例如 TENCENT_MEETING_TOKEN', secretKeyRule: '允许字母、数字与下划线;首字符不能是数字;长度 ≤ 128。', secretValuePlaceholder: '粘贴值(提交后服务端 AES 加密保存)', secretSaveSuccess: '密钥已保存', secretSaveFailed: '保存失败', secretDeleteConfirm: '删除密钥 "{key}"?此 skill 后续脚本将不再收到此环境变量。', secretDeleteSuccess: '密钥已删除', secretDeleteFailed: '删除失败', secretLoadFailed: '加载密钥列表失败', }, runtime: { disabled: '已停用', unknown: '未知', securityBlocked: '安全阻止', depsMissing: '缺少依赖', directoryActive: '目录激活', databaseFallback: '数据库回退', databaseActive: '数据库激活', unresolved: '未解析', }, messages: { saveFailed: '保存技能失败', saveSuccess: '已保存', deleteConfirm: '确定要删除这个技能吗?此操作不可撤销。', deleteTitle: '确认删除', deleteFailed: '删除技能失败', toggleFailed: '切换技能状态失败', }, import: { title: '导入技能', urlTab: '从 URL 安装', searchTab: '搜索市场', urlPlaceholder: '输入 GitHub 仓库 URL 或 ClawHub 技能 URL', urlHint: '支持 GitHub 仓库和 ClawHub 市场链接', examples: '示例', install: '安装', installing: '安装中...', installed: '安装成功', failed: '安装失败', cancelled: '已取消', cancel: '取消', overwrite: '覆盖已有技能', enableAfterInstall: '安装后启用', searchPlaceholder: '搜索 ClawHub 市场...', search: '搜索', searching: '搜索中...', searchFailed: '搜索失败', noResults: '未找到匹配的技能', statusPending: '等待中', zipTab: 'ZIP 导入', dropHint: '拖拽 .zip 文件到此处,或点击选择', zipRequirement: 'ZIP 包需包含 SKILL.md 文件', uploading: '正在安装...', uploadSuccess: '技能安装成功', uploadFailed: '安装失败', invalidZip: '请选择 .zip 格式的文件', tooLarge: '文件过大(最大 50MB)', }, }, onboarding: { title: '欢迎使用 MateClaw', subtitle: '配置你的第一个 AI 模型', stepPath: '选择方式', stepConfigure: '配置模型', stepVerify: '验证', localTitle: '本地模型', localDesc: '已安装 Ollama?一键启用本地模型', localDetected: '已检测到', cloudTitle: '云端 API', cloudDesc: '使用 OpenAI、DashScope 等云端模型', selectModel: '选择模型', setDefault: '设为默认', enterApiKey: '输入 API Key', testConnection: '测试连接', testSuccess: '连接成功', testFailed: '连接失败', saveAndContinue: '保存并继续', verifyTitle: '验证你的模型', verifyMessage: '你好!简单介绍一下你自己。', send: '发送', startUsing: '开始使用 MateClaw', skip: '跳过', back: '返回', }, talk: { title: '语音模式', ready: '就绪', connecting: '连接中...', listening: '收听中...', processing: '思考中...', speaking: '回复中...', holdToTalk: '按住说话', releaseToSend: '松开发送', retry: '点击重新连接', you: '你', ai: 'AI', micError: '无法访问麦克风', connectionError: '连接错误,点击按钮重试', playbackError: '音频播放失败', tooShort: '录音过短,请按住按钮多说几秒', }, browser: { timeline: { title: '浏览器({count} 个操作)', }, actions: { start: '启动', stop: '停止', open: '打开', click: '点击', type: '输入', screenshot: '截图', }, }, dashboard: { title: '仪表盘', kicker: '运营脉搏', desc: '系统用量概览与运行状态', conversations: '对话数', messages: '消息数', tokens: 'Token 消耗', toolCalls: '工具调用', periodDesc: '从日、周、月三个维度观察系统运行状况。', runsDesc: '定时任务执行记录,包含耗时、消耗和结果。', trend: { title: '本周活跃度', subtitle: '你和 AI 的互动频率。', }, periodComparison: '周期对比', periods: { today: '今日', thisWeek: '本周', thisMonth: '本月', }, recentRuns: '最近定时任务执行', noRuns: '暂无执行记录', runColumns: { time: '时间', job: '任务', status: '状态', trigger: '触发方式', duration: '耗时', tokens: 'Token', }, }, memory: { kicker: '记忆', title: '记忆', desc: '你的智能体在想什么、记住了什么、遗忘了什么。', selectAgent: '选择智能体', selectAgentHint: '请先选择一个智能体查看其记忆', tabTimeline: '整理时间线', tabMemory: '长期记忆', tabFacts: '事实库', noReports: '暂无整理记录', modeFocused: '专题', modeNightly: '夜间', candidates: '条候选', loadMore: '加载更多', retry: '重试', memoryBrowser: { header: '概述', empty: '暂无记忆内容', userEdited: '用户编辑', files: { memory: '记忆', profile: '档案', soul: '灵魂', userFacts: '用户事实', references: '参考资料', }, }, time: { justNow: '刚刚', hoursAgo: '{n}小时前', daysAgo: '{n}天前', }, status: { success: '成功', failed: '失败', skipped: '跳过', running: '运行中', pending: '等待中', }, report: { mode: '模式', topic: '主题', status: '状态', time: '时间', candidates: '候选数', promoted: '已整合', rejected: '未采纳', trigger: '触发方式', reason: '整理理由', diff: '变更摘要', }, morningCard: { title: '昨夜 Dream 回顾', dismiss: '我知道了', promoted: '整合了 {count} 条记忆', }, hil: { confirm: '确认', edit: '编辑', cancel: '取消', save: '保存', editPlaceholder: '修改记忆内容...', confirmed: '已确认', saved: '已保存到 MEMORY.md', }, facts: { searchPlaceholder: '搜索事实…', empty: '暂无事实数据(需启用事实投影)', trust: '信任度', used: '使用 {n} 次', helpful: '有用', unhelpful: '没用', forget: '遗忘', forgotten: '已遗忘', resolved: '已解决', contradictions: '{count} 条矛盾待处理', resolve: { KEEP_A: '保留 A', KEEP_B: '保留 B', MERGE: '合并', IGNORE: '忽略', }, }, focused: { desc: '围绕一个主题让智能体重新整理记忆,优先提炼相关信息。', placeholder: '输入主题,如"项目架构"、"用户偏好"…', trigger: '开始整理', success: '整理完成,时间线已更新', skipped: '没有需要整合的内容', }, }, // Tool display labels consumed by useToolLabel() — keys must mirror en-US.ts exactly. // Unknown tools (MCP / custom skills) fall back to humanizeToolName() and are not listed here. toolLabels: { // Delegation delegateToAgent: '委派给智能体', delegateParallel: '并行委派', listAvailableAgents: '列出可用智能体', // Wiki wiki_search_pages: '搜索知识库', wiki_semantic_search: '语义检索知识库', wiki_read_page: '读取知识库页面', wiki_list_pages: '列出知识库页面', wiki_related_pages: '查找相关页面', wiki_trace_source: '溯源知识库', wiki_create_page: '创建知识库页面', wiki_delete_page: '删除知识库页面', wiki_enrich_page: '丰富知识库页面', wiki_explain_relation: '解释关联关系', // Web search search: '联网搜索', // Memory recall_structured: '检索记忆', remember_structured: '保存记忆', forget_structured: '清除记忆', fact_probe: '探查事实', fact_list_contradictions: '检查矛盾事实', session_search: '搜索会话', read_workspace_memory_file: '读取记忆文件', write_workspace_memory_file: '写入记忆文件', edit_workspace_memory_file: '编辑记忆文件', list_workspace_memory_files: '列出记忆文件', // Files & shell read_file: '读取文件', execute_shell_command: '执行命令', extract_document_text: '提取文档内容', extract_pdf_text: '提取 PDF 内容', extract_docx_text: '提取文档内容', detect_file_type: '识别文件类型', readMateClawDoc: '查阅系统文档', // Generative image_generate: '生成图片', video_generate: '生成视频', music_generate: '生成音乐', // Data query_datasource: '查询数据源', execute_sql: '执行 SQL', // Browser browser_use: '浏览器操作', // Cron create_cron_job: '创建定时任务', list_cron_jobs: '查看定时任务', toggle_cron_job: '启停定时任务', delete_cron_job: '删除定时任务', // Time getCurrentDateTime: '获取当前时间', getCurrentTime: '获取当前时间', getCurrentDate: '获取当前日期', // Skills skill_manage: '管理技能', runSkillScript: '运行技能', listSkillFiles: '列出技能文件', listAvailableSkills: '列出可用技能', readSkillFile: '读取技能文件', }, } as const