@intlayer/docs 9.5.1 → 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/history_of_i18n.md +304 -0
- 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/history_of_i18n.md +304 -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/history_of_i18n.md +304 -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/history_of_i18n.md +304 -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/history_of_i18n.md +304 -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/history_of_i18n.md +304 -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/history_of_i18n.md +304 -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/history_of_i18n.md +304 -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/history_of_i18n.md +304 -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/history_of_i18n.md +304 -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/history_of_i18n.md +304 -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/history_of_i18n.md +304 -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/history_of_i18n.md +304 -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/history_of_i18n.md +304 -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/history_of_i18n.md +304 -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/history_of_i18n.md +304 -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/history_of_i18n.md +304 -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/history_of_i18n.md +304 -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 +180 -0
- package/dist/cjs/generated/blog.entry.cjs.map +1 -1
- package/dist/cjs/generated/docs.entry.cjs +0 -20
- package/dist/cjs/generated/docs.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 +180 -0
- package/dist/esm/generated/blog.entry.mjs.map +1 -1
- package/dist/esm/generated/docs.entry.mjs +0 -20
- package/dist/esm/generated/docs.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 +9 -0
- package/dist/types/generated/blog.entry.d.ts.map +1 -1
- package/dist/types/generated/docs.entry.d.ts +0 -1
- package/dist/types/generated/docs.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/index.md +4 -1
- package/docs/ar/benchmark/nextjs.md +33 -28
- package/docs/ar/benchmark/solid.md +14 -11
- package/docs/ar/benchmark/svelte.md +13 -10
- package/docs/ar/benchmark/tanstack.md +30 -25
- package/docs/ar/benchmark/vue.md +12 -8
- package/docs/ar/cli/build.md +8 -1
- package/docs/ar/cli/configuration.md +3 -1
- package/docs/ar/cli/doc-review.md +8 -1
- package/docs/ar/cli/doc-translate.md +5 -1
- package/docs/ar/cli/extract.md +2 -1
- package/docs/ar/cli/fill.md +5 -1
- package/docs/ar/cli/index.md +4 -5
- package/docs/ar/cli/live.md +5 -1
- package/docs/ar/cli/login.md +2 -2
- package/docs/ar/cli/pull.md +5 -1
- package/docs/ar/cli/push.md +5 -1
- package/docs/ar/cli/scan.md +5 -1
- package/docs/ar/cli/standalone.md +5 -1
- package/docs/ar/cli/test.md +5 -1
- package/docs/ar/cli/watch.md +5 -1
- package/docs/ar/compat/i18n-js.md +1 -1
- package/docs/ar/compat/i18next.md +1 -1
- package/docs/ar/compat/lingui.md +1 -1
- package/docs/ar/compat/next-i18next.md +1 -1
- package/docs/ar/compat/next-intl.md +1 -1
- package/docs/ar/compat/next-translate.md +1 -1
- package/docs/ar/compat/ngx-translate.md +1 -1
- package/docs/ar/compat/nuxtjs-i18n.md +1 -1
- package/docs/ar/compat/polyglot.md +1 -1
- package/docs/ar/compat/react-i18next.md +1 -1
- package/docs/ar/compat/react-intl.md +1 -1
- package/docs/ar/compat/svelte-i18n.md +1 -1
- package/docs/ar/compat/transloco.md +1 -1
- package/docs/ar/compat/vue-i18n.md +1 -1
- package/docs/ar/interest_of_intlayer.md +1 -1
- package/docs/ar/intlayer_with_remix_3.md +543 -0
- package/docs/bn/cli/index.md +4 -5
- package/docs/bn/cli/scan.md +5 -1
- package/docs/bn/cli/standalone.md +5 -1
- package/docs/bn/interest_of_intlayer.md +1 -1
- package/docs/cs/cli/index.md +4 -5
- package/docs/cs/cli/scan.md +5 -1
- package/docs/cs/cli/standalone.md +5 -1
- package/docs/cs/interest_of_intlayer.md +1 -1
- package/docs/de/benchmark/index.md +4 -1
- package/docs/de/benchmark/nextjs.md +33 -28
- package/docs/de/benchmark/solid.md +14 -11
- package/docs/de/benchmark/svelte.md +13 -10
- package/docs/de/benchmark/tanstack.md +30 -25
- package/docs/de/benchmark/vue.md +12 -8
- package/docs/de/cli/build.md +8 -1
- package/docs/de/cli/configuration.md +3 -1
- package/docs/de/cli/doc-review.md +8 -1
- package/docs/de/cli/doc-translate.md +5 -1
- package/docs/de/cli/extract.md +2 -1
- package/docs/de/cli/fill.md +5 -1
- package/docs/de/cli/index.md +4 -5
- package/docs/de/cli/live.md +5 -1
- package/docs/de/cli/login.md +2 -2
- package/docs/de/cli/pull.md +5 -1
- package/docs/de/cli/push.md +5 -1
- package/docs/de/cli/scan.md +5 -1
- package/docs/de/cli/standalone.md +5 -1
- package/docs/de/cli/test.md +5 -1
- package/docs/de/cli/watch.md +5 -1
- package/docs/de/compat/i18n-js.md +1 -1
- package/docs/de/compat/i18next.md +1 -1
- package/docs/de/compat/lingui.md +1 -1
- package/docs/de/compat/next-i18next.md +1 -1
- package/docs/de/compat/next-intl.md +1 -1
- package/docs/de/compat/next-translate.md +1 -1
- package/docs/de/compat/ngx-translate.md +1 -1
- package/docs/de/compat/nuxtjs-i18n.md +1 -1
- package/docs/de/compat/polyglot.md +1 -1
- package/docs/de/compat/react-i18next.md +1 -1
- package/docs/de/compat/react-intl.md +1 -1
- package/docs/de/compat/svelte-i18n.md +1 -1
- package/docs/de/compat/transloco.md +1 -1
- package/docs/de/compat/vue-i18n.md +1 -1
- package/docs/de/interest_of_intlayer.md +1 -1
- package/docs/de/intlayer_with_remix_3.md +543 -0
- package/docs/en/benchmark/index.md +4 -1
- package/docs/en/benchmark/nextjs.md +33 -28
- package/docs/en/benchmark/solid.md +14 -11
- package/docs/en/benchmark/svelte.md +13 -10
- package/docs/en/benchmark/tanstack.md +31 -26
- package/docs/en/benchmark/vue.md +12 -8
- package/docs/en/cli/build.md +8 -1
- package/docs/en/cli/configuration.md +3 -1
- package/docs/en/cli/doc-review.md +8 -1
- package/docs/en/cli/doc-translate.md +5 -1
- package/docs/en/cli/extract.md +2 -1
- package/docs/en/cli/fill.md +5 -1
- package/docs/en/cli/index.md +4 -5
- package/docs/en/cli/live.md +5 -1
- package/docs/en/cli/login.md +2 -2
- package/docs/en/cli/pull.md +5 -1
- package/docs/en/cli/push.md +5 -1
- package/docs/en/cli/scan.md +5 -1
- package/docs/en/cli/standalone.md +5 -1
- package/docs/en/cli/test.md +5 -1
- package/docs/en/cli/watch.md +5 -1
- package/docs/en/compat/i18n-js.md +1 -1
- package/docs/en/compat/i18next.md +1 -1
- package/docs/en/compat/lingui.md +1 -1
- package/docs/en/compat/next-i18next.md +1 -1
- package/docs/en/compat/next-intl.md +1 -1
- package/docs/en/compat/next-translate.md +1 -1
- package/docs/en/compat/ngx-translate.md +1 -1
- package/docs/en/compat/nuxtjs-i18n.md +1 -1
- package/docs/en/compat/polyglot.md +1 -1
- package/docs/en/compat/react-i18next.md +1 -1
- package/docs/en/compat/react-intl.md +1 -1
- package/docs/en/compat/svelte-i18n.md +1 -1
- package/docs/en/compat/transloco.md +1 -1
- package/docs/en/compat/vue-i18n.md +1 -1
- package/docs/en/interest_of_intlayer.md +1 -1
- package/docs/en/intlayer_with_remix_3.md +103 -71
- package/docs/en-GB/benchmark/index.md +4 -1
- package/docs/en-GB/benchmark/nextjs.md +33 -28
- package/docs/en-GB/benchmark/solid.md +14 -11
- package/docs/en-GB/benchmark/svelte.md +13 -10
- package/docs/en-GB/benchmark/tanstack.md +30 -25
- package/docs/en-GB/benchmark/vue.md +12 -8
- package/docs/en-GB/cli/build.md +8 -1
- package/docs/en-GB/cli/configuration.md +3 -1
- package/docs/en-GB/cli/doc-review.md +8 -1
- package/docs/en-GB/cli/doc-translate.md +5 -1
- package/docs/en-GB/cli/extract.md +2 -1
- package/docs/en-GB/cli/fill.md +5 -1
- package/docs/en-GB/cli/index.md +4 -5
- package/docs/en-GB/cli/live.md +5 -1
- package/docs/en-GB/cli/login.md +2 -2
- package/docs/en-GB/cli/pull.md +5 -1
- package/docs/en-GB/cli/push.md +5 -1
- package/docs/en-GB/cli/scan.md +5 -1
- package/docs/en-GB/cli/standalone.md +5 -1
- package/docs/en-GB/cli/test.md +5 -1
- package/docs/en-GB/cli/watch.md +5 -1
- package/docs/en-GB/compat/i18n-js.md +1 -1
- package/docs/en-GB/compat/i18next.md +1 -1
- package/docs/en-GB/compat/lingui.md +1 -1
- package/docs/en-GB/compat/next-i18next.md +1 -1
- package/docs/en-GB/compat/next-intl.md +1 -1
- package/docs/en-GB/compat/next-translate.md +1 -1
- package/docs/en-GB/compat/ngx-translate.md +1 -1
- package/docs/en-GB/compat/nuxtjs-i18n.md +1 -1
- package/docs/en-GB/compat/polyglot.md +1 -1
- package/docs/en-GB/compat/react-i18next.md +1 -1
- package/docs/en-GB/compat/react-intl.md +1 -1
- package/docs/en-GB/compat/svelte-i18n.md +1 -1
- package/docs/en-GB/compat/transloco.md +1 -1
- package/docs/en-GB/compat/vue-i18n.md +1 -1
- package/docs/en-GB/interest_of_intlayer.md +1 -1
- package/docs/en-GB/intlayer_with_remix_3.md +558 -0
- package/docs/es/benchmark/index.md +4 -1
- package/docs/es/benchmark/nextjs.md +33 -28
- package/docs/es/benchmark/solid.md +14 -11
- package/docs/es/benchmark/svelte.md +13 -10
- package/docs/es/benchmark/tanstack.md +30 -25
- package/docs/es/benchmark/vue.md +12 -8
- package/docs/es/cli/build.md +8 -1
- package/docs/es/cli/configuration.md +3 -1
- package/docs/es/cli/doc-review.md +8 -1
- package/docs/es/cli/doc-translate.md +5 -1
- package/docs/es/cli/extract.md +2 -1
- package/docs/es/cli/fill.md +5 -1
- package/docs/es/cli/index.md +4 -5
- package/docs/es/cli/live.md +5 -1
- package/docs/es/cli/login.md +2 -2
- package/docs/es/cli/pull.md +5 -1
- package/docs/es/cli/push.md +5 -1
- package/docs/es/cli/scan.md +5 -1
- package/docs/es/cli/standalone.md +5 -1
- package/docs/es/cli/test.md +5 -1
- package/docs/es/cli/watch.md +5 -1
- package/docs/es/compat/i18n-js.md +1 -1
- package/docs/es/compat/i18next.md +1 -1
- package/docs/es/compat/lingui.md +1 -1
- package/docs/es/compat/next-i18next.md +1 -1
- package/docs/es/compat/next-intl.md +1 -1
- package/docs/es/compat/next-translate.md +1 -1
- package/docs/es/compat/ngx-translate.md +1 -1
- package/docs/es/compat/nuxtjs-i18n.md +1 -1
- package/docs/es/compat/polyglot.md +1 -1
- package/docs/es/compat/react-i18next.md +1 -1
- package/docs/es/compat/react-intl.md +1 -1
- package/docs/es/compat/svelte-i18n.md +1 -1
- package/docs/es/compat/transloco.md +1 -1
- package/docs/es/compat/vue-i18n.md +1 -1
- package/docs/es/interest_of_intlayer.md +1 -1
- package/docs/es/intlayer_with_remix_3.md +540 -0
- package/docs/fr/benchmark/index.md +4 -1
- package/docs/fr/benchmark/nextjs.md +33 -28
- package/docs/fr/benchmark/solid.md +14 -11
- package/docs/fr/benchmark/svelte.md +13 -10
- package/docs/fr/benchmark/tanstack.md +30 -25
- package/docs/fr/benchmark/vue.md +12 -8
- package/docs/fr/cli/build.md +8 -1
- package/docs/fr/cli/configuration.md +3 -1
- package/docs/fr/cli/doc-review.md +8 -1
- package/docs/fr/cli/doc-translate.md +5 -1
- package/docs/fr/cli/extract.md +2 -1
- package/docs/fr/cli/fill.md +5 -1
- package/docs/fr/cli/index.md +4 -5
- package/docs/fr/cli/live.md +5 -1
- package/docs/fr/cli/login.md +2 -2
- package/docs/fr/cli/pull.md +5 -1
- package/docs/fr/cli/push.md +5 -1
- package/docs/fr/cli/scan.md +5 -1
- package/docs/fr/cli/standalone.md +5 -1
- package/docs/fr/cli/test.md +5 -1
- package/docs/fr/cli/watch.md +5 -1
- package/docs/fr/compat/i18n-js.md +1 -1
- package/docs/fr/compat/i18next.md +1 -1
- package/docs/fr/compat/lingui.md +1 -1
- package/docs/fr/compat/next-i18next.md +1 -1
- package/docs/fr/compat/next-intl.md +1 -1
- package/docs/fr/compat/next-translate.md +1 -1
- package/docs/fr/compat/ngx-translate.md +1 -1
- package/docs/fr/compat/nuxtjs-i18n.md +1 -1
- package/docs/fr/compat/polyglot.md +1 -1
- package/docs/fr/compat/react-i18next.md +1 -1
- package/docs/fr/compat/react-intl.md +1 -1
- package/docs/fr/compat/svelte-i18n.md +1 -1
- package/docs/fr/compat/transloco.md +1 -1
- package/docs/fr/compat/vue-i18n.md +1 -1
- package/docs/fr/interest_of_intlayer.md +1 -1
- package/docs/fr/intlayer_with_remix_3.md +540 -0
- package/docs/hi/benchmark/index.md +4 -1
- package/docs/hi/benchmark/nextjs.md +33 -28
- package/docs/hi/benchmark/solid.md +14 -11
- package/docs/hi/benchmark/svelte.md +13 -10
- package/docs/hi/benchmark/tanstack.md +30 -25
- package/docs/hi/benchmark/vue.md +12 -8
- package/docs/hi/cli/build.md +8 -1
- package/docs/hi/cli/configuration.md +3 -1
- package/docs/hi/cli/doc-review.md +8 -1
- package/docs/hi/cli/doc-translate.md +5 -1
- package/docs/hi/cli/extract.md +2 -1
- package/docs/hi/cli/fill.md +5 -1
- package/docs/hi/cli/index.md +4 -5
- package/docs/hi/cli/live.md +5 -1
- package/docs/hi/cli/login.md +2 -2
- package/docs/hi/cli/pull.md +5 -1
- package/docs/hi/cli/push.md +5 -1
- package/docs/hi/cli/scan.md +5 -1
- package/docs/hi/cli/standalone.md +5 -1
- package/docs/hi/cli/test.md +5 -1
- package/docs/hi/cli/watch.md +5 -1
- package/docs/hi/compat/i18n-js.md +1 -1
- package/docs/hi/compat/i18next.md +1 -1
- package/docs/hi/compat/lingui.md +1 -1
- package/docs/hi/compat/next-i18next.md +1 -1
- package/docs/hi/compat/next-intl.md +1 -1
- package/docs/hi/compat/next-translate.md +1 -1
- package/docs/hi/compat/ngx-translate.md +1 -1
- package/docs/hi/compat/nuxtjs-i18n.md +1 -1
- package/docs/hi/compat/polyglot.md +1 -1
- package/docs/hi/compat/react-i18next.md +1 -1
- package/docs/hi/compat/react-intl.md +1 -1
- package/docs/hi/compat/svelte-i18n.md +1 -1
- package/docs/hi/compat/transloco.md +1 -1
- package/docs/hi/compat/vue-i18n.md +1 -1
- package/docs/hi/interest_of_intlayer.md +1 -1
- package/docs/hi/intlayer_with_remix_3.md +543 -0
- package/docs/id/benchmark/index.md +4 -1
- package/docs/id/benchmark/nextjs.md +33 -28
- package/docs/id/benchmark/solid.md +14 -11
- package/docs/id/benchmark/svelte.md +13 -10
- package/docs/id/benchmark/tanstack.md +30 -25
- package/docs/id/benchmark/vue.md +12 -8
- package/docs/id/cli/build.md +8 -1
- package/docs/id/cli/configuration.md +3 -1
- package/docs/id/cli/doc-review.md +8 -1
- package/docs/id/cli/doc-translate.md +5 -1
- package/docs/id/cli/extract.md +2 -1
- package/docs/id/cli/fill.md +5 -1
- package/docs/id/cli/index.md +4 -5
- package/docs/id/cli/live.md +5 -1
- package/docs/id/cli/login.md +2 -2
- package/docs/id/cli/pull.md +5 -1
- package/docs/id/cli/push.md +5 -1
- package/docs/id/cli/scan.md +5 -1
- package/docs/id/cli/standalone.md +5 -1
- package/docs/id/cli/test.md +5 -1
- package/docs/id/cli/watch.md +5 -1
- package/docs/id/compat/i18n-js.md +1 -1
- package/docs/id/compat/i18next.md +1 -1
- package/docs/id/compat/lingui.md +1 -1
- package/docs/id/compat/next-i18next.md +1 -1
- package/docs/id/compat/next-intl.md +1 -1
- package/docs/id/compat/next-translate.md +1 -1
- package/docs/id/compat/ngx-translate.md +1 -1
- package/docs/id/compat/nuxtjs-i18n.md +1 -1
- package/docs/id/compat/polyglot.md +1 -1
- package/docs/id/compat/react-i18next.md +1 -1
- package/docs/id/compat/react-intl.md +1 -1
- package/docs/id/compat/svelte-i18n.md +1 -1
- package/docs/id/compat/transloco.md +1 -1
- package/docs/id/compat/vue-i18n.md +1 -1
- package/docs/id/interest_of_intlayer.md +1 -1
- package/docs/id/intlayer_with_remix_3.md +566 -0
- package/docs/it/benchmark/index.md +4 -1
- package/docs/it/benchmark/nextjs.md +33 -28
- package/docs/it/benchmark/solid.md +14 -11
- package/docs/it/benchmark/svelte.md +13 -10
- package/docs/it/benchmark/tanstack.md +30 -25
- package/docs/it/benchmark/vue.md +12 -8
- package/docs/it/cli/build.md +8 -1
- package/docs/it/cli/configuration.md +3 -1
- package/docs/it/cli/doc-review.md +8 -1
- package/docs/it/cli/doc-translate.md +5 -1
- package/docs/it/cli/extract.md +2 -1
- package/docs/it/cli/fill.md +5 -1
- package/docs/it/cli/index.md +4 -5
- package/docs/it/cli/live.md +5 -1
- package/docs/it/cli/login.md +2 -2
- package/docs/it/cli/pull.md +5 -1
- package/docs/it/cli/push.md +5 -1
- package/docs/it/cli/scan.md +5 -1
- package/docs/it/cli/standalone.md +5 -1
- package/docs/it/cli/test.md +5 -1
- package/docs/it/cli/watch.md +5 -1
- package/docs/it/compat/i18n-js.md +1 -1
- package/docs/it/compat/i18next.md +1 -1
- package/docs/it/compat/lingui.md +1 -1
- package/docs/it/compat/next-i18next.md +1 -1
- package/docs/it/compat/next-intl.md +1 -1
- package/docs/it/compat/next-translate.md +1 -1
- package/docs/it/compat/ngx-translate.md +1 -1
- package/docs/it/compat/nuxtjs-i18n.md +1 -1
- package/docs/it/compat/polyglot.md +1 -1
- package/docs/it/compat/react-i18next.md +1 -1
- package/docs/it/compat/react-intl.md +1 -1
- package/docs/it/compat/svelte-i18n.md +1 -1
- package/docs/it/compat/transloco.md +1 -1
- package/docs/it/compat/vue-i18n.md +1 -1
- package/docs/it/interest_of_intlayer.md +1 -1
- package/docs/it/intlayer_with_remix_3.md +558 -0
- package/docs/ja/benchmark/index.md +4 -1
- package/docs/ja/benchmark/nextjs.md +33 -28
- package/docs/ja/benchmark/solid.md +14 -11
- package/docs/ja/benchmark/svelte.md +13 -10
- package/docs/ja/benchmark/tanstack.md +30 -25
- package/docs/ja/benchmark/vue.md +12 -8
- package/docs/ja/cli/build.md +8 -1
- package/docs/ja/cli/configuration.md +3 -1
- package/docs/ja/cli/doc-review.md +8 -1
- package/docs/ja/cli/doc-translate.md +5 -1
- package/docs/ja/cli/extract.md +2 -1
- package/docs/ja/cli/fill.md +5 -1
- package/docs/ja/cli/index.md +4 -5
- package/docs/ja/cli/live.md +5 -1
- package/docs/ja/cli/login.md +2 -2
- package/docs/ja/cli/pull.md +5 -1
- package/docs/ja/cli/push.md +5 -1
- package/docs/ja/cli/scan.md +5 -1
- package/docs/ja/cli/standalone.md +5 -1
- package/docs/ja/cli/test.md +5 -1
- package/docs/ja/cli/watch.md +5 -1
- package/docs/ja/compat/i18n-js.md +1 -1
- package/docs/ja/compat/i18next.md +1 -1
- package/docs/ja/compat/lingui.md +1 -1
- package/docs/ja/compat/next-i18next.md +1 -1
- package/docs/ja/compat/next-intl.md +1 -1
- package/docs/ja/compat/next-translate.md +1 -1
- package/docs/ja/compat/ngx-translate.md +1 -1
- package/docs/ja/compat/nuxtjs-i18n.md +1 -1
- package/docs/ja/compat/polyglot.md +1 -1
- package/docs/ja/compat/react-i18next.md +1 -1
- package/docs/ja/compat/react-intl.md +1 -1
- package/docs/ja/compat/svelte-i18n.md +1 -1
- package/docs/ja/compat/transloco.md +1 -1
- package/docs/ja/compat/vue-i18n.md +1 -1
- package/docs/ja/interest_of_intlayer.md +1 -1
- package/docs/ja/intlayer_with_remix_3.md +558 -0
- package/docs/ko/benchmark/index.md +4 -1
- package/docs/ko/benchmark/nextjs.md +33 -28
- package/docs/ko/benchmark/solid.md +14 -11
- package/docs/ko/benchmark/svelte.md +13 -10
- package/docs/ko/benchmark/tanstack.md +30 -25
- package/docs/ko/benchmark/vue.md +12 -8
- package/docs/ko/cli/build.md +8 -1
- package/docs/ko/cli/configuration.md +3 -1
- package/docs/ko/cli/doc-review.md +8 -1
- package/docs/ko/cli/doc-translate.md +5 -1
- package/docs/ko/cli/extract.md +2 -1
- package/docs/ko/cli/fill.md +5 -1
- package/docs/ko/cli/index.md +4 -5
- package/docs/ko/cli/live.md +5 -1
- package/docs/ko/cli/login.md +2 -2
- package/docs/ko/cli/pull.md +5 -1
- package/docs/ko/cli/push.md +5 -1
- package/docs/ko/cli/scan.md +5 -1
- package/docs/ko/cli/standalone.md +5 -1
- package/docs/ko/cli/test.md +5 -1
- package/docs/ko/cli/watch.md +5 -1
- package/docs/ko/compat/i18n-js.md +1 -1
- package/docs/ko/compat/i18next.md +1 -1
- package/docs/ko/compat/lingui.md +1 -1
- package/docs/ko/compat/next-i18next.md +1 -1
- package/docs/ko/compat/next-intl.md +1 -1
- package/docs/ko/compat/next-translate.md +1 -1
- package/docs/ko/compat/ngx-translate.md +1 -1
- package/docs/ko/compat/nuxtjs-i18n.md +1 -1
- package/docs/ko/compat/polyglot.md +1 -1
- package/docs/ko/compat/react-i18next.md +1 -1
- package/docs/ko/compat/react-intl.md +1 -1
- package/docs/ko/compat/svelte-i18n.md +1 -1
- package/docs/ko/compat/transloco.md +1 -1
- package/docs/ko/compat/vue-i18n.md +1 -1
- package/docs/ko/interest_of_intlayer.md +1 -1
- package/docs/ko/intlayer_with_remix_3.md +543 -0
- package/docs/nl/cli/index.md +4 -5
- package/docs/nl/cli/scan.md +5 -1
- package/docs/nl/cli/standalone.md +5 -1
- package/docs/nl/interest_of_intlayer.md +1 -1
- package/docs/pl/benchmark/index.md +4 -1
- package/docs/pl/benchmark/nextjs.md +33 -28
- package/docs/pl/benchmark/solid.md +14 -11
- package/docs/pl/benchmark/svelte.md +13 -10
- package/docs/pl/benchmark/tanstack.md +30 -25
- package/docs/pl/benchmark/vue.md +12 -8
- package/docs/pl/cli/build.md +8 -1
- package/docs/pl/cli/configuration.md +3 -1
- package/docs/pl/cli/doc-review.md +8 -1
- package/docs/pl/cli/doc-translate.md +5 -1
- package/docs/pl/cli/extract.md +2 -1
- package/docs/pl/cli/fill.md +5 -1
- package/docs/pl/cli/index.md +4 -5
- package/docs/pl/cli/live.md +5 -1
- package/docs/pl/cli/login.md +2 -2
- package/docs/pl/cli/pull.md +5 -1
- package/docs/pl/cli/push.md +5 -1
- package/docs/pl/cli/scan.md +5 -1
- package/docs/pl/cli/standalone.md +5 -1
- package/docs/pl/cli/test.md +5 -1
- package/docs/pl/cli/watch.md +5 -1
- package/docs/pl/compat/i18n-js.md +1 -1
- package/docs/pl/compat/i18next.md +1 -1
- package/docs/pl/compat/lingui.md +1 -1
- package/docs/pl/compat/next-i18next.md +1 -1
- package/docs/pl/compat/next-intl.md +1 -1
- package/docs/pl/compat/next-translate.md +1 -1
- package/docs/pl/compat/ngx-translate.md +1 -1
- package/docs/pl/compat/nuxtjs-i18n.md +1 -1
- package/docs/pl/compat/polyglot.md +1 -1
- package/docs/pl/compat/react-i18next.md +1 -1
- package/docs/pl/compat/react-intl.md +1 -1
- package/docs/pl/compat/svelte-i18n.md +1 -1
- package/docs/pl/compat/transloco.md +1 -1
- package/docs/pl/compat/vue-i18n.md +1 -1
- package/docs/pl/interest_of_intlayer.md +1 -1
- package/docs/pl/intlayer_with_remix_3.md +551 -0
- package/docs/pt/benchmark/index.md +4 -1
- package/docs/pt/benchmark/nextjs.md +33 -28
- package/docs/pt/benchmark/solid.md +14 -11
- package/docs/pt/benchmark/svelte.md +13 -10
- package/docs/pt/benchmark/tanstack.md +30 -25
- package/docs/pt/benchmark/vue.md +12 -8
- package/docs/pt/cli/build.md +8 -1
- package/docs/pt/cli/configuration.md +3 -1
- package/docs/pt/cli/doc-review.md +8 -1
- package/docs/pt/cli/doc-translate.md +5 -1
- package/docs/pt/cli/extract.md +2 -1
- package/docs/pt/cli/fill.md +5 -1
- package/docs/pt/cli/index.md +4 -5
- package/docs/pt/cli/live.md +5 -1
- package/docs/pt/cli/login.md +2 -2
- package/docs/pt/cli/pull.md +5 -1
- package/docs/pt/cli/push.md +5 -1
- package/docs/pt/cli/scan.md +5 -1
- package/docs/pt/cli/standalone.md +5 -1
- package/docs/pt/cli/test.md +5 -1
- package/docs/pt/cli/watch.md +5 -1
- package/docs/pt/compat/i18n-js.md +1 -1
- package/docs/pt/compat/i18next.md +1 -1
- package/docs/pt/compat/lingui.md +1 -1
- package/docs/pt/compat/next-i18next.md +1 -1
- package/docs/pt/compat/next-intl.md +1 -1
- package/docs/pt/compat/next-translate.md +1 -1
- package/docs/pt/compat/ngx-translate.md +1 -1
- package/docs/pt/compat/nuxtjs-i18n.md +1 -1
- package/docs/pt/compat/polyglot.md +1 -1
- package/docs/pt/compat/react-i18next.md +1 -1
- package/docs/pt/compat/react-intl.md +1 -1
- package/docs/pt/compat/svelte-i18n.md +1 -1
- package/docs/pt/compat/transloco.md +1 -1
- package/docs/pt/compat/vue-i18n.md +1 -1
- package/docs/pt/interest_of_intlayer.md +1 -1
- package/docs/pt/intlayer_with_remix_3.md +558 -0
- package/docs/ru/benchmark/index.md +4 -1
- package/docs/ru/benchmark/nextjs.md +33 -28
- package/docs/ru/benchmark/solid.md +14 -11
- package/docs/ru/benchmark/svelte.md +13 -10
- package/docs/ru/benchmark/tanstack.md +30 -25
- package/docs/ru/benchmark/vue.md +12 -8
- package/docs/ru/cli/build.md +8 -1
- package/docs/ru/cli/configuration.md +3 -1
- package/docs/ru/cli/doc-review.md +8 -1
- package/docs/ru/cli/doc-translate.md +5 -1
- package/docs/ru/cli/extract.md +2 -1
- package/docs/ru/cli/fill.md +5 -1
- package/docs/ru/cli/index.md +4 -5
- package/docs/ru/cli/live.md +5 -1
- package/docs/ru/cli/login.md +2 -2
- package/docs/ru/cli/pull.md +5 -1
- package/docs/ru/cli/push.md +5 -1
- package/docs/ru/cli/scan.md +5 -1
- package/docs/ru/cli/standalone.md +5 -1
- package/docs/ru/cli/test.md +5 -1
- package/docs/ru/cli/watch.md +5 -1
- package/docs/ru/compat/i18n-js.md +1 -1
- package/docs/ru/compat/i18next.md +1 -1
- package/docs/ru/compat/lingui.md +1 -1
- package/docs/ru/compat/next-i18next.md +1 -1
- package/docs/ru/compat/next-intl.md +1 -1
- package/docs/ru/compat/next-translate.md +1 -1
- package/docs/ru/compat/ngx-translate.md +1 -1
- package/docs/ru/compat/nuxtjs-i18n.md +1 -1
- package/docs/ru/compat/polyglot.md +1 -1
- package/docs/ru/compat/react-i18next.md +1 -1
- package/docs/ru/compat/react-intl.md +1 -1
- package/docs/ru/compat/svelte-i18n.md +1 -1
- package/docs/ru/compat/transloco.md +1 -1
- package/docs/ru/compat/vue-i18n.md +1 -1
- package/docs/ru/interest_of_intlayer.md +1 -1
- package/docs/ru/intlayer_with_remix_3.md +558 -0
- package/docs/tr/benchmark/index.md +4 -1
- package/docs/tr/benchmark/nextjs.md +33 -28
- package/docs/tr/benchmark/solid.md +14 -11
- package/docs/tr/benchmark/svelte.md +13 -10
- package/docs/tr/benchmark/tanstack.md +30 -25
- package/docs/tr/benchmark/vue.md +12 -8
- package/docs/tr/cli/build.md +8 -1
- package/docs/tr/cli/configuration.md +3 -1
- package/docs/tr/cli/doc-review.md +8 -1
- package/docs/tr/cli/doc-translate.md +5 -1
- package/docs/tr/cli/extract.md +2 -1
- package/docs/tr/cli/fill.md +5 -1
- package/docs/tr/cli/index.md +4 -5
- package/docs/tr/cli/live.md +5 -1
- package/docs/tr/cli/login.md +2 -2
- package/docs/tr/cli/pull.md +5 -1
- package/docs/tr/cli/push.md +5 -1
- package/docs/tr/cli/scan.md +5 -1
- package/docs/tr/cli/standalone.md +5 -1
- package/docs/tr/cli/test.md +5 -1
- package/docs/tr/cli/watch.md +5 -1
- package/docs/tr/compat/i18n-js.md +1 -1
- package/docs/tr/compat/i18next.md +1 -1
- package/docs/tr/compat/lingui.md +1 -1
- package/docs/tr/compat/next-i18next.md +1 -1
- package/docs/tr/compat/next-intl.md +1 -1
- package/docs/tr/compat/next-translate.md +1 -1
- package/docs/tr/compat/ngx-translate.md +1 -1
- package/docs/tr/compat/nuxtjs-i18n.md +1 -1
- package/docs/tr/compat/polyglot.md +1 -1
- package/docs/tr/compat/react-i18next.md +1 -1
- package/docs/tr/compat/react-intl.md +1 -1
- package/docs/tr/compat/svelte-i18n.md +1 -1
- package/docs/tr/compat/transloco.md +1 -1
- package/docs/tr/compat/vue-i18n.md +1 -1
- package/docs/tr/interest_of_intlayer.md +1 -1
- package/docs/tr/intlayer_with_remix_3.md +566 -0
- package/docs/uk/benchmark/index.md +4 -1
- package/docs/uk/benchmark/nextjs.md +33 -28
- package/docs/uk/benchmark/solid.md +14 -11
- package/docs/uk/benchmark/svelte.md +13 -10
- package/docs/uk/benchmark/tanstack.md +30 -25
- package/docs/uk/benchmark/vue.md +12 -8
- package/docs/uk/cli/build.md +8 -1
- package/docs/uk/cli/configuration.md +3 -1
- package/docs/uk/cli/doc-review.md +8 -1
- package/docs/uk/cli/doc-translate.md +5 -1
- package/docs/uk/cli/extract.md +2 -1
- package/docs/uk/cli/fill.md +5 -1
- package/docs/uk/cli/index.md +4 -5
- package/docs/uk/cli/live.md +5 -1
- package/docs/uk/cli/login.md +2 -2
- package/docs/uk/cli/pull.md +5 -1
- package/docs/uk/cli/push.md +5 -1
- package/docs/uk/cli/scan.md +5 -1
- package/docs/uk/cli/standalone.md +5 -1
- package/docs/uk/cli/test.md +5 -1
- package/docs/uk/cli/watch.md +5 -1
- package/docs/uk/compat/i18n-js.md +1 -1
- package/docs/uk/compat/i18next.md +1 -1
- package/docs/uk/compat/lingui.md +1 -1
- package/docs/uk/compat/next-i18next.md +1 -1
- package/docs/uk/compat/next-intl.md +1 -1
- package/docs/uk/compat/next-translate.md +1 -1
- package/docs/uk/compat/ngx-translate.md +1 -1
- package/docs/uk/compat/nuxtjs-i18n.md +1 -1
- package/docs/uk/compat/polyglot.md +1 -1
- package/docs/uk/compat/react-i18next.md +1 -1
- package/docs/uk/compat/react-intl.md +1 -1
- package/docs/uk/compat/svelte-i18n.md +1 -1
- package/docs/uk/compat/transloco.md +1 -1
- package/docs/uk/compat/vue-i18n.md +1 -1
- package/docs/uk/interest_of_intlayer.md +1 -1
- package/docs/uk/intlayer_with_remix_3.md +566 -0
- package/docs/ur/cli/index.md +4 -5
- package/docs/ur/cli/scan.md +5 -1
- package/docs/ur/cli/standalone.md +5 -1
- package/docs/ur/interest_of_intlayer.md +1 -1
- package/docs/vi/benchmark/index.md +4 -1
- package/docs/vi/benchmark/nextjs.md +33 -28
- package/docs/vi/benchmark/solid.md +14 -11
- package/docs/vi/benchmark/svelte.md +13 -10
- package/docs/vi/benchmark/tanstack.md +30 -25
- package/docs/vi/benchmark/vue.md +12 -8
- package/docs/vi/cli/build.md +8 -1
- package/docs/vi/cli/configuration.md +3 -1
- package/docs/vi/cli/doc-review.md +8 -1
- package/docs/vi/cli/doc-translate.md +5 -1
- package/docs/vi/cli/extract.md +2 -1
- package/docs/vi/cli/fill.md +5 -1
- package/docs/vi/cli/index.md +4 -5
- package/docs/vi/cli/live.md +5 -1
- package/docs/vi/cli/login.md +2 -2
- package/docs/vi/cli/pull.md +5 -1
- package/docs/vi/cli/push.md +5 -1
- package/docs/vi/cli/scan.md +5 -1
- package/docs/vi/cli/standalone.md +5 -1
- package/docs/vi/cli/test.md +5 -1
- package/docs/vi/cli/watch.md +5 -1
- package/docs/vi/compat/i18n-js.md +1 -1
- package/docs/vi/compat/i18next.md +1 -1
- package/docs/vi/compat/lingui.md +1 -1
- package/docs/vi/compat/next-i18next.md +1 -1
- package/docs/vi/compat/next-intl.md +1 -1
- package/docs/vi/compat/next-translate.md +1 -1
- package/docs/vi/compat/ngx-translate.md +1 -1
- package/docs/vi/compat/nuxtjs-i18n.md +1 -1
- package/docs/vi/compat/polyglot.md +1 -1
- package/docs/vi/compat/react-i18next.md +1 -1
- package/docs/vi/compat/react-intl.md +1 -1
- package/docs/vi/compat/svelte-i18n.md +1 -1
- package/docs/vi/compat/transloco.md +1 -1
- package/docs/vi/compat/vue-i18n.md +1 -1
- package/docs/vi/interest_of_intlayer.md +1 -1
- package/docs/vi/intlayer_with_remix_3.md +566 -0
- package/docs/zh/benchmark/index.md +4 -1
- package/docs/zh/benchmark/nextjs.md +33 -28
- package/docs/zh/benchmark/solid.md +14 -11
- package/docs/zh/benchmark/svelte.md +13 -10
- package/docs/zh/benchmark/tanstack.md +30 -25
- package/docs/zh/benchmark/vue.md +12 -8
- package/docs/zh/cli/build.md +8 -1
- package/docs/zh/cli/configuration.md +3 -1
- package/docs/zh/cli/doc-review.md +8 -1
- package/docs/zh/cli/doc-translate.md +5 -1
- package/docs/zh/cli/extract.md +2 -1
- package/docs/zh/cli/fill.md +5 -1
- package/docs/zh/cli/index.md +4 -5
- package/docs/zh/cli/live.md +5 -1
- package/docs/zh/cli/login.md +2 -2
- package/docs/zh/cli/pull.md +5 -1
- package/docs/zh/cli/push.md +5 -1
- package/docs/zh/cli/scan.md +5 -1
- package/docs/zh/cli/standalone.md +5 -1
- package/docs/zh/cli/test.md +5 -1
- package/docs/zh/cli/watch.md +5 -1
- package/docs/zh/compat/i18n-js.md +1 -1
- package/docs/zh/compat/i18next.md +1 -1
- package/docs/zh/compat/lingui.md +1 -1
- package/docs/zh/compat/next-i18next.md +1 -1
- package/docs/zh/compat/next-intl.md +1 -1
- package/docs/zh/compat/next-translate.md +1 -1
- package/docs/zh/compat/ngx-translate.md +1 -1
- package/docs/zh/compat/nuxtjs-i18n.md +1 -1
- package/docs/zh/compat/polyglot.md +1 -1
- package/docs/zh/compat/react-i18next.md +1 -1
- package/docs/zh/compat/react-intl.md +1 -1
- package/docs/zh/compat/svelte-i18n.md +1 -1
- package/docs/zh/compat/transloco.md +1 -1
- package/docs/zh/compat/vue-i18n.md +1 -1
- package/docs/zh/interest_of_intlayer.md +1 -1
- package/docs/zh/intlayer_with_remix_3.md +558 -0
- 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 +7 -7
- package/src/generated/blog.entry.ts +180 -0
- package/src/generated/docs.entry.ts +0 -20
- package/src/generated/frequentQuestions.entry.ts +20 -0
- package/docs/ar/cli/ci.md +0 -186
- package/docs/de/cli/ci.md +0 -186
- package/docs/en/cli/ci.md +0 -216
- package/docs/en-GB/cli/ci.md +0 -186
- package/docs/es/cli/ci.md +0 -186
- package/docs/fr/cli/ci.md +0 -186
- package/docs/hi/cli/ci.md +0 -186
- package/docs/id/cli/ci.md +0 -186
- package/docs/it/cli/ci.md +0 -186
- package/docs/ja/cli/ci.md +0 -186
- package/docs/ko/cli/ci.md +0 -186
- package/docs/pl/cli/ci.md +0 -186
- package/docs/pt/cli/ci.md +0 -186
- package/docs/ru/cli/ci.md +0 -186
- package/docs/tr/cli/ci.md +0 -186
- package/docs/uk/cli/ci.md +0 -186
- package/docs/vi/cli/ci.md +0 -186
- package/docs/zh/cli/ci.md +0 -186
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
createdAt: 2026-09-09
|
|
3
|
-
updatedAt: 2026-09-
|
|
3
|
+
updatedAt: 2026-09-11
|
|
4
4
|
title: "Remix 3 i18n - Complete guide to translate your app"
|
|
5
5
|
description: "No more i18next. The 2026 guide to building a multilingual (i18n) Remix 3 app. Translate with AI agents and optimize bundle size, SEO and performances."
|
|
6
6
|
keywords:
|
|
@@ -27,30 +27,24 @@ author: aymericzip
|
|
|
27
27
|
|
|
28
28
|
# Translate your Remix 3 website using Intlayer | Internationalization (i18n)
|
|
29
29
|
|
|
30
|
-
This guide demonstrates how to integrate **Intlayer** for seamless internationalization in **Remix 3** applications with locale-aware routing, type-safe content declarations,
|
|
31
|
-
|
|
32
|
-
---
|
|
30
|
+
This guide demonstrates how to integrate **Intlayer** for seamless internationalization in **Remix 3** applications with locale-aware routing, type-safe content declarations, server-rendered JSX components, and cross-runtime support across Node.js, Bun, Deno, and Cloudflare Workers.
|
|
33
31
|
|
|
34
32
|
## What is Remix 3?
|
|
35
33
|
|
|
36
34
|
**Remix 3** represents a fundamental architectural shift towards a **composable, runtime-agnostic web framework built entirely on web standards**. Rather than being coupled to specific bundlers or proprietary server APIs, Remix 3 is distributed as single-purpose, composable packages:
|
|
37
35
|
|
|
38
36
|
- **`remix/fetch-router`** (or `remix/router`): Lightweight, standard-compliant routing built on the Fetch API (`Request` and `Response`).
|
|
39
|
-
- **`remix/
|
|
40
|
-
- **`remix/
|
|
37
|
+
- **`remix/ui`**: A JSX component model (`jsxImportSource: "remix/ui"`). A component is a setup function that returns a render function, so it looks like React but keeps state in plain JavaScript closures.
|
|
38
|
+
- **`remix/middleware/render`**: Installs `context.render(<Page />)` on every request, streaming the JSX tree to an HTML `Response`.
|
|
41
39
|
- **`remix/node-fetch-server`**: Server adapters for Node.js, while natively supporting Bun, Deno, and edge runtimes.
|
|
42
40
|
- **`remix/cookie`**: Cryptographically secure cookie parsing and serialization.
|
|
43
41
|
|
|
44
42
|
Combined with **Intlayer**, you get a complete internationalization system that delivers compile-time safety, automated AI translations, zero-overhead server rendering, and seamless locale routing.
|
|
45
43
|
|
|
46
|
-
---
|
|
47
|
-
|
|
48
44
|
## Table of Contents
|
|
49
45
|
|
|
50
46
|
<TOC/>
|
|
51
47
|
|
|
52
|
-
---
|
|
53
|
-
|
|
54
48
|
## Why Intlayer over alternatives?
|
|
55
49
|
|
|
56
50
|
Compared to traditional solutions like `i18next` or bespoke translation loaders, Intlayer offers an integrated developer experience optimized for modern web architecture:
|
|
@@ -68,7 +62,7 @@ Say goodbye to loose JSON keys and runtime missing-key crashes. Intlayer enforce
|
|
|
68
62
|
</Accordion>
|
|
69
63
|
<Accordion header="Zero Bundle Overhead on the Server">
|
|
70
64
|
|
|
71
|
-
|
|
65
|
+
Remix 3 renders JSX components on the server and streams the HTML to the client. Only the resolved text for the requested locale ends up in the output stream. No client hydration bundles or bulky translation catalogs are needed unless a component is explicitly marked as a `clientEntry`.
|
|
72
66
|
|
|
73
67
|
</Accordion>
|
|
74
68
|
<Accordion header="AI Agent & Automation Ready">
|
|
@@ -83,8 +77,6 @@ Beyond code-first workflows, Intlayer provides a self-hosted [Visual Editor](htt
|
|
|
83
77
|
</Accordion>
|
|
84
78
|
</AccordionGroup>
|
|
85
79
|
|
|
86
|
-
---
|
|
87
|
-
|
|
88
80
|
## Step-by-Step Guide
|
|
89
81
|
|
|
90
82
|
<Tabs defaultTab="code">
|
|
@@ -136,7 +128,7 @@ bun add intlayer remix@next
|
|
|
136
128
|
```
|
|
137
129
|
|
|
138
130
|
- **`intlayer`**: Core internationalization engine providing configuration management, dictionary declaration (`t()`, `Dictionary`), CLI tools, and runtime interpreter.
|
|
139
|
-
- **`remix`**: The unified Remix 3 framework package exporting `remix/router`, `remix/routes`, `remix/
|
|
131
|
+
- **`remix`**: The unified Remix 3 framework package exporting `remix/router`, `remix/routes`, `remix/ui`, `remix/middleware/render`, and `remix/node-fetch-server`.
|
|
140
132
|
|
|
141
133
|
</Step>
|
|
142
134
|
<Step number={2} title="Configure Intlayer">
|
|
@@ -328,80 +320,108 @@ routes.localizedHome.href({ locale: "fr" }); // "/fr"
|
|
|
328
320
|
```
|
|
329
321
|
|
|
330
322
|
</Step>
|
|
331
|
-
<Step number={7} title="Render Localized
|
|
323
|
+
<Step number={7} title="Render Localized Pages with JSX">
|
|
324
|
+
|
|
325
|
+
Remix 3 renders UI with JSX components from `remix/ui`. A component is a **setup function** that receives a `Handle` and returns a **render function**. Setup runs once per instance, render runs on every update, and props are read through `handle.props`.
|
|
326
|
+
|
|
327
|
+
Start with a shared `Document` shell that sets the `<html lang="..." dir="...">` attributes from the resolved locale:
|
|
328
|
+
|
|
329
|
+
```tsx fileName="src/views/document.tsx" codeFormat={["typescript", "esm"]}
|
|
330
|
+
import { getHTMLTextDir, type Locale } from "intlayer";
|
|
331
|
+
import type { Handle, RemixNode } from "remix/ui";
|
|
332
332
|
|
|
333
|
-
|
|
333
|
+
type DocumentProps = {
|
|
334
|
+
locale: Locale;
|
|
335
|
+
title: string;
|
|
336
|
+
children?: RemixNode;
|
|
337
|
+
};
|
|
338
|
+
|
|
339
|
+
export const Document = (handle: Handle<DocumentProps>) => () => {
|
|
340
|
+
const { locale, title, children } = handle.props;
|
|
334
341
|
|
|
335
|
-
|
|
336
|
-
|
|
342
|
+
return (
|
|
343
|
+
<html lang={locale} dir={getHTMLTextDir(locale)}>
|
|
344
|
+
<head>
|
|
345
|
+
<meta charSet="utf-8" />
|
|
346
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
347
|
+
<title>{title}</title>
|
|
348
|
+
</head>
|
|
349
|
+
<body>{children}</body>
|
|
350
|
+
</html>
|
|
351
|
+
);
|
|
352
|
+
};
|
|
353
|
+
```
|
|
354
|
+
|
|
355
|
+
Then create the home page. It extracts the localized dictionary with `getIntlayer` and renders a language switcher:
|
|
356
|
+
|
|
357
|
+
```tsx fileName="src/views/home.tsx" codeFormat={["typescript", "esm"]}
|
|
337
358
|
import {
|
|
338
359
|
getIntlayer,
|
|
339
|
-
getHTMLTextDir,
|
|
340
360
|
getLocaleName,
|
|
341
361
|
getLocalizedPath,
|
|
342
362
|
type Locale,
|
|
343
363
|
locales,
|
|
344
364
|
} from "intlayer";
|
|
365
|
+
import type { Handle } from "remix/ui";
|
|
345
366
|
import { routes } from "../routes";
|
|
367
|
+
import { Document } from "./document";
|
|
368
|
+
|
|
369
|
+
type HomePageProps = {
|
|
370
|
+
locale: Locale;
|
|
371
|
+
};
|
|
346
372
|
|
|
347
|
-
export const
|
|
373
|
+
export const HomePage = (handle: Handle<HomePageProps>) => () => {
|
|
374
|
+
const { locale } = handle.props;
|
|
348
375
|
const home = getIntlayer("home", locale);
|
|
349
376
|
|
|
350
|
-
return
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
<main>
|
|
378
|
-
<h1>${home.title}</h1>
|
|
379
|
-
<p>${home.description}</p>
|
|
380
|
-
</main>
|
|
381
|
-
</body>
|
|
382
|
-
</html>
|
|
383
|
-
`;
|
|
377
|
+
return (
|
|
378
|
+
<Document locale={locale} title={home.title}>
|
|
379
|
+
<header>
|
|
380
|
+
<nav aria-label="Languages">
|
|
381
|
+
<span>{home.switchLanguage}</span>
|
|
382
|
+
{locales.map((targetLocale) => {
|
|
383
|
+
const isActive = targetLocale === locale;
|
|
384
|
+
|
|
385
|
+
return (
|
|
386
|
+
<a
|
|
387
|
+
key={targetLocale}
|
|
388
|
+
href={getLocalizedPath(routes.home.href(), targetLocale)}
|
|
389
|
+
class={isActive ? "active" : undefined}
|
|
390
|
+
aria-current={isActive ? "page" : undefined}
|
|
391
|
+
>
|
|
392
|
+
{getLocaleName(targetLocale, locale)}
|
|
393
|
+
</a>
|
|
394
|
+
);
|
|
395
|
+
})}
|
|
396
|
+
</nav>
|
|
397
|
+
</header>
|
|
398
|
+
<main>
|
|
399
|
+
<h1>{home.title}</h1>
|
|
400
|
+
<p>{home.description}</p>
|
|
401
|
+
</main>
|
|
402
|
+
</Document>
|
|
403
|
+
);
|
|
384
404
|
};
|
|
385
405
|
```
|
|
386
406
|
|
|
407
|
+
> Remix JSX is not React: there are no hooks, `class` is written as-is (`className` is also accepted), and re-renders are triggered explicitly with `handle.update()`. Interpolated values are escaped automatically.
|
|
408
|
+
|
|
387
409
|
</Step>
|
|
388
|
-
<Step number={8} title="Wire Up the Server
|
|
410
|
+
<Step number={8} title="Wire Up the Router and Server">
|
|
389
411
|
|
|
390
|
-
|
|
412
|
+
Add the `render()` middleware from `remix/middleware/render` next to the Intlayer middleware. It installs `context.render(node, init)` on every request, which streams the JSX tree into an HTML `Response` (prepending `<!DOCTYPE html>` and setting the `Content-Type` header):
|
|
391
413
|
|
|
392
|
-
```
|
|
393
|
-
import * as http from "node:http";
|
|
394
|
-
import { createRouter } from "remix/router";
|
|
395
|
-
import { createRequestListener } from "remix/node-fetch-server";
|
|
396
|
-
import { createHtmlResponse } from "remix/response/html";
|
|
414
|
+
```tsx fileName="src/router.tsx" codeFormat={["typescript", "esm"]}
|
|
397
415
|
import { isDeclaredLocale } from "intlayer";
|
|
416
|
+
import { render } from "remix/middleware/render";
|
|
417
|
+
import { createRouter } from "remix/router";
|
|
398
418
|
import { intlayer, localeKey } from "./middleware/intlayer";
|
|
399
419
|
import { routes } from "./routes";
|
|
400
|
-
import {
|
|
420
|
+
import { HomePage } from "./views/home";
|
|
401
421
|
|
|
402
|
-
// 1. Initialize router with Intlayer middleware
|
|
422
|
+
// 1. Initialize router with Intlayer + render middleware
|
|
403
423
|
export const router = createRouter({
|
|
404
|
-
middleware: [intlayer()],
|
|
424
|
+
middleware: [intlayer(), render()],
|
|
405
425
|
});
|
|
406
426
|
|
|
407
427
|
// 2. Map route handlers
|
|
@@ -410,7 +430,7 @@ router.map(routes, {
|
|
|
410
430
|
// Default locale route
|
|
411
431
|
home(context) {
|
|
412
432
|
const locale = context.get(localeKey);
|
|
413
|
-
return
|
|
433
|
+
return context.render(<HomePage locale={locale} />);
|
|
414
434
|
},
|
|
415
435
|
|
|
416
436
|
// Localized route
|
|
@@ -419,13 +439,24 @@ router.map(routes, {
|
|
|
419
439
|
return new Response("Not Found", { status: 404 });
|
|
420
440
|
}
|
|
421
441
|
const locale = context.get(localeKey);
|
|
422
|
-
return
|
|
442
|
+
return context.render(<HomePage locale={locale} />);
|
|
423
443
|
},
|
|
424
444
|
},
|
|
425
445
|
});
|
|
446
|
+
```
|
|
447
|
+
|
|
448
|
+
> `context.render` accepts an optional `ResponseInit` as second argument, e.g. `context.render(<NotFoundPage locale={locale} />, { status: 404 })`.
|
|
449
|
+
|
|
450
|
+
Finally, expose the router through a standard `fetch` handler. The same router runs on Node.js, Bun, Deno, and Cloudflare Workers:
|
|
451
|
+
|
|
452
|
+
```typescript fileName="src/server.ts" codeFormat={["typescript", "esm"]}
|
|
453
|
+
import * as http from "node:http";
|
|
454
|
+
import { createRequestListener } from "remix/node-fetch-server";
|
|
455
|
+
import { router } from "./router";
|
|
426
456
|
|
|
427
|
-
// 3. Start server
|
|
428
457
|
const PORT = Number(process.env.PORT || 3000);
|
|
458
|
+
|
|
459
|
+
// Node.js
|
|
429
460
|
const server = http.createServer(
|
|
430
461
|
createRequestListener((request) => router.fetch(request))
|
|
431
462
|
);
|
|
@@ -434,6 +465,7 @@ server.listen(PORT, () => {
|
|
|
434
465
|
console.log(`Server running at http://localhost:${PORT}`);
|
|
435
466
|
});
|
|
436
467
|
|
|
468
|
+
// Bun / Deno / Cloudflare Workers
|
|
437
469
|
export default {
|
|
438
470
|
port: PORT,
|
|
439
471
|
fetch(request: Request) {
|
|
@@ -482,11 +514,9 @@ bun x intlayer fill
|
|
|
482
514
|
</Step>
|
|
483
515
|
</Steps>
|
|
484
516
|
|
|
485
|
-
---
|
|
486
|
-
|
|
487
517
|
## TypeScript Configuration
|
|
488
518
|
|
|
489
|
-
|
|
519
|
+
Point JSX at the `remix/ui` runtime and ensure that your `tsconfig.json` includes the generated `.intlayer` types:
|
|
490
520
|
|
|
491
521
|
```json fileName="tsconfig.json"
|
|
492
522
|
{
|
|
@@ -494,6 +524,8 @@ Ensure that your `tsconfig.json` includes the generated `.intlayer` types:
|
|
|
494
524
|
"moduleResolution": "Bundler",
|
|
495
525
|
"module": "ESNext",
|
|
496
526
|
"target": "ESNext",
|
|
527
|
+
"jsx": "react-jsx",
|
|
528
|
+
"jsxImportSource": "remix/ui",
|
|
497
529
|
"skipLibCheck": true,
|
|
498
530
|
"strict": true
|
|
499
531
|
},
|
|
@@ -501,7 +533,7 @@ Ensure that your `tsconfig.json` includes the generated `.intlayer` types:
|
|
|
501
533
|
}
|
|
502
534
|
```
|
|
503
535
|
|
|
504
|
-
|
|
536
|
+
> `jsxImportSource: "remix/ui"` is what makes `<HomePage />` resolve to Remix's `createElement` instead of React's.
|
|
505
537
|
|
|
506
538
|
## Conclusion
|
|
507
539
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
createdAt: 2026-04-20
|
|
3
|
-
updatedAt: 2026-
|
|
3
|
+
updatedAt: 2026-09-11
|
|
4
4
|
title: Benchmark i18n libraries
|
|
5
5
|
description: Learn how Intlayer compares to other i18n libraries in terms of performance and bundle size.
|
|
6
6
|
keywords:
|
|
@@ -14,6 +14,9 @@ slugs:
|
|
|
14
14
|
- doc
|
|
15
15
|
- benchmark
|
|
16
16
|
history:
|
|
17
|
+
- version: 9.5.1
|
|
18
|
+
date: 2026-09-11
|
|
19
|
+
changes: "Update benchmark results"
|
|
17
20
|
- version: 8.7.5
|
|
18
21
|
date: 2026-01-06
|
|
19
22
|
changes: "Init benchmark"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
createdAt: 2026-04-20
|
|
3
|
-
updatedAt: 2026-
|
|
3
|
+
updatedAt: 2026-09-11
|
|
4
4
|
title: Best i18n solution for Next.js in 2026 - Benchmark Report
|
|
5
5
|
description: Compare Next.js internationalisation (i18n) libraries like next-intl, next-i18next, and Intlayer. Detailed performance report on bundle size, leakage, and reactivity.
|
|
6
6
|
keywords:
|
|
@@ -17,6 +17,9 @@ slugs:
|
|
|
17
17
|
author: aymericzip
|
|
18
18
|
applicationTemplate: https://github.com/intlayer-org/benchmark-i18n
|
|
19
19
|
history:
|
|
20
|
+
- version: 9.5.1
|
|
21
|
+
date: 2026-09-11
|
|
22
|
+
changes: "Update benchmark results"
|
|
20
23
|
- version: 8.9.8
|
|
21
24
|
date: 2026-05-18
|
|
22
25
|
changes: "Add GitHub star comparative"
|
|
@@ -56,7 +59,7 @@ Internationalisation libraries have a heavy impact on your application. The main
|
|
|
56
59
|
|
|
57
60
|
As your app grows, bundle size can grow exponentially, which can noticeably hurt performance.
|
|
58
61
|
|
|
59
|
-
As an example, for the worst offenders, once internationalised your page can end up nearly
|
|
62
|
+
As an example, for the worst offenders, once internationalised your page can end up nearly 2× larger.
|
|
60
63
|
|
|
61
64
|
Another impact of i18n libraries is slower development. Turning components into multilingual content across languages is time-consuming.
|
|
62
65
|
|
|
@@ -68,7 +71,7 @@ Intlayer tries to optimise across these dimensions.
|
|
|
68
71
|
|
|
69
72
|
- **Intlayer** & **next-translate**: Best choices for Next.js performance, offering the smallest footprint and best static rendering support.
|
|
70
73
|
- **next-intl**: The trendiest option, but heavy and complex to optimise for large applications.
|
|
71
|
-
- **next-i18next**: Popular and plugin-rich, but carries significant bundle weight (~3× Intlayer).
|
|
74
|
+
- **next-i18next**: Popular and plugin-rich, but carries significant bundle weight (~3.5× Intlayer).
|
|
72
75
|
- **Avoid**: **gt-next** and **lingo.dev** due to severe performance issues, vendor lock-in, and build-breaking bugs.
|
|
73
76
|
|
|
74
77
|
## Test your app
|
|
@@ -109,19 +112,21 @@ Finally, `Intlayer` applies a build-time optimisation so `useIntlayer('my-key')`
|
|
|
109
112
|
For this benchmark, we compared the following libraries:
|
|
110
113
|
|
|
111
114
|
- `Base App` (No i18n library)
|
|
112
|
-
- `next-intlayer` (
|
|
113
|
-
- `next-
|
|
114
|
-
- `next-
|
|
115
|
-
-
|
|
116
|
-
- `next-
|
|
115
|
+
- `next-intlayer` (v9.5.1)
|
|
116
|
+
- [`@intlayer/next-intl`](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en-GB/compat/next-intl.md) (v9.5.1)
|
|
117
|
+
- [`@intlayer/next-i18next`](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en-GB/compat/next-i18next.md) (v9.5.1)
|
|
118
|
+
- `next-i18next` (v16.3.0)
|
|
119
|
+
- `next-intl` (v4.14.2)
|
|
120
|
+
- `@lingui/core` (v6.6.0)
|
|
121
|
+
- `next-translate` (v3.2.0)
|
|
117
122
|
- `next-international` (v1.3.1)
|
|
118
123
|
- `@inlang/paraglide-js` (v2.15.1)
|
|
119
|
-
- `@tolgee/react` (v7.
|
|
120
|
-
- `@lingo.dev/compiler` (v0.4.
|
|
121
|
-
- `wuchale` (v0.
|
|
122
|
-
- `gt-next` (
|
|
124
|
+
- `@tolgee/react` (v7.2.0)
|
|
125
|
+
- `@lingo.dev/compiler` (v0.4.12)
|
|
126
|
+
- `wuchale` (v0.26.6)
|
|
127
|
+
- `gt-next` (v11.1.24)
|
|
123
128
|
|
|
124
|
-
I used `Next.js` version `16.
|
|
129
|
+
I used `Next.js` version `16.3.4` with the App Router.
|
|
125
130
|
|
|
126
131
|
I built a multilingual app with **10 pages** and **10 languages**.
|
|
127
132
|
|
|
@@ -165,7 +170,7 @@ I ran the same multilingual app in a real browser for every stack, then wrote do
|
|
|
165
170
|
|
|
166
171
|
GitHub stars are a strong indicator of a project's popularity, community trust, and long-term relevance. While not a direct measure of technical quality, they reflect how many developers find the project useful, follow its progress, and are likely to adopt it. For estimating the value of a project, stars help compare traction across alternatives and provide insights into ecosystem growth.
|
|
167
172
|
|
|
168
|
-
[](https://
|
|
173
|
+
[](https://star-history.com/#i18next/next-i18next&amannn/next-intl&lingui/js-lingui&vinissimus/next-translate&inostudio/next-international&opral/paraglide-js&tolgee/tolgee-js&aymericzip/intlayer)
|
|
169
174
|
|
|
170
175
|
## Results in detail
|
|
171
176
|
|
|
@@ -175,15 +180,15 @@ Some solutions, such as `gt-next` or `lingo.dev`, are clearly best avoided. They
|
|
|
175
180
|
|
|
176
181
|
Issues encountered:
|
|
177
182
|
|
|
178
|
-
**(General Translation)** (`gt-next@
|
|
183
|
+
**(General Translation)** (`gt-next@11.1.24`):
|
|
179
184
|
|
|
180
|
-
- For a
|
|
185
|
+
- For a 141kb app, `gt-next` adds more than 50kb extra.
|
|
181
186
|
- `Quota Exceeded, please upgrade your plan` on the very first build with General Translation.
|
|
182
187
|
- Translations are not rendered; I get the error `Error: <T> used on the client-side outside of <GTProvider>`, which seems to be a bug in the library.
|
|
183
188
|
- While implementing **gt-next**, I also came across an [issue](https://github.com/generaltranslation/gt/issues/1210#event-24510646961) with the library: `does not provide an export named 'printAST' - @formatjs/icu-messageformat-parser`, which was making the application break. After reporting this issue, the maintainer fixed it within 24 hours.
|
|
184
189
|
- The library blocks static rendering of Next.js pages.
|
|
185
190
|
|
|
186
|
-
**(Lingo.dev)** (`@lingo.dev/compiler@0.4.
|
|
191
|
+
**(Lingo.dev)** (`@lingo.dev/compiler@0.4.12`):
|
|
187
192
|
|
|
188
193
|
- AI quota exceeded, blocking the build entirely, so you cannot ship to production without paying.
|
|
189
194
|
- The compiler was missing almost 40% of the translated content. I had to rewrite all `.map` into flat component blocks to make it work.
|
|
@@ -192,7 +197,7 @@ Issues encountered:
|
|
|
192
197
|
|
|
193
198
|
### 2 - Experimental solutions
|
|
194
199
|
|
|
195
|
-
**(Wuchale)** (`wuchale@0.
|
|
200
|
+
**(Wuchale)** (`wuchale@0.26.6`):
|
|
196
201
|
|
|
197
202
|
The idea behind `Wuchale` is interesting but not yet viable. I hit reactivity issues and had to force rerendering of the provider to get the app working. The documentation is also fairly unclear, which makes onboarding harder.
|
|
198
203
|
|
|
@@ -203,21 +208,21 @@ Personally I dislike having to regenerate JS files before every push, which crea
|
|
|
203
208
|
Even if in theory the tree-shaking strategy works, it does includes all locales in the bundle anyway. Paraglide offers not way to lazy-load the content. That says your page size will grow up correlated to the number of locales you have.
|
|
204
209
|
Finally, in comparison of other solutions, Paraglide does not use store (e.g. React context) to retrieve the current locale to render the content. For each node parsed, it will request the locale from the localeStorage / cookie etc. It leads to execution of unnecessary logic that impact the component reactivity.
|
|
205
210
|
|
|
206
|
-
> Note on paraglide: the solution injects code into your codebase for import, as a result the 'lib size' metric in the benchmark report is nearly 0. Code generation is a good thing, because the function used will include only the necessary logic (all prefixes vs no prefixes, cookies vs storage, etc.). In comparison, Intlayer performs this filtering via environment variable injections in the build to force the bundler to tree-shake content depending on the logic. Thanks to this, paraglide and intlayer end up being
|
|
211
|
+
> Note on paraglide: the solution injects code into your codebase for import, as a result the 'lib size' metric in the benchmark report is nearly 0. Code generation is a good thing, because the function used will include only the necessary logic (all prefixes vs no prefixes, cookies vs storage, etc.). In comparison, Intlayer performs this filtering via environment variable injections in the build to force the bundler to tree-shake content depending on the logic. Thanks to this, paraglide and intlayer end up being 3 to 8 times lighter solutions than i18next or next-intl.
|
|
207
212
|
|
|
208
213
|
### 3 - Acceptable solutions
|
|
209
214
|
|
|
210
|
-
**(Tolgee)** (`@tolgee/react@7.
|
|
215
|
+
**(Tolgee)** (`@tolgee/react@7.2.0`):
|
|
211
216
|
|
|
212
217
|
`Tolgee` addresses many of the issues mentioned earlier. I found it harder to adopt than similar tools. It does not provide type safety, which also makes catching missing keys at compile time harder. I had to wrap Tolgee’s functions with my own to add missing-key detection.
|
|
213
218
|
|
|
214
|
-
**(Next Intl)** (`next-intl@4.
|
|
219
|
+
**(Next Intl)** (`next-intl@4.14.2`):
|
|
215
220
|
|
|
216
|
-
`next-intl` is the trendiest option and the one AI agents push most, but in my view wrongly so. Getting started is easy. In practice, optimising to limit leakage is complex. Combining dynamic loading + namespacing + TypeScript types slows development a lot. The package is also fairly heavy (~
|
|
221
|
+
`next-intl` is the trendiest option and the one AI agents push most, but in my view wrongly so. Getting started is easy. In practice, optimising to limit leakage is complex. Combining dynamic loading + namespacing + TypeScript types slows development a lot. The package is also fairly heavy (~14.7kb for `NextIntlClientProvider` + `useTranslations`, which is more than 2.5× `next-intlayer`). **next-intl** used to block static rendering of Next.js pages. It provides a helper named `setRequestLocale()`. That seems partially addressed for centralised files like `en.json` / `fr.json`, but static rendering still breaks when content is split into namespaces such as `en/shared.json` / `fr/shared.json` / `es/shared.json`.
|
|
217
222
|
|
|
218
|
-
**(Next I18next)** (`next-i18next@16.0
|
|
223
|
+
**(Next I18next)** (`next-i18next@16.3.0`):
|
|
219
224
|
|
|
220
|
-
`next-i18next` is probably the most popular option because it was among the first i18n solutions for JavaScript apps. It has many community plugins. It shares the same major downsides as `next-intl`. The package is especially heavy (~
|
|
225
|
+
`next-i18next` is probably the most popular option because it was among the first i18n solutions for JavaScript apps. It has many community plugins. It shares the same major downsides as `next-intl`. The package is especially heavy (~19.7kb for `I18nProvider` + `useTranslation`, about 3.5× `next-intlayer`).
|
|
221
226
|
|
|
222
227
|
Message formats also differ: `next-intl` uses ICU MessageFormat, while `i18next` uses its own format.
|
|
223
228
|
|
|
@@ -225,17 +230,17 @@ Message formats also differ: `next-intl` uses ICU MessageFormat, while `i18next`
|
|
|
225
230
|
|
|
226
231
|
`next-international` also tackles the issues above but does not differ much from `next-intl` or `next-i18next`. It includes `scopedT()` for namespace-specific translations, but using it has essentially no impact on bundle size.
|
|
227
232
|
|
|
228
|
-
**(Lingui)** (`@lingui/core@
|
|
233
|
+
**(Lingui)** (`@lingui/core@6.6.0`):
|
|
229
234
|
|
|
230
235
|
`Lingui` is often praised. Personally I found the `lingui extract` / `lingui compile` workflow more complex than alternatives, without a clear upside. I also noticed inconsistent syntaxes that confuse AIs (e.g. `t()`, `t''`, `i18n.t()`, `<Trans>`).
|
|
231
236
|
|
|
232
237
|
### 4 - Recommendations
|
|
233
238
|
|
|
234
|
-
**(Next Translate)** (`next-translate@3.
|
|
239
|
+
**(Next Translate)** (`next-translate@3.2.0`):
|
|
235
240
|
|
|
236
|
-
`next-translate` is my main recommendation if you like a `t()`-style API. It is elegant via `next-translate-plugin`, loading namespaces through `getStaticProps` with a Webpack / Turbopack loader. It is also the lightest
|
|
241
|
+
`next-translate` is my main recommendation if you like a `t()`-style API. It is elegant via `next-translate-plugin`, loading namespaces through `getStaticProps` with a Webpack / Turbopack loader. It is also one of the lightest options here (~3.5kb). For namespacing, defining namespaces per page or route in config is well thought out and easier to maintain than main alternatives like **next-intl** or **next-i18next**. In version `3.1.2`, I noted that static rendering did not work; Next.js fell back to dynamic rendering.
|
|
237
242
|
|
|
238
|
-
**(Intlayer)** (`next-intlayer@
|
|
243
|
+
**(Intlayer)** (`next-intlayer@9.5.1`):
|
|
239
244
|
|
|
240
245
|
I will not personally judge `next-intlayer` for objectivity’s sake, since it is my own solution.
|
|
241
246
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
createdAt: 2026-04-20
|
|
3
|
-
updatedAt: 2026-
|
|
3
|
+
updatedAt: 2026-09-11
|
|
4
4
|
title: Best i18n solution for Solid in 2026 - Benchmark Report
|
|
5
5
|
description: Compare Solid internationalisation (i18n) libraries like solid-primitives, solid-i18next, and Intlayer. Detailed performance report on bundle size, leakage, and reactivity.
|
|
6
6
|
keywords:
|
|
@@ -17,6 +17,9 @@ slugs:
|
|
|
17
17
|
author: aymericzip
|
|
18
18
|
applicationTemplate: https://github.com/intlayer-org/benchmark-i18n-solid-template
|
|
19
19
|
history:
|
|
20
|
+
- version: 9.5.1
|
|
21
|
+
date: 2026-09-11
|
|
22
|
+
changes: "Update benchmark results"
|
|
20
23
|
- version: 8.9.8
|
|
21
24
|
date: 2026-05-18
|
|
22
25
|
changes: "Add GitHub star comparative"
|
|
@@ -62,9 +65,9 @@ The other impact is on developer experience: how you declare content, types, nam
|
|
|
62
65
|
|
|
63
66
|
## TL;DR
|
|
64
67
|
|
|
65
|
-
- **Intlayer**: Recommended choice for professional Solid applications needing advanced features and optimisation (
|
|
68
|
+
- **Intlayer**: Recommended choice for professional Solid applications needing advanced features and optimisation (v9.5.0).
|
|
66
69
|
- **@solid-primitives/i18n**: Excellent lightweight alternative for simple projects, though lacks advanced features like lazy loading.
|
|
67
|
-
- **solid-i18next**: Standard but heavy option (~
|
|
70
|
+
- **solid-i18next**: Standard but heavy option (~3.5× Intlayer) with same downsides as React i18next.
|
|
68
71
|
- **Paraglide**: Innovative approach but complex DX and tree-shaking issues in some setups.
|
|
69
72
|
|
|
70
73
|
## Test your app
|
|
@@ -97,10 +100,10 @@ Syntaxes built around `t('a.b.c')` are very convenient but often encourage keepi
|
|
|
97
100
|
For this benchmark, we compared the following libraries:
|
|
98
101
|
|
|
99
102
|
- `Base App` (No i18n library)
|
|
100
|
-
- `solid-intlayer` (
|
|
103
|
+
- `solid-intlayer` (v9.5.0)
|
|
101
104
|
- `@solid-primitives/i18n` (v2.2.1)
|
|
102
|
-
- `solid-i18next` (
|
|
103
|
-
- `@inlang/paraglide-js` (v2.
|
|
105
|
+
- `i18next` (v26.0.8) + `@mbarzda/solid-i18next` (v1.4.1)
|
|
106
|
+
- `@inlang/paraglide-js` (v2.25.1)
|
|
104
107
|
|
|
105
108
|
The framework is `Solid` with a multilingual app of **10 pages** and **10 languages**.
|
|
106
109
|
|
|
@@ -144,7 +147,7 @@ I ran the same multilingual app in a real browser for every stack, then wrote do
|
|
|
144
147
|
|
|
145
148
|
GitHub stars are a strong indicator of a project's popularity, community trust, and long-term relevance. While not a direct measure of technical quality, they reflect how many developers find the project useful, follow its progress, and are likely to adopt it. For estimating the value of a project, stars help compare traction across alternatives and provide insights into ecosystem growth.
|
|
146
149
|
|
|
147
|
-
[](https://
|
|
150
|
+
[](https://star-history.com/#solidjs-community/solid-primitives&mbarzda/solid-i18next&opral/paraglide-js&aymericzip/intlayer)
|
|
148
151
|
|
|
149
152
|
## Results in detail
|
|
150
153
|
|
|
@@ -154,11 +157,11 @@ GitHub stars are a strong indicator of a project's popularity, community trust,
|
|
|
154
157
|
|
|
155
158
|
### 2 - Acceptable solutions
|
|
156
159
|
|
|
157
|
-
**(solid-i18next)** (`
|
|
160
|
+
**(solid-i18next)** (`i18next@26.0.8`):
|
|
158
161
|
|
|
159
162
|
`solid-i18next` is probably the most popular option because it was among the first to serve JavaScript app i18n needs. It also has a wide set of community plugins for specific problems.
|
|
160
163
|
|
|
161
|
-
The package is heavy (~14.
|
|
164
|
+
The package is heavy (~14.9kb, which is about 3.5× `solid-intlayer`).
|
|
162
165
|
|
|
163
166
|
Still, it shares the same major downsides as stacks built on `t('a.b.c')`: optimisations are possible but very time-consuming, and large projects risk bad practices (namespaces + dynamic loading + types).
|
|
164
167
|
|
|
@@ -167,7 +170,7 @@ Still, it shares the same major downsides as stacks built on `t('a.b.c')`: optim
|
|
|
167
170
|
Solid primitive is extremely light and efficient. I recommend that solution for light projects, but it can quickly become lacking features for professional solutions including cookie management, proxy redirection, formatters etc.
|
|
168
171
|
It also misses lazy loading and scoping namespaces for page size optimisation.
|
|
169
172
|
|
|
170
|
-
**(Paraglide)** (`@inlang/paraglide-js@2.
|
|
173
|
+
**(Paraglide)** (`@inlang/paraglide-js@2.25.1`):
|
|
171
174
|
|
|
172
175
|
`Paraglide` offers an innovative, well-thought-out approach. Even so, in this benchmark the tree-shaking their company advertises did not work for my implementation. The workflow and DX are also more complex than other options.
|
|
173
176
|
Personally I dislike having to regenerate JS files before every push, which creates constant merge conflict risk via PRs.
|
|
@@ -175,7 +178,7 @@ Finally, in comparison with other solutions, Paraglide does not use a store (e.g
|
|
|
175
178
|
|
|
176
179
|
### 3 - Recommendations
|
|
177
180
|
|
|
178
|
-
**(Intlayer)** (`solid-intlayer@
|
|
181
|
+
**(Intlayer)** (`solid-intlayer@9.5.0`):
|
|
179
182
|
|
|
180
183
|
I will not personally judge `solid-intlayer` for objectivity’s sake, since it is my own solution.
|
|
181
184
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
createdAt: 2026-04-20
|
|
3
|
-
updatedAt: 2026-
|
|
3
|
+
updatedAt: 2026-09-11
|
|
4
4
|
title: Best i18n solution for Svelte in 2026 - Benchmark Report
|
|
5
5
|
description: Compare Svelte internationalisation (i18n) libraries like svelte-i18n, Paraglide, and Intlayer. Detailed performance report on bundle size, leakage, and reactivity.
|
|
6
6
|
keywords:
|
|
@@ -17,6 +17,9 @@ slugs:
|
|
|
17
17
|
author: aymericzip
|
|
18
18
|
applicationTemplate: https://github.com/intlayer-org/benchmark-i18n-svelte-template
|
|
19
19
|
history:
|
|
20
|
+
- version: 9.5.1
|
|
21
|
+
date: 2026-09-11
|
|
22
|
+
changes: "Update benchmark results"
|
|
20
23
|
- version: 8.9.8
|
|
21
24
|
date: 2026-05-18
|
|
22
25
|
changes: "Add GitHub star comparative"
|
|
@@ -62,9 +65,9 @@ The other impact is on developer experience: how you declare content, types, nam
|
|
|
62
65
|
|
|
63
66
|
## TL;DR
|
|
64
67
|
|
|
65
|
-
- **Intlayer**: The most performance-efficient choice (
|
|
68
|
+
- **Intlayer**: The most performance-efficient choice (v9.5.0) with the smallest footprint.
|
|
66
69
|
- **Paraglide**: Strong contender for tree-shaking but has a more complex developer experience and reactivity overhead.
|
|
67
|
-
- **svelte-i18n**: Comprehensive and standard for Svelte, but carries much larger bundle weight (~
|
|
70
|
+
- **svelte-i18n**: Comprehensive and standard for Svelte, but carries much larger bundle weight (~4.5× Intlayer).
|
|
68
71
|
|
|
69
72
|
## Test your app
|
|
70
73
|
|
|
@@ -96,9 +99,9 @@ Syntaxes built around `t('a.b.c')` are very convenient but often encourage keepi
|
|
|
96
99
|
For this benchmark, we compared the following libraries:
|
|
97
100
|
|
|
98
101
|
- `Base App` (No i18n library)
|
|
99
|
-
- `svelte-intlayer` (
|
|
102
|
+
- `svelte-intlayer` (v9.5.0)
|
|
100
103
|
- `svelte-i18n` (v4.0.1)
|
|
101
|
-
- `@inlang/paraglide-js` (v2.
|
|
104
|
+
- `@inlang/paraglide-js` (v2.25.1)
|
|
102
105
|
|
|
103
106
|
The framework is `Svelte` with a multilingual app of **10 pages** and **10 languages**.
|
|
104
107
|
|
|
@@ -142,7 +145,7 @@ I ran the same multilingual app in a real browser for every stack, then wrote do
|
|
|
142
145
|
|
|
143
146
|
GitHub stars are a strong indicator of a project's popularity, community trust, and long-term relevance. While not a direct measure of technical quality, they reflect how many developers find the project useful, follow its progress, and are likely to adopt it. For estimating the value of a project, stars help compare traction across alternatives and provide insights into ecosystem growth.
|
|
144
147
|
|
|
145
|
-
[](https://
|
|
148
|
+
[](https://star-history.com/#kaisermann/svelte-i18n&opral/paraglide-js&aymericzip/intlayer)
|
|
146
149
|
|
|
147
150
|
## Results in detail
|
|
148
151
|
|
|
@@ -152,7 +155,7 @@ GitHub stars are a strong indicator of a project's popularity, community trust,
|
|
|
152
155
|
|
|
153
156
|
### 2 - Acceptable solutions
|
|
154
157
|
|
|
155
|
-
**(Paraglide)** (`@inlang/paraglide-js@2.
|
|
158
|
+
**(Paraglide)** (`@inlang/paraglide-js@2.25.1`):
|
|
156
159
|
|
|
157
160
|
`Paraglide` offers an innovative, well-thought-out approach. In the context of a Vite + Svelte app, the tree-shaking their company advertises worked as expected, which is great.
|
|
158
161
|
But in the case of React + TanStack Start, tree-shaking did not work as expected, same for Next.js. That said, Paraglide's usage in a Svelte and TanStack Start project would be worth a double check.
|
|
@@ -162,13 +165,13 @@ Finally, in comparison with other solutions, Paraglide does not use a store (e.g
|
|
|
162
165
|
|
|
163
166
|
> Note on paraglide: the solution injects code into your codebase for imports; as a result, the 'lib size' metric in the benchmark report is almost 0. Code generation is a good thing, because the function used will include only the necessary logic (prefix everywhere vs no prefix, cookie vs storage, etc.). In comparison, Intlayer performs this filtering via environment variable injections in the build to force the bundler to tree-shake the content depending on the logic. Thanks to this, paraglide and intlayer end up being 6 to 10 times lighter solutions than i18next or next-intl.
|
|
164
167
|
|
|
165
|
-
**(svelte-i18n)** (`svelte-i18n@
|
|
168
|
+
**(svelte-i18n)** (`svelte-i18n@4.0.1`):
|
|
166
169
|
|
|
167
|
-
This solution answers all i18n needs in a Svelte project. But as it is the case for i18next or other major i18n solutions, it is a bit heavy (~
|
|
170
|
+
This solution answers all i18n needs in a Svelte project. But as it is the case for i18next or other major i18n solutions, it is a bit heavy (~16.6kb, which is about 4.5× `svelte-intlayer`).
|
|
168
171
|
|
|
169
172
|
### 3 - Recommendations
|
|
170
173
|
|
|
171
|
-
**(Intlayer)** (`svelte-intlayer@
|
|
174
|
+
**(Intlayer)** (`svelte-intlayer@9.5.0`):
|
|
172
175
|
|
|
173
176
|
I will not personally judge `svelte-intlayer` for objectivity’s sake, since it is my own solution.
|
|
174
177
|
|