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
This commit is contained in:
cfngc4594 2025-05-12 21:07:43 +08:00
parent 4cc6456151
commit 01b72209ae
3 changed files with 27 additions and 30 deletions

View File

@ -1,9 +1,5 @@
// Supported locales import { Locale } from "@/generated/client";
export const locales = ["en", "zh"] as const;
export type Locale = (typeof locales)[number];
// Default locale export const DEFAULT_LOCALE: Locale = Locale.en;
export const defaultLocale: Locale = "en";
// Cookie key for storing selected locale export const LOCALE_COOKIE_KEY = "judge4c_locale";
export const LOCALE_COOKIE_NAME = "LOCALE";

View File

@ -1,31 +1,30 @@
"use server"; import "server-only";
import { import { Locale } from "@/generated/client";
defaultLocale,
Locale,
LOCALE_COOKIE_NAME,
locales
} from "@/config/i18n";
import { cookies, headers } from "next/headers"; import { cookies, headers } from "next/headers";
import { DEFAULT_LOCALE, LOCALE_COOKIE_KEY } from "@/config/i18n";
export async function getUserLocale() { const validLocales = Object.values(Locale);
const cookieLocale = (await cookies()).get(LOCALE_COOKIE_NAME)?.value;
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; return cookieLocale as Locale;
} }
const acceptLanguage = (await headers()).get("accept-language") || ""; const acceptLanguage = (await headers())
const firstLang = acceptLanguage.split(",")[0]?.trim().toLowerCase(); .get("accept-language")
const langPrefix = firstLang?.slice(0, 2); ?.split(",")[0]
?.trim()
if (locales.includes(langPrefix as Locale)) { .toLowerCase();
const langPrefix = acceptLanguage?.slice(0, 2);
if (validLocales.includes(langPrefix as Locale)) {
return langPrefix as Locale; return langPrefix as Locale;
} }
return defaultLocale; return DEFAULT_LOCALE;
} };
export async function setUserLocale(locale: Locale) { export const setUserLocale = async (locale: Locale) => {
(await cookies()).set(LOCALE_COOKIE_NAME, locale); (await cookies()).set(LOCALE_COOKIE_KEY, locale);
} };

View File

@ -1,11 +1,13 @@
import { getUserLocale } from '@/i18n/locale'; import "server-only";
import { getRequestConfig } from 'next-intl/server';
import { getUserLocale } from "@/i18n/locale";
import { getRequestConfig } from "next-intl/server";
export default getRequestConfig(async () => { export default getRequestConfig(async () => {
const locale = await getUserLocale(); const locale = await getUserLocale();
return { return {
locale, locale,
messages: (await import(`../../messages/${locale}.json`)).default messages: (await import(`../../messages/${locale}.json`)).default,
}; };
}); });