Files
ryan 5a8722ff07 feat(frontend): 控制台 next-intl 中英双语
接入无 URL 前缀的 zh-CN/en,顶栏与外观设置可切换语言;选择写入 cookie 后刷新生效。
2026-08-16 16:49:16 +08:00

45 lines
1.1 KiB
TypeScript

import { cookies, headers } from 'next/headers';
import { getRequestConfig } from 'next-intl/server';
import {
defaultLocale,
isAppLocale,
localeCookieName,
normalizeLocale,
pickLocaleFromAcceptLanguage,
type AppLocale,
} from './config';
async function resolveRequestLocale(): Promise<AppLocale> {
try {
const cookieStore = await cookies();
const cookieLocale = cookieStore.get(localeCookieName)?.value;
if (isAppLocale(cookieLocale)) {
return cookieLocale;
}
if (cookieLocale) {
return normalizeLocale(cookieLocale);
}
} catch {
// Static export / non-request contexts cannot read cookies.
}
try {
const headerStore = await headers();
const acceptLanguage = headerStore.get('accept-language');
return pickLocaleFromAcceptLanguage(acceptLanguage);
} catch {
// Static export build time.
}
return defaultLocale;
}
export default getRequestConfig(async () => {
const locale = await resolveRequestLocale();
const messages = (await import(`../messages/${locale}.json`)).default;
return {
locale,
messages,
};
});