@intlayer/docs 7.0.0-canary.1 → 7.0.0-canary.3

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 (43) hide show
  1. package/dist/cjs/common.cjs.map +1 -1
  2. package/dist/esm/common.mjs.map +1 -1
  3. package/dist/types/common.d.ts +5 -0
  4. package/dist/types/common.d.ts.map +1 -1
  5. package/docs/ar/intlayer_with_nextjs_16.md +1652 -0
  6. package/docs/ar/releases/v7.md +486 -0
  7. package/docs/de/intlayer_with_nextjs_16.md +1662 -0
  8. package/docs/de/releases/v7.md +503 -0
  9. package/docs/en/intlayer_with_nextjs_15.md +5 -2
  10. package/docs/en/intlayer_with_nextjs_16.md +4 -4
  11. package/docs/en-GB/intlayer_with_nextjs_16.md +1642 -0
  12. package/docs/en-GB/releases/v7.md +486 -0
  13. package/docs/es/intlayer_with_nextjs_16.md +1670 -0
  14. package/docs/es/releases/v7.md +503 -0
  15. package/docs/fr/intlayer_with_nextjs_16.md +1692 -0
  16. package/docs/fr/releases/v7.md +504 -0
  17. package/docs/hi/intlayer_with_nextjs_16.md +1618 -0
  18. package/docs/hi/releases/v7.md +486 -0
  19. package/docs/id/intlayer_with_nextjs_16.md +1604 -0
  20. package/docs/id/releases/v7.md +503 -0
  21. package/docs/it/intlayer_with_nextjs_16.md +1600 -0
  22. package/docs/it/releases/v7.md +505 -0
  23. package/docs/ja/intlayer_CMS.md +0 -9
  24. package/docs/ja/intlayer_with_nextjs_16.md +1788 -0
  25. package/docs/ja/releases/v7.md +504 -0
  26. package/docs/ko/intlayer_with_nextjs_16.md +1641 -0
  27. package/docs/ko/releases/v7.md +504 -0
  28. package/docs/pl/intlayer_with_nextjs_16.md +1645 -0
  29. package/docs/pl/releases/v7.md +486 -0
  30. package/docs/pt/intlayer_with_nextjs_16.md +1646 -0
  31. package/docs/pt/introduction.md +0 -15
  32. package/docs/pt/releases/v7.md +486 -0
  33. package/docs/ru/intlayer_with_nextjs_16.md +1610 -0
  34. package/docs/ru/releases/v7.md +486 -0
  35. package/docs/tr/intlayer_with_nextjs_16.md +1599 -0
  36. package/docs/tr/releases/v7.md +486 -0
  37. package/docs/vi/intlayer_with_nextjs_16.md +1597 -0
  38. package/docs/vi/releases/v7.md +486 -0
  39. package/docs/zh/intlayer_CMS.md +0 -23
  40. package/docs/zh/intlayer_with_nextjs_16.md +1628 -0
  41. package/docs/zh/releases/v7.md +487 -0
  42. package/package.json +14 -14
  43. package/src/common.ts +5 -0
