@intlayer/docs 9.5.0 → 9.5.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/blog/ar/history_of_i18n.md +304 -0
- package/blog/de/history_of_i18n.md +304 -0
- package/blog/en/history_of_i18n.md +304 -0
- package/blog/en-GB/history_of_i18n.md +304 -0
- package/blog/es/history_of_i18n.md +304 -0
- package/blog/fr/history_of_i18n.md +304 -0
- package/blog/hi/history_of_i18n.md +304 -0
- package/blog/id/history_of_i18n.md +304 -0
- package/blog/it/history_of_i18n.md +304 -0
- package/blog/ja/history_of_i18n.md +304 -0
- package/blog/ko/history_of_i18n.md +304 -0
- package/blog/pl/history_of_i18n.md +304 -0
- package/blog/pt/history_of_i18n.md +304 -0
- package/blog/ru/history_of_i18n.md +304 -0
- package/blog/tr/history_of_i18n.md +304 -0
- package/blog/uk/history_of_i18n.md +304 -0
- package/blog/vi/history_of_i18n.md +304 -0
- package/blog/zh/history_of_i18n.md +304 -0
- package/dist/cjs/generated/blog.entry.cjs +20 -0
- package/dist/cjs/generated/blog.entry.cjs.map +1 -1
- package/dist/cjs/generated/docs.entry.cjs +20 -20
- package/dist/cjs/generated/docs.entry.cjs.map +1 -1
- package/dist/esm/generated/blog.entry.mjs +20 -0
- package/dist/esm/generated/blog.entry.mjs.map +1 -1
- package/dist/esm/generated/docs.entry.mjs +20 -20
- package/dist/esm/generated/docs.entry.mjs.map +1 -1
- package/dist/types/generated/blog.entry.d.ts +1 -0
- package/dist/types/generated/blog.entry.d.ts.map +1 -1
- package/dist/types/generated/docs.entry.d.ts +1 -1
- package/dist/types/generated/docs.entry.d.ts.map +1 -1
- package/docs/ar/benchmark/index.md +4 -1
- package/docs/ar/benchmark/nextjs.md +32 -27
- package/docs/ar/benchmark/solid.md +13 -10
- package/docs/ar/benchmark/svelte.md +12 -9
- package/docs/ar/benchmark/tanstack.md +29 -24
- package/docs/ar/benchmark/vue.md +11 -7
- package/docs/ar/cli/build.md +8 -1
- package/docs/ar/cli/configuration.md +3 -1
- package/docs/ar/cli/doc-review.md +8 -1
- package/docs/ar/cli/doc-translate.md +5 -1
- package/docs/ar/cli/extract.md +2 -1
- package/docs/ar/cli/fill.md +5 -1
- package/docs/ar/cli/index.md +4 -5
- package/docs/ar/cli/live.md +5 -1
- package/docs/ar/cli/login.md +2 -2
- package/docs/ar/cli/pull.md +5 -1
- package/docs/ar/cli/push.md +5 -1
- package/docs/ar/cli/scan.md +5 -1
- package/docs/ar/cli/standalone.md +5 -1
- package/docs/ar/cli/test.md +5 -1
- package/docs/ar/cli/watch.md +5 -1
- package/docs/ar/compat/i18n-js.md +1 -1
- package/docs/ar/compat/i18next.md +1 -1
- package/docs/ar/compat/lingui.md +1 -1
- package/docs/ar/compat/next-i18next.md +1 -1
- package/docs/ar/compat/next-intl.md +1 -1
- package/docs/ar/compat/next-translate.md +1 -1
- package/docs/ar/compat/ngx-translate.md +1 -1
- package/docs/ar/compat/nuxtjs-i18n.md +1 -1
- package/docs/ar/compat/polyglot.md +1 -1
- package/docs/ar/compat/react-i18next.md +1 -1
- package/docs/ar/compat/react-intl.md +1 -1
- package/docs/ar/compat/svelte-i18n.md +1 -1
- package/docs/ar/compat/transloco.md +1 -1
- package/docs/ar/compat/vue-i18n.md +1 -1
- package/docs/ar/intlayer_with_nextjs_15.md +1 -1
- package/docs/ar/intlayer_with_nextjs_16.md +1 -1
- package/docs/ar/intlayer_with_remix_3.md +543 -0
- package/docs/bn/cli/index.md +4 -5
- package/docs/bn/cli/scan.md +5 -1
- package/docs/bn/cli/standalone.md +5 -1
- package/docs/cs/cli/index.md +4 -5
- package/docs/cs/cli/scan.md +5 -1
- package/docs/cs/cli/standalone.md +5 -1
- package/docs/de/benchmark/index.md +4 -1
- package/docs/de/benchmark/nextjs.md +32 -27
- package/docs/de/benchmark/solid.md +13 -10
- package/docs/de/benchmark/svelte.md +12 -9
- package/docs/de/benchmark/tanstack.md +29 -24
- package/docs/de/benchmark/vue.md +11 -7
- package/docs/de/cli/build.md +8 -1
- package/docs/de/cli/configuration.md +3 -1
- package/docs/de/cli/doc-review.md +8 -1
- package/docs/de/cli/doc-translate.md +5 -1
- package/docs/de/cli/extract.md +2 -1
- package/docs/de/cli/fill.md +5 -1
- package/docs/de/cli/index.md +4 -5
- package/docs/de/cli/live.md +5 -1
- package/docs/de/cli/login.md +2 -2
- package/docs/de/cli/pull.md +5 -1
- package/docs/de/cli/push.md +5 -1
- package/docs/de/cli/scan.md +5 -1
- package/docs/de/cli/standalone.md +5 -1
- package/docs/de/cli/test.md +5 -1
- package/docs/de/cli/watch.md +5 -1
- package/docs/de/compat/i18n-js.md +1 -1
- package/docs/de/compat/i18next.md +1 -1
- package/docs/de/compat/lingui.md +1 -1
- package/docs/de/compat/next-i18next.md +1 -1
- package/docs/de/compat/next-intl.md +1 -1
- package/docs/de/compat/next-translate.md +1 -1
- package/docs/de/compat/ngx-translate.md +1 -1
- package/docs/de/compat/nuxtjs-i18n.md +1 -1
- package/docs/de/compat/polyglot.md +1 -1
- package/docs/de/compat/react-i18next.md +1 -1
- package/docs/de/compat/react-intl.md +1 -1
- package/docs/de/compat/svelte-i18n.md +1 -1
- package/docs/de/compat/transloco.md +1 -1
- package/docs/de/compat/vue-i18n.md +1 -1
- package/docs/de/intlayer_with_nextjs_15.md +1 -1
- package/docs/de/intlayer_with_nextjs_16.md +1 -1
- package/docs/de/intlayer_with_remix_3.md +543 -0
- package/docs/en/benchmark/index.md +4 -1
- package/docs/en/benchmark/nextjs.md +32 -27
- package/docs/en/benchmark/solid.md +13 -10
- package/docs/en/benchmark/svelte.md +12 -9
- package/docs/en/benchmark/tanstack.md +30 -25
- package/docs/en/benchmark/vue.md +11 -7
- package/docs/en/cli/build.md +8 -1
- package/docs/en/cli/configuration.md +3 -1
- package/docs/en/cli/doc-review.md +8 -1
- package/docs/en/cli/doc-translate.md +5 -1
- package/docs/en/cli/extract.md +2 -1
- package/docs/en/cli/fill.md +5 -1
- package/docs/en/cli/index.md +4 -5
- package/docs/en/cli/live.md +5 -1
- package/docs/en/cli/login.md +2 -2
- package/docs/en/cli/pull.md +5 -1
- package/docs/en/cli/push.md +5 -1
- package/docs/en/cli/scan.md +5 -1
- package/docs/en/cli/standalone.md +5 -1
- package/docs/en/cli/test.md +5 -1
- package/docs/en/cli/watch.md +5 -1
- package/docs/en/compat/i18n-js.md +1 -1
- package/docs/en/compat/i18next.md +1 -1
- package/docs/en/compat/lingui.md +1 -1
- package/docs/en/compat/next-i18next.md +1 -1
- package/docs/en/compat/next-intl.md +1 -1
- package/docs/en/compat/next-translate.md +1 -1
- package/docs/en/compat/ngx-translate.md +1 -1
- package/docs/en/compat/nuxtjs-i18n.md +1 -1
- package/docs/en/compat/polyglot.md +1 -1
- package/docs/en/compat/react-i18next.md +1 -1
- package/docs/en/compat/react-intl.md +1 -1
- package/docs/en/compat/svelte-i18n.md +1 -1
- package/docs/en/compat/transloco.md +1 -1
- package/docs/en/compat/vue-i18n.md +1 -1
- package/docs/en/intlayer_with_nextjs_15.md +1 -1
- package/docs/en/intlayer_with_nextjs_16.md +1 -1
- package/docs/en/intlayer_with_remix_3.md +540 -0
- package/docs/en-GB/benchmark/index.md +4 -1
- package/docs/en-GB/benchmark/nextjs.md +32 -27
- package/docs/en-GB/benchmark/solid.md +13 -10
- package/docs/en-GB/benchmark/svelte.md +12 -9
- package/docs/en-GB/benchmark/tanstack.md +29 -24
- package/docs/en-GB/benchmark/vue.md +11 -7
- package/docs/en-GB/cli/build.md +8 -1
- package/docs/en-GB/cli/configuration.md +3 -1
- package/docs/en-GB/cli/doc-review.md +8 -1
- package/docs/en-GB/cli/doc-translate.md +5 -1
- package/docs/en-GB/cli/extract.md +2 -1
- package/docs/en-GB/cli/fill.md +5 -1
- package/docs/en-GB/cli/index.md +4 -5
- package/docs/en-GB/cli/live.md +5 -1
- package/docs/en-GB/cli/login.md +2 -2
- package/docs/en-GB/cli/pull.md +5 -1
- package/docs/en-GB/cli/push.md +5 -1
- package/docs/en-GB/cli/scan.md +5 -1
- package/docs/en-GB/cli/standalone.md +5 -1
- package/docs/en-GB/cli/test.md +5 -1
- package/docs/en-GB/cli/watch.md +5 -1
- package/docs/en-GB/compat/i18n-js.md +1 -1
- package/docs/en-GB/compat/i18next.md +1 -1
- package/docs/en-GB/compat/lingui.md +1 -1
- package/docs/en-GB/compat/next-i18next.md +1 -1
- package/docs/en-GB/compat/next-intl.md +1 -1
- package/docs/en-GB/compat/next-translate.md +1 -1
- package/docs/en-GB/compat/ngx-translate.md +1 -1
- package/docs/en-GB/compat/nuxtjs-i18n.md +1 -1
- package/docs/en-GB/compat/polyglot.md +1 -1
- package/docs/en-GB/compat/react-i18next.md +1 -1
- package/docs/en-GB/compat/react-intl.md +1 -1
- package/docs/en-GB/compat/svelte-i18n.md +1 -1
- package/docs/en-GB/compat/transloco.md +1 -1
- package/docs/en-GB/compat/vue-i18n.md +1 -1
- package/docs/en-GB/intlayer_with_nextjs_15.md +1 -1
- package/docs/en-GB/intlayer_with_nextjs_16.md +1 -1
- package/docs/en-GB/intlayer_with_remix_3.md +558 -0
- package/docs/es/benchmark/index.md +4 -1
- package/docs/es/benchmark/nextjs.md +32 -27
- package/docs/es/benchmark/solid.md +13 -10
- package/docs/es/benchmark/svelte.md +12 -9
- package/docs/es/benchmark/tanstack.md +29 -24
- package/docs/es/benchmark/vue.md +11 -7
- package/docs/es/cli/build.md +8 -1
- package/docs/es/cli/configuration.md +3 -1
- package/docs/es/cli/doc-review.md +8 -1
- package/docs/es/cli/doc-translate.md +5 -1
- package/docs/es/cli/extract.md +2 -1
- package/docs/es/cli/fill.md +5 -1
- package/docs/es/cli/index.md +4 -5
- package/docs/es/cli/live.md +5 -1
- package/docs/es/cli/login.md +2 -2
- package/docs/es/cli/pull.md +5 -1
- package/docs/es/cli/push.md +5 -1
- package/docs/es/cli/scan.md +5 -1
- package/docs/es/cli/standalone.md +5 -1
- package/docs/es/cli/test.md +5 -1
- package/docs/es/cli/watch.md +5 -1
- package/docs/es/compat/i18n-js.md +1 -1
- package/docs/es/compat/i18next.md +1 -1
- package/docs/es/compat/lingui.md +1 -1
- package/docs/es/compat/next-i18next.md +1 -1
- package/docs/es/compat/next-intl.md +1 -1
- package/docs/es/compat/next-translate.md +1 -1
- package/docs/es/compat/ngx-translate.md +1 -1
- package/docs/es/compat/nuxtjs-i18n.md +1 -1
- package/docs/es/compat/polyglot.md +1 -1
- package/docs/es/compat/react-i18next.md +1 -1
- package/docs/es/compat/react-intl.md +1 -1
- package/docs/es/compat/svelte-i18n.md +1 -1
- package/docs/es/compat/transloco.md +1 -1
- package/docs/es/compat/vue-i18n.md +1 -1
- package/docs/es/intlayer_with_nextjs_15.md +1 -1
- package/docs/es/intlayer_with_nextjs_16.md +1 -1
- package/docs/es/intlayer_with_remix_3.md +540 -0
- package/docs/fr/benchmark/index.md +4 -1
- package/docs/fr/benchmark/nextjs.md +32 -27
- package/docs/fr/benchmark/solid.md +13 -10
- package/docs/fr/benchmark/svelte.md +12 -9
- package/docs/fr/benchmark/tanstack.md +29 -24
- package/docs/fr/benchmark/vue.md +11 -7
- package/docs/fr/cli/build.md +8 -1
- package/docs/fr/cli/configuration.md +3 -1
- package/docs/fr/cli/doc-review.md +8 -1
- package/docs/fr/cli/doc-translate.md +5 -1
- package/docs/fr/cli/extract.md +2 -1
- package/docs/fr/cli/fill.md +5 -1
- package/docs/fr/cli/index.md +4 -5
- package/docs/fr/cli/live.md +5 -1
- package/docs/fr/cli/login.md +2 -2
- package/docs/fr/cli/pull.md +5 -1
- package/docs/fr/cli/push.md +5 -1
- package/docs/fr/cli/scan.md +5 -1
- package/docs/fr/cli/standalone.md +5 -1
- package/docs/fr/cli/test.md +5 -1
- package/docs/fr/cli/watch.md +5 -1
- package/docs/fr/compat/i18n-js.md +1 -1
- package/docs/fr/compat/i18next.md +1 -1
- package/docs/fr/compat/lingui.md +1 -1
- package/docs/fr/compat/next-i18next.md +1 -1
- package/docs/fr/compat/next-intl.md +1 -1
- package/docs/fr/compat/next-translate.md +1 -1
- package/docs/fr/compat/ngx-translate.md +1 -1
- package/docs/fr/compat/nuxtjs-i18n.md +1 -1
- package/docs/fr/compat/polyglot.md +1 -1
- package/docs/fr/compat/react-i18next.md +1 -1
- package/docs/fr/compat/react-intl.md +1 -1
- package/docs/fr/compat/svelte-i18n.md +1 -1
- package/docs/fr/compat/transloco.md +1 -1
- package/docs/fr/compat/vue-i18n.md +1 -1
- package/docs/fr/intlayer_with_nextjs_15.md +1 -1
- package/docs/fr/intlayer_with_nextjs_16.md +1 -1
- package/docs/fr/intlayer_with_remix_3.md +540 -0
- package/docs/hi/benchmark/index.md +4 -1
- package/docs/hi/benchmark/nextjs.md +32 -27
- package/docs/hi/benchmark/solid.md +13 -10
- package/docs/hi/benchmark/svelte.md +12 -9
- package/docs/hi/benchmark/tanstack.md +29 -24
- package/docs/hi/benchmark/vue.md +11 -7
- package/docs/hi/cli/build.md +8 -1
- package/docs/hi/cli/configuration.md +3 -1
- package/docs/hi/cli/doc-review.md +8 -1
- package/docs/hi/cli/doc-translate.md +5 -1
- package/docs/hi/cli/extract.md +2 -1
- package/docs/hi/cli/fill.md +5 -1
- package/docs/hi/cli/index.md +4 -5
- package/docs/hi/cli/live.md +5 -1
- package/docs/hi/cli/login.md +2 -2
- package/docs/hi/cli/pull.md +5 -1
- package/docs/hi/cli/push.md +5 -1
- package/docs/hi/cli/scan.md +5 -1
- package/docs/hi/cli/standalone.md +5 -1
- package/docs/hi/cli/test.md +5 -1
- package/docs/hi/cli/watch.md +5 -1
- package/docs/hi/compat/i18n-js.md +1 -1
- package/docs/hi/compat/i18next.md +1 -1
- package/docs/hi/compat/lingui.md +1 -1
- package/docs/hi/compat/next-i18next.md +1 -1
- package/docs/hi/compat/next-intl.md +1 -1
- package/docs/hi/compat/next-translate.md +1 -1
- package/docs/hi/compat/ngx-translate.md +1 -1
- package/docs/hi/compat/nuxtjs-i18n.md +1 -1
- package/docs/hi/compat/polyglot.md +1 -1
- package/docs/hi/compat/react-i18next.md +1 -1
- package/docs/hi/compat/react-intl.md +1 -1
- package/docs/hi/compat/svelte-i18n.md +1 -1
- package/docs/hi/compat/transloco.md +1 -1
- package/docs/hi/compat/vue-i18n.md +1 -1
- package/docs/hi/intlayer_with_nextjs_15.md +1 -1
- package/docs/hi/intlayer_with_nextjs_16.md +1 -1
- package/docs/hi/intlayer_with_remix_3.md +543 -0
- package/docs/id/benchmark/index.md +4 -1
- package/docs/id/benchmark/nextjs.md +32 -27
- package/docs/id/benchmark/solid.md +13 -10
- package/docs/id/benchmark/svelte.md +12 -9
- package/docs/id/benchmark/tanstack.md +29 -24
- package/docs/id/benchmark/vue.md +11 -7
- package/docs/id/cli/build.md +8 -1
- package/docs/id/cli/configuration.md +3 -1
- package/docs/id/cli/doc-review.md +8 -1
- package/docs/id/cli/doc-translate.md +5 -1
- package/docs/id/cli/extract.md +2 -1
- package/docs/id/cli/fill.md +5 -1
- package/docs/id/cli/index.md +4 -5
- package/docs/id/cli/live.md +5 -1
- package/docs/id/cli/login.md +2 -2
- package/docs/id/cli/pull.md +5 -1
- package/docs/id/cli/push.md +5 -1
- package/docs/id/cli/scan.md +5 -1
- package/docs/id/cli/standalone.md +5 -1
- package/docs/id/cli/test.md +5 -1
- package/docs/id/cli/watch.md +5 -1
- package/docs/id/compat/i18n-js.md +1 -1
- package/docs/id/compat/i18next.md +1 -1
- package/docs/id/compat/lingui.md +1 -1
- package/docs/id/compat/next-i18next.md +1 -1
- package/docs/id/compat/next-intl.md +1 -1
- package/docs/id/compat/next-translate.md +1 -1
- package/docs/id/compat/ngx-translate.md +1 -1
- package/docs/id/compat/nuxtjs-i18n.md +1 -1
- package/docs/id/compat/polyglot.md +1 -1
- package/docs/id/compat/react-i18next.md +1 -1
- package/docs/id/compat/react-intl.md +1 -1
- package/docs/id/compat/svelte-i18n.md +1 -1
- package/docs/id/compat/transloco.md +1 -1
- package/docs/id/compat/vue-i18n.md +1 -1
- package/docs/id/intlayer_with_nextjs_15.md +1 -1
- package/docs/id/intlayer_with_nextjs_16.md +1 -1
- package/docs/id/intlayer_with_remix_3.md +566 -0
- package/docs/it/benchmark/index.md +4 -1
- package/docs/it/benchmark/nextjs.md +32 -27
- package/docs/it/benchmark/solid.md +13 -10
- package/docs/it/benchmark/svelte.md +12 -9
- package/docs/it/benchmark/tanstack.md +29 -24
- package/docs/it/benchmark/vue.md +11 -7
- package/docs/it/cli/build.md +8 -1
- package/docs/it/cli/configuration.md +3 -1
- package/docs/it/cli/doc-review.md +8 -1
- package/docs/it/cli/doc-translate.md +5 -1
- package/docs/it/cli/extract.md +2 -1
- package/docs/it/cli/fill.md +5 -1
- package/docs/it/cli/index.md +4 -5
- package/docs/it/cli/live.md +5 -1
- package/docs/it/cli/login.md +2 -2
- package/docs/it/cli/pull.md +5 -1
- package/docs/it/cli/push.md +5 -1
- package/docs/it/cli/scan.md +5 -1
- package/docs/it/cli/standalone.md +5 -1
- package/docs/it/cli/test.md +5 -1
- package/docs/it/cli/watch.md +5 -1
- package/docs/it/compat/i18n-js.md +1 -1
- package/docs/it/compat/i18next.md +1 -1
- package/docs/it/compat/lingui.md +1 -1
- package/docs/it/compat/next-i18next.md +1 -1
- package/docs/it/compat/next-intl.md +1 -1
- package/docs/it/compat/next-translate.md +1 -1
- package/docs/it/compat/ngx-translate.md +1 -1
- package/docs/it/compat/nuxtjs-i18n.md +1 -1
- package/docs/it/compat/polyglot.md +1 -1
- package/docs/it/compat/react-i18next.md +1 -1
- package/docs/it/compat/react-intl.md +1 -1
- package/docs/it/compat/svelte-i18n.md +1 -1
- package/docs/it/compat/transloco.md +1 -1
- package/docs/it/compat/vue-i18n.md +1 -1
- package/docs/it/intlayer_with_nextjs_15.md +1 -1
- package/docs/it/intlayer_with_nextjs_16.md +1 -1
- package/docs/it/intlayer_with_remix_3.md +558 -0
- package/docs/ja/benchmark/index.md +4 -1
- package/docs/ja/benchmark/nextjs.md +32 -27
- package/docs/ja/benchmark/solid.md +13 -10
- package/docs/ja/benchmark/svelte.md +12 -9
- package/docs/ja/benchmark/tanstack.md +29 -24
- package/docs/ja/benchmark/vue.md +11 -7
- package/docs/ja/cli/build.md +8 -1
- package/docs/ja/cli/configuration.md +3 -1
- package/docs/ja/cli/doc-review.md +8 -1
- package/docs/ja/cli/doc-translate.md +5 -1
- package/docs/ja/cli/extract.md +2 -1
- package/docs/ja/cli/fill.md +5 -1
- package/docs/ja/cli/index.md +4 -5
- package/docs/ja/cli/live.md +5 -1
- package/docs/ja/cli/login.md +2 -2
- package/docs/ja/cli/pull.md +5 -1
- package/docs/ja/cli/push.md +5 -1
- package/docs/ja/cli/scan.md +5 -1
- package/docs/ja/cli/standalone.md +5 -1
- package/docs/ja/cli/test.md +5 -1
- package/docs/ja/cli/watch.md +5 -1
- package/docs/ja/compat/i18n-js.md +1 -1
- package/docs/ja/compat/i18next.md +1 -1
- package/docs/ja/compat/lingui.md +1 -1
- package/docs/ja/compat/next-i18next.md +1 -1
- package/docs/ja/compat/next-intl.md +1 -1
- package/docs/ja/compat/next-translate.md +1 -1
- package/docs/ja/compat/ngx-translate.md +1 -1
- package/docs/ja/compat/nuxtjs-i18n.md +1 -1
- package/docs/ja/compat/polyglot.md +1 -1
- package/docs/ja/compat/react-i18next.md +1 -1
- package/docs/ja/compat/react-intl.md +1 -1
- package/docs/ja/compat/svelte-i18n.md +1 -1
- package/docs/ja/compat/transloco.md +1 -1
- package/docs/ja/compat/vue-i18n.md +1 -1
- package/docs/ja/intlayer_with_nextjs_15.md +1 -1
- package/docs/ja/intlayer_with_nextjs_16.md +1 -1
- package/docs/ja/intlayer_with_remix_3.md +558 -0
- package/docs/ko/benchmark/index.md +4 -1
- package/docs/ko/benchmark/nextjs.md +32 -27
- package/docs/ko/benchmark/solid.md +13 -10
- package/docs/ko/benchmark/svelte.md +12 -9
- package/docs/ko/benchmark/tanstack.md +29 -24
- package/docs/ko/benchmark/vue.md +11 -7
- package/docs/ko/cli/build.md +8 -1
- package/docs/ko/cli/configuration.md +3 -1
- package/docs/ko/cli/doc-review.md +8 -1
- package/docs/ko/cli/doc-translate.md +5 -1
- package/docs/ko/cli/extract.md +2 -1
- package/docs/ko/cli/fill.md +5 -1
- package/docs/ko/cli/index.md +4 -5
- package/docs/ko/cli/live.md +5 -1
- package/docs/ko/cli/login.md +2 -2
- package/docs/ko/cli/pull.md +5 -1
- package/docs/ko/cli/push.md +5 -1
- package/docs/ko/cli/scan.md +5 -1
- package/docs/ko/cli/standalone.md +5 -1
- package/docs/ko/cli/test.md +5 -1
- package/docs/ko/cli/watch.md +5 -1
- package/docs/ko/compat/i18n-js.md +1 -1
- package/docs/ko/compat/i18next.md +1 -1
- package/docs/ko/compat/lingui.md +1 -1
- package/docs/ko/compat/next-i18next.md +1 -1
- package/docs/ko/compat/next-intl.md +1 -1
- package/docs/ko/compat/next-translate.md +1 -1
- package/docs/ko/compat/ngx-translate.md +1 -1
- package/docs/ko/compat/nuxtjs-i18n.md +1 -1
- package/docs/ko/compat/polyglot.md +1 -1
- package/docs/ko/compat/react-i18next.md +1 -1
- package/docs/ko/compat/react-intl.md +1 -1
- package/docs/ko/compat/svelte-i18n.md +1 -1
- package/docs/ko/compat/transloco.md +1 -1
- package/docs/ko/compat/vue-i18n.md +1 -1
- package/docs/ko/intlayer_with_remix_3.md +543 -0
- package/docs/nl/cli/index.md +4 -5
- package/docs/nl/cli/scan.md +5 -1
- package/docs/nl/cli/standalone.md +5 -1
- package/docs/pl/benchmark/index.md +4 -1
- package/docs/pl/benchmark/nextjs.md +32 -27
- package/docs/pl/benchmark/solid.md +13 -10
- package/docs/pl/benchmark/svelte.md +12 -9
- package/docs/pl/benchmark/tanstack.md +29 -24
- package/docs/pl/benchmark/vue.md +11 -7
- package/docs/pl/cli/build.md +8 -1
- package/docs/pl/cli/configuration.md +3 -1
- package/docs/pl/cli/doc-review.md +8 -1
- package/docs/pl/cli/doc-translate.md +5 -1
- package/docs/pl/cli/extract.md +2 -1
- package/docs/pl/cli/fill.md +5 -1
- package/docs/pl/cli/index.md +4 -5
- package/docs/pl/cli/live.md +5 -1
- package/docs/pl/cli/login.md +2 -2
- package/docs/pl/cli/pull.md +5 -1
- package/docs/pl/cli/push.md +5 -1
- package/docs/pl/cli/scan.md +5 -1
- package/docs/pl/cli/standalone.md +5 -1
- package/docs/pl/cli/test.md +5 -1
- package/docs/pl/cli/watch.md +5 -1
- package/docs/pl/compat/i18n-js.md +1 -1
- package/docs/pl/compat/i18next.md +1 -1
- package/docs/pl/compat/lingui.md +1 -1
- package/docs/pl/compat/next-i18next.md +1 -1
- package/docs/pl/compat/next-intl.md +1 -1
- package/docs/pl/compat/next-translate.md +1 -1
- package/docs/pl/compat/ngx-translate.md +1 -1
- package/docs/pl/compat/nuxtjs-i18n.md +1 -1
- package/docs/pl/compat/polyglot.md +1 -1
- package/docs/pl/compat/react-i18next.md +1 -1
- package/docs/pl/compat/react-intl.md +1 -1
- package/docs/pl/compat/svelte-i18n.md +1 -1
- package/docs/pl/compat/transloco.md +1 -1
- package/docs/pl/compat/vue-i18n.md +1 -1
- package/docs/pl/intlayer_with_nextjs_15.md +1 -1
- package/docs/pl/intlayer_with_nextjs_16.md +1 -1
- package/docs/pl/intlayer_with_remix_3.md +551 -0
- package/docs/pt/benchmark/index.md +4 -1
- package/docs/pt/benchmark/nextjs.md +32 -27
- package/docs/pt/benchmark/solid.md +13 -10
- package/docs/pt/benchmark/svelte.md +12 -9
- package/docs/pt/benchmark/tanstack.md +29 -24
- package/docs/pt/benchmark/vue.md +11 -7
- package/docs/pt/cli/build.md +8 -1
- package/docs/pt/cli/configuration.md +3 -1
- package/docs/pt/cli/doc-review.md +8 -1
- package/docs/pt/cli/doc-translate.md +5 -1
- package/docs/pt/cli/extract.md +2 -1
- package/docs/pt/cli/fill.md +5 -1
- package/docs/pt/cli/index.md +4 -5
- package/docs/pt/cli/live.md +5 -1
- package/docs/pt/cli/login.md +2 -2
- package/docs/pt/cli/pull.md +5 -1
- package/docs/pt/cli/push.md +5 -1
- package/docs/pt/cli/scan.md +5 -1
- package/docs/pt/cli/standalone.md +5 -1
- package/docs/pt/cli/test.md +5 -1
- package/docs/pt/cli/watch.md +5 -1
- package/docs/pt/compat/i18n-js.md +1 -1
- package/docs/pt/compat/i18next.md +1 -1
- package/docs/pt/compat/lingui.md +1 -1
- package/docs/pt/compat/next-i18next.md +1 -1
- package/docs/pt/compat/next-intl.md +1 -1
- package/docs/pt/compat/next-translate.md +1 -1
- package/docs/pt/compat/ngx-translate.md +1 -1
- package/docs/pt/compat/nuxtjs-i18n.md +1 -1
- package/docs/pt/compat/polyglot.md +1 -1
- package/docs/pt/compat/react-i18next.md +1 -1
- package/docs/pt/compat/react-intl.md +1 -1
- package/docs/pt/compat/svelte-i18n.md +1 -1
- package/docs/pt/compat/transloco.md +1 -1
- package/docs/pt/compat/vue-i18n.md +1 -1
- package/docs/pt/intlayer_with_nextjs_15.md +1 -1
- package/docs/pt/intlayer_with_nextjs_16.md +1 -1
- package/docs/pt/intlayer_with_remix_3.md +558 -0
- package/docs/ru/benchmark/index.md +4 -1
- package/docs/ru/benchmark/nextjs.md +32 -27
- package/docs/ru/benchmark/solid.md +13 -10
- package/docs/ru/benchmark/svelte.md +12 -9
- package/docs/ru/benchmark/tanstack.md +29 -24
- package/docs/ru/benchmark/vue.md +11 -7
- package/docs/ru/cli/build.md +8 -1
- package/docs/ru/cli/configuration.md +3 -1
- package/docs/ru/cli/doc-review.md +8 -1
- package/docs/ru/cli/doc-translate.md +5 -1
- package/docs/ru/cli/extract.md +2 -1
- package/docs/ru/cli/fill.md +5 -1
- package/docs/ru/cli/index.md +4 -5
- package/docs/ru/cli/live.md +5 -1
- package/docs/ru/cli/login.md +2 -2
- package/docs/ru/cli/pull.md +5 -1
- package/docs/ru/cli/push.md +5 -1
- package/docs/ru/cli/scan.md +5 -1
- package/docs/ru/cli/standalone.md +5 -1
- package/docs/ru/cli/test.md +5 -1
- package/docs/ru/cli/watch.md +5 -1
- package/docs/ru/compat/i18n-js.md +1 -1
- package/docs/ru/compat/i18next.md +1 -1
- package/docs/ru/compat/lingui.md +1 -1
- package/docs/ru/compat/next-i18next.md +1 -1
- package/docs/ru/compat/next-intl.md +1 -1
- package/docs/ru/compat/next-translate.md +1 -1
- package/docs/ru/compat/ngx-translate.md +1 -1
- package/docs/ru/compat/nuxtjs-i18n.md +1 -1
- package/docs/ru/compat/polyglot.md +1 -1
- package/docs/ru/compat/react-i18next.md +1 -1
- package/docs/ru/compat/react-intl.md +1 -1
- package/docs/ru/compat/svelte-i18n.md +1 -1
- package/docs/ru/compat/transloco.md +1 -1
- package/docs/ru/compat/vue-i18n.md +1 -1
- package/docs/ru/intlayer_with_nextjs_15.md +1 -1
- package/docs/ru/intlayer_with_nextjs_16.md +1 -1
- package/docs/ru/intlayer_with_remix_3.md +558 -0
- package/docs/tr/benchmark/index.md +4 -1
- package/docs/tr/benchmark/nextjs.md +32 -27
- package/docs/tr/benchmark/solid.md +13 -10
- package/docs/tr/benchmark/svelte.md +12 -9
- package/docs/tr/benchmark/tanstack.md +29 -24
- package/docs/tr/benchmark/vue.md +11 -7
- package/docs/tr/cli/build.md +8 -1
- package/docs/tr/cli/configuration.md +3 -1
- package/docs/tr/cli/doc-review.md +8 -1
- package/docs/tr/cli/doc-translate.md +5 -1
- package/docs/tr/cli/extract.md +2 -1
- package/docs/tr/cli/fill.md +5 -1
- package/docs/tr/cli/index.md +4 -5
- package/docs/tr/cli/live.md +5 -1
- package/docs/tr/cli/login.md +2 -2
- package/docs/tr/cli/pull.md +5 -1
- package/docs/tr/cli/push.md +5 -1
- package/docs/tr/cli/scan.md +5 -1
- package/docs/tr/cli/standalone.md +5 -1
- package/docs/tr/cli/test.md +5 -1
- package/docs/tr/cli/watch.md +5 -1
- package/docs/tr/compat/i18n-js.md +1 -1
- package/docs/tr/compat/i18next.md +1 -1
- package/docs/tr/compat/lingui.md +1 -1
- package/docs/tr/compat/next-i18next.md +1 -1
- package/docs/tr/compat/next-intl.md +1 -1
- package/docs/tr/compat/next-translate.md +1 -1
- package/docs/tr/compat/ngx-translate.md +1 -1
- package/docs/tr/compat/nuxtjs-i18n.md +1 -1
- package/docs/tr/compat/polyglot.md +1 -1
- package/docs/tr/compat/react-i18next.md +1 -1
- package/docs/tr/compat/react-intl.md +1 -1
- package/docs/tr/compat/svelte-i18n.md +1 -1
- package/docs/tr/compat/transloco.md +1 -1
- package/docs/tr/compat/vue-i18n.md +1 -1
- package/docs/tr/intlayer_with_nextjs_15.md +1 -1
- package/docs/tr/intlayer_with_nextjs_16.md +1 -1
- package/docs/tr/intlayer_with_remix_3.md +566 -0
- package/docs/uk/benchmark/index.md +4 -1
- package/docs/uk/benchmark/nextjs.md +32 -27
- package/docs/uk/benchmark/solid.md +13 -10
- package/docs/uk/benchmark/svelte.md +12 -9
- package/docs/uk/benchmark/tanstack.md +29 -24
- package/docs/uk/benchmark/vue.md +11 -7
- package/docs/uk/cli/build.md +8 -1
- package/docs/uk/cli/configuration.md +3 -1
- package/docs/uk/cli/doc-review.md +8 -1
- package/docs/uk/cli/doc-translate.md +5 -1
- package/docs/uk/cli/extract.md +2 -1
- package/docs/uk/cli/fill.md +5 -1
- package/docs/uk/cli/index.md +4 -5
- package/docs/uk/cli/live.md +5 -1
- package/docs/uk/cli/login.md +2 -2
- package/docs/uk/cli/pull.md +5 -1
- package/docs/uk/cli/push.md +5 -1
- package/docs/uk/cli/scan.md +5 -1
- package/docs/uk/cli/standalone.md +5 -1
- package/docs/uk/cli/test.md +5 -1
- package/docs/uk/cli/watch.md +5 -1
- package/docs/uk/compat/i18n-js.md +1 -1
- package/docs/uk/compat/i18next.md +1 -1
- package/docs/uk/compat/lingui.md +1 -1
- package/docs/uk/compat/next-i18next.md +1 -1
- package/docs/uk/compat/next-intl.md +1 -1
- package/docs/uk/compat/next-translate.md +1 -1
- package/docs/uk/compat/ngx-translate.md +1 -1
- package/docs/uk/compat/nuxtjs-i18n.md +1 -1
- package/docs/uk/compat/polyglot.md +1 -1
- package/docs/uk/compat/react-i18next.md +1 -1
- package/docs/uk/compat/react-intl.md +1 -1
- package/docs/uk/compat/svelte-i18n.md +1 -1
- package/docs/uk/compat/transloco.md +1 -1
- package/docs/uk/compat/vue-i18n.md +1 -1
- package/docs/uk/intlayer_with_nextjs_15.md +1 -1
- package/docs/uk/intlayer_with_nextjs_16.md +1 -1
- package/docs/uk/intlayer_with_remix_3.md +566 -0
- package/docs/ur/cli/index.md +4 -5
- package/docs/ur/cli/scan.md +5 -1
- package/docs/ur/cli/standalone.md +5 -1
- package/docs/vi/benchmark/index.md +4 -1
- package/docs/vi/benchmark/nextjs.md +32 -27
- package/docs/vi/benchmark/solid.md +13 -10
- package/docs/vi/benchmark/svelte.md +12 -9
- package/docs/vi/benchmark/tanstack.md +29 -24
- package/docs/vi/benchmark/vue.md +11 -7
- package/docs/vi/cli/build.md +8 -1
- package/docs/vi/cli/configuration.md +3 -1
- package/docs/vi/cli/doc-review.md +8 -1
- package/docs/vi/cli/doc-translate.md +5 -1
- package/docs/vi/cli/extract.md +2 -1
- package/docs/vi/cli/fill.md +5 -1
- package/docs/vi/cli/index.md +4 -5
- package/docs/vi/cli/live.md +5 -1
- package/docs/vi/cli/login.md +2 -2
- package/docs/vi/cli/pull.md +5 -1
- package/docs/vi/cli/push.md +5 -1
- package/docs/vi/cli/scan.md +5 -1
- package/docs/vi/cli/standalone.md +5 -1
- package/docs/vi/cli/test.md +5 -1
- package/docs/vi/cli/watch.md +5 -1
- package/docs/vi/compat/i18n-js.md +1 -1
- package/docs/vi/compat/i18next.md +1 -1
- package/docs/vi/compat/lingui.md +1 -1
- package/docs/vi/compat/next-i18next.md +1 -1
- package/docs/vi/compat/next-intl.md +1 -1
- package/docs/vi/compat/next-translate.md +1 -1
- package/docs/vi/compat/ngx-translate.md +1 -1
- package/docs/vi/compat/nuxtjs-i18n.md +1 -1
- package/docs/vi/compat/polyglot.md +1 -1
- package/docs/vi/compat/react-i18next.md +1 -1
- package/docs/vi/compat/react-intl.md +1 -1
- package/docs/vi/compat/svelte-i18n.md +1 -1
- package/docs/vi/compat/transloco.md +1 -1
- package/docs/vi/compat/vue-i18n.md +1 -1
- package/docs/vi/intlayer_with_nextjs_15.md +1 -1
- package/docs/vi/intlayer_with_nextjs_16.md +1 -1
- package/docs/vi/intlayer_with_remix_3.md +566 -0
- package/docs/zh/benchmark/index.md +4 -1
- package/docs/zh/benchmark/nextjs.md +32 -27
- package/docs/zh/benchmark/solid.md +13 -10
- package/docs/zh/benchmark/svelte.md +12 -9
- package/docs/zh/benchmark/tanstack.md +29 -24
- package/docs/zh/benchmark/vue.md +11 -7
- package/docs/zh/cli/build.md +8 -1
- package/docs/zh/cli/configuration.md +3 -1
- package/docs/zh/cli/doc-review.md +8 -1
- package/docs/zh/cli/doc-translate.md +5 -1
- package/docs/zh/cli/extract.md +2 -1
- package/docs/zh/cli/fill.md +5 -1
- package/docs/zh/cli/index.md +4 -5
- package/docs/zh/cli/live.md +5 -1
- package/docs/zh/cli/login.md +2 -2
- package/docs/zh/cli/pull.md +5 -1
- package/docs/zh/cli/push.md +5 -1
- package/docs/zh/cli/scan.md +5 -1
- package/docs/zh/cli/standalone.md +5 -1
- package/docs/zh/cli/test.md +5 -1
- package/docs/zh/cli/watch.md +5 -1
- package/docs/zh/compat/i18n-js.md +1 -1
- package/docs/zh/compat/i18next.md +1 -1
- package/docs/zh/compat/lingui.md +1 -1
- package/docs/zh/compat/next-i18next.md +1 -1
- package/docs/zh/compat/next-intl.md +1 -1
- package/docs/zh/compat/next-translate.md +1 -1
- package/docs/zh/compat/ngx-translate.md +1 -1
- package/docs/zh/compat/nuxtjs-i18n.md +1 -1
- package/docs/zh/compat/polyglot.md +1 -1
- package/docs/zh/compat/react-i18next.md +1 -1
- package/docs/zh/compat/react-intl.md +1 -1
- package/docs/zh/compat/svelte-i18n.md +1 -1
- package/docs/zh/compat/transloco.md +1 -1
- package/docs/zh/compat/vue-i18n.md +1 -1
- package/docs/zh/intlayer_with_nextjs_15.md +1 -1
- package/docs/zh/intlayer_with_nextjs_16.md +1 -1
- package/docs/zh/intlayer_with_remix_3.md +558 -0
- package/package.json +7 -7
- package/src/generated/blog.entry.ts +20 -0
- package/src/generated/docs.entry.ts +20 -20
- package/docs/ar/cli/ci.md +0 -186
- package/docs/de/cli/ci.md +0 -186
- package/docs/en/cli/ci.md +0 -216
- package/docs/en-GB/cli/ci.md +0 -186
- package/docs/es/cli/ci.md +0 -186
- package/docs/fr/cli/ci.md +0 -186
- package/docs/hi/cli/ci.md +0 -186
- package/docs/id/cli/ci.md +0 -186
- package/docs/it/cli/ci.md +0 -186
- package/docs/ja/cli/ci.md +0 -186
- package/docs/ko/cli/ci.md +0 -186
- package/docs/pl/cli/ci.md +0 -186
- package/docs/pt/cli/ci.md +0 -186
- package/docs/ru/cli/ci.md +0 -186
- package/docs/tr/cli/ci.md +0 -186
- package/docs/uk/cli/ci.md +0 -186
- package/docs/vi/cli/ci.md +0 -186
- package/docs/zh/cli/ci.md +0 -186
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
---
|
|
2
|
+
createdAt: 2026-09-09
|
|
3
|
+
updatedAt: 2026-09-10
|
|
4
|
+
title: "JavaScript i18n の歴史:2011 年から 2026 年までの歩み"
|
|
5
|
+
description: "2011 年から 2026 年までのフロントエンド国際化の変遷を辿ります。React、Vue、Next.js、Angular、Svelte、Solid におけるリリース時期、設計上の課題、主要な革新を徹底解説。"
|
|
6
|
+
keywords:
|
|
7
|
+
- i18n 歴史
|
|
8
|
+
- 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
|
+
# JavaScript 国際化 (i18n) の歴史と進化
|
|
24
|
+
|
|
25
|
+
国際化(i18n)は決して新しい技術課題ではありません。JavaScript や近代的な Web が登場するずっと以前から、ソフトウェアは多言語、通貨単位、日付表記、地域の慣習を適切に扱う必要がありました。1980 年代の GEM や Mac OS などの初期 GUI オペレーティングシステムも、既にこれらの問題に取り組んでいました。
|
|
26
|
+
|
|
27
|
+
こうした設計思想は、やがてバックエンドフレームワークへと引き継がれました。Ruby on Rails、Django、Java エコシステム、PHP アプリケーションなどは、それぞれ独自の多言語化アプローチを確立しました。当時の関心事は非常に明確でした。
|
|
28
|
+
|
|
29
|
+
- 翻訳リソースをどこに配置・管理すべきか
|
|
30
|
+
- 日付、数値、通貨をどうフォーマットするか
|
|
31
|
+
- 複数形や言語特有の文法差異をどう吸収するか
|
|
32
|
+
- ユーザーに提示すべき言語をどう判定するか
|
|
33
|
+
|
|
34
|
+
サーバー側で HTML ページ全体を組み立てていた時代、処理の流れは極めてシンプルでした。適切な辞書を読み込み、HTML をレンダリングし、完成した結果をブラウザへ送出するだけで済んでいたからです。
|
|
35
|
+
|
|
36
|
+
> PHP や GNU gettext の設計は、のちに JavaScript や JSX で広く普及した `t()` ヘルパー関数の原型となりました。
|
|
37
|
+
|
|
38
|
+
しかしその後、JavaScript がブラウザの主導権を握るようになります。
|
|
39
|
+
|
|
40
|
+
サーバーサイド中心のページ構成から、高度な Single-Page Application (SPA) へと主流が移るにつれ、国際化はフロントエンドの必須要件となりました。ブラウザはページを再読込することなく、辞書の取得、言語の切り替え、値のフォーマット、複数形計算、画面 UI の更新を担わなければならなくなりました。
|
|
41
|
+
|
|
42
|
+
ここで極めて本質的な問いが生じます。
|
|
43
|
+
|
|
44
|
+
**膨大な翻訳データや重いランタイムコードを全ユーザーに送りつけることなく、多言語対応アプリケーションをどう構築すべきか?**
|
|
45
|
+
|
|
46
|
+
この問いこそが、過去 10 年以上にわたり JavaScript i18n の技術進化を牽引してきました。
|
|
47
|
+
|
|
48
|
+
アプローチは劇的に変貌を遂げました。グローバル変数や `t('key')` の文字列検索から始まり、フレームワーク特化型ライブラリ、コンパイル時抽出、TypeScript による厳密な型付け、Server Components、Tree-shaking、そしてビルド時にコンテンツ自体を最適化されたコードへ変換するコンパイラ指向のアプローチへと到達しています。
|
|
49
|
+
|
|
50
|
+
本記事では、2011 年から 2026 年までの技術進化を総括します。各世代のツールが何を解決しようとし、何が成功し、どこで壁にぶつかったのか、そしてフロントエンドアーキテクチャの変遷が現代の i18n にどう結実しているのかを紐解きます。
|
|
51
|
+
|
|
52
|
+

