@intlayer/docs 9.2.0 → 9.3.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/README.md +24 -24
- package/blog/ar/index.md +1 -1
- package/blog/ar/rag_powered_documentation_assistant.md +1 -1
- package/blog/de/index.md +1 -1
- package/blog/en/index.md +1 -1
- package/blog/en-GB/index.md +1 -1
- package/blog/es/index.md +1 -1
- package/blog/fr/index.md +1 -1
- package/blog/hi/index.md +1 -1
- package/blog/id/index.md +1 -1
- package/blog/it/index.md +1 -1
- package/blog/ja/index.md +1 -1
- package/blog/ko/index.md +1 -1
- package/blog/pl/index.md +1 -1
- package/blog/pl/rag_powered_documentation_assistant.md +1 -1
- package/blog/pt/index.md +1 -1
- package/blog/ru/index.md +1 -1
- package/blog/uk/index.md +1 -1
- package/blog/vi/index.md +1 -1
- package/blog/zh/index.md +1 -1
- package/dist/cjs/_virtual/_rolldown/runtime.cjs +1 -2
- package/dist/cjs/authors2.cjs +0 -1
- package/dist/cjs/common.cjs +24 -1
- package/dist/cjs/common.cjs.map +1 -1
- package/dist/cjs/generated/blog.entry.cjs +35 -6
- package/dist/cjs/generated/blog.entry.cjs.map +1 -1
- package/dist/cjs/generated/docs.entry.cjs +35 -6
- package/dist/cjs/generated/docs.entry.cjs.map +1 -1
- package/dist/cjs/generated/frequentQuestions.entry.cjs +35 -6
- package/dist/cjs/generated/frequentQuestions.entry.cjs.map +1 -1
- package/dist/cjs/generated/legal.entry.cjs +35 -6
- package/dist/cjs/generated/legal.entry.cjs.map +1 -1
- package/dist/esm/common.mjs +24 -1
- package/dist/esm/common.mjs.map +1 -1
- package/dist/esm/generated/blog.entry.mjs +35 -6
- package/dist/esm/generated/blog.entry.mjs.map +1 -1
- package/dist/esm/generated/docs.entry.mjs +35 -6
- package/dist/esm/generated/docs.entry.mjs.map +1 -1
- package/dist/esm/generated/frequentQuestions.entry.mjs +35 -6
- package/dist/esm/generated/frequentQuestions.entry.mjs.map +1 -1
- package/dist/esm/generated/legal.entry.mjs +35 -6
- package/dist/esm/generated/legal.entry.mjs.map +1 -1
- package/dist/types/common.d.ts.map +1 -1
- package/dist/types/generated/blog.entry.d.ts.map +1 -1
- package/dist/types/generated/docs.entry.d.ts.map +1 -1
- package/dist/types/generated/frequentQuestions.entry.d.ts.map +1 -1
- package/dist/types/generated/legal.entry.d.ts.map +1 -1
- package/docs/ar/bundle_optimization.md +58 -25
- package/docs/ar/configuration.md +10 -10
- package/docs/ar/interest_of_intlayer.md +24 -22
- package/docs/ar/intlayer_with_express.md +1 -1
- package/docs/ar/intlayer_with_svelte_kit.md +1 -1
- package/docs/ar/intlayer_with_tanstack+solid.md +5 -3
- package/docs/ar/intlayer_with_tanstack.md +5 -3
- package/docs/ar/live-sync.md +4 -0
- package/docs/ar/lsp.md +114 -175
- package/docs/ar/readme.md +25 -25
- package/docs/bn/bundle_optimization.md +58 -25
- package/docs/bn/configuration.md +10 -10
- package/docs/bn/interest_of_intlayer.md +24 -22
- package/docs/cs/bundle_optimization.md +58 -25
- package/docs/cs/configuration.md +10 -10
- package/docs/cs/interest_of_intlayer.md +24 -22
- package/docs/de/bundle_optimization.md +58 -25
- package/docs/de/configuration.md +10 -10
- package/docs/de/interest_of_intlayer.md +24 -22
- package/docs/de/intlayer_with_svelte_kit.md +1 -1
- package/docs/de/intlayer_with_tanstack+solid.md +5 -3
- package/docs/de/intlayer_with_tanstack.md +5 -3
- package/docs/de/live-sync.md +4 -0
- package/docs/de/lsp.md +111 -172
- package/docs/de/readme.md +24 -24
- package/docs/en/bundle_optimization.md +51 -23
- package/docs/en/configuration.md +10 -10
- package/docs/en/interest_of_intlayer.md +24 -22
- package/docs/en/intlayer_with_svelte_kit.md +1 -1
- package/docs/en/intlayer_with_tanstack+solid.md +5 -3
- package/docs/en/intlayer_with_tanstack.md +5 -3
- package/docs/en/live-sync.md +4 -0
- package/docs/en/lsp.md +109 -170
- package/docs/en/readme.md +24 -24
- package/docs/en-GB/bundle_optimization.md +58 -25
- package/docs/en-GB/configuration.md +10 -10
- package/docs/en-GB/interest_of_intlayer.md +24 -22
- package/docs/en-GB/intlayer_with_svelte_kit.md +1 -1
- package/docs/en-GB/intlayer_with_tanstack+solid.md +5 -3
- package/docs/en-GB/intlayer_with_tanstack.md +5 -3
- package/docs/en-GB/live-sync.md +4 -0
- package/docs/en-GB/lsp.md +109 -170
- package/docs/en-GB/readme.md +24 -24
- package/docs/es/bundle_optimization.md +58 -25
- package/docs/es/configuration.md +10 -10
- package/docs/es/interest_of_intlayer.md +24 -22
- package/docs/es/intlayer_with_svelte_kit.md +1 -1
- package/docs/es/intlayer_with_tanstack+solid.md +5 -3
- package/docs/es/intlayer_with_tanstack.md +5 -3
- package/docs/es/live-sync.md +4 -0
- package/docs/es/lsp.md +114 -175
- package/docs/es/readme.md +24 -24
- package/docs/fr/bundle_optimization.md +58 -25
- package/docs/fr/configuration.md +10 -10
- package/docs/fr/interest_of_intlayer.md +24 -22
- package/docs/fr/intlayer_with_svelte_kit.md +1 -1
- package/docs/fr/intlayer_with_tanstack+solid.md +5 -3
- package/docs/fr/intlayer_with_tanstack.md +5 -3
- package/docs/fr/live-sync.md +4 -0
- package/docs/fr/lsp.md +110 -171
- package/docs/fr/readme.md +24 -24
- package/docs/hi/bundle_optimization.md +58 -25
- package/docs/hi/configuration.md +10 -10
- package/docs/hi/interest_of_intlayer.md +24 -22
- package/docs/hi/intlayer_with_express.md +1 -1
- package/docs/hi/intlayer_with_svelte_kit.md +1 -1
- package/docs/hi/intlayer_with_tanstack+solid.md +5 -3
- package/docs/hi/intlayer_with_tanstack.md +5 -3
- package/docs/hi/live-sync.md +4 -0
- package/docs/hi/lsp.md +113 -174
- package/docs/hi/readme.md +24 -24
- package/docs/id/bundle_optimization.md +58 -25
- package/docs/id/configuration.md +10 -10
- package/docs/id/interest_of_intlayer.md +24 -22
- package/docs/id/intlayer_with_svelte_kit.md +1 -1
- package/docs/id/intlayer_with_tanstack+solid.md +5 -3
- package/docs/id/intlayer_with_tanstack.md +5 -3
- package/docs/id/live-sync.md +4 -0
- package/docs/id/lsp.md +113 -174
- package/docs/id/readme.md +24 -24
- package/docs/it/bundle_optimization.md +58 -25
- package/docs/it/configuration.md +10 -10
- package/docs/it/interest_of_intlayer.md +24 -22
- package/docs/it/intlayer_with_svelte_kit.md +1 -1
- package/docs/it/intlayer_with_tanstack+solid.md +5 -3
- package/docs/it/intlayer_with_tanstack.md +5 -3
- package/docs/it/live-sync.md +4 -0
- package/docs/it/lsp.md +115 -176
- package/docs/it/readme.md +24 -24
- package/docs/ja/bundle_optimization.md +58 -25
- package/docs/ja/configuration.md +10 -10
- package/docs/ja/interest_of_intlayer.md +24 -22
- package/docs/ja/intlayer_with_tanstack+solid.md +5 -3
- package/docs/ja/intlayer_with_tanstack.md +5 -3
- package/docs/ja/live-sync.md +4 -0
- package/docs/ja/lsp.md +113 -174
- package/docs/ja/readme.md +24 -24
- package/docs/ko/bundle_optimization.md +58 -25
- package/docs/ko/configuration.md +10 -10
- package/docs/ko/interest_of_intlayer.md +24 -22
- package/docs/ko/intlayer_with_svelte_kit.md +1 -1
- package/docs/ko/intlayer_with_tanstack+solid.md +5 -3
- package/docs/ko/intlayer_with_tanstack.md +5 -3
- package/docs/ko/live-sync.md +4 -0
- package/docs/ko/lsp.md +112 -173
- package/docs/ko/readme.md +24 -24
- package/docs/nl/bundle_optimization.md +58 -25
- package/docs/nl/configuration.md +10 -10
- package/docs/nl/interest_of_intlayer.md +24 -22
- package/docs/pl/bundle_optimization.md +58 -25
- package/docs/pl/configuration.md +10 -10
- package/docs/pl/interest_of_intlayer.md +4 -2
- package/docs/pl/intlayer_with_svelte_kit.md +1 -1
- package/docs/pl/intlayer_with_tanstack+solid.md +5 -3
- package/docs/pl/intlayer_with_tanstack.md +5 -3
- package/docs/pl/live-sync.md +4 -0
- package/docs/pl/lsp.md +115 -176
- package/docs/pl/readme.md +24 -24
- package/docs/pt/bundle_optimization.md +58 -24
- package/docs/pt/configuration.md +10 -10
- package/docs/pt/interest_of_intlayer.md +24 -22
- package/docs/pt/intlayer_with_svelte_kit.md +1 -1
- package/docs/pt/intlayer_with_tanstack+solid.md +5 -3
- package/docs/pt/intlayer_with_tanstack.md +5 -3
- package/docs/pt/live-sync.md +4 -0
- package/docs/pt/lsp.md +113 -174
- package/docs/pt/readme.md +24 -24
- package/docs/ru/bundle_optimization.md +58 -25
- package/docs/ru/configuration.md +10 -10
- package/docs/ru/interest_of_intlayer.md +24 -22
- package/docs/ru/intlayer_with_nextjs_14.md +1 -1
- package/docs/ru/intlayer_with_nextjs_15.md +1 -1
- package/docs/ru/intlayer_with_svelte_kit.md +1 -1
- package/docs/ru/intlayer_with_tanstack+solid.md +5 -3
- package/docs/ru/intlayer_with_tanstack.md +5 -3
- package/docs/ru/live-sync.md +4 -0
- package/docs/ru/lsp.md +112 -173
- package/docs/ru/readme.md +24 -24
- package/docs/tr/bundle_optimization.md +58 -25
- package/docs/tr/configuration.md +10 -10
- package/docs/tr/interest_of_intlayer.md +24 -22
- package/docs/tr/intlayer_with_svelte_kit.md +1 -1
- package/docs/tr/intlayer_with_tanstack+solid.md +5 -3
- package/docs/tr/intlayer_with_tanstack.md +5 -3
- package/docs/tr/live-sync.md +4 -0
- package/docs/tr/lsp.md +113 -174
- package/docs/tr/readme.md +24 -24
- package/docs/uk/bundle_optimization.md +58 -25
- package/docs/uk/configuration.md +10 -10
- package/docs/uk/interest_of_intlayer.md +4 -2
- package/docs/uk/intlayer_with_svelte_kit.md +1 -1
- package/docs/uk/intlayer_with_tanstack+solid.md +5 -3
- package/docs/uk/intlayer_with_tanstack.md +5 -3
- package/docs/uk/live-sync.md +4 -0
- package/docs/uk/lsp.md +113 -174
- package/docs/uk/per_locale_file.md +1 -1
- package/docs/uk/readme.md +24 -24
- package/docs/ur/bundle_optimization.md +58 -25
- package/docs/ur/configuration.md +10 -10
- package/docs/ur/interest_of_intlayer.md +24 -22
- package/docs/vi/bundle_optimization.md +58 -25
- package/docs/vi/configuration.md +10 -10
- package/docs/vi/interest_of_intlayer.md +24 -22
- package/docs/vi/intlayer_with_svelte_kit.md +1 -1
- package/docs/vi/intlayer_with_tanstack+solid.md +5 -3
- package/docs/vi/intlayer_with_tanstack.md +5 -3
- package/docs/vi/live-sync.md +4 -0
- package/docs/vi/lsp.md +115 -176
- package/docs/vi/readme.md +24 -24
- package/docs/zh/bundle_optimization.md +58 -25
- package/docs/zh/configuration.md +10 -10
- package/docs/zh/interest_of_intlayer.md +24 -22
- package/docs/zh/intlayer_with_svelte_kit.md +1 -1
- package/docs/zh/intlayer_with_tanstack+solid.md +5 -3
- package/docs/zh/intlayer_with_tanstack.md +5 -3
- package/docs/zh/live-sync.md +4 -0
- package/docs/zh/lsp.md +113 -174
- package/docs/zh/readme.md +21 -21
- package/docs/zh-TW/bundle_optimization.md +58 -25
- package/docs/zh-TW/interest_of_intlayer.md +24 -22
- package/package.json +7 -7
- package/src/common.ts +39 -2
- package/src/generated/blog.entry.ts +39 -7
- package/src/generated/docs.entry.ts +39 -7
- package/src/generated/frequentQuestions.entry.ts +39 -7
- package/src/generated/legal.entry.ts +39 -7
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
createdAt: 2025-11-25
|
|
3
|
-
updatedAt: 2026-
|
|
3
|
+
updatedAt: 2026-08-09
|
|
4
4
|
title: 优化 i18n 打包体积与性能
|
|
5
5
|
description: 通过优化国际化(i18n)内容来减小应用程序包的大小。了解如何利用 Intlayer 实现字典的 tree shaking 和延迟加载(lazy loading)。
|
|
6
6
|
keywords:
|
|
@@ -16,6 +16,12 @@ slugs:
|
|
|
16
16
|
- concept
|
|
17
17
|
- bundle-optimization
|
|
18
18
|
history:
|
|
19
|
+
- version: 9.2.1
|
|
20
|
+
date: 2026-08-09
|
|
21
|
+
changes: "`purge` 和 `minify` 现在可通过 `@intlayer/swc` 在 Next.js 上工作 — 无需 `babel.config.js`"
|
|
22
|
+
- version: 8.12.0
|
|
23
|
+
date: 2026-06-24
|
|
24
|
+
changes: "在参考表中按所需的流水线顺序列出 Babel 插件(extract → purge → minify → optimize)"
|
|
19
25
|
- version: 8.12.0
|
|
20
26
|
date: 2026-06-07
|
|
21
27
|
changes: "为 Babel/Webpack 引入了 `intlayerPurgeBabelPlugin` 和 `intlayerMinifyBabelPlugin`,明确了插件管线"
|
|
@@ -191,12 +197,14 @@ Intlayer 的构建优化被划分为若干个职责单一的插件。了解它
|
|
|
191
197
|
|
|
192
198
|
这些被直接运用在基于 Webpack 设置的 `babel.config.js` 当中(比如使用了 Babel 的 Next.js、CRA,或是自定义的 Webpack 等)。
|
|
193
199
|
|
|
200
|
+
下表按所需的流水线顺序列出它们(与它们必须在 `babel.config.js` 中出现的顺序相同):
|
|
201
|
+
|
|
194
202
|
| 插件 | 功能说明 |
|
|
195
203
|
| :---------------------------- | :--------------------------------------------------------------------------------------------------- |
|
|
196
204
|
| `intlayerExtractBabelPlugin` | 扫描 `.content.ts` 文件并把编译好的字典写入 `.intlayer/` |
|
|
197
|
-
| `intlayerOptimizeBabelPlugin` | 将 `useIntlayer('key')` 重写为 `useDictionary(hash)` 并注入匹配对应字典的 `import` 语句 |
|
|
198
205
|
| `intlayerPurgeBabelPlugin` | 扫描所有源代码文件,从已编译的 `.intlayer/**/*.json` 字典文件中删除**未被使用的内容字段** |
|
|
199
206
|
| `intlayerMinifyBabelPlugin` | **重命名内容字段的键(keys)** 为简短的字母别名(例如 `title` 变成 `a`),作用范围包括 JSON 与源代码 |
|
|
207
|
+
| `intlayerOptimizeBabelPlugin` | 将 `useIntlayer('key')` 重写为 `useDictionary(hash)` 并注入匹配对应字典的 `import` 语句 |
|
|
200
208
|
|
|
201
209
|
> **插件的执行顺序很重要。** 在你的 `babel.config.js` 里,purge 和 minify 的插件必须放置在 optimize 插件**之前**。优化步骤(optimize)会把 `useIntlayer('key')` 替换为模糊的 `useDictionary(hash)`,此举抹除了能够让 purge 和 minify 识别哪些字段被使用过的字典 key 信息。
|
|
202
210
|
|
|
@@ -205,9 +213,9 @@ Intlayer 的构建优化被划分为若干个职责单一的插件。了解它
|
|
|
205
213
|
| 选项助手 | 配套插件 |
|
|
206
214
|
| :--------------------------- | :---------------------------- |
|
|
207
215
|
| `getExtractPluginOptions()` | `intlayerExtractBabelPlugin` |
|
|
208
|
-
| `getOptimizePluginOptions()` | `intlayerOptimizeBabelPlugin` |
|
|
209
216
|
| `getPurgePluginOptions()` | `intlayerPurgeBabelPlugin` |
|
|
210
217
|
| `getMinifyPluginOptions()` | `intlayerMinifyBabelPlugin` |
|
|
218
|
+
| `getOptimizePluginOptions()` | `intlayerOptimizeBabelPlugin` |
|
|
211
219
|
|
|
212
220
|
### Vite 插件 (`vite-intlayer`)
|
|
213
221
|
|
|
@@ -220,6 +228,20 @@ Vite 用户**不需要直接对它们进行配置**。当你在 `vite.config.ts`
|
|
|
220
228
|
| Dictionary minify | 等同于 `intlayerMinifyBabelPlugin` 的 JSON 写入步骤 |
|
|
221
229
|
| Babel transform | 等同于 `intlayerMinifyBabelPlugin` 的代码重命名步骤 + `intlayerOptimizeBabelPlugin` |
|
|
222
230
|
|
|
231
|
+
### SWC 插件(`@intlayer/swc`)
|
|
232
|
+
|
|
233
|
+
Next.js 用户同样**从不直接配置这些**。自 **v9.2.1** 起,`next.config.ts` 中的 `withIntlayer()` 仅凭 `build.purge` 和 `build.minify` 两个标志就会运行完整流水线 —— 清除、压缩和导入重写。
|
|
234
|
+
|
|
235
|
+
工作被分成两部分,因为 SWC Wasm 插件一次只转换一个文件,且无法访问文件系统:
|
|
236
|
+
|
|
237
|
+
| 阶段 | 运行位置 | 作用 |
|
|
238
|
+
| :--------------------------------- | :----------------------------- | :----------------------------------------------------------- |
|
|
239
|
+
| 使用分析 + JSON 清除/压缩 | Node,位于 `withIntlayer()` 内 | 读取每个组件源文件,重写 `.intlayer/**/*.json`,生成重命名表 |
|
|
240
|
+
| 源码重写(`content.title` → `.a`) | `@intlayer/swc`(Wasm) | 将重命名表应用到你代码中对应的属性访问 |
|
|
241
|
+
| 导入重写(`useIntlayer` → dict) | `@intlayer/swc`(Wasm) | 与 `intlayerOptimizeBabelPlugin` 相同 |
|
|
242
|
+
|
|
243
|
+
判断_哪些_字段未被使用以及每个字段获得_什么_别名,需要跨文件状态和文件 I/O,因此这一半在 Node 中运行;SWC 插件只接收生成的表。
|
|
244
|
+
|
|
223
245
|
## 各平台配置指南
|
|
224
246
|
|
|
225
247
|
<Tabs>
|
|
@@ -227,10 +249,12 @@ Vite 用户**不需要直接对它们进行配置**。当你在 `vite.config.ts`
|
|
|
227
249
|
|
|
228
250
|
### Next.js
|
|
229
251
|
|
|
230
|
-
Next.js
|
|
252
|
+
Next.js 需要 `@intlayer/swc` 插件,因为 Next.js 使用 SWC 进行构建。自 **v9.2.1** 起,这一个包即可覆盖整条流水线 —— 优化(导入重写)、清除和压缩。
|
|
231
253
|
|
|
232
254
|
> 该插件并未默认安装,因为 SWC 插件在 Next.js 当中目前仍处于实验阶段。未来这部分有可能会发生改变。
|
|
233
255
|
|
|
256
|
+
> **Next.js 16.1.0 是最低版本。** 它是首个基于 SWC 向前兼容 Wasm 插件 ABI 构建的版本;更早的版本会拒绝该插件。`withIntlayer` 会读取你项目的 Next.js 版本,低于 16.1.0 时干脆不注册该插件 —— 这些构建仍会成功,只是在没有打包优化的情况下运行。
|
|
257
|
+
|
|
234
258
|
<Tabs>
|
|
235
259
|
<Tab value="npm">
|
|
236
260
|
|
|
@@ -265,33 +289,40 @@ intlayer-swc-plugin = "*"
|
|
|
265
289
|
|
|
266
290
|
安装完毕后,Intlayer 将会自动侦测并使用该插件。
|
|
267
291
|
|
|
268
|
-
|
|
292
|
+
**清除和压缩**阶段(字段移除与字段重命名)不需要额外的包,也不需要 `babel.config.js`。用 `withIntlayer` 包裹你的配置,并在 `intlayer.config.ts` 中开启相应标志:
|
|
269
293
|
|
|
270
|
-
```
|
|
271
|
-
|
|
294
|
+
```typescript fileName="next.config.ts"
|
|
295
|
+
import { withIntlayer } from "next-intlayer/server";
|
|
296
|
+
import type { NextConfig } from "next";
|
|
297
|
+
|
|
298
|
+
const nextConfig: NextConfig = {/* 你的配置 */};
|
|
299
|
+
|
|
300
|
+
export default withIntlayer(nextConfig);
|
|
272
301
|
```
|
|
273
302
|
|
|
274
|
-
```
|
|
275
|
-
|
|
276
|
-
intlayerPurgeBabelPlugin,
|
|
277
|
-
intlayerMinifyBabelPlugin,
|
|
278
|
-
getPurgePluginOptions,
|
|
279
|
-
getMinifyPluginOptions,
|
|
280
|
-
} = require("@intlayer/babel");
|
|
303
|
+
```typescript fileName="intlayer.config.ts"
|
|
304
|
+
import type { IntlayerConfig } from "intlayer";
|
|
281
305
|
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
// Minify: 对 JSON 以及源代码里的内容字段的键(keys)进行重命名
|
|
288
|
-
[intlayerMinifyBabelPlugin, getMinifyPluginOptions()],
|
|
289
|
-
// 注意: 在这里不需要使用 intlayerOptimizeBabelPlugin,因为
|
|
290
|
-
// @intlayer/swc 已经处理了 useIntlayer → useDictionary 的重写过程。
|
|
291
|
-
],
|
|
306
|
+
const config: IntlayerConfig = {
|
|
307
|
+
build: {
|
|
308
|
+
purge: true, // 从打包的 JSON 中移除未使用的内容字段
|
|
309
|
+
minify: true, // 将内容字段键重命名为简短别名
|
|
310
|
+
},
|
|
292
311
|
};
|
|
312
|
+
|
|
313
|
+
export default config;
|
|
293
314
|
```
|
|
294
315
|
|
|
316
|
+
在 `next build` 期间,`withIntlayer` 会分析你的源码、重写已编译的字典,并将生成的字段重命名表传给 `@intlayer/swc`,由它更新你代码中对应的属性访问。
|
|
317
|
+
|
|
318
|
+
> 请使用异步的 `withIntlayer`,而不是 `withIntlayerSync`。同步版本不会运行分析流水线,因此清除和压缩对它没有效果。
|
|
319
|
+
|
|
320
|
+
> 清除和压缩仅在 `next build` 时运行 —— 优化流水线在 `next dev` 期间是关闭的。
|
|
321
|
+
|
|
322
|
+
> 当配置了兼容适配器调用方时它们也会被禁用(`swcExtraCallers`,由 `@intlayer/next-intl`、`@intlayer/react-i18next` 等兼容包设置):这些调用点对使用分析器不可见,因此清除会移除代码仍在读取的字段。导入重写仍保持启用。
|
|
323
|
+
|
|
324
|
+
**更早的版本(9.2.1 之前)** 需要 `@intlayer/babel` 以及一个声明 `intlayerPurgeBabelPlugin` 和 `intlayerMinifyBabelPlugin` 的 `babel.config.js`。该文件不再需要,可以删除。
|
|
325
|
+
|
|
295
326
|
</Tab>
|
|
296
327
|
<Tab value="vite">
|
|
297
328
|
|
|
@@ -447,6 +478,8 @@ export default config;
|
|
|
447
478
|
|
|
448
479
|
> 如果在 `optimize` 被设为 `false`、又或是启用了可视化编辑器也就是当 `editor.enabled` 设定为了 `true` 时(由于编辑器需要保留字段名称以便做后续处理),重命名这个操作都将会被跳过。
|
|
449
480
|
|
|
481
|
+
> 在 Next.js 上,当 `@intlayer/swc` 未安装或无法加载时(Next.js 低于 16.1.0),压缩同样会被跳过。重写源码访问的正是这个插件,因此在没有它的情况下重命名字典,会让你的代码读取已不存在的字段名。
|
|
482
|
+
|
|
450
483
|
> 同理,如果是利用了 `importMode: 'fetch'` 来载入字段时此过程同样不适用。因为它们的内容会以原始命名由后端 API 所提供,对客户端内容随意重命名会破坏客户端与服务端的匹配契约。
|
|
451
484
|
|
|
452
485
|
### 字段清除 / Purging (去掉未被引用的字段内容)
|
|
@@ -475,7 +508,7 @@ export default config;
|
|
|
475
508
|
{ "title": "…", "subtitle": "…" }
|
|
476
509
|
```
|
|
477
510
|
|
|
478
|
-
> 与前边提到的类似,当 `optimize` 是 `false` 或是开启了可视化编辑器(`editor.enabled` 取值 `true`) 时,它会选择跳过对数据的清除操作。
|
|
511
|
+
> 与前边提到的类似,当 `optimize` 是 `false` 或是开启了可视化编辑器(`editor.enabled` 取值 `true`) 时,它会选择跳过对数据的清除操作。 在 Next.js 上,当 `@intlayer/swc` 不可用以及配置了兼容适配器调用方时,还会被额外跳过。
|
|
479
512
|
|
|
480
513
|
> 当检测到某份代码因为异常无法顺利解析、又或者当把由 `useIntlayer` 输出的值以静态解析器难以预测分析的模式在不同组件中来回丢(比如被打包成对象传入等而未被进行解构)的时候,它同样会跳过,以此保守地保留整部字典的全部信息,避免意外发生。
|
|
481
514
|
|
package/docs/zh/configuration.md
CHANGED
|
@@ -403,7 +403,7 @@ const config: IntlayerConfig = {
|
|
|
403
403
|
ai: {
|
|
404
404
|
/**
|
|
405
405
|
* 使用的 AI 提供商。
|
|
406
|
-
* 选项:'openai', 'anthropic', 'mistral', 'deepseek', 'gemini', 'ollama', 'openrouter', 'alibaba', 'fireworks', 'groq', 'huggingface', 'bedrock', 'googlevertex', 'togetherai', 'lmstudio'
|
|
406
|
+
* 选项:'openai', 'anthropic', 'mistral', 'deepseek', 'gemini', 'ollama', 'openrouter', 'alibaba', 'fireworks', 'groq', 'huggingface', 'bedrock', 'googlevertex', 'togetherai', 'lmstudio', 'moonshotai'
|
|
407
407
|
* 默认值:'openai'
|
|
408
408
|
*/
|
|
409
409
|
provider: "openai",
|
|
@@ -1034,15 +1034,15 @@ Intlayer 支持多个 AI 提供商,以提供最大的灵活性。当前支持
|
|
|
1034
1034
|
- **Together.ai**
|
|
1035
1035
|
- **LM Studio**
|
|
1036
1036
|
|
|
1037
|
-
| 字段 | 说明 | 类型
|
|
1038
|
-
| -------------------- | ------------------------------------------------------------------------------------ |
|
|
1039
|
-
| `provider` | 要为 Intlayer AI 功能使用的提供商。 | `'openai'` | <br/> `'anthropic'` | <br/> `'mistral'` | <br/> `'deepseek'` | <br/> `'gemini'` | <br/> `'ollama'` | <br/> `'openrouter'` | <br/> `'alibaba'` | <br/> `'fireworks'` | <br/> `'groq'` | <br/> `'huggingface'` | <br/> `'bedrock'` | <br/> `'googleaistudio'` | <br/> `'googlevertex'` | <br/> `'togetherai'` | <br/> `'lmstudio'` | `undefined` | `'anthropic'` | 不同的提供商需要不同的 API 密钥,且价格不同。 |
|
|
1040
|
-
| `model` | 要为 AI 功能使用的 AI 模型。 | `string`
|
|
1041
|
-
| `temperature` | 控制 AI 响应的随机性。 | `number`
|
|
1042
|
-
| `apiKey` | 所选提供商的您的 API 密钥。 | `string`
|
|
1043
|
-
| `applicationContext` | 有关应用程序的其他上下文,以帮助 AI 生成更准确的翻译(领域、目标受众、语气、术语)。 | `string`
|
|
1044
|
-
| `baseURL` | AI API 的基础 URL。 | `string`
|
|
1045
|
-
| `dataSerialization` | AI 功能的数据序列化格式。 | `'json'` | <br/> `'toon'`
|
|
1037
|
+
| 字段 | 说明 | 类型 | 默认值 | 示例 | 备注 |
|
|
1038
|
+
| -------------------- | ------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------- | ------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
1039
|
+
| `provider` | 要为 Intlayer AI 功能使用的提供商。 | `'openai'` | <br/> `'anthropic'` | <br/> `'mistral'` | <br/> `'deepseek'` | <br/> `'gemini'` | <br/> `'ollama'` | <br/> `'openrouter'` | <br/> `'alibaba'` | <br/> `'fireworks'` | <br/> `'groq'` | <br/> `'huggingface'` | <br/> `'bedrock'` | <br/> `'googleaistudio'` | <br/> `'googlevertex'` | <br/> `'togetherai'` | <br/> `'lmstudio'` | <br/> `'moonshotai'` | `undefined` | `'anthropic'` | 不同的提供商需要不同的 API 密钥,且价格不同。 |
|
|
1040
|
+
| `model` | 要为 AI 功能使用的 AI 模型。 | `string` | 无 | `'gpt-4o-2024-11-20'` | 具体模型取决于提供商。 |
|
|
1041
|
+
| `temperature` | 控制 AI 响应的随机性。 | `number` | 无 | `0.1` | 温度越高 = 越具创造力且越不可靠。 |
|
|
1042
|
+
| `apiKey` | 所选提供商的您的 API 密钥。 | `string` | 无 | `process.env.OPENAI_API_KEY` | 应保持私密;使用环境变量。 |
|
|
1043
|
+
| `applicationContext` | 有关应用程序的其他上下文,以帮助 AI 生成更准确的翻译(领域、目标受众、语气、术语)。 | `string` | 无 | `'我的自定义应用程序上下文'` | 可用于添加规则(例如:`"您不应转换您的 URL"` )。 |
|
|
1044
|
+
| `baseURL` | AI API 的基础 URL。 | `string` | 无 | `'https://api.openai.com/v1'` <br/> `'http://localhost:5000'` | 可以指向本地或自定义的 AI API 端点。 |
|
|
1045
|
+
| `dataSerialization` | AI 功能的数据序列化格式。 | `'json'` | <br/> `'toon'` | `undefined` | `'toon'` | • `'json'`: 默认,可靠;使用更多 token。<br/>• `'toon'`: token 更少,但也更不稳定。<br/>• 将上下文作为额外参数(reasoning effort 等)传递给模型。 |
|
|
1046
1046
|
|
|
1047
1047
|
---
|
|
1048
1048
|
|
|
@@ -188,7 +188,7 @@ export const ComponentExample = () => {
|
|
|
188
188
|
这种方法允许你:
|
|
189
189
|
|
|
190
190
|
1. **提高开发速度**
|
|
191
|
-
- 可以使用 VSCode 插件创建 `.content.{
|
|
191
|
+
- 可以使用 VSCode 插件创建 `.content.{ts|js|mjs|cjs|json|tsx|jsx|md|mdx|yaml|yml}` 文件
|
|
192
192
|
- IDE 中的 AI 自动补全工具(例如 GitHub Copilot)可以帮助你声明内容,减少复制/粘贴
|
|
193
193
|
|
|
194
194
|
2. **保持代码库的整洁**
|
|
@@ -212,27 +212,27 @@ export const ComponentExample = () => {
|
|
|
212
212
|
|
|
213
213
|
## Intlayer 附加功能
|
|
214
214
|
|
|
215
|
-
| 功能 | 描述
|
|
216
|
-
| ------------------------------------------------------------------------------------------------------------------------- |
|
|
217
|
-
|  | **跨框架支持**<br><br>Intlayer 兼容所有主流框架和库,包括 Next.js、React、Vite、Vue.js、Nuxt、Preact、Express 等。
|
|
218
|
-
|  | **JavaScript 驱动的内容管理**<br><br>利用 JavaScript 的灵活性来高效地定义和管理你的内容。<br><br> - [内容声明](https://intlayer.org/doc/concept/content)
|
|
219
|
-
| <img src="https://github.com/aymericzip/intlayer/blob/main/docs/assets/compiler.jpg?raw=true" alt="Feature" width="700"> | **编译器**<br><br>Intlayer 编译器可自动从组件中提取内容并生成字典文件。<br><br> - [编译器](https://intlayer.org/doc/compiler)
|
|
220
|
-
|  | **单语言内容声明文件**<br><br>在自动生成前,通过仅声明一次你的内容来加速开发。<br><br> - [单语言内容声明文件](https://intlayer.org/doc/concept/per-locale-file)
|
|
221
|
-
|  | **类型安全环境**<br><br>利用 TypeScript 确保你的内容定义和代码没有错误,同时还能享受 IDE 的自动补全功能。<br><br> - [TypeScript 配置](https://intlayer.org/doc/environment/vite-and-react#configure-typescript)
|
|
222
|
-
|  | **简易配置**<br><br>仅需极简的配置即可快速启动并运行。轻松调整国际化、路由、AI、构建以及内容处理的设置。<br><br> - [探索 Next.js 集成](https://intlayer.org/doc/environment/nextjs)
|
|
223
|
-
|  | **简化内容检索**<br><br>无需为每一小段内容调用 `t` 函数。使用单一的 hook 即可直接检索你的所有内容。<br><br> - [React 集成](https://intlayer.org/doc/environment/create-react-app)
|
|
224
|
-
|  | **一致的服务器组件实现**<br><br>完美适合 Next.js 服务器组件,客户端和服务器组件使用相同的实现,无需跨每个服务器组件传递你的 `t` 函数。<br><br> - [服务器组件](https://intlayer.org/doc/environment/nextjs#step-7-utilize-content-in-your-code)
|
|
225
|
-
|  | **有条理的代码库**<br><br>保持代码库更有条理:1 组件 = 在同一文件夹下的 1 个字典。靠近其各自组件的翻译有助于提高可维护性和清晰度。<br><br> - [Intlayer 运行机制](https://intlayer.org/doc/concept/how-works-intlayer)
|
|
226
|
-
|  | **增强的路由功能**<br><br>完全支持应用路由,无缝适应复杂的应用结构,适用于 Next.js、React、Vite、Vue.js 等。<br><br> - [探索 Next.js 集成](https://intlayer.org/doc/environment/nextjs)
|
|
227
|
-
|  | **Markdown 支持**<br><br>导入并解译本地文件以及远程 Markdown,以获得隐私政策、文档等多语言内容。解译并在你的代码中使 Markdown 元数据可被访问。<br><br> - [内容文件](https://intlayer.org/doc/concept/content/file)
|
|
228
|
-
|  | **免费的可视化编辑器与 CMS**<br><br>可视化编辑器和 CMS 免费向内容创作者开放,消除了对第三方本地化平台的依赖。使用 Git 保持内容同步,或使用 CMS 彻底或部分外置管理它。<br><br> - [Intlayer 编辑器](https://intlayer.org/doc/concept/editor) <br> - [Intlayer CMS](https://intlayer.org/doc/concept/cms)
|
|
229
|
-
|  | **构建时摇树优化 (Tree-shakable) 内容**<br><br>构建时摇树优化内容,减小最终包的体积。按组件加载内容,并从打包体积中排除任何未使用的内容。支持懒加载以提高应用加载效率。<br><br> - [应用构建优化](https://intlayer.org/doc/concept/how-works-intlayer#app-build-optimization)
|
|
230
|
-
|  | **静态渲染**<br><br>不阻碍静态渲染(Static Rendering)。<br><br> - [Next.js 集成](https://intlayer.org/doc/environment/nextjs)
|
|
231
|
-
|  | **AI 驱动翻译**<br><br>使用您自己的 AI 提供商/API 密钥,点击一下即可将您的网站翻译成 231 种语言,得益于 Intlayer 先进的 AI 翻译工具。<br><br> - [CI/CD 集成](https://intlayer.org/doc/concept/ci-cd) <br> - [Intlayer CLI](https://intlayer.org/doc/concept/cli) <br> - [自动填充](https://intlayer.org/doc/concept/auto-fill)
|
|
232
|
-
|  | **MCP 服务器集成**<br><br>提供用于 IDE 自动化的 MCP(Model Context Protocol)服务器,能够直接在你的开发环境中实现无缝的内容管理和 i18n 工作流。<br><br> - [MCP 服务器](https://github.com/aymericzip/intlayer/blob/main/docs/zh/mcp_server.md)
|
|
233
|
-
|  | **VSCode 插件**<br><br>Intlayer 提供 VSCode 插件协助管理你的内容和翻译,构建你的字典,翻译你的内容等。<br><br> - [VSCode 插件](https://intlayer.org/doc/vs-code-extension)
|
|
234
|
-
|  | **互操作性**<br><br>允许与 react-i18next、next-i18next、next-intl 和 react-intl 互操作。<br><br> - [Intlayer 与 react-intl](https://intlayer.org/blog/intlayer-with-react-intl) <br> - [Intlayer 与 next-intl](https://intlayer.org/blog/intlayer-with-next-intl) <br> - [Intlayer 与 next-i18next](https://intlayer.org/blog/intlayer-with-next-i18next) |
|
|
235
|
-
| 测试缺失翻译 (CLI/CI) | ✅ CLI: npx intlayer content test (对 CI 友好的审计)
|
|
215
|
+
| 功能 | 描述 |
|
|
216
|
+
| ------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
217
|
+
|  | **跨框架支持**<br><br>Intlayer 兼容所有主流框架和库,包括 Next.js、React、Vite、Vue.js、Nuxt、Preact、Express 等。 |
|
|
218
|
+
|  | **JavaScript 驱动的内容管理**<br><br>利用 JavaScript 的灵活性来高效地定义和管理你的内容。<br><br> - [内容声明](https://intlayer.org/doc/concept/content) |
|
|
219
|
+
| <img src="https://github.com/aymericzip/intlayer/blob/main/docs/assets/compiler.jpg?raw=true" alt="Feature" width="700"> | **编译器**<br><br>Intlayer 编译器可自动从组件中提取内容并生成字典文件。<br><br> - [编译器](https://intlayer.org/doc/compiler) |
|
|
220
|
+
|  | **单语言内容声明文件**<br><br>在自动生成前,通过仅声明一次你的内容来加速开发。<br><br> - [单语言内容声明文件](https://intlayer.org/doc/concept/per-locale-file) |
|
|
221
|
+
|  | **类型安全环境**<br><br>利用 TypeScript 确保你的内容定义和代码没有错误,同时还能享受 IDE 的自动补全功能。<br><br> - [TypeScript 配置](https://intlayer.org/doc/environment/vite-and-react#configure-typescript) |
|
|
222
|
+
|  | **简易配置**<br><br>仅需极简的配置即可快速启动并运行。轻松调整国际化、路由、AI、构建以及内容处理的设置。<br><br> - [探索 Next.js 集成](https://intlayer.org/doc/environment/nextjs) |
|
|
223
|
+
|  | **简化内容检索**<br><br>无需为每一小段内容调用 `t` 函数。使用单一的 hook 即可直接检索你的所有内容。<br><br> - [React 集成](https://intlayer.org/doc/environment/create-react-app) |
|
|
224
|
+
|  | **一致的服务器组件实现**<br><br>完美适合 Next.js 服务器组件,客户端和服务器组件使用相同的实现,无需跨每个服务器组件传递你的 `t` 函数。<br><br> - [服务器组件](https://intlayer.org/doc/environment/nextjs#step-7-utilize-content-in-your-code) |
|
|
225
|
+
|  | **有条理的代码库**<br><br>保持代码库更有条理:1 组件 = 在同一文件夹下的 1 个字典。靠近其各自组件的翻译有助于提高可维护性和清晰度。<br><br> - [Intlayer 运行机制](https://intlayer.org/doc/concept/how-works-intlayer) |
|
|
226
|
+
|  | **增强的路由功能**<br><br>完全支持应用路由,无缝适应复杂的应用结构,适用于 Next.js、React、Vite、Vue.js 等。<br><br> - [探索 Next.js 集成](https://intlayer.org/doc/environment/nextjs) |
|
|
227
|
+
|  | **Markdown 支持**<br><br>导入并解译本地文件以及远程 Markdown,以获得隐私政策、文档等多语言内容。解译并在你的代码中使 Markdown 元数据可被访问。<br><br> - [内容文件](https://intlayer.org/doc/concept/content/file) |
|
|
228
|
+
|  | **免费的可视化编辑器与 CMS**<br><br>可视化编辑器和 CMS 免费向内容创作者开放,消除了对第三方本地化平台的依赖。使用 Git 保持内容同步,或使用 CMS 彻底或部分外置管理它。<br><br> - [Intlayer 编辑器](https://intlayer.org/doc/concept/editor) <br> - [Intlayer CMS](https://intlayer.org/doc/concept/cms) |
|
|
229
|
+
|  | **构建时摇树优化 (Tree-shakable) 内容**<br><br>构建时摇树优化内容,减小最终包的体积。按组件加载内容,并从打包体积中排除任何未使用的内容。支持懒加载以提高应用加载效率。<br><br> - [应用构建优化](https://intlayer.org/doc/concept/how-works-intlayer#app-build-optimization) |
|
|
230
|
+
|  | **静态渲染**<br><br>不阻碍静态渲染(Static Rendering)。<br><br> - [Next.js 集成](https://intlayer.org/doc/environment/nextjs) |
|
|
231
|
+
|  | **AI 驱动翻译**<br><br>使用您自己的 AI 提供商/API 密钥,点击一下即可将您的网站翻译成 231 种语言,得益于 Intlayer 先进的 AI 翻译工具。<br><br> - [CI/CD 集成](https://intlayer.org/doc/concept/ci-cd) <br> - [Intlayer CLI](https://intlayer.org/doc/concept/cli) <br> - [自动填充](https://intlayer.org/doc/concept/auto-fill) |
|
|
232
|
+
|  | **MCP 服务器集成**<br><br>提供用于 IDE 自动化的 MCP(Model Context Protocol)服务器,能够直接在你的开发环境中实现无缝的内容管理和 i18n 工作流。<br><br> - [MCP 服务器](https://github.com/aymericzip/intlayer/blob/main/docs/zh/mcp_server.md) |
|
|
233
|
+
|  | **VSCode 插件**<br><br>Intlayer 提供 VSCode 插件协助管理你的内容和翻译,构建你的字典,翻译你的内容等。<br><br> - [VSCode 插件](https://intlayer.org/doc/vs-code-extension) |
|
|
234
|
+
|  | **互操作性**<br><br>允许与 react-i18next、next-i18next、next-intl 和 react-intl 互操作。<br><br> - [Intlayer 与 react-intl](https://intlayer.org/blog/intlayer-with-react-intl) <br> - [Intlayer 与 next-intl](https://intlayer.org/blog/intlayer-with-next-intl) <br> - [Intlayer 与 next-i18next](https://intlayer.org/blog/intlayer-with-next-i18next) <br> - [Intlayer 兼容适配器](https://intlayer.org/doc/compatibility) |
|
|
235
|
+
| 测试缺失翻译 (CLI/CI) | ✅ CLI: npx intlayer content test (对 CI 友好的审计) |
|
|
236
236
|
|
|
237
237
|
## Intlayer 与其他解决方案的比较
|
|
238
238
|
|
|
@@ -271,3 +271,5 @@ GitHub Star 数是衡量项目受欢迎程度、社区信任度以及长期相
|
|
|
271
271
|
`intlayer` 还可以帮助管理你的 `react-intl`、`react-i18next`、`next-intl`、`next-i18next` 以及 `vue-i18n` 命名空间。
|
|
272
272
|
|
|
273
273
|
使用 `intlayer`,你可以声明你喜欢的 i18n 库格式的内容,并且 intlayer 将在你想指定的路径下生成命名空间(例如:`/messages/{{locale}}/{{namespace}}.json`)。
|
|
274
|
+
|
|
275
|
+
如果你想继续使用当前 i18n 库的 API,`intlayer` 还提供了 **兼容适配器(compat adapters)**:这些包暴露与 `react-i18next`、`next-intl`、`react-intl`、`vue-i18n` 等完全相同的 API,但内容由 Intlayer 词典提供。这样你就可以逐步迁移,而无需重写代码。参见[兼容适配器文档](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/compat/index.md)。
|
|
@@ -392,7 +392,7 @@ export const getLocale = (event: RequestEvent): Locale => {
|
|
|
392
392
|
};
|
|
393
393
|
```
|
|
394
394
|
|
|
395
|
-
> `getLocaleFromStorage` 将根据你的配置从 header 或 cookie 检查语言环境。有关更多详情,请参阅[配置](https://intlayer.org/doc/configuration)。
|
|
395
|
+
> `getLocaleFromStorage` 将根据你的配置从 header 或 cookie 检查语言环境。有关更多详情,请参阅[配置](https://intlayer.org/doc/concept/configuration)。
|
|
396
396
|
|
|
397
397
|
> `localeDetector` 函数将处理 `Accept-Language` header 并返回最佳匹配。
|
|
398
398
|
|
|
@@ -237,19 +237,21 @@ import {
|
|
|
237
237
|
HeadContent,
|
|
238
238
|
Scripts,
|
|
239
239
|
createRootRouteWithContext,
|
|
240
|
+
getRouteApi,
|
|
240
241
|
} from "@tanstack/solid-router";
|
|
241
242
|
import { HydrationScript } from "solid-js/web";
|
|
242
243
|
import { Suspense, type ParentComponent } from "solid-js";
|
|
243
244
|
import { IntlayerProvider } from "solid-intlayer";
|
|
244
245
|
import { defaultLocale, getHTMLTextDir } from "intlayer";
|
|
245
|
-
|
|
246
|
+
|
|
247
|
+
const localeRoute = getRouteApi("/{-$locale}");
|
|
246
248
|
|
|
247
249
|
export const Route = createRootRouteWithContext()({
|
|
248
250
|
shellComponent: RootComponent,
|
|
249
251
|
});
|
|
250
252
|
|
|
251
253
|
const RootComponent: ParentComponent = (props) => {
|
|
252
|
-
const params =
|
|
254
|
+
const params = localeRoute.useParams();
|
|
253
255
|
const locale = params()?.locale ?? defaultLocale;
|
|
254
256
|
|
|
255
257
|
return (
|
|
@@ -538,7 +540,7 @@ export default LocaleSwitcher;
|
|
|
538
540
|
|
|
539
541
|
```tsx fileName="src/routes/__root.tsx"
|
|
540
542
|
const RootComponent: ParentComponent = (props) => {
|
|
541
|
-
const params =
|
|
543
|
+
const params = localeRoute.useParams();
|
|
542
544
|
const locale = params()?.locale ?? defaultLocale;
|
|
543
545
|
|
|
544
546
|
return (
|
|
@@ -254,13 +254,15 @@ export default config;
|
|
|
254
254
|
```tsx fileName="src/routes/__root.tsx"
|
|
255
255
|
import {
|
|
256
256
|
createRootRouteWithContext,
|
|
257
|
+
getRouteApi,
|
|
257
258
|
HeadContent,
|
|
258
259
|
Scripts,
|
|
259
260
|
} from "@tanstack/react-router";
|
|
260
261
|
import { defaultLocale, getHTMLTextDir } from "intlayer";
|
|
261
262
|
import { type ReactNode } from "react";
|
|
262
263
|
import { IntlayerProvider } from "react-intlayer";
|
|
263
|
-
|
|
264
|
+
|
|
265
|
+
const localeRoute = getRouteApi("/{-$locale}");
|
|
264
266
|
|
|
265
267
|
export const Route = createRootRouteWithContext<{}>()({
|
|
266
268
|
head: () => ({
|
|
@@ -282,7 +284,7 @@ export const Route = createRootRouteWithContext<{}>()({
|
|
|
282
284
|
});
|
|
283
285
|
|
|
284
286
|
function RootDocument({ children }: { children: ReactNode }) {
|
|
285
|
-
const params =
|
|
287
|
+
const params = localeRoute.useParams();
|
|
286
288
|
const locale = params?.locale ?? defaultLocale;
|
|
287
289
|
|
|
288
290
|
return (
|
|
@@ -619,7 +621,7 @@ export const LocaleSwitcher: FC = () => {
|
|
|
619
621
|
|
|
620
622
|
```tsx fileName="src/routes/__root.tsx"
|
|
621
623
|
function RootDocument({ children }: { children: ReactNode }) {
|
|
622
|
-
const params =
|
|
624
|
+
const params = localeRoute.useParams();
|
|
623
625
|
const locale = params?.locale ?? defaultLocale;
|
|
624
626
|
|
|
625
627
|
return (
|