@intlayer/docs 9.5.2 → 9.5.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/blog/ar/i18next_vs_intlayer-i18next.md +327 -0
- package/blog/ar/i18next_vs_intlayer.md +445 -0
- package/blog/ar/is_i18next_outdated.md +1 -1
- package/blog/ar/is_next-intl_outdated.md +1 -1
- package/blog/ar/is_vue-i18n_outdated.md +1 -1
- package/blog/ar/lingui_vs_intlayer-lingui.md +304 -0
- package/blog/ar/lingui_vs_intlayer.md +381 -0
- package/blog/ar/next-i18next_vs_next-intl_vs_intlayer.md +1 -1
- package/blog/ar/next-intl_vs_intlayer-next-intl.md +309 -0
- package/blog/ar/next-intl_vs_intlayer.md +397 -0
- package/blog/ar/react-i18next_vs_react-intl_vs_intlayer.md +1 -1
- package/blog/ar/vue-i18n_vs_intlayer-vue-i18n.md +286 -0
- package/blog/ar/vue-i18n_vs_intlayer_benchmark.md +0 -0
- package/blog/de/i18next_vs_intlayer-i18next.md +327 -0
- package/blog/de/i18next_vs_intlayer.md +445 -0
- package/blog/de/is_i18next_outdated.md +1 -1
- package/blog/de/is_next-intl_outdated.md +1 -1
- package/blog/de/is_vue-i18n_outdated.md +1 -1
- package/blog/de/lingui_vs_intlayer-lingui.md +304 -0
- package/blog/de/lingui_vs_intlayer.md +381 -0
- package/blog/de/next-i18next_vs_next-intl_vs_intlayer.md +1 -1
- package/blog/de/next-intl_vs_intlayer-next-intl.md +309 -0
- package/blog/de/next-intl_vs_intlayer.md +415 -0
- package/blog/de/vue-i18n_vs_intlayer-vue-i18n.md +288 -0
- package/blog/de/vue-i18n_vs_intlayer_benchmark.md +355 -0
- package/blog/en/i18next_vs_intlayer-i18next.md +327 -0
- package/blog/en/i18next_vs_intlayer.md +445 -0
- package/blog/en/is_i18next_outdated.md +1 -1
- package/blog/en/is_next-intl_outdated.md +1 -1
- package/blog/en/is_vue-i18n_outdated.md +1 -1
- package/blog/en/lingui_vs_intlayer-lingui.md +304 -0
- package/blog/en/lingui_vs_intlayer.md +381 -0
- package/blog/en/next-i18next_vs_next-intl_vs_intlayer.md +1 -1
- package/blog/en/next-intl_vs_intlayer-next-intl.md +309 -0
- package/blog/en/next-intl_vs_intlayer.md +415 -0
- package/blog/en/react-i18next_vs_react-intl_vs_intlayer.md +1 -1
- package/blog/en/vue-i18n_vs_intlayer-vue-i18n.md +288 -0
- package/blog/en/vue-i18n_vs_intlayer.md +1 -1
- package/blog/en/vue-i18n_vs_intlayer_benchmark.md +361 -0
- package/blog/en-GB/i18next_vs_intlayer-i18next.md +327 -0
- package/blog/en-GB/i18next_vs_intlayer.md +445 -0
- package/blog/en-GB/is_i18next_outdated.md +1 -1
- package/blog/en-GB/is_next-intl_outdated.md +1 -1
- package/blog/en-GB/is_vue-i18n_outdated.md +1 -1
- package/blog/en-GB/lingui_vs_intlayer-lingui.md +304 -0
- package/blog/en-GB/lingui_vs_intlayer.md +381 -0
- package/blog/en-GB/next-i18next_vs_next-intl_vs_intlayer.md +1 -1
- package/blog/en-GB/next-intl_vs_intlayer-next-intl.md +309 -0
- package/blog/en-GB/next-intl_vs_intlayer.md +415 -0
- package/blog/en-GB/react-i18next_vs_react-intl_vs_intlayer.md +1 -1
- package/blog/en-GB/vue-i18n_vs_intlayer-vue-i18n.md +288 -0
- package/blog/en-GB/vue-i18n_vs_intlayer.md +1 -1
- package/blog/en-GB/vue-i18n_vs_intlayer_benchmark.md +245 -0
- package/blog/es/i18next_vs_intlayer-i18next.md +327 -0
- package/blog/es/i18next_vs_intlayer.md +445 -0
- package/blog/es/is_i18next_outdated.md +1 -1
- package/blog/es/is_next-intl_outdated.md +1 -1
- package/blog/es/is_vue-i18n_outdated.md +1 -1
- package/blog/es/lingui_vs_intlayer-lingui.md +304 -0
- package/blog/es/lingui_vs_intlayer.md +381 -0
- package/blog/es/next-i18next_vs_next-intl_vs_intlayer.md +1 -1
- package/blog/es/next-intl_vs_intlayer-next-intl.md +309 -0
- package/blog/es/next-intl_vs_intlayer.md +417 -0
- package/blog/es/vue-i18n_vs_intlayer-vue-i18n.md +288 -0
- package/blog/es/vue-i18n_vs_intlayer_benchmark.md +363 -0
- package/blog/fr/i18next_vs_intlayer-i18next.md +327 -0
- package/blog/fr/i18next_vs_intlayer.md +445 -0
- package/blog/fr/is_i18next_outdated.md +1 -1
- package/blog/fr/is_next-intl_outdated.md +1 -1
- package/blog/fr/is_vue-i18n_outdated.md +1 -1
- package/blog/fr/lingui_vs_intlayer-lingui.md +304 -0
- package/blog/fr/lingui_vs_intlayer.md +381 -0
- package/blog/fr/next-i18next_vs_next-intl_vs_intlayer.md +1 -1
- package/blog/fr/next-intl_vs_intlayer-next-intl.md +309 -0
- package/blog/fr/next-intl_vs_intlayer.md +417 -0
- package/blog/fr/vue-i18n_vs_intlayer-vue-i18n.md +287 -0
- package/blog/fr/vue-i18n_vs_intlayer_benchmark.md +39 -0
- package/blog/hi/i18next_vs_intlayer-i18next.md +327 -0
- package/blog/hi/i18next_vs_intlayer.md +445 -0
- package/blog/hi/is_i18next_outdated.md +1 -1
- package/blog/hi/is_next-intl_outdated.md +1 -1
- package/blog/hi/is_vue-i18n_outdated.md +1 -1
- package/blog/hi/lingui_vs_intlayer-lingui.md +304 -0
- package/blog/hi/lingui_vs_intlayer.md +381 -0
- package/blog/hi/next-intl_vs_intlayer-next-intl.md +309 -0
- package/blog/hi/next-intl_vs_intlayer.md +397 -0
- package/blog/hi/react-i18next_vs_react-intl_vs_intlayer.md +1 -1
- package/blog/hi/vue-i18n_vs_intlayer-vue-i18n.md +288 -0
- package/blog/hi/vue-i18n_vs_intlayer_benchmark.md +0 -0
- package/blog/id/i18next_vs_intlayer-i18next.md +327 -0
- package/blog/id/i18next_vs_intlayer.md +445 -0
- package/blog/id/is_i18next_outdated.md +1 -1
- package/blog/id/is_next-intl_outdated.md +1 -1
- package/blog/id/is_vue-i18n_outdated.md +1 -1
- package/blog/id/lingui_vs_intlayer-lingui.md +304 -0
- package/blog/id/lingui_vs_intlayer.md +381 -0
- package/blog/id/next-i18next_vs_next-intl_vs_intlayer.md +1 -1
- package/blog/id/next-intl_vs_intlayer-next-intl.md +310 -0
- package/blog/id/next-intl_vs_intlayer.md +397 -0
- package/blog/id/react-i18next_vs_react-intl_vs_intlayer.md +1 -1
- package/blog/id/vue-i18n_vs_intlayer-vue-i18n.md +36 -0
- package/blog/id/vue-i18n_vs_intlayer.md +1 -1
- package/blog/id/vue-i18n_vs_intlayer_benchmark.md +41 -0
- package/blog/it/i18next_vs_intlayer-i18next.md +327 -0
- package/blog/it/i18next_vs_intlayer.md +445 -0
- package/blog/it/is_i18next_outdated.md +1 -1
- package/blog/it/is_next-intl_outdated.md +1 -1
- package/blog/it/is_vue-i18n_outdated.md +1 -1
- package/blog/it/lingui_vs_intlayer-lingui.md +304 -0
- package/blog/it/lingui_vs_intlayer.md +381 -0
- package/blog/it/next-i18next_vs_next-intl_vs_intlayer.md +1 -1
- package/blog/it/next-intl_vs_intlayer-next-intl.md +309 -0
- package/blog/it/next-intl_vs_intlayer.md +418 -0
- package/blog/it/vue-i18n_vs_intlayer-vue-i18n.md +288 -0
- package/blog/it/vue-i18n_vs_intlayer_benchmark.md +34 -0
- package/blog/ja/i18next_vs_intlayer-i18next.md +327 -0
- package/blog/ja/i18next_vs_intlayer.md +447 -0
- package/blog/ja/is_i18next_outdated.md +1 -1
- package/blog/ja/is_next-intl_outdated.md +1 -1
- package/blog/ja/is_vue-i18n_outdated.md +1 -1
- package/blog/ja/lingui_vs_intlayer-lingui.md +304 -0
- package/blog/ja/lingui_vs_intlayer.md +381 -0
- package/blog/ja/next-i18next_vs_next-intl_vs_intlayer.md +1 -1
- package/blog/ja/next-intl_vs_intlayer-next-intl.md +310 -0
- package/blog/ja/next-intl_vs_intlayer.md +422 -0
- package/blog/ja/react-i18next_vs_react-intl_vs_intlayer.md +1 -1
- package/blog/ja/vue-i18n_vs_intlayer-vue-i18n.md +288 -0
- package/blog/ja/vue-i18n_vs_intlayer.md +1 -1
- package/blog/ja/vue-i18n_vs_intlayer_benchmark.md +0 -0
- package/blog/ko/i18next_vs_intlayer-i18next.md +327 -0
- package/blog/ko/i18next_vs_intlayer.md +447 -0
- package/blog/ko/is_i18next_outdated.md +1 -1
- package/blog/ko/is_next-intl_outdated.md +1 -1
- package/blog/ko/is_vue-i18n_outdated.md +1 -1
- package/blog/ko/lingui_vs_intlayer-lingui.md +304 -0
- package/blog/ko/lingui_vs_intlayer.md +381 -0
- package/blog/ko/next-i18next_vs_next-intl_vs_intlayer.md +1 -1
- package/blog/ko/next-intl_vs_intlayer-next-intl.md +309 -0
- package/blog/ko/next-intl_vs_intlayer.md +397 -0
- package/blog/ko/react-i18next_vs_react-intl_vs_intlayer.md +1 -1
- package/blog/ko/vue-i18n_vs_intlayer-vue-i18n.md +288 -0
- package/blog/ko/vue-i18n_vs_intlayer.md +1 -1
- package/blog/ko/vue-i18n_vs_intlayer_benchmark.md +366 -0
- package/blog/pl/i18next_vs_intlayer-i18next.md +327 -0
- package/blog/pl/i18next_vs_intlayer.md +445 -0
- package/blog/pl/is_i18next_outdated.md +1 -1
- package/blog/pl/is_next-intl_outdated.md +1 -1
- package/blog/pl/is_vue-i18n_outdated.md +1 -1
- package/blog/pl/lingui_vs_intlayer-lingui.md +304 -0
- package/blog/pl/lingui_vs_intlayer.md +381 -0
- package/blog/pl/next-i18next_vs_next-intl_vs_intlayer.md +1 -1
- package/blog/pl/next-intl_vs_intlayer-next-intl.md +309 -0
- package/blog/pl/next-intl_vs_intlayer.md +397 -0
- package/blog/pl/react-i18next_vs_react-intl_vs_intlayer.md +1 -1
- package/blog/pl/vue-i18n_vs_intlayer-vue-i18n.md +289 -0
- package/blog/pl/vue-i18n_vs_intlayer.md +1 -1
- package/blog/pl/vue-i18n_vs_intlayer_benchmark.md +0 -0
- package/blog/pt/i18next_vs_intlayer-i18next.md +327 -0
- package/blog/pt/i18next_vs_intlayer.md +445 -0
- package/blog/pt/is_i18next_outdated.md +1 -1
- package/blog/pt/is_next-intl_outdated.md +1 -1
- package/blog/pt/is_vue-i18n_outdated.md +1 -1
- package/blog/pt/lingui_vs_intlayer-lingui.md +304 -0
- package/blog/pt/lingui_vs_intlayer.md +381 -0
- package/blog/pt/next-i18next_vs_next-intl_vs_intlayer.md +1 -1
- package/blog/pt/next-intl_vs_intlayer-next-intl.md +309 -0
- package/blog/pt/next-intl_vs_intlayer.md +411 -0
- package/blog/pt/vue-i18n_vs_intlayer-vue-i18n.md +288 -0
- package/blog/pt/vue-i18n_vs_intlayer_benchmark.md +0 -0
- package/blog/ru/i18next_vs_intlayer-i18next.md +327 -0
- package/blog/ru/i18next_vs_intlayer.md +445 -0
- package/blog/ru/is_i18next_outdated.md +1 -1
- package/blog/ru/is_next-intl_outdated.md +1 -1
- package/blog/ru/is_vue-i18n_outdated.md +1 -1
- package/blog/ru/lingui_vs_intlayer-lingui.md +304 -0
- package/blog/ru/lingui_vs_intlayer.md +381 -0
- package/blog/ru/next-i18next_vs_next-intl_vs_intlayer.md +1 -1
- package/blog/ru/next-intl_vs_intlayer-next-intl.md +309 -0
- package/blog/ru/next-intl_vs_intlayer.md +417 -0
- package/blog/ru/vue-i18n_vs_intlayer-vue-i18n.md +288 -0
- package/blog/ru/vue-i18n_vs_intlayer_benchmark.md +54 -0
- package/blog/tr/i18next_vs_intlayer-i18next.md +327 -0
- package/blog/tr/i18next_vs_intlayer.md +445 -0
- package/blog/tr/is_i18next_outdated.md +1 -1
- package/blog/tr/is_next-intl_outdated.md +1 -1
- package/blog/tr/is_vue-i18n_outdated.md +1 -1
- package/blog/tr/lingui_vs_intlayer-lingui.md +304 -0
- package/blog/tr/lingui_vs_intlayer.md +381 -0
- package/blog/tr/next-i18next_vs_next-intl_vs_intlayer.md +1 -1
- package/blog/tr/next-intl_vs_intlayer-next-intl.md +309 -0
- package/blog/tr/next-intl_vs_intlayer.md +397 -0
- package/blog/tr/react-i18next_vs_react-intl_vs_intlayer.md +1 -1
- package/blog/tr/vue-i18n_vs_intlayer-vue-i18n.md +288 -0
- package/blog/tr/vue-i18n_vs_intlayer.md +1 -1
- package/blog/tr/vue-i18n_vs_intlayer_benchmark.md +0 -0
- package/blog/uk/i18next_vs_intlayer-i18next.md +327 -0
- package/blog/uk/i18next_vs_intlayer.md +445 -0
- package/blog/uk/is_i18next_outdated.md +1 -1
- package/blog/uk/is_next-intl_outdated.md +1 -1
- package/blog/uk/is_vue-i18n_outdated.md +1 -1
- package/blog/uk/lingui_vs_intlayer-lingui.md +304 -0
- package/blog/uk/lingui_vs_intlayer.md +381 -0
- package/blog/uk/next-i18next_vs_next-intl_vs_intlayer.md +1 -1
- package/blog/uk/next-intl_vs_intlayer-next-intl.md +309 -0
- package/blog/uk/next-intl_vs_intlayer.md +397 -0
- package/blog/uk/react-i18next_vs_react-intl_vs_intlayer.md +1 -1
- package/blog/uk/vue-i18n_vs_intlayer-vue-i18n.md +270 -0
- package/blog/uk/vue-i18n_vs_intlayer.md +1 -1
- package/blog/uk/vue-i18n_vs_intlayer_benchmark.md +0 -0
- package/blog/vi/i18next_vs_intlayer-i18next.md +327 -0
- package/blog/vi/i18next_vs_intlayer.md +445 -0
- package/blog/vi/is_i18next_outdated.md +1 -1
- package/blog/vi/is_next-intl_outdated.md +1 -1
- package/blog/vi/is_vue-i18n_outdated.md +1 -1
- package/blog/vi/lingui_vs_intlayer-lingui.md +304 -0
- package/blog/vi/lingui_vs_intlayer.md +381 -0
- package/blog/vi/next-i18next_vs_next-intl_vs_intlayer.md +1 -1
- package/blog/vi/next-intl_vs_intlayer-next-intl.md +309 -0
- package/blog/vi/next-intl_vs_intlayer.md +397 -0
- package/blog/vi/react-i18next_vs_react-intl_vs_intlayer.md +1 -1
- package/blog/vi/vue-i18n_vs_intlayer-vue-i18n.md +288 -0
- package/blog/vi/vue-i18n_vs_intlayer.md +1 -1
- package/blog/vi/vue-i18n_vs_intlayer_benchmark.md +0 -0
- package/blog/zh/i18next_vs_intlayer-i18next.md +327 -0
- package/blog/zh/i18next_vs_intlayer.md +445 -0
- package/blog/zh/is_i18next_outdated.md +1 -1
- package/blog/zh/is_next-intl_outdated.md +1 -1
- package/blog/zh/is_vue-i18n_outdated.md +1 -1
- package/blog/zh/lingui_vs_intlayer-lingui.md +304 -0
- package/blog/zh/lingui_vs_intlayer.md +381 -0
- package/blog/zh/next-i18next_vs_next-intl_vs_intlayer.md +1 -1
- package/blog/zh/next-intl_vs_intlayer-next-intl.md +309 -0
- package/blog/zh/next-intl_vs_intlayer.md +422 -0
- package/blog/zh/react-i18next_vs_react-intl_vs_intlayer.md +1 -1
- package/blog/zh/vue-i18n_vs_intlayer-vue-i18n.md +288 -0
- package/blog/zh/vue-i18n_vs_intlayer.md +1 -1
- package/blog/zh/vue-i18n_vs_intlayer_benchmark.md +30 -0
- package/dist/cjs/generated/blog.entry.cjs +160 -0
- package/dist/cjs/generated/blog.entry.cjs.map +1 -1
- package/dist/cjs/generated/frequentQuestions.entry.cjs +20 -0
- package/dist/cjs/generated/frequentQuestions.entry.cjs.map +1 -1
- package/dist/esm/generated/blog.entry.mjs +160 -0
- package/dist/esm/generated/blog.entry.mjs.map +1 -1
- package/dist/esm/generated/frequentQuestions.entry.mjs +20 -0
- package/dist/esm/generated/frequentQuestions.entry.mjs.map +1 -1
- package/dist/types/generated/blog.entry.d.ts +8 -0
- package/dist/types/generated/blog.entry.d.ts.map +1 -1
- package/dist/types/generated/frequentQuestions.entry.d.ts +1 -0
- package/dist/types/generated/frequentQuestions.entry.d.ts.map +1 -1
- package/docs/ar/benchmark/nextjs.md +1 -1
- package/docs/ar/benchmark/solid.md +1 -1
- package/docs/ar/benchmark/svelte.md +1 -1
- package/docs/ar/benchmark/tanstack.md +1 -1
- package/docs/ar/benchmark/vue.md +1 -1
- package/docs/ar/interest_of_intlayer.md +1 -1
- package/docs/bn/interest_of_intlayer.md +1 -1
- package/docs/cs/interest_of_intlayer.md +1 -1
- package/docs/de/benchmark/nextjs.md +1 -1
- package/docs/de/benchmark/solid.md +1 -1
- package/docs/de/benchmark/svelte.md +1 -1
- package/docs/de/benchmark/tanstack.md +1 -1
- package/docs/de/benchmark/vue.md +1 -1
- package/docs/de/interest_of_intlayer.md +1 -1
- package/docs/en/benchmark/nextjs.md +1 -1
- package/docs/en/benchmark/solid.md +1 -1
- package/docs/en/benchmark/svelte.md +1 -1
- package/docs/en/benchmark/tanstack.md +1 -1
- package/docs/en/benchmark/vue.md +1 -1
- package/docs/en/interest_of_intlayer.md +1 -1
- package/docs/en-GB/benchmark/nextjs.md +1 -1
- package/docs/en-GB/benchmark/solid.md +1 -1
- package/docs/en-GB/benchmark/svelte.md +1 -1
- package/docs/en-GB/benchmark/tanstack.md +1 -1
- package/docs/en-GB/benchmark/vue.md +1 -1
- package/docs/en-GB/interest_of_intlayer.md +1 -1
- package/docs/es/benchmark/nextjs.md +1 -1
- package/docs/es/benchmark/solid.md +1 -1
- package/docs/es/benchmark/svelte.md +1 -1
- package/docs/es/benchmark/tanstack.md +1 -1
- package/docs/es/benchmark/vue.md +1 -1
- package/docs/es/interest_of_intlayer.md +1 -1
- package/docs/fr/benchmark/nextjs.md +1 -1
- package/docs/fr/benchmark/solid.md +1 -1
- package/docs/fr/benchmark/svelte.md +1 -1
- package/docs/fr/benchmark/tanstack.md +1 -1
- package/docs/fr/benchmark/vue.md +1 -1
- package/docs/fr/interest_of_intlayer.md +1 -1
- package/docs/hi/benchmark/nextjs.md +1 -1
- package/docs/hi/benchmark/solid.md +1 -1
- package/docs/hi/benchmark/svelte.md +1 -1
- package/docs/hi/benchmark/tanstack.md +1 -1
- package/docs/hi/benchmark/vue.md +1 -1
- package/docs/hi/interest_of_intlayer.md +1 -1
- package/docs/id/benchmark/nextjs.md +1 -1
- package/docs/id/benchmark/solid.md +1 -1
- package/docs/id/benchmark/svelte.md +1 -1
- package/docs/id/benchmark/tanstack.md +1 -1
- package/docs/id/benchmark/vue.md +1 -1
- package/docs/id/interest_of_intlayer.md +1 -1
- package/docs/it/benchmark/nextjs.md +1 -1
- package/docs/it/benchmark/solid.md +1 -1
- package/docs/it/benchmark/svelte.md +1 -1
- package/docs/it/benchmark/tanstack.md +1 -1
- package/docs/it/benchmark/vue.md +1 -1
- package/docs/it/interest_of_intlayer.md +1 -1
- package/docs/ja/benchmark/nextjs.md +1 -1
- package/docs/ja/benchmark/solid.md +1 -1
- package/docs/ja/benchmark/svelte.md +1 -1
- package/docs/ja/benchmark/tanstack.md +1 -1
- package/docs/ja/benchmark/vue.md +1 -1
- package/docs/ja/interest_of_intlayer.md +1 -1
- package/docs/ko/benchmark/nextjs.md +1 -1
- package/docs/ko/benchmark/solid.md +1 -1
- package/docs/ko/benchmark/svelte.md +1 -1
- package/docs/ko/benchmark/tanstack.md +1 -1
- package/docs/ko/benchmark/vue.md +1 -1
- package/docs/ko/interest_of_intlayer.md +1 -1
- package/docs/nl/interest_of_intlayer.md +1 -1
- package/docs/pl/benchmark/nextjs.md +1 -1
- package/docs/pl/benchmark/solid.md +1 -1
- package/docs/pl/benchmark/svelte.md +1 -1
- package/docs/pl/benchmark/tanstack.md +1 -1
- package/docs/pl/benchmark/vue.md +1 -1
- package/docs/pl/interest_of_intlayer.md +1 -1
- package/docs/pt/benchmark/nextjs.md +1 -1
- package/docs/pt/benchmark/solid.md +1 -1
- package/docs/pt/benchmark/svelte.md +1 -1
- package/docs/pt/benchmark/tanstack.md +1 -1
- package/docs/pt/benchmark/vue.md +1 -1
- package/docs/pt/interest_of_intlayer.md +1 -1
- package/docs/ru/benchmark/nextjs.md +1 -1
- package/docs/ru/benchmark/solid.md +1 -1
- package/docs/ru/benchmark/svelte.md +1 -1
- package/docs/ru/benchmark/tanstack.md +1 -1
- package/docs/ru/benchmark/vue.md +1 -1
- package/docs/ru/interest_of_intlayer.md +1 -1
- package/docs/tr/benchmark/nextjs.md +1 -1
- package/docs/tr/benchmark/solid.md +1 -1
- package/docs/tr/benchmark/svelte.md +1 -1
- package/docs/tr/benchmark/tanstack.md +1 -1
- package/docs/tr/benchmark/vue.md +1 -1
- package/docs/tr/interest_of_intlayer.md +1 -1
- package/docs/uk/benchmark/nextjs.md +1 -1
- package/docs/uk/benchmark/solid.md +1 -1
- package/docs/uk/benchmark/svelte.md +1 -1
- package/docs/uk/benchmark/tanstack.md +1 -1
- package/docs/uk/benchmark/vue.md +1 -1
- package/docs/uk/interest_of_intlayer.md +1 -1
- package/docs/ur/interest_of_intlayer.md +1 -1
- package/docs/vi/benchmark/nextjs.md +1 -1
- package/docs/vi/benchmark/solid.md +1 -1
- package/docs/vi/benchmark/svelte.md +1 -1
- package/docs/vi/benchmark/tanstack.md +1 -1
- package/docs/vi/benchmark/vue.md +1 -1
- package/docs/vi/interest_of_intlayer.md +1 -1
- package/docs/zh/benchmark/nextjs.md +1 -1
- package/docs/zh/benchmark/solid.md +1 -1
- package/docs/zh/benchmark/svelte.md +1 -1
- package/docs/zh/benchmark/tanstack.md +1 -1
- package/docs/zh/benchmark/vue.md +1 -1
- package/docs/zh/interest_of_intlayer.md +1 -1
- package/docs/zh-TW/interest_of_intlayer.md +1 -1
- package/frequent_questions/ar/claude_code_token_consumption.md +152 -0
- package/frequent_questions/de/claude_code_token_consumption.md +152 -0
- package/frequent_questions/en/claude_code_token_consumption.md +152 -0
- package/frequent_questions/en-GB/claude_code_token_consumption.md +152 -0
- package/frequent_questions/es/claude_code_token_consumption.md +152 -0
- package/frequent_questions/fr/claude_code_token_consumption.md +152 -0
- package/frequent_questions/hi/claude_code_token_consumption.md +152 -0
- package/frequent_questions/id/claude_code_token_consumption.md +152 -0
- package/frequent_questions/it/claude_code_token_consumption.md +152 -0
- package/frequent_questions/ja/claude_code_token_consumption.md +152 -0
- package/frequent_questions/ko/claude_code_token_consumption.md +152 -0
- package/frequent_questions/pl/claude_code_token_consumption.md +152 -0
- package/frequent_questions/pt/claude_code_token_consumption.md +152 -0
- package/frequent_questions/ru/claude_code_token_consumption.md +152 -0
- package/frequent_questions/tr/claude_code_token_consumption.md +152 -0
- package/frequent_questions/uk/claude_code_token_consumption.md +152 -0
- package/frequent_questions/vi/claude_code_token_consumption.md +152 -0
- package/frequent_questions/zh/claude_code_token_consumption.md +152 -0
- package/package.json +6 -6
- package/src/generated/blog.entry.ts +160 -0
- package/src/generated/frequentQuestions.entry.ts +20 -0
|
@@ -0,0 +1,363 @@
|
|
|
1
|
+
---
|
|
2
|
+
createdAt: 2026-09-13
|
|
3
|
+
updatedAt: 2026-09-13
|
|
4
|
+
title: "vue-i18n vs Intlayer: Benchmark 2026"
|
|
5
|
+
description: vue-i18n e Intlayer medidos en la misma aplicación Vite + Vue 3. Tamaño de la librería, JavaScript por página, fuga de contenido, tamaño del componente y reactividad del cambio de idioma, con los números explicados.
|
|
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 de Internacionalización (i18n) de Vue
|
|
25
|
+
|
|
26
|
+
`vue-i18n` es la biblioteca i18n de referencia para Vue. Intlayer es una alternativa basada en compilador, de ámbito de componente, con una integración de Vue (`vue-intlayer`). Ya comparamos sus [características y experiencia de desarrollador](https://intlayer.org/blog/vue-i18n-vs-intlayer). Este artículo examina qué costo tiene cada una una vez que la aplicación está compilada.
|
|
27
|
+
|
|
28
|
+
Los datos provienen de [Benchmark Bloom](https://github.com/intlayer-org/benchmark-bloom), una suite de código abierto que construye la misma aplicación con cada biblioteca y registra lo que el navegador realmente descarga y ejecuta.
|
|
29
|
+
|
|
30
|
+
<TOC/>
|
|
31
|
+
|
|
32
|
+
> **tl;dr**: En la misma app Vite + Vue 3, `vue-i18n` envía **134.9 KB** de JavaScript comprimido por página contra **41.3 KB** para la app sin i18n. Intlayer envía **57.1 KB**. El runtime de `vue-i18n` solo pesa **24.3 KB gzip** (6x los 3.9 KB de Intlayer), cada página lleva **90% de strings de páginas extranjeras**, y un componente compilado en aislamiento arrastra **196 KB** porque está vinculado al árbol global de mensajes. El adaptador `@intlayer/vue-i18n` mantiene la API de `vue-i18n` y midió **47.0 KB** por página.
|
|
33
|
+
|
|
34
|
+
## En resumen
|
|
35
|
+
|
|
36
|
+
- **vue-i18n** - La librería i18n de facto para Vue 2 / Vue 3 y el núcleo de `@nuxtjs/i18n`. Mensajes en estilo ICU, bloques `<i18n>` en SFC, directiva `v-t`, formateadores `d()` / `n()`, ecosistema amplio. Los mensajes se registran en una instancia global en `createI18n()`; la carga perezosa por locale es un patrón `setLocaleMessage()` manual, y la división por ruta depende de ti.
|
|
37
|
+
- **Intlayer** - Modelo de contenido centrado en componentes. Los diccionarios `.content.ts` se encuentran junto al componente que sirven, un compilador en tiempo de compilación (`vite-intlayer`) los tree-shake y los carga perezosamente por componente y por locale, se generan tipos TypeScript estrictos a partir de tu contenido, y las traducciones faltantes fallan en tiempo de compilación. Incluye helpers de router / SEO, un Editor Visual / CMS y traducción asistida por IA.
|
|
38
|
+
|
|
39
|
+
| Librería | Estrellas en GitHub | Total de Commits | Último Commit | Primera Versión | Versión NPM | Descargas en NPM |
|
|
40
|
+
| --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- | --------------- | ----------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------- |
|
|
41
|
+
| `aymericzip/intlayer` | [](https://github.com/aymericzip/intlayer/stargazers) | [](https://github.com/aymericzip/intlayer/commits) | [](https://github.com/aymericzip/intlayer/commits) | Abril 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) | Dec 2016 | [](https://www.npmjs.com/package/vue-i18n) | [](https://www.npmjs.com/package/vue-i18n) |
|
|
43
|
+
|
|
44
|
+
> Los badges se actualizan automáticamente. Las snapshots variarán con el tiempo.
|
|
45
|
+
|
|
46
|
+
## Comparación de características lado a lado
|
|
47
|
+
|
|
48
|
+
| Característica | `vue-intlayer` (Intlayer) | `vue-i18n` |
|
|
49
|
+
| -------------------------------------------------- | ------------------------------------------------------------------- | ----------------------------------------------------------------------------------------- |
|
|
50
|
+
| **Traducciones cerca de componentes** | ✅ Sí, `.content.ts` colocado con cada componente | ✅ Vía bloques SFC `<i18n>` (opcional); los catálogos globales son la configuración común |
|
|
51
|
+
| **Integración de TypeScript** | ✅ Tipos estrictos generados automáticamente desde el contenido | ✅ Tipado bueno; la seguridad de claves estricta requiere tipado de esquema y disciplina |
|
|
52
|
+
| **Detección de traducciones faltantes** | ✅ Error de TypeScript + error/advertencia en tiempo de compilación | ⚠️ Fallback en tiempo de ejecución + advertencia en consola |
|
|
53
|
+
| **Contenido enriquecido (componentes / Markdown)** | ✅ Soporte directo | ⚠️ Interpolación de componente `<i18n-t>`; Markdown a través de plugins externos |
|
|
54
|
+
| **Soporte de ICU** | ⚠️ En desarrollo | ✅ Sí |
|
|
55
|
+
| **Formato (fechas, números, monedas)** | ✅ Formateadores basados en Intl | ✅ `d()` / `n()` con `datetimeFormats` / `numberFormats` |
|
|
56
|
+
| **Enrutamiento localizado** | ✅ Helpers para Vue Router / Nuxt, `getMultilingualUrls` | ⚠️ No es core (`@nuxtjs/i18n` o configuración de enrutador personalizada) |
|
|
57
|
+
| **Helpers de SEO (hreflang, sitemap, robots)** | ✅ Helpers integrados | ❌ No es core |
|
|
58
|
+
| **Tree-shaking (enviar solo contenido utilizado)** | ✅ Por componente, por locale, automatizado por el compilador | ⚠️ Manual: dividir catálogos, `setLocaleMessage()` por ruta |
|
|
59
|
+
| **Carga perezosa (Lazy loading)** | ✅ `importMode: 'dynamic'` (una línea de configuración) | ✅ Manual `import()` + `setLocaleMessage()` |
|
|
60
|
+
| **Eliminar contenido no utilizado** | ✅ Los diccionarios muertos se eliminan en tiempo de compilación | ❌ No integrado |
|
|
61
|
+
| **Pruebas de traducciones faltantes (CLI / CI)** | ✅ `npx intlayer content test` | ⚠️ Terceros (`vue-i18n-extract`) |
|
|
62
|
+
| **Traducción potenciada por IA** | ✅ Integrada, utiliza tus propias claves de proveedor | ❌ No |
|
|
63
|
+
| **Editor Visual / CMS** | ✅ Editor Visual gratuito + CMS opcional | ❌ No (plataformas de localización externas) |
|
|
64
|
+
| **Servidor MCP y Agent Skills** | ✅ Sí | ❌ No |
|
|
65
|
+
| **Ecosistema / comunidad** | ⚠️ Más pequeño pero creciendo rápidamente | ✅ Grande y maduro en el ecosistema de Vue |
|
|
66
|
+
|
|
67
|
+
## El benchmark
|
|
68
|
+
|
|
69
|
+
### Qué se midió
|
|
70
|
+
|
|
71
|
+
El suite [Benchmark Bloom](https://github.com/intlayer-org/benchmark-bloom) construye **la misma aplicación Vite + Vue 3** con cada librería: **10 páginas** (home, about, blog, careers, contact, FAQ, pricing, products, settings, team), **10 locales** (`en`, `fr`, `es`, `de`, `it`, `pt`, `zh`, `ja`, `ko`, `ru`), componentes idénticos y contenido idéntico. Las páginas se miden en `en` y `fr`.
|
|
72
|
+
|
|
73
|
+
Ambas librerías se probaron en la configuración **static**, la que la mayoría de proyectos Vue implementan: para `vue-i18n`, cada JSON de locale importado y pasado a `createI18n({ messages })`; para Intlayer, el `importMode: 'static'` por defecto. En ese modo Intlayer también agrupa cada locale, pero el compilador aún limita el contenido **por componente**, así que una página solo lleva los diccionarios de los componentes que renderiza.
|
|
74
|
+
|
|
75
|
+
Para cada compilación, el suite registra:
|
|
76
|
+
|
|
77
|
+
- **Lib size**: tamaño gzip de un componente vacío que solo importa la librería i18n. El costo fijo del runtime.
|
|
78
|
+
- **Page JS**: JavaScript gzip descargado por página, promediado sobre todas las páginas y locales.
|
|
79
|
+
- **Locale leak %**: proporción de strings traducidos encontrados en el JS descargado que pertenecen a una locale que el usuario **no** está viendo (fingerprinted en `en` y `fr`, así que 50% significa "la otra locale medida está completamente presente"; con 10 locales agrupadas, el desperdicio real es mayor).
|
|
80
|
+
- **Page leak %**: proporción de strings traducidos encontrados en el JS descargado que pertenecen a una página en la que el usuario **no** está.
|
|
81
|
+
- **Component avg**: tamaño gzip promedio de cada componente compilado en aislamiento. Muestra cuánto runtime i18n y catálogo arrastra un solo componente.
|
|
82
|
+
- **E2E reactivity**: tiempo de pared entre seleccionar una nueva locale y la actualización de `html[lang]` en el DOM (Playwright, 5 iteraciones).
|
|
83
|
+
- **Page load**: `PerformanceNavigationTiming.duration`.
|
|
84
|
+
|
|
85
|
+
> Los números que se muestran a continuación provienen de la ejecución del **2026-09-12** con `vue-i18n` 11.4.0 e `intlayer` 9.5.0 / 9.5.1. La aplicación de prueba es deliberadamente pequeña (algunos cientos de strings por locale), por lo que los porcentajes de fuga describen un **patrón**: crecen con tu contenido mientras que el costo del runtime se mantiene fijo.
|
|
86
|
+
|
|
87
|
+
### Resultados en Vite + Vue 3
|
|
88
|
+
|
|
89
|
+
| Librería | Estrategia | Tamaño lib (gz) | Tamaño lib (min) | Promedio JS página (gz) | Fuga de locale | Fuga de página | Promedio componente (gz) | E2E reactivity | Page load |
|
|
90
|
+
| ----------------------------- | ---------- | --------------: | ---------------: | ----------------------: | -------------: | -------------: | -----------------------: | -------------: | --------: |
|
|
91
|
+
| **base** (sin 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 columna de page-leak de la aplicación base se deja en blanco: sin librería i18n, el fingerprinting detecta strings codificados en chunks compartidos y el número no es significativo.
|
|
97
|
+
|
|
98
|
+
**Cómo leerlo**
|
|
99
|
+
|
|
100
|
+
- **Costo de runtime.** `vue-i18n` es uno de los runtimes más pesados en todo el benchmark: **24.3 KB gzip / 83.2 KB minificado** para un componente vacío que solo lo importa. `vue-intlayer` cuesta 3.9 KB gzip. Esa diferencia se paga en cada página independientemente de cuántos strings tengas.
|
|
101
|
+
- **JavaScript por página.** La aplicación sin i18n pesa 41.3 KB. `vue-i18n` la triplica a más de **134.9 KB**; Intlayer llega a **57.1 KB**, +15.8 KB, la mayoría de los cuales son los diez locales agrupados (ver el siguiente punto).
|
|
102
|
+
- **Fuga.** Con `createI18n({ messages: { en, fr, ... } })`, cada página envía cada locale y las cadenas de cada página: **50% de fuga de locale** (en los dos locales fingerprinted) y **90% de fuga de página**. El modo `static` de Intlayer también agrupa cada locale (de ahí la figura de fuga de locale comparable) pero tiene **0% de fuga de página**: una página solo extrae los diccionarios de los componentes que renderiza. Cambiar a `importMode: 'dynamic'` también elimina la fuga de locale; esa configuración no fue parte de esta ejecución de Vue.
|
|
103
|
+
- **El tamaño del componente es donde se ve la arquitectura.** Un componente que llama a `useI18n()` se compila a **196 KB** en promedio, porque `t()` está vinculado a la instancia global que contiene cada mensaje de cada locale. El mismo componente con `useIntlayer()` se compila a **7.7 KB**: solo accede a su propio diccionario.
|
|
104
|
+
- **Reactividad** no es un problema para ambos (2-5 ms). El sistema de reactividad de Vue hace que el cambio de locale sea económico una vez que los mensajes están en memoria.
|
|
105
|
+
- **`@intlayer/vue-i18n`**, el adaptador plug-and-play, mantiene la API de `vue-i18n` y midió **47.0 KB por página** y **8.4 KB por componente**, con el código de la aplicación sin cambios.
|
|
106
|
+
|
|
107
|
+
> Como referencia, la misma prueba midió `fluent-vue` en 171.8 KB por página, 29.7 KB de runtime y 217 KB por componente.
|
|
108
|
+
|
|
109
|
+
## ¿Por qué la brecha? Instancia global vs. diccionarios compilados
|
|
110
|
+
|
|
111
|
+
`vue-i18n` es un runtime. `createI18n()` construye una instancia global que sostiene un árbol de mensajes por locale; `useI18n()` vincula cada componente a ella; `t("footer.github")` busca la clave en tiempo de renderización. Esto es lo que hace posibles los bloques SFC `<i18n>`, `v-t` y la carga de mensajes en tiempo de ejecución, y también es la razón por la que el gráfico de dependencias de cada componente incluye el árbol completo:
|
|
112
|
+
|
|
113
|
+
```bash
|
|
114
|
+
.
|
|
115
|
+
├── locales
|
|
116
|
+
│ ├── en.json
|
|
117
|
+
│ ├── fr.json
|
|
118
|
+
│ └── ... # un archivo por locale, todas las páginas adentro
|
|
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
|
+
Optimizar significa que **tú** divides `en.json` en archivos por ruta, **tú** llamas a `setLocaleMessage()` en un router guard, y **tú** mantienes el mapa ruta-a-archivo correcto mientras los componentes se mueven. El runtime no puede hacerlo por ti porque no tiene idea de qué claves pedirá un componente.
|
|
127
|
+
|
|
128
|
+
Intlayer traslada ese conocimiento al build. El contenido se declara junto al componente, y `vite-intlayer` resuelve qué componente importa qué diccionario:
|
|
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
|
+
El compilador emite, por diccionario y por locale, exactamente el JSON que el componente necesita, y descarta diccionarios que nada importa. El alcance por ruta es una consecuencia del alcance por componente, no una tarea.
|
|
142
|
+
|
|
143
|
+
> Para también descartar las locales no utilizadas, establece `dictionary.importMode: 'dynamic'` en `intlayer.config.ts`. Consulta la [documentación de optimización de bundle](https://intlayer.org/doc/concept/bundle-optimization).
|
|
144
|
+
|
|
145
|
+
## Experiencia del desarrollador
|
|
146
|
+
|
|
147
|
+
### Configuración
|
|
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
|
+
### Componente
|
|
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')` es una cadena hasta que escribas el esquema del mensaje tú mismo; un error tipográfico renderiza la clave.
|
|
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({ es: "Contador", en: "Counter", fr: "Compteur" }),
|
|
250
|
+
increment: t({ es: "Incrementar", 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
|
+
// Obtiene el contenido del contador
|
|
264
|
+
const { label, increment } = useIntlayer("counter");
|
|
265
|
+
// Hook para formatear números
|
|
266
|
+
const number = useNumber();
|
|
267
|
+
const count = ref(0);
|
|
268
|
+
</script>
|
|
269
|
+
|
|
270
|
+
<template>
|
|
271
|
+
<div>
|
|
272
|
+
<p>{{ number.value(count) }}</p>
|
|
273
|
+
<button :aria-label="label" @click="count++">
|
|
274
|
+
{{ increment }}
|
|
275
|
+
</button>
|
|
276
|
+
</div>
|
|
277
|
+
</template>
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
`label` e `increment` están tipificados; un error tipográfico es un error de TypeScript, un valor francés faltante es un error de compilación.
|
|
281
|
+
|
|
282
|
+
### Carga lenta por locale
|
|
283
|
+
|
|
284
|
+
**vue-i18n**
|
|
285
|
+
|
|
286
|
+
```ts fileName="src/i18n.ts"
|
|
287
|
+
import { nextTick } from "vue";
|
|
288
|
+
import { createI18n } from "vue-i18n";
|
|
289
|
+
|
|
290
|
+
export const i18n = createI18n({
|
|
291
|
+
legacy: false,
|
|
292
|
+
locale: "en",
|
|
293
|
+
fallbackLocale: "en",
|
|
294
|
+
});
|
|
295
|
+
|
|
296
|
+
export const loadLocaleMessages = async (locale: string) => {
|
|
297
|
+
const messages = await import(`../locales/${locale}.json`);
|
|
298
|
+
i18n.global.setLocaleMessage(locale, messages.default);
|
|
299
|
+
await nextTick();
|
|
300
|
+
i18n.global.locale.value = locale;
|
|
301
|
+
};
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
Luego llama a `loadLocaleMessages()` desde un router guard, y divide `locales/{locale}.json` por ruta tú mismo si deseas un alcance por página.
|
|
305
|
+
|
|
306
|
+
**Intlayer**
|
|
307
|
+
|
|
308
|
+
```ts fileName="intlayer.config.ts"
|
|
309
|
+
const config: IntlayerConfig = {
|
|
310
|
+
// ...
|
|
311
|
+
dictionary: {
|
|
312
|
+
importMode: "dynamic",
|
|
313
|
+
},
|
|
314
|
+
};
|
|
315
|
+
```
|
|
316
|
+
|
|
317
|
+
## Mantener la API de vue-i18n, obtener la salida de Intlayer
|
|
318
|
+
|
|
319
|
+
`@intlayer/vue-i18n` es un adaptador listo para usar: `useI18n()`, `t()`, `d()`, `n()`, `{name}` e interpolación `{0}`, plurales con tubería (`"car | cars"`), `v-t` e `i18n.global.locale` siguen funcionando, servidos desde los diccionarios de Intlayer compilados por `vite-intlayer`.
|
|
320
|
+
|
|
321
|
+
```ts fileName="vite.config.ts"
|
|
322
|
+
import { defineConfig } from "vite";
|
|
323
|
+
import vue from "@vitejs/plugin-vue";
|
|
324
|
+
import vueI18nVitePlugin from "@intlayer/vue-i18n/plugin";
|
|
325
|
+
|
|
326
|
+
export default defineConfig({
|
|
327
|
+
plugins: [vue(), vueI18nVitePlugin()],
|
|
328
|
+
});
|
|
329
|
+
```
|
|
330
|
+
|
|
331
|
+
En el benchmark, la compilación de compatibilidad de la misma aplicación pasó de **134.9 KB a 47.0 KB** por página y de **196 KB a 8.4 KB** por componente, sin tocar los componentes. Tu `locales/{locale}.json` existente puede seguir siendo la fuente de verdad a través del complemento de sincronización JSON.
|
|
332
|
+
|
|
333
|
+
Consulta la [guía de migración de vue-i18n](https://intlayer.org/doc/migration/vue-i18n) y la [documentación de compatibilidad](https://intlayer.org/doc/compatibility/vue-i18n). Los usuarios de Nuxt tienen el mismo camino a través de la [compatibilidad con `@nuxtjs/i18n`](https://intlayer.org/doc/compatibility/nuxtjs-i18n).
|
|
334
|
+
|
|
335
|
+
## ¿Cuándo elegir cuál?
|
|
336
|
+
|
|
337
|
+
- **Elige vue-i18n** si quieres el enfoque estándar de Vue, confías en mensajes ICU o bloques `<i18n>` de SFC, ya usas `@nuxtjs/i18n`, o una plataforma de traducción espera JSON centralizado. Presupuesta el tiempo para dividir catálogos y lazy-load por ruta si el tamaño del bundle es importante.
|
|
338
|
+
- **Elige Intlayer** si quieres **contenido con scope de componente**, **TypeScript estricto**, **errores de claves faltantes en tiempo de compilación**, **tree-shaking y lazy loading sin esfuerzo**, y herramientas editoriales integradas (Visual Editor, CMS, traducción con IA, servidor MCP). Especialmente relevante para codebases grandes y modulares de Vue / Nuxt y design systems.
|
|
339
|
+
- **Elige `@intlayer/vue-i18n`** si ya estás en `vue-i18n` y quieres las ganancias de bundle sin una reescritura.
|
|
340
|
+
|
|
341
|
+
## Comparaciones relacionadas
|
|
342
|
+
|
|
343
|
+
- [next-intl vs Intlayer](https://intlayer.org/blog/next-intl-vs-intlayer) (mismo benchmark)
|
|
344
|
+
- [i18next vs Intlayer](https://intlayer.org/blog/i18next-vs-intlayer) (mismo benchmark)
|
|
345
|
+
- [Lingui vs Intlayer](https://intlayer.org/blog/lingui-vs-intlayer) (mismo benchmark)
|
|
346
|
+
- [vue-i18n vs Intlayer (características y DX)](https://intlayer.org/blog/vue-i18n-vs-intlayer)
|
|
347
|
+
- [¿Es vue-i18n obsoleto?](https://intlayer.org/blog/is-vue-i18n-outdated)
|
|
348
|
+
|
|
349
|
+
## Estrellas en GitHub
|
|
350
|
+
|
|
351
|
+
Las estrellas de GitHub son un fuerte indicador de la popularidad de un proyecto, la confianza de la comunidad y su relevancia a largo plazo. Aunque no es una medida directa de la calidad técnica, reflejan cuántos desarrolladores encuentran el proyecto útil, siguen su progreso y es probable que lo adopten.
|
|
352
|
+
|
|
353
|
+
[](https://star-history.com/#intlify/vue-i18n&aymericzip/intlayer)
|
|
354
|
+
|
|
355
|
+
## Conclusión
|
|
356
|
+
|
|
357
|
+
`vue-i18n` es maduro, flexible e integrado profundamente con Vue. El benchmark muestra el costo de su diseño orientado al runtime en una compilación de Vite: un **runtime gzip de 24 KB**, **134.9 KB por página** para una aplicación que pesa 41 KB sin i18n, **90% de contenido de página extranjera** en cada página, y componentes que alcanzan **196 KB** cada uno porque se cuelgan del árbol de mensajes global.
|
|
358
|
+
|
|
359
|
+
Intlayer traslada el trabajo al compilador. Los diccionarios por componente y la eliminación de contenido muerto son salidas de compilación, no convenciones. En la misma aplicación: **3.9 KB runtime**, **57.1 KB por página**, **0% fuga de página**, componentes **25 veces más pequeños**. Y si una reescritura no está en la mesa, `@intlayer/vue-i18n` llega la mayor parte del camino con los componentes intactos.
|
|
360
|
+
|
|
361
|
+
Todos los datos sin procesar, las aplicaciones de prueba y los scripts están en el [repositorio Benchmark Bloom](https://github.com/intlayer-org/benchmark-bloom). Ejecútalo tú mismo.
|
|
362
|
+
|
|
363
|
+
Consulta la [documentación 'Why Intlayer?'](https://intlayer.org/doc/why) para más detalles.
|