|
|
53
|
+
|
|
54
|
+
## 目次
|
|
55
|
+
|
|
56
|
+
<TOC/>
|
|
57
|
+
|
|
58
|
+
## 初期 Web:2016 年以前の JavaScript 国際化
|
|
59
|
+
|
|
60
|
+
今日のツールの立ち位置を理解するために、まずは 2011 年から 2015 年にかけての Web 開発環境を振り返ってみましょう。
|
|
61
|
+
|
|
62
|
+
### ロジックのクライアントへの移行
|
|
63
|
+
|
|
64
|
+
2010 年代初頭、国際化は基本的にサーバーサイドの仕事でした。当時の JavaScript は、jQuery によるアニメーション、フォーム検証、小規模な DOM 操作といったプログレッシブエンハンスメントのための補助層にすぎませんでした。
|
|
65
|
+
|
|
66
|
+
Backbone.js、Knockout.js、初期の AngularJS による SPA の台頭に伴い、レンダリング処理がブラウザ側へ移行しました。クライアントサイドのコードが、自前で日付をローカライズし、通貨を整形し、複数形を処理し、再読込なしでテキストを切り替える必要性に迫られたのです。
|
|
67
|
+
|
|
68
|
+
しかし 2011 年当時のブラウザ環境は、そうした要件を受け止める準備が整っていませんでした。
|
|
69
|
+
|
|
70
|
+
<AccordionGroup>
|
|
71
|
+
<Accordion header="標準の国際化 API が存在しなかった">
|
|
72
|
+
|
|
73
|
+
ECMAScript Internationalization API 仕様 (ECMA-402) がグローバルな `Intl` オブジェクトとともに正式策定されたのは 2012 年 12 月のことでした。ブラウザ各社が本格的に実装する前は、基本的な日付や数値の整形ですら独自の実装や巨大な Polyfill を必要としました。
|
|
74
|
+
|
|
75
|
+
</Accordion>
|
|
76
|
+
<Accordion header="近代的なモジュールバンドラーの不在">
|
|
77
|
+
|
|
78
|
+
Webpack はまだ開発初期であり、ブラウザにおけるネイティブな ES Modules も存在しませんでした。開発者はスクリプトを `<script>` タグで順次読み込み、翻訳辞書を `window.translations = { ... }` のようなグローバル変数に格納していました。
|
|
79
|
+
|
|
80
|
+
</Accordion>
|
|
81
|
+
<Accordion header="巨大な単一 JSON ファイルへの依存">
|
|
82
|
+
|
|
83
|
+
すべての翻訳テキストが 1 つの巨大な JSON ファイルにまとめられていました。東京のユーザーがトップページを閲覧する際にも、アカウント設定、請求関連、管理者専用ダッシュボードの文字列までまとめてダウンロードさせられていたのです。
|
|
84
|
+
|
|
85
|
+
</Accordion>
|
|
86
|
+
</AccordionGroup>
|
|
87
|
+
|
|
88
|
+
### クライアントサイドライブラリの第一幕
|
|
89
|
+
|
|
90
|
+
2012 年から 2015 年にかけて、現代の JavaScript i18n の礎が築かれました。
|
|
91
|
+
|
|
92
|
+
<AccordionGroup>
|
|
93
|
+
<Accordion header="i18next (2012 年 1 月)">
|
|
94
|
+
|
|
95
|
+
Jan Mühlemann によって開発された `i18next` は、JavaScript におけるランタイム辞書検索のスタンダードを確立しました。階層化キー探索、変数補間、複数形ルール、言語検出器やデータ取得機構をプラグイン化できる柔軟なアーキテクチャを導入し、バニラ JS や初期 Node.js における標準解となりました。
|
|
96
|
+
|
|
97
|
+
</Accordion>
|
|
98
|
+
<Accordion header="vue-i18n (2014 年 5 月)">
|
|
99
|
+
|
|
100
|
+
Kazuya Kawaguchi (Kazupon) によって開発された `vue-i18n` は、Vue.js のリアクティブシステムに国際化を直接組み込み、テンプレートディレクティブ (`v-t`) や `$t()` 関数を提供しました。
|
|
101
|
+
|
|
102
|
+
</Accordion>
|
|
103
|
+
<Accordion header="react-intl (2014 年 6 月)">
|
|
104
|
+
|
|
105
|
+
Yahoo! の FormatJS プロジェクトの一環として登場した `react-intl` は、ICU MessageFormat 規格とブラウザの `Intl` API を、`<FormattedMessage>` や `<FormattedDate>` といった宣言的コンポーネントを通じて React に持ち込みました。
|
|
106
|
+
|
|
107
|
+
</Accordion>
|
|
108
|
+
<Accordion header="react-i18next (2015 年 12 月)">
|
|
109
|
+
|
|
110
|
+
Jan Mühlemann は急成長する React コミュニティ向けに `i18next` を移植し、Higher-Order Components (`withTranslation`) や React Context を用いて言語変更時にコンポーネントを再レンダリングする基盤を整えました。
|
|
111
|
+
|
|
112
|
+
</Accordion>
|
|
113
|
+
</AccordionGroup>
|
|
114
|
+
|
|
115
|
+
### 2016 年以前のアーキテクチャ上の課題
|
|
116
|
+
|
|
117
|
+
これらのライブラリによって多言語 SPA の構築は可能になったものの、当時の設計上の制約から慢性的な課題が残りました。
|
|
118
|
+
|
|
119
|
+
<AccordionGroup>
|
|
120
|
+
<Accordion header="文字列キーの脆弱性">
|
|
121
|
+
|
|
122
|
+
`t('marketing.landing.hero.cta')` のような呼び出しは静的な型チェックを受けられません。キーのタイポはビルド時に検出されず、本番環境で空文字になったり、未翻訳のキー名が露出したりする原因となりました。
|
|
123
|
+
|
|
124
|
+
</Accordion>
|
|
125
|
+
<Accordion header="実行時パースのオーバーヘッド">
|
|
126
|
+
|
|
127
|
+
ICU メッセージ構文の解釈や正規表現による変数展開を実行時に行うことは、特にモバイル端末の CPU リソースを消費しました。
|
|
128
|
+
|
|
129
|
+
</Accordion>
|
|
130
|
+
<Accordion header="肥大化するバンドルサイズ">
|
|
131
|
+
|
|
132
|
+
ページ単位やコンポーネント単位のコード分割ができなかったため、アプリケーション全体のテキストが一括で配信され、初回読み込み速度を低下させました。
|
|
133
|
+
|
|
134
|
+
</Accordion>
|
|
135
|
+
<Accordion header="開発者と翻訳データの乖離">
|
|
136
|
+
|
|
137
|
+
辞書ファイルがコンポーネントから遠く離れた JSON に配置されていたため、コードから参照されなくなった未使用キーや、未翻訳箇所の見落としが頻発しました。
|
|
138
|
+
|
|
139
|
+
</Accordion>
|
|
140
|
+
</AccordionGroup>
|
|
141
|
+
|
|
142
|
+
## フレームワーク時代:エコシステムごとの進化
|
|
143
|
+
|
|
144
|
+
2016 年から 2026 年にかけて、フロントエンドの構造は大きく成熟しました。TypeScript が標準化され、コンポーネント設計が洗練され、Webpack、Vite、Turbopack によりきめ細やかなコード分割が普及し、React Server Components がサーバー描画の利点を復活させ、コンパイラがコードを直接解析する時代が訪れました。
|
|
145
|
+
|
|
146
|
+
以下のタブでは、各エコシステムがこれらの課題にどう向き合ってきたかをまとめています。これらの環境において、`react-intlayer` やその同系列パッケージ(`next-intlayer`、`vue-intlayer`、`angular-intlayer`、`svelte-intlayer`、`solid-intlayer`)は、各フレームワークの実行特性に合わせた高速な実装を提供しています。
|
|
147
|
+
|
|
148
|
+
<Tabs>
|
|
149
|
+
|
|
150
|
+
<Tab label="Core JavaScript" value="javascript">
|
|
151
|
+
|
|
152
|
+
| 初期リリース | ライブラリ | 解決を目指した課題 | 主な技術的ブレイクスルー |
|
|
153
|
+
| ------------- | ------------------------------------ | --------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
154
|
+
| 2012 年 1 月 | `i18next` | 特定のフレームワークに依存せず、ブラウザと Node.js 間で実行時の辞書検索を統一する。 | コア翻訳ロジックをローダー、言語検出器、キャッシュから分離する拡張可能なプラグイン構造。 |
|
|
155
|
+
| 2021 年 2 月 | `typesafe-i18n` | 型のない文字列キーによる実行時エラーや変数の差し込みミスを排除する。 | 翻訳オブジェクトから直接自動生成される完全型付きの翻訳関数。外部ランタイム依存ゼロを実現。 |
|
|
156
|
+
| 2023 年 10 月 | `paraglide` (`@inlang/paraglide-js`) | 実行時の辞書引き、重い構文解析器、バンドル肥大化を解消する。 | メッセージを Tree-shaking 可能な ECMAScript モジュールおよび素の JavaScript 関数に事前コンパイル。 |
|
|
157
|
+
| 2024 年 4 月 | `intlayer` | 肥大化して破綻しやすい名前空間の廃止、ページ間の文案漏れ防止、Git 競合の削減、TypeScript 時代の型安全性の確立。 | `.content` ファイルをコンポーネントの隣に配置して精密にコード分割し、TypeScript 型定義を自動生成。さらに内蔵ビジュアル CMS と AI CLI ツールを提供。 |
|
|
158
|
+
| 2025 年 6 月 | `wuchale` | 開発中にコードから文字列を手動で切り出し、不自然な翻訳キーを発明し続ける手間をなくす。 | AST レベルでソースコード内のテキストを自動検出し、ビルド時にラッパーなしのローカライズ関数へ直截変換。 |
|
|
159
|
+
|
|
160
|
+
</Tab>
|
|
161
|
+
|
|
162
|
+
<Tab label="React" value="react">
|
|
163
|
+
|
|
164
|
+
| 初期リリース | ライブラリ | 解決を目指した課題 | 主な技術的ブレイクスルー |
|
|
165
|
+
| ------------- | ---------------- | ---------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
166
|
+
| 2014 年 6 月 | `react-intl` | React 内での数値、日付、通貨、複雑な複数形処理を標準規格に準拠させる。 | ICU MessageFormat および ECMA-402 標準に準拠した宣言的コンポーネント(`<FormattedMessage>`、`<FormattedDate>`)。 |
|
|
167
|
+
| 2015 年 12 月 | `react-i18next` | React に最適化された形で、再レンダリングを適切に引き起こす `i18next` のバインディングを提供する。 | React の変遷に追従し、Higher-Order Components から `<Trans>` JSX 補間および `useTranslation` フックへ刷新。 |
|
|
168
|
+
| 2018 年 1 月 | `@lingui/react` | 実行時の ICU 解析器がクライアントバンドルに与える容量負荷を軽減する。 | Babel/SWC マクロを活用し、ビルド時に `<Trans>` や `t` をコンパクトなインデックス配列へと事前変換。 |
|
|
169
|
+
| 2020 年 12 月 | `use-intl` | 従来の React i18n ライブラリに代わる、軽量でフック中心、かつ型安全な代替手段を提供する。 | 人間工学に基づいた使いやすい `useTranslations` や `useFormatter` フックと、TypeScript との深い統合。 |
|
|
170
|
+
| 2021 年 2 月 | `@tolgee/react` | 開発者、翻訳者、デザイナー間のコミュニケーションの遅延を解消する。 | ブラウザ上で Alt キーを押しながらテキストをクリックして直接翻訳を更新し、画面キャプチャを自動取得できるインコンテキスト編集。 |
|
|
171
|
+
| 2024 年 4 月 | `react-intlayer` | 中央集権的な JSON 辞書や管理困難な名前空間を排除し、React コンポーネントのライフサイクルに最適化された高速な環境を実現する。 | React レンダリングに最適化した `useIntlayer` フック、自動生成される厳格な型推論、コンポーネント単位の Tree-shaking、コンテキスト肥大化のないビジュアル CMS。 |
|
|
172
|
+
| 2024 年 7 月 | `gt-react` | 翻訳ファイルの手動エクスポートや翻訳データの継続的メンテナンスを自動化する。 | クラウド翻訳パイプラインと連携し、React コンポーネント内で直接 AI 自動翻訳を完結させる。 |
|
|
173
|
+
| 2025 年 8 月 | `@wuchale/jsx` | JSX を記述する際のキー命名作業や冗長な翻訳フックの記述を不要にする。 | AST 変換により生の JSX テキストノードを自動検出し、ローカライズされた同等コードへと透過的にコンパイル。 |
|
|
174
|
+
|
|
175
|
+
</Tab>
|
|
176
|
+
|
|
177
|
+
<Tab label="Next.js" value="nextjs">
|
|
178
|
+
|
|
179
|
+
| 初期リリース | ライブラリ | 解決を目指した課題 | 主な技術的ブレイクスルー |
|
|
180
|
+
| ------------- | ------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
181
|
+
| 2018 年 11 月 | `next-i18next` | Next.js Pages Router において、クライアント側の連続リクエストを発生させずに `i18next` による SSR・SSG を実現する。 | ページ単位の Props を通じてローカライズ済みデータを引き渡す `serverSideTranslations` および `appWithTranslation`。 |
|
|
182
|
+
| 2019 年 12 月 | `next-translate` | Pages Router アプリケーションにおける設定の簡素化とバンドル軽量化を図る。 | 各ページで実際に必要な翻訳名前空間のみをビルド時に自動注入する Webpack ローダープラグイン。 |
|
|
183
|
+
| 2020 年 11 月 | `next-intl` | Next.js App Router、React Server Components (RSC)、ストリーミング SSR に最適化した国際化アーキテクチャを再構築する。 | Next.js App Router ミドルウェア、Server Actions、非同期 Server Components とネイティブに統合し、クライアント JS なしでサーバー描画を完結。 |
|
|
184
|
+
| 2022 年 7 月 | `next-international` | クライアントバンドルへの負荷を最小限に抑えつつ、Next.js 向けに厳格な TypeScript 型安全性を実現する。 | スコープ付きキーに対する厳格な型生成と、App Router および Pages Router 用の極小アダプター。 |
|
|
185
|
+
| 2024 年 4 月 | `paraglide-next` (`@inlang/paraglide-next`) | 実行時ライブラリなしで動作する事前コンパイル済みメッセージを Next.js App Router と Pages Router にもたらす。 | ミドルウェアルーティングと Tree-shaking 可能な関数を組み合わせ、RSC およびクライアント側での実行時 JSON パースを全廃。 |
|
|
186
|
+
| 2024 年 4 月 | `next-intlayer` | `t()` 関数や辞書オブジェクトをコンポーネント間で Props としてバケツリレーする不便さを解消する。 | 同期的な Server Components 内で Prop-drilling なしに `useIntlayer` を直接呼び出し可能。待ち時間なしのサーバー描画、専用ルーティング、CMS 即時同期を提供。 |
|
|
187
|
+
| 2024 年 9 月 | `gt-next` | AI 翻訳エンジンを活用し、Next.js における多言語コンテンツ生成と動的ルーティングを自動化する。 | App Router と深く統合し、クラウドベースの機械翻訳を Next.js Edge ミドルウェアおよびキャッシュ層と直結。 |
|
|
188
|
+
|
|
189
|
+
</Tab>
|
|
190
|
+
|
|
191
|
+
<Tab label="Vue & Nuxt" value="vue">
|
|
192
|
+
|
|
193
|
+
| 初期リリース | ライブラリ | 解決を目指した課題 | 主な技術的ブレイクスルー |
|
|
194
|
+
| ------------- | -------------- | -------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
195
|
+
| 2014 年 5 月 | `vue-i18n` | Vue アプリケーション向けに、直感的でリアクティブな国際化の仕組みを提供する。 | Vue のリアクティビティへの完全な適合、テンプレートディレクティブ (`v-t`)、`$t` 関数、単一ファイルコンポーネント (SFC) 内の独自 `<i18n>` ブロック。 |
|
|
196
|
+
| 2017 年 11 月 | `@nuxt/i18n` | Nuxt における言語付き URL ルーティング、SEO hreflang タグ、SSR ハイドレーションを包括的に処理する。 | プレフィックスや独自ドメインに基づくルーティングの自動生成、SEO メタタグ制御、翻訳データの遅延読み込みを兼ね備えたフルスタックモジュール。 |
|
|
197
|
+
| 2019 年 8 月 | `fluent-vue` | Vue 内で複雑な文法上の性別、格変化、非対称な自然言語の表現構造をスマートに処理する。 | Mozilla の Project Fluent 構文を Vue に統合し、細かな表現の違いのために複雑な条件分岐コードを書く負担を解消。 |
|
|
198
|
+
| 2025 年 4 月 | `vue-intlayer` | Vue 3 Composition API および Nuxt に向け、グローバル名前空間を汚染しないネイティブな Intlayer 実装を提供する。 | Vue 3 のリアクティビティ追跡に合致した `useIntlayer` Composable、コンポーネント単位のスコープ分離、完全な TypeScript 自動補完、ビジュアルエディター連携。 |
|
|
199
|
+
|
|
200
|
+
</Tab>
|
|
201
|
+
|
|
202
|
+
<Tab label="Angular" value="angular">
|
|
203
|
+
|
|
204
|
+
| 初期リリース | ライブラリ | 解決を目指した課題 | 主な技術的ブレイクスルー |
|
|
205
|
+
| ------------ | ------------------- | ------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------ |
|
|
206
|
+
| 2017 年 2 月 | `ngx-translate` | 言語ごとに別個の成果物をビルド・デプロイすることなく、Angular 内で動的な実行時翻訳を可能にする。 | 翻訳の動的フェッチと実行時の即時言語切り替えを支える `TranslateService` および `translate` パイプ。 |
|
|
207
|
+
| 2019 年 7 月 | `@ngneat/transloco` | 従来の Angular 用ライブラリに存在した性能面のボトルネック、スコープ分離の難しさ、機能不足を解決する。 | 構造ディレクティブ (`*transloco`)、遅延読み込みモジュール向けの翻訳分離、SSR サポート、文案抽出 CLI。 |
|
|
208
|
+
| 2019 年 9 月 | `@angular/localize` | 言語ごとに TypeScript コードを完全再コンパイルする無駄を省き、Angular 組み込みのコンパイル時 i18n を刷新する。 | Ivy コンパイラによる高速なビルド後処理ステップとして置換される、タグ付きテンプレートリテラル `$localize`。 |
|
|
209
|
+
| 2021 年 2 月 | `@tolgee/ngx` | 画面の文脈に応じた翻訳修正とスクリーンショット自動記録を Angular の開発フローに組み込む。 | ブラウザ画面上で直接テキストを修正できる Tolgee 直結の Angular パイプおよびディレクティブ。 |
|
|
210
|
+
| 2025 年 4 月 | `angular-intlayer` | モダン Angular(Signals、Standalone コンポーネント、SSR)に特化したネイティブな Intlayer ソリューションを提供する。 | Angular の変更検知に最適化した Signal ベースのリアクティブバインディング、Standalone DI、ビジュアル CMS とのダイレクトな同期。 |
|
|
211
|
+
|
|
212
|
+
</Tab>
|
|
213
|
+
|
|
214
|
+
<Tab label="Svelte & SvelteKit" value="svelte">
|
|
215
|
+
|
|
216
|
+
| 初期リリース | ライブラリ | 解決を目指した課題 | 主な技術的ブレイクスルー |
|
|
217
|
+
| ------------- | ----------------- | --------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
218
|
+
| 2018 年 7 月 | `svelte-i18n` | Svelte のリアクティブな Store 概念に自然に溶け込む国際化ライブラリを提供する。 | Store と連動した `$t` 探索関数により、言語変更時に該当 DOM のみをピンポイントでリアクティブに更新。 |
|
|
219
|
+
| 2021 年 12 月 | `sveltekit-i18n` | SvelteKit における SSR とルート単位の翻訳データ読み込みを美しく管理する。 | アクティブな SvelteKit ルートに必要な翻訳テキストとフォーマッターのみを過不足なく取得するモジュール式ローダー設計。 |
|
|
220
|
+
| 2021 年 11 月 | `@tolgee/svelte` | Svelte アプリケーションにおいて画面コンテキストを保ったまま編集できるローカライズ環境を実現する。 | Tolgee の画面内編集オーバーレイおよびスクリーンショット自動取得機能と連携した Svelte Store バインディング。 |
|
|
221
|
+
| 2025 年 4 月 | `svelte-intlayer` | Svelte 5 の Runes 記法および SvelteKit に向けてゼロから設計された高性能 Intlayer 実装を提供する。 | Svelte 5 Runes (`$state`) に準拠したリアクティブバインディング、コンポーネント単位の `.content` 宣言、ゼロ構成ビルドプラグイン、ビジュアル CMS。 |
|
|
222
|
+
| 2025 年 7 月 | `@wuchale/svelte` | Svelte コンポーネント内で辞書を宣言したり `$t` 関数を都度インポートしたりする定型コードを全廃する。 | ビルド時にテンプレートを直接解釈し、テキストノードを追加ラッパーなしのローカライズ出力へとコンパイルする Svelte プリプロセッサ。 |
|
|
223
|
+
|
|
224
|
+
</Tab>
|
|
225
|
+
|
|
226
|
+
<Tab label="SolidJS" value="solid">
|
|
227
|
+
|
|
228
|
+
| 初期リリース | ライブラリ | 解決を目指した課題 | 主な技術的ブレイクスルー |
|
|
229
|
+
| ------------ | ------------------------ | ---------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------- |
|
|
230
|
+
| 2021 年 9 月 | `@solid-primitives/i18n` | SolidJS の極めて細粒度なリアクティビティに最適化された i18n プリミティブを提供する。 | 仮想 DOM や無駄な再レンダリングを介さず、DOM ノードを直接書き換える Signal ベースの翻訳リゾルバー。 |
|
|
231
|
+
| 2025 年 4 月 | `solid-intlayer` | SolidJS および SolidStart の設計理念に沿った高性能な Intlayer ソリューションを提供する。 | 仮想 DOM のオーバーヘッドを一切排除した Signal 最適化バインディング、厳密な TypeScript スキーマ補完、ビジュアルエディター連携。 |
|
|
232
|
+
| 2026 年 6 月 | `@lingui/solid` | ビルド時のマクロ抽出機能と ICU MessageFormat の表現力を SolidJS に拡張する。 | Solid のリアクティビティに適合させたマクロ変換処理により、メッセージを実行時負荷の極めて小さい軽量構造へ変換。 |
|
|
233
|
+
|
|
234
|
+
</Tab>
|
|
235
|
+
|
|
236
|
+
</Tabs>
|
|
237
|
+
|
|
238
|
+
## JavaScript i18n における 4 つのアーキテクチャ世代
|
|
239
|
+
|
|
240
|
+

