@modern-js/main-doc 3.1.5 → 3.2.0

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.
Files changed (46) hide show
  1. package/docs/en/components/international/init-options-desc.mdx +1 -1
  2. package/docs/en/components/international/install-command.mdx +4 -17
  3. package/docs/en/components/international/instance-code.mdx +4 -14
  4. package/docs/en/components/international/introduce.mdx +4 -1
  5. package/docs/en/configure/app/source/enable-async-pre-entry.mdx +30 -0
  6. package/docs/en/configure/app/tools/dev-server.mdx +0 -4
  7. package/docs/en/guides/advanced-features/international/_meta.json +0 -1
  8. package/docs/en/guides/advanced-features/international/advanced.mdx +48 -109
  9. package/docs/en/guides/advanced-features/international/api.mdx +125 -290
  10. package/docs/en/guides/advanced-features/international/best-practices.mdx +203 -48
  11. package/docs/en/guides/advanced-features/international/configuration.mdx +108 -315
  12. package/docs/en/guides/advanced-features/international/locale-detection.mdx +62 -208
  13. package/docs/en/guides/advanced-features/international/quick-start.mdx +41 -55
  14. package/docs/en/guides/advanced-features/international/resource-loading.mdx +63 -322
  15. package/docs/en/guides/advanced-features/international/routing.mdx +60 -138
  16. package/docs/en/guides/advanced-features/international.mdx +19 -27
  17. package/docs/en/guides/basic-features/alias.mdx +1 -1
  18. package/docs/en/guides/basic-features/html.mdx +2 -2
  19. package/docs/en/guides/basic-features/static-assets.mdx +1 -2
  20. package/docs/en/guides/concept/entries.mdx +2 -2
  21. package/docs/zh/components/international/init-options-desc.mdx +1 -1
  22. package/docs/zh/components/international/install-command.mdx +4 -16
  23. package/docs/zh/components/international/instance-code.mdx +4 -14
  24. package/docs/zh/components/international/introduce.mdx +5 -2
  25. package/docs/zh/configure/app/source/enable-async-pre-entry.mdx +77 -0
  26. package/docs/zh/configure/app/tools/dev-server.mdx +0 -4
  27. package/docs/zh/guides/advanced-features/bff/function.mdx +2 -2
  28. package/docs/zh/guides/advanced-features/international/_meta.json +0 -1
  29. package/docs/zh/guides/advanced-features/international/advanced.mdx +48 -109
  30. package/docs/zh/guides/advanced-features/international/api.mdx +126 -292
  31. package/docs/zh/guides/advanced-features/international/best-practices.mdx +204 -49
  32. package/docs/zh/guides/advanced-features/international/configuration.mdx +105 -318
  33. package/docs/zh/guides/advanced-features/international/locale-detection.mdx +62 -236
  34. package/docs/zh/guides/advanced-features/international/quick-start.mdx +40 -54
  35. package/docs/zh/guides/advanced-features/international/resource-loading.mdx +62 -324
  36. package/docs/zh/guides/advanced-features/international/routing.mdx +58 -136
  37. package/docs/zh/guides/advanced-features/international.mdx +19 -26
  38. package/docs/zh/guides/basic-features/alias.mdx +1 -1
  39. package/docs/zh/guides/basic-features/html.mdx +2 -2
  40. package/docs/zh/guides/basic-features/static-assets.mdx +1 -2
  41. package/docs/zh/guides/concept/entries.mdx +2 -2
  42. package/package.json +4 -4
  43. package/docs/en/components/rspackPrecautions.mdx +0 -6
  44. package/docs/en/guides/advanced-features/international/basic.mdx +0 -417
  45. package/docs/zh/components/rspackPrecautions.mdx +0 -6
  46. package/docs/zh/guides/advanced-features/international/basic.mdx +0 -416
@@ -4,103 +4,81 @@ title: 高级用法
4
4
 
5
5
  # 高级用法
6
6
 
7
- ## SSR 配置
7
+ ## SSR 场景
8
8
 
9
- 插件完全支持服务端渲染(SSR)场景。
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
- enabled: true,
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
- └── locales/
61
- ├── en/
62
- └── translation.json
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'], // admin 入口只支持英文
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
- enabled: true,
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
- 如果需要使用自定义的 i18next 实例,可以在运行时配置中提供。
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
- fallbackLng: 'en',
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
- 如果未启用 `localePathRedirect`,语言切换只会更新 i18next 实例和缓存,不会改变 URL。
127
+ 调用 `changeLanguage` 切换语言时:
193
128
 
129
+ - **翻译更新**:所有使用 `t()` 的组件自动重新渲染,无需手动刷新
130
+ - **URL 更新**(启用 `localePathRedirect` 时):使用 `history.pushState` 更新 URL,不触发页面刷新,不影响浏览器前进/后退历史
131
+ - **缓存更新**:根据 `caches` 配置写入 Cookie 或 LocalStorage,下次访问自动还原语言选择
132
+ - **未启用路径前缀时**:只更新 i18next 实例和缓存,URL 不变