@intlayer/docs 9.5.1 → 9.5.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/blog/ar/history_of_i18n.md +304 -0
- package/blog/de/history_of_i18n.md +304 -0
- package/blog/en/history_of_i18n.md +304 -0
- package/blog/en-GB/history_of_i18n.md +304 -0
- package/blog/es/history_of_i18n.md +304 -0
- package/blog/fr/history_of_i18n.md +304 -0
- package/blog/hi/history_of_i18n.md +304 -0
- package/blog/id/history_of_i18n.md +304 -0
- package/blog/it/history_of_i18n.md +304 -0
- package/blog/ja/history_of_i18n.md +304 -0
- package/blog/ko/history_of_i18n.md +304 -0
- package/blog/pl/history_of_i18n.md +304 -0
- package/blog/pt/history_of_i18n.md +304 -0
- package/blog/ru/history_of_i18n.md +304 -0
- package/blog/tr/history_of_i18n.md +304 -0
- package/blog/uk/history_of_i18n.md +304 -0
- package/blog/vi/history_of_i18n.md +304 -0
- package/blog/zh/history_of_i18n.md +304 -0
- package/dist/cjs/generated/blog.entry.cjs +20 -0
- package/dist/cjs/generated/blog.entry.cjs.map +1 -1
- package/dist/cjs/generated/docs.entry.cjs +0 -20
- package/dist/cjs/generated/docs.entry.cjs.map +1 -1
- package/dist/esm/generated/blog.entry.mjs +20 -0
- package/dist/esm/generated/blog.entry.mjs.map +1 -1
- package/dist/esm/generated/docs.entry.mjs +0 -20
- package/dist/esm/generated/docs.entry.mjs.map +1 -1
- package/dist/types/generated/blog.entry.d.ts +1 -0
- package/dist/types/generated/blog.entry.d.ts.map +1 -1
- package/dist/types/generated/docs.entry.d.ts +0 -1
- package/dist/types/generated/docs.entry.d.ts.map +1 -1
- package/docs/ar/benchmark/index.md +4 -1
- package/docs/ar/benchmark/nextjs.md +32 -27
- package/docs/ar/benchmark/solid.md +13 -10
- package/docs/ar/benchmark/svelte.md +12 -9
- package/docs/ar/benchmark/tanstack.md +29 -24
- package/docs/ar/benchmark/vue.md +11 -7
- 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/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/cs/cli/index.md +4 -5
- package/docs/cs/cli/scan.md +5 -1
- package/docs/cs/cli/standalone.md +5 -1
- package/docs/de/benchmark/index.md +4 -1
- package/docs/de/benchmark/nextjs.md +32 -27
- package/docs/de/benchmark/solid.md +13 -10
- package/docs/de/benchmark/svelte.md +12 -9
- package/docs/de/benchmark/tanstack.md +29 -24
- package/docs/de/benchmark/vue.md +11 -7
- 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/intlayer_with_remix_3.md +543 -0
- package/docs/en/benchmark/index.md +4 -1
- package/docs/en/benchmark/nextjs.md +32 -27
- package/docs/en/benchmark/solid.md +13 -10
- package/docs/en/benchmark/svelte.md +12 -9
- package/docs/en/benchmark/tanstack.md +30 -25
- package/docs/en/benchmark/vue.md +11 -7
- 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/intlayer_with_remix_3.md +103 -71
- package/docs/en-GB/benchmark/index.md +4 -1
- package/docs/en-GB/benchmark/nextjs.md +32 -27
- package/docs/en-GB/benchmark/solid.md +13 -10
- package/docs/en-GB/benchmark/svelte.md +12 -9
- package/docs/en-GB/benchmark/tanstack.md +29 -24
- package/docs/en-GB/benchmark/vue.md +11 -7
- 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/intlayer_with_remix_3.md +558 -0
- package/docs/es/benchmark/index.md +4 -1
- package/docs/es/benchmark/nextjs.md +32 -27
- package/docs/es/benchmark/solid.md +13 -10
- package/docs/es/benchmark/svelte.md +12 -9
- package/docs/es/benchmark/tanstack.md +29 -24
- package/docs/es/benchmark/vue.md +11 -7
- 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/intlayer_with_remix_3.md +540 -0
- package/docs/fr/benchmark/index.md +4 -1
- package/docs/fr/benchmark/nextjs.md +32 -27
- package/docs/fr/benchmark/solid.md +13 -10
- package/docs/fr/benchmark/svelte.md +12 -9
- package/docs/fr/benchmark/tanstack.md +29 -24
- package/docs/fr/benchmark/vue.md +11 -7
- 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/intlayer_with_remix_3.md +540 -0
- package/docs/hi/benchmark/index.md +4 -1
- package/docs/hi/benchmark/nextjs.md +32 -27
- package/docs/hi/benchmark/solid.md +13 -10
- package/docs/hi/benchmark/svelte.md +12 -9
- package/docs/hi/benchmark/tanstack.md +29 -24
- package/docs/hi/benchmark/vue.md +11 -7
- 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/intlayer_with_remix_3.md +543 -0
- package/docs/id/benchmark/index.md +4 -1
- package/docs/id/benchmark/nextjs.md +32 -27
- package/docs/id/benchmark/solid.md +13 -10
- package/docs/id/benchmark/svelte.md +12 -9
- package/docs/id/benchmark/tanstack.md +29 -24
- package/docs/id/benchmark/vue.md +11 -7
- 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/intlayer_with_remix_3.md +566 -0
- package/docs/it/benchmark/index.md +4 -1
- package/docs/it/benchmark/nextjs.md +32 -27
- package/docs/it/benchmark/solid.md +13 -10
- package/docs/it/benchmark/svelte.md +12 -9
- package/docs/it/benchmark/tanstack.md +29 -24
- package/docs/it/benchmark/vue.md +11 -7
- 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/intlayer_with_remix_3.md +558 -0
- package/docs/ja/benchmark/index.md +4 -1
- package/docs/ja/benchmark/nextjs.md +32 -27
- package/docs/ja/benchmark/solid.md +13 -10
- package/docs/ja/benchmark/svelte.md +12 -9
- package/docs/ja/benchmark/tanstack.md +29 -24
- package/docs/ja/benchmark/vue.md +11 -7
- 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/intlayer_with_remix_3.md +558 -0
- package/docs/ko/benchmark/index.md +4 -1
- package/docs/ko/benchmark/nextjs.md +32 -27
- package/docs/ko/benchmark/solid.md +13 -10
- package/docs/ko/benchmark/svelte.md +12 -9
- package/docs/ko/benchmark/tanstack.md +29 -24
- package/docs/ko/benchmark/vue.md +11 -7
- 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/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/pl/benchmark/index.md +4 -1
- package/docs/pl/benchmark/nextjs.md +32 -27
- package/docs/pl/benchmark/solid.md +13 -10
- package/docs/pl/benchmark/svelte.md +12 -9
- package/docs/pl/benchmark/tanstack.md +29 -24
- package/docs/pl/benchmark/vue.md +11 -7
- 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/intlayer_with_remix_3.md +551 -0
- package/docs/pt/benchmark/index.md +4 -1
- package/docs/pt/benchmark/nextjs.md +32 -27
- package/docs/pt/benchmark/solid.md +13 -10
- package/docs/pt/benchmark/svelte.md +12 -9
- package/docs/pt/benchmark/tanstack.md +29 -24
- package/docs/pt/benchmark/vue.md +11 -7
- 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/intlayer_with_remix_3.md +558 -0
- package/docs/ru/benchmark/index.md +4 -1
- package/docs/ru/benchmark/nextjs.md +32 -27
- package/docs/ru/benchmark/solid.md +13 -10
- package/docs/ru/benchmark/svelte.md +12 -9
- package/docs/ru/benchmark/tanstack.md +29 -24
- package/docs/ru/benchmark/vue.md +11 -7
- 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/intlayer_with_remix_3.md +558 -0
- package/docs/tr/benchmark/index.md +4 -1
- package/docs/tr/benchmark/nextjs.md +32 -27
- package/docs/tr/benchmark/solid.md +13 -10
- package/docs/tr/benchmark/svelte.md +12 -9
- package/docs/tr/benchmark/tanstack.md +29 -24
- package/docs/tr/benchmark/vue.md +11 -7
- 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/intlayer_with_remix_3.md +566 -0
- package/docs/uk/benchmark/index.md +4 -1
- package/docs/uk/benchmark/nextjs.md +32 -27
- package/docs/uk/benchmark/solid.md +13 -10
- package/docs/uk/benchmark/svelte.md +12 -9
- package/docs/uk/benchmark/tanstack.md +29 -24
- package/docs/uk/benchmark/vue.md +11 -7
- 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/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/vi/benchmark/index.md +4 -1
- package/docs/vi/benchmark/nextjs.md +32 -27
- package/docs/vi/benchmark/solid.md +13 -10
- package/docs/vi/benchmark/svelte.md +12 -9
- package/docs/vi/benchmark/tanstack.md +29 -24
- package/docs/vi/benchmark/vue.md +11 -7
- 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/intlayer_with_remix_3.md +566 -0
- package/docs/zh/benchmark/index.md +4 -1
- package/docs/zh/benchmark/nextjs.md +32 -27
- package/docs/zh/benchmark/solid.md +13 -10
- package/docs/zh/benchmark/svelte.md +12 -9
- package/docs/zh/benchmark/tanstack.md +29 -24
- package/docs/zh/benchmark/vue.md +11 -7
- 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/intlayer_with_remix_3.md +558 -0
- package/package.json +7 -7
- package/src/generated/blog.entry.ts +20 -0
- package/src/generated/docs.entry.ts +0 -20
- 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-04-20
|
|
3
|
-
updatedAt: 2026-
|
|
3
|
+
updatedAt: 2026-09-11
|
|
4
4
|
title: Melhor solução i18n para Next.js em 2026 - Relatório de Benchmark
|
|
5
5
|
description: Compare bibliotecas de internacionalização (i18n) para Next.js como next-intl, next-i18next e Intlayer. Relatório detalhado de desempenho sobre tamanho do bundle, vazamento e reatividade.
|
|
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: "Atualização dos resultados do benchmark"
|
|
20
23
|
- version: 8.9.8
|
|
21
24
|
date: 2026-05-18
|
|
22
25
|
changes: "Adicionar comparativo de estrelas do GitHub"
|
|
@@ -56,7 +59,7 @@ As bibliotecas de internacionalização têm um impacto pesado na sua aplicaçã
|
|
|
56
59
|
|
|
57
60
|
À medida que sua aplicação cresce, o tamanho do bundle pode crescer exponencialmente, o que pode prejudicar visivelmente o desempenho.
|
|
58
61
|
|
|
59
|
-
Como exemplo, nos piores casos, uma vez internacionalizada, sua página pode acabar ficando quase
|
|
62
|
+
Como exemplo, nos piores casos, uma vez internacionalizada, sua página pode acabar ficando quase 2 vezes maior.
|
|
60
63
|
|
|
61
64
|
Outro impacto das bibliotecas i18n é o desenvolvimento mais lento. Transformar componentes em conteúdo multilíngue em todos os idiomas consome muito tempo.
|
|
62
65
|
|
|
@@ -68,7 +71,7 @@ O Intlayer tenta otimizar em todas essas dimensões.
|
|
|
68
71
|
|
|
69
72
|
- **Intlayer** e **next-translate**: As melhores escolhas para o desempenho do Next.js, oferecendo a menor pegada e o melhor suporte para renderização estática.
|
|
70
73
|
- **next-intl**: A opção mais badalada, mas pesada e complexa de otimizar para grandes aplicações.
|
|
71
|
-
- **next-i18next**: Popular e rico em plugins, mas carrega um peso significativo de bundle (~3× Intlayer).
|
|
74
|
+
- **next-i18next**: Popular e rico em plugins, mas carrega um peso significativo de bundle (~3.5× Intlayer).
|
|
72
75
|
- **Evite**: **gt-next** e **lingo.dev** devido a problemas graves de desempenho, aprisionamento tecnológico (vendor lock-in) e erros que quebram a build.
|
|
73
76
|
|
|
74
77
|
## Teste sua aplicação
|
|
@@ -109,19 +112,21 @@ Finalmente, o `Intlayer` aplica uma otimização no momento do build para que `u
|
|
|
109
112
|
Para este benchmark, comparamos as seguintes bibliotecas:
|
|
110
113
|
|
|
111
114
|
- `Base App` (Sem biblioteca i18n)
|
|
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/pt/compat/next-intl.md) (v9.5.1)
|
|
117
|
+
- [`@intlayer/next-i18next`](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pt/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
|
-
Utilizei a versão `16.
|
|
129
|
+
Utilizei a versão `16.3.4` do `Next.js` com o App Router.
|
|
125
130
|
|
|
126
131
|
Construí uma aplicação multilíngue com **10 páginas** e **10 idiomas**.
|
|
127
132
|
|
|
@@ -175,15 +180,15 @@ Algumas soluções, como `gt-next` ou `lingo.dev`, devem claramente ser evitadas
|
|
|
175
180
|
|
|
176
181
|
Problemas encontrados:
|
|
177
182
|
|
|
178
|
-
**(General Translation)** (`gt-next@
|
|
183
|
+
**(General Translation)** (`gt-next@11.1.24`):
|
|
179
184
|
|
|
180
|
-
- Para uma aplicação de
|
|
185
|
+
- Para uma aplicação de 141kb, o `gt-next` adiciona mais de 50kb extras.
|
|
181
186
|
- `Quota Exceeded, please upgrade your plan` logo no primeiro build com a General Translation.
|
|
182
187
|
- Traduções não são renderizadas; recebo o erro `Error: <T> used on the client-side outside of <GTProvider>`, o que parece ser um bug na biblioteca.
|
|
183
188
|
- Ao implementar o **gt-next**, também encontrei um [problema](https://github.com/generaltranslation/gt/issues/1210#event-24510646961) con la biblioteca: `does not provide an export named 'printAST' - @formatjs/icu-messageformat-parser`, que fazia a aplicação falhar. Após relatar esse problema, o mantenedor corrigiu-o em 24 horas.
|
|
184
189
|
- A biblioteca bloqueia a renderização estática das páginas do Next.js.
|
|
185
190
|
|
|
186
|
-
**(Lingo.dev)** (`@lingo.dev/compiler@0.4.
|
|
191
|
+
**(Lingo.dev)** (`@lingo.dev/compiler@0.4.12`):
|
|
187
192
|
|
|
188
193
|
- Cota de IA excedida, bloqueando a build inteiramente - então você não pode lançar para produção sem pagar.
|
|
189
194
|
- O compilador estava perdendo quase 40% do conteúdo traduzido. Tive que reescrever todos os `.map` em blocos de componentes planos para fazer funcionar.
|
|
@@ -192,7 +197,7 @@ Problemas encontrados:
|
|
|
192
197
|
|
|
193
198
|
### 2 - Soluções experimentais
|
|
194
199
|
|
|
195
|
-
**(Wuchale)** (`wuchale@0.
|
|
200
|
+
**(Wuchale)** (`wuchale@0.26.6`):
|
|
196
201
|
|
|
197
202
|
A ideia por trás do `Wuchale` é interessante, mas ainda não é viável. Encontrei problemas de reatividade e tive que forçar a re-renderização do provedor para fazer a aplicação funcionar. A documentação também é bastante incerta, o que torna a integração mais difícil.
|
|
198
203
|
|
|
@@ -202,21 +207,21 @@ O `Paraglide` oferece uma abordagem inovadora e bem pensada. Mesmo assim, neste
|
|
|
202
207
|
Pessoalmente, não gosto de ter que regenerar arquivos JS antes de cada push, o que cria um risco constante de conflito de merge via PRs. A ferramenta também parece mais focada no Vite do que no Next.js.
|
|
203
208
|
Finalmente, em comparação com outras soluções, o Paraglide não usa store (ex: React context) para recuperar a localidade atual para renderizar le conteúdo. Para cada nó analisado, ele solicitará a localidade do localStorage / cookie etc. Isso leva à execução de lógica desnecessária que impacta a reatividade do componente.
|
|
204
209
|
|
|
205
|
-
> Nota sobre paraglide: a solução injeta código na sua base de código para importação, como resultado a métrica 'tamanho da lib' no relatório de benchmark é quase 0. A geração de código é algo bom, porque a função utilizada incluirá apenas a lógica necessária (prefixo total vs sem prefixo, cookie vs armazenamento, etc.). Em comparação, o Intlayer executa essa filtragem via inyeções de variáveis de ambiente na build para forçar o bundler a aplicar tree-shaking ao conteúdo dependendo da lógica. Graças a isso, paraglide e intlayer acabam sendo soluções de
|
|
210
|
+
> Nota sobre paraglide: a solução injeta código na sua base de código para importação, como resultado a métrica 'tamanho da lib' no relatório de benchmark é quase 0. A geração de código é algo bom, porque a função utilizada incluirá apenas a lógica necessária (prefixo total vs sem prefixo, cookie vs armazenamento, etc.). Em comparação, o Intlayer executa essa filtragem via inyeções de variáveis de ambiente na build para forçar o bundler a aplicar tree-shaking ao conteúdo dependendo da lógica. Graças a isso, paraglide e intlayer acabam sendo soluções de 3 a 8 vezes mais leves do que i18next ou next-intl.
|
|
206
211
|
|
|
207
212
|
### 3 - Soluções aceitáveis
|
|
208
213
|
|
|
209
|
-
**(Tolgee)** (`@tolgee/react@7.
|
|
214
|
+
**(Tolgee)** (`@tolgee/react@7.2.0`):
|
|
210
215
|
|
|
211
216
|
O `Tolgee` resolve muitos dos problemas mencionados anteriormente. Achei mais difícil de adotar do que ferramentas semelhantes. Ele não fornece segurança de tipos (type safety), o que também torna mais difícil encontrar chaves ausentes no momento da compilação. Tive que envolver as funções do Tolgee com as minhas para adicionar a detecção de chaves ausentes.
|
|
212
217
|
|
|
213
|
-
**(Next Intl)** (`next-intl@4.
|
|
218
|
+
**(Next Intl)** (`next-intl@4.14.2`):
|
|
214
219
|
|
|
215
|
-
O `next-intl` é a opção mais badalada e a que os agentes de IA mais recomendam, mas, na minha visão, erradamente. Começar é fácil. Na prática, otimizar para limitar o vazamento é complexo. Combinar carregamento dinâmico + namespaces + tipos TypeScript retarda muito o desenvolvimento. O pacote também é bastante pesado (~
|
|
220
|
+
O `next-intl` é a opção mais badalada e a que os agentes de IA mais recomendam, mas, na minha visão, erradamente. Começar é fácil. Na prática, otimizar para limitar o vazamento é complexo. Combinar carregamento dinâmico + namespaces + tipos TypeScript retarda muito o desenvolvimento. O pacote também é bastante pesado (~14.7kb para `NextIntlClientProvider` + `useTranslations`, que é mais de 2.5x o `next-intlayer`). O **next-intl** costumava bloquear a renderização estática das páginas do Next.js. Ele fornece um auxiliar chamado `setRequestLocale()`. Isso parece ter sido parcialmente resolvido para arquivos centralizados como `en.json` / `fr.json`, mas a renderização estática ainda quebra quando o conteúdo é dividido em namespaces como `en/shared.json` / `fr/shared.json` / `es/shared.json`.
|
|
216
221
|
|
|
217
|
-
**(Next I18next)** (`next-i18next@16.0
|
|
222
|
+
**(Next I18next)** (`next-i18next@16.3.0`):
|
|
218
223
|
|
|
219
|
-
O `next-i18next` é provavelmente a opção mais popular porque foi uma das primeiras soluções de i18n para aplicações JavaScript. Possui muitos plugins da comunidade. Compartilha os mesmos grandes pontos negativos que o `next-intl`. O pacote é especialmente pesado (~
|
|
224
|
+
O `next-i18next` é provavelmente a opção mais popular porque foi uma das primeiras soluções de i18n para aplicações JavaScript. Possui muitos plugins da comunidade. Compartilha os mesmos grandes pontos negativos que o `next-intl`. O pacote é especialmente pesado (~19.7kb para `I18nProvider` + `useTranslation`, cerca de 3.5x o `next-intlayer`).
|
|
220
225
|
|
|
221
226
|
Os formatos de mensagem também diferem: o `next-intl` usa ICU MessageFormat, enquanto o `i18next` usa seu próprio formato.
|
|
222
227
|
|
|
@@ -224,17 +229,17 @@ Os formatos de mensagem também diferem: o `next-intl` usa ICU MessageFormat, en
|
|
|
224
229
|
|
|
225
230
|
O `next-international` também aborda os problemas acima, mas não difere muito do `next-intl` ou `next-i18next`. Inclui `scopedT()` para traduções específicas de um namespace, mas usá-lo não tem praticamente impacto no tamanho do bundle.
|
|
226
231
|
|
|
227
|
-
**(Lingui)** (`@lingui/core@
|
|
232
|
+
**(Lingui)** (`@lingui/core@6.6.0`):
|
|
228
233
|
|
|
229
234
|
O `Lingui` é frequentemente elogiado. Pessoalmente, achei o fluxo de trabalho `lingui extract` / `lingui compile` mais complexo que as alternativas, sem uma vantagem clara. Também notei sintaxes inconsistentes que confundem as IAs (ex: `t()`, `t''`, `i18n.t()`, `<Trans>`).
|
|
230
235
|
|
|
231
236
|
### 4 - Recomendações
|
|
232
237
|
|
|
233
|
-
**(Next Translate)** (`next-translate@3.
|
|
238
|
+
**(Next Translate)** (`next-translate@3.2.0`):
|
|
234
239
|
|
|
235
|
-
O `next-translate` é minha recomendação principal se você gosta de uma API no estilo `t()`. É elegante via `next-translate-plugin`, carregando namespaces através de `getStaticProps` com um carregador Webpack / Turbopack. É também
|
|
240
|
+
O `next-translate` é minha recomendação principal se você gosta de uma API no estilo `t()`. É elegante via `next-translate-plugin`, carregando namespaces através de `getStaticProps` com um carregador Webpack / Turbopack. É também uma das opções mais leves aqui (~3.5kb). Para os namespaces, definir os namespaces por página ou rota na configuração é bem pensado e mais fácil de manter do que as principais alternativas como **next-intl** ou **next-i18next**. Na versão `3.1.2`, notei que a renderização estática não funcionava; o Next.js recorria à renderização dinâmica.
|
|
236
241
|
|
|
237
|
-
**(Intlayer)** (`next-intlayer@
|
|
242
|
+
**(Intlayer)** (`next-intlayer@9.5.1`):
|
|
238
243
|
|
|
239
244
|
Não serei eu a julgar pessoalmente o `next-intlayer` por uma questão de objetividade, já que é a minha própria solução.
|
|
240
245
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
createdAt: 2026-04-20
|
|
3
|
-
updatedAt: 2026-
|
|
3
|
+
updatedAt: 2026-09-11
|
|
4
4
|
title: Melhor solução i18n para Solid em 2026 - Relatório de Benchmark
|
|
5
5
|
description: Compare bibliotecas de internacionalização (i18n) para Solid como solid-primitives, solid-i18next e Intlayer. Relatório de desempenho detalhado sobre tamanho do bundle, vazamento e reatividade.
|
|
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: "Atualização dos resultados do benchmark"
|
|
20
23
|
- version: 8.9.8
|
|
21
24
|
date: 2026-05-18
|
|
22
25
|
changes: "Adicionar comparativo de estrelas do GitHub"
|
|
@@ -62,9 +65,9 @@ O outro impacto é na experiência do desenvolvedor (DX): como você declara con
|
|
|
62
65
|
|
|
63
66
|
## TL;DR
|
|
64
67
|
|
|
65
|
-
- **Intlayer**: Escolha recomendada para aplicações Solid profissionais que precisam de recursos avançados e otimização (
|
|
68
|
+
- **Intlayer**: Escolha recomendada para aplicações Solid profissionais que precisam de recursos avançados e otimização (v9.5.0).
|
|
66
69
|
- **@solid-primitives/i18n**: Excelente alternativa leve para projetos simples, embora careça de recursos avançados como lazy loading.
|
|
67
|
-
- **solid-i18next**: Opção padrão, mas pesada (~
|
|
70
|
+
- **solid-i18next**: Opção padrão, mas pesada (~3.5× o Intlayer) com os mesmos pontos negativos do React i18next.
|
|
68
71
|
- **Paraglide**: Abordagem inovadora, mas DX complexa e problemas de tree-shaking em algumas configurações.
|
|
69
72
|
|
|
70
73
|
## Teste seu app
|
|
@@ -97,10 +100,10 @@ Sintaxes construídas em torno de `t('a.b.c')` são muito convenientes, mas freq
|
|
|
97
100
|
Para este benchmark, comparamos as seguintes bibliotecas:
|
|
98
101
|
|
|
99
102
|
- `Base App` (Sem biblioteca i18n)
|
|
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
|
O framework é `Solid` com um app multilíngue de **10 páginas** e **10 idiomas**.
|
|
106
109
|
|
|
@@ -154,11 +157,11 @@ As estrelas do GitHub são um forte indicador da popularidade de um projeto, da
|
|
|
154
157
|
|
|
155
158
|
### 2 - Soluções aceitáveis
|
|
156
159
|
|
|
157
|
-
**(solid-i18next)** (`
|
|
160
|
+
**(solid-i18next)** (`i18next@26.0.8`):
|
|
158
161
|
|
|
159
162
|
O `solid-i18next` é provavelmente a opção mais popular porque foi uma das primeiras a atender às necessidades de i18n de apps JavaScript. Também possui um amplo conjunto de plugins da comunidade para problemas específicos.
|
|
160
163
|
|
|
161
|
-
O pacote é pesado (~14.
|
|
164
|
+
O pacote é pesado (~14.9kb, o que é cerca de 3.5× o `solid-intlayer`).
|
|
162
165
|
|
|
163
166
|
Ainda assim, compartilha as mesmas principais desvantagens das stacks construídas sobre o `t('a.b.c')`: otimizações são possíveis, mas consomem muito tempo, e grandes projetos correm o risco de más práticas (namespaces + carregamento dinâmico + tipos).
|
|
164
167
|
|
|
@@ -167,7 +170,7 @@ Ainda assim, compartilha as mesmas principais desvantagens das stacks construíd
|
|
|
167
170
|
O Solid primitive é extremamente leve e eficiente. Recomendo essa solução para projetos leves, mas pode rapidamente carecer de recursos para soluções profissionais que incluam gerenciamento de cookies, redirecionamento de proxy, formatadores etc.
|
|
168
171
|
Também carece de lazy loading e scoping de namespaces para otimização do tamanho da página.
|
|
169
172
|
|
|
170
|
-
**(Paraglide)** (`@inlang/paraglide-js@2.
|
|
173
|
+
**(Paraglide)** (`@inlang/paraglide-js@2.25.1`):
|
|
171
174
|
|
|
172
175
|
O `Paraglide` oferece uma abordagem inovadora e bem pensada. Ainda assim, neste benchmark, o tree-shaking que a empresa anuncia não funcionou para minha implementação. O fluxo de trabalho e a DX também são mais complexos do que outras opções.
|
|
173
176
|
Pessoalmente, não gosto de ter que regenerar arquivos JS antes de cada push, o que cria um risco constante de conflito de merge através de PRs.
|
|
@@ -175,7 +178,7 @@ Finalmente, em comparação com outras soluções, o Paraglide não usa um store
|
|
|
175
178
|
|
|
176
179
|
### 3 - Recomendações
|
|
177
180
|
|
|
178
|
-
**(Intlayer)** (`solid-intlayer@
|
|
181
|
+
**(Intlayer)** (`solid-intlayer@9.5.0`):
|
|
179
182
|
|
|
180
183
|
Eu não julgarei pessoalmente o `solid-intlayer` por uma questão de objetividade, já que é minha própria solução.
|
|
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: Melhor solução i18n para Svelte em 2026 - Relatório de Benchmark
|
|
5
5
|
description: Compare bibliotecas de internacionalização (i18n) para Svelte como svelte-i18n, Paraglide e Intlayer. Relatório de desempenho detalhado sobre tamanho do bundle, vazamento e reatividade.
|
|
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: "Atualização dos resultados do benchmark"
|
|
20
23
|
- version: 8.9.8
|
|
21
24
|
date: 2026-05-18
|
|
22
25
|
changes: "Adicionar comparativo de estrelas do GitHub"
|
|
@@ -62,9 +65,9 @@ O outro impacto é na experiência do desenvolvedor (DX): como você declara con
|
|
|
62
65
|
|
|
63
66
|
## TL;DR
|
|
64
67
|
|
|
65
|
-
- **Intlayer**: A escolha mais eficiente em desempenho (
|
|
68
|
+
- **Intlayer**: A escolha mais eficiente em desempenho (v9.5.0) com o menor footprint.
|
|
66
69
|
- **Paraglide**: Forte candidato para tree-shaking, mas possui uma experiência de desenvolvedor mais complexa e overhead de reatividade.
|
|
67
|
-
- **svelte-i18n**: Abrangente e padrão para Svelte, mas carrega um peso de bundle muito maior (~
|
|
70
|
+
- **svelte-i18n**: Abrangente e padrão para Svelte, mas carrega um peso de bundle muito maior (~4.5× o Intlayer).
|
|
68
71
|
|
|
69
72
|
## Teste seu app
|
|
70
73
|
|
|
@@ -96,9 +99,9 @@ Sintaxes construídas em torno de `t('a.b.c')` são muito convenientes, mas freq
|
|
|
96
99
|
Para este benchmark, comparamos as seguintes bibliotecas:
|
|
97
100
|
|
|
98
101
|
- `Base App` (Sem biblioteca i18n)
|
|
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
|
O framework é `Svelte` com um app multilíngue de **10 páginas** e **10 idiomas**.
|
|
104
107
|
|
|
@@ -152,7 +155,7 @@ As estrelas do GitHub são um forte indicador da popularidade de um projeto, da
|
|
|
152
155
|
|
|
153
156
|
### 2 - Soluções aceitáveis
|
|
154
157
|
|
|
155
|
-
**(Paraglide)** (`@inlang/paraglide-js@2.
|
|
158
|
+
**(Paraglide)** (`@inlang/paraglide-js@2.25.1`):
|
|
156
159
|
|
|
157
160
|
O `Paraglide` oferece uma abordagem inovadora e bem pensada. No contexto de um app Vite + Svelte, o tree-shaking que a empresa anuncia funcionou conforme o esperado, o que é excelente.
|
|
158
161
|
Mas no caso do React + TanStack Start, o tree-shaking não funcionou como esperado, o mesmo para o Next.js. Dito isso, o uso do Paraglide em um projeto Svelte e TanStack Start valeria uma dupla verificação.
|
|
@@ -162,13 +165,13 @@ Finalmente, em comparação com outras soluções, o Paraglide não usa um store
|
|
|
162
165
|
|
|
163
166
|
> Nota sobre o paraglide: a solução injeta código em sua base de código para importações; como resultado, a métrica 'lib size' no relatório de benchmark é quase 0. A geração de código é algo bom, porque a função utilizada incluirá apenas a lógica necessária (prefixo em todos os lugares vs sem prefixo, cookie vs armazenamento, etc.). Em comparação, o Intlayer realiza essa filtragem via injeções de variáveis de ambiente durante o build para forçar o bundler a fazer tree-shaking do conteúdo dependendo da lógica. Graças a isso, o paraglide e o intlayer acabam sendo soluções de 6 a 10 vezes mais leves que o i18next ou o next-intl.
|
|
164
167
|
|
|
165
|
-
**(svelte-i18n)** (`svelte-i18n@
|
|
168
|
+
**(svelte-i18n)** (`svelte-i18n@4.0.1`):
|
|
166
169
|
|
|
167
|
-
Esta solução atende a todas as necessidades de i18n em um projeto Svelte. Mas, como é o caso do i18next ou de outras grandes soluções de i18n, é um pouco pesada (~
|
|
170
|
+
Esta solução atende a todas as necessidades de i18n em um projeto Svelte. Mas, como é o caso do i18next ou de outras grandes soluções de i18n, é um pouco pesada (~16.6kb, o que é cerca de 4.5× o `svelte-intlayer`).
|
|
168
171
|
|
|
169
172
|
### 3 - Recomendações
|
|
170
173
|
|
|
171
|
-
**(Intlayer)** (`svelte-intlayer@
|
|
174
|
+
**(Intlayer)** (`svelte-intlayer@9.5.0`):
|
|
172
175
|
|
|
173
176
|
Eu não julgarei pessoalmente o `svelte-intlayer` por uma questão de objetividade, já que é minha própria solução.
|
|
174
177
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
createdAt: 2026-04-20
|
|
3
|
-
updatedAt: 2026-
|
|
3
|
+
updatedAt: 2026-09-11
|
|
4
4
|
title: Melhor solução i18n para TanStack Start em 2026 - Relatório de Benchmark
|
|
5
5
|
description: Compare bibliotecas de internacionalização para TanStack Start como react-i18next, use-intl e Intlayer. Relatório detalhado de desempenho sobre tamanho do bundle, vazamento e reatividade.
|
|
6
6
|
keywords:
|
|
@@ -17,6 +17,9 @@ slugs:
|
|
|
17
17
|
author: aymericzip
|
|
18
18
|
applicationTemplate: https://github.com/intlayer-org/benchmark-i18n-tanstack-start-template
|
|
19
19
|
history:
|
|
20
|
+
- version: 9.5.1
|
|
21
|
+
date: 2026-09-11
|
|
22
|
+
changes: "Atualização dos resultados do benchmark"
|
|
20
23
|
- version: 8.9.8
|
|
21
24
|
date: 2026-05-18
|
|
22
25
|
changes: "Adicionar comparativo de estrelas do GitHub"
|
|
@@ -62,7 +65,7 @@ O outro impacto é na experência do desenvolvedor: como você declara o conteú
|
|
|
62
65
|
|
|
63
66
|
## TL;DR
|
|
64
67
|
|
|
65
|
-
- **Intlayer**: Oferece o melhor desempenho e o menor tamanho de bundle (
|
|
68
|
+
- **Intlayer**: Oferece o melhor desempenho e o menor tamanho de bundle (v9.5.1) para TanStack Start.
|
|
66
69
|
- **react-i18next** & **use-intl**: Alternativas maduras com grandes ecossistemas, mas significativamente mais pesadas e complexas de otimizar.
|
|
67
70
|
- **Paraglide**: Ideia inovadora de tree-shaking que não funciona na prática. DX complexo e sobrecarga de reatividade no TanStack Start.
|
|
68
71
|
- **Evitar**: **General Translation (GT)** e **Lingo.dev** devido a graves problemas de desempenho, limites de cota de IA e bloqueio do fornecedor (vendor lock-in).
|
|
@@ -97,16 +100,18 @@ As sintaxes construídas em torno de `const t = useTranslation()` + `t('a.b.c')`
|
|
|
97
100
|
Para este benchmark, comparamos as seguintes bibliotecas:
|
|
98
101
|
|
|
99
102
|
- `Base App` (Sem biblioteca i18n)
|
|
100
|
-
- `react-intlayer` (
|
|
101
|
-
-
|
|
102
|
-
- `
|
|
103
|
-
-
|
|
103
|
+
- `react-intlayer` (v9.5.1)
|
|
104
|
+
- `@intlayer/use-intl` (v9.5.1)
|
|
105
|
+
- [`@intlayer/lingui`](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pt/compat/lingui.md) (v9.5.1)
|
|
106
|
+
- `react-i18next` (v17.0.13)
|
|
107
|
+
- `use-intl` (v4.14.2)
|
|
108
|
+
- `@lingui/core` (v6.6.0)
|
|
104
109
|
- `@inlang/paraglide-js` (v2.15.1)
|
|
105
|
-
- `@tolgee/react` (v7.
|
|
106
|
-
- `react-intl` (v10.1.
|
|
107
|
-
- `wuchale` (v0.
|
|
108
|
-
- `gt-react` (
|
|
109
|
-
- `lingo.dev` (v0.
|
|
110
|
+
- `@tolgee/react` (v7.2.0)
|
|
111
|
+
- `react-intl` (v10.1.26)
|
|
112
|
+
- `wuchale` (v0.26.6)
|
|
113
|
+
- `gt-react` (v10.18.3)
|
|
114
|
+
- `lingo.dev` (v0.138.7)
|
|
110
115
|
|
|
111
116
|
O framework é o `TanStack Start` com uma aplicação multilíngue de **10 páginas** e **10 idiomas**.
|
|
112
117
|
|
|
@@ -160,15 +165,15 @@ Algumas soluções, como `gt-react` ou `lingo.dev`, são claramente opções das
|
|
|
160
165
|
|
|
161
166
|
Problemas encontrados:
|
|
162
167
|
|
|
163
|
-
**(General Translation)** (`gt-react@
|
|
168
|
+
**(General Translation)** (`gt-react@10.18.3`):
|
|
164
169
|
|
|
165
|
-
- Para uma app de cerca de
|
|
170
|
+
- Para uma app de cerca de 111kb, o `gt-react` pode adicionar mais de 170kb extras (ordem de grandeza vista na implementação do Next.js no mesmo benchmark).
|
|
166
171
|
- `Quota Exceeded, please upgrade your plan` logo no primeiro build com a General Translation.
|
|
167
172
|
- Traduções não são renderizadas; recebo o erro `Error: <T> used on the client-side outside of <GTProvider>`, o que parece ser um bug na biblioteca.
|
|
168
173
|
- Ao implementar o **gt-tanstack-start-react**, também encontrei um [problema](https://github.com/generaltranslation/gt/issues/1210#event-24510646961) com a biblioteca: `does not provide an export named 'printAST' - @formatjs/icu-messageformat-parser`, que fazia a aplicação falhar. Após relatar esse problema, o mantenedor corrigiu-o em 24 horas.
|
|
169
174
|
- Essas bibliotecas usam um antipadrão através da função `initializeGT()`, impedindo que o bundle seja limpo corretamente via tree-shaking.
|
|
170
175
|
|
|
171
|
-
**(Lingo.dev)** (`lingo.dev@0.
|
|
176
|
+
**(Lingo.dev)** (`lingo.dev@0.138.7`):
|
|
172
177
|
|
|
173
178
|
- Cota de IA excedida (ou dependência de servidor bloqueada), tornando o build / produção arriscado sem pagar.
|
|
174
179
|
- O compilador estava perdendo quase 40% do conteúdo traduzido. Tive que reescrever todos os `.map` em blocos de componentes planos para fazer funcionar.
|
|
@@ -178,7 +183,7 @@ Problemas encontrados:
|
|
|
178
183
|
|
|
179
184
|
### 2 - Soluções experimentais
|
|
180
185
|
|
|
181
|
-
**(Wuchale)** (`wuchale@0.
|
|
186
|
+
**(Wuchale)** (`wuchale@0.26.6`):
|
|
182
187
|
|
|
183
188
|
A ideia por trás do `Wuchale` é interessante, mas ainda não é uma solução viável. Encontrei problemas de reatividade com a biblioteca e tive que forçar a re-renderização do provedor para fazer a aplicação funcionar no TanStack Start. A documentazione é também bastante incerta, o que torna a integração mais difícil.
|
|
184
189
|
|
|
@@ -188,9 +193,9 @@ A ideia por trás do `Wuchale` é interessante, mas ainda não é uma solução
|
|
|
188
193
|
|
|
189
194
|
O `Paraglide` oferece uma abordagem inovadora e bem pensada. Mesmo assim, neste benchmark, o tree-shaking anunciado pela empresa não funcionou para minha implementação no Next.js ou para o TanStack Start. O fluxo de trabalho e o DX também são mais complexos do que outras opções. Pessoalmente, não sou fã de ter que regenerar arquivos JS antes de cada push, o que cria um risco constante de conflitos de merge para os desenvolvedores via PRs.
|
|
190
195
|
|
|
191
|
-
> Nota sobre o paraglide: a solução injeta código na sua base de código para as importações; como resultado, a métrica 'lib size' no relatório de benchmark é quase 0. A geração de código é algo bom, porque a função utilizada incluirá apenas a lógica necessária (prefixo em todos os lugares vs. sem prefixo, cookie vs. armazenamento, etc.). Em comparação, o Intlayer realiza essa filtragem via injeções de variáveis de ambiente no build para forçar o bundler a fazer o tree-shaking do conteúdo dependendo da lógica. Graças a isso, o paraglide e o intlayer acabam sendo soluções
|
|
196
|
+
> Nota sobre o paraglide: a solução injeta código na sua base de código para as importações; como resultado, a métrica 'lib size' no relatório de benchmark é quase 0. A geração de código é algo bom, porque a função utilizada incluirá apenas a lógica necessária (prefixo em todos os lugares vs. sem prefixo, cookie vs. armazenamento, etc.). Em comparação, o Intlayer realiza essa filtragem via injeções de variáveis de ambiente no build para forçar o bundler a fazer o tree-shaking do conteúdo dependendo da lógica. Graças a isso, o paraglide e o intlayer acabam sendo soluções 3 a 10 vezes mais leves que o i18next ou o next-intl.
|
|
192
197
|
|
|
193
|
-
**(Tolgee)** (`@tolgee/react@7.
|
|
198
|
+
**(Tolgee)** (`@tolgee/react@7.2.0`):
|
|
194
199
|
|
|
195
200
|
O `Tolgee` resolve muitos dos problemas mencionados anteriormente. Achei mais difícil de começar com ele do que com outras ferramentas com abordagens semelhantes. Ele não fornece segurança de tipos, o que também torna muito difícil encontrar chaves ausentes no momento da compilação. Tive que envolver as APIs do Tolgee com as minhas para adicionar a detecção de chaves ausentes.
|
|
196
201
|
|
|
@@ -198,37 +203,37 @@ O package é bastante pesado (~11.1kb, o que é mais de 2× `react-intlayer`).
|
|
|
198
203
|
|
|
199
204
|
No TanStack Start também tive problemas de reatividade: na mudança de localidade, tive que forçar o provedor a renderizar novamente e me inscrever em eventos de mudança de localidade para que o carregamento em outro idioma se comportasse corretamente.
|
|
200
205
|
|
|
201
|
-
**(use-intl)** (`use-intl@4.
|
|
206
|
+
**(use-intl)** (`use-intl@4.14.2`):
|
|
202
207
|
|
|
203
208
|
O `use-intl` é a peça "intl" mais badalada no ecossistema React (mesma família do `next-intl`) e é frequentemente recomendada por agentes de IA, mas, na minha visão, erroneamente em um ambiente focado em desempenho. Começar é bastante simples. Na prática, o processo para otimizar e limitar o vazamento é bastante complexo. Da mesma forma, combinar carregamento dinâmico + namespaces + tipos TypeScript retarda muito o desenvolvimento.
|
|
204
209
|
|
|
205
210
|
No TanStack Start, você evita as armadilhas específicas do Next.js (`setRequestLocale`, renderização estática), mas o problema principal é o mesmo: sem uma disciplina rigorosa, o bundle rapidamente carrega muitas mensagens e a manutenção de namespaces por rota torna-se penosa.
|
|
206
211
|
|
|
207
|
-
**(react-i18next)** (`react-i18next@17.0.
|
|
212
|
+
**(react-i18next)** (`react-i18next@17.0.13`):
|
|
208
213
|
|
|
209
214
|
O `react-i18next` é provavelmente a opção mais popular porque foi uma das primeiras a atender às necessidades de i18n de aplicações JavaScript. Também possui um amplo conjunto de plugins da comunidade para problemas específicos.
|
|
210
215
|
|
|
211
216
|
Ainda assim, compartilha os mesmos grandes pontos negativos que as stacks baseadas em `t('a.b.c')`: as otimizações são possíveis, mas consomem muito tempo, e grandes projetos correm o risco de cair em más práticas (namespaces + carregamento dinâmico + tipos).
|
|
212
217
|
|
|
213
|
-
O package é especialmente pesado (~
|
|
218
|
+
O package é especialmente pesado (~18.4kb, o que é aproximadamente 3.5× `react-intlayer`).
|
|
214
219
|
|
|
215
220
|
Os formatos de mensagem também divergem: o `use-intl` usa ICU MessageFormat, enquanto o `i18next` usa seu próprio formato - o que complica o ferramental ou migrações se você os misturar.
|
|
216
221
|
|
|
217
|
-
**(Lingui)** (`@lingui/core@
|
|
222
|
+
**(Lingui)** (`@lingui/core@6.6.0`):
|
|
218
223
|
|
|
219
224
|
O `Lingui` é frequentemente elogiado. Pessoalmente, achei o fluxo de trabalho em torno de `lingui extract` / `lingui compile` mais complexo do que outras abordagens, sem uma vantagem clara neste benchmark do TanStack Start. Também notei sintaxes inconsistentes que confundem as IAs (ex: `t()`, `t''`, `i18n.t()`, `<Trans>`).
|
|
220
225
|
|
|
221
|
-
**(react-intl)** (`react-intl@10.1.
|
|
226
|
+
**(react-intl)** (`react-intl@10.1.26`):
|
|
222
227
|
|
|
223
228
|
O `react-intl` é uma implementação de alto desempenho da equipe do Format.js. O DX permanece prolixo: `const intl = useIntl()` + `intl.formatMessage({ id: "xx.xx" })` adiciona complexidade, trabalho extra de JavaScript e vincula a instância global de i18n a muitos nós na árvore React.
|
|
224
229
|
|
|
225
|
-
O package também é pesado (~
|
|
230
|
+
O package também é pesado (~15.3kb, o que é cerca de 3× `react-intlayer`).
|
|
226
231
|
|
|
227
232
|
### 4 - Recomendações
|
|
228
233
|
|
|
229
234
|
Este benchmark do TanStack Start não possui um equivalente direto do `next-translate` (plugin Next.js + `getStaticProps`). Para as equipes que realmente desejam uma API `t()` com um ecossistema maduro, o `react-i18next` e o `use-intl` continuam sendo escolhas "razoáveis", mas espere investir muito tempo otimizando para evitar vazamentos.
|
|
230
235
|
|
|
231
|
-
**(Intlayer)** (`react-intlayer@
|
|
236
|
+
**(Intlayer)** (`react-intlayer@9.5.1`):
|
|
232
237
|
|
|
233
238
|
Não serei eu a julgar pessoalmente o `react-intlayer` por uma questão de objetividade, já que é a minha própria solução.
|
|
234
239
|
|
package/docs/pt/benchmark/vue.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
createdAt: 2026-04-20
|
|
3
|
-
updatedAt: 2026-
|
|
3
|
+
updatedAt: 2026-09-11
|
|
4
4
|
title: Melhor solução i18n para Vue em 2026 - Relatório de Benchmark
|
|
5
5
|
description: Compare bibliotecas de internacionalização (i18n) para Vue como vue-i18n, fluent-vue e Intlayer. Relatório de desempenho detalhado sobre tamanho do bundle, vazamento e reatividade.
|
|
6
6
|
keywords:
|
|
@@ -17,6 +17,9 @@ slugs:
|
|
|
17
17
|
author: aymericzip
|
|
18
18
|
applicationTemplate: https://github.com/intlayer-org/benchmark-i18n-vue-template
|
|
19
19
|
history:
|
|
20
|
+
- version: 9.5.1
|
|
21
|
+
date: 2026-09-11
|
|
22
|
+
changes: "Atualização dos resultados do benchmark"
|
|
20
23
|
- version: 8.9.8
|
|
21
24
|
date: 2026-05-18
|
|
22
25
|
changes: "Adicionar comparativo de estrelas do GitHub"
|
|
@@ -62,7 +65,7 @@ O outro impacto é na experiência do desenvolvedor (DX): como você declara con
|
|
|
62
65
|
|
|
63
66
|
## TL;DR
|
|
64
67
|
|
|
65
|
-
- **Intlayer**: A solução mais leve (
|
|
68
|
+
- **Intlayer**: A solução mais leve (v9.5.0) com escopo (scoping) e carregamento dinâmico integrados.
|
|
66
69
|
- **vue-i18n**: O padrão da indústria com um rico ecossistema, mas pode se tornar significativamente mais pesado e difícil de otimizar para code-splitting em aplicações de grande porte.
|
|
67
70
|
- **fluent-vue**: Organização de mensagens inovadora, mas carece de segurança de tipos e acaba sendo uma solução extremamente pesada.
|
|
68
71
|
|
|
@@ -96,7 +99,8 @@ Sintaxes construídas em torno de `const { t } = useI18n()` + `t('a.b.c')` são
|
|
|
96
99
|
Para este benchmark, comparamos as seguintes bibliotecas:
|
|
97
100
|
|
|
98
101
|
- `Base App` (Sem biblioteca i18n)
|
|
99
|
-
- `vue-intlayer` (
|
|
102
|
+
- `vue-intlayer` (v9.5.0)
|
|
103
|
+
- [`@intlayer/vue-i18n`](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pt/compat/vue-i18n.md) (v9.5.1)
|
|
100
104
|
- `vue-i18n` (v11.4.0)
|
|
101
105
|
- `fluent-vue` (v3.8.2)
|
|
102
106
|
|
|
@@ -156,14 +160,14 @@ As estrelas do GitHub são um forte indicador da popularidade de um projeto, da
|
|
|
156
160
|
|
|
157
161
|
- **vue-i18n** é sem contestação a biblioteca i18n mais usada para Vue, possui muitos recursos e um ecossistema enorme. Mas, nos bastidores, a solução é bastante pesada. Mesmo que o vue-i18n integre lazy loading para mensagens, falta um recurso de escopo (scoping). No caso de um app Vue SPA clássico, não há problema, mas para um app Nuxt, usando @nuxt/i18n, isso leva à inclusão das mensagens de todas as páginas em uma única. Para um app Nuxt grande com mais de 10 páginas, isso pode se tornar realmente problemático.
|
|
158
162
|
|
|
159
|
-
O pacote é muito pesado (~24.3kb, o que é cerca de
|
|
163
|
+
O pacote é muito pesado (~24.3kb, o que é cerca de 6× o `vue-intlayer`).
|
|
160
164
|
|
|
161
|
-
**(fluent-vue)** (`fluent-vue@
|
|
165
|
+
**(fluent-vue)** (`fluent-vue@3.8.2`):
|
|
162
166
|
|
|
163
|
-
- **fluent-vue** oferece uma tentativa de inovação através do formato .ftl. A organização das mensagens é ótima, mais fácil de começar. Mas na prática, a falta de segurança de tipos aumenta o risco de erro e pode rapidamente se tornar demorada para debugar. Além disso, essa solução carrega as mensagens usando um plugin vite que força o carregamento de todo o conteúdo em todos os idiomas em cada página. Adicionalmente, é uma solução extremamente pesada (~
|
|
167
|
+
- **fluent-vue** oferece uma tentativa de inovação através do formato .ftl. A organização das mensagens é ótima, mais fácil de começar. Mas na prática, a falta de segurança de tipos aumenta o risco de erro e pode rapidamente se tornar demorada para debugar. Além disso, essa solução carrega as mensagens usando um plugin vite que força o carregamento de todo o conteúdo em todos os idiomas em cada página. Adicionalmente, é uma solução extremamente pesada (~29.7kb, o que é cerca de 7.5× o `vue-intlayer`).
|
|
164
168
|
|
|
165
169
|
### 3 - Recomendações
|
|
166
170
|
|
|
167
|
-
**(Intlayer)** (`vue-intlayer@
|
|
171
|
+
**(Intlayer)** (`vue-intlayer@9.5.0`):
|
|
168
172
|
|
|
169
173
|
Eu não julgarei pessoalmente o `vue-intlayer` por uma questão de objetividade, já que é minha própria solução.
|
package/docs/pt/cli/build.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
createdAt: 2024-08-11
|
|
3
|
-
updatedAt:
|
|
3
|
+
updatedAt: 2026-09-12
|
|
4
4
|
title: Construir Dicionários
|
|
5
5
|
description: Aprenda como construir seus dicionários Intlayer a partir de arquivos de declaração de conteúdo.
|
|
6
6
|
keywords:
|
|
@@ -14,6 +14,9 @@ slugs:
|
|
|
14
14
|
- cli
|
|
15
15
|
- build
|
|
16
16
|
history:
|
|
17
|
+
- version: 9.5.2
|
|
18
|
+
date: 2026-09-12
|
|
19
|
+
changes: "Adicionar o flag `--ci`"
|
|
17
20
|
- version: 8.1.5
|
|
18
21
|
date: 2026-02-23
|
|
19
22
|
changes: "Adicionar opção checkTypes"
|
|
@@ -92,6 +95,10 @@ Este comando irá localizar seus arquivos de declaração de conteúdo por padr
|
|
|
92
95
|
|
|
93
96
|
> Exemplo: `npx intlayer build --no-cache`
|
|
94
97
|
|
|
98
|
+
- **`--ci`**: Executa o comando em cada projeto Intlayer do monorepo (ou apenas no atual quando executado de dentro de um diretório de projeto). Credenciais por projeto podem ser injetadas via `INTLAYER_PROJECT_CREDENTIALS`, um objeto JSON que associa cada caminho de projeto a `{ "clientId", "clientSecret" }`.
|
|
99
|
+
|
|
100
|
+
> Exemplo: `npx intlayer build --ci`
|
|
101
|
+
|
|
95
102
|
- **`--check-types`**: Verifica os tipos dos arquivos de declaração de conteúdo.
|
|
96
103
|
|
|
97
104
|
> Exemplo: `npx intlayer build --check-types`
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
createdAt: 2024-08-11
|
|
3
|
-
updatedAt:
|
|
3
|
+
updatedAt: 2026-09-12
|
|
4
4
|
title: Gerenciar Configuração
|
|
5
5
|
description: Aprenda como obter e enviar sua configuração Intlayer para o CMS.
|
|
6
6
|
keywords:
|
|
@@ -51,6 +51,7 @@ bun x intlayer configuration get
|
|
|
51
51
|
- **`--base-dir`**: Especifica o diretório base para o projeto.
|
|
52
52
|
- **`--verbose`**: Ativa o log detalhado para depuração. (padrão para true usando CLI)
|
|
53
53
|
- **`--no-cache`**: Desativa o cache.
|
|
54
|
+
- **`--ci`**: Executa o comando em cada projeto Intlayer do monorepo (ou apenas no atual quando executado de dentro de um diretório de projeto). Credenciais por projeto podem ser injetadas via `INTLAYER_PROJECT_CREDENTIALS`, um objeto JSON que associa cada caminho de projeto a `{ "clientId", "clientSecret" }`.
|
|
54
55
|
|
|
55
56
|
## Enviar Configuração
|
|
56
57
|
|
|
@@ -84,5 +85,6 @@ bun x intlayer configuration push
|
|
|
84
85
|
- **`--base-dir`**: Especifica o diretório base para o projeto.
|
|
85
86
|
- **`--verbose`**: Ativa o log detalhado para depuração. (padrão para true usando CLI)
|
|
86
87
|
- **`--no-cache`**: Desativa o cache.
|
|
88
|
+
- **`--ci`**: Executa o comando em cada projeto Intlayer do monorepo (ou apenas no atual quando executado de dentro de um diretório de projeto). Credenciais por projeto podem ser injetadas via `INTLAYER_PROJECT_CREDENTIALS`, um objeto JSON que associa cada caminho de projeto a `{ "clientId", "clientSecret" }`.
|
|
87
89
|
|
|
88
90
|
Ao enviar a configuração, seu projeto fica totalmente integrado com o CMS do Intlayer, permitindo uma gestão fluida dos dicionários entre equipes.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
createdAt: 2024-08-11
|
|
3
|
-
updatedAt: 2026-
|
|
3
|
+
updatedAt: 2026-09-12
|
|
4
4
|
title: Revisar Documento
|
|
5
5
|
description: Aprenda como revisar arquivos de documentação para qualidade, consistência e completude em diferentes locais.
|
|
6
6
|
keywords:
|
|
@@ -16,6 +16,9 @@ slugs:
|
|
|
16
16
|
- cli
|
|
17
17
|
- doc-review
|
|
18
18
|
history:
|
|
19
|
+
- version: 9.5.2
|
|
20
|
+
date: 2026-09-12
|
|
21
|
+
changes: "Adicionar o flag `--ci`"
|
|
19
22
|
- version: 9.0.0
|
|
20
23
|
date: 2026-06-17
|
|
21
24
|
changes: "Adicionar opção --log"
|
|
@@ -138,6 +141,10 @@ Seja qual for o modo, a execução termina com uma síntese listando os document
|
|
|
138
141
|
|
|
139
142
|
> Exemplo: `npx intlayer doc review --base-dir ./docs --env-file .env.production.local`
|
|
140
143
|
|
|
144
|
+
- **`--ci`**: Executa o comando em cada projeto Intlayer do monorepo (ou apenas no atual quando executado de dentro de um diretório de projeto). Credenciais por projeto podem ser injetadas via `INTLAYER_PROJECT_CREDENTIALS`, um objeto JSON que associa cada caminho de projeto a `{ "clientId", "clientSecret" }`.
|
|
145
|
+
|
|
146
|
+
> Exemplo: `npx intlayer doc review --ci`
|
|
147
|
+
|
|
141
148
|
**Opções de log:**
|
|
142
149
|
|
|
143
150
|
- **`--verbose`**: Ativa o log detalhado para depuração. (padrão para true usando CLI)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
createdAt: 2024-08-11
|
|
3
|
-
updatedAt:
|
|
3
|
+
updatedAt: 2026-09-12
|
|
4
4
|
title: Traduzir Documento
|
|
5
5
|
description: Aprenda como traduzir automaticamente arquivos de documentação usando serviços de tradução por IA.
|
|
6
6
|
keywords:
|
|
@@ -113,6 +113,10 @@ bun x intlayer doc translate
|
|
|
113
113
|
|
|
114
114
|
> Exemplo: `npx intlayer doc translate --base-dir ./docs --env-file .env.production.local`
|
|
115
115
|
|
|
116
|
+
- **`--ci`**: Executa o comando em cada projeto Intlayer do monorepo (ou apenas no atual quando executado de dentro de um diretório de projeto). Credenciais por projeto podem ser injetadas via `INTLAYER_PROJECT_CREDENTIALS`, um objeto JSON que associa cada caminho de projeto a `{ "clientId", "clientSecret" }`.
|
|
117
|
+
|
|
118
|
+
> Exemplo: `npx intlayer doc translate --ci`
|
|
119
|
+
|
|
116
120
|
**Opções de log:**
|
|
117
121
|
|
|
118
122
|
- **`--verbose`**: Ativa o log detalhado para depuração. (padrão para true usando CLI)
|
package/docs/pt/cli/extract.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
createdAt: 2024-08-11
|
|
3
|
-
updatedAt:
|
|
3
|
+
updatedAt: 2026-09-12
|
|
4
4
|
title: Extrair strings
|
|
5
5
|
description: Aprenda como extrair strings dos seus componentes para um ficheiro .content próximo do componente.
|
|
6
6
|
keywords:
|
|
@@ -69,6 +69,7 @@ Este comando analisa os seus ficheiros de código para extrair strings dos compo
|
|
|
69
69
|
- **`--env`**: Especifica o ambiente.
|
|
70
70
|
- **`--env-file`**: Fornece um ficheiro de ambiente personalizado.
|
|
71
71
|
- **`--verbose`**: Ativa o logging detalhado.
|
|
72
|
+
- **`--ci`**: Executa o comando em cada projeto Intlayer do monorepo (ou apenas no atual quando executado de dentro de um diretório de projeto). Credenciais por projeto podem ser injetadas via `INTLAYER_PROJECT_CREDENTIALS`, um objeto JSON que associa cada caminho de projeto a `{ "clientId", "clientSecret" }`.
|
|
72
73
|
|
|
73
74
|
**Plugins obrigatórios:**
|
|
74
75
|
|
package/docs/pt/cli/fill.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
createdAt: 2024-08-11
|
|
3
|
-
updatedAt:
|
|
3
|
+
updatedAt: 2026-09-12
|
|
4
4
|
title: Preencher Dicionários
|
|
5
5
|
description: Aprenda como preencher, auditar e traduzir seus dicionários usando IA.
|
|
6
6
|
keywords:
|
|
@@ -162,6 +162,10 @@ Affected dictionary keys for processing: app, comp-test, hello-world, lang-switc
|
|
|
162
162
|
|
|
163
163
|
> Exemplo: `npx intlayer build --no-cache`
|
|
164
164
|
|
|
165
|
+
- **`--ci`**: Executa o comando em cada projeto Intlayer do monorepo (ou apenas no atual quando executado de dentro de um diretório de projeto). Credenciais por projeto podem ser injetadas via `INTLAYER_PROJECT_CREDENTIALS`, um objeto JSON que associa cada caminho de projeto a `{ "clientId", "clientSecret" }`.
|
|
166
|
+
|
|
167
|
+
> Exemplo: `npx intlayer fill --ci`
|
|
168
|
+
|
|
165
169
|
**Opções de preparação:**
|
|
166
170
|
|
|
167
171
|
- **`--build`**: Constrói os dicionários antes de enviar para garantir que o conteúdo esteja atualizado. True força a construção, false pula a construção, undefined permite usar o cache da construção.
|