From d98522d643db4bb4bab44efbb2772d259ac0166c Mon Sep 17 00:00:00 2001 From: cfngc4594 Date: Mon, 14 Apr 2025 23:15:41 +0800 Subject: [PATCH] feat(i18n): add locale management and configuration --- src/config/i18n.ts | 9 +++++++++ src/i18n/locale.ts | 31 +++++++++++++++++++++++++++++++ src/i18n/request.ts | 11 +++++++++++ 3 files changed, 51 insertions(+) create mode 100644 src/config/i18n.ts create mode 100644 src/i18n/locale.ts create mode 100644 src/i18n/request.ts diff --git a/src/config/i18n.ts b/src/config/i18n.ts new file mode 100644 index 0000000..b78af16 --- /dev/null +++ b/src/config/i18n.ts @@ -0,0 +1,9 @@ +// Supported locales +export const locales = ["en", "zh"] as const; +export type Locale = (typeof locales)[number]; + +// Default locale +export const defaultLocale: Locale = "en"; + +// Cookie key for storing selected locale +export const LOCALE_COOKIE_NAME = "LOCALE"; diff --git a/src/i18n/locale.ts b/src/i18n/locale.ts new file mode 100644 index 0000000..145cd8e --- /dev/null +++ b/src/i18n/locale.ts @@ -0,0 +1,31 @@ +"use server"; + +import { + defaultLocale, + Locale, + LOCALE_COOKIE_NAME, + locales +} from "@/config/i18n"; +import { cookies, headers } from "next/headers"; + +export async function getUserLocale() { + const cookieLocale = (await cookies()).get(LOCALE_COOKIE_NAME)?.value; + + if (cookieLocale && locales.includes(cookieLocale as Locale)) { + return cookieLocale as Locale; + } + + const acceptLanguage = (await headers()).get("accept-language") || ""; + const firstLang = acceptLanguage.split(",")[0]?.trim().toLowerCase(); + const langPrefix = firstLang?.slice(0, 2); + + if (locales.includes(langPrefix as Locale)) { + return langPrefix as Locale; + } + + return defaultLocale; +} + +export async function setUserLocale(locale: Locale) { + (await cookies()).set(LOCALE_COOKIE_NAME, locale); +} diff --git a/src/i18n/request.ts b/src/i18n/request.ts new file mode 100644 index 0000000..7ed0601 --- /dev/null +++ b/src/i18n/request.ts @@ -0,0 +1,11 @@ +import { getUserLocale } from '@/i18n/locale'; +import { getRequestConfig } from 'next-intl/server'; + +export default getRequestConfig(async () => { + const locale = await getUserLocale(); + + return { + locale, + messages: (await import(`../../messages/${locale}.json`)).default + }; +});