83 lines
2.7 KiB
TypeScript
83 lines
2.7 KiB
TypeScript
import { NextResponse } from "next/server";
|
|
import type { NextRequest } from "next/server";
|
|
|
|
export function middleware(request: NextRequest) {
|
|
const response = NextResponse.next();
|
|
const acceptLanguage = request.headers.get("accept-language");
|
|
|
|
// تعیین کیفیت زبانها
|
|
const languageQuality: { [key: string]: number } = {
|
|
fa: 0, // وزن برای زبان فارسی
|
|
en: 0, // وزن برای زبان انگلیسی
|
|
};
|
|
|
|
let defaultLocale = "en"; // مقدار پیشفرض زبان انگلیسی
|
|
|
|
// بررسی هدر Accept-Language
|
|
if (acceptLanguage) {
|
|
const languages = acceptLanguage.split(",").map((lang) => lang.trim());
|
|
|
|
// بررسی اولویت زبانها
|
|
for (const lang of languages) {
|
|
const [language, quality] = lang.split(";"); // زبان و کیفیت
|
|
const trimmedLanguage = language.trim();
|
|
|
|
// اگر کیفیت مشخص شده باشد
|
|
const langQuality = quality ? parseFloat(quality.split("=")[1]) : 1; // کیفیت را به عدد تبدیل کنید یا 1 فرض کنید
|
|
|
|
// بررسی وجود زبان در languageQuality و مقایسه با defaultLocale
|
|
if (languageQuality.hasOwnProperty(trimmedLanguage)) {
|
|
languageQuality[trimmedLanguage] = langQuality; // تنظیم کیفیت
|
|
}
|
|
}
|
|
|
|
// انتخاب زبان با بالاترین کیفیت
|
|
for (const [lang, quality] of Object.entries(languageQuality)) {
|
|
if (quality > languageQuality[defaultLocale]) {
|
|
defaultLocale = lang; // زبان با کیفیت بیشتر انتخاب میشود
|
|
}
|
|
}
|
|
}
|
|
|
|
// ذخیره کوکیها
|
|
const selectedLocale = request.cookies.get("selectedLocale");
|
|
|
|
if (selectedLocale && selectedLocale.value !== "") {
|
|
response.cookies.set("defaultLocale", selectedLocale.value, {
|
|
path: "/",
|
|
httpOnly: false,
|
|
});
|
|
} else {
|
|
response.cookies.set("defaultLocale", defaultLocale, {
|
|
path: "/",
|
|
httpOnly: false,
|
|
});
|
|
}
|
|
|
|
return response;
|
|
}
|
|
|
|
export const config = {
|
|
matcher: [
|
|
{
|
|
source: "/((?!api|_next/static|_next/image|favicon.ico).*)",
|
|
missing: [
|
|
{ type: "header", key: "next-router-prefetch" },
|
|
{ type: "header", key: "purpose", value: "prefetch" },
|
|
],
|
|
},
|
|
{
|
|
source: "/((?!api|_next/static|_next/image|favicon.ico).*)",
|
|
has: [
|
|
{ type: "header", key: "next-router-prefetch" },
|
|
{ type: "header", key: "purpose", value: "prefetch" },
|
|
],
|
|
},
|
|
{
|
|
source: "/((?!api|_next/static|_next/image|favicon.ico).*)",
|
|
has: [{ type: "header", key: "x-present" }],
|
|
missing: [{ type: "header", key: "x-missing", value: "prefetch" }],
|
|
},
|
|
],
|
|
};
|