Files
wr.do/i18n/request.ts
2025-06-05 16:25:15 +08:00

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