国际化

在 Rspress 中实现文档的国际化,你需要做如下的操作:

  1. 定义 I18n 文本数据。
  2. 配置 localesthemeConfig.locales
  3. 配置默认语言。
  4. 新建不同的语言版本的文档。
  5. 配置侧边栏和导航栏。
  6. 自定义组件中使用 useI18n

定义 I18n 文本数据

在当前工作区新建 i18n.json,目录结构如下:

  1. 1.
  2. 2├── docs
  3. 3├── i18n.json
  4. 4├── package.json
  5. 5├── tsconfig.json
  6. 6└── rspress.config.ts

在这个 JSON 文件中,你可以定义国际化所需的文本,类型定义如下:

  1. export interface I18n {
  2. // key 为文本 id
  3. [key: string]: {
  4. // key 为语言
  5. [key: string]: string;
  6. };
  7. }

举个例子:

i18n.json

  1. {
  2. "gettingStarted": {
  3. "en": "Getting Started",
  4. "zh": "开始"
  5. },
  6. "features": {
  7. "en": "Features",
  8. "zh": "特性"
  9. },
  10. "guide": {
  11. "en": "Guide",
  12. "zh": "指南"
  13. }
  14. }

这些文本数据在配置文件自定义组件中都会用到,后文会详细介绍。

配置 locales 数据

rspress.config.ts中,你可以通过两个地方来配置 locales 数据:

  • locales,用于配置站点的语言标题描述等信息,主要围绕站点本身的信息来配置。
  • themeConfig.locales,用于配置主题的语言大纲栏标题上一页/下一页文本等信息,主要进行主题相关的配置。

rspress.config.ts

  1. import { defineConfig } from 'rspress/config';
  2. export default defineConfig({
  3. // locales 为一个对象数组
  4. locales: [
  5. {
  6. lang: 'en',
  7. // 导航栏切换语言的标签
  8. label: 'English',
  9. title: 'Modern.js',
  10. description: 'Modern.js 文档框架',
  11. },
  12. {
  13. lang: 'zh',
  14. // 导航栏切换语言的标签
  15. label: '简体中文',
  16. title: 'Modern.js',
  17. description: 'Rspress',
  18. },
  19. ],
  20. themeConfig: {
  21. locales: [
  22. {
  23. lang: 'en',
  24. outlineTitle: 'ON THIS Page',
  25. },
  26. {
  27. lang: 'zh',
  28. outlineTitle: '大纲',
  29. },
  30. ],
  31. },
  32. });

注意

默认主题中, themeConfig.locales 也包含 locales 中的所有字段,前者优先级更高。

对于其它的国际化主题参数配置,请参考 API 类型

配置默认语言

在配置完 locales 之后,你需要通过 lang 配置文档的默认语言,如下例子所示:

rspress.config.ts

  1. import { defineConfig } from 'rspress/config';
  2. export default defineConfig({
  3. lang: 'zh',
  4. });

这很重要,因为对于默认语言下的路由,框架会去掉语言前缀,比如 /zh/guide/getting-started 会被转换为 /guide/getting-started

新建不同的语言版本的文档

在做好上面的配置后,我们就可以开始新建不同语言版本的文档了,非常简单,我们只需要在文档根目录下新建如下的结构即可:

  1. docs
  2. ├── en
  3. ├── api
  4. └── index.md
  5. └── guide
  6. └── getting-started.md
  7. └── features.md
  8. └── zh
  9. ├── api
  10. └── index.md
  11. └── guide
  12. └── getting-started.md
  13. └── features.md

可以看到,我们把不同语言的文档放在了 docs 目录下的 enzh 目录中,这样就可以方便地区分不同语言的文档了。

配置 _meta.json

通过 _meta.json 文件,我们可以配置导航栏和侧边栏的内容,具体可以参考自动化导航栏/侧边栏

导航栏级别

在导航栏级别的 _meta.json 配置中,你可以将 text 指定为 i18n key,比如:

_meta.json

  1. [
  2. {
  3. "text": "guide",
  4. "link": "/guide/start/getting-started",
  5. "activeMatch": "/guide/"
  6. }
  7. ]

其中,textguide,这个值会被自动翻译为 指南 或者 Guide,具体取决于当前语言。

侧边栏级别

在侧边栏级别的 _meta.json 配置中,你可以将 label 指定为 i18n key,比如:

_meta.json

  1. [
  2. {
  3. "type": "dir",
  4. "name": "start",
  5. "label": "gettingStarted"
  6. }
  7. ]

其中,labelgettingStarted,这个值会被自动翻译为 开始 或者 Getting Started,具体取决于当前语言。

自定义组件中使用 useI18n

在 MDX 开发或者自定义主题开发的过程中,你可能会写一些自定义组件,这些组件中也需要使用到国际化文本,那么如何获取呢?

框架提供了 useI18n 这个 hook 来获取国际化文本,使用方式如下:

  1. import { useI18n } from 'rspress/runtime';
  2. const MyComponent = () => {
  3. const t = useI18n();
  4. return <div>{t('gettingStarted')}</div>;
  5. };

为了获得更好的类型提示,你可以在 tsconfig.json 中配置 paths:

  1. {
  2. "compilerOptions": {
  3. "paths": {
  4. "i18n": ["./i18n.json"]
  5. }
  6. }
  7. }

然后在组件中这样使用:

  1. import { useI18n } from 'rspress/runtime';
  2. const MyComponent = () => {
  3. const t = useI18n<typeof import('i18n')>();
  4. return <div>{t('gettingStarted')}</div>;
  5. };

这样你就可以获得 i18n.json 中定义的所有文本 key 的类型提示了。