使用您最喜欢的AI助手总结文档,并引用此页面和AI提供商
版本历史
- "更新 Solid useIntlayer API 用法以直接访问属性"v8.9.02026/5/4
- "Update compiler options, add FilePathPattern support"v8.2.02026/3/9
- "初始版本"v8.1.62026/2/23
如果您有改善此文档的想法,请随时通过在GitHub上提交拉取请求来贡献。
文档的 GitHub 链接复制文档 Markdown 到剪贴板
如何将现有的 Next.js 应用程序多语言化 (i18n) (i18n 指南 2026)
在 GitHub 上查看应用程序模板。
目录
为什么对现有应用程序进行国际化会很困难?
如果您曾经尝试向仅为单语言构建的应用程序中添加多种语言,您就会明白其中的痛苦。这不仅仅是“困难”,而是非常繁琐。您必须检查每个文件,找出每一个文本字符串,并将它们移动到单独的字典文件中。
接下来才是冒险的部分:用代码钩子替换所有文本,同时保证不破坏布局或逻辑。这类工作往往会让新功能的开发停滞数周,感觉像是一场无止境的重构。
什么是 Intlayer 编译器?
Intlayer 编译器旨在规避这种繁琐的手动工作。您无需手动提取字符串,编译器会为您完成。它会扫描您的代码,找到文本,并使用 AI 在后台生成字典。 然后,在构建步骤期间,它会修改您的源代码以注入必要的 i18n 钩子。基本上,您可以像写单语言应用一样继续编写您的应用,而编译器会自动原生处理多语言转换。
编译器文档:/doc/compiler
限制
由于编译器在编译时执行代码分析和转换(注入钩子和生成字典),因此它可能会减慢应用程序的构建时间。
为了限制在活跃开发过程(dev 模式)中的影响,您可以将编译器设置为 'build-only' 模式,或在不需要时将其禁用。
在 Next.js 应用程序中设置 Intlayer 的分步指南
安装依赖项
使用您偏好的包管理器安装必要的包:
bash复制代码复制代码到剪贴板
--interactive标志是可选的。如果您是 AI 代理,请使用intlayer-cli init。该命令将检测您的环境并安装所需的软件包。例如:
bash复制代码复制代码到剪贴板
配置您的项目
创建一个配置文件来定义应用程序的语言:
intlayer.config.ts复制代码复制代码到剪贴板
注意:请确保您在环境变量中设置了
OPEN_AI_API_KEY。通过此配置文件,您可以设置本地化的 URL、代理重定向、cookie 映射、内容声明的位置和扩展名、在控制台中禁用 Intlayer 日志等等。有关可用参数的完整列表,请参阅配置文档。
配置 Babel
Intlayer 编译器需要 Babel 来提取和优化您的内容。更新您的
babel.config.js(或babel.config.json)以包含 Intlayer 插件:babel.config.js复制代码复制代码到剪贴板
页面中的语言环境检测
清空
RootLayout的内容,并将其替换为以下示例:src/app/layout.tsx复制代码复制代码到剪贴板
声明您的内容(自动)
启用编译器后,您不再需要手动声明内容字典(例如
.content.ts文件)。相反,您只需在代码中以硬编码字符串的形式写入您的内容。Intlayer 会扫描源代码,使用配置的 AI 提供商生成翻译,并在构建编译期间自动将这些字符串替换为本地化内容。这一切都是完全自动化的。
只需在组件中使用默认语言环境的硬编码字符串,让 Intlayer 编译器处理剩下的工作。
page.tsx可能看起来像这样:src/app/page.tsx复制代码复制代码到剪贴板
i18n/page-content.content.tsx复制代码复制代码到剪贴板
src/app/page.tsx复制代码复制代码到剪贴板
IntlayerProvider在根布局中装载一次。它为服务器和客户端组件都提供语言环境,因此页面不再需要自行包装。- 没有
[locale]路径段时,语言环境总是来自请求 — 由 Intlayer 代理设置的x-intlayer-locale标头,然后是语言环境 cookie — 当提供者未运行时,服务器钩子会自行读取这些值。
src/app/page.tsx复制代码复制代码到剪贴板
IntlayerClientProvider用于在客户端向子组件提供语言环境。而
IntlayerServerProvider用于在服务器端向子组件提供语言环境。Layout and page cannot share a common server context because the server context system is based on a per-request data store (via React's cache mechanism), causing each "context" to be re-created for different segments of the application. Placing the provider in a shared layout would break this isolation, preventing the correct propagation of the server context values to your server components.
填写缺失的翻译
可选Intlayer 提供了一个 CLI 工具来帮助您填写缺失的翻译。您可以使用
intlayer命令来测试并从您的代码中填写缺失的翻译。bash复制代码复制代码到剪贴板
bash复制代码复制代码到剪贴板
有关更多详细信息,请参阅 CLI 文档
更改内容语言环境
可选在 Next.js 中更改内容语言环境的最推荐方法是使用
Link组件将用户重定向到包含相应语言环境的路由。这将利用 Next.js 的预取功能,并避免页面强制刷新。src/components/localeSwitcher/LocaleSwitcher.tsx复制代码复制代码到剪贴板
另一种方法是使用
useLocale钩子提供的setLocale函数。该函数不支持页面预取。有关更多详细信息,请查看useLocale钩子文档。优化包体积
可选使用
next-intlayer时,字典默认会包含在每个页面的包中。为了优化包体积,Intlayer 提供了一个可选的 SWC 插件,它利用宏智能地优化useIntlayer调用。这确保了字典仅包含在实际使用它们的页面的包中。@intlayer/babel插件已经集成了打包优化(见babel.config.js)。但是@intlayer/swc插件性能更好。如果你移除@intlayer/babel插件,你可以使用@intlayer/swc插件。要启用此优化,请安装
@intlayer/swc包。安装后,next-intlayer会自动检测并使用该插件:bash复制代码复制代码到剪贴板
注意:此优化仅适用于 Next.js 13 及以上版本。
注意:由于 Next.js SWC 插件仍处于试验阶段,该包默认未安装。未来可能会有所改变。
注意:如果您设置了
importMode: 'dynamic'或importMode: 'fetch'(在字典配置中),它将依赖于 Suspense,因此您需要将useIntlayer调用包裹在Suspense边界内。这意味着您无法直接在页面/布局组件的顶层使用useIntlayer。提取组件内容
可选如果您有现有的代码库,转换数千个文件可能会非常耗时。
为了简化此过程,Intlayer 提出了 编译器 / 提取器 来转换您的组件并提取内容。
要进行设置,您可以在
intlayer.config.ts文件中添加compiler部分:intlayer.config.ts复制代码复制代码到剪贴板
import { type IntlayerConfig } from "intlayer"; const config: IntlayerConfig = { // ... 您的其他配置 compiler: { /** * 指示是否应启用编译器。 */ enabled: true, /** * 定义输出文件路径 */ output: ({ fileName, extension }) => `./${fileName}${extension}`, /** * 指示在转换后是否应保存组件。这样,编译器只需运行一次即可转换应用程序,然后即可将其删除。 */ saveComponents: false, /** * 字典键前缀 */ dictionaryKeyPrefix: "", }, }; export default config;运行提取器以转换组件并提取内容
bash复制代码复制代码到剪贴板
Since v9, the
intlayerCompileris included in theintlayerplugin. So you don't need to add it manually.bash复制代码复制代码到剪贴板
babel.config.js复制代码复制代码到剪贴板
bash复制代码复制代码到剪贴板
TypeScript 配置
Intlayer 使用模块扩展 (module augmentation) 来利用 TypeScript 的优势并使您的代码库更加健壮。


确保您的 TypeScript 配置包含自动生成的类型。
复制代码到剪贴板
Git 配置
建议忽略 Intlayer 生成的文件。这可以避免将它们提交到您的 Git 存储库中。
为此,您可以在 .gitignore 文件中添加以下指令:
复制代码到剪贴板
VS Code 扩展
为了提升使用 Intlayer 的开发体验,您可以安装官方 Intlayer VS Code 扩展。
该扩展提供:
- 翻译键的自动补全。
- 缺失翻译的实时错误检测。
- 翻译内容的内联预览。
- 轻松创建和更新翻译的快速操作 (Quick actions)。
阅读 Intlayer VS Code 扩展文档 以了解更多关于扩展使用的详细说明。
进一步深入
您可以实现 可视化编辑器 或使用 CMS 来实现内容的外部管理。
常见问题
next.config.js 中的 i18n 字段不适用于 App Router,因此国际化层始终需要选择第三方库:
next-intl、next-i18next/i18next和react-intl:按命名空间加载 JSON 或 ICU 目录,在每个调用处手动编写键名。Lingui:基于提取驱动,在构建时编译 ICU 消息。Intlayer:在构建时直接从组件中提取编译内容,完全类型安全,并配有 AI 翻译、可视化编辑器和 CMS。
本指南采用编译器方案,您可以继续在组件中编写普通的字符串,字典会自动为您生成。请参阅 为什么选择 Intlayer 和 Next.js i18n 性能基准。
远少于基于命名空间的方案,因为页面永远不会下载它不渲染的语言目录。Server Components 在服务端直接解析其内容,构建时编译器将 useIntlayer 调用替换为组件使用的确切字典条目,因此未使用的键和未使用的语言都会被自动丢弃,并且 动态字典 会按语言环境拆分剩余内容。与常规替代方案相比,Intlayer 可将 bundle 和页面体积减少高达 50%。请参阅 Bundle 体积优化 和 性能基准。
可以,有两条迁移路径。您可以使用 next-intl 迁移指南 或 i18next 迁移指南 逐步迁移内容。或者,您可以完全保留当前的 API:兼容性适配器 公开与 next-intl、react-i18next 和 react-intl 完全相同的 API,但底层由 Intlayer 字典驱动,因此只需更改导入语句,组件代码完全无需修改。
可以。JSON 同步插件 将您的 /messages/{locale}/{namespace}.json 文件作为单一真实来源(source of truth),并双向生成 Intlayer 字典。PO 同步插件 对 gettext 目录执行相同的操作,而 按语言环境组织的文件 允许您按语言拆分内容,而不是将所有语言打包到一个文件中。
不需要,这正是本指南所配置的内容。您只需在默认语言环境中使用普通文本编写组件,Intlayer Compiler 会在每次构建时扫描源码,提取面向用户的文本并生成字典,因此无需手动创建或维护任何键。
有两个限制值得了解:编译器通过静态分析工作,因此仅在运行时存在的字符串(如 API 错误代码或 CMS 字段)无法被捕获,仍需显式声明字典;此外它需要区分用户文本和应用程序逻辑(如 className="active" 或状态代码),在大型代码库中需要少量注解。
如果您希望保留完全掌控权,npx intlayer extract 可以对您选定的文件执行单次提取,并在每个组件旁边生成 .content 文件供您审查。请参阅 extract 命令。
共有 5 个工具,均为可选:
- VS Code 扩展:从
useIntlayer键跳转到声明它的内容文件,从组件中提取内容,并从命令面板或专属的 Intlayer 选项卡运行 build、fill、test、push 和 pull。 - LSP 服务器:在任何支持 LSP 的编辑器中提供相同的感知能力,支持跳转到定义、查找所有引用、悬停预览翻译值、键和字段的自动补全,以及在键未声明时发出警告。它还可以解析
i18next、react-i18next、next-intl和use-intl调用,助力平滑迁移。 - MCP 服务器:向 Cursor、VS Code、Claude Desktop、Claude Code 和 ChatGPT 公开 Intlayer 文档与 CLI,使 AI 助手能够基于最新文档进行准确回答,并能自行运行
intlayer fill等命令。 - Agent Skills:针对特定领域的技能(如
intlayer-config、intlayer-cli和intlayer-content,以及每个框架对应的专属技能),教导 AI 代理您的路由配置和内容节点类型。 - ESLint 插件:
no-raw-text规则标记硬编码字符串,并提供针对静态字典键和未使用内容的额外规则。
