export default {
app: {
title: 'MateClaw - AI 助手',
},
common: {
save: '保存',
saving: '保存中...',
saved: '已保存',
cancel: '取消',
reset: '重置',
edit: '编辑',
delete: '删除',
create: '创建',
update: '更新',
loading: '加载中...',
processing: '处理中...',
success: '操作成功',
revoked: '已撤销',
enabled: '启用',
disabled: '停用',
default: '默认',
view: '查看',
copy: '复制',
copied: '已复制',
copyFailed: '复制失败',
confirm: '确认',
close: '关闭',
add: '添加',
search: '搜索',
noResults: '没有匹配项',
noOptions: '暂无可选项',
none: '不指定',
clear: '清除',
expandSidebar: '展开侧边栏',
collapseSidebar: '折叠侧边栏',
manageWorkspaces: '管理工作区',
show: '显示',
hide: '隐藏',
on: '开启',
off: '关闭',
yes: '是',
no: '否',
configure: '配置',
enable: '启用',
disable: '停用',
refresh: '刷新',
collapse: '收起',
more: '更多',
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: '已中断',
subagentStalled: '子 Agent 无进展',
subagentAsync: '后台运行中,结果稍后获取',
executionPlan: '执行计划',
planDone: '已完成',
detail: {
viewDetail: '查看详情',
request: '请求参数',
response: '响应输出',
copy: '复制',
copied: '已复制',
copyFailed: '复制失败',
empty: '无内容',
status: {
running: '进行中',
completed: '已完成',
error: '失败',
pending: '待处理',
},
},
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: '已复制',
downloadStarted: '开始下载:{name}',
downloadExpired: '文件已失效或过期,请重新让助手生成后再下载',
downloadFailed: '下载失败:{reason}',
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: '配置模型',
modelSaveFailed: '模型切换未保存,下条消息可能仍走原模型',
openSessions: '会话管理',
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: '有新内容',
filterByAgent: '按员工筛选',
allAgents: '全部员工',
pin: '置顶',
unpin: '取消置顶',
rename: '重命名',
pinFailed: '置顶操作失败',
selectMode: '多选',
exitSelectMode: '退出多选',
selectAll: '全选',
deselectAll: '取消全选',
selectedCount: '已选 {count} 项',
batchDelete: '删除选中',
batchDeleteConfirm: '确定删除选中的 {count} 个会话?此操作不可恢复。',
batchDeleteFailed: '批量删除失败',
cronRunning: {
executing: '执行中…',
fallbackName: '定时任务',
},
suggestionIntro: '记住我每周一上午十点开周会,提前 10 分钟把议题草稿整理好发我',
suggestionPoem: '把这份需求文档录入我的知识库,下次相关问题先查它再决定要不要联网',
suggestionCode: '帮我把这次上线流程拆成可执行步骤,关键节点暂停等我审批',
suggestionWeather: '你现在挂载了哪些技能、工具和 MCP 服务?怎么给你新增一个?',
suggestionPlan1: '把一个完整发布计划拆成步骤,并在关键节点设置审批门禁',
suggestionPlan2: '把这个复杂任务拆成可追踪的子任务,逐步推进并随时汇报进度',
approvalRequired: '需要审批',
approve: '批准',
deny: '拒绝',
approveAlways: '始终批准',
approveAlwaysConversation: '此次会话',
approveAlwaysAgent: '此 agent',
approveAlwaysUser: '我所有 agent',
approveAlwaysCreated: '已添加自动批准规则:{tool}',
approvalHint: '或输入 /approve / /deny',
approved: '✅ 已允许',
denied: '⛔ 已拒绝',
approvalWaiting: '等待输入框确认...',
pendingApprovalPlaceholder: '输入 /approve 或 /deny 来回复...',
messagePlaceholder: '输入消息... (Enter 发送, Shift+Enter 换行)',
thinkingOn: '深度思考已开启',
thinkingOff: '点击开启深度思考',
thinkingUnsupported: '当前模型不支持深度思考',
slashMenuTitle: '技能',
slashMenuHint: '↑↓ 选择 · Enter 确认 · Esc 关闭',
slashMenuLoading: '加载技能中…',
slashMenuEmpty: '没有匹配的技能',
slashMenuSearchPlaceholder: '搜索技能…',
useSkillDirective: '使用「{name}」技能:',
subtitle: '记忆 · 知识库 · 技能 · 自动化 —— 你的个人 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)',
supersededPreviewCollapsed: '过程预演已被实际工具结果替换',
expand: '展开',
// 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: '知识库',
enterprise: '企业场景',
tools: '工具',
plugins: '插件',
datasources: '数据源',
mcpServers: 'MCP 连接',
mcpConnections: 'MCP 连接',
toolsCatalog: '工具目录',
activity: '活动记录',
acpEndpoints: 'ACP 端点',
settingsGroup: '设置',
agents: '员工',
security: '安全',
tokenUsage: 'Token 统计',
cronJobs: '定时任务',
scheduler: '调度中心',
workflows: '工作流',
triggers: '触发器',
settings: '设置',
logout: '退出登录',
themeLight: '浅色',
themeDark: '深色',
memory: '记忆',
themeSystem: '跟随系统',
themeLabel: '外观',
languageLabel: '语言',
appearance: '外观与语言',
roleUser: '用户',
roleAdmin: '管理员',
shortcutAgents: '员工',
shortcutNew: '新建',
shortcutsHint: 'Ctrl+K {agents} | Ctrl+N {newAction}',
},
// 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 生成',
workspace: '工作空间',
featureFlags: '功能开关',
about: '关于',
advanced: '高级',
skillCurator: '技能管家',
proxy: '网络代理',
},
models: {
sidecar: {
title: '多模态旁路',
hint: '当主模型不支持图片/视频时,自动用下面配置的模型先把附件转成文字,再交给主模型回答。',
notConfigured: '未配置(不路由附件)',
idle: '未启用',
reserved: '预留',
capable: '视觉',
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: '新增模型',
embedding: {
title: 'Embedding 模型',
hint: '知识库语义检索使用,与 Chat 模型共享 Provider 的 API Key',
loading: '加载中...',
empty: '暂无 Embedding 模型,使用下方表单添加。',
defaultBadge: '默认',
builtinBadge: '内置',
test: '测试连通性',
testing: '测试中...',
testPassed: '测试通过 · 维度 {dim}',
setDefault: '设为系统默认',
delete: '删除',
deleteConfirm: '确认删除 Embedding 模型“{name}”?',
deleteFailed: '删除失败',
deleted: 'Embedding 模型已删除',
addTitle: '新增 Embedding 模型',
addHint: '选择一个已配置的提供商,填入它支持的 Embedding 模型名称(如 text-embedding-3-small、bge-m3)。',
provider: '提供商',
selectProvider: '请选择提供商',
modelName: '模型名称',
modelNamePlaceholder: '例如 text-embedding-3-small',
displayName: '显示名称',
displayNamePlaceholder: '留空则使用模型名称',
add: '添加',
adding: '添加中...',
added: 'Embedding 模型已添加',
addFailed: '添加失败',
nameRequired: '请选择提供商并填写模型名称',
noProviders: '请先在上方启用并配置至少一个提供商。',
},
// 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: '复用模型管理中的 Gemini API Key。Nano Banana Pro(Gemini 3 Pro Image)原生图片生成,支持文生图与图片编辑。',
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 凭证',
proxyTitle: '网络代理',
proxyDesc: '为所有出站请求(LLM API、网页搜索、频道桥接等)配置全局 HTTP / SOCKS 代理。适用于无法直连海外 API、或要求统一出口的网络环境。',
proxy: {
enableLabel: '启用代理',
enableHint: '全局开关。开启后,下方各类出站连接统一走代理。',
urlLabel: '代理地址',
urlHint: '支持 HTTP、HTTPS 和 SOCKS5 协议(如 http://127.0.0.1:7890、socks5://127.0.0.1:1080)。可选用户名 / 密码:http://user:pass@host:port。',
bypassLabel: '绕过列表',
bypassHint: '这些主机不走代理,用 | 分隔,支持 * 通配(如 localhost|127.*|*.local)。留空使用默认值,自动放行本机与内网地址。',
socksWarn: '注意:SOCKS 代理仅对搜索 / 媒体等基于 HttpURLConnection 的出站生效;LLM 与流式聊天走 java.net.http,不支持 SOCKS,会直连。请为 LLM 使用代理工具的 HTTP / 混合端口。',
coverageTitle: '启用后将统一纳入代理的出站:',
coverage: {
llm: 'LLM API',
search: '网页搜索',
media: '图片 / 视频 / 音乐',
channels: 'IM 频道桥接',
mcp: 'MCP 远程连接',
browser: '浏览器工具',
},
test: '测试连接',
testing: '测试中…',
testOk: '代理端口可达 · {ms} ms',
testFail: '连接失败',
saveFail: '保存失败',
},
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: '加载文件内容失败',
exportSnapshot: '导出快照',
exportSnapshotTitle: '导出记忆快照',
exportSnapshotDesc: '把当前智能体的 AGENTS / MEMORY / PROFILE / SOUL / KNOWLEDGE.md 以及 memory/ 下的每日日记打包成 ZIP,按当前时间命名下载。enabled / sortOrder 不会导出。',
exportSuccess: '快照已导出',
exportFailed: '导出失败',
importSnapshot: '导入快照',
importSnapshotTitle: '导入记忆快照',
importSelectPrompt: '请选择 ZIP 格式的记忆快照',
importPreviewing: '正在解析快照...',
importPreviewFailed: '解析快照失败',
importApplying: '正在应用...',
importApplied: '已应用 {applied} 个,跳过 {skipped} 个',
importFailed: '导入失败',
importPreviewWillCreate: '将创建',
importPreviewWillUpdate: '将覆盖',
importPreviewWillSkip: '跳过',
importPreviewEmpty: '没有可导入的文件',
importPreviewCreateNone: '无',
importPreviewUpdateMeta: '{old} 字节 → {new} 字节',
importPreviewSkipReason: '原因:{reason}',
importConfirmHint: '确认导入会覆盖现有同名文件。',
importApply: '确认导入',
},
agents: {
kicker: '员工工作室',
title: '员工',
desc: '招募、培训和管理你的员工',
newAgent: '新员工',
views: {
roster: '花名册',
live: '现场',
},
templates: {
title: '选择岗位',
desc: '从一份岗位说明书快速招聘,或从空白开始。',
skip: '从空白开始',
applied: '员工已上岗',
},
search: '搜索员工...',
tabs: {
all: '全部',
react: 'ReAct',
planExecute: 'Plan-Execute',
enabled: '已启用',
disabled: '已停用',
basic: '基本信息',
skills: '技能',
tools: '工具',
providers: '偏好提供商',
wiki: '知识库',
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: '用户看不见,但每一次对话都能感觉到。写他的经验、信念、做事原则。',
advanced: '高级',
extraInstructions: '补充指令',
extraInstructionsHint: '可选。用于细化输出格式、流程清单或边界规则。',
maxIterations: '最大迭代次数',
defaultThinkingLevel: '默认思考深度',
workspaceBasePath: '工作目录',
workspaceBasePathHint: '可选。为该员工指定独立的工作目录:相对路径会基于工作区根目录解析,也可填写绝对路径。留空则继承工作区默认目录。',
modelName: '模型',
modelGlobalDefault: '使用全局默认模型',
modelHint: '为该员工单独指定模型,留空则跟随「设置 → 模型」中的全局默认。',
tags: '标签',
tagsHint: '输入后按回车、空格或逗号添加;点芯片上的 × 删除。',
tagUndo: '撤销',
enabled: '启用',
},
guide: {
summary: '行为指南(AGENTS.md)',
open: '管理行为指南',
desc: '这里是该员工的行为手册(AGENTS.md):规定何时写记忆、各文件放什么、可用的记忆工具。上方的岗位/目标/背景是员工的出厂身份;PROFILE/MEMORY 等可演化的记忆在「记忆」菜单管理。',
empty: '该员工还没有行为指南(AGENTS.md)。',
create: '创建行为指南',
saved: '已保存',
addSection: '新增小节',
addSectionPlaceholder: '小节标题',
scaffold: '## 何时写记忆\n\n(说明这个员工在什么情况下应当记录到 MEMORY.md / PROFILE.md。)\n\n## 文件职责\n\n(说明 SOUL.md / PROFILE.md / MEMORY.md 各自该放什么内容。)\n',
},
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: '回车、空格或逗号添加',
workspaceBasePath: '例如:projects/code-review',
},
messages: {
noDescription: '暂无描述',
noTagline: '还没填岗位与目标',
deleteConfirm: '确认让该员工离职吗?删除后不可恢复。',
loadFailed: '加载员工列表失败',
saveFailed: '保存员工失败',
saveSuccess: '员工已保存',
deleteFailed: '删除员工失败',
tagRemoved: '已移除标签「{tag}」',
deleteSuccess: '员工已离职',
toggleFailed: '切换状态失败',
toggleSuccess: '状态已更新',
},
tagFilter: {
label: '标签',
clear: '清除',
search: '搜索标签',
noMatch: '无匹配标签',
},
binding: {
skillsKicker: '受过培训的工作流程',
skillsTagline: '技能 = 一段流程,一份工作手册。LLM 按手册执行一系列连贯动作。',
skillsHint: '选择此智能体可使用的技能。留空则使用所有已启用的技能。',
disableAllSkills: '此智能体不使用任何技能',
disableAllSkillsHint: '开启后保存会清空该智能体的技能绑定,并标记为「显式无技能」:LLM 不再加载任何 SKILL.md 目录,技能扩展的工具也不会进入上下文。系统级内核工具(记忆、委派等)不受影响。关闭后,未勾选任何技能仍按「继承全局默认」处理。',
disableAllSkillsBadge: '已禁用',
toolsKicker: '会用的原子工具',
toolsTagline: '工具 = 一次调用,做一件事。由 LLM 自主决定何时调用。',
toolsHint: '选择此智能体可使用的工具。留空则使用所有已启用的工具。',
disableAllTools: '此智能体不使用任何用户可选工具',
disableAllToolsHint: '开启后保存会清空该智能体的工具绑定,并标记为「显式无工具」:用户可选工具与已启用的 MCP 工具都不会进入 allowlist。系统级内核工具(结构化记忆、工作区记忆文件、委派等)仍保留以保证基本运行。关闭后,未勾选任何工具仍按「继承全局默认」处理。',
disableAllToolsBadge: '已禁用',
searchSkills: '搜索技能名称、描述或版本',
searchTools: '搜索工具名称、描述、来源或分组',
advancedToolsTitle: '高级:手选原子工具',
advancedToolsHint: 'Skill 绑定已自动展开 allowed-tools。此处用于直选未打包成 Skill 的内置微工具(如 datetime、delegate_agent),也可勾选具体 MCP 工具来限定该 Agent 的 MCP 使用范围。',
toolUnionHint: '直选工具会与已绑定技能提供的工具合并生效。若在此勾选了具体的 MCP 工具,则该 Agent 仅能调用所勾选的 MCP 工具;若一个 MCP 工具都未勾选,则系统层已启用的 MCP 工具默认全部可用。需要在未勾选场景下禁用某个 MCP 工具,请到「安全 → 工具防护」配置黑名单。',
mcpAutoIncludedBadge: '默认可用',
mcpAutoIncludedTooltip: '当前未勾选任何 MCP 工具,系统层已启用的 MCP 工具默认全部对该 Agent 可用。勾选具体 MCP 工具后将切换为「仅勾选项可用」。如需在此状态下禁用某个 MCP 工具,请在「安全 → 工具防护」配置。',
mcpScopedBadge: '已限定范围',
mcpScopedTooltip: '已勾选具体 MCP 工具,该 Agent 仅能调用所勾选的 MCP 工具,未勾选的 MCP 工具不可用。',
toolStaleBadge: '离线缓存',
toolStaleTooltip: '该 MCP 服务当前未连接,工具列表来自上次连接时的快照;连接恢复前 LLM 不会调用这个工具。',
toolUnavailableBadge: '不可用',
toolUnavailableTooltip: '此工具的命名与同服务下的另一个工具冲突,无法绑定({reason})。请在上游 MCP 服务中重命名后重试。',
toolOrphanGroup: '已绑定但当前不可用',
toolOrphanDescription: '此工具在以前绑定过,但已不在当前可用工具列表中(如所属 MCP 服务被删除或工具被上游下线)。取消勾选并保存可清理掉这条遗留绑定。',
providersHint: '此智能体优先使用的提供商顺序(数字越小越先尝试)。留空则按全局可用池顺序回退。提供商进入冷却或被移出池时仍会被自动跳过。',
providersAddHint: '点击下方提供商加入偏好列表:',
noSkills: '暂无可用技能',
noTools: '暂无可用工具',
noMatchingSkills: '没有匹配的技能',
noMatchingTools: '没有匹配的工具',
noProviderPreferences: '尚未配置偏好顺序,将按全局回退链顺序使用。',
wikiKicker: '知识库访问范围',
wikiTagline: '限定此智能体可访问的知识库,防止它读取与业务无关的内容。',
wikiHint: '勾选此智能体允许访问的知识库;可将其中一个设为默认(未指定 kbId/kbName 时优先使用)。',
wikiScopeAll: '未勾选任何知识库:此智能体可访问当前工作区内的全部知识库。',
wikiScopeLimited: '此智能体仅能访问已勾选的 {count} 个知识库。',
wikiSetPrimary: '设为默认',
wikiPrimary: '默认',
noKBs: '暂无可用知识库',
noKB: '未指定主库',
wikiPages: '{count} 页',
wikiLoadFailed: '加载知识库列表失败',
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: '保存规则失败',
},
exportBtn: '导出 JSON',
importBtn: '导入 JSON',
exportFileName: 'mateclaw-guard-rules-{date}.json',
importPromptHint: '上传通过"导出"产生的 JSON 文件;内置规则只会同步策略字段。',
importSummary: '导入完成:新增 {inserted},更新内置 {updatedBuiltin},更新自定义 {updatedCustom},跳过 {skipped}',
importFailed: '导入失败:{msg}',
builtinLockedHint: '内置规则的名称、模式与分类由系统管理,此处仅可调整严重度、决策、优先级、白名单与启用状态。',
},
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 连接',
subtitle: '把 Agent 连到外部数据源和工具',
desc: '管理 MCP (Model Context Protocol) 服务器连接',
addServer: '添加连接',
addCustom: '自定义 MCP',
refreshAll: '全量刷新',
searchPlaceholder: '搜索 MCP 服务…',
emptyMatch: '没有匹配的 MCP 服务',
catalogBadge: '来自 Catalog · {name}',
credentialHint: '请替换占位符 {keys} 再保存',
credentialHintRequired: '必填凭据:{keys}(请替换占位符再保存)',
credentialHintOptional: '可选凭据:{keys}(如需调用相关 API 请填写)',
credentialHintBoth: '必填:{required} · 可选:{optional}',
sections: {
added: '已添加',
recommended: '推荐',
countItems: '{n} 个',
},
card: {
docs: '查看文档',
add: '安装',
toolCount: '{n} 个工具',
},
toggle: {
enable: '启用',
disable: '停用',
},
tier: {
core: '核心',
extension: '扩展',
coreHint: '当前为核心:该 server 的工具直接进入模型可调用列表。点击改为扩展。',
extensionHint: '当前为扩展:该 server 的工具进入工具盒,模型调用 enable_tool 后激活。点击改为核心。',
},
kv: {
envKey: 'KEY',
envValue: '值',
headerKey: 'Header',
headerValue: '值',
addEnv: '添加环境变量',
addHeader: '添加 Header',
required: '必填',
optional: '可选',
},
time: {
justNow: '刚刚',
minutesAgo: '{n} 分钟前',
hoursAgo: '{n} 小时前',
},
columns: {
name: '名称',
transport: '协议',
enabled: '状态',
lastStatus: '连接状态',
lastConnectedTime: '最后连接',
toolCount: '工具数',
description: '描述',
actions: '操作',
},
status: {
connected: '已连接',
disconnected: '未连接',
error: '连接失败',
connecting: '连接中…',
},
transport: {
stdio: 'Stdio',
sse: 'SSE',
streamable_http: 'HTTP',
},
modal: {
newTitle: '添加 MCP 连接',
editTitle: '编辑 MCP 连接',
},
fields: {
name: '名称',
description: '描述',
transport: '传输协议',
url: 'URL',
headers: 'HTTP Headers',
command: '命令',
args: '参数 (JSON 数组)',
env: '环境变量',
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: '全量刷新完成',
connecting: '正在后台连接,状态会自动更新',
saveFailed: '保存失败',
tierFailed: '调整披露分级失败',
empty: '暂无 MCP 连接',
emptyDesc: '添加一个 MCP 连接来扩展 Agent 的能力',
},
},
sessions: {
title: '会话管理',
desc: '查看和管理所有会话',
back: '返回',
search: '搜索会话...',
columns: {
session: '会话',
source: '来源',
agent: 'Agent',
model: '模型',
messages: '消息',
status: '状态',
lastActive: '最后活跃',
actions: '操作',
},
status: {
active: '活跃',
closed: '已关闭',
},
empty: '暂无会话',
emptyHeading: '还没有任何会话',
emptyDesc: '去对话页开始一次交流,所有的会话都会在这里汇总',
emptyCta: '开始对话',
loadFailed: '加载会话列表失败',
deleteConfirm: '确定要删除这个会话吗?',
deleteTitle: '确认删除',
deleteFailed: '删除会话失败',
switchModel: '切换该会话使用的模型',
modelSwitched: '已切换会话模型',
modelSwitchFailed: '切换模型失败',
model: {
default: '默认',
},
time: {
justNow: '刚刚',
minutesAgo: '{n} 分钟前',
hoursAgo: '{n} 小时前',
},
},
tools: {
kicker: '开发者目录',
title: '工具目录',
desc: '已安装 Skill 暴露的原子动作。终端绑定请使用 Skills 页。',
registerButton: '注册工具',
columns: {
tool: '工具',
beanName: 'Bean 名称',
type: '类型',
status: '状态',
actions: '操作',
},
empty: '暂无已注册工具',
sections: {
core: '核心工具',
extension: '扩展工具',
countItems: '{n} 项',
},
tier: {
toCore: '→ 核心',
toExtension: '→ 扩展',
toCoreHint: '改为核心:直接进入模型可调用列表',
toExtensionHint: '改为扩展:进入工具盒目录,调用 enable_tool 后激活',
locked: '由来源决定',
lockedHint: 'MCP / ACP / Skill 工具的分级由所属 server / endpoint / skill 决定,请到对应页面修改',
core: { desc: '直接进入模型可调用列表' },
extension: { desc: '进入工具盒目录,模型调用 enable_tool 后激活' },
},
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: '切换工具状态失败',
tierFailed: '调整工具分级失败',
},
},
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: '连接失败,请检查配置',
},
},
notifications: {
pendingApprovals: '{n} 个工具调用等待审批',
},
live: {
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: '系统诊断',
subtitle: '本地实例健康概览',
checking: '检查中...',
allGood: '所有系统正常',
hasWarnings: '{count} 个警告',
hasErrors: '{count} 个问题',
refresh: '重新检查',
lastChecked: '{time} 前检查',
diagnose: '诊断问题',
checksPassed: '{healthy}/{total} 项检查通过',
checksLoading: '正在采样系统指标',
},
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: '返回库',
deleteKB: '删除知识库',
deleteKBConfirm: '确认删除知识库「{name}」?将一并清除 {raws} 个原始材料和 {pages} 个 Wiki 页面,此操作不可撤销。',
deleteKBSuccess: '已删除知识库「{name}」',
deleteKBFailed: '删除知识库失败',
manageKB: '管理知识库',
toManage: '管理',
toReading: '查看 Wiki',
},
manageBadge: '管理',
selectPage: '从左侧选择一个页面查看',
pageKicker: '知识页面',
confirmDelete: '确认删除页面「{title}」?此操作不可撤销。',
confirmDeleteRefs: '该页面被 {count} 个页面引用,删除后这些引用将被自动改写为纯文本。',
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',
targetPageType: '目标分类',
targetPageTypeAuto: '(默认 / 自动)',
targetPageTypeHelp: '落页时使用的页面分类,来自当前知识库的分类配置;留空则使用配置中的兜底分类。',
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 后注入路径短路;该面板的"立即重建"会绕过去抖,方便调试。',
},
adv: {
tab: '高级管理',
validate: '校验',
validOk: '校验通过',
profile: {
tab: '页面类型',
title: '页面类型 Profile',
desc: '定义本知识库的页面类型(pageType)、所属知识分层、路由/创建/合并阶段指令与内容模板。会注入到摄取流水线的各阶段提示词。',
builtin: '内置默认',
placeholder: '在此粘贴 pageType profile 的 JSON…',
reset: '重置为默认',
resetConfirm: '确认重置为内置默认 profile?当前自定义配置会被清除。',
formMode: '表单',
jsonMode: 'JSON',
fallbackType: '兜底类型',
allowAdditionalFields: '保留未声明字段',
versionLabel: '版本',
addType: '添加类型',
removeType: '删除类型',
removeTypeConfirm: '确认删除页面类型「{type}」?',
noTypes: '暂无页面类型',
selectType: '从左侧选择或新建一个页面类型',
typeKey: '类型 Key',
typeKeyHint: '小写、唯一,仅含字母数字 _ -',
copyFrom: '从已有类型复制',
copyFromNone: '不复制(空白)',
moveUp: '上移',
moveDown: '下移',
label: '显示名',
description: '描述',
layer: '知识分层',
layerFact: '事实(fact)',
layerExperience: '经验(experience)',
layerUnset: '未指定',
fields: '字段',
fieldName: '字段名',
fieldType: '类型',
fieldRequired: '必填',
enumValues: '可选值',
enumHint: '逗号分隔',
addField: '添加字段',
noFields: '暂无字段',
advanced: '高级(阶段提示词 / 模板)',
advancedIntro: '以下提示词会注入到摄取流水线对应阶段,追加在系统默认提示词之后;留空即用默认。三个阶段:route=判断内容是否归入该类型,create=首次新建该类型页面,merge=把新内容并入已有页面。',
stageRoute: 'Route 阶段指令',
routeHint: '路由判定:模型在决定一段原始内容是否属于、以及如何归入该类型页面时的额外指引。',
routeExample: '例:仅当内容描述某个具体人物的生平或职责时,才归入本类型;泛泛提及不算。',
stageCreate: 'Create 阶段指令',
createHint: '创建写作:首次为该类型生成页面时的结构与风格要求(要素、语气、章节)。',
createExample: '例:用第三人称客观陈述;开头给一句话定义;随后分「背景 / 关键属性 / 关联」三节。',
stageCreateTemplate: 'Create 模板 Key',
createTemplateHint: '创建时引用的模板标识,对应下方「模板 Key」;留空则不套用模板。',
createTemplateExample: '例:concept-tpl',
stageMerge: 'Merge 阶段指令',
mergeHint: '合并取舍:把新增内容并入已有页面时的规则(如何去重、冲突时保留哪个)。',
mergeExample: '例:保留信息更新的版本;冲突处标注来源与时间,不直接覆盖原文。',
templateKey: '模板 Key',
templateKeyHint: '模板标识,供 create 阶段通过上面的「Create 模板 Key」引用。',
templateMarkdown: '模板 Markdown',
templateMarkdownHint: '交给模型的正文骨架:写你想要的标题/章节结构,create 阶段会原样拼进提示词,由模型据此填写正文。它是结构示例,不做变量替换——括号里的中文是给模型的提示,不会被自动套用字段值。',
templateMarkdownExample: '## 概要\n(用一句话定义本条目)\n\n## 关键属性\n- \n\n## 关联\n- 相关条目用 [[wiki 链接]] 指向',
errKeyFormat: '类型 Key「{key}」非法:需为小写、非空,仅含字母数字 _ -',
errKeyDup: '类型 Key「{key}」重复',
errFieldDup: '类型「{type}」中字段名「{field}」重复',
warnFallbackMissing: '兜底类型「{type}」未在已定义类型中',
errJsonParse: 'JSON 解析失败,请修正后再切换到表单',
},
reclassify: {
desc: '按当前 profile 重新分类已有页面:仅更新页面分类(pageType),不改动正文。改了 profile(新增/删除类型)后用它把旧页面迁移到新分类。',
button: '重新分类已有页面',
confirmTitle: '重新分类已有页面',
confirmMsg: '将对本知识库每个非系统页面逐一调用大模型重新判定分类,可能耗时并产生费用。系统页面不受影响。确认继续?',
started: '已开始重新分类,完成后页面分类会更新。',
},
layers: {
tab: '分层 & 失效',
title: '知识分层与失效状态',
desc: 'fact(事实)层更新后会把依赖它的 experience(经验)页面标记为 stale,提示需要复核。',
fact: '事实层',
experience: '经验层',
other: '其它',
stale: '已失效',
empty: '该知识库暂无页面。',
page: '页面',
layer: '分层',
status: '状态',
staleTag: '待复核',
fresh: '正常',
},
perm: {
tab: '权限 & 审批',
title: '员工页面类型权限',
desc: '为指定员工配置在本知识库下按 pageType 的读/创建/更新/删除权限;写操作可设为需审批。无规则时默认放行,一旦存在规则则未覆盖的类型按失败安全(拒绝)处理。',
agent: '员工',
selectAgent: '选择一位员工…',
pageType: '页面类型',
policy: '写策略',
noRows: '该员工暂无权限规则(默认放行)。',
pageTypeHint: '页面类型,* 表示默认',
addRule: '新增规则',
deleteConfirm: '删除 "{type}" 的权限规则?',
},
watcher: {
tab: '变更监测',
title: '源目录变更监测',
desc: '配置本地扫描路径(支持多路径、Glob 通配符),监测器会按间隔扫描新增/变更文件并自动摄取。也可手动触发一次扫描。',
enabled: '监测开关',
active: '已激活',
interval: '扫描间隔',
sourceType: '源类型',
directory: '扫描路径',
dirHint: '每行一条路径或 Glob 模式,# 开头为注释。示例:\n/data/docs\n/data/ocr/**/*.txt\n/data/reports/*.{xlsx,csv}',
availableTypes: '可用源类型',
scanNow: '立即扫描',
scanDone: '扫描完成',
scanResult: '扫描 {scanned} 个,新增 {added},跳过 {skipped},错误 {errors}',
},
pipeline: {
tab: '流水线',
title: '自定义流水线',
desc: '用 YAML 定义触发器(如某类型页面累计到阈值、页面创建)与多步处理(llm / skill)。保存后由后台按触发条件自动执行。',
name: '名称',
trigger: '触发器',
enabled: '启用',
runs: '运行记录',
empty: '暂无流水线定义。',
editor: 'YAML 定义',
editorHint: 'name: my-pipeline\ntrigger:\n type: page_type_count\n page_type: episode\n threshold: 10\nsteps:\n - executor: llm\n prompt: …',
saveDef: '保存定义',
deleteConfirm: '删除流水线 "{name}"?',
runsFor: '"{name}" 的运行记录',
status: '状态',
startedAt: '开始时间',
noRuns: '暂无运行记录。',
},
},
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} 个',
scanFailed: '扫描失败',
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: '恢复',
lint: {
neverScanned: '尚未扫描死链,点击右侧按钮检查 [[...]] 引用是否仍然有效',
running: '正在扫描死链…',
scanning: '扫描中…',
scan: '扫描死链',
rescan: '重新扫描',
cleanResult: '已扫描 {pages} 个页面,无死链',
brokenSummary: '发现 {refs} 个死链,分布在 {pages} 个页面',
view: '查看',
dismissTitle: '隐藏本次提示',
panelTitle: 'Wiki 死链报告',
noReport: '尚未扫描,请先点击「扫描死链」',
},
pageTypes: {
concept: '概念',
person: '人物',
place: '地点',
event: '事件',
technology: '技术',
organization: '组织',
product: '产品',
term: '术语',
process: '流程',
system: '系统',
synthesis: '综合',
other: '其他',
},
graph: {
tab: '知识图谱',
nodes: '节点',
edges: '连接',
orphans: '孤立节点',
showOrphans: '显示孤立节点',
allTypes: '全部类型',
resetView: '重置视图',
fullscreen: '全屏',
exitFullscreen: '退出全屏',
linksTo: '链接到',
openPage: '打开页面',
empty: '暂无图谱数据,请先处理原始材料',
},
},
cronField: {
edit: '可视化编辑',
placeholder: '分 时 日 月 周',
placeholderSeconds: '秒 分 时 日 月 周',
dialogTitle: 'Cron 表达式生成器',
presets: '常用预设',
confirm: '确定',
cancel: '取消',
rangeSep: '至',
intervalStart: '从',
intervalEvery: '开始,每',
intervalExec: '执行一次',
specificEmpty: '点击下方数字进行选择',
everyDesc: '每{unit}都执行',
tabs: { second: '秒', minute: '分钟', hour: '小时', day: '日', month: '月', week: '周' },
type: { every: '任意值', range: '范围', interval: '间隔', specific: '指定' },
unit: { second: '秒', minute: '分', hour: '时', day: '日', month: '月', week: '周' },
weekShort: { 0: '周日', 1: '周一', 2: '周二', 3: '周三', 4: '周四', 5: '周五', 6: '周六' },
presetItems: {
everyMinute: '每分钟',
every5Min: '每 5 分钟',
every30Min: '每 30 分钟',
hourly: '每小时',
daily0: '每天 0 点',
daily9: '每天 9 点',
weekday9: '工作日 9 点',
weekly1: '每周一 9 点',
monthly1: '每月 1 号',
},
desc: {
everyMinute: '每分钟执行一次',
everyNMin: '每 {n} 分钟执行一次',
everyNHour: '每 {n} 小时执行一次',
hourlyAt: '每小时第 {m} 分钟执行',
dailyAt: '每天 {time} 执行',
weeklyAt: '每周 {days} {time} 执行',
monthlyAt: '每月 {day} 号 {time} 执行',
},
},
scheduler: {
kicker: '自动化',
title: '调度中心',
desc: '定时任务、事件触发器与运行历史,集中在一个地方管理。',
tabs: {
jobs: '定时任务',
triggers: '事件触发器',
history: '运行历史',
},
actions: {
newJob: '新建任务',
newTrigger: '新建触发器',
refresh: '刷新',
},
history: {
empty: '暂无运行记录',
emptyDesc: '定时任务执行后,运行记录会显示在这里。',
unknownJob: '任务 #{id}',
columns: {
job: '任务',
trigger: '触发方式',
status: '状态',
startedAt: '开始时间',
duration: '耗时',
tokens: 'Token',
},
status: {
running: '执行中',
completed: '已完成',
succeeded: '成功',
failed: '失败',
},
triggerType: {
scheduled: '定时',
manual: '手动',
},
},
},
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 目标', wiki_process: '知识库处理' },
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 要完成的目标',
wikiKb: '知识库',
wikiKbPlaceholder: '选择要处理的知识库',
wikiKbEmpty: '当前工作区还没有知识库,请先在 Wiki 页面创建',
wikiForce: '强制重处理',
wikiForceHint: '开启后清空所有 last_processed_hash,重新入队全部材料;关闭时只处理 pending 状态的材料',
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 编辑',
runs: '运行 ({count})',
},
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 is intentionally not localized — hardcoded in
// StepPropertyPanel so vue-i18n's parser never sees the Pebble braces.
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: '把定时调度、渠道事件和 Webhook 接到已发布的工作流上——条件满足时,工作流自动运行。',
newTrigger: '+ 新建触发器',
emptyDesc: '触发器让工作流在特定事件发生时自动运行,无需手动启动。',
neverFired: '尚未触发',
firedSummary: '已触发 {count} 次 · 最近 {time}',
targetWorkflowSelect: '选择已发布的工作流',
targetWorkflowEmpty: '尚无已发布的工作流。',
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: '(未命名)',
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: '可嵌网页挂件,也可作为带 Key 的后端 SSE API 直接调用',
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: 'Web / API 接入',
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: 'Web / API 接入既可把 MateClaw 聊天挂件嵌入外部网站,也可作为纯后端 SSE 接口直接调用。配置 API Key 后,前端可引入 WebChat SDK;后端可直接 POST /api/v1/channels/webchat/stream,头带 X-MC-Key、体传 {message, visitorId, 可选 sessionId/agentId}。',
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: '在 钉钉开放平台 创建机器人,填入 AppKey 和 AppSecret',
step2: 'Stream 模式(推荐):消息接收模式选「Stream 模式」,无需公网 IP 即可使用',
step3: 'Webhook 模式:消息接收模式选「HTTP 模式」,将 Webhook URL 填入回调地址',
},
feishu: {
step1: '前往 飞书开放平台 创建企业自建应用',
step2: '将应用的 App ID 和 App 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 ID 和 Secret,填入下方配置',
step4: '启动渠道后即可在企业微信中扫码添加机器人对话,无需公网 IP 和回调 URL',
},
weixin: {
step1: '确保已获得微信 iLink Bot 内测资格(目前为受邀内测阶段)',
step2: '点击下方「获取登录二维码」按钮,用微信扫码登录',
step3: '扫码成功后系统自动获取 bot_token 并填入配置',
step4: '启动渠道后通过 HTTP 长轮询自动接收消息,无需公网 IP 和回调 URL',
},
qq: {
step1: '前往 QQ 开放平台 创建机器人应用',
step2: '在应用管理页面获取 AppID 和 AppSecret,填入下方配置',
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: '获取二维码失败,请检查网络',
},
qqRegister: {
title: '扫码绑定 QQ 机器人',
hint: '需要先在 QQ 开放平台 (q.qq.com) 创建好机器人。点击按钮后用手机 QQ 扫码,在弹出页面选择要绑定的机器人,AppID / AppSecret 会自动填入下方,无需手动复制。',
button: '扫码绑定已有机器人',
buttonLoading: '正在准备二维码…',
qrcodeLoading: '正在生成二维码',
scanHint: '请使用手机 QQ 扫描上方二维码并在页面中选择机器人',
confirmed: '绑定成功,AppID 和 AppSecret 已自动填入',
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: '动态',
stale: '待归档',
archived: '已归档',
},
lifecycle: {
section: '生命周期',
state: '状态',
lastUsed: '上次使用',
neverUsed: '从未使用',
today: '今天',
daysAgo: '{n} 天前',
states: {
active: '活跃',
stale: '待归档',
archived: '已归档',
},
pin: '钉住此技能',
pinHint: '钉住后永不会被自动归档',
archive: '归档',
restore: '恢复',
pinFailed: '钉住操作失败',
archiveTitle: '归档技能',
archiveConfirm: '确定归档「{name}」吗?归档后该技能将停用,可随时恢复。',
archiveSuccess: '技能已归档',
archiveFailed: '归档失败',
restoreSuccess: '技能已恢复',
restoreFailed: '恢复失败',
boundConfirmTitle: '该技能已被 Agent 绑定',
boundConfirmBody: '「{name}」被 {count} 个启用中的 Agent 显式绑定({agents})。归档后这些 Agent 将失去该能力,确定继续?',
},
search: {
placeholder: '搜索技能名称、描述或标签...',
},
filter: {
all: '全部状态',
enabled: '已启用',
disabled: '已禁用',
scanFailed: '扫描失败',
},
sections: {
enabled: '已启用',
available: '未启用',
countItems: '{n} 项',
emptyEnabled: '暂无已启用的技能',
emptyEnabledDesc: '从下方"未启用"区启用一个,或从模板/导入新建。',
emptyAvailable: '暂无未启用的技能',
},
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)',
},
},
skillCurator: {
title: '技能管家',
desc: '按时间窗口自动归档长期闲置的技能,保持技能目录整洁。',
stateEnabled: '已部署',
stateActivated: '已激活',
statePreview: '仅预览',
statePaused: '已暂停',
config: '配置',
scope: '清理范围',
staleAfter: 'stale 阈值(天)',
archiveAfter: '归档阈值(天)',
cron: '调度表达式',
counts: '当前统计',
active: '活跃',
stale: '待归档',
archived: '已归档',
pinned: '已钉住',
blockedByBindings: '被绑定保护',
control: '运行控制',
lastObservedAt: '首次观测',
lastDryRunAt: '上次预览',
lastRunAt: '上次运行',
nextScheduledRun: '下次调度',
activate: '激活管家',
deactivate: '退回仅预览',
pause: '暂停',
resume: '恢复',
runDryRun: '立即预览',
activatedHint: '管家已激活,每日按调度真正归档闲置技能。',
previewHint: '管家处于仅预览模式,不会真正归档。查看预览报告满意后再激活。',
pausedHint: '管家已暂停,定时扫描不会运行。',
reports: '运行报告',
noReports: '暂无运行报告',
reportPlanned: '计划',
reportApplied: '执行',
reportScanned: '扫描',
reportDryRun: '预览',
reportTransitions: '状态变更',
activateSuccess: '技能管家已激活',
deactivateSuccess: '已退回仅预览模式',
pauseSuccess: '技能管家已暂停',
resumeSuccess: '技能管家已恢复',
dryRunSuccess: '预览报告已生成',
actionFailed: '操作失败',
loadFailed: '加载技能管家状态失败',
},
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: '保存并启用',
testBeforeSave: '请先测试连接,通过后即可启用',
saveFailed: '保存失败,请重试',
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: '本月',
},
models: {
title: '模型配置',
subtitle: '已启用的 LLM Provider 与当前生效模型。',
activeModel: '当前模型',
notSet: '未设置',
configured: '已就绪',
manage: '管理',
empty: '尚未启用任何模型 Provider。',
emptyCta: '去配置',
},
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: '已保存',
moveUp: '上移',
moveDown: '下移',
},
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: '读取技能文件',
},
forbidden: {
title: '无权访问',
message: '当前工作区中你的角色无法访问该页面。',
currentRole: '当前角色:{role}',
goChat: '返回对话',
goBack: '返回上一页',
},
goal: {
inlinePrompt: '这件事要不要设成目标,我帮你跟着?',
inlinePromptAccept: '好',
inlinePromptDecline: '不用',
autoFollowup: '自动延续',
sidebarActive: '此对话有正在进行的目标',
completedTitle: '目标达成',
completedDetail: '已存入长期记忆,下次问起能找回来',
exhaustedTitle: '这次的预算用完了',
exhaustedDetailTurns: '预算轮数({used}/{budget})用完。',
exhaustedDetailLlm: 'LLM 调用预算用完。',
},
approval: {
grant: {
pill: {
inactive: '未启用',
manage: '管理自动批准策略...',
},
chipLabel: '自动批准已启用 ({count})',
chipShort: '自动批准 {count}',
menu: '自动批准',
title: '自动批准策略',
desc: '策略让特定工具调用跳过人审。地板规则(如 rm -rf /、pipe-to-shell)始终生效,CRITICAL 严重度永远人审。',
scope: {
conversation: '会话',
agent: '智能体',
user: '用户',
workspace: '工作区',
},
kind: {
always: '永久',
until: '到期失效',
conversationEnd: '会话结束失效',
},
severityCeiling: '严重度上限',
createBtn: '新增策略',
createWorkspaceBtn: '创建全工具白名单 (危险)',
createWorkspaceWarning: '该策略将允许此工作区内所有用户的所有工具调用自动通过审批。地板规则仍会阻断灾难性命令,但其他风险都将被绕过。请输入登录密码确认。',
revokeBtn: '撤销',
revokeConfirm: '撤销后此策略将不再生效。继续?',
revokeConfirmDetailed: '撤销后 {tool} 的自动批准将不再生效,下次调用会重新走人工审批。继续?',
anyTool: '所有工具',
viewResolutions: '查看本规则触发的 {count} 次自动通过 →',
empty: '尚未配置自动批准策略',
columns: {
scope: '范围',
tool: '工具',
rule: '规则',
severity: '严重度上限',
kind: '类型',
expire: '过期时间',
grantedBy: '创建者',
grantedAt: '创建时间',
note: '备注',
actions: '操作',
},
form: {
scopeType: '范围类型',
scopeId: '范围 ID',
toolName: '工具名(空 = 任意工具)',
ruleId: '规则 ID(空 = 任意规则)',
maxSeverity: '严重度上限',
grantKind: '生效类型',
expireAt: '过期时间',
note: '备注',
password: '登录密码(敏感策略需要)',
},
},
resolution: {
source: {
userManual: '人工审批',
autoGrant: '自动批准',
hardBlock: '安全地板阻断',
timeout: '审批超时',
},
},
hardBlock: {
banner: '此命令命中安全地板,任何模式下都不可执行。',
},
forceHuman: {
banner: '此命令需要人工审批,自动批准策略对其不生效。',
},
},
} as const