@intlayer/docs 9.5.6 → 9.5.7
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/i18next_vs_intlayer-i18next.md +122 -15
- package/blog/ar/i18next_vs_intlayer.md +130 -16
- package/blog/ar/lingui_vs_intlayer.md +122 -15
- package/blog/ar/next-intl_vs_intlayer-next-intl.md +124 -15
- package/blog/ar/next-intl_vs_intlayer.md +136 -20
- package/blog/ar/vue-i18n_vs_intlayer-vue-i18n.md +119 -17
- package/blog/ar/vue-i18n_vs_intlayer.md +193 -31
- package/blog/ar/vue-i18n_vs_intlayer_benchmark.md +361 -0
- package/blog/de/i18next_vs_intlayer-i18next.md +122 -15
- package/blog/de/i18next_vs_intlayer.md +128 -14
- package/blog/de/lingui_vs_intlayer.md +122 -15
- package/blog/de/next-intl_vs_intlayer-next-intl.md +124 -15
- package/blog/de/next-intl_vs_intlayer.md +125 -15
- package/blog/de/vue-i18n_vs_intlayer-vue-i18n.md +117 -17
- package/blog/de/vue-i18n_vs_intlayer.md +193 -31
- package/blog/en/i18next_vs_intlayer-i18next.md +121 -14
- package/blog/en/i18next_vs_intlayer.md +128 -14
- package/blog/en/lingui_vs_intlayer.md +124 -15
- package/blog/en/next-intl_vs_intlayer-next-intl.md +123 -14
- package/blog/en/next-intl_vs_intlayer.md +125 -13
- package/blog/en/vue-i18n_vs_intlayer-vue-i18n.md +115 -15
- package/blog/en/vue-i18n_vs_intlayer.md +188 -27
- package/blog/en-GB/i18next_vs_intlayer-i18next.md +121 -14
- package/blog/en-GB/i18next_vs_intlayer.md +128 -14
- package/blog/en-GB/lingui_vs_intlayer.md +122 -15
- package/blog/en-GB/next-intl_vs_intlayer-next-intl.md +124 -15
- package/blog/en-GB/next-intl_vs_intlayer.md +125 -15
- package/blog/en-GB/vue-i18n_vs_intlayer-vue-i18n.md +117 -17
- package/blog/en-GB/vue-i18n_vs_intlayer.md +187 -25
- package/blog/en-GB/vue-i18n_vs_intlayer_benchmark.md +116 -0
- package/blog/es/i18next_vs_intlayer-i18next.md +122 -15
- package/blog/es/i18next_vs_intlayer.md +128 -14
- package/blog/es/lingui_vs_intlayer.md +122 -15
- package/blog/es/next-intl_vs_intlayer-next-intl.md +124 -15
- package/blog/es/next-intl_vs_intlayer.md +125 -15
- package/blog/es/vue-i18n_vs_intlayer-vue-i18n.md +117 -17
- package/blog/es/vue-i18n_vs_intlayer.md +193 -31
- package/blog/fr/i18next_vs_intlayer-i18next.md +122 -15
- package/blog/fr/i18next_vs_intlayer.md +128 -14
- package/blog/fr/lingui_vs_intlayer.md +122 -15
- package/blog/fr/next-intl_vs_intlayer-next-intl.md +124 -15
- package/blog/fr/next-intl_vs_intlayer.md +127 -15
- package/blog/fr/vue-i18n_vs_intlayer-vue-i18n.md +118 -17
- package/blog/fr/vue-i18n_vs_intlayer.md +192 -31
- package/blog/fr/vue-i18n_vs_intlayer_benchmark.md +329 -7
- package/blog/hi/i18next_vs_intlayer-i18next.md +122 -15
- package/blog/hi/i18next_vs_intlayer.md +130 -16
- package/blog/hi/lingui_vs_intlayer.md +122 -15
- package/blog/hi/next-intl_vs_intlayer-next-intl.md +124 -15
- package/blog/hi/next-intl_vs_intlayer.md +135 -19
- package/blog/hi/vue-i18n_vs_intlayer-vue-i18n.md +117 -17
- package/blog/hi/vue-i18n_vs_intlayer.md +193 -31
- package/blog/hi/vue-i18n_vs_intlayer_benchmark.md +361 -0
- package/blog/id/i18next_vs_intlayer-i18next.md +122 -15
- package/blog/id/i18next_vs_intlayer.md +128 -14
- package/blog/id/lingui_vs_intlayer.md +122 -15
- package/blog/id/next-intl_vs_intlayer-next-intl.md +124 -15
- package/blog/id/next-intl_vs_intlayer.md +135 -19
- package/blog/id/vue-i18n_vs_intlayer-vue-i18n.md +354 -2
- package/blog/id/vue-i18n_vs_intlayer.md +188 -26
- package/blog/id/vue-i18n_vs_intlayer_benchmark.md +327 -7
- package/blog/it/i18next_vs_intlayer-i18next.md +122 -15
- package/blog/it/i18next_vs_intlayer.md +128 -14
- package/blog/it/lingui_vs_intlayer.md +122 -15
- package/blog/it/next-intl_vs_intlayer-next-intl.md +124 -15
- package/blog/it/next-intl_vs_intlayer.md +125 -15
- package/blog/it/vue-i18n_vs_intlayer-vue-i18n.md +117 -17
- package/blog/it/vue-i18n_vs_intlayer.md +191 -31
- package/blog/it/vue-i18n_vs_intlayer_benchmark.md +332 -5
- package/blog/ja/i18next_vs_intlayer-i18next.md +122 -15
- package/blog/ja/i18next_vs_intlayer.md +129 -17
- package/blog/ja/lingui_vs_intlayer.md +122 -15
- package/blog/ja/next-intl_vs_intlayer-next-intl.md +124 -15
- package/blog/ja/next-intl_vs_intlayer.md +124 -14
- package/blog/ja/vue-i18n_vs_intlayer-vue-i18n.md +117 -17
- package/blog/ja/vue-i18n_vs_intlayer.md +193 -31
- package/blog/ja/vue-i18n_vs_intlayer_benchmark.md +361 -0
- package/blog/ko/i18next_vs_intlayer-i18next.md +122 -15
- package/blog/ko/i18next_vs_intlayer.md +129 -17
- package/blog/ko/lingui_vs_intlayer.md +122 -15
- package/blog/ko/next-intl_vs_intlayer-next-intl.md +124 -15
- package/blog/ko/next-intl_vs_intlayer.md +134 -18
- package/blog/ko/vue-i18n_vs_intlayer-vue-i18n.md +117 -17
- package/blog/ko/vue-i18n_vs_intlayer.md +193 -31
- package/blog/pl/i18next_vs_intlayer-i18next.md +122 -15
- package/blog/pl/i18next_vs_intlayer.md +128 -14
- package/blog/pl/lingui_vs_intlayer.md +122 -15
- package/blog/pl/next-intl_vs_intlayer-next-intl.md +124 -15
- package/blog/pl/next-intl_vs_intlayer.md +134 -18
- package/blog/pl/vue-i18n_vs_intlayer-vue-i18n.md +117 -17
- package/blog/pl/vue-i18n_vs_intlayer.md +188 -26
- package/blog/pl/vue-i18n_vs_intlayer_benchmark.md +361 -0
- package/blog/pt/i18next_vs_intlayer-i18next.md +122 -15
- package/blog/pt/i18next_vs_intlayer.md +128 -14
- package/blog/pt/lingui_vs_intlayer.md +122 -15
- package/blog/pt/next-intl_vs_intlayer-next-intl.md +124 -15
- package/blog/pt/next-intl_vs_intlayer.md +131 -15
- package/blog/pt/vue-i18n_vs_intlayer-vue-i18n.md +117 -17
- package/blog/pt/vue-i18n_vs_intlayer.md +193 -31
- package/blog/pt/vue-i18n_vs_intlayer_benchmark.md +361 -0
- package/blog/ru/i18next_vs_intlayer-i18next.md +122 -15
- package/blog/ru/i18next_vs_intlayer.md +130 -16
- package/blog/ru/lingui_vs_intlayer.md +122 -15
- package/blog/ru/next-intl_vs_intlayer-next-intl.md +125 -16
- package/blog/ru/next-intl_vs_intlayer.md +123 -13
- package/blog/ru/vue-i18n_vs_intlayer-vue-i18n.md +127 -27
- package/blog/ru/vue-i18n_vs_intlayer.md +193 -31
- package/blog/ru/vue-i18n_vs_intlayer_benchmark.md +326 -19
- package/blog/tr/i18next_vs_intlayer-i18next.md +122 -15
- package/blog/tr/i18next_vs_intlayer.md +128 -14
- package/blog/tr/lingui_vs_intlayer.md +122 -15
- package/blog/tr/next-intl_vs_intlayer-next-intl.md +124 -15
- package/blog/tr/next-intl_vs_intlayer.md +136 -20
- package/blog/tr/vue-i18n_vs_intlayer-vue-i18n.md +117 -17
- package/blog/tr/vue-i18n_vs_intlayer.md +188 -26
- package/blog/tr/vue-i18n_vs_intlayer_benchmark.md +361 -0
- package/blog/uk/i18next_vs_intlayer-i18next.md +122 -15
- package/blog/uk/i18next_vs_intlayer.md +130 -16
- package/blog/uk/lingui_vs_intlayer.md +122 -15
- package/blog/uk/next-intl_vs_intlayer-next-intl.md +124 -15
- package/blog/uk/next-intl_vs_intlayer.md +135 -19
- package/blog/uk/vue-i18n_vs_intlayer-vue-i18n.md +135 -17
- package/blog/uk/vue-i18n_vs_intlayer.md +188 -27
- package/blog/uk/vue-i18n_vs_intlayer_benchmark.md +361 -0
- package/blog/vi/i18next_vs_intlayer-i18next.md +122 -15
- package/blog/vi/i18next_vs_intlayer.md +128 -14
- package/blog/vi/lingui_vs_intlayer.md +122 -15
- package/blog/vi/next-intl_vs_intlayer-next-intl.md +124 -15
- package/blog/vi/next-intl_vs_intlayer.md +135 -19
- package/blog/vi/vue-i18n_vs_intlayer-vue-i18n.md +117 -17
- package/blog/vi/vue-i18n_vs_intlayer.md +188 -26
- package/blog/vi/vue-i18n_vs_intlayer_benchmark.md +361 -0
- package/blog/zh/i18next_vs_intlayer-i18next.md +122 -15
- package/blog/zh/i18next_vs_intlayer.md +128 -14
- package/blog/zh/lingui_vs_intlayer.md +122 -15
- package/blog/zh/next-intl_vs_intlayer-next-intl.md +124 -15
- package/blog/zh/next-intl_vs_intlayer.md +125 -15
- package/blog/zh/vue-i18n_vs_intlayer-vue-i18n.md +117 -17
- package/blog/zh/vue-i18n_vs_intlayer.md +192 -31
- package/blog/zh/vue-i18n_vs_intlayer_benchmark.md +340 -9
- package/dist/cjs/generated/docs.entry.cjs +40 -40
- package/dist/cjs/generated/docs.entry.cjs.map +1 -1
- package/dist/cjs/index.cjs +2 -2
- package/dist/esm/generated/docs.entry.mjs +40 -40
- package/dist/esm/generated/docs.entry.mjs.map +1 -1
- package/dist/esm/index.mjs +2 -2
- package/dist/types/generated/docs.entry.d.ts +2 -2
- package/dist/types/generated/docs.entry.d.ts.map +1 -1
- package/docs/ar/benchmark/nextjs.md +13 -13
- package/docs/ar/benchmark/solid.md +5 -5
- package/docs/ar/benchmark/svelte.md +4 -4
- package/docs/ar/benchmark/tanstack.md +14 -13
- package/docs/ar/benchmark/vue.md +5 -5
- package/docs/ar/chrome_extension.md +130 -0
- package/docs/ar/cli/index.md +6 -1
- package/docs/ar/cli/infra.md +162 -0
- package/docs/ar/cli/init.md +24 -1
- package/docs/ar/dictionary/html.md +173 -5
- package/docs/ar/dictionary/markdown.md +263 -1
- package/docs/ar/intlayer_with_analog.md +23 -1
- package/docs/ar/intlayer_with_angular_19.md +24 -1
- package/docs/ar/intlayer_with_angular_21.md +24 -1
- package/docs/ar/intlayer_with_astro.md +24 -1
- package/docs/ar/intlayer_with_astro_lit.md +25 -1
- package/docs/ar/intlayer_with_astro_preact.md +26 -1
- package/docs/ar/intlayer_with_astro_react.md +26 -1
- package/docs/ar/intlayer_with_astro_solid.md +26 -1
- package/docs/ar/intlayer_with_astro_svelte.md +25 -1
- package/docs/ar/intlayer_with_astro_vue.md +25 -1
- package/docs/ar/intlayer_with_remix_3.md +22 -1
- package/docs/ar/self_hosting.md +406 -231
- package/docs/de/benchmark/nextjs.md +13 -13
- package/docs/de/benchmark/solid.md +5 -5
- package/docs/de/benchmark/svelte.md +4 -4
- package/docs/de/benchmark/tanstack.md +14 -13
- package/docs/de/benchmark/vue.md +5 -5
- package/docs/de/chrome_extension.md +130 -0
- package/docs/de/cli/index.md +6 -1
- package/docs/de/cli/infra.md +162 -0
- package/docs/de/cli/init.md +24 -1
- package/docs/de/dictionary/html.md +173 -5
- package/docs/de/dictionary/markdown.md +263 -1
- package/docs/de/intlayer_with_analog.md +23 -1
- package/docs/de/intlayer_with_angular_19.md +24 -1
- package/docs/de/intlayer_with_angular_21.md +24 -1
- package/docs/de/intlayer_with_astro.md +24 -1
- package/docs/de/intlayer_with_astro_lit.md +25 -1
- package/docs/de/intlayer_with_astro_preact.md +26 -1
- package/docs/de/intlayer_with_astro_react.md +26 -1
- package/docs/de/intlayer_with_astro_solid.md +26 -1
- package/docs/de/intlayer_with_astro_svelte.md +25 -1
- package/docs/de/intlayer_with_astro_vue.md +25 -1
- package/docs/de/intlayer_with_remix_3.md +22 -1
- package/docs/de/self_hosting.md +404 -227
- package/docs/en/benchmark/nextjs.md +13 -13
- package/docs/en/benchmark/solid.md +5 -5
- package/docs/en/benchmark/svelte.md +4 -4
- package/docs/en/benchmark/tanstack.md +14 -13
- package/docs/en/benchmark/vue.md +5 -5
- package/docs/en/chrome_extension.md +130 -0
- package/docs/en/cli/index.md +6 -1
- package/docs/en/cli/infra.md +175 -0
- package/docs/en/cli/init.md +25 -1
- package/docs/en/dictionary/html.md +173 -5
- package/docs/en/dictionary/markdown.md +263 -1
- package/docs/en/intlayer_with_analog.md +23 -1
- package/docs/en/intlayer_with_angular_19.md +24 -1
- package/docs/en/intlayer_with_angular_21.md +24 -1
- package/docs/en/intlayer_with_astro.md +24 -1
- package/docs/en/intlayer_with_astro_lit.md +25 -1
- package/docs/en/intlayer_with_astro_preact.md +26 -1
- package/docs/en/intlayer_with_astro_react.md +26 -1
- package/docs/en/intlayer_with_astro_solid.md +26 -1
- package/docs/en/intlayer_with_astro_svelte.md +25 -1
- package/docs/en/intlayer_with_astro_vue.md +25 -1
- package/docs/en/intlayer_with_remix_3.md +22 -1
- package/docs/en/self_hosting.md +418 -176
- package/docs/en-GB/benchmark/nextjs.md +13 -13
- package/docs/en-GB/benchmark/solid.md +5 -5
- package/docs/en-GB/benchmark/svelte.md +4 -4
- package/docs/en-GB/benchmark/tanstack.md +14 -13
- package/docs/en-GB/benchmark/vue.md +5 -5
- package/docs/en-GB/chrome_extension.md +130 -0
- package/docs/en-GB/cli/index.md +6 -1
- package/docs/en-GB/cli/infra.md +162 -0
- package/docs/en-GB/cli/init.md +24 -1
- package/docs/en-GB/dictionary/html.md +173 -5
- package/docs/en-GB/dictionary/markdown.md +263 -1
- package/docs/en-GB/intlayer_with_analog.md +23 -1
- package/docs/en-GB/intlayer_with_angular_19.md +24 -1
- package/docs/en-GB/intlayer_with_angular_21.md +24 -1
- package/docs/en-GB/intlayer_with_astro.md +24 -1
- package/docs/en-GB/intlayer_with_astro_lit.md +25 -1
- package/docs/en-GB/intlayer_with_astro_preact.md +26 -1
- package/docs/en-GB/intlayer_with_astro_react.md +26 -1
- package/docs/en-GB/intlayer_with_astro_solid.md +26 -1
- package/docs/en-GB/intlayer_with_astro_svelte.md +25 -1
- package/docs/en-GB/intlayer_with_astro_vue.md +25 -1
- package/docs/en-GB/intlayer_with_remix_3.md +22 -1
- package/docs/en-GB/self_hosting.md +381 -206
- package/docs/es/benchmark/nextjs.md +13 -13
- package/docs/es/benchmark/solid.md +5 -5
- package/docs/es/benchmark/svelte.md +4 -4
- package/docs/es/benchmark/tanstack.md +14 -13
- package/docs/es/benchmark/vue.md +5 -5
- package/docs/es/chrome_extension.md +130 -0
- package/docs/es/cli/index.md +6 -1
- package/docs/es/cli/infra.md +162 -0
- package/docs/es/cli/init.md +24 -1
- package/docs/es/dictionary/html.md +173 -5
- package/docs/es/dictionary/markdown.md +263 -1
- package/docs/es/intlayer_with_analog.md +23 -1
- package/docs/es/intlayer_with_angular_19.md +24 -1
- package/docs/es/intlayer_with_angular_21.md +24 -1
- package/docs/es/intlayer_with_astro.md +24 -1
- package/docs/es/intlayer_with_astro_lit.md +25 -1
- package/docs/es/intlayer_with_astro_preact.md +26 -1
- package/docs/es/intlayer_with_astro_react.md +26 -1
- package/docs/es/intlayer_with_astro_solid.md +26 -1
- package/docs/es/intlayer_with_astro_svelte.md +25 -1
- package/docs/es/intlayer_with_astro_vue.md +25 -1
- package/docs/es/intlayer_with_remix_3.md +22 -1
- package/docs/es/self_hosting.md +400 -223
- package/docs/fr/benchmark/nextjs.md +13 -13
- package/docs/fr/benchmark/solid.md +5 -5
- package/docs/fr/benchmark/svelte.md +4 -4
- package/docs/fr/benchmark/tanstack.md +14 -13
- package/docs/fr/benchmark/vue.md +5 -5
- package/docs/fr/chrome_extension.md +130 -0
- package/docs/fr/cli/index.md +6 -1
- package/docs/fr/cli/infra.md +162 -0
- package/docs/fr/cli/init.md +24 -1
- package/docs/fr/dictionary/html.md +173 -5
- package/docs/fr/dictionary/markdown.md +265 -4
- package/docs/fr/intlayer_with_analog.md +23 -1
- package/docs/fr/intlayer_with_angular_19.md +24 -1
- package/docs/fr/intlayer_with_angular_21.md +24 -1
- package/docs/fr/intlayer_with_astro.md +24 -1
- package/docs/fr/intlayer_with_astro_lit.md +25 -1
- package/docs/fr/intlayer_with_astro_preact.md +26 -1
- package/docs/fr/intlayer_with_astro_react.md +26 -1
- package/docs/fr/intlayer_with_astro_solid.md +26 -1
- package/docs/fr/intlayer_with_astro_svelte.md +25 -1
- package/docs/fr/intlayer_with_astro_vue.md +25 -1
- package/docs/fr/intlayer_with_remix_3.md +22 -1
- package/docs/fr/self_hosting.md +401 -224
- package/docs/hi/benchmark/nextjs.md +13 -13
- package/docs/hi/benchmark/solid.md +5 -5
- package/docs/hi/benchmark/svelte.md +4 -4
- package/docs/hi/benchmark/tanstack.md +14 -13
- package/docs/hi/benchmark/vue.md +5 -5
- package/docs/hi/chrome_extension.md +130 -0
- package/docs/hi/cli/index.md +6 -1
- package/docs/hi/cli/infra.md +162 -0
- package/docs/hi/cli/init.md +24 -1
- package/docs/hi/dictionary/html.md +173 -5
- package/docs/hi/dictionary/markdown.md +263 -1
- package/docs/hi/intlayer_with_analog.md +23 -1
- package/docs/hi/intlayer_with_angular_19.md +24 -1
- package/docs/hi/intlayer_with_angular_21.md +24 -1
- package/docs/hi/intlayer_with_astro.md +24 -1
- package/docs/hi/intlayer_with_astro_lit.md +25 -1
- package/docs/hi/intlayer_with_astro_preact.md +26 -1
- package/docs/hi/intlayer_with_astro_react.md +26 -1
- package/docs/hi/intlayer_with_astro_solid.md +26 -1
- package/docs/hi/intlayer_with_astro_svelte.md +25 -1
- package/docs/hi/intlayer_with_astro_vue.md +25 -1
- package/docs/hi/intlayer_with_remix_3.md +22 -1
- package/docs/hi/self_hosting.md +409 -235
- package/docs/id/benchmark/nextjs.md +13 -13
- package/docs/id/benchmark/solid.md +5 -5
- package/docs/id/benchmark/svelte.md +4 -4
- package/docs/id/benchmark/tanstack.md +14 -13
- package/docs/id/benchmark/vue.md +5 -5
- package/docs/id/chrome_extension.md +130 -0
- package/docs/id/cli/index.md +6 -1
- package/docs/id/cli/infra.md +162 -0
- package/docs/id/cli/init.md +24 -1
- package/docs/id/dictionary/html.md +173 -5
- package/docs/id/dictionary/markdown.md +263 -1
- package/docs/id/intlayer_with_analog.md +23 -1
- package/docs/id/intlayer_with_angular_19.md +24 -1
- package/docs/id/intlayer_with_angular_21.md +24 -1
- package/docs/id/intlayer_with_astro.md +24 -1
- package/docs/id/intlayer_with_astro_lit.md +25 -1
- package/docs/id/intlayer_with_astro_preact.md +26 -1
- package/docs/id/intlayer_with_astro_react.md +26 -1
- package/docs/id/intlayer_with_astro_solid.md +26 -1
- package/docs/id/intlayer_with_astro_svelte.md +25 -1
- package/docs/id/intlayer_with_astro_vue.md +25 -1
- package/docs/id/intlayer_with_remix_3.md +22 -1
- package/docs/id/self_hosting.md +416 -243
- package/docs/it/benchmark/nextjs.md +13 -13
- package/docs/it/benchmark/solid.md +5 -5
- package/docs/it/benchmark/svelte.md +4 -4
- package/docs/it/benchmark/tanstack.md +14 -13
- package/docs/it/benchmark/vue.md +5 -5
- package/docs/it/chrome_extension.md +130 -0
- package/docs/it/cli/index.md +6 -1
- package/docs/it/cli/infra.md +162 -0
- package/docs/it/cli/init.md +24 -1
- package/docs/it/dictionary/html.md +173 -5
- package/docs/it/dictionary/markdown.md +263 -1
- package/docs/it/intlayer_with_analog.md +23 -1
- package/docs/it/intlayer_with_angular_19.md +24 -1
- package/docs/it/intlayer_with_angular_21.md +24 -1
- package/docs/it/intlayer_with_astro.md +24 -1
- package/docs/it/intlayer_with_astro_lit.md +25 -1
- package/docs/it/intlayer_with_astro_preact.md +26 -1
- package/docs/it/intlayer_with_astro_react.md +26 -1
- package/docs/it/intlayer_with_astro_solid.md +26 -1
- package/docs/it/intlayer_with_astro_svelte.md +25 -1
- package/docs/it/intlayer_with_astro_vue.md +25 -1
- package/docs/it/intlayer_with_remix_3.md +22 -1
- package/docs/it/self_hosting.md +412 -237
- package/docs/ja/benchmark/nextjs.md +13 -13
- package/docs/ja/benchmark/solid.md +5 -5
- package/docs/ja/benchmark/svelte.md +4 -4
- package/docs/ja/benchmark/tanstack.md +13 -12
- package/docs/ja/benchmark/vue.md +5 -5
- package/docs/ja/chrome_extension.md +130 -0
- package/docs/ja/cli/index.md +6 -1
- package/docs/ja/cli/infra.md +162 -0
- package/docs/ja/cli/init.md +24 -1
- package/docs/ja/dictionary/html.md +173 -5
- package/docs/ja/dictionary/markdown.md +263 -1
- package/docs/ja/intlayer_with_analog.md +23 -1
- package/docs/ja/intlayer_with_angular_19.md +24 -1
- package/docs/ja/intlayer_with_angular_21.md +24 -1
- package/docs/ja/intlayer_with_astro.md +24 -1
- package/docs/ja/intlayer_with_astro_lit.md +25 -1
- package/docs/ja/intlayer_with_astro_preact.md +26 -1
- package/docs/ja/intlayer_with_astro_react.md +26 -1
- package/docs/ja/intlayer_with_astro_solid.md +26 -1
- package/docs/ja/intlayer_with_astro_svelte.md +25 -1
- package/docs/ja/intlayer_with_astro_vue.md +25 -1
- package/docs/ja/intlayer_with_remix_3.md +22 -1
- package/docs/ja/self_hosting.md +398 -223
- package/docs/ko/benchmark/nextjs.md +13 -13
- package/docs/ko/benchmark/solid.md +5 -5
- package/docs/ko/benchmark/svelte.md +4 -4
- package/docs/ko/benchmark/tanstack.md +14 -13
- package/docs/ko/benchmark/vue.md +5 -5
- package/docs/ko/chrome_extension.md +130 -0
- package/docs/ko/cli/index.md +6 -1
- package/docs/ko/cli/infra.md +162 -0
- package/docs/ko/cli/init.md +24 -1
- package/docs/ko/dictionary/html.md +173 -5
- package/docs/ko/dictionary/markdown.md +263 -1
- package/docs/ko/intlayer_with_analog.md +23 -1
- package/docs/ko/intlayer_with_angular_19.md +24 -1
- package/docs/ko/intlayer_with_angular_21.md +24 -1
- package/docs/ko/intlayer_with_astro.md +24 -1
- package/docs/ko/intlayer_with_astro_lit.md +25 -1
- package/docs/ko/intlayer_with_astro_preact.md +26 -1
- package/docs/ko/intlayer_with_astro_react.md +26 -1
- package/docs/ko/intlayer_with_astro_solid.md +26 -1
- package/docs/ko/intlayer_with_astro_svelte.md +25 -1
- package/docs/ko/intlayer_with_astro_vue.md +25 -1
- package/docs/ko/intlayer_with_remix_3.md +22 -1
- package/docs/ko/self_hosting.md +411 -238
- package/docs/pl/benchmark/nextjs.md +13 -13
- package/docs/pl/benchmark/solid.md +5 -5
- package/docs/pl/benchmark/svelte.md +4 -4
- package/docs/pl/benchmark/tanstack.md +14 -13
- package/docs/pl/benchmark/vue.md +5 -5
- package/docs/pl/chrome_extension.md +130 -0
- package/docs/pl/cli/index.md +6 -1
- package/docs/pl/cli/infra.md +162 -0
- package/docs/pl/cli/init.md +24 -1
- package/docs/pl/dictionary/html.md +173 -5
- package/docs/pl/dictionary/markdown.md +263 -1
- package/docs/pl/intlayer_with_analog.md +23 -1
- package/docs/pl/intlayer_with_angular_19.md +24 -1
- package/docs/pl/intlayer_with_angular_21.md +24 -1
- package/docs/pl/intlayer_with_astro.md +24 -1
- package/docs/pl/intlayer_with_astro_lit.md +25 -1
- package/docs/pl/intlayer_with_astro_preact.md +26 -1
- package/docs/pl/intlayer_with_astro_react.md +26 -1
- package/docs/pl/intlayer_with_astro_solid.md +26 -1
- package/docs/pl/intlayer_with_astro_svelte.md +25 -1
- package/docs/pl/intlayer_with_astro_vue.md +25 -1
- package/docs/pl/intlayer_with_remix_3.md +22 -1
- package/docs/pl/self_hosting.md +408 -233
- package/docs/pt/benchmark/nextjs.md +13 -13
- package/docs/pt/benchmark/solid.md +5 -5
- package/docs/pt/benchmark/svelte.md +4 -4
- package/docs/pt/benchmark/tanstack.md +14 -13
- package/docs/pt/benchmark/vue.md +5 -5
- package/docs/pt/chrome_extension.md +130 -0
- package/docs/pt/cli/index.md +6 -1
- package/docs/pt/cli/infra.md +162 -0
- package/docs/pt/cli/init.md +24 -1
- package/docs/pt/dictionary/html.md +173 -5
- package/docs/pt/dictionary/markdown.md +263 -1
- package/docs/pt/intlayer_with_analog.md +23 -1
- package/docs/pt/intlayer_with_angular_19.md +24 -1
- package/docs/pt/intlayer_with_angular_21.md +24 -1
- package/docs/pt/intlayer_with_astro.md +24 -1
- package/docs/pt/intlayer_with_astro_lit.md +25 -1
- package/docs/pt/intlayer_with_astro_preact.md +26 -1
- package/docs/pt/intlayer_with_astro_react.md +26 -1
- package/docs/pt/intlayer_with_astro_solid.md +26 -1
- package/docs/pt/intlayer_with_astro_svelte.md +25 -1
- package/docs/pt/intlayer_with_astro_vue.md +25 -1
- package/docs/pt/intlayer_with_remix_3.md +22 -1
- package/docs/pt/self_hosting.md +399 -224
- package/docs/ru/benchmark/nextjs.md +13 -13
- package/docs/ru/benchmark/solid.md +5 -5
- package/docs/ru/benchmark/svelte.md +4 -4
- package/docs/ru/benchmark/tanstack.md +14 -13
- package/docs/ru/benchmark/vue.md +5 -5
- package/docs/ru/chrome_extension.md +130 -0
- package/docs/ru/cli/index.md +6 -1
- package/docs/ru/cli/infra.md +162 -0
- package/docs/ru/cli/init.md +24 -1
- package/docs/ru/dictionary/html.md +173 -5
- package/docs/ru/dictionary/markdown.md +263 -1
- package/docs/ru/intlayer_with_analog.md +23 -1
- package/docs/ru/intlayer_with_angular_19.md +24 -1
- package/docs/ru/intlayer_with_angular_21.md +24 -1
- package/docs/ru/intlayer_with_astro.md +24 -1
- package/docs/ru/intlayer_with_astro_lit.md +25 -1
- package/docs/ru/intlayer_with_astro_preact.md +26 -1
- package/docs/ru/intlayer_with_astro_react.md +26 -1
- package/docs/ru/intlayer_with_astro_solid.md +26 -1
- package/docs/ru/intlayer_with_astro_svelte.md +25 -1
- package/docs/ru/intlayer_with_astro_vue.md +25 -1
- package/docs/ru/intlayer_with_remix_3.md +22 -1
- package/docs/ru/self_hosting.md +403 -228
- package/docs/tr/benchmark/nextjs.md +13 -13
- package/docs/tr/benchmark/solid.md +5 -5
- package/docs/tr/benchmark/svelte.md +4 -4
- package/docs/tr/benchmark/tanstack.md +14 -13
- package/docs/tr/benchmark/vue.md +5 -5
- package/docs/tr/chrome_extension.md +130 -0
- package/docs/tr/cli/index.md +6 -1
- package/docs/tr/cli/infra.md +162 -0
- package/docs/tr/cli/init.md +24 -1
- package/docs/tr/dictionary/html.md +173 -5
- package/docs/tr/dictionary/markdown.md +263 -1
- package/docs/tr/intlayer_with_analog.md +23 -1
- package/docs/tr/intlayer_with_angular_19.md +24 -1
- package/docs/tr/intlayer_with_angular_21.md +24 -1
- package/docs/tr/intlayer_with_astro.md +24 -1
- package/docs/tr/intlayer_with_astro_lit.md +25 -1
- package/docs/tr/intlayer_with_astro_preact.md +26 -1
- package/docs/tr/intlayer_with_astro_react.md +26 -1
- package/docs/tr/intlayer_with_astro_solid.md +26 -1
- package/docs/tr/intlayer_with_astro_svelte.md +25 -1
- package/docs/tr/intlayer_with_astro_vue.md +25 -1
- package/docs/tr/intlayer_with_remix_3.md +22 -1
- package/docs/tr/self_hosting.md +410 -234
- package/docs/uk/benchmark/nextjs.md +13 -13
- package/docs/uk/benchmark/solid.md +5 -5
- package/docs/uk/benchmark/svelte.md +4 -4
- package/docs/uk/benchmark/tanstack.md +14 -13
- package/docs/uk/benchmark/vue.md +5 -5
- package/docs/uk/chrome_extension.md +130 -0
- package/docs/uk/cli/index.md +6 -1
- package/docs/uk/cli/infra.md +162 -0
- package/docs/uk/cli/init.md +24 -1
- package/docs/uk/dictionary/html.md +173 -5
- package/docs/uk/dictionary/markdown.md +263 -1
- package/docs/uk/intlayer_with_analog.md +23 -1
- package/docs/uk/intlayer_with_angular_19.md +24 -1
- package/docs/uk/intlayer_with_angular_21.md +24 -1
- package/docs/uk/intlayer_with_astro.md +24 -1
- package/docs/uk/intlayer_with_astro_lit.md +25 -1
- package/docs/uk/intlayer_with_astro_preact.md +26 -1
- package/docs/uk/intlayer_with_astro_react.md +26 -1
- package/docs/uk/intlayer_with_astro_solid.md +26 -1
- package/docs/uk/intlayer_with_astro_svelte.md +25 -1
- package/docs/uk/intlayer_with_astro_vue.md +25 -1
- package/docs/uk/intlayer_with_remix_3.md +22 -1
- package/docs/uk/self_hosting.md +413 -238
- package/docs/vi/benchmark/nextjs.md +13 -13
- package/docs/vi/benchmark/solid.md +5 -5
- package/docs/vi/benchmark/svelte.md +4 -4
- package/docs/vi/benchmark/tanstack.md +14 -13
- package/docs/vi/benchmark/vue.md +5 -5
- package/docs/vi/chrome_extension.md +130 -0
- package/docs/vi/cli/index.md +6 -1
- package/docs/vi/cli/infra.md +162 -0
- package/docs/vi/cli/init.md +24 -1
- package/docs/vi/dictionary/html.md +173 -5
- package/docs/vi/dictionary/markdown.md +263 -1
- package/docs/vi/intlayer_with_analog.md +23 -1
- package/docs/vi/intlayer_with_angular_19.md +24 -1
- package/docs/vi/intlayer_with_angular_21.md +24 -1
- package/docs/vi/intlayer_with_astro.md +24 -1
- package/docs/vi/intlayer_with_astro_lit.md +25 -1
- package/docs/vi/intlayer_with_astro_preact.md +26 -1
- package/docs/vi/intlayer_with_astro_react.md +26 -1
- package/docs/vi/intlayer_with_astro_solid.md +26 -1
- package/docs/vi/intlayer_with_astro_svelte.md +25 -1
- package/docs/vi/intlayer_with_astro_vue.md +25 -1
- package/docs/vi/intlayer_with_remix_3.md +22 -1
- package/docs/vi/self_hosting.md +408 -234
- package/docs/zh/benchmark/nextjs.md +13 -13
- package/docs/zh/benchmark/solid.md +5 -5
- package/docs/zh/benchmark/svelte.md +4 -4
- package/docs/zh/benchmark/tanstack.md +14 -13
- package/docs/zh/benchmark/vue.md +5 -5
- package/docs/zh/chrome_extension.md +130 -0
- package/docs/zh/cli/index.md +6 -1
- package/docs/zh/cli/infra.md +162 -0
- package/docs/zh/cli/init.md +24 -1
- package/docs/zh/dictionary/html.md +172 -5
- package/docs/zh/dictionary/markdown.md +262 -1
- package/docs/zh/intlayer_with_analog.md +23 -1
- package/docs/zh/intlayer_with_angular_19.md +24 -1
- package/docs/zh/intlayer_with_angular_21.md +24 -1
- package/docs/zh/intlayer_with_astro.md +24 -1
- package/docs/zh/intlayer_with_astro_lit.md +25 -1
- package/docs/zh/intlayer_with_astro_preact.md +26 -1
- package/docs/zh/intlayer_with_astro_react.md +26 -1
- package/docs/zh/intlayer_with_astro_solid.md +26 -1
- package/docs/zh/intlayer_with_astro_svelte.md +25 -1
- package/docs/zh/intlayer_with_astro_vue.md +25 -1
- package/docs/zh/intlayer_with_remix_3.md +22 -1
- package/docs/zh/self_hosting.md +410 -237
- package/legal/ar/privacy_notice.md +9 -3
- package/legal/de/privacy_notice.md +9 -3
- package/legal/en/privacy_notice.md +10 -3
- package/legal/en-GB/privacy_notice.md +9 -3
- package/legal/es/privacy_notice.md +9 -3
- package/legal/fr/privacy_notice.md +9 -3
- package/legal/hi/privacy_notice.md +9 -3
- package/legal/id/privacy_notice.md +9 -3
- package/legal/it/privacy_notice.md +9 -3
- package/legal/ja/privacy_notice.md +9 -3
- package/legal/ko/privacy_notice.md +9 -3
- package/legal/pl/privacy_notice.md +9 -3
- package/legal/pt/privacy_notice.md +9 -3
- package/legal/ru/privacy_notice.md +9 -3
- package/legal/tr/privacy_notice.md +9 -3
- package/legal/uk/privacy_notice.md +9 -3
- package/legal/vi/privacy_notice.md +9 -3
- package/legal/zh/privacy_notice.md +9 -3
- package/package.json +1 -1
- package/src/generated/docs.entry.ts +40 -40
- package/docs/ar/roadmap.md +0 -321
- package/docs/de/roadmap.md +0 -322
- package/docs/en/intlayer_with_astro_vanilla.md +0 -713
- package/docs/en/roadmap.md +0 -325
- package/docs/en-GB/roadmap.md +0 -322
- package/docs/es/roadmap.md +0 -322
- package/docs/fr/roadmap.md +0 -322
- package/docs/hi/roadmap.md +0 -322
- package/docs/id/roadmap.md +0 -325
- package/docs/it/roadmap.md +0 -322
- package/docs/ja/roadmap.md +0 -322
- package/docs/ko/roadmap.md +0 -322
- package/docs/pl/roadmap.md +0 -325
- package/docs/pt/roadmap.md +0 -322
- package/docs/ru/roadmap.md +0 -322
- package/docs/tr/roadmap.md +0 -325
- package/docs/uk/roadmap.md +0 -325
- package/docs/vi/roadmap.md +0 -325
- package/docs/zh/roadmap.md +0 -322
|
@@ -0,0 +1,361 @@
|
|
|
1
|
+
---
|
|
2
|
+
createdAt: 2026-09-13
|
|
3
|
+
updatedAt: 2026-09-13
|
|
4
|
+
title: "vue-i18n vs Intlayer: Benchmark 2026"
|
|
5
|
+
description: vue-i18n i Intlayer zmierzone na tej samej aplikacji Vite + Vue 3. Rozmiar biblioteki, JavaScript na stronę, wyciek treści, rozmiar komponentów i reaktywność przełączania locale, z objaśnieniem liczb.
|
|
6
|
+
keywords:
|
|
7
|
+
- vue-i18n
|
|
8
|
+
- Intlayer
|
|
9
|
+
- Internationalization
|
|
10
|
+
- i18n
|
|
11
|
+
- Benchmark
|
|
12
|
+
- Bundle size
|
|
13
|
+
- Blog
|
|
14
|
+
- Vue
|
|
15
|
+
- Nuxt
|
|
16
|
+
- Vite
|
|
17
|
+
- JavaScript
|
|
18
|
+
slugs:
|
|
19
|
+
- blog
|
|
20
|
+
- vue-i18n-vs-intlayer-benchmark
|
|
21
|
+
author: aymericzip
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
# vue-i18n VS Intlayer | Benchmark internacjonalizacji (i18n) dla Vue
|
|
25
|
+
|
|
26
|
+
`vue-i18n` to referencyjna biblioteka i18n dla Vue. Intlayer to alternatywa oparta na kompilatorze, z treścią ograniczoną do komponentu, z integracją z Vue (`vue-intlayer`). Porównaliśmy już ich [funkcje i doświadczenie programisty](https://intlayer.org/blog/vue-i18n-vs-intlayer). Ten artykuł przygląda się temu, ile każda z nich kosztuje po zbudowaniu aplikacji.
|
|
27
|
+
|
|
28
|
+
Dane pochodzą z [Benchmark Bloom](https://github.com/intlayer-org/benchmark-bloom), open-source'owego zestawu, który buduje tę samą aplikację z każdą biblioteką i rejestruje, co przeglądarka faktycznie pobiera i wykonuje.
|
|
29
|
+
|
|
30
|
+
<TOC/>
|
|
31
|
+
|
|
32
|
+
> **tl;dr**: Na tej samej aplikacji Vite + Vue 3 `vue-i18n` dostarcza **134,9 KB** gzipowanego JavaScriptu na stronę wobec **41,3 KB** dla aplikacji bez i18n. Intlayer dostarcza **57,1 KB**. Sam runtime `vue-i18n` waży **24,3 KB gzip** (6x więcej niż 3,9 KB Intlayera), każda strona niesie **90% ciągów z innych stron**, a komponent skompilowany w izolacji wciąga **196 KB**, ponieważ jest związany z globalnym drzewem komunikatów. Adapter `@intlayer/vue-i18n` zachowuje API `vue-i18n` i zmierzył **47,0 KB** na stronę.
|
|
33
|
+
|
|
34
|
+
## W skrócie
|
|
35
|
+
|
|
36
|
+
- **vue-i18n** - Faktyczny standard i18n dla Vue 2 / Vue 3 i rdzeń `@nuxtjs/i18n`. Komunikaty w stylu ICU, bloki `<i18n>` w SFC, dyrektywa `v-t`, formatery `d()` / `n()`, duży ekosystem. Komunikaty są rejestrowane na globalnej instancji w `createI18n()`; leniwe ładowanie per locale to ręczny wzorzec `setLocaleMessage()`, a podział per trasa jest do zbudowania samodzielnie.
|
|
37
|
+
- **Intlayer** - Model treści skoncentrowany na komponentach. Słowniki `.content.ts` leżą obok komponentu, któremu służą, kompilator w czasie budowania (`vite-intlayer`) wykonuje tree-shaking i leniwe ładowanie per komponent i per locale, ścisłe typy TypeScript są generowane z treści, a brakujące tłumaczenia powodują błąd w czasie budowania. Zawiera helpery routera / SEO, Visual Editor / CMS oraz tłumaczenie wspomagane AI.
|
|
38
|
+
|
|
39
|
+
| Biblioteka | Gwiazdki GitHub | Łączna liczba commitów | Ostatni commit | Pierwsza wersja | Wersja NPM | Pobrania NPM |
|
|
40
|
+
| --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- | --------------- | ----------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------- |
|
|
41
|
+
| `aymericzip/intlayer` | [](https://github.com/aymericzip/intlayer/stargazers) | [](https://github.com/aymericzip/intlayer/commits) | [](https://github.com/aymericzip/intlayer/commits) | Kwiecień 2024 | [](https://www.npmjs.com/package/intlayer) | [](https://www.npmjs.com/package/intlayer) |
|
|
42
|
+
| `intlify/vue-i18n` | [](https://github.com/intlify/vue-i18n/stargazers) | [](https://github.com/intlify/vue-i18n/commits) | [](https://github.com/intlify/vue-i18n/commits) | Grudzień 2016 | [](https://www.npmjs.com/package/vue-i18n) | [](https://www.npmjs.com/package/vue-i18n) |
|
|
43
|
+
|
|
44
|
+
> Odznaki aktualizują się automatycznie. Zrzuty będą się zmieniać w czasie.
|
|
45
|
+
|
|
46
|
+
## Porównanie funkcji obok siebie
|
|
47
|
+
|
|
48
|
+
| Funkcja | `vue-intlayer` (Intlayer) | `vue-i18n` |
|
|
49
|
+
| ----------------------------------------------------- | -------------------------------------------------------------- | --------------------------------------------------------------------------------------- |
|
|
50
|
+
| **Tłumaczenia blisko komponentów** | ✅ Tak, `.content.ts` obok każdego komponentu | ✅ Przez bloki SFC `<i18n>` (opcjonalne); globalne katalogi to typowa konfiguracja |
|
|
51
|
+
| **Integracja z TypeScript** | ✅ Ścisłe typy generowane automatycznie z treści | ✅ Dobre typowania; ścisłe bezpieczeństwo kluczy wymaga typowania schematu i dyscypliny |
|
|
52
|
+
| **Wykrywanie brakujących tłumaczeń** | ✅ Błąd TypeScript + błąd/ostrzeżenie w czasie budowania | ⚠️ Fallback w runtime + ostrzeżenie w konsoli |
|
|
53
|
+
| **Bogata treść (komponenty / Markdown)** | ✅ Bezpośrednie wsparcie | ⚠️ Interpolacja komponentów `<i18n-t>`; Markdown przez zewnętrzne wtyczki |
|
|
54
|
+
| **Wsparcie ICU** | ⚠️ W trakcie prac | ✅ Tak |
|
|
55
|
+
| **Formatowanie (daty, liczby, waluty)** | ✅ Formatery oparte na Intl | ✅ `d()` / `n()` z `datetimeFormats` / `numberFormats` |
|
|
56
|
+
| **Zlokalizowany routing** | ✅ Helpery dla Vue Router / Nuxt, `getMultilingualUrls` | ⚠️ Nie w rdzeniu (`@nuxtjs/i18n` lub własna konfiguracja routera) |
|
|
57
|
+
| **Helpery SEO (hreflang, sitemap, robots)** | ✅ Wbudowane helpery | ❌ Nie w rdzeniu |
|
|
58
|
+
| **Tree-shaking (dostarczanie tylko używanej treści)** | ✅ Per komponent, per locale, zautomatyzowane przez kompilator | ⚠️ Ręcznie: podział katalogów, `setLocaleMessage()` per trasa |
|
|
59
|
+
| **Leniwe ładowanie** | ✅ `importMode: 'dynamic'` (jedna linia konfiguracji) | ✅ Ręczny `import()` + `setLocaleMessage()` |
|
|
60
|
+
| **Usuwanie nieużywanej treści** | ✅ Martwe słowniki są odrzucane w czasie budowania | ❌ Nie wbudowane |
|
|
61
|
+
| **Testowanie brakujących tłumaczeń (CLI / CI)** | ✅ `npx intlayer content test` | ⚠️ Zewnętrzne (`vue-i18n-extract`) |
|
|
62
|
+
| **Tłumaczenie wspomagane AI** | ✅ Wbudowane, używa własnych kluczy dostawcy | ❌ Nie |
|
|
63
|
+
| **Visual Editor / CMS** | ✅ Darmowy Visual Editor + opcjonalny CMS | ❌ Nie (zewnętrzne platformy lokalizacyjne) |
|
|
64
|
+
| **Serwer MCP i Agent Skills** | ✅ Tak | ❌ Nie |
|
|
65
|
+
| **Ekosystem / społeczność** | ⚠️ Mniejszy, ale szybko rosnący | ✅ Duży i dojrzały w ekosystemie Vue |
|
|
66
|
+
|
|
67
|
+
## Benchmark
|
|
68
|
+
|
|
69
|
+
### Co zmierzono
|
|
70
|
+
|
|
71
|
+
Zestaw [Benchmark Bloom](https://github.com/intlayer-org/benchmark-bloom) buduje **tę samą aplikację Vite + Vue 3** z każdą biblioteką: **10 stron** (home, about, blog, careers, contact, FAQ, pricing, products, settings, team), **10 locale** (`en`, `fr`, `es`, `de`, `it`, `pt`, `zh`, `ja`, `ko`, `ru`), identyczne komponenty i identyczna treść. Strony są mierzone w `en` i `fr`.
|
|
72
|
+
|
|
73
|
+
Obie biblioteki testowano w konfiguracji **static**, tej, którą dostarcza większość projektów Vue: dla `vue-i18n` JSON każdego locale importowany i przekazany do `createI18n({ messages })`; dla Intlayera domyślny `importMode: 'static'`. W tym trybie Intlayer również pakuje wszystkie locale, ale kompilator nadal ogranicza treść **per komponent**, więc strona niesie tylko słowniki komponentów, które renderuje.
|
|
74
|
+
|
|
75
|
+
Dla każdego builda zestaw rejestruje:
|
|
76
|
+
|
|
77
|
+
- **Lib size**: rozmiar gzip pustego komponentu, który tylko importuje bibliotekę i18n. Stały koszt runtime'u.
|
|
78
|
+
- **Page JS**: gzipowany JavaScript pobierany na stronę, uśredniony po wszystkich stronach i locale.
|
|
79
|
+
- **Locale leak %**: udział przetłumaczonych ciągów znalezionych w pobranym JS, które należą do locale, którego użytkownik **nie** przegląda (fingerprint na `en` i `fr`, więc 50% oznacza „drugie mierzone locale jest w pełni obecne"; przy 10 spakowanych locale rzeczywista strata jest większa).
|
|
80
|
+
- **Page leak %**: udział przetłumaczonych ciągów znalezionych w pobranym JS, które należą do strony, na której użytkownik **nie** jest.
|
|
81
|
+
- **Component avg**: średni rozmiar gzip każdego komponentu skompilowanego w izolacji. Pokazuje, ile runtime'u i18n i katalogu wciąga pojedynczy komponent.
|
|
82
|
+
- **E2E reactivity**: rzeczywisty czas między wybraniem nowego locale a aktualizacją `html[lang]` w DOM (Playwright, 5 iteracji).
|
|
83
|
+
- **Page load**: `PerformanceNavigationTiming.duration`.
|
|
84
|
+
|
|
85
|
+
> Poniższe liczby pochodzą z uruchomienia z dnia **2026-09-12** z `vue-i18n` 11.4.0 i `intlayer` 9.5.0 / 9.5.1. Aplikacja testowa jest celowo mała (kilkadziesiąt ciągów na locale), więc procenty wycieku opisują **wzorzec**: rosną wraz z treścią, podczas gdy koszt runtime'u pozostaje stały.
|
|
86
|
+
|
|
87
|
+
### Wyniki na Vite + Vue 3
|
|
88
|
+
|
|
89
|
+
| Biblioteka | Strategia | Lib size (gz) | Lib size (min) | Page JS śr. (gz) | Locale leak | Page leak | Component śr. (gz) | Reaktywność E2E | Page load |
|
|
90
|
+
| ----------------------------- | --------- | ------------: | -------------: | ---------------: | ----------: | --------: | -----------------: | --------------: | --------: |
|
|
91
|
+
| **base** (bez i18n) | - | 0,0 KB | 0,0 KB | 41,3 KB | 0,0% | - | 1,1 KB | 1,8 ms | 10,8 ms |
|
|
92
|
+
| `vue-i18n` | static | 24,3 KB | 83,2 KB | 134,9 KB | 50,0% | 90,0% | 196,0 KB | 2,8 ms | 13,6 ms |
|
|
93
|
+
| **`vue-intlayer`** | static | **3,9 KB** | **11,1 KB** | **57,1 KB** | 56,8% | **0,0%** | **7,7 KB** | **4,5 ms** | 13,8 ms |
|
|
94
|
+
| `@intlayer/vue-i18n` (compat) | static | 7,9 KB | 23,2 KB | 47,0 KB | 15,0% | 0,0% | 8,4 KB | 1,5 ms | 9,3 ms |
|
|
95
|
+
|
|
96
|
+
> Kolumna page-leak aplikacji bazowej jest pusta: bez biblioteki i18n fingerprinting wyłapuje zakodowane na sztywno ciągi w współdzielonych chunkach i liczba nie ma znaczenia.
|
|
97
|
+
|
|
98
|
+
**Jak to czytać**
|
|
99
|
+
|
|
100
|
+
- **Koszt runtime'u.** `vue-i18n` to jeden z najcięższych runtime'ów w całym benchmarku: **24,3 KB gzip / 83,2 KB po minifikacji** dla pustego komponentu, który tylko go importuje. `vue-intlayer` kosztuje 3,9 KB gzip. Tę różnicę płaci się na każdej stronie niezależnie od tego, ile masz ciągów.
|
|
101
|
+
- **JavaScript na stronę.** Aplikacja bez i18n waży 41,3 KB. `vue-i18n` ponad trzykrotnie ją zwiększa do **134,9 KB**; Intlayer ląduje na **57,1 KB**, +15,8 KB, z czego większość to dziesięć spakowanych locale (zobacz następny punkt).
|
|
102
|
+
- **Wyciek.** Z `createI18n({ messages: { en, fr, ... } })` każda strona dostarcza wszystkie locale i ciągi wszystkich stron: **50% wycieku locale** (na dwóch fingerprintowanych locale) i **90% wycieku stron**. Tryb `static` Intlayera również pakuje wszystkie locale (stąd porównywalna wartość wycieku locale), ale ma **0% wycieku stron**: strona pobiera tylko słowniki komponentów, które renderuje. Przełączenie na `importMode: 'dynamic'` usuwa również wyciek locale; ta konfiguracja nie była częścią tego uruchomienia Vue.
|
|
103
|
+
- **Rozmiar komponentu to miejsce, gdzie widać architekturę.** Komponent wywołujący `useI18n()` kompiluje się średnio do **196 KB**, ponieważ `t()` jest związane z globalną instancją, która przechowuje każdy komunikat każdego locale. Ten sam komponent z `useIntlayer()` kompiluje się do **7,7 KB**: sięga tylko po własny słownik.
|
|
104
|
+
- **Reaktywność** nie jest problemem dla żadnej z nich (2-5 ms). System reaktywności Vue sprawia, że przełączanie locale jest tanie, gdy komunikaty są już w pamięci.
|
|
105
|
+
- **`@intlayer/vue-i18n`**, adapter drop-in, zachowuje API `vue-i18n` i zmierzył **47,0 KB na stronę** oraz **8,4 KB na komponent**, bez zmian w kodzie aplikacji.
|
|
106
|
+
|
|
107
|
+
> Dla porównania, to samo uruchomienie zmierzyło `fluent-vue` na 171,8 KB na stronę, 29,7 KB runtime'u i 217 KB na komponent.
|
|
108
|
+
|
|
109
|
+
## Skąd ta różnica? Globalna instancja vs skompilowane słowniki
|
|
110
|
+
|
|
111
|
+
`vue-i18n` to runtime. `createI18n()` buduje globalną instancję przechowującą drzewo komunikatów per locale; `useI18n()` wiąże z nią każdy komponent; `t("footer.github")` wyszukuje klucz w czasie renderowania. To właśnie umożliwia bloki SFC `<i18n>`, `v-t` i ładowanie komunikatów w runtime, i to również dlatego graf zależności każdego komponentu zawiera całe drzewo:
|
|
112
|
+
|
|
113
|
+
```bash
|
|
114
|
+
.
|
|
115
|
+
├── locales
|
|
116
|
+
│ ├── en.json
|
|
117
|
+
│ ├── fr.json
|
|
118
|
+
│ └── ... # jeden plik per locale, wszystkie strony w środku
|
|
119
|
+
└── src
|
|
120
|
+
├── i18n.ts # createI18n({ messages: { en, fr, ... } })
|
|
121
|
+
├── main.ts
|
|
122
|
+
└── components
|
|
123
|
+
└── Footer.vue # const { t } = useI18n(); t("footer.github")
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
Optymalizacja oznacza, że **ty** dzielisz `en.json` na pliki per trasa, **ty** wywołujesz `setLocaleMessage()` w strażniku routera i **ty** utrzymujesz poprawne mapowanie trasa-plik, gdy komponenty się przemieszczają. Runtime nie może tego zrobić za ciebie, ponieważ nie ma pojęcia, o jakie klucze komponent poprosi.
|
|
127
|
+
|
|
128
|
+
Intlayer przenosi tę wiedzę do builda. Treść jest deklarowana obok komponentu, a `vite-intlayer` ustala, który komponent importuje który słownik:
|
|
129
|
+
|
|
130
|
+
```bash
|
|
131
|
+
.
|
|
132
|
+
├── intlayer.config.ts
|
|
133
|
+
└── src
|
|
134
|
+
├── main.ts # createApp(App).use(intlayer)
|
|
135
|
+
└── components
|
|
136
|
+
└── Footer
|
|
137
|
+
├── Footer.vue # useIntlayer("footer")
|
|
138
|
+
└── Footer.content.ts
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
Kompilator emituje, per słownik i per locale, dokładnie ten JSON, którego potrzebuje dany komponent, i odrzuca słowniki, których nic nie importuje. Ograniczenie per trasa jest konsekwencją ograniczenia per komponent, a nie zadaniem.
|
|
142
|
+
|
|
143
|
+
> Aby odrzucić również nieużywane locale, ustaw `dictionary.importMode: 'dynamic'` w `intlayer.config.ts`. Zobacz [dokumentację optymalizacji bundle'a](https://intlayer.org/doc/concept/bundle-optimization).
|
|
144
|
+
|
|
145
|
+
## Doświadczenie programisty
|
|
146
|
+
|
|
147
|
+
### Konfiguracja
|
|
148
|
+
|
|
149
|
+
**vue-i18n**
|
|
150
|
+
|
|
151
|
+
```ts fileName="src/i18n.ts"
|
|
152
|
+
import { createI18n } from "vue-i18n";
|
|
153
|
+
import en from "../locales/en.json";
|
|
154
|
+
import fr from "../locales/fr.json";
|
|
155
|
+
|
|
156
|
+
export const i18n = createI18n({
|
|
157
|
+
legacy: false,
|
|
158
|
+
locale: "en",
|
|
159
|
+
fallbackLocale: "en",
|
|
160
|
+
messages: { en, fr },
|
|
161
|
+
});
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
```ts fileName="src/main.ts"
|
|
165
|
+
import { createApp } from "vue";
|
|
166
|
+
import App from "./App.vue";
|
|
167
|
+
import router from "./router";
|
|
168
|
+
import { i18n } from "./i18n";
|
|
169
|
+
|
|
170
|
+
createApp(App).use(router).use(i18n).mount("#app");
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
**Intlayer**
|
|
174
|
+
|
|
175
|
+
```ts fileName="intlayer.config.ts"
|
|
176
|
+
import { type IntlayerConfig, Locales } from "intlayer";
|
|
177
|
+
|
|
178
|
+
const config: IntlayerConfig = {
|
|
179
|
+
internationalization: {
|
|
180
|
+
locales: [Locales.ENGLISH, Locales.FRENCH],
|
|
181
|
+
defaultLocale: Locales.ENGLISH,
|
|
182
|
+
},
|
|
183
|
+
};
|
|
184
|
+
|
|
185
|
+
export default config;
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
```ts fileName="vite.config.ts"
|
|
189
|
+
import { defineConfig } from "vite";
|
|
190
|
+
import vue from "@vitejs/plugin-vue";
|
|
191
|
+
import { intlayer } from "vite-intlayer";
|
|
192
|
+
|
|
193
|
+
export default defineConfig({
|
|
194
|
+
plugins: [intlayer(), vue()],
|
|
195
|
+
});
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
```ts fileName="src/main.ts"
|
|
199
|
+
import { createApp } from "vue";
|
|
200
|
+
import { intlayer } from "vue-intlayer";
|
|
201
|
+
import App from "./App.vue";
|
|
202
|
+
import router from "./router";
|
|
203
|
+
|
|
204
|
+
createApp(App).use(intlayer).use(router).mount("#app");
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
### Komponent
|
|
208
|
+
|
|
209
|
+
**vue-i18n**
|
|
210
|
+
|
|
211
|
+
```json fileName="locales/en.json"
|
|
212
|
+
{
|
|
213
|
+
"counter": {
|
|
214
|
+
"label": "Counter",
|
|
215
|
+
"increment": "Increment"
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
```vue fileName="src/components/Counter.vue"
|
|
221
|
+
<script setup lang="ts">
|
|
222
|
+
import { ref } from "vue";
|
|
223
|
+
import { useI18n } from "vue-i18n";
|
|
224
|
+
|
|
225
|
+
const { t, n } = useI18n();
|
|
226
|
+
const count = ref(0);
|
|
227
|
+
</script>
|
|
228
|
+
|
|
229
|
+
<template>
|
|
230
|
+
<div>
|
|
231
|
+
<p>{{ n(count) }}</p>
|
|
232
|
+
<button :aria-label="t('counter.label')" @click="count++">
|
|
233
|
+
{{ t("counter.increment") }}
|
|
234
|
+
</button>
|
|
235
|
+
</div>
|
|
236
|
+
</template>
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
`t('counter.label')` jest stringiem, dopóki sam nie otypujesz schematu komunikatów; literówka renderuje klucz.
|
|
240
|
+
|
|
241
|
+
**Intlayer**
|
|
242
|
+
|
|
243
|
+
```ts fileName="src/components/Counter/Counter.content.ts"
|
|
244
|
+
import { t, type Dictionary } from "intlayer";
|
|
245
|
+
|
|
246
|
+
const counterContent = {
|
|
247
|
+
key: "counter",
|
|
248
|
+
content: {
|
|
249
|
+
label: t({ en: "Counter", fr: "Compteur" }),
|
|
250
|
+
increment: t({ en: "Increment", fr: "Incrémenter" }),
|
|
251
|
+
},
|
|
252
|
+
} satisfies Dictionary;
|
|
253
|
+
|
|
254
|
+
export default counterContent;
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
```vue fileName="src/components/Counter/Counter.vue"
|
|
258
|
+
<script setup lang="ts">
|
|
259
|
+
import { ref } from "vue";
|
|
260
|
+
import { useIntlayer } from "vue-intlayer";
|
|
261
|
+
import { useNumber } from "vue-intlayer/format";
|
|
262
|
+
|
|
263
|
+
const { label, increment } = useIntlayer("counter");
|
|
264
|
+
const number = useNumber();
|
|
265
|
+
const count = ref(0);
|
|
266
|
+
</script>
|
|
267
|
+
|
|
268
|
+
<template>
|
|
269
|
+
<div>
|
|
270
|
+
<p>{{ number.value(count) }}</p>
|
|
271
|
+
<button :aria-label="label" @click="count++">
|
|
272
|
+
{{ increment }}
|
|
273
|
+
</button>
|
|
274
|
+
</div>
|
|
275
|
+
</template>
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
`label` i `increment` są otypowane; literówka to błąd TypeScript, brakująca wartość francuska to błąd builda.
|
|
279
|
+
|
|
280
|
+
### Leniwe ładowanie per locale
|
|
281
|
+
|
|
282
|
+
**vue-i18n**
|
|
283
|
+
|
|
284
|
+
```ts fileName="src/i18n.ts"
|
|
285
|
+
import { nextTick } from "vue";
|
|
286
|
+
import { createI18n } from "vue-i18n";
|
|
287
|
+
|
|
288
|
+
export const i18n = createI18n({
|
|
289
|
+
legacy: false,
|
|
290
|
+
locale: "en",
|
|
291
|
+
fallbackLocale: "en",
|
|
292
|
+
});
|
|
293
|
+
|
|
294
|
+
export const loadLocaleMessages = async (locale: string) => {
|
|
295
|
+
const messages = await import(`../locales/${locale}.json`);
|
|
296
|
+
i18n.global.setLocaleMessage(locale, messages.default);
|
|
297
|
+
await nextTick();
|
|
298
|
+
i18n.global.locale.value = locale;
|
|
299
|
+
};
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
Następnie wywołaj `loadLocaleMessages()` ze strażnika routera i samodzielnie podziel `locales/{locale}.json` per trasa, jeśli chcesz ograniczenia per strona.
|
|
303
|
+
|
|
304
|
+
**Intlayer**
|
|
305
|
+
|
|
306
|
+
```ts fileName="intlayer.config.ts"
|
|
307
|
+
const config: IntlayerConfig = {
|
|
308
|
+
// ...
|
|
309
|
+
dictionary: {
|
|
310
|
+
importMode: "dynamic",
|
|
311
|
+
},
|
|
312
|
+
};
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
## Zachowaj API vue-i18n, uzyskaj wynik Intlayera
|
|
316
|
+
|
|
317
|
+
`@intlayer/vue-i18n` to adapter drop-in: `useI18n()`, `t()`, `d()`, `n()`, interpolacja `{name}` i `{0}`, liczba mnoga z pipe (`"car | cars"`), `v-t` i `i18n.global.locale` nadal działają, serwowane ze słowników Intlayera skompilowanych przez `vite-intlayer`.
|
|
318
|
+
|
|
319
|
+
```ts fileName="vite.config.ts"
|
|
320
|
+
import { defineConfig } from "vite";
|
|
321
|
+
import vue from "@vitejs/plugin-vue";
|
|
322
|
+
import vueI18nVitePlugin from "@intlayer/vue-i18n/plugin";
|
|
323
|
+
|
|
324
|
+
export default defineConfig({
|
|
325
|
+
plugins: [vue(), vueI18nVitePlugin()],
|
|
326
|
+
});
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
W benchmarku build compat tej samej aplikacji zszedł ze **134,9 KB do 47,0 KB** na stronę i ze **196 KB do 8,4 KB** na komponent, bez zmian w komponentach. Twoje istniejące `locales/{locale}.json` mogą pozostać źródłem prawdy dzięki wtyczce synchronizacji JSON.
|
|
330
|
+
|
|
331
|
+
Zobacz [przewodnik migracji z vue-i18n](https://intlayer.org/doc/migration/vue-i18n) i [dokumentację kompatybilności](https://intlayer.org/doc/compatibility/vue-i18n). Użytkownicy Nuxt mają tę samą ścieżkę przez [kompatybilność `@nuxtjs/i18n`](https://intlayer.org/doc/compatibility/nuxtjs-i18n).
|
|
332
|
+
|
|
333
|
+
## Kiedy wybrać które?
|
|
334
|
+
|
|
335
|
+
- **Wybierz vue-i18n**, jeśli chcesz standardowego podejścia Vue, polegasz na komunikatach ICU lub blokach SFC `<i18n>`, używasz już `@nuxtjs/i18n` lub platforma tłumaczeniowa oczekuje scentralizowanego JSON-a. Zarezerwuj czas na podział katalogów i leniwe ładowanie per trasa, jeśli rozmiar bundle'a ma znaczenie.
|
|
336
|
+
- **Wybierz Intlayer**, jeśli chcesz **treści ograniczonej do komponentu**, **ścisłego TypeScriptu**, **błędów brakujących kluczy w czasie budowania**, **bezwysiłkowego tree-shakingu i leniwego ładowania** oraz wbudowanych narzędzi redakcyjnych (Visual Editor, CMS, tłumaczenie AI, serwer MCP). Szczególnie istotne dla dużych, modularnych baz kodu Vue / Nuxt i design systemów.
|
|
337
|
+
- **Wybierz `@intlayer/vue-i18n`**, jeśli jesteś już na `vue-i18n` i chcesz zysków w rozmiarze bundle'a bez przepisywania.
|
|
338
|
+
|
|
339
|
+
## Powiązane porównania
|
|
340
|
+
|
|
341
|
+
- [next-intl vs Intlayer](https://intlayer.org/blog/next-intl-vs-intlayer) (ten sam benchmark)
|
|
342
|
+
- [i18next vs Intlayer](https://intlayer.org/blog/i18next-vs-intlayer) (ten sam benchmark)
|
|
343
|
+
- [Lingui vs Intlayer](https://intlayer.org/blog/lingui-vs-intlayer) (ten sam benchmark)
|
|
344
|
+
- [vue-i18n vs Intlayer (funkcje i DX)](https://intlayer.org/blog/vue-i18n-vs-intlayer)
|
|
345
|
+
- [Czy vue-i18n jest przestarzały?](https://intlayer.org/blog/is-vue-i18n-outdated)
|
|
346
|
+
|
|
347
|
+
## Gwiazdki GitHub
|
|
348
|
+
|
|
349
|
+
Gwiazdki GitHub są silnym wskaźnikiem popularności projektu, zaufania społeczności i długoterminowej istotności. Choć nie są bezpośrednią miarą jakości technicznej, odzwierciedlają, ilu programistów uważa projekt za użyteczny, śledzi jego postępy i prawdopodobnie go zaadoptuje.
|
|
350
|
+
|
|
351
|
+
[](https://star-history.com/#intlify/vue-i18n&aymericzip/intlayer)
|
|
352
|
+
|
|
353
|
+
## Podsumowanie
|
|
354
|
+
|
|
355
|
+
`vue-i18n` jest dojrzały, elastyczny i głęboko zintegrowany z Vue. Benchmark pokazuje, ile kosztuje jego projekt runtime-first w buildzie Vite: **runtime 24 KB gzip**, **134,9 KB na stronę** dla aplikacji, która bez i18n waży 41 KB, **90% treści z innych stron** na każdej stronie oraz komponenty, z których każdy sięga **196 KB**, ponieważ wiszą na globalnym drzewie komunikatów.
|
|
356
|
+
|
|
357
|
+
Intlayer przenosi pracę do kompilatora. Słowniki per komponent i usuwanie martwej treści to wyniki builda, a nie konwencje. Na tej samej aplikacji: **runtime 3,9 KB**, **57,1 KB na stronę**, **0% wycieku stron**, komponenty **25x mniejsze**. A jeśli przepisanie nie wchodzi w grę, `@intlayer/vue-i18n` pokonuje większość tej drogi bez zmian w komponentach.
|
|
358
|
+
|
|
359
|
+
Wszystkie surowe dane, aplikacje testowe i skrypty są w [repozytorium Benchmark Bloom](https://github.com/intlayer-org/benchmark-bloom). Uruchom je sam.
|
|
360
|
+
|
|
361
|
+
Więcej szczegółów znajdziesz w [dokumencie „Dlaczego Intlayer?"](https://intlayer.org/doc/why).
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
createdAt: 2026-09-13
|
|
3
|
-
updatedAt: 2026-09-
|
|
3
|
+
updatedAt: 2026-09-22
|
|
4
4
|
title: "i18next vs @intlayer/i18next: Mesma API, Outro Bundle"
|
|
5
5
|
description: O que muda quando uma aplicação React ou Next.js mantém suas chamadas de i18next, react-i18next e next-i18next mas as executa através dos adaptadores @intlayer/i18next. JavaScript por página, tamanho de componentes, vazamento de conteúdo e hidratação medidos no mesmo código, além do que os adaptadores mantêm, ignoram e não substituem.
|
|
6
6
|
keywords:
|
|
@@ -28,6 +28,8 @@ author: aymericzip
|
|
|
28
28
|
|
|
29
29
|
# i18next VS @intlayer/i18next | Mesma API, Outro Bundle
|
|
30
30
|
|
|
31
|
+

|
|
32
|
+
|
|
31
33
|
`@intlayer/i18next`, `@intlayer/react-i18next` e `@intlayer/next-i18next` são adaptadores de compatibilidade. Eles expõem a API do `i18next` que seu código já utiliza (`useTranslation`, `t()`, `<Trans>`, `i18n.changeLanguage()`, `getFixedT`, `serverSideTranslations`...) e a fornecem a partir de dicionários compilados pelo Intlayer. Os componentes não mudam. O runtime abaixo deles sim.
|
|
32
34
|
|
|
33
35
|
Este artigo analisa essa substituição na mesma aplicação Next.js, construída uma vez com `next-i18next` e outra com `@intlayer/next-i18next`. Os dados são do [Benchmark Bloom](https://github.com/intlayer-org/benchmark-bloom). Para comparar `i18next` e Intlayer como bibliotecas completas, leia [i18next vs Intlayer](https://intlayer.org/pt/blog/i18next-vs-intlayer). Este artigo se concentra no que o adaptador transforma quando você preserva seu código como está.
|
|
@@ -109,6 +111,10 @@ Para cada compilação, registram-se:
|
|
|
109
111
|
|
|
110
112
|
### Resultados no Next.js
|
|
111
113
|
|
|
114
|
+
Escolha as métricas e as bibliotecas que importam para você:
|
|
115
|
+
|
|
116
|
+
<I18nBenchmark framework="nextjs" vertical/>
|
|
117
|
+
|
|
112
118
|
| Setup | Estratégia | Tamanho lib (gz) | Média JS pág (gz) | Vazamento locale | Vazamento pág | Média comp (gz) | Reatividade E2E | Hidratação |
|
|
113
119
|
| ---------------------------- | -------------- | ---------------: | ----------------: | ---------------: | ------------: | --------------: | --------------: | ----------: |
|
|
114
120
|
| **base** (sem i18n) | - | 0.0 KB | 141.0 KB | 0.0% | 0.0% | 0.9 KB | 13.4 ms | 11.8 ms |
|
|
@@ -129,10 +135,21 @@ Para cada compilação, registram-se:
|
|
|
129
135
|
- **Hidratação e alternância de idioma aceleradas.** A hidratação cai de 15.6 ms para **11.3 ms** (e de 27.7 ms no modo `dynamic`, no qual o carregamento do backend reside no caminho crítico). A troca de idioma cai de 15-16 ms para **11-12 ms**.
|
|
130
136
|
- **O adaptador é diferente do runtime nativo.** O `next-intlayer` crava **141.3 KB**, meros +0.3 KB acima do app sem i18n. O adaptador suporta as particularidades da API do `i18next` (expressões de interpolação, sufixos de plural e contexto, tags `<Trans>`) sobre o núcleo do Intlayer: 9.4 KB e +9.4 KB por página em relação ao nativo. Atua como transição, não como destino final.
|
|
131
137
|
|
|
138
|
+
<ClickToOpenIframe
|
|
139
|
+
src="https://intlayer.org/markdown?url=https%3A%2F%2Fraw.githubusercontent.com%2Fintlayer-org%2Fbenchmark-i18n%2Fmain%2Freport%2Fscripts%2Fsummarize-nextjs.md"
|
|
140
|
+
width="100%"
|
|
141
|
+
height="600px"
|
|
142
|
+
style="border:none;"
|
|
143
|
+
/>
|
|
144
|
+
|
|
145
|
+
> Tabela completa, cada biblioteca e cada estratégia, no [relatório de benchmark do Next.js](https://intlayer.org/pt/doc/benchmark/nextjs).
|
|
146
|
+
|
|
132
147
|
> O adaptador `react-i18next` no Vite / TanStack Start não constou desta rodada de testes. A medição para `react-i18next` no TanStack Start pode ser verificada em [i18next vs Intlayer](https://intlayer.org/pt/blog/i18next-vs-intlayer): 127-184 KB por página e 123-185 ms na troca de idioma com backend sob demanda.
|
|
133
148
|
|
|
134
149
|
## O motivo da mudança nos indicadores
|
|
135
150
|
|
|
151
|
+

|
|
152
|
+
|
|
136
153
|
Nenhum arquivo em `components/` foi alterado, logo o ganho advém da entidade à qual `useTranslation` se acopla.
|
|
137
154
|
|
|
138
155
|
**Com o `i18next`**, a ligação é feita na instância global. Qualquer recurso alocado nela (todos os idiomas em `static`, o namespace completo do idioma ativo em `dynamic`) torna-se acessível para qualquer componente chamador de `useTranslation()`. O bundler não consegue fragmentar abaixo do volume contido na instância, e o runtime não é capaz de prever quais chaves serão demandadas em renderização.
|
|
@@ -149,6 +166,10 @@ Nenhum arquivo em `components/` foi alterado, logo o ganho advém da entidade à
|
|
|
149
166
|
└── About.tsx # useTranslation(); t("about.title")
|
|
150
167
|
```
|
|
151
168
|
|
|
169
|
+
Tudo o que a instância contém é enviado para todas as páginas, e o desperdício cresce em dois eixos, páginas e idiomas:
|
|
170
|
+
|
|
171
|
+

|
|
172
|
+
|
|
152
173
|
**Com o `@intlayer/next-i18next`**, a ligação é feita diretamente com o dicionário. O plugin `syncJSON` transforma cada arquivo de namespace em um dicionário; o ciclo de otimização repassa ao componente apenas o dicionário declarado, na forma de import que o empacotador rastreia e separa por página e locale.
|
|
153
174
|
|
|
154
175
|
```bash
|
|
@@ -297,26 +318,112 @@ O `reactI18nextVitePlugin()` encapsula o `vite-intlayer` e define os aliases par
|
|
|
297
318
|
|
|
298
319
|
## Limitações importantes antes de iniciar
|
|
299
320
|
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
321
|
+
<AccordionGroup>
|
|
322
|
+
<Accordion header="Backends e detectores são inertes">
|
|
323
|
+
|
|
324
|
+
`i18n.use(HttpBackend)` chama o init do plugin e nada mais. Se o seu aplicativo dependia de buscar traduções de um CMS em tempo de execução, esse fluxo desaparece; use o [CMS do Intlayer](https://intlayer.org/pt/doc/concept/cms) ou os comandos `intlayer pull` / `push`. A detecção de idioma passa a ser a configuração de roteamento do Intlayer (prefixo de URL, cookie, cabeçalho).
|
|
325
|
+
|
|
326
|
+
</Accordion>
|
|
327
|
+
<Accordion header="resources é ignorado, não mesclado">
|
|
328
|
+
|
|
329
|
+
Ao contrário de outros adaptadores, o `@intlayer/i18next` não usa `resources` em linha como fallback. Cada chave deve existir nos dicionários sincronizados, o que o `intlayer test` verifica.
|
|
330
|
+
|
|
331
|
+
</Accordion>
|
|
332
|
+
<Accordion header="O App Router requer edição do provider">
|
|
333
|
+
|
|
334
|
+
Apenas um arquivo, mostrado acima. O Pages Router com `appWithTranslation` não requer nada.
|
|
335
|
+
|
|
336
|
+
</Accordion>
|
|
337
|
+
<Accordion header="next-i18next.config.js não é lido">
|
|
338
|
+
|
|
339
|
+
`localePath`, `fallbackLng`, `reloadOnPrerender` e semelhantes não têm equivalente; idiomas e fallback vêm de `intlayer.config.ts`.
|
|
340
|
+
|
|
341
|
+
</Accordion>
|
|
342
|
+
<Accordion header="O adaptador não é gratuito">
|
|
343
|
+
|
|
344
|
+
9.4 KB de runtime e +9.4 KB por página em relação ao `next-intlayer`. Assim que cada componente migrar para o `useIntlayer`, remova-o.
|
|
345
|
+
|
|
346
|
+
</Accordion>
|
|
347
|
+
</AccordionGroup>
|
|
305
348
|
|
|
306
349
|
## Quando utilizar cada alternativa?
|
|
307
350
|
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
351
|
+
<AccordionGroup>
|
|
352
|
+
<Accordion header="Permanecer no i18next">
|
|
353
|
+
|
|
354
|
+
Seu aplicativo depende de backends em tempo de execução (traduções servidas por um CMS no momento da requisição), do ecossistema de plugins ou de um destino não-React não coberto pelos adaptadores.
|
|
355
|
+
|
|
356
|
+
</Accordion>
|
|
357
|
+
<Accordion header="Usar @intlayer/*">
|
|
358
|
+
|
|
359
|
+
Você está no `react-i18next` / `next-i18next` e quer os 68 KB economizados, componentes 8 vezes menores, 0% de vazamento, chaves tipadas e verificações no CI sem reescrever o código. Este é o ponto de entrada para uma base de código `i18next` existente.
|
|
360
|
+
|
|
361
|
+
</Accordion>
|
|
362
|
+
<Accordion header="Tornar-se nativo (next-intlayer / react-intlayer)">
|
|
363
|
+
|
|
364
|
+
Para novos projetos, ou assim que o adaptador cumprir seu papel. Possui o runtime mais leve (5.5 KB, +0.3 KB por página) e desbloqueia Server Components síncronos e arquivos `.content.ts` por componente. Comece com [Intlayer com Next.js](https://intlayer.org/pt/doc/environment/nextjs) ou [com Vite e React](https://intlayer.org/pt/doc/environment/vite-and-react).
|
|
365
|
+
|
|
366
|
+
</Accordion>
|
|
367
|
+
</AccordionGroup>
|
|
368
|
+
|
|
369
|
+
## FAQ
|
|
370
|
+
|
|
371
|
+
<FAQ>
|
|
372
|
+
|
|
373
|
+
<Question title="De onde vêm os 68 KB?">
|
|
374
|
+
|
|
375
|
+
De `resources: { en, fr, ... }`. A configuração padrão do `next-i18next` importa o JSON de cada idioma no `init()`, portanto, cada página carrega cada namespace em cada idioma: **218.5 KB** por página. O adaptador nunca empacota esse bloco; ele entrega a cada componente apenas o dicionário nomeado, no idioma ativo.
|
|
376
|
+
|
|
377
|
+
</Question>
|
|
378
|
+
|
|
379
|
+
<Question title="Meus componentes <Trans> continuam funcionando?">
|
|
380
|
+
|
|
381
|
+
Sim, com `components`, tags numeradas `<1>...</1>` e `values`. O mesmo vale para `{{interpolation}}`, aninhamento `$t(key)`, plurais `key_one` / `key_other` (avaliados com `Intl.PluralRules`), sufixos de contexto e `returnObjects`.
|
|
382
|
+
|
|
383
|
+
</Question>
|
|
384
|
+
|
|
385
|
+
<Question title="E se eu usar um único translation.json por idioma?">
|
|
386
|
+
|
|
387
|
+
Defina `splitKeys: false` no plugin `syncJSON`. Todo o arquivo permanece como um único dicionário e um `useTranslation()` simples continuará resolvendo contra ele.
|
|
388
|
+
|
|
389
|
+
</Question>
|
|
390
|
+
|
|
391
|
+
<Question title="Isso é o mesmo que migrar para o Intlayer?">
|
|
392
|
+
|
|
393
|
+
Não, é a ponte. O adaptador mantém a API do `i18next` e custa 9.4 KB de runtime; o `next-intlayer` nativo custa 5.5 KB e adiciona Server Components síncronos e arquivos `.content.ts` co-localizados. Você pode migrar componente por componente, já que os dicionários JSON e `.content.ts` coexistem.
|
|
394
|
+
|
|
395
|
+
</Question>
|
|
396
|
+
|
|
397
|
+
<Question title="Os tradutores podem continuar trabalhando como fazem hoje?">
|
|
398
|
+
|
|
399
|
+
Sim. `locales/{lng}/{ns}.json` permanece a fonte da verdade: o `syncJSON` o lê com o dialeto do i18next e grava as traduções de volta quando a CLI ou o CMS os atualiza.
|
|
400
|
+
|
|
401
|
+
</Question>
|
|
402
|
+
|
|
403
|
+
</FAQ>
|
|
311
404
|
|
|
312
405
|
## Comparações relacionadas
|
|
313
406
|
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
- [
|
|
317
|
-
- [
|
|
318
|
-
-
|
|
319
|
-
|
|
407
|
+
Mesma série de adaptadores:
|
|
408
|
+
|
|
409
|
+
- [next-intl vs @intlayer/next-intl](https://intlayer.org/pt/blog/next-intl-vs-intlayer-next-intl)
|
|
410
|
+
- [Lingui vs @intlayer/lingui](https://intlayer.org/pt/blog/lingui-vs-intlayer-lingui)
|
|
411
|
+
- [vue-i18n vs @intlayer/vue-i18n](https://intlayer.org/pt/blog/vue-i18n-vs-intlayer-vue-i18n)
|
|
412
|
+
|
|
413
|
+
Bibliotecas comparadas diretamente:
|
|
414
|
+
|
|
415
|
+
- [i18next vs Intlayer](https://intlayer.org/pt/blog/i18next-vs-intlayer), same benchmark
|
|
416
|
+
- [next-i18next vs next-intl vs Intlayer](https://intlayer.org/pt/blog/next-i18next-vs-next-intl-vs-intlayer)
|
|
417
|
+
- [react-i18next vs react-intl vs Intlayer](https://intlayer.org/pt/blog/react-i18next-vs-react-intl-vs-intlayer)
|
|
418
|
+
- [Is i18next outdated?](https://intlayer.org/pt/blog/is-i18next-outdated)
|
|
419
|
+
|
|
420
|
+
Documentação de referência:
|
|
421
|
+
|
|
422
|
+
- Compat adapters: [i18next](https://intlayer.org/pt/doc/compatibility/i18next), [react-i18next](https://intlayer.org/pt/doc/compatibility/react-i18next), [next-i18next](https://intlayer.org/pt/doc/compatibility/next-i18next)
|
|
423
|
+
- Migration guides: [i18next](https://intlayer.org/pt/doc/migration/i18next), [react-i18next](https://intlayer.org/pt/doc/migration/react-i18next), [next-i18next](https://intlayer.org/pt/doc/migration/next-i18next)
|
|
424
|
+
- [Next.js benchmark report](https://intlayer.org/pt/doc/benchmark/nextjs) and [TanStack Start benchmark report](https://intlayer.org/pt/doc/benchmark/tanstack)
|
|
425
|
+
- [Bundle optimization](https://intlayer.org/pt/doc/concept/bundle-optimization) and [the Intlayer compiler](https://intlayer.org/pt/doc/compiler)
|
|
426
|
+
- [Visual Editor](https://intlayer.org/pt/doc/concept/editor), [CMS](https://intlayer.org/pt/doc/concept/cms) and [AI translation](https://intlayer.org/pt/doc/concept/auto-fill)
|
|
320
427
|
|
|
321
428
|
## Conclusão
|
|
322
429
|
|