Files
antigravity-claude-proxy/public/js/translations/pt.js
jgor20 a43d2332ca feat: per-account quota threshold protection (#212)
feat: per-account quota threshold protection

Resolves #135

- Adds configurable quota protection with three-tier threshold resolution (per-model → per-account → global)
- New global Minimum Quota Level slider in Settings
- Per-account threshold settings via Account Settings modal
- Draggable per-account threshold markers on model quota bars
- Backend: PATCH /api/accounts/:email endpoint, globalQuotaThreshold config
- i18n: quota protection keys for all 5 languages
2026-02-01 17:15:46 +05:30

324 lines
15 KiB
JavaScript

/**
* 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",
defaultCooldownDesc: "Resfriamento de fallback quando a API não fornece tempo de reset.",
maxWaitThreshold: "Limiar Máximo de Espera (Sticky)",
maxWaitDesc: "Tempo máximo para aguardar uma conta sticky resetar antes de trocar.",
// Proteção de Cota
quotaProtection: "Proteção de Cota",
minimumQuotaLevel: "Nível Mínimo de Cota",
minimumQuotaLevelDesc: "Trocar de conta quando a cota cair abaixo deste nível. Configurações por conta têm prioridade.",
quotaDisabled: "Desativado",
// Ajuste de Tratamento de Erros
errorHandlingTuning: "Ajuste de Tratamento de Erros",
rateLimitDedupWindow: "Janela de Deduplicação de Rate Limit",
rateLimitDedupWindowDesc: "Previne tempestades de retry quando múltiplas requisições atingem rate limits simultaneamente.",
maxConsecutiveFailures: "Máx. Falhas Consecutivas",
maxConsecutiveFailuresDesc: "Número de falhas consecutivas antes de aplicar resfriamento estendido.",
extendedCooldown: "Resfriamento Estendido",
extendedCooldownDesc: "Duração do resfriamento aplicado após atingir máx. de falhas consecutivas.",
maxCapacityRetries: "Máx. Retries de Capacidade",
maxCapacityRetriesDesc: "Máximo de retries para esgotamento de capacidade antes de trocar conta.",
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: "<strong>Contas desabilitadas</strong> 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...",
none: "Nenhum",
// Quota Distribution
quotaDistribution: "Distribuição de Quota",
resetsIn: "Reseta em {time}",
noQuotaData: "Dados de quota ainda não disponíveis para esta conta.",
// Manual OAuth Mode
manualMode: "Modo Manual",
manualModeDesc: "(para ambientes onde callback não consegue alcançar)",
authLinkLabel: "Link de Autorização:",
linkCopied: "Link copiado para a área de transferência",
pasteCallbackLabel: "Cole a URL de callback ou código:",
pasteCallbackPlaceholder: "http://localhost:51121/oauth-callback?code=... ou 4/0xxx...",
completeAuth: "Completar Autorização",
authFailed: "Falha na autorização",
// Import/Export
export: "Exportar",
import: "Importar",
exportAccounts: "Exportar Contas",
importAccounts: "Importar Contas",
exportSuccess: "Exportadas {count} contas",
exportFailed: "Falha ao exportar",
importSuccess: "Importação concluída:",
importFailed: "Falha ao importar",
// Account Selection Strategy translations
accountSelectionStrategy: "Estratégia de Seleção de Conta",
selectionStrategy: "Estratégia de Seleção",
strategyStickyLabel: "Fixo (Otimizado para Cache)",
strategyRoundRobinLabel: "Rodízio (Balanceamento de Carga)",
strategyHybridLabel: "Híbrido (Distribuição Inteligente)",
strategyStickyDesc: "Permanece na mesma conta até atingir limite. Melhor para cache de prompts.",
strategyRoundRobinDesc: "Alterna para próxima conta a cada requisição. Máximo throughput.",
strategyHybridDesc: "Seleção inteligente baseada em saúde, tokens e frescor.",
strategyUpdated: "Estratégia atualizada para: {strategy}",
failedToUpdateStrategy: "Falha ao atualizar estratégia",
invalidStrategy: "Estratégia inválida selecionada",
// Mode Toggle (Proxy/Paid)
connectionMode: "Modo de Conexão",
proxyMode: "Modo Proxy",
paidMode: "Modo Pago",
usingLocalProxy: "Usando servidor proxy local (localhost:{port})",
usingOfficialApi: "Usando API oficial da Anthropic (requer assinatura)",
paidModeTitle: "Claude CLI está usando a API oficial da Anthropic",
paidModeDesc: "Toda configuração de proxy foi removida. Claude CLI usa sua assinatura Anthropic diretamente.",
paidModeHint: "Mude para modo Proxy para configurar roteamento de modelos e presets.",
modeToggleFailed: "Falha ao alternar modo",
};