mirror of
https://github.com/Sonny93/my-links.git
synced 2025-12-08 14:43:24 +00:00
48 lines
1.5 KiB
TypeScript
48 lines
1.5 KiB
TypeScript
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();
|
|
}
|