@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
|
@@ -23,17 +23,339 @@ author: aymericzip
|
|
|
23
23
|
|
|
24
24
|
# vue-i18n VS Intlayer | Benchmark d'internationalisation Vue (i18n)
|
|
25
25
|
|
|
26
|
-
`vue-i18n` est la
|
|
26
|
+
`vue-i18n` est la librairie i18n de référence pour Vue. Intlayer est une alternative basée sur un compilateur, à contenu scopé par composant, avec une intégration Vue (`vue-intlayer`). Nous avons déjà comparé leurs [fonctionnalités et leur expérience développeur](https://intlayer.org/blog/vue-i18n-vs-intlayer). Cet article regarde ce que chacune coûte une fois l'application construite.
|
|
27
27
|
|
|
28
|
-
Les données
|
|
28
|
+
Les données viennent de [Benchmark Bloom](https://github.com/intlayer-org/benchmark-bloom), une suite open-source qui construit la même application avec chaque librairie et enregistre ce que le navigateur télécharge et exécute réellement.
|
|
29
29
|
|
|
30
30
|
<TOC/>
|
|
31
31
|
|
|
32
|
-
> **tl;dr
|
|
32
|
+
> **tl;dr** : Sur la même app Vite + Vue 3, `vue-i18n` livre **134,9 KB** de JavaScript gzippé par page contre **41,3 KB** pour l'app sans i18n. Intlayer livre **57,1 KB**. Le runtime de `vue-i18n` pèse à lui seul **24,3 KB gzip** (6x les 3,9 KB d'Intlayer), chaque page embarque **90 % des chaînes des autres pages**, et un composant compilé isolément entraîne **196 KB** parce qu'il est lié à l'arbre global de messages. L'adaptateur `@intlayer/vue-i18n` conserve l'API de `vue-i18n` et a mesuré **47,0 KB** par page.
|
|
33
33
|
|
|
34
|
-
## En
|
|
34
|
+
## En bref
|
|
35
35
|
|
|
36
|
-
- **vue-i18n** - La
|
|
37
|
-
- **Intlayer** - Modèle de contenu centré sur les composants. Les dictionnaires `.content.ts`
|
|
36
|
+
- **vue-i18n** - La librairie i18n de facto pour Vue 2 / Vue 3 et le cœur de `@nuxtjs/i18n`. Messages de style ICU, blocs `<i18n>` dans les SFC, directive `v-t`, formateurs `d()` / `n()`, large écosystème. Les messages sont enregistrés sur une instance globale au `createI18n()` ; le chargement paresseux par locale est un pattern `setLocaleMessage()` manuel, et le découpage par route est à construire vous-même.
|
|
37
|
+
- **Intlayer** - Modèle de contenu centré sur les composants. Les dictionnaires `.content.ts` sont placés à côté du composant qu'ils servent, un compilateur au build (`vite-intlayer`) les tree-shake et les charge paresseusement par composant et par locale, des types TypeScript stricts sont générés depuis votre contenu, et les traductions manquantes échouent au build. Fournit des helpers routeur / SEO, un Visual Editor / CMS et une traduction assistée par IA.
|
|
38
38
|
|
|
39
|
-
|
|
|
39
|
+
| Librairie | Étoiles GitHub | Commits totaux | Dernier commit | Première version | Version NPM | Téléchargements NPM |
|
|
40
|
+
| --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------- | ----------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------- |
|
|
41
|
+
| `aymericzip/intlayer` | [](https://github.com/aymericzip/intlayer/stargazers) | [](https://github.com/aymericzip/intlayer/commits) | [](https://github.com/aymericzip/intlayer/commits) | Avril 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) | Déc. 2016 | [](https://www.npmjs.com/package/vue-i18n) | [](https://www.npmjs.com/package/vue-i18n) |
|
|
43
|
+
|
|
44
|
+
> Les badges se mettent à jour automatiquement. Les instantanés varieront avec le temps.
|
|
45
|
+
|
|
46
|
+
## Comparaison des fonctionnalités côte à côte
|
|
47
|
+
|
|
48
|
+
| Fonctionnalité | `vue-intlayer` (Intlayer) | `vue-i18n` |
|
|
49
|
+
| --------------------------------------------------- | ----------------------------------------------------------- | --------------------------------------------------------------------------------------- |
|
|
50
|
+
| **Traductions près des composants** | ✅ Oui, `.content.ts` colocalisé avec chaque composant | ✅ Via les blocs SFC `<i18n>` (optionnel) ; les catalogues globaux sont l'usage courant |
|
|
51
|
+
| **Intégration TypeScript** | ✅ Types stricts auto-générés depuis le contenu | ✅ Bons typages ; la sûreté stricte des clés demande un schéma typé et de la discipline |
|
|
52
|
+
| **Détection des traductions manquantes** | ✅ Erreur TypeScript + erreur/avertissement au build | ⚠️ Fallback au runtime + avertissement console |
|
|
53
|
+
| **Contenu riche (composants / Markdown)** | ✅ Support direct | ⚠️ Interpolation de composants `<i18n-t>` ; Markdown via plugins externes |
|
|
54
|
+
| **Support ICU** | ⚠️ En cours | ✅ Oui |
|
|
55
|
+
| **Formatage (dates, nombres, devises)** | ✅ Formateurs basés sur Intl | ✅ `d()` / `n()` avec `datetimeFormats` / `numberFormats` |
|
|
56
|
+
| **Routage localisé** | ✅ Helpers pour Vue Router / Nuxt, `getMultilingualUrls` | ⚠️ Pas dans le cœur (`@nuxtjs/i18n` ou configuration routeur personnalisée) |
|
|
57
|
+
| **Helpers SEO (hreflang, sitemap, robots)** | ✅ Helpers intégrés | ❌ Pas dans le cœur |
|
|
58
|
+
| **Tree-shaking (ne livrer que le contenu utilisé)** | ✅ Par composant, par locale, automatisé par le compilateur | ⚠️ Manuel : découper les catalogues, `setLocaleMessage()` par route |
|
|
59
|
+
| **Chargement paresseux** | ✅ `importMode: 'dynamic'` (une ligne de config) | ✅ `import()` manuel + `setLocaleMessage()` |
|
|
60
|
+
| **Purge du contenu inutilisé** | ✅ Les dictionnaires morts sont retirés au build | ❌ Pas intégré |
|
|
61
|
+
| **Test des traductions manquantes (CLI / CI)** | ✅ `npx intlayer content test` | ⚠️ Tiers (`vue-i18n-extract`) |
|
|
62
|
+
| **Traduction par IA** | ✅ Intégrée, utilise vos propres clés de fournisseur | ❌ Non |
|
|
63
|
+
| **Visual Editor / CMS** | ✅ Visual Editor gratuit + CMS optionnel | ❌ Non (plateformes de localisation externes) |
|
|
64
|
+
| **Serveur MCP & Agent Skills** | ✅ Oui | ❌ Non |
|
|
65
|
+
| **Écosystème / communauté** | ⚠️ Plus petit mais en forte croissance | ✅ Large et mature dans l'écosystème Vue |
|
|
66
|
+
|
|
67
|
+
## Le benchmark
|
|
68
|
+
|
|
69
|
+
### Ce qui a été mesuré
|
|
70
|
+
|
|
71
|
+
La suite [Benchmark Bloom](https://github.com/intlayer-org/benchmark-bloom) construit **la même application Vite + Vue 3** avec chaque librairie : **10 pages** (home, about, blog, careers, contact, FAQ, pricing, products, settings, team), **10 locales** (`en`, `fr`, `es`, `de`, `it`, `pt`, `zh`, `ja`, `ko`, `ru`), composants identiques et contenu identique. Les pages sont mesurées en `en` et `fr`.
|
|
72
|
+
|
|
73
|
+
Les deux librairies ont été testées dans la configuration **static**, celle que la plupart des projets Vue livrent : pour `vue-i18n`, le JSON de chaque locale importé et passé à `createI18n({ messages })` ; pour Intlayer, le `importMode: 'static'` par défaut. Dans ce mode Intlayer embarque aussi toutes les locales, mais le compilateur scope toujours le contenu **par composant**, donc une page n'embarque que les dictionnaires des composants qu'elle rend.
|
|
74
|
+
|
|
75
|
+
Pour chaque build, la suite enregistre :
|
|
76
|
+
|
|
77
|
+
- **Lib size** : taille gzip d'un composant vide qui importe seulement la librairie i18n. Le coût fixe du runtime.
|
|
78
|
+
- **Page JS** : JavaScript gzip téléchargé par page, moyenné sur toutes les pages et locales.
|
|
79
|
+
- **Locale leak %** : part des chaînes traduites trouvées dans le JS téléchargé qui appartiennent à une locale que l'utilisateur **ne** consulte **pas** (empreintes sur `en` et `fr`, donc 50 % signifie « l'autre locale mesurée est entièrement présente » ; avec 10 locales embarquées, le gaspillage réel est plus élevé).
|
|
80
|
+
- **Page leak %** : part des chaînes traduites trouvées dans le JS téléchargé qui appartiennent à une page sur laquelle l'utilisateur **n'est pas**.
|
|
81
|
+
- **Component avg** : taille gzip moyenne de chaque composant compilé isolément. Montre combien de runtime i18n et de catalogue un seul composant entraîne.
|
|
82
|
+
- **E2E reactivity** : temps réel entre la sélection d'une nouvelle locale et la mise à jour de `html[lang]` dans le DOM (Playwright, 5 itérations).
|
|
83
|
+
- **Page load** : `PerformanceNavigationTiming.duration`.
|
|
84
|
+
|
|
85
|
+
> Les chiffres ci-dessous viennent du run daté du **2026-09-12** avec `vue-i18n` 11.4.0 et `intlayer` 9.5.0 / 9.5.1. L'application de test est volontairement petite (quelques dizaines de chaînes par locale), donc les pourcentages de fuite décrivent un **pattern** : ils grandissent avec votre contenu alors que le coût du runtime reste fixe.
|
|
86
|
+
|
|
87
|
+
### Résultats sur Vite + Vue 3
|
|
88
|
+
|
|
89
|
+
| Librairie | Stratégie | Lib size (gz) | Lib size (min) | Page JS moy. (gz) | Locale leak | Page leak | Component moy. (gz) | Réactivité E2E | Page load |
|
|
90
|
+
| ----------------------------- | --------- | ------------: | -------------: | ----------------: | ----------: | --------: | ------------------: | -------------: | --------: |
|
|
91
|
+
| **base** (sans 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
|
+
> La colonne page-leak de l'app de base est laissée vide : sans librairie i18n, l'empreinte capte des chaînes codées en dur dans les chunks partagés et le chiffre n'a pas de sens.
|
|
97
|
+
|
|
98
|
+
**Comment le lire**
|
|
99
|
+
|
|
100
|
+
- **Coût du runtime.** `vue-i18n` est l'un des runtimes les plus lourds de tout le benchmark : **24,3 KB gzip / 83,2 KB minifié** pour un composant vide qui l'importe seulement. `vue-intlayer` coûte 3,9 KB gzip. Cet écart est payé sur chaque page, quel que soit le nombre de chaînes.
|
|
101
|
+
- **JavaScript par page.** L'app sans i18n pèse 41,3 KB. `vue-i18n` fait plus que la tripler à **134,9 KB** ; Intlayer atterrit à **57,1 KB**, +15,8 KB, dont l'essentiel vient des dix locales embarquées (voir le point suivant).
|
|
102
|
+
- **Fuite.** Avec `createI18n({ messages: { en, fr, ... } })`, chaque page livre toutes les locales et les chaînes de toutes les pages : **50 % de fuite de locale** (sur les deux locales mesurées) et **90 % de fuite de page**. Le mode `static` d'Intlayer embarque aussi toutes les locales (d'où un chiffre de fuite de locale comparable) mais a **0 % de fuite de page** : une page ne tire que les dictionnaires des composants qu'elle rend. Passer à `importMode: 'dynamic'` supprime aussi la fuite de locale ; cette configuration ne faisait pas partie de ce run Vue.
|
|
103
|
+
- **La taille des composants est là où l'architecture se voit.** Un composant appelant `useI18n()` compile à **196 KB** en moyenne, parce que `t()` est lié à l'instance globale qui contient tous les messages de toutes les locales. Le même composant avec `useIntlayer()` compile à **7,7 KB** : il n'atteint que son propre dictionnaire.
|
|
104
|
+
- **La réactivité** n'est un problème pour aucun des deux (2-5 ms). Le système de réactivité de Vue rend le changement de locale peu coûteux une fois les messages en mémoire.
|
|
105
|
+
- **`@intlayer/vue-i18n`**, l'adaptateur drop-in, conserve l'API de `vue-i18n` et a mesuré **47,0 KB par page** et **8,4 KB par composant**, sans toucher au code de l'application.
|
|
106
|
+
|
|
107
|
+
> Pour référence, le même run a mesuré `fluent-vue` à 171,8 KB par page, 29,7 KB de runtime et 217 KB par composant.
|
|
108
|
+
|
|
109
|
+
## Pourquoi cet écart ? Instance globale vs dictionnaires compilés
|
|
110
|
+
|
|
111
|
+
`vue-i18n` est un runtime. `createI18n()` construit une instance globale contenant un arbre de messages par locale ; `useI18n()` lie chaque composant à celle-ci ; `t("footer.github")` cherche la clé au moment du rendu. C'est ce qui rend possibles les blocs SFC `<i18n>`, `v-t` et le chargement de messages au runtime, et c'est aussi pourquoi le graphe de dépendances de chaque composant inclut l'arbre entier :
|
|
112
|
+
|
|
113
|
+
```bash
|
|
114
|
+
.
|
|
115
|
+
├── locales
|
|
116
|
+
│ ├── en.json
|
|
117
|
+
│ ├── fr.json
|
|
118
|
+
│ └── ... # un fichier par locale, toutes les pages dedans
|
|
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
|
+
Optimiser signifie que **vous** découpez `en.json` en fichiers par route, que **vous** appelez `setLocaleMessage()` dans un guard du routeur, et que **vous** maintenez la correspondance route → fichier à jour quand les composants bougent. Le runtime ne peut pas le faire pour vous parce qu'il n'a aucune idée des clés qu'un composant va demander.
|
|
127
|
+
|
|
128
|
+
Intlayer déplace cette connaissance vers le build. Le contenu est déclaré à côté du composant, et `vite-intlayer` résout quel composant importe quel dictionnaire :
|
|
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
|
+
Le compilateur émet, par dictionnaire et par locale, exactement le JSON dont ce composant a besoin, et supprime les dictionnaires que rien n'importe. Le scoping par route est une conséquence du scoping par composant, pas une tâche.
|
|
142
|
+
|
|
143
|
+
> Pour retirer aussi les locales inutilisées, mettez `dictionary.importMode: 'dynamic'` dans `intlayer.config.ts`. Voir la [doc d'optimisation du bundle](https://intlayer.org/doc/concept/bundle-optimization).
|
|
144
|
+
|
|
145
|
+
## Expérience développeur
|
|
146
|
+
|
|
147
|
+
### Configuration
|
|
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
|
+
### Composant
|
|
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')` est une chaîne tant que vous ne typez pas vous-même le schéma des messages ; une faute de frappe affiche la clé.
|
|
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` et `increment` sont typés ; une faute de frappe est une erreur TypeScript, une valeur française manquante est une erreur de build.
|
|
279
|
+
|
|
280
|
+
### Chargement paresseux par 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
|
+
Ensuite appelez `loadLocaleMessages()` depuis un guard du routeur, et découpez vous-même `locales/{locale}.json` par route si vous voulez un scoping par page.
|
|
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
|
+
## Gardez l'API de vue-i18n, obtenez la sortie d'Intlayer
|
|
316
|
+
|
|
317
|
+
`@intlayer/vue-i18n` est un adaptateur drop-in : `useI18n()`, `t()`, `d()`, `n()`, l'interpolation `{name}` et `{0}`, les pluriels à pipe (`"car | cars"`), `v-t` et `i18n.global.locale` continuent de fonctionner, servis depuis des dictionnaires Intlayer compilés par `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
|
+
Dans le benchmark, le build compat de la même app est passé de **134,9 KB à 47,0 KB** par page et de **196 KB à 8,4 KB** par composant, sans toucher aux composants. Vos `locales/{locale}.json` existants peuvent rester la source de vérité grâce au plugin de synchronisation JSON.
|
|
330
|
+
|
|
331
|
+
Voir le [guide de migration vue-i18n](https://intlayer.org/doc/migration/vue-i18n) et la [doc de compatibilité](https://intlayer.org/doc/compatibility/vue-i18n). Les utilisateurs de Nuxt ont le même chemin via la [compatibilité `@nuxtjs/i18n`](https://intlayer.org/doc/compatibility/nuxtjs-i18n).
|
|
332
|
+
|
|
333
|
+
## Quand choisir lequel ?
|
|
334
|
+
|
|
335
|
+
- **Choisissez vue-i18n** si vous voulez l'approche Vue standard, si vous dépendez des messages ICU ou des blocs SFC `<i18n>`, si vous utilisez déjà `@nuxtjs/i18n`, ou si une plateforme de traduction attend du JSON centralisé. Prévoyez le temps de découper les catalogues et de charger paresseusement par route si la taille du bundle compte.
|
|
336
|
+
- **Choisissez Intlayer** si vous voulez du **contenu scopé par composant**, du **TypeScript strict**, des **erreurs de clés manquantes au build**, du **tree-shaking et du chargement paresseux sans effort**, et un outillage éditorial intégré (Visual Editor, CMS, traduction IA, serveur MCP). Particulièrement pertinent pour les grandes bases de code Vue / Nuxt modulaires et les design systems.
|
|
337
|
+
- **Choisissez `@intlayer/vue-i18n`** si vous êtes déjà sur `vue-i18n` et voulez les gains de bundle sans réécriture.
|
|
338
|
+
|
|
339
|
+
## Comparaisons associées
|
|
340
|
+
|
|
341
|
+
- [next-intl vs Intlayer](https://intlayer.org/blog/next-intl-vs-intlayer) (même benchmark)
|
|
342
|
+
- [i18next vs Intlayer](https://intlayer.org/blog/i18next-vs-intlayer) (même benchmark)
|
|
343
|
+
- [Lingui vs Intlayer](https://intlayer.org/blog/lingui-vs-intlayer) (même benchmark)
|
|
344
|
+
- [vue-i18n vs Intlayer (fonctionnalités & DX)](https://intlayer.org/blog/vue-i18n-vs-intlayer)
|
|
345
|
+
- [vue-i18n est-il dépassé ?](https://intlayer.org/blog/is-vue-i18n-outdated)
|
|
346
|
+
|
|
347
|
+
## Étoiles GitHub
|
|
348
|
+
|
|
349
|
+
Les étoiles GitHub sont un indicateur fort de la popularité d'un projet, de la confiance de la communauté et de sa pertinence à long terme. Bien qu'elles ne mesurent pas directement la qualité technique, elles reflètent combien de développeurs trouvent le projet utile, suivent ses progrès et sont susceptibles de l'adopter.
|
|
350
|
+
|
|
351
|
+
[](https://star-history.com/#intlify/vue-i18n&aymericzip/intlayer)
|
|
352
|
+
|
|
353
|
+
## Conclusion
|
|
354
|
+
|
|
355
|
+
`vue-i18n` est mature, flexible et profondément intégré à Vue. Le benchmark montre ce que son design centré sur le runtime coûte sur un build Vite : un **runtime de 24 KB gzip**, **134,9 KB par page** pour une app qui pèse 41 KB sans i18n, **90 % de contenu d'autres pages** sur chaque page, et des composants qui atteignent chacun **196 KB** parce qu'ils dépendent de l'arbre global de messages.
|
|
356
|
+
|
|
357
|
+
Intlayer déplace le travail dans le compilateur. Les dictionnaires par composant et la purge du contenu mort sont des sorties du build, pas des conventions. Sur la même app : **3,9 KB de runtime**, **57,1 KB par page**, **0 % de fuite de page**, des composants **25x plus petits**. Et si une réécriture n'est pas envisageable, `@intlayer/vue-i18n` fait l'essentiel du chemin sans toucher aux composants.
|
|
358
|
+
|
|
359
|
+
Toutes les données brutes, les apps de test et les scripts sont dans le [dépôt Benchmark Bloom](https://github.com/intlayer-org/benchmark-bloom). Lancez-le vous-même.
|
|
360
|
+
|
|
361
|
+
Consultez la [doc « Pourquoi Intlayer ? »](https://intlayer.org/doc/why) pour plus de détails.
|
|
@@ -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 बनाम @intlayer/i18next: समान API, पूरी तरह भिन्न बंडल"
|
|
5
5
|
description: "क्या बदलता है जब एक React या Next.js ऐप अपने i18next, react-i18next और next-i18next कॉल्स को बरकरार रखता है लेकिन उन्हें @intlayer/i18next एडेप्टर के माध्यम से प्रस्तुत करता है। समान कोड पर मापा गया प्रति-पेज JavaScript आकार, घटक आकार, सामग्री लीकेज और हाइड्रेशन।"
|
|
6
6
|
keywords:
|
|
@@ -28,6 +28,8 @@ author: aymericzip
|
|
|
28
28
|
|
|
29
29
|
# i18next बनाम @intlayer/i18next | समान API, पूरी तरह भिन्न बंडल
|
|
30
30
|
|
|
31
|
+

|
|
32
|
+
|
|
31
33
|
`@intlayer/i18next`, `@intlayer/react-i18next` और `@intlayer/next-i18next` अनुकूलता (compat) एडेप्टर हैं। वे उसी `i18next` API को प्रदर्शित करते हैं जिसका उपयोग आपका कोड पहले से कर रहा है (`useTranslation`, `t()`, `<Trans>`, `i18n.changeLanguage()`, `getFixedT`, `serverSideTranslations`...) और इसे Intlayer द्वारा संकलित शब्दकोशों से प्रस्तुत करते हैं। घटक नहीं बदलते; केवल उनके नीचे का रनटाइम बदलता है।
|
|
32
34
|
|
|
33
35
|
यह लेख एक ही Next.js एप्लिकेशन पर उस प्रतिस्थापन को मापता है, जिसे एक बार `next-i18next` के साथ और एक बार `@intlayer/next-i18next` के साथ बनाया गया है। आंकड़े [Benchmark Bloom](https://github.com/intlayer-org/benchmark-bloom) से लिए गए हैं। लाइब्रेरी के रूप में `i18next` और Intlayer की तुलना के लिए, [i18next बनाम Intlayer](https://intlayer.org/hi/blog/i18next-vs-intlayer) पढ़ें। यह लेख इस बात पर केंद्रित है कि जब आप अपने कोड को वैसे ही रखते हैं जैसा वह है, तो एडेप्टर क्या बदलता है।
|
|
@@ -109,6 +111,10 @@ const About = () => {
|
|
|
109
111
|
|
|
110
112
|
### Next.js पर परिणाम
|
|
111
113
|
|
|
114
|
+
वे मेट्रिक्स और लाइब्रेरी चुनें जिनकी आपको परवाह है:
|
|
115
|
+
|
|
116
|
+
<I18nBenchmark framework="nextjs" vertical/>
|
|
117
|
+
|
|
112
118
|
| सेटअप | रणनीति | लाइब्रेरी आकार (gz) | पेज JS औसत (gz) | लोकेल लीकेज | पेज लीकेज | घटक औसत (gz) | E2E प्रतिक्रियाशीलता | हाइड्रेशन |
|
|
113
119
|
| ---------------------------- | -------------- | ------------------: | --------------: | ----------: | --------: | -----------: | -------------------: | ----------: |
|
|
114
120
|
| **base** (बिना i18n) | - | 0.0 KB | 141.0 KB | 0.0% | 0.0% | 0.9 KB | 13.4 ms | 11.8 ms |
|
|
@@ -129,10 +135,21 @@ const About = () => {
|
|
|
129
135
|
- **तेज़ हाइड्रेशन और भाषा बदलना।** हाइड्रेशन 15.6 ms से घटकर **11.3 ms** हो जाता है (और `dynamic` सेटअप में 27.7 ms से, जहाँ बैकएंड फ़ेच महत्वपूर्ण पथ पर स्थित होता है)। लोकेल बदलना 15-16 ms से घटकर **11-12 ms** हो जाता है।
|
|
130
136
|
- **एडेप्टर मूल रनटाइम नहीं है।** `next-intlayer` बेस ऐप से केवल +0.3 KB अधिक यानी **141.3 KB** पर पहुंचता है। एडेप्टर Intlayer के कोर के ऊपर `i18next` API सतह (इंटरपोलेशन, बहुवचन और संदर्भ प्रत्यय समाधान, `<Trans>` टैग पार्सिंग) रखता है: 9.4 KB और मूल की तुलना में प्रति पेज +9.4 KB। यह एक पुल है, अंतिम गंतव्य नहीं।
|
|
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
|
+
> पूरी तालिका, प्रत्येक लाइब्रेरी और रणनीति, [Next.js बेंचमार्क रिपोर्ट](https://intlayer.org/hi/doc/benchmark/nextjs) में।
|
|
146
|
+
|
|
132
147
|
> Vite / TanStack Start पर `react-i18next` एडेप्टर इस परीक्षण का हिस्सा नहीं था। TanStack Start पर `react-i18next` बेसलाइन [i18next बनाम Intlayer](https://intlayer.org/hi/blog/i18next-vs-intlayer) में देखी जा सकती है।
|
|
133
148
|
|
|
134
149
|
## संख्याएँ क्यों बदलती हैं
|
|
135
150
|
|
|
151
|
+

|
|
152
|
+
|
|
136
153
|
`components/` में कुछ भी नहीं बदला, इसलिए लाभ इस बात से आता है कि `useTranslation` किससे बंधा है।
|
|
137
154
|
|
|
138
155
|
**`i18next` के साथ**, बाइंडिंग ग्लोबल इंस्टेंस होती है। इसमें जो कुछ भी लोड किया गया था (`static` में सभी लोकेल, `dynamic` में सक्रिय लोकेल का पूरा नेमस्पेस) वह `useTranslation()` को कॉल करने वाले प्रत्येक घटक से सुलभ होता है। बंडलर इंस्टेंस में रखी गई सीमा से नीचे कोड को विभाजित नहीं कर सकता है, और रनटाइम यह नहीं जान सकता कि कोई घटक किन कुंजियों की मांग करेगा।
|
|
@@ -149,6 +166,10 @@ const About = () => {
|
|
|
149
166
|
└── About.tsx # useTranslation(); t("about.title")
|
|
150
167
|
```
|
|
151
168
|
|
|
169
|
+
इंस्टेंस में जो कुछ भी होता है वह हर पेज पर भेजा जाता है, और अपव्यय दो अक्षों, पेज और लोकेल पर बढ़ता है:
|
|
170
|
+
|
|
171
|
+

|
|
172
|
+
|
|
152
173
|
**`@intlayer/next-i18next` के साथ**, बाइंडिंग सीधे शब्दकोश होती है। `syncJSON` प्रत्येक नेमस्पेस फ़ाइल को एक शब्दकोश में बदल देता है; अनुकूलन पास घटक को वह शब्दकोश सौंपता है जिसे वह निर्दिष्ट करता है, एक ऐसे आयात के रूप में जिसे बंडलर ट्रैक कर सकता है और प्रति पेज और प्रति लोकेल विभाजित कर सकता है।
|
|
153
174
|
|
|
154
175
|
```bash
|
|
@@ -297,26 +318,112 @@ export default defineConfig({
|
|
|
297
318
|
|
|
298
319
|
## शुरू करने से पहले जानने योग्य सीमाएँ
|
|
299
320
|
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
321
|
+
<AccordionGroup>
|
|
322
|
+
<Accordion header="बैकएंड और डिटेक्टर निष्क्रिय हैं">
|
|
323
|
+
|
|
324
|
+
`i18n.use(HttpBackend)` केवल प्लगइन के init को कॉल करता है और कुछ नहीं। यदि आपका ऐप रनटाइम पर CMS से अनुवाद लाने पर निर्भर था, तो वह प्रवाह चला गया है; इसके बजाय [Intlayer CMS](https://intlayer.org/hi/doc/concept/cms) या `intlayer pull` / `push` कमांड का उपयोग करें। भाषा पहचान Intlayer का रूटिंग कॉन्फ़िगरेशन बन जाती है (URL उपसर्ग, कुकी, हेडर)।
|
|
325
|
+
|
|
326
|
+
</Accordion>
|
|
327
|
+
<Accordion header="resources को नजरअंदाज किया जाता है, मर्ज नहीं">
|
|
328
|
+
|
|
329
|
+
कुछ अन्य एडाप्टरों के विपरीत, `@intlayer/i18next` इनलाइन `resources` को फ़ॉलबैक के रूप में उपयोग नहीं करता है। प्रत्येक कुंजी सिंक्रनाइज़ किए गए शब्दकोशों में मौजूद होनी चाहिए, जिसे `intlayer test` सत्यापित करता है।
|
|
330
|
+
|
|
331
|
+
</Accordion>
|
|
332
|
+
<Accordion header="App Router को प्रदाता संपादन की आवश्यकता है">
|
|
333
|
+
|
|
334
|
+
केवल एक फ़ाइल, ऊपर दिखाई गई है। `appWithTranslation` के साथ Pages Router को किसी भी बदलाव की आवश्यकता नहीं है।
|
|
335
|
+
|
|
336
|
+
</Accordion>
|
|
337
|
+
<Accordion header="next-i18next.config.js नहीं पढ़ा जाता है">
|
|
338
|
+
|
|
339
|
+
`localePath`, `fallbackLng`, `reloadOnPrerender` और समकक्षों का कोई विकल्प नहीं है; भाषाएँ और फ़ॉलबैक `intlayer.config.ts` से आते हैं।
|
|
340
|
+
|
|
341
|
+
</Accordion>
|
|
342
|
+
<Accordion header="एडाप्टर मुफ़्त नहीं है">
|
|
343
|
+
|
|
344
|
+
`next-intlayer` की तुलना में 9.4 KB का रनटाइम और प्रति पेज +9.4 KB। एक बार जब प्रत्येक घटक `useIntlayer` पर चला जाए, तो इसे हटा दें।
|
|
345
|
+
|
|
346
|
+
</Accordion>
|
|
347
|
+
</AccordionGroup>
|
|
305
348
|
|
|
306
349
|
## कब किसका उपयोग करें?
|
|
307
350
|
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
351
|
+
<AccordionGroup>
|
|
352
|
+
<Accordion header="i18next पर बने रहें">
|
|
353
|
+
|
|
354
|
+
यदि आपका ऐप रनटाइम बैकएंड (अनुरोध के समय CMS द्वारा दिए गए अनुवाद), प्लगइन पारिस्थितिकी तंत्र, या गैर-React लक्ष्य पर निर्भर करता है जिसे एडाप्टर कवर नहीं करते हैं।
|
|
355
|
+
|
|
356
|
+
</Accordion>
|
|
357
|
+
<Accordion header="@intlayer/* का उपयोग करें">
|
|
358
|
+
|
|
359
|
+
आप `react-i18next` / `next-i18next` पर हैं और बिना दोबारा लिखे 68 KB की बचत, 8 गुना छोटे घटक, 0% लीकेज, टाइप की गई कुंजियाँ और CI जांच चाहते हैं। यह मौजूदा `i18next` कोडबेस के लिए प्रवेश बिंदु है।
|
|
360
|
+
|
|
361
|
+
</Accordion>
|
|
362
|
+
<Accordion header="नेटिव बनें (next-intlayer / react-intlayer)">
|
|
363
|
+
|
|
364
|
+
नई परियोजनाओं के लिए, या एक बार जब एडाप्टर अपना काम कर ले। इसमें सबसे हल्का रनटाइम (5.5 KB, प्रति पेज +0.3 KB) है और यह समकालिक Server Components और प्रति-घटक `.content.ts` फ़ाइलों को अनलॉक करता है। [Next.js के साथ Intlayer](https://intlayer.org/hi/doc/environment/nextjs) या [Vite और React के साथ](https://intlayer.org/hi/doc/environment/vite-and-react) से शुरुआत करें।
|
|
365
|
+
|
|
366
|
+
</Accordion>
|
|
367
|
+
</AccordionGroup>
|
|
368
|
+
|
|
369
|
+
## अक्सर पूछे जाने वाले प्रश्न
|
|
370
|
+
|
|
371
|
+
<FAQ>
|
|
372
|
+
|
|
373
|
+
<Question title="68 KB की बचत कहाँ से आती है?">
|
|
374
|
+
|
|
375
|
+
`resources: { en, fr, ... }` से। सामान्य `next-i18next` सेटअप प्रत्येक भाषा के JSON को `init()` में आयात करता है, इसलिए प्रत्येक पृष्ठ हर भाषा में प्रत्येक नेमस्पेस को ले जाता है: प्रति पृष्ठ **218.5 KB**। एडाप्टर उस ब्लॉक को कभी बंडल नहीं करता है; यह प्रत्येक घटक को केवल वही शब्दकोश सौंपता है जिसे वह सक्रिय भाषा में नाम देता है।
|
|
376
|
+
|
|
377
|
+
</Question>
|
|
378
|
+
|
|
379
|
+
<Question title="क्या मेरे <Trans> घटक काम करना जारी रखते हैं?">
|
|
380
|
+
|
|
381
|
+
हाँ, `components`, क्रमांकित `<1>...</1>` टैग और `values` के साथ। इसी तरह `{{interpolation}}`, `$t(key)` नेस्टिंग, `key_one` / `key_other` बहुवचन (`Intl.PluralRules` के साथ मूल्यांकित), संदर्भ प्रत्यय और `returnObjects` भी काम करते हैं।
|
|
382
|
+
|
|
383
|
+
</Question>
|
|
384
|
+
|
|
385
|
+
<Question title="यदि मैं प्रति भाषा एकल translation.json का उपयोग करता हूँ तो क्या होगा?">
|
|
386
|
+
|
|
387
|
+
`syncJSON` प्लगइन में `splitKeys: false` सेट करें। पूरी फ़ाइल एक शब्दकोश बनी रहती है और एक साधारण `useTranslation()` इसके विरुद्ध हल करना जारी रखता है।
|
|
388
|
+
|
|
389
|
+
</Question>
|
|
390
|
+
|
|
391
|
+
<Question title="क्या यह पूरी तरह से Intlayer पर माइग्रेट करने जैसा है?">
|
|
392
|
+
|
|
393
|
+
नहीं, यह एक सेतु है। एडाप्टर `i18next` API को बनाए रखता है और इसमें 9.4 KB का रनटाइम लगता है; नेटिव `next-intlayer` की लागत 5.5 KB है और यह समकालिक Server Components और सह-स्थित `.content.ts` फ़ाइलें जोड़ता है। आप घटक दर घटक स्थानांतरित कर सकते हैं, क्योंकि JSON और `.content.ts` शब्दकोश सह-अस्तित्व में रहते हैं।
|
|
394
|
+
|
|
395
|
+
</Question>
|
|
396
|
+
|
|
397
|
+
<Question title="क्या अनुवादक उसी तरह काम करना जारी रख सकते हैं जैसे वे आज करते हैं?">
|
|
398
|
+
|
|
399
|
+
हाँ। `locales/{lng}/{ns}.json` सत्य का स्रोत बना रहता है: `syncJSON` इसे i18next बोली के साथ पढ़ता है और जब CLI या CMS उन्हें अपडेट करता है तो अनुवाद वापस लिखता है।
|
|
400
|
+
|
|
401
|
+
</Question>
|
|
402
|
+
|
|
403
|
+
</FAQ>
|
|
311
404
|
|
|
312
405
|
## संबंधित तुलनाएं
|
|
313
406
|
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
- [
|
|
317
|
-
- [
|
|
318
|
-
-
|
|
319
|
-
|
|
407
|
+
समान एडाप्टर श्रृंखला:
|
|
408
|
+
|
|
409
|
+
- [next-intl vs @intlayer/next-intl](https://intlayer.org/hi/blog/next-intl-vs-intlayer-next-intl)
|
|
410
|
+
- [Lingui vs @intlayer/lingui](https://intlayer.org/hi/blog/lingui-vs-intlayer-lingui)
|
|
411
|
+
- [vue-i18n vs @intlayer/vue-i18n](https://intlayer.org/hi/blog/vue-i18n-vs-intlayer-vue-i18n)
|
|
412
|
+
|
|
413
|
+
लाइब्रेरी की आमने-सामने तुलना:
|
|
414
|
+
|
|
415
|
+
- [i18next vs Intlayer](https://intlayer.org/hi/blog/i18next-vs-intlayer), same benchmark
|
|
416
|
+
- [next-i18next vs next-intl vs Intlayer](https://intlayer.org/hi/blog/next-i18next-vs-next-intl-vs-intlayer)
|
|
417
|
+
- [react-i18next vs react-intl vs Intlayer](https://intlayer.org/hi/blog/react-i18next-vs-react-intl-vs-intlayer)
|
|
418
|
+
- [Is i18next outdated?](https://intlayer.org/hi/blog/is-i18next-outdated)
|
|
419
|
+
|
|
420
|
+
संदर्भ दस्तावेज़:
|
|
421
|
+
|
|
422
|
+
- Compat adapters: [i18next](https://intlayer.org/hi/doc/compatibility/i18next), [react-i18next](https://intlayer.org/hi/doc/compatibility/react-i18next), [next-i18next](https://intlayer.org/hi/doc/compatibility/next-i18next)
|
|
423
|
+
- Migration guides: [i18next](https://intlayer.org/hi/doc/migration/i18next), [react-i18next](https://intlayer.org/hi/doc/migration/react-i18next), [next-i18next](https://intlayer.org/hi/doc/migration/next-i18next)
|
|
424
|
+
- [Next.js benchmark report](https://intlayer.org/hi/doc/benchmark/nextjs) and [TanStack Start benchmark report](https://intlayer.org/hi/doc/benchmark/tanstack)
|
|
425
|
+
- [Bundle optimization](https://intlayer.org/hi/doc/concept/bundle-optimization) and [the Intlayer compiler](https://intlayer.org/hi/doc/compiler)
|
|
426
|
+
- [Visual Editor](https://intlayer.org/hi/doc/concept/editor), [CMS](https://intlayer.org/hi/doc/concept/cms) and [AI translation](https://intlayer.org/hi/doc/concept/auto-fill)
|
|
320
427
|
|
|
321
428
|
## निष्कर्ष
|
|
322
429
|
|