export default { app: { title: 'MateClaw - AI 助手', }, common: { save: '保存', cancel: '取消', reset: '重置', edit: '编辑', delete: '删除', create: '创建', update: '更新', loading: '加载中...', enabled: '启用', disabled: '停用', default: '默认', view: '查看', copy: '复制', copied: '已复制', confirm: '确认', close: '关闭', add: '添加', search: '搜索', clear: '清除', expandSidebar: '展开侧边栏', collapseSidebar: '折叠侧边栏', manageWorkspaces: '管理工作区', show: '显示', hide: '隐藏', on: '开启', off: '关闭', yes: '是', no: '否', configure: '配置', enable: '启用', disable: '停用', }, 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: '重新生成', ttsPlay: '朗读', ttsStop: '停止朗读', conversations: '会话列表', newChat: '新对话', loadingAgents: '加载 Agent 中...', selectAgent: '请选择 Agent', noConversations: '暂无会话', startNewChat: '开始新对话吧', messages: '{count} 条消息', configModel: '配置模型', clearMessages: '清空消息', goToModelSettings: '前往模型设置', configModelFirst: '请先配置模型', modelUnavailable: '当前模型不可用', noActiveModel: '当前没有激活模型。先到模型管理中选择一个可用模型,再开始对话。', providerNotReady: '当前激活模型属于 {name},但这个提供商还没配置完成。请到模型管理中补全 API Key 或 Base URL。', noAvailableModel: '当前没有可用模型。', loadAgentsFailed: '加载 Agent 列表失败', 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: '去配置', uploadFailed: '文件上传失败', dropToUpload: '拖放文件或文件夹到此处', copyFailed: '复制失败', dateToday: '今天', dateYesterday: '昨天', dateLast7Days: '近 7 天', dateEarlier: '更早', 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: '已完成', streamPreparingContextDetail: '正在收集当前问题、历史对话和必要配置。', streamReadingMemoryDetail: '正在查找与你当前问题最相关的长期记忆和今日记录。', streamReasoningDetail: '正在基于现有信息进行判断、比较方案并组织回答结构。', streamDraftingAnswerDetail: '已经完成主要分析,正在把结论写成可直接阅读的答案。', streamSummarizingObservationsDetail: '刚刚拿到了较多工具结果,正在提炼重点,避免回答冗长或遗漏关键信息。', streamThinkingDetail: '正在做内部推理,这一步未必会立即产生正文。', streamGeneratingDetail: '已经进入可见输出阶段,会陆续显示结果。', streamExecutingToolDetail: '正在读取文件、查询数据或执行必要操作,以便给出更准确的答案。', streamAwaitingApprovalDetail: '接下来需要你的确认,确认后我会继续执行。', streamFinalizingDetail: '正在保存结果并结束当前响应。', streamFailedDetail: '这次处理没有完整完成,但你可以继续追问或重试。', streamSlowShort: '这一步比平时慢一些,但系统仍在处理中。', streamSlowSummarizing: '正在整理较长的工具结果。因为信息较多,这一步可能需要更久。', streamSlowReasoning: '正在做较复杂的分析和取舍,不是卡住。', streamSlowGeneral: '处理还在继续,当前主要耗时在内部分析,不代表连接中断。', // 审批栏 approvalAllow: '允许', approvalExecute: '执行?', // 时间格式 timeJustNow: '刚刚', timeMinutesAgo: '{n} 分钟前', timeHoursAgo: '{n} 小时前', }, nav: { dashboard: '仪表盘', chat: '对话', control: '控制台', channels: '渠道', sessions: '会话', core: '核心', connect: '连接', system: '系统', agent: '智能体', workspace: '工作区', agentContext: '智能体上下文', skills: '技能', wiki: 'Wiki 知识库', tools: '工具', plugins: '插件', datasources: '数据源', mcpServers: 'MCP 服务', settingsGroup: '设置', agents: '智能体', security: '安全', tokenUsage: 'Token 统计', cronJobs: '定时任务', settings: '设置', logout: '退出登录', themeLight: '浅色', themeDark: '深色', memory: '记忆', themeSystem: '跟随系统', themeLabel: '外观', languageLabel: '语言', appearance: '外观与语言', roleUser: '用户', roleAdmin: '管理员', }, settings: { title: '设置', kicker: '配置中心', layoutDesc: '调整模型、系统行为与媒体能力,让整个产品在扩张时仍然保持一致。', sections: { model: '模型管理', system: '系统设置', image: '图片生成', tts: '语音合成', stt: '语音识别', music: '音乐生成', video: '视频生成', about: '关于', advanced: '高级', }, 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 等生成参数。', 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 连接', // 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 的本地凭据。', fields: { providerId: '提供商 ID', providerName: '提供商名称', defaultBaseUrl: '默认 Base URL', apiKeyPrefix: '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,需要在火山方舟平台创建接入点', 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: '提供商回退', // 音乐生成 musicEnabled: '启用音乐生成', musicProvider: '首选音乐提供商', musicFallbackEnabled: '提供商回退', // 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 流式),中文识别效果优秀,亚秒级延迟。', // 音乐生成 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+ 模型,支持歌词和纯音乐。', // 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: '与视频共用' }, 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: { title: '智能体管理', desc: '创建、编辑和管理你的 AI 智能体', newAgent: '新建智能体', templates: { title: '选择模板', desc: '选择预配置的 Agent 模板快速开始,或从空白创建。', skip: '从空白开始', applied: '已从模板创建 Agent', }, 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: '系统提示词', maxIterations: '最大迭代次数', defaultThinkingLevel: '默认思考深度', tags: '标签', enabled: '启用', }, thinkingLevels: { auto: '跟随模型', off: '关闭', low: '低', medium: '标准', high: '深度', max: '极限', }, types: { react: 'ReAct(工具调用)', planExecute: 'Plan-and-Execute', }, actions: { edit: '编辑', delete: '删除', create: '创建', update: '保存', }, placeholders: { name: '智能体名称', icon: 'Emoji 或 URL', description: '简短描述', systemPrompt: '你是一个有帮助的 AI 助手...', tags: 'tag1,tag2', }, messages: { noDescription: '暂无描述', deleteConfirm: '确认删除该智能体吗?删除后不可恢复。', loadFailed: '加载智能体列表失败', saveFailed: '保存智能体失败', saveSuccess: '智能体已保存', deleteFailed: '删除智能体失败', deleteSuccess: '智能体已删除', toggleFailed: '切换状态失败', toggleSuccess: '状态已更新', }, binding: { skillsHint: '选择此智能体可使用的技能。留空则使用所有已启用的技能。', toolsHint: '选择此智能体可使用的工具。留空则使用所有已启用的工具。', providersHint: '此智能体优先使用的提供商顺序(数字越小越先尝试)。留空则按全局可用池顺序回退。提供商进入冷却或被移出池时仍会被自动跳过。', providersAddHint: '点击下方提供商加入偏好列表:', noSkills: '暂无可用技能', noTools: '暂无可用工具', noProviderPreferences: '尚未配置偏好顺序,将按全局回退链顺序使用。', contextHint: '管理此智能体的上下文文件(如 AGENT.md),定义智能体的行为、知识和指令。', goToContext: '前往编辑上下文', }, }, security: { title: '安全管理', kicker: '治理中心', layoutDesc: '边界、审批、审计和工作区治理必须在这里说同一种语言,否则系统不值得被信任。', sections: { toolGuard: '工具防护', fileGuard: '文件防护', auditLogs: '审计日志', members: '成员管理', workspaces: '工作区', activity: '操作日志', }, activity: { title: '操作日志', desc: '查看工作区内所有资源的创建、修改、删除操作记录。', allActions: '全部操作', allResources: '全部资源', loading: '加载中...', noEvents: '暂无操作记录', columns: { time: '时间', 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: '优先级', }, }, 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 使用数据', }, 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: { title: '工具管理', desc: '管理 Agent 可用的工具', 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: '切换工具状态失败', }, }, 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: '连接失败,请检查配置', }, }, doctor: { title: '系统诊断', checking: '检查中...', allGood: '所有系统正常', hasWarnings: '{count} 个警告', hasErrors: '{count} 个问题', refresh: '重新检查', lastChecked: '{time} 前检查', diagnose: '诊断问题', }, wiki: { kicker: '知识引擎', desc: 'AI 驱动的结构化知识库,自动消化原始材料为 Wiki 页面', createKB: '新建知识库', knowledgeBases: '知识库', noKB: '暂无知识库', selectKB: '请选择一个知识库', selectPage: '从左侧选择一个页面查看', pageKicker: '知识页面', confirmDelete: '确认删除页面「{title}」?此操作不可撤销。', confirmBatchDelete: '确认删除 {count} 个页面?此操作不可撤销。', batchSelect: '批量选择', selectAll: '全选', kbName: '名称', kbNamePlaceholder: '输入知识库名称', kbDescription: '描述', kbDescPlaceholder: '简要描述知识库用途', rawMaterials: '原始材料', pages: 'Wiki 页面', config: '处理配置', searchPages: '搜索页面...', dropFiles: '拖拽文件到此处或点击上传', dropToUpload: '松开即开始上传', uploading: '上传中…', uploadFailed: '上传失败:{name}', addText: '添加文本', noRawMaterials: '暂无原始材料', reprocess: '重新处理', resume: '继续生成', 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: '失败', }, 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: '文字消息', 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 的消息', 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: '执行目标不能为空', }, }, 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: '登录失败,请检查账号密码', }, channels: { title: '渠道管理', desc: '将 Agent 连接到各消息平台和 API', newChannel: '新建渠道', addChannel: '添加渠道', status: { active: '已启用', inactive: '未启用', }, configure: '配置', enable: '启用', disable: '停用', modal: { editTitle: '编辑渠道', newTitle: '新建渠道', }, fields: { name: '名称', type: '类型', description: '描述', bindAgent: '绑定 Agent', }, placeholders: { name: '渠道名称', description: '渠道用途说明', selectAgent: '选择 Agent...', }, 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: '媒体下载:下载图片和文件', }, }, }, skills: { title: '技能管理', desc: '管理 Agent 可用的工具和技能', newSkill: '新建技能', importSkill: '导入技能', refreshRuntime: '刷新运行时', refreshing: '刷新中...', refreshSuccess: '运行时技能已刷新', refreshFailed: '刷新运行时失败', tabs: { all: '全部', builtin: '内置', mcp: 'MCP', dynamic: '动态', }, search: { placeholder: '搜索技能名称、描述或标签...', }, filter: { all: '全部状态', enabled: '已启用', disabled: '已禁用', scanFailed: '扫描失败', }, security: { scanned: '已扫描', scanFailed: '扫描失败', findingsTitle: '安全扫描失败', rescan: '重新扫描', rescanning: '扫描中...', rescanPassed: '重新扫描通过', rescanStillFailed: '重新扫描仍未通过,请查看详情', rescanFailed: '重新扫描失败', noPersistedFindings: '本次尚无持久化的扫描详情,点击"重新扫描"以重新生成。', fix: '修复建议', }, empty: '暂无技能', emptyDesc: '添加技能以增强 Agent 的能力', noDescription: '暂无描述', modal: { configureTitle: '配置技能', newTitle: '新建技能', }, 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', dynamic: '动态', }, actions: { configure: '配置', delete: '删除', saveChanges: '保存更改', createSkill: '创建技能', }, runtime: { disabled: '已停用', unknown: '未知', securityBlocked: '安全阻止', depsMissing: '缺少依赖', directoryActive: '目录激活', databaseFallback: '数据库回退', databaseActive: '数据库激活', unresolved: '未解析', }, messages: { saveFailed: '保存技能失败', 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_related: '查询关联事实', 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