@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,304 @@
|
|
|
1
|
+
---
|
|
2
|
+
createdAt: 2026-09-09
|
|
3
|
+
updatedAt: 2026-09-10
|
|
4
|
+
title: "Historia i18n w JavaScript: od 2011 do 2026 roku"
|
|
5
|
+
description: "Poznaj ewolucję internacjonalizacji frontendowej od 2011 do 2026 roku. Daty wydań, wyzwania architektoniczne i kluczowe innowacje w React, Vue, Next.js, Angular, Svelte i Solid."
|
|
6
|
+
keywords:
|
|
7
|
+
- historia i18n
|
|
8
|
+
- internacjonalizacja JavaScript
|
|
9
|
+
- React i18n
|
|
10
|
+
- Next.js i18n
|
|
11
|
+
- Vue i18n
|
|
12
|
+
- Angular i18n
|
|
13
|
+
- Svelte i18n
|
|
14
|
+
- Solid i18n
|
|
15
|
+
- i18next
|
|
16
|
+
- intlayer
|
|
17
|
+
slugs:
|
|
18
|
+
- blog
|
|
19
|
+
- history-of-js-internationalization
|
|
20
|
+
author: aymericzip
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
# Historia internacjonalizacji w JavaScript (i18n)
|
|
24
|
+
|
|
25
|
+
Internacjonalizacja nie jest nowym zagadnieniem. Na długo przed JavaScriptem i współczesnym internetem oprogramowanie musiało radzić sobie z obsługą wielu języków, walut, formatów dat i konwencji lokalnych. Wczesne systemy operacyjne z interfejsem graficznym, takie jak GEM czy Mac OS, rozwiązywały wiele z tych problemów już w latach 80.
|
|
26
|
+
|
|
27
|
+
Te same idee trafiły następnie do frameworków backendowych. Ruby on Rails, Django, środowisko Java oraz aplikacje PHP wypracowały własne metody obsługi internacjonalizacji. Główne wyzwania były dobrze zdefiniowane:
|
|
28
|
+
|
|
29
|
+
- Gdzie przechowywać pliki tłumaczeń?
|
|
30
|
+
- Jak formatować daty, liczby i waluty?
|
|
31
|
+
- Jak radzić sobie z liczbą mnogą i zawiłościami gramatycznymi?
|
|
32
|
+
- W jaki sposób ustalać język właściwy dla danego użytkownika?
|
|
33
|
+
|
|
34
|
+
Kiedy to serwer renderował całe strony HTML, proces był prosty. Aplikacja wczytywała odpowiednie tłumaczenia, generowała kod HTML i odsyłała go do przeglądarki.
|
|
35
|
+
|
|
36
|
+
> PHP i GNU gettext stanowiły wzorzec dla funkcji pomocniczej `t()`, która stała się powszechnym standardem w świecie JavaScriptu i JSX.
|
|
37
|
+
|
|
38
|
+
Następnie JavaScript zaczął przejmować kontrolę nad przeglądarką.
|
|
39
|
+
|
|
40
|
+
Wraz z przejściem od stron renderowanych po stronie serwera do rozbudowanych aplikacji typu Single-Page Application (SPA), internacjonalizacja stała się również domeną frontendu. Przeglądarka nagle musiała pobierać tłumaczenia, dynamicznie przełączać języki, formatować wartości, przetwarzać reguły liczby mnogiej i aktualizować interfejs bez odświeżania strony.
|
|
41
|
+
|
|
42
|
+
Wywołało to kluczowe pytanie:
|
|
43
|
+
|
|
44
|
+
**Jak stworzyć aplikację wielojęzyczną bez przesyłania każdemu użytkownikowi gigantycznych ilości danych tłumaczeń oraz ciężkiego kodu bibliotek?**
|
|
45
|
+
|
|
46
|
+
To pytanie wyznaczało kierunek rozwoju i18n w JavaScripcie przez ponad dekadę.
|
|
47
|
+
|
|
48
|
+
Odpowiedzi ulegały znacznym zmianom: od obiektów globalnych i wywołań `t('klucz')`, przez biblioteki dedykowane konkretnym frameworkom, ekstrakcję w czasie kompilacji, statyczne typowanie w TypeScript, Server Components i tree-shaking, aż po nowoczesne podejścia oparte na kompilatorach, które przekształcają treści w zoptymalizowany kod JavaScript już podczas budowania projektu.
|
|
49
|
+
|
|
50
|
+
Ten artykuł przedstawia tę ewolucję w latach 2011-2026: co próbowała rozwiązać każda generacja narzędzi, co okazało się sukcesem, gdzie napotkano ograniczenia oraz jak współczesna architektura frontendu wpływa na dzisiejszą obsługę i18n.
|
|
51
|
+
|
|
52
|
+

