diff --git a/packages/site/app/page.tsx b/packages/site/app/page.tsx new file mode 100644 index 0000000..cbde5a4 --- /dev/null +++ b/packages/site/app/page.tsx @@ -0,0 +1,11 @@ +import { redirect } from 'next/navigation'; + +/** + * Root page - redirects are handled by proxy.ts middleware + * This page should never actually render as the middleware intercepts and redirects + * But Next.js requires a page component for the route to be recognized + */ +export default function RootPage() { + // Fallback redirect if middleware didn't handle it + redirect('/en/docs'); +} diff --git a/packages/site/proxy.ts b/packages/site/proxy.ts index 7307cc8..905305c 100644 --- a/packages/site/proxy.ts +++ b/packages/site/proxy.ts @@ -1,10 +1,36 @@ import { createI18nMiddleware } from 'fumadocs-core/i18n/middleware'; import { i18n } from '@/lib/i18n'; +import { NextResponse, NextRequest, NextFetchEvent } from 'next/server'; -export default createI18nMiddleware(i18n); +// Create fumadocs middleware +const fumadocsMiddleware = createI18nMiddleware(i18n); + +export default function proxy(request: NextRequest, event: NextFetchEvent) { + const path = request.nextUrl.pathname; + + // Handle root path separately with custom language detection + if (path === '/') { + const acceptLanguage = request.headers.get('accept-language') || ''; + + // Simple language detection: check if zh is in Accept-Language + if (acceptLanguage.toLowerCase().includes('zh')) { + // Redirect to Chinese docs + const url = request.nextUrl.clone(); + url.pathname = '/cn/docs'; + return NextResponse.redirect(url); + } else { + // Redirect to default language (English) + const url = request.nextUrl.clone(); + url.pathname = '/en/docs'; + return NextResponse.redirect(url); + } + } + + // For all other paths, pass through to fumadocs middleware + return fumadocsMiddleware(request, event); +} export const config = { // Matcher ignoring `/_next/` and `/api/` - // You may need to adjust it to ignore static assets in `/public` folder matcher: ['/((?!api|_next/static|_next/image|favicon.ico|logo.svg).*)'], };