@intlayer/docs 9.5.1 → 9.5.3
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/README.md +1 -1
- package/blog/ar/history_of_i18n.md +304 -0
- package/blog/ar/i18next_vs_intlayer-i18next.md +327 -0
- package/blog/ar/i18next_vs_intlayer.md +445 -0
- package/blog/ar/is_i18next_outdated.md +1 -1
- package/blog/ar/is_next-intl_outdated.md +1 -1
- package/blog/ar/is_vue-i18n_outdated.md +1 -1
- package/blog/ar/lingui_vs_intlayer-lingui.md +304 -0
- package/blog/ar/lingui_vs_intlayer.md +381 -0
- package/blog/ar/next-i18next_vs_next-intl_vs_intlayer.md +1 -1
- package/blog/ar/next-intl_vs_intlayer-next-intl.md +309 -0
- package/blog/ar/next-intl_vs_intlayer.md +397 -0
- package/blog/ar/react-i18next_vs_react-intl_vs_intlayer.md +1 -1
- package/blog/ar/vue-i18n_vs_intlayer-vue-i18n.md +286 -0
- package/blog/ar/vue-i18n_vs_intlayer_benchmark.md +0 -0
- package/blog/de/history_of_i18n.md +304 -0
- package/blog/de/i18next_vs_intlayer-i18next.md +327 -0
- package/blog/de/i18next_vs_intlayer.md +445 -0
- package/blog/de/is_i18next_outdated.md +1 -1
- package/blog/de/is_next-intl_outdated.md +1 -1
- package/blog/de/is_vue-i18n_outdated.md +1 -1
- package/blog/de/lingui_vs_intlayer-lingui.md +304 -0
- package/blog/de/lingui_vs_intlayer.md +381 -0
- package/blog/de/next-i18next_vs_next-intl_vs_intlayer.md +1 -1
- package/blog/de/next-intl_vs_intlayer-next-intl.md +309 -0
- package/blog/de/next-intl_vs_intlayer.md +415 -0
- package/blog/de/vue-i18n_vs_intlayer-vue-i18n.md +288 -0
- package/blog/de/vue-i18n_vs_intlayer_benchmark.md +355 -0
- package/blog/en/history_of_i18n.md +304 -0
- package/blog/en/i18next_vs_intlayer-i18next.md +327 -0
- package/blog/en/i18next_vs_intlayer.md +445 -0
- package/blog/en/is_i18next_outdated.md +1 -1
- package/blog/en/is_next-intl_outdated.md +1 -1
- package/blog/en/is_vue-i18n_outdated.md +1 -1
- package/blog/en/lingui_vs_intlayer-lingui.md +304 -0
- package/blog/en/lingui_vs_intlayer.md +381 -0
- package/blog/en/next-i18next_vs_next-intl_vs_intlayer.md +1 -1
- package/blog/en/next-intl_vs_intlayer-next-intl.md +309 -0
- package/blog/en/next-intl_vs_intlayer.md +415 -0
- package/blog/en/react-i18next_vs_react-intl_vs_intlayer.md +1 -1
- package/blog/en/vue-i18n_vs_intlayer-vue-i18n.md +288 -0
- package/blog/en/vue-i18n_vs_intlayer.md +1 -1
- package/blog/en/vue-i18n_vs_intlayer_benchmark.md +361 -0
- package/blog/en-GB/history_of_i18n.md +304 -0
- package/blog/en-GB/i18next_vs_intlayer-i18next.md +327 -0
- package/blog/en-GB/i18next_vs_intlayer.md +445 -0
- package/blog/en-GB/is_i18next_outdated.md +1 -1
- package/blog/en-GB/is_next-intl_outdated.md +1 -1
- package/blog/en-GB/is_vue-i18n_outdated.md +1 -1
- package/blog/en-GB/lingui_vs_intlayer-lingui.md +304 -0
- package/blog/en-GB/lingui_vs_intlayer.md +381 -0
- package/blog/en-GB/next-i18next_vs_next-intl_vs_intlayer.md +1 -1
- package/blog/en-GB/next-intl_vs_intlayer-next-intl.md +309 -0
- package/blog/en-GB/next-intl_vs_intlayer.md +415 -0
- package/blog/en-GB/react-i18next_vs_react-intl_vs_intlayer.md +1 -1
- package/blog/en-GB/vue-i18n_vs_intlayer-vue-i18n.md +288 -0
- package/blog/en-GB/vue-i18n_vs_intlayer.md +1 -1
- package/blog/en-GB/vue-i18n_vs_intlayer_benchmark.md +245 -0
- package/blog/es/history_of_i18n.md +304 -0
- package/blog/es/i18next_vs_intlayer-i18next.md +327 -0
- package/blog/es/i18next_vs_intlayer.md +445 -0
- package/blog/es/is_i18next_outdated.md +1 -1
- package/blog/es/is_next-intl_outdated.md +1 -1
- package/blog/es/is_vue-i18n_outdated.md +1 -1
- package/blog/es/lingui_vs_intlayer-lingui.md +304 -0
- package/blog/es/lingui_vs_intlayer.md +381 -0
- package/blog/es/next-i18next_vs_next-intl_vs_intlayer.md +1 -1
- package/blog/es/next-intl_vs_intlayer-next-intl.md +309 -0
- package/blog/es/next-intl_vs_intlayer.md +417 -0
- package/blog/es/vue-i18n_vs_intlayer-vue-i18n.md +288 -0
- package/blog/es/vue-i18n_vs_intlayer_benchmark.md +363 -0
- package/blog/fr/history_of_i18n.md +304 -0
- package/blog/fr/i18next_vs_intlayer-i18next.md +327 -0
- package/blog/fr/i18next_vs_intlayer.md +445 -0
- package/blog/fr/is_i18next_outdated.md +1 -1
- package/blog/fr/is_next-intl_outdated.md +1 -1
- package/blog/fr/is_vue-i18n_outdated.md +1 -1
- package/blog/fr/lingui_vs_intlayer-lingui.md +304 -0
- package/blog/fr/lingui_vs_intlayer.md +381 -0
- package/blog/fr/next-i18next_vs_next-intl_vs_intlayer.md +1 -1
- package/blog/fr/next-intl_vs_intlayer-next-intl.md +309 -0
- package/blog/fr/next-intl_vs_intlayer.md +417 -0
- package/blog/fr/vue-i18n_vs_intlayer-vue-i18n.md +287 -0
- package/blog/fr/vue-i18n_vs_intlayer_benchmark.md +39 -0
- package/blog/hi/history_of_i18n.md +304 -0
- package/blog/hi/i18next_vs_intlayer-i18next.md +327 -0
- package/blog/hi/i18next_vs_intlayer.md +445 -0
- package/blog/hi/is_i18next_outdated.md +1 -1
- package/blog/hi/is_next-intl_outdated.md +1 -1
- package/blog/hi/is_vue-i18n_outdated.md +1 -1
- package/blog/hi/lingui_vs_intlayer-lingui.md +304 -0
- package/blog/hi/lingui_vs_intlayer.md +381 -0
- package/blog/hi/next-intl_vs_intlayer-next-intl.md +309 -0
- package/blog/hi/next-intl_vs_intlayer.md +397 -0
- package/blog/hi/react-i18next_vs_react-intl_vs_intlayer.md +1 -1
- package/blog/hi/vue-i18n_vs_intlayer-vue-i18n.md +288 -0
- package/blog/hi/vue-i18n_vs_intlayer_benchmark.md +0 -0
- package/blog/id/history_of_i18n.md +304 -0
- package/blog/id/i18next_vs_intlayer-i18next.md +327 -0
- package/blog/id/i18next_vs_intlayer.md +445 -0
- package/blog/id/is_i18next_outdated.md +1 -1
- package/blog/id/is_next-intl_outdated.md +1 -1
- package/blog/id/is_vue-i18n_outdated.md +1 -1
- package/blog/id/lingui_vs_intlayer-lingui.md +304 -0
- package/blog/id/lingui_vs_intlayer.md +381 -0
- package/blog/id/next-i18next_vs_next-intl_vs_intlayer.md +1 -1
- package/blog/id/next-intl_vs_intlayer-next-intl.md +310 -0
- package/blog/id/next-intl_vs_intlayer.md +397 -0
- package/blog/id/react-i18next_vs_react-intl_vs_intlayer.md +1 -1
- package/blog/id/vue-i18n_vs_intlayer-vue-i18n.md +36 -0
- package/blog/id/vue-i18n_vs_intlayer.md +1 -1
- package/blog/id/vue-i18n_vs_intlayer_benchmark.md +41 -0
- package/blog/it/history_of_i18n.md +304 -0
- package/blog/it/i18next_vs_intlayer-i18next.md +327 -0
- package/blog/it/i18next_vs_intlayer.md +445 -0
- package/blog/it/is_i18next_outdated.md +1 -1
- package/blog/it/is_next-intl_outdated.md +1 -1
- package/blog/it/is_vue-i18n_outdated.md +1 -1
- package/blog/it/lingui_vs_intlayer-lingui.md +304 -0
- package/blog/it/lingui_vs_intlayer.md +381 -0
- package/blog/it/next-i18next_vs_next-intl_vs_intlayer.md +1 -1
- package/blog/it/next-intl_vs_intlayer-next-intl.md +309 -0
- package/blog/it/next-intl_vs_intlayer.md +418 -0
- package/blog/it/vue-i18n_vs_intlayer-vue-i18n.md +288 -0
- package/blog/it/vue-i18n_vs_intlayer_benchmark.md +34 -0
- package/blog/ja/history_of_i18n.md +304 -0
- package/blog/ja/i18next_vs_intlayer-i18next.md +327 -0
- package/blog/ja/i18next_vs_intlayer.md +447 -0
- package/blog/ja/is_i18next_outdated.md +1 -1
- package/blog/ja/is_next-intl_outdated.md +1 -1
- package/blog/ja/is_vue-i18n_outdated.md +1 -1
- package/blog/ja/lingui_vs_intlayer-lingui.md +304 -0
- package/blog/ja/lingui_vs_intlayer.md +381 -0
- package/blog/ja/next-i18next_vs_next-intl_vs_intlayer.md +1 -1
- package/blog/ja/next-intl_vs_intlayer-next-intl.md +310 -0
- package/blog/ja/next-intl_vs_intlayer.md +422 -0
- package/blog/ja/react-i18next_vs_react-intl_vs_intlayer.md +1 -1
- package/blog/ja/vue-i18n_vs_intlayer-vue-i18n.md +288 -0
- package/blog/ja/vue-i18n_vs_intlayer.md +1 -1
- package/blog/ja/vue-i18n_vs_intlayer_benchmark.md +0 -0
- package/blog/ko/history_of_i18n.md +304 -0
- package/blog/ko/i18next_vs_intlayer-i18next.md +327 -0
- package/blog/ko/i18next_vs_intlayer.md +447 -0
- package/blog/ko/is_i18next_outdated.md +1 -1
- package/blog/ko/is_next-intl_outdated.md +1 -1
- package/blog/ko/is_vue-i18n_outdated.md +1 -1
- package/blog/ko/lingui_vs_intlayer-lingui.md +304 -0
- package/blog/ko/lingui_vs_intlayer.md +381 -0
- package/blog/ko/next-i18next_vs_next-intl_vs_intlayer.md +1 -1
- package/blog/ko/next-intl_vs_intlayer-next-intl.md +309 -0
- package/blog/ko/next-intl_vs_intlayer.md +397 -0
- package/blog/ko/react-i18next_vs_react-intl_vs_intlayer.md +1 -1
- package/blog/ko/vue-i18n_vs_intlayer-vue-i18n.md +288 -0
- package/blog/ko/vue-i18n_vs_intlayer.md +1 -1
- package/blog/ko/vue-i18n_vs_intlayer_benchmark.md +366 -0
- package/blog/pl/history_of_i18n.md +304 -0
- package/blog/pl/i18next_vs_intlayer-i18next.md +327 -0
- package/blog/pl/i18next_vs_intlayer.md +445 -0
- package/blog/pl/is_i18next_outdated.md +1 -1
- package/blog/pl/is_next-intl_outdated.md +1 -1
- package/blog/pl/is_vue-i18n_outdated.md +1 -1
- package/blog/pl/lingui_vs_intlayer-lingui.md +304 -0
- package/blog/pl/lingui_vs_intlayer.md +381 -0
- package/blog/pl/next-i18next_vs_next-intl_vs_intlayer.md +1 -1
- package/blog/pl/next-intl_vs_intlayer-next-intl.md +309 -0
- package/blog/pl/next-intl_vs_intlayer.md +397 -0
- package/blog/pl/react-i18next_vs_react-intl_vs_intlayer.md +1 -1
- package/blog/pl/vue-i18n_vs_intlayer-vue-i18n.md +289 -0
- package/blog/pl/vue-i18n_vs_intlayer.md +1 -1
- package/blog/pl/vue-i18n_vs_intlayer_benchmark.md +0 -0
- package/blog/pt/history_of_i18n.md +304 -0
- package/blog/pt/i18next_vs_intlayer-i18next.md +327 -0
- package/blog/pt/i18next_vs_intlayer.md +445 -0
- package/blog/pt/is_i18next_outdated.md +1 -1
- package/blog/pt/is_next-intl_outdated.md +1 -1
- package/blog/pt/is_vue-i18n_outdated.md +1 -1
- package/blog/pt/lingui_vs_intlayer-lingui.md +304 -0
- package/blog/pt/lingui_vs_intlayer.md +381 -0
- package/blog/pt/next-i18next_vs_next-intl_vs_intlayer.md +1 -1
- package/blog/pt/next-intl_vs_intlayer-next-intl.md +309 -0
- package/blog/pt/next-intl_vs_intlayer.md +411 -0
- package/blog/pt/vue-i18n_vs_intlayer-vue-i18n.md +288 -0
- package/blog/pt/vue-i18n_vs_intlayer_benchmark.md +0 -0
- package/blog/ru/history_of_i18n.md +304 -0
- package/blog/ru/i18next_vs_intlayer-i18next.md +327 -0
- package/blog/ru/i18next_vs_intlayer.md +445 -0
- package/blog/ru/is_i18next_outdated.md +1 -1
- package/blog/ru/is_next-intl_outdated.md +1 -1
- package/blog/ru/is_vue-i18n_outdated.md +1 -1
- package/blog/ru/lingui_vs_intlayer-lingui.md +304 -0
- package/blog/ru/lingui_vs_intlayer.md +381 -0
- package/blog/ru/next-i18next_vs_next-intl_vs_intlayer.md +1 -1
- package/blog/ru/next-intl_vs_intlayer-next-intl.md +309 -0
- package/blog/ru/next-intl_vs_intlayer.md +417 -0
- package/blog/ru/vue-i18n_vs_intlayer-vue-i18n.md +288 -0
- package/blog/ru/vue-i18n_vs_intlayer_benchmark.md +54 -0
- package/blog/tr/history_of_i18n.md +304 -0
- package/blog/tr/i18next_vs_intlayer-i18next.md +327 -0
- package/blog/tr/i18next_vs_intlayer.md +445 -0
- package/blog/tr/is_i18next_outdated.md +1 -1
- package/blog/tr/is_next-intl_outdated.md +1 -1
- package/blog/tr/is_vue-i18n_outdated.md +1 -1
- package/blog/tr/lingui_vs_intlayer-lingui.md +304 -0
- package/blog/tr/lingui_vs_intlayer.md +381 -0
- package/blog/tr/next-i18next_vs_next-intl_vs_intlayer.md +1 -1
- package/blog/tr/next-intl_vs_intlayer-next-intl.md +309 -0
- package/blog/tr/next-intl_vs_intlayer.md +397 -0
- package/blog/tr/react-i18next_vs_react-intl_vs_intlayer.md +1 -1
- package/blog/tr/vue-i18n_vs_intlayer-vue-i18n.md +288 -0
- package/blog/tr/vue-i18n_vs_intlayer.md +1 -1
- package/blog/tr/vue-i18n_vs_intlayer_benchmark.md +0 -0
- package/blog/uk/history_of_i18n.md +304 -0
- package/blog/uk/i18next_vs_intlayer-i18next.md +327 -0
- package/blog/uk/i18next_vs_intlayer.md +445 -0
- package/blog/uk/is_i18next_outdated.md +1 -1
- package/blog/uk/is_next-intl_outdated.md +1 -1
- package/blog/uk/is_vue-i18n_outdated.md +1 -1
- package/blog/uk/lingui_vs_intlayer-lingui.md +304 -0
- package/blog/uk/lingui_vs_intlayer.md +381 -0
- package/blog/uk/next-i18next_vs_next-intl_vs_intlayer.md +1 -1
- package/blog/uk/next-intl_vs_intlayer-next-intl.md +309 -0
- package/blog/uk/next-intl_vs_intlayer.md +397 -0
- package/blog/uk/react-i18next_vs_react-intl_vs_intlayer.md +1 -1
- package/blog/uk/vue-i18n_vs_intlayer-vue-i18n.md +270 -0
- package/blog/uk/vue-i18n_vs_intlayer.md +1 -1
- package/blog/uk/vue-i18n_vs_intlayer_benchmark.md +0 -0
- package/blog/vi/history_of_i18n.md +304 -0
- package/blog/vi/i18next_vs_intlayer-i18next.md +327 -0
- package/blog/vi/i18next_vs_intlayer.md +445 -0
- package/blog/vi/is_i18next_outdated.md +1 -1
- package/blog/vi/is_next-intl_outdated.md +1 -1
- package/blog/vi/is_vue-i18n_outdated.md +1 -1
- package/blog/vi/lingui_vs_intlayer-lingui.md +304 -0
- package/blog/vi/lingui_vs_intlayer.md +381 -0
- package/blog/vi/next-i18next_vs_next-intl_vs_intlayer.md +1 -1
- package/blog/vi/next-intl_vs_intlayer-next-intl.md +309 -0
- package/blog/vi/next-intl_vs_intlayer.md +397 -0
- package/blog/vi/react-i18next_vs_react-intl_vs_intlayer.md +1 -1
- package/blog/vi/vue-i18n_vs_intlayer-vue-i18n.md +288 -0
- package/blog/vi/vue-i18n_vs_intlayer.md +1 -1
- package/blog/vi/vue-i18n_vs_intlayer_benchmark.md +0 -0
- package/blog/zh/history_of_i18n.md +304 -0
- package/blog/zh/i18next_vs_intlayer-i18next.md +327 -0
- package/blog/zh/i18next_vs_intlayer.md +445 -0
- package/blog/zh/is_i18next_outdated.md +1 -1
- package/blog/zh/is_next-intl_outdated.md +1 -1
- package/blog/zh/is_vue-i18n_outdated.md +1 -1
- package/blog/zh/lingui_vs_intlayer-lingui.md +304 -0
- package/blog/zh/lingui_vs_intlayer.md +381 -0
- package/blog/zh/next-i18next_vs_next-intl_vs_intlayer.md +1 -1
- package/blog/zh/next-intl_vs_intlayer-next-intl.md +309 -0
- package/blog/zh/next-intl_vs_intlayer.md +422 -0
- package/blog/zh/react-i18next_vs_react-intl_vs_intlayer.md +1 -1
- package/blog/zh/vue-i18n_vs_intlayer-vue-i18n.md +288 -0
- package/blog/zh/vue-i18n_vs_intlayer.md +1 -1
- package/blog/zh/vue-i18n_vs_intlayer_benchmark.md +30 -0
- package/dist/cjs/generated/blog.entry.cjs +180 -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/cjs/generated/frequentQuestions.entry.cjs +20 -0
- package/dist/cjs/generated/frequentQuestions.entry.cjs.map +1 -1
- package/dist/esm/generated/blog.entry.mjs +180 -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/esm/generated/frequentQuestions.entry.mjs +20 -0
- package/dist/esm/generated/frequentQuestions.entry.mjs.map +1 -1
- package/dist/types/generated/blog.entry.d.ts +9 -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/dist/types/generated/frequentQuestions.entry.d.ts +1 -0
- package/dist/types/generated/frequentQuestions.entry.d.ts.map +1 -1
- package/docs/ar/benchmark/index.md +4 -1
- package/docs/ar/benchmark/nextjs.md +33 -28
- package/docs/ar/benchmark/solid.md +14 -11
- package/docs/ar/benchmark/svelte.md +13 -10
- package/docs/ar/benchmark/tanstack.md +30 -25
- package/docs/ar/benchmark/vue.md +12 -8
- 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/interest_of_intlayer.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/bn/interest_of_intlayer.md +1 -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/cs/interest_of_intlayer.md +1 -1
- package/docs/de/benchmark/index.md +4 -1
- package/docs/de/benchmark/nextjs.md +33 -28
- package/docs/de/benchmark/solid.md +14 -11
- package/docs/de/benchmark/svelte.md +13 -10
- package/docs/de/benchmark/tanstack.md +30 -25
- package/docs/de/benchmark/vue.md +12 -8
- 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/interest_of_intlayer.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 +33 -28
- package/docs/en/benchmark/solid.md +14 -11
- package/docs/en/benchmark/svelte.md +13 -10
- package/docs/en/benchmark/tanstack.md +31 -26
- package/docs/en/benchmark/vue.md +12 -8
- 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/interest_of_intlayer.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 +33 -28
- package/docs/en-GB/benchmark/solid.md +14 -11
- package/docs/en-GB/benchmark/svelte.md +13 -10
- package/docs/en-GB/benchmark/tanstack.md +30 -25
- package/docs/en-GB/benchmark/vue.md +12 -8
- 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/interest_of_intlayer.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 +33 -28
- package/docs/es/benchmark/solid.md +14 -11
- package/docs/es/benchmark/svelte.md +13 -10
- package/docs/es/benchmark/tanstack.md +30 -25
- package/docs/es/benchmark/vue.md +12 -8
- 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/interest_of_intlayer.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 +33 -28
- package/docs/fr/benchmark/solid.md +14 -11
- package/docs/fr/benchmark/svelte.md +13 -10
- package/docs/fr/benchmark/tanstack.md +30 -25
- package/docs/fr/benchmark/vue.md +12 -8
- 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/interest_of_intlayer.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 +33 -28
- package/docs/hi/benchmark/solid.md +14 -11
- package/docs/hi/benchmark/svelte.md +13 -10
- package/docs/hi/benchmark/tanstack.md +30 -25
- package/docs/hi/benchmark/vue.md +12 -8
- 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/interest_of_intlayer.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 +33 -28
- package/docs/id/benchmark/solid.md +14 -11
- package/docs/id/benchmark/svelte.md +13 -10
- package/docs/id/benchmark/tanstack.md +30 -25
- package/docs/id/benchmark/vue.md +12 -8
- 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/interest_of_intlayer.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 +33 -28
- package/docs/it/benchmark/solid.md +14 -11
- package/docs/it/benchmark/svelte.md +13 -10
- package/docs/it/benchmark/tanstack.md +30 -25
- package/docs/it/benchmark/vue.md +12 -8
- 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/interest_of_intlayer.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 +33 -28
- package/docs/ja/benchmark/solid.md +14 -11
- package/docs/ja/benchmark/svelte.md +13 -10
- package/docs/ja/benchmark/tanstack.md +30 -25
- package/docs/ja/benchmark/vue.md +12 -8
- 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/interest_of_intlayer.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 +33 -28
- package/docs/ko/benchmark/solid.md +14 -11
- package/docs/ko/benchmark/svelte.md +13 -10
- package/docs/ko/benchmark/tanstack.md +30 -25
- package/docs/ko/benchmark/vue.md +12 -8
- 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/interest_of_intlayer.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/nl/interest_of_intlayer.md +1 -1
- package/docs/pl/benchmark/index.md +4 -1
- package/docs/pl/benchmark/nextjs.md +33 -28
- package/docs/pl/benchmark/solid.md +14 -11
- package/docs/pl/benchmark/svelte.md +13 -10
- package/docs/pl/benchmark/tanstack.md +30 -25
- package/docs/pl/benchmark/vue.md +12 -8
- 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/interest_of_intlayer.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 +33 -28
- package/docs/pt/benchmark/solid.md +14 -11
- package/docs/pt/benchmark/svelte.md +13 -10
- package/docs/pt/benchmark/tanstack.md +30 -25
- package/docs/pt/benchmark/vue.md +12 -8
- 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/interest_of_intlayer.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 +33 -28
- package/docs/ru/benchmark/solid.md +14 -11
- package/docs/ru/benchmark/svelte.md +13 -10
- package/docs/ru/benchmark/tanstack.md +30 -25
- package/docs/ru/benchmark/vue.md +12 -8
- 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/interest_of_intlayer.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 +33 -28
- package/docs/tr/benchmark/solid.md +14 -11
- package/docs/tr/benchmark/svelte.md +13 -10
- package/docs/tr/benchmark/tanstack.md +30 -25
- package/docs/tr/benchmark/vue.md +12 -8
- 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/interest_of_intlayer.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 +33 -28
- package/docs/uk/benchmark/solid.md +14 -11
- package/docs/uk/benchmark/svelte.md +13 -10
- package/docs/uk/benchmark/tanstack.md +30 -25
- package/docs/uk/benchmark/vue.md +12 -8
- 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/interest_of_intlayer.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/ur/interest_of_intlayer.md +1 -1
- package/docs/vi/benchmark/index.md +4 -1
- package/docs/vi/benchmark/nextjs.md +33 -28
- package/docs/vi/benchmark/solid.md +14 -11
- package/docs/vi/benchmark/svelte.md +13 -10
- package/docs/vi/benchmark/tanstack.md +30 -25
- package/docs/vi/benchmark/vue.md +12 -8
- 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/interest_of_intlayer.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 +33 -28
- package/docs/zh/benchmark/solid.md +14 -11
- package/docs/zh/benchmark/svelte.md +13 -10
- package/docs/zh/benchmark/tanstack.md +30 -25
- package/docs/zh/benchmark/vue.md +12 -8
- 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/interest_of_intlayer.md +1 -1
- package/docs/zh/intlayer_with_remix_3.md +558 -0
- package/docs/zh-TW/interest_of_intlayer.md +1 -1
- package/frequent_questions/ar/claude_code_token_consumption.md +152 -0
- package/frequent_questions/de/claude_code_token_consumption.md +152 -0
- package/frequent_questions/en/claude_code_token_consumption.md +152 -0
- package/frequent_questions/en-GB/claude_code_token_consumption.md +152 -0
- package/frequent_questions/es/claude_code_token_consumption.md +152 -0
- package/frequent_questions/fr/claude_code_token_consumption.md +152 -0
- package/frequent_questions/hi/claude_code_token_consumption.md +152 -0
- package/frequent_questions/id/claude_code_token_consumption.md +152 -0
- package/frequent_questions/it/claude_code_token_consumption.md +152 -0
- package/frequent_questions/ja/claude_code_token_consumption.md +152 -0
- package/frequent_questions/ko/claude_code_token_consumption.md +152 -0
- package/frequent_questions/pl/claude_code_token_consumption.md +152 -0
- package/frequent_questions/pt/claude_code_token_consumption.md +152 -0
- package/frequent_questions/ru/claude_code_token_consumption.md +152 -0
- package/frequent_questions/tr/claude_code_token_consumption.md +152 -0
- package/frequent_questions/uk/claude_code_token_consumption.md +152 -0
- package/frequent_questions/vi/claude_code_token_consumption.md +152 -0
- package/frequent_questions/zh/claude_code_token_consumption.md +152 -0
- package/package.json +7 -7
- package/src/generated/blog.entry.ts +180 -0
- package/src/generated/docs.entry.ts +0 -20
- package/src/generated/frequentQuestions.entry.ts +20 -0
- 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,288 @@
|
|
|
1
|
+
---
|
|
2
|
+
createdAt: 2026-09-13
|
|
3
|
+
updatedAt: 2026-09-13
|
|
4
|
+
title: "vue-i18n बनाम @intlayer/vue-i18n: समान API, विभिन्न Bundle"
|
|
5
|
+
description: जब एक Vue 3 ऐप अपनी vue-i18n कॉल को रखता है लेकिन @intlayer/vue-i18n compat adapter के माध्यम से उन्हें serve करता है तो क्या बदलता है। प्रति-पेज JavaScript, runtime size, component size और leakage को same Vite + Vue code पर मापा गया है, साथ ही adapter क्या रखता है, क्या ignore करता है और क्या replace नहीं कर सकता है।
|
|
6
|
+
keywords:
|
|
7
|
+
- vue-i18n
|
|
8
|
+
- "@intlayer/vue-i18n"
|
|
9
|
+
- Intlayer
|
|
10
|
+
- Compat adapter
|
|
11
|
+
- Migration
|
|
12
|
+
- Internationalization
|
|
13
|
+
- i18n
|
|
14
|
+
- Benchmark
|
|
15
|
+
- Bundle size
|
|
16
|
+
- Blog
|
|
17
|
+
- Vue
|
|
18
|
+
- Nuxt
|
|
19
|
+
- Vite
|
|
20
|
+
slugs:
|
|
21
|
+
- blog
|
|
22
|
+
- vue-i18n-vs-intlayer-vue-i18n
|
|
23
|
+
author: aymericzip
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
# vue-i18n बनाम @intlayer/vue-i18n | समान API, विभिन्न Bundle
|
|
27
|
+
|
|
28
|
+
`@intlayer/vue-i18n` एक compat adapter है: यह `vue-i18n` API (`createI18n`, `useI18n`, `t()`, `d()`, `n()`, `$t`, `v-t`, `i18n.global.locale`...) को expose करता है और इसे Intlayer द्वारा compiled dictionaries से serve करता है। आपकी `.vue` files नहीं बदलती हैं। जो `t("footer.github")` से bound है, वह बदलता है।
|
|
29
|
+
|
|
30
|
+
यह लेख एक ही Vite + Vue 3 एप्लिकेशन पर इस स्वैप को मापता है, एक बार `vue-i18n` के साथ और एक बार एडेप्टर के साथ निर्मित। संख्याएँ [Benchmark Bloom](https://github.com/intlayer-org/benchmark-bloom) से आती हैं। `vue-i18n` और Intlayer की तुलना लाइब्रेरी के रूप में करने के लिए, [vue-i18n vs Intlayer](https://intlayer.org/blog/vue-i18n-vs-intlayer) और [vue-i18n vs Intlayer benchmark](https://intlayer.org/blog/vue-i18n-vs-intlayer-benchmark) पढ़ें। यह इस बारे में है कि जब आप अपने components को वैसे ही रखते हैं तो एडेप्टर क्या बदलता है।
|
|
31
|
+
|
|
32
|
+
<TOC/>
|
|
33
|
+
|
|
34
|
+
> **tl;dr**: एक ही Vite + Vue 3 ऐप्लिकेशन पर, `vue-i18n` को `@intlayer/vue-i18n` से बदलने से प्रति-पृष्ठ JavaScript **134.9 KB से 47.0 KB** gzip तक कम हो गया (i18n के बिना ऐप 41.3 KB वजन का है), runtime **24.3 KB से 7.9 KB**, औसत component **196 KB से 8.4 KB**, और foreign-page string leakage **90% से 0%**, बिना किसी `.vue` फ़ाइल को संपादित किए। `createI18n({ messages })` fallback के रूप में काम करता रहता है; ऊपर दिए गए नंबर प्राप्त करने के लिए JSON imports हटाएं। SFC `<i18n>` blocks और runtime `setLocaleMessage()` वे दो features हैं जो carry over नहीं होते हैं।
|
|
35
|
+
|
|
36
|
+
## `@intlayer/vue-i18n` क्या है
|
|
37
|
+
|
|
38
|
+
`vue-i18n` एक runtime है। `createI18n({ messages: { en, fr, ... } })` हर locale के हर message को hold करने वाला एक global instance बनाता है; `useI18n()` हर component को इससे bind करता है; `t("footer.github")` render time पर tree को traverse करता है। यह design SFC `<i18n>` blocks और `setLocaleMessage()` को संभव बनाता है, और यह भी है कि क्यों हर component का dependency graph पूरे tree को शामिल करता है।
|
|
39
|
+
|
|
40
|
+
`@intlayer/vue-i18n` API को keep करता है और tree को replace करता है:
|
|
41
|
+
|
|
42
|
+
1. **Import aliasing.** `@intlayer/vue-i18n/plugin` से `vueI18nVitePlugin()` `vite-intlayer` को wrap करता है और एक `resolve.alias` add करता है ताकि `vue-i18n` `@intlayer/vue-i18n` को resolve करे। कोई import rename नहीं है।
|
|
43
|
+
2. **JSON as source of truth.** The `syncJSON` plugin reads your existing `locales/{locale}.json` with `format: "vue-i18n"` (so `{name}`, `{0}` list interpolation and `"car | cars"` pipe plurals are parsed correctly) and writes translations back when the CLI or the CMS updates them.
|
|
44
|
+
3. **Call-site binding.** The Intlayer optimize pass rewrites `useI18n()` call sites so the component receives the dictionaries its keys name, in the active locale, as imports the bundler can trace and split.
|
|
45
|
+
|
|
46
|
+
```vue fileName="src/components/Footer.vue"
|
|
47
|
+
<!-- आपका कोड, अपरिवर्तित -->
|
|
48
|
+
<script setup lang="ts">
|
|
49
|
+
import { useI18n } from "vue-i18n";
|
|
50
|
+
|
|
51
|
+
const { t } = useI18n();
|
|
52
|
+
</script>
|
|
53
|
+
|
|
54
|
+
<template>
|
|
55
|
+
<a href="https://github.com/intlayer-org/benchmark-bloom">{{
|
|
56
|
+
t("footer.github")
|
|
57
|
+
}}</a>
|
|
58
|
+
</template>
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
```ts fileName="कंपाइलर जारी करता है (सरलीकृत)"
|
|
62
|
+
import _dicHash_footer from "../.intlayer/dictionaries/footer.mjs";
|
|
63
|
+
import { useDictionary as useI18n } from "@intlayer/vue-i18n";
|
|
64
|
+
|
|
65
|
+
const { t } = useI18n(_dicHash_footer);
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
घटक अब वैश्विक संदेश ट्री तक नहीं पहुंचता है। यह `footer` तक पहुंचता है। यही कारण है कि नीचे दिए गए घटक-आकार स्तंभ 196 KB से 8 KB तक गिरता है।
|
|
69
|
+
|
|
70
|
+
## एडेप्टर क्या रखता है, अनदेखा करता है, और प्रतिस्थापित नहीं करता है
|
|
71
|
+
|
|
72
|
+
| `vue-i18n` API | `@intlayer/vue-i18n` के साथ |
|
|
73
|
+
| ------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------- |
|
|
74
|
+
| `useI18n()` → `{ t, d, n, te, tm, rt, locale, availableLocales }` | ✅ संरक्षित। `t` keys आपके dictionaries के विरुद्ध typed हैं |
|
|
75
|
+
| `t("key", { name })`, `t("key", [a, b])`, `t("key", count)` | ✅ संरक्षित। `{name}`, `{0}` और pipe-separated plurals पहले की तरह resolve होते हैं |
|
|
76
|
+
| `d(date, "long")`, `n(value, "currency")` | ✅ संरक्षित। `createI18n()` से `datetimeFormats` / `numberFormats` को सम्मानित किया जाता है, native `Intl` द्वारा backed |
|
|
77
|
+
| `i18n.global.locale.value = "fr"` | ✅ रखा गया। एक `WritableComputedRef` जो Intlayer के क्लाइंट द्वारा समर्थित है; reactivity पहले की तरह व्यवहार करता है |
|
|
78
|
+
| `$t`, `$tc`, `$te`, `$tm`, `$rt`, `$d`, `$n`, `$i18n` (Options API) | ✅ रखा गया। `app.use(i18n)` द्वारा `app.config.globalProperties` पर पंजीकृत |
|
|
79
|
+
| `v-t` निर्देश | ✅ रखा गया |
|
|
80
|
+
| `legacy: true` | ✅ स्वीकार किया गया |
|
|
81
|
+
| `createI18n({ messages })` | ⚠️ `messages` को **runtime fallback** के रूप में उपयोग किया जाता है जिसमें एक dev warning है। Bundle gains के लिए JSON imports को हटाएं |
|
|
82
|
+
| `setLocaleMessage()`, `mergeLocaleMessage()` | ❌ चेतावनी दें और कुछ न करें। Runtime message loading को build-time dictionaries से बदल दिया गया है |
|
|
83
|
+
| SFC `<i18n>` custom blocks | ❌ नहीं पढ़े गए। उन messages को locale JSON में (या component के बगल में `.content.ts` में) स्थानांतरित करें |
|
|
84
|
+
| `@nuxtjs/i18n` | ⚠️ अलग adapter, [Nuxt compat doc](https://intlayer.org/doc/compatibility/nuxtjs-i18n) देखें |
|
|
85
|
+
|
|
86
|
+
## बेंचमार्क
|
|
87
|
+
|
|
88
|
+
### क्या मापा गया था
|
|
89
|
+
|
|
90
|
+
[Benchmark Bloom](https://github.com/intlayer-org/benchmark-bloom) suite **एक ही Vite + Vue 3 एप्लिकेशन** को प्रत्येक setup के साथ बनाता है: **10 pages** (home, about, blog, careers, contact, FAQ, pricing, products, settings, team), **10 locales** (`en`, `fr`, `es`, `de`, `it`, `pt`, `zh`, `ja`, `ko`, `ru`), identical components और identical content। Pages को `en` और `fr` में मापा जाता है।
|
|
91
|
+
|
|
92
|
+
दोनों को **static** configuration में बनाया गया था, वह configuration जो अधिकांश Vue projects ship करते हैं: `vue-i18n` के लिए, हर locale का JSON imported और `createI18n({ messages })` को pass किया जाता है; adapter के लिए, `vite.config.ts` और `intlayer.config.ts` को बदले जाने के साथ same components और `messages` import को हटाया जाता है। Native `vue-intlayer` को reference के लिए शामिल किया गया है।
|
|
93
|
+
|
|
94
|
+
प्रत्येक build के लिए, suite निम्नलिखित को record करता है:
|
|
95
|
+
|
|
96
|
+
- **Lib size**: एक खाली component का gzip (और minified) size जो केवल i18n library को import करता है।
|
|
97
|
+
- **Page JS**: प्रति page download किया गया gzip JavaScript, सभी pages और locales पर averaged।
|
|
98
|
+
- **Locale leak %**: downloaded JS में translated strings का share जो एक locale के हैं जिसे user **नहीं** देख रहा है।
|
|
99
|
+
- **Page leak %**: downloaded JS में translated strings का share जो एक page के हैं जिस page पर user **नहीं** है।
|
|
100
|
+
- **Component avg**: प्रत्येक component का average gzip size जो isolation में compiled है।
|
|
101
|
+
- **E2E reactivity**: एक नया locale select करने और DOM में `html[lang]` update होने के बीच wall-clock time (Playwright, 5 iterations)।
|
|
102
|
+
- **Page load**: `PerformanceNavigationTiming.duration`।
|
|
103
|
+
|
|
104
|
+
> नीचे दी गई संख्याएं **2026-09-12** को `vue-i18n` 11.4.0 और `@intlayer/vue-i18n` 9.5.1 के साथ चलाने से आई हैं। test application जानबूझकर छोटा है (प्रति locale कुछ दर्जन strings), इसलिए leakage percentages एक **pattern** का वर्णन करते हैं: ये आपकी content के साथ बढ़ते हैं जबकि runtime cost fixed रहता है।
|
|
105
|
+
|
|
106
|
+
### Vite + Vue 3 पर परिणाम
|
|
107
|
+
|
|
108
|
+
| Setup | Strategy | Lib size (gz) | Lib size (min) | Page JS avg (gz) | Locale leak | Page leak | Component avg (gz) | E2E reactivity | Page load |
|
|
109
|
+
| ------------------------ | -------- | ------------: | -------------: | ---------------: | ----------: | --------: | -----------------: | -------------: | ---------: |
|
|
110
|
+
| **base** (कोई i18n नहीं) | - | 0.0 KB | 0.0 KB | 41.3 KB | 0.0% | - | 1.1 KB | 1.8 ms | 10.8 ms |
|
|
111
|
+
| `vue-i18n` | static | 24.3 KB | 83.2 KB | 134.9 KB | 50.0% | 90.0% | 196.0 KB | 2.8 ms | 13.6 ms |
|
|
112
|
+
| **`@intlayer/vue-i18n`** | static | **7.9 KB** | **23.2 KB** | **47.0 KB** | **15.0%** | **0.0%** | **8.4 KB** | **1.5 ms** | **9.3 ms** |
|
|
113
|
+
| `vue-intlayer` (native) | static | 3.9 KB | 11.1 KB | 57.1 KB | 56.8% | 0.0% | 7.7 KB | 4.5 ms | 13.8 ms |
|
|
114
|
+
| `vue-intlayer` (native) | dynamic | 3.9 KB | 11.1 KB | 59.8 KB | 50.0% | 0.0% | 6.5 KB | 4.0 ms | 15.8 ms |
|
|
115
|
+
|
|
116
|
+
> base app का page-leak column खाली छोड़ा गया है: बिना i18n library के, fingerprinting shared chunks में hard-coded strings को pick करता है और संख्या meaningful नहीं होती है।
|
|
117
|
+
|
|
118
|
+
**इसे कैसे पढ़ें**
|
|
119
|
+
|
|
120
|
+
- **88 KB प्रति page कम, same components।** `vue-i18n` app को 41.3 KB से **134.9 KB** तक ले जाता है। उसी components का adapter build **47.0 KB** पर landing करता है, base app से 5.7 KB ऊपर। ज्यादातर अंतर 74.9 KB का `src/locales` है जो `createI18n({ messages })` हर page में pull करता है और adapter कभी एक block के रूप में bundle नहीं करता है।
|
|
121
|
+
- **Runtime 3x सिकुड़ता है।** एक खाली component जो केवल `vue-i18n` import करता है उसकी कीमत **24.3 KB gzip / 83.2 KB minified** है: `@intlify/core-base`, message compiler और runtime। Adapter की कीमत **7.9 KB / 23.2 KB** है, इसमें अधिकांश Intlayer का core और `vue-i18n` API surface है।
|
|
122
|
+
- **Components: 23x छोटे।** एक `useI18n()` component जो isolation में compile होता है औसतन **196 KB** होता है, क्योंकि `t` उस instance से bound होता है जो हर locale का हर message रखता है। Adapter के साथ, वही component औसतन **8.4 KB** होता है: यह अपने dictionary तक पहुंचता है।
|
|
123
|
+
- **Leakage.** `vue-i18n` हर पेज पर हर locale और हर पेज की सभी strings को भेजता है: 50% locale leakage (दोनों fingerprinted locales पर; दस locales bundled होने पर वास्तविक waste अधिक है), 90% page leakage। Adapter page leakage को **0%** तक कम करता है क्योंकि प्रत्येक component केवल अपने dictionaries को import करता है। Locale leakage इस `static` run में 15% पर बैठी है; `importMode: 'dynamic'` वह setting है जो इसे हटाती है, और वह configuration इस Vue run का हिस्सा नहीं था।
|
|
124
|
+
- **Reactivity और page load.** Locale switching दोनों के लिए सस्ता है (1.5-2.8 ms); Vue की reactivity system एक बार जब messages मेमोरी में हों तो ऐसा बनाती है। Page load 13.6 ms से **9.3 ms** तक जाता है, जो 88 KB कम JavaScript parse करने के अनुरूप है।
|
|
125
|
+
- **नेटिव पंक्तियों के बारे में।** `vue-intlayer` इस रन में `static` मोड में हर लोकेल को बंडल करता है और 3.9 KB रनटाइम के साथ 57.1 KB पर पहुंचता है; एडेप्टर के सिंक्रोनाइज़्ड डिक्शनरीज़ में कम विदेशी-लोकेल स्ट्रिंग्स थीं, इसलिए प्रति-पृष्ठ आंकड़ा कम है। नेटिव रनटाइम तीनों में सबसे हल्का रहता है, और इसका `.content.ts` मॉडल वह जगह है जहां SFC `<i18n>` ब्लॉक अपने समकक्ष को खोजते हैं।
|
|
126
|
+
|
|
127
|
+
## संख्याएं क्यों बदलती हैं
|
|
128
|
+
|
|
129
|
+
`src/components/` में कुछ भी नहीं बदला, इसलिए लाभ इसी से आते हैं कि `useI18n` किससे बंधा है।
|
|
130
|
+
|
|
131
|
+
**`vue-i18n` के साथ**, binding global instance है। `createI18n({ messages: { en, fr, ... } })` एक import है जो सब कुछ hold करता है; हर component जो `useI18n()` को call करता है वह सब कुछ तक पहुँच सकता है, इसलिए bundler instance के नीचे split नहीं कर सकता। Optimizing का मतलब है कि _आप_ `en.json` को route से split करें, एक router guard में `setLocaleMessage()` को call करें, और जैसे components move हों वैसे route-to-file map को सही रखें।
|
|
132
|
+
|
|
133
|
+
```bash
|
|
134
|
+
.
|
|
135
|
+
├── locales
|
|
136
|
+
│ ├── en.json # हर page की strings
|
|
137
|
+
│ └── fr.json
|
|
138
|
+
└── src
|
|
139
|
+
├── i18n.ts # createI18n({ messages: { en, fr, ... } })
|
|
140
|
+
├── main.ts # app.use(i18n)
|
|
141
|
+
└── components
|
|
142
|
+
└── Footer.vue # useI18n(); t("footer.github")
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
**`@intlayer/vue-i18n` के साथ**, binding dictionary है। `syncJSON` `en.json` की प्रत्येक top-level key को एक dictionary में बदल देता है; optimize pass component को उन्हें देता है जिनकी keys का नाम है, जैसे imports जिन्हें bundler trace करता है और प्रति पृष्ठ split करता है।
|
|
146
|
+
|
|
147
|
+
```bash
|
|
148
|
+
.
|
|
149
|
+
├── intlayer.config.ts # syncJSON({ format: "vue-i18n", source: ... })
|
|
150
|
+
├── locales
|
|
151
|
+
│ ├── en.json # unchanged, still the source of truth
|
|
152
|
+
│ └── fr.json
|
|
153
|
+
├── .intlayer/ # generated: one dictionary per top-level key, per locale
|
|
154
|
+
└── src
|
|
155
|
+
├── i18n.ts # createI18n({}) ← messages import removed
|
|
156
|
+
├── main.ts # app.use(i18n) ← unchanged
|
|
157
|
+
└── components
|
|
158
|
+
└── Footer.vue # useI18n(); t("footer.github") ← unchanged
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
`i18n.ts` में `messages` import वह एक पंक्ति है जिसे हटाना है। वह 88 KB है।
|
|
162
|
+
|
|
163
|
+
## तीन चरणों में माइग्रेशन
|
|
164
|
+
|
|
165
|
+
<Steps>
|
|
166
|
+
<Step number={1} title="इंस्टॉल करें">
|
|
167
|
+
|
|
168
|
+
```bash packageManager="npm"
|
|
169
|
+
npx intlayer init --interactive
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
```bash packageManager="pnpm"
|
|
173
|
+
pnpm dlx intlayer init --interactive
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
```bash packageManager="yarn"
|
|
177
|
+
yarn dlx intlayer init --interactive
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
```bash packageManager="bun"
|
|
181
|
+
bunx intlayer init --interactive
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
कमांड `vue-i18n` का पता लगाता है, `intlayer`, `vue-intlayer`, `@intlayer/vue-i18n` और `@intlayer/sync-json-plugin` इंस्टॉल करता है, और `intlayer.config.ts` को पहले से भरता है। `vue-i18n` को इंस्टॉल रखें: यह एक peer dependency है और types प्रदान करता है।
|
|
185
|
+
|
|
186
|
+
</Step>
|
|
187
|
+
<Step number={2} title="Intlayer को अपनी लोकेल फाइलों की ओर इंगित करें">
|
|
188
|
+
|
|
189
|
+
```ts fileName="intlayer.config.ts"
|
|
190
|
+
import { Locales, type IntlayerConfig } from "intlayer";
|
|
191
|
+
import { syncJSON } from "@intlayer/sync-json-plugin";
|
|
192
|
+
|
|
193
|
+
const config: IntlayerConfig = {
|
|
194
|
+
internationalization: {
|
|
195
|
+
locales: [Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH],
|
|
196
|
+
defaultLocale: Locales.ENGLISH,
|
|
197
|
+
},
|
|
198
|
+
dictionary: {
|
|
199
|
+
// "static" हर locale को bundle करता है; "dynamic" आवश्यकता के अनुसार सक्रिय को लोड करता है
|
|
200
|
+
importMode: "dynamic",
|
|
201
|
+
format: "vue-i18n",
|
|
202
|
+
},
|
|
203
|
+
plugins: [
|
|
204
|
+
syncJSON({
|
|
205
|
+
// vue-i18n dialect: {name}, {0}, "car | cars"
|
|
206
|
+
format: "vue-i18n",
|
|
207
|
+
source: ({ locale }) => `./locales/${locale}.json`,
|
|
208
|
+
location: "locales",
|
|
209
|
+
}),
|
|
210
|
+
],
|
|
211
|
+
};
|
|
212
|
+
|
|
213
|
+
export default config;
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
`locales/{locale}.json` अपनी जगह पर रहता है। हर top-level key (`footer`, `hero`...) एक dictionary बन जाती है।
|
|
217
|
+
|
|
218
|
+
</Step>
|
|
219
|
+
<Step number={3} title="प्लगइन जोड़ें और संदेशों के आयात को हटाएं">
|
|
220
|
+
|
|
221
|
+
```ts fileName="vite.config.ts"
|
|
222
|
+
import { defineConfig } from "vite";
|
|
223
|
+
import vue from "@vitejs/plugin-vue";
|
|
224
|
+
import { vueI18nVitePlugin } from "@intlayer/vue-i18n/plugin";
|
|
225
|
+
|
|
226
|
+
export default defineConfig({
|
|
227
|
+
plugins: [vue(), vueI18nVitePlugin()],
|
|
228
|
+
});
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
```ts fileName="src/i18n.ts"
|
|
232
|
+
import { createI18n } from "vue-i18n";
|
|
233
|
+
|
|
234
|
+
// पहले: createI18n({ locale: "en", messages: { en, fr, es } })
|
|
235
|
+
export const i18n = createI18n({ locale: "en" });
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
`vueI18nVitePlugin()` `vite-intlayer` को लपेटता है (content watching, dictionary compilation, optimize pass) और `vue-i18n` को adapter के रूप में alias करता है। `messages` import को हटाना ही 88 KB को छोड़ता है; इसे रखने से ऐप काम करता रहता है लेकिन दोनों को ship करता है।
|
|
239
|
+
|
|
240
|
+
</Step>
|
|
241
|
+
</Steps>
|
|
242
|
+
|
|
243
|
+
### आप बाद में क्या हटा सकते हैं
|
|
244
|
+
|
|
245
|
+
| File / pattern | Why |
|
|
246
|
+
| ----------------------------------------------- | ------------------------------------------------------------------------------------- |
|
|
247
|
+
| `import en from "./locales/en.json"` और friends | Adapter द्वारा केवल फॉलबैक के रूप में उपयोग किया जाता है। यह वह जगह है जहां 88 KB था |
|
|
248
|
+
| `setLocaleMessage()` in router guards | No-op। प्रति-route लोडिंग अब compiler का काम है |
|
|
249
|
+
| `@intlify/unplugin-vue-i18n` | आवश्यक नहीं: यह messages को precompile करता है और SFC blocks को adapter नहीं पढ़ता है |
|
|
250
|
+
| SFC `<i18n>` ब्लॉक्स | पढ़े नहीं जाते; उन्हें locale JSON या प्रति component `.content.ts` में ले जाएं |
|
|
251
|
+
|
|
252
|
+
### आप बाइट्स से परे क्या हासिल करते हैं
|
|
253
|
+
|
|
254
|
+
- **Typed keys।** `t("footer.github")` को compiled `footer` dictionary के विरुद्ध type किया जाता है; एक गलत path TypeScript error है जो key को text के रूप में rendered करने के बजाय।
|
|
255
|
+
- **`npx intlayer test`** किसी भी locale में एक missing key पर CI को विफल करता है। **`npx intlayer fill`** missing ones को आपके own provider key (OpenAI, Anthropic, Mistral, Gemini...) से translate करता है और उन्हें `locales/{locale}.json` में वापस लिखता है।
|
|
256
|
+
- **Visual Editor और CMS** एक ही JSON पर operate करते हैं, इसलिए non-developers एक UI के माध्यम से edit करते हैं और files update हो जाती हैं।
|
|
257
|
+
- **`.content.ts` में incremental move करें।** कोई भी component `useI18n()` से `useIntlayer("footer")` में switch कर सकता है एक co-located content file के साथ। JSON और `.content.ts` dictionaries coexist करते हैं और merge होते हैं।
|
|
258
|
+
|
|
259
|
+
## शुरू करने से पहले जानने योग्य सीमाएं
|
|
260
|
+
|
|
261
|
+
- **SFC `<i18n>` blocks को read नहीं किया जाता है।** यदि आपके messages components के अंदर हैं, तो उन्हें locale files में move करने की आवश्यकता है (या `.content.ts` में, जो types के साथ एक ही विचार है)।
|
|
262
|
+
- **Runtime message loading gone है।** `setLocaleMessage()` और `mergeLocaleMessage()` warn करते हैं और return करते हैं। Runtime पर CMS से fetch किए गए translations को Intlayer के CMS की आवश्यकता है, या `intlayer pull` / `push` commands की।
|
|
263
|
+
- **`messages` एक fallback है, free नहीं है।** `createI18n()` में JSON imports को रखने से bundle में 75 KB रहता है। एक बार `intlayer test` pass होने के बाद उन्हें delete करें।
|
|
264
|
+
- **adapter native runtime नहीं है।** `vue-intlayer` के लिए 3.9 KB के मुकाबले 7.9 KB। एक बार जब हर component `useIntlayer` पर चला गया हो, तो इसे छोड़ दें।
|
|
265
|
+
|
|
266
|
+
## कौन सा कब उपयोग करें?
|
|
267
|
+
|
|
268
|
+
- **`vue-i18n` पर बने रहें** यदि आपका app SFC `<i18n>` blocks पर निर्भर करता है, runtime `setLocaleMessage()` flows पर, या यदि 90 KB प्रति page आपके audience के लिए चिंता का विषय नहीं है।
|
|
269
|
+
- **`@intlayer/vue-i18n` का उपयोग करें** यदि आप `vue-i18n` पर हैं और 88 KB, 23x छोटे components, 0% page leakage, typed keys और CI checks चाहते हैं बिना किसी `.vue` file को edit किए। यह एक existing `vue-i18n` codebase के लिए entry point है।
|
|
270
|
+
- **Native पर जाएं (`vue-intlayer`)** नई projects के लिए, या एक बार adapter ने अपना काम कर दिया हो। इसके पास सबसे हल्का runtime (3.9 KB) और per-component `.content.ts` model है जो `<i18n>` blocks को typed content से replace करता है।
|
|
271
|
+
|
|
272
|
+
## संबंधित तुलनाएं
|
|
273
|
+
|
|
274
|
+
- [vue-i18n vs Intlayer](https://intlayer.org/blog/vue-i18n-vs-intlayer) (features और DX)
|
|
275
|
+
- [vue-i18n vs Intlayer benchmark](https://intlayer.org/blog/vue-i18n-vs-intlayer-benchmark) (libraries, same benchmark)
|
|
276
|
+
- [next-intl vs @intlayer/next-intl](https://intlayer.org/blog/next-intl-vs-intlayer-next-intl) (same adapter series)
|
|
277
|
+
- [i18next vs @intlayer/i18next](https://intlayer.org/blog/i18next-vs-intlayer-i18next) (same adapter series)
|
|
278
|
+
- [Lingui vs @intlayer/lingui](https://intlayer.org/blog/lingui-vs-intlayer-lingui) (same adapter series)
|
|
279
|
+
- [Migration guide: vue-i18n to Intlayer](https://intlayer.org/doc/migration/vue-i18n)
|
|
280
|
+
- [Compat adapter reference: vue-i18n](https://intlayer.org/doc/compatibility/vue-i18n), [Nuxt i18n](https://intlayer.org/doc/compatibility/nuxtjs-i18n)
|
|
281
|
+
|
|
282
|
+
## निष्कर्ष
|
|
283
|
+
|
|
284
|
+
`@intlayer/vue-i18n` `useI18n()` को जो है उससे बदलता है: एक global instance जो हर locale के हर message को hold करता है से एक dictionary में जो उस component के लिए compile है। Vite + Vue 3 app के **88 KB कम प्रति पृष्ठ**, **3x छोटा runtime**, **23x छोटे components** और **0% पृष्ठ leakage** के साथ, एक config file, एक plugin line और एक deleted import के लिए। SFC `<i18n>` blocks और runtime message loading ये दो चीजें हैं जो यह carry नहीं करता, और native `vue-intlayer` runtime अपने आकार का आधा रहता है।
|
|
285
|
+
|
|
286
|
+
[Benchmark Bloom repository](https://github.com/intlayer-org/benchmark-bloom) में सभी raw data, test apps और scripts हैं। इसे अपने आप चलाएं।
|
|
287
|
+
|
|
288
|
+
अधिक विवरण के लिए ['Why Intlayer?' doc](https://intlayer.org/doc/why) देखें।
|
|
File without changes
|
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
---
|
|
2
|
+
createdAt: 2026-09-09
|
|
3
|
+
updatedAt: 2026-09-10
|
|
4
|
+
title: "Sejarah i18n JavaScript: Dari 2011 hingga 2026"
|
|
5
|
+
description: Pelajari evolusi internasionalisasi frontend dari tahun 2011 hingga 2026. Temukan tanggal rilis, tantangan arsitektur, dan inovasi utama di React, Vue, Next.js, Angular, Svelte, dan Solid.
|
|
6
|
+
keywords:
|
|
7
|
+
- sejarah i18n
|
|
8
|
+
- internasionalisasi 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
|
+
# Sejarah Internasionalisasi JavaScript (i18n)
|
|
24
|
+
|
|
25
|
+
Internasionalisasi bukanlah hal baru. Jauh sebelum JavaScript dan web modern hadir, perangkat lunak sudah harus menangani berbagai bahasa, mata uang, format tanggal, dan konvensi regional. Sistem operasi grafis awal seperti GEM dan Mac OS telah memecahkan banyak masalah ini sejak tahun 1980-an.
|
|
26
|
+
|
|
27
|
+
Konsep yang sama akhirnya diadopsi oleh framework backend. Ruby on Rails, Django, framework Java, dan aplikasi PHP masing-masing mengembangkan pendekatan internasionalisasi mereka sendiri. Masalah dasarnya sudah cukup dipahami dengan baik:
|
|
28
|
+
|
|
29
|
+
- Di mana terjemahan harus disimpan?
|
|
30
|
+
- Bagaimana kita memformat tanggal, angka, dan mata uang?
|
|
31
|
+
- Bagaimana kita menangani bentuk jamak dan perbedaan tata bahasa?
|
|
32
|
+
- Bagaimana kita menentukan bahasa mana yang harus dilihat pengguna?
|
|
33
|
+
|
|
34
|
+
Ketika server me-render halaman, prosesnya relatif mudah. Aplikasi dapat memuat terjemahan yang sesuai, me-render HTML, dan mengirimkan hasilnya ke browser.
|
|
35
|
+
|
|
36
|
+
> Perhatikan bahwa PHP dan GNU gettext merupakan cikal bakal pola helper `t()` yang kemudian menjadi standar di JavaScript dan JSX.
|
|
37
|
+
|
|
38
|
+
Kemudian JavaScript mulai mengambil alih browser.
|
|
39
|
+
|
|
40
|
+
Ketika aplikasi beralih dari halaman yang di-render server ke aplikasi client-side yang semakin kompleks, internasionalisasi juga menjadi tantangan di frontend. Tiba-tiba, browser harus memuat terjemahan, beralih bahasa, memformat nilai, menangani bentuk jamak, dan memperbarui UI tanpa memuat ulang halaman.
|
|
41
|
+
|
|
42
|
+
Dan itu memunculkan pertanyaan baru:
|
|
43
|
+
|
|
44
|
+
**Bagaimana cara membuat aplikasi multibahasa tanpa mengirimkan data terjemahan dan kode runtime dalam jumlah besar ke setiap pengguna?**
|
|
45
|
+
|
|
46
|
+
Pertanyaan tersebut telah membentuk arah pengembangan JavaScript i18n selama lebih dari satu dekade.
|
|
47
|
+
|
|
48
|
+
Solusinya telah banyak berubah. Kita beralih dari objek global JavaScript dan pemanggilan `t('some.key')`, ke pustaka khusus framework, ekstraksi waktu kompilasi (compile-time), tipe yang dibuat oleh TypeScript, komponen server, tree-shaking, hingga pendekatan berbasis compiler di mana terjemahan diubah menjadi kode JavaScript selama proses build.
|
|
49
|
+
|
|
50
|
+
Artikel ini mengulas evolusi tersebut dari sekitar tahun 2011 hingga 2026: apa yang dicoba diselesaikan oleh setiap generasi alat, apa yang berhasil, apa yang tidak, dan bagaimana arsitektur aplikasi frontend memengaruhi cara kita menangani i18n saat ini.
|
|
51
|
+
|
|
52
|
+

|
|
53
|
+
|
|
54
|
+
## Daftar Isi
|
|
55
|
+
|
|
56
|
+
<TOC/>
|
|
57
|
+
|
|
58
|
+
## Era Web Awal: Internasionalisasi JavaScript Sebelum 2016
|
|
59
|
+
|
|
60
|
+
Untuk memahami posisi alat i18n modern saat ini, kita perlu melihat kembali bagaimana rasanya membangun aplikasi web antara tahun 2011 dan 2015.
|
|
61
|
+
|
|
62
|
+
### Migrasi Logika ke Client
|
|
63
|
+
|
|
64
|
+
Pada awal dekade 2010-an, internasionalisasi sebagian besar merupakan tanggung jawab sisi server. JavaScript umumnya hanya berfungsi sebagai lapisan tambahan untuk animasi, validasi formulir, dan widget DOM sederhana melalui jQuery.
|
|
65
|
+
|
|
66
|
+
Seiring meningkatnya popularitas Single-Page Applications (SPA) dengan Backbone.js, Knockout.js, dan versi awal AngularJS, logika rendering berpindah langsung ke browser. Kode client-side tiba-tiba perlu menampilkan tanggal lokal, memformat mata uang, menangani bentuk jamak, dan menukar teks secara dinamis tanpa refresh halaman penuh.
|
|
67
|
+
|
|
68
|
+
Namun lingkungan browser pada tahun 2011 belum siap menghadapi tantangan ini:
|
|
69
|
+
|
|
70
|
+
<AccordionGroup>
|
|
71
|
+
<Accordion header="Tidak ada API internasionalisasi bawaan">
|
|
72
|
+
|
|
73
|
+
Spesifikasi ECMAScript Internationalization API (ECMA-402) baru diselesaikan pada Desember 2012, memperkenalkan objek global `Intl`. Sebelum vendor browser mengadopsi `Intl`, pemformatan tanggal dan angka paling mendasar sekalipun memerlukan fungsi kustom atau polyfill yang berat.
|
|
74
|
+
|
|
75
|
+
</Accordion>
|
|
76
|
+
<Accordion header="Belum ada bundler modul modern">
|
|
77
|
+
|
|
78
|
+
Alat seperti Webpack masih dalam tahap awal, dan ESM belum didukung langsung di browser. Pengembang memuat skrip melalui tag `<script>`, sering kali menyuntikkan terjemahan ke dalam objek global seperti `window.translations = { ... }`.
|
|
79
|
+
|
|
80
|
+
</Accordion>
|
|
81
|
+
<Accordion header="Payload JSON monolitik">
|
|
82
|
+
|
|
83
|
+
Terjemahan ditulis dalam file JSON terpusat yang sangat besar. Seorang pengguna di Tokyo yang membuka halaman beranda tetap mengunduh string untuk pengaturan akun, panel penagihan, dan dasbor admin.
|
|
84
|
+
|
|
85
|
+
</Accordion>
|
|
86
|
+
</AccordionGroup>
|
|
87
|
+
|
|
88
|
+
### Gelombang Pertama Pustaka Client-Side
|
|
89
|
+
|
|
90
|
+
Antara tahun 2012 dan 2015, fondasi awal i18n JavaScript modern mulai dibangun:
|
|
91
|
+
|
|
92
|
+
<AccordionGroup>
|
|
93
|
+
<Accordion header="i18next (Januari 2012)">
|
|
94
|
+
|
|
95
|
+
Diciptakan oleh Jan Mühlemann, `i18next` menetapkan cetak biru untuk kamus key-value runtime di JavaScript. Pustaka ini memperkenalkan penelusuran kunci, interpolasi variabel, aturan pluralisasi, serta arsitektur yang dapat diperluas untuk detektor bahasa dan backend. Pustaka ini segera menjadi standar di vanilla JS dan backend awal Node.js.
|
|
96
|
+
|
|
97
|
+
</Accordion>
|
|
98
|
+
<Accordion header="vue-i18n (Mei 2014)">
|
|
99
|
+
|
|
100
|
+
Diciptakan oleh Kazupon (Kazuya Kawaguchi), `vue-i18n` mengadaptasi internasionalisasi langsung ke model data-binding reaktif Vue.js, memperkenalkan direktif template (`v-t`) dan helper `$t()`.
|
|
101
|
+
|
|
102
|
+
</Accordion>
|
|
103
|
+
<Accordion header="react-intl (Juni 2014)">
|
|
104
|
+
|
|
105
|
+
Diciptakan oleh Yahoo! sebagai bagian dari proyek FormatJS, `react-intl` membawa standar ICU MessageFormat dan API browser `Intl` ke React melalui komponen deklaratif seperti `<FormattedMessage>` dan `<FormattedDate>`.
|
|
106
|
+
|
|
107
|
+
</Accordion>
|
|
108
|
+
<Accordion header="react-i18next (Desember 2015)">
|
|
109
|
+
|
|
110
|
+
Jan Mühlemann membawa `i18next` ke komunitas React yang berkembang pesat, memanfaatkan Higher-Order Components (`withTranslation`) dan React context untuk me-render ulang komponen saat terjadi pergantian bahasa.
|
|
111
|
+
|
|
112
|
+
</Accordion>
|
|
113
|
+
</AccordionGroup>
|
|
114
|
+
|
|
115
|
+
### Keterbatasan Era Pra-2016
|
|
116
|
+
|
|
117
|
+
Meskipun alat-alat ini memungkinkan aplikasi client multibahasa, kendala arsitektur pada era tersebut menimbulkan masalah berkelanjutan:
|
|
118
|
+
|
|
119
|
+
<AccordionGroup>
|
|
120
|
+
<Accordion header="Kunci String yang Rapuh">
|
|
121
|
+
|
|
122
|
+
Pencarian seperti `t('marketing.landing.hero.cta')` tidak menyediakan verifikasi statis. Kesalahan ketik pada kunci gagal secara diam-diam di lingkungan produksi, menampilkan teks kosong atau ID kunci mentah kepada pengguna akhir.
|
|
123
|
+
|
|
124
|
+
</Accordion>
|
|
125
|
+
<Accordion header="Beban Parsing Runtime">
|
|
126
|
+
|
|
127
|
+
Mem-parsing sintaks pesan ICU dan mengevaluasi interpolasi berbasis regex saat runtime menghabiskan siklus CPU pada perangkat seluler.
|
|
128
|
+
|
|
129
|
+
</Accordion>
|
|
130
|
+
<Accordion header="Ukuran Bundle yang Membengkak">
|
|
131
|
+
|
|
132
|
+
Tanpa pemisahan kode berbasis rute atau komponen, semua string terlokalisasi dimuat sekaligus, memperlambat metrik pemuatan halaman awal.
|
|
133
|
+
|
|
134
|
+
</Accordion>
|
|
135
|
+
<Accordion header="Jarak antara Pengembang dan Penerjemah">
|
|
136
|
+
|
|
137
|
+
Kamus disimpan dalam file JSON terpusat yang jauh dari komponen yang menampilkannya, menyebabkan kunci terbengkalai dan terjemahan yang hilang menjadi hal yang biasa.
|
|
138
|
+
|
|
139
|
+
</Accordion>
|
|
140
|
+
</AccordionGroup>
|
|
141
|
+
|
|
142
|
+
## Era Framework: Evolusi di Berbagai Ekosistem
|
|
143
|
+
|
|
144
|
+
Antara tahun 2016 dan 2026, arsitektur frontend berubah secara mendasar. TypeScript menjadi standar industri, arsitektur berbasis komponen semakin matang, bundler seperti Webpack, Vite, dan Turbopack memperkenalkan code-splitting, React Server Components mengembalikan rendering ke server, dan compiler mulai menganalisis kode aplikasi.
|
|
145
|
+
|
|
146
|
+
Tab berikut menyajikan bagaimana setiap framework dan ekosistem menjawab tantangan ini, mendokumentasikan tanggal rilis, motivasi utama, dan inovasi penting dalam tabel perbandingan. Di seluruh ekosistem ini, `react-intlayer` dan seluruh padanannya (`next-intlayer`, `vue-intlayer`, `angular-intlayer`, `svelte-intlayer`, dan `solid-intlayer`) merupakan implementasi berkinerja tinggi yang dirancang khusus untuk lingkungan runtime masing-masing.
|
|
147
|
+
|
|
148
|
+
<Tabs>
|
|
149
|
+
|
|
150
|
+
<Tab label="Core JavaScript" value="javascript">
|
|
151
|
+
|
|
152
|
+
| Rilis Pertama | Pustaka | Masalah yang Ingin Dipecahkan | Inovasi Utama |
|
|
153
|
+
| ------------- | ------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
154
|
+
| Januari 2012 | `i18next` | Menstandarisasi pencarian kamus runtime untuk browser dan Node.js tanpa keterikatan framework. | Arsitektur runtime modular yang memisahkan terjemahan inti dari pemuat, detektor, dan caching. |
|
|
155
|
+
| Februari 2021 | `typesafe-i18n` | Mencegah kesalahan runtime diam-diam akibat kunci string tanpa tipe data. | Fungsi terjemahan bertipe penuh yang dibuat langsung dari objek terjemahan tanpa dependensi runtime. |
|
|
156
|
+
| Oktober 2023 | `paraglide` (`@inlang/paraglide-js`) | Menghilangkan pencarian kamus runtime, parser berat, dan pembengkakan ukuran bundle. | Mengompilasi pesan menjadi modul ECMAScript yang mendukung tree-shaking dan fungsi JS murni. |
|
|
157
|
+
| April 2024 | `intlayer` | Menggantikan namespace yang sulit dipelihara, menghindari kebocoran konten antarhalaman, dan menyelesaikan kurangnya keamanan tipe bawaan di era TypeScript. | Menempatkan file `.content` langsung di tempat fungsi dipanggil, membuat tipe TypeScript otomatis, serta menyediakan CMS visual dan alat CLI terjemahan AI bawaan. |
|
|
158
|
+
| Juni 2025 | `wuchale` | Menghilangkan kerumitan mengekstrak string teks secara manual dan membuat kunci terjemahan saat pengembangan. | Pra-pemrosesan tingkat AST yang mendeteksi teks inline dan mengompilasinya menjadi fungsi lokal tanpa wrapper saat build. |
|
|
159
|
+
|
|
160
|
+
</Tab>
|
|
161
|
+
|
|
162
|
+
<Tab label="React" value="react">
|
|
163
|
+
|
|
164
|
+
| Rilis Pertama | Pustaka | Masalah yang Ingin Dipecahkan | Inovasi Utama |
|
|
165
|
+
| ------------- | ---------------- | --------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
166
|
+
| Juni 2014 | `react-intl` | Menstandarisasi pemformatan angka, tanggal, mata uang, dan jamak kompleks di React. | Komponen deklaratif (`<FormattedMessage>`, `<FormattedDate>`) yang mengimplementasikan standar ICU MessageFormat dan ECMA-402. |
|
|
167
|
+
| Desember 2015 | `react-i18next` | Menyediakan binding React yang idiomatis untuk `i18next` dengan rendering ulang reaktif. | Berkembang bersama React dari Higher-Order Components ke interpolasi JSX `<Trans>` dan hook `useTranslation`. |
|
|
168
|
+
| Januari 2018 | `@lingui/react` | Mengurangi penalti ukuran bundle JavaScript yang disebabkan oleh parser ICU runtime. | Makro Babel/SWC waktu kompilasi yang menyusun `<Trans>` dan `t` menjadi array terindeks yang ringkas saat build. |
|
|
169
|
+
| Desember 2020 | `use-intl` | Memberikan alternatif ringan, berbasis hook, dan aman secara tipe untuk pustaka i18n React tradisional. | Hook ergonomis `useTranslations` dan `useFormatter` dengan integrasi TypeScript yang mendalam. |
|
|
170
|
+
| Februari 2021 | `@tolgee/react` | Menghilangkan siklus umpan balik yang lambat antara pengembang, penerjemah, dan desainer. | Pengeditan kontekstual di browser yang memungkinkan pengguna menekan Alt-klik pada teks untuk mengedit langsung dan mengambil screenshot. |
|
|
171
|
+
| April 2024 | `react-intlayer` | Menyediakan implementasi Intlayer berkinerja tinggi untuk siklus hidup React, meniadakan kamus JSON terpusat dan namespace rumit. | Hook `useIntlayer` yang dioptimalkan untuk rendering React, tipe TypeScript otomatis, tree-shaking per komponen, dan sinkronisasi CMS visual langsung. |
|
|
172
|
+
| Juli 2024 | `gt-react` | Mengotomatiskan ekspor file manual, serah terima penerjemah, dan pemeliharaan terjemahan. | Lokalisasi AI otomatis cloud-native langsung di dalam komponen React dengan jalur terjemahan mesin. |
|
|
173
|
+
| Agustus 2025 | `@wuchale/jsx` | Menghilangkan penamaan kunci manual dan boilerplate hook terjemahan dalam JSX React. | Transformasi AST yang mengekstrak node teks JSX mentah secara otomatis dan mengompilasinya menjadi bentuk lokal. |
|
|
174
|
+
|
|
175
|
+
</Tab>
|
|
176
|
+
|
|
177
|
+
<Tab label="Next.js" value="nextjs">
|
|
178
|
+
|
|
179
|
+
| Rilis Pertama | Pustaka | Masalah yang Ingin Dipecahkan | Inovasi Utama |
|
|
180
|
+
| -------------- | ------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
181
|
+
| November 2018 | `next-i18next` | Mendukung SSR dan SSG dengan `i18next` di Next.js Pages Router tanpa request waterfall di client. | `serverSideTranslations` dan `appWithTranslation` meneruskan namespace lokal ke page props. |
|
|
182
|
+
| Desember 2019 | `next-translate` | Menyederhanakan konfigurasi dan mengurangi bobot bundle pada aplikasi Next.js Pages Router. | Plugin Webpack loader yang menyuntikkan hanya namespace terjemahan yang diperlukan per halaman secara otomatis. |
|
|
183
|
+
| November 2020 | `next-intl` | Merancang ulang i18n Next.js untuk App Router, React Server Components (RSC), dan streaming SSR. | Integrasi native dengan middleware Next.js App Router, Server Actions, dan Server Components asinkron tanpa JS di client. |
|
|
184
|
+
| Juli 2022 | `next-international` | Memaksimalkan keamanan tipe TypeScript dengan overhead bundle client minimal untuk Next.js. | Pembuatan tipe ketat untuk kunci terjemahan terlingkup dengan adapter ringan untuk App Router dan Pages Router. |
|
|
185
|
+
| April 2024 | `paraglide-next` (`@inlang/paraglide-next`) | Membawa pesan terkompilasi zero-runtime ke Next.js App Router dan Pages Router. | Perutean middleware yang dipadukan dengan fungsi pesan tree-shakable, menghindari parsing JSON runtime di RSC dan bundle client. |
|
|
186
|
+
| April 2024 | `next-intlayer` | Menyediakan adapter Server Component berkinerja tinggi untuk Next.js App Router dan Pages Router tanpa meneruskan `t()` sebagai props. | Adapter Server Component bawaan yang memungkinkan `useIntlayer` dipanggil langsung di komponen server sinkron (seperti Navbar) tanpa prop-drilling, disertai rendering server instan dan CMS visual. |
|
|
187
|
+
| September 2024 | `gt-next` | Mengotomatiskan pembuatan konten multibahasa dan perutean lokal dinamis di Next.js menggunakan AI. | Integrasi App Router yang memadukan terjemahan mesin berbasis cloud dengan edge middleware dan lapisan caching Next.js. |
|
|
188
|
+
|
|
189
|
+
</Tab>
|
|
190
|
+
|
|
191
|
+
<Tab label="Vue & Nuxt" value="vue">
|
|
192
|
+
|
|
193
|
+
| Rilis Pertama | Pustaka | Masalah yang Ingin Dipecahkan | Inovasi Utama |
|
|
194
|
+
| ------------- | -------------- | ----------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
195
|
+
| Mei 2014 | `vue-i18n` | Menyediakan internasionalisasi reaktif dan idiomatis untuk aplikasi Vue. | Integrasi reaktivitas mendalam, direktif template (`v-t`), helper `$t`, dan custom block `<i18n>` pada Single-File Component. |
|
|
196
|
+
| November 2017 | `@nuxt/i18n` | Menangani routing URL lokal, tag SEO hreflang, dan hidrasi SSR di Nuxt. | Modul perutean full-stack yang menghasilkan rute lokal, header meta SEO, dan pemuatan chunk secara lazy. |
|
|
197
|
+
| Agustus 2019 | `fluent-vue` | Menangani gender tata bahasa, kasus gramatikal yang kompleks, dan struktur bahasa asimetris di Vue. | Integrasi sintaks Mozilla Project Fluent di Vue untuk menghindari logika kondisional yang rumit dalam variasi linguistik. |
|
|
198
|
+
| April 2025 | `vue-intlayer` | Menyediakan implementasi Intlayer yang dirancang langsung untuk Vue 3 Composition API dan Nuxt tanpa polusi namespace global. | Composable `useIntlayer` yang disesuaikan untuk pelacakan reaktivitas Vue 3, pelingkupan komponen langsung, autocompletion TypeScript penuh, dan editor visual. |
|
|
199
|
+
|
|
200
|
+
</Tab>
|
|
201
|
+
|
|
202
|
+
<Tab label="Angular" value="angular">
|
|
203
|
+
|
|
204
|
+
| Rilis Pertama | Pustaka | Masalah yang Ingin Dipecahkan | Inovasi Utama |
|
|
205
|
+
| -------------- | ------------------- | ----------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------ |
|
|
206
|
+
| Februari 2017 | `ngx-translate` | Menyediakan terjemahan dinamis saat runtime di Angular tanpa perlu build terpisah untuk setiap bahasa. | `TranslateService` dan pipe `translate` yang memungkinkan pemuatan terjemahan dinamis dan pergantian bahasa runtime. |
|
|
207
|
+
| Juli 2019 | `@ngneat/transloco` | Menyelesaikan masalah performa, ketiadaan scoping, dan fitur yang kurang pada pustaka Angular lama. | Direktif struktural (`*transloco`), terjemahan terlingkup untuk modul lazy-load, dukungan SSR, dan CLI ekstraksi. |
|
|
208
|
+
| September 2019 | `@angular/localize` | Memodernisasi i18n bawaan Angular untuk menghindari kompilasi ulang TypeScript untuk setiap bahasa. | Tagged template literals dengan `$localize` yang disuntikkan sebagai tahap cepat pasca-build di mesin compiler Ivy. |
|
|
209
|
+
| Februari 2021 | `@tolgee/ngx` | Mengintegrasikan lokalisasi in-context kolaboratif dan tangkapan layar ke dalam alur kerja Angular. | Pipe dan direktif Angular yang terhubung langsung ke Tolgee untuk penerjemahan langsung di browser. |
|
|
210
|
+
| April 2025 | `angular-intlayer` | Menyediakan implementasi Intlayer berkinerja tinggi untuk Angular modern (Signals, komponen standalone, dan SSR). | Integrasi konten reaktif berbasis Signal untuk deteksi perubahan modern, injeksi dependensi standalone, dan sinkronisasi CMS visual. |
|
|
211
|
+
|
|
212
|
+
</Tab>
|
|
213
|
+
|
|
214
|
+
<Tab label="Svelte & SvelteKit" value="svelte">
|
|
215
|
+
|
|
216
|
+
| Rilis Pertama | Pustaka | Masalah yang Ingin Dipecahkan | Inovasi Utama |
|
|
217
|
+
| ------------- | ----------------- | -------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------- |
|
|
218
|
+
| Juli 2018 | `svelte-i18n` | Menyediakan pustaka i18n reaktif yang selaras dengan reactive store bawaan Svelte. | Pencarian `$t` berbasis store yang memastikan pembaruan DOM secara presisi saat locale berubah. |
|
|
219
|
+
| Desember 2021 | `sveltekit-i18n` | Menangani pemuatan terjemahan berbasis rute dan SSR secara rapi di aplikasi SvelteKit. | Arsitektur pemuat modular yang hanya mengambil terjemahan dan pemformat yang diperlukan untuk rute aktif. |
|
|
220
|
+
| November 2021 | `@tolgee/svelte` | Mengaktifkan lokalisasi in-context di aplikasi Svelte. | Binding store Svelte yang terintegrasi dengan overlay terjemahan Tolgee di browser dan pembuatan screenshot otomatis. |
|
|
221
|
+
| April 2025 | `svelte-intlayer` | Menyediakan implementasi Intlayer berkinerja tinggi untuk Svelte 5 dan SvelteKit. | Binding konten reaktif yang disesuaikan untuk Svelte 5 Runes (`$state`), deklarasi `.content` per komponen, dan pengeditan CMS visual. |
|
|
222
|
+
| Juli 2025 | `@wuchale/svelte` | Menghilangkan boilerplate deklarasi kamus dan impor fungsi `$t` di komponen Svelte. | Preprocessor Svelte yang mem-parsing template saat build dan menyusun node teks menjadi output lokal tanpa wrapper. |
|
|
223
|
+
|
|
224
|
+
</Tab>
|
|
225
|
+
|
|
226
|
+
<Tab label="SolidJS" value="solid">
|
|
227
|
+
|
|
228
|
+
| Rilis Pertama | Pustaka | Masalah yang Ingin Dipecahkan | Inovasi Utama |
|
|
229
|
+
| -------------- | ------------------------ | ------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------- |
|
|
230
|
+
| September 2021 | `@solid-primitives/i18n` | Menyediakan primitif i18n yang sesuai dengan reaktivitas halus (fine-grained) SolidJS. | Resolver terjemahan reaktif berbasis sinyal yang memperbarui node DOM tanpa virtual DOM atau re-render yang tidak perlu. |
|
|
231
|
+
| April 2025 | `solid-intlayer` | Menyediakan implementasi Intlayer berkinerja tinggi yang dirancang untuk SolidJS dan SolidStart. | Binding konten sadar sinyal tanpa overhead Virtual DOM, autokompleksi skema TypeScript penuh, dan integrasi editor visual. |
|
|
232
|
+
| Juni 2026 | `@lingui/solid` | Memperluas ekstraksi makro waktu kompilasi dan dukungan ICU MessageFormat ke SolidJS. | Transformasi makro yang disesuaikan dengan reaktivitas Solid, mengompilasi pesan menjadi struktur runtime yang ringkas. |
|
|
233
|
+
|
|
234
|
+
</Tab>
|
|
235
|
+
|
|
236
|
+
</Tabs>
|
|
237
|
+
|
|
238
|
+
## Empat Era Arsitektur JavaScript i18n
|
|
239
|
+
|
|
240
|
+

|
|
241
|
+
|
|
242
|
+
Melihat kembali perkembangan selama lima belas tahun, kita dapat membagi sejarah internasionalisasi JavaScript ke dalam empat era arsitektur:
|
|
243
|
+
|
|
244
|
+
<AccordionGroup>
|
|
245
|
+
<Accordion header="1. Era Kamus Runtime (2011 hingga 2017)">
|
|
246
|
+
|
|
247
|
+
Ditandai oleh `i18next`, `react-intl`, dan `vue-i18n`. Aplikasi memuat katalog JSON statis ke memori, dan fungsi runtime mencocokkan string kunci dengan objek bersarang. Pluralisasi dan interpolasi diproses di browser melalui pencocokan regex dan parser ICU runtime.
|
|
248
|
+
|
|
249
|
+
</Accordion>
|
|
250
|
+
<Accordion header="2. Era Makro Waktu Kompilasi dan Type Safety (2018 hingga 2021)">
|
|
251
|
+
|
|
252
|
+
Ditandai oleh `lingui`, `next-translate`, `transloco`, dan `typesafe-i18n`. Pengembang menyadari dampak buruk parsing runtime terhadap kinerja serta kelemahan kunci tanpa tipe data. Makro Babel mengekstrak pesan saat build, plugin bundler membagi kamus per halaman, dan compiler TypeScript mulai memverifikasi argumen terjemahan.
|
|
253
|
+
|
|
254
|
+
</Accordion>
|
|
255
|
+
<Accordion header="3. Era Server Component dan Streaming (2022 hingga 2024)">
|
|
256
|
+
|
|
257
|
+
Ditandai oleh `next-intl`, `next-international`, dan adapter RSC generasi awal. Dengan hadirnya React Server Components dan Next.js App Router, fokus beralih ke rendering konten lokal di server tanpa mengirimkan kamus terjemahan atau runtime i18n client ke browser.
|
|
258
|
+
|
|
259
|
+
</Accordion>
|
|
260
|
+
<Accordion header="4. Era Kompiler Modern dan Konten Terpadu (2024 hingga 2026)">
|
|
261
|
+
|
|
262
|
+
Ditandai oleh `paraglide`, `intlayer`, dan `wuchale`. Alat-alat modern memandang internasionalisasi bukan sekadar penggantian teks, melainkan sebagai arsitektur konten yang terintegrasi. Kompiler mengubah pesan langsung menjadi fungsi kode yang mendukung tree-shaking, deklarasi konten ditempatkan bersama komponen, dan editor visual, alat MCP, serta jalur otomatisasi AI terintegrasi langsung ke alur kerja pengembang. Dalam model ini, Intlayer memisahkan deklarasi konten dan pembuatan tipe otomatis dari pengiriman runtime, menyediakan implementasi berkinerja tinggi (`react-intlayer`, `next-intlayer`, `vue-intlayer`, `angular-intlayer`, `svelte-intlayer`, dan `solid-intlayer`) yang disesuaikan secara khusus untuk setiap framework.
|
|
263
|
+
|
|
264
|
+
</Accordion>
|
|
265
|
+
</AccordionGroup>
|
|
266
|
+
|
|
267
|
+
## Kesimpulan: Menyeimbangkan DX, Performa, dan Disrupsi AI
|
|
268
|
+
|
|
269
|
+
Selama lima belas tahun dan empat gelombang arsitektur, tantangan utama internasionalisasi JavaScript tetap konsisten: menyelaraskan pengalaman pengembang (DX) dan pemeliharaan kode jangka panjang sambil menyajikan kinerja optimal di sisi klien.
|
|
270
|
+
|
|
271
|
+
Apa yang berawal dari variabel global dan file JSON terpusat yang sulit dikelola kini telah berkembang menjadi konten yang ditempatkan bersama komponen, keamanan tipe TypeScript otomatis, rendering server tanpa waterfall, dan tree-shaking pada waktu build.
|
|
272
|
+
|
|
273
|
+
### Disrupsi AI dan Model SaaS Tradisional
|
|
274
|
+
|
|
275
|
+
Katalis penting dalam beberapa tahun terakhir adalah pembuatan terjemahan AI otomatis, yang secara mendasar menantang model bisnis platform pelokalan tradisional (TMS).
|
|
276
|
+
|
|
277
|
+
Secara historis, mengumpulkan konten ke dalam file JSON monolitik adalah kompromi untuk mempermudah integrasi Sistem Manajemen Terjemahan (TMS). Repositori terpusat memberi penerjemah non-teknis dan platform TMS pihak ketiga target impor dan ekspor yang mudah. Namun, kemudahan bagi layanan eksternal ini menimbulkan biaya arsitektur yang tinggi bagi pengembang: konflik git merge yang sering terjadi pada feature branch, kunci terabaikan yang sulit dilacak, kurangnya konteks tingkat komponen, dan namespace global yang rumit.
|
|
278
|
+
|
|
279
|
+
Dengan hadirnya AI generatif dan perkakas kompilasi modern, Pengalaman Pengembang (DX) kini menjadi prioritas utama. Build tools dan CLI kini dapat menemukan, memvalidasi, dan menerjemahkan file konten per komponen secara otomatis, meniadakan kebutuhan untuk mengorbankan arsitektur yang bersih demi alur kerja penerjemahan.
|
|
280
|
+
|
|
281
|
+
Selama lebih dari satu dekade, platform komersial membangun pendapatan berulang di sekitar friksi TMS manual tersebut:
|
|
282
|
+
|
|
283
|
+
- Solusi seperti **Locize** (platform SaaS komersial di balik `i18next`) dan **Crowdin** (sponsor utama dan mitra integrasi untuk `vue-i18n`, `next-intl`, `use-intl`, dan `lingui`) memusatkan model bisnis mereka pada penyimpanan terjemahan berbayar, batasan paket bertingkat, dan biaya per kata.
|
|
284
|
+
- Karena platform lawas ini memonetisasi volume dan proses kerja manual, mereka memiliki sedikit insentif ekonomi untuk mengotomatiskan pembuatan terjemahan end-to-end secara gratis langsung di rantai alat pengembang.
|
|
285
|
+
|
|
286
|
+
### Gelombang AI Baru vs. Biaya Penyedia Langsung
|
|
287
|
+
|
|
288
|
+
Ketika Model Bahasa Besar (LLM) modern menurunkan biaya terjemahan hingga pecahan sen sekaligus meningkatkan akurasi linguistik, generasi alat komersial baru muncul untuk memanfaatkan pasar ini:
|
|
289
|
+
|
|
290
|
+
- Platform seperti Paraglide dengan **linguo.dev** atau **General Translation** (`gt-react`, `gt-next`) telah berusaha memanfaatkan tren AI dengan memperkenalkan langganan berbayar baru dan perantara cloud berbayar.
|
|
291
|
+
- Sebaliknya, **Intlayer** menyediakan terjemahan AI otomatis langsung dari CLI-nya, memungkinkan tim menghubungkan kunci API mereka sendiri (seperti OpenAI, Anthropic, Mistral, atau Google Gemini). Tidak ada mark-up, komisi, atau vendor lock-in, beroperasi sepenuhnya pada biaya langsung penyedia AI pilihan Anda.
|
|
292
|
+
|
|
293
|
+
### Lebih dari Sekadar i18n: Sistem Konten Multibahasa yang Lengkap
|
|
294
|
+
|
|
295
|
+
Terakhir, pengembangan web modern telah melangkah jauh melampaui penggantian teks sederhana. Aplikasi saat ini tidak hanya perlu menerjemahkan kata tunggal seperti `"Submit"` atau `"Log In"`, tetapi juga membutuhkan konten terstruktur yang dinamis di seluruh alur interaksi pengguna.
|
|
296
|
+
|
|
297
|
+
Intlayer memandang masalah ini bukan sebagai alat pencarian kunci string yang sempit, melainkan sebagai sistem konten multibahasa yang komprehensif. Dengan dukungan kelas satu untuk dokumen Markdown, struktur HTML, skema data bersarang, dan pengeditan visual CMS yang mulus, Intlayer menjembatani rekayasa tingkat kode, alur kerja AI otomatis, dan manajemen konten.
|
|
298
|
+
|
|
299
|
+
Untuk perbandingan arsitektur lebih mendalam dan panduan migrasi praktis, jelajahi sumber daya berikut:
|
|
300
|
+
|
|
301
|
+
- [Compiler vs. Declarative Internationalization](https://github.com/aymericzip/intlayer/blob/main/docs/blog/id/compiler_vs_declarative_i18n.md)
|
|
302
|
+
- [Per-Component vs. Centralized i18n](https://github.com/aymericzip/intlayer/blob/main/docs/blog/id/per-component_vs_centralized_i18n.md)
|
|
303
|
+
- [Kinerja dan Tolok Ukur](https://intlayer.org/doc/benchmark)
|
|
304
|
+
- [Adapter Kompatibilitas Intlayer](https://intlayer.org/doc/concept/compatibility)
|