国际化
国际化(Internationalization,简写为 I18n),是指在设计和开发产品、应用程序时,对其进行本地化,以适应不同的文化、地区或语言的目标用户。你可以使用 i18next 等 i18n 库实现国际化,为用户提供易于访问的体验。
Intl API
Intl 对象是 ECMAScript 国际化 API 的一个命名空间,提供了一组处理国际化与本地化的方法。通过 Intl API,能够处理数字、日期和时间等相关问题,比如数字格式化、日期和时间格式化。
目前在 Lynx 中 Intl API 尚未实现,并将在后续版本中支持。如果你需要使用在 Lynx 中使用 Intl API,你可以安装对应的 Polyfill,例如 @formatjs/intl-numberformat
、@formatjs/intl-datetimeformat、intl-pluralrules 等。
使用 i18next
i18next 是一个 JavaScript 国际化框架,在 ReactLynx 中使用它有以下优点:
- 简洁:
i18next提供了简单易用的 API,让在 ReactLynx 中实现国际化变得更加简单 - 按需加载:支持按需加载语言资源,减少首屏加载时间
- 广泛支持:兼容多种格式和后端,允许与不同的翻译存储解决方案(如 JSON 文件、远程 API 等)轻松集成。
- 支持缓存:内置缓存机制加快语言资源的加载速度,提升用户体验。
- 丰富的社区支持:拥有庞大的社区和丰富的插件,满足多样化的国际化需求。
- 可靠性:在众多项目中得到验证,提供稳定性和可靠性。
- 热重载:语言资源的更改可以立即生效,无需重新发布应用。
安装
你需要安装 i18next 作为依赖:
i18next@24.0.0+ 版本要求运行环境必须能够使用 Intl.pluralRules API,但是目前 Lynx 当中尚未实现该 API,因此需要:
- 使用 v23 并且启用
compatibilityJSON: 'v3'选项 - 使用 v24 并且对
Intl.PluralRulesAPI 进行 polyfill
创建第一个文案翻译
假设我们有如下的文案资源:
创建翻译函数只需要以下三个步骤:
- 引入文案资源
./locales/en.json - 使用
createInstance()函数创建i18next实例 - 用引入的文案资源初始化 i18n 实例
如果你在 TypeScript 文件中引入 *.json, 你需要在 tsconfig.json 文件中设置 compilerOptions.resolveJsonModule 选项为 true。
接下来,可以直接使用 i18n.t 函数来进行文案翻译:
同步加载文案资源
在真实的项目中,通常有多个不同语言的文案资源。
你可以使用 import.meta.webpackContext API 来一次性将他们全部引入:
这些资源也可以被添加到 i18next.init() 中来让首屏渲染中的文案得到翻译:
你可以需要 Rspeedy Type Declaration 来获得 import.meta.webpackContext 的 TypeScript 类型定义
异步按需加载文案资源
同步加载资源会使得全部的文案资源都打包在产物中,导致首屏加载性能较差。
我们也可以通过 import() 来异步、按需引入文案资源。
首先需要安装 i18next-resources-to-backend 作为依赖:
接下来在 src/i18n.ts 中添加下面的代码:
在上面的例子中
- 一个
i18next的中间件i18next-resources-to-backend在后台线程中被添加到localI18nInstance.use当中 - 文案资源可以被异步按需加载(其中的部分,如
zh,en依然同步加载)
在产物中,可以看到生成了多个 JavaScript 文件,其中包含了文案资源:
你可能还会注意到这两个没有被加载,这就是为什么它被称为按需加载,对资源的请求仅在需要时才会发送。
这是因为该模块已经包含在主产物中,Webpack/Rspack 会自动将其移除。
请参见 optimization.removeAvailableModules 和 optimization.removeEmptyChunks。
切换语言
调用 i18next.changeLanguage API 可以在不同语言间进行切换:

