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: '用量', 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 对话', inputPlaceholder: '输入消息... (Enter 发送,Shift+Enter 换行)', attachFiles: '添加附件', autoPlaySpeech: '自动播放语音', messageQueue: '消息队列', removeQueuedMessage: '移除队列消息', stop: '停止', start: '启动', stopGateway: '停止网关', send: '发送', contextUsed: '上下文已用:', sessions: '会话', webUiSessions: '会话', sessionScopeHint: '这里只显示当前会话;CLI、Telegram、Discord、Cron 等通道会话在历史中只读查看。', openHistory: '打开历史', hermesHistory: 'Hermes 历史', historyScopeHint: '这里按来源只读查看 Hermes 历史会话。', noSessions: '暂无会话', searchTitle: '搜索会话', searchSubtitle: '按标题或消息内容搜索', searchHint: 'Cmd/Ctrl+K', searchPlaceholder: '搜索会话...', searchEmpty: '最近会话', searchRecent: '最近会话', searchNoResults: '没有匹配的会话', searchNoSnippet: '没有可显示的摘要', searchEnterHint: 'Enter 打开 · Esc 关闭', searchFailed: '搜索会话失败', newChat: '新建对话', 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: '显示全部模型', 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}', }, }, // 平台频道设置 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', 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: '房间已删除', deleteRoomConfirm: '确定删除这个房间吗?', 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: '每日用量(近 30 天)', date: '日期', tokens: 'Token', cache: '缓存', cacheRead: '缓存读取', cacheWrite: '缓存写入', sessions: '会话', cost: '费用', noData: '暂无用量数据', }, // 文件管理 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_13_1: '新增消息队列,顺序处理运行请求,避免并发冲突', new_0_5_13_2: '支持二级 Skills 目录结构,扁平化 Skill 归入"杂项"分类', new_0_5_13_3: '启动同步时过滤临时会话(eph_*),避免导入内部会话', new_0_5_13_4: '新增 Termux/proot 环境兼容,支持移动端和嵌入式部署', new_0_5_13_5: '完善聊天运行中止生命周期:用户取消时正确清理状态', new_0_5_13_6: '移除历史消息列表中的流式指示器,显示更清爽', new_0_5_13_7: '修复自定义 Provider 的上下文解析,改进模型匹配', new_0_5_13_8: '修复 IPv6 默认监听地址绑定问题', new_0_5_13_9: '优化聊天消息显示和上下文压缩逻辑', new_0_5_13_10: '修复聊天完成提示音开关不生效及 cron 静默运行历史为空的问题', new_0_5_12_1: '新增会话批量删除功能:支持 checkbox 多选、全选、批量删除,提升会话管理效率', new_0_5_12_2: '新增模型上下文长度可视化编辑:点击上下文长度即可打开编辑弹窗,支持自定义 token 限制', new_0_5_12_3: '修复群聊提及功能键盘选择问题:使用自定义下拉菜单替换 NDropdown,支持键盘导航和滚动跟随', new_0_5_12_4: '新增聊天完成提示音:支持自动播放开关,提升交互体验', new_0_5_12_5: '优化聊天消息显示:过滤空内容助手消息,改进历史记录和压缩逻辑', new_0_5_12_6: '改进升级机制:使用 npm prefix -g 动态解析路径,支持 Homebrew 等非标准 Node.js 安装', 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_10_1: 'GitHub Release 时自动构建 Docker 镜像并添加版本标签(如 :v0.5.10)', new_0_5_10_2: '新增会话授权模式配置:approvals.mode(关闭/手动)', new_0_5_10_3: '新增自动 OpenAPI 文档生成(94 个端点,24 个标签)', new_0_5_10_4: '增强媒体渲染:支持 Markdown 中的图片、视频和文件', new_0_5_10_5: '优化群聊提示并修复媒体处理', new_0_5_6_8: '修复多进程冲突导致的 SQLite 数据库重置问题,清理冗余 nodemon 进程', new_0_5_9_1: '统一应用程序中的 profile 管理,提供一致的 API 和状态管理', new_0_5_9_2: '添加 GitHub issue 和 pull request 模板以改进贡献工作流程', new_0_5_8_1: '新增抽屉面板支持移动端侧边栏,可自定义彩虹边框按钮', new_0_5_8_2: '修复 profile 切换状态同步问题,立即更新 UI 并验证后端状态', new_0_5_8_3: '过滤语音播放中的特殊字符和表情符号,改善语音合成效果', new_0_5_8_4: '添加缺失的 i18n 键并统一会话数据源,优先使用数据库', new_0_5_8_5: '优化 Vite 构建配置加快 Docker 构建,使用 esbuild 和代码分割', new_0_5_7_1: '优化上下文压缩以支持富内容(图片、文件),改进工具消息处理', new_0_5_7_2: '改进会话同步,使用批量插入和事务保护确保数据一致性', new_0_5_7_3: '修复 usage.updated 事件接收,确保跨运行准确追踪 token', 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 检测和模型匹配问题', }, }