46 lines
1.4 KiB
TypeScript
46 lines
1.4 KiB
TypeScript
import { headers } from "next/headers";
|
|
import { getRequestConfig } from "next-intl/server";
|
|
|
|
export default getRequestConfig(async () => {
|
|
const locales = ["en", "zh"];
|
|
const defaultLocale = "en";
|
|
|
|
const headersList = headers();
|
|
// 获取 cookie 中的语言设置
|
|
const cookieLanguage = headersList
|
|
.get("cookie")
|
|
?.split(";")
|
|
.map((cookie) => cookie.trim())
|
|
.find((cookie) => cookie.startsWith("language="))
|
|
?.split("=")[1];
|
|
// 如果 cookie 中有有效的语言设置,直接使用
|
|
if (cookieLanguage && locales.includes(cookieLanguage)) {
|
|
return {
|
|
locale: cookieLanguage,
|
|
messages: (await import(`../locales/${cookieLanguage}.json`)).default,
|
|
};
|
|
}
|
|
const acceptLanguage = headersList.get("accept-language") || "";
|
|
// 解析用户偏好的语言列表
|
|
const userLanguages = acceptLanguage
|
|
.split(",")
|
|
.map((lang) => {
|
|
const [language, weight = "q=1.0"] = lang.split(";");
|
|
return {
|
|
language: language.split("-")[0], // 只取主要语言代码
|
|
weight: parseFloat(weight.split("=")[1]),
|
|
};
|
|
})
|
|
.sort((a, b) => b.weight - a.weight);
|
|
|
|
// 查找第一个匹配的支持语言
|
|
const matchedLocale = userLanguages.find(({ language }) =>
|
|
locales.includes(language),
|
|
);
|
|
const locale = matchedLocale ? matchedLocale.language : defaultLocale;
|
|
return {
|
|
locale,
|
|
messages: (await import(`../locales/${locale}.json`)).default,
|
|
};
|
|
});
|