@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
|
@@ -188,7 +188,7 @@ Dynamic Path 之后的参数是包含 querystring、request body 的对象 `Requ
|
|
|
188
188
|
在不存在动态路由的普通函数中,可以从第一个入参中获取传入的 `data` 和 `query`,例如:
|
|
189
189
|
|
|
190
190
|
```ts title="api/lambda/hello.ts"
|
|
191
|
-
import type { RequestOption } from '@modern-js/server
|
|
191
|
+
import type { RequestOption } from '@modern-js/plugin-bff/server';
|
|
192
192
|
|
|
193
193
|
export async function post({
|
|
194
194
|
query,
|
|
@@ -201,7 +201,7 @@ export async function post({
|
|
|
201
201
|
这里你也可以使用自定义类型:
|
|
202
202
|
|
|
203
203
|
```ts title="api/lambda/hello.ts"
|
|
204
|
-
import type { RequestOption } from '@modern-js/server
|
|
204
|
+
import type { RequestOption } from '@modern-js/plugin-bff/server';
|
|
205
205
|
|
|
206
206
|
type IQuery = {
|
|
207
207
|
// some types
|
|
@@ -4,103 +4,81 @@ title: 高级用法
|
|
|
4
4
|
|
|
5
5
|
# 高级用法
|
|
6
6
|
|
|
7
|
-
## SSR
|
|
7
|
+
## SSR 场景
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
SSR 场景下,插件在服务端检测语言、加载翻译资源,并将结果注入页面,客户端直接复用,避免语言闪烁。
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
在 SSR 场景下,插件会从 HTTP 请求中检测语言:
|
|
14
|
-
|
|
15
|
-
1. **URL 路径**:从路径中提取语言前缀
|
|
16
|
-
2. **Cookie**:从 Cookie 中读取语言设置
|
|
17
|
-
3. **请求头**:从 `Accept-Language` 请求头读取
|
|
18
|
-
|
|
19
|
-
**配置示例**:
|
|
20
|
-
|
|
21
|
-
```ts
|
|
22
|
-
i18nPlugin({
|
|
23
|
-
localeDetection: {
|
|
24
|
-
localePathRedirect: true,
|
|
25
|
-
i18nextDetector: true,
|
|
26
|
-
languages: ['zh', 'en'],
|
|
27
|
-
fallbackLanguage: 'en',
|
|
28
|
-
detection: {
|
|
29
|
-
order: ['path', 'cookie', 'header'],
|
|
30
|
-
lookupHeader: 'accept-language',
|
|
31
|
-
},
|
|
32
|
-
},
|
|
33
|
-
})
|
|
34
|
-
```
|
|
35
|
-
|
|
36
|
-
### SSR 资源加载
|
|
37
|
-
|
|
38
|
-
在 SSR 场景下,插件会自动使用文件系统后端加载资源:
|
|
11
|
+
**完整配置:**
|
|
39
12
|
|
|
40
13
|
```ts
|
|
14
|
+
// modern.config.ts
|
|
41
15
|
export default defineConfig({
|
|
42
16
|
server: {
|
|
43
17
|
ssr: true,
|
|
44
|
-
publicDir: './locales', // 资源文件目录
|
|
45
18
|
},
|
|
46
19
|
plugins: [
|
|
20
|
+
appTools(),
|
|
47
21
|
i18nPlugin({
|
|
22
|
+
localeDetection: {
|
|
23
|
+
localePathRedirect: true,
|
|
24
|
+
i18nextDetector: true,
|
|
25
|
+
languages: ['zh', 'en'],
|
|
26
|
+
fallbackLanguage: 'en',
|
|
27
|
+
detection: {
|
|
28
|
+
order: ['path', 'cookie', 'header'],
|
|
29
|
+
lookupHeader: 'accept-language',
|
|
30
|
+
caches: ['cookie'],
|
|
31
|
+
},
|
|
32
|
+
},
|
|
48
33
|
backend: {
|
|
49
|
-
|
|
34
|
+
loadPath: '/locales/{{lng}}/{{ns}}.json',
|
|
50
35
|
},
|
|
51
36
|
}),
|
|
52
37
|
],
|
|
53
38
|
});
|
|
54
39
|
```
|
|
55
40
|
|
|
56
|
-
|
|
41
|
+
服务端检测语言的优先级:URL 路径 → Cookie → `Accept-Language` 请求头 → `fallbackLanguage`。
|
|
42
|
+
|
|
43
|
+
**路由配置(约定式路由):**
|
|
57
44
|
|
|
58
45
|
```
|
|
59
|
-
|
|
60
|
-
└──
|
|
61
|
-
├──
|
|
62
|
-
|
|
63
|
-
└── zh/
|
|
64
|
-
└── translation.json
|
|
46
|
+
routes/
|
|
47
|
+
└── [lang]/
|
|
48
|
+
├── layout.tsx
|
|
49
|
+
└── page.tsx
|
|
65
50
|
```
|
|
66
51
|
|
|
67
|
-
|
|
52
|
+
SSR 场景下,服务端检测到的语言会写入 `window._SSR_DATA`,客户端直接读取,不会再重新检测,确保两端语言一致。
|
|
68
53
|
|
|
69
|
-
|
|
54
|
+
## 多入口配置
|
|
70
55
|
|
|
71
|
-
|
|
56
|
+
不同入口可以使用不同的语言列表、检测方式和资源路径:
|
|
72
57
|
|
|
73
58
|
```ts
|
|
59
|
+
// modern.config.ts
|
|
74
60
|
i18nPlugin({
|
|
75
61
|
localeDetection: {
|
|
76
|
-
//
|
|
62
|
+
// 全局默认配置
|
|
77
63
|
localePathRedirect: true,
|
|
78
64
|
languages: ['zh', 'en'],
|
|
79
65
|
fallbackLanguage: 'en',
|
|
80
66
|
|
|
81
|
-
//
|
|
67
|
+
// 按入口覆盖
|
|
82
68
|
localeDetectionByEntry: {
|
|
83
69
|
admin: {
|
|
84
|
-
localePathRedirect: false, // admin
|
|
85
|
-
languages: ['en'],
|
|
70
|
+
localePathRedirect: false, // admin 入口不使用路径前缀
|
|
71
|
+
languages: ['en'], // admin 只支持英文
|
|
86
72
|
},
|
|
87
73
|
mobile: {
|
|
88
|
-
languages: ['zh', 'en', 'ja'], // mobile
|
|
74
|
+
languages: ['zh', 'en', 'ja'], // mobile 支持更多语言
|
|
89
75
|
},
|
|
90
76
|
},
|
|
91
77
|
},
|
|
92
|
-
})
|
|
93
|
-
```
|
|
94
|
-
|
|
95
|
-
### 按入口配置后端
|
|
96
|
-
|
|
97
|
-
```ts
|
|
98
|
-
i18nPlugin({
|
|
99
78
|
backend: {
|
|
100
|
-
|
|
101
|
-
loadPath: '/locales/{{lng}}/{{ns}}.json', // 默认路径
|
|
79
|
+
loadPath: '/locales/{{lng}}/{{ns}}.json', // 全局默认路径
|
|
102
80
|
|
|
103
|
-
//
|
|
81
|
+
// 按入口覆盖
|
|
104
82
|
backendOptionsByEntry: {
|
|
105
83
|
admin: {
|
|
106
84
|
loadPath: '/admin/locales/{{lng}}/{{ns}}.json',
|
|
@@ -110,33 +88,24 @@ i18nPlugin({
|
|
|
110
88
|
},
|
|
111
89
|
},
|
|
112
90
|
},
|
|
113
|
-
})
|
|
91
|
+
});
|
|
114
92
|
```
|
|
115
93
|
|
|
116
94
|
## 自定义 i18next 实例
|
|
117
95
|
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
### 创建自定义实例
|
|
96
|
+
默认情况下,插件会使用内部创建的 i18next 实例。如果需要对实例进行深度定制(如使用自定义插件、预配置选项),可以在运行时配置中传入自定义实例:
|
|
121
97
|
|
|
122
98
|
```ts
|
|
123
99
|
// src/i18n.ts
|
|
124
100
|
import i18next from 'i18next';
|
|
125
101
|
|
|
126
|
-
const customI18n = i18next.createInstance(
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
supportedLngs: ['zh', 'en'],
|
|
130
|
-
interpolation: {
|
|
131
|
-
escapeValue: false,
|
|
132
|
-
},
|
|
133
|
-
});
|
|
102
|
+
const customI18n = i18next.createInstance();
|
|
103
|
+
// 可以在此 use() 自定义插件
|
|
104
|
+
// customI18n.use(MyPlugin);
|
|
134
105
|
|
|
135
106
|
export default customI18n;
|
|
136
107
|
```
|
|
137
108
|
|
|
138
|
-
### 传递自定义实例
|
|
139
|
-
|
|
140
109
|
```ts
|
|
141
110
|
// src/modern.runtime.ts
|
|
142
111
|
import { defineRuntimeConfig } from '@modern-js/runtime';
|
|
@@ -146,48 +115,18 @@ export default defineRuntimeConfig({
|
|
|
146
115
|
i18n: {
|
|
147
116
|
i18nInstance: customI18n,
|
|
148
117
|
initOptions: {
|
|
149
|
-
|
|
118
|
+
fallbackLng: 'en',
|
|
119
|
+
supportedLngs: ['zh', 'en'],
|
|
150
120
|
},
|
|
151
121
|
},
|
|
152
122
|
});
|
|
153
123
|
```
|
|
154
124
|
|
|
155
|
-
##
|
|
156
|
-
|
|
157
|
-
### 编程式切换
|
|
158
|
-
|
|
159
|
-
使用 `useModernI18n` Hook 的 `changeLanguage` 方法:
|
|
160
|
-
|
|
161
|
-
```tsx
|
|
162
|
-
import { useModernI18n } from '@modern-js/plugin-i18n/runtime';
|
|
163
|
-
|
|
164
|
-
function LanguageSwitcher() {
|
|
165
|
-
const { language, changeLanguage, supportedLanguages } = useModernI18n();
|
|
166
|
-
|
|
167
|
-
return (
|
|
168
|
-
<select
|
|
169
|
-
value={language}
|
|
170
|
-
onChange={e => changeLanguage(e.target.value)}
|
|
171
|
-
>
|
|
172
|
-
{supportedLanguages.map(lang => (
|
|
173
|
-
<option key={lang} value={lang}>
|
|
174
|
-
{lang}
|
|
175
|
-
</option>
|
|
176
|
-
))}
|
|
177
|
-
</select>
|
|
178
|
-
);
|
|
179
|
-
}
|
|
180
|
-
```
|
|
181
|
-
|
|
182
|
-
### URL 同步
|
|
183
|
-
|
|
184
|
-
当启用 `localePathRedirect` 时,切换语言会自动更新 URL:
|
|
185
|
-
|
|
186
|
-
```tsx
|
|
187
|
-
// 当前 URL: /en/about
|
|
188
|
-
// 调用 changeLanguage('zh')
|
|
189
|
-
// URL 自动更新为: /zh/about
|
|
190
|
-
```
|
|
125
|
+
## 语言切换行为说明
|
|
191
126
|
|
|
192
|
-
|
|
127
|
+
调用 `changeLanguage` 切换语言时:
|
|
193
128
|
|
|
129
|
+
- **翻译更新**:所有使用 `t()` 的组件自动重新渲染,无需手动刷新
|
|
130
|
+
- **URL 更新**(启用 `localePathRedirect` 时):使用 `history.pushState` 更新 URL,不触发页面刷新,不影响浏览器前进/后退历史
|
|
131
|
+
- **缓存更新**:根据 `caches` 配置写入 Cookie 或 LocalStorage,下次访问自动还原语言选择
|
|
132
|
+
- **未启用路径前缀时**:只更新 i18next 实例和缓存,URL 不变
|