mirror of
https://github.com/massbug/judge4c.git
synced 2025-05-17 23:12:23 +00:00
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:
parent
4cc6456151
commit
01b72209ae
@ -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";
|
|
||||||
|
@ -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);
|
||||||
}
|
};
|
||||||
|
@ -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,
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
Loading…
Reference in New Issue
Block a user