From f86a0f07c9129248dd687606ed339c9838c21015 Mon Sep 17 00:00:00 2001 From: Wha1eChai Date: Fri, 16 Jan 2026 00:18:37 +0800 Subject: [PATCH] feat: add Portuguese (PT-BR) translation (#132) - Add pt.js translation file with complete PT-BR translations - Add Portuguese option to language selector in settings - Load pt.js translation file in index.html Based on PR #108 Co-authored-by: Pedro Farias Co-authored-by: Wha1eChai --- public/index.html | 1 + public/js/translations/pt.js | 261 +++++++++++++++++++++++++++++++++++ public/views/settings.html | 1 + 3 files changed, 263 insertions(+) create mode 100644 public/js/translations/pt.js diff --git a/public/index.html b/public/index.html index cd1b021..3dd47ba 100644 --- a/public/index.html +++ b/public/index.html @@ -358,6 +358,7 @@ + diff --git a/public/js/translations/pt.js b/public/js/translations/pt.js new file mode 100644 index 0000000..7c6fb87 --- /dev/null +++ b/public/js/translations/pt.js @@ -0,0 +1,261 @@ +/** + * Portuguese (PT-BR) Translations + * Based on contribution by Pedro Farias in PR #108 + */ +window.translations = window.translations || {}; +window.translations.pt = { + dashboard: "Painel", + models: "Modelos", + accounts: "Contas", + logs: "Logs", + settings: "Configurações", + online: "ONLINE", + offline: "OFFLINE", + totalAccounts: "TOTAL DE CONTAS", + active: "ATIVO", + operational: "Operacional", + rateLimited: "TAXA LIMITADA", + quotasDepleted: "{count}/{total} Cotas Esgotadas", + quotasDepletedTitle: "COTAS ESGOTADAS", + outOfTracked: "De {total} Rastreados", + cooldown: "Resfriamento", + searchPlaceholder: "Buscar modelos...", + allAccounts: "Todas as Contas", + stat: "ESTATÍSTICA", + modelIdentity: "IDENTIDADE DO MODELO", + globalQuota: "COTA GLOBAL", + nextReset: "PRÓXIMO RESET", + distribution: "DISTRIBUIÇÃO DE CONTAS", + systemConfig: "Configuração do Sistema", + language: "Idioma", + pollingInterval: "Intervalo de Atualização", + maxDisplayLogs: "Máximo de Logs Exibidos", + showExhausted: "Mostrar Modelos Esgotados", + showExhaustedDesc: "Exibir modelos mesmo se tiverem 0% de cota restante.", + compactMode: "Modo Compacto", + compactModeDesc: "Reduzir espaçamento nas tabelas para maior densidade de informação.", + saveChanges: "Salvar Alterações", + autoScroll: "Rolagem Automática", + clearLogs: "Limpar Logs", + accountManagement: "Gerenciamento de Contas", + manageTokens: "Gerenciar tokens e estados de autorização de Contas Google", + addAccount: "Adicionar Conta", + status: "STATUS", + enabled: "HABILITADO", + health: "SAÚDE", + accountEmail: "CONTA (EMAIL)", + source: "FONTE", + projectId: "ID DO PROJETO", + sessionState: "ESTADO DA SESSÃO", + operations: "OPERAÇÕES", + delete: "Excluir", + confirmDelete: "Tem certeza de que deseja remover esta conta?", + cannotDeleteDatabase: "Não é possível excluir: Esta conta é do banco de dados Antigravity (somente leitura)", + connectGoogle: "Conectar Conta Google", + reauthenticated: "reautenticado", + added: "adicionado", + successfully: "com sucesso", + accountAddedSuccess: "Conta adicionada com sucesso", + accountReauthSuccess: "Conta reautenticada com sucesso", + failedToGetAuthUrl: "Falha ao obter URL de autenticação", + failedToStartOAuth: "Falha ao iniciar fluxo OAuth", + oauthInProgress: "OAuth em andamento. Por favor, conclua a autenticação na janela popup...", + family: "Família", + model: "Modelo", + activeSuffix: "Ativo", + // Tabs + tabInterface: "Interface", + tabClaude: "Claude CLI", + tabModels: "Modelos", + tabServer: "Configurações do Servidor", + // Dashboard + linkedAccounts: "Contas Vinculadas", + noSignal: "SEM SINAL DETECTADO", + establishingUplink: "ESTABELECENDO LINK...", + goToAccounts: "Ir para Contas", + // Settings - Models + modelsDesc: "Configurar visibilidade, fixação e roteamento de requisições de modelos.", + modelsPageDesc: "Cota e status em tempo real para todos os modelos disponíveis.", + showHidden: "Mostrar Modelos Ocultos", + modelId: "ID do Modelo", + actions: "Ações", + pinToTop: "Fixar no topo", + toggleVisibility: "Alternar Visibilidade", + noModels: "NENHUM MODELO DETECTADO", + modelMappingHint: "Roteamento de modelo no servidor. Usuários do Claude Code: veja a aba 'Claude CLI' para configuração no cliente.", + modelMapping: "Mapeamento (ID do Modelo Alvo)", + // Settings - Claude + proxyConnection: "Conexão Proxy", + modelSelection: "Seleção de Modelo", + defaultModelAliases: "ALIASES DE MODELO PADRÃO", + opusAlias: "Alias Opus", + sonnetAlias: "Alias Sonnet", + haikuAlias: "Alias Haiku", + claudeSettingsAlertPrefix: "As configurações abaixo modificam diretamente", + claudeSettingsAlertSuffix: "Reinicie o Claude CLI para aplicar.", + applyToClaude: "Aplicar ao Claude CLI", + // Settings - Server + port: "Porta", + uiVersion: "Versão da UI", + debugMode: "Modo de Depuração", + environment: "Ambiente", + serverReadOnly: "Configurações gerenciadas via config.json. Reinicie o servidor para aplicar alterações.", + advancedSettings: "Configurações Avançadas", + reloadConfigTitle: "Recarregar Config de Contas", + reloadConfigDesc: "Forçar recarregamento de accounts.json do disco", + reload: "Recarregar", + // Config Specific + primaryModel: "Modelo Primário", + subAgentModel: "Modelo Sub-agente", + advancedOverrides: "Substituições de Modelo Padrão", + opusModel: "Modelo Opus", + sonnetModel: "Modelo Sonnet", + haikuModel: "Modelo Haiku", + authToken: "Token de Autenticação", + saveConfig: "Salvar nas configurações do Claude CLI", + envVar: "Env", + // New Keys + systemName: "ANTIGRAVITY", + systemDesc: "SISTEMA DE PROXY CLAUDE", + connectGoogleDesc: "Conecte uma conta Google Workspace para aumentar seu limite de cota da API. A conta será usada para fazer proxy das requisições Claude via Antigravity.", + useCliCommand: "Usar Comando CLI", + close: "Fechar", + requestVolume: "Volume de Requisições", + filter: "Filtrar", + all: "Todos", + none: "Nenhum", + noDataTracked: "Nenhum dado rastreado ainda", + selectFamilies: "Selecione famílias para exibir", + selectModels: "Selecione modelos para exibir", + noLogsMatch: "Nenhum log corresponde ao filtro", + connecting: "CONECTANDO", + main: "Principal", + system: "Sistema", + refreshData: "Atualizar Dados", + connectionLost: "Conexão Perdida", + lastUpdated: "Última Atualização", + grepLogs: "grep logs...", + noMatchingModels: "Nenhum modelo correspondente", + typeToSearch: "Digite para buscar ou selecione...", + or: "OU", + refreshingAccount: "Atualizando {email}...", + refreshedAccount: "Atualizado {email}", + refreshFailed: "Falha na atualização", + accountToggled: "Conta {email} {status}", + toggleFailed: "Falha ao alternar", + reauthenticating: "Reautenticando {email}...", + authUrlFailed: "Falha ao obter URL de autenticação", + deletedAccount: "Excluído {email}", + deleteFailed: "Falha ao excluir", + accountsReloaded: "Contas recarregadas", + reloadFailed: "Falha ao recarregar", + claudeConfigSaved: "Configuração do Claude salva", + claudeConfigRestored: "Claude CLI restaurado para o padrão", + saveConfigFailed: "Falha ao salvar configuração", + restoreConfigFailed: "Falha ao restaurar configuração", + restoreDefault: "Restaurar Padrão", + confirmRestoreTitle: "Confirmar Restauração", + confirmRestoreMessage: "Tem certeza de que deseja restaurar o Claude CLI para as configurações padrão? Isso removerá a configuração de proxy.", + confirmRestore: "Confirmar Restauração", + claudeActive: "Claude Ativo", + claudeEmpty: "Claude Vazio", + geminiActive: "Gemini Ativo", + geminiEmpty: "Gemini Vazio", + synced: "SINCRONIZADO", + syncing: "SINCRONIZANDO...", + // Time range labels + last1Hour: "Última 1H", + last6Hours: "Últimas 6H", + last24Hours: "Últimas 24H", + last7Days: "Últimos 7D", + allTime: "Todo o Período", + groupBy: "Agrupar Por", + // Additional + reloading: "Recarregando...", + reloaded: "Recarregado", + lines: "linhas", + enabledSeeLogs: "Habilitado (Ver Logs)", + production: "Produção", + configSaved: "Configuração Salva", + enterPassword: "Digite a Senha da Web UI:", + ready: "PRONTO", + depleted: "Esgotado", + timeH: "H", + timeM: "M", + familyClaude: "Claude", + familyGemini: "Gemini", + familyOther: "Outro", + enabledStatus: "habilitado", + disabledStatus: "desabilitado", + logLevelInfo: "INFO", + logLevelSuccess: "SUCESSO", + logLevelWarn: "AVISO", + logLevelError: "ERRO", + totalColon: "Total:", + todayColon: "Hoje:", + hour1Colon: "1H:", + frequentModels: "Frequentes", + smartTitle: "Auto-selecionar os 5 modelos mais usados (24h)", + activeCount: "{count} Ativos", + allCaps: "TODOS", + claudeCaps: "CLAUDE", + geminiCaps: "GEMINI", + systemInfo: "Informações do Sistema", + refresh: "Atualizar", + runtimeConfig: "Configuração em Tempo de Execução", + debugDesc: "Habilitar log detalhado (Ver aba Logs)", + networkRetry: "Configurações de Retentativa de Rede", + maxRetries: "Máximo de Retentativas", + retryBaseDelay: "Atraso Base de Retentativa (ms)", + retryMaxDelay: "Atraso Máximo de Retentativa (ms)", + persistentSessions: "Sessões Persistentes", + persistTokenDesc: "Salvar sessões OAuth no disco para reinicializações mais rápidas", + rateLimiting: "Limitação de Taxa de Conta & Timeouts", + defaultCooldown: "Tempo de Resfriamento Padrão", + maxWaitThreshold: "Limiar Máximo de Espera (Sticky)", + maxWaitDesc: "Tempo máximo para aguardar uma conta sticky resetar antes de trocar.", + saveConfigServer: "Salvar Configuração", + serverRestartAlert: "Alterações salvas em {path}. Reinicie o servidor para aplicar algumas configurações.", + changePassword: "Alterar Senha da WebUI", + changePasswordDesc: "Atualizar a senha para acessar este painel", + currentPassword: "Senha Atual", + newPassword: "Nova Senha", + confirmNewPassword: "Confirmar Nova Senha", + passwordEmptyDesc: "Deixe em branco se nenhuma senha estiver definida", + passwordLengthDesc: "Pelo menos 6 caracteres", + passwordConfirmDesc: "Redigite a nova senha", + cancel: "Cancelar", + passwordsNotMatch: "Senhas não coincidem", + passwordTooShort: "A senha deve ter pelo menos 6 caracteres", + // Dashboard drill-down + clickToViewAllAccounts: "Clique para ver todas as contas", + clickToViewModels: "Clique para ver a página de Modelos", + clickToViewLimitedAccounts: "Clique para ver contas limitadas", + clickToFilterClaude: "Clique para filtrar modelos Claude", + clickToFilterGemini: "Clique para filtrar modelos Gemini", + // Accounts page + searchAccounts: "Buscar contas...", + noAccountsYet: "Nenhuma Conta Ainda", + noAccountsDesc: "Comece adicionando uma conta Google via OAuth, ou use o comando CLI para importar credenciais.", + addFirstAccount: "Adicione Sua Primeira Conta", + noSearchResults: "Nenhuma conta corresponde à sua busca", + clearSearch: "Limpar Busca", + disabledAccountsNote: "Contas desabilitadas não serão usadas para roteamento de requisições, mas permanecem na configuração. As estatísticas do painel incluem apenas contas habilitadas.", + dangerousOperation: "⚠️ Operação Perigosa", + confirmDeletePrompt: "Tem certeza de que deseja excluir a conta", + deleteWarning: "⚠️ Esta ação não pode ser desfeita. Todas as configurações e registros históricos serão excluídos permanentemente.", + // OAuth progress + oauthWaiting: "Aguardando autorização OAuth...", + oauthWaitingDesc: "Por favor, complete a autenticação na janela popup. Isso pode levar até 2 minutos.", + oauthCancelled: "Autorização OAuth cancelada", + oauthTimeout: "⏱️ Autorização OAuth expirou. Por favor, tente novamente.", + oauthWindowClosed: "A janela OAuth foi fechada. A autorização pode estar incompleta.", + cancelOAuth: "Cancelar", + // MCP CLI & Gemini 1M + mcpCliExperimental: "CLI MCP Experimental", + mcpCliDesc: "Habilita integração MCP experimental para uso confiável de ferramentas com consumo reduzido de contexto.", + gemini1mMode: "Modo de Contexto Gemini 1M", + gemini1mDesc: "Adiciona sufixo [1m] aos modelos Gemini para suporte a janela de contexto de 1M.", + gemini1mWarning: "⚠ Contexto grande pode reduzir o desempenho do Gemini-3-Pro.", + clickToSet: "Clique para configurar...", +}; diff --git a/public/views/settings.html b/public/views/settings.html index f05fc3f..169a1bf 100644 --- a/public/views/settings.html +++ b/public/views/settings.html @@ -79,6 +79,7 @@ +