parsaaghayi-front/src/middleware.ts
2024-10-23 19:05:31 +03:30

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" }],
},
],
};