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
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";

View File

@ -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);
};

View File

@ -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,
};
});