From 08f53032702c91b9c8c30786cd31bd048cc69fe1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=B9=E9=9B=AA?= <2b@yorha.xyz> Date: Thu, 11 Jun 2026 01:05:25 +0900 Subject: [PATCH] feat(ui): i18n for cost tracking utils and hooks --- .../pricing_calculator/multi_export_utils.ts | 102 +++++++++--------- .../provider_margin_table.tsx | 14 +-- .../use_discount_config.ts | 18 ++-- .../CostTrackingSettings/use_margin_config.ts | 18 ++-- ui/litellm-dashboard/src/locales/en.json | 74 +++++++++++++ ui/litellm-dashboard/src/locales/zh-CN.json | 74 +++++++++++++ 6 files changed, 231 insertions(+), 69 deletions(-) diff --git a/ui/litellm-dashboard/src/components/CostTrackingSettings/pricing_calculator/multi_export_utils.ts b/ui/litellm-dashboard/src/components/CostTrackingSettings/pricing_calculator/multi_export_utils.ts index cee52cd1024..c23e1586814 100644 --- a/ui/litellm-dashboard/src/components/CostTrackingSettings/pricing_calculator/multi_export_utils.ts +++ b/ui/litellm-dashboard/src/components/CostTrackingSettings/pricing_calculator/multi_export_utils.ts @@ -1,3 +1,4 @@ +import i18n from "@/lib/i18n"; import { CostEstimateResponse } from "../types"; import { formatNumberWithCommas } from "@/utils/dataUtils"; import { MultiModelResult } from "./types"; @@ -16,44 +17,45 @@ const formatRequestsForExport = (value: number | null | undefined): string => { }; const generateModelSection = (result: CostEstimateResponse): string => { + const t = i18n.t.bind(i18n); return `
| Cost Type | -Per Request | - ${result.daily_cost !== null ? "Daily | " : ""} - ${result.monthly_cost !== null ? "Monthly | " : ""} +${t("costTracking.multiExportUtils.colCostType")} | +${t("costTracking.multiExportUtils.colPerRequest")} | + ${result.daily_cost !== null ? `${t("costTracking.multiExportUtils.colDaily")} | ` : ""} + ${result.monthly_cost !== null ? `${t("costTracking.multiExportUtils.colMonthly")} | ` : ""}
|---|---|---|---|---|---|---|---|
| Input Cost | +${t("costTracking.multiExportUtils.inputCost")} | ${formatCostForExport(result.input_cost_per_request)} | ${result.daily_cost !== null ? `${formatCostForExport(result.daily_input_cost)} | ` : ""} ${result.monthly_cost !== null ? `${formatCostForExport(result.monthly_input_cost)} | ` : ""}|||
| Output Cost | +${t("costTracking.multiExportUtils.outputCost")} | ${formatCostForExport(result.output_cost_per_request)} | ${result.daily_cost !== null ? `${formatCostForExport(result.daily_output_cost)} | ` : ""} ${result.monthly_cost !== null ? `${formatCostForExport(result.monthly_output_cost)} | ` : ""}|||
| Margin/Fee | +${t("costTracking.multiExportUtils.marginFee")} | ${formatCostForExport(result.margin_cost_per_request)} | ${result.daily_cost !== null ? `${formatCostForExport(result.daily_margin_cost)} | ` : ""} ${result.monthly_cost !== null ? `${formatCostForExport(result.monthly_margin_cost)} | ` : ""}|||
| Total | +${t("common.total")} | ${formatCostForExport(result.cost_per_request)} | ${result.daily_cost !== null ? `${formatCostForExport(result.daily_cost)} | ` : ""} ${result.monthly_cost !== null ? `${formatCostForExport(result.monthly_cost)} | ` : ""} @@ -64,9 +66,10 @@ const generateModelSection = (result: CostEstimateResponse): string => { }; export const exportMultiToPDF = (multiResult: MultiModelResult): void => { + const t = i18n.t.bind(i18n); const printWindow = window.open("", "_blank"); if (!printWindow) { - alert("Please allow popups to export PDF"); + alert(t("costTracking.multiExportUtils.popupBlockedAlert")); return; } @@ -193,22 +196,22 @@ export const exportMultiToPDF = (multiResult: MultiModelResult): void => { -