export default { // 登录 login: { title: 'Hermes Web UI', description: '输入访问令牌以继续。令牌在服务端启动日志中查看。', placeholder: '访问令牌', submit: '登录', tokenRequired: '请输入访问令牌', invalidToken: '令牌无效', connectionFailed: '无法连接到服务器', passwordLogin: '密码登录', tokenLogin: '令牌登录', usernamePlaceholder: '用户名', passwordPlaceholder: '密码', credentialsRequired: '请输入用户名和密码', invalidCredentials: '用户名或密码错误', tooManyAttempts: '登录失败次数过多,请稍后重试', passwordMismatch: '两次密码不一致', passwordTooShort: '密码长度至少 6 个字符', setupSuccess: '密码登录配置成功', passwordChanged: '密码修改成功', passwordRemoved: '密码登录已移除', setupPassword: '设置密码登录', changePassword: '修改密码', changeUsername: '修改用户名', removePasswordLogin: '移除', username: '用户名', currentPassword: '当前密码', newPassword: '新密码', confirmPassword: '确认密码', newUsername: '新用户名', usernameChanged: '用户名修改成功', usernameTooShort: '用户名至少 2 个字符', setupDescription: '设置用户名和密码以便快速登录。访问令牌仍可继续使用。', removeConfirm: '确定要移除密码登录吗?移除后需要使用访问令牌登录。', passwordLoginNotConfigured: '密码登录未配置', passwordLoginConfigured: '密码登录已启用({username})', }, // 通用 common: { loading: '加载中...', cancel: '取消', delete: '删除', retry: '重试', edit: '编辑', save: '保存', saved: '已保存', saveFailed: '保存失败', deleteFailed: '删除失败', ok: '确定', copied: '已复制', copy: '复制', update: '更新', create: '创建', noData: '暂无数据', expired: '已过期', fetch: '获取', add: '添加', enable: '启用', disable: '禁用', configured: '已配置', notConfigured: '未配置', confirm: '确定', expand: '展开', collapse: '收起', start: '启动', stop: '停止', }, // 侧边栏 sidebar: { chat: '对话', search: '搜索', apiRelay: '中转站', history: '历史', jobs: '任务', kanban: '看板', models: '模型', profiles: '用户', plugins: '插件', skills: '技能', memory: '记忆', logs: '日志', usage: '用量', skillsUsage: '技能用量', channels: '频道', gateways: '网关', terminal: '终端', groupChat: '群聊', files: '文件', groupConversation: '对话', groupPlatform: '平台', groupAgent: '代理', groupSystem: '系统', groupMonitoring: '监控', groupTools: '工具', settings: '设置', connected: '已连接', disconnected: '未连接', collapse: '收起菜单', expand: '展开菜单', updateTip: '在终端运行 "hermes-web-ui update" 即可更新', updateVersion: '升级版本 v{version}', reloadClientVersion: '刷新到 v{version}', updating: '正在更新...', updateSuccess: '更新成功,请稍后刷新页面,如长时间未启动,请手动启动', updateFailed: '更新失败', logout: '退出登录', nodeVersionWarning: '检测到 Node.js v{version},请升级到23以上版本。', changelog: '更新日志', noChangelog: '暂无更新日志', }, // 抽屉 drawer: { terminal: '终端', files: '工作区', }, // 对话 chat: { contextRemaining: '剩余', contextClickToEdit: '点击编辑上下文长度', contextEditTitle: '编辑上下文长度', contextEditDesc: '设置当前模型的上下文长度限制(token 数量)', contextEditPlaceholder: '请输入上下文长度', contextEditHint: '常见值:200k (Claude), 128k (GPT-4), 32k (GPT-3.5)', contextEditSave: '保存', contextEditCancel: '取消', contextEditInvalid: '请输入有效的上下文长度', contextEditSuccess: '上下文长度已更新', contextEditFailed: '更新失败', emptyState: '开始与 Hermes Agent 对话', cliEmptyState: '开始 CLI 对话', inputPlaceholder: '输入消息... (Enter 发送,Shift+Enter 换行)', slashCommandArgs: { message: '<消息>', title: '<标题>', text: '<文本>', }, slashCommands: { usage: '计算当前会话用量', status: '查看会话状态和队列', abort: '停止当前 Bridge 运行', queue: '把消息加入当前运行后的队列', clear: '清空当前显示内容', clearHistory: '删除当前会话已入库的消息历史', title: '重命名当前会话', compress: '空闲时触发上下文压缩', steer: '向当前 Bridge 运行发送引导文本', destroy: '释放当前会话的 Bridge Agent', }, attachFiles: '添加附件', autoPlaySpeech: '自动播放语音', messageQueue: '消息队列', removeQueuedMessage: '移除队列消息', stop: '停止', start: '启动', stopGateway: '停止网关', send: '发送', contextUsed: '上下文已用:', sessions: '会话', webUiSessions: '会话', sessionScopeHint: '这里只显示当前会话;CLI、Telegram、Discord、Cron 等通道会话在历史中只读查看。', openHistory: '打开历史', hermesHistory: 'Hermes 历史', historyScopeHint: '这里按来源只读查看 Hermes 历史会话。', noSessions: '暂无会话', searchTitle: '搜索会话', searchSubtitle: '按标题或消息内容搜索', searchScope: '搜索范围:仅 Web UI 本地会话库;不包含只读 Hermes 历史会话。', searchHint: 'Cmd/Ctrl+K', searchPlaceholder: '搜索会话...', searchEmpty: '最近会话', searchRecent: '最近会话', searchNoResults: '没有匹配的会话', searchNoSnippet: '没有可显示的摘要', searchEnterHint: 'Enter 打开 · Esc 关闭', searchFailed: '搜索会话失败', newChat: '新建对话', approvalKicker: '终端授权', approvalTitle: '运行前请确认命令', approvalAllowOnce: '仅本次允许', approvalAllowSession: '本会话允许', approvalAlways: '始终允许', approvalDeny: '拒绝', newCliChat: '新建 CLI', deleteSession: '确定删除此会话?', sessionDeleted: '会话已删除', toggleBatchMode: '批量选择', selectAll: '全选', confirmBatchDelete: '确定删除选中的 {count} 个会话?', batchDeleteSuccess: '已删除 {count} 个会话', batchDeletePartial: '{failed} 个会话删除失败', batchDeleteFailed: '批量删除失败', rename: '重命名', pin: '置顶', unpin: '取消置顶', pinned: '已置顶', chatMode: '聊天', liveMode: '实时', liveSessions: '实时会话', recentBadge: '最近', linkedSessions: '关联 {count} 个会话', noVisibleMessages: '没有人类可见消息。', monitorRoleUser: '用户', monitorRoleAssistant: '助手', copySessionId: '复制会话 ID', export: '导出', exportFull: '全量导出 (JSON)', exportCompressed: '压缩导出 (TXT)', exportCompressing: '正在压缩上下文,请稍候...', exportSuccess: '会话已导出', exportFailed: '导出失败', renamed: '已重命名', renameFailed: '重命名失败', renameSession: '重命名会话', sessionNotFound: '会话未找到', enterNewTitle: '输入新标题', workspace: '工作区', setWorkspace: '设置工作区', setWorkspaceTitle: '设置会话工作区', workspacePlaceholder: '输入项目路径,例如 /home/user/project', workspaceSet: '工作区已设置', workspaceSetFailed: '设置工作区失败', other: '其他', runFailed: '运行失败', error: '错误', tool: '工具', arguments: '参数', result: '结果', truncated: '... (已截断)', executionDuration: '执行时长', thinkingLabel: '思考过程', thinkingInProgress: '思考中…', thinkingShow: '展开思考过程', thinkingHide: '收起思考过程', thinkingDuration: '已观察 {duration}', thinkingChars: '{count} 字', copyBubble: '复制消息', copiedBubble: '已复制', copyFailed: '复制失败', playSpeech: '播放语音', pauseSpeech: '暂停', resumeSpeech: '继续', stopSpeech: '停止', speechNotSupported: '此浏览器不支持语音播放', }, // 看板 kanban: { title: '看板', createTask: '新建任务', noTasks: '暂无任务', allStatuses: '全部状态', allAssignees: '全部负责人', board: { create: '新建看板', archive: '归档看板', slugPlaceholder: '看板标识,例如 project-a', namePlaceholder: '显示名称(可选)', slugRequired: '看板标识不能为空', created: '看板已创建', archived: '看板已归档', archiveConfirm: '确定归档当前看板?', }, columns: { triage: '待分拣', todo: '待办', ready: '就绪', running: '进行中', blocked: '阻塞', done: '已完成', archived: '已归档', }, form: { title: '标题', titlePlaceholder: '任务标题', titleRequired: '标题不能为空', body: '描述', bodyPlaceholder: '任务描述(可选)', assignee: '负责人', selectAssignee: '选择负责人...', priority: '优先级', selectPriority: '选择优先级...', }, 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: '关键信息', }, action: { title: '操作', complete: '完成', completeSummary: '完成摘要(可选)', block: '阻塞', blockReason: '阻塞原因', unblock: '解除阻塞', assign: '分配', assignTo: '分配给...', }, message: { taskCreated: '任务已创建', taskCompleted: '任务已完成', taskBlocked: '任务已阻塞', taskUnblocked: '任务已解除阻塞', taskAssigned: '任务已分配', loadFailed: '加载任务失败', }, stats: { total: '总计', tasks: '任务数', }, }, // 定时任务 jobs: { title: '定时任务', createJob: '创建任务', editJob: '编辑任务', noJobs: '暂无定时任务,创建一个开始吧。', 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: '要执行的内容', deliverTarget: '投递目标', origin: '来源', local: '本地', repeatCount: '重复次数(可选)', modelPlaceholder: 'Default model', repeatPlaceholder: '留空表示无限重复', jobCreated: '任务已创建', jobUpdated: '任务已更新', nameRequired: '名称为必填项', scheduleRequired: '调度表达式为必填项', loadFailed: '加载任务失败', jobPaused: '任务已暂停', jobResumed: '任务已恢复', jobTriggered: '任务已触发', modelUpdated: 'Model updated', jobDeleted: '任务已删除', status: { running: '运行中', paused: '已暂停', disabled: '已禁用', scheduled: '已调度', }, info: { model: 'Model', schedule: 'Schedule', lastRun: '上次运行', nextRun: '下次运行', deliver: '投递', repeat: '重复', }, action: { pause: '暂停', pauseJob: '暂停任务', resume: '恢复', resumeJob: '恢复任务', runNow: '立即运行', triggerImmediately: '立即触发', }, runHistory: { title: '运行历史', runs: '次运行', noRuns: '暂无运行历史。', }, }, // 技能 skills: { title: '技能', searchPlaceholder: '搜索技能...', noMatch: '没有匹配的技能', noSkills: '暂无技能', backTo: '返回', attachedFiles: '附件文件', loadFailed: '加载技能失败', fileLoadFailed: '加载文件失败', modified: '用户已修改', archived: '已归档', pinned: '已置顶', pin: '置顶技能', unpin: '取消置顶', pinFailed: '更改置顶状态失败', toggleFailed: '切换技能状态失败', source: { builtin: '内置', hub: 'Hub 安装', local: '本地安装', }, }, // 插件 plugins: { title: '插件', refresh: '刷新', notice: '只读展示可发现的 Hermes 插件 manifest。发现元数据读取不会加载插件代码。v1 管理动作仍保留在 CLI,新 Hermes 会话生效。', loadFailed: '加载插件失败', 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: '路径 / 入口', cli: 'CLI', }, capabilities: { tools: '{count} 个工具', hooks: '{count} 个 hook', env: '{count} 个环境变量', }, metadata: { agentRoot: 'Agent 根目录', python: 'Python', scanCwd: '扫描 cwd', projectPlugins: '项目插件', }, }, // 记忆 memory: { title: '记忆', refresh: '刷新', loadFailed: '加载记忆失败', myNotes: '我的笔记', noNotes: '暂无笔记。', notesPlaceholder: '输入笔记内容...', userProfile: '用户画像', noProfile: '暂无画像。', profilePlaceholder: '输入用户画像...', soul: '灵魂', noSoul: '暂无灵魂配置。', soulPlaceholder: '输入灵魂配置...', }, // 模型 models: { title: '模型', searchPlaceholder: '搜索模型...', addProvider: '添加 Provider', 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 已删除', 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 插件的登录。', customBadge: '自定义', previewBadge: '预览', disabledBadge: '不可用', disabledTooltip: "此模型当前账号不可用", customModelPlaceholder: '未列出的模型 ID', customModelHint: '仅用于 provider 支持但未返回的模型;不是重命名。按回车加载。', removeCustomModel: '移除这个未列出的模型', 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: '取消全选', builtIn: '内置', customType: '自定义', provider: 'Provider', contextLength: '上下文长度', contextLengthPlaceholder: '例如 200000(可选)', 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: '删除', switchTo: '切换到', switchConfirm: '切换到配置 "{name}" 将重启网关,是否继续?', switchSuccess: '已切换到配置 "{name}"', switchFailed: '切换配置失败,网关可能需要手动重启', 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: '暂无配置,创建一个开始吧。', }, // 日志 logs: { title: '日志', all: '全部', searchPlaceholder: '搜索...', refresh: '刷新', noEntries: '暂无日志', }, // 设置 settings: { title: '设置', saved: '已保存', saveFailed: '保存失败', tabs: { display: '显示', account: '账户', agent: '代理', memory: '记忆', 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 回复完成时播放提示音', busyInputMode: '忙碌输入模式', busyInputModeHint: 'AI 处理中仍可输入', theme: '主题', themeHint: '选择浅色、暗色或跟随系统', themeLight: '浅色', themeDark: '暗色', themeSystem: '跟随系统', }, agent: { maxTurns: '最大轮次', maxTurnsHint: '单次对话最大交互轮数', gatewayTimeout: '网关超时', gatewayTimeoutHint: '单次请求超时时间(秒)', restartDrainTimeout: '重启排空超时', restartDrainTimeoutHint: '重启前排空请求的超时时间(秒)', toolEnforcement: '工具执行策略', toolEnforcementHint: '控制工具调用的执行模式', auto: '自动', always: '始终', never: '从不', }, memory: { enabled: '启用记忆', enabledHint: '允许 AI 记住对话上下文', userProfile: '用户画像', userProfileHint: '允许 AI 记住用户偏好信息', charLimit: '记忆字符上限', charLimitHint: 'MEMORY.md 最大字符数', userCharLimit: '用户画像字符上限', userCharLimitHint: 'USER.md 最大字符数', }, session: { mode: '重置模式', modeHint: '会话重置的触发条件', modeBoth: '空闲 + 定时', modeIdle: '仅空闲', modeHourly: '仅定时', idleMinutes: '空闲超时', idleMinutesHint: '无操作后自动重置的等待时间(分钟)', atHour: '定时重置时间', humanOnly: '仅显示人类会话', humanOnlyHint: '默认隐藏子代理和会话监看噪音', liveMonitorHumanOnly: '实时监看:仅显示人类会话', liveMonitorHumanOnlyHint: '在实时监看中默认隐藏子代理和会话监看噪音', atHourHint: '每天在指定小时重置会话', requireAuth: '会话授权', requireAuthHint: '修改会话操作是否授权', }, 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', }, voice: { 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', 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: '例如:用轻快上扬的语调,语速稍快', }, }, // 平台频道设置 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', accessToken: 'Access Token', accessTokenHint: 'Matrix Access Token', homeserver: 'Homeserver URL', homeserverHint: 'Matrix 服务器地址', appId: 'App ID', appIdHint: '飞书 App ID', appSecret: 'App Secret', appSecretHint: '飞书 App Secret', clientId: 'Client ID', clientIdHint: '钉钉 Client ID', clientSecret: 'Client Secret', clientSecretHint: '钉钉 Client Secret', 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: '智能体已添加', agentAlreadyInRoom: '该智能体已在房间中', noAgents: '当前房间暂无智能体', members: '成员', roomCreated: '房间已创建', roomDeleted: '房间已删除', roomCloned: '房间已克隆', cloneRoom: '克隆房间', deleteRoomConfirm: '确定删除这个房间吗?', clearContext: '清理上下文', clearContextConfirm: '确定清理当前房间上下文吗?消息和压缩快照会被删除,智能体和成员会保留。', contextCleared: '上下文已清理', you: '你', joined: '已加入房间', joinFailed: '加入房间失败', inputPlaceholder: '输入消息... (Enter 发送)', 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: '模型分布', 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: '无效的文件路径', download: '下载', downloadFile: '下载文件', }, // 更新日志 changelog: { new_0_5_14_1: '新增会话导出功能:支持完整和压缩模式,导出为 JSON 或纯文本', new_0_5_14_2: '修复终端面板启动即连接导致 PTY 资源耗尽的问题,改为懒加载连接', new_0_5_14_3: '修复 WSL2 环境下 IPv6 双栈绑定导致健康检查失败、端口无法访问的问题', new_0_5_14_4: '修复服务关闭时 SQLite 连接未释放导致重启后数据库被锁的问题', new_0_5_14_5: '更新 FUN-Codex/FUN-Claude 模型列表,新增内置标识、API 中转站入口', new_0_5_15_1: '新增看板面板,可视化任务与会话管理', new_0_5_15_2: '新增官网首页与文档站', new_0_5_15_3: '修复群聊 Agent 客户端使用动态端口而非硬编码 8648', new_0_5_15_4: '新增 node-edge-tts 语音模块', new_0_5_15_5: '修复 WSL 默认监听地址绑定问题', new_0_5_15_6: '新增官网首页 SEO 元数据', new_0_5_15_7: '新增基于 IP 的登录暴力破解防护', new_0_5_15_8: '修复 MarkdownRenderer 中下载链接重复包装问题', new_0_5_15_9: '修复 Hermes Markdown 媒体渲染与同步重试', new_0_5_15_10: '重构移除上游环境变量依赖', new_0_5_15_11: '如果看板功能无法使用,请升级 hermes-agent', new_0_5_16_1: '聊天流式接口从 /v1/runs 迁移至 /v1/responses,降低延迟', new_0_5_16_2: '持久化真实 API 用量(token、缓存、推理)到用量统计表', new_0_5_16_3: '官网导航栏新增 QQ 群二维码', new_0_5_16_4: '移除消息 schema 中未使用的 codex_reasoning_items 字段', new_0_5_17_1: '全面兼容 Windows:路径处理、进程管理、终端、日志解析', new_0_5_17_2: '重构 Gateway 进程管理,支持跨平台启动/停止/健康检查', new_0_5_17_3: '修复 Termux 环境下插件发现失败的问题,自动解析 hermes shebang 定位 Python', new_0_5_17_5: '优化认证锁定窗口和开发环境关闭流程', new_0_5_17_4: 'YAML 配置解析容忍重复键', new_0_5_17_6: 'Comic 主题新增中文(站酷快乐体)、日文(Zen Maru Gothic)、韩文(Gaegu)手写字体', new_0_5_17_7: '新增 Comic/涂鸦主题风格', new_0_5_17_8: '许可证变更为 BSL-1.1', new_0_5_17_9: '新增只读 Hermes 插件页', new_0_5_17_10: '图片上传转为 base64 多模态格式', new_0_5_17_11: '修复 Kanban 看板选择与隔离问题', new_0_5_17_12: '新增语音播放设置,支持 4 种 TTS 提供商', new_0_5_17_13: '降低上下文压缩提示阈值从 200 到 150', new_0_5_17_14: '修复 Web UI 自更新重启逻辑', new_0_5_17_15: '修复 opencode-zen 和 opencode-go 共享环境变量导致配置联动', new_0_5_17_16: '新增繁体中文(zh-TW)语言支持', new_0_5_17_17: '模型页支持在 Web UI 里管理可见模型', new_0_5_17_18: 'Kanban:补齐任务操作链路(评论、日志、分配、派发),明确能力边界', new_0_5_17_19: '修复删除 Provider 时未清除认证条目', new_0_5_17_20: '修复 Codex credential-pool 认证识别', new_0_5_17_21: 'Edge TTS 新增语速/音调调节', new_0_5_17_22: 'config.yaml 重复键不再导致解析崩溃', new_0_5_17_23: 'Gateway 端口所有权检查改为基于 PID 文件,防止跨 Profile 端口占用', new_0_5_17_24: '历史页面现在显示 Cron 会话记录', new_0_5_17_25: '修复收起侧边栏时语言切换和主题图标挤压问题', new_0_5_18_1: '新增技能使用情况监控页面,支持每日趋势图和热门技能统计', new_0_5_18_2: '新增 CLI 聊天会话桥接,通过 Python Agent Bridge 实现 WebSocket 会话', new_0_5_18_3: '新增 Ollama Cloud 供应商预设,支持动态模型目录', new_0_5_18_4: '支持模型显示名重命名(别名)', new_0_5_18_5: '支持在 Web UI 中管理模型可见性', new_0_5_18_6: '增强使用量分析仪表盘', new_0_5_18_7: 'Docker 单容器部署,更新 docker-compose 配置并修复 gateway 启动问题', new_0_5_18_8: '修复插件页面非默认 profile 下 HERMES_HOME fallback 警告', new_0_5_18_9: '修复 dev 模式重启时网关稳定性,改善 Windows 兼容性', new_0_5_22_1: '修复 Hermes 会话列表接口错误读取 Web UI 本地会话库的问题', new_0_5_23_1: '新增仅 Bridge 会话可用的聊天斜杠命令,并支持本地化命令提示', new_0_5_23_2: '持久化命令历史用于会话回显,同时避免污染模型上下文、用量统计和压缩', new_0_5_23_3: '隔离 gateway profile 环境变量,防止凭据在不同 profile 之间串用', new_0_5_23_4: 'gateway 分配端口时保留 Web UI 端口,避免启动端口冲突', new_0_5_23_5: '修复自更新重启逻辑,避免将 restart helper 的成功退出误报为失败', new_0_5_24_1: '对齐 Bridge 聊天与 API Server 的多模态输入、系统提示词和工作区上下文处理', new_0_5_25_1: '新增群聊房间重置和克隆操作', new_0_5_25_2: '支持配置 Web UI 状态目录,方便自定义部署目录结构', new_0_5_25_3: '语音设置新增 MiMo TTS 提供商', new_0_5_25_4: '自定义 Provider 模型列表改由后端代理请求,避免浏览器跨域失败', new_0_5_25_5: '修复 Bridge 会话的工具授权流程', new_0_5_25_6: '移除 Bridge 强制注入的 CLI 平台提示,保留用户自定义媒体和文件输出规则', new_0_5_25_7: '用户消息历史支持正确展示 base64 图片内容', new_0_5_25_8: '新增 Playwright 浏览器测试、聊天流式契约覆盖、Provider 模型测试和覆盖率基线', new_0_5_6_1: '新增语音播放功能:使用 Web Speech API,支持手动播放按钮、自动播放开关、彩虹边框动画和移动端优化', new_0_5_6_2: '新增健壮的 LLM JSON 解析器,兼容 Python 格式并从流式事件中提取文本', new_0_5_6_3: 'Skills 功能增强:使用统计、来源过滤、归档技能、来源追溯和置顶切换', new_0_5_6_4: '扩展每日使用统计,包含详细的 token 细分,分离缓存读/写统计', new_0_5_6_5: '优化会话历史范围说明,改进聊天和历史视图的描述', new_0_5_6_6: '重新设计附件处理,采用 Anthropic 风格的 ContentBlock 数组格式,支持类型区分(文本、图片、文件)', new_0_5_6_7: '新增前端文件下载功能,支持 ContentBlock 和 Markdown 两种格式,带身份验证', new_0_5_6_8: '修复多进程冲突导致的 SQLite 数据库重置问题,清理冗余 nodemon 进程', new_0_5_5_1: '🎉 五一劳动节快乐!这个劳动节就不劳动啦,如果有问题大家忍忍', new_0_5_5_2: '新增历史页面,用于浏览 Hermes 会话历史记录', new_0_5_5_3: '历史页面独立管理会话状态,不影响当前聊天页面的活动会话', new_0_5_5_4: '历史页面默认自动加载并选中第一个 CLI 类型的会话', new_0_5_5_5: '新增 HistoryMessageList 组件,支持通过 props 注入会话数据', new_0_5_5_6: '过滤空内容消息和无 toolName 的 tool 消息,提升历史记录显示质量', new_0_5_5_7: '移除 localStorage 会话缓存,所有会话数据改为直接从后端获取', new_0_5_5_8: '优化 profile 切换逻辑,移除废弃的缓存清理调用', new_0_5_4_1: '修复并发聊天会话事件串扰问题,重构 WebSocket 事件路由机制', new_0_5_4_2: '修复 cron job 编辑 payload,支持长提示词的仅名称编辑', new_0_5_4_3: '修复 Docker 部署后 Web 终端无法使用 Hermes CLI 的问题', new_0_5_4_4: '添加工作区对话框标题 i18n 翻译,改进会话持久化', new_0_5_4_5: '支持代码块复制反馈,显示用户通知', new_0_5_4_6: '对齐使用分析与 Hermes 状态数据库架构', new_0_4_8_2: '修复嵌套 Markdown 代码块导致渲染截断', new_0_4_8_3: '修复压缩续接会话投影和搜索问题', new_0_4_8_4: '优化会话列表 N+1 查询,修复非 CJK 搜索 500 错误', new_0_4_8_5: '修复切换标签页返回时强制滚动到底部', new_0_4_8_6: '切换会话时添加加载过渡动画', new_0_4_8_7: '修复登录 Token 验证使用正确的会话端点', new_0_4_8_8: '修复刷新页面后图片附件失效问题', new_0_4_8_9: '点击图片附件可全屏预览', new_0_4_8_10: '上传目录从临时目录迁移到 ~/.hermes-web-ui/upload', new_0_4_7_1: '实时流式显示思考/推理过程', new_0_4_7_2: 'Docker 构建时跳过 prepare 脚本', new_0_4_7_3: '群聊移动端体验改进和 UI 优化', new_0_4_7_4: '将剩余上下文 Token 数限制为 0 而非负数', new_0_4_7_5: '新增阿里云编码计划内置 Provider,支持 .env base_url 覆盖', new_0_4_7_6: '启动时跳过远程配置文件以防止卡住', new_0_4_7_7: '检测并展示被静默吞没的运行错误', new_0_4_7_8: 'Provider 感知的上下文长度查询', new_0_4_7_9: '切换时重置 config.model 并解析 CLI 自定义 Provider', new_0_4_7_10: '删除内置 Provider 时清除 .env 中的 base_url_env', new_0_4_7_11: '对齐群聊房间侧边栏背景与会话列表', new_0_4_4_1: '新增文件浏览器,支持多后端(本地/Docker/SSH/Singularity)', new_0_4_4_2: '新增聊天消息附件文件下载', new_0_4_4_3: '活跃会话显示实时状态标签', new_0_4_4_4: '新增 StepFun 和 Nous Portal Provider 支持', new_0_4_4_5: '修复特殊字符搜索导致 500 错误', new_0_4_5_1: '新增群聊功能,支持多 Agent 房间、提及路由和输入状态恢复', new_0_4_5_2: '使用 YAML 重写模型上下文配置,新增 context_length 设置', new_0_4_5_3: '新增 gpt-5.5 到 OpenAI Codex 模型列表', new_0_4_5_4: '用本地控制器替换任务代理,优化模型加载', new_0_4_5_5: 'ModelSelector 自定义模型功能新增 i18n 支持', new_0_4_5_6: '修复侧边栏 i18n 缺失 key 警告', new_0_4_5_7: '退出登录时清除所有 localStorage', new_0_4_5_8: '新增日志定期轮转,防止日志无限增长', new_0_4_2_1: '新增 Token 用量追踪、上下文显示和动态上下文长度', new_0_4_2_2: '新增会话搜索弹窗', new_0_4_2_3: '恢复群聊系统(Socket.IO + SQLite 持久化)', new_0_4_2_4: 'Chat 页面新增固定会话和实时监控', new_0_4_2_5: '修复内置 Provider 检测和模型匹配问题', }, }