@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: "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
|
+
国际化并不是新鲜概念。早在 JavaScript 和现代 Web 兴起之前,软件系统就必须处理多种语言、货币、日期格式以及区域规范。早在 1980 年代,GEM 和 Mac OS 等早期图形化操作系统就已在着手解决此类问题。
|
|
26
|
+
|
|
27
|
+
这些设计思路后来被后端框架广泛采纳。Ruby on Rails、Django、Java 企业级框架以及 PHP 应用均建立了自己的国际化机制。当时的核心问题界定得非常清晰:
|
|
28
|
+
|
|
29
|
+
- 翻译文件应该存放在哪里?
|
|
30
|
+
- 如何格式化日期、数字和货币?
|
|
31
|
+
- 如何处理复数与语法结构差异?
|
|
32
|
+
- 如何为不同用户匹配合适的语言?
|
|
33
|
+
|
|
34
|
+
当整个页面都由服务端渲染时,流程相对直接。应用只需读取对应的翻译文件,生成 HTML,并将结果输出给浏览器。
|
|
35
|
+
|
|
36
|
+
> PHP 和 GNU gettext 是后来在 JavaScript 与 JSX 中广泛普及的 `t()` 辅助函数的早期雏形。
|
|
37
|
+
|
|
38
|
+
随后,JavaScript 开始接管浏览器端的大量交互。
|
|
39
|
+
|
|
40
|
+
随着 Web 应用从服务端模板渲染演进为复杂的单页应用 (SPA),国际化逐渐转变为前端的核心职责。浏览器需要负责加载语言包、动态切换语言、格式化数据、计算复数规则并更新界面,且不能刷新页面。
|
|
41
|
+
|
|
42
|
+
这一转变引出了一个根本性的难题:
|
|
43
|
+
|
|
44
|
+
**如何在不向每位终端用户分发海量翻译数据和庞大运行时代码的前提下,构建一个高效的多语言应用?**
|
|
45
|
+
|
|
46
|
+
过去十多年间,这个问题深刻塑造了 JavaScript i18n 方案的演变方向。
|
|
47
|
+
|
|
48
|
+
解决思路经历了多次跨越:从全局变量与 `t('key')` 查表,到面向特定框架的生态库、编译期文本提取、基于 TypeScript 的强类型推导、Server Components 服务端渲染、Tree-shaking 剪枝,再到如今在构建阶段直接将内容转换为优化代码的编译型方案。
|
|
49
|
+
|
|
50
|
+
本文梳理了 2011 至 2026 年间的技术变迁:剖析每一代工具所试图攻克的问题、各自的得失,以及前端整体架构演进对当今国际化实现的深远影响。
|
|
51
|
+
|
|
52
|
+

