feat: add 6 new locales (ja, ko, fr, es, de, pt) and UI polish
- Add Japanese, Korean, French, Spanish, German, Portuguese translations - Improve session active state visibility in both themes - Static language labels in LanguageSwitch component - Dark theme: lighten chat input background for better contrast - Fix system theme listener not toggling back to light Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,449 @@
|
||||
export default {
|
||||
// Login
|
||||
login: {
|
||||
title: 'Hermes Web UI',
|
||||
description: 'Insira seu token de acesso para continuar. Encontre-o nos logs de inicializacao do servidor.',
|
||||
placeholder: 'Token de acesso',
|
||||
submit: 'Entrar',
|
||||
tokenRequired: 'Por favor, insira seu token de acesso',
|
||||
invalidToken: 'Token invalido',
|
||||
connectionFailed: 'Nao foi possivel conectar ao servidor',
|
||||
},
|
||||
|
||||
// Common
|
||||
common: {
|
||||
loading: 'Carregando...',
|
||||
cancel: 'Cancelar',
|
||||
delete: 'Excluir',
|
||||
edit: 'Editar',
|
||||
save: 'Salvar',
|
||||
saved: 'Salvo',
|
||||
update: 'Atualizar',
|
||||
create: 'Criar',
|
||||
saveFailed: 'Falha ao salvar',
|
||||
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',
|
||||
},
|
||||
|
||||
// Sidebar
|
||||
sidebar: {
|
||||
chat: 'Chat',
|
||||
jobs: 'Tarefas agendadas',
|
||||
models: 'Modelos',
|
||||
profiles: 'Perfis',
|
||||
skills: 'Habilidades',
|
||||
memory: 'Memoria',
|
||||
logs: 'Logs',
|
||||
usage: 'Uso',
|
||||
channels: 'Canais',
|
||||
terminal: 'Terminal',
|
||||
settings: 'Configuracoes',
|
||||
connected: 'Conectado',
|
||||
disconnected: 'Desconectado',
|
||||
updateTip: 'Execute "hermes-web-ui update" no terminal para atualizar',
|
||||
updateVersion: 'Atualizar para v{version}',
|
||||
updating: 'Atualizando...',
|
||||
updateSuccess: 'Atualizacao concluida, por favor reinicie o servidor',
|
||||
updateFailed: 'Falha na atualizacao',
|
||||
},
|
||||
|
||||
// Chat
|
||||
chat: {
|
||||
emptyState: 'Inicie uma conversa com o Hermes Agent',
|
||||
inputPlaceholder: 'Digite uma mensagem... (Enter para enviar, Shift+Enter para nova linha)',
|
||||
attachFiles: 'Anexar arquivos',
|
||||
stop: 'Parar',
|
||||
send: 'Enviar',
|
||||
contextUsed: 'Contexto utilizado:',
|
||||
sessions: 'Sessoes',
|
||||
noSessions: 'Sem sessoes',
|
||||
newChat: 'Novo chat',
|
||||
deleteSession: 'Excluir esta sessao?',
|
||||
sessionDeleted: 'Sessao excluida',
|
||||
rename: 'Renomear',
|
||||
copySessionId: 'Copiar ID da sessao',
|
||||
renamed: 'Renomeado',
|
||||
renameFailed: 'Falha ao renomear',
|
||||
renameSession: 'Renomear sessao',
|
||||
enterNewTitle: 'Digite um novo titulo',
|
||||
other: 'Outro',
|
||||
runFailed: 'Falha na execucao',
|
||||
error: 'Erro',
|
||||
tool: 'Ferramenta',
|
||||
arguments: 'Argumentos',
|
||||
result: 'Resultado',
|
||||
truncated: '... (truncado)',
|
||||
},
|
||||
|
||||
// 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)',
|
||||
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: 'Tarefa acionada',
|
||||
jobDeleted: 'Tarefa excluida',
|
||||
status: {
|
||||
running: 'Em execucao',
|
||||
paused: 'Pausada',
|
||||
disabled: 'Desativada',
|
||||
scheduled: 'Agendada',
|
||||
},
|
||||
info: {
|
||||
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',
|
||||
},
|
||||
},
|
||||
|
||||
// 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',
|
||||
toggleFailed: 'Falha ao ativar/desativar a habilidade',
|
||||
},
|
||||
|
||||
// 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',
|
||||
preset: 'Preset',
|
||||
custom: 'Personalizado',
|
||||
selectProvider: 'Selecionar provedor',
|
||||
chooseProvider: 'Escolha um provedor...',
|
||||
name: 'Nome',
|
||||
autoGeneratedName: 'Gerado automaticamente pela URL base',
|
||||
baseUrl: 'URL base',
|
||||
baseUrlPlaceholder: 'ex. https://api.example.com/v1',
|
||||
apiKey: 'Chave API',
|
||||
apiKeyPlaceholder: 'sk-...',
|
||||
defaultModel: 'Modelo padrao',
|
||||
selectModel: 'Selecionar um modelo...',
|
||||
providerAdded: 'Provedor adicionado',
|
||||
providerDeleted: 'Provedor excluido',
|
||||
deleteProvider: 'Excluir provedor',
|
||||
deleteConfirm: 'Tem certeza de que deseja excluir "{name}"?',
|
||||
noProviders: 'Nenhum provedor encontrado. Adicione um provedor personalizado para comecar.',
|
||||
builtIn: 'Integrado',
|
||||
customType: 'Personalizado',
|
||||
provider: 'Provedor',
|
||||
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',
|
||||
},
|
||||
|
||||
// Profiles
|
||||
profiles: {
|
||||
title: 'Perfis',
|
||||
create: 'Criar perfil',
|
||||
import: 'Importar',
|
||||
export: 'Exportar',
|
||||
rename: 'Renomear',
|
||||
delete: 'Excluir',
|
||||
switchTo: 'Mudar para',
|
||||
switchConfirm: 'Mudar para o perfil "{name}" reiniciara o gateway. Continuar?',
|
||||
switchSuccess: 'Mudou para o perfil "{name}"',
|
||||
switchFailed: 'Falha ao mudar de perfil. 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',
|
||||
newName: 'Novo nome',
|
||||
newNamePlaceholder: 'Digite um novo nome',
|
||||
cloneFromCurrent: 'Clonar do perfil atual',
|
||||
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.',
|
||||
},
|
||||
|
||||
// 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',
|
||||
agent: 'Agente',
|
||||
memory: 'Memoria',
|
||||
session: 'Sessao',
|
||||
privacy: 'Privacidade',
|
||||
apiServer: 'Servidor API',
|
||||
},
|
||||
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',
|
||||
},
|
||||
session: {
|
||||
mode: 'Modo de reinicializacao',
|
||||
modeHint: 'Condicao de acionamento para reinicializacao de sessao',
|
||||
modeBoth: 'Inatividade + Agendado',
|
||||
modeIdle: 'Somente inatividade',
|
||||
modeHourly: 'Somente agendado',
|
||||
idleMinutes: 'Timeout de inatividade',
|
||||
idleMinutesHint: 'Tempo de espera antes da reinicializacao automatica (minutos)',
|
||||
atHour: 'Horario de reinicializacao agendada',
|
||||
atHourHint: 'Reiniciar sessao neste horario diariamente',
|
||||
},
|
||||
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',
|
||||
},
|
||||
},
|
||||
|
||||
// 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)',
|
||||
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',
|
||||
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...',
|
||||
},
|
||||
|
||||
// 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}',
|
||||
},
|
||||
|
||||
// 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 (ultimos 30 dias)',
|
||||
date: 'Data',
|
||||
tokens: 'Tokens',
|
||||
cache: 'Cache',
|
||||
sessions: 'Sessoes',
|
||||
cost: 'Custo',
|
||||
noData: 'Sem dados de uso',
|
||||
},
|
||||
}
|
||||
Reference in New Issue
Block a user