# Conflicts: # apps/desktop/electron/main.cjs # apps/desktop/src/app/command-palette/index.tsx # apps/desktop/src/themes/context.tsx
1988 lines
81 KiB
TypeScript
1988 lines
81 KiB
TypeScript
import { defineFieldCopy } from '@/app/settings/field-copy'
|
||
|
||
import type { Translations } from './types'
|
||
|
||
export const zh: Translations = {
|
||
common: {
|
||
apply: '应用',
|
||
back: '返回',
|
||
save: '保存',
|
||
saving: '保存中…',
|
||
cancel: '取消',
|
||
change: '更改',
|
||
choose: '选择',
|
||
clear: '清除',
|
||
close: '关闭',
|
||
collapse: '收起',
|
||
confirm: '确认',
|
||
connect: '连接',
|
||
connecting: '连接中',
|
||
continue: '继续',
|
||
copied: '已复制',
|
||
copy: '复制',
|
||
copyFailed: '复制失败',
|
||
delete: '删除',
|
||
docs: '文档',
|
||
done: '完成',
|
||
error: '错误',
|
||
failed: '失败',
|
||
free: '免费',
|
||
loading: '加载中…',
|
||
notSet: '未设置',
|
||
refresh: '刷新',
|
||
remove: '移除',
|
||
replace: '替换',
|
||
retry: '重试',
|
||
run: '运行',
|
||
send: '发送',
|
||
set: '设置',
|
||
skip: '跳过',
|
||
update: '更新',
|
||
on: '开',
|
||
off: '关'
|
||
},
|
||
|
||
boot: {
|
||
ready: 'Hermes 桌面版已就绪',
|
||
desktopBootFailedWithMessage: message => `桌面启动失败:${message}`,
|
||
steps: {
|
||
connectingGateway: '正在连接桌面网关',
|
||
loadingSettings: '正在加载 Hermes 设置',
|
||
loadingSessions: '正在加载最近会话',
|
||
startingDesktopConnection: '正在启动桌面连接',
|
||
startingHermesDesktop: '正在启动 Hermes 桌面版…'
|
||
},
|
||
errors: {
|
||
backgroundExited: 'Hermes 后台进程已退出。',
|
||
backgroundExitedDuringStartup: 'Hermes 后台进程在启动期间退出。',
|
||
backendStopped: '后端已停止',
|
||
desktopBootFailed: '桌面启动失败',
|
||
gatewaySignInRequired: '需要登录网关',
|
||
ipcBridgeUnavailable: '桌面 IPC 桥不可用。'
|
||
},
|
||
failure: {
|
||
title: 'Hermes 无法启动',
|
||
description: '后台网关没有启动。请尝试下面的恢复步骤;这里不会删除你的对话或设置。',
|
||
remoteTitle: '需要重新登录远程网关',
|
||
remoteDescription: '你的远程网关会话已过期。请重新登录以恢复连接。这些操作不会删除你的对话或设置。',
|
||
retry: '重试',
|
||
repairInstall: '修复安装',
|
||
useLocalGateway: '使用本地网关',
|
||
openLogs: '打开日志',
|
||
repairHint: '修复会重新运行安装器,在新机器上可能需要几分钟。',
|
||
remoteSignInHint: '打开网关登录窗口。也可以使用本地网关切换到随应用提供的后端。',
|
||
hideRecentLogs: '隐藏最近日志',
|
||
showRecentLogs: '显示最近日志',
|
||
signedInTitle: '已登录',
|
||
signedInMessage: '正在重新连接远程网关…',
|
||
signInIncompleteTitle: '登录未完成',
|
||
signInIncompleteMessage: '登录窗口在认证完成前关闭。',
|
||
signInFailed: '登录失败',
|
||
signInToRemoteGateway: '登录远程网关',
|
||
signInWithProvider: provider => `使用 ${provider} 登录`,
|
||
identityProvider: '你的身份提供方'
|
||
}
|
||
},
|
||
|
||
notifications: {
|
||
region: '通知',
|
||
hide: '隐藏',
|
||
show: '显示',
|
||
more: count => `另外 ${count} 条通知`,
|
||
clearAll: '全部清除',
|
||
dismiss: '关闭通知',
|
||
details: '详情',
|
||
copyDetail: '复制详情',
|
||
copyDetailFailed: '无法复制通知详情',
|
||
backendOutOfDateTitle: '后端版本过旧',
|
||
backendOutOfDateMessage: '你的 Hermes 后端早于当前桌面构建,可能无法正常工作。请更新以保持一致。',
|
||
updateHermes: '更新 Hermes',
|
||
updateReadyTitle: '有可用更新',
|
||
updateReadyMessage: count => `有 ${count} 项新更改可用。`,
|
||
seeWhatsNew: '查看更新内容',
|
||
errors: {
|
||
elevenLabsNeedsKey: 'ElevenLabs STT 需要 ELEVENLABS_API_KEY。',
|
||
elevenLabsRejectedKey: 'ElevenLabs 拒绝了该 API key (401)。',
|
||
methodNotAllowed: '桌面后端拒绝了该请求 (405 Method Not Allowed)。请尝试重启 Hermes Desktop。',
|
||
microphonePermission: '麦克风权限已被拒绝。',
|
||
openaiRejectedApiKey: 'OpenAI 拒绝了该 API key。',
|
||
openaiRejectedApiKeyWithStatus: status => `OpenAI 拒绝了该 API key (${status} invalid_api_key)。`,
|
||
openaiTtsNeedsKey: 'OpenAI TTS 需要 VOICE_TOOLS_OPENAI_KEY 或 OPENAI_API_KEY。'
|
||
},
|
||
voice: {
|
||
configureSpeechToText: '配置语音转文字后即可使用语音模式。',
|
||
couldNotStartSession: '无法启动语音会话',
|
||
microphoneAccessDenied: '麦克风访问被拒绝。',
|
||
microphoneConstraintsUnsupported: '此设备不支持当前麦克风约束。',
|
||
microphoneFailed: '麦克风出错',
|
||
microphoneInUse: '麦克风正被其他应用占用。',
|
||
microphonePermissionDenied: '麦克风权限被拒绝。',
|
||
microphoneStartFailed: '无法开始麦克风录音。',
|
||
microphoneUnsupported: '当前运行环境不支持麦克风录音。',
|
||
noMicrophone: '未找到麦克风。',
|
||
noSpeechDetected: '没有检测到语音',
|
||
playbackFailed: '语音播放失败',
|
||
recordingFailed: '语音录制失败',
|
||
transcriptionFailed: '语音转写失败',
|
||
transcriptionUnavailable: '语音转写暂不可用。',
|
||
tryRecordingAgain: '请再录一次。',
|
||
unavailable: '语音不可用'
|
||
}
|
||
},
|
||
|
||
titlebar: {
|
||
hideSidebar: '隐藏侧边栏',
|
||
showSidebar: '显示侧边栏',
|
||
search: '搜索',
|
||
searchTitle: '搜索会话、视图与操作',
|
||
swapSidebarSides: '交换侧边栏位置',
|
||
swapSidebarSidesTitle: '交换会话栏和文件浏览器的位置',
|
||
hideRightSidebar: '隐藏右侧栏',
|
||
showRightSidebar: '显示右侧栏',
|
||
muteHaptics: '关闭触感反馈',
|
||
unmuteHaptics: '开启触感反馈',
|
||
openSettings: '打开设置',
|
||
openKeybinds: '键盘快捷键'
|
||
},
|
||
|
||
keybinds: {
|
||
title: '键盘快捷键',
|
||
subtitle: open => `点击快捷键即可重新绑定 · ${open} 可重新打开此面板。`,
|
||
rebind: '重新绑定',
|
||
reset: '恢复默认',
|
||
resetAll: '全部重置',
|
||
pressKey: '请按下按键…',
|
||
set: '设置',
|
||
conflictWith: label => `已绑定到“${label}”`,
|
||
categories: {
|
||
composer: '输入框',
|
||
profiles: '配置',
|
||
session: '会话',
|
||
navigation: '导航',
|
||
view: '视图'
|
||
},
|
||
actions: {
|
||
'keybinds.openPanel': '打开键盘快捷键',
|
||
'nav.commandPalette': '打开命令面板',
|
||
'nav.commandCenter': '打开命令中心',
|
||
'nav.settings': '打开设置',
|
||
'nav.profiles': '打开配置',
|
||
'nav.skills': '打开技能',
|
||
'nav.messaging': '打开消息',
|
||
'nav.artifacts': '打开制品',
|
||
'nav.cron': '打开定时任务',
|
||
'nav.agents': '打开智能体',
|
||
'session.new': '新建会话',
|
||
'session.next': '下一个会话',
|
||
'session.prev': '上一个会话',
|
||
'session.slot.1': '切换到最近会话 1',
|
||
'session.slot.2': '切换到最近会话 2',
|
||
'session.slot.3': '切换到最近会话 3',
|
||
'session.slot.4': '切换到最近会话 4',
|
||
'session.slot.5': '切换到最近会话 5',
|
||
'session.slot.6': '切换到最近会话 6',
|
||
'session.slot.7': '切换到最近会话 7',
|
||
'session.slot.8': '切换到最近会话 8',
|
||
'session.slot.9': '切换到最近会话 9',
|
||
'session.focusSearch': '搜索会话',
|
||
'session.togglePin': '固定/取消固定当前会话',
|
||
'composer.focus': '聚焦输入框',
|
||
'composer.modelPicker': '打开模型选择器',
|
||
'view.toggleSidebar': '切换会话侧边栏',
|
||
'view.toggleRightSidebar': '切换文件浏览器',
|
||
'view.showFiles': '显示文件浏览器',
|
||
'view.showTerminal': '显示终端',
|
||
'view.terminalSelection': '将终端选区发送到输入框',
|
||
'view.closePreviewTab': '关闭预览标签',
|
||
'view.flipPanes': '交换侧边栏位置',
|
||
'appearance.toggleMode': '切换浅色/深色',
|
||
'profile.default': '切换到默认配置',
|
||
'profile.switch.1': '切换到配置 1',
|
||
'profile.switch.2': '切换到配置 2',
|
||
'profile.switch.3': '切换到配置 3',
|
||
'profile.switch.4': '切换到配置 4',
|
||
'profile.switch.5': '切换到配置 5',
|
||
'profile.switch.6': '切换到配置 6',
|
||
'profile.switch.7': '切换到配置 7',
|
||
'profile.switch.8': '切换到配置 8',
|
||
'profile.switch.9': '切换到配置 9',
|
||
'profile.switch.10': '切换到配置 10',
|
||
'profile.switch.11': '切换到配置 11',
|
||
'profile.switch.12': '切换到配置 12',
|
||
'profile.switch.13': '切换到配置 13',
|
||
'profile.switch.14': '切换到配置 14',
|
||
'profile.switch.15': '切换到配置 15',
|
||
'profile.switch.16': '切换到配置 16',
|
||
'profile.switch.17': '切换到配置 17',
|
||
'profile.switch.18': '切换到配置 18',
|
||
'profile.next': '下一个配置',
|
||
'profile.prev': '上一个配置',
|
||
'profile.toggleAll': '切换全部配置视图',
|
||
'profile.create': '创建配置',
|
||
'composer.send': '发送消息',
|
||
'composer.newline': '插入换行',
|
||
'composer.steer': '引导正在运行的回合',
|
||
'composer.sendQueued': '发送下一条排队消息',
|
||
'composer.mention': '引用文件、文件夹、网址',
|
||
'composer.slash': '斜杠命令面板',
|
||
'composer.help': '快速帮助',
|
||
'composer.history': '切换弹窗/历史',
|
||
'composer.cancel': '关闭弹窗·取消运行'
|
||
}
|
||
},
|
||
|
||
language: {
|
||
label: '语言',
|
||
description: '选择桌面界面的语言。',
|
||
saving: '正在保存语言…',
|
||
saveError: '语言更新失败',
|
||
switchTo: '切换语言',
|
||
searchPlaceholder: '搜索语言…',
|
||
noResults: '未找到语言'
|
||
},
|
||
|
||
settings: {
|
||
closeSettings: '关闭设置',
|
||
exportConfig: '导出配置',
|
||
importConfig: '导入配置',
|
||
resetToDefaults: '恢复默认',
|
||
resetConfirm: '将所有设置恢复为 Hermes 默认值?',
|
||
exportFailed: '导出失败',
|
||
resetFailed: '重置失败',
|
||
nav: {
|
||
providers: '提供方',
|
||
providerAccounts: '账号',
|
||
providerApiKeys: 'API 密钥',
|
||
gateway: '网关',
|
||
apiKeys: '工具与密钥',
|
||
keysTools: '工具',
|
||
keysSettings: '设置',
|
||
mcp: 'MCP',
|
||
archivedChats: '已归档对话',
|
||
about: '关于'
|
||
},
|
||
sections: {
|
||
model: '模型',
|
||
chat: '对话',
|
||
appearance: '外观',
|
||
workspace: '工作区',
|
||
safety: '安全',
|
||
memory: '记忆与上下文',
|
||
voice: '语音',
|
||
advanced: '高级'
|
||
},
|
||
searchPlaceholder: {
|
||
about: '关于 Hermes Desktop',
|
||
config: '搜索设置…',
|
||
gateway: '网关连接…',
|
||
keys: '搜索 API 密钥…',
|
||
mcp: '搜索 MCP 服务器…',
|
||
sessions: '搜索已归档会话…'
|
||
},
|
||
modeOptions: {
|
||
light: { label: '明亮', description: '明亮的桌面界面' },
|
||
dark: { label: '暗色', description: '低眩光工作区' },
|
||
system: { label: '跟随系统', description: '跟随系统外观' }
|
||
},
|
||
appearance: {
|
||
title: '外观',
|
||
intro: '这些是仅桌面端的显示偏好。模式控制明暗;主题控制强调色与对话界面样式。',
|
||
colorMode: '颜色模式',
|
||
colorModeDesc: '选择固定模式,或让 Hermes 跟随系统设置。',
|
||
toolViewTitle: '工具调用显示',
|
||
toolViewDesc: '产品模式隐藏原始工具数据;技术模式显示完整输入/输出。',
|
||
product: '产品',
|
||
productDesc: '易读的工具活动与简洁摘要。',
|
||
technical: '技术',
|
||
technicalDesc: '包含原始工具参数/结果及底层细节。',
|
||
themeTitle: '主题',
|
||
themeDesc: '仅桌面端调色板。所选模式叠加其上。',
|
||
themeProfileNote: profile => `已为「${profile}」配置文件保存——每个配置文件保留各自的主题。`,
|
||
installTitle: '从 VS Code 安装',
|
||
installDesc: '粘贴 Marketplace 扩展 ID(例如 dracula-theme.theme-dracula),将其配色主题转换为桌面调色板。',
|
||
installPlaceholder: 'publisher.extension',
|
||
installButton: '安装',
|
||
installing: '安装中…',
|
||
installError: '无法安装该主题。',
|
||
installed: name => `已安装「${name}」。`,
|
||
removeTheme: '移除主题',
|
||
importedBadge: '已导入'
|
||
},
|
||
fieldLabels: defineFieldCopy({
|
||
model: '默认模型',
|
||
modelContextLength: '上下文窗口',
|
||
fallbackProviders: '备用模型',
|
||
toolsets: '启用的工具集',
|
||
timezone: '时区',
|
||
display: {
|
||
personality: '人格',
|
||
showReasoning: '推理过程块'
|
||
},
|
||
agent: {
|
||
maxTurns: '最大智能体步数',
|
||
imageInputMode: '图片附件',
|
||
apiMaxRetries: 'API 重试次数',
|
||
serviceTier: '服务等级',
|
||
toolUseEnforcement: '工具调用强制'
|
||
},
|
||
terminal: {
|
||
cwd: '工作目录',
|
||
backend: '执行后端',
|
||
timeout: '命令超时',
|
||
persistentShell: '持久化 Shell',
|
||
envPassthrough: '环境变量透传',
|
||
dockerImage: 'Docker 镜像',
|
||
singularityImage: 'Singularity 镜像',
|
||
modalImage: 'Modal 镜像',
|
||
daytonaImage: 'Daytona 镜像'
|
||
},
|
||
fileReadMaxChars: '文件读取上限',
|
||
toolOutput: {
|
||
maxBytes: '终端输出上限',
|
||
maxLines: '文件分页上限',
|
||
maxLineLength: '行长度上限'
|
||
},
|
||
codeExecution: {
|
||
mode: '代码执行模式'
|
||
},
|
||
approvals: {
|
||
mode: '审批模式',
|
||
timeout: '审批超时',
|
||
mcpReloadConfirm: '确认 MCP 重载'
|
||
},
|
||
commandAllowlist: '命令白名单',
|
||
security: {
|
||
redactSecrets: '隐去密钥',
|
||
allowPrivateUrls: '允许私有 URL'
|
||
},
|
||
browser: {
|
||
allowPrivateUrls: '浏览器私有 URL',
|
||
autoLocalForPrivateUrls: '私有 URL 使用本地浏览器'
|
||
},
|
||
checkpoints: {
|
||
enabled: '文件检查点',
|
||
maxSnapshots: '检查点上限'
|
||
},
|
||
voice: {
|
||
recordKey: '语音快捷键',
|
||
maxRecordingSeconds: '最长录音时长',
|
||
autoTts: '朗读回复'
|
||
},
|
||
stt: {
|
||
enabled: '语音转文字',
|
||
provider: '语音转文字提供方',
|
||
local: {
|
||
model: '本地转写模型',
|
||
language: '转写语言'
|
||
},
|
||
openai: {
|
||
model: 'OpenAI STT 模型'
|
||
},
|
||
groq: {
|
||
model: 'Groq STT 模型'
|
||
},
|
||
mistral: {
|
||
model: 'Mistral STT 模型'
|
||
},
|
||
elevenlabs: {
|
||
modelId: 'ElevenLabs STT 模型',
|
||
languageCode: 'ElevenLabs 语言',
|
||
tagAudioEvents: '标记音频事件',
|
||
diarize: '说话人区分'
|
||
}
|
||
},
|
||
tts: {
|
||
provider: '文字转语音提供方',
|
||
edge: {
|
||
voice: 'Edge 语音'
|
||
},
|
||
openai: {
|
||
model: 'OpenAI TTS 模型',
|
||
voice: 'OpenAI 语音'
|
||
},
|
||
elevenlabs: {
|
||
voiceId: 'ElevenLabs 语音',
|
||
modelId: 'ElevenLabs 模型'
|
||
},
|
||
xai: {
|
||
voiceId: 'xAI (Grok) 语音',
|
||
language: 'xAI 语言'
|
||
},
|
||
minimax: {
|
||
model: 'MiniMax TTS 模型',
|
||
voiceId: 'MiniMax 语音'
|
||
},
|
||
mistral: {
|
||
model: 'Mistral TTS 模型',
|
||
voiceId: 'Mistral 语音'
|
||
},
|
||
gemini: {
|
||
model: 'Gemini TTS 模型',
|
||
voice: 'Gemini 语音'
|
||
},
|
||
neutts: {
|
||
model: 'NeuTTS 模型',
|
||
device: 'NeuTTS 设备'
|
||
},
|
||
kittentts: {
|
||
model: 'KittenTTS 模型',
|
||
voice: 'KittenTTS 语音'
|
||
},
|
||
piper: {
|
||
voice: 'Piper 语音'
|
||
}
|
||
},
|
||
memory: {
|
||
memoryEnabled: '持久记忆',
|
||
userProfileEnabled: '用户画像',
|
||
memoryCharLimit: '记忆预算',
|
||
userCharLimit: '画像预算',
|
||
provider: '记忆提供方'
|
||
},
|
||
context: {
|
||
engine: '上下文引擎'
|
||
},
|
||
compression: {
|
||
enabled: '自动压缩',
|
||
threshold: '压缩阈值',
|
||
targetRatio: '压缩目标',
|
||
protectLastN: '保护最近消息'
|
||
},
|
||
delegation: {
|
||
model: '子智能体模型',
|
||
provider: '子智能体提供方',
|
||
maxIterations: '子智能体轮次上限',
|
||
maxConcurrentChildren: '并行子智能体',
|
||
childTimeoutSeconds: '子智能体超时',
|
||
reasoningEffort: '子智能体推理强度'
|
||
},
|
||
updates: {
|
||
nonInteractiveLocalChanges: '应用内更新本地更改'
|
||
}
|
||
}),
|
||
fieldDescriptions: defineFieldCopy({
|
||
model: '用于新对话,除非你在输入框中选择其他模型。',
|
||
modelContextLength: '保持为 0 则使用所选模型检测到的上下文窗口。',
|
||
fallbackProviders: '默认模型失败时尝试的备用 provider:model 条目。',
|
||
display: {
|
||
personality: '新会话的默认助手风格。',
|
||
showReasoning: '当后端提供推理内容时予以显示。'
|
||
},
|
||
timezone: '当 Hermes 需要本地时间上下文时使用。留空则使用系统时区。',
|
||
agent: {
|
||
imageInputMode: '控制图片附件如何发送给模型。',
|
||
maxTurns: 'Hermes 停止一次运行前工具调用轮次的上限。'
|
||
},
|
||
terminal: {
|
||
cwd: '工具与终端操作的默认项目目录。',
|
||
persistentShell: '当后端支持时,在命令之间保留 Shell 状态。',
|
||
envPassthrough: '传入工具执行的环境变量。'
|
||
},
|
||
codeExecution: {
|
||
mode: '代码执行被限定到当前项目的严格程度。'
|
||
},
|
||
fileReadMaxChars: 'Hermes 单次文件读取可读取的最大字符数。',
|
||
approvals: {
|
||
mode: 'Hermes 如何处理需要显式审批的命令。',
|
||
timeout: '审批提示在超时前等待的时长。'
|
||
},
|
||
security: {
|
||
redactSecrets: '尽可能从模型可见内容中隐藏检测到的密钥。'
|
||
},
|
||
checkpoints: {
|
||
enabled: '在文件编辑前创建可回滚的快照。'
|
||
},
|
||
memory: {
|
||
memoryEnabled: '保存有助于未来会话的持久记忆。',
|
||
userProfileEnabled: '维护一份精简的用户偏好画像。'
|
||
},
|
||
context: {
|
||
engine: '在接近上下文上限时管理长对话的策略。'
|
||
},
|
||
compression: {
|
||
enabled: '当对话变大时对较早的上下文进行摘要。'
|
||
},
|
||
voice: {
|
||
autoTts: '自动朗读助手回复。'
|
||
},
|
||
stt: {
|
||
enabled: '启用本地或提供方支持的语音转写。',
|
||
elevenlabs: {
|
||
languageCode: '可选的 ISO-639-3 语言代码。留空让 ElevenLabs 自动检测。'
|
||
}
|
||
},
|
||
updates: {
|
||
nonInteractiveLocalChanges:
|
||
'Hermes 从应用内更新时(无终端提示),保留本地源码修改(暂存)或丢弃(放弃)。通过终端更新时始终会询问。'
|
||
}
|
||
}),
|
||
about: {
|
||
heading: 'Hermes Desktop',
|
||
version: value => `版本 ${value}`,
|
||
versionUnavailable: '版本不可用',
|
||
updates: '更新',
|
||
checkNow: '立即检查',
|
||
checking: '检查中…',
|
||
seeWhatsNew: '查看新增内容',
|
||
releaseNotes: '发行说明',
|
||
onLatest: '你已是最新版本。',
|
||
installing: '正在安装更新。',
|
||
cantUpdate: '此版本无法在应用内自我更新。',
|
||
cantReach: '无法连接更新服务器。',
|
||
tapCheck: '点击"立即检查"以查找更新。',
|
||
updateReady: count => `已准备好新更新 (包含 ${count} 项更改)。`,
|
||
lastChecked: age => `上次检查:${age}`,
|
||
justNowSuffix: ' · 刚刚',
|
||
automaticUpdates: '自动更新',
|
||
automaticUpdatesDesc: 'Hermes 会在后台自动检查更新,并在有可用更新时通知你。',
|
||
branchCommit: (branch, commit) => `分支 ${branch} · 提交 ${commit}`,
|
||
never: '从未',
|
||
justNow: '刚刚',
|
||
minAgo: count => `${count} 分钟前`,
|
||
hoursAgo: count => `${count} 小时前`,
|
||
daysAgo: count => `${count} 天前`
|
||
},
|
||
config: {
|
||
none: '无',
|
||
noneParen: '(无)',
|
||
notSet: '未设置',
|
||
commaSeparated: '逗号分隔的值',
|
||
loading: '正在加载 Hermes 配置...',
|
||
emptyTitle: '无可配置项',
|
||
emptyDesc: '此分区没有可调整的设置。',
|
||
failedLoad: '设置加载失败',
|
||
autosaveFailed: '自动保存失败',
|
||
imported: '配置已导入',
|
||
invalidJson: '配置 JSON 无效'
|
||
},
|
||
credentials: {
|
||
pasteKey: '粘贴密钥',
|
||
pasteLabelKey: label => `粘贴 ${label} 密钥`,
|
||
optional: '可选',
|
||
enterValueFirst: '请先输入一个值。',
|
||
couldNotSave: '无法保存凭据。',
|
||
remove: '移除',
|
||
or: '或',
|
||
escToCancel: '按 esc 取消',
|
||
getKey: '获取密钥',
|
||
saving: '保存中'
|
||
},
|
||
envActions: {
|
||
actionsFor: label => `${label} 的操作`,
|
||
credentialActions: '凭据操作',
|
||
docs: '文档',
|
||
hideValue: '隐藏值',
|
||
revealValue: '显示值',
|
||
replace: '替换',
|
||
set: '设置',
|
||
clear: '清除'
|
||
},
|
||
gateway: {
|
||
loading: '正在加载网关设置...',
|
||
unavailableTitle: '网关设置不可用',
|
||
unavailableDesc: '桌面 IPC 桥未暴露网关设置。',
|
||
title: '网关连接',
|
||
envOverride: '环境变量覆盖',
|
||
intro:
|
||
'Hermes Desktop 默认会启动自己的本地网关。当你希望此应用控制另一台机器上或可信代理后的现有 Hermes 后端时,可以使用远程网关。下面可按 profile 指定各自的远程主机。',
|
||
appliesTo: '应用于',
|
||
allProfiles: '所有 profile',
|
||
defaultConnection: '默认连接会用于所有没有自定义覆盖的 profile。',
|
||
profileConnection: profile => `仅当“${profile}”是当前 profile 时使用此连接。设为本地即可继承默认连接。`,
|
||
envOverrideTitle: '环境变量正在控制此桌面会话。',
|
||
envOverrideDesc: '取消设置 HERMES_DESKTOP_REMOTE_URL 和 HERMES_DESKTOP_REMOTE_TOKEN 后才会使用下面保存的设置。',
|
||
localTitle: '本地网关',
|
||
localDesc: '在 localhost 启动私有 Hermes 后端。这是默认方式,并且可离线工作。',
|
||
remoteTitle: '远程网关',
|
||
remoteDesc:
|
||
'将此桌面外壳连接到远程 Hermes 后端。托管网关使用 OAuth 或用户名密码;自托管网关也可能使用会话 token。',
|
||
remoteUrlTitle: '远程 URL',
|
||
remoteUrlDesc: '远程 dashboard 后端的基础 URL。支持路径前缀,例如 /hermes。',
|
||
probing: '正在检查此网关的认证方式…',
|
||
probeError: '暂时无法访问此网关。请检查 URL;网关响应后会显示认证方式。',
|
||
signedIn: '已登录',
|
||
signIn: '登录',
|
||
signOut: '退出登录',
|
||
signInWith: provider => `使用 ${provider} 登录`,
|
||
authTitle: '认证',
|
||
authSignedInPassword: '此网关使用用户名和密码。你已登录,会话会自动刷新。',
|
||
authSignedInOauth: '此网关使用 OAuth。你已登录,会话会自动刷新。',
|
||
authNeedsPassword: '此网关使用用户名和密码。请登录以授权此桌面应用。',
|
||
authNeedsOauth: provider => `此网关使用 OAuth。请使用 ${provider} 登录以授权此桌面应用。`,
|
||
tokenTitle: '会话 token',
|
||
tokenDesc: '用于 REST 和 WebSocket 访问的 dashboard 会话 token。留空则保留已保存的 token。',
|
||
existingToken: value => `现有 token ${value}`,
|
||
savedToken: '已保存',
|
||
pasteSessionToken: '粘贴会话 token',
|
||
testRemote: '测试远程',
|
||
saveForRestart: '保存到下次重启',
|
||
saveAndReconnect: '保存并重连',
|
||
diagnostics: '诊断',
|
||
diagnosticsDesc: '在文件管理器中显示 desktop.log,网关启动失败时很有用。',
|
||
openLogs: '打开日志',
|
||
incompleteTitle: '远程网关配置不完整',
|
||
incompleteSignIn: '切换到远程前,请输入远程 URL 并完成登录。',
|
||
incompleteToken: '切换到远程前,请输入远程 URL 和会话 token。',
|
||
incompleteSignInTest: '测试前,请输入远程 URL 并完成登录。',
|
||
incompleteTokenTest: '测试前,请输入远程 URL 和会话 token。',
|
||
enterUrlFirst: '请先输入远程 URL。',
|
||
restartingTitle: '网关连接正在重启',
|
||
savedTitle: '网关设置已保存',
|
||
restartingMessage: 'Hermes Desktop 将使用已保存设置重新连接。',
|
||
savedMessage: '已保存,下一次重启生效。',
|
||
connectedTo: (baseUrl, version) => `已连接到 ${baseUrl}${version ? ` · Hermes ${version}` : ''}`,
|
||
reachableTitle: '远程网关可访问',
|
||
signedOutTitle: '已退出登录',
|
||
signedOutMessage: '已清除远程网关会话。',
|
||
failedLoad: '网关设置加载失败',
|
||
signInFailed: '登录失败',
|
||
signOutFailed: '退出登录失败',
|
||
testFailed: '远程网关测试失败',
|
||
applyFailed: '无法应用网关设置',
|
||
saveFailed: '无法保存网关设置'
|
||
},
|
||
keys: {
|
||
loading: '正在加载 API 密钥和凭据...',
|
||
failedLoad: 'API 密钥加载失败',
|
||
empty: '此类别暂时没有配置项。'
|
||
},
|
||
mcp: {
|
||
loading: '正在加载 MCP 服务器...',
|
||
failedLoad: 'MCP 配置加载失败',
|
||
nameRequiredTitle: '需要名称',
|
||
nameRequiredMessage: '请为此 MCP 服务器提供配置键。',
|
||
objectRequired: '服务器配置必须是 JSON 对象',
|
||
invalidJson: 'MCP JSON 无效',
|
||
saveFailed: '保存失败',
|
||
removeFailed: '移除失败',
|
||
gatewayUnavailableTitle: '网关不可用',
|
||
gatewayUnavailableMessage: '重新加载 MCP 前请先重连网关。',
|
||
reloadedTitle: 'MCP 工具已重新加载',
|
||
reloadedMessage: '新的工具 schema 将应用到后续回合。',
|
||
reloadFailed: 'MCP 重新加载失败',
|
||
savedTitle: 'MCP 服务器已保存',
|
||
savedMessage: name => `${name} 会在 MCP 重新加载后生效。`,
|
||
newServer: '新服务器',
|
||
reload: '重新加载 MCP',
|
||
reloading: '重新加载中...',
|
||
emptyTitle: '没有 MCP 服务器',
|
||
emptyDesc: '添加 stdio 或 HTTP 服务器以暴露 MCP 工具。',
|
||
disabled: '已禁用',
|
||
editServer: '编辑服务器',
|
||
name: '名称',
|
||
serverJson: '服务器 JSON',
|
||
remove: '移除',
|
||
saveServer: '保存服务器'
|
||
},
|
||
model: {
|
||
loading: '正在加载模型配置...',
|
||
appliesDesc: '应用于新会话。可在输入框的模型选择器中临时切换当前对话。',
|
||
provider: '提供方',
|
||
model: '模型',
|
||
applying: '应用中...',
|
||
auxiliaryTitle: '辅助模型',
|
||
resetAllToMain: '全部重置为主模型',
|
||
auxiliaryDesc: '辅助任务默认使用主模型。你可以为任意任务指定专用模型。',
|
||
setToMain: '设为主模型',
|
||
change: '更改',
|
||
autoUseMain: '自动 · 使用主模型',
|
||
providerDefault: '(提供方默认)',
|
||
tasks: {
|
||
vision: { label: '视觉', hint: '图片分析' },
|
||
web_extract: { label: '网页提取', hint: '页面总结' },
|
||
compression: { label: '压缩', hint: '上下文压缩' },
|
||
skills_hub: { label: '技能中心', hint: '技能搜索' },
|
||
approval: { label: '审批', hint: '智能自动批准' },
|
||
mcp: { label: 'MCP', hint: 'MCP 工具路由' },
|
||
title_generation: { label: '标题生成', hint: '会话标题' },
|
||
curator: { label: '维护器', hint: '技能使用审查' }
|
||
}
|
||
},
|
||
providers: {
|
||
connectAccount: '连接账号',
|
||
haveApiKey: '改用 API 密钥?',
|
||
intro: '使用订阅登录,无需复制 API 密钥。Hermes 会在应用中为你完成浏览器登录。',
|
||
connected: '已连接',
|
||
collapse: '收起',
|
||
connectAnother: '连接其他提供方',
|
||
otherProviders: '其他提供方',
|
||
noProviderKeys: '没有可用的提供方 API 密钥。',
|
||
loading: '正在加载提供方...'
|
||
},
|
||
sessions: {
|
||
loading: '正在加载已归档会话…',
|
||
archivedTitle: '已归档会话',
|
||
archivedIntro: '已归档对话会从侧边栏隐藏,但会保留全部消息。在侧边栏 Ctrl/⌘ 点击对话即可归档。',
|
||
emptyArchivedTitle: '暂无归档',
|
||
emptyArchivedDesc: '归档一个对话后会显示在这里。',
|
||
unarchive: '取消归档',
|
||
deletePermanently: '永久删除',
|
||
messages: count => `${count} 条消息`,
|
||
restored: '已恢复',
|
||
deleteConfirm: title => `永久删除“${title}”?此操作无法撤销。`,
|
||
defaultDirTitle: '默认项目目录',
|
||
defaultDirDesc: '新会话默认从此文件夹开始,除非你选择其他目录。留空则使用你的 home 目录。',
|
||
defaultDirUpdated: '默认项目目录已更新',
|
||
defaultsTo: label => `默认使用 ${label}。`,
|
||
change: '更改',
|
||
choose: '选择',
|
||
clear: '清除',
|
||
notSet: '未设置',
|
||
failedLoad: '无法加载已归档会话',
|
||
unarchiveFailed: '取消归档失败',
|
||
deleteFailed: '删除失败',
|
||
updateDirFailed: '无法更新默认目录',
|
||
clearDirFailed: '无法清除默认目录'
|
||
},
|
||
toolsets: {
|
||
loadingConfig: '正在加载配置',
|
||
savedTitle: '凭据已保存',
|
||
savedMessage: key => `${key} 已更新。`,
|
||
removedTitle: '凭据已移除',
|
||
removedMessage: key => `${key} 已移除。`,
|
||
failedSave: key => `保存 ${key} 失败`,
|
||
failedRemove: key => `移除 ${key} 失败`,
|
||
failedReveal: key => `显示 ${key} 失败`,
|
||
removeConfirm: key => `从 .env 中移除 ${key}?`,
|
||
set: '已设置',
|
||
notSet: '未设置',
|
||
selectedTitle: '已选择提供方',
|
||
selectedMessage: provider => `${provider} 现在处于活动状态。`,
|
||
failedSelect: provider => `选择 ${provider} 失败`,
|
||
failedLoad: '工具配置加载失败',
|
||
noProviderOptions: '此工具集没有提供方选项;启用后即可使用当前配置。',
|
||
noProviders: '此工具集当前没有可用提供方。',
|
||
ready: '就绪',
|
||
nousIncluded: '包含在 Nous 订阅中;登录 Nous Portal 即可激活。',
|
||
noApiKeyRequired: '不需要 API 密钥。',
|
||
postSetupHint: step => `此后端需要一次性安装 (${step})。将在此机器上执行,可能需要几分钟。`,
|
||
postSetupRun: '运行设置',
|
||
postSetupRunning: '安装中…',
|
||
postSetupStarting: '启动中…',
|
||
postSetupCompleteTitle: '设置完成',
|
||
postSetupCompleteMessage: step => `已安装 ${step}。`,
|
||
postSetupErrorTitle: '设置完成但有错误',
|
||
postSetupErrorMessage: step => `请检查 ${step} 日志。`,
|
||
postSetupFailed: step => `运行 ${step} 设置失败`
|
||
}
|
||
},
|
||
|
||
skills: {
|
||
tabSkills: '技能',
|
||
tabToolsets: '工具集',
|
||
all: '全部',
|
||
searchSkills: '搜索技能…',
|
||
searchToolsets: '搜索工具集…',
|
||
refresh: '刷新技能',
|
||
refreshing: '正在刷新技能',
|
||
loading: '正在加载能力…',
|
||
noSkillsTitle: '未找到技能',
|
||
noSkillsDesc: '尝试更宽泛的搜索或其他分类。',
|
||
noToolsetsTitle: '未找到工具集',
|
||
noToolsetsDesc: '尝试更宽泛的搜索词。',
|
||
noDescription: '暂无描述。',
|
||
configured: '已配置',
|
||
needsKeys: '需要密钥',
|
||
toolsetsEnabled: (enabled, total) => `已启用 ${enabled}/${total} 个工具集`,
|
||
configureToolset: label => `配置 ${label}`,
|
||
toggleToolset: label => `切换 ${label} 工具集`,
|
||
skillsLoadFailed: '技能加载失败',
|
||
toolsetsRefreshFailed: '工具集刷新失败',
|
||
skillEnabled: '技能已启用',
|
||
skillDisabled: '技能已禁用',
|
||
toolsetEnabled: '工具集已启用',
|
||
toolsetDisabled: '工具集已禁用',
|
||
appliesToNewSessions: name => `${name} 将应用于新会话。`,
|
||
failedToUpdate: name => `更新 ${name} 失败`
|
||
},
|
||
|
||
agents: {
|
||
close: '关闭代理',
|
||
title: '派生树',
|
||
subtitle: '当前回合的子代理实时活动。',
|
||
emptyTitle: '暂无活跃子代理',
|
||
emptyDesc: '当某个回合派发任务时,子代理会在此实时显示进度。',
|
||
running: '运行中',
|
||
failed: '失败',
|
||
done: '完成',
|
||
streaming: '流式传输',
|
||
files: '文件',
|
||
moreFiles: count => `还有 ${count} 个文件`,
|
||
delegation: index => `派发 ${index}`,
|
||
workers: count => `${count} 个工作单元`,
|
||
workersActive: count => `${count} 个活跃`,
|
||
agentsCount: count => `${count} 个代理`,
|
||
activeCount: count => `${count} 个活跃`,
|
||
failedCount: count => `${count} 个失败`,
|
||
toolsCount: count => `${count} 个工具`,
|
||
filesCount: count => `${count} 个文件`,
|
||
updatedAgo: age => `更新于 ${age}`,
|
||
ageNow: '刚刚',
|
||
ageSeconds: seconds => `${seconds} 秒前`,
|
||
ageMinutes: minutes => `${minutes} 分钟前`,
|
||
ageHours: hours => `${hours} 小时前`,
|
||
durationSeconds: seconds => `${seconds} 秒`,
|
||
durationMinutes: (minutes, seconds) => `${minutes} 分 ${seconds} 秒`,
|
||
tokensK: k => `${k}k 词元`,
|
||
tokens: value => `${value} 词元`
|
||
},
|
||
|
||
commandCenter: {
|
||
close: '关闭命令中心',
|
||
paletteTitle: '命令面板',
|
||
back: '返回',
|
||
searchPlaceholder: '搜索会话、视图与操作',
|
||
goTo: '前往',
|
||
commandCenter: '命令中心',
|
||
appearance: '外观',
|
||
settings: '设置',
|
||
changeTheme: '更改主题...',
|
||
changeColorMode: '更改颜色模式...',
|
||
installTheme: {
|
||
title: '安装主题...',
|
||
placeholder: '搜索 VS Code Marketplace...',
|
||
loading: '正在搜索 Marketplace...',
|
||
error: '无法连接到 Marketplace。',
|
||
empty: '没有匹配的主题。',
|
||
install: '安装',
|
||
installing: '安装中...',
|
||
installed: '已安装',
|
||
installs: count => `${count} 次安装`
|
||
},
|
||
settingsFields: '设置字段',
|
||
mcpServers: 'MCP 服务器',
|
||
archivedChats: '已归档对话',
|
||
sections: { sessions: '会话', system: '系统', usage: '用量' },
|
||
sectionDescriptions: {
|
||
sessions: '搜索与管理会话',
|
||
system: '状态、日志与系统操作',
|
||
usage: '一段时间内的词元、成本与技能活动'
|
||
},
|
||
nav: {
|
||
newChat: { title: '新建会话', detail: '开始一个新会话' },
|
||
settings: { title: '设置', detail: '配置 Hermes 桌面端' },
|
||
skills: { title: '技能与工具', detail: '启用技能、工具集与提供方' },
|
||
messaging: { title: '消息平台', detail: '配置 Telegram、Slack、Discord 等' },
|
||
artifacts: { title: '产物', detail: '浏览生成的输出' }
|
||
},
|
||
sectionEntries: {
|
||
sessions: { title: '会话面板', detail: '搜索、置顶与管理会话' },
|
||
system: { title: '系统面板', detail: '网关状态、日志、重启/更新' },
|
||
usage: { title: '用量面板', detail: '词元、成本与技能活动' }
|
||
},
|
||
providerNavigate: '导航',
|
||
providerSessions: '会话',
|
||
refresh: '刷新',
|
||
refreshing: '刷新中…',
|
||
noResults: '未找到匹配结果。',
|
||
pinSession: '置顶会话',
|
||
unpinSession: '取消置顶',
|
||
exportSession: '导出会话',
|
||
deleteSession: '删除会话',
|
||
noSessions: '暂无会话。',
|
||
gatewayRunning: '消息网关运行中',
|
||
gatewayStopped: '消息网关已停止',
|
||
hermesActiveSessions: (version, count) => `Hermes ${version} · 活跃会话 ${count}`,
|
||
restartMessaging: '重启消息服务',
|
||
updateHermes: '更新 Hermes',
|
||
actionRunning: '运行中',
|
||
actionDone: '完成',
|
||
actionFailed: '失败',
|
||
actionStartedWaiting: '操作已启动,等待状态…',
|
||
loadingStatus: '正在加载状态…',
|
||
recentLogs: '最近日志',
|
||
noLogs: '尚未加载日志。',
|
||
days: count => `${count} 天`,
|
||
statSessions: '会话',
|
||
statApiCalls: 'API 调用',
|
||
statTokens: '输入/输出词元',
|
||
statCost: '预估成本',
|
||
actualCost: cost => `实际 ${cost}`,
|
||
loadingUsage: '正在加载用量…',
|
||
noUsage: period => `最近 ${period} 天暂无用量。`,
|
||
retry: '重试',
|
||
dailyTokens: '每日词元',
|
||
input: '输入',
|
||
output: '输出',
|
||
noDailyActivity: '暂无每日活动。',
|
||
topModels: '常用模型',
|
||
noModelUsage: '暂无模型用量。',
|
||
topSkills: '常用技能',
|
||
noSkillActivity: '暂无技能活动。',
|
||
actions: count => `${count} 次操作`
|
||
},
|
||
|
||
messaging: {
|
||
search: '搜索消息平台…',
|
||
loading: '正在加载消息平台…',
|
||
loadFailed: '消息平台加载失败',
|
||
states: {
|
||
connected: '已连接',
|
||
connecting: '连接中',
|
||
disabled: '已禁用',
|
||
fatal: '错误',
|
||
gateway_stopped: '消息网关已停止',
|
||
not_configured: '需要设置',
|
||
pending_restart: '需要重启',
|
||
retrying: '重试中',
|
||
startup_failed: '启动失败'
|
||
},
|
||
unknown: '未知',
|
||
hintPendingRestart: '在状态栏重启网关以应用此更改。',
|
||
hintGatewayStopped: '在状态栏启动网关以建立连接。',
|
||
credentialsSet: '凭据已设置',
|
||
needsSetup: '需要设置',
|
||
gatewayStopped: '消息网关已停止',
|
||
getCredentials: '获取你的凭据',
|
||
openSetupGuide: '打开设置指南',
|
||
required: '必填',
|
||
recommended: '推荐',
|
||
advanced: count => `高级 (${count})`,
|
||
noTokenNeeded: '此平台无需在此填写令牌。请按上方设置指南操作,然后在下方启用。',
|
||
enabled: '已启用',
|
||
disabled: '已禁用',
|
||
unsavedChanges: '有未保存的更改',
|
||
saving: '保存中…',
|
||
saveChanges: '保存更改',
|
||
saved: '已保存',
|
||
replaceValue: '替换当前值',
|
||
openDocs: '打开文档',
|
||
clearField: key => `清除 ${key}`,
|
||
enableAria: name => `启用 ${name}`,
|
||
disableAria: name => `禁用 ${name}`,
|
||
platformEnabled: name => `${name} 已启用`,
|
||
platformDisabled: name => `${name} 已禁用`,
|
||
restartToApply: '重启网关后此更改才会生效。',
|
||
setupSaved: name => `${name} 设置已保存`,
|
||
restartToReconnect: '重启网关以使用新凭据重新连接。',
|
||
keyCleared: key => `${key} 已清除`,
|
||
setupUpdated: name => `${name} 设置已更新。`,
|
||
failedUpdate: name => `更新 ${name} 失败`,
|
||
failedSave: name => `保存 ${name} 失败`,
|
||
failedClear: key => `清除 ${key} 失败`,
|
||
fieldCopy: {
|
||
TELEGRAM_BOT_TOKEN: {
|
||
label: 'Bot 令牌',
|
||
help: '用 @BotFather 创建一个机器人,然后粘贴它给你的令牌。',
|
||
placeholder: '粘贴 Telegram bot 令牌'
|
||
},
|
||
TELEGRAM_ALLOWED_USERS: {
|
||
label: '允许的 Telegram 用户 ID',
|
||
help: '推荐。来自 @userinfobot 的逗号分隔数字 ID。不设置则任何人都能私信你的机器人。'
|
||
},
|
||
TELEGRAM_PROXY: { label: '代理 URL', help: '仅在 Telegram 被屏蔽的网络中需要。' },
|
||
DISCORD_BOT_TOKEN: { label: 'Bot 令牌', help: '在 Discord 开发者门户创建应用,添加机器人,然后粘贴其令牌。' },
|
||
DISCORD_ALLOWED_USERS: { label: '允许的 Discord 用户 ID', help: '推荐。逗号分隔的 Discord 用户 ID。' },
|
||
DISCORD_REPLY_TO_MODE: { label: '回复方式', help: 'first、all 或 off。' },
|
||
DISCORD_ALLOW_ALL_USERS: {
|
||
label: '允许所有 Discord 用户',
|
||
help: '仅用于开发。为 true 时,任何人都可以私信 bot,不需要允许列表。'
|
||
},
|
||
DISCORD_HOME_CHANNEL: { label: '主页频道 ID', help: 'bot 主动发送消息的频道(cron 输出、提醒等)。' },
|
||
DISCORD_HOME_CHANNEL_NAME: { label: '主页频道名称', help: '日志和状态输出中显示的主页频道名称。' },
|
||
BLUEBUBBLES_ALLOW_ALL_USERS: { label: '允许所有 iMessage 用户', help: '为 true 时跳过 BlueBubbles 允许列表。' },
|
||
MATTERMOST_ALLOW_ALL_USERS: { label: '允许所有 Mattermost 用户' },
|
||
MATTERMOST_HOME_CHANNEL: { label: '主页频道' },
|
||
QQ_ALLOW_ALL_USERS: { label: '允许所有 QQ 用户' },
|
||
QQBOT_HOME_CHANNEL: { label: 'QQ 主页频道', help: 'cron 投递的默认频道或群组。' },
|
||
QQBOT_HOME_CHANNEL_NAME: { label: 'QQ 主页频道名称' },
|
||
SLACK_BOT_TOKEN: {
|
||
label: 'Slack bot 令牌',
|
||
help: '安装 Slack 应用后,在 OAuth & Permissions 中找到 bot 令牌。',
|
||
placeholder: '粘贴 Slack bot 令牌'
|
||
},
|
||
SLACK_APP_TOKEN: {
|
||
label: 'Slack app 令牌',
|
||
help: 'Socket Mode 需要 app 级令牌。',
|
||
placeholder: '粘贴 Slack app 令牌'
|
||
},
|
||
SLACK_ALLOWED_USERS: { label: '允许的 Slack 用户 ID', help: '推荐。逗号分隔的 Slack 用户 ID。' },
|
||
MATTERMOST_URL: { label: '服务器 URL', placeholder: 'https://mattermost.example.com' },
|
||
MATTERMOST_TOKEN: { label: 'Bot 令牌' },
|
||
MATTERMOST_ALLOWED_USERS: { label: '允许的用户 ID', help: '推荐。逗号分隔的 Mattermost 用户 ID。' },
|
||
MATRIX_HOMESERVER: { label: 'Homeserver URL', placeholder: 'https://matrix.org' },
|
||
MATRIX_ACCESS_TOKEN: { label: '访问令牌' },
|
||
MATRIX_USER_ID: { label: 'Bot 用户 ID', placeholder: '@hermes:example.org' },
|
||
MATRIX_ALLOWED_USERS: { label: '允许的 Matrix 用户 ID', help: '推荐。@user:server 格式的逗号分隔用户 ID。' },
|
||
SIGNAL_HTTP_URL: {
|
||
label: 'Signal 桥接 URL',
|
||
placeholder: 'http://127.0.0.1:8080',
|
||
help: '运行中的 signal-cli REST 桥接的 URL。'
|
||
},
|
||
SIGNAL_ACCOUNT: { label: '电话号码', help: '在 signal-cli 桥接中注册的号码。' },
|
||
SIGNAL_ALLOWED_USERS: { label: '允许的 Signal 用户', help: '推荐。逗号分隔的 Signal 标识符。' },
|
||
WHATSAPP_ENABLED: { label: '启用 WhatsApp 桥接', help: '由下方开关自动设置。除非确知需要,否则请勿改动。' },
|
||
WHATSAPP_MODE: { label: '桥接模式' },
|
||
WHATSAPP_ALLOWED_USERS: { label: '允许的 WhatsApp 用户', help: '推荐。逗号分隔的电话号码或 WhatsApp ID。' }
|
||
},
|
||
platformIntro: {
|
||
telegram:
|
||
'在 Telegram 中,与 @BotFather 对话,运行 /newbot,复制它给你的令牌。然后从 @userinfobot 获取你的数字用户 ID。',
|
||
discord: '打开 Discord 开发者门户,创建应用,添加 Bot,然后复制其令牌。用正确的权限范围把机器人邀请到你的服务器。',
|
||
slack: '创建 Slack 应用,启用 Socket Mode,安装到你的工作区,然后复制 bot 令牌和 app 级令牌。',
|
||
mattermost: '在你的 Mattermost 服务器上,创建机器人账户或个人访问令牌,然后在此粘贴服务器 URL 和令牌。',
|
||
matrix: '用机器人账户登录你的 homeserver,然后复制访问令牌、用户 ID 和 homeserver URL。',
|
||
signal: '在可访问的位置运行 signal-cli REST 桥接,然后把 Hermes 指向该 URL 和已注册的电话号码。',
|
||
whatsapp: '启动 Hermes 自带的 WhatsApp 桥接,首次运行时扫描二维码,然后启用该平台。',
|
||
bluebubbles: '在装有 iMessage 的 Mac 上运行 BlueBubbles Server,暴露其 API,然后用服务器密码把 Hermes 指向该 URL。',
|
||
homeassistant: '在 Home Assistant 中打开你的个人资料并创建长期访问令牌。把它连同你的 HA URL 一起粘贴到这里。',
|
||
email: '使用专用邮箱。对于 Gmail/Workspace,创建应用专用密码并使用 imap.gmail.com / smtp.gmail.com。',
|
||
sms: '从 Twilio 控制台获取你的 Account SID 和 Auth Token,以及一个可发送短信的电话号码。',
|
||
dingtalk: '在开发者控制台创建钉钉应用,然后在此复制 Client ID(App key) 和 Client Secret。',
|
||
feishu: '创建飞书 / Lark 应用,配置机器人能力,复制 App ID、App secret 和事件加密密钥。',
|
||
wecom: '在企业微信中添加群机器人,复制其 webhook key 作为 WECOM_BOT_ID。仅可发送——双向请用企业微信 (应用) 选项。',
|
||
wecom_callback: '设置一个企业微信自建应用,暴露其回调 URL,并提供 corp ID、secret、agent ID 和 AES key。',
|
||
weixin: '登录微信公众平台,复制 AppID 和 Token,并把消息回调 URL 指向 Hermes。',
|
||
qqbot: '在 QQ 开放平台 (q.qq.com) 注册一个应用,复制 App ID 和 Client Secret。',
|
||
api_server:
|
||
'把 Hermes 暴露为兼容 OpenAI 的 API。设置一个鉴权密钥,然后把 Open WebUI / LobeChat 等指向 host:port。',
|
||
webhook: '运行一个 HTTP 服务器,供其他工具 (GitHub、GitLab、自定义应用)POST。用 secret 验证签名。'
|
||
}
|
||
},
|
||
|
||
profiles: {
|
||
close: '关闭配置档案',
|
||
nameHint: '小写字母、数字、连字符和下划线。必须以字母或数字开头。',
|
||
title: '配置档案',
|
||
count: count => `${count} 个配置档案`,
|
||
loading: '正在加载配置档案…',
|
||
newProfile: '新建配置档案',
|
||
allProfiles: '全部配置档案',
|
||
showAllProfiles: '显示全部配置档案',
|
||
switchToProfile: name => `切换到 ${name}`,
|
||
manageProfiles: '管理配置档案...',
|
||
actionsFor: name => `${name} 的操作`,
|
||
color: '颜色...',
|
||
colorFor: name => `${name} 的颜色`,
|
||
setColor: color => `设置颜色 ${color}`,
|
||
autoColor: '自动',
|
||
noProfiles: '暂无配置档案。',
|
||
selectPrompt: '选择一个配置档案以查看其详情。',
|
||
refresh: '刷新配置档案',
|
||
refreshing: '正在刷新配置档案',
|
||
default: '默认',
|
||
skills: count => `${count} 个技能`,
|
||
env: 'env',
|
||
defaultBadge: '默认',
|
||
rename: '重命名',
|
||
copySetup: '复制安装命令',
|
||
copying: '复制中…',
|
||
modelLabel: '模型',
|
||
skillsLabel: '技能',
|
||
notSet: '未设置',
|
||
soulDesc: '内置于此配置档案的系统提示词与人格指令。',
|
||
soulOptional: '可选',
|
||
soulPlaceholder: mode => `此配置档案的系统提示词 / 人格说明。\n留空则保留${mode}默认值。`,
|
||
soulPlaceholderCloned: '克隆的',
|
||
soulPlaceholderEmpty: '空的',
|
||
unsavedChanges: '有未保存的更改',
|
||
loadingSoul: '正在加载 SOUL.md…',
|
||
emptySoul: '空的 SOUL.md —— 开始撰写人格设定…',
|
||
saving: '保存中…',
|
||
saveSoul: '保存 SOUL.md',
|
||
deleteTitle: '删除配置档案?',
|
||
deleteDescPrefix: '这将删除 ',
|
||
deleteDescMid: ' 并移除其 ',
|
||
deleteDescSuffix: ' 目录。此操作无法撤销。',
|
||
deleting: '删除中…',
|
||
createDesc: '配置档案是相互独立的 Hermes 环境:各自拥有独立的配置、技能和 SOUL.md。',
|
||
nameLabel: '名称',
|
||
cloneFromDefault: '从默认档案克隆',
|
||
cloneFromDefaultDesc: '从你的默认配置档案复制配置、技能和 SOUL.md。',
|
||
invalidName: hint => `名称无效。${hint}`,
|
||
nameRequired: '名称为必填项。',
|
||
creating: '创建中…',
|
||
createAction: '创建配置档案',
|
||
renameTitle: '重命名配置档案',
|
||
renameDescPrefix: '重命名会更新配置档案目录以及 ',
|
||
renameDescSuffix: ' 中的所有包装脚本。',
|
||
newNameLabel: '新名称',
|
||
renaming: '重命名中…',
|
||
created: '配置档案已创建',
|
||
renamed: '配置档案已重命名',
|
||
deleted: '配置档案已删除',
|
||
setupCopied: '安装命令已复制',
|
||
soulSaved: 'SOUL.md 已保存',
|
||
failedLoad: '加载配置档案失败',
|
||
failedDelete: '删除配置档案失败',
|
||
failedCopy: '复制安装命令失败',
|
||
failedLoadSoul: '加载 SOUL.md 失败',
|
||
failedSaveSoul: '保存 SOUL.md 失败',
|
||
failedCreate: '创建配置档案失败',
|
||
failedRename: '重命名配置档案失败'
|
||
},
|
||
|
||
cron: {
|
||
close: '关闭定时任务',
|
||
search: '搜索定时任务…',
|
||
loading: '正在加载定时任务…',
|
||
states: {
|
||
enabled: '已启用',
|
||
scheduled: '已排程',
|
||
running: '运行中',
|
||
paused: '已暂停',
|
||
disabled: '已禁用',
|
||
error: '错误',
|
||
completed: '已完成'
|
||
},
|
||
deliveryLabels: {
|
||
local: '此桌面',
|
||
telegram: 'Telegram',
|
||
discord: 'Discord',
|
||
slack: 'Slack',
|
||
email: '电子邮件'
|
||
},
|
||
scheduleLabels: {
|
||
daily: '每天',
|
||
weekdays: '工作日',
|
||
weekly: '每周',
|
||
monthly: '每月',
|
||
hourly: '每小时',
|
||
'every-15-minutes': '每 15 分钟',
|
||
custom: '自定义'
|
||
},
|
||
scheduleHints: {
|
||
daily: '每天上午 9:00',
|
||
weekdays: '周一至周五上午 9:00',
|
||
weekly: '每周一上午 9:00',
|
||
monthly: '每月第一天上午 9:00',
|
||
hourly: '每个整点',
|
||
'every-15-minutes': '每 15 分钟',
|
||
custom: 'Cron 语法或自然语言'
|
||
},
|
||
days: {
|
||
'0': '周日',
|
||
'1': '周一',
|
||
'2': '周二',
|
||
'3': '周三',
|
||
'4': '周四',
|
||
'5': '周五',
|
||
'6': '周六',
|
||
'7': '周日'
|
||
},
|
||
dayFallback: value => `第 ${value} 天`,
|
||
everyDayAt: time => `每天 ${time}`,
|
||
weekdaysAt: time => `工作日 ${time}`,
|
||
everyDayOfWeekAt: (day, time) => `每${day} ${time}`,
|
||
monthlyOnDayAt: (dayOfMonth, time) => `每月 ${dayOfMonth} 日 ${time}`,
|
||
topOfHour: '每个整点',
|
||
everyHourAt: minute => `每小时的 :${minute}`,
|
||
newCron: '新建定时任务',
|
||
emptyDescNew: '按 cron 表达式排程一个提示词。Hermes 会运行它,并把结果发送到你选择的目的地。',
|
||
emptyDescSearch: '尝试更宽泛的搜索词。',
|
||
emptyTitleNew: '暂无排程任务',
|
||
emptyTitleSearch: '无匹配项',
|
||
last: '上次:',
|
||
next: '下次:',
|
||
noRuns: '尚无运行',
|
||
manage: '管理',
|
||
showRuns: '显示运行记录',
|
||
hideRuns: '隐藏运行记录',
|
||
runHistory: '运行记录',
|
||
actionsFor: title => `${title} 的操作`,
|
||
actionsTitle: '定时任务操作',
|
||
resume: '恢复定时任务',
|
||
pause: '暂停定时任务',
|
||
resumeTitle: '恢复',
|
||
pauseTitle: '暂停',
|
||
triggerNow: '立即触发',
|
||
edit: '编辑定时任务',
|
||
deleteTitle: '删除定时任务?',
|
||
deleteDescPrefix: '这将永久移除 ',
|
||
deleteDescSuffix: '。它会立即停止触发。',
|
||
deleting: '删除中…',
|
||
resumed: '定时任务已恢复',
|
||
paused: '定时任务已暂停',
|
||
triggered: '定时任务已触发',
|
||
deleted: '定时任务已删除',
|
||
created: '定时任务已创建',
|
||
updated: '定时任务已更新',
|
||
failedLoad: '加载定时任务失败',
|
||
failedUpdate: '更新定时任务失败',
|
||
failedTrigger: '触发定时任务失败',
|
||
failedDelete: '删除定时任务失败',
|
||
failedSave: '保存定时任务失败',
|
||
editTitle: '编辑定时任务',
|
||
createTitle: '新建定时任务',
|
||
editDesc: '更新排程、提示词或投递目标。更改将在下次运行时生效。',
|
||
createDesc: '排程一个提示词以自动运行。使用 cron 语法或类似"每 15 分钟"的自然语言。',
|
||
nameLabel: '名称',
|
||
namePlaceholder: '晨间简报',
|
||
promptLabel: '提示词',
|
||
promptPlaceholder: '总结我未读的 Slack 话题,并把前 5 条邮件发给我…',
|
||
frequencyLabel: '频率',
|
||
deliverLabel: '投递至',
|
||
customScheduleLabel: '自定义排程',
|
||
customPlaceholder: '0 9 * * * 或 weekdays at 9am',
|
||
customHint: 'Cron 表达式,或类似"每小时""工作日上午 9 点"的短语。',
|
||
optional: '可选',
|
||
promptScheduleRequired: '提示词和排程为必填项。',
|
||
saveChanges: '保存更改',
|
||
createAction: '创建定时任务'
|
||
},
|
||
|
||
artifacts: {
|
||
search: '搜索产物…',
|
||
refresh: '刷新产物',
|
||
refreshing: '正在刷新产物',
|
||
indexing: '正在索引最近会话的产物',
|
||
tabAll: '全部',
|
||
tabImages: '图片',
|
||
tabFiles: '文件',
|
||
tabLinks: '链接',
|
||
noArtifactsTitle: '未找到产物',
|
||
noArtifactsDesc: '当会话生成图片和文件输出时,它们会显示在这里。',
|
||
failedLoad: '产物加载失败',
|
||
openFailed: '打开失败',
|
||
itemsImage: '张图片',
|
||
itemsLink: '个链接',
|
||
itemsFile: '个文件',
|
||
itemsGeneric: '项',
|
||
zero: '0',
|
||
rangeOf: (start, end, total) => `${start}-${end},共 ${total}`,
|
||
goToPage: (itemLabel, page) => `前往${itemLabel}第 ${page} 页`,
|
||
colTitleLink: '链接标题',
|
||
colTitleFile: '名称',
|
||
colTitleDefault: '标题 / 名称',
|
||
colLocationLink: 'URL',
|
||
colLocationFile: '路径',
|
||
colLocationDefault: '位置',
|
||
colSession: '会话',
|
||
kindImage: '图片',
|
||
kindFile: '文件',
|
||
kindLink: '链接',
|
||
chat: '对话',
|
||
copyUrl: '复制 URL',
|
||
copyPath: '复制路径'
|
||
},
|
||
|
||
sidebar: {
|
||
nav: {
|
||
'new-session': '新建会话',
|
||
skills: '技能与工具',
|
||
messaging: '消息平台',
|
||
artifacts: '产物'
|
||
},
|
||
searchAria: '搜索会话',
|
||
searchPlaceholder: '搜索会话…',
|
||
clearSearch: '清除搜索',
|
||
noMatch: query => `没有会话匹配"${query}"。`,
|
||
results: '结果',
|
||
pinned: '已置顶',
|
||
sessions: '会话',
|
||
cronJobs: '定时任务',
|
||
groupAriaGrouped: '以单一列表显示会话',
|
||
groupAriaUngrouped: '按工作区分组会话',
|
||
groupTitleGrouped: '取消分组',
|
||
groupTitleUngrouped: '按工作区分组',
|
||
allPinned: '这里的全部已置顶。取消置顶某个对话即可在最近中显示。',
|
||
shiftClickHint: 'Shift+ 单击对话以置顶 · 拖动以重新排序',
|
||
noWorkspace: '无工作区',
|
||
newSessionIn: label => `在 ${label} 中新建会话`,
|
||
reorderWorkspace: label => `重新排序工作区 ${label}`,
|
||
showMoreIn: (count, label) => `在 ${label} 中再显示 ${count} 个`,
|
||
loading: '加载中…',
|
||
loadMore: '加载更多',
|
||
loadCount: step => `再加载 ${step} 个`,
|
||
row: {
|
||
pin: '置顶',
|
||
unpin: '取消置顶',
|
||
copyId: '复制 ID',
|
||
export: '导出',
|
||
rename: '重命名',
|
||
archive: '归档',
|
||
newWindow: '新窗口',
|
||
copyIdFailed: '无法复制会话 ID',
|
||
actionsFor: title => `${title} 的操作`,
|
||
sessionActions: '会话操作',
|
||
sessionRunning: '会话运行中',
|
||
needsInput: '需要你输入',
|
||
waitingForAnswer: '正在等待你的回答',
|
||
handoffOrigin: platform => `从 ${platform} 转接`,
|
||
renamed: '已重命名',
|
||
renameFailed: '重命名失败',
|
||
renameTitle: '重命名会话',
|
||
renameDesc: '给这个对话起一个好记的标题。留空则清除。',
|
||
untitledPlaceholder: '无标题会话',
|
||
ageNow: '刚刚',
|
||
ageDay: '天',
|
||
ageHour: '时',
|
||
ageMin: '分'
|
||
}
|
||
},
|
||
|
||
composer: {
|
||
message: '消息',
|
||
wakingProfile: profile => `正在唤醒 ${profile}…`,
|
||
placeholderStarting: '正在启动 Hermes…',
|
||
placeholderReconnecting: '正在重新连接 Hermes…',
|
||
placeholderFollowUp: '发送后续消息',
|
||
newSessionPlaceholders: [
|
||
'我们要构建什么?',
|
||
'给 Hermes 一个任务',
|
||
'你在想什么?',
|
||
'描述你需要什么',
|
||
'我们该处理什么?',
|
||
'随便问点什么',
|
||
'从一个目标开始'
|
||
],
|
||
followUpPlaceholders: [
|
||
'发送后续消息',
|
||
'补充更多上下文',
|
||
'细化这个请求',
|
||
'下一步是什么?',
|
||
'继续推进',
|
||
'再深入一点',
|
||
'调整或继续'
|
||
],
|
||
startVoice: '开始语音对话',
|
||
queueMessage: '排队消息',
|
||
steer: '引导当前运行',
|
||
stop: '停止',
|
||
send: '发送',
|
||
speaking: '讲话中',
|
||
transcribing: '转写中',
|
||
thinking: '思考中',
|
||
muted: '已静音',
|
||
listening: '聆听中',
|
||
muteMic: '麦克风静音',
|
||
unmuteMic: '取消麦克风静音',
|
||
stopListening: '停止聆听并发送',
|
||
stopShort: '停止',
|
||
endConversation: '结束语音对话',
|
||
endShort: '结束',
|
||
stopDictation: '停止听写',
|
||
transcribingDictation: '正在转写听写',
|
||
voiceDictation: '语音听写',
|
||
lookupLoading: '查找中…',
|
||
lookupNoMatches: '没有匹配项。',
|
||
lookupTry: '试试',
|
||
lookupOr: '或',
|
||
commonCommands: '常用命令',
|
||
hotkeys: '快捷键',
|
||
helpFooter: '打开完整面板 · 退格键关闭',
|
||
commandDescs: {
|
||
'/help': '命令与快捷键的完整列表',
|
||
'/clear': '开始新会话',
|
||
'/resume': '恢复之前的会话',
|
||
'/details': '控制对话记录的详细程度',
|
||
'/copy': '复制所选内容或最后一条助手消息',
|
||
'/quit': '退出 hermes'
|
||
},
|
||
hotkeyDescs: {
|
||
'@': '引用文件、文件夹、URL、git',
|
||
'/': '斜杠命令面板',
|
||
'?': '此快速帮助 (删除以关闭)',
|
||
Enter: '发送 · Shift+Enter 换行',
|
||
'Cmd/Ctrl+K': '发送下一条排队的回合',
|
||
'Cmd/Ctrl+L': '重绘',
|
||
Esc: '关闭弹窗 · 取消运行',
|
||
'↑ / ↓': '循环弹窗 / 历史'
|
||
},
|
||
attachUrlTitle: '附加 URL',
|
||
attachUrlDesc: 'Hermes 将抓取该页面并作为本回合的上下文。',
|
||
urlPlaceholder: 'https://example.com/post',
|
||
urlHintPre: '请包含完整 URL,例如 ',
|
||
attach: '附加',
|
||
queued: count => `${count} 条排队`,
|
||
attachmentOnly: '仅附件回合',
|
||
emptyTurn: '空回合',
|
||
attachments: count => `${count} 个附件`,
|
||
editingInComposer: '正在输入框中编辑',
|
||
editingQueuedInComposer: '正在输入框中编辑排队回合',
|
||
editQueued: '编辑排队回合',
|
||
sendQueuedNext: '下一个发送排队回合',
|
||
sendQueuedNow: '立即发送排队回合',
|
||
deleteQueued: '删除排队回合',
|
||
previewUnavailable: '预览不可用',
|
||
previewLabel: label => `预览 ${label}`,
|
||
couldNotPreview: label => `无法预览 ${label}`,
|
||
removeAttachment: label => `移除 ${label}`,
|
||
dictating: '听写中',
|
||
preparingAudio: '正在准备音频',
|
||
speakingResponse: '正在朗读回复',
|
||
readingAloud: '朗读中',
|
||
themeSuggestions: '桌面主题建议',
|
||
noMatchingThemes: '没有匹配的主题。',
|
||
themeTryPre: '试试 ',
|
||
themeTryPost: '。',
|
||
attachLabel: '附加',
|
||
files: '文件…',
|
||
folder: '文件夹…',
|
||
images: '图片…',
|
||
pasteImage: '粘贴图片',
|
||
url: 'URL…',
|
||
promptSnippets: '提示词片段…',
|
||
tipPre: '提示:输入 ',
|
||
tipPost: ' 以内联引用文件。',
|
||
snippetsTitle: '提示词片段',
|
||
snippetsDesc: '选择一个起始提示词放入输入框。',
|
||
dropFiles: '拖放文件以附加',
|
||
dropSession: '拖放以链接此对话',
|
||
snippets: {
|
||
codeReview: {
|
||
label: '代码审查',
|
||
description: '审查当前更改是否存在回归、遗漏的边界情况和缺失的测试。',
|
||
text: '请审查这部分是否存在缺陷、回归和缺失的测试。'
|
||
},
|
||
implementationPlan: {
|
||
label: '实现计划',
|
||
description: '在动代码之前先勾勒方案,让 diff 保持聚焦。',
|
||
text: '请在修改代码前制定一个简洁的实现计划。'
|
||
},
|
||
explainThis: {
|
||
label: '解释这段',
|
||
description: '讲解所选代码的工作方式,并链接到关键文件。',
|
||
text: '请解释这是如何工作的,并指给我关键文件。'
|
||
}
|
||
}
|
||
},
|
||
|
||
updates: {
|
||
stages: {
|
||
idle: '准备中…',
|
||
prepare: '准备中…',
|
||
fetch: '下载中…',
|
||
pull: '马上完成…',
|
||
pydeps: '收尾中…',
|
||
restart: '正在重启 Hermes…',
|
||
manual: '从终端更新',
|
||
error: '更新已暂停'
|
||
},
|
||
checking: '正在检查更新…',
|
||
checkFailedTitle: '无法检查更新',
|
||
tryAgain: '重试',
|
||
notAvailableTitle: '更新不可用',
|
||
unsupportedMessage: '此版本的 Hermes 无法在应用内自行更新。',
|
||
connectionRetry: '请检查网络连接后重试。',
|
||
latestBody: '你正在运行最新版本。',
|
||
latestBodyBackend: '后端正在运行最新版本。',
|
||
allSetTitle: '已是最新',
|
||
availableTitle: '有可用更新',
|
||
availableBody: '新版 Hermes 已可安装。',
|
||
availableTitleBackend: '后端有可用更新',
|
||
availableBodyBackend: '已连接的 Hermes 后端有新版本可安装。',
|
||
availableBodyNoChangelog: '已有新版本可用。此安装方式无法显示更新日志。',
|
||
updateNow: '立即更新',
|
||
maybeLater: '稍后再说',
|
||
moreChanges: count => `另有 ${count} 项更改。`,
|
||
manualTitle: '从终端更新',
|
||
manualBody: '你是从命令行安装的 Hermes,因此更新也需要在那里运行。请将此命令粘贴到终端:',
|
||
manualPickedUp: '下次启动 Hermes 时会使用新版本。',
|
||
copy: '复制',
|
||
copied: '已复制',
|
||
done: '完成',
|
||
applyingBody: 'Hermes 更新器会在自己的窗口中接管,并在完成后重新打开 Hermes。',
|
||
applyingBodyBackend: '远程后端正在应用更新并将重启。恢复后 Hermes 会自动重新连接。',
|
||
applyingClose: 'Hermes 将关闭以应用更新。',
|
||
errorTitle: '更新未完成',
|
||
errorBody: '没有数据丢失。你可以现在重试。',
|
||
notNow: '暂不',
|
||
applyStatus: {
|
||
preparing: '正在更新后端…',
|
||
pulling: '后端更新中…',
|
||
restarting: '后端正在重启以加载更新…',
|
||
notAvailable: '此后端无法更新。',
|
||
failed: '后端更新失败。',
|
||
noReturn: '后端未恢复在线。更新可能未完成——请检查后端主机。'
|
||
}
|
||
},
|
||
|
||
install: {
|
||
stageStates: {
|
||
pending: '等待中',
|
||
running: '安装中',
|
||
succeeded: '完成',
|
||
skipped: '已跳过',
|
||
failed: '失败'
|
||
},
|
||
oneTimeTitle: 'Hermes 需要一次性安装',
|
||
unsupportedDesc: platform =>
|
||
`${platform} 暂不支持自动首次启动安装。请打开终端并运行下面的命令,然后重新启动此应用。之后启动会跳过此步骤。`,
|
||
installCommand: '安装命令',
|
||
copyCommand: '复制命令',
|
||
viewDocs: '查看安装文档',
|
||
installTo: '将安装到',
|
||
retryAfterRun: '我已运行 -- 重试',
|
||
failedTitle: '安装失败',
|
||
settingUpTitle: '正在设置 Hermes Agent',
|
||
finishingTitle: '正在收尾',
|
||
failedDesc:
|
||
'某个安装步骤失败。在 Windows 上,如果另一个 Hermes CLI 或桌面实例正在运行,可能会出现这种情况。请停止正在运行的 Hermes 实例后重试。可查看下面的详情或 desktop 日志中的完整记录。',
|
||
activeDesc: '这是一次性设置。Hermes 安装器正在下载依赖并配置你的机器。之后启动会跳过此步骤。',
|
||
progress: (completed, total) => `${completed}/${total} 个步骤已完成`,
|
||
currentStage: stage => ` -- 当前:${stage}`,
|
||
fetchingManifest: '正在获取安装器 manifest...',
|
||
error: '错误',
|
||
hideOutput: '隐藏安装器输出',
|
||
showOutput: '显示安装器输出',
|
||
lines: count => `${count} 行`,
|
||
noOutput: '暂无输出。',
|
||
cancelling: '取消中...',
|
||
cancelInstall: '取消安装',
|
||
transcriptSaved: '完整记录已保存到',
|
||
copiedOutput: '已复制!',
|
||
copyOutput: '复制输出',
|
||
reloadRetry: '重新加载并重试'
|
||
},
|
||
|
||
onboarding: {
|
||
headerTitle: '开始设置 Hermes Agent',
|
||
headerDesc: '连接模型提供方即可开始对话。大多数选项只需一次点击。',
|
||
preparingInstall: 'Hermes 正在完成安装。首次运行通常不到一分钟。',
|
||
starting: '正在启动 Hermes…',
|
||
lookingUpProviders: '正在查找提供方...',
|
||
collapse: '收起',
|
||
otherProviders: '其他提供方',
|
||
haveApiKey: '我有 API 密钥',
|
||
chooseLater: '稍后再选择提供方',
|
||
recommended: '推荐',
|
||
connected: '已连接',
|
||
featuredPitch: '一个订阅,300+ 前沿模型 — 运行 Hermes 的推荐方式',
|
||
openRouterPitch: '一个密钥,数百个模型 — 稳妥的默认选择',
|
||
apiKeyOptions: {
|
||
openrouter: { short: '一个密钥,多个模型', description: '用一个密钥访问数百个模型。适合新安装的默认选择。' },
|
||
openai: { short: 'GPT 级模型', description: '直接访问 OpenAI 模型。' },
|
||
gemini: { short: 'Gemini 模型', description: '直接访问 Google Gemini 模型。' },
|
||
xai: { short: 'Grok 模型', description: '直接访问 xAI Grok 模型。' },
|
||
local: {
|
||
short: '自托管',
|
||
description: '将 Hermes 指向本地或自托管的 OpenAI 兼容端点 (vLLM、llama.cpp、Ollama 等)。'
|
||
}
|
||
},
|
||
backToSignIn: '返回登录',
|
||
getKey: '获取密钥',
|
||
replaceCurrent: '替换当前值',
|
||
pasteApiKey: '粘贴 API 密钥',
|
||
couldNotSave: '无法保存凭据。',
|
||
connecting: '连接中',
|
||
update: '更新',
|
||
flowSubtitles: {
|
||
pkce: '打开浏览器登录,然后回到这里继续',
|
||
device_code: '在浏览器中打开验证页面 — Hermes 会自动连接',
|
||
loopback: '打开浏览器登录 — Hermes 会自动连接',
|
||
external: '先在终端登录一次,然后回来继续对话'
|
||
},
|
||
startingSignIn: provider => `正在为 ${provider} 启动登录...`,
|
||
verifyingCode: provider => `正在通过 ${provider} 验证你的代码...`,
|
||
connectedProvider: provider => `${provider} 已连接`,
|
||
connectedPicking: provider => `${provider} 已连接。正在选择默认模型...`,
|
||
signInFailed: '登录失败,请重试。',
|
||
pickDifferentProvider: '选择其他提供方',
|
||
signInWith: provider => `使用 ${provider} 登录`,
|
||
openedBrowser: provider => `已在浏览器中打开 ${provider}。`,
|
||
authorizeThere: '请在那里授权 Hermes。',
|
||
copyAuthCode: '复制授权码并粘贴到下面。',
|
||
pasteAuthCode: '粘贴授权码',
|
||
reopenAuthPage: '重新打开授权页面',
|
||
autoBrowser: provider => `已在浏览器中打开 ${provider}。请在那里授权 Hermes,连接会自动完成,无需复制或粘贴。`,
|
||
reopenSignInPage: '重新打开登录页面',
|
||
waitingAuthorize: '等待你授权...',
|
||
externalPending: provider => `${provider} 通过自己的 CLI 登录。请在终端运行此命令,然后回来选择“我已登录”:`,
|
||
signedIn: '我已登录',
|
||
deviceCodeOpened: provider => `已在浏览器中打开 ${provider}。请在那里输入此代码:`,
|
||
reopenVerification: '重新打开验证页面',
|
||
copy: '复制',
|
||
defaultModel: '默认模型',
|
||
freeTier: '免费层',
|
||
pro: 'Pro',
|
||
free: '免费',
|
||
price: (input, output) => `${input} 输入 / ${output} 输出每 Mtok`,
|
||
change: '更改',
|
||
startChatting: '开始',
|
||
docs: provider => `${provider} 文档`
|
||
},
|
||
|
||
modelPicker: {
|
||
title: '切换模型',
|
||
current: '当前:',
|
||
unknown: '(未知)',
|
||
search: '筛选提供方和模型...',
|
||
noModels: '未找到模型。',
|
||
persistGlobalSession: '全局保存 (否则仅当前会话)',
|
||
persistGlobal: '全局保存',
|
||
addProvider: '添加提供方',
|
||
loadFailed: '无法加载模型',
|
||
noAuthenticatedProviders: '没有已认证的提供方。',
|
||
pro: 'Pro',
|
||
proNeedsSubscription: 'Pro 模型需要付费 Nous 订阅。',
|
||
free: '免费',
|
||
freeTier: '免费层',
|
||
priceTitle: '每百万 token 的输入/输出价格'
|
||
},
|
||
|
||
modelVisibility: {
|
||
title: '模型',
|
||
search: '搜索模型',
|
||
noAuthenticatedProviders: '没有已认证的提供方。',
|
||
addProvider: '添加提供方…'
|
||
},
|
||
|
||
shell: {
|
||
windowControls: '窗口控件',
|
||
paneControls: '面板控件',
|
||
appControls: '应用控件',
|
||
modelMenu: {
|
||
search: '搜索模型',
|
||
noModels: '未找到模型',
|
||
editModels: '编辑模型…',
|
||
fast: '快速',
|
||
medium: '中'
|
||
},
|
||
modelOptions: {
|
||
noOptions: '此模型没有可用选项',
|
||
options: '选项',
|
||
thinking: '思考',
|
||
fast: '快速',
|
||
effort: '推理强度',
|
||
minimal: '最小',
|
||
low: '低',
|
||
medium: '中',
|
||
high: '高',
|
||
max: '最高',
|
||
updateFailed: '模型选项更新失败',
|
||
fastFailed: '快速模式更新失败'
|
||
},
|
||
gatewayMenu: {
|
||
gateway: '网关',
|
||
connected: '已连接',
|
||
connecting: '连接中',
|
||
offline: '离线',
|
||
inferenceReady: '推理已就绪',
|
||
inferenceNotReady: '推理未就绪',
|
||
checkingInference: '正在检查推理',
|
||
disconnected: '已断开',
|
||
openSystem: '打开系统面板',
|
||
connection: label => `连接:${label}`,
|
||
recentActivity: '最近活动',
|
||
viewAllLogs: '查看全部日志 →',
|
||
messagingPlatforms: '消息平台'
|
||
},
|
||
statusbar: {
|
||
unknown: '未知',
|
||
restart: '重启',
|
||
update: '更新',
|
||
updateInProgress: '正在更新',
|
||
commitsBehind: (count, branch) => `落后 ${branch} ${count} 个提交`,
|
||
desktopVersion: version => `Hermes Desktop v${version}`,
|
||
backendVersion: version => `后端 v${version}`,
|
||
clientLabel: version => `客户端 v${version}`,
|
||
backendLabel: version => `后端 v${version}`,
|
||
commit: sha => `提交 ${sha}`,
|
||
branch: branch => `分支 ${branch}`,
|
||
closeCommandCenter: '关闭命令中心',
|
||
openCommandCenter: '打开命令中心',
|
||
showTerminal: '显示终端',
|
||
hideTerminal: '隐藏终端',
|
||
gateway: '网关',
|
||
gatewayReady: '就绪',
|
||
gatewayNeedsSetup: '需要设置',
|
||
gatewayChecking: '检查中',
|
||
gatewayConnecting: '连接中',
|
||
gatewayOffline: '离线',
|
||
gatewayTitle: 'Hermes 推理网关状态',
|
||
agents: '代理',
|
||
closeAgents: '关闭代理',
|
||
openAgents: '打开代理',
|
||
subagents: count => `${count} 个子代理`,
|
||
failed: count => `${count} 个失败`,
|
||
running: count => `${count} 个运行中`,
|
||
cron: '排程',
|
||
openCron: '打开排程任务',
|
||
turnRunning: '运行中',
|
||
currentTurnElapsed: '当前回合已用时间',
|
||
contextUsage: '上下文用量',
|
||
session: '会话',
|
||
runtimeSessionElapsed: '运行时会话已用时间',
|
||
yoloOn: 'YOLO 已开启 - 自动批准危险命令。点击关闭。Shift+点击可全局切换。',
|
||
yoloOff: 'YOLO 已关闭 - 点击自动批准危险命令。Shift+点击可全局切换。',
|
||
modelNone: '无',
|
||
noModel: '无模型',
|
||
switchModel: '切换模型',
|
||
openModelPicker: '打开模型选择器',
|
||
modelTitle: (provider, model) => `模型 · ${provider}: ${model}`,
|
||
providerModelTitle: (provider, model) => `${provider} · ${model}`
|
||
}
|
||
},
|
||
|
||
rightSidebar: {
|
||
aria: '右侧边栏',
|
||
panelsAria: '右侧边栏面板',
|
||
files: '文件系统',
|
||
terminal: '终端',
|
||
noFolderSelected: '未选择文件夹',
|
||
changeCwdTitle: '更改工作目录',
|
||
folderTip: cwd => `${cwd} — 点击更改文件夹`,
|
||
openFolder: '打开文件夹',
|
||
refreshTree: '刷新文件树',
|
||
collapseAll: '折叠所有文件夹',
|
||
previewUnavailable: '预览不可用',
|
||
couldNotPreview: path => `无法预览 ${path}`,
|
||
noProjectTitle: '没有项目',
|
||
noProjectBody: '从状态栏设置工作目录后即可浏览文件。',
|
||
unreadableTitle: '无法读取',
|
||
unreadableBody: error => `无法读取此文件夹 (${error})。`,
|
||
emptyTitle: '空文件夹',
|
||
emptyBody: '此文件夹为空。',
|
||
treeErrorTitle: '文件树错误',
|
||
treeErrorBody: '文件树渲染此文件夹时出错。',
|
||
tryAgain: '重试',
|
||
loadingTree: '正在加载文件树',
|
||
loadingFiles: '正在加载文件',
|
||
terminalHide: '隐藏终端',
|
||
addToChat: '添加到对话'
|
||
},
|
||
|
||
preview: {
|
||
tab: '预览',
|
||
closeTab: label => `关闭 ${label}`,
|
||
closePane: '关闭预览面板',
|
||
loading: '正在加载预览',
|
||
unavailable: '预览不可用',
|
||
opening: '正在打开...',
|
||
hide: '隐藏',
|
||
openPreview: '打开预览',
|
||
sourceLineTitle: '点击选择 · shift 点击扩展 · 拖到输入框',
|
||
source: '源码',
|
||
renderedPreview: '预览',
|
||
unknownSize: '大小未知',
|
||
binaryTitle: '这看起来像二进制文件',
|
||
binaryBody: label => `预览 ${label} 可能会显示不可读文本。`,
|
||
largeTitle: '此文件较大',
|
||
largeBody: (label, size) => `${label} 大小为 ${size}。Hermes 只会显示前 512 KB。`,
|
||
previewAnyway: '仍然预览',
|
||
truncated: '显示前 512 KB。',
|
||
noInlineTitle: '没有内联预览',
|
||
noInlineBody: mimeType => `${mimeType || '此文件类型'} 仍可作为上下文附件。`,
|
||
console: {
|
||
deselect: '取消选择条目',
|
||
select: '选择条目',
|
||
copyFailed: '无法复制控制台输出',
|
||
copyEntry: '复制此条目',
|
||
sendEntry: '将此条目发送到对话',
|
||
messages: count => `${count} 条控制台消息`,
|
||
resize: '调整预览控制台大小',
|
||
title: '预览控制台',
|
||
selected: count => `已选择 ${count} 条`,
|
||
sendToChat: '发送到对话',
|
||
copySelected: '复制所选到剪贴板',
|
||
copyAll: '全部复制到剪贴板',
|
||
copy: '复制',
|
||
clear: '清除',
|
||
empty: '暂无控制台消息。',
|
||
promptHeader: '预览控制台:',
|
||
sentTitle: '已发送到对话',
|
||
sentMessage: count => `已将 ${count} 条日志添加到输入框`
|
||
},
|
||
web: {
|
||
appFailedToBoot: '预览应用启动失败',
|
||
serverNotFound: '未找到服务器',
|
||
failedToLoad: '预览加载失败',
|
||
tryAgain: '重试',
|
||
restarting: 'Hermes 正在重启...',
|
||
askRestart: '让 Hermes 重启服务器',
|
||
lookingRestart: taskId => `Hermes 正在查找要重启的预览服务器 (${taskId})`,
|
||
restartingTitle: '正在重启预览服务器',
|
||
restartingMessage: 'Hermes 正在后台工作。可在预览控制台查看进度。',
|
||
startRestartFailed: message => `无法启动服务器重启:${message}`,
|
||
restartFailed: '服务器重启失败',
|
||
hideConsole: '隐藏预览控制台',
|
||
showConsole: '显示预览控制台',
|
||
hideDevTools: '隐藏预览 DevTools',
|
||
openDevTools: '打开预览 DevTools',
|
||
finishedRestarting: message => `Hermes 已完成预览服务器重启${message ? `: ${message}` : ''}`,
|
||
failedRestarting: message => `服务器重启失败:${message}`,
|
||
unknownError: '未知错误',
|
||
restartedTitle: '预览服务器已重启',
|
||
reloadingNow: '正在重新加载预览。',
|
||
restartFailedTitle: '预览重启失败',
|
||
restartFailedMessage: 'Hermes 无法重启服务器。',
|
||
stillWorking: 'Hermes 仍在工作,但还没有收到重启结果。服务器命令可能正在前台运行。',
|
||
workspaceReloading: '工作区已变更,正在重新加载预览',
|
||
fileChanged: url => `文件已变更,正在重新加载预览:${url}`,
|
||
filesChanged: (count, url) => `${count} 个文件变更,正在重新加载预览:${url}`,
|
||
watchFailed: message => `无法监听预览文件:${message}`,
|
||
moduleMimeDescription:
|
||
'模块脚本使用了错误的 MIME 类型。这通常表示静态文件服务器正在服务 Vite/React 应用,而不是项目开发服务器。',
|
||
loadFailedConsole: (code, message) => `加载失败${code ? ` (${code})` : ''}: ${message}`,
|
||
unreachableDescription: '无法访问预览页面。',
|
||
openTarget: url => `打开 ${url}`,
|
||
fallbackTitle: '预览'
|
||
}
|
||
},
|
||
|
||
assistant: {
|
||
thread: {
|
||
loadingSession: '正在加载会话',
|
||
loadingResponse: 'Hermes 正在加载回复',
|
||
thinking: '思考中',
|
||
today: time => `今天,${time}`,
|
||
yesterday: time => `昨天,${time}`,
|
||
copy: '复制',
|
||
refresh: '刷新',
|
||
moreActions: '更多操作',
|
||
branchNewChat: '在新对话中分支',
|
||
readAloudFailed: '朗读失败',
|
||
preparingAudio: '正在准备音频...',
|
||
stopReading: '停止朗读',
|
||
readAloud: '朗读',
|
||
editMessage: '编辑消息',
|
||
stop: '停止',
|
||
editableCheckpoint: '可编辑检查点',
|
||
restorePrevious: '恢复上一个检查点',
|
||
restoreCheckpoint: '恢复检查点',
|
||
restoreNext: '恢复下一个检查点',
|
||
goForward: '前进',
|
||
sendEdited: '发送编辑后的消息',
|
||
attachingFile: '正在附加…'
|
||
},
|
||
approval: {
|
||
gatewayDisconnected: 'Hermes 网关未连接',
|
||
sendFailed: '无法发送审批响应',
|
||
run: '运行',
|
||
moreOptions: '更多审批选项',
|
||
allowSession: '允许本会话',
|
||
alwaysAllowMenu: '始终允许…',
|
||
reject: '拒绝',
|
||
alwaysTitle: '始终允许此命令?',
|
||
alwaysDescription: pattern =>
|
||
`这会将“${pattern}”模式加入永久允许列表 (~/.hermes/config.yaml)。Hermes 对类似命令将不再询问,包括当前会话和未来会话。`,
|
||
alwaysAllow: '始终允许'
|
||
},
|
||
clarify: {
|
||
notReady: '澄清请求尚未就绪',
|
||
gatewayDisconnected: 'Hermes 网关未连接',
|
||
sendFailed: '无法发送澄清响应',
|
||
loadingQuestion: '正在加载问题…',
|
||
other: '其他 (输入你的答案)',
|
||
placeholder: '输入你的答案…',
|
||
shortcut: '⌘/Ctrl + Enter 发送',
|
||
back: '返回',
|
||
skip: '跳过',
|
||
send: '发送'
|
||
},
|
||
tool: {
|
||
code: '代码',
|
||
copyCode: '复制代码',
|
||
renderingImage: '正在渲染图片',
|
||
copyOutput: '复制输出',
|
||
copyCommand: '复制命令',
|
||
copyContent: '复制内容',
|
||
copyUrl: '复制 URL',
|
||
copyResults: '复制结果',
|
||
copyQuery: '复制查询',
|
||
copyFile: '复制文件',
|
||
copyPath: '复制路径',
|
||
outputAlt: '工具输出',
|
||
rawResponse: '原始响应',
|
||
copyActivity: '复制活动',
|
||
recoveredOne: '在 1 个失败步骤后已恢复',
|
||
recoveredMany: count => `在 ${count} 个失败步骤后已恢复`,
|
||
failedOne: '1 个步骤失败',
|
||
failedMany: count => `${count} 个步骤失败`,
|
||
statusRunning: '运行中',
|
||
statusError: '错误',
|
||
statusRecovered: '已恢复',
|
||
statusDone: '完成'
|
||
}
|
||
},
|
||
|
||
prompts: {
|
||
gatewayDisconnected: 'Hermes 网关未连接',
|
||
sudoSendFailed: '无法发送 sudo 密码',
|
||
secretSendFailed: '无法发送密钥',
|
||
sudoTitle: '管理员密码',
|
||
sudoDesc: 'Hermes 需要你的 sudo 密码来运行特权命令。它只会发送给你的本地 agent。',
|
||
sudoPlaceholder: 'sudo 密码',
|
||
secretTitle: '需要密钥',
|
||
secretDesc: 'Hermes 需要一个凭据才能继续。',
|
||
secretPlaceholder: '密钥值'
|
||
},
|
||
|
||
desktop: {
|
||
audioReadFailed: '无法读取录制的音频',
|
||
sessionUnavailable: '会话不可用',
|
||
createSessionFailed: '无法创建新会话',
|
||
promptFailed: '提示词发送失败',
|
||
providerCredentialRequired: '发送第一条消息前请先添加提供方凭据。',
|
||
emptySlashCommand: '空 slash 命令',
|
||
desktopCommands: '桌面端命令',
|
||
skillCommandsAvailable: count => `${count} 个技能命令可用。`,
|
||
warningLine: message => `警告:${message}`,
|
||
yoloArmed: '此对话已启用 YOLO',
|
||
yoloOff: 'YOLO 已关闭',
|
||
yoloSystem: active => `此会话 YOLO ${active ? '已开启' : '已关闭'}`,
|
||
yoloTitle: 'YOLO',
|
||
yoloToggleFailed: '无法切换 YOLO',
|
||
profileStatus: current => `配置档案:${current}。使用 /profile <name> 或“新建会话”选择器在其他配置档案中开始对话。`,
|
||
unknownProfile: '未知配置档案',
|
||
noProfileNamed: (target, available) => `没有名为“${target}”的配置档案。可用:${available}`,
|
||
newChatsProfile: name => `新对话将使用配置档案 ${name}。`,
|
||
setProfileFailed: '设置配置档案失败',
|
||
sttDisabled: '设置中已禁用语音转文字。',
|
||
stopFailed: '停止失败',
|
||
regenerateFailed: '重新生成失败',
|
||
editFailed: '编辑失败',
|
||
resumeFailed: '恢复失败',
|
||
nothingToBranch: '没有可分支的内容',
|
||
branchNeedsChat: '分支前请先开始或恢复一个对话。',
|
||
sessionBusy: '会话忙碌中',
|
||
branchStopCurrent: '分支此对话前请先停止当前回合。',
|
||
branchNoText: '此消息没有可用于分支的文本。',
|
||
branchTitle: '分支',
|
||
branchFailed: '分支失败',
|
||
deleteFailed: '删除失败',
|
||
archived: '已归档',
|
||
archiveFailed: '归档失败',
|
||
cwdChangeFailed: '工作目录更改失败',
|
||
cwdStagedTitle: '工作目录已暂存',
|
||
cwdStagedMessage: '重启桌面后端后,工作目录更改才会应用到当前活跃会话。',
|
||
modelSwitchFailed: '模型切换失败',
|
||
sessionExported: '会话已导出',
|
||
sessionExportFailed: '无法导出会话',
|
||
imageSaved: '图片已保存',
|
||
downloadStarted: '下载已开始',
|
||
restartToUseSaveImage: '重启 Hermes 桌面版后可使用保存图片。',
|
||
restartToSaveImages: '重启 Hermes 桌面版以保存图片',
|
||
imageDownloadFailed: '图片下载失败',
|
||
openImage: '打开图片',
|
||
downloadImage: '下载图片',
|
||
savingImage: '正在保存图片',
|
||
imagePreviewFailed: '图片预览失败',
|
||
imageAttach: '附加图片',
|
||
imageWriteFailed: '无法将图片写入磁盘。',
|
||
imageAttachFailed: '附加图片失败',
|
||
attachImages: '附加图片',
|
||
clipboard: '剪贴板',
|
||
noClipboardImage: '剪贴板中没有图片',
|
||
clipboardPasteFailed: '粘贴剪贴板失败',
|
||
dropFiles: '拖放文件'
|
||
},
|
||
|
||
errors: {
|
||
genericFailure: '发生错误',
|
||
boundaryTitle: '界面出错了',
|
||
boundaryDesc: '此视图遇到意外错误。你的对话和设置是安全的。',
|
||
reloadWindow: '重新加载窗口',
|
||
openLogs: '打开日志'
|
||
},
|
||
|
||
ui: {
|
||
search: {
|
||
clear: '清除搜索'
|
||
},
|
||
pagination: {
|
||
label: '分页',
|
||
previous: '上一页',
|
||
previousAria: '前往上一页',
|
||
next: '下一页',
|
||
nextAria: '前往下一页'
|
||
},
|
||
sidebar: {
|
||
title: '侧边栏',
|
||
description: '显示移动端侧边栏。',
|
||
toggle: '切换侧边栏'
|
||
}
|
||
}
|
||
}
|