解决多语言切换的bug

This commit is contained in:
ymk
2025-08-02 12:06:41 +08:00
parent f54550631c
commit aa1e2b105d
11 changed files with 100 additions and 74 deletions

View File

@@ -1,44 +1,12 @@
"use client";
import { useEffect, useState } from "react";
'use client';
import { usePathname, useRouter } from "@/i18n/navigation";
import { Locales } from "@/i18n/config";
import { Button, DropdownMenu } from "@radix-ui/themes";
import { useLocale } from "next-intl";
const LanguageSwitcher = () => {
const router = useRouter();
const pathname = usePathname();
const [currentLanguage, setCurrentLanguage] = useState("en");
const locale = useLocale();
useEffect(() => {
const savedLanguage =
document.cookie
.split("; ")
.find((row) => row.startsWith("NEXT_LOCALE="))
?.split("=")[1] || "en";
setCurrentLanguage(savedLanguage);
const urlLanguage = pathname.split("/")[1];
if (Locales.includes(urlLanguage)) {
setCurrentLanguage(urlLanguage);
}
}, [pathname]);
const changeLanguage = (newLanguage: string) => {
setCurrentLanguage(newLanguage);
document.cookie = `NEXT_LOCALE=${newLanguage}; path=/;`;
const segments = pathname.split("/");
if (Locales.includes(segments[1])) {
segments[1] = newLanguage;
} else {
segments.splice(1, 0, newLanguage);
}
router.push(segments.join("/"));
router.refresh();
};
const languageLabels = {
en: "English",
@@ -48,21 +16,26 @@ const LanguageSwitcher = () => {
// jp: "日本語",
};
const router = useRouter();
const labels = [];
for (let l in languageLabels) {
const key = l as keyof typeof languageLabels;
labels.push(
<DropdownMenu.Item key={l} onClick={() => changeLanguage(l)}>
<DropdownMenu.Item key={l} onClick={() => {
if (l !== locale) {
router.push(pathname, { locale: l });
}
}}>
{languageLabels[key]}
</DropdownMenu.Item>
);
}
return (
<DropdownMenu.Root dir={currentLanguage === "ar" ? "rtl" : "ltr"}>
<DropdownMenu.Root dir={locale === "ar" ? "rtl" : "ltr"}>
<DropdownMenu.Trigger >
<Button variant="outline" size={"2"}>
{languageLabels[currentLanguage as keyof typeof languageLabels]}
{languageLabels[locale as keyof typeof languageLabels]}
</Button>
</DropdownMenu.Trigger>
<DropdownMenu.Content align="end">