feat: 增加管理端多语言与多模块界面国际化支持

This commit is contained in:
2026-05-19 09:11:55 +08:00
parent 49a4caf01e
commit 1b1dfc92ab
110 changed files with 4053 additions and 1308 deletions

View File

@@ -1,6 +1,7 @@
"use client";
import { useCallback, useEffect, useState } from "react";
import { useTranslation } from "react-i18next";
import { getAdminDraw } from "@/api/admin-draws";
import { DrawStatusBadge } from "@/modules/draws/draw-status-badge";
@@ -8,6 +9,7 @@ import { LotteryApiBizError } from "@/types/api/errors";
import type { AdminDrawShowData } from "@/types/api/admin-draws";
export function RiskDrawHeader({ drawId }: { drawId: number }) {
const { t } = useTranslation("risk");
const [draw, setDraw] = useState<AdminDrawShowData | null>(null);
const [error, setError] = useState<string | null>(null);
@@ -18,11 +20,11 @@ export function RiskDrawHeader({ drawId }: { drawId: number }) {
setDraw(d);
} catch (e) {
const msg =
e instanceof LotteryApiBizError ? e.message : "无法加载期号信息";
e instanceof LotteryApiBizError ? e.message : t("drawInfoLoadFailed");
setError(msg);
setDraw(null);
}
}, [drawId]);
}, [drawId, t]);
useEffect(() => {
queueMicrotask(() => {
@@ -35,18 +37,20 @@ export function RiskDrawHeader({ drawId }: { drawId: number }) {
}
if (!draw) {
return <p className="text-sm text-muted-foreground"></p>;
return <p className="text-sm text-muted-foreground">{t("loadingDraw")}</p>;
}
return (
<div className="mb-4 space-y-1">
<h1 className="text-xl font-semibold tracking-tight">
· {draw.draw_no}
{t("headerTitle", { drawNo: draw.draw_no })}
</h1>
<p className="flex flex-wrap items-center gap-2 text-sm text-muted-foreground">
<span></span>
<span>{t("databaseStatus")}</span>
<DrawStatusBadge status={draw.status} />
<span className="text-xs opacity-80">{draw.hall_preview_status}</span>
<span className="text-xs opacity-80">
{t("hallPreviewStatus", { status: draw.hall_preview_status })}
</span>
</p>
</div>
);