@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: 2026 年 Next.js 最佳 i18n 解决方案 - 基准测试报告
|
|
5
5
|
description: 对比 next-intl、next-i18next 和 Intlayer 等 Next.js 国际化 (i18n) 库。关于打包体积、泄漏和响应性的详细性能报告。
|
|
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**: 流行且插件丰富,但打包体积显著(约为 Intlayer 的 3 倍)。
|
|
74
|
+
- **next-i18next**: 流行且插件丰富,但打包体积显著(约为 Intlayer 的 3.5 倍)。
|
|
72
75
|
- **应避免**: **gt-next** 和 **lingo.dev**,因为存在严重的性能问题、供应商锁定以及导致构建失败的 Bug。
|
|
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/zh/compat/next-intl.md) (v9.5.1)
|
|
117
|
+
- [`@intlayer/next-i18next`](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/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 @@ GitHub 星数是项目受欢迎程度、社区信任和长期相关性的有力
|
|
|
175
180
|
|
|
176
181
|
遇到的问题:
|
|
177
182
|
|
|
178
|
-
**(General Translation)** (`gt-next@
|
|
183
|
+
**(General Translation)** (`gt-next@11.1.24`):
|
|
179
184
|
|
|
180
|
-
- 对于一个
|
|
185
|
+
- 对于一个 141kb 的应用,`gt-next` 额外增加了超过 50kb。
|
|
181
186
|
- 第一次使用 General Translation 构建就提示 `Quota Exceeded, please upgrade your plan`(配额超出,请升级计划)。
|
|
182
187
|
- 翻译未渲染;我收到了错误 `Error: <T> used on the client-side outside of <GTProvider>`,这似乎是库的一个 Bug。
|
|
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 @@ GitHub 星数是项目受欢迎程度、社区信任和长期相关性的有力
|
|
|
192
197
|
|
|
193
198
|
### 2 - 实验性解决方案
|
|
194
199
|
|
|
195
|
-
**(Wuchale)** (`wuchale@0.
|
|
200
|
+
**(Wuchale)** (`wuchale@0.26.6`):
|
|
196
201
|
|
|
197
202
|
`Wuchale` 背后的想法很有趣,但尚不可行。我遇到了响应性问题,不得不强制重新渲染 Provider 才能使应用工作。文档也相当不清晰,增加了上手难度。
|
|
198
203
|
|
|
@@ -202,21 +207,21 @@ GitHub 星数是项目受欢迎程度、社区信任和长期相关性的有力
|
|
|
202
207
|
就个人而言,我不喜欢每次推送到代码库前都要重新生成 JS 文件,这通过 PR 产生了持续的合并冲突风险。该工具似乎也更关注 Vite 而非 Next.js。
|
|
203
208
|
最后,与其他解决方案相比,Paraglide 不使用存储(如 React Context)来检索当前语言环境以渲染内容。对于解析的每个节点,它都会从 localStorage / Cookie 等请求语言环境。这导致了影响组件响应性的不必要逻辑执行。
|
|
204
209
|
|
|
205
|
-
> 关于 Paraglide 的说明:该解决方案通过将代码注入到你的代码库中进行导入,因此在基准测试报告中,“库体积”指标几乎为 0。代码生成是一件好事,因为所使用的函数将仅包含必要的逻辑(全前缀 vs 无前缀、Cookie vs 存储等)。相比之下,Intlayer 通过在构建中注入环境变量来强制打包工具根据逻辑对内容进行 Tree-shaking。得益于此,Paraglide 和 Intlayer 最终成为比 i18next 或 next-intl 轻
|
|
210
|
+
> 关于 Paraglide 的说明:该解决方案通过将代码注入到你的代码库中进行导入,因此在基准测试报告中,“库体积”指标几乎为 0。代码生成是一件好事,因为所使用的函数将仅包含必要的逻辑(全前缀 vs 无前缀、Cookie vs 存储等)。相比之下,Intlayer 通过在构建中注入环境变量来强制打包工具根据逻辑对内容进行 Tree-shaking。得益于此,Paraglide 和 Intlayer 最终成为比 i18next 或 next-intl 轻 3 到 8 倍的解决方案。
|
|
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 Agent 推荐最多的,但在我看来这是错误的。入门很容易,但在实践中,减少泄漏的优化非常复杂。结合动态加载 + 命名空间 + TypeScript 类型会极大降低开发速度。包体积也相当大(`NextIntlClientProvider` + `useTranslations` 约为
|
|
220
|
+
`next-intl` 是目前最热门的选项,也是 AI Agent 推荐最多的,但在我看来这是错误的。入门很容易,但在实践中,减少泄漏的优化非常复杂。结合动态加载 + 命名空间 + TypeScript 类型会极大降低开发速度。包体积也相当大(`NextIntlClientProvider` + `useTranslations` 约为 14.7kb,是 `next-intlayer` 的 2.5 倍多)。**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` 可能最受欢迎,因为它是 JavaScript 应用中最早的 i18n 解决方案之一。它拥有许多社区插件。它与 `next-intl` 有着相同的重大缺点。包体积特别大(`I18nProvider` + `useTranslation` 约为
|
|
224
|
+
`next-i18next` 可能最受欢迎,因为它是 JavaScript 应用中最早的 i18n 解决方案之一。它拥有许多社区插件。它与 `next-intl` 有着相同的重大缺点。包体积特别大(`I18nProvider` + `useTranslation` 约为 19.7kb,约为 `next-intlayer` 的 3.5 倍)。
|
|
220
225
|
|
|
221
226
|
消息格式也不同:`next-intl` 使用 ICU MessageFormat,而 `i18next` 使用自己的格式。
|
|
222
227
|
|
|
@@ -224,17 +229,17 @@ GitHub 星数是项目受欢迎程度、社区信任和长期相关性的有力
|
|
|
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
|
-
如果你喜欢 `t()` 风格的 API,`next-translate` 是我的主要推荐方案。它通过 `next-translate-plugin` 优雅运作,利用 Webpack / Turbopack loader 通过 `getStaticProps`
|
|
240
|
+
如果你喜欢 `t()` 风格的 API,`next-translate` 是我的主要推荐方案。它通过 `next-translate-plugin` 优雅运作,利用 Webpack / Turbopack loader 通过 `getStaticProps` 加载命名空间。它也是这些方案中最轻量的之一(约 3.5kb)。对于命名空间拆分,在配置中为每个页面或路由定义命名空间的设计非常周到,比 **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: 2026 年 Solid 最佳 i18n 解决方案 - 基准报告
|
|
5
5
|
description: 比较 Solid 国际化(i18n)库,如 solid-primitives、solid-i18next 和 Intlayer。关于Bundle 大小、泄漏和反应性的详细性能报告。
|
|
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**: 标准但沉重的选项(约为 Intlayer 的
|
|
69
|
+
- **solid-i18next**: 标准但沉重的选项(约为 Intlayer 的 3.5 倍),具有与 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 @@ GitHub 星数是项目受欢迎程度、社区信任和长期相关性的有力
|
|
|
153
156
|
|
|
154
157
|
### 2 - 可接受的解决方案
|
|
155
158
|
|
|
156
|
-
**(solid-i18next)** (`
|
|
159
|
+
**(solid-i18next)** (`i18next@26.0.8`):
|
|
157
160
|
|
|
158
161
|
`solid-i18next` 可能是最受欢迎的选项,因为它是最早满足 JavaScript 应用 i18n 需求的解决方案之一。它还拥有一套广泛的社区插件来解决特定问题。
|
|
159
162
|
|
|
160
|
-
该包很重(~14.
|
|
163
|
+
该包很重(~14.9kb,约为 `solid-intlayer` 的 3.5 倍)。
|
|
161
164
|
|
|
162
165
|
尽管如此,它与基于 `t('a.b.c')` 构建的栈具有相同的主要缺点:优化是可能的,但非常耗时,且大型项目面临不良实践(命名空间 + 动态加载 + 类型)的风险。
|
|
163
166
|
|
|
@@ -166,7 +169,7 @@ GitHub 星数是项目受欢迎程度、社区信任和长期相关性的有力
|
|
|
166
169
|
Solid primitive 非常轻量且高效,我推荐将其用于轻量级项目,但对于包含 cookie 管理、代理重定向、格式化器等在内的专业解决方案,它可能会迅速显现功能不足。
|
|
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: 2026 年 Svelte 最佳 i18n 解决方案 - 基准报告
|
|
5
5
|
description: 比较 Svelte 国际化(i18n)库,如 svelte-i18n、Paraglide 和 Intlayer。关于Bundle 大小、泄漏和反应性的详细性能报告。
|
|
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 @@ history:
|
|
|
62
65
|
|
|
63
66
|
## TL;DR
|
|
64
67
|
|
|
65
|
-
- **Intlayer**: 性能最高效的选择(
|
|
68
|
+
- **Intlayer**: 性能最高效的选择(v9.5.0),占用空间最小。
|
|
66
69
|
- **Paraglide**: tree-shaking 的有力竞争者,但开发者体验更复杂,且有反应性开销。
|
|
67
|
-
- **svelte-i18n**: 功能完善且是 Svelte 的标准,但包重量大得多(约为 Intlayer 的
|
|
70
|
+
- **svelte-i18n**: 功能完善且是 Svelte 的标准,但包重量大得多(约为 Intlayer 的 4.5 倍)。
|
|
68
71
|
|
|
69
72
|
## 测试您的应用
|
|
70
73
|
|
|
@@ -96,9 +99,9 @@ history:
|
|
|
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 @@ GitHub 星数是项目受欢迎程度、社区信任和长期相关性的有力
|
|
|
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 也是如此。尽管如此,在 Svelte 和 TanStack Start 项目中使用 Paraglide 还是值得关注的。
|
|
@@ -162,13 +165,13 @@ GitHub 星数是项目受欢迎程度、社区信任和长期相关性的有力
|
|
|
162
165
|
|
|
163
166
|
> 关于 paraglide 的说明:该解决方案在您的代码库中注入代码进行导入,因此基准报告中的“库大小”指标几乎为 0。代码生成是一件好事,因为使用的函数将仅包含必要的逻辑(全局前缀 vs 无前缀、cookie vs 存储等)。相比之下,Intlayer 在构建期间通过注入环境变量来进行过滤,以迫使打包器根据逻辑对内容进行 tree-shake。得益于此,paraglide 和 intlayer 最终比 i18next 或 next-intl 轻 6 到 10 倍。
|
|
164
167
|
|
|
165
|
-
**(svelte-i18n)** (`svelte-i18n@
|
|
168
|
+
**(svelte-i18n)** (`svelte-i18n@4.0.1`):
|
|
166
169
|
|
|
167
|
-
此解决方案满足 Svelte 项目中 i18n 的所有需求。但正如 i18next 或其他主流 i18n 解决方案的情况一样,它有点重(~
|
|
170
|
+
此解决方案满足 Svelte 项目中 i18n 的所有需求。但正如 i18next 或其他主流 i18n 解决方案的情况一样,它有点重(~16.6kb,约为 `svelte-intlayer` 的 4.5 倍)。
|
|
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: 2026 年 TanStack Start 最佳 i18n 解决方案 - 基准测试报告
|
|
5
5
|
description: 对比 react-i18next、use-intl 和 Intlayer 等 TanStack Start 国际化库。关于打包体积、泄漏和响应性的详细性能报告。
|
|
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**: 为 TanStack Start 提供最佳性能和最小的打包体积 (
|
|
68
|
+
- **Intlayer**: 为 TanStack Start 提供最佳性能和最小的打包体积 (v9.5.1)。
|
|
66
69
|
- **react-i18next** & **use-intl**: 拥有庞大生态系统的成熟替代方案,但体积显著更大且优化更为复杂。
|
|
67
70
|
- **Paraglide**: 创新的 Tree-shaking 理念,但在实际应用中并未生效。在 TanStack Start 中 DX 复杂且存在响应性开销。
|
|
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/zh/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 @@ GitHub 星数是项目受欢迎程度、社区信任和长期相关性的有力
|
|
|
160
165
|
|
|
161
166
|
遇到的问题:
|
|
162
167
|
|
|
163
|
-
**(General Translation)** (`gt-react@
|
|
168
|
+
**(General Translation)** (`gt-react@10.18.3`):
|
|
164
169
|
|
|
165
|
-
- 对于一个约
|
|
170
|
+
- 对于一个约 111kb 的应用,`gt-react` 额外增加了超过 170kb(参考同个基准测试中 Next.js 实现的量级)。
|
|
166
171
|
- 第一次使用 General Translation 构建就提示 `Quota Exceeded, please upgrade your plan`。
|
|
167
172
|
- 翻译未渲染;我收到了错误 `Error: <T> used on the client-side outside of <GTProvider>`,这似乎是库的一个 Bug。
|
|
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 @@ GitHub 星数是项目受欢迎程度、社区信任和长期相关性的有力
|
|
|
178
183
|
|
|
179
184
|
### 2 - 实验性解决方案
|
|
180
185
|
|
|
181
|
-
**(Wuchale)** (`wuchale@0.
|
|
186
|
+
**(Wuchale)** (`wuchale@0.26.6`):
|
|
182
187
|
|
|
183
188
|
`Wuchale` 背后的想法很有趣,但尚非可行方案。我遇到了该库的响应性问题,不得不强制重新渲染 Provider 才能让应用在 TanStack Start 上运行。文档也相当模糊,增加了上手难度。
|
|
184
189
|
|
|
@@ -188,9 +193,9 @@ GitHub 星数是项目受欢迎程度、社区信任和长期相关性的有力
|
|
|
188
193
|
|
|
189
194
|
`Paraglide` 提供了一种创新且经过深思熟虑的方法。即便如此,在此基准测试中,其公司宣称的 Tree-shaking 在我的 Next.js 实现或 TanStack Start 中并未生效。工作流和 DX 也比其他选项更复杂。就个人而言,我不喜欢每次推送到代码库前都要重新生成 JS 文件,这通过 PR 产生了持续的合并冲突风险。
|
|
190
195
|
|
|
191
|
-
> 关于 paraglide 的说明:该解决方案通过将代码注入到您的代码库中进行导入,因此基准测试报告中的“库体积”指标几乎为 0。代码生成是一件好事,因为所使用的函数将仅包含必要的逻辑(全部前缀 vs 无前缀、cookie vs 存储等)。相比之下,Intlayer 通过在构建中注入环境变量来进行过滤,以强制打包工具根据逻辑对内容进行 Tree-shake。得益于此,paraglide 和 intlayer 最终成为比 i18next 或 next-intl 轻
|
|
196
|
+
> 关于 paraglide 的说明:该解决方案通过将代码注入到您的代码库中进行导入,因此基准测试报告中的“库体积”指标几乎为 0。代码生成是一件好事,因为所使用的函数将仅包含必要的逻辑(全部前缀 vs 无前缀、cookie vs 存储等)。相比之下,Intlayer 通过在构建中注入环境变量来进行过滤,以强制打包工具根据逻辑对内容进行 Tree-shake。得益于此,paraglide 和 intlayer 最终成为比 i18next 或 next-intl 轻 3-10 倍的解决方案。
|
|
192
197
|
|
|
193
|
-
**(Tolgee)** (`@tolgee/react@7.
|
|
198
|
+
**(Tolgee)** (`@tolgee/react@7.2.0`):
|
|
194
199
|
|
|
195
200
|
`Tolgee` 解决了前面提到的许多问题。我发现它比其他采用类似方法的工具更难上手。它不提供类型安全,这极大增加了在编译时捕捉缺失键的难度。我不得不使用自己的 API 封装 Tolgee 的 API 以添加缺失键检测。
|
|
196
201
|
|
|
@@ -198,37 +203,37 @@ GitHub 星数是项目受欢迎程度、社区信任和长期相关性的有力
|
|
|
198
203
|
|
|
199
204
|
在 TanStack Start 上,我也遇到了响应性问题:当locale改变时,我必须强制提供者重新渲染并订阅locale-change事件,以便在另一种语言中加载时行为正确。
|
|
200
205
|
|
|
201
|
-
**(use-intl)** (`use-intl@4.
|
|
206
|
+
**(use-intl)** (`use-intl@4.14.2`):
|
|
202
207
|
|
|
203
208
|
`use-intl` 是 React 生态中最时髦的“intl”成员(与 `next-intl` 同系),常被 AI Agent 推荐,但在我看来,在性能优先的环境下这是错误的。入门相对简单,但在实践中,优化和限制泄漏的过程相当复杂。同样,结合动态加载 + 命名空间 + 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` 可能最受欢迎,因为它是最早满足 JavaScript 应用 i18n 需求的方案之一。它还针对特定问题拥有广泛的社区插件。
|
|
210
215
|
|
|
211
216
|
尽管如此,它与基于 `t('a.b.c')` 的技术栈有着相同的重大缺点:优化是可能的,但非常耗时,且大型项目容易陷入不良实践(命名空间 + 动态加载 + 类型)。
|
|
212
217
|
|
|
213
|
-
该 package 特别重(~
|
|
218
|
+
该 package 特别重(~18.4kb,约为 `react-intlayer` 的 3.5 倍)。
|
|
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
|
-
该 package 也很重(~
|
|
230
|
+
该 package 也很重(~15.3kb,大约是 `react-intlayer` 的 3 倍)。
|
|
226
231
|
|
|
227
232
|
### 4 - 推荐方案
|
|
228
233
|
|
|
229
234
|
在本次 TanStack Start 基准测试中,没有与 `next-translate`(Next.js 插件 + `getStaticProps`)直接对应的方案。对于那些确实想要 `t()` API 且拥有成熟生态的团队,`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/zh/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: 2026 年 Vue 最佳 i18n 解决方案 - 基准报告
|
|
5
5
|
description: 比较 Vue 国际化(i18n)库,如 vue-i18n、fluent-vue 和 Intlayer。关于Bundle 大小、泄漏和反应性的详细性能报告。
|
|
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/zh/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 @@ GitHub 星数是项目受欢迎程度、社区信任和长期相关性的有力
|
|
|
156
160
|
|
|
157
161
|
- **vue-i18n** 毫无疑问是 Vue 中最常用的 i18n 库,它具有大量功能和庞大的生态系统。但在底层,该解决方案相当沉重。即使 vue-i18n 集成了消息的懒加载,它也缺乏分层(scoping)功能。在经典的 Vue SPA 应用中没有问题,但对于使用 @nuxt/i18n 的 Nuxt 应用,它会导致所有页面的消息都包含在单个页面中。对于包含 10 个以上页面的大型 Nuxt 应用,这可能会变得非常成问题。
|
|
158
162
|
|
|
159
|
-
该包非常重(~24.3kb,约为 `vue-intlayer` 的
|
|
163
|
+
该包非常重(~24.3kb,约为 `vue-intlayer` 的 6 倍)。
|
|
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.7kb,约为 `vue-intlayer` 的 7.5 倍)。
|
|
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/zh/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`**:在 monorepo 的每个 Intlayer 项目中执行该命令(在项目目录内运行时仅处理当前项目)。可通过 `INTLAYER_PROJECT_CREDENTIALS`(将项目路径映射到 `{ "clientId", "clientSecret" }` 的 JSON 对象)为每个项目注入凭据。
|
|
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`**:启用详细日志以进行调试。(默认通过 CLI 设置为 true)
|
|
53
53
|
- **`--no-cache`**:禁用缓存。
|
|
54
|
+
- **`--ci`**:在 monorepo 的每个 Intlayer 项目中执行该命令(在项目目录内运行时仅处理当前项目)。可通过 `INTLAYER_PROJECT_CREDENTIALS`(将项目路径映射到 `{ "clientId", "clientSecret" }` 的 JSON 对象)为每个项目注入凭据。
|
|
54
55
|
|
|
55
56
|
## 推送配置
|
|
56
57
|
|
|
@@ -84,5 +85,6 @@ bun x intlayer configuration push
|
|
|
84
85
|
- **`--base-dir`**:指定项目的基础目录。
|
|
85
86
|
- **`--verbose`**:启用详细日志以便调试。(CLI 默认启用)
|
|
86
87
|
- **`--no-cache`**:禁用缓存。
|
|
88
|
+
- **`--ci`**:在 monorepo 的每个 Intlayer 项目中执行该命令(在项目目录内运行时仅处理当前项目)。可通过 `INTLAYER_PROJECT_CREDENTIALS`(将项目路径映射到 `{ "clientId", "clientSecret" }` 的 JSON 对象)为每个项目注入凭据。
|
|
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 选项"
|
|
@@ -136,6 +139,10 @@ bun x intlayer doc review
|
|
|
136
139
|
|
|
137
140
|
> 示例: `npx intlayer doc review --base-dir ./docs --env-file .env.production.local`
|
|
138
141
|
|
|
142
|
+
- **`--ci`**:在 monorepo 的每个 Intlayer 项目中执行该命令(在项目目录内运行时仅处理当前项目)。可通过 `INTLAYER_PROJECT_CREDENTIALS`(将项目路径映射到 `{ "clientId", "clientSecret" }` 的 JSON 对象)为每个项目注入凭据。
|
|
143
|
+
|
|
144
|
+
> 示例: `npx intlayer doc review --ci`
|
|
145
|
+
|
|
139
146
|
**日志选项:**
|
|
140
147
|
|
|
141
148
|
- **`--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:
|
|
@@ -112,6 +112,10 @@ bun x intlayer doc translate
|
|
|
112
112
|
|
|
113
113
|
> 示例: `npx intlayer doc translate --base-dir ./docs --env-file .env.production.local`
|
|
114
114
|
|
|
115
|
+
- **`--ci`**:在 monorepo 的每个 Intlayer 项目中执行该命令(在项目目录内运行时仅处理当前项目)。可通过 `INTLAYER_PROJECT_CREDENTIALS`(将项目路径映射到 `{ "clientId", "clientSecret" }` 的 JSON 对象)为每个项目注入凭据。
|
|
116
|
+
|
|
117
|
+
> 示例: `npx intlayer doc translate --ci`
|
|
118
|
+
|
|
115
119
|
**日志选项:**
|
|
116
120
|
|
|
117
121
|
- **`--verbose`**: 启用详细日志以便调试。(CLI 默认启用)
|
package/docs/zh/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: 提取字符串
|
|
5
5
|
description: 了解如何将组件中的字符串提取到靠近组件的 .content 文件中。
|
|
6
6
|
keywords:
|
|
@@ -69,6 +69,7 @@ bun x intlayer extract
|
|
|
69
69
|
- **`--env`**:指定环境。
|
|
70
70
|
- **`--env-file`**:提供自定义的环境文件。
|
|
71
71
|
- **`--verbose`**:启用详细日志。
|
|
72
|
+
- **`--ci`**:在 monorepo 的每个 Intlayer 项目中执行该命令(在项目目录内运行时仅处理当前项目)。可通过 `INTLAYER_PROJECT_CREDENTIALS`(将项目路径映射到 `{ "clientId", "clientSecret" }` 的 JSON 对象)为每个项目注入凭据。
|
|
72
73
|
|
|
73
74
|
**必需的插件:**
|
|
74
75
|
|
package/docs/zh/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: 填充字典
|
|
5
5
|
description: 学习如何使用 AI 填充、审核和翻译您的字典。
|
|
6
6
|
keywords:
|
|
@@ -161,6 +161,10 @@ Affected dictionary keys for processing: app, comp-test, hello-world, lang-switc
|
|
|
161
161
|
|
|
162
162
|
> 示例:`npx intlayer build --no-cache`
|
|
163
163
|
|
|
164
|
+
- **`--ci`**:在 monorepo 的每个 Intlayer 项目中执行该命令(在项目目录内运行时仅处理当前项目)。可通过 `INTLAYER_PROJECT_CREDENTIALS`(将项目路径映射到 `{ "clientId", "clientSecret" }` 的 JSON 对象)为每个项目注入凭据。
|
|
165
|
+
|
|
166
|
+
> 示例:`npx intlayer fill --ci`
|
|
167
|
+
|
|
164
168
|
**准备选项:**
|
|
165
169
|
|
|
166
170
|
- **`--build`**:在推送之前构建字典以确保内容是最新的。设置为 true 将强制构建,false 将跳过构建,undefined 将允许使用构建缓存。
|