|
|
241
|
+
|
|
242
|
+
15 年間の進化を鳥瞰すると、JavaScript における国際化のアプローチは大きく 4 つの世代に分類できます。
|
|
243
|
+
|
|
244
|
+
<AccordionGroup>
|
|
245
|
+
<Accordion header="1. ランタイム辞書探索の時代 (2011 〜 2017 年)">
|
|
246
|
+
|
|
247
|
+
`i18next`、`react-intl`、`vue-i18n` が主導した時代。静的な JSON 辞書全体をブラウザのメモリに読み込み、文字列キーを手がかりにオブジェクト内を都度検索していました。複数形や変数展開の処理も、ブラウザ内の正規表現や ICU パーサーによってクライアントサイドで逐次計算されていました。
|
|
248
|
+
|
|
249
|
+
</Accordion>
|
|
250
|
+
<Accordion header="2. ビルド時マクロと型安全性の時代 (2018 〜 2021 年)">
|
|
251
|
+
|
|
252
|
+
`lingui`、`next-translate`、`transloco`、`typesafe-i18n` が切り拓いた時代。実行時パースのコストや、型の付かない文字列キーの脆さが認識され始めました。Babel マクロがビルド時にメッセージを事前抽出し、バンドラープラグインがページごとに辞書を分割し、TypeScript コンパイラが翻訳引数の妥当性を検証するようになりました。
|
|
253
|
+
|
|
254
|
+
</Accordion>
|
|
255
|
+
<Accordion header="3. サーバーコンポーネントとストリーミングの時代 (2022 〜 2024 年)">
|
|
256
|
+
|
|
257
|
+
`next-intl`、`next-international`、および初期の RSC 向けアダプターが牽引した時代。React Server Components や Next.js App Router の登場により、クライアントへ重い辞書や i18n ランタイムを転送せず、サーバー側で翻訳済み HTML を直接組み立ててストリーミング配信することに主眼が置かれました。
|
|
258
|
+
|
|
259
|
+
</Accordion>
|
|
260
|
+
<Accordion header="4. 現代的なコンパイラと統合コンテンツの時代 (2024 〜 2026 年)">
|
|
261
|
+
|
|
262
|
+
`paraglide`、`intlayer`、`wuchale` が代表する現在の潮流。国際化を単なるテキスト置換ではなく、包括的なコンテンツ設計として扱います。コンパイラがメッセージを Tree-shaking 可能な関数へと直接変換し、文案の定義はコンポーネントのすぐ隣に配置され、ビジュアルエディターや AI による翻訳パイプラインが日常の開発フローに自然に統合されます。この思想のもと、Intlayer はコンテンツの宣言と型生成を実行環境から完全に切り離し、各フレームワーク専用のアダプター(`react-intlayer`、`next-intlayer`、`vue-intlayer`、`angular-intlayer`、`svelte-intlayer`、`solid-intlayer`)を提供しています。
|
|
263
|
+
|
|
264
|
+
</Accordion>
|
|
265
|
+
</AccordionGroup>
|
|
266
|
+
|
|
267
|
+
## 結論:開発体験、パフォーマンス、そして AI 時代の最適解
|
|
268
|
+
|
|
269
|
+
15 年間にわたる 4 つの変革を経ても、JavaScript 国際化の本質的なテーマは一貫しています。それは、開発者体験(DX)やコードベースの保守性を高く保ちながら、いかにクライアント側の描画パフォーマンスを極限まで高めるかということです。
|
|
270
|
+
|
|
271
|
+
グローバル変数と管理不能な巨大 JSON から始まった技術は、コンポーネント近接配置、TypeScript による自動型付け、待ち時間のないサーバーレンダリング、コンパイラによる最適化へと進化しました。
|
|
272
|
+
|
|
273
|
+
### AI による自動化と従来の翻訳管理サービス
|
|
274
|
+
|
|
275
|
+
近年の最も決定的な変化は、AI による自動翻訳技術の実用化です。これにより、従来の翻訳管理プラットフォーム(TMS)が前提としてきたビジネスモデルそのものが問い直されています。
|
|
276
|
+
|
|
277
|
+
これまでコンテンツを巨大な単一 JSON に集約していたのは、外部の翻訳管理システムとやり取りしやすくするための妥協策でした。1 つのファイルにまとまっていれば外部翻訳者が扱いやすかった反面、開発現場には絶え間ない Git マージコンフリクト、使われなくなったキーの放置、文脈の喪失、肥大化した名前空間といった多大な負債がのしかかっていました。
|
|
278
|
+
|
|
279
|
+
生成 AI と現代のコンパイラ技術により、開発体験(DX)が再び最優先事項となりました。ビルドツールや CLI が、コンポーネントの隣にあるコンテンツファイルを自動検知・検証・翻訳できるようになったため、翻訳作業のためにコードの美しい設計を犠牲にする必要はなくなったのです。
|
|
280
|
+
|
|
281
|
+
商業用プラットフォームの多くは、長年にわたりそうした手動プロセスの摩擦を収益源としてきました。
|
|
282
|
+
|
|
283
|
+
- `i18next` のバックエンドである **Locize** や、多くのオープンソースを支援する **Crowdin** などは、ホスト型ストレージ、従量課金、文字数ベースの課金モデルを採用してきました。
|
|
284
|
+
- こうしたモデルは翻訳ボリュームと手動運用に依存しているため、開発環境内に直接組み込める完全無料の自動翻訳を標準提供する強い動機を持ちにくかったと言えます。
|
|
285
|
+
|
|
286
|
+
### 新興の AI ツールと直接プロバイダーコストの比較
|
|
287
|
+
|
|
288
|
+
大規模言語モデルの進化によって、高い翻訳精度を保ちながら 1 回あたりのコストが極小化されたことで、新たな世代のツールが登場しました。
|
|
289
|
+
|
|
290
|
+
- Paraglide の **linguo.dev** や **General Translation** (`gt-react`, `gt-next`) などは、独自の有料サブスクリプションや中継クラウド基盤を通じて AI 翻訳を提供しています。
|
|
291
|
+
- これに対し、**Intlayer** は CLI ツールを通じて AI 自動翻訳機能をオープンソースとして直接提供しています。チームは自分たちの API キー(OpenAI、Anthropic、Mistral、Google Gemini など)を接続するだけで利用でき、手数料やベンダーロックインなしに、各プロバイダーの実費のみで翻訳パイプラインを運用できます。
|
|
292
|
+
|
|
293
|
+
### 単なる i18n を超えて:包括的な多言語コンテンツ基盤へ
|
|
294
|
+
|
|
295
|
+
現代の Web アプリケーション開発は、`"送信"` や `"ログイン"` といった単一の単語を翻訳するだけに留まりません。洗練されたユーザー体験を提供するためには、複雑な画面遷移の中でもリッチで動的な構造化コンテンツを維持する必要があります。
|
|
296
|
+
|
|
297
|
+
Intlayer は国際化を単なるキー検索ツールではなく、総合的な多言語コンテンツ基盤として再定義しています。Markdown 文書、HTML 構造、ネストされたデータスキーマのネイティブサポートと視覚的なビジュアル CMS を備え、コード設計、AI パイプライン、コンテンツ運用の架け橋となります。
|
|
298
|
+
|
|
299
|
+
より詳しいアーキテクチャ比較や実践的な移行ガイドについては、以下の関連リソースをご覧ください。
|
|
300
|
+
|
|
301
|
+
- [コンパイラ型 vs. 宣言的国際化の比較](https://github.com/aymericzip/intlayer/blob/main/docs/blog/ja/compiler_vs_declarative_i18n.md)
|
|
302
|
+
- [コンポーネント近接配置 vs. 中央集権型 i18n](https://github.com/aymericzip/intlayer/blob/main/docs/blog/ja/per-component_vs_centralized_i18n.md)
|
|
303
|
+
- [パフォーマンスとベンチマーク結果](https://intlayer.org/doc/benchmark)
|
|
304
|
+
- [Intlayer 互換性アダプター一覧](https://intlayer.org/doc/concept/compatibility)
|