@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
|
@@ -0,0 +1,558 @@
|
|
|
1
|
+
---
|
|
2
|
+
createdAt: 2026-09-09
|
|
3
|
+
updatedAt: 2026-09-11
|
|
4
|
+
title: "Remix 3 i18n - Guia completo para traduzir a sua aplicação"
|
|
5
|
+
description: "Esqueça o i18next. O guia 2026 para criar uma aplicação Remix 3 multilíngue (i18n). Traduza com agentes de IA e otimize o tamanho do bundle, SEO e desempenho."
|
|
6
|
+
keywords:
|
|
7
|
+
- Internacionalização
|
|
8
|
+
- Documentação
|
|
9
|
+
- Intlayer
|
|
10
|
+
- Remix 3
|
|
11
|
+
- Remix
|
|
12
|
+
- JavaScript
|
|
13
|
+
- TypeScript
|
|
14
|
+
- Padrões 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: "Documentação inicial para Remix 3"
|
|
25
|
+
author: aymericzip
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
# Traduza o seu site Remix 3 utilizando o Intlayer | Internacionalização (i18n)
|
|
29
|
+
|
|
30
|
+
Este guia demonstra como integrar o **Intlayer** para uma internacionalização perfeita em aplicações **Remix 3**, com roteamento com suporte a idiomas, declarações de conteúdo com segurança de tipos, componentes JSX renderizados no servidor e compatibilidade multi-runtime no Node.js, Bun, Deno e Cloudflare Workers.
|
|
31
|
+
|
|
32
|
+
## O que é o Remix 3?
|
|
33
|
+
|
|
34
|
+
O **Remix 3** representa uma mudança arquitetural fundamental em direção a um **framework web combinável e independente de runtime, construído inteiramente sobre padrões web**. Em vez de estar vinculado a empacotadores específicos ou a APIs proprietárias de servidor, o Remix 3 é distribuído em pacotes combináveis de propósito único:
|
|
35
|
+
|
|
36
|
+
- **`remix/fetch-router`** (ou `remix/router`): Roteamento leve e em conformidade com os padrões, baseado na Fetch API (`Request` e `Response`).
|
|
37
|
+
- **`remix/ui`**: Um modelo de componentes JSX (`jsxImportSource: "remix/ui"`). Um componente é uma função de setup que retorna uma função de renderização, parecendo React, mas mantendo o estado em closures simples de JavaScript.
|
|
38
|
+
- **`remix/middleware/render`**: Instala `context.render(<Page />)` em cada requisição, transmitindo a árvore JSX em uma `Response` HTML.
|
|
39
|
+
- **`remix/node-fetch-server`**: Adaptadores de servidor para Node.js, com suporte nativo para Bun, Deno e runtimes edge.
|
|
40
|
+
- **`remix/cookie`**: Análise e serialização de cookies criptograficamente seguros.
|
|
41
|
+
|
|
42
|
+
Combinado com o **Intlayer**, obtém um sistema de internacionalização completo que oferece segurança em tempo de compilação, traduções automatizadas com IA, renderização no servidor sem overhead e roteamento fluido por idioma.
|
|
43
|
+
|
|
44
|
+
## Índice
|
|
45
|
+
|
|
46
|
+
<TOC/>
|
|
47
|
+
|
|
48
|
+
## Por que escolher o Intlayer em vez de alternativas?
|
|
49
|
+
|
|
50
|
+
Em comparação com soluções tradicionais como o `i18next` ou carregadores de tradução sob medida, o Intlayer oferece uma experiência de desenvolvimento integrada e otimizada para a arquitetura web moderna:
|
|
51
|
+
|
|
52
|
+
<AccordionGroup>
|
|
53
|
+
<Accordion header="Cobertura total do Remix 3 e Padrões Web">
|
|
54
|
+
|
|
55
|
+
O Intlayer foi desenvolvido para funcionar nativamente com os padrões web (`Request`, `Response`, `Headers` e `URL`). Ele integra-se sem esforço no roteador Fetch do Remix 3 através de um middleware leve, extraindo idiomas de caminhos de URL, cookies ou cabeçalhos `Accept-Language` sem prendê-lo a um runtime específico.
|
|
56
|
+
|
|
57
|
+
</Accordion>
|
|
58
|
+
<Accordion header="Declarações de Conteúdo com Segurança de Tipos">
|
|
59
|
+
|
|
60
|
+
Diga adeus às chaves JSON soltas e a falhas em tempo de execução causadas por chaves ausentes. O Intlayer aplica verificações do TypeScript em todos os idiomas declarados, avisando-o no momento da compilação caso falte uma tradução ou haja alguma inconsistência.
|
|
61
|
+
|
|
62
|
+
</Accordion>
|
|
63
|
+
<Accordion header="Zero Overhead de Pacote no Servidor">
|
|
64
|
+
|
|
65
|
+
O Remix 3 renderiza componentes JSX no servidor e transmite o HTML para o cliente. Apenas o texto resolvido para o idioma solicitado é enviado no fluxo de resposta. Nenhum bundle de hidratação no cliente ou catálogo pesado de tradução é necessário, a menos que um componente seja explicitamente marcado como `clientEntry`.
|
|
66
|
+
|
|
67
|
+
</Accordion>
|
|
68
|
+
<Accordion header="Pronto para Agentes de IA e Automação">
|
|
69
|
+
|
|
70
|
+
O Intlayer coloca as declarações de conteúdo (`.content.ts`) diretamente junto da lógica de rotas, reduzindo o contexto de tokens exigido por Grandes Modelos de Linguagem (LLMs). Comandos CLI integrados como `intlayer fill` e `intlayer test` permitem automatizar traduções em pipelines de CI/CD pelo custo direto do seu provedor de IA.
|
|
71
|
+
|
|
72
|
+
</Accordion>
|
|
73
|
+
<Accordion header="Editor Visual e Integração CMS">
|
|
74
|
+
|
|
75
|
+
Além dos fluxos de trabalho baseados em código, o Intlayer disponibiliza um [Editor Visual](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pt/intlayer_visual_editor.md) auto-hospedado e um [CMS Remoto](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pt/intlayer_CMS.md), permitindo que editores e tradutores atualizem o conteúdo sem necessidade de novo deploy.
|
|
76
|
+
|
|
77
|
+
</Accordion>
|
|
78
|
+
</AccordionGroup>
|
|
79
|
+
|
|
80
|
+
## Guia Passo a Passo
|
|
81
|
+
|
|
82
|
+
<Tabs defaultTab="code">
|
|
83
|
+
<Tab label="Código" 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 - Como internacionalizar a sua aplicação com o 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="Demo" 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 Template"
|
|
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
|
+
Veja o [Modelo de Aplicação](https://github.com/aymericzip/intlayer-remix-3-template) no GitHub.
|
|
108
|
+
|
|
109
|
+
<Steps>
|
|
110
|
+
<Step number={1} title="Instalar Dependências">
|
|
111
|
+
|
|
112
|
+
Instale o `intlayer` e o `remix` (versão 3) usando o seu gestor de pacotes preferido:
|
|
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`**: Motor principal de internacionalização que fornece gestão de configurações, declaração de dicionários (`t()`, `Dictionary`), ferramentas CLI e interpretador em tempo de execução.
|
|
131
|
+
- **`remix`**: O pacote unificado do framework Remix 3 que exporta `remix/router`, `remix/routes`, `remix/ui`, `remix/middleware/render` e `remix/node-fetch-server`.
|
|
132
|
+
|
|
133
|
+
</Step>
|
|
134
|
+
<Step number={2} title="Configurar o Intlayer">
|
|
135
|
+
|
|
136
|
+
Crie um arquivo `intlayer.config.ts` na raiz do seu projeto para declarar os idiomas suportados e as configurações de internacionalização:
|
|
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.PORTUGUESE,
|
|
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.PORTUGUESE,
|
|
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.PORTUGUESE,
|
|
186
|
+
],
|
|
187
|
+
defaultLocale: Locales.ENGLISH,
|
|
188
|
+
},
|
|
189
|
+
};
|
|
190
|
+
|
|
191
|
+
module.exports = config;
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
> Para configurações adicionais, consulte a [documentação de configuração](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pt/configuration.md).
|
|
195
|
+
|
|
196
|
+
</Step>
|
|
197
|
+
<Step number={3} title="Declarar o Conteúdo Multilíngue">
|
|
198
|
+
|
|
199
|
+
Declare o seu conteúdo localizado em um arquivo `.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
|
+
pt: "Bem-vindo ao 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
|
+
pt: "Uma aplicação combinável baseada em padrões web com i18n nativa.",
|
|
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
|
+
pt: "Alterar idioma:",
|
|
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
|
+
> O Intlayer também suporta formatos JSON, YAML e CommonJS. Veja a [Documentação sobre Declaração de Conteúdo](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pt/dictionary/content_file.md).
|
|
232
|
+
|
|
233
|
+
</Step>
|
|
234
|
+
<Step number={4} title="Compilar os Dicionários Intlayer">
|
|
235
|
+
|
|
236
|
+
Compile as definições do dicionário para gerar os tipos TypeScript e registros de execução:
|
|
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
|
+
Isso compila o seu conteúdo no diretório de artefatos `.intlayer`, permitindo autocompletar completo no TypeScript e consulta rápida aos dicionários.
|
|
255
|
+
|
|
256
|
+
</Step>
|
|
257
|
+
<Step number={5} title="Implementar o Middleware do Intlayer">
|
|
258
|
+
|
|
259
|
+
O Remix 3 fornece um pipeline de middleware combinável por meio de `createRouter({ middleware: [...] })`.
|
|
260
|
+
|
|
261
|
+
Crie um middleware do Intlayer que resolva o idioma de cada requisição seguindo:
|
|
262
|
+
|
|
263
|
+
1. O prefixo do caminho da URL via `getLocaleFromPath` do Intlayer (por exemplo, `/pt` ou `/fr`).
|
|
264
|
+
2. O utilitário `getLocale` do Intlayer, que negocia automaticamente através de cookies (`INTLAYER_LOCALE`), cabeçalhos customizados (`x-intlayer-locale`), cabeçalhos padrão `Accept-Language` e o seu `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
|
+
* Chave de contexto tipada para recuperar o idioma resolvido do RequestContext do Remix 3.
|
|
278
|
+
*/
|
|
279
|
+
export const localeKey = createContextKey<Locale>(defaultLocale);
|
|
280
|
+
|
|
281
|
+
/**
|
|
282
|
+
* Middleware do Intlayer para Remix 3.
|
|
283
|
+
*
|
|
284
|
+
* Resolve o idioma da requisição com base na prioridade:
|
|
285
|
+
* 1. Prefixo da URL (ex. `/pt/...`) via `getLocaleFromPath`
|
|
286
|
+
* 2. Negociação de cabeçalhos e cookies via `getLocale` (cookie, cabeçalho personalizado, negociação Accept-Language, fallback defaultLocale)
|
|
287
|
+
*
|
|
288
|
+
* Anexa o idioma resolvido ao RequestContext do Remix 3.
|
|
289
|
+
*/
|
|
290
|
+
export const intlayer = (): Middleware => {
|
|
291
|
+
return async (context, next) => {
|
|
292
|
+
// Detecção do caminho (/pt/about -> "pt", /about -> undefined)
|
|
293
|
+
const pathLocale = getLocaleFromPath(context.url.pathname);
|
|
294
|
+
|
|
295
|
+
if (pathLocale) {
|
|
296
|
+
// Anexar idioma resolvido ao contexto de requisição do 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
|
+
// Anexar idioma resolvido ao contexto de requisição do Remix 3
|
|
309
|
+
context.set(localeKey, storedLocale ?? defaultLocale);
|
|
310
|
+
|
|
311
|
+
return next();
|
|
312
|
+
};
|
|
313
|
+
};
|
|
314
|
+
```
|
|
315
|
+
|
|
316
|
+
</Step>
|
|
317
|
+
<Step number={6} title="Definir Rotas com Segurança de Tipos">
|
|
318
|
+
|
|
319
|
+
Defina as rotas da sua aplicação utilizando `route()` de `remix/routes`:
|
|
320
|
+
|
|
321
|
+
```typescript fileName="src/routes.ts" codeFormat={["typescript", "esm"]}
|
|
322
|
+
import { route } from "remix/routes";
|
|
323
|
+
|
|
324
|
+
export const routes = route({
|
|
325
|
+
// Rota padrão do idioma
|
|
326
|
+
home: "/",
|
|
327
|
+
|
|
328
|
+
// Rota localizada com segmento dinâmico :locale
|
|
329
|
+
localizedHome: "/:locale",
|
|
330
|
+
});
|
|
331
|
+
```
|
|
332
|
+
|
|
333
|
+
O uso de `route()` garante geração de URLs tipadas em toda a sua aplicação:
|
|
334
|
+
|
|
335
|
+
```typescript
|
|
336
|
+
routes.home.href(); // "/"
|
|
337
|
+
routes.localizedHome.href({ locale: "pt" }); // "/pt"
|
|
338
|
+
```
|
|
339
|
+
|
|
340
|
+
</Step>
|
|
341
|
+
<Step number={7} title="Renderizar Páginas Localizadas com JSX">
|
|
342
|
+
|
|
343
|
+
O Remix 3 renderiza a interface do usuário com componentes JSX de `remix/ui`. Um componente é uma **função de setup** que recebe um `Handle` e retorna uma **função de renderização**. O setup é executado uma vez por instância, o render a cada atualização, e as props são lidas através de `handle.props`.
|
|
344
|
+
|
|
345
|
+
Comece com um shell compartilhado `Document` que defina os atributos `<html lang="..." dir="...">` a partir do idioma resolvido:
|
|
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
|
+
Em seguida, crie a página inicial. Ela extrai o dicionário localizado com `getIntlayer` e exibe um seletor de idiomas:
|
|
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
|
+
> O JSX do Remix não é React: não há hooks, `class` é escrito como está (`className` também é aceito) e novas renderizações são disparadas explicitamente com `handle.update()`. Os valores interpolados passam por escape automaticamente.
|
|
426
|
+
|
|
427
|
+
</Step>
|
|
428
|
+
<Step number={8} title="Ligar o Roteador e o Servidor">
|
|
429
|
+
|
|
430
|
+
Adicione o middleware `render()` de `remix/middleware/render` junto com o middleware do Intlayer. Ele instala `context.render(node, init)` em cada requisição, transmitindo a árvore JSX em uma `Response` HTML (adicionando `<!DOCTYPE html>` no início e configurando o cabeçalho `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. Inicializar o roteador com os middlewares Intlayer + render
|
|
441
|
+
export const router = createRouter({
|
|
442
|
+
middleware: [intlayer(), render()],
|
|
443
|
+
});
|
|
444
|
+
|
|
445
|
+
// 2. Mapear manipuladores de rota
|
|
446
|
+
router.map(routes, {
|
|
447
|
+
actions: {
|
|
448
|
+
// Rota de idioma padrão
|
|
449
|
+
home(context) {
|
|
450
|
+
const locale = context.get(localeKey);
|
|
451
|
+
return context.render(<HomePage locale={locale} />);
|
|
452
|
+
},
|
|
453
|
+
|
|
454
|
+
// Rota localizada
|
|
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` aceita um `ResponseInit` opcional como segundo argumento, por exemplo: `context.render(<NotFoundPage locale={locale} />, { status: 404 })`.
|
|
467
|
+
|
|
468
|
+
Por fim, exponha o roteador através de um manipulador `fetch` padrão. O mesmo roteador funciona no Node.js, Bun, Deno e 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(`Servidor em execução em 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="Auditar e Preencher Traduções Automaticamente">
|
|
497
|
+
|
|
498
|
+
O Intlayer disponibiliza uma CLI para verificar traduções em falta e preenchê-las automaticamente usando IA:
|
|
499
|
+
|
|
500
|
+
```bash packageManager="npm"
|
|
501
|
+
# Auditar traduções ausentes
|
|
502
|
+
npx intlayer test
|
|
503
|
+
|
|
504
|
+
# Preencher traduções ausentes usando IA
|
|
505
|
+
npx intlayer fill
|
|
506
|
+
```
|
|
507
|
+
|
|
508
|
+
```bash packageManager="pnpm"
|
|
509
|
+
# Auditar traduções ausentes
|
|
510
|
+
pnpm dlx intlayer test
|
|
511
|
+
|
|
512
|
+
# Preencher traduções ausentes usando IA
|
|
513
|
+
pnpm dlx intlayer fill
|
|
514
|
+
```
|
|
515
|
+
|
|
516
|
+
```bash packageManager="yarn"
|
|
517
|
+
# Auditar traduções ausentes
|
|
518
|
+
yarn dlx intlayer test
|
|
519
|
+
|
|
520
|
+
# Preencher traduções ausentes usando IA
|
|
521
|
+
yarn dlx intlayer fill
|
|
522
|
+
```
|
|
523
|
+
|
|
524
|
+
```bash packageManager="bun"
|
|
525
|
+
# Auditar traduções ausentes
|
|
526
|
+
bun x intlayer test
|
|
527
|
+
|
|
528
|
+
# Preencher traduções ausentes usando IA
|
|
529
|
+
bun x intlayer fill
|
|
530
|
+
```
|
|
531
|
+
|
|
532
|
+
</Step>
|
|
533
|
+
</Steps>
|
|
534
|
+
|
|
535
|
+
## Configuração do TypeScript
|
|
536
|
+
|
|
537
|
+
Aponte o JSX para o runtime `remix/ui` e certifique-se de que o seu `tsconfig.json` inclui os tipos gerados do `.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"` é o que faz com que `<HomePage />` resolva para o `createElement` do Remix em vez do React.
|
|
555
|
+
|
|
556
|
+
## Conclusão
|
|
557
|
+
|
|
558
|
+
Com o Remix 3 e o Intlayer, você obtém uma stack enxuta, totalmente tipada e portável, alinhada com os padrões da web aberta. A sua aplicação escala facilmente de páginas de marketing simples para serviços globais renderizados na borda (edge).
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
createdAt: 2026-04-20
|
|
3
|
-
updatedAt: 2026-
|
|
3
|
+
updatedAt: 2026-09-11
|
|
4
4
|
title: Сравнение библиотек i18n
|
|
5
5
|
description: Узнайте, как Intlayer сопоставим с другими библиотеками i18n с точки зрения производительности и размера бандла.
|
|
6
6
|
keywords:
|
|
@@ -14,6 +14,9 @@ slugs:
|
|
|
14
14
|
- doc
|
|
15
15
|
- benchmark
|
|
16
16
|
history:
|
|
17
|
+
- version: 9.5.1
|
|
18
|
+
date: 2026-09-11
|
|
19
|
+
changes: "Обновление результатов бенчмарка"
|
|
17
20
|
- version: 8.7.5
|
|
18
21
|
date: 2026-01-06
|
|
19
22
|
changes: "Инициализация бенчмарка"
|