@intlayer/docs 8.9.4 → 8.9.6-canary.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 (182) hide show
  1. package/docs/ar/benchmark/index.md +0 -3
  2. package/docs/ar/benchmark/nextjs.md +15 -6
  3. package/docs/ar/benchmark/solid.md +155 -0
  4. package/docs/ar/benchmark/svelte.md +148 -0
  5. package/docs/ar/benchmark/tanstack.md +12 -3
  6. package/docs/ar/benchmark/vue.md +160 -0
  7. package/docs/ar/configuration.md +16 -12
  8. package/docs/ar/dictionary/content_file.md +51 -1
  9. package/docs/ar/plugins/sync-po.md +0 -21
  10. package/docs/bn/configuration.md +16 -12
  11. package/docs/cs/configuration.md +16 -12
  12. package/docs/de/benchmark/index.md +0 -3
  13. package/docs/de/benchmark/nextjs.md +15 -6
  14. package/docs/de/benchmark/solid.md +155 -0
  15. package/docs/de/benchmark/svelte.md +148 -0
  16. package/docs/de/benchmark/tanstack.md +12 -3
  17. package/docs/de/benchmark/vue.md +160 -0
  18. package/docs/de/configuration.md +16 -12
  19. package/docs/de/dictionary/content_file.md +52 -2
  20. package/docs/de/plugins/sync-po.md +0 -22
  21. package/docs/en/benchmark/nextjs.md +11 -2
  22. package/docs/en/benchmark/solid.md +22 -4
  23. package/docs/en/benchmark/svelte.md +17 -5
  24. package/docs/en/benchmark/tanstack.md +18 -3
  25. package/docs/en/benchmark/vue.md +17 -11
  26. package/docs/en/configuration.md +16 -13
  27. package/docs/en/dictionary/content_file.md +51 -1
  28. package/docs/en/plugins/sync-po.md +0 -21
  29. package/docs/en-GB/benchmark/index.md +0 -3
  30. package/docs/en-GB/benchmark/nextjs.md +15 -6
  31. package/docs/en-GB/benchmark/solid.md +155 -0
  32. package/docs/en-GB/benchmark/svelte.md +148 -0
  33. package/docs/en-GB/benchmark/tanstack.md +12 -3
  34. package/docs/en-GB/benchmark/vue.md +160 -0
  35. package/docs/en-GB/configuration.md +15 -11
  36. package/docs/en-GB/dictionary/content_file.md +51 -1
  37. package/docs/en-GB/plugins/sync-po.md +0 -21
  38. package/docs/es/benchmark/index.md +0 -3
  39. package/docs/es/benchmark/nextjs.md +15 -6
  40. package/docs/es/benchmark/solid.md +155 -0
  41. package/docs/es/benchmark/svelte.md +148 -0
  42. package/docs/es/benchmark/tanstack.md +12 -3
  43. package/docs/es/benchmark/vue.md +160 -0
  44. package/docs/es/configuration.md +16 -12
  45. package/docs/es/dictionary/content_file.md +51 -1
  46. package/docs/es/plugins/sync-po.md +0 -21
  47. package/docs/fr/benchmark/index.md +0 -3
  48. package/docs/fr/benchmark/nextjs.md +15 -6
  49. package/docs/fr/benchmark/solid.md +155 -0
  50. package/docs/fr/benchmark/svelte.md +148 -0
  51. package/docs/fr/benchmark/tanstack.md +12 -3
  52. package/docs/fr/benchmark/vue.md +160 -0
  53. package/docs/fr/configuration.md +16 -12
  54. package/docs/fr/dictionary/content_file.md +51 -1
  55. package/docs/fr/plugins/sync-po.md +0 -21
  56. package/docs/hi/benchmark/nextjs.md +15 -6
  57. package/docs/hi/benchmark/solid.md +155 -0
  58. package/docs/hi/benchmark/svelte.md +148 -0
  59. package/docs/hi/benchmark/tanstack.md +12 -3
  60. package/docs/hi/benchmark/vue.md +160 -0
  61. package/docs/hi/configuration.md +16 -12
  62. package/docs/hi/dictionary/content_file.md +51 -1
  63. package/docs/hi/plugins/sync-po.md +0 -21
  64. package/docs/id/benchmark/index.md +0 -3
  65. package/docs/id/benchmark/nextjs.md +15 -6
  66. package/docs/id/benchmark/solid.md +155 -0
  67. package/docs/id/benchmark/svelte.md +148 -0
  68. package/docs/id/benchmark/tanstack.md +12 -3
  69. package/docs/id/benchmark/vue.md +160 -0
  70. package/docs/id/configuration.md +16 -12
  71. package/docs/id/dictionary/content_file.md +51 -1
  72. package/docs/id/plugins/sync-po.md +0 -21
  73. package/docs/it/benchmark/index.md +1 -4
  74. package/docs/it/benchmark/nextjs.md +15 -6
  75. package/docs/it/benchmark/solid.md +155 -0
  76. package/docs/it/benchmark/svelte.md +148 -0
  77. package/docs/it/benchmark/tanstack.md +12 -3
  78. package/docs/it/benchmark/vue.md +160 -0
  79. package/docs/it/configuration.md +16 -12
  80. package/docs/it/dictionary/content_file.md +51 -1
  81. package/docs/it/plugins/sync-po.md +0 -21
  82. package/docs/ja/benchmark/index.md +5 -5
  83. package/docs/ja/benchmark/nextjs.md +15 -6
  84. package/docs/ja/benchmark/solid.md +155 -0
  85. package/docs/ja/benchmark/svelte.md +148 -0
  86. package/docs/ja/benchmark/tanstack.md +12 -3
  87. package/docs/ja/benchmark/vue.md +160 -0
  88. package/docs/ja/configuration.md +16 -12
  89. package/docs/ja/dictionary/content_file.md +50 -2
  90. package/docs/ja/intlayer_with_nextjs_no_locale_path.md +4 -3
  91. package/docs/ja/plugins/sync-po.md +0 -21
  92. package/docs/ko/benchmark/nextjs.md +15 -6
  93. package/docs/ko/benchmark/solid.md +155 -0
  94. package/docs/ko/benchmark/svelte.md +148 -0
  95. package/docs/ko/benchmark/tanstack.md +12 -3
  96. package/docs/ko/benchmark/vue.md +160 -0
  97. package/docs/ko/configuration.md +16 -12
  98. package/docs/ko/dictionary/content_file.md +51 -1
  99. package/docs/ko/intlayer_with_nextjs_no_locale_path.md +3 -2
  100. package/docs/ko/plugins/sync-po.md +0 -21
  101. package/docs/nl/configuration.md +16 -12
  102. package/docs/pl/benchmark/index.md +0 -3
  103. package/docs/pl/benchmark/nextjs.md +15 -6
  104. package/docs/pl/benchmark/solid.md +155 -0
  105. package/docs/pl/benchmark/svelte.md +148 -0
  106. package/docs/pl/benchmark/tanstack.md +12 -3
  107. package/docs/pl/benchmark/vue.md +160 -0
  108. package/docs/pl/configuration.md +16 -12
  109. package/docs/pl/dictionary/content_file.md +51 -1
  110. package/docs/pl/plugins/sync-po.md +0 -21
  111. package/docs/pt/benchmark/index.md +0 -3
  112. package/docs/pt/benchmark/nextjs.md +16 -7
  113. package/docs/pt/benchmark/solid.md +155 -0
  114. package/docs/pt/benchmark/svelte.md +148 -0
  115. package/docs/pt/benchmark/tanstack.md +13 -4
  116. package/docs/pt/benchmark/vue.md +160 -0
  117. package/docs/pt/configuration.md +16 -12
  118. package/docs/pt/dictionary/content_file.md +51 -1
  119. package/docs/pt/plugins/sync-po.md +0 -21
  120. package/docs/ru/benchmark/nextjs.md +15 -6
  121. package/docs/ru/benchmark/solid.md +155 -0
  122. package/docs/ru/benchmark/svelte.md +148 -0
  123. package/docs/ru/benchmark/tanstack.md +12 -3
  124. package/docs/ru/benchmark/vue.md +160 -0
  125. package/docs/ru/configuration.md +16 -12
  126. package/docs/ru/dictionary/content_file.md +52 -2
  127. package/docs/ru/plugins/sync-po.md +0 -21
  128. package/docs/tr/benchmark/index.md +0 -3
  129. package/docs/tr/benchmark/nextjs.md +15 -6
  130. package/docs/tr/benchmark/solid.md +155 -0
  131. package/docs/tr/benchmark/svelte.md +148 -0
  132. package/docs/tr/benchmark/tanstack.md +12 -3
  133. package/docs/tr/benchmark/vue.md +160 -0
  134. package/docs/tr/configuration.md +16 -12
  135. package/docs/tr/dictionary/content_file.md +51 -1
  136. package/docs/tr/plugins/sync-po.md +0 -21
  137. package/docs/uk/benchmark/nextjs.md +15 -6
  138. package/docs/uk/benchmark/solid.md +155 -0
  139. package/docs/uk/benchmark/svelte.md +148 -0
  140. package/docs/uk/benchmark/tanstack.md +12 -3
  141. package/docs/uk/benchmark/vue.md +160 -0
  142. package/docs/uk/configuration.md +16 -12
  143. package/docs/uk/dictionary/content_file.md +51 -1
  144. package/docs/uk/plugins/sync-po.md +0 -21
  145. package/docs/ur/configuration.md +16 -12
  146. package/docs/vi/benchmark/index.md +0 -3
  147. package/docs/vi/benchmark/nextjs.md +15 -6
  148. package/docs/vi/benchmark/solid.md +155 -0
  149. package/docs/vi/benchmark/svelte.md +148 -0
  150. package/docs/vi/benchmark/tanstack.md +12 -3
  151. package/docs/vi/benchmark/vue.md +160 -0
  152. package/docs/vi/configuration.md +16 -12
  153. package/docs/vi/dictionary/content_file.md +51 -1
  154. package/docs/vi/intlayer_with_nextjs_15.md +10 -57
  155. package/docs/vi/plugins/sync-po.md +0 -21
  156. package/docs/zh/benchmark/nextjs.md +15 -6
  157. package/docs/zh/benchmark/solid.md +155 -0
  158. package/docs/zh/benchmark/svelte.md +148 -0
  159. package/docs/zh/benchmark/tanstack.md +12 -3
  160. package/docs/zh/benchmark/vue.md +160 -0
  161. package/docs/zh/configuration.md +16 -12
  162. package/docs/zh/dictionary/content_file.md +51 -3
  163. package/docs/zh/plugins/sync-po.md +0 -21
  164. package/frequent_questions/ar/intlayerNode.md +3 -3
  165. package/frequent_questions/de/intlayerNode.md +3 -3
  166. package/frequent_questions/en/intlayerNode.md +3 -3
  167. package/frequent_questions/en-GB/intlayerNode.md +3 -3
  168. package/frequent_questions/es/intlayerNode.md +3 -3
  169. package/frequent_questions/fr/intlayerNode.md +3 -3
  170. package/frequent_questions/hi/intlayerNode.md +3 -3
  171. package/frequent_questions/id/intlayerNode.md +3 -3
  172. package/frequent_questions/it/intlayerNode.md +3 -3
  173. package/frequent_questions/ja/intlayerNode.md +3 -3
  174. package/frequent_questions/ko/intlayerNode.md +3 -3
  175. package/frequent_questions/pl/intlayerNode.md +3 -3
  176. package/frequent_questions/pt/intlayerNode.md +3 -3
  177. package/frequent_questions/ru/intlayerNode.md +3 -3
  178. package/frequent_questions/tr/intlayerNode.md +3 -3
  179. package/frequent_questions/uk/intlayerNode.md +3 -3
  180. package/frequent_questions/vi/intlayerNode.md +3 -3
  181. package/frequent_questions/zh/intlayerNode.md +3 -3
  182. package/package.json +8 -8