|
|
53
|
+
|
|
54
|
+
## Spis treści
|
|
55
|
+
|
|
56
|
+
<TOC/>
|
|
57
|
+
|
|
58
|
+
## Wczesny internet: internacjonalizacja JavaScript przed 2016 rokiem
|
|
59
|
+
|
|
60
|
+
Aby zrozumieć pozycję dzisiejszych narzędzi i18n, warto przypomnieć sobie realia tworzenia stron internetowych w latach 2011-2015.
|
|
61
|
+
|
|
62
|
+
### Przenoszenie logiki do klienta
|
|
63
|
+
|
|
64
|
+
Na początku lat 2010. internacjonalizacja spoczywała niemal wyłącznie na serwerze. JavaScript pełnił rolę warstwy wspomagającej, odpowiedzialnej za animacje, walidację formularzy i drobne widgety DOM obsługiwane przez jQuery.
|
|
65
|
+
|
|
66
|
+
Wraz z rozwojem aplikacji SPA opartych na Backbone.js, Knockout.js i wczesnym AngularJS, logika renderowania przeniosła się do przeglądarki. Kod klienta musiał samodzielnie prezentować sformatowane daty, przeliczać waluty, uwzględniać liczbę mnogą i zmieniać teksty w locie bez przeładowania strony.
|
|
67
|
+
|
|
68
|
+
Przeglądarki w 2011 roku nie posiadały jednak odpowiednich narzędzi natywnych:
|
|
69
|
+
|
|
70
|
+
<AccordionGroup>
|
|
71
|
+
<Accordion header="Brak natywnego API internacjonalizacji">
|
|
72
|
+
|
|
73
|
+
Specyfikacja ECMAScript Internationalization API (ECMA-402) została sfinalizowana dopiero w grudniu 2012 roku wraz z obiektem `Intl`. Zanim trafiła do powszechnego użytku w przeglądarkach, nawet podstawowe formatowanie daty wymagało własnych funkcji lub ciężkich polyfilli.
|
|
74
|
+
|
|
75
|
+
</Accordion>
|
|
76
|
+
<Accordion header="Brak nowoczesnych bundlerów">
|
|
77
|
+
|
|
78
|
+
Narzędzia pokroju Webpacka dopiero raczkowały, a natywne moduły ES nie były obsługiwane przez przeglądarki. Skrypty ładowano za pomocą znaczników `<script>`, często przypisując słowniki do zmiennych globalnych w stylu `window.translations = { ... }`.
|
|
79
|
+
|
|
80
|
+
</Accordion>
|
|
81
|
+
<Accordion header="Monolityczne pliki JSON">
|
|
82
|
+
|
|
83
|
+
Tłumaczenia gromadzono w potężnych, scentralizowanych plikach JSON. Użytkownik w Tokio, przeglądając stronę główną, pobierał jednocześnie teksty panelu ustawień, ekranów rozliczeniowych i modułów administracyjnych.
|
|
84
|
+
|
|
85
|
+
</Accordion>
|
|
86
|
+
</AccordionGroup>
|
|
87
|
+
|
|
88
|
+
### Pierwsza fala bibliotek klienckich
|
|
89
|
+
|
|
90
|
+
W latach 2012-2015 powstały fundamenty współczesnej internacjonalizacji w JavaScripcie:
|
|
91
|
+
|
|
92
|
+
<AccordionGroup>
|
|
93
|
+
<Accordion header="i18next (styczeń 2012)">
|
|
94
|
+
|
|
95
|
+
Stworzona przez Jana Mühlemanna biblioteka `i18next` ustanowiła standard obsługi słowników klucz-wartość w czasie działania aplikacji. Wprowadziła przeszukiwanie hierarchii kluczy, interpolację zmiennych, reguły liczby mnogiej oraz modułową architekturę pluginów detekcji języka i źródeł danych. Szybko stała się standardem w czystym JS oraz wczesnym środowisku Node.js.
|
|
96
|
+
|
|
97
|
+
</Accordion>
|
|
98
|
+
<Accordion header="vue-i18n (maj 2014)">
|
|
99
|
+
|
|
100
|
+
Opracowana przez Kazuyę Kawaguchiego (Kazupon) biblioteka `vue-i18n` dostosowała internacjonalizację do reaktywnego modelu Vue.js, wprowadzając dyrektywy szablonów (`v-t`) oraz funkcję pomocniczą `$t()`.
|
|
101
|
+
|
|
102
|
+
</Accordion>
|
|
103
|
+
<Accordion header="react-intl (czerwiec 2014)">
|
|
104
|
+
|
|
105
|
+
Opracowana przez firmę Yahoo! w ramach projektu FormatJS, `react-intl` przeniosła standard ICU MessageFormat oraz API `Intl` do ekosystemu Reacta za pośrednictwem deklaratywnych komponentów, takich jak `<FormattedMessage>` i `<FormattedDate>`.
|
|
106
|
+
|
|
107
|
+
</Accordion>
|
|
108
|
+
<Accordion header="react-i18next (grudzień 2015)">
|
|
109
|
+
|
|
110
|
+
Jan Mühlemann zintegrował `i18next` z dynamicznie rosnącą społecznością Reacta, wykorzystując komponenty wyższego rzędu (`withTranslation`) oraz kontekst Reacta do wyzwalania ponownego renderowania przy zmianie języka.
|
|
111
|
+
|
|
112
|
+
</Accordion>
|
|
113
|
+
</AccordionGroup>
|
|
114
|
+
|
|
115
|
+
### Ograniczenia ery przed 2016 rokiem
|
|
116
|
+
|
|
117
|
+
Choć narzędzia te pozwoliły na tworzenie bogatych aplikacji wielojęzycznych, ograniczenia techniczne tamtych lat rodziły powracające trudności:
|
|
118
|
+
|
|
119
|
+
<AccordionGroup>
|
|
120
|
+
<Accordion header="Niestabilne klucze tekstowe">
|
|
121
|
+
|
|
122
|
+
Odwołania w postaci `t('marketing.landing.hero.cta')` nie podlegały statycznej weryfikacji. Literówka w kluczu ujawniała się dopiero w środowisku produkcyjnym, skutkując pustymi elementami lub wyświetlaniem surowych nazw kluczy.
|
|
123
|
+
|
|
124
|
+
</Accordion>
|
|
125
|
+
<Accordion header="Narzut parsowania w czasie wykonywania">
|
|
126
|
+
|
|
127
|
+
Interpretacja składni ICU oraz przetwarzanie wyrażeń regularnych w przeglądarce obciążały procesor, co było szczególnie odczuwalne na urządzeniach mobilnych.
|
|
128
|
+
|
|
129
|
+
</Accordion>
|
|
130
|
+
<Accordion header="Zbyt duże paczki kodu">
|
|
131
|
+
|
|
132
|
+
Brak podziału kodu na poziomie tras lub komponentów powodował przesyłanie wszystkich tekstów aplikacji naraz, co wydłużało czas pierwszego wczytania.
|
|
133
|
+
|
|
134
|
+
</Accordion>
|
|
135
|
+
<Accordion header="Brak spójności między kodem a tłumaczeniami">
|
|
136
|
+
|
|
137
|
+
Słowniki znajdowały się w odrębnych plikach JSON oddalonych od komponentów, co prowadziło do powstawania osieroconych kluczy i pomijania brakujących tłumaczeń.
|
|
138
|
+
|
|
139
|
+
</Accordion>
|
|
140
|
+
</AccordionGroup>
|
|
141
|
+
|
|
142
|
+
## Era frameworków: ewolucja w poszczególnych ekosystemach
|
|
143
|
+
|
|
144
|
+
W latach 2016-2026 architektura frontendu uległa gruntownemu przeobrażeniu. TypeScript stał się powszechnym standardem, dojrzały architektury oparte na komponentach, bundlery takie jak Webpack, Vite i Turbopack spopularyzowały code splitting, React Server Components przeniosły część renderowania z powrotem na serwer, a kompilatory zaczęły bezpośrednio analizować kod aplikacji.
|
|
145
|
+
|
|
146
|
+
Poniższe zakładki ilustrują, jak poszczególne ekosystemy odpowiadały na te wyzwania. W tych środowiskach `react-intlayer` oraz jego odpowiedniki (`next-intlayer`, `vue-intlayer`, `angular-intlayer`, `svelte-intlayer` i `solid-intlayer`) zapewniają wydajne rozwiązania dopasowane do każdego runtime'u.
|
|
147
|
+
|
|
148
|
+
<Tabs>
|
|
149
|
+
|
|
150
|
+
<Tab label="Core JavaScript" value="javascript">
|
|
151
|
+
|
|
152
|
+
| Pierwsze wydanie | Biblioteka | Cel powstania | Kluczowa innowacja |
|
|
153
|
+
| ---------------- | ------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
154
|
+
| Styczeń 2012 | `i18next` | Standaryzacja odpytywania słowników w runtime dla przeglądarki i Node.js bez przywiązania do konkretnego frameworka. | Modułowa architektura oddzielająca silnik tłumaczeń od loaderów, detektorów języka i pamięci podręcznej. |
|
|
155
|
+
| Luty 2021 | `typesafe-i18n` | Zapobieganie błędom w czasie wykonywania i problemom z interpolacją wynikającym z nieoatypowanych kluczy tekstowych. | W pełni otypowane funkcje tłumaczeń generowane bezpośrednio z obiektów tłumaczeń bez dodatkowych zależności w runtime. |
|
|
156
|
+
| Październik 2023 | `paraglide` (`@inlang/paraglide-js`) | Eliminacja odpytywania słowników w runtime, ciężkich parserów i rozrostu paczek kodu. | Kompilacja wiadomości do czystych modułów ECMAScript i funkcji wspierających tree-shaking. |
|
|
157
|
+
| Kwiecień 2024 | `intlayer` | Zastąpienie trudnych w utrzymaniu przestrzeni nazw, zapobieganie wyciekom treści między podstronami, redukcja konfliktów w git i natywne typowanie w TypeScript. | Kolokacja plików `.content` bezpośrednio przy komponentach, automatyczna generacja typów TypeScript, wbudowany wizualny CMS i narzędzia CLI do tłumaczeń z AI. |
|
|
158
|
+
| Czerwiec 2025 | `wuchale` | Usunięcie konieczności ręcznego wyciągania ciągów znaków i wymyślania nazw kluczy podczas programowania. | Przetwarzanie na poziomie AST, które wykrywa tekst inline i kompiluje go do zlokalizowanych funkcji bez dodatkowego narzutu na etapie budowania. |
|
|
159
|
+
|
|
160
|
+
</Tab>
|
|
161
|
+
|
|
162
|
+
<Tab label="React" value="react">
|
|
163
|
+
|
|
164
|
+
| Pierwsze wydanie | Biblioteka | Cel powstania | Kluczowa innowacja |
|
|
165
|
+
| ---------------- | ---------------- | ----------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
166
|
+
| Czerwiec 2014 | `react-intl` | Standaryzacja formatowania liczb, dat, walut oraz złożonych form liczby mnogiej w React. | Deklaratywne komponenty (`<FormattedMessage>`, `<FormattedDate>`) oparte na standardach ICU MessageFormat i ECMA-402. |
|
|
167
|
+
| Grudzień 2015 | `react-i18next` | Zapewnienie idiomicznej integracji `i18next` w aplikacjach React z reaktywnym odświeżaniem widoków. | Ewolucja wraz z Reactem: od komponentów wyższego rzędu do interpolacji JSX za pomocą `<Trans>` oraz hooka `useTranslation`. |
|
|
168
|
+
| Styczeń 2018 | `@lingui/react` | Zmniejszenie wagi bundle'a wynikającej z obecności parserów ICU w kodzie klienckim. | Makra Babel/SWC kompilujące `<Trans>` i `t` do kompaktowych tablic indeksowanych już w trakcie budowania projektu. |
|
|
169
|
+
| Grudzień 2020 | `use-intl` | Lekka, oparta na hookach i bezpieczna pod kątem typów alternatywa dla starszych bibliotek w React. | Ergonomiczne hooki `useTranslations` i `useFormatter` z głęboką integracją z TypeScriptem. |
|
|
170
|
+
| Luty 2021 | `@tolgee/react` | Skrócenie pętli informacji zwrotnej między deweloperami, tłumaczami i projektantami. | Edycja w kontekście przeglądarki umożliwiająca edycję tekstów po kliknięciu z klawiszem Alt oraz automatyczne tworzenie zrzutów ekranu. |
|
|
171
|
+
| Kwiecień 2024 | `react-intlayer` | Wydajna implementacja Intlayer dopasowana do cyklu życia komponentów Reacta, bez monolitycznych plików JSON i złożonych nazw. | Dedykowany hook `useIntlayer`, automatyczne generowanie typów TypeScript, tree-shaking na poziomie komponentów i bezpośrednia synchronizacja z wizualnym CMS. |
|
|
172
|
+
| Lipiec 2024 | `gt-react` | Automatyzacja ręcznego eksportu plików i utrzymywania tłumaczeń. | Zautomatyzowana lokalizacja oparta na AI bezpośrednio w komponentach React z wykorzystaniem potoków chmurowych. |
|
|
173
|
+
| Sierpień 2025 | `@wuchale/jsx` | Rezygnacja z ręcznego nazywania kluczy i powtarzalnych hooków podczas pisania kodu JSX. | Przekształcanie AST automatycznie wykrywające węzły tekstowe w JSX i kompilujące je do ich zlokalizowanych odpowiedników. |
|
|
174
|
+
|
|
175
|
+
</Tab>
|
|
176
|
+
|
|
177
|
+
<Tab label="Next.js" value="nextjs">
|
|
178
|
+
|
|
179
|
+
| Pierwsze wydanie | Biblioteka | Cel powstania | Kluczowa innowacja |
|
|
180
|
+
| ---------------- | ------------------------------------------- | ---------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
181
|
+
| Listopad 2018 | `next-i18next` | Obsługa SSR i SSG z użyciem `i18next` w Next.js Pages Router bez kaskadowych zapytań po stronie klienta. | Funkcje `serverSideTranslations` i `appWithTranslation` przekazujące zlokalizowane przestrzenie nazw w propsach stron. |
|
|
182
|
+
| Grudzień 2019 | `next-translate` | Uproszczenie konfiguracji i redukcja rozmiaru paczek w aplikacjach Next.js Pages Router. | Wtyczka do Webpack loadera wstrzykująca wyłącznie te przestrzenie nazw, które są wymagane przez konkretną podstronę. |
|
|
183
|
+
| Listopad 2020 | `next-intl` | Nowe podejście do internacjonalizacji z myślą o App Router, React Server Components (RSC) i strumieniowanym SSR. | Natywna integracja z middleware Next.js App Router, Server Actions i asynchronicznymi Server Components bez konieczności wysyłania kodu na klienta. |
|
|
184
|
+
| Lipiec 2022 | `next-international` | Maksymalizacja bezpieczeństwa typów w TypeScript przy minimalnym narzucie na bundle klienta w Next.js. | Ścisłe typowanie dla wyodrębnionych kluczy tłumaczeń z lekkimi adapterami dla App Router i Pages Router. |
|
|
185
|
+
| Kwiecień 2024 | `paraglide-next` (`@inlang/paraglide-next`) | Dostarczenie prekompilowanych komunikatów bez narzutu biblioteki runtime dla Next.js App Router i Pages Router. | Routing oparty na middleware połączony z funkcjami wiadomości wspierającymi tree-shaking, co eliminuje parsowanie JSON w RSC i paczkach klienta. |
|
|
186
|
+
| Kwiecień 2024 | `next-intlayer` | Adapter dla Server Components bez uciążliwego przekazywania funkcji `t()` czy słowników przez propsy. | Wywoływanie `useIntlayer` w synchronicznych Server Components bez prop-drillingu, renderowanie bez kaskad na serwerze, lokalny middleware i podgląd w CMS. |
|
|
187
|
+
| Wrzesień 2024 | `gt-next` | Automatyzacja generowania treści wielojęzycznych i dynamicznego routingu w Next.js przy użyciu AI. | Integracja z App Router łącząca tłumaczenie maszynowe w chmurze z middleware brzegowym (edge) i warstwami buforowania Next.js. |
|
|
188
|
+
|
|
189
|
+
</Tab>
|
|
190
|
+
|
|
191
|
+
<Tab label="Vue & Nuxt" value="vue">
|
|
192
|
+
|
|
193
|
+
| Pierwsze wydanie | Biblioteka | Cel powstania | Kluczowa innowacja |
|
|
194
|
+
| ---------------- | -------------- | ------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
195
|
+
| Maj 2014 | `vue-i18n` | Zapewnienie reaktywnej, naturalnej internacjonalizacji dla aplikacji tworzonych w Vue.js. | Ścisła integracja z reaktywnością Vue, dyrektywy szablonów (`v-t`), funkcje pomocnicze `$t` oraz bloki `<i18n>` w komponentach SFC. |
|
|
196
|
+
| Listopad 2017 | `@nuxt/i18n` | Obsługa zlokalizowanych adresów URL, tagów SEO hreflang oraz hydratacji SSR w Nuxt. | Pełny moduł routingu generujący trasy (prefiksy, domeny), nagłówki meta SEO oraz wspierający leniwe ładowanie fragmentów słowników. |
|
|
197
|
+
| Sierpień 2019 | `fluent-vue` | Obsługa złożonych form gramatycznych, odmian i niesymetrycznych struktur językowych w Vue. | Integracja składni Project Fluent od Mozilli w środowisku Vue, co eliminuje zawiłe warunki logiczne w szablonach. |
|
|
198
|
+
| Kwiecień 2025 | `vue-intlayer` | Dedykowana integracja Intlayer dla Composition API w Vue 3 i Nuxt, eliminująca zanieczyszczanie zasięgu globalnego. | Composable `useIntlayer` zoptymalizowany pod kątem reaktywności Vue 3, izolacja komponentów, pełne autouzupełnianie w TypeScript i edycja w wizualnym CMS. |
|
|
199
|
+
|
|
200
|
+
</Tab>
|
|
201
|
+
|
|
202
|
+
<Tab label="Angular" value="angular">
|
|
203
|
+
|
|
204
|
+
| Pierwsze wydanie | Biblioteka | Cel powstania | Kluczowa innowacja |
|
|
205
|
+
| ---------------- | ------------------- | --------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
206
|
+
| Luty 2017 | `ngx-translate` | Dynamiczne tłumaczenie w czasie wykonywania w Angularze bez konieczności budowania osobnych paczek dla języków. | Serwis `TranslateService` oraz pipe `translate` umożliwiające asynchroniczne pobieranie treści i zmianę języka w locie. |
|
|
207
|
+
| Lipiec 2019 | `@ngneat/transloco` | Usunięcie problemów wydajnościowych i braku modułowości obecnych we wcześniejszych rozwiązaniach w Angularze. | Dyrektywa strukturalna (`*transloco`), izolowane tłumaczenia dla modułów ładowanych leniwie, wsparcie dla SSR oraz narzędzie CLI do ekstrakcji tekstów. |
|
|
208
|
+
| Wrzesień 2019 | `@angular/localize` | Nowoczesne podejście do wbudowanej w Angulara i18n bez potrzeby wielokrotnej rekompilacji kodu TypeScript. | Tagowane literały szablonów z `$localize` modyfikowane w szybkim kroku po kompilacji w silniku Ivy. |
|
|
209
|
+
| Luty 2021 | `@tolgee/ngx` | Wdrożenie tłumaczenia w kontekście interfejsu oraz wykonywania zrzutów ekranu w projektach Angulara. | Pipe'y i dyrektywy połączone z platformą Tolgee pozwalające na edycję tekstów bezpośrednio w oknie przeglądarki. |
|
|
210
|
+
| Kwiecień 2025 | `angular-intlayer` | Natywna integracja Intlayer dla nowoczesnego Angulara (Signals, komponenty standalone i SSR). | Reaktywna obsługa oparta na Signals, dopasowana do detekcji zmian Angulara, wstrzykiwanie zależności w komponentach standalone i synchronizacja z CMS. |
|
|
211
|
+
|
|
212
|
+
</Tab>
|
|
213
|
+
|
|
214
|
+
<Tab label="Svelte & SvelteKit" value="svelte">
|
|
215
|
+
|
|
216
|
+
| Pierwsze wydanie | Biblioteka | Cel powstania | Kluczowa innowacja |
|
|
217
|
+
| ---------------- | ----------------- | ------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
218
|
+
| Lipiec 2018 | `svelte-i18n` | Reaktywna biblioteka internacjonalizacji dostosowana do store'ów w Svelte. | Obsługa `$t` powiązana ze store'ami, zapewniająca precyzyjne aktualizacje drzewa DOM po zmianie języka. |
|
|
219
|
+
| Grudzień 2021 | `sveltekit-i18n` | Właściwa obsługa SSR oraz pobierania tłumaczeń dla konkretnych tras w projektach SvelteKit. | Modułowy mechanizm pobierający wyłącznie te zasoby językowe i formatery, które są wymagane przez aktualną trasę. |
|
|
220
|
+
| Listopad 2021 | `@tolgee/svelte` | Tłumaczenie w kontekście interfejsu dla aplikacji Svelte. | Powiązanie ze store'ami Svelte zintegrowane z nakładką Tolgee oraz funkcją automatycznego tworzenia zrzutów ekranu. |
|
|
221
|
+
| Kwiecień 2025 | `svelte-intlayer` | Wydajna implementacja Intlayer zaprojektowana bezpośrednio z myślą o Svelte 5 i SvelteKit. | Reaktywne powiązania dla Runes w Svelte 5 (`$state`), deklaracje `.content` przy komponentach, bezkonfiguracyjne pluginy i obsługa w wizualnym CMS. |
|
|
222
|
+
| Lipiec 2025 | `@wuchale/svelte` | Wyeliminowanie konieczności tworzenia słowników i powtarzalnego importowania funkcji `$t`. | Preprocesor Svelte analizujący szablony podczas kompilacji i przekształcający węzły tekstowe na zlokalizowany kod bez dodatkowych wrapperów. |
|
|
223
|
+
|
|
224
|
+
</Tab>
|
|
225
|
+
|
|
226
|
+
<Tab label="SolidJS" value="solid">
|
|
227
|
+
|
|
228
|
+
| Pierwsze wydanie | Biblioteka | Cel powstania | Kluczowa innowacja |
|
|
229
|
+
| ---------------- | ------------------------ | ------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
230
|
+
| Wrzesień 2021 | `@solid-primitives/i18n` | Stworzenie prymitywu i18n dopasowanego do precyzyjnego modelu reaktywności w SolidJS. | Reaktywny resolver tłumaczeń oparty na sygnałach, aktualizujący elementy DOM bez udziału Virtual DOM i zbędnych ponownych renderów. |
|
|
231
|
+
| Kwiecień 2025 | `solid-intlayer` | Wydajne rozwiązanie Intlayer zaprojektowane natywnie dla SolidJS i SolidStart. | Powiązania zoptymalizowane pod kątem sygnałów SolidJS bez obciążenia Virtual DOM, pełna autokompletacja schematów TypeScript i edytor wizualny. |
|
|
232
|
+
| Czerwiec 2026 | `@lingui/solid` | Zastosowanie makroekstrakcji w czasie budowy oraz formatu ICU MessageFormat w projektach SolidJS. | Przekształcenia oparte na makrach dopasowane do modelu reaktywności SolidJS, kompilujące wiadomości do zwięzłych struktur czasu wykonania. |
|
|
233
|
+
|
|
234
|
+
</Tab>
|
|
235
|
+
|
|
236
|
+
</Tabs>
|
|
237
|
+
|
|
238
|
+
## Cztery ery architektoniczne JavaScript i18n
|
|
239
|
+
|
|
240
|
+

