@@ -290,15 +288,10 @@ export default function PricingTab() {
- Input: tokens sent to the model • Output: tokens
- generated • Cached: reused input (~50% of input rate) •{" "}
- Reasoning: thinking tokens (falls back to Output) •{" "}
- Cache Write: creating cache entries (falls back to Input)
-
-
- Cost = (input × input_rate) + (output × output_rate) + (cached × cached_rate) per
- million tokens.
+ {t("pricingDescInput")} • {t("pricingDescOutput")} • {t("pricingDescCached")} •{" "}
+ {t("pricingDescReasoning")} • {t("pricingDescCacheWrite")}
+
{t("pricingDescFormula")}
diff --git a/src/app/(dashboard)/dashboard/settings/components/ResilienceTab.tsx b/src/app/(dashboard)/dashboard/settings/components/ResilienceTab.tsx
index f10aa603fb..722a55895d 100644
--- a/src/app/(dashboard)/dashboard/settings/components/ResilienceTab.tsx
+++ b/src/app/(dashboard)/dashboard/settings/components/ResilienceTab.tsx
@@ -374,10 +374,10 @@ function PoliciesCard() {
notify.success(`Unlocked: ${identifier}`);
await fetchPolicies();
} else {
- notify.error("Failed to unlock");
+ notify.error(t("failedUnlock"));
}
} catch {
- notify.error("Failed to unlock");
+ notify.error(t("failedUnlock"));
} finally {
setUnlocking(null);
}
diff --git a/src/app/(dashboard)/dashboard/settings/components/ThinkingBudgetTab.tsx b/src/app/(dashboard)/dashboard/settings/components/ThinkingBudgetTab.tsx
index 5b8bd14842..47003edf74 100644
--- a/src/app/(dashboard)/dashboard/settings/components/ThinkingBudgetTab.tsx
+++ b/src/app/(dashboard)/dashboard/settings/components/ThinkingBudgetTab.tsx
@@ -153,7 +153,7 @@ export default function ThinkingBudgetTab() {
className="w-full accent-violet-500"
/>
- Off
+ {t("off")}
1K
10K
64K
diff --git a/src/i18n/config.ts b/src/i18n/config.ts
index 546b16bf85..aeee8ab609 100644
--- a/src/i18n/config.ts
+++ b/src/i18n/config.ts
@@ -9,7 +9,7 @@ export const LANGUAGES: readonly {
flag: string;
}[] = [
{ code: "en", label: "EN", name: "English", flag: "🇺🇸" },
- { code: "pt-BR", label: "PT", name: "Português", flag: "🇧🇷" },
+ { code: "pt-BR", label: "PT-BR", name: "Português (Brasil)", flag: "🇧🇷" },
] as const;
export const LOCALE_COOKIE = "NEXT_LOCALE";
diff --git a/src/i18n/messages/en.json b/src/i18n/messages/en.json
index e97d2dc0f6..16679aab29 100644
--- a/src/i18n/messages/en.json
+++ b/src/i18n/messages/en.json
@@ -852,7 +852,31 @@
"models": "models",
"withPricing": "with pricing configured",
"loadingPricing": "Loading pricing data...",
- "databaseSize": "Database Size"
+ "databaseSize": "Database Size",
+ "policiesCircuitBreakers": "Policies & Circuit Breakers",
+ "activeIssuesDetected": "Active issues detected",
+ "off": "Off",
+ "resetPricingConfirm": "Reset all pricing for {provider} to defaults?",
+ "pricingDescInput": "Input: tokens sent to the model",
+ "pricingDescOutput": "Output: tokens generated",
+ "pricingDescCached": "Cached: reused input (~50% of input rate)",
+ "pricingDescReasoning": "Reasoning: thinking tokens (falls back to Output)",
+ "pricingDescCacheWrite": "Cache Write: creating cache entries (falls back to Input)",
+ "pricingDescFormula": "Cost = (input × input_rate) + (output × output_rate) + (cached × cached_rate) per million tokens.",
+ "pricingSettingsTitle": "Pricing Settings",
+ "totalModels": "Total Models",
+ "active": "Active",
+ "costCalculation": "Cost Calculation",
+ "costCalculationDesc": "Costs are calculated based on token usage and pricing rates configured for each model.",
+ "pricingFormat": "Pricing Format",
+ "pricingFormatDesc": "All rates are in $/1M tokens (dollars per million tokens).",
+ "tokenTypes": "Token Types",
+ "inputTokenDesc": "Standard prompt tokens",
+ "outputTokenDesc": "Completion/response tokens",
+ "cachedTokenDesc": "Cached input tokens (typically 50% of input rate)",
+ "reasoningTokenDesc": "Special reasoning/thinking tokens (fallback to output rate)",
+ "cacheCreationTokenDesc": "Tokens used to create cache entries (fallback to input rate)",
+ "customPricingNote": "You can override default pricing for specific models. Custom overrides take priority over auto-detected pricing."
},
"translator": {
"title": "Translator",
diff --git a/src/i18n/messages/pt-BR.json b/src/i18n/messages/pt-BR.json
index 5b68be35f1..0f0b2990bc 100644
--- a/src/i18n/messages/pt-BR.json
+++ b/src/i18n/messages/pt-BR.json
@@ -852,7 +852,31 @@
"models": "modelos",
"withPricing": "com preço configurado",
"loadingPricing": "Carregando dados de preços...",
- "databaseSize": "Tamanho do Banco de Dados"
+ "databaseSize": "Tamanho do Banco de Dados",
+ "policiesCircuitBreakers": "Políticas e Disjuntores",
+ "activeIssuesDetected": "Problemas ativos detectados",
+ "off": "Desligado",
+ "resetPricingConfirm": "Resetar todos os preços de {provider} para os padrões?",
+ "pricingDescInput": "Input: tokens enviados ao modelo",
+ "pricingDescOutput": "Output: tokens gerados",
+ "pricingDescCached": "Cached: input reutilizado (~50% da taxa de input)",
+ "pricingDescReasoning": "Reasoning: tokens de raciocínio (fallback para Output)",
+ "pricingDescCacheWrite": "Cache Write: criação de entradas de cache (fallback para Input)",
+ "pricingDescFormula": "Custo = (input × taxa_input) + (output × taxa_output) + (cached × taxa_cached) por milhão de tokens.",
+ "pricingSettingsTitle": "Configurações de Preços",
+ "totalModels": "Total de Modelos",
+ "active": "Ativo",
+ "costCalculation": "Cálculo de Custo",
+ "costCalculationDesc": "Custos são calculados com base no uso de tokens e taxas de preço configuradas para cada modelo.",
+ "pricingFormat": "Formato de Preços",
+ "pricingFormatDesc": "Todas as taxas são em $/1M tokens (dólares por milhão de tokens).",
+ "tokenTypes": "Tipos de Token",
+ "inputTokenDesc": "Tokens de prompt padrão",
+ "outputTokenDesc": "Tokens de conclusão/resposta",
+ "cachedTokenDesc": "Tokens de input em cache (tipicamente 50% da taxa de input)",
+ "reasoningTokenDesc": "Tokens especiais de raciocínio (fallback para taxa de output)",
+ "cacheCreationTokenDesc": "Tokens usados para criar entradas de cache (fallback para taxa de input)",
+ "customPricingNote": "Você pode sobrescrever preços padrão para modelos específicos. Sobrescritas personalizadas têm prioridade sobre preços detectados automaticamente."
},
"translator": {
"title": "Tradutor",