From c21bfd5a36b02d3fde76159b2bcf227841ce7acc Mon Sep 17 00:00:00 2001 From: diegosouzapw Date: Thu, 28 May 2026 08:25:00 -0300 Subject: [PATCH] chore(i18n): extend quotaShare + add quotaPlans namespace (pt-BR + en) (B/F9) --- src/i18n/messages/en.json | 51 +++++++++++++++++++++++++++++++++++- src/i18n/messages/pt-BR.json | 51 +++++++++++++++++++++++++++++++++++- 2 files changed, 100 insertions(+), 2 deletions(-) diff --git a/src/i18n/messages/en.json b/src/i18n/messages/en.json index 2c06b216dd..88ff5b4c11 100644 --- a/src/i18n/messages/en.json +++ b/src/i18n/messages/en.json @@ -836,6 +836,7 @@ "analyticsCompression": "Compression", "costsBudget": "Budget", "costsQuotaShare": "Quota Sharing", + "costsQuotaPlans": "Plans & Quotas", "costsPricing": "Pricing", "logsProxy": "Proxy Logs", "logsConsole": "Console", @@ -903,6 +904,7 @@ "costsPricingSubtitle": "Per-model pricing rules", "costsBudgetSubtitle": "Budget limits", "costsQuotaShareSubtitle": "Share provider quotas across keys", + "costsQuotaPlansSubtitle": "Configure plans by provider", "auditLogSubtitle": "Authorization audit", "auditMcpSubtitle": "MCP server audit", "auditA2aSubtitle": "A2A protocol audit", @@ -7299,7 +7301,54 @@ "betaConfigSavedSuffix": "(not yet persisted on the server). Per-request cap enforcement is not yet wired into the proxy pipeline. This screen lets you design and visualize the quota split; real enforcement will land in a future iteration with DB persistence and upstream call interception.", "policyLabel": "Policy:", "resetIn": "reset in", - "quotaTotal": "total" + "quotaTotal": "total", + "conceptTitle": "How Quota Share works", + "conceptIntro": "Quota Share divides a provider's quota among multiple API keys using work-conserving fair-share: each key receives a proportional slice but can borrow from the free balance without exceeding the global cap.", + "conceptFairShare": "Fair-share: each key receives quota proportional to its configured weight", + "conceptBorrowing": "Borrowing: keys can consume free balance from others without breaching the cap", + "conceptGlobalCap": "Hard global cap: the provider's absolute limit is never exceeded", + "conceptWindows": "Windows: 5h, hourly, daily, weekly, monthly — each tracked independently", + "burnRateTitle": "Burn rate", + "burnRateExhaustsIn": "Exhausts in", + "dimensionResetIn": "Resets in", + "realConsumedColumn": "Consumed", + "deficitColumn": "Deficit", + "borrowingIndicator": "borrowing", + "migratedFromLocalStorageNotice": "Pools successfully migrated from localStorage.", + "policyCapAbsoluteLabel": "Absolute cap", + "policyCapAbsolutePlaceholder": "Numeric limit (optional)", + "multiDimensionLabel": "Multi-dimension" + }, + "quotaPlans": { + "title": "Plans & Quotas", + "description": "Configure quota plans per provider — dimensions (%, requests, tokens, $) and time windows", + "providerLabel": "Provider / Connection", + "detectedPlanLabel": "Detected plan", + "manualPlanLabel": "Manual override", + "unconfiguredLabel": "Not configured — manual required", + "dimensionLabel": "Dimensions", + "addDimension": "Add dimension", + "removeDimension": "Remove", + "limitLabel": "Limit", + "unitOptions": { + "percent": "%", + "requests": "requests", + "tokens": "tokens", + "usd": "USD ($)" + }, + "windowOptions": { + "5h": "5 hours", + "hourly": "Hourly", + "daily": "Daily", + "weekly": "Weekly", + "monthly": "Monthly" + }, + "useCatalogButton": "Use catalog", + "saveOverrideButton": "Save override", + "revertToCatalogButton": "Revert to catalog", + "unknownProviderNotice": "Select a provider on the left to configure its quota plan.", + "catalogTitle": "Known catalog", + "catalogDescription": "Automatically detected plans for the following providers:" }, "activity": { "title": "Activity", diff --git a/src/i18n/messages/pt-BR.json b/src/i18n/messages/pt-BR.json index 208e1fdb38..52ee2eece4 100644 --- a/src/i18n/messages/pt-BR.json +++ b/src/i18n/messages/pt-BR.json @@ -836,6 +836,7 @@ "analyticsCompression": "Compression", "costsBudget": "Budget", "costsQuotaShare": "Compartilhamento de Cota", + "costsQuotaPlans": "Planos & Cotas", "costsPricing": "Pricing", "logsProxy": "Proxy Logs", "logsConsole": "Console", @@ -903,6 +904,7 @@ "costsPricingSubtitle": "Regras de preço por modelo", "costsBudgetSubtitle": "Limites de orçamento", "costsQuotaShareSubtitle": "Compartilhe cotas de provedor entre chaves", + "costsQuotaPlansSubtitle": "Configurar planos por provider", "auditLogSubtitle": "Auditoria de autorização", "auditMcpSubtitle": "Auditoria do servidor MCP", "auditA2aSubtitle": "Auditoria do protocolo A2A", @@ -7289,7 +7291,54 @@ "betaConfigSavedSuffix": "(ainda não persistido no servidor). A aplicação do limite por solicitação ainda não está conectada ao pipeline do proxy. Esta tela permite desenhar e visualizar a divisão de cotas; a aplicação real chegará em uma iteração futura com persistência de banco de dados e interceptação de chamadas upstream.", "policyLabel": "Política:", "resetIn": "redefinir em", - "quotaTotal": "total" + "quotaTotal": "total", + "conceptTitle": "Como funciona o Quota Share", + "conceptIntro": "O Quota Share divide a cota de um provider entre múltiplas API keys usando fair-share work-conserving: cada key recebe uma fatia proporcional, mas pode tomar emprestado do saldo livre sem estourar o teto global.", + "conceptFairShare": "Fair-share: cada key recebe proporcionalmente ao peso configurado", + "conceptBorrowing": "Empréstimo: keys podem usar saldo livre de outras sem ultrapassar o teto", + "conceptGlobalCap": "Teto intransponível: o cap absoluto do provider nunca é excedido", + "conceptWindows": "Janelas: 5h, horária, diária, semanal, mensal — cada uma rastreada independentemente", + "burnRateTitle": "Taxa de consumo", + "burnRateExhaustsIn": "Esgota em", + "dimensionResetIn": "Reset em", + "realConsumedColumn": "Consumido", + "deficitColumn": "Déficit", + "borrowingIndicator": "empréstimo", + "migratedFromLocalStorageNotice": "Pools migrados do localStorage com sucesso.", + "policyCapAbsoluteLabel": "Cap absoluto", + "policyCapAbsolutePlaceholder": "Limite numérico (opcional)", + "multiDimensionLabel": "Multi-dimensão" + }, + "quotaPlans": { + "title": "Planos & Cotas", + "description": "Configure os planos de cota por provider — dimensões (%, requests, tokens, $) e janelas de tempo", + "providerLabel": "Provider / Conexão", + "detectedPlanLabel": "Plano detectado", + "manualPlanLabel": "Override manual", + "unconfiguredLabel": "Não configurado — manual obrigatório", + "dimensionLabel": "Dimensões", + "addDimension": "Adicionar dimensão", + "removeDimension": "Remover", + "limitLabel": "Limite", + "unitOptions": { + "percent": "%", + "requests": "requests", + "tokens": "tokens", + "usd": "USD ($)" + }, + "windowOptions": { + "5h": "5 horas", + "hourly": "Por hora", + "daily": "Diária", + "weekly": "Semanal", + "monthly": "Mensal" + }, + "useCatalogButton": "Usar catálogo", + "saveOverrideButton": "Salvar override", + "revertToCatalogButton": "Reverter para catálogo", + "unknownProviderNotice": "Selecione um provider à esquerda para configurar o plano de cota.", + "catalogTitle": "Catálogo conhecido", + "catalogDescription": "Planos automaticamente detectados para os seguintes providers:" }, "activity": { "title": "Atividade",