@modern-js/main-doc 3.1.5 → 3.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/docs/en/community/contributing-guide.mdx +1 -1
- package/docs/en/components/international/init-options-desc.mdx +1 -1
- package/docs/en/components/international/install-command.mdx +4 -17
- package/docs/en/components/international/instance-code.mdx +4 -14
- package/docs/en/components/international/introduce.mdx +4 -1
- package/docs/en/configure/app/server/tsconfig-path.mdx +63 -0
- package/docs/en/configure/app/source/enable-async-pre-entry.mdx +30 -0
- package/docs/en/configure/app/tools/dev-server.mdx +0 -4
- package/docs/en/guides/advanced-features/international/_meta.json +0 -1
- package/docs/en/guides/advanced-features/international/advanced.mdx +48 -109
- package/docs/en/guides/advanced-features/international/api.mdx +125 -290
- package/docs/en/guides/advanced-features/international/best-practices.mdx +203 -48
- package/docs/en/guides/advanced-features/international/configuration.mdx +108 -315
- package/docs/en/guides/advanced-features/international/locale-detection.mdx +62 -208
- package/docs/en/guides/advanced-features/international/quick-start.mdx +41 -55
- package/docs/en/guides/advanced-features/international/resource-loading.mdx +63 -322
- package/docs/en/guides/advanced-features/international/routing.mdx +60 -138
- package/docs/en/guides/advanced-features/international.mdx +19 -27
- package/docs/en/guides/basic-features/alias.mdx +1 -1
- package/docs/en/guides/basic-features/html.mdx +2 -2
- package/docs/en/guides/basic-features/static-assets.mdx +1 -2
- package/docs/en/guides/basic-features/testing/_meta.json +1 -1
- package/docs/en/guides/concept/entries.mdx +2 -2
- package/docs/en/guides/get-started/tech-stack.mdx +6 -0
- package/docs/zh/community/contributing-guide.mdx +1 -1
- package/docs/zh/components/international/init-options-desc.mdx +1 -1
- package/docs/zh/components/international/install-command.mdx +4 -16
- package/docs/zh/components/international/instance-code.mdx +4 -14
- package/docs/zh/components/international/introduce.mdx +5 -2
- package/docs/zh/configure/app/server/tsconfig-path.mdx +63 -0
- package/docs/zh/configure/app/source/enable-async-pre-entry.mdx +77 -0
- package/docs/zh/configure/app/tools/dev-server.mdx +0 -4
- package/docs/zh/guides/advanced-features/bff/function.mdx +2 -2
- package/docs/zh/guides/advanced-features/international/_meta.json +0 -1
- package/docs/zh/guides/advanced-features/international/advanced.mdx +48 -109
- package/docs/zh/guides/advanced-features/international/api.mdx +126 -292
- package/docs/zh/guides/advanced-features/international/best-practices.mdx +204 -49
- package/docs/zh/guides/advanced-features/international/configuration.mdx +105 -318
- package/docs/zh/guides/advanced-features/international/locale-detection.mdx +62 -236
- package/docs/zh/guides/advanced-features/international/quick-start.mdx +40 -54
- package/docs/zh/guides/advanced-features/international/resource-loading.mdx +62 -324
- package/docs/zh/guides/advanced-features/international/routing.mdx +58 -136
- package/docs/zh/guides/advanced-features/international.mdx +19 -26
- package/docs/zh/guides/basic-features/alias.mdx +1 -1
- package/docs/zh/guides/basic-features/html.mdx +2 -2
- package/docs/zh/guides/basic-features/static-assets.mdx +1 -2
- package/docs/zh/guides/basic-features/testing/_meta.json +1 -1
- package/docs/zh/guides/concept/entries.mdx +2 -2
- package/docs/zh/guides/get-started/tech-stack.mdx +6 -0
- package/package.json +4 -4
- package/docs/en/components/rspackPrecautions.mdx +0 -6
- package/docs/en/guides/advanced-features/international/basic.mdx +0 -417
- package/docs/en/guides/basic-features/testing/cypress.mdx +0 -95
- package/docs/en/guides/basic-features/testing/jest.mdx +0 -148
- package/docs/en/guides/basic-features/testing/vitest.mdx +0 -100
- package/docs/zh/components/rspackPrecautions.mdx +0 -6
- package/docs/zh/guides/advanced-features/international/basic.mdx +0 -416
- package/docs/zh/guides/basic-features/testing/cypress.mdx +0 -95
- package/docs/zh/guides/basic-features/testing/jest.mdx +0 -148
- package/docs/zh/guides/basic-features/testing/vitest.mdx +0 -100
|
@@ -1,85 +1,59 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: 配置说明
|
|
3
3
|
---
|
|
4
|
-
|
|
5
4
|
# 配置说明
|
|
6
5
|
|
|
7
|
-
|
|
6
|
+
插件配置分为两个文件,各有职责:
|
|
8
7
|
|
|
9
|
-
|
|
10
|
-
|
|
8
|
+
| 文件 | 用途 |
|
|
9
|
+
| --- | --- |
|
|
10
|
+
| `modern.config.ts` | 插件基础设置,在构建/启动时读取 |
|
|
11
|
+
| `src/modern.runtime.ts` | i18next 初始化选项,在运行时读取 |
|
|
11
12
|
|
|
13
|
+
:::warning 函数类型只能在运行时配置中设置
|
|
14
|
+
`modern.config.ts` 在构建时执行,无法序列化函数。SDK 加载函数、自定义检测函数等必须放在 `modern.runtime.ts` 中。
|
|
12
15
|
:::
|
|
13
16
|
|
|
14
|
-
##
|
|
17
|
+
## 配置归属一览
|
|
15
18
|
|
|
16
|
-
|
|
19
|
+
| 配置项 | 放在哪里 |
|
|
20
|
+
| --- | --- |
|
|
21
|
+
| `localeDetection`(语言检测、路径重定向等) | `modern.config.ts` |
|
|
22
|
+
| `backend`(资源路径、sdk 声明等) | `modern.config.ts` |
|
|
23
|
+
| `i18nInstance` | `modern.runtime.ts` |
|
|
24
|
+
| `initOptions`(fallbackLng、ns 等 i18next 选项) | `modern.runtime.ts` |
|
|
25
|
+
| `backend.sdk` 的实际加载函数 | `modern.runtime.ts` |
|
|
17
26
|
|
|
18
|
-
|
|
27
|
+
## CLI 配置
|
|
28
|
+
|
|
29
|
+
```ts title="modern.config.ts"
|
|
30
|
+
import { appTools, defineConfig } from '@modern-js/app-tools';
|
|
19
31
|
import { i18nPlugin } from '@modern-js/plugin-i18n';
|
|
20
32
|
|
|
21
33
|
export default defineConfig({
|
|
22
34
|
plugins: [
|
|
35
|
+
appTools(),
|
|
23
36
|
i18nPlugin({
|
|
24
|
-
localeDetection: {
|
|
25
|
-
|
|
26
|
-
},
|
|
27
|
-
backend: {
|
|
28
|
-
// 后端资源加载配置
|
|
29
|
-
},
|
|
37
|
+
localeDetection: { ... },
|
|
38
|
+
backend: { ... },
|
|
30
39
|
}),
|
|
31
40
|
],
|
|
32
41
|
});
|
|
33
42
|
```
|
|
34
43
|
|
|
35
|
-
### localeDetection
|
|
36
|
-
|
|
37
|
-
`localeDetection` 用于配置语言检测相关选项:
|
|
38
|
-
|
|
39
|
-
:::warning
|
|
40
|
-
如果启用了 `localePathRedirect`,`detection` 配置必须放在 CLI 配置(`modern.config.ts`)中,因为服务端插件需要根据此配置来获取语言信息并进行路径重定向。
|
|
41
|
-
|
|
42
|
-
:::
|
|
43
|
-
|
|
44
|
-
```ts
|
|
45
|
-
interface BaseLocaleDetectionOptions {
|
|
46
|
-
/** 是否启用路径重定向,启用后会在 URL 中添加语言前缀 */
|
|
47
|
-
localePathRedirect?: boolean;
|
|
48
|
-
|
|
49
|
-
/** 是否启用 i18next 语言检测器 */
|
|
50
|
-
i18nextDetector?: boolean;
|
|
51
|
-
|
|
52
|
-
/** 支持的语言列表 */
|
|
53
|
-
languages?: string[];
|
|
54
|
-
|
|
55
|
-
/** 默认回退语言 */
|
|
56
|
-
fallbackLanguage?: string;
|
|
57
|
-
|
|
58
|
-
/** 自定义检测配置 */
|
|
59
|
-
detection?: LanguageDetectorOptions;
|
|
60
|
-
|
|
61
|
-
/** 忽略自动重定向的路由列表或函数
|
|
62
|
-
*
|
|
63
|
-
* 可以是一个字符串数组(路径模式),或一个函数来判断是否应该忽略重定向。
|
|
64
|
-
* 支持精确匹配和前缀匹配(如 '/api' 会匹配 '/api' 和 '/api/users')。
|
|
65
|
-
*
|
|
66
|
-
* @example
|
|
67
|
-
* // 字符串数组
|
|
68
|
-
* ignoreRedirectRoutes: ['/api', '/admin']
|
|
69
|
-
*
|
|
70
|
-
* // 函数
|
|
71
|
-
* ignoreRedirectRoutes: (pathname) => pathname.startsWith('/api')
|
|
72
|
-
*/
|
|
73
|
-
ignoreRedirectRoutes?: string[] | ((pathname: string) => boolean);
|
|
74
|
-
}
|
|
44
|
+
### localeDetection 选项
|
|
75
45
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
46
|
+
| 字段 | 类型 | 默认值 | 说明 |
|
|
47
|
+
| --- | --- | --- | --- |
|
|
48
|
+
| `languages` | `string[]` | `[]` | 支持的语言列表 |
|
|
49
|
+
| `fallbackLanguage` | `string` | `''` | 语言检测失败时的兜底语言 |
|
|
50
|
+
| `localePathRedirect` | `boolean` | `false` | 接管 URL 语言前缀的识别、重定向和切换,详见[路由集成](./routing.md#启用语言路径前缀) |
|
|
51
|
+
| `i18nextDetector` | `boolean` | `false` | 启用 i18next 检测器(Cookie / Header 等) |
|
|
52
|
+
| `detection` | `LanguageDetectorOptions` | — | i18next 检测器详细配置,见[语言检测](./locale-detection.md) |
|
|
53
|
+
| `ignoreRedirectRoutes` | `string[] \| Function` | — | 跳过重定向的路由,见[语言检测](./locale-detection.md#ignoreredirectroutes) |
|
|
54
|
+
| `localeDetectionByEntry` | `Record<string, ...>` | — | 多入口按入口覆盖配置 |
|
|
81
55
|
|
|
82
|
-
|
|
56
|
+
**示例:**
|
|
83
57
|
|
|
84
58
|
```ts
|
|
85
59
|
i18nPlugin({
|
|
@@ -97,237 +71,78 @@ i18nPlugin({
|
|
|
97
71
|
});
|
|
98
72
|
```
|
|
99
73
|
|
|
100
|
-
### backend
|
|
101
|
-
|
|
102
|
-
`backend` 用于配置资源加载方式:
|
|
103
|
-
|
|
104
|
-
:::info
|
|
105
|
-
**自动检测**:插件会在以下场景自动检测并启用 backend:
|
|
106
|
-
|
|
107
|
-
1. **如果配置了 `loadPath` 或 `addPath`**:由于你已经指定了资源路径,backend 会自动启用(`enabled: true`),无需检测 locales 目录。
|
|
108
|
-
|
|
109
|
-
2. **如果没有配置 backend**:插件会自动检测以下位置是否存在 `locales` 目录:
|
|
110
|
-
|
|
111
|
-
- 项目根目录:`{项目根目录}/locales`
|
|
112
|
-
- Config public 目录:`{项目根目录}/config/public/locales`
|
|
113
|
-
- 通过 `server.publicDir` 配置的目录:`{项目根目录}/{publicDir}/locales`
|
|
114
|
-
|
|
115
|
-
如果目录存在且包含 JSON 文件,backend 会自动启用。
|
|
116
|
-
|
|
117
|
-
3. **如果显式设置 `enabled: false`**:不会进行自动检测,backend 保持禁用状态。
|
|
118
|
-
|
|
119
|
-
这种自动检测机制可以在 locales 目录不存在时减少不必要的 backend 注册,提升性能。
|
|
120
|
-
|
|
121
|
-
:::
|
|
74
|
+
### backend 选项
|
|
122
75
|
|
|
123
76
|
```ts
|
|
124
|
-
interface
|
|
125
|
-
|
|
77
|
+
interface BackendOptions {
|
|
78
|
+
// 是否启用后端资源加载
|
|
79
|
+
// 配置了 loadPath/addPath 时自动启用;locales 目录存在时也会自动检测
|
|
126
80
|
enabled?: boolean;
|
|
127
81
|
|
|
128
|
-
|
|
82
|
+
// 决定请求哪个 URL 或本地文件来获取翻译文案,支持 {{lng}} 和 {{ns}} 变量
|
|
83
|
+
// 默认:'/locales/{{lng}}/{{ns}}.json'
|
|
129
84
|
loadPath?: string;
|
|
130
85
|
|
|
131
|
-
|
|
86
|
+
// 缺失翻译的上报路径(可选)
|
|
132
87
|
addPath?: string;
|
|
133
88
|
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
* - `'none'`(默认):如果第一个后端返回了资源,则停止,不再尝试下一个后端
|
|
137
|
-
* - `'refresh'`:尝试从下一个后端刷新缓存并更新缓存
|
|
138
|
-
* - `'refreshAndUpdateStore'`:尝试从下一个后端刷新缓存,更新缓存并同时更新 i18next 资源存储。
|
|
139
|
-
* 这允许先显示 FS/HTTP 资源,然后 SDK 资源会异步更新它们。
|
|
140
|
-
*
|
|
141
|
-
* @default 'refreshAndUpdateStore' 当同时配置 loadPath 和 sdk 时
|
|
142
|
-
*/
|
|
143
|
-
cacheHitMode?: 'none' | 'refresh' | 'refreshAndUpdateStore';
|
|
89
|
+
// 启用自定义后端 SDK,实际加载函数在运行时配置中提供
|
|
90
|
+
sdk?: boolean | string;
|
|
144
91
|
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
* 当同时配置 `loadPath`(或 FS 后端)和 `sdk` 时,插件会自动使用 `i18next-chained-backend`
|
|
151
|
-
* 来链式加载多个后端。加载顺序为:
|
|
152
|
-
* 1. HTTP/FS 后端(主要)- 先从 `loadPath` 或文件系统加载,用于快速初始显示
|
|
153
|
-
* 2. SDK 后端(更新)- 从 SDK 函数加载,用于更新/刷新翻译
|
|
154
|
-
*
|
|
155
|
-
* 使用 `cacheHitMode: 'refreshAndUpdateStore'`(默认)时,FS/HTTP 资源会立即显示,
|
|
156
|
-
* 然后 SDK 资源会异步加载以更新翻译。
|
|
157
|
-
*/
|
|
158
|
-
sdk?: I18nSdkLoader | boolean | string;
|
|
159
|
-
}
|
|
92
|
+
// 链式后端的缓存策略(同时配置 loadPath 和 sdk 时生效)
|
|
93
|
+
// 'none' — 本地文件成功后不再请求自定义后端
|
|
94
|
+
// 'refresh' — 继续请求自定义后端并更新缓存,不更新页面
|
|
95
|
+
// 'refreshAndUpdateStore' — 继续请求并同步刷新页面文案(默认)
|
|
96
|
+
cacheHitMode?: 'none' | 'refresh' | 'refreshAndUpdateStore';
|
|
160
97
|
|
|
161
|
-
|
|
162
|
-
/** 按入口配置后端(多入口场景) */
|
|
98
|
+
// 多入口场景下按入口覆盖配置
|
|
163
99
|
backendOptionsByEntry?: Record<string, BaseBackendOptions>;
|
|
164
100
|
}
|
|
165
101
|
```
|
|
166
102
|
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
**1. 仅使用 HTTP/FS 后端**:
|
|
170
|
-
|
|
171
|
-
你可以显式启用 backend:
|
|
172
|
-
|
|
173
|
-
```ts
|
|
174
|
-
i18nPlugin({
|
|
175
|
-
backend: {
|
|
176
|
-
enabled: true,
|
|
177
|
-
loadPath: '/locales/{{lng}}/{{ns}}.json',
|
|
178
|
-
},
|
|
179
|
-
});
|
|
180
|
-
```
|
|
181
|
-
|
|
182
|
-
或者只需配置 `loadPath` 或 `addPath`,backend 会自动启用:
|
|
103
|
+
**`sdk` 字段说明:** 在 `modern.config.ts` 中设为 `true` 表示声明启用,实际加载函数在 `modern.runtime.ts` 的 `initOptions.backend.sdk` 中提供。详见[资源加载 → 自定义后端](./resource-loading.md#自定义后端)。
|
|
183
104
|
|
|
184
|
-
|
|
185
|
-
i18nPlugin({
|
|
186
|
-
backend: {
|
|
187
|
-
// enabled 会自动设置为 true
|
|
188
|
-
loadPath: '/locales/{{lng}}/{{ns}}.json',
|
|
189
|
-
},
|
|
190
|
-
});
|
|
191
|
-
```
|
|
105
|
+
**backend 自动启用规则:**
|
|
192
106
|
|
|
193
|
-
|
|
107
|
+
| 情况 | 结果 |
|
|
108
|
+
| --- | --- |
|
|
109
|
+
| 配置了 `loadPath` 或 `addPath` | 自动启用,无需写 `enabled: true` |
|
|
110
|
+
| 未配置 backend,但 `locales` 目录存在且有 JSON 文件 | 自动启用,使用默认 `loadPath` |
|
|
111
|
+
| 显式设置 `enabled: false` | 禁用,不做自动检测 |
|
|
194
112
|
|
|
195
|
-
|
|
113
|
+
自动检测的目录位置(按优先级):
|
|
114
|
+
1. `{项目根目录}/config/public/locales`
|
|
115
|
+
2. `server.publicDir` 配置的目录下的 `locales` 子目录
|
|
196
116
|
|
|
197
|
-
|
|
198
|
-
i18nPlugin({
|
|
199
|
-
// 没有 backend 配置 - 插件会自动检测 locales 目录
|
|
200
|
-
localeDetection: {
|
|
201
|
-
languages: ['zh', 'en'],
|
|
202
|
-
fallbackLanguage: 'en',
|
|
203
|
-
},
|
|
204
|
-
});
|
|
205
|
-
```
|
|
117
|
+
**选择哪种后端?**
|
|
206
118
|
|
|
207
|
-
|
|
119
|
+
| 场景 | 推荐方式 |
|
|
120
|
+
| --- | --- |
|
|
121
|
+
| 翻译文件放在项目本地 | 静态文件后端(配置 `loadPath`,CSR/SSR 自动切换) |
|
|
122
|
+
| 翻译来自远程 API 或翻译平台 | 自定义后端(配置 `sdk: true`) |
|
|
123
|
+
| 本地兜底 + 远程实时更新 | 链式后端(同时配置 `loadPath` 和 `sdk`) |
|
|
208
124
|
|
|
209
|
-
|
|
125
|
+
详细用法见[资源加载](./resource-loading.md)。
|
|
210
126
|
|
|
211
|
-
|
|
127
|
+
## 运行时配置
|
|
212
128
|
|
|
213
|
-
```ts
|
|
214
|
-
i18nPlugin({
|
|
215
|
-
backend: {
|
|
216
|
-
enabled: true,
|
|
217
|
-
// 当未配置 loadPath 时,将自动使用默认的 '/locales/{{lng}}/{{ns}}.json'
|
|
218
|
-
sdk: true, // SDK 后端
|
|
219
|
-
// cacheHitMode: 'refreshAndUpdateStore', // 默认值,可省略
|
|
220
|
-
},
|
|
221
|
-
});
|
|
222
|
-
```
|
|
223
|
-
|
|
224
|
-
你也可以显式配置 `loadPath`:
|
|
225
|
-
|
|
226
|
-
```ts
|
|
227
|
-
i18nPlugin({
|
|
228
|
-
backend: {
|
|
229
|
-
enabled: true,
|
|
230
|
-
loadPath: '/locales/{{lng}}/{{ns}}.json', // HTTP/FS 后端
|
|
231
|
-
sdk: true, // SDK 后端
|
|
232
|
-
},
|
|
233
|
-
});
|
|
234
|
-
```
|
|
235
|
-
|
|
236
|
-
在 `modern.runtime.ts` 中提供 SDK 函数:
|
|
237
|
-
|
|
238
|
-
```ts
|
|
239
|
-
export default defineRuntimeConfig({
|
|
240
|
-
i18n: {
|
|
241
|
-
initOptions: {
|
|
242
|
-
backend: {
|
|
243
|
-
sdk: async options => {
|
|
244
|
-
// SDK 实现
|
|
245
|
-
if (options.lng && options.ns) {
|
|
246
|
-
return await mySdk.getResource(options.lng, options.ns);
|
|
247
|
-
}
|
|
248
|
-
},
|
|
249
|
-
},
|
|
250
|
-
},
|
|
251
|
-
},
|
|
252
|
-
});
|
|
253
|
-
```
|
|
254
|
-
|
|
255
|
-
使用链式后端时,系统会:
|
|
256
|
-
|
|
257
|
-
1. 首先从 `/locales/{{lng}}/{{ns}}.json` 加载资源并立即显示(快速显示基础翻译)
|
|
258
|
-
2. 然后异步从 SDK 加载资源并更新 i18next store(更新/补充翻译)
|
|
259
|
-
|
|
260
|
-
这样可以确保用户快速看到页面内容,同时后台加载最新的翻译资源。
|
|
261
|
-
|
|
262
|
-
**3. 仅使用 SDK 后端**:
|
|
263
|
-
|
|
264
|
-
如果你需要禁用 HTTP/FS 后端并仅使用 SDK 后端,可以显式设置 `loadPath: ''`:
|
|
265
|
-
|
|
266
|
-
```ts
|
|
267
|
-
i18nPlugin({
|
|
268
|
-
backend: {
|
|
269
|
-
enabled: true,
|
|
270
|
-
loadPath: '', // 显式禁用 HTTP/FS 后端
|
|
271
|
-
sdk: true, // 仅使用 SDK 后端
|
|
272
|
-
},
|
|
273
|
-
});
|
|
274
|
-
```
|
|
275
|
-
|
|
276
|
-
:::warning
|
|
277
|
-
当仅使用 SDK 后端时,必须在 `modern.runtime.ts` 中提供实际的 SDK 函数,否则将回退到 HTTP/FS 后端。
|
|
278
|
-
|
|
279
|
-
:::
|
|
280
|
-
|
|
281
|
-
### 多入口配置
|
|
282
|
-
|
|
283
|
-
如果项目有多个入口,可以为每个入口单独配置:
|
|
284
|
-
|
|
285
|
-
```ts
|
|
286
|
-
i18nPlugin({
|
|
287
|
-
localeDetection: {
|
|
288
|
-
localePathRedirect: true,
|
|
289
|
-
languages: ['zh', 'en'],
|
|
290
|
-
fallbackLanguage: 'en',
|
|
291
|
-
// 为特定入口覆盖配置
|
|
292
|
-
localeDetectionByEntry: {
|
|
293
|
-
admin: {
|
|
294
|
-
localePathRedirect: false, // admin 入口不使用路径重定向
|
|
295
|
-
},
|
|
296
|
-
},
|
|
297
|
-
},
|
|
298
|
-
backend: {
|
|
299
|
-
enabled: true,
|
|
300
|
-
// 为特定入口覆盖配置
|
|
301
|
-
backendOptionsByEntry: {
|
|
302
|
-
admin: {
|
|
303
|
-
loadPath: '/admin/locales/{{lng}}/{{ns}}.json',
|
|
304
|
-
},
|
|
305
|
-
},
|
|
306
|
-
},
|
|
307
|
-
});
|
|
308
|
-
```
|
|
309
|
-
|
|
310
|
-
## 运行时配置(modern.runtime.ts)
|
|
311
|
-
|
|
312
|
-
在 `src/modern.runtime.ts` 中可以配置运行时选项:
|
|
313
|
-
|
|
314
|
-
```ts
|
|
129
|
+
```ts title="src/modern.runtime.ts"
|
|
315
130
|
import { defineRuntimeConfig } from '@modern-js/runtime';
|
|
316
131
|
import i18next from 'i18next';
|
|
317
132
|
|
|
318
|
-
// 建议创建一个新的 i18next 实例,避免使用全局默认实例
|
|
319
133
|
const i18nInstance = i18next.createInstance();
|
|
320
134
|
|
|
321
135
|
export default defineRuntimeConfig({
|
|
322
136
|
i18n: {
|
|
323
|
-
//
|
|
324
|
-
i18nInstance: i18nInstance,
|
|
325
|
-
|
|
326
|
-
// i18next 初始化选项
|
|
137
|
+
i18nInstance, // 可选,建议使用独立实例
|
|
327
138
|
initOptions: {
|
|
328
139
|
fallbackLng: 'en',
|
|
329
140
|
supportedLngs: ['zh', 'en'],
|
|
330
|
-
|
|
141
|
+
ns: ['translation'],
|
|
142
|
+
defaultNS: 'translation',
|
|
143
|
+
interpolation: {
|
|
144
|
+
escapeValue: false, // React 已默认转义文本,此处关闭避免重复转义
|
|
145
|
+
},
|
|
331
146
|
},
|
|
332
147
|
},
|
|
333
148
|
});
|
|
@@ -341,92 +156,64 @@ import CustomInstanceCode from '@site-docs/components/international/custom-insta
|
|
|
341
156
|
|
|
342
157
|
<CustomInstanceCode />
|
|
343
158
|
|
|
344
|
-
### initOptions
|
|
159
|
+
### initOptions
|
|
345
160
|
|
|
346
|
-
import
|
|
161
|
+
import Desc from '@site-docs/components/international/init-options-desc';
|
|
347
162
|
|
|
348
|
-
<
|
|
163
|
+
<Desc />
|
|
349
164
|
|
|
350
|
-
|
|
165
|
+
| 字段 | 说明 |
|
|
166
|
+
| --- | --- |
|
|
167
|
+
| `fallbackLng` | i18next 找不到翻译键时回退到哪个语言的资源,支持字符串、数组或映射(回退链) |
|
|
168
|
+
| `supportedLngs` | i18next 支持的语言列表 |
|
|
169
|
+
| `ns` | 命名空间列表,默认 `['translation']` |
|
|
170
|
+
| `defaultNS` | 默认命名空间,默认 `'translation'` |
|
|
171
|
+
| `lng` | 强制指定初始语言(通常不需要,由检测器决定) |
|
|
351
172
|
|
|
352
|
-
|
|
353
|
-
:::
|
|
173
|
+
`fallbackLng` 支持回退链写法,适合区域语言降级的场景:
|
|
354
174
|
|
|
355
175
|
```ts
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
fallbackLng: 'en',
|
|
362
|
-
supportedLngs: ['zh', 'en'],
|
|
363
|
-
|
|
364
|
-
// 命名空间相关
|
|
365
|
-
ns: ['translation', 'common'],
|
|
366
|
-
defaultNS: 'translation',
|
|
367
|
-
|
|
368
|
-
// React 相关
|
|
369
|
-
react: {
|
|
370
|
-
useSuspense: false,
|
|
371
|
-
},
|
|
372
|
-
|
|
373
|
-
// 其他 i18next 选项
|
|
374
|
-
interpolation: {
|
|
375
|
-
escapeValue: false,
|
|
376
|
-
},
|
|
377
|
-
},
|
|
176
|
+
initOptions: {
|
|
177
|
+
lng: 'zh-CN',
|
|
178
|
+
fallbackLng: {
|
|
179
|
+
'zh-CN': ['zh', 'en'], // zh-CN 找不到时,先找 zh,再找 en
|
|
180
|
+
default: ['en'],
|
|
378
181
|
},
|
|
379
|
-
}
|
|
182
|
+
},
|
|
380
183
|
```
|
|
381
184
|
|
|
382
|
-
###
|
|
383
|
-
|
|
384
|
-
如果使用 SDK 后端,需要在运行时配置中提供实际的 SDK 函数:
|
|
385
|
-
|
|
386
|
-
:::info
|
|
387
|
-
函数类型的配置只能在运行时配置中设置。在 CLI 配置中,`sdk` 只能设置为 `true` 或字符串标识符来启用 SDK 模式,实际的函数实现必须在 `modern.runtime.ts` 中提供。
|
|
388
|
-
:::
|
|
185
|
+
### 自定义后端函数配置
|
|
389
186
|
|
|
390
|
-
|
|
187
|
+
自定义后端的实际加载函数必须在运行时配置中提供:
|
|
391
188
|
|
|
392
189
|
```ts
|
|
190
|
+
// modern.config.ts:只声明启用
|
|
393
191
|
i18nPlugin({
|
|
394
|
-
backend: {
|
|
395
|
-
enabled: true,
|
|
396
|
-
sdk: true, // 启用 SDK 模式
|
|
397
|
-
},
|
|
192
|
+
backend: { sdk: true },
|
|
398
193
|
});
|
|
399
|
-
```
|
|
400
194
|
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
```ts
|
|
404
|
-
import { defineRuntimeConfig } from '@modern-js/runtime';
|
|
195
|
+
// modern.runtime.ts:提供实际函数
|
|
405
196
|
import type { I18nSdkLoader } from '@modern-js/plugin-i18n/runtime';
|
|
406
197
|
|
|
407
|
-
const
|
|
408
|
-
if (options.all) {
|
|
409
|
-
// 加载所有资源
|
|
410
|
-
return await fetchAllResources();
|
|
411
|
-
}
|
|
412
|
-
|
|
198
|
+
const myLoader: I18nSdkLoader = async options => {
|
|
413
199
|
if (options.lng && options.ns) {
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
return response.json();
|
|
200
|
+
const res = await fetch(`/api/i18n/${options.lng}/${options.ns}`);
|
|
201
|
+
return res.json();
|
|
417
202
|
}
|
|
418
|
-
|
|
419
|
-
// 处理其他情况
|
|
420
203
|
return {};
|
|
421
204
|
};
|
|
422
205
|
|
|
423
206
|
export default defineRuntimeConfig({
|
|
424
207
|
i18n: {
|
|
425
208
|
initOptions: {
|
|
426
|
-
backend: {
|
|
427
|
-
sdk: mySdkLoader,
|
|
428
|
-
},
|
|
209
|
+
backend: { sdk: myLoader },
|
|
429
210
|
},
|
|
430
211
|
},
|
|
431
212
|
});
|
|
432
213
|
```
|
|
214
|
+
|
|
215
|
+
完整用法见[资源加载 → 自定义后端](./resource-loading.md#自定义后端)。
|
|
216
|
+
|
|
217
|
+
## 多入口配置
|
|
218
|
+
|
|
219
|
+
多入口项目可以为每个入口单独覆盖配置,详见[高级用法 → 多入口配置](./advanced.md#多入口配置)。
|