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(); }