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', passwordLogin: 'Senha', tokenLogin: 'Token', usernamePlaceholder: 'Nome de usuario', passwordPlaceholder: 'Senha', credentialsRequired: 'Por favor, insira nome de usuario e senha', invalidCredentials: 'Nome de usuario ou senha incorretos', 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', setupDescription: 'Configure um nome de usuario e senha para login conveniente. O token de acesso continuara funcionando como backup.', removeConfirm: 'Tem certeza de que deseja remover o login por senha? Voce precisara usar o token de acesso.', passwordLoginNotConfigured: 'Login por senha nao configurado', passwordLoginConfigured: 'Login por senha habilitado ({username})', }, // 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', }, // Sidebar sidebar: { chat: 'Chat', search: 'Pesquisar', history: 'Historico', jobs: 'Tarefas agendadas', models: 'Modelos', profiles: 'Perfis', skills: 'Habilidades', memory: 'Memoria', logs: 'Logs', usage: 'Uso', channels: 'Canais', terminal: 'Terminal', files: 'Arquivos', groupChat: 'Chat em grupo', groupConversation: 'Conversa', 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', logout: 'Sair', nodeVersionWarning: 'Node.js v{version} detectado. Atualize para a versao 23 ou posterior.', changelog: 'Registro de alteracoes', noChangelog: 'Nenhum registro disponivel', }, // 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: 200k (Claude), 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', inputPlaceholder: 'Digite uma mensagem... (Enter para enviar, Shift+Enter para nova linha)', attachFiles: 'Anexar arquivos', stop: 'Parar', send: 'Enviar', contextUsed: 'Contexto utilizado:', sessions: 'Sessoes', webUiSessions: 'Sessões', 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 somente leitura, agrupadas por origem.', noSessions: 'Sem sessoes', newChat: 'Novo chat', 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', sessionDeleted: 'Sessao excluida', rename: 'Renomear', pin: 'Fixar', unpin: 'Desafixar', pinned: 'Fixadas', chatMode: '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', copySessionId: 'Copiar ID da sessão', renamed: 'Renomeado', renameFailed: 'Falha ao renomear', renameSession: 'Renomear sessao', 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)', executionDuration: 'Execution time', 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', }, // 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', }, }, // 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', 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: 'Nome do modelo personalizado', customModelHint: 'Enter para carregar', noProviders: 'Nenhum provedor encontrado. Adicione um provedor personalizado para comecar.', builtIn: 'Integrado', customType: 'Personalizado', provider: 'Provedor', contextLength: 'Tamanho do contexto', contextLengthPlaceholder: 'ex: 200000 (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', }, // 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', 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.', }, // 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', account: 'Conta', 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', 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', }, }, // 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', 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', cacheRead: 'Cache Read', cacheWrite: 'Cache Write', sessions: 'Sessoes', cost: 'Custo', noData: 'Sem dados de uso', }, // Registro de alteracoes changelog: { new_0_5_6_1: 'Reprodução de voz: Web Speech API, botão manual, interruptor auto-play, animação de borda arco-íris e otimização móvel', new_0_5_6_2: 'Parser JSON LLM robusto com tolerância ao formato Python e extração de texto de eventos streaming', new_0_5_6_3: 'Melhorias de Skills: estatísticas de uso, filtragem de fonte, skills arquivados, procedência e toggle de fixação', new_0_5_6_4: 'Estatísticas diárias de uso expandidas com breakdown detalhado de tokens incluindo separação de leitura/escrita de cache', new_0_5_6_5: 'Escopo do histórico de sessões clarificado com descrições melhoradas nas visualizações de chat e histórico', new_0_5_6_6: 'Processamento de anexos reprojetado usando formato de matriz ContentBlock estilo Anthropic (texto, imagem, arquivo)', new_0_5_6_7: 'Adicionada funcionalidade de download de arquivos frontend suportando formatos ContentBlock e Markdown com autenticação', new_0_5_6_8: 'Corrigido conflito de múltiplos processos que causava redefinições do banco de dados SQLite eliminando instâncias nodemon redundantes', new_0_5_9_1: 'Unificar gerenciamento de perfis em todo o aplicativo com API e gerenciamento de estado consistentes', new_0_5_12_1: 'Exclusão em lote de sessões: seleção múltipla com checkbox, selecionar todos e excluir em lote', new_0_5_12_2: 'Editor visual de tamanho de contexto: clique na contagem de tokens para abrir o modal de edição', new_0_5_12_3: 'Corrigir seleção de teclado @mention: substituir NDropdown por dropdown personalizado', new_0_5_12_4: 'Som de conclusão do chat: alternar reprodução automática', new_0_5_12_5: 'Melhorar exibição de mensagens do chat: filtrar mensagens vazias do assistente', new_0_5_12_6: 'Mecanismo de atualização aprimorado: usar npm prefix -g para resolução dinâmica de caminho', new_0_5_10_1: 'Automatizar builds de imagens Docker no GitHub release com tags versionados (ex. :v0.5.10)', new_0_5_10_2: 'Adicionar configuração do modo de autorização de sessão: approvals.mode (desligado/manual)', new_0_5_10_3: 'Adicionar geração automática de documentação OpenAPI (94 endpoints, 24 tags)', new_0_5_10_4: 'Melhorar renderização de mídia: suporte para imagens, vídeos e arquivos em Markdown', new_0_5_10_5: 'Otimizar prompts de chat em grupo e corrigir manuseio de mídia', new_0_5_9_2: 'Adicionar modelos de issues e pull requests do GitHub para melhor fluxo de contribuição', new_0_5_8_1: 'Adicionar painel de gaveta com suporte de barra lateral móvel e botão arco-íris personalizável', new_0_5_8_2: 'Corrigir problema de sincronização de estado de troca de perfil com atualização imediata de IU e verificação de backend', new_0_5_8_3: 'Filtrar caracteres especiais e emoji na reprodução de voz para melhor síntese de voz', new_0_5_8_4: 'Adicionar chave i18n ausente e unificar fonte de dados de sessão para priorizar banco de dados', new_0_5_8_5: 'Otimizar configuração de build Vite para builds Docker mais rápidos com esbuild e divisão de chunks', new_0_5_7_1: 'Otimizar compressão de contexto para suportar conteúdo rico (imagens, arquivos) com melhoria no manuseio de mensagens de ferramentas', new_0_5_7_2: 'Melhorar sincronização de sessões com inserções em lote e proteção de transações para consistência de dados', new_0_5_7_3: 'Corrigir recepção de eventos usage.updated para garantir rastreamento preciso de tokens entre execuções', new_0_5_5_1: '🎉 Feliz Dia do Trabalhador! Hoje não se trabalha, obrigado pela compreensão', new_0_5_5_2: 'Adicionada página de histórico para sessões Hermes', new_0_5_5_3: 'Página de histórico gerencia sessões de forma independente', new_0_5_5_4: 'Carregamento automático da primeira sessão CLI', new_0_5_5_5: 'Componente HistoryMessageList com injeção de props', new_0_5_5_6: 'Filtragem de mensagens vazias e tools sem toolName', new_0_5_5_7: 'Removido cache de sessões localStorage, dados do backend', new_0_5_5_8: 'Otimizada troca de perfil', new_0_5_4_2: 'Fix concurrent chat sessions event cross-talk with WebSocket event routing refactoring', new_0_5_4_3: 'Fix cron job edit payloads with partial PATCH to support long prompt name-only edits', new_0_5_4_4: 'Fix web terminal Hermes CLI availability after Docker deployment', new_0_5_4_5: 'Add workspace dialog i18n translations for title and improve session persistence', new_0_5_4_6: 'Support code block copy feedback with user notifications', new_0_5_4_7: 'Align usage analytics with Hermes state DB schema', 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', 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', 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', new_0_4_7_1: 'Exibicao em streaming em tempo real de blocos de pensamento/razoamento', new_0_4_7_2: 'Ignorar script de preparacao durante o build Docker', new_0_4_7_3: 'Melhorias na UX mobile do chat em grupo e polimento da UI', new_0_4_7_4: 'Limitar os tokens restantes do contexto a 0 em vez de negativo', new_0_4_7_5: 'Adicionar provedor integrado Alibaba Coding Plan com substituicao de base_url no .env', new_0_4_7_6: 'Ignorar perfis remotos na inicializacao para evitar travamento', new_0_4_7_7: 'Detectar e exibir erros de execucao silenciosamente engolidos', new_0_4_7_8: 'Consulta de comprimento de contexto consciente do provedor', new_0_4_7_9: 'Redefinir config.model ao trocar e resolver provedor personalizado CLI', new_0_4_7_10: 'Limpar base_url_env do .env ao excluir provedor integrado', new_0_4_7_11: 'Alinhar o fundo da barra lateral da sala de chat em grupo com a lista de sessoes', 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', new_0_4_2_1: 'Adicionar rastreamento de uso de tokens e comprimento de contexto dinamico', new_0_4_2_2: 'Adicionar modal de busca de sessoes', new_0_4_2_3: 'Restaurar sistema de chat em grupo com Socket.IO e SQLite', new_0_4_2_4: 'Adicionar sessoes fixas e monitor ao vivo na pagina de chat', new_0_4_2_5: 'Corrigir deteccao de provedores integrados e combinacao de modelos', }, // 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', }, // 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', noAgents: 'Nenhum agente nesta sala', members: 'Membros', roomCreated: 'Sala criada', roomDeleted: 'Sala excluída', deleteRoomConfirm: 'Excluir esta sala?', 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', download: 'Baixar', downloadFile: 'Baixar arquivo', }, }