export default { // 登录 login: { title: 'Hermes Studio', description: '输入用户名和密码以继续。', placeholder: '访问令牌', submit: '登录', tokenRequired: '请输入访问令牌', invalidToken: '令牌无效', connectionFailed: '无法连接到服务器', passwordLogin: '密码登录', tokenLogin: '令牌登录', usernamePlaceholder: '用户名', passwordPlaceholder: '密码', credentialsRequired: '请输入用户名和密码', invalidCredentials: '用户名或密码错误', tooManyAttempts: '登录失败次数过多,请稍后重试', lockResetHint: '如果这是你的服务器,可以执行以下命令清除登录锁定:', defaultLoginResetHint: '如需重置默认 admin 密码,可以执行:', sessionExpired: '登录已过期,请重新登录', probing: '正在探测服务端…', online: '认证服务在线 · 密码登录可用', offline: '无法连接到服务器 · 登录仍可尝试', showPassword: '显示密码', hidePassword: '隐藏密码', fillDefaults: '使用默认账号登录', accessDenied: '你没有权限访问该资源', passwordMismatch: '两次密码不一致', passwordTooShort: '密码长度至少 6 个字符', setupSuccess: '密码登录配置成功', passwordChanged: '密码修改成功', passwordRemoved: '密码登录已移除', setupPassword: '设置密码登录', changePassword: '修改密码', changeUsername: '修改用户名', removePasswordLogin: '移除', username: '用户名', currentPassword: '当前密码', newPassword: '新密码', confirmPassword: '确认密码', newUsername: '新用户名', usernameChanged: '用户名修改成功', usernameTooShort: '用户名至少 2 个字符', setupDescription: '管理用于登录的用户名和密码。', removeConfirm: '用户账号必须保留密码登录。', passwordLoginNotConfigured: '密码登录未配置', passwordLoginConfigured: '当前账户:{username}', defaultCredentialTitle: '请修改默认账户和密码', defaultCredentialMessage: '当前登录账户仍在使用默认用户名或默认密码。为了避免未授权访问,请尽快进入当前账户修改用户名和密码。', defaultCredentialAction: '去修改', defaultCredentialLater: '稍后提醒', }, // hermes CLI 缺失引导 hermesMissing: { title: '未检测到 hermes CLI', intro: 'hermes-ui 不再内置 hermes CLI,请先在运行本服务的机器上安装:', installCmd: 'pip install hermes-agent', envIntro: '或者设置环境变量指定可执行文件路径:', envCmd: 'HERMES_BIN=/path/to/hermes', restartHint: '安装完成后请重启本服务。', retry: '重新检测', }, users: { title: '账户管理', description: '创建用户、分配角色,并控制普通管理员可访问的配置。', create: '创建用户', edit: '编辑用户', username: '用户名', role: '角色', statusLabel: '状态', profiles: '可访问配置', profilesPlaceholder: '选择可访问的配置', allProfiles: '全部配置', noProfiles: '未关联配置', lastLogin: '最后登录', newPasswordOptional: '新密码(留空不修改)', loadFailed: '用户列表加载失败', deleteConfirm: '确认删除该用户?', enable: '启用', disable: '禁用', roles: { superAdmin: '超级管理员', admin: '普通管理员', }, status: { active: '启用', disabled: '禁用', }, }, // 通用 common: { loading: '加载中...', cancel: '取消', delete: '删除', retry: '重试', reset: '重置', edit: '编辑', save: '保存', saved: '已保存', saveFailed: '保存失败', deleteFailed: '删除失败', ok: '确定', copied: '已复制', copy: '复制', update: '更新', create: '创建', noData: '暂无数据', expired: '已过期', fetch: '获取', add: '添加', enable: '启用', disable: '禁用', configured: '已配置', notConfigured: '未配置', confirm: '确定', expand: '展开', collapse: '收起', start: '启动', stop: '停止', }, // 侧边栏 // MCP 管理 mcp: { title: 'MCP 服务器', loadFailed: '加载 MCP 服务器失败', reloadAll: '全部重载', refresh: '刷新', total: '总计', connected: '已连接', disconnected: '未连接', tools: '工具', tool: '工具', searchPlaceholder: '搜索服务器...', addServer: '+ 添加服务器', zeroTools: '0 个工具', loading: '加载中...', empty: '暂无 MCP 服务器配置', reloaded: '已重载 {server}', reloadedAll: '所有 MCP 服务器已重载', reloadFailed: '重载失败', serverAdded: '服务器 "{name}" 已添加', addFailed: '添加服务器失败', serverUpdated: '服务器 "{name}" 已更新', updateFailed: '更新服务器失败', saveFailed: '保存失败', serverRemoved: '已移除 "{name}"', enabled: "已启用 {name}", disabled: "已禁用 {name}", connectedStatus: '已连接', disconnectedStatus: '未连接', disabledStatus: '已禁用', toolList: '工具列表', count: '个', more: '更多', removeFailed: '移除服务器失败', testOk: '测试成功 — {count} 个工具可用', testEmpty: '测试未返回工具', testFailed: '测试失败', edit: '编辑', test: '测试', reload: '重载', remove: '移除', confirmRemove: '确认删除服务器 "{name}"?', cancel: '取消', add: '添加', save: '保存', addTitle: '添加 MCP 服务器', editTitle: '编辑 MCP 服务器', invalidJson: 'JSON 格式错误', invalidYaml: 'YAML 格式错误', invalidConfig: '配置格式错误', invalidServerConfig: '服务器配置无效', missingCommandOrUrl: '必须包含 command 或 url', manageTools: '管理工具', toolsVisibilityTitle: '工具可见性管理', fetchTools: '获取工具列表', fetchToolsFailed: '获取工具列表失败', toolsMode: '模式:', toolsModeAll: '全部', toolsModeInclude: '包含', toolsModeExclude: '排除', toolsListHeader: '工具名称', toolsEmpty: '暂无工具,请先获取工具列表', toolsSummaryAll: '共 {count} 个工具,全部启用', toolsSummaryInclude: '共 {total} 个工具,已选 {count} 个', toolsSummaryExclude: '共 {total} 个工具,已排除 {count} 个', toolsVisibilitySaved: '工具可见性已保存', toolsSelectAll: '全选', toolsClearSelection: '取消全选', toolsExcludeAll: '全部排除', toolsClearExcluded: '清空排除', }, sidebar: { chat: '对话', backToChat: '返回', search: '搜索', history: '历史', jobs: '任务', kanban: '看板', workflow: '工作流', models: '模型', profiles: 'Agent', plugins: '插件', mcp: 'MCP', skills: '技能', memory: '记忆', logs: '日志', usage: '用量', performance: '性能监控', journey: '学习轨迹', skillsUsage: '技能用量', channels: '频道', gateways: '网关', terminal: '终端', singleChat: '单聊', globalAgent: '全局', groupChat: '群聊', files: '文件', devices: '设备', groupConversation: '对话', groupConversationShort: '对话', groupPlatform: '平台', groupAgent: '助手', groupAgentShort: '助手', groupSystem: '系统', groupSystemShort: '系统', groupMonitoring: '监控', groupMonitoringShort: '监控', groupTools: '工具', groupToolsShort: "工具", versionPreview: "版本预览", settings: '设置', connected: '已连接', disconnected: '未连接', collapse: '收起菜单', expand: '展开菜单', updateTip: '在终端运行 "hermes-ui update" 即可更新', updateVersion: '升级版本 v{version}', reloadClientVersion: '刷新到 v{version}', updating: '正在更新...', updateSuccess: '更新成功,请稍后刷新页面,如长时间未启动,请手动启动', updateFailed: '更新失败', logout: '退出登录', nodeVersionWarning: '检测到 Node.js v{version},请升级到23以上版本。', changelog: '更新日志', noChangelog: '暂无更新日志', updateAvailableLabel: '(有新版)', dockerUpdateTitle: 'Docker 升级', dockerUpdateGuide: '当前运行在 Docker 环境中,请拉取最新镜像并重建容器来升级:', dockerUpdateNote: '数据会持续保留,重建容器不会丢失数据。', }, runtimeVersions: { title: '版本管理', runtimeTitle: 'Hermes Runtime', webUiTitle: 'Web UI', platform: '平台', currentWebUi: '当前 Web UI', activeVersion: '当前启用版本', active: '已启用', installed: '已安装', download: '下载', downloadGithub: 'GitHub 下载', downloadCf: 'Cloudflare 下载', github: 'GitHub', cf: 'Cloudflare', useVersion: '下次启动使用', deleteVersion: '删除', deleteRuntimeConfirm: '删除 Hermes Runtime {version}?', deleteWebUiConfirm: '删除 Web UI {version}?', deleteRuntimeSuccess: 'Runtime 已删除', deleteWebUiSuccess: 'Web UI 已删除', refresh: '刷新', noVersions: '暂无可用版本', remoteLoadFailed: '远程版本加载失败', downloadTasks: '下载任务', downloadStarted: '已开始下载', activateSuccess: '版本选择已保存,重启 Hermes Studio 后生效。', jobStatus: { queued: '排队中', running: '下载中', completed: '已完成', failed: '失败', }, jobStageStatus: { queued: '排队中', resolve: '解析中', download: '下载中', verify: '校验中', extract: '解压中', install: '安装中', completed: '已完成', failed: '失败', }, jobStage: { queued: '排队中', download: '下载中', resolveRuntime: '正在解析 Runtime 包', verifyRuntime: '正在校验 Runtime 压缩包', extractRuntime: '正在解压 Runtime 压缩包', installRuntime: '正在安装 Runtime', resolveWebUi: '正在解析 Web UI 包', verifyWebUi: '正在校验 Web UI 压缩包', extractWebUi: '正在解压 Web UI 压缩包', installWebUi: '正在安装 Web UI', completed: '已完成', failed: '失败', }, }, devices: { title: '设备', count: '{count} 台设备', lastScanned: '上次扫描:{time}', refresh: '刷新', empty: '暂无设备', kpiDiscovered: '已发现', kpiOnline: '在线', kpiOffline: '离线', kpiRequests: '待处理申请', discoveredHosts: '已发现主机', computer: '电脑', endpointLabel: '端', statusLabel: '状态', online: '在线', offline: '离线', address: '地址', os: '系统', agentVersion: 'Agent', webUiVersion: 'Web UI', responseMs: '延迟', lastSeen: '最后发现', open: '打开', never: '从未', unknown: '未知', loadFailed: '加载设备失败', scanFailed: '扫描设备失败', updateFailed: '更新设备失败', duplicateRequest: '已存在待处理的配对申请', manualPairing: '远程配对', copyPairingLink: '复制配对链接', manualUrlPlaceholder: 'https://device.example.com', manualUrlRequired: '请输入设备链接', manualRequestSent: '配对申请已发送', manualRequestFailed: '远程配对申请失败', pairingLinkCopied: '配对链接已复制', pairingLinkCopyFailed: '复制配对链接失败', pairingCodeTitle: '输入配对码', pairingCodePlaceholder: '配对码', pairingCodeRequired: '请输入配对码', submitPairingRequest: '提交申请', processed: '已处理', unprocessed: '未处理', deleteHistory: '删除记录', deleteHistoryConfirm: '确认删除这条申请记录并撤销该设备连接权限?', requests: '申请列表', requestsWithCount: '申请列表({count})', noRequests: '暂无申请', requestPairing: '申请配对', paired: '已配对', approve: '通过', reject: '拒绝', block: '拉黑', unblock: '解除拉黑', inboundStatus: { none: '允许申请', pending: '待处理', approved: '已通过', rejected: '已拒绝', blocked: '黑名单', }, outboundStatus: { none: '未配对', pending: '已申请', approved: '已配对', rejected: '已拒绝', blocked: '被拉黑', }, endpoint: { web: 'Web 端', custom: '自定义', }, }, performance: { title: '性能监控', subtitle: '查看系统资源、Bridge Broker、Workers 和活跃会话', refresh: '刷新', autoRefreshOn: '自动刷新', autoRefreshOff: '手动刷新', loadFailed: '性能数据加载失败', systemCpu: '系统 CPU', systemMemory: '系统内存', activeSessions: '活跃会话', runningSessions: '运行中 {count}', workers: 'Workers', totalWorkerMemory: 'Worker 总内存', processes: '进程', uptime: '运行', running: '运行中', stopped: '已停止', workerMemory: 'Worker 内存', lastUpdated: '更新时间', profile: 'Profile', memory: '内存', sessions: '会话', runningActiveSessions: '运行中 / 活跃', lastUsed: '最后使用', status: '状态', noWorkers: '暂无 Worker', sessionsByProfile: '按 Profile 统计会话', noActiveSessions: '暂无活跃会话', }, journey: { title: '学习轨迹', play: '播放学习轨迹', pause: '暂停学习轨迹', refresh: '刷新', loadFailed: '学习轨迹加载失败', nodes: '节点', edges: '关系', skills: '技能', memories: '记忆', clusters: '分组', profile: 'Profile', source: '来源', learnedSkills: '已学习技能', memorySkillEdges: '记忆关联', allKinds: '全部类型', allCategories: '全部分组', searchPlaceholder: '搜索节点', noClusters: '暂无分组', noNodes: '暂无学习轨迹节点', noCategory: '未分组', category: '分组', useCount: '使用次数', createdBy: '创建来源', timestamp: '时间', pinned: '已固定', }, // 抽屉 drawer: { terminal: '终端', files: '工作区', }, // 对话 chat: { messageLoadFailed: '会话加载失败,请重试。', contextRemaining: '剩余', contextClickToEdit: '点击编辑上下文长度', contextEditTitle: '编辑上下文长度', contextEditDesc: '设置当前模型的上下文长度限制(token 数量)', contextEditPlaceholder: '请输入上下文长度', contextEditHint: '常见值:256k (Hermes 默认), 128k (GPT-4), 32k (GPT-3.5)', contextEditSave: '保存', contextEditCancel: '取消', contextEditInvalid: '请输入有效的上下文长度', contextEditSuccess: '上下文长度已更新', contextEditFailed: '更新失败', emptyState: '开始与 Hermes Agent 对话', emptyStateAgent: '开始与 {agent} 对话', viewOlderInHistory: '前面的消息请到历史记录查看', scrollToBottom: '滚动到底部', forkedFrom: 'Fork 来源', previousLastMessage: '上一段对话的最后一条消息', cliEmptyState: '开始 CLI 对话', outlineTitle: '会话大纲', outlineEmpty: '暂无会话内容', outlineUserQuestion: '用户问题', inputPlaceholder: '输入消息... (Enter 发送,Shift+Enter 换行)', inputHeightResizeHint: '拖拽调整聊天输入框高度,双击恢复自动高度。', slashCommandArgs: { message: '<消息>', title: '<标题>', text: '<文本>', }, slashCommands: { usage: '计算当前会话用量', status: '查看会话状态和队列', abort: '停止当前 Bridge 运行', queue: '把消息加入当前运行后的队列', learn: '从描述的来源学习可复用技能', plan: '生成一份 Markdown 实施计划', moa: '用默认组合模型运行一次性提示', goal: '设置一个跨轮次持续推进的目标', goalStatus: '查看当前目标状态', goalPause: '暂停当前目标循环', goalResume: '继续已暂停的目标循环', goalDone: '完成并清除当前目标', goalClear: '清除当前目标', subgoal: '为当前目标追加验收条件', clear: '清空当前显示内容', clearHistory: '删除当前会话已入库的消息历史', title: '重命名当前会话', compress: '空闲时触发上下文压缩', fork: '将当前空闲会话 fork 成一个新的关联对话', steer: '向当前 Bridge 运行发送引导文本', destroy: '释放当前会话的 Bridge Agent', reloadMcp: '重载 MCP 服务器', reloadSkills: '重载技能命令', }, attachFiles: '添加附件', reasoningEffort: { tooltip: '推理强度', defaultLabel: '默认', options: { default: '默认 (config.yaml)', none: '无', minimal: '极低', low: '低', medium: '中', high: '高', xhigh: '超高', }, }, autoPlaySpeech: '自动播放语音', voiceInput: { startCapture: '开始语音输入', stopCaptureAndInsert: '停止语音输入并插入到输入框', cancelCapture: '取消语音输入', statusLabel: '状态:{status}', transcriptLabel: '转写:{text}', errorLabel: '错误:{error}', recentEvents: '最近事件', status: { idle: '空闲', capturing: '正在聆听', transcribing: '正在转写', sending: '正在插入输入框', error: '错误', }, browserSpeechUnsupported: '当前浏览器不支持内置语音识别。', browserSpeechFailed: '浏览器语音识别失败。', browserSpeechFailedWithReason: '浏览器语音识别失败:{error}。', microphoneUnsupported: '当前浏览器不支持麦克风录音。', microphoneRecordingFailed: '麦克风录音失败。', }, showToolCalls: '显示工具调用', hideToolCalls: '隐藏工具调用', messageQueue: '消息队列', removeQueuedMessage: '移除队列消息', stop: '停止', start: '启动', stopGateway: '停止网关', send: '发送', contextUsed: '上下文已用:', sessions: '会话', webUiSessions: '会话', allProfiles: '全部配置', profileMissingModelsTip: '该会话所属配置「{profile}」没有可用的 provider 或模型', sessionScopeHint: '这里只显示当前会话;CLI、Telegram、Discord、Cron 等通道会话在历史中只读查看。', openHistory: '打开历史', hermesHistory: 'Hermes 历史', historyScopeHint: '这里按来源只读查看当前 profile 的 Hermes 历史会话。', noSessions: '暂无会话', searchTitle: '搜索会话', searchSubtitle: '按标题或消息内容搜索', searchScope: '搜索范围:仅 Web UI 本地会话库;不包含只读 Hermes 历史会话。', searchHint: 'Cmd/Ctrl+K', searchPlaceholder: '搜索会话...', searchEmpty: '最近会话', searchRecent: '最近会话', searchNoResults: '没有匹配的会话', searchNoSnippet: '没有可显示的摘要', searchEnterHint: 'Enter 打开 · Esc 关闭', searchFailed: '搜索会话失败', newChat: '新建对话', agent: 'Agent', approvalKicker: '终端授权', approvalTitle: '运行前请确认命令', approvalAgree: '同意', approvalAllowOnce: '仅本次允许', approvalAllowSession: '本会话允许', approvalAlways: '始终允许', approvalDeny: '拒绝', clarifyKicker: 'Agent 需要确认', clarifyTitle: 'Agent 有一个问题需要您回答', clarifyPlaceholder: '输入你的回答...', clarifySubmit: '回复', clarifyDismiss: '忽略', newCliChat: '新建 CLI', deleteSession: '确定删除此会话?', sessionDeleted: '会话已删除', toggleBatchMode: '批量选择', selectAll: '全选', confirmBatchDelete: '确定删除选中的 {count} 个会话?', batchDeleteSuccess: '已删除 {count} 个会话', batchDeletePartial: '{failed} 个会话删除失败', batchDeleteFailed: '批量删除失败', importToWebUi: '导入到 Web UI', importSessionSuccess: '会话已导入 Web UI', importSessionAlreadyExists: '会话已存在于 Web UI', importSessionFailed: '导入会话失败', rename: '重命名', archiveSession: '归档', unarchiveSession: '取消归档', pin: '置顶', unpin: '取消置顶', pinned: '已置顶', chatMode: '聊天', liveMode: '实时', liveSessions: '实时会话', recentBadge: '最近', linkedSessions: '关联 {count} 个会话', noVisibleMessages: '没有人类可见消息。', monitorRoleUser: '用户', monitorRoleAssistant: '助手', copySessionLink: '复制会话链接', openSessionInNewTab: '在新标签页打开', sessionLinkCopied: 'Session link copied', copySessionId: '复制会话 ID', export: '导出', exportFull: '全量导出 (JSON)', exportCompressed: '压缩导出 (TXT)', exportCompressing: '正在压缩上下文,请稍候...', exportSuccess: '会话已导出', exportFailed: '导出失败', renamed: '已重命名', renameFailed: '重命名失败', sessionArchived: '会话已归档', archiveSessionFailed: '归档会话失败', sessionUnarchived: '已取消归档', unarchiveSessionFailed: '取消归档失败', renameSession: '重命名会话', sessionNotFound: '会话未找到', enterNewTitle: '输入新标题', workspace: '工作区', workspaceDefault: '默认', workspaceDefaultTooltip: '此工作区已设为默认,新建对话时自动填充', workspacePin: '设为默认工作区', workspaceUnpin: '取消默认工作区', workspaceRecent: '最近使用', defaultWorkspace: '默认工作区', more: '更多', setWorkspace: '设置工作区', setWorkspaceTitle: '设置会话工作区', workspacePlaceholder: '输入项目路径,例如 /home/user/project', folderPickerEmpty: '(空)', folderPickerNoFolders: '暂无工作区文件夹', folderPickerSelected: '已选择:', workspaceSet: '工作区已设置', workspaceSetFailed: '设置工作区失败', setModel: '设置模型', setModelTitle: '设置会话模型', modelSet: '模型已设置', modelSetFailed: '设置模型失败', other: '其他', runFailed: '运行失败', error: '错误', tool: '工具', arguments: '参数', result: '结果', workspaceChanges: '工作区变更', changedFiles: '{files} 个文件已更改', diffUnavailable: '无法显示 diff', binaryFileDiffUnavailable: '二进制文件无法显示 diff', truncated: '... (已截断)', unchangedLines: '{count} 行未修改', executionDuration: '执行时长', thinkingLabel: '思考过程', thinkingInProgress: '正在思考', thinkingShow: '展开思考过程', thinkingHide: '收起思考过程', thinkingDuration: '已观察 {duration}', thinkingChars: '{count} 字', copyBubble: '复制消息', copiedBubble: '已复制', copyFailed: '复制失败', playSpeech: '播放语音', pauseSpeech: '暂停', resumeSpeech: '继续', stopSpeech: '停止', speechNotSupported: '此浏览器不支持语音播放', }, workflow: { title: '工作流', profile: '配置', namePlaceholder: '工作流名称', workspace: { title: '选择工作区', select: '选择工作区', clear: '清空工作区', }, actions: { newWorkflow: '新建工作流', addNode: '添加节点', createWorkflowFirst: '请先创建工作流', reset: '重置', startExecution: '开始执行', executionPending: '工作流执行功能待接入', executionStarted: '工作流已开始执行', executionCompleted: '工作流执行完成', executionFailed: '工作流执行失败', rerunDownstreamKeepNode: '保留此节点消息向下执行', rerunDownstreamClearNode: '清除此节点消息向下运行', rerunDownstreamStarted: '已开始向下重跑', rerunFromNodeStarted: '已开始从此节点重跑', rerunFailed: '工作流重跑失败', deleteNode: '删除节点', deleteEdge: '删除连接线', }, batch: { toggle: '批量选择', selectAll: '全选', confirmDelete: '确定删除选中的 {count} 个工作流?', deleteSuccess: '已删除 {count} 个工作流', deletePartial: '{failed} 个工作流删除失败', deleteFailed: '批量删除失败', }, validation: { nodesRequired: '请至少添加一个节点', nodeNameRequired: '节点 {node} 需要填写名称', providerRequired: '节点 {node} 需要选择 Provider', modelRequired: '节点 {node} 需要选择模型', apiModeRequired: '节点 {node} 需要选择 API 模式', inputRequired: '节点 {node} 需要填写输入内容', invalidEdge: '连接线引用了不存在的节点', invalidConnectionDirection: '连接线只能从右侧输出连接到左侧输入', orphanNode: '节点 {node} 没有连接到流程', disconnectedFlow: '流程不能拆成多条互不连接的链路', cycle: '流程中存在循环连接,请调整后再保存', }, node: { title: '节点名称', agent: 'Agent', model: '模型', apiMode: 'API 模式', input: '输入', approvalRequired: '完成后审批', promptPlaceholder: '描述这个 Agent 要做什么...', skillsPlaceholder: '技能,按 Enter 添加', uploadImages: '上传图片', }, status: { idle: '空闲', queued: '排队中', running: '运行中', pending_approval: '待审批', completed: '已完成', failed: '失败', approval_rejected: '审批拒绝', canceled: '已取消', }, runs: { title: '执行记录', refresh: '刷新', empty: '暂无执行记录', startNodes: '{count} 个起始节点', show: '显示执行记录', hide: '隐藏执行记录', nodeSessionTitle: '节点会话 - {node}', noNodeSession: '该节点暂无会话记录', loadNodeSessionFailed: '加载节点会话失败', stop: '停止执行', stopRequested: '已请求停止执行', stopFailed: '停止执行失败', delete: '删除记录', deleteSuccess: '执行记录已删除', }, inspector: { selected: '选中节点', none: '未选择节点', }, stats: { nodes: '节点', edges: '连线', }, agents: { planner: '规划', researcher: '研究', builder: '执行', reviewer: '审查', }, models: { default: '默认模型', fast: '快速模型', reasoning: '推理模型', }, initialNodes: { node1: '节点 1', node2: '节点 2', node3: '节点 3', plan: '规划', execute: '执行', review: '审查', }, initialPrompts: { node1: '输入这个节点的内容。', node2: '输入这个节点的内容。', node3: '输入这个节点的内容。', plan: '把需求拆成可执行步骤。', execute: '执行实现步骤并产出结果。', review: '审查产出质量并识别后续工作。', }, newNodeTitle: '节点 {count}', }, // 看板 kanban: { title: '看板', createTask: '新建任务', noTasks: '暂无任务', allStatuses: '全部状态', allAssignees: '全部负责人', board: { create: '新建看板', archive: '归档看板', slugPlaceholder: '看板标识,例如 project-a', namePlaceholder: '显示名称(可选)', slugRequired: '看板标识不能为空', created: '看板已创建', archived: '看板已归档', archiveConfirm: '确定归档当前看板?', }, columns: { triage: '待分拣', todo: '待办', scheduled: '已调度', ready: '就绪', running: '进行中', blocked: '阻塞', review: '待审查', done: '已完成', archived: '已归档', }, form: { title: '标题', titlePlaceholder: '任务标题', titleRequired: '标题不能为空', body: '描述', bodyPlaceholder: '任务描述(可选)', assignee: '负责人', selectAssignee: '选择负责人...', priority: '优先级', selectPriority: '选择优先级...', tenant: '租户', tenantPlaceholder: '租户(可选)', workspace: '工作区', workspaceScratch: '临时工作区', workspaceDir: '使用目录', workspaceWorktree: '使用 worktree', workspacePath: '工作区路径', workspacePathPlaceholder: '绝对路径(可选)', branch: '分支', branchPlaceholder: 'Worktree 分支', skills: '技能', skillsPlaceholder: '选择技能...', triage: '创建到分拣状态', goalMode: '目标模式', maxRuntime: '最长运行时间', maxRuntimePlaceholder: '例如 30m、2h', maxRetries: '最大重试次数', maxRetriesPlaceholder: '重试次数', goalMaxTurns: '目标最大轮次', goalMaxTurnsPlaceholder: '最大轮次', }, card: { assigneeTooltip: '负责人', priority: { low: '低', medium: '中', high: '高', }, timeAgo: { justNow: '刚刚', minutes: '{count}分钟前', hours: '{count}小时前', days: '{count}天前', }, }, detail: { status: '状态', assignee: '负责人', priority: '优先级', tenant: '租户', createdAt: '创建时间', startedAt: '开始时间', completedAt: '完成时间', comments: '评论', events: '事件', runs: '运行记录', result: '完成结果', sessions: '关联会话', sessionMessages: '会话记录', noSessions: '未找到关联会话。', artifacts: '产出文件', sources: '数据来源', highlights: '关键信息', noLog: '未找到该任务的日志。', addComment: '添加评论', commentPlaceholder: '输入任务评论...', operations: '操作', }, action: { title: '操作', complete: '完成', completeSummary: '完成摘要(可选)', block: '阻塞', blockReason: '阻塞原因', unblock: '解除阻塞', assign: '分配', assignTo: '分配给...', dispatch: '调度', recoveryReason: '恢复原因(可选)', reclaim: '回收', reassign: '重新分配', specify: '细化', loadLog: '加载日志', loadDiagnostics: '加载诊断', }, message: { taskCreated: '任务已创建', taskCompleted: '任务已完成', taskBlocked: '任务已阻塞', taskUnblocked: '任务已解除阻塞', taskAssigned: '任务已分配', dispatchNudged: '已触发调度器', commentAdded: '评论已添加', taskReclaimed: '任务已回收', taskReassigned: '任务已重新分配', taskSpecified: '任务已细化', loadFailed: '加载任务失败', }, stats: { total: '总计', tasks: '任务数', }, }, // 定时任务 jobs: { title: '定时任务', createJob: '创建任务', editJob: '编辑任务', noJobs: '暂无定时任务,创建一个开始吧。', sortBy: '排序', sortByName: '名称排序', sortByTime: '时间排序', sortByNameHint: '点击按名称排序', sortByTimeHint: '点击按时间排序', sortAsc: '升序', sortDesc: '降序', name: '名称', namePlaceholder: '任务名称', schedule: '调度表达式 (Cron)', schedulePlaceholder: '例如 0 9 * * *', quickPresets: '快速预设', selectPreset: '选择预设...', presetEveryMinute: '每分钟', presetEvery5Min: '每 5 分钟', presetEveryHour: '每小时', presetEveryDay: '每天 00:00', presetEveryDay9: '每天 09:00', presetEveryMonday: '每周一 09:00', presetEveryMonth: '每月 1 日 09:00', prompt: '提示词', promptPlaceholder: '要执行的内容', skills: '技能', skillsPlaceholder: '选择技能...', provider: '服务商', model: '模型', defaultProvider: '默认服务商', defaultModel: '默认模型', deliverTarget: '投递目标', origin: '来源', local: '本地', repeatCount: '重复次数(可选)', modelPlaceholder: '选择模型', repeatPlaceholder: '留空表示无限重复', jobCreated: '任务已创建', jobUpdated: '任务已更新', nameRequired: '名称为必填项', scheduleRequired: '调度表达式为必填项', loadFailed: '加载任务失败', jobPaused: '任务已暂停', jobResumed: '任务已恢复', jobTriggered: '任务已触发', modelUpdated: '模型已更新', jobDeleted: '任务已删除', status: { running: '运行中', paused: '已暂停', disabled: '已禁用', scheduled: '已调度', }, info: { model: '模型', provider: '服务商', schedule: '调度', lastRun: '上次运行', nextRun: '下次运行', deliver: '投递', repeat: '重复', }, action: { pause: '暂停', pauseJob: '暂停任务', resume: '恢复', resumeJob: '恢复任务', runNow: '立即运行', triggerImmediately: '立即触发', }, runHistory: { title: '运行历史', runs: '次运行', noRuns: '暂无运行历史。', }, sectionList: '任务列表', }, // 技能 skills: { title: '技能', targetFilter: '运行时', targets: { hermes: 'Hermes', claude: 'Claude', codex: 'Codex', }, searchPlaceholder: '搜索技能...', noMatch: '没有匹配的技能', noSkills: '暂无技能', backTo: '返回', attachedFiles: '附件文件', loadFailed: '加载技能失败', fileLoadFailed: '加载文件失败', modified: '用户已修改', archived: '已归档', pinned: '已置顶', pin: '置顶技能', unpin: '取消置顶', pinFailed: '更改置顶状态失败', edit: '编辑', saving: '保存中...', editorLabel: '技能编辑器', saveSuccess: '技能已保存', saveFailed: '保存技能失败', toggleFailed: '切换技能状态失败', source: { builtin: '内置', hub: 'Hub 安装', local: '本地安装', external: '外部目录', }, delete: '删除', deleteConfirm: '确定要删除技能 "{name}" 吗?此操作不可撤销。', deleteSuccess: '已删除技能', deleteFailed: '删除失败', import: '导入', importTitle: '导入技能', importModeZip: 'Zip 包', importModeFolder: '文件夹', importHintZip: '上传 .zip 包,应包含含 SKILL.md 的目录', importHintFolder: '选择本地技能文件夹(需含 SKILL.md)', importTargetCategory: '目标分类(可选)', importTargetCategoryPlaceholder: '留空则平铺到 misc', importSelectFile: '选择 .zip 文件', importSelectFolder: '选择文件夹', importInvalidFile: '仅支持 .zip 包', importFileCount: '个文件', importNoSelection: '请先选择文件或文件夹', importSuccess: '已导入技能', importFailed: '导入失败', path: { local: '本地', external: '外部', }, externalDirs: { manage: '外部目录', title: '外部目录管理', hint: '在此管理 config.skills.external_dirs。支持 ~ 和 $VAR;不存在的路径会被标灰。', add: '添加外部目录', placeholder: '/path/to/skills 或 ~/my-skills', empty: '暂无外部目录', missing: '目录不存在', notDir: '不是目录', saveSuccess: '外部目录已保存', saveFailed: '保存失败', loadFailed: '加载外部目录失败', removeRow: '移除', }, pathCopied: '路径已复制', pathCopyFailed: '复制路径失败', reloadHint: '活跃会话请执行 /reload-skills;新会话会自动加载。', writeApprovalButton: '待审核 {count}', writeApprovalTitle: '待审核写入', writeApprovalDescription: '批准或拒绝 Hermes Agent 暂存的记忆和技能写入。', writeApprovalRefresh: '刷新', writeApprovalEmpty: '暂无待审核写入。', writeApprovalUnsupported: '当前 Hermes Agent 版本不支持写入审核。请升级 Hermes Agent 后再使用。', writeApprovalMemory: '记忆', writeApprovalSkills: '技能', writeApprovalViewDiff: '查看', writeApprovalHideDiff: '收起', writeApprovalNoDiff: '没有可显示的差异。', writeApprovalLoadFailed: '待审核写入加载失败', writeApprovalDiffFailed: '写入详情加载失败', writeApprovalActionFailed: '待审核写入处理失败', writeApprovalApproved: '已批准写入', writeApprovalRejected: '已拒绝写入', writeApprovalApprove: '批准', writeApprovalReject: '拒绝', writeApprovalPendingMemoryWrite: '待审核记忆写入', writeApprovalCurrentFile: '当前 {file}', writeApprovalProposedFile: '批准后 {file}', writeApprovalDiffSection: '差异', writeApprovalPatchOldStringMissing: '当前文件 {file} 中没有找到这次补丁的 old_string,批准后的文件内容不会变化。', writeApprovalRequestedOldString: '本次请求匹配的 old_string', writeApprovalCurrentReadFailed: '当前文件 {file} 无法按 UTF-8 文本读取。', writeApprovalDeleteSkill: '这次审批会删除技能 {skill}。', writeApprovalRemoveFile: '这次审批会从技能 {skill} 中移除文件 {file}。', }, // 插件 plugins: { title: '插件', refresh: '刷新', notice: '展示可发现的 Hermes 插件 manifest。发现元数据读取不会加载插件代码。可在此启用或禁用 standalone 用户插件,新 Hermes 会话生效。', loadFailed: '加载插件失败', updateFailed: '更新插件失败', enableSuccess: '已启用 {name}', disableSuccess: '已禁用 {name}', commandCopied: '命令已复制', searchPlaceholder: '搜索 key、名称、描述、路径...', source: '来源', kind: '类型', statusTitle: '状态', configStatus: '配置:{status}', notAvailable: '无', copyCommand: '复制命令', managedElsewhere: '由其他位置管理', noMatch: '没有匹配当前筛选条件的插件', enabled: '已启用', disabled: '已禁用', summary: { total: '总数', active: '已启用 / 自动', inactive: '未启用', disabled: '已禁用', providerManaged: 'Provider 管理', }, status: { enabled: '已启用', 'auto-active': '自动启用', inactive: '未启用', disabled: '已禁用', 'provider-managed': 'Provider 管理', }, statusLabel: { enabled: '配置启用', 'auto-active': '自动启用', inactive: '未启用', disabled: '已禁用', 'provider-managed': 'Provider 管理', }, configStatuses: { enabled: '已启用', disabled: '已禁用', 'not-enabled': '未启用', auto: '自动', 'provider-managed': 'Provider 管理', }, table: { plugin: '插件', status: '状态', source: '来源', kind: '类型', capabilities: '能力', path: '路径 / 入口', manage: '管理', }, capabilities: { tools: '{count} 个工具', hooks: '{count} 个 hook', env: '{count} 个环境变量', }, metadata: { agentRoot: 'Agent 根目录', python: 'Python', scanCwd: '扫描 cwd', projectPlugins: '项目插件', }, }, // 记忆 memory: { title: '记忆', refresh: '刷新', loadFailed: '加载记忆失败', editTitle: '修改 · {name}', writeTo: '写入文件', charCount: '{count} 字符', myNotes: '我的笔记', noNotes: '暂无笔记。', notesPlaceholder: '输入笔记内容...', userProfile: '用户画像', noProfile: '暂无画像。', profilePlaceholder: '输入用户画像...', soul: '灵魂', noSoul: '暂无灵魂配置。', soulPlaceholder: '输入灵魂配置...', }, // 模型 models: { fetchUpstreamModels: '从上游获取模型', upstreamModelsFetched: '已从上游获取 {count} 个模型', upstreamModelsFailed: '从上游获取模型失败', editProviderFor: '修改 {name}', keepExistingKey: '留空保留现有 Key', invalidBaseUrl: '请输入有效的 HTTP 或 HTTPS Base URL', providerUpdated: 'Provider 配置已更新', providerUpdateFailed: '修改 Provider 配置失败', title: '模型', searchPlaceholder: '搜索模型...', noResults: '无结果', noModels: '无模型', addProvider: '添加 Provider', refreshModelCache: '刷新模型缓存', refreshModelCacheLoading: '正在刷新模型缓存...', refreshModelCacheSuccess: '模型缓存已刷新', refreshModelCacheFailed: '刷新模型缓存失败', providerType: 'Provider 类型', preset: '预设', custom: '自定义', selectProvider: '选择 Provider', chooseProvider: '选择一个 provider...', getApiKey: '获取 API Key', name: '名称', autoGeneratedName: '根据 Base URL 自动生成', baseUrl: 'Base URL', region: '区域', regionIntl: '国际版', regionCn: '中国大陆', baseUrlPlaceholder: '例如 https://api.example.com/v1', apiKey: 'API Key', apiKeyPlaceholder: 'sk-...', defaultModel: '默认模型', selectOrInput: '选择或输入模型名称...', selectModel: '选择模型...', providerAdded: 'Provider 已添加', providerDeleted: 'Provider 已删除', providerCredentialsCleared: 'Provider 凭据已清除', clearProviderCredentials: '清除凭据', clearCredentialsConfirm: '确定清除 "{name}" 的已保存凭据吗?这是内置 Provider,条目会继续显示,重新配置凭据后仍可使用。', disableProvider: '禁用 Provider', disableProviderConfirm: '确定禁用内置 Provider "{name}" 吗?该 Provider 仍是内置项,之后可以重新启用。', providerDisabled: 'Provider 已禁用', defaultProviderUpdated: '默认 Provider 已更新', defaultProviderUpdateFailed: '更新默认 Provider 失败', defaultModelUpdated: '默认模型已更新', defaultModelUpdateFailed: '更新默认模型失败', deleteProvider: '删除 Provider', deleteConfirm: '确定删除 "{name}" 吗?', codexLoginTitle: 'OpenAI Codex 登录', codexWaiting: '在授权页面输入以下代码完成登录:', codexCopyCode: '代码已复制', codexOpenLink: '打开授权页面', codexApproved: '登录成功', codexExpired: '授权已过期,请重试。', nousLoginTitle: 'Nous Portal 登录', nousWaiting: '在授权页面输入此代码完成登录:', nousCopyCode: '代码已复制', nousOpenLink: '打开授权页面', nousApproved: '登录成功', nousDenied: '授权被拒绝,请重试。', nousExpired: '授权已过期,请重试。', copilotLoginTitle: 'GitHub Copilot 登录', copilotWaiting: '请前往 GitHub 输入下方设备代码完成授权。授权完成后窗口会自动关闭。', copilotCopyCode: '代码已复制', copilotOpenLink: '打开 GitHub 授权页', copilotApproved: '登录成功!', copilotDenied: '授权被拒绝。', copilotExpired: '授权链接已过期,请重试。', copilotAddDetectedTitle: '检测到 GitHub Copilot', copilotAddDetected: '已在本机检测到 GitHub Copilot OAuth 凭证,点击「添加」即可在 Hermes 中启用 Copilot。', copilotAddSourceEnv: '来源:~/.hermes/.env(COPILOT_GITHUB_TOKEN)', copilotAddSourceGhCli: '来源:gh CLI(gh auth token)', copilotAddSourceAppsJson: '来源:VS Code Copilot 插件(apps.json)', copilotDeleteHintEnv: '此操作会清除 ~/.hermes/.env 中的 COPILOT_GITHUB_TOKEN,不影响其他工具。', copilotDeleteHintGhCli: 'Copilot 将从 Hermes 列表移除。不会影响 gh CLI —— `gh auth status` 仍显示已登录。', copilotDeleteHintAppsJson: 'Copilot 将从 Hermes 列表移除。不会影响 VS Code Copilot 插件的登录。', xaiLoginTitle: 'xAI Grok OAuth 登录', xaiWaiting: '请在打开的 xAI 页面完成授权。授权完成后窗口会自动关闭。', xaiOpenLink: '打开 xAI 授权页', xaiCopyLink: '复制授权链接', xaiApproved: '登录成功!', xaiExpired: '授权链接已过期,请重试。', anthropicLoginTitle: 'Claude 授权登录', anthropicWaiting: '请在 Claude 授权页完成授权,然后把返回的授权代码粘贴到这里。', anthropicOpenLink: '打开 Claude 授权页', anthropicCopyLink: '复制授权链接', anthropicCodePlaceholder: '粘贴授权代码...', anthropicSubmitCode: '提交代码', anthropicApproved: '登录成功!', anthropicExpired: '授权已过期,请重试。', geminiLoginTitle: 'Google Gemini OAuth 登录', geminiWaiting: '请在打开的 Google 页面完成授权。授权完成后窗口会自动关闭。', geminiOpenLink: '打开 Google 授权页', geminiCopyLink: '复制授权链接', geminiApproved: '登录成功!', geminiExpired: '授权链接已过期,请重试。', customBadge: '自定义', previewBadge: '预览', disabledBadge: '不可用', disabledTooltip: "此模型当前账号不可用", customModelPlaceholder: '未列出的模型 ID', customModelHint: '仅用于 provider 支持但未返回的模型;不是重命名。按回车加载。', removeCustomModel: '移除这个未列出的模型', refresh: '刷新模型列表(重新加载 config.yaml)', noProviders: '暂无 Provider,添加一个开始吧。', models: '模型列表', count: '个模型', more: '个更多', aliasEdit: '重命名', aliasTitle: '模型显示名', aliasTitleFor: '{model} 的显示名', aliasPlaceholder: '留空则使用原始模型 ID', aliasHint: '仅修改 Web UI 显示名,发送给 Hermes 的仍是原始模型 ID。', aliasCanonical: '原始 ID:{model}', aliasUseOriginal: '恢复原始 ID', aliasManage: '显示名', aliasManageFor: '{provider} 的显示名', aliasSaveFailed: '保存显示名失败', manageVisibleModels: '管理可见模型', manageVisibleModelsFor: '管理 {name} 可见模型', visibilityHint: '仅影响 Web UI 的模型选择器和模型页展示,不会改写 Hermes CLI 的 provider/model 配置。实际调用仍使用原始模型 ID。', visibilitySelectOne: '至少保留一个可见模型', visibilitySaved: '可见模型已保存', visibilitySaveFailed: '保存可见模型失败', showAllModels: '显示全部模型', clearVisibleModels: '取消全选', generalTitle: '通用模型', auxiliaryTitle: '辅助模型', auxiliarySubtitle: '为压缩、视觉、审批、MCP 和后台维护等辅助任务单独指定模型。', combinationTitle: '组合模型', combinationSubtitle: '配置 MoA 预设:多个参考模型先给出视角,再由一个汇总模型负责最终回复和工具调用。', combinationPreset: '预设', combinationName: '名称', combinationAddModel: '添加组合模型', combinationEditModel: '编辑组合模型', combinationNewPreset: '新预设', combinationPresetPlaceholder: '例如 review', combinationAddPreset: '添加预设', combinationSetDefault: '设为默认', combinationEnabled: '启用参考模型', combinationReferenceModels: '参考模型', combinationReferenceModel: '参考模型', combinationAddReference: '添加参考模型', combinationAggregator: '汇总模型', combinationReferenceTemperature: '参考温度', combinationAggregatorTemperature: '汇总温度', combinationMaxTokens: '最大 Token', combinationNotSet: '未设置', combinationSaved: '组合模型已保存', combinationLoadFailed: '加载组合模型失败', combinationSaveFailed: '保存组合模型失败', combinationPresetExists: '预设已存在', combinationNameRequired: '请输入组合模型名称', combinationNameInvalid: '名称只能包含字母、数字、下划线、短横线和点', combinationReferenceRequired: '至少添加一个参考模型', combinationAggregatorRequired: '请选择汇总模型', auxiliaryRefresh: '刷新', auxiliaryTask: '任务', auxiliaryTimeout: '超时', auxiliaryDownloadTimeout: '下载超时', auxiliaryActions: '操作', auxiliaryDefault: '默认', auxiliaryCustomEndpoint: '自定义端点', auxiliaryProviderAuto: '自动', auxiliaryProviderMain: '主模型', auxiliaryProviderPlaceholder: 'auto、main 或 provider key', auxiliaryDownloadShort: '下载', auxiliaryExtraBody: 'Extra body JSON', auxiliaryClear: '清除', auxiliarySaved: '辅助模型已保存', auxiliaryLoadFailed: '加载辅助模型失败', auxiliarySaveFailed: '保存辅助模型失败', auxiliaryInvalidExtraBody: 'Extra body 必须是 JSON 对象', auxiliaryTaskCompression: '压缩', auxiliaryTaskVision: '视觉', auxiliaryTaskWebExtract: '网页提取', auxiliaryTaskSkillsHub: '技能中心', auxiliaryTaskApproval: '审批', auxiliaryTaskMcp: 'MCP', auxiliaryTaskTitleGeneration: '标题生成', auxiliaryTaskTriageSpecifier: 'Triage 扩写', auxiliaryTaskKanbanDecomposer: '看板拆解', auxiliaryTaskProfileDescriber: 'Profile 描述', auxiliaryTaskCurator: '策展', auxiliaryTaskSessionSearch: '会话搜索', auxiliaryTaskFlushMemories: '写入记忆', currentDefault: '当前默认', defaultShort: '默认', setDefaultProvider: '设为默认 Provider', setDefault: '设为默认', builtIn: '内置', customType: '自定义', provider: 'Provider', contextLength: '上下文长度', contextLengthPlaceholder: '例如 256000(可选)', apiMode: 'API 模式', local: '本地 ({host})', selectProviderRequired: '请选择 Provider', baseUrlRequired: 'Base URL 为必填项', apiKeyRequired: 'API Key 为必填项', modelRequired: '默认模型为必填项', enterBaseUrl: '请先输入 Base URL', unexpectedFormat: '响应格式异常', foundModels: '找到 {count} 个模型', fetchFailed: '获取模型失败', }, // 配置 profiles: { title: '配置', create: '创建配置', import: '导入', export: '导出', rename: '重命名', delete: '删除', editConfig: '编辑配置文件', switchTo: '切换 Hermes Profile', switchConfirm: '将执行 `hermes profile use {name}` 并切换 Hermes CLI 的 active profile,是否继续?', switchSuccess: 'Hermes active profile 已切换为 "{name}"', switchFailed: '切换 Hermes Profile 失败,网关可能需要手动重启', createSuccess: '配置 "{name}" 已创建', createFailed: '创建配置失败', renameSuccess: '配置已重命名', renameFailed: '重命名配置失败', deleteConfirm: '确定删除配置 "{name}" 吗?', deleteSuccess: '配置已删除', deleteFailed: '删除配置失败', exportSuccess: '配置已导出', exportFailed: '导出配置失败', importSuccess: '配置已导入', importFailed: '导入配置失败', importSelectFile: '选择归档文件', importInvalidFile: '请选择有效的归档文件 (.tar.gz, .tgz, .gz, .zip)', name: '配置名称', namePlaceholder: '仅限小写字母、数字、连字符', nameValidation: '配置名称只能包含小写字母、数字、下划线和连字符', newName: '新名称', newNamePlaceholder: '小写字母、数字、连字符', cloneFromCurrent: '从当前配置克隆', cloneCleanupNotice: '克隆时会自动跳过独占型平台凭据(Weixin / Telegram / Slack 等),避免与源配置冲突', cloneStrippedCredentials: '已清理 {count} 项独占凭据:{list}', cloneDisabledPlatforms: '已禁用 {count} 个平台:{list}', cloneStrippedConfigCredentials: '已清理 config.yaml 中 {count} 项内嵌凭据:{list}', archivePath: '归档路径', archivePathPlaceholder: '归档文件的服务器路径', importName: '配置名称(可选)', importNamePlaceholder: '留空则使用归档名称', active: '活跃', model: '模型', gateway: '网关', alias: '别名', provider: 'Provider', path: '路径', skills: '技能', hasEnv: '有 .env', hasSoulMd: '有 soul.md', noProfiles: '暂无配置,创建一个开始吧。', avatar: { title: '自定义头像', customize: '头像', upload: '上传图片', random: '随机生成', reset: '恢复默认', hint: '支持 PNG、JPEG、WebP,最大 1MB', invalidType: '请选择 PNG、JPEG 或 WebP 图片', tooLarge: '头像图片不能超过 1MB', saveSuccess: '头像已保存', saveFailed: '保存头像失败', resetSuccess: '已恢复默认头像', resetFailed: '恢复默认头像失败', }, runtime: { activeProfile: '当前:{name}', bridgeWorker: '桥接状态', gateway: '网关', active: '活跃', activeTag: '当前', idle: '空闲', checking: '检测中', running: '运行中', stopped: '已停止', restartGateway: '重启网关', restartProfile: '重启配置', switchProfile: '切换前端配置', gatewayRestarted: '网关已重启:{name}', gatewayRestartFailed: '重启网关失败', profileRestarted: '配置已重启:{name}', profileRestartFailed: '重启配置失败', restartAllGateways: '重启所有网关', restartAllProfiles: '重启所有配置', allGatewaysRestarted: '所有网关已重启', allGatewaysRestartFailed: '部分网关重启失败:{names}', allProfilesRestarted: '所有配置已重启', allProfilesRestartFailed: '部分配置重启失败:{names}', }, }, // 日志 logs: { title: '日志', all: '全部', searchPlaceholder: '搜索...', refresh: '刷新', noEntries: '暂无日志', total: '总数', error: 'ERROR', warning: 'WARNING', info: 'INFO', stream: '日志流', window: '当前窗口', }, // 设置 settings: { title: '设置', paneUnit: '个面板', saved: '已保存', saveFailed: '保存失败', tabs: { display: '显示', account: '当前账户', users: '账户管理', agent: '网关', proxy: '代理', memory: '记忆', compression: '上下文压缩', session: '会话', privacy: '隐私', apiServer: 'API 服务器', models: '模型', voice: '语音', }, models: { apiKey: 'API Key', apiKeyPlaceholder: '输入 API Key', save: '保存', saved: '已保存', saveFailed: '保存失败', noProviders: '暂无已配置的模型', }, display: { streaming: '流式响应', streamingHint: '实时显示 AI 回复', compact: '紧凑模式', compactHint: '减少消息间距', showReasoning: '显示推理过程', showReasoningHint: '展示模型思考过程', showCost: '显示费用', showCostHint: '在回复中显示 token 使用量', inlineDiffs: '内联差异', inlineDiffsHint: '代码变更以内联方式显示', bellOnComplete: '完成提示音', bellOnCompleteHint: 'AI 回复完成时播放提示音', notifyOnComplete: '完成弹窗通知', notifyOnCompleteHint: 'AI 回复完成时显示系统通知', notifyOnCompleteMacHint: 'macOS 需要在系统设置里允许浏览器通知。', notifyOnCompleteDenied: '通知权限已被拒绝', notifyOnCompleteInsecure: '浏览器通知需要 HTTPS 或 localhost', notifyOnCompleteUnsupported: '当前浏览器不支持通知', notifyOnCompleteTest: '通知已开启。', notifyOnCompleteTestButton: '测试', notifyOnCompleteTesting: '正在发送测试通知...', notifyOnCompleteTestSent: '测试通知已发送', notifyOnCompleteTestFailed: '测试通知发送失败', busyInputMode: '忙碌输入模式', busyInputModeHint: 'AI 处理中仍可输入', chatInputHeight: '聊天输入框高度', chatInputHeightHint: '桌面端聊天输入框默认高度(像素)。移动端保持自动高度。' }, agent: { maxTurns: '最大轮次', maxTurnsHint: '单次对话最大交互轮数', gatewayTimeout: '网关超时', gatewayTimeoutHint: '单次请求超时时间(秒)', restartDrainTimeout: '重启排空超时', restartDrainTimeoutHint: '重启前排空请求的超时时间(秒)', toolEnforcement: '工具执行策略', toolEnforcementHint: '控制工具调用的执行模式', auto: '自动', always: '始终', never: '从不', }, gatewayAutoStart: { title: 'Gateway 自动启动', description: '控制 Web UI 启动时自动拉起哪些本地 Hermes profile gateway。该项写入 Web UI 配置,不写入 profile config.yaml。', enabled: '自动启动 gateway', enabledHint: '关闭后,启动期不会自动拉起任何 profile gateway。', management: '统一 gateway', managementHint: '需要 Hermes Agent 0.17.0 及以上版本。开启后会写入 multiplex_profiles,让 default gateway 服务所有 profiles;其他 profile 不能单独配置飞书、微信、QQBot 等通讯工具入口。关闭后会移除该配置。', managementAuto: '自动', managementPerProfile: '每个 profile 一个 gateway', managementUnified: '统一 default gateway', mode: 'Profile 策略', modeHint: '启动所有发现到的 profiles,或只启动白名单内的 profiles。', modeAll: '所有发现到的 profiles', modeInclude: '仅白名单 profiles', include: '白名单 profiles', includeHint: '逗号分隔 profile 名。白名单模式下留空表示不自动启动任何 profile。', exclude: '排除 profiles', excludeHint: '逗号分隔 profile 名;会在白名单/全量策略之后再排除。', profileListPlaceholder: 'default, reviewer', }, proxy: { title: 'Gateway 代理', description: '为当前 profile gateway 设置代理环境变量。保存后会重启 gateway,让通讯平台使用新的网络配置。', httpsProxy: 'HTTPS_PROXY', httpsProxyHint: 'HTTPS 请求代理,通常优先配置这一项。', httpProxy: 'HTTP_PROXY', httpProxyHint: '普通 HTTP 请求代理。', allProxy: 'ALL_PROXY', allProxyHint: '未设置协议专用代理时使用的兜底代理。', noProxy: 'NO_PROXY', noProxyHint: '不走代理的主机或域名,使用逗号分隔。', save: '保存代理设置', }, memory: { enabled: '启用记忆', enabledHint: '允许 AI 记住对话上下文', userProfile: '用户画像', userProfileHint: '允许 AI 记住用户偏好信息', charLimit: '记忆字符上限', charLimitHint: 'MEMORY.md 最大字符数', userCharLimit: '用户画像字符上限', userCharLimitHint: 'USER.md 最大字符数', }, compression: { enabled: '启用压缩', enabledHint: '长对话接近模型上下文上限前自动压缩历史', threshold: '压缩阈值', thresholdHint: '预计 token 超过上下文比例时开始压缩', targetRatio: '目标比例', targetRatioHint: '压缩后历史保留到上下文的目标比例', protectLastN: '保护最近消息', protectLastNHint: '最近多少条消息不参与压缩', protectFirstN: '保护开头消息', protectFirstNHint: '最早多少条消息不参与压缩', }, session: { mode: '重置模式', modeHint: '会话重置的触发条件', modeBoth: '空闲 + 定时', modeIdle: '仅空闲', modeDaily: '仅定时', modeNone: '永不(仅手动)', idleMinutes: '空闲超时', idleMinutesHint: '无操作后自动重置的等待时间(分钟)', atHour: '定时重置时间', humanOnly: '仅显示人类会话', humanOnlyHint: '默认隐藏子代理和会话监看噪音', liveMonitorHumanOnly: '实时监看:仅显示人类会话', liveMonitorHumanOnlyHint: '在实时监看中默认隐藏子代理和会话监看噪音', atHourHint: '每天在指定小时重置会话', requireAuth: '会话授权', requireAuthHint: '修改会话操作是否授权', memoryWriteApproval: '记忆写入审核', memoryWriteApprovalHint: 'Hermes Agent 写入 MEMORY.md / USER.md 前先进入待审核队列。', skillsWriteApproval: '技能写入审核', skillsWriteApprovalHint: 'Hermes Agent 创建或修改技能前先进入待审核队列。', writeApprovalTitle: '待审核写入', writeApprovalDescription: '批准或拒绝 Hermes Agent 暂存的记忆和技能写入。', writeApprovalRefresh: '刷新', writeApprovalEmpty: '暂无待审核写入。', writeApprovalMemory: '记忆', writeApprovalSkills: '技能', writeApprovalViewDiff: '查看', writeApprovalHideDiff: '收起', writeApprovalNoDiff: '没有可显示的差异。', writeApprovalLoadFailed: '待审核写入加载失败', writeApprovalDiffFailed: '写入详情加载失败', writeApprovalActionFailed: '待审核写入处理失败', writeApprovalApproved: '已批准写入', writeApprovalRejected: '已拒绝写入', writeApprovalApprove: '批准', writeApprovalReject: '拒绝', writeApprovalPendingMemoryWrite: '待审核记忆写入', writeApprovalCurrentFile: '当前 {file}', writeApprovalProposedFile: '批准后 {file}', writeApprovalDiffSection: '差异', writeApprovalPatchOldStringMissing: '当前文件 {file} 中没有找到这次补丁的 old_string,批准后的文件内容不会变化。', writeApprovalRequestedOldString: '本次请求匹配的 old_string', writeApprovalCurrentReadFailed: '当前文件 {file} 无法按 UTF-8 文本读取。', writeApprovalDeleteSkill: '这次审批会删除技能 {skill}。', writeApprovalRemoveFile: '这次审批会从技能 {skill} 中移除文件 {file}。', }, privacy: { redactPii: '脱敏 PII', redactPiiHint: '自动检测并隐藏敏感信息(密码、密钥等)', }, apiServer: { enable: '启用', enableHint: '启用 API 服务器', host: '主机', hostHint: '监听地址', port: '端口', portHint: '监听端口', key: '密钥', keyHint: 'API 访问密钥', cors: 'CORS 来源', corsHint: '允许的跨域来源', }, lockedIps: { title: '锁定 IP 管理', count: '{count} 个 IP 被锁定', empty: '暂无锁定 IP', unlock: '解锁', unlockAll: '全部解锁', unlockAllConfirm: '确认解锁所有锁定的 IP?', unlocked: 'IP 已解锁', allUnlocked: '已解锁 {count} 个 IP', type: { password: '密码', token: 'API Token', pairing: '设备配对', }, }, userAvatar: { title: '用户头像', upload: '上传图片', random: '随机生成', reset: '恢复默认', hint: '支持 PNG、JPEG、WebP,最大 1MB,会自动压缩到 500KB 以下', invalidType: '请选择 PNG、JPEG 或 WebP 图片', tooLarge: '头像图片不能超过 1MB', saveSuccess: '头像已保存', saveFailed: '保存头像失败', resetSuccess: '已恢复默认头像', resetFailed: '恢复默认头像失败', }, voice: { activeTtsApi: '当前 TTS API', activeSttApi: '当前 STT API', ttsProvidersTitle: 'TTS 提供方', ttsProvidersDescription: '管理用于播放助手回复和语音预览的文字转语音集成。', sttProvidersTitle: 'STT 提供方', sttProvidersDescription: '管理用于麦克风和语音输入流程的语音转文字集成。', noneSelected: '未选择', keyStored: '已存储', keyMissing: '未配置', customApi: 'API', localBuiltin: '本地内置', ttsCardHint: '语音合成提供方', sttCardHint: '语音转写提供方', setActive: '设为当前', testAction: '测试', connect: '连接', presetEdgeTtsLabel: 'Edge TTS', presetEdgeTtsDescription: 'Microsoft Edge 提供的免费高质量云端音色。', presetOpenaiTtsLabel: 'OpenAI TTS', presetMimoTtsLabel: 'MiMo TTS', presetDoubaoTtsLabel: 'Volcengine Doubao TTS', presetCustomTtsLabel: '自定义 TTS', presetBrowserSttLabel: '浏览器 STT', presetBrowserSttDescription: '浏览器原生语音识别 API。', presetOpenaiWhisperLabel: 'OpenAI Whisper', presetGroqSttLabel: 'Groq STT', presetDoubaoSttLabel: 'Volcengine Doubao STT', presetCustomSttLabel: '自定义 STT', apiCompatibility: 'API 兼容性', openaiCompatible: 'OpenAI 兼容', manualCustomEndpoint: '手动自定义端点', connectionStep: '连接', discoveryManualHint: '已选择手动自定义端点,无法自动发现模型;请手动输入模型名称。', discoveryCredentialHint: '输入 Base URL 和 API key 后,点击连接获取可用模型。', discoveryNoAutoProbeHint: '输入过程中不会发送请求;凭据准备好后点击连接。', apiKeyConnectPlaceholder: '粘贴 API key 后连接;已存储的 key 不会显示', connectFetchModels: '连接并获取模型', modelRecommendedSuffix: '推荐', modelConnectManualHint: '连接后自动填充,或手动输入。', modelRequiredConnectManual: '模型必填。请连接后自动填充,或手动输入。', apiKeyRequired: 'API key 必填。', apiKeyRequiredForDiscovery: '获取模型需要 API key。', baseUrlRequired: 'Base URL 必填。', baseUrlHttpsRequired: '请使用 http:// 或 https:// 协议。', baseUrlInvalid: '请输入有效的 Base URL,包含 https://。', discoveryFailedManualFallback: '无法获取模型。你仍可以手动输入模型名称。', completeRequiredProviderFields: '保存前请补全必填 provider 字段。', fetchingModels: '正在获取模型……', recommendedModel: '推荐:{model}。', useRecommendedModel: '使用此模型。', modelsDiscovered: '已发现 {count} 个模型。字段为空时会自动选择推荐模型。', remove: '移除', testSuccess: '测试完成', testTextRequired: '测试前请输入文本。', keyMissingForTest: '测试此提供方前请先添加 API key。', testing: '测试中……', transcribing: '转写中……', browserSttTestHint: '浏览器 STT 请在聊天输入框麦克风中测试。', sttEmptyAudio: '未录到音频,请重试。', sttTestSuccess: '转写完成', sttRecordingHint: '正在录音……点击停止后转写。', keepStoredKeyPlaceholder: '留空则保留已存储 key', apiKeyPlaceholder: '输入 API key', lastTest: '最近测试', notTested: '—', recording: '录音中', testFailedShort: '失败', testFailedSummary: '测试失败,请检查 provider 设置后重试。', showDetails: '显示详情', hideDetails: '隐藏详情', moreActions: '更多', moreActionsFor: '{provider} 的更多操作', addTtsApi: '添加 TTS API', addSttApi: '添加 STT API', active: '当前', builtin: '内置', connected: '已连接', disconnected: '未连接', source: '来源', model: '模型', voice: '音色', doubaoVoiceHint: '选择 Seed TTS 2.0 音色;资源字段会自动更新。', apiKey: 'API key', confirmDeleteSecret: '确认删除这个语音 API 已存储的 API key?', ttsTitle: '文字转语音', ttsSaved: 'TTS 设置已保存到服务端', ttsSaveFailed: '保存 TTS 设置失败', ttsTestSaved: '试听成功,TTS 设置已保存到服务端', ttsTestSaving: '正在保存 TTS 配置后再试听…', ttsMissingBaseUrl: '试听前需要填写基础 URL。请输入服务商 endpoint 后再测试。', ttsMissingApiKey: '试听前需要 API key。请粘贴 key,或先保存服务端已存 key。', ttsCleared: '已清除服务端 TTS 密钥', ttsClearFailed: '清除服务端 TTS 密钥失败', storedBaseUrlsTitle: '已存 Base URLs', storedBaseUrlsHint: '这里集中管理已保存的语音 provider endpoint。上方输入框只清除当前值,删除已存 URL 在这里操作。', storedBaseUrlsEmpty: '服务端还没有保存自定义语音 Base URL。', storedBaseUrlDelete: '删除 URL', storedApiKeysTitle: '已存 API keys', storedApiKeysHint: '这里列出服务端已保存的语音 API key,只显示用途和来源,不显示完整 key。', storedApiKeysEmpty: '服务端还没有保存语音 API key。', storedKeyKindTts: 'TTS', storedKeyKindStt: 'STT', storedApiKeyMasked: '[已存储]', storedApiKeyDelete: '删除 key', baseUrlPresetClear: '清除 URL', baseUrlPresetCleared: '已清除当前 Base URL。', baseUrlPresetDelete: '删除 URL', baseUrlPresetDeleted: '已从保存列表删除基础 URL。', baseUrlPresetDeleteFailed: '删除已保存基础 URL 失败。', ttsPendingSecret: '将保存新密钥', ttsStoredSecret: '服务端已有储密钥:{value}', ttsClearKey: '清除已存储密钥', sttTitle: '语音转文字', sttProvider: 'STT 提供方', sttProviderHint: '选择语音输入的转写方式', sttProviderBrowser: '浏览器', sttProviderOpenai: 'OpenAI 兼容', sttProviderCustom: '自定义', sttBrowserHint: '可用时使用浏览器内置语音识别。', sttApiKey: 'API Key', sttApiKeyHint: '仅在服务端保存,用于需要鉴权的 STT 提供方。', sttStoredSecret: '服务端已存储密钥:{value}', sttPendingSecret: '服务端已存储密钥:保存后更新', sttClearKey: '清除已存储密钥', sttModel: '模型', sttModelHint: '用于语音转文字的模型。', sttLanguage: '语言', sttLanguageHint: '可选语言提示,例如 en 或 zh。', sttPrompt: '提示词', sttPromptHint: '可选转写提示词。', sttAudioTranscode: '音频转码', sttAudioTranscodeNone: '发送原始音频', sttAudioTranscodeFfmpeg: '使用 ffmpeg 转为 WAV', sttBaseUrl: '基础 URL', sttBaseUrlHint: '自定义 OpenAI 兼容语音转文字端点。', sttSave: '保存 STT 设置', sttSaved: 'STT 设置已保存到服务端。', sttSaveFailed: '保存 STT 设置失败。', sttCleared: '服务端已存储的 STT 密钥已清除。', sttClearFailed: '清除服务端已存储的 STT 密钥失败。', sttActiveSaved: '当前 STT 提供方已保存到服务端。', sttSaveActive: '保存当前 STT 提供方', sttEndpointHint: '最终转写 endpoint:{endpoint}', sttTestTitle: '测试语音转文字', sttTestButton: '测试 STT API', sttTestStopButton: '停止并转写', sttTestBackendOnly: 'STT API 测试仅适用于 OpenAI 兼容和自定义提供方。', sttTestRecording: '正在录制测试音频……录完后点击停止并转写。', sttTestTranscribing: '正在转写测试音频……', sttTestEmpty: '没有录到可用于 STT 测试的音频。', sttTestSucceeded: 'STT 测试成功。', sttTestFailed: 'STT 测试失败:{error} —— {hint}', sttFailureHintMissingConfig: '请确认已保存 provider 的 Base URL、模型和 API key 后再测试。', sttFailureHintAuth: '请检查 API key;如果页面显示已储存 key,请重新粘贴当前 key 并保存后再测。', sttFailureHintForbidden: 'key 已到达供应商但没有该 STT 模型/账号权限,请检查 provider 权限、额度或 billing。', sttFailureHintEndpointModel: '请检查 Base URL 和模型。Groq 建议使用 {endpoint},模型用 whisper-large-v3-turbo 或其他 Groq STT 模型。', sttFailureHintModel: '请检查所选 STT 模型是否存在,并且当前账号有权限使用。', sttFailureHintQuota: '供应商返回额度、billing 或限流问题,请检查账号额度/billing,或稍后重试。', sttFailureHintNetworkCustom: 'Web UI server 无法访问 custom STT endpoint。请确认 {endpoint} 可从服务器访问,并兼容 OpenAI audio/transcriptions。', sttFailureHintNetwork: 'Web UI server 无法访问 STT provider,请检查网络、代理或防火墙后重试。', sttFailureHintAudio: '录音为空或音频格式被拒绝。请允许麦克风权限,录一段清晰短句,或换 Chrome 重试。', sttFailureHintGenericCustom: '请检查 API key、Base URL、模型,以及最终 endpoint {endpoint}。', sttFailureHintGeneric: '请检查 API key、模型和 provider 账号权限后重试。', sttTestRecordFailed: '无法开始麦克风录音:{error}', sttTestTranscript: '转写结果:{text}', ttsProvider: 'TTS 提供者', ttsProviderHint: '选择消息朗读使用的语音引擎', providerWebSpeech: 'WebSpeech API(浏览器内置)', providerOpenai: 'OpenAI TTS', providerCustom: '自定义端点(兼容 OpenAI)', providerEdge: 'Edge TTS(免费,无需 API Key)', // WebSpeech webspeechVoice: '音色', webspeechVoiceHint: '从浏览器或系统提供的语音中选择', webspeechVoicePlaceholder: '自动(默认语音)', // OpenAI openaiKey: 'API 密钥', openaiKeyHint: '具有 TTS 权限的 OpenAI API Key', openaiUrl: 'API 基础地址', openaiUrlHint: '例如 https://api.openai.com/v1/audio/speech', openaiModel: '模型', openaiModelHint: 'tts-1(快速)/ tts-1-hd(高音质)', openaiVoice: '音色', openaiVoiceHint: '用于语音合成的音色', // 自定义端点 customHint: '支持任何 OpenAI 兼容的 TTS 服务——可用于 GPT-SoVITS、CosyVoice 等自部署服务。', customUrl: 'API 地址', customUrlHint: 'TTS 服务的完整基础地址', customUrlPlaceholder: '本地适配器中配置的地址 如:http://127.0.0.1:9880', customApiKey: 'API 密钥(可选)', customApiKeyHint: '部分自部署服务需要身份验证', customApiKeyPlaceholder: '不需要则留空', // Edge TTS edgeHint: '由 Microsoft Edge TTS 驱动(node-edge-tts)。', edgeUrl: '适配器地址', edgeUrlHint: 'Edge TTS 适配器地址,例如 http://127.0.0.1:9882', edgeUrlPlaceholder: 'http://127.0.0.1:9882', edgeVoice: '音色', edgeVoiceHint: '选择用于语音合成的音色', edgeRate: '语速', edgeRateHint: '调整语音速度(0.5~2.0 倍)', edgePitch: '音调', edgePitchHint: '调整语音音调(-20~+20 Hz)', // 试听 testTitle: '试听测试', testText: '测试文本', testTextPlaceholder: '输入测试文本...', testTextDefault: '你好,这是一个语音测试。', testButton: '试听', testButtonPlaying: '播放中...', testFailed: '测试失败:{error}', // MiMo TTS providerMimo: 'MiMo TTS', mimoHint: '小米 MiMo TTS,支持预置音色、音色设计、音色复刻三种模式', mimoApiKey: 'API Key', mimoApiKeyHint: '在 platform.xiaomimimo.com 获取', mimoApiKeyPlaceholder: 'MiMo API Key', mimoAuthMode: '认证方式', mimoAuthModeHint: '所选 MiMo 端点要求的鉴权请求头格式', mimoAuthModeBearer: 'Bearer Token(Authorization)', mimoAuthModeApiKey: 'API Key 请求头(api-key)', mimoAuthModeBoth: '同时发送两种请求头', mimoBaseUrl: 'Base URL', mimoBaseUrlHint: 'MiMo API 端点地址', mimoModel: '模型', mimoModelHint: '选择语音合成模型', mimoModelPreset: '预置音色', mimoModelVoiceDesign: '音色设计', mimoModelVoiceClone: '音色复刻', mimoVoice: '音色', mimoVoiceHint: '选择预置音色', mimoVoiceDesignPrompt: '音色描述', mimoVoiceDesignPromptHint: '描述你想要的音色特征', mimoVoiceDesignPromptPlaceholder: '例如:温柔的年轻女声,语速稍慢,带着磁性', mimoCloneAudio: '上传音频', mimoCloneAudioHint: '上传音频样本用于音色复刻,支持 mp3/wav,最大 10MB', mimoCloneAudioUpload: '选择文件', mimoCloneAudioClear: '清除音频', mimoStylePrompt: '风格指令', mimoStylePromptHint: '可选,用自然语言描述语音风格', mimoStylePromptPlaceholder: '例如:用轻快上扬的语调,语速稍快', }, }, githubPreview: { title: "版本预览", description: "将选中的 GitHub tag 克隆到 Web UI 预览工作目录,安装依赖并以开发端口运行。", refresh: "刷新", selectTag: "选择 tag", prepare: "准备代码", install: "安装依赖", start: "开启预览", stop: "停止", note: "预览代码存放在 Web UI 数据目录下。正式环境仍使用 8648,预览开发环境使用前端 8651、后端 8650。", path: "预览路径", webuiHome: "预览数据目录", currentTag: "当前 Tag", repoReady: "仓库就绪", dependencies: "依赖已安装", running: "运行状态", notRunning: "未运行", open: "打开预览", log: "操作日志路径", logOutput: "日志输出", actionLog: "操作日志", devLog: "开发服务日志", yes: "是", no: "否", actionFailed: "操作失败", nodeEnvironmentMissing: "未检测到可用的 Node/npm 环境,请先安装 Node.js 后重试。", prepareSuccess: "预览代码已准备好", installSuccess: "依赖安装完成", startSuccess: "预览已完成", stopSuccess: "预览已停止", }, // 平台频道设置 platform: { requireMention: "需要 {'@'}提及", requireMentionGroup: "群组中需要 {'@'}机器人 才会响应", requireMentionChannel: "频道中需要 {'@'}机器人 才会响应", requireMentionRoom: "房间中需要 {'@'}机器人 才会响应", reactions: '表情回应', reactionsHint: '对消息添加表情回应', freeResponseChats: '自由响应聊天', freeResponseChatsHint: "不需要 {'@'}提及即响应的聊天 ID(逗号分隔)", freeResponseChannels: '自由响应频道', freeResponseChannelsHint: "不需要 {'@'}提及即响应的频道 ID(逗号分隔)", freeResponseRooms: '自由响应房间', freeResponseRoomsHint: "不需要 {'@'}提及即响应的房间 ID(逗号分隔)", mentionPatterns: '自定义提及模式', mentionPatternsHint: '额外的触发模式列表', autoThread: '自动创建线程', autoThreadHint: "{'@'}提及 后自动创建回复线程", autoThreadHintRoom: '在房间中自动创建回复线程', dmMentionThreads: 'DM 提及线程', dmMentionThreadsHint: '在私聊中也使用线程回复提及', allowBots: '允许机器人消息', allowBotsHint: '响应其他机器人发送的消息', allowedChannels: '允许的频道', allowedChannelsHint: '白名单频道 ID(逗号分隔)', ignoredChannels: '忽略的频道', ignoredChannelsHint: '不响应的频道 ID(逗号分隔)', noThreadChannels: '无线程频道', noThreadChannelsHint: '不创建线程的频道 ID(逗号分隔)', exclusiveTokenWarning: '此平台使用独占 token 锁。每个 profile 必须使用不同的身份 token,否则会与其他 profile 冲突导致 gateway 启动失败。', botToken: 'Bot Token', botTokenHint: '开发者门户获取的 Bot Token', proxyUrl: '代理 URL', proxyUrlHint: '可选的平台专用代理,支持 http://、https:// 和 socks5://', accessToken: 'Access Token', accessTokenHint: 'Matrix Access Token', homeserver: 'Homeserver URL', homeserverHint: 'Matrix 服务器地址', matrixUserId: 'Matrix 用户 ID', matrixUserIdHint: '密码登录必填;Access Token 登录可选', matrixPassword: 'Matrix 密码', matrixPasswordHint: '可替代 Access Token 的登录密码', appId: 'App ID', appIdHint: '飞书 App ID', appSecret: 'App Secret', appSecretHint: '飞书 App Secret', encryptKey: '加密密钥', encryptKeyHint: '飞书加密密钥', verificationToken: '验证令牌', verificationTokenHint: '飞书验证令牌', clientId: 'Client ID', clientIdHint: '钉钉 Client ID', clientSecret: 'Client Secret', clientSecretHint: '钉钉 Client Secret', cardTemplateId: 'AI 卡片模板 ID', cardTemplateIdHint: '钉钉 AI 卡片模板 ID;留空则不启用 AI 卡片', allowedUsers: '允许用户', allowedUsersHint: '用户 ID 或 OpenID 白名单,多个用英文逗号分隔', allowAllUsers: '允许所有用户', allowAllUsersHint: '允许任意用户发起消息;关闭后使用白名单', botId: 'Bot ID', botIdHint: '企业微信 Bot ID', wecomSecretHint: '企业微信 Bot Secret', waEnabled: '启用 WhatsApp', waEnabledHint: '通过二维码配对启用 WhatsApp', weixinToken: '微信 Token', weixinTokenHint: '通过 weixin CLI 扫码登录获取 (hermes weixin)', accountId: 'Account ID', accountIdHint: '微信 Account ID', qrLogin: '扫码登录', qrRelogin: '重新登录', qrFetching: '正在获取二维码...', qrScanHint: '使用微信扫描二维码登录', qrScanedHint: '已扫描,请在手机上确认...', // QQ qqAppId: 'App ID', qqAppIdHint: 'QQ 开放平台机器人 App ID', qqAppSecret: 'App Secret', qqAppSecretHint: 'QQ 开放平台机器人 App Secret', qqMarkdown: 'Markdown 支持', qqMarkdownHint: '启用 Markdown 格式消息(部分客户端可能不支持)', qqSandbox: '沙箱模式', qqSandboxHint: '启用沙箱环境(测试用)', qqQrScanHint: '使用 QQ 扫描上方二维码,或在手机上打开链接完成绑定', }, // 网关 gateways: { title: '网关', running: '运行中', stopped: '已停止', started: '已启动', startFailed: '启动失败', stopFailed: '停止失败', }, // 语言 language: { label: '语言', zh: '中文', en: 'English', }, // 终端 terminal: { sessions: '会话', newTab: '新建终端', closeSession: '关闭此会话?', sessionExited: '已退出', processExited: '进程已退出,代码 {code}', noSessions: '暂无终端会话', connectionFailed: '终端服务连接失败', connectionClosed: '终端连接已关闭', connectionError: '终端连接错误', }, // 群聊 groupChat: { title: '群聊', createRoom: '创建房间', joinByCode: '通过邀请码加入', roomName: '房间名称', roomNamePlaceholder: '输入房间名称', inviteCode: '邀请码', autoGenerate: '自动生成', noRooms: '暂无房间', selectOrCreate: '选择或创建一个房间开始聊天', agents: '智能体', addAgent: '添加智能体', selectProfile: '选择一个配置', agentAdded: '智能体已添加', selectRoomFirst: '请先选择一个群组', agentAlreadyInRoom: '该智能体已在房间中', agentAddFailedCount: '{count} 个智能体未添加:{details}', noAgents: '当前房间暂无智能体', members: '成员', roomCreated: '房间已创建', roomDeleted: '房间已删除', roomCloned: '房间已克隆', cloneRoom: '克隆房间', copyRoomLink: '复制房间链接', deleteRoomConfirm: '确定删除这个房间吗?', clearContext: '清理上下文', clearContextConfirm: '确定清理当前房间上下文吗?消息和压缩快照会被删除,智能体和成员会保留。', contextCleared: '上下文已清理', you: '你', joined: '已加入房间', joinFailed: '加入房间失败', inputPlaceholder: '输入消息... (Enter 发送)', messageDisplayLimit: '群聊最多展示 600 条消息', enterCode: '输入邀请码', yourName: '你的名称', yourNamePlaceholder: '输入你的群聊昵称', yourDescription: '自我描述(选填)', yourDescriptionPlaceholder: '介绍一下你自己...', agentName: 'Agent 名称', agentNamePlaceholder: '自定义名称(留空则使用 profile 名称)', agentDesc: 'Agent 描述', agentDescPlaceholder: '描述这个 agent 的作用...', agentReplying: '正在回复...', agentCompressing: '正在压缩上下文...', compressionSettings: '压缩设置', triggerTokens: '触发压缩 Token 数', triggerTokensDesc: '消息 token 数超过此值时触发上下文压缩', maxHistoryTokens: '最大历史 Token 数', maxHistoryTokensDesc: '压缩后发送给 LLM 的最大 token 数', tailMessageCount: '保留最近消息数', tailMessageCountDesc: '压缩后保留最近的原始消息条数', compressionConfig: '压缩配置', compressionSaved: '压缩配置已保存', compressNow: '立即压缩', compressingInProgress: '正在压缩中,请稍后', }, // 用量统计 usage: { title: '用量统计', refresh: '刷新', totalTokens: '总 Token 数', inputTokens: '输入', outputTokens: '输出', totalSessions: '总会话数', avgPerDay: '日均 ~{n}', estimatedCost: '预估费用', cacheHitRate: '缓存命中率', modelBreakdown: '模型分布', agentBreakdown: 'Agent 分布', agents: { hermes: 'Hermes Agent', unknown: '未知' }, dailyTrend: '每日用量', date: '日期', tokens: 'Token', cache: '缓存', cacheRead: '缓存读取', cacheWrite: '缓存写入', sessions: '会话', cost: '费用', noData: '暂无用量数据', }, skillsUsage: { title: '技能用量', subtitle: '跟踪 Hermes 会话中的技能加载和编辑', refresh: '刷新', periodSelector: '技能用量周期', periodLabel: '{days}天', summary: '概览', totalActions: '操作', loads: '加载', edits: '编辑', distinctSkills: '技能数', topSkills: '热门', dailyTrend: '趋势', periodSummary: '最近 {days} 天', skill: '技能', share: '占比', lastUsed: '最近', noData: '暂无技能用量数据', loadFailed: '技能用量加载失败', otherSkills: '其他技能', }, // 文件管理 files: { title: '文件', fileTree: '文件树', tree: '目录树', list: '文件列表', breadcrumbRoot: '根目录', newFile: '新建文件', newFolder: '新建文件夹', upload: '上传', refresh: '刷新', open: '打开', edit: '编辑', preview: '预览', download: '下载', copyPath: '复制路径', rename: '重命名', delete: '删除', name: '名称', size: '大小', modified: '修改时间', actions: '操作', emptyDir: '空目录', loading: '加载中...', confirmDelete: '确定要删除「{name}」吗?', confirmDeleteDir: '确定要删除目录「{name}」及其所有内容吗?', deleteFailed: '删除失败', deleted: '已删除', renameTo: '重命名为', newFileName: '文件名', newFolderName: '文件夹名', created: '已创建', createFailed: '创建失败', renamed: '已重命名', renameFailed: '重命名失败', uploadSuccess: '已上传 {count} 个文件', uploadFailed: '上传失败', saveFailed: '保存失败', saved: '已保存', unsavedChanges: '有未保存的更改,是否丢弃?', pathCopied: '路径已复制', fileTooLarge: '文件过大(最大 10MB)', permissionDenied: '无法修改受保护的文件', notFound: '文件或目录不存在', backendError: '文件操作失败', dragDropHint: '拖拽文件到此处上传', closeEditor: '关闭编辑器', closePreview: '关闭', saveFile: '保存', }, // 下载 download: { downloading: '正在下载...', downloadFailed: '下载失败', fileNotFound: '文件不存在或已被删除', fileTooLarge: '文件过大(超过限制)', backendError: '文件读取失败,远程环境可能不可用', backendTimeout: '文件读取超时', unsupportedBackend: '当前 terminal backend 暂不支持文件下载', invalidPath: '无效的文件路径', contentDisplay: '内容展示', download: '下载', downloadFile: '下载文件', }, // 更新日志 changelog: { new_0_6_29_9: '项目更名为 hermes-ui:移除桌面端、营销官网与 ESP32 固件,只保留 Web 与服务端', new_0_6_29_10: '界面品牌文案统一为 hermes-ui,语言包收敛为简体中文与 English 两项', }, }