Files
Hermes-ui/packages/client/src/i18n/locales/pt.ts
T

1523 lines
65 KiB
TypeScript
Raw Normal View History

export default {
// Login
login: {
title: 'Hermes Web UI',
2026-05-23 18:44:53 +08:00
description: 'Insira seu nome de usuario e senha para continuar.',
placeholder: 'Token de acesso',
submit: 'Entrar',
tokenRequired: 'Por favor, insira seu token de acesso',
invalidToken: 'Token invalido',
connectionFailed: 'Nao foi possivel conectar ao servidor',
passwordLogin: 'Senha',
tokenLogin: 'Token',
usernamePlaceholder: 'Nome de usuario',
passwordPlaceholder: 'Senha',
2026-05-24 09:49:21 +08:00
defaultCredentialsHint: 'Nome de usuario padrao: admin. Senha padrao: 123456.',
credentialsRequired: 'Por favor, insira nome de usuario e senha',
invalidCredentials: 'Nome de usuario ou senha incorretos',
tooManyAttempts: 'Muitas tentativas falhadas, por favor tente novamente mais tarde',
lockResetHint: 'Se este for seu servidor, limpe o bloqueio de login com:',
defaultLoginResetHint: 'Para redefinir a senha admin padrao, execute:',
2026-05-23 18:44:53 +08:00
sessionExpired: 'Login expirado. Entre novamente.',
accessDenied: 'Voce nao tem permissao para acessar este recurso.',
passwordMismatch: 'As senhas nao conferem',
passwordTooShort: 'A senha deve ter pelo menos 6 caracteres',
setupSuccess: 'Login por senha configurado com sucesso',
passwordChanged: 'Senha alterada com sucesso',
passwordRemoved: 'Login por senha removido',
setupPassword: 'Configurar login por senha',
changePassword: 'Alterar senha',
changeUsername: 'Alterar nome de usuario',
removePasswordLogin: 'Remover',
username: 'Nome de usuario',
currentPassword: 'Senha atual',
newPassword: 'Nova senha',
confirmPassword: 'Confirmar senha',
newUsername: 'Novo nome de usuario',
usernameChanged: 'Nome de usuario alterado com sucesso',
usernameTooShort: 'O nome de usuario deve ter pelo menos 2 caracteres',
2026-05-23 18:44:53 +08:00
setupDescription: 'Gerencie o nome de usuario e a senha usados para entrar.',
removeConfirm: 'Login por senha e obrigatorio para contas de usuario.',
passwordLoginNotConfigured: 'Login por senha nao configurado',
2026-05-23 18:44:53 +08:00
passwordLoginConfigured: 'Conta atual: {username}',
2026-05-24 09:49:21 +08:00
defaultCredentialTitle: 'Altere a conta e senha padrao',
defaultCredentialMessage: 'A conta atual ainda usa o nome de usuario ou a senha padrao. Para evitar acesso nao autorizado, altere o nome de usuario e a senha da conta atual o quanto antes.',
defaultCredentialAction: 'Alterar agora',
defaultCredentialLater: 'Lembrar depois',
2026-05-23 18:44:53 +08:00
},
users: {
title: 'Gerenciamento de contas',
2026-05-23 19:41:51 +08:00
description: 'Crie usuarios, atribua funcoes e controle quais perfis administradores comuns podem acessar.',
2026-05-23 18:44:53 +08:00
create: 'Criar usuario',
edit: 'Editar usuario',
username: 'Nome de usuario',
role: 'Funcao',
statusLabel: 'Status',
2026-05-23 19:41:51 +08:00
profiles: 'Perfis acessiveis',
profilesPlaceholder: 'Selecione perfis acessiveis',
allProfiles: 'Todos os perfis',
noProfiles: 'Nenhum perfil atribuido',
2026-05-23 18:44:53 +08:00
lastLogin: 'Ultimo login',
newPasswordOptional: 'Nova senha (deixe em branco para manter)',
loadFailed: 'Falha ao carregar usuarios',
deleteConfirm: 'Excluir este usuario?',
enable: 'Ativar',
disable: 'Desativar',
roles: {
superAdmin: 'Super admin',
admin: 'Admin',
},
status: {
active: 'Ativo',
disabled: 'Desativado',
},
},
// Common
common: {
loading: 'Carregando...',
cancel: 'Cancelar',
retry: 'Tentar novamente',
delete: 'Excluir',
edit: 'Editar',
save: 'Salvar',
saved: 'Salvo',
update: 'Atualizar',
create: 'Criar',
saveFailed: 'Falha ao salvar',
deleteFailed: 'Falha ao excluir',
ok: 'OK',
copied: 'Copiado',
copy: 'Copiar',
noData: 'Sem dados',
fetch: 'Buscar',
add: 'Adicionar',
enable: 'Ativar',
disable: 'Desativar',
configured: 'Configurado',
notConfigured: 'Nao configurado',
confirm: 'Confirmar',
expand: 'Expandir',
collapse: 'Recolher',
2026-05-20 17:13:32 +08:00
stop: 'Parar',
start: 'Iniciar',
expired: 'Expirado',
},
// Gestao de MCP
mcp: {
title: 'Servidores MCP',
loadFailed: 'Falha ao carregar servidores MCP',
reloadAll: 'Recarregar todos',
refresh: 'Atualizar',
total: 'Total',
connected: 'Conectado',
disconnected: 'Desconectado',
tools: 'ferramentas',
tool: 'Ferramentas',
searchPlaceholder: 'Pesquisar servidores...',
addServer: '+ Adicionar servidor',
zeroTools: '0 ferramentas',
loading: 'Carregando...',
empty: 'Nenhum servidor MCP configurado',
reloaded: '{server} recarregado',
reloadedAll: 'Todos os servidores MCP recarregados',
reloadFailed: 'Falha ao recarregar',
serverAdded: 'Servidor "{name}" adicionado',
addFailed: 'Falha ao adicionar servidor',
serverUpdated: 'Servidor "{name}" atualizado',
updateFailed: 'Falha ao atualizar servidor',
saveFailed: 'Falha ao salvar',
serverRemoved: '"{name}" removido',
enabled: "Habilitado: {name}",
disabled: "Desabilitado: {name}",
connectedStatus: 'Conectado',
disconnectedStatus: 'Desconectado',
disabledStatus: 'Desativado',
toolList: 'Lista de ferramentas',
count: ' ',
more: 'mais',
removeFailed: 'Falha ao remover servidor',
testOk: 'Teste OK — {count} ferramentas disponiveis',
testEmpty: 'O teste nao retornou ferramentas',
testFailed: 'Falha no teste',
edit: 'Editar',
test: 'Testar',
reload: 'Recarregar',
remove: 'Remover',
confirmRemove: 'Remover servidor "{name}"?',
cancel: 'Cancelar',
add: 'Adicionar',
save: 'Salvar',
addTitle: 'Adicionar servidor MCP',
editTitle: 'Editar servidor MCP',
invalidJson: 'JSON inválido',
invalidYaml: 'Formato YAML inválido',
invalidConfig: 'Configuração inválida',
invalidServerConfig: 'Configuração do servidor inválida',
missingCommandOrUrl: 'Deve conter command ou url',
},
// Sidebar
sidebar: {
chat: 'Chat',
search: 'Pesquisar',
apiRelay: 'API Relay',
history: 'Historico',
jobs: 'Tarefas agendadas',
models: 'Modelos',
profiles: 'Perfis',
2026-05-10 13:50:39 +02:00
plugins: 'Plugins',
mcp: 'MCP',
skills: 'Habilidades',
memory: 'Memoria',
logs: 'Logs',
usage: 'Uso',
2026-05-23 09:05:03 +08:00
performance: 'Desempenho',
skillsUsage: 'Uso de habilidades',
channels: 'Canais',
terminal: 'Terminal',
files: 'Arquivos',
groupChat: 'Chat em grupo',
groupConversation: 'Conversa',
2026-05-20 17:13:32 +08:00
groupConversationShort: 'Conv.',
groupAgent: 'Agente',
groupAgentShort: 'Ag.',
groupSystem: 'Sistema',
groupSystemShort: 'Sist',
groupMonitoring: 'Monitoramento',
2026-05-20 17:13:32 +08:00
groupMonitoringShort: 'Mon.',
settings: 'Configuracoes',
connected: 'Conectado',
disconnected: 'Desconectado',
updateTip: 'Execute "hermes-web-ui update" no terminal para atualizar',
updateVersion: 'Atualizar para v{version}',
reloadClientVersion: 'Recarregar para v{version}',
updating: 'Atualizando...',
2026-05-14 12:06:39 +08:00
updateSuccess: 'Atualizacao concluida. Atualize a pagina em breve. Se nao iniciar apos algum tempo, inicie manualmente.',
updateFailed: 'Falha na atualizacao',
logout: 'Sair',
nodeVersionWarning: 'Node.js v{version} detectado. Atualize para a versao 23 ou posterior.',
changelog: 'Registro de alteracoes',
noChangelog: 'Nenhum registro disponivel',
2026-05-20 17:13:32 +08:00
kanban: 'Kanban',
groupTools: 'Ferramentas',
groupToolsShort: "Ferr.",
codingAgents: "Agentes de código",
versionPreview: "Prévia de versão",
2026-05-20 17:13:32 +08:00
groupPlatform: 'Plataforma',
gateways: 'Gateways',
expand: 'Expandir menu',
collapse: 'Recolher menu',
},
2026-05-23 09:05:03 +08:00
performance: {
title: 'Desempenho',
subtitle: 'Monitore recursos do sistema, Bridge Broker, Workers e sessões ativas',
refresh: 'Atualizar',
autoRefreshOn: 'Atualização automática',
autoRefreshOff: 'Atualização manual',
loadFailed: 'Falha ao carregar métricas de desempenho',
systemCpu: 'CPU do sistema',
systemMemory: 'Memória do sistema',
activeSessions: 'Sessões ativas',
runningSessions: 'Em execução {count}',
workers: 'Workers',
totalWorkerMemory: 'Memória total de Worker',
processes: 'Processos',
uptime: 'Tempo ativo',
running: 'Em execução',
stopped: 'Parado',
workerMemory: 'Memória de Worker',
lastUpdated: 'Atualizado',
profile: 'Profile',
memory: 'Memória',
sessions: 'Sessões',
runningActiveSessions: 'Em execução / Ativas',
lastUsed: 'Último uso',
status: 'Status',
noWorkers: 'Nenhum Worker',
sessionsByProfile: 'Sessões por Profile',
noActiveSessions: 'Nenhuma sessão ativa',
},
2026-05-03 22:10:40 +08:00
// Gaveta
drawer: {
terminal: 'Terminal',
files: 'Espaço de trabalho',
},
// Chat
chat: {
contextRemaining: 'restante',
contextClickToEdit: 'Clique para editar o tamanho do contexto',
contextEditTitle: 'Editar tamanho do contexto',
contextEditDesc: 'Definir o limite de tamanho do contexto para o modelo atual (em tokens)',
contextEditPlaceholder: 'Digite o tamanho do contexto',
contextEditHint: 'Valores comuns: 256k (Hermes padrão), 128k (GPT-4), 32k (GPT-3.5)',
contextEditSave: 'Salvar',
contextEditCancel: 'Cancelar',
contextEditInvalid: 'Por favor, insira um tamanho de contexto válido',
contextEditSuccess: 'Tamanho do contexto atualizado',
contextEditFailed: 'Falha na atualização',
emptyState: 'Inicie uma conversa com o Hermes Agent',
2026-05-19 08:25:01 +08:00
outlineTitle: 'Esboço da conversa',
outlineEmpty: 'Nenhum conteúdo da conversa',
outlineUserQuestion: 'Pergunta do usuário',
inputPlaceholder: 'Digite uma mensagem... (Enter para enviar, Shift+Enter para nova linha)',
2026-05-15 12:04:03 +08:00
slashCommandArgs: {
message: '<mensagem>',
title: '<titulo>',
text: '<texto>',
},
slashCommands: {
usage: 'Calcular o uso da sessão atual',
status: 'Mostrar status da sessão e fila',
abort: 'Parar a execução ativa do Bridge',
queue: 'Enfileirar uma mensagem após a execução ativa',
plan: 'Escrever um plano de implementação em Markdown',
goal: 'Set a standing goal that continues across turns',
goalStatus: 'Show the active goal status',
goalPause: 'Pause the active goal loop',
goalResume: 'Resume the paused goal loop',
goalDone: 'Complete and clear the active goal',
goalClear: 'Clear the active goal',
subgoal: 'Add a criterion to the active goal',
2026-05-15 12:04:03 +08:00
clear: 'Limpar a visualização atual',
clearHistory: 'Excluir o histórico de mensagens salvo desta sessão',
title: 'Renomear esta sessão',
compress: 'Executar compressão de contexto quando ocioso',
steer: 'Enviar texto de orientação para a execução ativa do Bridge',
destroy: 'Liberar o Bridge Agent desta sessão',
reloadMcp: 'Recarregar servidores MCP',
2026-05-15 12:04:03 +08:00
},
attachFiles: 'Anexar arquivos',
2026-05-17 09:01:59 +08:00
showToolCalls: 'Mostrar chamadas de ferramentas',
hideToolCalls: 'Ocultar chamadas de ferramentas',
messageQueue: 'Fila de mensagens',
removeQueuedMessage: 'Remover mensagem da fila',
stop: 'Parar',
send: 'Enviar',
contextUsed: 'Contexto utilizado:',
sessions: 'Sessoes',
webUiSessions: 'Sessões',
allProfiles: 'Todos os perfis',
profileMissingModelsTip: 'O perfil "{profile}" não tem provider ou modelo disponível para esta sessão',
sessionScopeHint: 'O chat mostra apenas sessões da Web UI/API Server. Sessões de CLI, Telegram, Discord, Cron e outros canais são somente leitura no Histórico.',
openHistory: 'Abrir histórico',
hermesHistory: 'Histórico Hermes',
historyScopeHint: 'Sessões do histórico Hermes do perfil atual, somente leitura, agrupadas por origem.',
noSessions: 'Sem sessoes',
newChat: 'Novo chat',
2026-05-16 00:11:51 +08:00
approvalKicker: 'Permissão do terminal',
approvalTitle: 'Revisar comando antes de executar',
approvalAllowOnce: 'Permitir uma vez',
approvalAllowSession: 'Permitir sessão',
approvalAlways: 'Sempre',
approvalDeny: 'Negar',
clarifyKicker: 'Agente precisa de esclarecimento',
clarifyTitle: 'O agente tem uma pergunta para você',
clarifyPlaceholder: 'Digite sua resposta...',
clarifySubmit: 'Responder',
clarifyDismiss: 'Descartar',
deleteSession: 'Excluir esta sessao?',
toggleBatchMode: 'Seleção em lote',
selectAll: 'Selecionar tudo',
confirmBatchDelete: 'Excluir {count} sessões selecionadas?',
batchDeleteSuccess: '{count} sessões excluídas',
batchDeletePartial: '{failed} sessões falharam ao excluir',
batchDeleteFailed: 'Falha na exclusão em lote',
2026-05-27 10:05:52 +08:00
importToWebUi: 'Importar para Web UI',
importSessionSuccess: 'Sessão importada para Web UI',
importSessionAlreadyExists: 'A sessão já existe no Web UI',
importSessionFailed: 'Falha ao importar sessão',
sessionDeleted: 'Sessao excluida',
rename: 'Renomear',
pin: 'Fixar',
unpin: 'Desafixar',
pinned: 'Fixadas',
2026-05-20 17:13:32 +08:00
chatMode: 'Modo de chat',
liveMode: 'Ao vivo',
liveSessions: 'Sessões ao vivo',
recentBadge: 'Recente',
linkedSessions: '{count} vinculadas',
noVisibleMessages: 'Nenhuma mensagem visível para humanos.',
monitorRoleUser: 'Usuário',
monitorRoleAssistant: 'Assistente',
copySessionLink: 'Copiar link da sessão',
2026-05-24 19:30:32 +08:00
openSessionInNewTab: 'Abrir em nova aba',
sessionLinkCopied: 'Session link copied',
copySessionId: 'Copiar ID da sessão',
export: 'Exportar',
exportFull: 'Exportação completa (JSON)',
exportCompressed: 'Exportação comprimida (TXT)',
exportCompressing: 'Comprimindo contexto, aguarde...',
exportSuccess: 'Sessão exportada',
exportFailed: 'Falha ao exportar',
renamed: 'Renomeado',
renameFailed: 'Falha ao renomear',
renameSession: 'Renomear sessao',
2026-05-03 22:10:40 +08:00
sessionNotFound: 'Sessao nao encontrada',
enterNewTitle: 'Digite um novo titulo',
other: 'Outro',
runFailed: 'Falha na execucao',
error: 'Erro',
tool: 'Ferramenta',
arguments: 'Argumentos',
result: 'Resultado',
truncated: '... (truncado)',
2026-05-20 17:13:32 +08:00
executionDuration: 'Tempo de execução', thinkingLabel: 'Raciocínio',
thinkingInProgress: 'Pensando…',
thinkingShow: 'Mostrar raciocínio',
thinkingHide: 'Ocultar raciocínio',
thinkingDuration: 'Observado {duration}',
thinkingChars: '{count} caracteres',
copyBubble: 'Copiar mensagem',
copiedBubble: 'Mensagem copiada',
copyFailed: 'Falha ao copiar',
playSpeech: 'Reproduzir voz',
pauseSpeech: 'Pausar',
resumeSpeech: 'Retomar',
stopSpeech: 'Parar',
speechNotSupported: 'Reprodução de voz não suportada neste navegador',
2026-05-20 17:13:32 +08:00
searchEnterHint: 'Enter para abrir · Esc para fechar',
searchHint: 'Cmd/Ctrl+K',
searchScope: 'Escopo da busca: apenas banco local de sessões da Web UI; sessões históricas Hermes somente leitura não são incluídas.',
searchFailed: 'Falha ao pesquisar sessões',
searchNoSnippet: 'Nenhum resumo disponível',
searchNoResults: 'Nenhuma sessão corresponde à busca',
searchRecent: 'Sessão recente',
searchEmpty: 'Sessões recentes',
searchPlaceholder: 'Pesquisar sessões...',
searchSubtitle: 'Pesquisar por título ou conteúdo da mensagem',
searchTitle: 'Pesquisar sessões',
stopGateway: 'Parar gateway',
start: 'Iniciar',
workspaceSetFailed: 'Falha ao definir workspace',
workspaceSet: 'Workspace definido',
workspacePlaceholder: 'Digite o caminho do projeto, ex. /home/user/project',
workspace: 'Área de trabalho',
setWorkspaceTitle: 'Definir workspace da sessão',
setWorkspace: 'Definir workspace',
modelSetFailed: 'Falha ao definir modelo',
modelSet: 'Modelo definido',
setModelTitle: 'Definir modelo da sessão',
setModel: 'Definir modelo',
newCliChat: 'Novo CLI',
cliEmptyState: 'Iniciar chat CLI',
autoPlaySpeech: 'Reproduzir voz automaticamente',
},
// Jobs
jobs: {
title: 'Tarefas agendadas',
createJob: 'Criar tarefa',
editJob: 'Editar tarefa',
noJobs: 'Nenhuma tarefa agendada ainda. Crie uma para comecar.',
name: 'Nome',
namePlaceholder: 'Nome da tarefa',
schedule: 'Agendamento (expressao Cron)',
schedulePlaceholder: 'ex. 0 9 * * *',
quickPresets: 'Presets rapidos',
selectPreset: 'Selecionar um preset...',
presetEveryMinute: 'Cada minuto',
presetEvery5Min: 'A cada 5 minutos',
presetEveryHour: 'Cada hora',
presetEveryDay: 'Todos os dias as 00:00',
presetEveryDay9: 'Todos os dias as 09:00',
presetEveryMonday: 'Toda segunda as 09:00',
presetEveryMonth: 'Dia 1 de cada mes as 09:00',
prompt: 'Prompt',
promptPlaceholder: 'O prompt a executar',
deliverTarget: 'Destino de entrega',
origin: 'Origem',
local: 'Local',
repeatCount: 'Contagem de repeticoes (opcional)',
modelPlaceholder: 'Modelo padrao',
repeatPlaceholder: 'Deixar vazio para infinito',
jobCreated: 'Tarefa criada',
jobUpdated: 'Tarefa atualizada',
nameRequired: 'O nome e obrigatorio',
scheduleRequired: 'O agendamento e obrigatorio',
loadFailed: 'Falha ao carregar a tarefa',
jobPaused: 'Tarefa pausada',
jobResumed: 'Tarefa retomada',
jobTriggered: 'Job acionado',
modelUpdated: 'Modelo atualizado',
jobDeleted: 'Tarefa excluida',
status: {
running: 'Em execucao',
paused: 'Pausada',
disabled: 'Desativada',
scheduled: 'Agendada',
},
info: {
model: 'Modelo',
schedule: 'Agendamento',
lastRun: 'Ultima execucao',
nextRun: 'Proxima execucao',
deliver: 'Entrega',
repeat: 'Repeticao',
},
action: {
pause: 'Pausar',
pauseJob: 'Pausar tarefa',
resume: 'Retomar',
resumeJob: 'Retomar tarefa',
runNow: 'Executar agora',
triggerImmediately: 'Acionar imediatamente',
},
runHistory: {
title: 'Histórico',
runs: 'execuções',
noRuns: 'Nenhum histórico encontrado.',
},
},
// Skills
skills: {
title: 'Habilidades',
searchPlaceholder: 'Buscar habilidades...',
noMatch: 'Nenhuma habilidade corresponde a sua busca',
noSkills: 'Nenhuma habilidade encontrada',
backTo: 'Voltar para',
attachedFiles: 'Arquivos anexados',
loadFailed: 'Falha ao carregar a habilidade',
fileLoadFailed: 'Falha ao carregar o arquivo',
modified: 'Modificado pelo usuário',
archived: 'Arquivado',
pinned: 'Fixado',
pin: 'Fixar habilidade',
unpin: 'Desfixar habilidade',
pinFailed: 'Falha ao alterar estado de fixacao',
toggleFailed: 'Falha ao ativar/desativar a habilidade',
source: {
builtin: 'Integrado',
hub: 'Hub',
local: 'Local',
2026-05-24 19:47:52 +08:00
external: 'Externo',
},
},
2026-05-10 13:50:39 +02:00
// Plugins
plugins: {
title: 'Plugins',
refresh: 'Atualizar',
notice: 'Inventário somente leitura dos manifests de plugins Hermes detectáveis. Os metadados de descoberta são lidos sem carregar código de plugin. No v1, ações de gerenciamento ficam na CLI; mudanças entram em vigor em novas sessões Hermes.',
loadFailed: 'Falha ao carregar plugins',
commandCopied: 'Comando copiado',
searchPlaceholder: 'Buscar key, nome, descrição, caminho...',
source: 'Origem',
kind: 'Tipo',
statusTitle: 'Status',
configStatus: 'config: {status}',
notAvailable: 'n/a',
copyCommand: 'Copiar comando',
managedElsewhere: 'gerenciado em outro lugar',
noMatch: 'Nenhum plugin corresponde aos filtros atuais',
enabled: 'ativado',
disabled: 'desativado',
summary: {
total: 'Total',
active: 'Ativado / auto',
inactive: 'Inativo',
disabled: 'Desativado',
providerManaged: 'Gerenciado por provider',
},
status: {
enabled: 'Ativado',
'auto-active': 'Autoativo',
inactive: 'Inativo',
disabled: 'Desativado',
'provider-managed': 'Gerenciado por provider',
},
statusLabel: {
enabled: 'Ativado por configuração',
'auto-active': 'Autoativo',
inactive: 'Inativo',
disabled: 'Desativado',
'provider-managed': 'Gerenciado por provider',
},
configStatuses: {
enabled: 'ativado',
disabled: 'desativado',
'not-enabled': 'não ativado',
auto: 'auto',
'provider-managed': 'gerenciado por provider',
},
table: {
plugin: 'Plugin',
status: 'Status',
source: 'Origem',
kind: 'Tipo',
capabilities: 'Capacidades',
path: 'Caminho / entrypoint',
cli: 'CLI',
},
capabilities: {
tools: '{count} ferramentas',
hooks: '{count} hooks',
env: '{count} env',
},
metadata: {
2026-05-20 17:13:32 +08:00
agentRoot: 'Raiz do agente',
2026-05-10 13:50:39 +02:00
python: 'Python',
2026-05-20 17:13:32 +08:00
scanCwd: 'Verificar cwd',
2026-05-10 13:50:39 +02:00
projectPlugins: 'Plugins do projeto',
},
},
// Memory
memory: {
title: 'Memoria',
refresh: 'Atualizar',
loadFailed: 'Falha ao carregar a memoria',
myNotes: 'Minhas notas',
noNotes: 'Nenhuma nota ainda.',
notesPlaceholder: 'Escreva suas notas...',
userProfile: 'Perfil do usuario',
noProfile: 'Nenhum perfil ainda.',
profilePlaceholder: 'Escreva seu perfil...',
soul: 'Alma',
noSoul: 'Nenhuma configuracao de alma ainda.',
soulPlaceholder: 'Escreva a configuracao da alma...',
},
// Models
models: {
title: 'Modelos',
addProvider: 'Adicionar provedor',
providerType: 'Tipo de provedor',
2026-05-20 17:13:32 +08:00
preset: 'Predefinição',
custom: 'Personalizado',
selectProvider: 'Selecionar provedor',
chooseProvider: 'Escolha um provedor...',
name: 'Nome',
autoGeneratedName: 'Gerado automaticamente pela URL base',
baseUrl: 'URL base',
region: 'Região',
regionIntl: 'Internacional',
regionCn: 'China Continental',
baseUrlPlaceholder: 'ex. https://api.example.com/v1',
apiKey: 'Chave API',
apiKeyPlaceholder: 'sk-...',
defaultModel: 'Modelo padrao',
selectOrInput: 'Selecionar ou digitar um modelo...',
selectModel: 'Selecionar um modelo...',
providerAdded: 'Provedor adicionado',
providerDeleted: 'Provedor excluido',
deleteProvider: 'Excluir provedor',
deleteConfirm: 'Tem certeza de que deseja excluir "{name}"?',
codexLoginTitle: 'Login do OpenAI Codex',
codexWaiting: 'Digite este código na página de autorização para fazer login:',
codexCopyCode: 'Código copiado',
codexOpenLink: 'Abrir página de autorização',
codexApproved: 'Login bem-sucedido',
codexExpired: 'A autorização expirou. Por favor, tente novamente.',
nousLoginTitle: 'Login do Nous Portal',
nousWaiting: 'Insira este código na página de autorização:',
nousCopyCode: 'Código copiado',
nousOpenLink: 'Abrir página de autorização',
nousApproved: 'Login bem-sucedido',
nousDenied: 'Autorização negada',
nousExpired: 'Autorização expirada',
copilotLoginTitle: 'Login do GitHub Copilot',
copilotWaiting: 'Abra o GitHub e insira o código do dispositivo abaixo para autorizar. A janela fechará automaticamente após a aprovação.',
copilotCopyCode: 'Código copiado',
copilotOpenLink: 'Abrir a página de autorização do GitHub',
copilotApproved: 'Login bem-sucedido!',
copilotDenied: 'Autorização negada.',
copilotExpired: 'O link de autorização expirou. Tente novamente.',
copilotAddDetectedTitle: 'GitHub Copilot detectado',
copilotAddDetected: 'Foi detectado um token OAuth do GitHub Copilot nesta máquina. Clique em Adicionar para ativar o Copilot no Hermes.',
copilotAddSourceEnv: 'Origem: ~/.hermes/.env (COPILOT_GITHUB_TOKEN)',
copilotAddSourceGhCli: 'Origem: gh CLI (gh auth token)',
copilotAddSourceAppsJson: 'Origem: extensão Copilot do VS Code (apps.json)',
copilotDeleteHintEnv: 'Isto irá limpar o COPILOT_GITHUB_TOKEN em ~/.hermes/.env. Outras ferramentas não são afetadas.',
copilotDeleteHintGhCli: 'O Copilot ficará oculto no Hermes. Sua sessão no gh CLI não é afetada — `gh auth status` continuará indicando que está conectado.',
copilotDeleteHintAppsJson: 'O Copilot ficará oculto no Hermes. A extensão Copilot do VS Code continuará conectada.',
customBadge: 'PERSONALIZADO',
previewBadge: 'PRÉVIA',
disabledBadge: 'INDISPONÍVEL',
disabledTooltip: "Este modelo não está disponível para sua conta.",
customModelPlaceholder: 'ID de modelo não listado',
customModelHint: 'Para modelos compatíveis com o provedor que a API não retorna; não é uma renomeação de exibição. Enter para carregar.',
noProviders: 'Nenhum provedor encontrado. Adicione um provedor personalizado para comecar.',
clearVisibleModels: 'Limpar seleção',
currentDefault: 'Padrão atual',
defaultShort: 'Padrão',
builtIn: 'Integrado',
customType: 'Personalizado',
provider: 'Provedor',
contextLength: 'Tamanho do contexto',
contextLengthPlaceholder: 'ex: 256000 (opcional)',
local: 'Local ({host})',
selectProviderRequired: 'Por favor, selecione um provedor',
baseUrlRequired: 'A URL base e obrigatoria',
apiKeyRequired: 'A chave API e obrigatoria',
modelRequired: 'O modelo padrao e obrigatorio',
enterBaseUrl: 'Por favor, insira a URL base primeiro',
unexpectedFormat: 'Formato de resposta inesperado',
foundModels: '{count} modelos encontrados',
fetchFailed: 'Falha ao buscar os modelos',
2026-05-20 17:13:32 +08:00
xaiWaiting: 'Conclua a autorização na página xAI aberta. A janela será fechada automaticamente após a aprovação.',
xaiOpenLink: 'Abrir página de autorização xAI',
xaiLoginTitle: 'Login OAuth xAI Grok',
xaiExpired: 'O link de autorização expirou. Tente novamente.',
xaiCopyLink: 'Copiar link de autorização',
xaiApproved: 'Login concluído!',
visibilitySelectOne: 'Mantenha pelo menos um modelo visível',
visibilitySaved: 'Modelos visíveis salvos',
visibilitySaveFailed: 'Falha ao salvar modelos visíveis',
visibilityHint: 'Afeta apenas o seletor de modelos e a página de modelos da Web UI. A configuração provider/model da Hermes CLI não é alterada; as chamadas ainda usam o ID original do modelo.',
showAllModels: 'Mostrar todos os modelos',
searchPlaceholder: 'Pesquisar modelos...',
removeCustomModel: 'Remover este modelo não listado',
more: 'mais',
models: 'Lista de modelos',
manageVisibleModelsFor: 'Gerenciar modelos visíveis de {name}',
manageVisibleModels: 'Gerenciar modelos visíveis',
getApiKey: 'Obter API Key',
count: 'modelos',
aliasUseOriginal: 'Restaurar ID original',
aliasTitleFor: 'Nome exibido de {model}',
aliasTitle: 'Nome exibido do modelo',
aliasSaveFailed: 'Falha ao salvar nome exibido',
aliasPlaceholder: 'Deixe vazio para usar o ID original do modelo',
aliasManageFor: 'Nomes exibidos de {provider}',
aliasManage: 'Nomes exibidos',
aliasHint: 'Altera apenas o nome exibido na Web UI. O Hermes ainda recebe o ID original do modelo.',
aliasEdit: 'Renomear',
aliasCanonical: 'ID original: {model}',
},
// Profiles
profiles: {
title: 'Perfis',
create: 'Criar perfil',
import: 'Importar',
export: 'Exportar',
rename: 'Renomear',
delete: 'Excluir',
2026-05-23 18:44:53 +08:00
switchTo: 'Trocar Hermes Profile',
switchConfirm: 'Isto executara `hermes profile use {name}` e alterara o active profile do Hermes CLI. Continuar?',
switchSuccess: 'Hermes active profile alterado para "{name}"',
switchFailed: 'Falha ao trocar Hermes Profile. O gateway pode precisar de reinicio manual.',
createSuccess: 'Perfil "{name}" criado',
createFailed: 'Falha ao criar o perfil',
renameSuccess: 'Perfil renomeado',
renameFailed: 'Falha ao renomear o perfil',
deleteConfirm: 'Tem certeza de que deseja excluir o perfil "{name}"?',
deleteSuccess: 'Perfil excluido',
deleteFailed: 'Falha ao excluir o perfil',
exportSuccess: 'Perfil exportado',
exportFailed: 'Falha ao exportar o perfil',
importSuccess: 'Perfil importado',
importFailed: 'Falha ao importar o perfil',
importSelectFile: 'Selecionar arquivo de arquivo',
importInvalidFile: 'Por favor, selecione um arquivo valido (.tar.gz, .tgz, .gz, .zip)',
name: 'Nome do perfil',
namePlaceholder: 'Apenas letras, numeros e hifens',
2026-05-03 22:10:40 +08:00
nameValidation: 'O nome do perfil só pode conter letras minúsculas, números, sublinhados e hifens',
newName: 'Novo nome',
newNamePlaceholder: 'Digite um novo nome',
cloneFromCurrent: 'Clonar do perfil atual',
cloneCleanupNotice: 'Ao clonar, as credenciais exclusivas de plataforma (Weixin / Telegram / Slack, etc.) são automaticamente ignoradas para evitar conflitos com o perfil de origem',
cloneStrippedCredentials: '{count} credencial(is) exclusiva(s) removida(s): {list}',
cloneDisabledPlatforms: '{count} plataforma(s) desabilitada(s): {list}',
cloneStrippedConfigCredentials: '{count} credencial(is) incorporada(s) removida(s) do config.yaml: {list}',
archivePath: 'Caminho do arquivo',
archivePathPlaceholder: 'Caminho do servidor para o arquivo',
importName: 'Nome do perfil (opcional)',
importNamePlaceholder: 'Deixe vazio para usar o nome do arquivo',
active: 'Ativo',
model: 'Modelo',
gateway: 'Gateway',
alias: 'Alias',
provider: 'Provedor',
path: 'Caminho',
skills: 'Habilidades',
hasEnv: 'Tem .env',
hasSoulMd: 'Tem soul.md',
noProfiles: 'Nenhum perfil encontrado. Crie um para comecar.',
avatar: {
2026-05-20 17:13:32 +08:00
title: 'Avatar personalizado',
customize: 'Personalizar avatar',
upload: 'Enviar imagem',
random: 'Gerar aleatório',
reset: 'Restaurar padrão',
hint: 'PNG, JPEG ou WebP, máximo 1 MB',
invalidType: 'Escolha uma imagem PNG, JPEG ou WebP',
tooLarge: 'A imagem do avatar não pode exceder 1 MB',
saveSuccess: 'Avatar salvo',
saveFailed: 'Falha ao salvar avatar',
resetSuccess: 'Avatar padrão restaurado',
resetFailed: 'Falha ao restaurar avatar padrão',
},
runtime: {
activeProfile: 'Atual: {name}',
bridgeWorker: 'Status do Bridge',
gateway: 'Gateway',
active: 'Ativo',
activeTag: 'Atual',
idle: 'Ocioso',
2026-05-30 09:17:37 +08:00
checking: 'Verificando',
2026-05-20 17:13:32 +08:00
running: 'Em execução',
stopped: 'Parado',
restartGateway: 'Reiniciar gateway',
restartProfile: 'Reiniciar perfil',
2026-05-23 19:41:51 +08:00
switchProfile: 'Trocar perfil frontend',
2026-05-20 17:13:32 +08:00
gatewayRestarted: 'Gateway reiniciado: {name}',
gatewayRestartFailed: 'Falha ao reiniciar gateway',
profileRestarted: 'Perfil reiniciado: {name}',
profileRestartFailed: 'Falha ao reiniciar perfil',
},
},
// Logs
logs: {
title: 'Logs',
all: 'Todos',
searchPlaceholder: 'Buscar...',
refresh: 'Atualizar',
noEntries: 'Nenhuma entrada de log',
},
// Settings
settings: {
title: 'Configuracoes',
saved: 'Salvo',
saveFailed: 'Falha ao salvar',
tabs: {
display: 'Exibicao',
2026-05-23 18:44:53 +08:00
account: 'Conta atual',
users: 'Gerenciamento de contas',
agent: 'Agente',
memory: 'Memoria',
compression: 'Compressao',
session: 'Sessao',
privacy: 'Privacidade',
apiServer: 'Servidor API',
models: 'Modelos',
voice: 'Voz',
},
display: {
streaming: 'Respostas em streaming',
streamingHint: 'Mostrar respostas da IA em tempo real',
compact: 'Modo compacto',
compactHint: 'Reduzir espacamento entre mensagens',
showReasoning: 'Mostrar raciocinio',
showReasoningHint: 'Mostrar processo de pensamento do modelo',
showCost: 'Mostrar custo',
showCostHint: 'Mostrar uso de tokens nas respostas',
inlineDiffs: 'Diffs em linha',
inlineDiffsHint: 'Mostrar alteracoes de codigo em linha',
bellOnComplete: 'Som de conclusao',
bellOnCompleteHint: 'Tocar som quando a IA terminar',
busyInputMode: 'Modo de entrada ocupada',
busyInputModeHint: 'Permitir entrada enquanto a IA processa',
theme: 'Tema',
themeHint: 'Escolha claro, escuro ou seguir a preferencia do sistema',
themeLight: 'Claro',
themeDark: 'Escuro',
themeSystem: 'Sistema',
},
agent: {
maxTurns: 'Maximo de turnos',
maxTurnsHint: 'Maximo de rodadas de interacao por conversa',
gatewayTimeout: 'Timeout do gateway',
gatewayTimeoutHint: 'Timeout da requisicao em segundos',
restartDrainTimeout: 'Timeout de drenagem ao reiniciar',
restartDrainTimeoutHint: 'Timeout de drenagem antes de reiniciar em segundos',
toolEnforcement: 'Obrigatoriedade de ferramentas',
toolEnforcementHint: 'Controlar o modo de execucao de chamadas de ferramentas',
auto: 'Automatico',
always: 'Sempre',
never: 'Nunca',
},
memory: {
enabled: 'Ativar memoria',
enabledHint: 'Permitir que a IA lembre do contexto da conversa',
userProfile: 'Perfil do usuario',
userProfileHint: 'Permitir que a IA lembre das preferencias do usuario',
charLimit: 'Limite de caracteres da memoria',
charLimitHint: 'Maximo de caracteres para MEMORY.md',
userCharLimit: 'Limite de caracteres do perfil do usuario',
userCharLimitHint: 'Maximo de caracteres para USER.md',
},
compression: {
enabled: 'Ativar compressao',
enabledHint: 'Comprimir automaticamente historico longo antes de exceder o contexto do modelo',
threshold: 'Limiar de compressao',
thresholdHint: 'Iniciar compressao quando tokens estimados excederem esta proporcao do contexto',
targetRatio: 'Proporcao alvo',
targetRatioHint: 'Tamanho alvo do historico apos compressao como proporcao do contexto',
protectLastN: 'Proteger mensagens recentes',
protectLastNHint: 'Manter sem compressao esta quantidade de mensagens recentes',
protectFirstN: 'Proteger primeiras mensagens',
protectFirstNHint: 'Manter sem compressao esta quantidade de mensagens iniciais',
},
session: {
mode: 'Modo de reinicializacao',
modeHint: 'Condicao de acionamento para reinicializacao de sessao',
modeBoth: 'Inatividade + Agendado',
modeIdle: 'Somente inatividade',
modeDaily: 'Somente agendado',
modeNone: 'Nunca (apenas manual)',
idleMinutes: 'Timeout de inatividade',
idleMinutesHint: 'Tempo de espera antes da reinicializacao automatica (minutos)',
atHour: 'Horario de reinicializacao agendada',
humanOnly: 'Mostrar apenas sessões humanas',
humanOnlyHint: 'Oculta por padrão o ruído de subagentes e do monitor de sessões',
liveMonitorHumanOnly: 'Monitor ao vivo: mostrar apenas sessões humanas',
liveMonitorHumanOnlyHint: 'Oculta por padrão o ruído de subagentes e do monitor de sessões no monitor ao vivo',
atHourHint: 'Reiniciar sessao neste horario diariamente',
requireAuth: 'Autorização de sessão',
requireAuthHint: 'Requer autorização para operações de sessão',
},
privacy: {
redactPii: 'Ocultar dados pessoais',
redactPiiHint: 'Detectar e ocultar automaticamente informacoes sensiveis (senhas, chaves, etc.)',
},
apiServer: {
enable: 'Ativar',
enableHint: 'Ativar servidor API',
host: 'Host',
hostHint: 'Endereco de escuta',
port: 'Porta',
portHint: 'Porta de escuta',
key: 'Chave',
keyHint: 'Chave de acesso API',
cors: 'Origens CORS',
corsHint: 'Fontes cross-origin permitidas',
},
voice: {
ttsProvider: 'Provedor TTS',
ttsProviderHint: 'Escolha o mecanismo de texto para fala para reproducao de mensagens',
providerWebSpeech: 'WebSpeech API (Navegador)',
providerOpenai: 'OpenAI TTS',
providerCustom: 'Endpoint personalizado (compativel com OpenAI)',
providerEdge: 'Edge TTS (Gratuito, sem chave API)',
// WebSpeech
webspeechVoice: 'Voz',
webspeechVoiceHint: 'Selecione uma voz do seu navegador ou SO',
webspeechVoicePlaceholder: 'Auto (voz padrao)',
// OpenAI
openaiKey: 'Chave API',
openaiKeyHint: 'Sua chave API OpenAI com acesso TTS',
openaiUrl: 'URL base da API',
openaiUrlHint: 'ex. https://api.openai.com/v1/audio/speech',
openaiModel: 'Modelo',
openaiModelHint: 'tts-1 (mais rapido) / tts-1-hd (qualidade superior)',
openaiVoice: 'Voz',
openaiVoiceHint: 'Voz a ser usada para sintese',
// Custom endpoint
customHint: 'Use qualquer API TTS compativel com OpenAI — funciona com GPT-SoVITS, CosyVoice, etc.',
customUrl: 'URL da API',
customUrlHint: 'URL base do seu servico TTS',
customUrlPlaceholder: 'Endereco configurado no adaptador local, ex. http://127.0.0.1:9880',
customApiKey: 'Chave API (opcional)',
customApiKeyHint: 'Alguns endpoints personalizados exigem autenticacao',
customApiKeyPlaceholder: 'Deixe em branco se nao for necessario',
// Edge TTS
edgeHint: 'Desenvolvido por Microsoft Edge TTS (node-edge-tts).',
edgeUrl: 'URL do adaptador',
edgeUrlHint: 'Endereco do adaptador Edge TTS, ex. http://127.0.0.1:9882',
edgeUrlPlaceholder: 'http://127.0.0.1:9882',
edgeVoice: 'Voz',
edgeVoiceHint: 'Selecione uma voz para sintese de fala',
edgeRate: 'Velocidade',
edgeRateHint: 'Ajustar velocidade da fala (0.5x ~ 2.0x)',
edgePitch: 'Tom',
edgePitchHint: 'Ajustar tom da fala (-20 ~ +20 Hz)',
// Test
testTitle: 'Teste de voz',
testText: 'Texto de teste',
testTextPlaceholder: 'Insira o texto para testar...',
testTextDefault: 'Ola, este e um teste de voz.',
testButton: 'Testar',
testButtonPlaying: 'Reproduzindo...',
testFailed: 'Teste falhou: {error}',
// MiMo TTS
providerMimo: 'MiMo TTS',
mimoHint: 'Xiaomi MiMo TTS — vozes predefinidas, design de voz e clonagem de voz',
mimoApiKey: 'Chave API',
mimoApiKeyHint: 'Obtenha sua chave em platform.xiaomimimo.com',
mimoApiKeyPlaceholder: 'Chave API MiMo',
mimoBaseUrl: 'URL base',
mimoBaseUrlHint: 'URL do endpoint da API MiMo',
mimoModel: 'Modelo',
mimoModelHint: 'Selecione o modelo de síntese de voz',
mimoModelPreset: 'Vozes predefinidas',
mimoModelVoiceDesign: 'Design de voz',
mimoModelVoiceClone: 'Clonagem de voz',
mimoVoice: 'Voz',
mimoVoiceHint: 'Selecione uma voz predefinida',
mimoVoiceDesignPrompt: 'Descrição da voz',
mimoVoiceDesignPromptHint: 'Descreva as características de voz desejadas',
mimoVoiceDesignPromptPlaceholder: 'Ex: Uma voz feminina quente e jovem, ligeiramente lenta, com tom magnético',
mimoCloneAudio: 'Enviar áudio',
mimoCloneAudioHint: 'Envie uma amostra de áudio para clonagem (mp3/wav, máx. 10 MB)',
mimoCloneAudioUpload: 'Escolher arquivo',
mimoCloneAudioClear: 'Limpar',
mimoStylePrompt: 'Prompt de estilo',
mimoStylePromptHint: 'Opcional — descreva o estilo de fala em linguagem natural',
mimoStylePromptPlaceholder: 'Ex: Tom brilhante e animado, ritmo rápido',
},
lockedIps: {
title: 'IPs bloqueadas',
count: '{count} bloqueadas',
empty: 'Nenhuma IP bloqueada',
unlock: 'Desbloquear',
unlockAll: 'Desbloquear tudo',
unlockAllConfirm: 'Desbloquear todas as IPs?',
unlocked: 'IP desbloqueada',
allUnlocked: '{count} IPs desbloqueadas',
},
2026-05-20 17:13:32 +08:00
models: {
apiKey: 'API Key',
apiKeyPlaceholder: 'Digite a API Key',
noProviders: 'Nenhum provedor configurado',
save: 'Salvar',
saveFailed: 'Falha ao salvar',
saved: 'Salvo',
},
},
githubPreview: {
title: "Prévia de versão",
description: "Clona a tag do GitHub selecionada para o workspace de prévia do Web UI, instala dependências e executa com as portas de desenvolvimento.",
refresh: "Atualizar",
selectTag: "Selecione uma tag",
prepare: "Preparar código",
install: "Instalar dependências",
start: "Iniciar prévia",
stop: "Parar",
note: "O código de prévia é armazenado no diretório de dados do Web UI. Produção permanece na porta 8648; a prévia usa frontend 8651 e backend 8650.",
path: "Caminho da prévia",
webuiHome: "Dados da prévia",
currentTag: "Tag atual",
repoReady: "Repositório pronto",
dependencies: "Dependências instaladas",
running: "Estado",
notRunning: "Não em execução",
open: "Abrir prévia",
log: "Caminho do log de ações",
logOutput: "Saída de logs",
actionLog: "Log de ações",
devLog: "Log do servidor dev",
yes: "Sim",
no: "Não",
actionFailed: "Ação falhou",
2026-05-30 20:19:01 +08:00
nodeEnvironmentMissing: "Node/npm não foi detectado. Instale o Node.js e tente novamente.",
prepareSuccess: "Código de prévia pronto",
installSuccess: "Dependências instaladas",
startSuccess: "Prévia iniciada",
stopSuccess: "Prévia parada",
},
codingAgents: {
title: "Agentes de código",
notice: "Nem todos os provedores e modelos são compatíveis.",
claudeDescription: "CLI da Anthropic para tarefas únicas em print mode e sessões interativas de código.",
codexDescription: "CLI da OpenAI e fluxo de provedor openai-codex do Hermes para tarefas de repositório.",
copyCommand: "Copiar",
commandCopied: "Comando copiado",
commandCopyFailed: "Falha ao copiar",
refresh: "Atualizar",
checking: "Verificando",
installStatus: "Status da instalação",
installed: "Instalado",
notInstalled: "Não instalado",
installNow: "Instalar",
installing: "Instalando",
installSuccess: "Instalado",
installFailed: "Falha na instalação",
2026-05-30 20:19:01 +08:00
nodeEnvironmentMissing: "Node/npm não foi detectado. Instale o Node.js e tente novamente.",
deleteNow: "Excluir",
deleting: "Excluindo",
deleteSuccess: "Excluído",
deleteFailed: "Falha ao excluir",
configFiles: "Arquivos de configuração",
profileScope: "Perfil",
providerScope: "Provedor",
providerPlaceholder: "ex.: custom:glm",
modelScope: "Modelo",
modelPlaceholder: "Selecionar modelo",
launchModeScope: "Modo de inicialização",
launchModeGlobal: "Configuração global",
launchModeScoped: "Provedor e modelo",
protocolScope: "Protocolo",
protocolOpenAiChat: "OpenAI Chat Completions (/v1/chat/completions)",
protocolOpenAiResponses: "OpenAI Responses (/v1/responses)",
protocolAnthropicMessages: "Anthropic Messages (/v1/messages)",
reloadConfig: "Recarregar configuração",
configFileNotCreated: "Não criado",
configLoadFailed: "Falha ao ler arquivo de configuração",
loadFailed: "Falha ao inspecionar agentes de código",
launch: "Iniciar",
launchTitle: "Iniciar agente de código",
nativeTerminal: "Terminal nativo",
builtInTerminal: "Terminal integrado",
launchPrepared: "Configuração de inicialização preparada",
launchPrepareFailed: "Falha ao preparar configuração de inicialização",
nativeLaunchStarted: "Terminal nativo aberto",
nativeLaunchFailed: "Falha ao abrir terminal nativo",
terminalTitle: "Terminal do agente de código",
loadProvidersFailed: "Falha ao carregar provedores do perfil atual",
selectProviderModel: "Selecione um provedor e modelo",
launchConfigDir: "Diretório de configuração de inicialização",
launchCommand: "Comando de inicialização",
table: {
tool: "Ferramenta",
kind: "Etapa",
command: "Comando",
note: "Nota",
action: "Ação",
},
kinds: {
install: "Instalar",
auth: "Autenticação",
health: "Saúde",
run: "Executar",
},
notes: {
claudeInstall: "Instala a CLI Claude Code globalmente.",
codexInstall: "Instala a CLI Codex globalmente.",
claudeAuth: "Verifica o estado de login do Claude Code; execute claude uma vez se o login estiver ausente.",
codexAuth: "Adiciona credenciais OAuth do OpenAI Codex gerenciadas pelo Hermes.",
claudeHealth: "Verifica o atualizador e a saúde da CLI local.",
codexHealth: "Confirma que a CLI Codex está disponível no PATH.",
claudeRun: "Print mode é o caminho mais limpo para tarefas únicas orientadas por API.",
codexRun: "Tarefas únicas do Codex devem ser executadas dentro de um repositório git.",
},
},
// Platform channel settings
platform: {
requireMention: "Exigir mencao {'@'}",
requireMentionGroup: "Exigir mencao {'@'} em grupos para responder",
requireMentionChannel: "Exigir mencao {'@'} em canais para responder",
requireMentionRoom: "Exigir mencao {'@'} em salas para responder",
reactions: 'Reacoes',
reactionsHint: 'Reagir a mensagens com emoji',
freeResponseChats: 'Chats de resposta livre',
freeResponseChatsHint: "IDs de chats que respondem sem mencao {'@'} (separados por virgula)",
freeResponseChannels: 'Canais de resposta livre',
freeResponseChannelsHint: "IDs de canais que respondem sem mencao {'@'} (separados por virgula)",
freeResponseRooms: 'Salas de resposta livre',
freeResponseRoomsHint: "IDs de salas que respondem sem mencao {'@'} (separados por virgula)",
mentionPatterns: 'Padroes de mencao personalizados',
mentionPatternsHint: 'Padroes de acionamento adicionais',
autoThread: 'Thread automatica',
autoThreadHint: "Criar automaticamente threads de resposta apos mencao {'@'}",
autoThreadHintRoom: 'Criar automaticamente threads de resposta em salas',
dmMentionThreads: 'Threads de mencao em DM',
dmMentionThreadsHint: 'Usar respostas em thread para mencoes em DMs',
allowBots: 'Permitir mensagens de bots',
allowBotsHint: 'Responder a mensagens de outros bots',
allowedChannels: 'Canais permitidos',
allowedChannelsHint: 'Lista branca de IDs de canais (separados por virgula)',
ignoredChannels: 'Canais ignorados',
ignoredChannelsHint: 'Canais onde o bot nunca responde (separados por virgula)',
noThreadChannels: 'Canais sem thread',
noThreadChannelsHint: 'Canais onde o bot responde sem threads (separados por virgula)',
exclusiveTokenWarning: 'Esta plataforma usa bloqueio exclusivo de token. Cada perfil deve usar um token de identidade diferente para evitar conflitos com outros perfis.',
botToken: 'Token do bot',
botTokenHint: 'Token do bot do portal do desenvolvedor',
accessToken: 'Token de acesso',
accessTokenHint: 'Token de acesso Matrix',
homeserver: 'URL do homeserver',
homeserverHint: 'URL do homeserver Matrix',
appId: 'ID do aplicativo',
appIdHint: 'ID do aplicativo Feishu',
appSecret: 'Segredo do aplicativo',
appSecretHint: 'Segredo do aplicativo Feishu',
clientId: 'ID do cliente',
clientIdHint: 'ID do cliente DingTalk',
clientSecret: 'Segredo do cliente',
clientSecretHint: 'Segredo do cliente DingTalk',
cardTemplateId: 'ID do modelo de cartão IA',
cardTemplateIdHint: 'ID do modelo de cartão IA do DingTalk; deixe vazio para desativar os cartões IA',
botId: 'ID do bot',
botIdHint: 'ID do bot WeCom',
wecomSecretHint: 'Segredo do bot WeCom',
waEnabled: 'Ativar WhatsApp',
waEnabledHint: 'Ativar WhatsApp via pareamento por codigo QR',
weixinToken: 'Token Weixin',
weixinTokenHint: 'Do login QR da CLI weixin (hermes weixin)',
accountId: 'ID da conta',
accountIdHint: 'ID da conta Weixin',
qrLogin: 'Login por QR',
qrRelogin: 'Reconectar',
qrFetching: 'Buscando codigo QR...',
qrScanHint: 'Escaneie com WeChat para fazer login',
qrScanedHint: 'Escaneado, por favor confirme no celular...',
2026-05-20 17:13:32 +08:00
qqSandboxHint: 'Ativar ambiente sandbox (para testes)',
qqSandbox: 'Modo sandbox',
qqQrScanHint: 'Escaneie o QR code com QQ ou abra o link no celular para concluir a vinculação',
qqMarkdownHint: 'Ativar mensagens em formato Markdown (alguns clientes podem não suportar)',
qqMarkdown: 'Suporte a Markdown',
qqAppSecretHint: 'App Secret do bot QQ Open Platform',
qqAppSecret: 'App Secret',
qqAppIdHint: 'App ID do bot QQ Open Platform',
qqAppId: 'App ID',
allowedUsersHint: 'Lista de permissões de IDs de usuário ou OpenID, separados por vírgula',
allowedUsers: 'Usuários permitidos',
allowAllUsersHint: 'Permite mensagens de qualquer usuário; desative para usar a lista de permissões',
allowAllUsers: 'Permitir todos os usuários',
},
// Language
language: {
label: 'Idioma',
zh: '中文',
en: 'English',
pt: 'Portugues',
},
// Terminal
terminal: {
sessions: 'Sessoes',
newTab: 'Novo terminal',
closeSession: 'Fechar esta sessao?',
sessionExited: 'Encerrada',
processExited: 'Processo encerrado com codigo {code}',
2026-05-20 17:13:32 +08:00
noSessions: 'Nenhuma sessão de terminal',
connectionFailed: 'Falha ao conectar ao terminal',
connectionError: 'Erro de conexão',
connectionClosed: 'Conexão fechada',
},
// Usage
usage: {
title: 'Estatisticas de uso',
refresh: 'Atualizar',
totalTokens: 'Total de tokens',
inputTokens: 'Entrada',
outputTokens: 'Saida',
totalSessions: 'Total de sessoes',
avgPerDay: '~{n}/dia em media',
estimatedCost: 'Custo est.',
cacheHitRate: 'Taxa de acerto de cache',
modelBreakdown: 'Detalhamento por modelo',
dailyTrend: 'Uso diario',
date: 'Data',
tokens: 'Tokens',
cache: 'Cache',
2026-05-20 17:13:32 +08:00
cacheRead: 'Leitura de cache',
cacheWrite: 'Escrita de cache',
sessions: 'Sessoes',
cost: 'Custo',
noData: 'Sem dados de uso',
},
skillsUsage: {
title: 'Uso de habilidades',
subtitle: 'Acompanhe carregamentos e edições de habilidades nas sessões Hermes',
refresh: 'Atualizar',
periodSelector: 'Período de uso de habilidades',
periodLabel: '{days} d',
summary: 'Resumo',
totalActions: 'Ações',
loads: 'Carga',
edits: 'Ed.',
distinctSkills: 'Habs.',
topSkills: 'Top habs.',
dailyTrend: 'Tendência diária',
periodSummary: 'Últimos {days} dias',
skill: 'Hab.',
share: '%',
lastUsed: 'Últ. uso',
noData: 'Nenhum dado de uso de habilidades',
loadFailed: 'Falha ao carregar o uso de habilidades',
otherSkills: 'Outras habs.',
},
// Registro de alteracoes
changelog: {
new_0_6_4_1: 'CI foi reforçado com comportamento npm install fixo e cobertura Docker smoke para PRs',
new_0_6_4_2: 'O chat agora usa paginação virtualizada para rolar e carregar conversas longas com mais estabilidade',
new_0_6_4_3: 'A publicação de imagens Docker agora roda apenas em releases, não em checks comuns de PR',
new_0_6_4_4: 'Version Preview está disponível para super admins, com seleção main/tag, checkout de preview, instalação de dependências, start/stop e logs',
new_0_6_4_5: 'Instâncias preview isolam portas frontend/backend, Web UI home e agent bridge endpoint, com patches runtime para tags antigos cobrindo portas, WebSocket, base URL e navegação preview aninhada',
new_0_6_4_6: 'Tabelas legacy session_usage sem created_at agora migram com segurança usando um valor padrão',
new_0_6_4_7: 'Endpoints bridge profile worker agora são separados por broker endpoint, evitando que produção e preview com o mesmo Profile disputem worker sockets e causem erros unknown run',
new_0_6_5_1: 'Coding Agents adiciona fluxo completo de inicialização para Claude Code e Codex, com configuração global, workspaces isolados por profile/provider e terminal integrado ou nativo',
new_0_6_5_2: 'Inicialização Codex suporta OpenAI Chat Completions, OpenAI Responses e Anthropic Messages, com proxy local para adaptar diferentes provedores',
new_0_6_5_3: 'Coding Agents fica mais estável no Windows com detecção de shims .cmd/.bat, correções de terminal e Claude Code custom model sem validação local',
new_0_6_5_4: 'Listas de mensagens, paginação History, autenticação TTS, menções de agentes no chat em grupo, supressão de update check e bridge worker transport melhoram a estabilidade',
2026-05-27 12:21:37 +08:00
new_0_6_3_1: 'O status do spinner do Bridge nao e mais salvo como reasoning do modelo, evitando que texto thinking decorativo contamine o contexto futuro',
new_0_6_3_2: 'History agora inclui controles para importar sessoes Hermes CLI para o historico local da Web UI com normalizacao de mensagens mais segura',
new_0_6_3_3: 'A configuracao de Provider suporta base URLs integradas editaveis, LM Studio como provider integrado e descoberta ao vivo via LM Studio /models',
new_0_6_3_4: 'Requests OpenRouter enviados pelo bridge da Web UI agora incluem headers de atribuicao do app Hermes Web UI',
new_0_6_3_5: 'O endpoint publico de auth status nao expoe mais o primeiro nome de usuario para requests nao autenticados',
new_0_6_3_6: 'As configuracoes do DingTalk agora incluem um campo AI Card Template ID persistido como DINGTALK_CARD_TEMPLATE_ID',
new_0_6_3_7: 'A saida JSON do socket Bridge sanitiza caracteres Unicode surrogate isolados para evitar falhas SSE durante o chat',
new_0_6_2_1: 'Web Bridge agora suporta comandos /plan com início correto do run e estado visível do comando',
new_0_6_2_2: 'O menu de comandos no input do chat agora inclui /goal e /subgoal, com ações de status, pausar, retomar, concluir e limpar',
new_0_6_2_3: 'Workflows de Goal e subgoal agora integram sessões de chat, incluindo continuações de objetivo e atualizações de status',
new_0_6_2_4: 'Opções de canal destino para jobs foram restauradas para que jobs agendados escolham o destino correto',
new_0_6_2_5: 'O uso de tokens de contexto agora retoma com precisão após reconexões usando cálculos conscientes de snapshot',
new_0_6_2_6: 'A compressão de checkpoints de contexto está mais confiável quando o resumo do Codex é lento: Web UI espera 5 minutos e o Python bridge broker não corta requests de worker após 2 minutos',
new_0_6_2_7: 'A promoção da fila do chat foi corrigida para que mensagens queued não entrem cedo demais na lista, inclusive em janelas sincronizadas',
new_0_6_2_8: 'Prompts Clarify não enviam mais respostas de texto livre com Enter, e prompts respondidos não reabrem após trocar de sessão',
new_0_6_2_9: 'Refresh do ambiente do terminal Bridge e limpeza de stale pid foram melhor delimitados, reduzindo status runtime obsoleto na UI',
new_0_6_2_10: 'O comprimento de contexto padrão agora segue o padrão Hermes de 256.000 tokens',
2026-05-23 10:41:24 +08:00
new_0_5_35_1: 'Sessões Bridge agora podem executar em paralelo entre sessions diferentes, enquanto runs da mesma session continuam serializados para preservar a ordem',
new_0_5_35_2: 'Adiciona a página Performance Monitor para CPU/memória do sistema, Web UI, Bridge Broker, Workers e status de sessões ativas',
new_0_5_35_3: 'Adiciona métricas por worker com CPU, memória, Profile, número de sessões e estado de execução',
new_0_5_35_4: 'Melhora a limpeza do ciclo de vida dos Bridge workers para recuperar workers no encerramento do Broker ou do processo pai e reduzir processos Python órfãos',
new_0_5_35_5: 'Fortalece a compatibilidade do monitoramento com fallbacks de coleta para macOS, Windows, Linux, Docker e Termux',
new_0_5_35_6: 'Performance Monitor não bloqueia mais em requests a workers durante a inicialização de Agents, reduzindo request timeouts no Windows',
new_0_5_35_7: 'Chat Markdown agora suporta preview inline de conteúdo de texto, e ícones de download baixam arquivos diretamente sem abrir o drawer',
new_0_5_35_8: 'Melhora o drawer de conteúdo com ação de fechar no mobile, largura total no mobile, 800px no desktop e fundos consistentes para texto/Markdown',
new_0_6_0_1: 'A gestão por conta e por Profile agora protege de forma consistente sessões, modelos, uso, Kanban, jobs, uploads, mídia e APIs Hermes relacionadas',
new_0_6_0_2: 'Skills de mídia integrados usam o token de servidor gerado apenas para endpoints de mídia e resolvem credenciais fun-codex/xAI a partir do Profile solicitado',
new_0_6_0_3: 'Chat individual e em grupo injetam o Hermes Profile atual nas instruções do run para que Skills enviem X-Hermes-Profile',
new_0_6_0_4: 'O progresso de subagents de delegate_task aparece na UI do chat com estados de início, ferramenta, progresso e conclusão',
new_0_6_0_5: 'Parar ou abortar um run limpa eventos temporários para que estados abort antigos não passem para o próximo chat',
new_0_6_0_6: 'Atualiza documentação e site para gestão de contas, credenciais padrão, gestão conta/Profile, uploads/downloads e Skills de mídia',
new_0_6_0_7: 'Adiciona comandos CLI de manutenção para limpar bloqueios de IP de login e redefinir o login padrão admin / 123456',
new_0_6_0_8: 'A versão 0.6.0 é o limite entre a Web UI de usuário único e multiusuário. Se o modo multiusuário causar problemas, abra uma issue e volte para a versão 0.5.35 de usuário único se necessário',
2026-05-25 13:06:06 +08:00
new_0_6_1_1: 'As listas de sessões agora mostram por padrão todos os Profiles disponíveis para a conta; só filtram por Profile quando selecionado explicitamente, e CLI start/stop/status não imprimem mais o aviso experimental do node:sqlite',
new_0_6_1_2: 'Respostas Clarify e de confirmação agora passam pelo socket de chat autenticado até a Hermes bridge, com testes da rota de resposta',
new_0_6_1_3: 'Entradas de navegação e linhas de sessões usam links nativos para abrir em nova aba, copiar link e preservar grupos laterais recolhidos',
new_0_6_1_4: 'Links de sessão não vazam mais o Profile da rota para o filtro normal da lista, e os rótulos de abrir em nova aba foram localizados',
new_0_6_1_5: 'Skills agora lê skills.external_dirs da configuração do Profile ativo, marca skills externas, preserva prioridade local e resolve arquivos externos',
new_0_6_1_6: 'O bloqueio de IP no login agora permite 10 falhas e a tela bloqueada mostra comandos para limpar bloqueios e redefinir o login padrão',
new_0_6_1_7: 'Desconexões de chat em mobile ou segundo plano são tratadas como transitórias, e a reconexão retoma o estado do run pelo servidor',
new_0_6_1_8: 'O flush de marcadores de ferramentas da Bridge agora persiste prefixos parciais nos limites de ferramenta e de run',
new_0_6_1_9: 'Ações de History sensíveis a Profile excluem sessões com alvos qualificados por Profile e atualizam History quando o Profile global muda',
new_0_6_1_10: 'O bypass legado AUTH_DISABLED foi removido para o modelo multiusuário, enquanto AUTH_TOKEN continua suportado',
},
// Arquivos
files: {
title: 'Arquivos',
tree: 'Arvore de diretorios',
list: 'Lista de arquivos',
breadcrumbRoot: 'Inicio',
newFile: 'Novo arquivo',
newFolder: 'Nova pasta',
upload: 'Enviar',
refresh: 'Atualizar',
open: 'Abrir',
edit: 'Editar',
preview: 'Visualizar',
download: 'Baixar',
copyPath: 'Copiar caminho',
rename: 'Renomear',
delete: 'Excluir',
name: 'Nome',
size: 'Tamanho',
modified: 'Modificado',
actions: 'Acoes',
emptyDir: 'Diretorio vazio',
loading: 'Carregando...',
confirmDelete: 'Tem certeza de que deseja excluir "{name}"?',
confirmDeleteDir: 'Tem certeza de que deseja excluir o diretorio "{name}" e todo o seu conteudo?',
deleteFailed: 'Falha ao excluir',
deleted: 'Excluido',
renameTo: 'Renomear para',
newFileName: 'Nome do arquivo',
newFolderName: 'Nome da pasta',
created: 'Criado',
createFailed: 'Falha ao criar',
renamed: 'Renomeado',
renameFailed: 'Falha ao renomear',
uploadSuccess: '{count} arquivo(s) enviado(s)',
uploadFailed: 'Falha ao enviar',
saveFailed: 'Falha ao salvar',
saved: 'Salvo',
unsavedChanges: 'Voce tem alteracoes nao salvas. Descartar?',
pathCopied: 'Caminho copiado',
fileTooLarge: 'Arquivo muito grande (max 10MB)',
permissionDenied: 'Nao e possivel modificar arquivo protegido',
notFound: 'Arquivo ou diretorio nao encontrado',
backendError: 'Falha na operacao de arquivo',
dragDropHint: 'Arraste arquivos aqui para enviar',
closeEditor: 'Fechar editor',
closePreview: 'Fechar',
saveFile: 'Salvar',
2026-05-20 17:13:32 +08:00
fileTree: 'Árvore de arquivos',
},
// Chat em grupo
groupChat: {
title: 'Chat em grupo',
createRoom: 'Criar sala',
joinByCode: 'Entrar com codigo',
roomName: 'Nome da sala',
roomNamePlaceholder: 'Digite o nome da sala',
inviteCode: 'Codigo de convite',
autoGenerate: 'Gerar automaticamente',
noRooms: 'Nenhuma sala ainda',
selectOrCreate: 'Selecione ou crie uma sala para comecar a conversar',
agents: 'Agentes',
addAgent: 'Adicionar agente',
selectProfile: 'Selecione um perfil',
agentAdded: 'Agente adicionado',
agentAlreadyInRoom: 'O agente ja esta nesta sala',
agentAddFailedCount: '{count} agente(s) nao foram adicionados: {details}',
noAgents: 'Nenhum agente nesta sala',
members: 'Membros',
roomCreated: 'Sala criada',
roomDeleted: 'Sala excluída',
roomCloned: 'Sala clonada',
cloneRoom: 'Clonar sala',
copyRoomLink: 'Copiar link da sala',
deleteRoomConfirm: 'Excluir esta sala?',
clearContext: 'Limpar contexto',
clearContextConfirm: 'Limpar o contexto desta sala? Mensagens e snapshots de compactação serão removidos, mas agentes e membros ficam.',
contextCleared: 'Contexto limpo',
you: 'Você',
joined: 'Entrou na sala',
joinFailed: 'Falha ao entrar na sala',
inputPlaceholder: 'Digite uma mensagem... (Enter para enviar)',
enterCode: 'Digite o codigo de convite',
yourName: 'Seu nome',
yourNamePlaceholder: 'Digite seu nome de exibicao',
yourDescription: 'Descricao (opcional)',
yourDescriptionPlaceholder: 'Conte aos outros quem voce e...',
agentName: 'Nome do agente',
agentNamePlaceholder: 'Nome personalizado (vazio = nome do perfil)',
agentDesc: 'Descrição do agente',
agentDescPlaceholder: 'Descreva o que este agente faz...',
agentReplying: 'está respondendo...',
agentCompressing: 'está compactando contexto...',
compressionSettings: 'Configuração de compactação',
triggerTokens: 'Tokens de acionamento',
triggerTokensDesc: 'Limite de tokens para acionar a compactação',
maxHistoryTokens: 'Máx. tokens de histórico',
maxHistoryTokensDesc: 'Máximo de tokens para o contexto compactado',
tailMessageCount: 'Mensagens recentes',
tailMessageCountDesc: 'Número de mensagens recentes a manter',
compressionConfig: 'Config. de compactação',
compressNow: 'Compactar agora',
compressingInProgress: 'Compactação em andamento',
compressionSaved: 'Configuração salva',
},
// Download
download: {
downloading: 'Baixando...',
downloadFailed: 'Falha no download',
fileNotFound: 'Arquivo nao encontrado ou excluido',
fileTooLarge: 'Arquivo muito grande (limite excedido)',
backendError: 'Falha ao ler o arquivo, o ambiente remoto pode estar indisponivel',
backendTimeout: 'Tempo esgotado para ler o arquivo',
unsupportedBackend: 'O backend de terminal atual nao suporta download de arquivos',
invalidPath: 'Caminho de arquivo invalido',
2026-05-22 19:04:15 +08:00
contentDisplay: 'Exibicao de conteudo',
download: 'Baixar',
downloadFile: 'Baixar arquivo',
},
2026-05-20 17:13:32 +08:00
gateways: {
title: 'Gateways',
running: 'Em execução',
stopped: 'Parado',
started: 'Iniciado',
startFailed: 'Falha ao iniciar gateway',
stopFailed: 'Falha ao parar gateway',
},
kanban: {
title: 'Quadro Kanban',
createTask: 'Nova tarefa',
noTasks: 'Nenhuma tarefa',
allStatuses: 'Todos os status',
allAssignees: 'Todos os responsáveis',
columns: {
triage: 'Triagem',
todo: 'A fazer',
ready: 'Pronto',
running: 'Em andamento',
blocked: 'Bloqueado',
done: 'Concluído',
archived: 'Arquivado',
},
card: {
assigneeTooltip: 'Responsável',
priority: {
low: 'Baixa',
medium: 'Média',
high: 'Alta',
},
timeAgo: {
justNow: 'agora mesmo',
minutes: 'há {count} min',
hours: 'há {count} h',
days: 'há {count} d',
},
},
board: {
create: 'Novo quadro',
archive: 'Arquivar quadro',
archiveConfirm: 'Arquivar o quadro atual?',
archived: 'Quadro arquivado',
created: 'Quadro criado',
slugPlaceholder: 'Identificador do quadro, ex. project-a',
namePlaceholder: 'Nome exibido (opcional)',
slugRequired: 'O identificador do quadro é obrigatório',
},
form: {
title: 'Título',
titlePlaceholder: 'Título da tarefa',
titleRequired: 'Título é obrigatório',
body: 'Descrição',
bodyPlaceholder: 'Descrição da tarefa (opcional)',
assignee: 'Responsável',
selectAssignee: 'Selecionar responsável...',
priority: 'Prioridade',
selectPriority: 'Selecionar prioridade...',
},
detail: {
status: 'Status',
priority: 'Prioridade',
assignee: 'Responsável',
tenant: 'Locatário',
createdAt: 'Criado',
startedAt: 'Iniciado',
completedAt: 'Concluído',
comments: 'Comentários',
events: 'Eventos',
runs: 'Execuções',
artifacts: 'Arquivos gerados',
result: 'Resultado',
highlights: 'Informações principais',
sources: 'Fontes de dados',
sessions: 'Sessões relacionadas',
sessionMessages: 'Mensagens da sessão',
noSessions: 'Nenhuma sessão relacionada encontrada.',
},
action: {
title: 'Ações',
assign: 'Atribuir',
assignTo: 'Atribuir a...',
block: 'Bloquear',
blockReason: 'Motivo do bloqueio',
unblock: 'Desbloquear',
complete: 'Concluir',
completeSummary: 'Resumo de conclusão (opcional)',
},
message: {
loadFailed: 'Falha ao carregar tarefa',
taskCreated: 'Tarefa criada',
taskAssigned: 'Tarefa atribuída',
taskBlocked: 'Tarefa bloqueada',
taskUnblocked: 'Tarefa desbloqueada',
taskCompleted: 'Tarefa concluída',
},
stats: {
total: 'Total',
tasks: 'Tarefas',
},
},
}