From f4575fe6641e4703a4ce36c9477dde1f31fc2c66 Mon Sep 17 00:00:00 2001 From: CaIon Date: Thu, 18 Jun 2026 21:30:05 +0800 Subject: [PATCH] feat(format): add locales support to number formatting --- .../dashboard/components/models/log-stat-cards.tsx | 11 +++++++---- web/default/src/lib/format.ts | 14 ++++++++++---- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/web/default/src/features/dashboard/components/models/log-stat-cards.tsx b/web/default/src/features/dashboard/components/models/log-stat-cards.tsx index 92431560..d0a3c091 100644 --- a/web/default/src/features/dashboard/components/models/log-stat-cards.tsx +++ b/web/default/src/features/dashboard/components/models/log-stat-cards.tsx @@ -17,6 +17,7 @@ along with this program. If not, see . For commercial licensing, please contact support@quantumnous.com */ import { useEffect, useState } from 'react' +import { useTranslation } from 'react-i18next' import { useAuthStore } from '@/stores/auth-store' import { formatCompactNumber, formatNumber, formatQuota } from '@/lib/format' import { computeTimeRange } from '@/lib/time' @@ -41,11 +42,11 @@ interface LogStatCardsProps { const MAX_INLINE_STAT_CHARS = 9 -function formatStatNumber(value: number) { - const fullValue = formatNumber(value) +function formatStatNumber(value: number, locale: Intl.LocalesArgument) { + const fullValue = formatNumber(value, locale) const displayValue = fullValue.length > MAX_INLINE_STAT_CHARS - ? formatCompactNumber(value) + ? formatCompactNumber(value, locale) : fullValue return { @@ -55,6 +56,7 @@ function formatStatNumber(value: number) { } export function LogStatCards(props: LogStatCardsProps) { + const { i18n } = useTranslation() const statCardsConfig = useModelStatCardsConfig() const user = useAuthStore((state) => state.auth.user) const isAdmin = !!(user?.role && user.role >= 10) @@ -118,13 +120,14 @@ export function LogStatCards(props: LogStatCardsProps) { const items = statCardsConfig.map((config) => { const rawValue = config.getValue(adaptedStats, timeRangeMinutes) + const locale = i18n.resolvedLanguage || i18n.language const formatted = config.key === 'quota' ? { displayValue: formatQuota(rawValue), fullValue: formatQuota(rawValue), } - : formatStatNumber(rawValue) + : formatStatNumber(rawValue, locale) return { title: config.title, diff --git a/web/default/src/lib/format.ts b/web/default/src/lib/format.ts index 69408e73..fd997721 100644 --- a/web/default/src/lib/format.ts +++ b/web/default/src/lib/format.ts @@ -27,16 +27,22 @@ import { // Number Formatting // ============================================================================ -export function formatNumber(value: number | null | undefined): string { +export function formatNumber( + value: number | null | undefined, + locales?: Intl.LocalesArgument +): string { if (value == null || Number.isNaN(value as number)) return '-' - return Intl.NumberFormat(undefined, { maximumFractionDigits: 2 }).format( + return Intl.NumberFormat(locales, { maximumFractionDigits: 2 }).format( value as number ) } -export function formatCompactNumber(value: number | null | undefined): string { +export function formatCompactNumber( + value: number | null | undefined, + locales?: Intl.LocalesArgument +): string { if (value == null || Number.isNaN(value as number)) return '-' - return Intl.NumberFormat(undefined, { + return Intl.NumberFormat(locales, { notation: 'compact', maximumFractionDigits: 1, }).format(value as number)