import acceptLanguage from "accept-language"; import { NextResponse } from "next/server"; import { i18n } from "./next-i18next.config"; acceptLanguage.languages(i18n.locales); export const config = { matcher: ["/((?!api|_next/static|_next/image|assets|favicon.ico|sw.js).*)"], }; const cookieName = "i18next"; // Source : https://github.com/i18next/next-app-dir-i18next-example/blob/3d653a46ae33f46abc011b6186f7a4595b84129f/middleware.js export function middleware(req) { if ( req.nextUrl.pathname.indexOf("icon") > -1 || req.nextUrl.pathname.indexOf("chrome") > -1 ) return NextResponse.next(); let lng; if (req.cookies.has(cookieName)) lng = acceptLanguage.get(req.cookies.get(cookieName).value); if (!lng) lng = acceptLanguage.get(req.headers.get("Accept-Language")); if (!lng) lng = i18n.defaultLocale; // Redirect if lng in path is not supported if ( !i18n.locales.some((loc) => req.nextUrl.pathname.startsWith(`/${loc}`)) && !req.nextUrl.pathname.startsWith("/_next") ) { return NextResponse.redirect( new URL(`/${lng}${req.nextUrl.pathname}`, req.url), ); } if (req.headers.has("referer")) { const refererUrl = new URL(req.headers.get("referer")); const lngInReferer = i18n.locales.find((l) => refererUrl.pathname.startsWith(`/${l}`), ); const response = NextResponse.next(); if (lngInReferer) response.cookies.set(cookieName, lngInReferer); return response; } return NextResponse.next(); }