中间件

关于为您的应用程序添加国际化(i18n)中间件路由的分步指南

概述

本指南将带你一步步在你的 Next.js 应用中,使用 gt-next 内置的中间件添加 i18n 中间件路由和本地化路径。

什么是 i18n 中间件路由?

为每种语言创建新的路由有助于让你的网站更加友好,并提升 SEO 效果。 i18n 路由允许你将特定的 URL 与不同的语言环境关联起来。 例如,你可以为英文使用 /en/airplanes,为中文使用 /zh/airplanes,以此类推。

你还可以通过本地化路径进一步提升体验。 本地化路径是 i18n 路由的扩展,允许你为某个语言环境指定一个别名路径。 例如,你可以为英文指定 /en/airplanes,为中文指定 /zh/飞机,以此类推。


设置 i18n 路由

我们将带你通过两个简单的步骤,为你的 Next.js 应用添加 i18n 路由:

在你的 app 文件夹中添加一个动态路由。

创建 middleware 文件。

步骤 1:添加动态路由

在你的 app 文件夹中插入一个名为 [locale] 的目录(例如,app/[locale])。 将你所有的页面和布局都放在这个目录下。

middleware.js
layout.js
page.js
next.config.js

确保 app/ 目录下的所有特殊文件都嵌套在 app/[locale] 下。

步骤 2:添加 middleware 文件

在 Next.js 中,在根目录下创建一个名为 middleware.js(如果你使用 TypeScript,则为 .ts)的文件。 如果你使用 src/ 文件夹,请将其放在 src/middleware.js(或 .ts)中。 在文件中添加 createNextMiddleware() 函数。

middleware.js
import { createNextMiddleware } from 'gt-next/middleware'

export default createNextMiddleware();

export const config = {
  matcher: [
    /*
      * Match all request paths except for the ones starting with:
      * - api (API routes)
      * - _next (internal files)
      * - static files
      */
    "/((?!api|static|.*\\..*|_next).*)",
  ],
}

设置本地化路径

你可以通过中间件文件中的 pathConfig 选项来指定本地化路径。

middleware.js
export default createNextMiddleware({
  pathConfig: {
    // You can specify a shared path (optional)
    // This will create "/en/about" and "/zh/about"
    "/about": "/about",

    // Specify localized paths
    // This will create "/en/airplanes" and "/zh/飞机"
    "/airplanes": {
      "zh": "/飞机",
    }

    // Add dynamic path parameters
    // This will create "/en/airports/123" and "/zh/飞机机场/123"
    "/airports/[id]": {
      "zh": "/飞机机场/[id]",
    }
  },
});

在这个示例中,我们为 /en/about 创建了一个默认路径,并为 /en/airplanes/en/airports/[id] 创建了本地化路径。 在中文中,这些路径将分别被映射为 /zh/about/zh/飞机/zh/飞机机场/[id]

提示: 由于 /about 路径在所有语言环境下都保持不变,你无需在 pathConfig 对象中包含它。 任何未在 pathConfig 对象中指定的路径,将会在所有语言环境下使用相同的路径,并带有语言前缀。


路由行为

默认语言前缀

默认情况下,你的 defaultLocale(即应用的默认语言)在网址中不会带有语言代码前缀。 例如,如果你的默认语言是 en,并且你有一个页面在 /about,那么英文页面将通过 /about 访问。 然而,在中文中,该页面将通过 /zh/about 访问。

如果你不希望有这种行为,可以在中间件配置中将 prefixDefaultLocale 设置为 false 来禁用。

语言检测与重定向

中间件会根据以下顺序检测用户的语言:(1) url 路径中的语言,(2) 来源页面的语言,(3) 浏览器的首选语言,(4) 最后是 defaultLocale。 然后,用户会被相应地重定向。

首先总是从 url 路径中检查语言。 这意味着如果你访问 /zh/about,你的语言会被认为是中文。

如果你访问的页面没有语言前缀,中间件会检查用户之前的语言。 例如,如果你在 /zh,然后访问 /about,你的语言会被认为是中文,并且你会被重定向到 /zh/about

如果以上都不可用,则会回退到用户浏览器的语言。 比如,如果某人的首选语言是中文,并且他们第一次访问 /about,他们会被重定向到 /zh/about

如果以上条件都不满足,则会使用 defaultLocale 作为回退。

如果某个页面存在本地化版本,用户会被重定向到本地化的 url。 例如,/zh/airplanes 总是会重定向到 /zh/飞机

边缘情况:没有语言前缀的本地化路径

如果你访问一个没有语言前缀的本地化路径(例如 /飞机),中间件会根据它认为你当前的语言为该路径加上前缀。

例如,访问 /飞机 只有在中间件明确识别你的语言为 zh 时才会重定向到 /zh/飞机。 这很好,但只在中间件认为你的语言是 zh 时有效。

否则,你的路径会加上你当前的语言前缀。 例如,如果中间件认为你的语言是 en,访问 /飞机 会重定向到 /en/飞机。 这将导致 404。

我们建议在项目中的任何链接都始终使用 defaultLocale 的路径。 这样总会自动重定向到正确的本地化路径。

<Link href="/about">About</Link>
<Link href="/planes">Planes</Link>
<Link href="/airports/123">Airport 123</Link>

如果你想明确链接到其他语言,可以使用本地化路径来实现。

<Link href="/zh/about">About in Chinese</Link>
<Link href="/zh/飞机">Planes in Chinese</Link>
<Link href="/zh/飞机机场/123">Airport 123 in Chinese</Link>

注意事项

  • i18n 路由会改变应用程序的 URL 结构。每种语言都有自己的 URL。
  • 需要 middleware 文件来处理路由逻辑。
  • 你可以在 middleware 配置和 next 配置文件中指定支持的语言环境。

后续步骤

这份指南怎么样?