|
|
53
|
+
|
|
54
|
+
## 目录
|
|
55
|
+
|
|
56
|
+
<TOC/>
|
|
57
|
+
|
|
58
|
+
## 早期 Web:2016 年之前的 JavaScript 国际化
|
|
59
|
+
|
|
60
|
+
为了理解当下的现代工具,我们需要回顾 2011 至 2015 年间的前端工程背景。
|
|
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 国际化 API 规范 (ECMA-402) 直至 2012 年 12 月才正式确立并引入全局 `Intl` 对象。在各大浏览器广泛支持之前,哪怕是常规的日期与数字格式化,也必须依赖自定义逻辑或体积庞大的 Polyfill。
|
|
74
|
+
|
|
75
|
+
</Accordion>
|
|
76
|
+
<Accordion header="现代模块打包工具尚未成熟">
|
|
77
|
+
|
|
78
|
+
Webpack 尚处早期,浏览器端原生 ES 模块更是无从谈起。开发者通常通过 `<script>` 标签加载资源,将翻译字典直接挂载到全局变量上,例如 `window.translations = { ... }`。
|
|
79
|
+
|
|
80
|
+
</Accordion>
|
|
81
|
+
<Accordion header="庞大的单体 JSON 字典">
|
|
82
|
+
|
|
83
|
+
所有语言文案集中在少数庞大的 JSON 文件中。一位东京用户即使只打开了网站首页,也会被迫下载个人设置页、账单后台甚至管理后台的全部文案。
|
|
84
|
+
|
|
85
|
+
</Accordion>
|
|
86
|
+
</AccordionGroup>
|
|
87
|
+
|
|
88
|
+
### 第一代客户端类库的兴起
|
|
89
|
+
|
|
90
|
+
2012 至 2015 年间,现代客户端 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` 通过声明式组件(如 `<FormattedMessage>` 和 `<FormattedDate>`)将 ICU MessageFormat 规范与浏览器 `Intl` API 引入 React 生态。
|
|
106
|
+
|
|
107
|
+
</Accordion>
|
|
108
|
+
<Accordion header="react-i18next (2015 年 12 月)">
|
|
109
|
+
|
|
110
|
+
Jan Mühlemann 为快速成长的 React 社区带来了 `i18next` 适配,早期利用高阶组件 (`withTranslation`) 与 Context 机制在语言切换时触发组件重渲染。
|
|
111
|
+
|
|
112
|
+
</Accordion>
|
|
113
|
+
</AccordionGroup>
|
|
114
|
+
|
|
115
|
+
### 2016 年之前的架构局限
|
|
116
|
+
|
|
117
|
+
尽管这些工具初步解决了多语言单页应用的需求,但受限于时代条件,仍存在明显的痛点:
|
|
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="JavaScript 基础层" value="javascript">
|
|
151
|
+
|
|
152
|
+
| 首次发布 | 工具类库 | 旨在解决的核心问题 | 关键创新亮点 |
|
|
153
|
+
| ------------- | ------------------------------------ | ------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- |
|
|
154
|
+
| 2012 年 1 月 | `i18next` | 在不绑定特定框架的前提下,统一浏览器与 Node.js 端的运行时键值字典查找。 | 采用插件化运行时架构,将翻译核心逻辑与加载器、环境检测器及缓存机制解耦。 |
|
|
155
|
+
| 2021 年 2 月 | `typesafe-i18n` | 避免因未约束类型的字符串键导致的运行时静默报错和插值异常。 | 直接从翻译对象生成强类型翻译函数,运行时零额外依赖。 |
|
|
156
|
+
| 2023 年 10 月 | `paraglide` (`@inlang/paraglide-js`) | 消除运行时字典遍历、沉重的语法解析器以及客户端包体积膨胀。 | 将消息直接编译为纯 ECMAScript 模块和易于 Tree-shaking 优化的原生 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 持续演进,从早期的 HOC 架构迭代至 `<Trans>` JSX 插值组件与 `useTranslation` Hook。 |
|
|
168
|
+
| 2018 年 1 月 | `@lingui/react` | 减少运行时 ICU 语法解析器对客户端包体积造成的性能负担。 | 利用 Babel/SWC 编译宏,在构建时将 `<Trans>` 和 `t` 预编译为体积小巧的索引数组。 |
|
|
169
|
+
| 2020 年 12 月 | `use-intl` | 为 React 打造轻量、以 Hook 为核心并深度整合类型安全的现代化方案。 | 推出体验流畅的 `useTranslations` 与 `useFormatter` Hook,提供全面的 TypeScript 类型约束。 |
|
|
170
|
+
| 2021 年 2 月 | `@tolgee/react` | 缩短开发者、翻译人员与产品设计之间的沟通与反馈链路。 | 支持浏览器内的上下文行内编辑,用户可通过 Alt 键点击文案即时修改并自动生成界面快照。 |
|
|
171
|
+
| 2024 年 4 月 | `react-intlayer` | 专为 React 组件生命周期量身打造,摆脱中心化 JSON 字典、臃肿命名空间以及跨页面内容互相干扰的顽疾。 | 专为 React 渲染优化的 `useIntlayer` Hook,自动派生 TypeScript 严谨类型,组件级构建按需拆分,支持实时可视化 CMS 同步。 |
|
|
172
|
+
| 2024 年 7 月 | `gt-react` | 自动化人工导出翻译文件、交接流转及持续维护的繁复流程。 | 基于云原生体系,通过机器翻译流水线在 React 组件内直接实现由 AI 驱动的自动化本地化。 |
|
|
173
|
+
| 2025 年 8 月 | `@wuchale/jsx` | 免除在 JSX 中手动定义文案键名以及引入冗长翻译 Hook 的样板代码。 | 通过 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 静态导出,避免客户端出现链式数据请求。 | 提供 `serverSideTranslations` 与 `appWithTranslation`,将本地化命名空间按需注入页面 Props。 |
|
|
182
|
+
| 2019 年 12 月 | `next-translate` | 简化 Next.js Pages Router 项目中的国际化配置门槛并降低打包体积。 | 采用 Webpack Loader 插件架构,在构建阶段自动按页面仅注入该页所需的语言命名空间。 |
|
|
183
|
+
| 2020 年 11 月 | `next-intl` | 全面适配 Next.js App Router、React Server Components (RSC) 以及流式服务端渲染架构。 | 原生集成 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 的 Next.js 专用服务端组件适配层。 | 允许在同步 Server Components 中直接调用 `useIntlayer` 而无需 Prop-drilling,具备无串行等待的服务端渲染、国际化路由中间件以及可视化 CMS 同步能力。 |
|
|
187
|
+
| 2024 年 9 月 | `gt-next` | 利用人工智能翻译技术,自动化生成 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` 辅助函数,并支持在单文件组件内使用自定义 `<i18n>` 代码块。 |
|
|
196
|
+
| 2017 年 11 月 | `@nuxt/i18n` | 处理 Nuxt 项目中的多语言 URL 动态路由、SEO hreflang 规范标签以及 SSR 注水一致性。 | 全栈式路由模块,可自动生成带前缀或独立域名的本地化路由、SEO Meta 头信息,并支持语言分片懒加载。 |
|
|
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` Pipe,支持异步动态载入语言包并即时切换当前语言。 |
|
|
207
|
+
| 2019 年 7 月 | `@ngneat/transloco` | 解决早期 Angular 国际化工具中普遍存在的性能瓶颈、缺乏模块作用域隔离以及功能缺失等问题。 | 提供结构型指令 (`*transloco`)、按需加载特性模块的作用域文案隔离、SSR 服务端支持以及自动化提取 CLI 工具。 |
|
|
208
|
+
| 2019 年 9 月 | `@angular/localize` | 现代化重构 Angular 内置的编译期 i18n 方案,避免每种语言都需要完整重新编译整个 TypeScript 项目。 | 引入带标签的模板字符串 `$localize`,由 Ivy 编译器引擎作为极速的构建后置步骤直接替换植入。 |
|
|
209
|
+
| 2021 年 2 月 | `@tolgee/ngx` | 将多人协同的界面上下文翻译与应用快照采集流程整合进 Angular 日常开发工作流。 | 提供与 Tolgee 直连的 Angular Pipe 与指令,方便直接在浏览器界面中查看并调整文案。 |
|
|
210
|
+
| 2025 年 4 月 | `angular-intlayer` | 专为现代 Angular 技术栈(Signals 响应式原语、Standalone 独立组件与 SSR)量身打造的原生 Intlayer 方案。 | 结合 Angular 变更检测特性的 Signal 响应式内容绑定,原生兼容 Standalone 依赖注入,并支持与可视化 CMS 保持实时同步。 |
|
|
211
|
+
|
|
212
|
+
</Tab>
|
|
213
|
+
|
|
214
|
+
<Tab label="Svelte 与 SvelteKit" value="svelte">
|
|
215
|
+
|
|
216
|
+
| 首次发布 | 工具类库 | 旨在解决的核心问题 | 关键创新亮点 |
|
|
217
|
+
| ------------- | ----------------- | ---------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------- |
|
|
218
|
+
| 2018 年 7 月 | `svelte-i18n` | 提供一套天然契合 Svelte 响应式 Stores 机制的声明式国际化库。 | 依托 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 基础原语。 | 基于 Signal 响应式原语的翻译解析机制,无需依赖虚拟 DOM 即可直接更新对应真实 DOM 节点,杜绝任何多余重渲染。 |
|
|
231
|
+
| 2025 年 4 月 | `solid-intlayer` | 专为 SolidJS 及 SolidStart 框架特性深度优化的原生高性能 Intlayer 方案。 | 针对 Solid 细粒度响应式原语量身设计的轻量内容绑定,消除虚拟 DOM 开销,提供完整的 TypeScript Schema 智能补全,并无缝集成可视化编辑器。 |
|
|
232
|
+
| 2026 年 6 月 | `@lingui/solid` | 将编译期宏提取逻辑与完善的 ICU MessageFormat 语法解析能力扩展引入 SolidJS 领域。 | 针对 Solid 响应式架构精心优化的宏编译逻辑,在构建时将消息文本转换为运行时代价极低的精简结构。 |
|
|
233
|
+
|
|
234
|
+
</Tab>
|
|
235
|
+
|
|
236
|
+
</Tabs>
|
|
237
|
+
|
|
238
|
+
## JavaScript i18n 的四大架构发展阶段
|
|
239
|
+
|
|
240
|
+

|
|
241
|
+
|
|
242
|
+
回顾近十五年的技术探索,JavaScript 国际化的演化路径可划分为四个鲜明的架构纪元:
|
|
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` 为代表。开发者开始关注运行时解析带来的 CPU 开销以及无约束键名的脆弱性。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 运行时。
|
|
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
|
+
历经十五年和四次技术浪潮的更迭,JavaScript 国际化领域始终面对着不变的核心诉求:在保障卓越开发体验 (DX) 与长期代码可维护性的同时,尽可能压低客户端的性能与体积成本。
|
|
270
|
+
|
|
271
|
+
从最初的全局变量与庞大难以维护的单体 JSON 文件,逐步演变至如今的组件就近声明、TypeScript 静态类型保障、无瀑布延迟的服务端直出渲染以及编译期自动优化。
|
|
272
|
+
|
|
273
|
+
### AI 自动化能力与传统本地化平台模式
|
|
274
|
+
|
|
275
|
+
近年来生成式 AI 在自动化翻译领域的突破,对传统本地化服务平台(TMS)的运作模式带来了深远改变。
|
|
276
|
+
|
|
277
|
+
以往将文案聚拢在单一中心化 JSON 文件的做法,本质上是为了迎合外部翻译管理系统的导入与导出需求。集中存放便于非技术译员与第三方平台操作,但开发者却为此承担了沉重的技术负债:频繁的 Git 代码冲突、缺乏上下文导致的错译、不可追溯的废弃文案,以及日益膨胀的全局命名空间。
|
|
278
|
+
|
|
279
|
+
随着现代大语言模型与编译器工具的成熟,开发体验(DX)重新回归核心地位。构建工具与 CLI 工具可以直接在源码目录中自动识别、校验并翻译就近声明的内容,团队不再需要为了配合外部流程而在代码架构层面做出妥协。
|
|
280
|
+
|
|
281
|
+
十余年来,传统翻译平台大多围绕这些繁琐流程构建商业模式:
|
|
282
|
+
|
|
283
|
+
- 例如 **Locize**(`i18next` 背后的商业平台)与 **Crowdin**(多家开源框架的合作伙伴),其服务多基于文案云端托管、月度配额与字数计费。
|
|
284
|
+
- 由于其模式偏重于人工流转与翻译存量,因而缺乏动力将直接免费的自动化翻译能力下沉集成到开发者的底层本地工具链中。
|
|
285
|
+
|
|
286
|
+
### 新型 AI 方案与透明的底层 API 成本
|
|
287
|
+
|
|
288
|
+
随着通用大模型将高质量翻译的综合成本降低至极低水平,市场上也涌现出新一代工具:
|
|
289
|
+
|
|
290
|
+
- 诸如 Paraglide 的 **linguo.dev** 或 **General Translation** (`gt-react`, `gt-next`) 等产品,尝试通过专属付费订阅与云端代理服务介入这一流程。
|
|
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/zh/compiler_vs_declarative_i18n.md)
|
|
302
|
+
- [组件级就近管理 vs. 中心化翻译对比](https://github.com/aymericzip/intlayer/blob/main/docs/blog/zh/per-component_vs_centralized_i18n.md)
|
|
303
|
+
- [性能指标与基准评测报告](https://intlayer.org/doc/benchmark)
|
|
304
|
+
- [Intlayer 框架兼容适配器生态](https://intlayer.org/doc/concept/compatibility)
|
|
@@ -114,6 +114,26 @@ const blogEntry = {
|
|
|
114
114
|
vi: readLocale("detecting_missing_translations.md", "vi"),
|
|
115
115
|
uk: readLocale("detecting_missing_translations.md", "uk")
|
|
116
116
|
},
|
|
117
|
+
"./blog/en/history_of_i18n.md": {
|
|
118
|
+
en: readLocale("history_of_i18n.md", "en"),
|
|
119
|
+
es: readLocale("history_of_i18n.md", "es"),
|
|
120
|
+
ru: readLocale("history_of_i18n.md", "ru"),
|
|
121
|
+
ja: readLocale("history_of_i18n.md", "ja"),
|
|
122
|
+
fr: readLocale("history_of_i18n.md", "fr"),
|
|
123
|
+
ko: readLocale("history_of_i18n.md", "ko"),
|
|
124
|
+
zh: readLocale("history_of_i18n.md", "zh"),
|
|
125
|
+
de: readLocale("history_of_i18n.md", "de"),
|
|
126
|
+
ar: readLocale("history_of_i18n.md", "ar"),
|
|
127
|
+
it: readLocale("history_of_i18n.md", "it"),
|
|
128
|
+
"en-GB": readLocale("history_of_i18n.md", "en-GB"),
|
|
129
|
+
pt: readLocale("history_of_i18n.md", "pt"),
|
|
130
|
+
hi: readLocale("history_of_i18n.md", "hi"),
|
|
131
|
+
tr: readLocale("history_of_i18n.md", "tr"),
|
|
132
|
+
pl: readLocale("history_of_i18n.md", "pl"),
|
|
133
|
+
id: readLocale("history_of_i18n.md", "id"),
|
|
134
|
+
vi: readLocale("history_of_i18n.md", "vi"),
|
|
135
|
+
uk: readLocale("history_of_i18n.md", "uk")
|
|
136
|
+
},
|
|
117
137
|
"./blog/en/hreflang_guide_multilingual_seo.md": {
|
|
118
138
|
en: readLocale("hreflang_guide_multilingual_seo.md", "en"),
|
|
119
139
|
es: readLocale("hreflang_guide_multilingual_seo.md", "es"),
|