From e93492321a47d79f26607a3ce0f0940f3b80c448 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=B9=E9=9B=AA?= <2b@yorha.xyz> Date: Wed, 10 Jun 2026 14:28:55 +0900 Subject: [PATCH] feat(ui): i18n for user dashboard, user edit, and user spend views --- .../src/components/user_dashboard.tsx | 4 +- .../src/components/user_edit_view.tsx | 38 ++++++------- .../src/components/view_user_spend.tsx | 15 ++++-- .../src/components/view_users.tsx | 38 ++++++------- ui/litellm-dashboard/src/locales/en.json | 53 +++++++++++++++++++ ui/litellm-dashboard/src/locales/zh-CN.json | 53 +++++++++++++++++++ 6 files changed, 161 insertions(+), 40 deletions(-) diff --git a/ui/litellm-dashboard/src/components/user_dashboard.tsx b/ui/litellm-dashboard/src/components/user_dashboard.tsx index db262bc84a1..3c3fffcf1d8 100644 --- a/ui/litellm-dashboard/src/components/user_dashboard.tsx +++ b/ui/litellm-dashboard/src/components/user_dashboard.tsx @@ -4,6 +4,7 @@ import { Col, Grid } from "@tremor/react"; import { jwtDecode } from "jwt-decode"; import { useSearchParams } from "next/navigation"; import React, { useEffect, useState } from "react"; +import { useTranslation } from "react-i18next"; import Onboarding from "../app/onboarding/page"; import { fetchTeams } from "./common_components/fetch_teams"; import { KeyResponse, Team } from "./key_team_helpers/key_list"; @@ -75,6 +76,7 @@ const UserDashboard: React.FC = ({ autoOpenCreate, prefillData, }) => { + const { t } = useTranslation(); const [userSpendData, setUserSpendData] = useState(null); const [currentOrg, setCurrentOrg] = useState(null); @@ -309,7 +311,7 @@ const UserDashboard: React.FC = ({ } if (userID == null) { - return

User ID is not set

; + return

{t("userDashboard.userIdNotSet")}

; } if (userRole == null) { diff --git a/ui/litellm-dashboard/src/components/user_edit_view.tsx b/ui/litellm-dashboard/src/components/user_edit_view.tsx index 122b8c5ffdd..4a139f72476 100644 --- a/ui/litellm-dashboard/src/components/user_edit_view.tsx +++ b/ui/litellm-dashboard/src/components/user_edit_view.tsx @@ -2,6 +2,7 @@ import { InfoCircleOutlined } from "@ant-design/icons"; import { Button, SelectItem, TextInput, Textarea } from "@tremor/react"; import { Checkbox, Form, Select, Tooltip } from "antd"; import React, { useState } from "react"; +import { useTranslation } from "react-i18next"; import { all_admin_roles } from "../utils/roles"; import BudgetDurationDropdown from "./common_components/budget_duration_dropdown"; import { getModelDisplayName } from "./key_team_helpers/fetch_available_models_team_key"; @@ -32,6 +33,7 @@ export function UserEditView({ possibleUIRoles, isBulkEdit = false, }: UserEditViewProps) { + const { t } = useTranslation(); const [form] = Form.useForm(); const [unlimitedBudget, setUnlimitedBudget] = useState(false); @@ -82,26 +84,26 @@ export function UserEditView({ return (
{!isBulkEdit && ( - + )} {!isBulkEdit && ( - + )} - + - Global Proxy Role{" "} - + {t("userEditView.globalProxyRoleLabel")}{" "} + @@ -126,8 +128,8 @@ export function UserEditView({ - Personal Models{" "} - + {t("userEditView.personalModelsLabel")}{" "} + @@ -136,15 +138,15 @@ export function UserEditView({ >