@intlayer/docs 9.5.0 → 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 +20 -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 +20 -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 +1 -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_nextjs_15.md +1 -1
- package/docs/ar/intlayer_with_nextjs_16.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_nextjs_15.md +1 -1
- package/docs/de/intlayer_with_nextjs_16.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_nextjs_15.md +1 -1
- package/docs/en/intlayer_with_nextjs_16.md +1 -1
- package/docs/en/intlayer_with_remix_3.md +540 -0
- 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_nextjs_15.md +1 -1
- package/docs/en-GB/intlayer_with_nextjs_16.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_nextjs_15.md +1 -1
- package/docs/es/intlayer_with_nextjs_16.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_nextjs_15.md +1 -1
- package/docs/fr/intlayer_with_nextjs_16.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_nextjs_15.md +1 -1
- package/docs/hi/intlayer_with_nextjs_16.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_nextjs_15.md +1 -1
- package/docs/id/intlayer_with_nextjs_16.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_nextjs_15.md +1 -1
- package/docs/it/intlayer_with_nextjs_16.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_nextjs_15.md +1 -1
- package/docs/ja/intlayer_with_nextjs_16.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_nextjs_15.md +1 -1
- package/docs/pl/intlayer_with_nextjs_16.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_nextjs_15.md +1 -1
- package/docs/pt/intlayer_with_nextjs_16.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_nextjs_15.md +1 -1
- package/docs/ru/intlayer_with_nextjs_16.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_nextjs_15.md +1 -1
- package/docs/tr/intlayer_with_nextjs_16.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_nextjs_15.md +1 -1
- package/docs/uk/intlayer_with_nextjs_16.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_nextjs_15.md +1 -1
- package/docs/vi/intlayer_with_nextjs_16.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_nextjs_15.md +1 -1
- package/docs/zh/intlayer_with_nextjs_16.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 +20 -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: Лучшее решение i18n для Next.js в 2026 году - Отчет о бенчмарке
|
|
5
5
|
description: Сравните библиотеки интернационализации (i18n) для Next.js, такие как next-intl, next-i18next и Intlayer. Подробный отчет о производительности, размере бандла, утечках и реактивности.
|
|
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: "Обновление результатов бенчмарка"
|
|
20
23
|
- version: 8.9.8
|
|
21
24
|
date: 2026-05-18
|
|
22
25
|
changes: "Добавить сравнение звезд GitHub"
|
|
@@ -56,7 +59,7 @@ style="border:none;"
|
|
|
56
59
|
|
|
57
60
|
По мере роста вашего приложения размер бандла может расти экспоненциально, что может заметно снизить производительность.
|
|
58
61
|
|
|
59
|
-
Например, в худших случаях после интернационализации ваша страница может стать почти в
|
|
62
|
+
Например, в худших случаях после интернационализации ваша страница может стать почти в 2 раза больше.
|
|
60
63
|
|
|
61
64
|
Еще одним последствием использования библиотек i18n является замедление разработки. Превращение компонентов в мультиязычный контент на разных языках отнимает много времени.
|
|
62
65
|
|
|
@@ -68,7 +71,7 @@ Intlayer пытается оптимизировать все эти аспек
|
|
|
68
71
|
|
|
69
72
|
- **Intlayer** и **next-translate**: Лучшие варианты для производительности Next.js, предлагающие минимальный размер и лучшую поддержку статического рендеринга.
|
|
70
73
|
- **next-intl**: Самый модный вариант, но тяжелый и сложный в оптимизации для больших приложений.
|
|
71
|
-
- **next-i18next**: Популярный и богатый плагинами, но имеет значительный вес бандла (~3× Intlayer).
|
|
74
|
+
- **next-i18next**: Популярный и богатый плагинами, но имеет значительный вес бандла (~3.5× Intlayer).
|
|
72
75
|
- **Избегайте**: **gt-next** и **lingo.dev** из-за серьезных проблем с производительностью, привязки к вендору и багов, ломающих сборку.
|
|
73
76
|
|
|
74
77
|
## Проверьте свое приложение
|
|
@@ -109,19 +112,21 @@ Intlayer пытается оптимизировать все эти аспек
|
|
|
109
112
|
Для этого бенчмарка мы сравнили следующие библиотеки:
|
|
110
113
|
|
|
111
114
|
- `Base App` (Без библиотеки 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/ru/compat/next-intl.md) (v9.5.1)
|
|
117
|
+
- [`@intlayer/next-i18next`](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/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
|
-
Я использовал `Next.js` версии `16.
|
|
129
|
+
Я использовал `Next.js` версии `16.3.4` с App Router.
|
|
125
130
|
|
|
126
131
|
Я построил мультиязычное приложение с **10 страницами** и **10 языками**.
|
|
127
132
|
|
|
@@ -175,15 +180,15 @@ Intlayer пытается оптимизировать все эти аспек
|
|
|
175
180
|
|
|
176
181
|
Встреченные проблемы:
|
|
177
182
|
|
|
178
|
-
**(General Translation)** (`gt-next@
|
|
183
|
+
**(General Translation)** (`gt-next@11.1.24`):
|
|
179
184
|
|
|
180
|
-
- Для приложения весом
|
|
185
|
+
- Для приложения весом 141 КБ `gt-next` добавляет более 50 КБ сверху.
|
|
181
186
|
- `Quota Exceeded, please upgrade your plan` (Квота превышена, пожалуйста, обновите тарифный план) при самой первой сборке с General Translation.
|
|
182
187
|
- Переводы не отображаются; я получаю ошибку `Error: <T> used on the client-side outside of <GTProvider>`, что кажется багом библиотеки.
|
|
183
188
|
- При внедрении **gt-next** я также столкнулся с [проблемой](https://github.com/generaltranslation/gt/issues/1210#event-24510646961) в библиотеке: `does not provide an export named 'printAST' - @formatjs/icu-messageformat-parser`, которая приводила к поломке приложения. После сообщения об этой проблеме сопровождающий исправил ее в течение 24 часов.
|
|
184
189
|
- Библиотека блокирует статический рендеринг страниц 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
|
- Квота AI превышена, что полностью блокирует сборку - вы не можете отправить приложение в продакшн без оплаты.
|
|
189
194
|
- Компилятор пропустил почти 40% переведенного контента. Мне пришлось переписать все вызовы `.map` в плоские блоки компонентов, чтобы это заработало.
|
|
@@ -192,7 +197,7 @@ Intlayer пытается оптимизировать все эти аспек
|
|
|
192
197
|
|
|
193
198
|
### 2 - Экспериментальные решения
|
|
194
199
|
|
|
195
|
-
**(Wuchale)** (`wuchale@0.
|
|
200
|
+
**(Wuchale)** (`wuchale@0.26.6`):
|
|
196
201
|
|
|
197
202
|
Идея `Wuchale` интересна, но проект пока не жизнеспособен. Я столкнулся с проблемами реактивности и был вынужден принудительно перерендеривать провайдер, чтобы приложение заработало. Документация также довольно неясная, что затрудняет начало работы.
|
|
198
203
|
|
|
@@ -202,21 +207,21 @@ Intlayer пытается оптимизировать все эти аспек
|
|
|
202
207
|
Лично мне не нравится необходимость перегенерировать JS-файлы перед каждым пушем, что создает постоянный риск конфликтов слияния в PR. Инструмент также кажется более ориентированным на Vite, чем на Next.js.
|
|
203
208
|
Наконец, по сравнению с другими решениями, Paraglide не использует хранилище (например, React context) для получения текущей локали для рендеринга контента. Для каждого обрабатываемого узла он запрашивает локаль из localStorage / куки и т.д. Это приводит к выполнению ненужной логики, которая влияет на реактивность компонентов.
|
|
204
209
|
|
|
205
|
-
> Примечание по paraglide: решение внедряет код в вашу кодовую базу для импорта, в результате показатель 'размер библиотеки' в отчете о бенчмарке практически равен 0. Генерация кода - это хорошо, так как используемая функция будет включать только необходимую логику (все префиксы против отсутствия префиксов, куки против хранилища и т.д.). В сравнении с этим, Intlayer выполняет фильтрацию с помощью внедрения переменных окружения в сборку, чтобы заставить сборщик исключить контент в зависимости от логики. Благодаря этому paraglide и intlayer оказываются в
|
|
210
|
+
> Примечание по paraglide: решение внедряет код в вашу кодовую базу для импорта, в результате показатель 'размер библиотеки' в отчете о бенчмарке практически равен 0. Генерация кода - это хорошо, так как используемая функция будет включать только необходимую логику (все префиксы против отсутствия префиксов, куки против хранилища и т.д.). В сравнении с этим, Intlayer выполняет фильтрацию с помощью внедрения переменных окружения в сборку, чтобы заставить сборщик исключить контент в зависимости от логики. Благодаря этому paraglide и intlayer оказываются в 3-8 раз легче, чем i18next или next-intl.
|
|
206
211
|
|
|
207
212
|
### 3 - Приемлемые решения
|
|
208
213
|
|
|
209
|
-
**(Tolgee)** (`@tolgee/react@7.
|
|
214
|
+
**(Tolgee)** (`@tolgee/react@7.2.0`):
|
|
210
215
|
|
|
211
216
|
`Tolgee` решает многие из упомянутых ранее проблем. Мне показалось, что его сложнее внедрить, чем аналогичные инструменты. Он не обеспечивает типобезопасность, что также затрудняет отлов отсутствующих ключей на этапе компиляции. Мне пришлось обернуть функции Tolgee своими собственными, чтобы добавить обнаружение отсутствующих ключей.
|
|
212
217
|
|
|
213
|
-
**(Next Intl)** (`next-intl@4.
|
|
218
|
+
**(Next Intl)** (`next-intl@4.14.2`):
|
|
214
219
|
|
|
215
|
-
`next-intl` - самый модный вариант, который чаще всего продвигают AI-агенты, но, на мой взгляд, ошибочно. Начать работу легко. На практике оптимизация для ограничения утечек сложна. Сочетание динамической загрузки + пространств имен + типов TypeScript сильно замедляет разработку. Пакет также довольно тяжелый (~
|
|
220
|
+
`next-intl` - самый модный вариант, который чаще всего продвигают AI-агенты, но, на мой взгляд, ошибочно. Начать работу легко. На практике оптимизация для ограничения утечек сложна. Сочетание динамической загрузки + пространств имен + типов TypeScript сильно замедляет разработку. Пакет также довольно тяжелый (~14.7 КБ для `NextIntlClientProvider` + `useTranslations`, что более чем в 2.5 раза больше `next-intlayer`). **next-intl** раньше блокировал статический рендеринг страниц Next.js. Он предоставляет помощник под названием `setRequestLocale()`. Кажется, это частично решено для централизованных файлов типа `en.json` / `fr.json`, но статический рендеринг все равно ломается, когда контент разделен на пространства имен, такие как `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
|
-
`next-i18next`, вероятно, является самым популярным вариантом, так как был одним из первых i18n-решений для JavaScript-приложений. У него много плагинов от сообщества. У него те же основные недостатки, что и у `next-intl`. Пакет особенно тяжелый (~
|
|
224
|
+
`next-i18next`, вероятно, является самым популярным вариантом, так как был одним из первых i18n-решений для JavaScript-приложений. У него много плагинов от сообщества. У него те же основные недостатки, что и у `next-intl`. Пакет особенно тяжелый (~19.7 КБ для `I18nProvider` + `useTranslation`, примерно в 3.5 раза тяжелее `next-intlayer`).
|
|
220
225
|
|
|
221
226
|
Форматы сообщений также различаются: `next-intl` использует ICU MessageFormat, тогда как `i18next` использует свой собственный формат.
|
|
222
227
|
|
|
@@ -224,17 +229,17 @@ Intlayer пытается оптимизировать все эти аспек
|
|
|
224
229
|
|
|
225
230
|
`next-international` также решает вышеуказанные проблемы, но не сильно отличается от `next-intl` или `next-i18next`. Он включает `scopedT()` для переводов внутри пространств имен, но его использование практически не влияет на размер бандла.
|
|
226
231
|
|
|
227
|
-
**(Lingui)** (`@lingui/core@
|
|
232
|
+
**(Lingui)** (`@lingui/core@6.6.0`):
|
|
228
233
|
|
|
229
234
|
`Lingui` часто хвалят. Лично мне рабочий процесс с `lingui extract` / `lingui compile` показался более сложным, чем у альтернатив, без явных преимуществ. Я также заметил непоследовательный синтаксис, который путает AI (например, `t()`, `t''`, `i18n.t()`, `<Trans>`).
|
|
230
235
|
|
|
231
236
|
### 4 - Рекомендации
|
|
232
237
|
|
|
233
|
-
**(Next Translate)** (`next-translate@3.
|
|
238
|
+
**(Next Translate)** (`next-translate@3.2.0`):
|
|
234
239
|
|
|
235
|
-
`next-translate` - моя основная рекомендация, если вам нравится API в стиле `t()`. Он элегантен благодаря `next-translate-plugin`, загружая пространства имен через `getStaticProps` с помощью загрузчика Webpack / Turbopack. Это также
|
|
240
|
+
`next-translate` - моя основная рекомендация, если вам нравится API в стиле `t()`. Он элегантен благодаря `next-translate-plugin`, загружая пространства имен через `getStaticProps` с помощью загрузчика Webpack / Turbopack. Это также один из самых легких вариантов (~3.5 КБ). Что касается пространств имен, их определение для каждой страницы или маршрута в конфиге хорошо продумано и проще в обслуживании, чем основные альтернативы, такие как **next-intl** или **next-i18next**. В версии `3.1.2` я заметил, что статический рендеринг не работал; Next.js откатывался к динамическому рендерингу.
|
|
236
241
|
|
|
237
|
-
**(Intlayer)** (`next-intlayer@
|
|
242
|
+
**(Intlayer)** (`next-intlayer@9.5.1`):
|
|
238
243
|
|
|
239
244
|
Я не буду лично судить о `next-intlayer` ради объективности, так как это мое собственное решение.
|
|
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: Лучшее i18n решение для Solid в 2026 году - Отчет о бенчмарке
|
|
5
5
|
description: Сравните библиотеки интернационализации (i18n) для Solid, такие как solid-primitives, solid-i18next и Intlayer. Подробный отчет о производительности, размере бандла, утечках и реактивности.
|
|
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: "Обновление результатов бенчмарка"
|
|
20
23
|
- version: 8.9.8
|
|
21
24
|
date: 2026-05-18
|
|
22
25
|
changes: "Добавить сравнение звезд GitHub"
|
|
@@ -61,9 +64,9 @@ history:
|
|
|
61
64
|
|
|
62
65
|
## TL;DR
|
|
63
66
|
|
|
64
|
-
- **Intlayer**: Рекомендуемый выбор для профессиональных Solid-приложений, требующих расширенных функций и оптимизации (
|
|
67
|
+
- **Intlayer**: Рекомендуемый выбор для профессиональных Solid-приложений, требующих расширенных функций и оптимизации (v9.5.0).
|
|
65
68
|
- **@solid-primitives/i18n**: Отличная легкая альтернатива для простых проектов, хотя ей не хватает расширенных функций, таких как ленивая загрузка.
|
|
66
|
-
- **solid-i18next**: Стандартный, но тяжелый вариант (~
|
|
69
|
+
- **solid-i18next**: Стандартный, но тяжелый вариант (~3.5 раза больше Intlayer) с теми же недостатками, что и React i18next.
|
|
67
70
|
- **Paraglide**: Инновационный подход, но сложный DX и проблемы с tree-shaking в некоторых конфигурациях.
|
|
68
71
|
|
|
69
72
|
## Проверьте свое приложение
|
|
@@ -96,10 +99,10 @@ history:
|
|
|
96
99
|
Для этого бенчмарка мы сравнили следующие библиотеки:
|
|
97
100
|
|
|
98
101
|
- `Base App` (Без библиотеки i18n)
|
|
99
|
-
- `solid-intlayer` (
|
|
102
|
+
- `solid-intlayer` (v9.5.0)
|
|
100
103
|
- `@solid-primitives/i18n` (v2.2.1)
|
|
101
|
-
- `solid-i18next` (
|
|
102
|
-
- `@inlang/paraglide-js` (v2.
|
|
104
|
+
- `i18next` (v26.0.8) + `@mbarzda/solid-i18next` (v1.4.1)
|
|
105
|
+
- `@inlang/paraglide-js` (v2.25.1)
|
|
103
106
|
|
|
104
107
|
Фреймворк - `Solid` с мультиязычным приложением из **10 страниц** и **10 языков**.
|
|
105
108
|
|
|
@@ -153,11 +156,11 @@ history:
|
|
|
153
156
|
|
|
154
157
|
### 2 - Приемлемые решения
|
|
155
158
|
|
|
156
|
-
**(solid-i18next)** (`
|
|
159
|
+
**(solid-i18next)** (`i18next@26.0.8`):
|
|
157
160
|
|
|
158
161
|
`solid-i18next`, вероятно, является самым популярным вариантом, так как был одним из первых решений для нужд i18n в JavaScript-приложениях. У него также есть широкий набор плагинов от сообщества для конкретных задач.
|
|
159
162
|
|
|
160
|
-
Пакет тяжелый (~14.
|
|
163
|
+
Пакет тяжелый (~14.9 КБ, что примерно в 3.5 раза больше `solid-intlayer`).
|
|
161
164
|
|
|
162
165
|
Тем не менее, у него те же основные недостатки, что и у стеков, построенных на `t('a.b.c')`: оптимизация возможна, но отнимает очень много времени, а большие проекты рискуют столкнуться с плохими практиками (пространства имен + динамическая загрузка + типы).
|
|
163
166
|
|
|
@@ -166,7 +169,7 @@ history:
|
|
|
166
169
|
Solid primitive чрезвычайно легкий и эффективный. Я рекомендую это решение для небольших проектов, но ему может быстро перестать хватать функций для профессиональных решений, включая управление куки, перенаправление прокси, форматировщики и т. д.
|
|
167
170
|
В нем также отсутствует ленивая загрузка и разделение пространств имен для оптимизации размера страницы.
|
|
168
171
|
|
|
169
|
-
**(Paraglide)** (`@inlang/paraglide-js@2.
|
|
172
|
+
**(Paraglide)** (`@inlang/paraglide-js@2.25.1`):
|
|
170
173
|
|
|
171
174
|
`Paraglide` предлагает инновационный, хорошо продуманный подход. Тем не менее, в этом бенчмарке рекламируемый ими tree-shaking не сработал для моей реализации. Процесс работы и DX также сложнее, чем у других вариантов.
|
|
172
175
|
Лично мне не нравится необходимость регенерировать JS-файлы перед каждым пушем, что создает постоянный риск конфликтов при слиянии в PR.
|
|
@@ -174,7 +177,7 @@ Solid primitive чрезвычайно легкий и эффективный.
|
|
|
174
177
|
|
|
175
178
|
### 3 - Рекомендации
|
|
176
179
|
|
|
177
|
-
**(Intlayer)** (`solid-intlayer@
|
|
180
|
+
**(Intlayer)** (`solid-intlayer@9.5.0`):
|
|
178
181
|
|
|
179
182
|
Я не буду лично оценивать `solid-intlayer` ради объективности, так как это мое собственное решение.
|
|
180
183
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
createdAt: 2026-04-20
|
|
3
|
-
updatedAt: 2026-
|
|
3
|
+
updatedAt: 2026-09-11
|
|
4
4
|
title: Лучшее i18n решение для Svelte в 2026 году - Отчет о бенчмарке
|
|
5
5
|
description: Сравните библиотеки интернационализации (i18n) для Svelte, такие как svelte-i18n, Paraglide и Intlayer. Подробный отчет о производительности, размере бандла, утечках и реактивности.
|
|
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: "Обновление результатов бенчмарка"
|
|
20
23
|
- version: 8.9.8
|
|
21
24
|
date: 2026-05-18
|
|
22
25
|
changes: "Добавить сравнение звезд GitHub"
|
|
@@ -62,9 +65,9 @@ style="border:none;"
|
|
|
62
65
|
|
|
63
66
|
## TL;DR
|
|
64
67
|
|
|
65
|
-
- **Intlayer**: Самый эффективный выбор с точки зрения производительности (
|
|
68
|
+
- **Intlayer**: Самый эффективный выбор с точки зрения производительности (v9.5.0) с минимальным влиянием на размер.
|
|
66
69
|
- **Paraglide**: Сильный конкурент для tree-shaking, но имеет более сложный опыт разработки и накладные расходы на реактивность.
|
|
67
|
-
- **svelte-i18n**: Полнофункциональный и стандартный для Svelte, но имеет гораздо больший вес бандла (~
|
|
70
|
+
- **svelte-i18n**: Полнофункциональный и стандартный для Svelte, но имеет гораздо больший вес бандла (~4.5 раз больше Intlayer).
|
|
68
71
|
|
|
69
72
|
## Проверьте свое приложение
|
|
70
73
|
|
|
@@ -96,9 +99,9 @@ style="border:none;"
|
|
|
96
99
|
Для этого бенчмарка мы сравнили следующие библиотеки:
|
|
97
100
|
|
|
98
101
|
- `Base App` (Без библиотеки 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
|
Фреймворк - `Svelte` с мультиязычным приложением из **10 страниц** и **10 языков**.
|
|
104
107
|
|
|
@@ -152,7 +155,7 @@ style="border:none;"
|
|
|
152
155
|
|
|
153
156
|
### 2 - Приемлемые решения
|
|
154
157
|
|
|
155
|
-
**(Paraglide)** (`@inlang/paraglide-js@2.
|
|
158
|
+
**(Paraglide)** (`@inlang/paraglide-js@2.25.1`):
|
|
156
159
|
|
|
157
160
|
`Paraglide` предлагает инновационный, хорошо продуманный подход. В контексте приложения Vite + Svelte рекламируемый ими tree-shaking работает как ожидалось, что здорово.
|
|
158
161
|
Но в случае с React + TanStack Start tree-shaking не сработал как ожидалось, то же самое и с Next.js. Тем не менее, я бы перепроверил использование Paraglide в проектах Svelte и TanStack Start.
|
|
@@ -162,13 +165,13 @@ style="border:none;"
|
|
|
162
165
|
|
|
163
166
|
> Примечание о paraglide: решение внедряет код в вашу кодовую базу для импорта, в результате чего метрика 'размер библиотеки' в отчете бенчмарка практически равна 0. Генерация кода - это хорошо, потому что используемая функция будет включать только необходимую логику (полный префикс против отсутствия префикса, куки против хранилища и т. д.). Для сравнения, Intlayer выполняет эту фильтрацию с помощью внедрения переменных окружения во время сборки (build time), чтобы заставить бандлер выполнять tree-shaking контента в зависимости от логики. Благодаря этому paraglide и intlayer в итоге оказываются в 6-10 раз легче, чем i18next или next-intl.
|
|
164
167
|
|
|
165
|
-
**(svelte-i18n)** (`svelte-i18n@
|
|
168
|
+
**(svelte-i18n)** (`svelte-i18n@4.0.1`):
|
|
166
169
|
|
|
167
|
-
Это решение отвечает всем потребностям i18n в Svelte-проекте. Но, как и в случае с i18next или другими основными решениями i18n, оно немного тяжеловато (~
|
|
170
|
+
Это решение отвечает всем потребностям i18n в Svelte-проекте. Но, как и в случае с i18next или другими основными решениями i18n, оно немного тяжеловато (~16.6 КБ, что примерно в 4.5 раз больше `svelte-intlayer`).
|
|
168
171
|
|
|
169
172
|
### 3 - Рекомендации
|
|
170
173
|
|
|
171
|
-
**(Intlayer)** (`svelte-intlayer@
|
|
174
|
+
**(Intlayer)** (`svelte-intlayer@9.5.0`):
|
|
172
175
|
|
|
173
176
|
Я не буду лично оценивать `svelte-intlayer` ради объективности, так как это мое собственное решение.
|
|
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: Лучшее решение i18n для TanStack Start в 2026 году - Отчет о бенчмарке
|
|
5
5
|
description: Сравните библиотеки интернационализации для TanStack Start, такие как react-i18next, use-intl и Intlayer. Подробный отчет о производительности, размере бандла, утечках и реактивности.
|
|
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: "Обновление результатов бенчмарка"
|
|
20
23
|
- version: 8.9.8
|
|
21
24
|
date: 2026-05-18
|
|
22
25
|
changes: "Добавить сравнение звезд GitHub"
|
|
@@ -62,7 +65,7 @@ history:
|
|
|
62
65
|
|
|
63
66
|
## TL;DR
|
|
64
67
|
|
|
65
|
-
- **Intlayer**: Обеспечивает лучшую производительность и наименьший размер бандла (
|
|
68
|
+
- **Intlayer**: Обеспечивает лучшую производительность и наименьший размер бандла (v9.5.1) для TanStack Start.
|
|
66
69
|
- **react-i18next** и **use-intl**: Зрелые альтернативы с большими экосистемами, но значительно тяжелее и сложнее в оптимизации.
|
|
67
70
|
- **Paraglide**: Инновационная идея tree-shaking, которая не работает на практике. Сложный DX и накладные расходы на реактивность в TanStack Start.
|
|
68
71
|
- **Избегайте**: **General Translation (GT)** и **Lingo.dev** из-за серьезных проблем с производительностью, лимитов AI и привязки к вендору (vendor lock-in).
|
|
@@ -97,16 +100,18 @@ history:
|
|
|
97
100
|
Для этого бенчмарка мы сравнили следующие библиотеки:
|
|
98
101
|
|
|
99
102
|
- `Base App` (Без библиотеки 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/ru/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
|
Фреймворк - `TanStack Start` с мультиязычным приложением из **10 страниц** и **10 языков**.
|
|
112
117
|
|
|
@@ -160,15 +165,15 @@ history:
|
|
|
160
165
|
|
|
161
166
|
Встреченные проблемы:
|
|
162
167
|
|
|
163
|
-
**(General Translation)** (`gt-react@
|
|
168
|
+
**(General Translation)** (`gt-react@10.18.3`):
|
|
164
169
|
|
|
165
|
-
- Для приложения весом около
|
|
170
|
+
- Для приложения весом около 111 КБ `gt-react` может добавить более 170 КБ сверху (порядок величины, наблюдаемый в реализации Next.js в том же бенчмарке).
|
|
166
171
|
- `Quota Exceeded, please upgrade your plan` (Квота превышена, пожалуйста, обновите тарифный план) при самой первой сборке с General Translation.
|
|
167
172
|
- Переводы не отображаются; я получаю ошибку `Error: <T> used on the client-side outside of <GTProvider>`, что кажется багом библиотеки.
|
|
168
173
|
- При внедрении **gt-tanstack-start-react** я также столкнулся с [проблемой](https://github.com/generaltranslation/gt/issues/1210#event-24510646961) в библиотеке: `does not provide an export named 'printAST' - @formatjs/icu-messageformat-parser`, которая приводила к поломке приложения. После сообщения об этой проблеме сопровождающий исправил ее в течение 24 часов.
|
|
169
174
|
- Эти библиотеки используют антипаттерн через функцию `initializeGT()`, что мешает сборке чисто исключать неиспользуемый код (tree-shaking).
|
|
170
175
|
|
|
171
|
-
**(Lingo.dev)** (`lingo.dev@0.
|
|
176
|
+
**(Lingo.dev)** (`lingo.dev@0.138.7`):
|
|
172
177
|
|
|
173
178
|
- Квота AI превышена (или блокирующая зависимость от сервера), что делает сборку / продакшн рискованными без оплаты.
|
|
174
179
|
- Компилятор пропустил почти 40% переведенного контента. Мне пришлось переписать все вызовы `.map` в плоские блоки компонентов, чтобы это заработало.
|
|
@@ -178,7 +183,7 @@ history:
|
|
|
178
183
|
|
|
179
184
|
### 2 - Экспериментальные решения
|
|
180
185
|
|
|
181
|
-
**(Wuchale)** (`wuchale@0.
|
|
186
|
+
**(Wuchale)** (`wuchale@0.26.6`):
|
|
182
187
|
|
|
183
188
|
Идея `Wuchale` интересна, но это пока не жизнеспособное решение. Я столкнулся с проблемами реактивности в этой библиотеке и был вынужден принудительно перерендеривать провайдер, чтобы приложение заработало на TanStack Start. Документация также довольно неясная, что затрудняет начало работы.
|
|
184
189
|
|
|
@@ -188,9 +193,9 @@ history:
|
|
|
188
193
|
|
|
189
194
|
`Paraglide` предлагает инновационный, хорошо продуманный подход. Тем не менее, в этом бенчмарке обещанный tree-shaking не сработал ни для моей реализации на Next.js, ни для TanStack Start. Процесс работы и DX также сложнее, чем у других вариантов. Лично я не в восторге от необходимости перегенерировать JS-файлы перед каждым пушем, что создает постоянный риск конфликтов при слиянии в PR.
|
|
190
195
|
|
|
191
|
-
> Примечание о paraglide: решение внедряет код в вашу кодовую базу для импорта, в результате чего метрика 'размер библиотеки' в отчете бенчмарка практически равна 0. Генерация кода - это хорошо, потому что используемая функция будет включать только необходимую логику (полный префикс против отсутствия префикса, куки против хранилища и т. д.). Для сравнения, Intlayer выполняет эту фильтрацию с помощью внедрения переменных окружения в сборку, чтобы заставить бандлер выполнять tree-shaking контента в зависимости от логики. Благодаря этому paraglide и intlayer в итоге оказываются в
|
|
196
|
+
> Примечание о paraglide: решение внедряет код в вашу кодовую базу для импорта, в результате чего метрика 'размер библиотеки' в отчете бенчмарка практически равна 0. Генерация кода - это хорошо, потому что используемая функция будет включать только необходимую логику (полный префикс против отсутствия префикса, куки против хранилища и т. д.). Для сравнения, Intlayer выполняет эту фильтрацию с помощью внедрения переменных окружения в сборку, чтобы заставить бандлер выполнять tree-shaking контента в зависимости от логики. Благодаря этому paraglide и intlayer в итоге оказываются в 3-10 раз легче, чем i18next или next-intl.
|
|
192
197
|
|
|
193
|
-
**(Tolgee)** (`@tolgee/react@7.
|
|
198
|
+
**(Tolgee)** (`@tolgee/react@7.2.0`):
|
|
194
199
|
|
|
195
200
|
`Tolgee` решает многие из упомянутых ранее проблем. Мне показалось, что начать работу с ним сложнее, чем с другими инструментами с похожими подходами. Он не обеспечивает типобезопасность, что значительно затрудняет отлов отсутствующих ключей на этапе компиляции. Мне пришлось обернуть API Tolgee своими собственными, чтобы добавить обнаружение отсутствующих ключей.
|
|
196
201
|
|
|
@@ -198,37 +203,37 @@ history:
|
|
|
198
203
|
|
|
199
204
|
На TanStack Start у меня также были проблемы с реактивностью: при смене локали мне приходилось принудительно перерендеривать провайдер и подписываться на события смены локали, чтобы загрузка на другом языке вела себя корректно.
|
|
200
205
|
|
|
201
|
-
**(use-intl)** (`use-intl@4.
|
|
206
|
+
**(use-intl)** (`use-intl@4.14.2`):
|
|
202
207
|
|
|
203
208
|
`use-intl` - самый модный представитель "intl" в экосистеме React (из того же семейства, что и `next-intl`), который часто продвигают AI-агенты, но, на мой взгляд, ошибочно в контексте производительности. Начать работу довольно просто. На практике процесс оптимизации и ограничения утечек довольно сложен. Аналогично, сочетание динамической загрузки + пространств имен + типов TypeScript сильно замедляет разработку.
|
|
204
209
|
|
|
205
210
|
На TanStack Start вы избегаете ловушек, специфичных для Next.js (`setRequestLocale`, статический рендеринг), но основная проблема та же: без строгой дисциплины бандл быстро переполняется сообщениями, а обслуживание пространств имен для каждого маршрута становится мучительным.
|
|
206
211
|
|
|
207
|
-
**(react-i18next)** (`react-i18next@17.0.
|
|
212
|
+
**(react-i18next)** (`react-i18next@17.0.13`):
|
|
208
213
|
|
|
209
214
|
`react-i18next`, вероятно, является самым популярным вариантом, так как был одним из первых решений для нужд i18n в JavaScript-приложениях. У него также есть широкий набор плагинов от сообщества для конкретных задач.
|
|
210
215
|
|
|
211
216
|
Тем не менее, у него те же основные недостатки, что и у стеков, построенных на `t('a.b.c')`: оптимизация возможна, но отнимает очень много времени, а большие проекты рискуют столкнуться с плохими практиками.
|
|
212
217
|
|
|
213
|
-
Пакет особенно тяжелый (~
|
|
218
|
+
Пакет особенно тяжелый (~18.4kb, что примерно в 3.5× раз больше `react-intlayer`).
|
|
214
219
|
|
|
215
220
|
Форматы сообщений также расходятся: `use-intl` использует ICU MessageFormat, в то время как `i18next` использует свой собственный формат, что усложняет инструментарий или миграцию при их смешивании.
|
|
216
221
|
|
|
217
|
-
**(Lingui)** (`@lingui/core@
|
|
222
|
+
**(Lingui)** (`@lingui/core@6.6.0`):
|
|
218
223
|
|
|
219
224
|
`Lingui` часто хвалят. Лично мне рабочий процесс вокруг `lingui extract` / `lingui compile` показался более сложным, чем другие подходы, без явных преимуществ в этом бенчмарке TanStack Start. Я также заметил непоследовательный синтаксис, который путает AI (например, `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
|
`react-intl` - это производительная реализация от команды Format.js. DX остается многословным: `const intl = useIntl()` + `intl.formatMessage({ id: "xx.xx" })` добавляет сложности, лишней работы для JavaScript и привязывает глобальный экземппляр i18n ко многим узлам в дереве React.
|
|
224
229
|
|
|
225
|
-
Пакет также тяжёлый (~
|
|
230
|
+
Пакет также тяжёлый (~15.3kb, что примерно в 3 раза больше, чем `react-intlayer`).
|
|
226
231
|
|
|
227
232
|
### 4 - Рекомендации
|
|
228
233
|
|
|
229
234
|
В этом бенчмарке TanStack Start нет прямого эквивалента `next-translate` (плагин Next.js + `getStaticProps`). Для команд, которые действительно хотят API `t()` со зрелой экосистемой, `react-i18next` и `use-intl` остаются "разумным" выбором, но будьте готовы потратить много времени на оптимизацию, чтобы избежать утечек.
|
|
230
235
|
|
|
231
|
-
**(Intlayer)** (`react-intlayer@
|
|
236
|
+
**(Intlayer)** (`react-intlayer@9.5.1`):
|
|
232
237
|
|
|
233
238
|
Я не буду лично судить о `react-intlayer` ради объективности, так как это мое собственное решение.
|
|
234
239
|
|
package/docs/ru/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: Лучшее i18n решение для Vue в 2026 году - Отчет о бенчмарке
|
|
5
5
|
description: Сравните библиотеки интернационализации (i18n) для Vue, такие как vue-i18n, fluent-vue и Intlayer. Подробный отчет о производительности, размере бандла, утечках и реактивности.
|
|
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: "Обновление результатов бенчмарка"
|
|
20
23
|
- version: 8.9.8
|
|
21
24
|
date: 2026-05-18
|
|
22
25
|
changes: "Добавить сравнение звезд GitHub"
|
|
@@ -62,7 +65,7 @@ style="border:none;"
|
|
|
62
65
|
|
|
63
66
|
## TL;DR
|
|
64
67
|
|
|
65
|
-
- **Intlayer**: Самое легкое решение (
|
|
68
|
+
- **Intlayer**: Самое легкое решение (v9.5.0) со встроенным разделением (scoping) и динамической загрузкой.
|
|
66
69
|
- **vue-i18n**: Индустриальный стандарт с богатой экосистемой, но может быть значительно тяжелее и сложнее в оптимизации для разделения кода в больших приложениях.
|
|
67
70
|
- **fluent-vue**: Инновационная организация сообщений, но не хватает типобезопасности и является чрезвычайно тяжелым решением.
|
|
68
71
|
|
|
@@ -96,7 +99,8 @@ style="border:none;"
|
|
|
96
99
|
Для этого бенчмарка мы сравнили следующие библиотеки:
|
|
97
100
|
|
|
98
101
|
- `Base App` (Без библиотеки i18n)
|
|
99
|
-
- `vue-intlayer` (
|
|
102
|
+
- `vue-intlayer` (v9.5.0)
|
|
103
|
+
- [`@intlayer/vue-i18n`](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/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 @@ style="border:none;"
|
|
|
156
160
|
|
|
157
161
|
- **vue-i18n**, без сомнения, является самой используемой i18n-библиотекой для Vue, у нее много функций и огромная экосистема. Однако внутри это решение довольно тяжелое. Даже если vue-i18n интегрирует ленивую загрузку сообщений, в нем отсутствует функция разделения (scoping). В случае классического Vue SPA приложения это не проблема, но для приложения Nuxt, использующего @nuxt/i18n, это приводит к включению сообщений со всех страниц в одну. Для большого приложения Nuxt, включающего более 10 страниц, это может стать действительно проблематичным.
|
|
158
162
|
|
|
159
|
-
Пакет очень тяжелый (~24.3 КБ, что примерно в
|
|
163
|
+
Пакет очень тяжелый (~24.3 КБ, что примерно в 6 раз больше `vue-intlayer`).
|
|
160
164
|
|
|
161
|
-
**(fluent-vue)** (`fluent-vue@
|
|
165
|
+
**(fluent-vue)** (`fluent-vue@3.8.2`):
|
|
162
166
|
|
|
163
|
-
- **fluent-vue** предлагает попытку инновации через формат .ftl. Организация сообщений отличная, с ней легче начать работу. Но на практике отсутствие типобезопасности повышает риск ошибок и может быстро стать трудозатратным при отладке. Более того, это решение загружает сообщения с помощью плагина vite, который принудительно загружает весь контент на всех языках в каждую страницу. Кроме того, это чрезвычайно тяжелое решение (~
|
|
167
|
+
- **fluent-vue** предлагает попытку инновации через формат .ftl. Организация сообщений отличная, с ней легче начать работу. Но на практике отсутствие типобезопасности повышает риск ошибок и может быстро стать трудозатратным при отладке. Более того, это решение загружает сообщения с помощью плагина vite, который принудительно загружает весь контент на всех языках в каждую страницу. Кроме того, это чрезвычайно тяжелое решение (~29.7 КБ, что примерно в 7.5 раза больше `vue-intlayer`).
|
|
164
168
|
|
|
165
169
|
### 3 - Рекомендации
|
|
166
170
|
|
|
167
|
-
**(Intlayer)** (`vue-intlayer@
|
|
171
|
+
**(Intlayer)** (`vue-intlayer@9.5.0`):
|
|
168
172
|
|
|
169
173
|
Я не буду лично оценивать `vue-intlayer` ради объективности, так как это мое собственное решение.
|
package/docs/ru/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: Построение словарей
|
|
5
5
|
description: Узнайте, как создавать словари Intlayer из файлов декларации контента.
|
|
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: "Добавлен флаг `--ci`"
|
|
17
20
|
- version: 8.1.5
|
|
18
21
|
date: 2026-02-23
|
|
19
22
|
changes: "Добавить опцию checkTypes"
|
|
@@ -92,6 +95,10 @@ bun x intlayer build --watch
|
|
|
92
95
|
|
|
93
96
|
> Пример: `npx intlayer build --no-cache`
|
|
94
97
|
|
|
98
|
+
- **`--ci`**: Выполняет команду в каждом проекте Intlayer монорепозитория (или только в текущем при запуске из директории проекта). Учетные данные для каждого проекта можно подставить через `INTLAYER_PROJECT_CREDENTIALS` — JSON-объект, сопоставляющий путь проекта с `{ "clientId", "clientSecret" }`.
|
|
99
|
+
|
|
100
|
+
> Пример: `npx intlayer build --ci`
|
|
101
|
+
|
|
95
102
|
- **`--check-types`**: Проверяет типы файлов объявления контента.
|
|
96
103
|
|
|
97
104
|
> Пример: `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: Управление конфигурацией
|
|
5
5
|
description: Узнайте, как получить и отправить вашу конфигурацию Intlayer в CMS.
|
|
6
6
|
keywords:
|
|
@@ -51,6 +51,7 @@ bun x intlayer configuration get
|
|
|
51
51
|
- **`--base-dir`**: Укажите базовый каталог для проекта.
|
|
52
52
|
- **`--verbose`**: Включить подробное логирование для отладки. (по умолчанию true при использовании CLI)
|
|
53
53
|
- **`--no-cache`**: Отключить кэш.
|
|
54
|
+
- **`--ci`**: Выполняет команду в каждом проекте Intlayer монорепозитория (или только в текущем при запуске из директории проекта). Учетные данные для каждого проекта можно подставить через `INTLAYER_PROJECT_CREDENTIALS` — JSON-объект, сопоставляющий путь проекта с `{ "clientId", "clientSecret" }`.
|
|
54
55
|
|
|
55
56
|
## Отправка конфигурации
|
|
56
57
|
|
|
@@ -84,5 +85,6 @@ bun x intlayer configuration push
|
|
|
84
85
|
- **`--base-dir`**: Укажите базовый каталог для проекта.
|
|
85
86
|
- **`--verbose`**: Включить подробное логирование для отладки. (по умолчанию true при использовании CLI)
|
|
86
87
|
- **`--no-cache`**: Отключить кэш.
|
|
88
|
+
- **`--ci`**: Выполняет команду в каждом проекте Intlayer монорепозитория (или только в текущем при запуске из директории проекта). Учетные данные для каждого проекта можно подставить через `INTLAYER_PROJECT_CREDENTIALS` — JSON-объект, сопоставляющий путь проекта с `{ "clientId", "clientSecret" }`.
|
|
87
89
|
|
|
88
90
|
Отправляя конфигурацию, ваш проект полностью интегрируется с Intlayer CMS, что обеспечивает бесшовное управление словарями между командами.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
createdAt: 2024-08-11
|
|
3
|
-
updatedAt: 2026-
|
|
3
|
+
updatedAt: 2026-09-12
|
|
4
4
|
title: Проверка документа
|
|
5
5
|
description: Узнайте, как проверять файлы документации на качество, согласованность и полноту для разных локалей.
|
|
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: "Добавлен флаг `--ci`"
|
|
19
22
|
- version: 9.0.0
|
|
20
23
|
date: 2026-06-17
|
|
21
24
|
changes: "Добавить опцию --log"
|
|
@@ -138,6 +141,10 @@ bun x intlayer doc review
|
|
|
138
141
|
|
|
139
142
|
> Пример: `npx intlayer doc review --base-dir ./docs --env-file .env.production.local`
|
|
140
143
|
|
|
144
|
+
- **`--ci`**: Выполняет команду в каждом проекте Intlayer монорепозитория (или только в текущем при запуске из директории проекта). Учетные данные для каждого проекта можно подставить через `INTLAYER_PROJECT_CREDENTIALS` — JSON-объект, сопоставляющий путь проекта с `{ "clientId", "clientSecret" }`.
|
|
145
|
+
|
|
146
|
+
> Пример: `npx intlayer doc review --ci`
|
|
147
|
+
|
|
141
148
|
**Опции логирования:**
|
|
142
149
|
|
|
143
150
|
- **`--verbose`**: Включить подробное логирование для отладки. (по умолчанию включено при использовании CLI)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
createdAt: 2024-08-11
|
|
3
|
-
updatedAt:
|
|
3
|
+
updatedAt: 2026-09-12
|
|
4
4
|
title: Перевод документа
|
|
5
5
|
description: Узнайте, как автоматически переводить файлы документации с помощью сервисов AI-перевода.
|
|
6
6
|
keywords:
|
|
@@ -113,6 +113,10 @@ bun x intlayer doc translate
|
|
|
113
113
|
|
|
114
114
|
> Пример: `npx intlayer doc translate --base-dir ./docs --env-file .env.production.local`
|
|
115
115
|
|
|
116
|
+
- **`--ci`**: Выполняет команду в каждом проекте Intlayer монорепозитория (или только в текущем при запуске из директории проекта). Учетные данные для каждого проекта можно подставить через `INTLAYER_PROJECT_CREDENTIALS` — JSON-объект, сопоставляющий путь проекта с `{ "clientId", "clientSecret" }`.
|
|
117
|
+
|
|
118
|
+
> Пример: `npx intlayer doc translate --ci`
|
|
119
|
+
|
|
116
120
|
**Опции логирования:**
|
|
117
121
|
|
|
118
122
|
- **`--verbose`**: Включить подробное логирование для отладки. (по умолчанию включено при использовании CLI)
|