Created src/lib/i18n/locales.ts as single source of truth for: - SUPPORTED_LOCALES array - LOCALE_COOKIE name - DEFAULT_LOCALE - LOCALE_CONFIG (labels, flags, Saleor locale mapping) - Helper functions (isValidLocale, getSaleorLocale, getLocaleFromPath) Updated all files to use centralized constants: - middleware.ts - Header.tsx - ProductCard.tsx - sitemap.ts - root layout and locale layout - routing.ts Benefits: - Adding new locale only requires updating ONE file (locales.ts) - No more hardcoded locale lists scattered across codebase - Cookie name defined in one place - Type-safe locale validation
54 lines
1.6 KiB
TypeScript
54 lines
1.6 KiB
TypeScript
import { NextResponse } from "next/server";
|
|
import type { NextRequest } from "next/server";
|
|
import { SUPPORTED_LOCALES, DEFAULT_LOCALE, LOCALE_COOKIE, getLocaleFromPath } from "@/lib/i18n/locales";
|
|
|
|
const OLD_SERBIAN_PATHS = ["products", "about", "contact", "checkout"];
|
|
|
|
export default function middleware(request: NextRequest) {
|
|
const pathname = request.nextUrl.pathname;
|
|
const cookieLocale = request.cookies.get(LOCALE_COOKIE)?.value;
|
|
const acceptLanguage = request.headers.get("accept-language") || "";
|
|
|
|
if (pathname === "/" || pathname === "") {
|
|
let locale = DEFAULT_LOCALE;
|
|
|
|
if (cookieLocale && SUPPORTED_LOCALES.includes(cookieLocale as typeof SUPPORTED_LOCALES[number])) {
|
|
locale = cookieLocale;
|
|
} else if (acceptLanguage.includes("en")) {
|
|
locale = "en";
|
|
}
|
|
|
|
const url = request.nextUrl.clone();
|
|
url.pathname = `/${locale}`;
|
|
return NextResponse.redirect(url, 301);
|
|
}
|
|
|
|
const isOldSerbianPath = OLD_SERBIAN_PATHS.some(
|
|
(path) => pathname === `/${path}` || pathname.startsWith(`/${path}/`)
|
|
);
|
|
|
|
if (isOldSerbianPath) {
|
|
let locale = DEFAULT_LOCALE;
|
|
|
|
if (cookieLocale && SUPPORTED_LOCALES.includes(cookieLocale as typeof SUPPORTED_LOCALES[number])) {
|
|
locale = cookieLocale;
|
|
} else if (acceptLanguage.includes("en")) {
|
|
locale = "en";
|
|
}
|
|
|
|
const url = request.nextUrl.clone();
|
|
url.pathname = `/${locale}${pathname}`;
|
|
return NextResponse.redirect(url, 301);
|
|
}
|
|
|
|
return NextResponse.next();
|
|
}
|
|
|
|
export const config = {
|
|
matcher: [
|
|
"/",
|
|
"/(sr|en|de|fr)/:path*",
|
|
"/((?!api|_next|_vercel|.*\\..*).*)",
|
|
],
|
|
};
|