From 01b72209ae46168f107142c8a699a7eefbf3c022 Mon Sep 17 00:00:00 2001 From: cfngc4594 Date: Mon, 12 May 2025 21:07:43 +0800 Subject: [PATCH] refactor(i18n): migrate locale configuration to generated types - Replace hardcoded locale strings with generated Locale enum from client - Update cookie key name to be more specific (LOCALE_COOKIE_NAME -> JUDGE4C_LOCALE_KEY) - Rename defaultLocale to DEFAULT_LOCALE for consistency - Add 'server-only' imports to ensure server-side usage - Simplify locale validation using Object.values(Locale) - Clean up accept-language header parsing logic --- src/config/i18n.ts | 10 +++------- src/i18n/locale.ts | 39 +++++++++++++++++++-------------------- src/i18n/request.ts | 8 +++++--- 3 files changed, 27 insertions(+), 30 deletions(-) diff --git a/src/config/i18n.ts b/src/config/i18n.ts index b78af16..ff3eddd 100644 --- a/src/config/i18n.ts +++ b/src/config/i18n.ts @@ -1,9 +1,5 @@ -// Supported locales -export const locales = ["en", "zh"] as const; -export type Locale = (typeof locales)[number]; +import { Locale } from "@/generated/client"; -// Default locale -export const defaultLocale: Locale = "en"; +export const DEFAULT_LOCALE: Locale = Locale.en; -// Cookie key for storing selected locale -export const LOCALE_COOKIE_NAME = "LOCALE"; +export const LOCALE_COOKIE_KEY = "judge4c_locale"; diff --git a/src/i18n/locale.ts b/src/i18n/locale.ts index 145cd8e..552040d 100644 --- a/src/i18n/locale.ts +++ b/src/i18n/locale.ts @@ -1,31 +1,30 @@ -"use server"; +import "server-only"; -import { - defaultLocale, - Locale, - LOCALE_COOKIE_NAME, - locales -} from "@/config/i18n"; +import { Locale } from "@/generated/client"; import { cookies, headers } from "next/headers"; +import { DEFAULT_LOCALE, LOCALE_COOKIE_KEY } from "@/config/i18n"; -export async function getUserLocale() { - const cookieLocale = (await cookies()).get(LOCALE_COOKIE_NAME)?.value; +const validLocales = Object.values(Locale); - if (cookieLocale && locales.includes(cookieLocale as Locale)) { +export const getUserLocale = async () => { + const cookieLocale = (await cookies()).get(LOCALE_COOKIE_KEY)?.value; + if (validLocales.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)) { + const acceptLanguage = (await headers()) + .get("accept-language") + ?.split(",")[0] + ?.trim() + .toLowerCase(); + const langPrefix = acceptLanguage?.slice(0, 2); + if (validLocales.includes(langPrefix as Locale)) { return langPrefix as Locale; } - return defaultLocale; -} + return DEFAULT_LOCALE; +}; -export async function setUserLocale(locale: Locale) { - (await cookies()).set(LOCALE_COOKIE_NAME, locale); -} +export const setUserLocale = async (locale: Locale) => { + (await cookies()).set(LOCALE_COOKIE_KEY, locale); +}; diff --git a/src/i18n/request.ts b/src/i18n/request.ts index 7ed0601..275de07 100644 --- a/src/i18n/request.ts +++ b/src/i18n/request.ts @@ -1,11 +1,13 @@ -import { getUserLocale } from '@/i18n/locale'; -import { getRequestConfig } from 'next-intl/server'; +import "server-only"; + +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 + messages: (await import(`../../messages/${locale}.json`)).default, }; });