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
324 lines
15 KiB
JavaScript
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",
|
|
};
|