From cd842b3bdd772d3ada8f749d2dd98896027b8533 Mon Sep 17 00:00:00 2001 From: ngc2207 Date: Thu, 12 Dec 2024 20:16:41 +0800 Subject: [PATCH] feat(i18n): refactor authentication to use user locale from cookies and implement language switching --- src/auth.ts | 25 +------------------------ src/components/language-switcher.tsx | 18 +++++++++++++----- src/i18n/config.ts | 5 +++++ src/i18n/request.ts | 5 ++--- src/services/locale.ts | 14 ++++++++++++++ 5 files changed, 35 insertions(+), 32 deletions(-) create mode 100644 src/i18n/config.ts create mode 100644 src/services/locale.ts diff --git a/src/auth.ts b/src/auth.ts index 774e61c..f717a38 100644 --- a/src/auth.ts +++ b/src/auth.ts @@ -1,16 +1,5 @@ import NextAuth from "next-auth"; -import { JWT } from "next-auth/jwt"; -import Gitea, { GiteaProfile } from "@/lib/providers/gitea"; - -declare module "next-auth" { - interface User extends GiteaProfile {} -} - -declare module "next-auth/jwt" { - interface JWT { - language?: string; - } -} +import Gitea from "@/lib/providers/gitea"; export const { handlers, signIn, signOut, auth } = NextAuth({ providers: [ @@ -23,17 +12,5 @@ export const { handlers, signIn, signOut, auth } = NextAuth({ }), ], secret: process.env.AUTH_SECRET, - callbacks: { - jwt({ token, user }) { - if (user) { - token.language = user.language; - } - return token; - }, - session({ session, token }) { - session.user.language = token.language; - return session; - }, - }, debug: process.env.NODE_ENV === "development", }); diff --git a/src/components/language-switcher.tsx b/src/components/language-switcher.tsx index 9b9cdda..37d7131 100644 --- a/src/components/language-switcher.tsx +++ b/src/components/language-switcher.tsx @@ -1,4 +1,5 @@ -import { auth } from "@/auth"; +"use client"; + import { Select, SelectContent, @@ -6,19 +7,26 @@ import { SelectTrigger, SelectValue, } from "@/components/ui/select"; +import { useLocale } from "next-intl"; +import { Locale } from "@/i18n/config"; +import { setUserLocale } from "@/services/locale"; const languages = [ { value: "en-US", label: "English (United States)", flag: "🇺🇸" }, { value: "zh-CN", label: "简体中文", flag: "🇨🇳" }, ]; -export default async function LanguageSwitcher() { - const session = await auth(); - const defaultLanguage = session?.user?.language || "en-US"; +export default function LanguageSwitcher() { + const locale = useLocale(); + + function onChange(value: string) { + const locale = value as Locale; + setUserLocale(locale); + } return (
- diff --git a/src/i18n/config.ts b/src/i18n/config.ts new file mode 100644 index 0000000..c9c776c --- /dev/null +++ b/src/i18n/config.ts @@ -0,0 +1,5 @@ +export type Locale = (typeof locales)[number]; + +export const locales = ["en-US", "zh-CN"] as const; + +export const defaultLocale: Locale = "en-US"; diff --git a/src/i18n/request.ts b/src/i18n/request.ts index ca1469d..70ef65d 100644 --- a/src/i18n/request.ts +++ b/src/i18n/request.ts @@ -1,9 +1,8 @@ -import { auth } from "@/auth"; +import { getUserLocale } from "@/services/locale"; import { getRequestConfig } from "next-intl/server"; export default getRequestConfig(async () => { - const session = await auth(); - const locale = session?.user?.language || "en-US"; + const locale = await getUserLocale(); return { locale, diff --git a/src/services/locale.ts b/src/services/locale.ts new file mode 100644 index 0000000..4004038 --- /dev/null +++ b/src/services/locale.ts @@ -0,0 +1,14 @@ +"use server"; + +import { cookies } from "next/headers"; +import { defaultLocale, Locale } from "@/i18n/config"; + +const LOBE_LOCALE_COOKIE = "JUDGE4C_LOCALE"; + +export async function getUserLocale() { + return (await cookies()).get(LOBE_LOCALE_COOKIE)?.value || defaultLocale; +} + +export async function setUserLocale(locale: Locale) { + (await cookies()).set(LOBE_LOCALE_COOKIE, locale); +}