使用您最喜欢的AI助手总结文档,并引用此页面和AI提供商
版本历史
- 初始版本v7.0.62025/11/1
此页面的内容已使用 AI 翻译。
查看英文原文的最新版本如果您有改善此文档的想法,请随时通过在GitHub上提交拉取请求来贡献。
文档的 GitHub 链接复制文档 Markdown 到剪贴板
2025 年如何使用 next-i18next 国际化您的 Next.js 应用
目录
什么是 next-i18next?
next-i18next 是一个流行的 Next.js 应用国际化(i18n)解决方案。虽然最初的 next-i18next 包是为 Pages Router 设计的,但本指南将向您展示如何使用 i18next 和 react-i18next 直接在现代 App Router 中实现 i18next。
通过这种方法,您可以:
- 使用命名空间组织翻译(例如,
common.json、about.json),以更好地管理内容。 - 高效加载翻译,仅加载每个页面所需的命名空间,减少包大小。
- 支持服务器和客户端组件,实现正确的 SSR 和 hydration 处理。
- 确保 TypeScript 支持,提供类型安全的语言配置和翻译键。
- 通过适当的元数据、站点地图和 robots.txt 国际化优化 SEO。
作为替代方案,您也可以参考 next-intl 指南,或直接使用 Intlayer。
查看 next-i18next vs next-intl vs Intlayer 中的比较。
想了解这些库的由来,请阅读 JavaScript i18n 的发展史。
基准测试对 Next.js 上 next-i18next 的结论
在开始配置之前,了解 i18n 库对性能和 bundle 的影响非常重要。i18n 基准测试使用主流 i18n 库运行同一个 10 页面、10 种语言的 Next.js 应用,以测量真实的 bundle 体积、字符串泄漏和 hydration 开销。
指标
动态 JSON 加载
在运行时懒加载翻译
有作用域的 JSON (命名空间)
每页翻译命名空间
这个指标是什么?
国际化库包的总 gzip 压缩大小。它仅包含 tree-shaking 和压缩(minification)后的提供者(provider)和内容检索逻辑。
为什么这很重要?
较小的库大小可减少初始 JavaScript 负载,从而缩短客户端的下载和执行时间。
视图形式
next-i18next 在 Next.js 上的关键数据(gzip):
在弹窗中打开表格以清晰地查看所有数据
| 配置 | 库体积 | 页面 JS 平均值 | 其他语言泄漏 | 其他页面泄漏 |
|---|---|---|---|---|
| 基线(无 i18n) | - | 141.0 KB | 0.0% | 0.0% |
next-i18next | 19.7 KB | 169.5 KB | 50.0% | 89.8% |
@intlayer/next-i18next (compat) | 9.4 KB | 150.7 KB | 0.0% | 0.0% |
next-intlayer (原生 Intlayer) | 5.5 KB | 141.3 KB | 0.0% | 0.0% |
要点:
- 必须拆分 namespace: 在简单配置下,
next-i18next会把所有 namespace 发送到每个页面(约 89.8% 的页面泄漏)。按路由拆分 namespace 并进行 lazy loading 可以减少页面 JS,但需要细致的手动组织。 - runtime 体积:
i18next客户端 runtime 在每个页面上约 19.7 KB gzip。对于现有 codebase,兼容适配器@intlayer/next-i18next保留相同的i18nextAPI,同时将 runtime 缩小到 9.4 KB 并消除泄漏。原生next-intlayer则降至 5.5 KB。
查看完整数据:Next.js 基准测试报告,以及基准测试仓库。
Next.js 上的功能对比
在 Next.js App Router 项目通常需要的功能上,next-i18next 与 next-intl 和 Intlayer 的对比:
在弹窗中打开表格以清晰地查看所有数据
| 功能 | next-intlayer (Intlayer) | next-intl | next-i18next |
|---|---|---|---|
| 翻译靠近组件 | ✅ 内容与每个组件放在一起 | ❌ 集中式 JSON | ❌ 集中式 JSON |
| TypeScript 集成 | ✅ 自动生成的严格类型 | ✅ 良好,通过 AppConfig augmentation | ⚠️ 基础 |
| 缺失翻译检测 | ✅ TypeScript 错误和构建时警告 | ⚠️ 运行时回退 | ⚠️ 运行时回退 |
| 富内容(JSX、Markdown) | ✅ 直接支持 | ⚠️ 通过 t.rich 使用标签,不支持 Markdown | ⚠️ 通过 <Trans> 使用标签 |
| AI 翻译 | ✅ 使用你自己的服务商和 API 密钥,并带有应用上下文 | ❌ 无 | ❌ 无 |
| 可视化编辑器 / CMS | ✅ 本地可视化编辑器 + 可选 CMS | ❌ 通过外部平台 | ❌ 通过外部平台 |
| 本地化路由 | ✅ 内置(Next.js 和 Vite) | ✅ 内置 [locale] 路由段 | ✅ 内置 |
| 复数处理 | ✅ 基于枚举 | ✅ ICU | ✅ 基于后缀(_one、_other) |
| 格式化(日期、数字、货币) | ✅ 基于 Intl 的格式化工具 | ✅ useFormatter | ✅ 基于 Intl |
| 内容格式 | ✅ .ts, .tsx, .js, .json, .md, .yaml | ✅ .json, .js, .ts | ⚠️ .json |
| ICU MessageFormat | ✅ 通过 format: "icu" | ✅ 原生 | ⚠️ 通过 i18next-icu |
| SEO 辅助(hreflang、sitemap) | ✅ metadata、sitemap 和 robots.txt 辅助工具 | ✅ 良好 | ✅ 良好 |
| Server Components | ✅ 在任意 Server Component 中直接访问 | ⚠️ 每个组件传递 t 或 await getTranslations() | ⚠️ 沿组件树向下传递 t |
| 按组件 tree-shaking | ✅ 构建时(Babel / SWC) | ⚠️ 手动,每个路由使用 pick() | ⚠️ 手动,每个路由使用 namespace |
| Lazy loading | ✅ 按语言和按字典 | ✅ 按语言,namespace 需手动管理 | ✅ 按语言,namespace 需手动管理 |
| runtime 体积(gzip,基准测试) | 4.9 KB | 14.7 KB | 19.7 KB |
| CI 中的缺失翻译 | ✅ npx intlayer test | ⚠️ 未内置 | ⚠️ 未内置,运行时 saveMissing |
| 生态 / 社区 | ⚠️ 较小,增长迅速 | ✅ 大 | ✅ 非常大 |
runtime 体积数据来自 Next.js 基准测试。如需详细讨论,请阅读 next-i18next vs next-intl vs Intlayer。
您应该遵循的实践
在我们深入实现之前,以下是您应该遵循的一些实践:
- 设置 HTML 的
lang和dir属性 - 在布局中,使用
getLocaleDirection(locale)计算dir,并设置<html lang={locale} dir={dir}>,以确保正确的无障碍访问和 SEO。 - 按命名空间拆分消息
按照语言和命名空间(例如
common.json、about.json)组织 JSON 文件,只加载所需内容。 - 最小化客户端负载
在页面中,只向
NextIntlClientProvider发送所需的命名空间(例如,pick(messages, ['common', 'about']))。 - 优先使用静态页面 尽可能使用静态页面,以获得更好的性能和 SEO。
- 服务器组件中的国际化
服务器组件,如页面或所有未标记为
client的组件,都是静态的,可以在构建时预渲染。因此,我们需要将翻译函数作为 props 传递给它们。 - 设置 TypeScript 类型 确保您的 locales 在整个应用程序中实现类型安全。
- 重定向代理 使用代理来处理语言环境检测和路由,并将用户重定向到适当的带有语言前缀的 URL。
- 元数据、站点地图、robots.txt 的国际化
使用 Next.js 提供的
generateMetadata函数对元数据、站点地图和 robots.txt 进行国际化,以确保搜索引擎在所有语言环境中更好地发现您的内容。 - 本地化链接
使用
Link组件本地化链接,将用户重定向到适当的带有语言前缀的 URL。这对于确保您的页面在所有语言环境中的发现非常重要。 - 自动化测试和翻译 自动化测试和翻译有助于节省维护多语言应用程序的时间。
查看我们的文档,了解有关国际化和SEO的所有内容:使用 next-intl 进行国际化 (i18n)。
在 Next.js 应用中设置 i18next 的逐步指南
查看 GitHub 上的应用模板。
以下是我们将要创建的项目结构:
复制代码到剪贴板
安装依赖
使用 npm 安装必要的包:
bash复制代码复制代码到剪贴板
- i18next:核心国际化框架,负责翻译文件的加载和管理。
- react-i18next:i18next 的 React 绑定,提供如
useTranslation的钩子,适用于客户端组件。 - i18next-resources-to-backend:一个插件,支持动态加载翻译文件,只加载你需要的命名空间。
配置您的项目
创建一个配置文件来定义您支持的语言环境、默认语言环境以及用于 URL 本地化的辅助函数。该文件作为您的 i18n 设置的唯一可信来源,并确保整个应用程序中的类型安全。
集中管理语言环境配置可以防止不一致情况,并使未来添加或移除语言环境更加容易。辅助函数确保生成的 URL 在 SEO 和路由方面保持一致。
i18n.config.ts复制代码复制代码到剪贴板
集中管理翻译命名空间
为您的应用程序公开的每个命名空间创建一个单一的可信来源。重用此列表可以保持服务器、客户端和工具代码的同步,并为翻译辅助工具解锁强类型支持。
src/i18n.namespaces.ts复制代码复制代码到剪贴板
使用 TypeScript 强类型化翻译键
扩展
i18next指向您的规范语言文件(通常是英文)。TypeScript 会推断每个命名空间的有效键,因此对t()的调用会进行端到端的检查。src/types/i18next.d.ts复制代码复制代码到剪贴板
提示:将此声明存放在
src/types目录下(如果不存在,请创建该文件夹)。Next.js 已经在tsconfig.json中包含了src,因此该增强会被自动识别。如果没有,请在你的tsconfig.json文件中添加以下内容:tsconfig.json复制代码复制代码到剪贴板
有了这些配置,你就可以依赖自动补全和编译时检查:
tsx复制代码复制代码到剪贴板
设置服务器端 i18n 初始化
创建一个服务器端初始化函数,用于加载服务器组件的翻译。该函数为服务器端渲染创建一个独立的 i18next 实例,确保在渲染之前加载翻译内容。
服务器组件需要自己的 i18next 实例,因为它们运行在与客户端组件不同的上下文中。在服务器端预加载翻译可以防止未翻译内容的闪烁,并通过确保搜索引擎看到翻译内容来提升 SEO。
src/app/i18n/server.ts复制代码复制代码到剪贴板
创建客户端i18n提供者
创建一个客户端组件提供者,将你的应用包裹在i18next上下文中。该提供者接收从服务器预加载的翻译,防止未翻译内容闪烁(FOUC)并避免重复请求。
客户端组件需要自己的i18next实例,在浏览器中运行。通过接受服务器预加载的资源,我们确保无缝的hydration并防止内容闪烁。该提供者还动态管理语言切换和命名空间加载。
src/components/I18nProvider.tsx复制代码复制代码到剪贴板
定义动态语言路由
通过在你的 app 文件夹中创建一个
[locale]目录来设置语言的动态路由。这允许 Next.js 处理基于语言的路由,其中每个语言成为 URL 的一部分(例如/en/about,/fr/about)。使用动态路由使 Next.js 能够在构建时为所有语言生成静态页面,从而提升性能和 SEO。布局组件根据语言设置 HTML 的
lang和dir属性,这对于无障碍访问和搜索引擎理解至关重要。src/app/[locale]/layout.tsx复制代码复制代码到剪贴板
创建您的翻译文件
为每个 locale 和命名空间创建 JSON 文件。此结构允许您逻辑地组织翻译,并且只加载每个页面所需的内容。
通过按命名空间(例如
common.json、about.json)组织翻译,可以实现代码拆分并减少包大小。您只需加载每个页面所需的翻译,从而提升性能。src/locales/en/common.json复制代码复制代码到剪贴板
src/locales/fr/common.json复制代码复制代码到剪贴板
src/locales/en/home.json复制代码复制代码到剪贴板
src/locales/fr/home.json复制代码复制代码到剪贴板
src/locales/en/about.json复制代码复制代码到剪贴板
src/locales/fr/about.json复制代码复制代码到剪贴板
在页面中使用翻译
创建一个页面组件,在服务器端初始化 i18next,并将翻译传递给服务器和客户端组件。这确保了在渲染前加载翻译,防止内容闪烁。
服务器端初始化在页面渲染前加载翻译,提升 SEO 并防止 FOUC(无样式内容闪烁)。通过将预加载的资源传递给客户端提供者,避免重复获取,确保平滑的 hydration。
src/app/[locale]/about/index.tsx复制代码复制代码到剪贴板
在客户端组件中使用翻译
客户端组件可以使用
useTranslation钩子来访问翻译。该钩子提供对翻译函数和 i18n 实例的访问,允许你翻译内容并访问语言环境信息。客户端组件需要 React 钩子来访问翻译。
useTranslation钩子与 i18next 无缝集成,并在语言环境变化时提供响应式更新。确保页面/提供者只包含你需要的命名空间(例如
about)。
如果你使用 React 版本低于 19,记得对像Intl.NumberFormat这样的重型格式化器进行缓存。src/components/ClientComponent.tsx复制代码复制代码到剪贴板
在服务器组件中使用翻译
服务器组件不能使用 React hooks,因此它们通过 props 从父组件接收翻译内容。这种方式保持了服务器组件的同步性,并允许它们嵌套在客户端组件内部。
可能嵌套在客户端边界下的服务器组件需要保持同步。通过将翻译字符串和语言信息作为 props 传递,我们避免了异步操作,确保了正确的渲染。
src/components/ServerComponent.tsx复制代码复制代码到剪贴板
更改内容语言
可选在 Next.js 中更改内容语言,推荐的方式是使用带有区域设置前缀的 URL 和 Next.js 的链接。下面的示例从路由中读取当前区域设置,从路径名中剥离它,并为每个可用的区域设置渲染一个链接。
src/components/LocaleSwitcher.tsx复制代码复制代码到剪贴板
构建本地化的 Link 组件
可选在整个应用中重用本地化的 URL 可以保持导航的一致性并有利于 SEO。将
next/link包装在一个小的辅助函数中,该函数会为内部路由添加当前激活的 locale 前缀,同时保持外部 URL 不变。src/components/LocalizedLink.tsx复制代码复制代码到剪贴板
提示:由于
LocalizedLink是一个即插即用的替代方案,可以通过交换导入并让组件处理特定语言环境的 URL 来逐步迁移。在服务器操作中访问当前语言环境
可选服务器操作通常需要当前语言环境来处理邮件、日志记录或第三方集成。将代理设置的语言环境 cookie 与
Accept-Language头部结合使用,作为回退方案。src/app/actions/get-current-locale.ts复制代码复制代码到剪贴板
由于该辅助工具依赖于 Next.js 的 cookies 和 headers,因此它适用于路由处理程序、服务器操作以及其他仅限服务器的上下文。
国际化您的元数据
可选翻译内容很重要,但国际化的主要目标是让您的网站在全球范围内更具可见性。I18n 是通过适当的 SEO 提升网站可见性的强大杠杆。
正确国际化的元数据有助于搜索引擎理解您的页面支持哪些语言。这包括设置 hreflang 元标签、翻译标题和描述,以及确保为每个语言环境正确设置规范 URL。
以下是关于多语言 SEO 的一些最佳实践列表:
- 在
<head>标签中设置 hreflang 元标签,帮助搜索引擎了解页面支持的语言 - 在 sitemap.xml 中使用
http://www.w3.org/1999/xhtmlXML 规范列出所有页面翻译 - 不要忘记在 robots.txt 中排除带有前缀的页面(例如
/dashboard、/fr/dashboard、/es/dashboard) - 使用自定义 Link 组件重定向到最本地化的页面(例如,法语中
<a href="/fr/about">À propos</a>)
开发者经常忘记正确地跨语言引用他们的页面。让我们来修正这个问题:
src/app/[locale]/about/layout.tsx复制代码复制代码到剪贴板
- 在
国际化您的网站地图
可选生成包含所有本地版本页面的网站地图。这有助于搜索引擎发现并索引您内容的所有语言版本。
一个正确国际化的网站地图确保搜索引擎能够找到并索引您所有语言版本的页面。这提升了在国际搜索结果中的可见度。
src/app/sitemap.ts复制代码复制代码到剪贴板
国际化您的robots.txt
可选创建一个 robots.txt 文件,正确处理所有受保护路由的所有语言版本。这确保搜索引擎不会索引任何语言的管理员或仪表盘页面。
为所有语言正确配置 robots.txt 可以防止搜索引擎索引任何语言的敏感页面。这对于安全和隐私至关重要。
src/app/robots.ts复制代码复制代码到剪贴板
设置用于区域路由的中间件
可选创建一个代理,自动检测用户的首选语言环境,并将其重定向到相应的带有语言前缀的URL。这可以通过显示用户首选语言的内容来提升用户体验。
中间件确保用户访问您的网站时会自动重定向到其首选语言。它还会将用户的偏好保存在cookie中,以便未来访问时使用。
src/proxy.ts复制代码复制代码到剪贴板
使用 Intlayer 自动化您的翻译
可选Intlayer 是一个免费且开源的库,旨在协助您应用中的本地化流程。虽然 i18next 负责翻译的加载和管理,Intlayer 则帮助自动化翻译工作流。
手动管理翻译既耗时又容易出错。Intlayer 自动化了翻译的测试、生成和管理,节省您的时间并确保整个应用程序的一致性。
Intlayer 允许您:
在代码库中任意位置声明您的内容
Intlayer 允许您使用.content.{ts|js|json}文件在代码库中任意位置声明内容。这将帮助更好地组织内容,确保代码库的可读性和可维护性。测试缺失的翻译
Intlayer 提供测试功能,可以集成到您的 CI/CD 流水线或单元测试中。了解更多关于测试您的翻译。自动化您的翻译
Intlayer 提供了一个 CLI 和一个 VSCode 扩展来自动化您的翻译流程。它可以集成到您的 CI/CD 管道中。了解更多关于自动化您的翻译。
您可以使用您自己的 API 密钥和您选择的 AI 提供商。它还提供上下文感知的翻译,详见填充内容。连接外部内容
Intlayer 允许您将内容连接到外部内容管理系统(CMS)。以优化的方式获取内容并将其插入到您的 JSON 资源中。了解更多关于获取外部内容。可视化编辑器
Intlayer 提供免费的可视化编辑器,使用可视化编辑器编辑您的内容。了解更多关于可视化编辑您的翻译。
以及更多功能。要发现 Intlayer 提供的所有功能,请参阅Intlayer 的优势文档。
有关详细的性能基准测试和对比,请参阅:
评论
暂无评论。成为第一个分享您想法的人吧。
