@intlayer/docs 9.5.7 → 9.5.8
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/blog/ar/is_intlayer_lighter_than_paraglide.md +284 -0
- package/blog/de/is_intlayer_lighter_than_paraglide.md +284 -0
- package/blog/en/is_intlayer_lighter_than_paraglide.md +288 -0
- package/blog/en-GB/is_intlayer_lighter_than_paraglide.md +285 -0
- package/blog/es/is_intlayer_lighter_than_paraglide.md +284 -0
- package/blog/fr/is_intlayer_lighter_than_paraglide.md +284 -0
- package/blog/hi/is_intlayer_lighter_than_paraglide.md +284 -0
- package/blog/id/is_intlayer_lighter_than_paraglide.md +284 -0
- package/blog/it/is_intlayer_lighter_than_paraglide.md +284 -0
- package/blog/ja/is_intlayer_lighter_than_paraglide.md +284 -0
- package/blog/ko/is_intlayer_lighter_than_paraglide.md +284 -0
- package/blog/pl/is_intlayer_lighter_than_paraglide.md +284 -0
- package/blog/pt/is_intlayer_lighter_than_paraglide.md +284 -0
- package/blog/ru/is_intlayer_lighter_than_paraglide.md +284 -0
- package/blog/tr/is_intlayer_lighter_than_paraglide.md +284 -0
- package/blog/uk/is_intlayer_lighter_than_paraglide.md +284 -0
- package/blog/vi/is_intlayer_lighter_than_paraglide.md +284 -0
- package/blog/zh/is_intlayer_lighter_than_paraglide.md +284 -0
- package/dist/cjs/generated/blog.entry.cjs +20 -0
- package/dist/cjs/generated/blog.entry.cjs.map +1 -1
- package/dist/cjs/generated/docs.entry.cjs +20 -0
- package/dist/cjs/generated/docs.entry.cjs.map +1 -1
- package/dist/cjs/index.cjs +2 -2
- package/dist/esm/generated/blog.entry.mjs +20 -0
- package/dist/esm/generated/blog.entry.mjs.map +1 -1
- package/dist/esm/generated/docs.entry.mjs +20 -0
- package/dist/esm/generated/docs.entry.mjs.map +1 -1
- package/dist/esm/index.mjs +2 -2
- package/dist/types/generated/blog.entry.d.ts +1 -0
- package/dist/types/generated/blog.entry.d.ts.map +1 -1
- package/dist/types/generated/docs.entry.d.ts +1 -0
- package/dist/types/generated/docs.entry.d.ts.map +1 -1
- package/docs/ar/benchmark/nextjs.md +6 -3
- package/docs/ar/benchmark/solid.md +21 -4
- package/docs/ar/benchmark/svelte.md +18 -3
- package/docs/ar/benchmark/tanstack.md +6 -3
- package/docs/ar/benchmark/vue.md +14 -5
- package/docs/ar/cli/index.md +6 -1
- package/docs/ar/cli/upgrade.md +125 -0
- package/docs/de/benchmark/nextjs.md +6 -3
- package/docs/de/benchmark/solid.md +21 -4
- package/docs/de/benchmark/svelte.md +18 -3
- package/docs/de/benchmark/tanstack.md +6 -3
- package/docs/de/benchmark/vue.md +14 -5
- package/docs/de/cli/index.md +6 -1
- package/docs/de/cli/upgrade.md +125 -0
- package/docs/en/agent_skills.md +29 -1
- package/docs/en/benchmark/nextjs.md +6 -3
- package/docs/en/benchmark/solid.md +21 -4
- package/docs/en/benchmark/svelte.md +18 -3
- package/docs/en/benchmark/tanstack.md +7 -4
- package/docs/en/benchmark/vue.md +15 -6
- package/docs/en/cli/index.md +6 -1
- package/docs/en/cli/upgrade.md +125 -0
- package/docs/en-GB/benchmark/nextjs.md +6 -3
- package/docs/en-GB/benchmark/solid.md +21 -4
- package/docs/en-GB/benchmark/svelte.md +18 -3
- package/docs/en-GB/benchmark/tanstack.md +6 -3
- package/docs/en-GB/benchmark/vue.md +15 -6
- package/docs/en-GB/cli/index.md +6 -1
- package/docs/en-GB/cli/upgrade.md +125 -0
- package/docs/es/benchmark/nextjs.md +6 -3
- package/docs/es/benchmark/solid.md +21 -4
- package/docs/es/benchmark/svelte.md +18 -3
- package/docs/es/benchmark/tanstack.md +6 -3
- package/docs/es/benchmark/vue.md +14 -5
- package/docs/es/cli/index.md +6 -1
- package/docs/es/cli/upgrade.md +125 -0
- package/docs/fr/benchmark/nextjs.md +6 -3
- package/docs/fr/benchmark/solid.md +21 -4
- package/docs/fr/benchmark/svelte.md +18 -3
- package/docs/fr/benchmark/tanstack.md +6 -3
- package/docs/fr/benchmark/vue.md +15 -6
- package/docs/fr/cli/index.md +6 -1
- package/docs/fr/cli/upgrade.md +125 -0
- package/docs/hi/benchmark/nextjs.md +6 -3
- package/docs/hi/benchmark/solid.md +21 -4
- package/docs/hi/benchmark/svelte.md +18 -3
- package/docs/hi/benchmark/tanstack.md +6 -3
- package/docs/hi/benchmark/vue.md +15 -6
- package/docs/hi/cli/index.md +6 -1
- package/docs/hi/cli/upgrade.md +125 -0
- package/docs/id/benchmark/nextjs.md +6 -3
- package/docs/id/benchmark/solid.md +21 -4
- package/docs/id/benchmark/svelte.md +18 -3
- package/docs/id/benchmark/tanstack.md +6 -3
- package/docs/id/benchmark/vue.md +15 -6
- package/docs/id/cli/index.md +6 -1
- package/docs/id/cli/upgrade.md +125 -0
- package/docs/it/benchmark/nextjs.md +6 -3
- package/docs/it/benchmark/solid.md +21 -4
- package/docs/it/benchmark/svelte.md +18 -3
- package/docs/it/benchmark/tanstack.md +6 -3
- package/docs/it/benchmark/vue.md +14 -5
- package/docs/it/cli/index.md +6 -1
- package/docs/it/cli/upgrade.md +125 -0
- package/docs/ja/benchmark/nextjs.md +6 -3
- package/docs/ja/benchmark/solid.md +21 -4
- package/docs/ja/benchmark/svelte.md +18 -3
- package/docs/ja/benchmark/tanstack.md +5 -2
- package/docs/ja/benchmark/vue.md +14 -5
- package/docs/ja/cli/index.md +6 -1
- package/docs/ja/cli/upgrade.md +125 -0
- package/docs/ko/benchmark/nextjs.md +6 -3
- package/docs/ko/benchmark/solid.md +21 -4
- package/docs/ko/benchmark/svelte.md +18 -3
- package/docs/ko/benchmark/tanstack.md +6 -3
- package/docs/ko/benchmark/vue.md +15 -6
- package/docs/ko/cli/index.md +6 -1
- package/docs/ko/cli/upgrade.md +126 -0
- package/docs/pl/benchmark/nextjs.md +6 -3
- package/docs/pl/benchmark/solid.md +21 -4
- package/docs/pl/benchmark/svelte.md +18 -3
- package/docs/pl/benchmark/tanstack.md +6 -3
- package/docs/pl/benchmark/vue.md +15 -6
- package/docs/pl/cli/index.md +6 -1
- package/docs/pl/cli/upgrade.md +125 -0
- package/docs/pt/benchmark/nextjs.md +6 -3
- package/docs/pt/benchmark/solid.md +21 -4
- package/docs/pt/benchmark/svelte.md +18 -3
- package/docs/pt/benchmark/tanstack.md +6 -3
- package/docs/pt/benchmark/vue.md +14 -5
- package/docs/pt/cli/index.md +6 -1
- package/docs/pt/cli/upgrade.md +125 -0
- package/docs/ru/benchmark/nextjs.md +6 -3
- package/docs/ru/benchmark/solid.md +21 -4
- package/docs/ru/benchmark/svelte.md +18 -3
- package/docs/ru/benchmark/tanstack.md +6 -3
- package/docs/ru/benchmark/vue.md +15 -6
- package/docs/ru/cli/index.md +6 -1
- package/docs/ru/cli/upgrade.md +125 -0
- package/docs/tr/benchmark/nextjs.md +6 -3
- package/docs/tr/benchmark/solid.md +21 -4
- package/docs/tr/benchmark/svelte.md +18 -3
- package/docs/tr/benchmark/tanstack.md +6 -3
- package/docs/tr/benchmark/vue.md +15 -6
- package/docs/tr/cli/index.md +6 -1
- package/docs/tr/cli/upgrade.md +125 -0
- package/docs/uk/benchmark/nextjs.md +6 -3
- package/docs/uk/benchmark/solid.md +21 -4
- package/docs/uk/benchmark/svelte.md +18 -3
- package/docs/uk/benchmark/tanstack.md +6 -3
- package/docs/uk/benchmark/vue.md +15 -6
- package/docs/uk/cli/index.md +6 -1
- package/docs/uk/cli/upgrade.md +125 -0
- package/docs/vi/benchmark/nextjs.md +6 -3
- package/docs/vi/benchmark/solid.md +21 -4
- package/docs/vi/benchmark/svelte.md +18 -3
- package/docs/vi/benchmark/tanstack.md +6 -3
- package/docs/vi/benchmark/vue.md +15 -6
- package/docs/vi/cli/index.md +6 -1
- package/docs/vi/cli/upgrade.md +125 -0
- package/docs/zh/benchmark/nextjs.md +6 -3
- package/docs/zh/benchmark/solid.md +21 -4
- package/docs/zh/benchmark/svelte.md +18 -3
- package/docs/zh/benchmark/tanstack.md +5 -2
- package/docs/zh/benchmark/vue.md +15 -6
- package/docs/zh/cli/index.md +6 -1
- package/docs/zh/cli/upgrade.md +125 -0
- package/package.json +6 -6
- package/src/generated/blog.entry.ts +20 -0
- package/src/generated/docs.entry.ts +20 -0
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
---
|
|
2
2
|
createdAt: 2026-04-20
|
|
3
|
-
updatedAt: 2026-09-
|
|
3
|
+
updatedAt: 2026-09-23
|
|
4
4
|
title: 2026 年 Solid 最佳 i18n 解决方案 - 基准报告
|
|
5
|
-
description: 比较 Solid 国际化(i18n)库,如 solid-primitives、solid-i18next 和 Intlayer。关于Bundle 大小、泄漏和反应性的详细性能报告。
|
|
5
|
+
description: 比较 Solid 国际化(i18n)库,如 solid-primitives、solid-i18next、Tolgee 和 Intlayer。关于Bundle 大小、泄漏和反应性的详细性能报告。
|
|
6
6
|
keywords:
|
|
7
7
|
- benchmark
|
|
8
8
|
- i18n
|
|
@@ -17,6 +17,9 @@ slugs:
|
|
|
17
17
|
author: aymericzip
|
|
18
18
|
applicationTemplate: https://github.com/intlayer-org/benchmark-i18n-solid-template
|
|
19
19
|
history:
|
|
20
|
+
- version: 9.5.7
|
|
21
|
+
date: 2026-09-23
|
|
22
|
+
changes: "更新基准测试结果"
|
|
20
23
|
- version: 9.5.1
|
|
21
24
|
date: 2026-09-11
|
|
22
25
|
changes: "更新基准测试结果"
|
|
@@ -67,6 +70,7 @@ history:
|
|
|
67
70
|
- **Intlayer**: 需要高级功能和优化的专业 Solid 应用的推荐选择(v9.5.6)。
|
|
68
71
|
- **@solid-primitives/i18n**: 简单项目的绝佳轻量级替代方案,但缺乏延迟加载等高级功能。
|
|
69
72
|
- **solid-i18next**: 标准但沉重的选项(约为 Intlayer 的 3.5 倍),具有与 React i18next 相同的缺点。
|
|
73
|
+
- **Tolgee**: 功能丰富的翻译平台,但体积较重(约 12.7kb,约为 Intlayer 的 3.0 倍),缺乏原生 Solid 原语支持(依赖 @tolgee/web),且在静态配置下存在显著的页面间翻译泄露(90% 页面泄露)。
|
|
70
74
|
- **Paraglide**: 创新的方法,但在某些设置中 DX 复杂且存在 tree-shaking 问题。
|
|
71
75
|
|
|
72
76
|
## 测试您的应用
|
|
@@ -102,6 +106,7 @@ history:
|
|
|
102
106
|
- [`solid-intlayer`](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/packages/solid-intlayer/exports.md) (v9.5.6)
|
|
103
107
|
- [`@solid-primitives/i18n`](https://github.com/solidjs-community/solid-primitives/tree/main/packages/i18n) (v2.2.1)
|
|
104
108
|
- [`i18next`](https://github.com/i18next/i18next) (v26.0.8) + [`@mbarzda/solid-i18next`](https://github.com/mbarzda/solid-i18next) (v1.4.1)
|
|
109
|
+
- [`@tolgee/web`](https://github.com/tolgee/tolgee-js) (v7.2.0)
|
|
105
110
|
- [`@inlang/paraglide-js`](https://github.com/opral/paraglide-js) (v2.25.1)
|
|
106
111
|
|
|
107
112
|
框架是 `Solid`,应用包含 **10 个页面** 和 **10 种语言**。
|
|
@@ -146,7 +151,7 @@ history:
|
|
|
146
151
|
|
|
147
152
|
GitHub 星数是项目受欢迎程度、社区信任和长期相关性的有力指标。虽然星数不是技术质量的直接衡量标准,但它们反映了有多少开发人员发现该项目有用、关注其进展并可能采用它。在评估项目价值时,星数有助于比较不同方案的吸引力,并提供对生态系统增长的见解。
|
|
148
153
|
|
|
149
|
-
[](https://star-history.com/#solidjs-community/solid-primitives&mbarzda/solid-i18next&opral/paraglide-js&aymericzip/intlayer)
|
|
154
|
+
[](https://star-history.com/#solidjs-community/solid-primitives&mbarzda/solid-i18next&opral/paraglide-js&tolgee/tolgee-js&aymericzip/intlayer)
|
|
150
155
|
|
|
151
156
|
## 结果详情
|
|
152
157
|
|
|
@@ -169,6 +174,18 @@ GitHub 星数是项目受欢迎程度、社区信任和长期相关性的有力
|
|
|
169
174
|
Solid primitive 非常轻量且高效,我推荐将其用于轻量级项目,但对于包含 cookie 管理、代理重定向、格式化器等在内的专业解决方案,它可能会迅速显现功能不足。
|
|
170
175
|
它还缺乏延迟加载和分层命名空间以进行页面大小优化。
|
|
171
176
|
|
|
177
|
+
**(Tolgee)** (`@tolgee/web@7.2.0`):
|
|
178
|
+
|
|
179
|
+
`Tolgee` 提供了功能完善的翻译管理平台,并具备上下文内编辑(in-context editing)功能。
|
|
180
|
+
|
|
181
|
+
在 Solid 上,目前还没有官方的原生适配器(例如 `@tolgee/solid`),需要开发者通过 `@tolgee/web` 结合自定义信号进行集成。
|
|
182
|
+
|
|
183
|
+
该包体积相对较重(约 12.7kb,约为 `solid-intlayer` 的 3.0 倍)。
|
|
184
|
+
|
|
185
|
+
由于在 Solid 中缺乏细粒度的按页面命名空间拆分机制,在静态配置下所有翻译都会在启动时加载到内存中。这导致严重的包内容泄露(44.5% 语言泄露,90.0% 页面内容泄露),页面平均 JS 大小达到 ~91.8kb(相比之下 Intlayer 仅为 ~35.8kb)。
|
|
186
|
+
|
|
187
|
+
语言切换响应极为迅速(0.6ms),契合 Solid 的细粒度响应式系统,不过注水(hydration)开销略高(~5.6ms 对比 Intlayer 的 ~3.0ms)。
|
|
188
|
+
|
|
172
189
|
**(Paraglide)** (`@inlang/paraglide-js@2.25.1`):
|
|
173
190
|
|
|
174
191
|
`Paraglide` 提供了一种创新且深思熟虑的方法。尽管如此,在此基准测试中,他们宣传的 tree-shaking 在我的实现中没有按预期工作。工作流程和 DX 也比其他选项更复杂。
|
|
@@ -177,7 +194,7 @@ Solid primitive 非常轻量且高效,我推荐将其用于轻量级项目,
|
|
|
177
194
|
|
|
178
195
|
### 3 - 建议
|
|
179
196
|
|
|
180
|
-
**(Intlayer)** (`solid-intlayer@9.5.
|
|
197
|
+
**(Intlayer)** (`solid-intlayer@9.5.6`):
|
|
181
198
|
|
|
182
199
|
出于客观性考虑,我个人不会对 `solid-intlayer` 做出评价,因为它是我的个人解决方案。
|
|
183
200
|
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
---
|
|
2
2
|
createdAt: 2026-04-20
|
|
3
|
-
updatedAt: 2026-09-
|
|
3
|
+
updatedAt: 2026-09-23
|
|
4
4
|
title: 2026 年 Svelte 最佳 i18n 解决方案 - 基准报告
|
|
5
|
-
description: 比较 Svelte 国际化(i18n)库,如 svelte-i18n、Paraglide 和 Intlayer。关于Bundle 大小、泄漏和反应性的详细性能报告。
|
|
5
|
+
description: 比较 Svelte 国际化(i18n)库,如 svelte-i18n、Paraglide、Tolgee 和 Intlayer。关于Bundle 大小、泄漏和反应性的详细性能报告。
|
|
6
6
|
keywords:
|
|
7
7
|
- benchmark
|
|
8
8
|
- i18n
|
|
@@ -17,6 +17,9 @@ slugs:
|
|
|
17
17
|
author: aymericzip
|
|
18
18
|
applicationTemplate: https://github.com/intlayer-org/benchmark-i18n-svelte-template
|
|
19
19
|
history:
|
|
20
|
+
- version: 9.5.7
|
|
21
|
+
date: 2026-09-23
|
|
22
|
+
changes: "Update benchmark results"
|
|
20
23
|
- version: 9.5.1
|
|
21
24
|
date: 2026-09-11
|
|
22
25
|
changes: "更新基准测试结果"
|
|
@@ -67,6 +70,7 @@ history:
|
|
|
67
70
|
|
|
68
71
|
- **Intlayer**: 性能最高效的选择(v9.5.6),占用空间最小。
|
|
69
72
|
- **Paraglide**: tree-shaking 的有力竞争者,但开发者体验更复杂,且有反应性开销。
|
|
73
|
+
- **Tolgee**: 具备上下文内编辑功能的多功能翻译平台,但体积较重(约 13.0kb,约为 Intlayer 的 3.6 倍),且在静态配置下存在显著的页面间翻译泄露(90% 页面泄露)。
|
|
70
74
|
- **svelte-i18n**: 功能完善且是 Svelte 的标准,但包重量大得多(约为 Intlayer 的 4.5 倍)。
|
|
71
75
|
|
|
72
76
|
## 测试您的应用
|
|
@@ -101,6 +105,7 @@ history:
|
|
|
101
105
|
- `Base App`(无 i18n 库)
|
|
102
106
|
- [`svelte-intlayer`](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/packages/svelte-intlayer/exports.md) (v9.5.6)
|
|
103
107
|
- [`svelte-i18n`](https://github.com/kaisermann/svelte-i18n) (v4.0.1)
|
|
108
|
+
- [`@tolgee/svelte`](https://github.com/tolgee/tolgee-js) (v7.2.1)
|
|
104
109
|
- [`@inlang/paraglide-js`](https://github.com/opral/paraglide-js) (v2.25.1)
|
|
105
110
|
|
|
106
111
|
框架是 `Svelte`,应用包含 **10 个页面** 和 **10 种语言**。
|
|
@@ -145,7 +150,7 @@ history:
|
|
|
145
150
|
|
|
146
151
|
GitHub 星数是项目受欢迎程度、社区信任和长期相关性的有力指标。虽然星数不是技术质量的直接衡量标准,但它们反映了有多少开发人员发现该项目有用、关注其进展并可能采用它。在评估项目价值时,星数有助于比较不同方案的吸引力,并提供对生态系统增长的见解。
|
|
147
152
|
|
|
148
|
-
[](https://star-history.com/#kaisermann/svelte-i18n&opral/paraglide-js&aymericzip/intlayer)
|
|
153
|
+
[](https://star-history.com/#kaisermann/svelte-i18n&opral/paraglide-js&tolgee/tolgee-js&aymericzip/intlayer)
|
|
149
154
|
|
|
150
155
|
## 结果详情
|
|
151
156
|
|
|
@@ -165,6 +170,16 @@ GitHub 星数是项目受欢迎程度、社区信任和长期相关性的有力
|
|
|
165
170
|
|
|
166
171
|
> 关于 paraglide 的说明:该解决方案在您的代码库中注入代码进行导入,因此基准报告中的“库大小”指标几乎为 0。代码生成是一件好事,因为使用的函数将仅包含必要的逻辑(全局前缀 vs 无前缀、cookie vs 存储等)。相比之下,Intlayer 在构建期间通过注入环境变量来进行过滤,以迫使打包器根据逻辑对内容进行 tree-shake。得益于此,paraglide 和 intlayer 最终比 i18next 或 next-intl 轻 6 到 10 倍。
|
|
167
172
|
|
|
173
|
+
**(Tolgee)** (`@tolgee/svelte@7.2.1`):
|
|
174
|
+
|
|
175
|
+
`Tolgee` 提供了集上下文内编辑(in-context editing)于一体的本地化平台,并通过 `@tolgee/svelte` 提供官方 Svelte 支持。
|
|
176
|
+
|
|
177
|
+
该包体积相对较重(约 13.0kb,约为 `svelte-intlayer` 的 3.6 倍)。
|
|
178
|
+
|
|
179
|
+
由于在 Svelte 中缺乏细粒度的按页面拆分机制,在静态配置下所有翻译都会在启动时直接加载到内存中。这导致严重的包内容泄露(50.0% 语言泄露,90.0% 页面内容泄露),页面平均 JS 大小达到 ~100.7kb(相比之下 Intlayer 仅为 ~59.0kb)。
|
|
180
|
+
|
|
181
|
+
得益于 Svelte 的响应式 store,语言切换响应极为迅速(0.5ms),不过注水(hydration)开销略高(~6.2ms 对比 Intlayer 的 ~5.5ms)。
|
|
182
|
+
|
|
168
183
|
**(svelte-i18n)** (`svelte-i18n@4.0.1`):
|
|
169
184
|
|
|
170
185
|
此解决方案满足 Svelte 项目中 i18n 的所有需求。但正如 i18next 或其他主流 i18n 解决方案的情况一样,它有点重(~16.6kb,约为 `svelte-intlayer` 的 4.5 倍)。
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
createdAt: 2026-04-20
|
|
3
|
-
updatedAt: 2026-09-
|
|
3
|
+
updatedAt: 2026-09-23
|
|
4
4
|
title: 2026 年 TanStack Start 最佳 i18n 解决方案 - 基准测试报告
|
|
5
5
|
description: 对比 react-i18next、use-intl 和 Intlayer 等 TanStack Start 国际化库。关于打包体积、泄漏和响应性的详细性能报告。
|
|
6
6
|
keywords:
|
|
@@ -17,6 +17,9 @@ slugs:
|
|
|
17
17
|
author: aymericzip
|
|
18
18
|
applicationTemplate: https://github.com/intlayer-org/benchmark-i18n-tanstack-start-template
|
|
19
19
|
history:
|
|
20
|
+
- version: 9.5.7
|
|
21
|
+
date: 2026-09-23
|
|
22
|
+
changes: "更新基准测试结果"
|
|
20
23
|
- version: 9.5.1
|
|
21
24
|
date: 2026-09-11
|
|
22
25
|
changes: "更新基准测试结果"
|
|
@@ -234,7 +237,7 @@ GitHub 星数是项目受欢迎程度、社区信任和长期相关性的有力
|
|
|
234
237
|
|
|
235
238
|
在本次 TanStack Start 基准测试中,没有与 `next-translate`(Next.js 插件 + `getStaticProps`)直接对应的方案。对于那些确实想要 `t()` API 且拥有成熟生态的团队,`react-i18next` 和 `use-intl` 仍是“合理”的选择,但要做好投入大量时间进行优化以避免泄漏的准备。
|
|
236
239
|
|
|
237
|
-
**(Intlayer)** (`react-intlayer@9.5.
|
|
240
|
+
**(Intlayer)** (`react-intlayer@9.5.6`):
|
|
238
241
|
|
|
239
242
|
出于客观性考量,我不会亲自评价 `react-intlayer`,因为这是我自己的解决方案。
|
|
240
243
|
|
package/docs/zh/benchmark/vue.md
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
---
|
|
2
2
|
createdAt: 2026-04-20
|
|
3
|
-
updatedAt: 2026-09-
|
|
3
|
+
updatedAt: 2026-09-23
|
|
4
4
|
title: 2026 年 Vue 最佳 i18n 解决方案 - 基准报告
|
|
5
|
-
description: 比较 Vue 国际化(i18n)库,如 vue-i18n、fluent-vue 和 Intlayer。关于Bundle 大小、泄漏和反应性的详细性能报告。
|
|
5
|
+
description: 比较 Vue 国际化(i18n)库,如 vue-i18n、fluent-vue, Tolgee 和 Intlayer。关于Bundle 大小、泄漏和反应性的详细性能报告。
|
|
6
6
|
keywords:
|
|
7
7
|
- benchmark
|
|
8
8
|
- i18n
|
|
@@ -17,6 +17,9 @@ slugs:
|
|
|
17
17
|
author: aymericzip
|
|
18
18
|
applicationTemplate: https://github.com/intlayer-org/benchmark-i18n-vue-template
|
|
19
19
|
history:
|
|
20
|
+
- version: 9.5.7
|
|
21
|
+
date: 2026-09-23
|
|
22
|
+
changes: "更新基准测试结果并添加 Tolgee"
|
|
20
23
|
- version: 9.5.1
|
|
21
24
|
date: 2026-09-11
|
|
22
25
|
changes: "更新基准测试结果"
|
|
@@ -66,6 +69,7 @@ style="border:none;"
|
|
|
66
69
|
## TL;DR
|
|
67
70
|
|
|
68
71
|
- **Intlayer**: 最轻量级的解决方案(v9.5.6),内置分层(scoping)和动态加载。
|
|
72
|
+
- **Tolgee**:在动态模式下具备零泄漏的有效动态加载,但体积较重(约 3.7 倍于 Intlayer),且缺乏编译时内置的类型安全。
|
|
69
73
|
- **vue-i18n**: 具有丰富生态系统的行业标准,但在大型应用中可能会显著变重且难以进行代码拆分优化。
|
|
70
74
|
- **fluent-vue**: 创新的消息组织方式,但缺乏类型安全且极其沉重。
|
|
71
75
|
|
|
@@ -103,6 +107,7 @@ style="border:none;"
|
|
|
103
107
|
- [`@intlayer/vue-i18n`](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/compat/vue-i18n.md) (v9.5.6)
|
|
104
108
|
- [`vue-i18n`](https://github.com/intlify/vue-i18n) (v11.4.0)
|
|
105
109
|
- [`fluent-vue`](https://github.com/fluent-vue/fluent-vue) (v3.8.2)
|
|
110
|
+
- [`@tolgee/vue`](https://github.com/tolgee/tolgee-js) (v7.2.0)
|
|
106
111
|
|
|
107
112
|
框架是 `Vue`,应用包含 **10 个页面** 和 **10 种语言**。
|
|
108
113
|
|
|
@@ -146,7 +151,7 @@ style="border:none;"
|
|
|
146
151
|
|
|
147
152
|
GitHub 星数是项目受欢迎程度、社区信任和长期相关性的有力指标。虽然星数不是技术质量的直接衡量标准,但它们反映了有多少开发人员发现该项目有用、关注其进展并可能采用它。在评估项目价值时,星数有助于比较不同方案的吸引力,并提供对生态系统增长的见解。
|
|
148
153
|
|
|
149
|
-
[](https://star-history.com/#intlify/vue-i18n&fluent-vue/fluent-vue&aymericzip/intlayer)
|
|
154
|
+
[](https://star-history.com/#intlify/vue-i18n&fluent-vue/fluent-vue&tolgee/tolgee-js&aymericzip/intlayer)
|
|
150
155
|
|
|
151
156
|
## 结果详情
|
|
152
157
|
|
|
@@ -156,18 +161,22 @@ GitHub 星数是项目受欢迎程度、社区信任和长期相关性的有力
|
|
|
156
161
|
|
|
157
162
|
### 2 - 可接受的解决方案
|
|
158
163
|
|
|
164
|
+
**(Tolgee)** (`@tolgee/vue@7.2.0`):
|
|
165
|
+
|
|
166
|
+
`Tolgee` 解决了前面提到的许多问题,提供了成功消除语言区域和页面泄漏的动态加载(将页面 JS 减少至约 58.8kb)。但是,它在默认情况下不提供键的编译时内置类型安全,这使得捕获缺失的键更加困难。此外,该库的体积相对较重(~13.8kb,约为 `vue-intlayer` 的 3.7 倍)。
|
|
167
|
+
|
|
159
168
|
**(vue-i18n)** (`vue-i18n@11.4.0`):
|
|
160
169
|
|
|
161
170
|
- **vue-i18n** 毫无疑问是 Vue 中最常用的 i18n 库,它具有大量功能和庞大的生态系统。但在底层,该解决方案相当沉重。即使 vue-i18n 集成了消息的懒加载,它也缺乏分层(scoping)功能。在经典的 Vue SPA 应用中没有问题,但对于使用 @nuxt/i18n 的 Nuxt 应用,它会导致所有页面的消息都包含在单个页面中。对于包含 10 个以上页面的大型 Nuxt 应用,这可能会变得非常成问题。
|
|
162
171
|
|
|
163
|
-
该包非常重(~24.
|
|
172
|
+
该包非常重(~24.1 kb,约为 `vue-intlayer` 的 6.5倍)。
|
|
164
173
|
|
|
165
174
|
**(fluent-vue)** (`fluent-vue@3.8.2`):
|
|
166
175
|
|
|
167
|
-
- **fluent-vue** 通过 .ftl 格式提供了一种创新尝试。消息组织很棒,更容易上手。但在实践中,缺乏类型安全增加了错误风险,并且调试起来可能很快就会变得耗时。此外,该解决方案使用 vite 插件加载消息,强制将所有语言的所有内容加载到每个页面中。此外,这是一个极其沉重的解决方案(~29.7kb,约为 `vue-intlayer` 的
|
|
176
|
+
- **fluent-vue** 通过 .ftl 格式提供了一种创新尝试。消息组织很棒,更容易上手。但在实践中,缺乏类型安全增加了错误风险,并且调试起来可能很快就会变得耗时。此外,该解决方案使用 vite 插件加载消息,强制将所有语言的所有内容加载到每个页面中。此外,这是一个极其沉重的解决方案(~29.7kb,约为 `vue-intlayer` 的 8倍)。
|
|
168
177
|
|
|
169
178
|
### 3 - 建议
|
|
170
179
|
|
|
171
|
-
**(Intlayer)** (`vue-intlayer@9.5.
|
|
180
|
+
**(Intlayer)** (`vue-intlayer@9.5.6`):
|
|
172
181
|
|
|
173
182
|
出于客观性考虑,我个人不会对 `vue-intlayer` 做出评价,因为它是我的个人解决方案。
|
package/docs/zh/cli/index.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
createdAt: 2024-08-11
|
|
3
|
-
updatedAt: 2026-09-
|
|
3
|
+
updatedAt: 2026-09-23
|
|
4
4
|
title: CLI - 适用于多语言网站的所有 Intlayer CLI 命令
|
|
5
5
|
description: 了解如何使用 Intlayer CLI 管理您的多语言网站。按照此在线文档中的步骤,在几分钟内设置您的项目。
|
|
6
6
|
keywords:
|
|
@@ -17,6 +17,9 @@ slugs:
|
|
|
17
17
|
- concept
|
|
18
18
|
- cli
|
|
19
19
|
history:
|
|
20
|
+
- version: 9.5.8
|
|
21
|
+
date: 2026-09-23
|
|
22
|
+
changes: "添加 upgrade 命令"
|
|
20
23
|
- version: 9.5.6
|
|
21
24
|
date: 2026-09-21
|
|
22
25
|
changes: "添加 init infra 命令"
|
|
@@ -155,6 +158,7 @@ Intlayer 接受多种配置文件格式:
|
|
|
155
158
|
|
|
156
159
|
- **[Initialize Intlayer](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/cli/init.md)** - 使用自动配置在您的项目中设置 Intlayer
|
|
157
160
|
- **[配置基础设施](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/cli/infra.md)** - 安装桌面应用或使用 Docker(多合一或 Compose)自行托管 CMS
|
|
161
|
+
- **[升级 Intlayer 软件包](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/cli/upgrade.md)** - 列出每个 `package.json` 中的 Intlayer 软件包并将其升级到最新版本
|
|
158
162
|
- **[Manage Configuration](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/cli/configuration.md)** - 获取您的 Intlayer 配置并将其发送到 CMS
|
|
159
163
|
|
|
160
164
|
### 文档管理
|
|
@@ -182,6 +186,7 @@ Intlayer 接受多种配置文件格式:
|
|
|
182
186
|
"scripts": {
|
|
183
187
|
"intlayer:init": "npx intlayer init",
|
|
184
188
|
"intlayer:infra": "npx intlayer init infra",
|
|
189
|
+
"intlayer:upgrade": "npx intlayer upgrade",
|
|
185
190
|
"intlayer:login": "npx intlayer login",
|
|
186
191
|
"intlayer:build": "npx intlayer build",
|
|
187
192
|
"intlayer:watch": "npx intlayer build --watch",
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
---
|
|
2
|
+
createdAt: 2026-09-23
|
|
3
|
+
updatedAt: 2026-09-23
|
|
4
|
+
title: CLI - 升级 Intlayer 软件包
|
|
5
|
+
description: 了解如何使用 Intlayer CLI upgrade 命令列出项目或 monorepo 中的每个 Intlayer 软件包,并将它们升级到最新版本。
|
|
6
|
+
keywords:
|
|
7
|
+
- CLI
|
|
8
|
+
- Upgrade
|
|
9
|
+
- 升级
|
|
10
|
+
- Packages
|
|
11
|
+
- Monorepo
|
|
12
|
+
- Intlayer
|
|
13
|
+
slugs:
|
|
14
|
+
- doc
|
|
15
|
+
- concept
|
|
16
|
+
- cli
|
|
17
|
+
- upgrade
|
|
18
|
+
history:
|
|
19
|
+
- version: 9.5.8
|
|
20
|
+
date: 2026-09-23
|
|
21
|
+
changes: "添加 upgrade 命令"
|
|
22
|
+
author: aymericzip
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
# 升级 Intlayer 软件包
|
|
26
|
+
|
|
27
|
+
```bash packageManager="npm"
|
|
28
|
+
npx intlayer upgrade
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
```bash packageManager="yarn"
|
|
32
|
+
yarn intlayer upgrade
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
```bash packageManager="pnpm"
|
|
36
|
+
pnpm intlayer upgrade
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
```bash packageManager="bun"
|
|
40
|
+
bun x intlayer upgrade
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
`upgrade` 命令会列出项目中每个 `package.json`(包括 monorepo 工作区)中声明的 Intlayer 软件包,并将它们升级到已发布的最新版本。它独立运行与 `intlayer init` 相同的软件包升级步骤。
|
|
44
|
+
|
|
45
|
+
## 参数:
|
|
46
|
+
|
|
47
|
+
- `--project-root [projectRoot]` - 可选。项目根目录。默认情况下,命令从当前工作目录上方最近的 `package.json` 开始。
|
|
48
|
+
- `--dry-run` - 可选。列出软件包及其目标版本,而不修改任何文件。
|
|
49
|
+
- `--tag <tag>` - 可选。要升级到的 npm dist-tag(例如 `canary`)。默认为 `latest`。
|
|
50
|
+
|
|
51
|
+
## 它的工作原理:
|
|
52
|
+
|
|
53
|
+
1. **列出 Intlayer 软件包** - 扫描项目的每个 `package.json`(跳过 `node_modules` 和构建输出),查找 `intlayer`、`@intlayer/*`、`*-intlayer` 和 `intlayer-*` 依赖项及 devDependencies。
|
|
54
|
+
2. **获取目标版本** - 从 npm registry 读取每个软件包所选 dist-tag(默认为 `latest`)的版本。
|
|
55
|
+
3. **重写版本范围** - 就地更新每个过期的版本范围,保留其操作符(`^`、`~` 或无)和文件缩进。
|
|
56
|
+
4. **单次安装** - 使用拥有锁文件的包管理器,从工作区根目录(带有锁文件的最近目录)执行一次安装:
|
|
57
|
+
|
|
58
|
+
| 锁文件 | 命令 |
|
|
59
|
+
| ------------------------------ | -------------- |
|
|
60
|
+
| `bun.lock` / `bun.lockb` | `bun install` |
|
|
61
|
+
| `pnpm-lock.yaml` | `pnpm install` |
|
|
62
|
+
| `yarn.lock` | `yarn install` |
|
|
63
|
+
| `package-lock.json` 或无锁文件 | `npm install` |
|
|
64
|
+
|
|
65
|
+
如果不存在锁文件,则在回退到 npm 之前会先使用 `package.json` 中的 `packageManager` 字段(例如 `"bun@1.2.0"`)。
|
|
66
|
+
|
|
67
|
+
未指向 registry 的范围(例如 `workspace:*`、`file:`、`link:`、`catalog:` 或 git URL)绝不会被修改。
|
|
68
|
+
|
|
69
|
+
## 示例:
|
|
70
|
+
|
|
71
|
+
### 列出可用的升级而不应用它们:
|
|
72
|
+
|
|
73
|
+
```bash packageManager="npm"
|
|
74
|
+
npx intlayer upgrade --dry-run
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
```bash packageManager="yarn"
|
|
78
|
+
yarn intlayer upgrade --dry-run
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
```bash packageManager="pnpm"
|
|
82
|
+
pnpm intlayer upgrade --dry-run
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
```bash packageManager="bun"
|
|
86
|
+
bun x intlayer upgrade --dry-run
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### 升级到 canary 版本:
|
|
90
|
+
|
|
91
|
+
```bash packageManager="npm"
|
|
92
|
+
npx intlayer upgrade --tag canary
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
```bash packageManager="yarn"
|
|
96
|
+
yarn intlayer upgrade --tag canary
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
```bash packageManager="pnpm"
|
|
100
|
+
pnpm intlayer upgrade --tag canary
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
```bash packageManager="bun"
|
|
104
|
+
bun x intlayer upgrade --tag canary
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
## 示例输出:
|
|
108
|
+
|
|
109
|
+
```bash
|
|
110
|
+
npx intlayer upgrade
|
|
111
|
+
Intlayer packages:
|
|
112
|
+
package.json
|
|
113
|
+
intlayer ^9.0.0 → ^9.5.7
|
|
114
|
+
apps/web/package.json
|
|
115
|
+
next-intlayer ^9.5.7 (latest)
|
|
116
|
+
vite-intlayer ~9.2.0 → ~9.5.7
|
|
117
|
+
Running bun install...
|
|
118
|
+
✓ Upgraded 2 Intlayer dependencies to latest
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
## 注意事项:
|
|
122
|
+
|
|
123
|
+
- 从代码仓库根目录运行该命令以升级所有工作区。从某个工作区运行它以仅升级该工作区。
|
|
124
|
+
- 无法获取版本的软件包(离线、私有或未发布的软件包)会被列出并保持不变。
|
|
125
|
+
- 如果安装失败,已升级的范围会保留在 `package.json` 中。请手动运行包管理器的安装命令。
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@intlayer/docs",
|
|
3
|
-
"version": "9.5.
|
|
3
|
+
"version": "9.5.8",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "Intlayer documentation",
|
|
6
6
|
"keywords": [
|
|
@@ -74,13 +74,13 @@
|
|
|
74
74
|
"watch": "webpack --config ./webpack.config.ts --watch"
|
|
75
75
|
},
|
|
76
76
|
"dependencies": {
|
|
77
|
-
"@intlayer/config": "9.5.
|
|
78
|
-
"@intlayer/core": "9.5.
|
|
79
|
-
"@intlayer/types": "9.5.
|
|
77
|
+
"@intlayer/config": "9.5.8",
|
|
78
|
+
"@intlayer/core": "9.5.8",
|
|
79
|
+
"@intlayer/types": "9.5.8"
|
|
80
80
|
},
|
|
81
81
|
"devDependencies": {
|
|
82
|
-
"@intlayer/api": "9.5.
|
|
83
|
-
"@intlayer/cli": "9.5.
|
|
82
|
+
"@intlayer/api": "9.5.8",
|
|
83
|
+
"@intlayer/cli": "9.5.8",
|
|
84
84
|
"@types/node": "^22",
|
|
85
85
|
"@utils/ts-config": "1.0.4",
|
|
86
86
|
"@utils/ts-config-types": "1.0.4",
|
|
@@ -605,6 +605,26 @@ export const blogEntry = {
|
|
|
605
605
|
vi: readLocale('is_i18next_outdated.md', 'vi'),
|
|
606
606
|
uk: readLocale('is_i18next_outdated.md', 'uk'),
|
|
607
607
|
} as unknown as Record<LocalesValues, Promise<string>>,
|
|
608
|
+
'./blog/en/is_intlayer_lighter_than_paraglide.md': {
|
|
609
|
+
en: readLocale('is_intlayer_lighter_than_paraglide.md', 'en'),
|
|
610
|
+
es: readLocale('is_intlayer_lighter_than_paraglide.md', 'es'),
|
|
611
|
+
ru: readLocale('is_intlayer_lighter_than_paraglide.md', 'ru'),
|
|
612
|
+
ja: readLocale('is_intlayer_lighter_than_paraglide.md', 'ja'),
|
|
613
|
+
fr: readLocale('is_intlayer_lighter_than_paraglide.md', 'fr'),
|
|
614
|
+
ko: readLocale('is_intlayer_lighter_than_paraglide.md', 'ko'),
|
|
615
|
+
zh: readLocale('is_intlayer_lighter_than_paraglide.md', 'zh'),
|
|
616
|
+
de: readLocale('is_intlayer_lighter_than_paraglide.md', 'de'),
|
|
617
|
+
ar: readLocale('is_intlayer_lighter_than_paraglide.md', 'ar'),
|
|
618
|
+
it: readLocale('is_intlayer_lighter_than_paraglide.md', 'it'),
|
|
619
|
+
'en-GB': readLocale('is_intlayer_lighter_than_paraglide.md', 'en-GB'),
|
|
620
|
+
pt: readLocale('is_intlayer_lighter_than_paraglide.md', 'pt'),
|
|
621
|
+
hi: readLocale('is_intlayer_lighter_than_paraglide.md', 'hi'),
|
|
622
|
+
tr: readLocale('is_intlayer_lighter_than_paraglide.md', 'tr'),
|
|
623
|
+
pl: readLocale('is_intlayer_lighter_than_paraglide.md', 'pl'),
|
|
624
|
+
id: readLocale('is_intlayer_lighter_than_paraglide.md', 'id'),
|
|
625
|
+
vi: readLocale('is_intlayer_lighter_than_paraglide.md', 'vi'),
|
|
626
|
+
uk: readLocale('is_intlayer_lighter_than_paraglide.md', 'uk'),
|
|
627
|
+
} as unknown as Record<LocalesValues, Promise<string>>,
|
|
608
628
|
'./blog/en/is_next-intl_outdated.md': {
|
|
609
629
|
en: readLocale('is_next-intl_outdated.md', 'en'),
|
|
610
630
|
es: readLocale('is_next-intl_outdated.md', 'es'),
|
|
@@ -745,6 +745,26 @@ export const docsEntry = {
|
|
|
745
745
|
vi: readLocale('cli/test.md', 'vi'),
|
|
746
746
|
uk: readLocale('cli/test.md', 'uk'),
|
|
747
747
|
} as unknown as Record<LocalesValues, Promise<string>>,
|
|
748
|
+
'./docs/en/cli/upgrade.md': {
|
|
749
|
+
en: readLocale('cli/upgrade.md', 'en'),
|
|
750
|
+
es: readLocale('cli/upgrade.md', 'es'),
|
|
751
|
+
ru: readLocale('cli/upgrade.md', 'ru'),
|
|
752
|
+
ja: readLocale('cli/upgrade.md', 'ja'),
|
|
753
|
+
fr: readLocale('cli/upgrade.md', 'fr'),
|
|
754
|
+
ko: readLocale('cli/upgrade.md', 'ko'),
|
|
755
|
+
zh: readLocale('cli/upgrade.md', 'zh'),
|
|
756
|
+
de: readLocale('cli/upgrade.md', 'de'),
|
|
757
|
+
ar: readLocale('cli/upgrade.md', 'ar'),
|
|
758
|
+
it: readLocale('cli/upgrade.md', 'it'),
|
|
759
|
+
'en-GB': readLocale('cli/upgrade.md', 'en-GB'),
|
|
760
|
+
pt: readLocale('cli/upgrade.md', 'pt'),
|
|
761
|
+
hi: readLocale('cli/upgrade.md', 'hi'),
|
|
762
|
+
tr: readLocale('cli/upgrade.md', 'tr'),
|
|
763
|
+
pl: readLocale('cli/upgrade.md', 'pl'),
|
|
764
|
+
id: readLocale('cli/upgrade.md', 'id'),
|
|
765
|
+
vi: readLocale('cli/upgrade.md', 'vi'),
|
|
766
|
+
uk: readLocale('cli/upgrade.md', 'uk'),
|
|
767
|
+
} as unknown as Record<LocalesValues, Promise<string>>,
|
|
748
768
|
'./docs/en/cli/version.md': {
|
|
749
769
|
en: readLocale('cli/version.md', 'en'),
|
|
750
770
|
es: readLocale('cli/version.md', 'es'),
|