@@ -0,0 +1,155 @@
1
+ ---
2
+ createdAt: 2026-04-20
3
+ updatedAt: 2026-04-21
4
+ title: 2026 年 Solid 最佳 i18n 解决方案 - 基准报告
5
+ description: 比较 Solid 国际化(i18n)库,如 solid-primitives、solid-i18next 和 Intlayer。关于包大小、泄漏和反应性的详细性能报告。
6
+ keywords:
7
+ - benchmark
8
+ - i18n
9
+ - intl
10
+ - solid
11
+ - performance
12
+ - intlayer
13
+ slugs:
14
+ - doc
15
+ - benchmark
16
+ - solid
17
+ author: Aymeric PINEAU
18
+ applicationTemplate: https://github.com/intlayer-org/benchmark-i18n-solid-template
19
+ history:
20
+ - version: 8.7.12
21
+ date: 2026-01-06
22
+ changes: "初始化基准"
23
+ ---
24
+
25
+ # Solid i18n 库 - 2026 基准报告
26
+
27
+ 此页面是 Solid 上 i18n 解决方案的基准报告。
28
+
29
+ ## 目录
30
+
31
+ <Toc/>
32
+
33
+ ## 交互式基准
34
+
35
+ <I18nBenchmark framework="vite-solid" vertical/>
36
+
37
+ ## 结果参考:
38
+
39
+ <iframe
40
+ src="https://intlayer.org/markdown?url=https%3A%2F%2Fraw.githubusercontent.com%2Fintlayer-org%2Fbenchmark-i18n%2Fmain%2Freport%2Fscripts%2Fsummarize-vite_solid.md"
41
+ width="100%"
42
+ height="600px"
43
+ style="border:none;">
44
+ </iframe>
45
+
46
+ > https://intlayer.org/markdown?url=https%3A%2F%2Fraw.githubusercontent.com%2Fintlayer-org%2Fbenchmark-i18n%2Fmain%2Freport%2Fscripts%2Fsummarize-vite_solid.md
47
+
48
+ 查看完整的基准仓库 [此处](https://github.com/intlayer-org/benchmark-i18n/tree/main)。
49
+
50
+ ## 简介
51
+
52
+ 国际化解决方案是 Solid 应用中最重的依赖项之一。主要风险是发送不必要的内容:单个路由包中包含其他页面和其他语言的翻译。
53
+
54
+ 随着应用增长,这个问题会迅速增加发送到客户端의 JavaScript,并减慢导航速度。
55
+
56
+ 实际上,对于优化最差的实现,国际化页面的重量可能是非 i18n 版本的几倍。
57
+
58
+ 另一个影响是开发者体验(DX):如何声明内容、类型、命名空间组织、动态加载以及语言更改时的反应性。
59
+
60
+ ## TL;DR
61
+
62
+ - **Intlayer**: 需要高级功能和优化的专业 Solid 应用的推荐选择(v8.7.12)。
63
+ - **@solid-primitives/i18n**: 简单项目的绝佳轻量级替代方案,但缺乏延迟加载等高级功能。
64
+ - **solid-i18next**: 标准但沉重的选项(约为 Intlayer 的 4.7 倍),具有与 React i18next 相同的缺点。
65
+ - **Paraglide**: 创新的方法,但在某些设置中 DX 复杂且存在 tree-shaking 问题。
66
+
67
+ ## 测试您的应用
68
+
69
+ 为了快速发现 i18n 泄漏问题,我建立了一个免费扫描仪,可在 [此处](https://intlayer.org/i18n-seo-scanner) 试用。
70
+
71
+ <iframe src="https://intlayer.org/i18n-seo-scanner" width="100%" height="600px" style="border:none;"/>
72
+
73
+ ## 问题所在
74
+
75
+ 限制多语言应用成本有两个关键杠杆:
76
+
77
+ - 按页面 / 命名空间拆分内容,这样在不需要时就不会加载整个字典
78
+ - 仅在需要时动态加载正确的语言
79
+
80
+ 了解这些方案的技术限制:
81
+
82
+ **动态加载**
83
+
84
+ 如果没有动态加载,大多数解决方案会从首次渲染开始将消息保留在内存中,这对于具有许多路由和语言的应用会产生显著开销。
85
+
86
+ 使用动态加载,您接受一个权衡:减少初始 JS,但有时在切换语言时会有额外的请求。
87
+
88
+ **内容拆分**
89
+
90
+ 围绕 `t('a.b.c')` 构建的语法非常方便,但往往鼓励在运行时保留大型 JSON 对象。这种模式使 tree-shaking 变得困难,除非库提供真正的按页面拆分策略。
91
+
92
+ ## 研究方法
93
+
94
+ 在此基准测试中,我们比较了以下库:
95
+
96
+ - `Base App`(无 i18n 库)
97
+ - `solid-intlayer` (v8.7.12)
98
+ - `@solid-primitives/i18n` (v2.2.1)
99
+ - `solid-i18next` (v17.0.2)
100
+ - `@inlang/paraglide-js` (v2.17.0)
101
+
102
+ 框架是 `Solid`,应用包含 **10 个页面** 和 **10 种语言**。
103
+
104
+ 我们比较了 **四种加载策略**:
105
+
106
+ | 策略 | 无命名空间(全局) | 具有命名空间(分层/scoped) |
107
+ | :----------- | :------------------------------------- | :------------------------------------------------------ |
108
+ | **静态加载** | **Static**: 启动时所有内容都在内存中。 | **Scoped static**: 按命名空间拆分;启动时加载所有内容。 |
109
+ | **动态加载** | **Dynamic**: 按需按语言加载。 | **Scoped dynamic**: 按命名空间和语言进行细粒度加载。 |
110
+
111
+ ## 策略摘要
112
+
113
+ - **静态 (Static)**: 简单;初始加载后无网络延迟。缺点:包体积大。
114
+ - **动态 (Dynamic)**: 减轻初始重量(懒加载)。当您有多种语言时非常理想。
115
+ - **分层静态 (Scoped static)**: 保持代码有序(逻辑分离),无需复杂的额外网络请求。
116
+ - **分层动态 (Scoped dynamic)**: _代码拆分_ 和性能的最佳方法。通过仅加载当前视图和活动语言所需的内容来最小化内存使用。
117
+
118
+ ## 结果详情
119
+
120
+ ### 1 - 应当避免的解决方案
121
+
122
+ > Solid 生态系统中没有明确应当避免的解决方案。
123
+
124
+ ### 2 - 可接受的解决方案
125
+
126
+ **(solid-i18next)** (`solid-i18next@17.0.2`):
127
+
128
+ `solid-i18next` 可能是最受欢迎的选项,因为它是最早满足 JavaScript 应用 i18n 需求的解决方案之一。它还拥有一套广泛的社区插件来解决特定问题。
129
+
130
+ 该包很重(~14.6kb,约为 `solid-intlayer` 的 4.7 倍)。
131
+
132
+ 尽管如此,它与基于 `t('a.b.c')` 构建的栈具有相同的主要缺点:优化是可能的,但非常耗时,且大型项目面临不良实践(命名空间 + 动态加载 + 类型)的风险。
133
+
134
+ **(@solid-primitives/i18n)** (`@solid-primitives/i18n@2.2.1`):
135
+
136
+ Solid primitive 非常轻量且高效,我推荐将其用于轻量级项目,但对于包含 cookie 管理、代理重定向、格式化器等在内的专业解决方案,它可能会迅速显现功能不足。
137
+ 它还缺乏延迟加载和分层命名空间以进行页面大小优化。
138
+
139
+ **(Paraglide)** (`@inlang/paraglide-js@2.17.0`):
140
+
141
+ `Paraglide` 提供了一种创新且深思熟虑的方法。尽管如此,在此基准测试中,他们宣传的 tree-shaking 在我的实现中没有按预期工作。工作流程和 DX 也比其他选项更复杂。
142
+ 我个人不喜欢在每次推送前重新生成 JS 文件,这会通过 PR 在开发者之间造成持续的合并冲突风险。
143
+ 最后,与其他解决方案相比,Paraglide 不使用 store(例如 Solid signal)来检索当前语言以渲染内容。对于解析的每个节点,它都会从 localStorage / cookie 等请求语言。这导致执行不必要的逻辑,从而影响组件的反应性。
144
+
145
+ ### 3 - 建议
146
+
147
+ **(Intlayer)** (`solid-intlayer@8.7.12`):
148
+
149
+ 出于客观性考虑,我个人不会对 `solid-intlayer` 做出评价,因为它是我的个人解决方案。
150
+
151
+ ### 个人笔记
152
+
153
+ 此笔记仅代表个人观点,不影响基准测试结果。尽管如此,在 i18n 领域,您经常会看到围绕 `const t = useTranslation('xx')` + `<>{t('xx.xx')}</>` 模式的翻译内容共识。
154
+
155
+ 在 Solid 应用中,将函数作为 `JSX.Element` 注入在我的观点中是一种反模式。它还增加了可避免的复杂性和 JavaScript 执行开销(即使几乎察觉不到)。
@@ -0,0 +1,148 @@
1
+ ---
2
+ createdAt: 2026-04-20
3
+ updatedAt: 2026-04-21
4
+ title: 2026 年 Svelte 最佳 i18n 解决方案 - 基准报告
5
+ description: 比较 Svelte 国际化(i18n)库,如 svelte-i18n、Paraglide 和 Intlayer。关于包大小、泄漏和反应性的详细性能报告。
6
+ keywords:
7
+ - benchmark
8
+ - i18n
9
+ - intl
10
+ - svelte
11
+ - performance
12
+ - intlayer
13
+ slugs:
14
+ - doc
15
+ - benchmark
16
+ - svelte
17
+ author: Aymeric PINEAU
18
+ applicationTemplate: https://github.com/intlayer-org/benchmark-i18n-svelte-template
19
+ history:
20
+ - version: 8.7.12
21
+ date: 2026-01-06
22
+ changes: "初始化基准"
23
+ ---
24
+
25
+ # Svelte i18n 库 - 2026 基准报告
26
+
27
+ 此页面是 Svelte 上 i18n 解决方案的基准报告。
28
+
29
+ ## 目录
30
+
31
+ <Toc/>
32
+
33
+ ## 交互式基准
34
+
35
+ <I18nBenchmark framework="vite-svelte" vertical/>
36
+
37
+ ## 结果参考:
38
+
39
+ <iframe
40
+ src="https://intlayer.org/markdown?url=https%3A%2F%2Fraw.githubusercontent.com%2Fintlayer-org%2Fbenchmark-i18n%2Fmain%2Freport%2Fscripts%2Fsummarize-vite_svelte.md"
41
+ width="100%"
42
+ height="600px"
43
+ style="border:none;">
44
+ </iframe>
45
+
46
+ > https://intlayer.org/markdown?url=https%3A%2F%2Fraw.githubusercontent.com%2Fintlayer-org%2Fbenchmark-i18n%2Fmain%2Freport%2Fscripts%2Fsummarize-vite_svelte.md
47
+
48
+ 查看完整的基准仓库 [此处](https://github.com/intlayer-org/benchmark-i18n/tree/main)。
49
+
50
+ ## 简介
51
+
52
+ 国际化解决方案是 Svelte 应用中最重的依赖项之一。主要风险是发送不必要的内容:单个路由包中包含其他页面和其他语言的翻译。
53
+
54
+ 随着应用增长,这个问题会迅速增加发送到客户端的 JavaScript,并减慢导航速度。
55
+
56
+ 实际上,对于优化最差的实现,国际化页面的重量可能是非 i18n 版本的几倍。
57
+
58
+ 另一个影响是开发者体验(DX):如何声明内容、类型、命名空间组织、动态加载以及语言更改时的反应性。
59
+
60
+ ## TL;DR
61
+
62
+ - **Intlayer**: 性能最高效的选择(v8.7.12),占用空间最小。
63
+ - **Paraglide**: tree-shaking 的有力竞争者,但开发者体验更复杂,且有反应性开销。
64
+ - **svelte-i18n**: 功能完善且是 Svelte 的标准,但包重量大得多(约为 Intlayer 的 7 倍)。
65
+
66
+ ## 测试您的应用
67
+
68
+ 为了快速发现 i18n 泄漏问题,我建立了一个免费扫描仪,可在 [此处](https://intlayer.org/i18n-seo-scanner) 试用。
69
+
70
+ <iframe src="https://intlayer.org/i18n-seo-scanner" width="100%" height="600px" style="border:none;"/>
71
+
72
+ ## 问题所在
73
+
74
+ 限制多语言应用成本有两个关键杠杆:
75
+
76
+ - 按页面 / 命名空间拆分内容,这样在不需要时就不会加载整个字典
77
+ - 仅在需要时动态加载正确的语言
78
+
79
+ 了解这些方案的技术限制:
80
+
81
+ **动态加载**
82
+
83
+ 如果没有动态加载,大多数解决方案会从首次渲染开始将消息保留在内存中,这对于具有许多路由和语言的应用会产生显著开销。
84
+
85
+ 使用动态加载,您接受一个权衡:减少初始 JS,但有时在切换语言时会有额外的请求。
86
+
87
+ **内容拆分**
88
+
89
+ 围绕 `t('a.b.c')` 构建的语法非常方便,但往往鼓励在运行时保留大型 JSON 对象。这种模式使 tree-shaking 变得困难,除非库提供真正的按页面拆分策略。
90
+
91
+ ## 研究方法
92
+
93
+ 在此基准测试中,我们比较了以下库:
94
+
95
+ - `Base App`(无 i18n 库)
96
+ - `svelte-intlayer` (v8.7.12)
97
+ - `svelte-i18n` (v4.0.1)
98
+ - `@inlang/paraglide-js` (v2.17.0)
99
+
100
+ 框架是 `Svelte`,应用包含 **10 个页面** 和 **10 种语言**。
101
+
102
+ 我们比较了 **四种加载策略**:
103
+
104
+ | 策略 | 无命名空间(全局) | 具有命名空间(分层/scoped) |
105
+ | :----------- | :------------------------------------- | :------------------------------------------------------ |
106
+ | **静态加载** | **Static**: 启动时所有内容都在内存中。 | **Scoped static**: 按命名空间拆分;启动时加载所有内容。 |
107
+ | **动态加载** | **Dynamic**: 按需按语言加载。 | **Scoped dynamic**: 按命名空间和语言进行细粒度加载。 |
108
+
109
+ ## 策略摘要
110
+
111
+ - **静态 (Static)**: 简单;初始加载后无网络延迟。缺点:包体积大。
112
+ - **动态 (Dynamic)**: 减轻初始重量(懒加载)。当您有多种语言时非常理想。
113
+ - **分层静态 (Scoped static)**: 保持代码有序(逻辑分离),无需复杂的额外网络请求。
114
+ - **分层动态 (Scoped dynamic)**: _代码拆分_ 和性能的最佳方法。通过仅加载当前视图和活动语言所需的内容来最小化内存使用。
115
+
116
+ ## 结果详情
117
+
118
+ ### 1 - 应当避免的解决方案
119
+
120
+ > Svelte 生态系统中没有明确应当避免的解决方案。
121
+
122
+ ### 2 - 可接受的解决方案
123
+
124
+ **(Paraglide)** (`@inlang/paraglide-js@2.17.0`):
125
+
126
+ `Paraglide` 提供了一种创新且深思熟虑的方法。在 Vite + Svelte 应用中,他们宣传的 tree-shaking 按预期工作,这很棒。
127
+ 但在 React + TanStack Start 的情况下,tree-shaking 没有按预期工作,Next.js 也是如此。尽管如此,在 Svelte 和 TanStack Start 项目中使用 Paraglide 还是值得关注的。
128
+ 工作流程和 DX 也比其他选项更复杂。
129
+ 我个人不喜欢在每次推送前重新生成 JS 文件,这会通过 PR 在开发者之间造成持续的合并冲突风险。该工具似乎也比 Next.js 更专注于 Vite。
130
+ 最后,与其他解决方案相比,Paraglide 不使用 store(例如 Svelte store)来检索当前语言以渲染内容。对于解析的每个节点,它都会从 localStorage / cookie 等请求语言。这导致执行不必要的逻辑,从而影响组件的反应性。
131
+
132
+ > 关于 paraglide 的说明:该解决方案在您的代码库中注入代码进行导入,因此基准报告中的“库大小”指标几乎为 0。代码生成是一件好事,因为使用的函数将仅包含必要的逻辑(全局前缀 vs 无前缀、cookie vs 存储等)。相比之下,Intlayer 在构建期间通过注入环境变量来进行过滤,以迫使打包器根据逻辑对内容进行 tree-shake。得益于此,paraglide 和 intlayer 最终比 i18next 或 next-intl 轻 6 到 10 倍。
133
+
134
+ **(svelte-i18n)** (`svelte-i18n@3.4.0`):
135
+
136
+ 此解决方案满足 Svelte 项目中 i18n 的所有需求。但正如 i18next 或其他主流 i18n 解决方案的情况一样,它有点重(~15.9kb,约为 `svelte-intlayer` 的 7 倍)。
137
+
138
+ ### 3 - 建议
139
+
140
+ **(Intlayer)** (`svelte-intlayer@8.7.12`):
141
+
142
+ 出于客观性考虑,我个人不会对 `svelte-intlayer` 做出评价,因为它是我的个人解决方案。
143
+
144
+ ### 个人笔记
145
+
146
+ 此笔记仅代表个人观点,不影响基准测试结果。尽管如此,在 i18n 领域,您经常会看到围绕 `const t = useTranslation('xx')` + `<>{t('xx.xx')}</>` 模式的翻译内容共识。
147
+
148
+ 在 Svelte 应用中,将函数作为 `Slot` 注入在我的观点中是一种反模式。它还增加了可避免的复杂性和 JavaScript 执行开销(即使几乎察觉不到)。
@@ -57,6 +57,13 @@ history:
57
57
 
58
58
  另一个影响是开发体验(DX):内容声明方式、类型、命名空间组织、动态加载以及语言环境更改时的响应性。
59
59
 
60
+ ## TL;DR
61
+
62
+ - **Intlayer**: 为 TanStack Start 提供最佳性能和最小的打包体积 (v8.7.12)。
63
+ - **react-i18next** & **use-intl**: 拥有庞大生态系统的成熟替代方案,但体积显著更大且优化更为复杂。
64
+ - **Paraglide**: 创新的 Tree-shaking 理念,但在实际应用中并未生效。在 TanStack Start 中 DX 复杂且存在响应性开销。
65
+ - **应当避免**: **General Translation (GT)** 和 **Lingo.dev**。由于严重的性能问题、AI 配额限制以及供应商锁定 (vendor lock-in)。
66
+
60
67
  ## 测试你的应用
61
68
 
62
69
  为了快速发现 i18n 泄漏问题,我建立了一个免费扫描器,你可以在[这里](https://intlayer.org/i18n-seo-scanner)试用。
@@ -87,12 +94,12 @@ history:
87
94
  在此基准测试中,我们对比了以下库:
88
95
 
89
96
  - `Base App`(无 i18n 库)
90
- - `react-intlayer` (v8.7.5-canary.0)
97
+ - `react-intlayer` (v8.7.12)
91
98
  - `react-i18next` (v17.0.2)
92
99
  - `use-intl` (v4.9.1)
93
100
  - `@lingui/core` (v5.3.0)
94
101
  - `@inlang/paraglide-js` (v2.15.1)
95
- - `tolgee` (v7.0.0)
102
+ - `@tolgee/react` (v7.0.0)
96
103
  - `react-intl` (v10.1.1)
97
104
  - `wuchale` (v0.22.11)
98
105
  - `gt-react` (vlatest)
@@ -150,7 +157,9 @@ history:
150
157
 
151
158
  `Paraglide` 提供了一种创新且经过深思熟虑的方法。即便如此,在此基准测试中,其公司宣称的 Tree-shaking 在我的 Next.js 实现或 TanStack Start 中并未生效。工作流和 DX 也比其他选项更复杂。就个人而言,我不喜欢每次推送到代码库前都要重新生成 JS 文件,这通过 PR 产生了持续的合并冲突风险。
152
159
 
153
- **(Tolgee)** (`tolgee@7.0.0`):
160
+ > 关于 paraglide 的说明:该解决方案通过将代码注入到您的代码库中进行导入,因此基准测试报告中的“库体积”指标几乎为 0。代码生成是一件好事,因为所使用的函数将仅包含必要的逻辑(全部前缀 vs 无前缀、cookie vs 存储等)。相比之下,Intlayer 通过在构建中注入环境变量来进行过滤,以强制打包工具根据逻辑对内容进行 Tree-shake。得益于此,paraglide 和 intlayer 最终成为比 i18next 或 next-intl 轻 6-10 倍的解决方案。
161
+
162
+ **(Tolgee)** (`@tolgee/react@7.0.0`):
154
163
 
155
164
  `Tolgee` 解决了前面提到的许多问题。我发现它比其他采用类似方法的工具更难上手。它不提供类型安全,这极大增加了在编译时捕捉缺失键的难度。我不得不使用自己的 API 封装 Tolgee 的 API 以添加缺失键检测。
156
165
 
@@ -0,0 +1,160 @@
1
+ ---
2
+ createdAt: 2026-04-20
3
+ updatedAt: 2026-04-21
4
+ title: 2026 年 Vue 最佳 i18n 解决方案 - 基准报告
5
+ description: 比较 Vue 国际化(i18n)库,如 vue-i18n、fluent-vue 和 Intlayer。关于包大小、泄漏和反应性的详细性能报告。
6
+ keywords:
7
+ - benchmark
8
+ - i18n
9
+ - intl
10
+ - vue
11
+ - performance
12
+ - intlayer
13
+ slugs:
14
+ - doc
15
+ - benchmark
16
+ - vue
17
+ author: Aymeric PINEAU
18
+ applicationTemplate: https://github.com/intlayer-org/benchmark-i18n-vue-template
19
+ history:
20
+ - version: 8.7.12
21
+ date: 2026-01-06
22
+ changes: "初始化基准"
23
+ ---
24
+
25
+ # Vue i18n 库 - 2026 基准报告
26
+
27
+ 此页面是 Vue 上 i18n 解决方案的基准报告。
28
+
29
+ ## 目录
30
+
31
+ <Toc/>
32
+
33
+ ## 交互式基准
34
+
35
+ <I18nBenchmark framework="vite-vue" vertical/>
36
+
37
+ ## 结果参考:
38
+
39
+ <iframe
40
+ src="https://intlayer.org/markdown?url=https%3A%2F%2Fraw.githubusercontent.com%2Fintlayer-org%2Fbenchmark-i18n%2Fmain%2Freport%2Fscripts%2Fsummarize-vite_vue.md"
41
+ width="100%"
42
+ height="600px"
43
+ style="border:none;">
44
+ </iframe>
45
+
46
+ > https://intlayer.org/markdown?url=https%3A%2F%2Fraw.githubusercontent.com%2Fintlayer-org%2Fbenchmark-i18n%2Fmain%2Freport%2Fscripts%2Fsummarize-vite_vue.md
47
+
48
+ 查看完整的基准仓库 [此处](https://github.com/intlayer-org/benchmark-i18n/tree/main)。
49
+
50
+ ## 简介
51
+
52
+ 国际化解决方案是 Vue 应用中最重的依赖项之一。主要风险是发送不必要的内容:单个路由包中包含其他页面和其他语言的翻译。
53
+
54
+ 随着应用增长,这个问题会迅速增加发送到客户端的 JavaScript,并减慢导航速度。
55
+
56
+ 实际上,对于优化最差的实现,国际化页面的重量可能是非 i18n 版本的几倍。
57
+
58
+ 另一个影响是开发者体验(DX):如何声明内容、类型、命名空间组织、动态加载以及语言更改时的反应性。
59
+
60
+ ## TL;DR
61
+
62
+ - **Intlayer**: 最轻量级的解决方案(v8.7.12),内置分层(scoping)和动态加载。
63
+ - **vue-i18n**: 具有丰富生态系统的行业标准,但在大型应用中可能会显著变重且难以进行代码拆分优化。
64
+ - **fluent-vue**: 创新的消息组织方式,但缺乏类型安全且极其沉重。
65
+
66
+ ## 测试您的应用
67
+
68
+ 为了快速发现 i18n 泄漏问题,我建立了一个免费扫描仪,可在 [此处](https://intlayer.org/i18n-seo-scanner) 试用。
69
+
70
+ <iframe src="https://intlayer.org/i18n-seo-scanner" width="100%" height="600px" style="border:none;"/>
71
+
72
+ ## 问题所在
73
+
74
+ 限制多语言应用成本有两个关键杠杆:
75
+
76
+ - 按页面 / 命名空间拆分内容,这样在不需要时就不会加载整个字典
77
+ - 仅在需要时动态加载正确的语言
78
+
79
+ 了解这些方案的技术限制:
80
+
81
+ **动态加载**
82
+
83
+ 如果没有动态加载,大多数解决方案会从首次渲染开始将消息保留在内存中,这对于具有许多路由和语言的应用会产生显著开销。
84
+
85
+ 使用动态加载,您接受一个权衡:减少初始 JS,但有时在切换语言时会有额外的请求。
86
+
87
+ **内容拆分**
88
+
89
+ 围绕 `const { t } = useI18n()` + `t('a.b.c')` 构建的语法非常方便,但往往鼓励在运行时保留大型 JSON 对象。除非库提供真正的按页面拆分策略,否则这种模式使 tree-shaking 变得困难。
90
+
91
+ ## 研究方法
92
+
93
+ 在此基准测试中,我们比较了以下库:
94
+
95
+ - `Base App`(无 i18n 库)
96
+ - `vue-intlayer` (v8.7.12)
97
+ - `vue-i18n` (v11.4.0)
98
+ - `fluent-vue` (v3.8.2)
99
+
100
+ 框架是 `Vue`,应用包含 **10 个页面** 和 **10 种语言**。
101
+
102
+ 我们比较了 **四种加载策略**:
103
+
104
+ | 策略 | 无命名空间(全局) | 具有命名空间(分层/scoped) |
105
+ | :----------- | :------------------------------------- | :------------------------------------------------------ |
106
+ | **静态加载** | **Static**: 启动时所有内容都在内存中。 | **Scoped static**: 按命名空间拆分;启动时加载所有内容。 |
107
+ | **动态加载** | **Dynamic**: 按需按语言加载。 | **Scoped dynamic**: 按命名空间和语言进行细粒度加载。 |
108
+
109
+ ## 策略摘要
110
+
111
+ - **静态 (Static)**: 简单;初始加载后无网络延迟。缺点:包体积大。
112
+ - **动态 (Dynamic)**: 减轻初始重量(懒加载)。当您有多种语言时非常理想。
113
+ - **分层静态 (Scoped static)**: 保持代码有序(逻辑分离),无需复杂的额外网络请求。
114
+ - **分层动态 (Scoped dynamic)**: _代码拆分_ 和性能的最佳方法。通过仅加载当前视图和活动语言所需的内容来最小化内存使用。
115
+
116
+ ### 我测量了什么:
117
+
118
+ 我为每个栈在真实浏览器中运行了相同的多语言应用,然后记录了线路上实际显示的内容以及耗时。尺寸报告为**普通网络压缩后**的尺寸,因为这比原始源代码计数更接近人们实际下载的内容。
119
+
120
+ - **国际化库大小**: 打包、tree-shaking 和压缩后,i18n 库的大小是空组件中 providers + composables 代码的大小。它不包括翻译文件的加载。它回答了在内容进入之前库本身有多“贵”。
121
+
122
+ - **每页 JavaScript**: 对于每个基准路由,浏览器在访问时拉取的脚本量,在套件中的页面(以及报告汇总的语言)中取平均值。重的页面就是慢的页面。
123
+
124
+ - **其他语言的泄漏 (Leakage)**: 指同一页面但另一种语言的内容,因错误而加载到被审计的页面中。这些内容是不必要的,应予以避免。(例如:`/fr/about` 页面内容出现在 `/en/about` 页面包中)
125
+
126
+ - **其他路由的泄漏**: 应用中**其他屏幕**的同样想法:当你只打开一个页面时,它们的文案是否也随之而来。(例如:`/en/about` 页面内容出现在 `/en/contact` 页面包中)。高分暗示拆分较弱或包范围过宽。
127
+
128
+ - **平均组件包大小**: 常见的 UI 部件被**逐一**测量,而不是隐藏在一个巨大的应用数字中。它显示国际化是否在静默地膨胀日常组件。例如,如果您的组件重新渲染,它将从内存加载所有这些数据。将巨大的 JSON 附加到任何组件就像连接一个庞大的未使用数据存储,这会减慢组件的性能。
129
+
130
+ - **语言切换响应能力**: 我使用应用自带的控制切换语言,并计时直到页面清晰切换的时间,这是访问者会注意到的,而不是实验室的微小步骤。
131
+
132
+ - **语言更改后的渲染工作**: 一个更细致的后续:一旦切换正在进行,界面为新语言重新绘制付出的努力。当“感觉到的”时间和框架成本不一致时很有用。
133
+
134
+ - **初始页面加载时间**: 从导航到浏览器认为页面已完全加载(针对我测试的场景)的时间。适用于比较冷启动。
135
+
136
+ - **哈イドレーション时间 (Hydration)**: 客户端将服务器 HTML 转换为可点击内容所花费的时间。表格中的破折号表示该实现在此基准测试中未提供可靠的哈イドレーション数字。
137
+
138
+ ## 结果详情
139
+
140
+ ### 1 - 应当避免的解决方案
141
+
142
+ > Vue 生态系统中没有明确应当避免的解决方案。
143
+
144
+ ### 2 - 可接受的解决方案
145
+
146
+ **(vue-i18n)** (`vue-i18n@11.4.0`):
147
+
148
+ - **vue-i18n** 毫无疑问是 Vue 中最常用的 i18n 库,它具有大量功能和庞大的生态系统。但在底层,该解决方案相当沉重。即使 vue-i18n 集成了消息的懒加载,它也缺乏分层(scoping)功能。在经典的 Vue SPA 应用中没有问题,但对于使用 @nuxt/i18n 的 Nuxt 应用,它会导致所有页面的消息都包含在单个页面中。对于包含 10 个以上页面的大型 Nuxt 应用,这可能会变得非常成问题。
149
+
150
+ 该包非常重(~24.3kb,约为 `vue-intlayer` 的 9 倍)。
151
+
152
+ **(fluent-vue)** (`fluent-vue@0.5.0`):
153
+
154
+ - **fluent-vue** 通过 .ftl 格式提供了一种创新尝试。消息组织很棒,更容易上手。但在实践中,缺乏类型安全增加了错误风险,并且调试起来可能很快就会变得耗时。此外,该解决方案使用 vite 插件加载消息,强制将所有语言的所有内容加载到每个页面中。此外,这是一个极其沉重的解决方案(~92.7kb,约为 `vue-intlayer` 的 34 倍)。
155
+
156
+ ### 3 - 建议
157
+
158
+ **(Intlayer)** (`vue-intlayer@8.7.12`):
159
+
160
+ 出于客观性考虑,我个人不会对 `vue-intlayer` 做出评价,因为它是我的个人解决方案。
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  createdAt: 2024-08-13
3
- updatedAt: 2026-04-08
3
+ updatedAt: 2026-05-12
4
4
  title: 配置
5
5
  description: 了解如何为您的应用程序配置 Intlayer。了解可用于根据您的需求自定义 Intlayer 的各种设置和选项。
6
6
  keywords:
@@ -14,6 +14,9 @@ slugs:
14
14
  - concept
15
15
  - configuration
16
16
  history:
17
+ - version: 8.9.4
18
+ date: 2026-05-12
19
+ changes: "添加对 LM Studio 提供者的支持"
17
20
  - version: 8.7.0
18
21
  date: 2026-04-08
19
22
  changes: "在构建配置中添加了 `prune` 和 `minify` 选项"
@@ -350,7 +353,7 @@ const config: IntlayerConfig = {
350
353
  ai: {
351
354
  /**
352
355
  * 使用的 AI 提供商。
353
- * 选项:'openai', 'anthropic', 'mistral', 'deepseek', 'gemini', 'ollama', 'openrouter', 'alibaba', 'fireworks', 'groq', 'huggingface', 'bedrock', 'googlevertex', 'togetherai'
356
+ * 选项:'openai', 'anthropic', 'mistral', 'deepseek', 'gemini', 'ollama', 'openrouter', 'alibaba', 'fireworks', 'groq', 'huggingface', 'bedrock', 'googlevertex', 'togetherai', 'lmstudio'
354
357
  * 默认值:'openai'
355
358
  */
356
359
  provider: "openai",
@@ -919,16 +922,17 @@ Intlayer 支持多个 AI 提供商,以提供最大的灵活性。当前支持
919
922
  - **Groq**
920
923
  - **Amazon Bedrock**
921
924
  - **Together.ai**
922
-
923
- | 字段 | 说明 | 类型 | 默认值 | 示例 | 备注 |
924
- | -------------------- | ------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------- | ------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
925
- | `provider` | 要为 Intlayer AI 功能使用的提供商。 | `'openai'` &#124; <br/> `'anthropic'` &#124; <br/> `'mistral'` &#124; <br/> `'deepseek'` &#124; <br/> `'gemini'` &#124; <br/> `'ollama'` &#124; <br/> `'openrouter'` &#124; <br/> `'alibaba'` &#124; <br/> `'fireworks'` &#124; <br/> `'groq'` &#124; <br/> `'huggingface'` &#124; <br/> `'bedrock'` &#124; <br/> `'googleaistudio'` &#124; <br/> `'googlevertex'` &#124; <br/> `'togetherai'` | `undefined` | `'anthropic'` | 不同的提供商需要不同的 API 密钥,且价格不同。 |
926
- | `model` | 要为 AI 功能使用的 AI 模型。 | `string` | | `'gpt-4o-2024-11-20'` | 具体模型取决于提供商。 |
927
- | `temperature` | 控制 AI 响应的随机性。 | `number` | 无 | `0.1` | 温度越高 = 越具创造力且越不可靠。 |
928
- | `apiKey` | 所选提供商的您的 API 密钥。 | `string` | 无 | `process.env.OPENAI_API_KEY` | 应保持私密;使用环境变量。 |
929
- | `applicationContext` | 有关应用程序的其他上下文,以帮助 AI 生成更准确的翻译(领域、目标受众、语气、术语)。 | `string` | 无 | `'我的自定义应用程序上下文'` | 可用于添加规则(例如:`"您不应转换您的 URL"` )。 |
930
- | `baseURL` | AI API 的基础 URL。 | `string` | 无 | `'https://api.openai.com/v1'` <br/> `'http://localhost:5000'` | 可以指向本地或自定义的 AI API 端点。 |
931
- | `dataSerialization` | AI 功能的数据序列化格式。 | `'json'` &#124; <br/> `'toon'` | `undefined` | `'toon'` | `'json'`: 默认,可靠;使用更多 token。<br/>• `'toon'`: token 更少,但也更不稳定。<br/>• 将上下文作为额外参数(reasoning effort 等)传递给模型。 |
925
+ - **LM Studio**
926
+
927
+ | 字段 | 说明 | 类型 | 默认值 | 示例 | 备注 |
928
+ | -------------------- | ------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ----------- | ------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
929
+ | `provider` | 要为 Intlayer AI 功能使用的提供商。 | `'openai'` &#124; <br/> `'anthropic'` &#124; <br/> `'mistral'` &#124; <br/> `'deepseek'` &#124; <br/> `'gemini'` &#124; <br/> `'ollama'` &#124; <br/> `'openrouter'` &#124; <br/> `'alibaba'` &#124; <br/> `'fireworks'` &#124; <br/> `'groq'` &#124; <br/> `'huggingface'` &#124; <br/> `'bedrock'` &#124; <br/> `'googleaistudio'` &#124; <br/> `'googlevertex'` &#124; <br/> `'togetherai'` &#124; <br/> `'lmstudio'` | `undefined` | `'anthropic'` | 不同的提供商需要不同的 API 密钥,且价格不同。 |
930
+ | `model` | 要为 AI 功能使用的 AI 模型。 | `string` | 无 | `'gpt-4o-2024-11-20'` | 具体模型取决于提供商。 |
931
+ | `temperature` | 控制 AI 响应的随机性。 | `number` | 无 | `0.1` | 温度越高 = 越具创造力且越不可靠。 |
932
+ | `apiKey` | 所选提供商的您的 API 密钥。 | `string` | 无 | `process.env.OPENAI_API_KEY` | 应保持私密;使用环境变量。 |
933
+ | `applicationContext` | 有关应用程序的其他上下文,以帮助 AI 生成更准确的翻译(领域、目标受众、语气、术语)。 | `string` | 无 | `'我的自定义应用程序上下文'` | 可用于添加规则(例如:`"您不应转换您的 URL"` )。 |
934
+ | `baseURL` | AI API 的基础 URL。 | `string` | | `'https://api.openai.com/v1'` <br/> `'http://localhost:5000'` | 可以指向本地或自定义的 AI API 端点。 |
935
+ | `dataSerialization` | AI 功能的数据序列化格式。 | `'json'` &#124; <br/> `'toon'` | `undefined` | `'toon'` | • `'json'`: 默认,可靠;使用更多 token。<br/>• `'toon'`: token 更少,但也更不稳定。<br/>• 将上下文作为额外参数(reasoning effort 等)传递给模型。 |
932
936
 
933
937
  ---
934
938