使用您最喜欢的AI助手总结文档,并引用此页面和AI提供商
此文档已过期,基础版本已在以下日期更新 2026年8月22日.
前往英文文档版本历史
- "更新 Solid useIntlayer API 用法以直接访问属性"v8.9.02026/5/4
- "初始发布"v8.0.02026/1/10
此页面的内容已使用 AI 翻译。
查看英文原文的最新版本如果您有改善此文档的想法,请随时通过在GitHub上提交拉取请求来贡献。
文档的 GitHub 链接复制文档 Markdown 到剪贴板
使用 Intlayer 翻译你的 Next.js 16 网站(页面路径中不包含 [locale]) | 国际化 (i18n)
查看 GitHub 上的 应用模板。
目录
为什么选择 Inlayer 而不是替代品?
与“next-intl”或“i18next”等主要解决方案相比,Intlayer是一个具有集成优化的解决方案,例如:
完整的 Next.js 覆盖
捆绑尺寸
不要将大量 JSON 文件加载到页面中,而只需加载必要的内容。 Intlayer 有助于将捆绑包和页面大小减少多达 50%。
</Accordion>
可维护性
确定应用程序内容的范围有利于大型应用程序的维护。您可以复制或删除单个功能文件夹,而无需承担检查整个内容代码库的精神负担。此外,Intlayer 具有完全类型化 (fully typed),以确保您的内容的准确性。
人工智能代理
共置内容减少大型语言模型 (LLM) 所需的上下文。 Intlayer 还附带了一套工具,例如用于测试缺失翻译的 CLI、LSP、MCP 和 agent skills,使 AI 代理的开发者体验 (DX) 更加流畅。
自动化
使用您选择的法学硕士,通过自动化在 CI/CD 管道中进行翻译,而费用由您的 AI 提供商承担。 Intlayer 还提供了一个编译器来自动提取内容,以及一个网络平台来帮助在后台翻译。
</Accordion>
表现
将大量 JSON 文件连接到组件可能会导致性能和反应性问题。 Intlayer 可在构建时 (build time)优化您的内容加载。
无需开发即可扩展
</AccordionGroup>
在 Next.js 应用中逐步设置 Intlayer 的指南
安装依赖
使用 npm 安装必要的包:
bash复制代码复制代码到剪贴板
--interactive标志是可选的。如果你是 AI agent,请使用intlayer-cli init。此命令将检测你的环境并安装所需的包。例如:
bash复制代码复制代码到剪贴板
配置你的项目
以下是我们将创建的最终结构:
bash复制代码复制代码到剪贴板
如果你不想要语言路由,intlayer 可以作为一个简单的提供者 / hook 使用。详见此指南。
创建一个配置文件来配置你的应用程序的语言:
intlayer.config.ts复制代码复制代码到剪贴板
import { Locales, type IntlayerConfig } from "intlayer"; const config: IntlayerConfig = { internationalization: { locales: [ Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH, // 你的其他语言 ], defaultLocale: Locales.ENGLISH, }, routing: { mode: "search-params", // 或 `no-prefix` - 用于中间件检测 }, }; export default config;通过此配置文件,你可以设置本地化 URL、代理重定向、cookie 名称、内容声明的位置和扩展名、禁用 Intlayer 的控制台日志等。如需完整的可用参数列表,请参考配置文档。
在 Next.js 配置中集成 Intlayer
配置你的 Next.js 设置以使用 Intlayer:
next.config.ts复制代码复制代码到剪贴板
import type { NextConfig } from "next"; import { withIntlayer } from "next-intlayer/server"; const nextConfig: NextConfig = {/* 配置选项在这里 */}; export default withIntlayer(nextConfig);withIntlayer()Next.js 插件用于将 Intlayer 与 Next.js 集成。它确保构建内容声明文件,并在开发模式下监视它们。它在 Webpack 或 Turbopack 环境中定义 Intlayer 环境变量。此外,它提供别名以优化性能并确保与服务器组件的兼容性。withIntlayer()函数是一个 promise 函数。它允许在构建开始之前准备 intlayer 字典。如果你想将其与其他插件一起使用,你可以等待它。例如:ts复制代码复制代码到剪贴板
如果你想同步使用它,可以使用
withIntlayerSync()函数。例如:ts复制代码复制代码到剪贴板
Intlayer 根据命令行标志
--webpack、--turbo或--turbopack,以及你当前的 Next.js 版本,自动检测你的项目是否使用 webpack 或 Turbopack。自
next>=16起,如果你使用 Rspack,必须通过禁用 Turbopack 显式强制 Intlayer 使用 webpack 配置:ts复制代码复制代码到剪贴板
定义动态语言路由
从
RootLayout中删除所有内容,然后用以下代码替换:src/app/layout.tsx复制代码复制代码到剪贴板
import type { Metadata } from "next"; import type { ReactNode } from "react"; import "./globals.css"; import { getHTMLTextDir, getIntlayer } from "intlayer"; import { getLocale, IntlayerProvider } from "next-intlayer/server"; export { generateStaticParams } from "next-intlayer"; export const generateMetadata = async (): Promise<Metadata> => { const locale = await getLocale(); const { title, description, keywords } = getIntlayer("metadata", locale); return { title, description, keywords, }; }; const RootLayout = async ({ children, }: Readonly<{ children: ReactNode; }>) => { const locale = await getLocale(); return ( <html lang={locale} dir={getHTMLTextDir(locale)}> <body> <IntlayerProvider locale={locale}>{children}</IntlayerProvider> </body> </html> ); }; export default RootLayout;单个
IntlayerProvider覆盖树的两个部分:它为服务器钩子读取的请求作用域服务器上下文提供种子,并挂载客户端提供程序,以便客户端组件接收相同的区域设置。src/app/layout.tsx复制代码复制代码到剪贴板
import type { Metadata } from "next"; import type { ReactNode } from "react"; import "./globals.css"; import { IntlayerProvider, LocalPromiseParams } from "next-intlayer"; import { getHTMLTextDir, getIntlayer } from "intlayer"; import { getLocale } from "next-intlayer/server"; export { generateStaticParams } from "next-intlayer"; export const generateMetadata = async (): Promise<Metadata> => { const locale = await getLocale(); const { title, description, keywords } = getIntlayer("metadata", locale); return { title, description, keywords, }; }; const RootLayout = async ({ children, }: Readonly<{ children: ReactNode; }>) => { const locale = await getLocale(); return ( <html lang={locale} dir={getHTMLTextDir(locale)}> <body> <IntlayerProvider defaultLocale={locale}>{children}</IntlayerProvider> </body> </html> ); }; export default RootLayout;声明你的内容
创建和管理你的内容声明以存储翻译:
src/app/metadata.content.ts复制代码复制代码到剪贴板
import { t, type Dictionary } from "intlayer"; import { Metadata } from "next"; const metadataContent = { key: "metadata", content: { title: t({ zh: "我的项目标题", en: "My Project Title", fr: "Le Titre de mon Projet", es: "El Título de mi Proyecto", }), description: t({ zh: "发现我们为简化工作流程和提高生产力而设计的创新平台。", en: "Discover our innovative platform designed to streamline your workflow and boost productivity.", fr: "Découvrez notre plateforme innovante conçue pour simplifier votre flux de travail et booster votre productivité.", es: "Descubra nuestra plataforma innovadora diseñada para simplificar su flujo de trabajo y aumentar su productividad.", }), keywords: t({ zh: ["创新", "生产力", "工作流程", "SaaS"], en: ["innovation", "productivity", "workflow", "SaaS"], fr: ["innovation", "productivité", "flux de travail", "SaaS"], es: ["innovación", "productividad", "flujo de trabajo", "SaaS"], }), }, } as Dictionary<Metadata>; export default metadataContent;src/app/page.content.ts复制代码复制代码到剪贴板
import { t, type Dictionary } from "intlayer"; const pageContent = { key: "page", content: { getStarted: { main: t({ zh: "通过编辑开始", en: "Get started by editing", fr: "Commencez par éditer", es: "Comience por editar", }), pageLink: "src/app/page.tsx", }, }, } satisfies Dictionary; export default pageContent;你的内容声明可以在应用程序的任何地方定义,只要它们包含在
contentDir目录中(默认为./src)且匹配内容声明文件扩展名(默认为.content.{json,ts,tsx,js,jsx,mjs,cjs,md,mdx,yaml,yml})。更多详情,请参考内容声明文档。
在代码中使用内容
在整个应用程序中访问你的内容字典:
src/app/page.tsx复制代码复制代码到剪贴板
import type { FC } from "react"; import { ClientComponentExample } from "@components/clientComponentExample/ClientComponentExample"; import { ServerComponentExample } from "@components/serverComponentExample/ServerComponentExample"; import { useIntlayer } from "next-intlayer"; import { NextPage } from "next"; const PageContent: FC = () => { const content = useIntlayer("page"); return ( <> <p>{content.getStarted.main}</p> <code>{content.getStarted.pageLink}</code> </> ); }; const Page: NextPage = () => ( <> <PageContent /> <ServerComponentExample /> <ClientComponentExample /> </> ); export default Page;IntlayerProvider挂载一次,在根布局中。它为服务器和客户端组件提供语言区域,所以页面不再自动包装。- 没有
[locale]路径段的情况下,语言区域总是来自请求 — 由 Intlayer 代理设置的x-intlayer-locale请求头,然后是语言区域 cookie — 当提供者未运行时,服务器 hooks 会自行读取这些。
在整个应用程序中访问你的内容字典:
src/app/page.tsx复制代码复制代码到剪贴板
import type { FC } from "react"; import { ClientComponentExample } from "@components/clientComponentExample/ClientComponentExample"; import { ServerComponentExample } from "@components/serverComponentExample/ServerComponentExample"; import { IntlayerServerProvider, useIntlayer, getLocale, } from "next-intlayer/server"; import { NextPage } from "next"; import { headers, cookies } from "next/headers"; const PageContent: FC = () => { const content = useIntlayer("page"); return ( <> <p>{content.getStarted.main}</p> <code>{content.getStarted.pageLink}</code> </> ); }; const Page: NextPage = async () => { const locale = await getLocale(); return ( <IntlayerServerProvider locale={locale}> <PageContent /> <ServerComponentExample /> <ClientComponentExample /> </IntlayerServerProvider> ); }; export default Page;IntlayerClientProvider用于向客户端组件提供语言设置。它可以放在任何父组件中,包括布局。但是,建议将其放在布局中,因为 Next.js 在页面中共享布局代码,这样更有效。通过在布局中使用IntlayerClientProvider,你可以避免为每个页面重新初始化它,改进性能并在整个应用程序中维持一致的本地化上下文。IntlayerServerProvider用于向服务器子组件提供语言设置。它不能在布局中设置。布局和页面不能共享一个通用的服务器上下文,因为服务器上下文系统基于每个请求的数据存储(通过 React's cache 机制),导致每个"上下文"为应用程序的不同段重新创建。在共享布局中放置提供者会破坏这种隔离,防止服务器上下文值正确传播到你的服务器组件。
src/components/clientComponentExample/ClientComponentExample.tsx复制代码复制代码到剪贴板
"use client"; import type { FC } from "react"; import { useIntlayer } from "next-intlayer"; export const ClientComponentExample: FC = () => { const content = useIntlayer("client-component-example"); // 创建相关的内容声明 return ( <div> <h2>{content.title}</h2> <p>{content.content}</p> </div> ); };src/components/serverComponentExample/ServerComponentExample.tsx复制代码复制代码到剪贴板
import type { FC } from "react"; import { useIntlayer } from "next-intlayer"; export const ServerComponentExample: FC = () => { const content = useIntlayer("server-component-example"); // 创建相关内容声明 return ( <div> <h2>{content.title}</h2> <p>{content.content}</p> </div> ); };next-intlayer是同构导入路径:react-server导出条件为服务器组件提供环境区域设置实现,而客户端组件获得基于上下文的实现。同一调用在两端都有效。src/components/serverComponentExample/ServerComponentExample.tsx复制代码复制代码到剪贴板
import type { FC } from "react"; import { useIntlayer } from "next-intlayer/server"; export const ServerComponentExample: FC = () => { const content = useIntlayer("server-component-example"); // 创建相关的内容声明 return ( <div> <h2>{content.title}</h2> <p>{content.content}</p> </div> ); };如果你想在
string属性(如alt、title、href、aria-label等)中使用你的内容,你可以使用函数的值,如:html复制代码复制代码到剪贴板
要了解更多关于
useIntlayerhook 的信息,请参考文档。配置代理以进行语言检测
可选设置代理以检测用户的首选语言:
src/proxy.ts复制代码复制代码到剪贴板
export { intlayerProxy as proxy } from "next-intlayer/proxy"; export const config = { matcher: "/((?!api|static|assets|robots|sitemap|sw|service-worker|manifest|.*\\..*|_next).*)", };intlayerProxy用于检测用户的首选语言并根据配置中指定的内容将其重定向到适当的 URL。此外,它能够将用户的首选语言保存在 cookie 中。自 Intlayer v9 起,此中间件遵守
routing.enableProxy选项(默认为true)。在你的配置中设置routing.enableProxy: false以将其转为通过模式,而不移除此文件。详见 v9 发行说明。如果你需要将多个代理链接在一起(例如,
intlayerProxy与认证或自定义代理),Intlayer 现在提供一个称为multipleProxies的辅助函数。ts复制代码复制代码到剪贴板
改变内容的语言
可选要在 Next.js 中改变内容的语言,推荐的方式是使用
Link组件将用户重定向到适当的本地化页面。Link组件支持页面预获取,这有助于避免完整的页面重新加载。src/components/localeSwitcher/LocaleSwitcher.tsx复制代码复制代码到剪贴板
"use client"; import type { FC } from "react"; import { Locales, getHTMLTextDir, getLocaleName } from "intlayer"; import { useLocale } from "next-intlayer"; export const LocaleSwitcher: FC = () => { const { locale, availableLocales, setLocale } = useLocale(); return ( <div> <button popoverTarget="localePopover">{getLocaleName(locale)}</button> <div id="localePopover" popover="auto"> {availableLocales.map((localeItem) => ( <button key={localeItem} aria-current={locale === localeItem ? "page" : undefined} onClick={() => setLocale(localeItem)} > <span> {/* 语言代码 - 例如 FR */} {localeItem} </span> <span> {/* 该语言用其自身语言表示 - 例如 Français */} {getLocaleName(localeItem, locale)} </span> <span dir={getHTMLTextDir(localeItem)} lang={localeItem}> {/* 该语言用当前语言表示 - 例如当前语言设置为 Locales.SPANISH 时为 Francés */} {getLocaleName(localeItem)} </span> <span dir="ltr" lang={Locales.ENGLISH}> {/* 英语中的语言 - 例如 French */} {getLocaleName(localeItem, Locales.ENGLISH)} </span> </button> ))} </div> </div> ); };另一种方式是使用
useLocalehook 提供的setLocale函数。此函数不允许预获取页面。详见useLocalehook 文档以了解更多详情。文档参考:
在 Server Actions 中获取当前语言
可选如果你需要在 Server Action 中使用活动语言(例如,本地化电子邮件或运行与语言相关的逻辑),请从
next-intlayer/server调用getLocale:src/app/actions/getLocale.ts复制代码复制代码到剪贴板
getLocale函数遵循级联策略来确定用户的语言:- 首先,它检查请求标头中的语言值,该值可能已由代理设置
- 如果在标头中找不到语言,它会查找存储在 cookies 中的语言
- 如果找不到 cookie,它会尝试检测用户浏览器设置中的首选语言
- 作为最后的手段,它会回退到应用程序配置的默认语言
这确保根据可用的上下文选择最合适的语言。
优化你的 bundle 大小
可选在使用
next-intlayer时,默认情况下字典被包含在每个页面的 bundle 中。要优化 bundle 大小,Intlayer 提供了一个可选的 SWC 插件,它可以智能地替换使用宏的useIntlayer调用。这确保字典仅被包含在实际使用它们的页面的 bundle 中。要启用此优化,请安装
@intlayer/swc包。安装后,next-intlayer将自动检测并使用该插件:bash复制代码复制代码到剪贴板
注意:此优化仅适用于 Next.js 13 及以上版本。
注意:此包默认未安装,因为 SWC 插件在 Next.js 中仍是实验性的。它可能会在未来发生变化。
注意:如果你将选项设置为
importMode: 'dynamic'或importMode: 'fetch'(在dictionary配置中),它将依赖于 Suspense,因此你需要将你的useIntlayer调用包装在Suspense边界中。这意味着你将不能在你的 Page / Layout 组件的顶层直接使用useIntlayer。
第一步:安装依赖
当使用 Turbopack 作为通过 next dev 命令运行的开发服务器时,字典更改默认不会被自动检测。
这个限制是因为 Turbopack 无法并行运行 webpack 插件来监视内容文件的更改。为了解决这个问题,你需要使用 intlayer watch 命令同时运行开发服务器和 Intlayer 构建监视器。
复制代码到剪贴板
如果你使用的是 next-intlayer@<=6.x.x,你需要保留 --turbopack 标志以使 Next.js 16 应用程序能与 Turbopack 正常工作。我们建议使用 next-intlayer@>=7.x.x 来避免此限制。
配置 TypeScript
Intlayer 使用模块扩展(module augmentation)来利用 TypeScript 的优势并增强你的 codebase 的类型安全性。


确保你的 TypeScript 配置包含自动生成的类型。
复制代码到剪贴板
Git 配置
建议将 Intlayer 生成的文件忽略(ignore)。这样可以避免将这些文件提交到你的 Git 仓库。
为此,你可以将以下内容添加到你的 .gitignore 文件中:
复制代码到剪贴板
VS Code Extension
为了提升在 Intlayer 的开发体验,你可以安装官方的 Intlayer VS Code Extension。
此扩展提供:
- Autocompletion:翻译键自动补全。
- Real-time error detection:实时检测缺失的翻译。
- 内联预览 翻译后的内容。
- 快速操作 以便轻松创建和更新翻译。
有关如何使用该扩展的更多详细信息,请参阅 Intlayer VS Code 扩展文档。
