mateclaw/mateclaw-ui/src/i18n/locales/zh-CN.ts
倪程伟 8da01432da
feat(wiki): add guided form editor for pageType profile (JSON kept as review) (#311)
The pageType profile could only be edited as a raw JSON string. Add a
structured form editor (default) that builds the profile without writing JSON:
profile-level settings (fallbackType / allowAdditionalFields), an ordered page
type list (add via a small wizard, remove, reorder), and a per-type form for
label / description / layer / field schema, with stage prompts (route/create/
merge) and the markdown template folded into an "advanced" section that carries
inline descriptions and examples. A form/JSON toggle keeps the JSON view as the
final review surface; serialization preserves unknown keys for forward-compat,
and save/validate/reset reuse the existing endpoints (no backend change).

Closes matevip/mateclaw#310
2026-06-10 13:42:02 +08:00

4141 lines
170 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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: '或输入 <code>/approve</code> / <code>/deny</code>',
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: 'AnthropicMessages 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-062Claude 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://<resource>.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/v1OpenAI 兼容协议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 RealtimeWebSocket 流式),中文识别效果优秀,亚秒级延迟。',
// Issue #76
sttOpenAiCompatProviderId: '从模型管理选一个 OpenAI 兼容 provider 行作为凭证baseUrl + API Key来源。除官方 OpenAI 外FunASR 私有部署 / 硅基流动 / Groq / Together / 火山 / 七牛等都可以用——在模型管理新增自定义 provider 后即可在此选用。',
sttOpenAiCompatModel: '发送给端点的模型名multipart "model" 字段。OpenAI 默认 whisper-1FunASR 通常是 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: '腾讯混元 3Dai3d.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 ProGemini 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 协议(如 <code>http://127.0.0.1:7890</code>、<code>socks5://127.0.0.1:1080</code>)。可选用户名 / 密码:<code>http://user:pass@host:port</code>。',
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 模型生成,支持腾讯混元 3DHY-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规定何时写记忆、各文件放什么、可用的记忆工具。上方的岗位目标背景是员工的出厂身份PROFILEMEMORY 等可演化的记忆在「记忆」菜单管理。',
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 委派给外部编码 Agentcodex / 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 keysk-ant-…)。申请: https://console.anthropic.com/settings/keys',
openai: 'OpenAI API keysk-…)。申请: 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 keysk-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 和 phasespawned / terminated / crashed。',
workflow_completion: '可选 sourceWorkflowId 和 stateFiltercompleted / 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 等价于 succeededfailed 仅匹配失败结束。',
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: '默认账号: <code>admin</code> / <code>admin123</code>',
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: '发送给用户前过滤 <think> 标签内容',
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: '在 <a href="https://open-dev.dingtalk.com/" target="_blank" rel="noopener">钉钉开放平台</a> 创建机器人,填入 <b>AppKey</b> 和 <b>AppSecret</b>',
step2: 'Stream 模式推荐消息接收模式选「Stream 模式」,无需公网 IP 即可使用',
step3: 'Webhook 模式消息接收模式选「HTTP 模式」,将 Webhook URL 填入回调地址',
},
feishu: {
step1: '前往 <a href="https://open.feishu.cn/" target="_blank" rel="noopener">飞书开放平台</a> 创建企业自建应用',
step2: '将应用的 <b>App ID</b> 和 <b>App Secret</b> 填入下方配置',
webhookStep: '在飞书后台「事件订阅」中将请求地址设置为上方 Webhook URL订阅 <code>im.message.receive_v1</code> 事件',
websocketStep: '在飞书后台「事件订阅」中选择「长连接」订阅方式,订阅 <code>im.message.receive_v1</code> 事件(无需公网 IP',
permissionStep: '如需昵称显示,请在「权限管理」中申请 <code>contact:user.base:readonly</code> 权限',
},
telegram: {
step1: '在 Telegram 中搜索 <a href="https://t.me/BotFather" target="_blank" rel="noopener">{at}BotFather</a>,发送 <code>/newbot</code> 创建 Bot',
step2: '将 BotFather 返回的 <b>Bot Token</b> 填入下方配置',
step3: '<b>Long-Polling 模式</b>(推荐):启动后自动通过 <code>getUpdates</code> 轮询接收消息,<b>无需公网 IP</b>',
step4: '<b>Webhook 模式</b>:需要公网可访问的回调地址,切换接入模式后填入 Webhook URL',
},
discord: {
step1: '前往 <a href="https://discord.com/developers/applications" target="_blank" rel="noopener">Discord Developer Portal</a> 创建 Application',
step2: '在 Bot 页面创建 Bot 并复制 <b>Bot Token</b> 填入下方配置',
step3: '在 Bot 页面开启 <b>MESSAGE CONTENT Intent</b>Privileged Gateway Intents 区域)',
step4: '在 OAuth2 → URL Generator 中勾选 <b>bot</b> scope 和 <b>Send Messages / Read Message History</b> 权限,生成邀请链接将 Bot 添加到目标服务器',
step5: '启动后通过 <b>Gateway WebSocket</b> 自动接收消息,<b>无需公网 IP 和回调 URL</b>',
},
wecom: {
step1: '前往 <a href="https://work.weixin.qq.com/wework_admin/frame" target="_blank" rel="noopener">企业微信管理后台</a>,进入「应用管理 → 智能机器人」创建一个新的智能机器人',
step2: '在机器人配置中选择「<b>API 模式 → 配置长连接</b>」',
step3: '记录机器人的 <b>Bot ID</b> 和 <b>Secret</b>,填入下方配置',
step4: '启动渠道后即可在企业微信中扫码添加机器人对话,<b>无需公网 IP 和回调 URL</b>',
},
weixin: {
step1: '确保已获得微信 <b>iLink Bot</b> 内测资格(目前为受邀内测阶段)',
step2: '点击下方「获取登录二维码」按钮,用微信扫码登录',
step3: '扫码成功后系统自动获取 <b>bot_token</b> 并填入配置',
step4: '启动渠道后通过 <b>HTTP 长轮询</b>自动接收消息,<b>无需公网 IP 和回调 URL</b>',
},
qq: {
step1: '前往 <a href="https://q.qq.com/" target="_blank" rel="noopener">QQ 开放平台</a> 创建机器人应用',
step2: '在应用管理页面获取 <b>AppID</b> 和 <b>AppSecret</b>,填入下方配置',
step3: "在「功能配置 → 消息订阅」中开启需要的消息类型C2C 消息、群聊 {'@'}消息、频道消息等)",
step4: '启动渠道后通过 <b>WebSocket 长连接</b>自动接收消息,<b>无需公网 IP 和回调 URL</b>',
},
},
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