You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Next.js 14 App Router i18n配置:根路径404问题求助

Next.js 14 App Router 本地化根路径默认配置方案

核心思路

通过中间件路由改写/重定向配合动态语言路由,让根路径/默认映射到英文版本,同时保留/en和/de的独立访问能力。


1. 配置中间件(处理根路径路由)

在项目根目录创建middleware.ts(与app文件夹同级),用来拦截路由并处理默认语言跳转:

import { NextResponse } from 'next/server';
import type { NextRequest } from 'next/server';

const SUPPORTED_LANGS = ['en', 'de'];
const DEFAULT_LANG = 'en';

export function middleware(request: NextRequest) {
  // 根路径直接改写路由,显示英文版本内容(URL保持/不变)
  if (request.nextUrl.pathname === '/') {
    return NextResponse.rewrite(new URL(`/${DEFAULT_LANG}`, request.url));
  }

  // 校验路径中的语言前缀,非法前缀重定向到默认语言
  const lang = request.nextUrl.pathname.split('/')[1];
  if (!SUPPORTED_LANGS.includes(lang)) {
    return NextResponse.redirect(new URL(`/${DEFAULT_LANG}${request.nextUrl.pathname}`, request.url));
  }

  return NextResponse.next();
}

// 指定中间件作用范围
export const config = {
  matcher: ['/', '/:lang*'],
};

2. 调整路由结构

将原有的app/en和app/de目录内容迁移到动态路由app/[lang]下,结构如下:

app/
  [lang]/
    layout.tsx   // 语言切换逻辑
    page.tsx     // 页面内容
  layout.tsx     // 根布局
  i18n.ts        // i18n配置文件

3. 配置i18n实例

在app/i18n.ts中初始化i18n,适配路由语言检测:

import i18n from 'i18next';
import { initReactI18next } from 'react-i18next';
import LanguageDetector from 'i18next-browser-languagedetector';
import resourcesToBackend from 'i18next-resources-to-backend';

i18n
  .use(LanguageDetector)
  .use(initReactI18next)
  // 动态加载对应语言的翻译文件
  .use(resourcesToBackend((lang: string) => import(`../public/locales/${lang}/translation.json`)))
  .init({
    fallbackLng: 'en',
    debug: false,
    interpolation: { escapeValue: false },
    // 优先从URL路径检测语言
    detection: {
      order: ['path', 'cookie', 'navigator'],
      lookupFromPathIndex: 0,
    },
  });

export default i18n;

4. 语言布局组件(app/[lang]/layout.tsx)

在动态路由的布局中处理语言切换:

'use client';

import { useEffect } from 'react';
import i18n from '../i18n';

export default function LanguageLayout({
  params: { lang },
  children,
}: {
  params: { lang: string };
  children: React.ReactNode;
}) {
  useEffect(() => {
    if (i18n.language !== lang) {
      i18n.changeLanguage(lang);
    }
  }, [lang]);

  return <>{children}</>;
}

5. 翻译文件准备

在public/locales下创建对应语言的翻译文件:

  • public/locales/en/translation.json
{
  "welcome": "Welcome to the English version!"
}
  • public/locales/de/translation.json
{
  "welcome": "Willkommen zur deutschen Version!"
}

6. 页面组件示例(app/[lang]/page.tsx)

'use client';

import { useTranslation } from 'react-i18next';

export default function Home({ params: { lang } }: { params: { lang: string } }) {
  const { t } = useTranslation();

  return (
    <main>
      <h1>{t('welcome')}</h1>
      <p>Current language: {lang}</p>
    </main>
  );
}

验证效果

  • 访问/:显示英文内容(URL保持/不变,若要URL跳转成/en,可将middleware中的rewrite改为redirect)
  • 访问/en:显示英文内容
  • 访问/de:显示德文内容

内容的提问来源于stack exchange,提问作者Samira

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 11:15:13