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 @@
+