diff --git a/src/app/(dashboard)/dashboard/costs/quota-share/components/QuotaConceptCard.tsx b/src/app/(dashboard)/dashboard/costs/quota-share/components/QuotaConceptCard.tsx index eadae5ca44..33696fbd1d 100644 --- a/src/app/(dashboard)/dashboard/costs/quota-share/components/QuotaConceptCard.tsx +++ b/src/app/(dashboard)/dashboard/costs/quota-share/components/QuotaConceptCard.tsx @@ -33,6 +33,16 @@ export default function QuotaConceptCard() { + + )} @@ -50,3 +60,17 @@ function ConceptItem({ icon, text }: { icon: string; text: string }) { ); } + +function ConceptItemWithDesc({ icon, title, desc }: { icon: string; title: string; desc: string }) { + return ( +
+ + {icon} + +
+ {title} + {desc} +
+
+ ); +} diff --git a/src/i18n/messages/en.json b/src/i18n/messages/en.json index 4e3bcd5e88..e8302601d5 100644 --- a/src/i18n/messages/en.json +++ b/src/i18n/messages/en.json @@ -7855,6 +7855,10 @@ "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", + "conceptKeyHowTitle": "Enabling a key for quota", + "conceptKeyHowDesc": "Create the key normally in the API Manager — it appears in the wizard's key step automatically. Tick Exclusive there to make it quota-only. No separate enable step.", + "conceptExclusiveTitle": "What \"Exclusive\" does", + "conceptExclusiveDesc": "An exclusive key only sees/uses the pool's quotaShared-* models — every other model is hidden from its /v1/models and blocked.", "burnRateTitle": "Burn rate", "burnRateExhaustsIn": "Exhausts in", "dimensionResetIn": "Resets in", diff --git a/src/i18n/messages/pt-BR.json b/src/i18n/messages/pt-BR.json index 5f04ca5e3d..32d5274cee 100644 --- a/src/i18n/messages/pt-BR.json +++ b/src/i18n/messages/pt-BR.json @@ -5365,6 +5365,10 @@ "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", + "conceptKeyHowTitle": "Habilitando uma key para cota", + "conceptKeyHowDesc": "Crie a key normalmente no Gerenciador de APIs — ela aparece automaticamente na etapa de keys do wizard. Marque Exclusiva lá para torná-la somente-cota. Não há etapa de ativação separada.", + "conceptExclusiveTitle": "O que \"Exclusiva\" faz", + "conceptExclusiveDesc": "Uma key exclusiva enxerga/usa apenas os modelos quotaShared-* do pool — todos os outros modelos ficam ocultos no seu /v1/models e bloqueados.", "burnRateTitle": "Taxa de consumo", "burnRateExhaustsIn": "Esgota em", "dimensionResetIn": "Reset em", diff --git a/tests/unit/quota-concept-card-i18n.test.ts b/tests/unit/quota-concept-card-i18n.test.ts new file mode 100644 index 0000000000..024716f0fd --- /dev/null +++ b/tests/unit/quota-concept-card-i18n.test.ts @@ -0,0 +1,12 @@ +import test from "node:test"; +import assert from "node:assert/strict"; +import en from "../../src/i18n/messages/en.json" with { type: "json" }; +import pt from "../../src/i18n/messages/pt-BR.json" with { type: "json" }; + +const KEYS = ["conceptKeyHowTitle","conceptKeyHowDesc","conceptExclusiveTitle","conceptExclusiveDesc"]; +test("explanatory card i18n keys exist + parity", () => { + for (const k of KEYS) { + assert.equal(typeof (en as any).quotaShare[k], "string", `en missing ${k}`); + assert.equal(typeof (pt as any).quotaShare[k], "string", `pt missing ${k}`); + } +});