diff --git a/src/components/admin/toolbar.tsx b/src/components/admin/toolbar.tsx index 6f76f31..13611e3 100644 --- a/src/components/admin/toolbar.tsx +++ b/src/components/admin/toolbar.tsx @@ -2,11 +2,14 @@ import { BellIcon, + CheckIcon, ChevronDownIcon, + GlobeIcon, LogOutIcon, UserRoundIcon, } from "lucide-react"; import { useRouter } from "next/navigation"; +import { useEffect, useState } from "react"; import { toast } from "sonner"; import { Avatar, AvatarFallback } from "@/components/ui/avatar"; @@ -21,6 +24,13 @@ import { DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; import { Separator } from "@/components/ui/separator"; +import { + ADMIN_API_LOCALES, + ADMIN_LOCALE_LABELS, + applyAdminUiLocale, + getAdminRequestLocale, + type AdminApiLocale, +} from "@/lib/admin-locale"; import { useAdminProfile, useAdminSessionStore, @@ -68,6 +78,17 @@ export function ShellToolbar() { const router = useRouter(); const adminProfile = useAdminProfile(); const clearSession = useAdminSessionStore((s) => s.clearSession); + const [locale, setLocale] = useState(() => + typeof document !== "undefined" + ? getAdminRequestLocale() + : "zh", + ); + + useEffect(() => { + queueMicrotask(() => { + setLocale(getAdminRequestLocale()); + }); + }, []); const displayName = adminProfile?.nickname?.trim() || @@ -81,6 +102,13 @@ export function ShellToolbar() { router.refresh(); } + function onSelectLocale(next: AdminApiLocale) { + applyAdminUiLocale(next); + setLocale(next); + toast.success(`语言:${ADMIN_LOCALE_LABELS[next]}`); + router.refresh(); + } + return (