export default { // Login login: { title: 'Hermes Web UI', 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', 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:', 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', 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', passwordLoginConfigured: 'Conta atual: {username}', 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', }, users: { title: 'Gerenciamento de contas', description: 'Crie usuarios, atribua funcoes e controle quais perfis administradores comuns podem acessar.', create: 'Criar usuario', edit: 'Editar usuario', username: 'Nome de usuario', role: 'Funcao', statusLabel: 'Status', profiles: 'Perfis acessiveis', profilesPlaceholder: 'Selecione perfis acessiveis', allProfiles: 'Todos os perfis', noProfiles: 'Nenhum perfil atribuido', 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', 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', plugins: 'Plugins', mcp: 'MCP', skills: 'Habilidades', memory: 'Memoria', logs: 'Logs', usage: 'Uso', performance: 'Desempenho', skillsUsage: 'Uso de habilidades', channels: 'Canais', terminal: 'Terminal', files: 'Arquivos', groupChat: 'Chat em grupo', groupConversation: 'Conversa', groupConversationShort: 'Conv.', groupAgent: 'Agente', groupAgentShort: 'Ag.', groupSystem: 'Sistema', groupSystemShort: 'Sist', groupMonitoring: 'Monitoramento', 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...', 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', kanban: 'Kanban', groupTools: 'Ferramentas', groupToolsShort: "Ferr.", codingAgents: "Agentes de código", versionPreview: "Prévia de versão", groupPlatform: 'Plataforma', gateways: 'Gateways', expand: 'Expandir menu', collapse: 'Recolher menu', }, 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', }, // 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', 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)', slashCommandArgs: { message: '', title: '', text: '', }, 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', 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', }, attachFiles: 'Anexar arquivos', 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', 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', 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', 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', 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', 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: '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', 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', external: 'Externo', }, }, // 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: { agentRoot: 'Raiz do agente', python: 'Python', scanCwd: 'Verificar cwd', 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', 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', 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', 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', 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: { 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', checking: 'Verificando', running: 'Em execução', stopped: 'Parado', restartGateway: 'Reiniciar gateway', restartProfile: 'Reiniciar perfil', switchProfile: 'Trocar perfil frontend', 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', 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', }, 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", 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", 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...', 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}', 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', 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', 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', 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', 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', 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', contentDisplay: 'Exibicao de conteudo', download: 'Baixar', downloadFile: 'Baixar arquivo', }, 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', }, }, }