使用您最喜欢的AI助手总结文档,并引用此页面和AI提供商
版本历史
- "更新 Solid useIntlayer API 用法以直接访问属性"v8.9.02026/5/4
- "添加 init 命令"v7.5.92025/12/30
- "初始化历史记录"v5.5.102025/6/29
如果您有改善此文档的想法,请随时通过在GitHub上提交拉取请求来贡献。
文档的 GitHub 链接复制文档 Markdown 到剪贴板
使用Intlayer翻译您的Create React App | 国际化(i18n)
请参阅 GitHub 上的应用模板。
为什么选择 Intlayer 而不是其他方案?
与 react-i18next 或 i18next 等主要解决方案相比,Intlayer 是一个集成了以下优化的解决方案:
Intlayer 针对 React 进行了优化,提供 组件级内容作用域、延迟加载的翻译 以及国际化 (i18n) 扩展所需的所有功能。
无需将庞大的 JSON 文件加载到页面中,只需加载必要的内容。Intlayer 可帮助 将 bundle 和页面大小减少高达 50%。
对应用程序内容的作用域划分 便于大规模应用的维护。您可以复制或删除单个功能文件夹,而无需审查整个内容代码库的负担。此外,Intlayer 完全类型化,确保内容的准确性。
共置内容 降低大语言模型 (LLM) 所需的上下文。Intlayer 还提供了一套工具,例如 CLI 用于测试缺失的翻译、LSP、MCP 以及 agent skills,使 AI Agent 的开发者体验 (DX) 更加顺畅。
在 CI/CD 管道中使用自动化翻译,使用您选择的 LLM,按照您的 AI 提供商的成本计费。Intlayer 还提供 编译器 以自动提取内容,以及 网络平台 来帮助 后台翻译。
将庞大的 JSON 文件连接到组件可能导致性能和响应性问题。Intlayer 在构建时优化您的内容加载。
在 React 应用中设置 Intlayer 的分步指南
安装依赖
使用 npm 安装必要的包:
bash复制代码复制代码到剪贴板
--interactive标志是可选的。如果你是 AI 代理,请使用intlayer-cli init。此命令将检测你的环境并安装所需的包。例如:
bash复制代码复制代码到剪贴板
配置你的项目
创建一个配置文件来配置应用的语言:
intlayer.config.ts复制代码复制代码到剪贴板
import { Locales, type IntlayerConfig } from "intlayer"; const config: IntlayerConfig = { internationalization: { locales: [ Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH, // 你的其他语言环境 ], defaultLocale: Locales.ENGLISH, }, }; export default config;通过此配置文件,你可以设置本地化 URL、中间件重定向、cookie 名称、内容声明的位置和扩展名、禁用 Intlayer 控制台日志等。有关可用参数的完整列表,请参考 配置文档。
声明你的内容
创建和管理你的内容声明以存储翻译:
src/app.content.tsx复制代码复制代码到剪贴板
import { t, type Dictionary } from "intlayer"; import React, { type ReactNode } from "react"; const appContent = { key: "app", content: { getStarted: t<ReactNode>({ zh: ( <> 编辑 <code>src/App.tsx</code> 并保存以重新加载 </> ), en: ( <> Edit <code>src/App.tsx</code> and save to reload </> ), fr: ( <> Éditez <code>src/App.tsx</code> et enregistrez pour recharger </> ), es: ( <> Edita <code>src/App.tsx</code> y guarda para recargar </> ), }), reactLink: { href: "https://reactjs.org", content: t({ zh: "学习 React", en: "Learn React", fr: "Apprendre React", es: "Aprender React", }), }, }, } satisfies Dictionary; export default appContent;你的内容声明可以在应用的任何地方定义,只要它们包含在
contentDir目录中(默认为./src)。并匹配内容声明文件扩展名(默认为.content.{json,ts,tsx,js,jsx,mjs,cjs,md,mdx,yaml,yml})。有关更多详情,请参考 内容声明文档。
如果你的内容文件包含 TSX 代码,你应该考虑在内容文件中导入
import React from "react";。在你的代码中使用 Intlayer
在整个应用中访问你的内容字典:
src/App.tsx复制代码复制代码到剪贴板
import logo from "./logo.svg"; import "./App.css"; import type { FC } from "react"; import { IntlayerProvider, useIntlayer } from "react-intlayer"; const AppContent: FC = () => { const content = useIntlayer("app"); return ( <div className="App"> <img src={logo} className="App-logo" alt="logo" /> {content.getStarted} <a className="App-link" href={content.reactLink.href.value} target="_blank" rel="noopener noreferrer" > {content.reactLink.content} </a> </div> ); }; const App: FC = () => ( <IntlayerProvider> <AppContent /> </IntlayerProvider> ); export default App;注意:如果你想在
string属性中使用你的内容,例如alt、title、href、aria-label等,你可以使用函数的值,如下所示:html复制代码复制代码到剪贴板
要了解有关
useIntlayer钩子的更多信息,请参考 文档。更改你的内容的语言
可选要更改你的内容的语言,你可以使用
useLocale钩子提供的setLocale函数。此函数允许你设置应用的语言环境并相应地更新内容。src/components/LocaleSwitcher.tsx复制代码复制代码到剪贴板
import { Locales } from "intlayer"; import { useLocale } from "react-intlayer"; const LocaleSwitcher = () => { const { setLocale } = useLocale(); return ( <button onClick={() => setLocale(Locales.English)}>更改语言为英文</button> ); };要了解有关
useLocale钩子的更多信息,请参考 文档。为你的应用添加本地化路由
可选此步骤的目的是为每种语言创建唯一的路由。这对 SEO 和友好的 SEO URL 非常有用。 示例:
plaintext复制代码复制代码到剪贴板
默认情况下,默认语言的路由没有前缀。如果你想为默认语言添加前缀,可以在配置中将
middleware.prefixDefault选项设置为true。有关更多信息,请参考 配置文档。要为你的应用添加本地化路由,你可以创建一个
LocaleRouter组件来包装应用的路由并处理基于语言环境的路由。以下是使用 React Router 的示例:src/components/LocaleRouter.tsx复制代码复制代码到剪贴板
// 导入必要的依赖项和函数 import { type Locales, configuration, getPathWithoutLocale } from "intlayer"; // 来自 'intlayer' 的实用函数和类型 // 来自 'intlayer' 的实用函数和类型 import type { FC, PropsWithChildren } from "react"; // React 函数组件和 props 的类型 import { IntlayerProvider } from "react-intlayer"; // 国际化上下文的提供者 import { BrowserRouter, Routes, Route, Navigate, useLocation, } from "react-router-dom"; // 用于管理导航的路由组件 // 从 Intlayer 解构配置 const { internationalization, middleware } = configuration; const { locales, defaultLocale } = internationalization; /** * 一个处理本地化并用适当的语言环境上下文包装子组件的组件。 * 它管理基于 URL 的语言环境检测和验证。 */ const AppLocalized: FC<PropsWithChildren<{ locale: Locales }>> = ({ children, locale, }) => { const { pathname, search } = useLocation(); // 获取当前 URL 路径 // 确定当前语言环境,如果未提供则回退到默认语言 const currentLocale = locale ?? defaultLocale; // 从路径中移除语言环境前缀以构造基本路径 const pathWithoutLocale = getPathWithoutLocale( pathname // 当前 URL 路径 ); /** * 如果 middleware.prefixDefault 为真,默认语言应始终带有前缀。 */ if (middleware.prefixDefault) { // 验证语言环境 if (!locale || !locales.includes(locale)) { // 重定向到带有更新路径的默认语言 return ( <Navigate to={`/${defaultLocale}/${pathWithoutLocale}${search}`} replace // 用新项替换当前历史记录条目 /> ); } // 用 IntlayerProvider 包装子组件并设置当前语言环境 return ( <IntlayerProvider locale={currentLocale}>{children}</IntlayerProvider> ); } else { /** * 当 middleware.prefixDefault 为假时,默认语言没有前缀。 * 确保当前语言环境有效且不是默认语言。 */ if ( currentLocale.toString() !== defaultLocale.toString() && !locales .filter( (locale) => locale.toString() !== defaultLocale.toString() // 排除默认语言 ) .includes(currentLocale) // 检查当前语言环境是否在有效语言环境列表中 ) { // 重定向到没有语言环境前缀的路径 return <Navigate to={`${pathWithoutLocale}${search}`} replace />; } // 用 IntlayerProvider 包装子组件并设置当前语言环境 return ( <IntlayerProvider locale={currentLocale}>{children}</IntlayerProvider> ); } }; /** * 一个设置特定于语言环境的路由的路由组件。 * 它使用 React Router 来管理导航和呈现本地化组件。 */ export const LocaleRouter: FC<PropsWithChildren> = ({ children }) => ( <BrowserRouter> <Routes> {locales .filter( (locale) => middleware.prefixDefault || locale !== defaultLocale ) .map((locale) => ( <Route // 路由模式以捕获语言环境(例如 /en/、/fr/)并匹配所有后续路径 path={`/${locale}/*`} key={locale} element={<AppLocalized locale={locale}>{children}</AppLocalized>} // 使用语言环境管理包装子组件 /> ))} { // 如果禁用了默认语言前缀,在根路径直接呈现子组件 !middleware.prefixDefault && ( <Route path="*" element={ <AppLocalized locale={defaultLocale}>{children}</AppLocalized> } // 使用语言环境管理包装子组件 /> ) } </Routes> </BrowserRouter> );然后,你可以在你的应用中使用
LocaleRouter组件:src/App.tsx复制代码复制代码到剪贴板
import { LocaleRouter } from "./components/LocaleRouter"; import type { FC } from "react"; // ... 你的 AppContent 组件 const App: FC = () => ( <LocaleRouter> <AppContent /> </LocaleRouter> );当语言环境更改时更改 URL
可选要在语言环境更改时更改 URL,你可以使用
useLocale钩子提供的onLocaleChangeprop。同时,你可以使用react-router-dom中的useLocation和useNavigate钩子来更新 URL 路径。src/components/LocaleSwitcher.tsx复制代码复制代码到剪贴板
import { useLocation, useNavigate } from "react-router-dom"; import { Locales, getHTMLTextDir, getLocaleName, getLocalizedUrl, } from "intlayer"; import { useLocale } from "react-intlayer"; import { type FC } from "react"; const LocaleSwitcher: FC = () => { const { pathname, search } = useLocation(); // 获取当前 URL 路径。示例:/fr/about?foo=bar const navigate = useNavigate(); const { locale, availableLocales, setLocale } = useLocale({ onLocaleChange: (locale) => { // 使用更新的语言环境构造 URL // 示例:/es/about?foo=bar const pathWithLocale = getLocalizedUrl(`${pathname}${search}`, locale); // 更新 URL 路径 navigate(pathWithLocale); }, }); return ( <div> <button popoverTarget="localePopover">{getLocaleName(locale)}</button> <div id="localePopover" popover="auto"> {availableLocales.map((localeItem) => ( <a href={getLocalizedUrl(location.pathname, localeItem)} hrefLang={localeItem} aria-current={locale === localeItem ? "page" : undefined} onClick={(e) => { e.preventDefault(); setLocale(localeItem); }} key={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> </a> ))} </div> </div> ); };文档参考:
切换 HTML 语言和方向属性
可选当你的应用支持多种语言时,更新
<html>标签的lang和dir属性以匹配当前语言环境至关重要。这样做可以确保:- 可访问性:屏幕阅读器和辅助技术依赖正确的
lang属性来准确地发音和解释内容。 - 文本呈现:
dir(方向)属性确保文本按正确的顺序呈现(例如英文的从左到右、阿拉伯语或希伯来语的从右到左),这对可读性至关重要。 - SEO:搜索引擎使用
lang属性来确定你页面的语言,帮助在搜索结果中提供正确的本地化内容。
通过在语言环境更改时动态更新这些属性,你可以为所有支持的语言的用户保证一致和可访问的体验。
实现钩子
创建一个自定义钩子来管理 HTML 属性。该钩子监听语言环境更改并相应地更新属性:
src/hooks/useI18nHTMLAttributes.tsx复制代码复制代码到剪贴板
import { useEffect } from "react"; import { useLocale } from "react-intlayer"; import { getHTMLTextDir } from "intlayer"; /** * 根据当前语言环境更新 HTML <html> 元素的 `lang` 和 `dir` 属性。 * - `lang`:通知浏览器和搜索引擎页面的语言。 * - `dir`:确保正确的阅读顺序(例如,英语为 'ltr',阿拉伯语为 'rtl')。 * * 此动态更新对于正确的文本渲染、可访问性和 SEO 至关重要。 */ export const useI18nHTMLAttributes = () => { const { locale } = useLocale(); useEffect(() => { // 将语言属性更新为当前语言环境。 document.documentElement.lang = locale; // 根据当前语言环境设置文本方向。 document.documentElement.dir = getHTMLTextDir(locale); }, [locale]); };在您的应用中使用钩子
将钩子集成到您的主组件中,以便在语言环境更改时更新 HTML 属性:
src/App.tsx复制代码复制代码到剪贴板
import type { FC } from "react"; import { IntlayerProvider, useIntlayer } from "react-intlayer"; import { useI18nHTMLAttributes } from "./hooks/useI18nHTMLAttributes"; import "./App.css"; const AppContent: FC = () => { // 应用钩子以根据语言环境更新 <html> 标签的 lang 和 dir 属性。 useI18nHTMLAttributes(); // ... 组件的其他部分 }; const App: FC = () => ( <IntlayerProvider> <AppContent /> </IntlayerProvider> ); export default App;通过应用这些更改,您的应用将:
- 确保 语言 (
lang) 属性正确反映当前语言环境,这对 SEO 和浏览器行为非常重要。 - 根据语言环境调整 文本方向 (
dir),提升不同阅读顺序语言的可读性和可用性。 - 提供更 无障碍 的体验,因为辅助技术依赖这些属性以实现最佳功能。
- 可访问性:屏幕阅读器和辅助技术依赖正确的
配置 TypeScript
Intlayer 使用模块增强来利用 TypeScript 的优势,使您的代码库更强大。


确保您的 TypeScript 配置包含自动生成的类型。
复制代码到剪贴板
Git 配置
建议忽略 Intlayer 生成的文件。这可以避免将它们提交到您的 Git 仓库。
为此,您可以在 .gitignore 文件中添加以下指令:
复制代码到剪贴板
VS Code 扩展
为了改进您使用 Intlayer 的开发体验,您可以安装官方的 Intlayer VS Code Extension。
此扩展提供:
- 翻译键的自动补全。
- 实时错误检测,用于缺失的翻译。
- 内联预览已翻译的内容。
- 快速操作,轻松创建和更新翻译。
有关如何使用此扩展的更多详细信息,请参阅Intlayer VS Code 扩展文档。
深入了解
要进一步了解,您可以实现 可视化编辑器 或使用 CMS 外部化您的内容。
常见问题
react-i18next/i18next:应用最广泛的方案,在运行时加载 JSON 命名空间。react-intl和Lingui:基于 ICU 消息格式和内容提取。Intlayer:最先进的解决方案。内容可以在代码库中的任何位置声明(靠近每个组件或集中管理),并通过react-scripts-intlayer在构建时进行编译,全链路类型安全,提供 AI 翻译、可视化编辑器和 CMS。
Create React App 封装了自己的 webpack 配置,因此集成是通过 react-scripts-intlayer 作为 react-scripts 的直接替代品来进行的,而无需您手动注册插件。请参阅 为什么选择 Intlayer 和 性能基准。
远少于基于命名空间的方案,因为页面永远不会下载它不渲染的语言目录。构建时编译器将 useIntlayer 调用替换为组件使用的确切字典条目,因此未使用的键和未使用的语言都会被自动丢弃,并且 动态字典 会按语言环境拆分剩余内容。与常规替代方案相比,Intlayer 可将 bundle 和页面体积减少高达 50%。请参阅 Bundle 体积优化 和 性能基准。
可以,有两条迁移路径。您可以使用 react-i18next 迁移指南 或 i18next 迁移指南 逐步迁移内容。或者,您可以完全保留当前的 API:兼容性适配器 公开与 react-i18next、react-intl 和 i18next 完全相同的 API,但底层由 Intlayer 字典驱动,因此只需更改导入语句,组件代码无需修改。
可以。JSON 同步插件 将您的 /messages/{locale}/{namespace}.json 文件作为单一真实来源(source of truth),并双向生成 Intlayer 字典。PO 同步插件 对 gettext 目录执行相同的操作,而 按语言环境组织的文件 允许您按语言拆分内容,而不是将所有语言打包到一个文件中。
不需要。运行 npx intlayer extract,Intlayer 会读取您的组件,提取面向用户的字符串,并在每个组件旁边生成 .content 文件,这样您只需审查 diff,而无需手动逐一复制字符串到语言目录中。
如需全自动流程,Intlayer Compiler 可在构建时执行相同操作:它在每次更改时扫描您的 JSX、TSX、Vue 和 Svelte 源代码,生成字典并通过热模块替换 (HMR) 保持同步,因此完全无需手动维护键名。
开启编译器前有两个限制值得了解:它通过静态分析工作,因此仅在运行时存在的字符串(如 API 错误代码或 CMS 字段)无法被捕获;此外它需要区分用户文本和应用程序逻辑(如 className="active" 或状态代码),在大型代码库中需要少量注解。而 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规则标记硬编码字符串,并提供针对静态字典键和未使用内容的额外规则。