@@ -0,0 +1,487 @@
1
+ ---
2
+ createdAt: 2025-09-22
3
+ updatedAt: 2025-09-23
4
+ title: 新版 Intlayer v7 - 新特性介绍
5
+ description: 了解 Intlayer v7 的新特性。性能、开发者体验的重大改进,以及增强国际化工作流程的新功能。
6
+ keywords:
7
+ - Intlayer
8
+ - 本地化
9
+ - 开发
10
+ - 性能
11
+ - 开发者体验
12
+ - 功能
13
+ - React
14
+ - Next.js
15
+ - JavaScript
16
+ - TypeScript
17
+ slugs:
18
+ - doc
19
+ - releases
20
+ - v7
21
+ ---
22
+
23
+ # 新版 Intlayer v7 - 新特性介绍
24
+
25
+ 欢迎使用 Intlayer v7!此次重大版本发布带来了性能、类型安全和开发者体验的显著提升。以下是主要亮点,包括迁移说明和实用示例。
26
+
27
+ ## 亮点
28
+
29
+ - 缓存策略以加快构建速度
30
+ - 改进的 TypeScript 类型生成,支持基于语言环境的类型
31
+ - 包优化:语言环境使用字符串而非枚举
32
+ - 新的路由模式:`prefix-no-default`、`prefix-all`、`no-prefix`、`search-params`
33
+ - 符合 GDPR 的语言环境存储,默认使用 localStorage
34
+ - 灵活的存储配置:支持 cookies、localStorage、sessionStorage 或多种组合
35
+ - 视觉编辑器包体积缩小 30%
36
+ - 增强的中间件配置选项
37
+ - 更新的 fill 命令行为,提升内容管理
38
+ - 通过完整内容声明文件更新增强稳定性
39
+ - 智能重试管理,提升翻译准确性
40
+ - 并行处理,加快翻译速度
41
+ - 智能分块,处理大型文件以适应 AI 上下文限制
42
+
43
+ ---
44
+
45
+ ## 性能:缓存以加快构建速度
46
+
47
+ v7 通过实现缓存策略来加快构建过程,而不是在每次构建时都使用 esbuild 重新构建内容声明。
48
+
49
+ ```bash
50
+ npx intlayer build
51
+ ```
52
+
53
+ 新的缓存系统:
54
+
55
+ - 存储已编译的内容声明以避免重复处理
56
+ - 检测更改并仅重新构建修改过的文件
57
+ - 显著减少大型项目的构建时间
58
+
59
+ ---
60
+
61
+ ## TypeScript:基于语言环境的类型生成
62
+
63
+ TypeScript 类型现在按语言环境生成,提供更强的类型支持,消除了跨所有语言环境的联合类型。
64
+
65
+ **v6 行为:**
66
+
67
+ ```tsx
68
+ const content = getIntlayer("my-title-content", "en");
69
+ // typeof content = { title: "My title" } | { title: "Mon titre" } | { title: "Mi título" }
70
+ ```
71
+
72
+ **v7 行为:**
73
+
74
+ ```tsx
75
+ const content = getIntlayer("my-title-content", "en");
76
+ // typeof content = { title: "My title" }
77
+ ```
78
+
79
+ 优点:
80
+
81
+ - 在您的 IDE 中提供更精确的自动完成
82
+ - 更好的类型安全,避免跨语言环境的类型污染
83
+ - 通过减少类型复杂性提升性能
84
+
85
+ ---
86
+
87
+ ## 包优化:将 Locales 作为字符串
88
+
89
+ `Locales` 类型不再是枚举,这意味着它现在完全支持摇树优化,不会因为包含数千个未使用的语言环境记录而使您的包膨胀。
90
+
91
+ **v6:**
92
+
93
+ ```typescript
94
+ import { Locales } from "intlayer";
95
+ // 包含所有语言环境的枚举 -> 不支持摇树优化
96
+
97
+ const locale: Locales = Locales.ENGLISH;
98
+ ```
99
+
100
+ **v7:**
101
+
102
+ ```typescript
103
+ import { Locales, Locale } from "intlayer";
104
+ // 字符串类型 -> 完全支持摇树优化
105
+
106
+ const locale: Locale = Locales.ENGLISH;
107
+ ```
108
+
109
+ > 因为 `Locales` 不再是枚举类型,所以你需要将类型从 `Locales` 改为 `Locale` 来获取作为类型的语言环境。
110
+
111
+ 更多信息请参见[实现细节](https://github.com/aymericzip/intlayer/blob/main/packages/%40intlayer/types/src/index.ts)。
112
+
113
+ ---
114
+
115
+ ## 新的路由模式以实现更大灵活性
116
+
117
+ v7 引入了统一的 `routing.mode` 配置,取代了之前的 `prefixDefault` 和 `noPrefix` 选项,提供了对 URL 结构更细粒度的控制。
118
+
119
+ ### 可用的路由模式
120
+
121
+ - **`prefix-no-default`**(默认):默认语言环境无前缀,其他语言环境有前缀
122
+ - `/dashboard`(英文)或 `/fr/dashboard`(法文)
123
+ - **`prefix-all`**:所有语言环境都有前缀
124
+ - `/en/dashboard`(英文)或 `/fr/dashboard`(法文)
125
+ - **`no-prefix`**:URL 中没有语言前缀(语言通过存储/请求头处理)
126
+ - 所有语言均为 `/dashboard`
127
+ - **`search-params`**:语言作为查询参数传递
128
+ - `/dashboard?locale=en` 或 `/dashboard?locale=fr`
129
+
130
+ ### 基本配置
131
+
132
+ ```typescript
133
+ // intlayer.config.ts
134
+ export default {
135
+ internationalization: {
136
+ locales: ["en", "fr", "es"],
137
+ defaultLocale: "en",
138
+ },
139
+ routing: {
140
+ mode: "prefix-no-default", // 默认值
141
+ },
142
+ };
143
+ ```
144
+
145
+ ---
146
+
147
+ ## GDPR 合规性:localStorage / cookies 存储
148
+
149
+ v7 优先考虑用户隐私,默认使用 `localStorage` 作为存储机制,而非 cookies。此更改有助于避免因语言偏好设置而触发的 cookie 同意要求,从而更好地符合 GDPR 规定。
150
+
151
+ ### 存储配置选项
152
+
153
+ 新的 `routing.storage` 字段可用,作为之前 `middleware.cookieName` 和 `middleware.serverSetCookie` 选项的补充,提供灵活的存储配置:
154
+
155
+ ```typescript
156
+ // 禁用存储
157
+ storage: false
158
+
159
+ // 简单存储类型
160
+ storage: 'cookie'
161
+ storage: 'localStorage'
162
+ storage: 'sessionStorage'
163
+
164
+ // 带自定义属性的 Cookie
165
+ storage: {
166
+ type: 'cookie',
167
+ name: 'custom-locale',
168
+ domain: '.example.com',
169
+ secure: true,
170
+ sameSite: 'strict'
171
+ }
172
+
173
+ // 带自定义键的 localStorage
174
+ storage: {
175
+ type: 'localStorage',
176
+ name: 'custom-locale'
177
+ }
178
+
179
+ // 多种存储类型以实现冗余
180
+ storage: ['cookie', 'localStorage']
181
+ ```
182
+
183
+ ### 符合 GDPR 的配置示例
184
+
185
+ 针对需要在功能性和 GDPR 合规之间取得平衡的生产应用:
186
+
187
+ ```typescript
188
+ typescript;
189
+ // intlayer.config.ts
190
+ export default {
191
+ internationalization: {
192
+ locales: ["en", "fr", "es"],
193
+ defaultLocale: "en",
194
+ },
195
+ routing: {
196
+ mode: "prefix-no-default",
197
+ storage: [
198
+ {
199
+ type: "localStorage", // 主要存储(无需同意)
200
+ name: "user-locale",
201
+ },
202
+ {
203
+ type: "cookie", // 可选的 Cookie 存储(需要同意)
204
+ name: "user-locale",
205
+ secure: true,
206
+ sameSite: "strict",
207
+ httpOnly: false,
208
+ },
209
+ ],
210
+ },
211
+ };
212
+ ```
213
+
214
+ ### 启用 / 禁用 Cookie 存储
215
+
216
+ 使用 React / Next.js 的示例:
217
+
218
+ 可以全局定义:
219
+
220
+ ```typescript
221
+ <IntlayerProvider isCookieEnabled={false}>
222
+ <App />
223
+ </IntlayerProvider>
224
+ ```
225
+
226
+ 可以为每个 hook 本地覆盖:
227
+
228
+ ```ts
229
+ const { setLocale } = useLocale({ isCookieEnabled: false });
230
+
231
+ setLocale("en");
232
+ ```
233
+
234
+ **注意:** Cookies 默认是启用的。
235
+ **注意:** 请根据您的具体使用场景查看 [GDPR Cookie 要求](https://gdpr.eu/cookies/)。
236
+
237
+ ---
238
+
239
+ ## 可视化编辑器:包体积减小30%
240
+
241
+ 可视化编辑器包经过优化,比之前版本体积减少了30%,得益于:
242
+
243
+ - 代码编辑器性能提升
244
+ - 移除对 Intlayer 核心包的不必要依赖
245
+ - 更好的摇树优化和模块打包
246
+
247
+ 这带来了更快的下载速度和更优的运行时性能。
248
+
249
+ ---
250
+
251
+ ## fill 命令:更新行为以更好地管理内容
252
+
253
+ v7 引入了 `fill` 命令的改进行为,提供了更可预测和灵活的内容管理:
254
+
255
+ ### 新的 fill 行为
256
+
257
+ - **`fill: true`** - 用所有语言的填充内容重写当前文件
258
+ - **`fill: "path/to/file"`** - 填充指定文件而不修改当前文件
259
+ - **`fill: false`** - 完全禁用自动填充
260
+
261
+ ### 对复杂内容结构的增强支持
262
+
263
+ fill 命令现在支持复杂的内容声明结构,包括:
264
+
265
+ - **组合对象**:引用其他对象的内容声明
266
+ - **解构内容**:使用解构模式的内容
267
+ - **嵌套引用**:对象在复杂层级中相互调用
268
+ - **动态内容结构**:具有条件或计算属性的内容
269
+
270
+ ### 优势
271
+
272
+ - **意图更明确**:行为现在更清晰地表明了哪些内容会被修改
273
+ - **更好的分离**:内容文件可以与已填充的翻译文件分开保存
274
+ - **改进的工作流程**:开发者可以更好地控制翻译存储的位置
275
+ - **复杂结构支持**:处理具有多个相互关联对象的复杂内容架构
276
+
277
+ ### 示例用法
278
+
279
+ ```typescript
280
+ // 使用所有语言重写当前文件
281
+ const content = {
282
+ key: "example",
283
+ fill: true, // 重写此文件
284
+ content: {
285
+ title: "Hello World",
286
+ },
287
+ };
288
+
289
+ // 填充单独文件而不修改当前文件
290
+ const content = {
291
+ key: "example",
292
+ fill: "./translations.json", // 创建/更新 translations.json
293
+ content: {
294
+ title: "Hello World",
295
+ },
296
+ };
297
+
298
+ // 禁用自动填充
299
+ const content = {
300
+ key: "example",
301
+ fill: false, // 不自动填充
302
+ content: {
303
+ title: "Hello World",
304
+ },
305
+ };
306
+
307
+ // 复杂内容结构与组合对象
308
+ const sharedContent = {
309
+ buttons: {
310
+ save: "保存",
311
+ cancel: "取消",
312
+ },
313
+ };
314
+
315
+ const content = {
316
+ key: "complex-example",
317
+ fill: true,
318
+ content: {
319
+ // 对其他对象的引用
320
+ sharedContent,
321
+
322
+ // 解构内容
323
+ ...sharedContent,
324
+
325
+ // 嵌套引用
326
+ sections: [
327
+ {
328
+ ...sharedContent.buttons,
329
+ header: "第1部分",
330
+ },
331
+ ],
332
+ },
333
+ };
334
+ ```
335
+
336
+ ---
337
+
338
+ ## 增强的稳定性和翻译管理
339
+
340
+ v7 引入了多项改进,使内容翻译更加可靠和高效:
341
+
342
+ ### 完整的内容声明文件更新
343
+
344
+ 系统现在更新 `.content.{ts,js,cjs,mjs}` 文件,而不是部分更新,确保:
345
+
346
+ - **数据完整性**:完整的文件重写防止部分更新导致内容损坏
347
+ - **一致性**:所有语言版本以原子方式更新,保持同步
348
+ - **可靠性**:降低内容文件不完整或格式错误的风险
349
+
350
+ ### 智能重试管理
351
+
352
+ 新的重试机制防止以错误格式推送内容,并避免单个请求失败时破坏整个填充过程。
353
+
354
+ ### 并行处理以加快速度
355
+
356
+ 翻译操作现在在队列中运行,实现并行处理。这显著加快了处理速度。
357
+
358
+ ### 大文件的智能分块
359
+
360
+ 先进的分块策略处理大型内容文件,避免超出 AI 上下文窗口限制:
361
+
362
+ ### 示例工作流程
363
+
364
+ ```typescript
365
+ // 大型内容文件自动进行分块
366
+ const content = {
367
+ key: "large-documentation",
368
+ fill: true,
369
+ content: {
370
+ // 大型内容自动分块以供 AI 处理
371
+ introduction: "..." // 5000+ 字符
372
+ sections: [
373
+ // 多个大型章节
374
+ ]
375
+ }
376
+ };
377
+ ```
378
+
379
+ 系统自动执行:
380
+
381
+ 1. 分析内容大小和结构
382
+ 2. 适当分块内容
383
+ 3. 并行处理各个块
384
+ 4. 验证并在需要时重试
385
+ 5. 重建完整文件
386
+
387
+ ---
388
+
389
+ ## 从 v6 版本迁移说明
390
+
391
+ ### 移除的配置项
392
+
393
+ - **`middleware.cookieName`**:被 `routing.storage` 替代
394
+ - **`middleware.serverSetCookie`**:被 `routing.storage` 替代
395
+ - **`middleware.prefixDefault`**:被 `routing.mode` 替代
396
+ - **`middleware.noPrefix`**:被 `routing.mode` 替代
397
+
398
+ ### 迁移映射
399
+
400
+ #### 配置映射
401
+
402
+ | v6 配置 | v7 配置 |
403
+ | -------------------------- | ------------------------------------------------ |
404
+ | `autoFill: xxx` | `fill: xxx` |
405
+ | `prefixDefault: false` | `mode: 'prefix-no-default'` |
406
+ | `prefixDefault: true` | `mode: 'prefix-all'` |
407
+ | `noPrefix: true` | `mode: 'no-prefix'` |
408
+ | `cookieName: 'my-locale'` | `storage: { type: 'cookie', name: 'my-locale' }` |
409
+ | `serverSetCookie: 'never'` | `storage: false` 或从存储数组中移除 cookie` |
410
+
411
+ #### 迁移示例
412
+
413
+ **迁移前 (v6):**
414
+
415
+ ```typescript
416
+ export default {
417
+ middleware: {
418
+ headerName: "x-intlayer-locale",
419
+ cookieName: "intlayer-locale",
420
+ prefixDefault: false,
421
+ basePath: "",
422
+ serverSetCookie: "always",
423
+ noPrefix: false,
424
+ },
425
+ };
426
+ ```
427
+
428
+ **升级后 (v7):**
429
+
430
+ ```typescript
431
+ export default {
432
+ routing: {
433
+ mode: "prefix-no-default",
434
+ storage: "localStorage", // 如果需要使用 cookie 存储,可以改为 'cookie'
435
+ headerName: "x-intlayer-locale",
436
+ basePath: "",
437
+ detectLocaleOnPrefetchNoPrefix: false,
438
+ },
439
+ };
440
+ ```
441
+
442
+ #### 字典内容映射
443
+
444
+ | v6 字典内容 | v7 字典内容 |
445
+ | --------------- | ----------- |
446
+ | `autoFill: xxx` | `fill: xxx` |
447
+
448
+ #### 升级示例
449
+
450
+ **升级前 (v6):**
451
+
452
+ ```typescript
453
+ const content = {
454
+ key: "example",
455
+ autoFill: true, // 重写此文件
456
+ content: {
457
+ title: "你好,世界",
458
+ },
459
+ };
460
+ ```
461
+
462
+ **之后 (v7):**
463
+
464
+ ```typescript
465
+ const content = {
466
+ key: "example",
467
+ fill: true, // 重写此文件
468
+ content: {
469
+ title: "你好,世界",
470
+ },
471
+ };
472
+ ```
473
+
474
+ ---
475
+
476
+ ## 从 v5 到 v6 的迁移说明
477
+
478
+ 更多信息请查看 [从 v5 到 v6 的迁移说明](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/releases/v6.md)。
479
+
480
+ ---
481
+
482
+ ## 有用的链接
483
+
484
+ - [配置参考](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/configuration.md)
485
+ - [中间件文档](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/packages/next-intlayer/index.md)
486
+ - [TypeScript 类型](https://github.com/aymericzip/intlayer/blob/main/packages/%40intlayer/types/src/index.ts)
487
+ - [GDPR Cookie 指南](https://gdpr.eu/cookies/)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@intlayer/docs",
3
- "version": "7.0.0-canary.1",
3
+ "version": "7.0.0-canary.3",
4
4
  "private": false,
5
5
  "description": "Intlayer documentation",
6
6
  "keywords": [
@@ -69,17 +69,17 @@
69
69
  "watch": "webpack --config ./webpack.config.ts --watch"
70
70
  },
71
71
  "dependencies": {
72
- "@intlayer/config": "workspace:*",
73
- "@intlayer/core": "workspace:*",
74
- "@intlayer/types": "workspace:*"
72
+ "@intlayer/config": "7.0.0-canary.3",
73
+ "@intlayer/core": "7.0.0-canary.3",
74
+ "@intlayer/types": "7.0.0-canary.3"
75
75
  },
76
76
  "devDependencies": {
77
- "@intlayer/api": "workspace:*",
78
- "@intlayer/cli": "workspace:*",
77
+ "@intlayer/api": "7.0.0-canary.3",
78
+ "@intlayer/cli": "7.0.0-canary.3",
79
79
  "@types/node": "24.9.1",
80
- "@utils/ts-config": "workspace:*",
81
- "@utils/ts-config-types": "workspace:*",
82
- "@utils/tsdown-config": "workspace:*",
80
+ "@utils/ts-config": "7.0.0-canary.3",
81
+ "@utils/ts-config-types": "7.0.0-canary.3",
82
+ "@utils/tsdown-config": "7.0.0-canary.3",
83
83
  "fast-glob": "3.3.3",
84
84
  "rimraf": "6.0.1",
85
85
  "tsdown": "0.15.9",
@@ -87,11 +87,11 @@
87
87
  "vitest": "4.0.3"
88
88
  },
89
89
  "peerDependencies": {
90
- "@intlayer/api": "workspace:*",
91
- "@intlayer/cli": "workspace:*",
92
- "@intlayer/config": "workspace:*",
93
- "@intlayer/core": "workspace:*",
94
- "@intlayer/types": "workspace:*"
90
+ "@intlayer/api": "7.0.0-canary.3",
91
+ "@intlayer/cli": "7.0.0-canary.3",
92
+ "@intlayer/config": "7.0.0-canary.3",
93
+ "@intlayer/core": "7.0.0-canary.3",
94
+ "@intlayer/types": "7.0.0-canary.3"
95
95
  },
96
96
  "engines": {
97
97
  "node": ">=14.18"
package/src/common.ts CHANGED
@@ -68,6 +68,11 @@ export type FileMetadata = {
68
68
  author?: string;
69
69
  youtubeVideo?: string;
70
70
  applicationTemplate?: string;
71
+ history?: {
72
+ version: string;
73
+ date: string;
74
+ changes: string;
75
+ }[];
71
76
  };
72
77
 
73
78
  export const formatMetadata = (