2026-04-13 15:15:14 +08:00
export default {
2026-04-14 21:48:53 +08:00
// Login
login : {
2026-04-15 16:36:04 +08:00
title : 'Hermes Web UI' ,
2026-04-14 21:48:53 +08:00
description : 'Enter your access token to continue. Find it in the server startup logs.' ,
placeholder : 'Access token' ,
submit : 'Login' ,
tokenRequired : 'Please enter your access token' ,
invalidToken : 'Invalid token' ,
connectionFailed : 'Cannot connect to server' ,
2026-04-22 20:27:33 +08:00
passwordLogin : 'Password' ,
tokenLogin : 'Token' ,
usernamePlaceholder : 'Username' ,
passwordPlaceholder : 'Password' ,
credentialsRequired : 'Please enter username and password' ,
invalidCredentials : 'Invalid username or password' ,
passwordMismatch : 'Passwords do not match' ,
passwordTooShort : 'Password must be at least 6 characters' ,
setupSuccess : 'Password login configured successfully' ,
passwordChanged : 'Password changed successfully' ,
passwordRemoved : 'Password login removed' ,
setupPassword : 'Set Up Password Login' ,
changePassword : 'Change Password' ,
changeUsername : 'Change Username' ,
removePasswordLogin : 'Remove' ,
username : 'Username' ,
currentPassword : 'Current Password' ,
newPassword : 'New Password' ,
confirmPassword : 'Confirm Password' ,
newUsername : 'New Username' ,
usernameChanged : 'Username changed successfully' ,
usernameTooShort : 'Username must be at least 2 characters' ,
setupDescription : 'Set up a username and password for convenient login. The access token will continue to work as a backup.' ,
removeConfirm : 'Are you sure you want to remove password login? You will need to use the access token to log in.' ,
passwordLoginNotConfigured : 'Password login is not configured' ,
passwordLoginConfigured : 'Password login enabled ({username})' ,
2026-04-14 21:48:53 +08:00
} ,
2026-04-13 15:15:14 +08:00
// Common
common : {
loading : 'Loading...' ,
cancel : 'Cancel' ,
delete : 'Delete' ,
edit : 'Edit' ,
save : 'Save' ,
2026-04-17 23:11:57 +08:00
retry : 'Retry' ,
2026-04-13 15:15:14 +08:00
saved : 'Saved' ,
update : 'Update' ,
create : 'Create' ,
saveFailed : 'Save failed' ,
2026-04-24 20:41:14 +08:00
deleteFailed : 'Delete failed' ,
2026-04-13 15:15:14 +08:00
ok : 'OK' ,
copied : 'Copied' ,
copy : 'Copy' ,
noData : 'No data' ,
fetch : 'Fetch' ,
add : 'Add' ,
enable : 'Enable' ,
disable : 'Disable' ,
configured : 'Configured' ,
notConfigured : 'Not configured' ,
2026-04-16 09:40:25 +08:00
confirm : 'Confirm' ,
expand : 'Expand' ,
collapse : 'Collapse' ,
2026-04-18 13:07:12 +08:00
start : 'Start' ,
stop : 'Stop' ,
2026-04-13 15:15:14 +08:00
} ,
// Sidebar
sidebar : {
chat : 'Chat' ,
2026-04-22 14:00:34 +08:00
search : 'Search' ,
2026-04-13 15:15:14 +08:00
jobs : 'Jobs' ,
models : 'Models' ,
2026-04-16 09:40:25 +08:00
profiles : 'Profiles' ,
2026-04-13 15:15:14 +08:00
skills : 'Skills' ,
memory : 'Memory' ,
logs : 'Logs' ,
2026-04-14 14:47:18 +08:00
usage : 'Usage' ,
2026-04-13 15:15:14 +08:00
channels : 'Channels' ,
2026-04-18 13:07:12 +08:00
gateways : 'Gateways' ,
2026-04-15 16:36:04 +08:00
terminal : 'Terminal' ,
2026-04-24 20:41:14 +08:00
groupChat : 'Group Chat' ,
2026-04-23 12:09:39 +08:00
files : 'Files' ,
2026-04-18 13:07:12 +08:00
groupConversation : 'Conversation' ,
groupPlatform : 'Platform' ,
groupAgent : 'Agent' ,
groupSystem : 'System' ,
groupMonitoring : 'Monitoring' ,
groupTools : 'Tools' ,
2026-04-13 15:15:14 +08:00
settings : 'Settings' ,
connected : 'Connected' ,
disconnected : 'Disconnected' ,
2026-04-18 00:00:24 +08:00
collapse : 'Collapse menu' ,
expand : 'Expand menu' ,
2026-04-16 13:51:42 +08:00
updateTip : 'Run "hermes-web-ui update" in terminal to update' ,
updateVersion : 'Upgrade to v{version}' ,
updating : 'Updating...' ,
updateSuccess : 'Update complete, please restart the server' ,
updateFailed : 'Update failed' ,
2026-04-22 20:27:33 +08:00
logout : 'Sign Out' ,
2026-04-24 02:31:42 +02:00
nodeVersionWarning : 'Detected Node.js v{version}. Please upgrade to version 23 or later.' ,
2026-04-22 20:27:33 +08:00
changelog : 'Changelog' ,
noChangelog : 'No changelog available' ,
2026-04-13 15:15:14 +08:00
} ,
// Chat
chat : {
2026-04-22 16:14:50 +08:00
contextRemaining : 'remaining' ,
2026-04-13 15:15:14 +08:00
emptyState : 'Start a conversation with Hermes Agent' ,
inputPlaceholder : 'Type a message... (Enter to send, Shift+Enter for new line)' ,
attachFiles : 'Attach files' ,
stop : 'Stop' ,
2026-04-18 13:07:12 +08:00
start : 'Start' ,
stopGateway : 'Stop Gateway' ,
2026-04-13 15:15:14 +08:00
send : 'Send' ,
2026-04-14 14:47:18 +08:00
contextUsed : 'Context used:' ,
2026-04-13 15:15:14 +08:00
sessions : 'Sessions' ,
noSessions : 'No sessions' ,
2026-04-22 14:00:34 +08:00
searchTitle : 'Search Sessions' ,
searchSubtitle : 'Search by title or message content' ,
searchHint : 'Cmd/Ctrl+K' ,
searchPlaceholder : 'Search sessions...' ,
searchEmpty : 'Recent sessions' ,
searchRecent : 'Recent session' ,
searchNoResults : 'No sessions match your search' ,
searchNoSnippet : 'No snippet available' ,
searchEnterHint : 'Enter to open · Esc to close' ,
searchFailed : 'Failed to search sessions' ,
2026-04-13 15:15:14 +08:00
newChat : 'New Chat' ,
deleteSession : 'Delete this session?' ,
sessionDeleted : 'Session deleted' ,
rename : 'Rename' ,
2026-04-22 02:09:58 +02:00
pin : 'Pin' ,
unpin : 'Unpin' ,
pinned : 'Pinned' ,
chatMode : 'Chat' ,
liveMode : 'Live' ,
liveSessions : 'Live Sessions' ,
recentBadge : 'Recent' ,
linkedSessions : '{count} linked' ,
noVisibleMessages : 'No human-visible messages.' ,
monitorRoleUser : 'User' ,
monitorRoleAssistant : 'Assistant' ,
2026-04-13 15:15:14 +08:00
copySessionId : 'Copy Session ID' ,
renamed : 'Renamed' ,
renameFailed : 'Rename failed' ,
renameSession : 'Rename Session' ,
enterNewTitle : 'Enter new title' ,
other : 'Other' ,
runFailed : 'Run failed' ,
2026-04-15 16:36:04 +08:00
error : 'Error' ,
2026-04-13 15:15:14 +08:00
tool : 'Tool' ,
arguments : 'Arguments' ,
result : 'Result' ,
truncated : '... (truncated)' ,
2026-04-30 16:40:37 +08:00
executionDuration : 'Execution time' ,
2026-04-25 08:46:50 +08:00
thinkingLabel : 'Thinking' ,
thinkingInProgress : 'Thinking…' ,
thinkingShow : 'Show thinking' ,
thinkingHide : 'Hide thinking' ,
thinkingDuration : 'Observed {duration}' ,
thinkingChars : '{count} chars' ,
2026-04-26 22:59:43 +08:00
copyBubble : 'Copy message' ,
copiedBubble : 'Message copied' ,
copyFailed : 'Copy failed' ,
2026-04-13 15:15:14 +08:00
} ,
// Jobs
jobs : {
title : 'Scheduled Jobs' ,
createJob : 'Create Job' ,
editJob : 'Edit Job' ,
noJobs : 'No scheduled jobs yet. Create one to get started.' ,
name : 'Name' ,
namePlaceholder : 'Job name' ,
schedule : 'Schedule (Cron Expression)' ,
schedulePlaceholder : 'e.g. 0 9 * * *' ,
quickPresets : 'Quick Presets' ,
selectPreset : 'Select a preset...' ,
presetEveryMinute : 'Every minute' ,
presetEvery5Min : 'Every 5 minutes' ,
presetEveryHour : 'Every hour' ,
presetEveryDay : 'Every day at 00:00' ,
presetEveryDay9 : 'Every day at 09:00' ,
presetEveryMonday : 'Every Monday at 09:00' ,
presetEveryMonth : 'Every month 1st at 09:00' ,
prompt : 'Prompt' ,
promptPlaceholder : 'The prompt to execute' ,
deliverTarget : 'Deliver Target' ,
origin : 'Origin' ,
local : 'Local' ,
repeatCount : 'Repeat Count (optional)' ,
2026-04-30 10:17:25 +10:00
modelPlaceholder : 'Default model' ,
2026-04-13 15:15:14 +08:00
repeatPlaceholder : 'Leave empty for infinite' ,
jobCreated : 'Job created' ,
jobUpdated : 'Job updated' ,
nameRequired : 'Name is required' ,
scheduleRequired : 'Schedule is required' ,
loadFailed : 'Failed to load job' ,
jobPaused : 'Job paused' ,
jobResumed : 'Job resumed' ,
jobTriggered : 'Job triggered' ,
2026-04-30 10:17:25 +10:00
modelUpdated : 'Model updated' ,
2026-04-13 15:15:14 +08:00
jobDeleted : 'Job deleted' ,
status : {
running : 'Running' ,
paused : 'Paused' ,
disabled : 'Disabled' ,
scheduled : 'Scheduled' ,
} ,
info : {
2026-04-30 10:17:25 +10:00
model : 'Model' ,
2026-04-13 15:15:14 +08:00
schedule : 'Schedule' ,
lastRun : 'Last Run' ,
nextRun : 'Next Run' ,
deliver : 'Deliver' ,
repeat : 'Repeat' ,
} ,
action : {
pause : 'Pause' ,
pauseJob : 'Pause job' ,
resume : 'Resume' ,
resumeJob : 'Resume job' ,
runNow : 'Run Now' ,
triggerImmediately : 'Trigger immediately' ,
} ,
2026-04-30 10:17:25 +10:00
runHistory : {
title : 'Run History' ,
runs : 'runs' ,
noRuns : 'No run history found.' ,
} ,
2026-04-13 15:15:14 +08:00
} ,
// Skills
skills : {
title : 'Skills' ,
searchPlaceholder : 'Search skills...' ,
noMatch : 'No skills match your search' ,
noSkills : 'No skills found' ,
backTo : 'Back to' ,
attachedFiles : 'Attached Files' ,
loadFailed : 'Failed to load skill' ,
fileLoadFailed : 'Failed to load file' ,
2026-04-14 21:48:53 +08:00
toggleFailed : 'Failed to toggle skill' ,
2026-04-13 15:15:14 +08:00
} ,
// Memory
memory : {
title : 'Memory' ,
refresh : 'Refresh' ,
loadFailed : 'Failed to load memory' ,
myNotes : 'My Notes' ,
noNotes : 'No notes yet.' ,
notesPlaceholder : 'Write your notes...' ,
userProfile : 'User Profile' ,
noProfile : 'No profile yet.' ,
profilePlaceholder : 'Write your profile...' ,
2026-04-16 13:51:42 +08:00
soul : 'Soul' ,
noSoul : 'No soul configuration yet.' ,
soulPlaceholder : 'Write soul configuration...' ,
2026-04-13 15:15:14 +08:00
} ,
// Models
models : {
title : 'Models' ,
2026-04-18 22:08:34 +08:00
searchPlaceholder : 'Search models...' ,
2026-04-13 15:15:14 +08:00
addProvider : 'Add Provider' ,
providerType : 'Provider Type' ,
preset : 'Preset' ,
custom : 'Custom' ,
selectProvider : 'Select Provider' ,
chooseProvider : 'Choose a provider...' ,
name : 'Name' ,
autoGeneratedName : 'Auto-generated from Base URL' ,
baseUrl : 'Base URL' ,
2026-04-25 14:00:07 +08:00
region : 'Region' ,
regionIntl : 'International' ,
regionCn : 'Mainland China' ,
2026-04-13 15:15:14 +08:00
baseUrlPlaceholder : 'e.g. https://api.example.com/v1' ,
apiKey : 'API Key' ,
apiKeyPlaceholder : 'sk-...' ,
defaultModel : 'Default Model' ,
2026-04-17 22:05:06 +08:00
selectOrInput : 'Select or type a model name...' ,
2026-04-13 15:15:14 +08:00
selectModel : 'Select a model...' ,
providerAdded : 'Provider added' ,
providerDeleted : 'Provider deleted' ,
deleteProvider : 'Delete Provider' ,
deleteConfirm : 'Are you sure you want to delete "{name}"?' ,
2026-04-17 23:11:57 +08:00
codexLoginTitle : 'OpenAI Codex Login' ,
codexWaiting : 'Enter this code at the authorization page to complete login:' ,
codexCopyCode : 'Code copied' ,
codexOpenLink : 'Open authorization page' ,
codexApproved : 'Login successful' ,
codexExpired : 'Authorization expired. Please try again.' ,
2026-04-23 08:39:19 +08:00
nousLoginTitle : 'Nous Portal Login' ,
nousWaiting : 'Enter this code at the authorization page to complete login:' ,
nousCopyCode : 'Code copied' ,
nousOpenLink : 'Open authorization page' ,
nousApproved : 'Login successful' ,
nousDenied : 'Authorization was denied. Please try again.' ,
nousExpired : 'Authorization expired. Please try again.' ,
2026-04-26 22:51:35 +08:00
copilotLoginTitle : 'GitHub Copilot Login' ,
copilotWaiting : 'Open GitHub and enter the device code below to authorize. The window will close automatically once approved.' ,
copilotCopyCode : 'Code copied' ,
copilotOpenLink : 'Open GitHub authorization page' ,
copilotApproved : 'Sign-in succeeded!' ,
copilotDenied : 'Authorization denied.' ,
copilotExpired : 'The authorization link has expired. Please retry.' ,
copilotAddDetectedTitle : 'GitHub Copilot detected' ,
copilotAddDetected : 'A GitHub Copilot OAuth token was detected on this machine. Click Add to enable Copilot in Hermes.' ,
copilotAddSourceEnv : 'Source: ~/.hermes/.env (COPILOT_GITHUB_TOKEN)' ,
copilotAddSourceGhCli : 'Source: gh CLI (gh auth token)' ,
copilotAddSourceAppsJson : 'Source: VS Code Copilot extension (apps.json)' ,
copilotDeleteHintEnv : 'This will clear COPILOT_GITHUB_TOKEN in ~/.hermes/.env. Other tools are not affected.' ,
copilotDeleteHintGhCli : 'Copilot will be hidden from Hermes. Your gh CLI login is not affected — `gh auth status` will still show you signed in.' ,
copilotDeleteHintAppsJson : 'Copilot will be hidden from Hermes. Your VS Code Copilot extension login is not affected.' ,
2026-04-24 08:49:45 +08:00
customBadge : 'CUSTOM' ,
2026-04-26 22:51:35 +08:00
previewBadge : 'PREVIEW' ,
disabledBadge : 'UNAVAILABLE' ,
disabledTooltip : "This model is currently unavailable for your account." ,
2026-04-24 08:49:45 +08:00
customModelPlaceholder : 'Custom model name' ,
customModelHint : 'Enter to load' ,
2026-04-13 15:15:14 +08:00
noProviders : 'No providers found. Add a custom provider to get started.' ,
2026-04-29 20:48:21 +08:00
models : 'Models' ,
count : 'models' ,
more : 'more' ,
2026-04-13 15:15:14 +08:00
builtIn : 'Built-in' ,
customType : 'Custom' ,
provider : 'Provider' ,
2026-04-24 11:18:11 +08:00
contextLength : 'Context Length' ,
contextLengthPlaceholder : 'e.g. 200000 (optional)' ,
2026-04-13 15:15:14 +08:00
local : 'Local ({host})' ,
selectProviderRequired : 'Please select a provider' ,
baseUrlRequired : 'Base URL is required' ,
apiKeyRequired : 'API Key is required' ,
modelRequired : 'Default Model is required' ,
enterBaseUrl : 'Please enter Base URL first' ,
unexpectedFormat : 'Unexpected response format' ,
foundModels : 'Found {count} models' ,
fetchFailed : 'Failed to fetch models' ,
} ,
2026-04-16 09:40:25 +08:00
// Profiles
2026-04-18 13:07:12 +08:00
gateways : {
title : 'Gateways' ,
running : 'Running' ,
stopped : 'Stopped' ,
started : 'Started' ,
startFailed : 'Failed to start gateway' ,
stopFailed : 'Failed to stop gateway' ,
} ,
2026-04-16 09:40:25 +08:00
profiles : {
title : 'Profiles' ,
create : 'Create Profile' ,
import : 'Import' ,
export : 'Export' ,
rename : 'Rename' ,
delete : 'Delete' ,
switchTo : 'Switch to' ,
switchConfirm : 'Switching to profile "{name}" will restart the gateway. Continue?' ,
switchSuccess : 'Switched to profile "{name}"' ,
switchFailed : 'Failed to switch profile. Gateway may need manual restart.' ,
createSuccess : 'Profile "{name}" created' ,
createFailed : 'Failed to create profile' ,
renameSuccess : 'Profile renamed' ,
renameFailed : 'Failed to rename profile' ,
deleteConfirm : 'Are you sure you want to delete profile "{name}"?' ,
deleteSuccess : 'Profile deleted' ,
deleteFailed : 'Failed to delete profile' ,
exportSuccess : 'Profile exported' ,
exportFailed : 'Failed to export profile' ,
importSuccess : 'Profile imported' ,
importFailed : 'Failed to import profile' ,
2026-04-16 15:19:05 +08:00
importSelectFile : 'Select archive file' ,
importInvalidFile : 'Please select a valid archive (.tar.gz, .tgz, .gz, .zip)' ,
2026-04-16 09:40:25 +08:00
name : 'Profile Name' ,
2026-04-29 20:54:17 +08:00
namePlaceholder : 'Lowercase letters, numbers, hyphens only' ,
2026-04-16 09:40:25 +08:00
newName : 'New Name' ,
2026-04-29 20:54:17 +08:00
newNamePlaceholder : 'Lowercase letters, numbers, hyphens' ,
2026-04-16 09:40:25 +08:00
cloneFromCurrent : 'Clone from current profile' ,
2026-04-29 20:31:24 +08:00
cloneCleanupNotice : 'Cloning automatically skips exclusive platform credentials (Weixin / Telegram / Slack, etc.) to avoid conflicts with the source profile' ,
cloneStrippedCredentials : 'Stripped {count} exclusive credential(s): {list}' ,
cloneDisabledPlatforms : 'Disabled {count} platform(s): {list}' ,
cloneStrippedConfigCredentials : 'Stripped {count} embedded credential(s) from config.yaml: {list}' ,
2026-04-16 09:40:25 +08:00
archivePath : 'Archive Path' ,
archivePathPlaceholder : 'Server path to archive file' ,
importName : 'Profile Name (optional)' ,
importNamePlaceholder : 'Leave empty to use archive name' ,
active : 'Active' ,
model : 'Model' ,
gateway : 'Gateway' ,
alias : 'Alias' ,
provider : 'Provider' ,
path : 'Path' ,
skills : 'Skills' ,
hasEnv : 'Has .env' ,
hasSoulMd : 'Has soul.md' ,
noProfiles : 'No profiles found. Create one to get started.' ,
} ,
2026-04-13 15:15:14 +08:00
// Logs
logs : {
title : 'Logs' ,
all : 'All' ,
searchPlaceholder : 'Search...' ,
refresh : 'Refresh' ,
noEntries : 'No log entries' ,
} ,
// Settings
settings : {
title : 'Settings' ,
saved : 'Saved' ,
saveFailed : 'Save failed' ,
tabs : {
display : 'Display' ,
2026-04-22 20:27:33 +08:00
account : 'Account' ,
2026-04-13 15:15:14 +08:00
agent : 'Agent' ,
memory : 'Memory' ,
session : 'Session' ,
privacy : 'Privacy' ,
apiServer : 'API Server' ,
2026-04-19 20:59:25 +08:00
models : 'Models' ,
} ,
models : {
apiKey : 'API Key' ,
apiKeyPlaceholder : 'Enter API key' ,
save : 'Save' ,
saved : 'Saved' ,
saveFailed : 'Save failed' ,
noProviders : 'No providers configured' ,
2026-04-13 15:15:14 +08:00
} ,
display : {
streaming : 'Stream Responses' ,
streamingHint : 'Show AI replies in real-time' ,
compact : 'Compact Mode' ,
compactHint : 'Reduce message spacing' ,
showReasoning : 'Show Reasoning' ,
showReasoningHint : 'Show model thinking process' ,
showCost : 'Show Cost' ,
showCostHint : 'Show token usage in replies' ,
inlineDiffs : 'Inline Diffs' ,
inlineDiffsHint : 'Show code changes inline' ,
bellOnComplete : 'Completion Sound' ,
bellOnCompleteHint : 'Play sound when AI finishes' ,
busyInputMode : 'Busy Input Mode' ,
busyInputModeHint : 'Allow input while AI is processing' ,
2026-04-16 23:13:04 +08:00
theme : 'Theme' ,
themeHint : 'Choose light, dark, or follow system preference' ,
themeLight : 'Light' ,
themeDark : 'Dark' ,
themeSystem : 'System' ,
2026-04-13 15:15:14 +08:00
} ,
agent : {
maxTurns : 'Max Turns' ,
maxTurnsHint : 'Maximum interaction rounds per conversation' ,
gatewayTimeout : 'Gateway Timeout' ,
gatewayTimeoutHint : 'Request timeout in seconds' ,
restartDrainTimeout : 'Restart Drain Timeout' ,
restartDrainTimeoutHint : 'Drain timeout before restart in seconds' ,
toolEnforcement : 'Tool Enforcement' ,
toolEnforcementHint : 'Control tool call execution mode' ,
auto : 'Auto' ,
always : 'Always' ,
never : 'Never' ,
} ,
memory : {
enabled : 'Enable Memory' ,
enabledHint : 'Allow AI to remember conversation context' ,
userProfile : 'User Profile' ,
userProfileHint : 'Allow AI to remember user preferences' ,
charLimit : 'Memory Char Limit' ,
charLimitHint : 'Max characters for MEMORY.md' ,
userCharLimit : 'User Profile Char Limit' ,
userCharLimitHint : 'Max characters for USER.md' ,
} ,
session : {
mode : 'Reset Mode' ,
modeHint : 'Trigger condition for session reset' ,
modeBoth : 'Idle + Scheduled' ,
modeIdle : 'Idle Only' ,
modeHourly : 'Scheduled Only' ,
idleMinutes : 'Idle Timeout' ,
idleMinutesHint : 'Wait time before auto-reset (minutes)' ,
atHour : 'Scheduled Reset Time' ,
2026-04-22 02:09:58 +02:00
humanOnly : 'Show human sessions only' ,
humanOnlyHint : 'Hide sub-agent/session monitor noise by default' ,
liveMonitorHumanOnly : 'Live monitor: show human sessions only' ,
liveMonitorHumanOnlyHint : 'Hide sub-agent/session monitor noise in the Live monitor by default' ,
2026-04-13 15:15:14 +08:00
atHourHint : 'Reset session at this hour daily' ,
} ,
privacy : {
redactPii : 'Redact PII' ,
redactPiiHint : 'Auto-detect and hide sensitive info (passwords, keys, etc.)' ,
} ,
apiServer : {
enable : 'Enable' ,
enableHint : 'Enable API server' ,
host : 'Host' ,
hostHint : 'Listen address' ,
port : 'Port' ,
portHint : 'Listen port' ,
key : 'Key' ,
keyHint : 'API access key' ,
cors : 'CORS Origins' ,
corsHint : 'Allowed cross-origin sources' ,
} ,
} ,
// Platform channel settings
platform : {
requireMention : "Require {'@'}Mention" ,
requireMentionGroup : "Require {'@'}mention in groups to respond" ,
requireMentionChannel : "Require {'@'}mention in channels to respond" ,
requireMentionRoom : "Require {'@'}mention in rooms to respond" ,
reactions : 'Reactions' ,
reactionsHint : 'React to messages with emoji' ,
freeResponseChats : 'Free Response Chats' ,
freeResponseChatsHint : "Chat IDs that respond without {'@'}mention (comma-separated)" ,
freeResponseChannels : 'Free Response Channels' ,
freeResponseChannelsHint : "Channel IDs that respond without {'@'}mention (comma-separated)" ,
freeResponseRooms : 'Free Response Rooms' ,
freeResponseRoomsHint : "Room IDs that respond without {'@'}mention (comma-separated)" ,
mentionPatterns : 'Custom Mention Patterns' ,
mentionPatternsHint : 'Additional trigger patterns' ,
autoThread : 'Auto Thread' ,
autoThreadHint : "Auto-create reply threads after {'@'}mention" ,
autoThreadHintRoom : 'Auto-create reply threads in rooms' ,
dmMentionThreads : 'DM Mention Threads' ,
dmMentionThreadsHint : 'Use thread replies for mentions in DMs' ,
allowBots : 'Allow Bot Messages' ,
allowBotsHint : 'Respond to messages from other bots' ,
allowedChannels : 'Allowed Channels' ,
allowedChannelsHint : 'Whitelist channel IDs (comma-separated)' ,
ignoredChannels : 'Ignored Channels' ,
ignoredChannelsHint : 'Channels where bot never responds (comma-separated)' ,
noThreadChannels : 'No-Thread Channels' ,
noThreadChannelsHint : 'Channels where bot responds without threads (comma-separated)' ,
2026-04-29 20:31:24 +08:00
exclusiveTokenWarning : 'This platform uses exclusive token locking. Each profile must use a different identity token to avoid conflicts with other profiles.' ,
2026-04-13 15:15:14 +08:00
botToken : 'Bot Token' ,
botTokenHint : 'Bot token from developer portal' ,
accessToken : 'Access Token' ,
accessTokenHint : 'Matrix access token' ,
homeserver : 'Homeserver URL' ,
homeserverHint : 'Matrix homeserver URL' ,
appId : 'App ID' ,
appIdHint : 'Feishu App ID' ,
appSecret : 'App Secret' ,
appSecretHint : 'Feishu App Secret' ,
clientId : 'Client ID' ,
clientIdHint : 'DingTalk Client ID' ,
clientSecret : 'Client Secret' ,
clientSecretHint : 'DingTalk Client Secret' ,
botId : 'Bot ID' ,
botIdHint : 'WeCom Bot ID' ,
wecomSecretHint : 'WeCom Bot Secret' ,
waEnabled : 'Enable WhatsApp' ,
waEnabledHint : 'Enable WhatsApp via QR code pairing' ,
weixinToken : 'Weixin Token' ,
weixinTokenHint : 'From weixin CLI QR login (hermes weixin)' ,
accountId : 'Account ID' ,
accountIdHint : 'Weixin account ID' ,
qrLogin : 'QR Login' ,
qrRelogin : 'Re-login' ,
qrFetching : 'Fetching QR code...' ,
qrScanHint : 'Scan with WeChat to login' ,
qrScanedHint : 'Scaned, please confirm on phone...' ,
2026-04-29 20:48:21 +08:00
// QQ
qqAppId : 'App ID' ,
qqAppIdHint : 'QQ Open Platform Bot App ID' ,
qqAppSecret : 'App Secret' ,
qqAppSecretHint : 'QQ Open Platform Bot App Secret' ,
qqMarkdown : 'Markdown Support' ,
qqMarkdownHint : 'Enable Markdown formatted messages (some clients may not support)' ,
qqSandbox : 'Sandbox Mode' ,
qqSandboxHint : 'Enable sandbox environment (for testing)' ,
qqQrScanHint : 'Scan the QR code with QQ, or open the link on your phone to complete binding' ,
2026-04-13 15:15:14 +08:00
} ,
// Language
language : {
label : 'Language' ,
zh : '中文' ,
en : 'English' ,
} ,
2026-04-14 14:47:18 +08:00
2026-04-15 16:36:04 +08:00
// Terminal
terminal : {
sessions : 'Sessions' ,
newTab : 'New Terminal' ,
closeSession : 'Close this session?' ,
sessionExited : 'Exited' ,
processExited : 'Process exited with code {code}' ,
} ,
2026-04-24 20:41:14 +08:00
// Group Chat
groupChat : {
title : 'Group Chat' ,
createRoom : 'Create Room' ,
joinByCode : 'Join by Code' ,
roomName : 'Room Name' ,
roomNamePlaceholder : 'Enter room name' ,
inviteCode : 'Invite Code' ,
autoGenerate : 'Auto-generate' ,
noRooms : 'No rooms yet' ,
selectOrCreate : 'Select or create a room to start chatting' ,
agents : 'Agents' ,
addAgent : 'Add Agent' ,
selectProfile : 'Select a profile' ,
agentAdded : 'Agent added' ,
agentAlreadyInRoom : 'Agent already in this room' ,
noAgents : 'No agents in this room' ,
members : 'members' ,
roomCreated : 'Room created' ,
roomDeleted : 'Room deleted' ,
deleteRoomConfirm : 'Delete this room?' ,
you : 'You' ,
joined : 'Joined room' ,
joinFailed : 'Failed to join room' ,
inputPlaceholder : 'Type a message... (Enter to send)' ,
enterCode : 'Enter invite code' ,
yourName : 'Your Name' ,
yourNamePlaceholder : 'Enter your display name' ,
yourDescription : 'Description (optional)' ,
yourDescriptionPlaceholder : 'Tell others who you are...' ,
agentName : 'Agent Name' ,
agentNamePlaceholder : 'Custom name (leave empty to use profile name)' ,
agentDesc : 'Agent Description' ,
agentDescPlaceholder : 'Describe what this agent does...' ,
agentReplying : 'is replying...' ,
agentCompressing : 'is compressing context...' ,
compressionSettings : 'Compression Settings' ,
triggerTokens : 'Trigger Tokens' ,
triggerTokensDesc : 'Token threshold to trigger context compression' ,
maxHistoryTokens : 'Max History Tokens' ,
maxHistoryTokensDesc : 'Maximum tokens for compressed context sent to LLM' ,
tailMessageCount : 'Tail Message Count' ,
tailMessageCountDesc : 'Number of recent messages to keep verbatim after compression' ,
compressionConfig : 'Compression Config' ,
compressionSaved : 'Compression config saved' ,
compressNow : 'Compress Now' ,
compressingInProgress : 'Compression in progress, please wait' ,
} ,
2026-04-14 14:47:18 +08:00
// Usage
usage : {
title : 'Usage Statistics' ,
refresh : 'Refresh' ,
totalTokens : 'Total Tokens' ,
inputTokens : 'Input' ,
outputTokens : 'Output' ,
totalSessions : 'Total Sessions' ,
avgPerDay : '~{n}/day avg' ,
estimatedCost : 'Est. Cost' ,
cacheHitRate : 'Cache Hit Rate' ,
modelBreakdown : 'Model Breakdown' ,
dailyTrend : 'Daily Usage (Last 30 Days)' ,
date : 'Date' ,
tokens : 'Tokens' ,
cache : 'Cache' ,
sessions : 'Sessions' ,
cost : 'Cost' ,
noData : 'No usage data' ,
} ,
2026-04-23 12:09:39 +08:00
// Files
files : {
title : 'Files' ,
tree : 'Directory Tree' ,
list : 'File List' ,
breadcrumbRoot : 'Home' ,
newFile : 'New File' ,
newFolder : 'New Folder' ,
upload : 'Upload' ,
refresh : 'Refresh' ,
open : 'Open' ,
edit : 'Edit' ,
preview : 'Preview' ,
download : 'Download' ,
copyPath : 'Copy Path' ,
rename : 'Rename' ,
delete : 'Delete' ,
name : 'Name' ,
size : 'Size' ,
modified : 'Modified' ,
actions : 'Actions' ,
emptyDir : 'Empty directory' ,
loading : 'Loading...' ,
confirmDelete : 'Are you sure you want to delete "{name}"?' ,
confirmDeleteDir : 'Are you sure you want to delete directory "{name}" and all its contents?' ,
deleteFailed : 'Delete failed' ,
deleted : 'Deleted' ,
renameTo : 'Rename to' ,
newFileName : 'File name' ,
newFolderName : 'Folder name' ,
created : 'Created' ,
createFailed : 'Create failed' ,
renamed : 'Renamed' ,
renameFailed : 'Rename failed' ,
uploadSuccess : 'Uploaded {count} file(s)' ,
uploadFailed : 'Upload failed' ,
saveFailed : 'Save failed' ,
saved : 'Saved' ,
unsavedChanges : 'You have unsaved changes. Discard?' ,
pathCopied : 'Path copied' ,
fileTooLarge : 'File too large (max 10MB)' ,
permissionDenied : 'Cannot modify protected file' ,
notFound : 'File or directory not found' ,
backendError : 'File operation failed' ,
dragDropHint : 'Drag files here to upload' ,
closeEditor : 'Close Editor' ,
2026-04-23 14:10:14 +08:00
closePreview : 'Close' ,
2026-04-23 12:09:39 +08:00
saveFile : 'Save' ,
} ,
// Download
download : {
downloading : 'Downloading...' ,
downloadFailed : 'Download failed' ,
fileNotFound : 'File not found or deleted' ,
fileTooLarge : 'File too large (exceeds limit)' ,
backendError : 'File read failed, remote environment may be unavailable' ,
backendTimeout : 'File read timed out' ,
unsupportedBackend : 'Current terminal backend does not support file download' ,
invalidPath : 'Invalid file path' ,
download : 'Download' ,
2026-04-24 02:31:42 +02:00
downloadFile : 'Download file' ,
2026-04-23 12:09:39 +08:00
} ,
2026-04-22 20:27:33 +08:00
// Changelog
changelog : {
2026-04-30 16:40:37 +08:00
new_0_5_3_1 : 'Improve reasoning process display with persistence across page refreshes' ,
new_0_5_3_2 : 'Optimize stringified array format parsing to extract thinking/text/tool_calls' ,
new_0_5_3_3 : 'Improve log display by removing ellipsis and showing full content' ,
new_0_5_3_4 : 'Add detailed logging for format conversion and parsing' ,
new_0_5_3_5 : 'Optimize token calculation to accurately include tool results' ,
new_0_5_2_1 : 'Convert conversation history to Anthropic format before sending to Gateway' ,
new_0_5_2_2 : 'Add bidirectional reasoning sync between memory and database' ,
new_0_5_2_3 : 'Add message pagination with DESC query + array reverse for performance' ,
new_0_5_2_4 : 'Clean up debug code and unused imports' ,
new_0_5_2_5 : 'Remove auto-resumed event trigger to avoid timing issues' ,
new_0_5_2_6 : 'Use reasoning field consistently across codebase' ,
2026-04-29 21:08:09 +08:00
new_0_5_1_1 : 'Auto-sync Hermes history sessions on first startup' ,
new_0_5_1_2 : 'Fix session sync failure with old Hermes versions (backward compatible)' ,
new_0_5_1_3 : 'Smart cleanup of exclusive platform credentials on profile clone (Telegram, Discord, Slack, etc.)' ,
new_0_5_1_4 : 'Auto-normalize profile names to lowercase to avoid backend validation errors' ,
new_0_5_1_5 : 'Fix tool_call_id missing in tool messages for OpenAI API compatibility' ,
new_0_5_1_6 : 'Unify SQLite table schema management and initialization' ,
new_0_5_1_7 : 'Optimize model list layout in Provider cards (fixed height, tag alignment)' ,
new_0_5_1_8 : 'Fix display issue with single-line long code blocks in user messages' ,
new_0_5_1_9 : 'Fix web terminal rendering errors in Docker deployment' ,
2026-04-29 16:26:24 +08:00
new_0_5_0_1 : 'Self-built chat database and context compression' ,
new_0_5_0_2 : 'Sessions use WebSocket form, enhanced resume capability' ,
2026-04-26 13:28:08 +08:00
new_0_4_8_1 : 'Safe Mermaid diagram rendering with async render and timeout fallback' ,
new_0_4_8_2 : 'Fix nested markdown fence rendering truncation' ,
new_0_4_8_3 : 'Fix compressed session lineage projection and search' ,
new_0_4_8_4 : 'Optimize session list N+1 queries and fix search 500 on non-CJK input' ,
new_0_4_8_5 : 'Fix forced scroll to bottom when switching back from other tabs' ,
new_0_4_8_6 : 'Smooth session switch with loading transition overlay' ,
new_0_4_8_7 : 'Fix login token validation using Hermes session endpoint' ,
new_0_4_8_8 : 'Fix image attachments broken after page refresh (blob URL persistence)' ,
new_0_4_8_9 : 'Click image attachments to preview in fullscreen overlay' ,
new_0_4_8_10 : 'Move upload directory from temp to ~/.hermes-web-ui/upload' ,
2026-04-25 20:39:53 +08:00
new_0_4_7_1 : 'Real-time streaming display of thinking/reasoning blocks' ,
new_0_4_7_2 : 'Skip prepare script during Docker build' ,
new_0_4_7_3 : 'Group chat mobile UX improvements and UI polish' ,
new_0_4_7_4 : 'Clamp context remaining tokens to 0 instead of negative' ,
new_0_4_7_5 : 'Add Alibaba Coding Plan builtin provider with .env base_url override' ,
new_0_4_7_6 : 'Skip remote profiles on startup to prevent hang' ,
new_0_4_7_7 : 'Detect and surface silently swallowed run errors' ,
new_0_4_7_8 : 'Provider-aware context length lookup' ,
new_0_4_7_9 : 'Reset config.model on switch and resolve CLI custom provider' ,
new_0_4_7_10 : 'Clear base_url_env from .env when deleting builtin provider' ,
new_0_4_7_11 : 'Align group chat room sidebar background with session list' ,
2026-04-23 12:57:42 +08:00
new_0_4_4_1 : 'Add file browser with multi-backend support (local/Docker/SSH/Singularity)' ,
new_0_4_4_2 : 'Add file download from chat message attachments' ,
new_0_4_4_3 : 'Add live badge on active chat sessions' ,
new_0_4_4_4 : 'Add StepFun and Nous Portal provider support' ,
new_0_4_4_5 : 'Fix special character search queries causing 500 error' ,
2026-04-24 20:54:06 +08:00
new_0_4_5_1 : 'Add group chat with multi-agent rooms, @mention routing, and typing status recovery' ,
new_0_4_5_2 : 'Rewrite model-context config to use YAML with context_length setting' ,
new_0_4_5_3 : 'Add gpt-5.5 to OpenAI Codex model list' ,
new_0_4_5_4 : 'Replace jobs proxy with local controller and optimize model loading' ,
new_0_4_5_5 : 'Add i18n support for custom model feature in ModelSelector' ,
new_0_4_5_6 : 'Fix sidebar i18n missing key warnings' ,
new_0_4_5_7 : 'Clear all localStorage on logout' ,
new_0_4_5_8 : 'Add periodic log rotation to prevent unbounded log growth' ,
2026-04-22 20:27:33 +08:00
new_0_4_2_1 : 'Add token usage tracking, context display, and dynamic context length' ,
new_0_4_2_2 : 'Add session search modal' ,
new_0_4_2_3 : 'Restore group chat system with Socket.IO and SQLite persistence' ,
new_0_4_2_4 : 'Add pinned sessions and live monitor in Chat page' ,
new_0_4_2_5 : 'Fix builtin provider detection and model matching' ,
} ,
2026-04-13 15:15:14 +08:00
}