import { createServerClient } from '@supabase/ssr' import { NextResponse, type NextRequest } from 'next/server' import { locales, defaultLocale } from './src/i18n/config' 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', }); } const supabase = createServerClient( process.env.NEXT_PUBLIC_SUPABASE_URL!, process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!, { cookies: { get(name: string) { return request.cookies.get(name)?.value }, set(name: string, value: string, options: any) { request.cookies.set({ name, value, ...options, }) response = NextResponse.next({ request: { headers: request.headers, }, }) response.cookies.set({ name, value, ...options, }) }, remove(name: string, options: any) { request.cookies.set({ name, value: '', ...options, }) response = NextResponse.next({ request: { headers: request.headers, }, }) response.cookies.set({ name, value: '', ...options, }) }, }, } ) await supabase.auth.getUser() return response } export const config = { matcher: [ '/((?!_next/static|_next/image|favicon.ico|.*\\.(?:svg|png|jpg|jpeg|gif|webp)$).*)', ], }