import { NextResponse, type NextRequest } from 'next/server' import { locales, defaultLocale } from './src/i18n/config' import { auth } from './src/lib/auth' function getLocaleFromHeaders(acceptLanguage: string | null): string { if (!acceptLanguage) return defaultLocale; const languages = acceptLanguage .split(',') .map(lang => lang.split(';')[0].trim().toLowerCase()); // Check for exact matches first for (const lang of languages) { if (locales.includes(lang as any)) { return lang; } } // Check for language prefix matches (e.g., 'zh-CN' -> 'zh') for (const lang of languages) { const prefix = lang.split('-')[0]; if (locales.includes(prefix as any)) { return prefix; } } return defaultLocale; } export async function middleware(request: NextRequest) { let response = NextResponse.next({ request: { headers: request.headers, }, }) // Handle locale detection and cookie setting const currentLocale = request.cookies.get('locale')?.value; const acceptLanguage = request.headers.get('accept-language'); if (!currentLocale) { const detectedLocale = getLocaleFromHeaders(acceptLanguage); response.cookies.set('locale', detectedLocale, { maxAge: 60 * 60 * 24 * 365, // 1 year httpOnly: false, secure: process.env.NODE_ENV === 'production', sameSite: 'lax', }); } // Better Auth session check try { await auth.api.getSession({ headers: request.headers }) } catch (error) { // Session validation failed, but we continue console.debug('Session validation failed in middleware:', error) } return response } export const config = { matcher: [ '/((?!_next/static|_next/image|favicon.ico|.*\\.(?:svg|png|jpg|jpeg|gif|webp)$).*)', ], }