|
|
241
|
+
|
|
242
|
+
Analizując piętnaście lat innowacji, historię internacjonalizacji w środowisku JavaScript można ująć w czterech etapach architektonicznych:
|
|
243
|
+
|
|
244
|
+
<AccordionGroup>
|
|
245
|
+
<Accordion header="1. Era słowników w czasie wykonywania (2011-2017)">
|
|
246
|
+
|
|
247
|
+
Reprezentowana przez `i18next`, `react-intl` oraz `vue-i18n`. Aplikacje wczytywały statyczne pliki JSON w całości do pamięci, a funkcje pomocnicze wyszukiwały tekstowe klucze w obiektach. Liczba mnoga oraz podstawianie zmiennych były przetwarzane w przeglądarce za pomocą wyrażeń regularnych i parserów ICU po stronie klienta.
|
|
248
|
+
|
|
249
|
+
</Accordion>
|
|
250
|
+
<Accordion header="2. Era makr kompilacyjnych i statycznego typowania (2018-2021)">
|
|
251
|
+
|
|
252
|
+
Zdominowana przez `lingui`, `next-translate`, `transloco` oraz `typesafe-i18n`. Twórcy zauważyli koszt parsowania w runtime i niestabilność nieoatypowanych kluczy. Makra Babel zaczęły wyodrębniać teksty podczas budowania, wtyczki do bundlerów dzieliły słowniki per strona, a kompilatory TypeScriptu zaczęły weryfikować poprawność argumentów tłumaczeń.
|
|
253
|
+
|
|
254
|
+
</Accordion>
|
|
255
|
+
<Accordion header="3. Era Server Components i strumieniowania (2022-2024)">
|
|
256
|
+
|
|
257
|
+
Ukształtowana przez `next-intl`, `next-international` oraz wczesne adaptery RSC. Wraz z nadejściem React Server Components i Next.js App Router uwaga skupiła się na renderowaniu zlokalizowanych treści po stronie serwera bez wysyłania do przeglądarki zbędnych słowników ani ciężkich silników i18n.
|
|
258
|
+
|
|
259
|
+
</Accordion>
|
|
260
|
+
<Accordion header="4. Era nowoczesnych kompilatorów i zintegrowanych treści (2024-2026)">
|
|
261
|
+
|
|
262
|
+
Definiowana przez `paraglide`, `intlayer` oraz `wuchale`. Współczesne rozwiązania traktują internacjonalizację nie jako prostą zamianę napisów, lecz jako pełną architekturę zarządzania treścią. Kompilatory przekształcają wiadomości w kod zoptymalizowany pod kątem tree-shakingu, deklaracje znajdują się przy komponentach, a edytory wizualne i narzędzia oparte na AI stają się częścią codziennej pracy programisty. W tym podejściu Intlayer oddziela deklarację treści i generowanie typów od warstwy wykonawczej, udostępniając biblioteki (`react-intlayer`, `next-intlayer`, `vue-intlayer`, `angular-intlayer`, `svelte-intlayer` i `solid-intlayer`) dopasowane do mechanizmów każdego frameworka.
|
|
263
|
+
|
|
264
|
+
</Accordion>
|
|
265
|
+
</AccordionGroup>
|
|
266
|
+
|
|
267
|
+
## Podsumowanie: równowaga między wygodą programisty, wydajnością a rozwojem AI
|
|
268
|
+
|
|
269
|
+
Na przestrzeni piętnastu lat i czterech generacji architektonicznych główne wyzwanie internacjonalizacji w JavaScripcie pozostało niezmienne: połączenie wygody tworzenia oprogramowania (DX) i łatwości utrzymania kodu z najwyższą wydajnością po stronie użytkownika.
|
|
270
|
+
|
|
271
|
+
To, co zaczynało się od zmiennych globalnych i uciążliwych plików JSON, rozwinęło się w treści zlokalizowane przy komponentach, automatyczne typowanie w TypeScript, bezkaskadowe renderowanie na serwerze oraz kompilację bez zbędnego kodu klienckiego.
|
|
272
|
+
|
|
273
|
+
### Automatyzacja dzięki AI a tradycyjne platformy tłumaczeniowe
|
|
274
|
+
|
|
275
|
+
Istotnym czynnikiem ostatnich lat stało się generowanie tłumaczeń przy użyciu modeli sztucznej inteligencji, co zmienia tradycyjny model działania wyspecjalizowanych platform tłumaczeniowych (TMS).
|
|
276
|
+
|
|
277
|
+
W przeszłości gromadzenie tekstów w jednym dużym pliku JSON było kompromisem ułatwiającym współpracę z systemami TMS. Pojedynczy plik stanowił prosty punkt wymiany danych dla zewnętrznych tłumaczy. Dla programistów oznaczało to jednak spore koszty architektoniczne: ciągłe konflikty przy scalaniu gałęzi w git, osierocone klucze, utratę kontekstu i skomplikowane przestrzenie nazw.
|
|
278
|
+
|
|
279
|
+
Dzięki generatywnej AI i nowoczesnym kompilatorom doświadczenie programisty (DX) ponownie staje się priorytetem. Narzędzia budowania i interfejsy wiersza poleceń (CLI) potrafią automatycznie wykrywać, sprawdzać i tłumaczyć pliki powiązane z komponentami, bez konieczności zaburzania architektury kodu na rzecz zewnętrznych procesów.
|
|
280
|
+
|
|
281
|
+
Przez lata komercyjne platformy opierały swoje usługi na pośrednictwie w tych manualnych procesach:
|
|
282
|
+
|
|
283
|
+
- Narzędzia takie jak **Locize** (komercyjne zaplecze dla `i18next`) czy **Crowdin** (partner wielu projektów open-source) oparły swój model na hostingu tłumaczeń, planach abonamentowych i opłatach za liczbę słów.
|
|
284
|
+
- Ponieważ ich przychody zależą od skali i powtarzalnych procesów manualnych, mają mniejszy interes w dostarczaniu bezpłatnej, bezpośredniej automatyzacji wbudowanej wprost w narzędzia deweloperskie.
|
|
285
|
+
|
|
286
|
+
### Nowe narzędzia AI a bezpośredni koszt API
|
|
287
|
+
|
|
288
|
+
Gdy modele językowe obniżyły koszt tłumaczenia do ułamków grosza przy zachowaniu wysokiej jakości, na rynku pojawiły się nowe narzędzia:
|
|
289
|
+
|
|
290
|
+
- Platformy takie jak Paraglide z **linguo.dev** czy **General Translation** (`gt-react`, `gt-next`) oferują własne płatne subskrypcje i chmurowe potoki pośredniczące.
|
|
291
|
+
- Z kolei **Intlayer** udostępnia automatyczne tłumaczenie z użyciem AI bezpośrednio z poziomu swojej konsoli CLI, umożliwiając zespołom korzystanie z własnych kluczy API (OpenAI, Anthropic, Mistral czy Google Gemini). Bez marż pośredników i bez uzależnienia od jednego dostawcy, rozliczenie odbywa się według podstawowych stawek wybranego modelu.
|
|
292
|
+
|
|
293
|
+
### Więcej niż i18n: kompletny system treści wielojęzycznych
|
|
294
|
+
|
|
295
|
+
Współczesny web development to znacznie więcej niż przekładanie pojedynczych słów takich jak `"Wyślij"` czy `"Zaloguj się"`. Aplikacje wymagają ustrukturyzowanych, elastycznych i dynamicznych treści na każdym etapie ścieżki użytkownika.
|
|
296
|
+
|
|
297
|
+
Intlayer podchodzi do tego zagadnienia nie jak do prostego narzędzia wyszukiwania ciągów tekstowych, lecz jako do kompletnego systemu zarządzania treścią wielojęzyczną. Dzięki wbudowanemu wsparciu dla Markdowna, struktur HTML, zagnieżdżonych schematów danych i wizualnego edytora CMS łączy programowanie, automatyzację z AI i edycję treści w jedną spójną całość.
|
|
298
|
+
|
|
299
|
+
Szczegółowe porównania architektoniczne i praktyczne przewodniki migracji znajdziesz w poniższych materiałach:
|
|
300
|
+
|
|
301
|
+
- [Kompilator vs. deklaratywna i18n](https://github.com/aymericzip/intlayer/blob/main/docs/blog/pl/compiler_vs_declarative_i18n.md)
|
|
302
|
+
- [i18n na poziomie komponentu vs. scentralizowana](https://github.com/aymericzip/intlayer/blob/main/docs/blog/pl/per-component_vs_centralized_i18n.md)
|
|
303
|
+
- [Wydajność i benchmarki](https://intlayer.org/doc/benchmark)
|
|
304
|
+
- [Adaptery zgodności Intlayer](https://intlayer.org/doc/concept/compatibility)
|