mirror of
https://github.com/Sonny93/my-links.git
synced 2025-12-09 15:05:35 +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();
|
|
}
|