@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
|
@@ -0,0 +1,558 @@
|
|
|
1
|
+
---
|
|
2
|
+
createdAt: 2026-09-09
|
|
3
|
+
updatedAt: 2026-09-11
|
|
4
|
+
title: "Remix 3 i18n - 完整的应用多语言国际化翻译指南"
|
|
5
|
+
description: "告别 i18next。2026 年构建多语言 (i18n) Remix 3 应用的权威指南。借助 AI 智能体完成翻译,并优化打包体积、SEO 和性能。"
|
|
6
|
+
keywords:
|
|
7
|
+
- 国际化
|
|
8
|
+
- 文档
|
|
9
|
+
- Intlayer
|
|
10
|
+
- Remix 3
|
|
11
|
+
- Remix
|
|
12
|
+
- JavaScript
|
|
13
|
+
- TypeScript
|
|
14
|
+
- Web 标准
|
|
15
|
+
slugs:
|
|
16
|
+
- doc
|
|
17
|
+
- environment
|
|
18
|
+
- remix-3
|
|
19
|
+
applicationTemplate: https://github.com/aymericzip/intlayer-remix-3-template
|
|
20
|
+
applicationShowcase: https://intlayer-remix-3-template.vercel.app
|
|
21
|
+
history:
|
|
22
|
+
- version: 9.5.0
|
|
23
|
+
date: 2026-09-09
|
|
24
|
+
changes: "Remix 3 初始文档"
|
|
25
|
+
author: aymericzip
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
# 使用 Intlayer 翻译您的 Remix 3 网站 | 国际化 (i18n)
|
|
29
|
+
|
|
30
|
+
本指南演示了如何将 **Intlayer** 集成到 **Remix 3** 应用中以实现无缝的国际化,涵盖基于语言的路由、类型安全的内容声明、服务端渲染的 JSX 组件以及对 Node.js、Bun、Deno 和 Cloudflare Workers 的跨运行时支持。
|
|
31
|
+
|
|
32
|
+
## 什么是 Remix 3?
|
|
33
|
+
|
|
34
|
+
**Remix 3** 代表了一次根本性的架构演进,转向**完全构建在 Web 标准之上、可组合且与运行时解耦的 Web 框架**。Remix 3 不再与特定的打包器或专有服务器 API 绑定,而是以单一职责的可组合包形式发布:
|
|
35
|
+
|
|
36
|
+
- **`remix/fetch-router`** (或 `remix/router`): 基于 Fetch API (`Request` 与 `Response`) 构建的轻量且符合规范的路由。
|
|
37
|
+
- **`remix/ui`**: JSX 组件模型 (`jsxImportSource: "remix/ui"`)。组件是一个接收 Handle 并返回渲染函数的设置函数,外观类似 React,但状态保存在纯 JavaScript 闭包中。
|
|
38
|
+
- **`remix/middleware/render`**: 为每个请求挂载 `context.render(<Page />)`,将 JSX 树以流式传输转换为 HTML `Response`。
|
|
39
|
+
- **`remix/node-fetch-server`**: Node.js 服务器适配器,原生支持 Bun、Deno 与边缘运行时。
|
|
40
|
+
- **`remix/cookie`**: 具备加密安全性的 Cookie 解析与序列化工具。
|
|
41
|
+
|
|
42
|
+
与 **Intlayer** 结合使用时,您将获得一个完整的国际化系统,提供编译期安全性、自动化 AI 翻译、零额外开销的服务端渲染以及无缝的语言路由。
|
|
43
|
+
|
|
44
|
+
## 目录
|
|
45
|
+
|
|
46
|
+
<TOC/>
|
|
47
|
+
|
|
48
|
+
## 为什么选择 Intlayer 而不是其他方案?
|
|
49
|
+
|
|
50
|
+
与 `i18next` 等传统方案或自定义翻译加载器相比,Intlayer 提供了专为现代 Web 架构优化的集成化开发者体验:
|
|
51
|
+
|
|
52
|
+
<AccordionGroup>
|
|
53
|
+
<Accordion header="全面支持 Remix 3 和 Web 标准">
|
|
54
|
+
|
|
55
|
+
Intlayer 原生适配 Web 标准(`Request`、`Response`、`Headers` 和 `URL`)。通过轻量级中间件,它能够无缝融入 Remix 3 的 Fetch 路由器,从 URL 路径、Cookie 或 `Accept-Language` 请求头中提取语言信息,而不会将您绑定在特定运行时上。
|
|
56
|
+
|
|
57
|
+
</Accordion>
|
|
58
|
+
<Accordion header="类型安全的内容声明">
|
|
59
|
+
|
|
60
|
+
彻底告别零散的 JSON 键和运行时的缺失键崩溃。Intlayer 在所有声明的语言中强制执行 TypeScript 静态类型检查,如果缺少翻译或内容不合法,会在构建时立即发出警告。
|
|
61
|
+
|
|
62
|
+
</Accordion>
|
|
63
|
+
<Accordion header="服务端零打包体积开销">
|
|
64
|
+
|
|
65
|
+
Remix 3 在服务端渲染 JSX 组件并将 HTML 流式传输至客户端。仅会将对应请求语言解析后的纯文本写入输出流。除非组件被显式标记为 `clientEntry`,否则无需客户端注水包或笨重的翻译字典。
|
|
66
|
+
|
|
67
|
+
</Accordion>
|
|
68
|
+
<Accordion header="原生支持 AI 智能体与自动化">
|
|
69
|
+
|
|
70
|
+
Intlayer 将内容声明 (`.content.ts`) 与路由业务逻辑就近同构,大幅减少了大语言模型 (LLM) 所需的 Token 上下文。内置的 CLI 命令如 `intlayer fill` 和 `intlayer test` 允许您在 CI/CD 流水线中以自有 AI 服务商的原始成本实现自动化翻译。
|
|
71
|
+
|
|
72
|
+
</Accordion>
|
|
73
|
+
<Accordion header="可视化编辑器与 CMS 集成">
|
|
74
|
+
|
|
75
|
+
除了以代码为核心的工作流外,Intlayer 还提供了自托管的 [可视化编辑器](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/intlayer_visual_editor.md) 和 [远程 CMS](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/intlayer_CMS.md),允许非技术编辑人员和翻译人员更新文案,无需重新部署代码。
|
|
76
|
+
|
|
77
|
+
</Accordion>
|
|
78
|
+
</AccordionGroup>
|
|
79
|
+
|
|
80
|
+
## 分步指南
|
|
81
|
+
|
|
82
|
+
<Tabs defaultTab="code">
|
|
83
|
+
<Tab label="代码" value="code">
|
|
84
|
+
|
|
85
|
+
<iframe
|
|
86
|
+
src="https://ide.intlayer.org/aymericzip/intlayer-remix-3-template?file=intlayer.config.ts"
|
|
87
|
+
className="m-auto overflow-hidden rounded-lg border-0 max-md:size-full max-md:h-[700px] md:aspect-16/9 md:w-full"
|
|
88
|
+
title="Demo CodeSandbox - 如何使用 Intlayer 实现应用国际化"
|
|
89
|
+
sandbox="allow-forms allow-modals allow-popups allow-presentation allow-same-origin allow-scripts"
|
|
90
|
+
loading="lazy"
|
|
91
|
+
/>
|
|
92
|
+
|
|
93
|
+
</Tab>
|
|
94
|
+
<Tab label="演示" value="demo">
|
|
95
|
+
|
|
96
|
+
<iframe
|
|
97
|
+
src="https://intlayer-remix-3-template.vercel.app"
|
|
98
|
+
className="m-auto overflow-hidden rounded-lg border-0 max-md:size-full max-md:h-[700px] md:aspect-16/9 md:w-full"
|
|
99
|
+
title="Demo Intlayer Remix 3 模板"
|
|
100
|
+
sandbox="allow-forms allow-modals allow-popups allow-presentation allow-same-origin allow-scripts"
|
|
101
|
+
loading="lazy"
|
|
102
|
+
/>
|
|
103
|
+
|
|
104
|
+
</Tab>
|
|
105
|
+
</Tabs>
|
|
106
|
+
|
|
107
|
+
在 GitHub 上查看 [应用模板](https://github.com/aymericzip/intlayer-remix-3-template)。
|
|
108
|
+
|
|
109
|
+
<Steps>
|
|
110
|
+
<Step number={1} title="安装依赖">
|
|
111
|
+
|
|
112
|
+
使用您喜欢的包管理器安装 `intlayer` 和 `remix` (第 3 版):
|
|
113
|
+
|
|
114
|
+
```bash packageManager="npm"
|
|
115
|
+
npm install intlayer remix@next
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
```bash packageManager="pnpm"
|
|
119
|
+
pnpm add intlayer remix@next
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
```bash packageManager="yarn"
|
|
123
|
+
yarn add intlayer remix@next
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
```bash packageManager="bun"
|
|
127
|
+
bun add intlayer remix@next
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
- **`intlayer`**: 核心国际化引擎,负责配置管理、字典声明 (`t()`, `Dictionary`)、CLI 工具和运行时解释器。
|
|
131
|
+
- **`remix`**: 统一的 Remix 3 框架包,导出 `remix/router`、`remix/routes`、`remix/ui`、`remix/middleware/render` 以及 `remix/node-fetch-server`。
|
|
132
|
+
|
|
133
|
+
</Step>
|
|
134
|
+
<Step number={2} title="配置 Intlayer">
|
|
135
|
+
|
|
136
|
+
在项目根目录下创建 `intlayer.config.ts`,声明支持的语言及国际化设置:
|
|
137
|
+
|
|
138
|
+
```typescript fileName="intlayer.config.ts" codeFormat={["typescript", "esm", "commonjs"]}
|
|
139
|
+
import { Locales, type IntlayerConfig } from "intlayer";
|
|
140
|
+
|
|
141
|
+
const config: IntlayerConfig = {
|
|
142
|
+
internationalization: {
|
|
143
|
+
locales: [
|
|
144
|
+
Locales.ENGLISH,
|
|
145
|
+
Locales.FRENCH,
|
|
146
|
+
Locales.SPANISH,
|
|
147
|
+
Locales.CHINESE,
|
|
148
|
+
],
|
|
149
|
+
defaultLocale: Locales.ENGLISH,
|
|
150
|
+
},
|
|
151
|
+
};
|
|
152
|
+
|
|
153
|
+
export default config;
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
```javascript fileName="intlayer.config.mjs" codeFormat="esm"
|
|
157
|
+
import { Locales } from "intlayer";
|
|
158
|
+
|
|
159
|
+
/** @type {import('intlayer').IntlayerConfig} */
|
|
160
|
+
const config = {
|
|
161
|
+
internationalization: {
|
|
162
|
+
locales: [
|
|
163
|
+
Locales.ENGLISH,
|
|
164
|
+
Locales.FRENCH,
|
|
165
|
+
Locales.SPANISH,
|
|
166
|
+
Locales.CHINESE,
|
|
167
|
+
],
|
|
168
|
+
defaultLocale: Locales.ENGLISH,
|
|
169
|
+
},
|
|
170
|
+
};
|
|
171
|
+
|
|
172
|
+
export default config;
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
```javascript fileName="intlayer.config.cjs" codeFormat="commonjs"
|
|
176
|
+
const { Locales } = require("intlayer");
|
|
177
|
+
|
|
178
|
+
/** @type {import('intlayer').IntlayerConfig} */
|
|
179
|
+
const config = {
|
|
180
|
+
internationalization: {
|
|
181
|
+
locales: [
|
|
182
|
+
Locales.ENGLISH,
|
|
183
|
+
Locales.FRENCH,
|
|
184
|
+
Locales.SPANISH,
|
|
185
|
+
Locales.CHINESE,
|
|
186
|
+
],
|
|
187
|
+
defaultLocale: Locales.ENGLISH,
|
|
188
|
+
},
|
|
189
|
+
};
|
|
190
|
+
|
|
191
|
+
module.exports = config;
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
> 更多配置项说明请参阅 [配置文档](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/configuration.md)。
|
|
195
|
+
|
|
196
|
+
</Step>
|
|
197
|
+
<Step number={3} title="声明多语言内容">
|
|
198
|
+
|
|
199
|
+
在 `.content.ts` 文件中声明本地化内容:
|
|
200
|
+
|
|
201
|
+
```typescript fileName="src/home.content.ts" contentDeclarationFormat={["typescript", "esm"]}
|
|
202
|
+
import { t, type Dictionary } from "intlayer";
|
|
203
|
+
|
|
204
|
+
const homeContent = {
|
|
205
|
+
key: "home",
|
|
206
|
+
content: {
|
|
207
|
+
title: t({
|
|
208
|
+
zh: "欢迎使用 Remix 3",
|
|
209
|
+
en: "Welcome to Remix 3",
|
|
210
|
+
fr: "Bienvenue sur Remix 3",
|
|
211
|
+
es: "Bienvenido a Remix 3",
|
|
212
|
+
}),
|
|
213
|
+
description: t({
|
|
214
|
+
zh: "基于 Web 标准构建并具备原生多语言支持的组合式应用。",
|
|
215
|
+
en: "A composable, web-standard application with native i18n.",
|
|
216
|
+
fr: "Une application composable basée sur les standards web avec i18n native.",
|
|
217
|
+
es: "Una aplicación componible basada en estándares web con i18n nativa.",
|
|
218
|
+
}),
|
|
219
|
+
switchLanguage: t({
|
|
220
|
+
zh: "切换语言:",
|
|
221
|
+
en: "Switch language:",
|
|
222
|
+
fr: "Changer de langue :",
|
|
223
|
+
es: "Cambiar idioma:",
|
|
224
|
+
}),
|
|
225
|
+
},
|
|
226
|
+
} satisfies Dictionary;
|
|
227
|
+
|
|
228
|
+
export default homeContent;
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
> Intlayer 还支持 JSON、YAML 和 CommonJS 声明格式。请参阅 [内容声明文档](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/dictionary/content_file.md)。
|
|
232
|
+
|
|
233
|
+
</Step>
|
|
234
|
+
<Step number={4} title="构建 Intlayer 字典">
|
|
235
|
+
|
|
236
|
+
编译字典声明以生成 TypeScript 类型与运行时定义:
|
|
237
|
+
|
|
238
|
+
```bash packageManager="npm"
|
|
239
|
+
npx intlayer build
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
```bash packageManager="pnpm"
|
|
243
|
+
pnpm dlx intlayer build
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
```bash packageManager="yarn"
|
|
247
|
+
yarn dlx intlayer build
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
```bash packageManager="bun"
|
|
251
|
+
bun x intlayer build
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
此操作会将内容编译至 `.intlayer` 产物目录中,提供完整的 TypeScript 自动补全和快速字典查询。
|
|
255
|
+
|
|
256
|
+
</Step>
|
|
257
|
+
<Step number={5} title="实现 Intlayer 中间件">
|
|
258
|
+
|
|
259
|
+
Remix 3 通过 `createRouter({ middleware: [...] })` 提供了可组合的中间件管道。
|
|
260
|
+
|
|
261
|
+
创建一个 Intlayer 中间件,按以下优先级解析每个请求的目标语言:
|
|
262
|
+
|
|
263
|
+
1. 通过 Intlayer 的 `getLocaleFromPath` 解析 URL 路径前缀(如 `/zh` 或 `/fr`)。
|
|
264
|
+
2. 使用 Intlayer 的 `getLocale` 辅助函数,自动对 Cookie 存储 (`INTLAYER_LOCALE`)、自定义请求头 (`x-intlayer-locale`)、标准 `Accept-Language` 请求头以及配置的 `defaultLocale` 进行协商。
|
|
265
|
+
|
|
266
|
+
```typescript fileName="src/middleware/intlayer.ts" codeFormat={["typescript", "esm"]}
|
|
267
|
+
import {
|
|
268
|
+
defaultLocale,
|
|
269
|
+
getCookie,
|
|
270
|
+
getLocale,
|
|
271
|
+
getLocaleFromPath,
|
|
272
|
+
type Locale,
|
|
273
|
+
} from "intlayer";
|
|
274
|
+
import { createContextKey, type Middleware } from "remix/router";
|
|
275
|
+
|
|
276
|
+
/**
|
|
277
|
+
* 用于从 Remix 3 RequestContext 中获取已解析语言的类型安全上下文键。
|
|
278
|
+
*/
|
|
279
|
+
export const localeKey = createContextKey<Locale>(defaultLocale);
|
|
280
|
+
|
|
281
|
+
/**
|
|
282
|
+
* Remix 3 的 Intlayer 中间件。
|
|
283
|
+
*
|
|
284
|
+
* 按照以下优先级解析请求语言:
|
|
285
|
+
* 1. URL 路径前缀(例如 `/zh/...`),通过 `getLocaleFromPath` 获取
|
|
286
|
+
* 2. 存储与请求头协商,通过 `getLocale` 获取(Cookie、自定义请求头、Accept-Language 协商、fallback 回退 defaultLocale)
|
|
287
|
+
*
|
|
288
|
+
* 将解析出的语言附加至 Remix 3 RequestContext。
|
|
289
|
+
*/
|
|
290
|
+
export const intlayer = (): Middleware => {
|
|
291
|
+
return async (context, next) => {
|
|
292
|
+
// 路径检测 (/zh/about -> "zh", /about -> undefined)
|
|
293
|
+
const pathLocale = getLocaleFromPath(context.url.pathname);
|
|
294
|
+
|
|
295
|
+
if (pathLocale) {
|
|
296
|
+
// 将解析出的语言附加至 Remix 3 请求上下文
|
|
297
|
+
context.set(localeKey, pathLocale);
|
|
298
|
+
|
|
299
|
+
return next();
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
const storedLocale = await getLocale({
|
|
303
|
+
getHeader: (name) => context.headers.get(name),
|
|
304
|
+
getCookie: (name) =>
|
|
305
|
+
getCookie(name, context.headers.get("cookie") ?? undefined),
|
|
306
|
+
});
|
|
307
|
+
|
|
308
|
+
// 将解析出的语言附加至 Remix 3 请求上下文
|
|
309
|
+
context.set(localeKey, storedLocale ?? defaultLocale);
|
|
310
|
+
|
|
311
|
+
return next();
|
|
312
|
+
};
|
|
313
|
+
};
|
|
314
|
+
```
|
|
315
|
+
|
|
316
|
+
</Step>
|
|
317
|
+
<Step number={6} title="定义类型安全路由">
|
|
318
|
+
|
|
319
|
+
使用 `remix/routes` 中的 `route()` 定义应用路由:
|
|
320
|
+
|
|
321
|
+
```typescript fileName="src/routes.ts" codeFormat={["typescript", "esm"]}
|
|
322
|
+
import { route } from "remix/routes";
|
|
323
|
+
|
|
324
|
+
export const routes = route({
|
|
325
|
+
// 默认语言路由
|
|
326
|
+
home: "/",
|
|
327
|
+
|
|
328
|
+
// 带有动态 :locale 片段的本地化路由
|
|
329
|
+
localizedHome: "/:locale",
|
|
330
|
+
});
|
|
331
|
+
```
|
|
332
|
+
|
|
333
|
+
使用 `route()` 可在整个应用中提供类型安全的 URL 生成支持:
|
|
334
|
+
|
|
335
|
+
```typescript
|
|
336
|
+
routes.home.href(); // "/"
|
|
337
|
+
routes.localizedHome.href({ locale: "zh" }); // "/zh"
|
|
338
|
+
```
|
|
339
|
+
|
|
340
|
+
</Step>
|
|
341
|
+
<Step number={7} title="使用 JSX 渲染本地化页面">
|
|
342
|
+
|
|
343
|
+
Remix 3 使用来自 `remix/ui` 的 JSX 组件渲染 UI。组件是一个接收 `Handle` 并返回**渲染函数**的**设置函数**。设置函数每个实例仅执行一次,渲染函数在每次更新时执行,并通过 `handle.props` 读取属性。
|
|
344
|
+
|
|
345
|
+
首先创建一个共享的 `Document` 外壳,根据解析出的语言设置 `<html lang="..." dir="...">` 属性:
|
|
346
|
+
|
|
347
|
+
```tsx fileName="src/views/document.tsx" codeFormat={["typescript", "esm"]}
|
|
348
|
+
import { getHTMLTextDir, type Locale } from "intlayer";
|
|
349
|
+
import type { Handle, RemixNode } from "remix/ui";
|
|
350
|
+
|
|
351
|
+
type DocumentProps = {
|
|
352
|
+
locale: Locale;
|
|
353
|
+
title: string;
|
|
354
|
+
children?: RemixNode;
|
|
355
|
+
};
|
|
356
|
+
|
|
357
|
+
export const Document = (handle: Handle<DocumentProps>) => () => {
|
|
358
|
+
const { locale, title, children } = handle.props;
|
|
359
|
+
|
|
360
|
+
return (
|
|
361
|
+
<html lang={locale} dir={getHTMLTextDir(locale)}>
|
|
362
|
+
<head>
|
|
363
|
+
<meta charSet="utf-8" />
|
|
364
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
365
|
+
<title>{title}</title>
|
|
366
|
+
</head>
|
|
367
|
+
<body>{children}</body>
|
|
368
|
+
</html>
|
|
369
|
+
);
|
|
370
|
+
};
|
|
371
|
+
```
|
|
372
|
+
|
|
373
|
+
接着创建首页。使用 `getIntlayer` 提取本地化字典,并展示语言切换器:
|
|
374
|
+
|
|
375
|
+
```tsx fileName="src/views/home.tsx" codeFormat={["typescript", "esm"]}
|
|
376
|
+
import {
|
|
377
|
+
getIntlayer,
|
|
378
|
+
getLocaleName,
|
|
379
|
+
getLocalizedPath,
|
|
380
|
+
type Locale,
|
|
381
|
+
locales,
|
|
382
|
+
} from "intlayer";
|
|
383
|
+
import type { Handle } from "remix/ui";
|
|
384
|
+
import { routes } from "../routes";
|
|
385
|
+
import { Document } from "./document";
|
|
386
|
+
|
|
387
|
+
type HomePageProps = {
|
|
388
|
+
locale: Locale;
|
|
389
|
+
};
|
|
390
|
+
|
|
391
|
+
export const HomePage = (handle: Handle<HomePageProps>) => () => {
|
|
392
|
+
const { locale } = handle.props;
|
|
393
|
+
const home = getIntlayer("home", locale);
|
|
394
|
+
|
|
395
|
+
return (
|
|
396
|
+
<Document locale={locale} title={home.title}>
|
|
397
|
+
<header>
|
|
398
|
+
<nav aria-label="Languages">
|
|
399
|
+
<span>{home.switchLanguage}</span>
|
|
400
|
+
{locales.map((targetLocale) => {
|
|
401
|
+
const isActive = targetLocale === locale;
|
|
402
|
+
|
|
403
|
+
return (
|
|
404
|
+
<a
|
|
405
|
+
key={targetLocale}
|
|
406
|
+
href={getLocalizedPath(routes.home.href(), targetLocale)}
|
|
407
|
+
class={isActive ? "active" : undefined}
|
|
408
|
+
aria-current={isActive ? "page" : undefined}
|
|
409
|
+
>
|
|
410
|
+
{getLocaleName(targetLocale, locale)}
|
|
411
|
+
</a>
|
|
412
|
+
);
|
|
413
|
+
})}
|
|
414
|
+
</nav>
|
|
415
|
+
</header>
|
|
416
|
+
<main>
|
|
417
|
+
<h1>{home.title}</h1>
|
|
418
|
+
<p>{home.description}</p>
|
|
419
|
+
</main>
|
|
420
|
+
</Document>
|
|
421
|
+
);
|
|
422
|
+
};
|
|
423
|
+
```
|
|
424
|
+
|
|
425
|
+
> Remix JSX 并非 React:没有 Hook,`class` 直接按原样书写(同时也支持 `className`),且通过 `handle.update()` 显式触发重新渲染。插值内容会自动进行安全转义。
|
|
426
|
+
|
|
427
|
+
</Step>
|
|
428
|
+
<Step number={8} title="串联路由器与服务器">
|
|
429
|
+
|
|
430
|
+
在 Intlayer 中间件旁添加来自 `remix/middleware/render` 的 `render()` 中间件。它会在每个请求上挂载 `context.render(node, init)`,将 JSX 树流式转换为 HTML `Response`(在最前添加 `<!DOCTYPE html>` 并设置 `Content-Type` 请求头):
|
|
431
|
+
|
|
432
|
+
```tsx fileName="src/router.tsx" codeFormat={["typescript", "esm"]}
|
|
433
|
+
import { isDeclaredLocale } from "intlayer";
|
|
434
|
+
import { render } from "remix/middleware/render";
|
|
435
|
+
import { createRouter } from "remix/router";
|
|
436
|
+
import { intlayer, localeKey } from "./middleware/intlayer";
|
|
437
|
+
import { routes } from "./routes";
|
|
438
|
+
import { HomePage } from "./views/home";
|
|
439
|
+
|
|
440
|
+
// 1. 使用 Intlayer + render 中间件初始化路由器
|
|
441
|
+
export const router = createRouter({
|
|
442
|
+
middleware: [intlayer(), render()],
|
|
443
|
+
});
|
|
444
|
+
|
|
445
|
+
// 2. 映射路由处理函数
|
|
446
|
+
router.map(routes, {
|
|
447
|
+
actions: {
|
|
448
|
+
// 默认语言路由
|
|
449
|
+
home(context) {
|
|
450
|
+
const locale = context.get(localeKey);
|
|
451
|
+
return context.render(<HomePage locale={locale} />);
|
|
452
|
+
},
|
|
453
|
+
|
|
454
|
+
// 本地化语言路由
|
|
455
|
+
localizedHome(context) {
|
|
456
|
+
if (!isDeclaredLocale(context.params.locale)) {
|
|
457
|
+
return new Response("Not Found", { status: 404 });
|
|
458
|
+
}
|
|
459
|
+
const locale = context.get(localeKey);
|
|
460
|
+
return context.render(<HomePage locale={locale} />);
|
|
461
|
+
},
|
|
462
|
+
},
|
|
463
|
+
});
|
|
464
|
+
```
|
|
465
|
+
|
|
466
|
+
> `context.render` 支持传入可选的 `ResponseInit` 作为第二参数,例如:`context.render(<NotFoundPage locale={locale} />, { status: 404 })`。
|
|
467
|
+
|
|
468
|
+
最后,通过标准 `fetch` 处理函数暴露路由器。同一个路由器可无缝运行在 Node.js、Bun、Deno 及 Cloudflare Workers 上:
|
|
469
|
+
|
|
470
|
+
```typescript fileName="src/server.ts" codeFormat={["typescript", "esm"]}
|
|
471
|
+
import * as http from "node:http";
|
|
472
|
+
import { createRequestListener } from "remix/node-fetch-server";
|
|
473
|
+
import { router } from "./router";
|
|
474
|
+
|
|
475
|
+
const PORT = Number(process.env.PORT || 3000);
|
|
476
|
+
|
|
477
|
+
// Node.js
|
|
478
|
+
const server = http.createServer(
|
|
479
|
+
createRequestListener((request) => router.fetch(request))
|
|
480
|
+
);
|
|
481
|
+
|
|
482
|
+
server.listen(PORT, () => {
|
|
483
|
+
console.log(`服务器运行在 http://localhost:${PORT}`);
|
|
484
|
+
});
|
|
485
|
+
|
|
486
|
+
// Bun / Deno / Cloudflare Workers
|
|
487
|
+
export default {
|
|
488
|
+
port: PORT,
|
|
489
|
+
fetch(request: Request) {
|
|
490
|
+
return router.fetch(request);
|
|
491
|
+
},
|
|
492
|
+
};
|
|
493
|
+
```
|
|
494
|
+
|
|
495
|
+
</Step>
|
|
496
|
+
<Step number={9} title="审计并自动填充翻译">
|
|
497
|
+
|
|
498
|
+
Intlayer 提供 CLI 工具来审计缺失的翻译并借助 AI 自动补充:
|
|
499
|
+
|
|
500
|
+
```bash packageManager="npm"
|
|
501
|
+
# 审计缺失翻译
|
|
502
|
+
npx intlayer test
|
|
503
|
+
|
|
504
|
+
# 使用 AI 填充缺失翻译
|
|
505
|
+
npx intlayer fill
|
|
506
|
+
```
|
|
507
|
+
|
|
508
|
+
```bash packageManager="pnpm"
|
|
509
|
+
# 审计缺失翻译
|
|
510
|
+
pnpm dlx intlayer test
|
|
511
|
+
|
|
512
|
+
# 使用 AI 填充缺失翻译
|
|
513
|
+
pnpm dlx intlayer fill
|
|
514
|
+
```
|
|
515
|
+
|
|
516
|
+
```bash packageManager="yarn"
|
|
517
|
+
# 审计缺失翻译
|
|
518
|
+
yarn dlx intlayer test
|
|
519
|
+
|
|
520
|
+
# 使用 AI 填充缺失翻译
|
|
521
|
+
yarn dlx intlayer fill
|
|
522
|
+
```
|
|
523
|
+
|
|
524
|
+
```bash packageManager="bun"
|
|
525
|
+
# 审计缺失翻译
|
|
526
|
+
bun x intlayer test
|
|
527
|
+
|
|
528
|
+
# 使用 AI 填充缺失翻译
|
|
529
|
+
bun x intlayer fill
|
|
530
|
+
```
|
|
531
|
+
|
|
532
|
+
</Step>
|
|
533
|
+
</Steps>
|
|
534
|
+
|
|
535
|
+
## TypeScript 配置
|
|
536
|
+
|
|
537
|
+
将 JSX 指向 `remix/ui` 运行时,并确保您的 `tsconfig.json` 包含生成的 `.intlayer` 类型:
|
|
538
|
+
|
|
539
|
+
```json fileName="tsconfig.json"
|
|
540
|
+
{
|
|
541
|
+
"compilerOptions": {
|
|
542
|
+
"moduleResolution": "Bundler",
|
|
543
|
+
"module": "ESNext",
|
|
544
|
+
"target": "ESNext",
|
|
545
|
+
"jsx": "react-jsx",
|
|
546
|
+
"jsxImportSource": "remix/ui",
|
|
547
|
+
"skipLibCheck": true,
|
|
548
|
+
"strict": true
|
|
549
|
+
},
|
|
550
|
+
"include": ["src/**/*", ".intlayer/**/*.ts"]
|
|
551
|
+
}
|
|
552
|
+
```
|
|
553
|
+
|
|
554
|
+
> `jsxImportSource: "remix/ui"` 使得 `<HomePage />` 会被解析为 Remix 的 `createElement` 而非 React 的。
|
|
555
|
+
|
|
556
|
+
## 结论
|
|
557
|
+
|
|
558
|
+
借助 Remix 3 与 Intlayer,您拥有了一个精简、完全类型安全且具备跨运行时可移植性的现代化技术栈,严格契合开放 Web 标准。无论构建简单的本地化营销页,还是部署在边缘网络的全球分布式服务,您的应用都能轻松从容扩展。
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@intlayer/docs",
|
|
3
|
-
"version": "9.5.
|
|
3
|
+
"version": "9.5.2",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "Intlayer documentation",
|
|
6
6
|
"keywords": [
|
|
@@ -73,14 +73,14 @@
|
|
|
73
73
|
"watch": "webpack --config ./webpack.config.ts --watch"
|
|
74
74
|
},
|
|
75
75
|
"dependencies": {
|
|
76
|
-
"@intlayer/config": "9.5.
|
|
77
|
-
"@intlayer/core": "9.5.
|
|
78
|
-
"@intlayer/types": "9.5.
|
|
76
|
+
"@intlayer/config": "9.5.2",
|
|
77
|
+
"@intlayer/core": "9.5.2",
|
|
78
|
+
"@intlayer/types": "9.5.2"
|
|
79
79
|
},
|
|
80
80
|
"devDependencies": {
|
|
81
|
-
"@intlayer/api": "9.5.
|
|
82
|
-
"@intlayer/cli": "9.5.
|
|
83
|
-
"@types/node": "
|
|
81
|
+
"@intlayer/api": "9.5.2",
|
|
82
|
+
"@intlayer/cli": "9.5.2",
|
|
83
|
+
"@types/node": "^22",
|
|
84
84
|
"@utils/ts-config": "1.0.4",
|
|
85
85
|
"@utils/ts-config-types": "1.0.4",
|
|
86
86
|
"@utils/tsdown-config": "1.0.4",
|
|
@@ -145,6 +145,26 @@ export const blogEntry = {
|
|
|
145
145
|
vi: readLocale('detecting_missing_translations.md', 'vi'),
|
|
146
146
|
uk: readLocale('detecting_missing_translations.md', 'uk'),
|
|
147
147
|
} as unknown as Record<LocalesValues, Promise<string>>,
|
|
148
|
+
'./blog/en/history_of_i18n.md': {
|
|
149
|
+
en: readLocale('history_of_i18n.md', 'en'),
|
|
150
|
+
es: readLocale('history_of_i18n.md', 'es'),
|
|
151
|
+
ru: readLocale('history_of_i18n.md', 'ru'),
|
|
152
|
+
ja: readLocale('history_of_i18n.md', 'ja'),
|
|
153
|
+
fr: readLocale('history_of_i18n.md', 'fr'),
|
|
154
|
+
ko: readLocale('history_of_i18n.md', 'ko'),
|
|
155
|
+
zh: readLocale('history_of_i18n.md', 'zh'),
|
|
156
|
+
de: readLocale('history_of_i18n.md', 'de'),
|
|
157
|
+
ar: readLocale('history_of_i18n.md', 'ar'),
|
|
158
|
+
it: readLocale('history_of_i18n.md', 'it'),
|
|
159
|
+
'en-GB': readLocale('history_of_i18n.md', 'en-GB'),
|
|
160
|
+
pt: readLocale('history_of_i18n.md', 'pt'),
|
|
161
|
+
hi: readLocale('history_of_i18n.md', 'hi'),
|
|
162
|
+
tr: readLocale('history_of_i18n.md', 'tr'),
|
|
163
|
+
pl: readLocale('history_of_i18n.md', 'pl'),
|
|
164
|
+
id: readLocale('history_of_i18n.md', 'id'),
|
|
165
|
+
vi: readLocale('history_of_i18n.md', 'vi'),
|
|
166
|
+
uk: readLocale('history_of_i18n.md', 'uk'),
|
|
167
|
+
} as unknown as Record<LocalesValues, Promise<string>>,
|
|
148
168
|
'./blog/en/hreflang_guide_multilingual_seo.md': {
|
|
149
169
|
en: readLocale('hreflang_guide_multilingual_seo.md', 'en'),
|
|
150
170
|
es: readLocale('hreflang_guide_multilingual_seo.md', 'es'),
|
|
@@ -325,26 +325,6 @@ export const docsEntry = {
|
|
|
325
325
|
vi: readLocale('cli/build.md', 'vi'),
|
|
326
326
|
uk: readLocale('cli/build.md', 'uk'),
|
|
327
327
|
} as unknown as Record<LocalesValues, Promise<string>>,
|
|
328
|
-
'./docs/en/cli/ci.md': {
|
|
329
|
-
en: readLocale('cli/ci.md', 'en'),
|
|
330
|
-
es: readLocale('cli/ci.md', 'es'),
|
|
331
|
-
ru: readLocale('cli/ci.md', 'ru'),
|
|
332
|
-
ja: readLocale('cli/ci.md', 'ja'),
|
|
333
|
-
fr: readLocale('cli/ci.md', 'fr'),
|
|
334
|
-
ko: readLocale('cli/ci.md', 'ko'),
|
|
335
|
-
zh: readLocale('cli/ci.md', 'zh'),
|
|
336
|
-
de: readLocale('cli/ci.md', 'de'),
|
|
337
|
-
ar: readLocale('cli/ci.md', 'ar'),
|
|
338
|
-
it: readLocale('cli/ci.md', 'it'),
|
|
339
|
-
'en-GB': readLocale('cli/ci.md', 'en-GB'),
|
|
340
|
-
pt: readLocale('cli/ci.md', 'pt'),
|
|
341
|
-
hi: readLocale('cli/ci.md', 'hi'),
|
|
342
|
-
tr: readLocale('cli/ci.md', 'tr'),
|
|
343
|
-
pl: readLocale('cli/ci.md', 'pl'),
|
|
344
|
-
id: readLocale('cli/ci.md', 'id'),
|
|
345
|
-
vi: readLocale('cli/ci.md', 'vi'),
|
|
346
|
-
uk: readLocale('cli/ci.md', 'uk'),
|
|
347
|
-
} as unknown as Record<LocalesValues, Promise<string>>,
|
|
348
328
|
'./docs/en/cli/configuration.md': {
|
|
349
329
|
en: readLocale('cli/configuration.md', 'en'),
|
|
350
330
|
es: readLocale('cli/configuration.md', 'es'),
|
|
@@ -2185,6 +2165,26 @@ export const docsEntry = {
|
|
|
2185
2165
|
vi: readLocale('intlayer_with_react_router_v7.md', 'vi'),
|
|
2186
2166
|
uk: readLocale('intlayer_with_react_router_v7.md', 'uk'),
|
|
2187
2167
|
} as unknown as Record<LocalesValues, Promise<string>>,
|
|
2168
|
+
'./docs/en/intlayer_with_remix_3.md': {
|
|
2169
|
+
en: readLocale('intlayer_with_remix_3.md', 'en'),
|
|
2170
|
+
es: readLocale('intlayer_with_remix_3.md', 'es'),
|
|
2171
|
+
ru: readLocale('intlayer_with_remix_3.md', 'ru'),
|
|
2172
|
+
ja: readLocale('intlayer_with_remix_3.md', 'ja'),
|
|
2173
|
+
fr: readLocale('intlayer_with_remix_3.md', 'fr'),
|
|
2174
|
+
ko: readLocale('intlayer_with_remix_3.md', 'ko'),
|
|
2175
|
+
zh: readLocale('intlayer_with_remix_3.md', 'zh'),
|
|
2176
|
+
de: readLocale('intlayer_with_remix_3.md', 'de'),
|
|
2177
|
+
ar: readLocale('intlayer_with_remix_3.md', 'ar'),
|
|
2178
|
+
it: readLocale('intlayer_with_remix_3.md', 'it'),
|
|
2179
|
+
'en-GB': readLocale('intlayer_with_remix_3.md', 'en-GB'),
|
|
2180
|
+
pt: readLocale('intlayer_with_remix_3.md', 'pt'),
|
|
2181
|
+
hi: readLocale('intlayer_with_remix_3.md', 'hi'),
|
|
2182
|
+
tr: readLocale('intlayer_with_remix_3.md', 'tr'),
|
|
2183
|
+
pl: readLocale('intlayer_with_remix_3.md', 'pl'),
|
|
2184
|
+
id: readLocale('intlayer_with_remix_3.md', 'id'),
|
|
2185
|
+
vi: readLocale('intlayer_with_remix_3.md', 'vi'),
|
|
2186
|
+
uk: readLocale('intlayer_with_remix_3.md', 'uk'),
|
|
2187
|
+
} as unknown as Record<LocalesValues, Promise<string>>,
|
|
2188
2188
|
'./docs/en/intlayer_with_solid_start.md': {
|
|
2189
2189
|
en: readLocale('intlayer_with_solid_start.md', 'en'),
|
|
2190
2190
|
es: readLocale('intlayer_with_solid_start.md', 'es'),
|