@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,286 @@
|
|
|
1
|
+
---
|
|
2
|
+
createdAt: 2026-09-13
|
|
3
|
+
updatedAt: 2026-09-13
|
|
4
|
+
title: "vue-i18n مقابل @intlayer/vue-i18n: نفس الواجهة البرمجية، حزمة مختلفة"
|
|
5
|
+
description: ما الذي يتغير عندما تحتفظ تطبيقات Vue 3 باستدعاءات vue-i18n الخاصة بها لكنها تخدمها من خلال محول التوافق @intlayer/vue-i18n. JavaScript لكل صفحة، حجم وقت التشغيل، حجم المكون والتسرب المقاس على نفس كود Vite + Vue، بالإضافة إلى ما يحتفظ به المحول وما يتجاهله وما لا يمكنه استبداله.
|
|
6
|
+
keywords:
|
|
7
|
+
- vue-i18n
|
|
8
|
+
- "@intlayer/vue-i18n"
|
|
9
|
+
- Intlayer
|
|
10
|
+
- محول التوافق
|
|
11
|
+
- الهجرة
|
|
12
|
+
- الدولية
|
|
13
|
+
- i18n
|
|
14
|
+
- مقارنة الأداء
|
|
15
|
+
- حجم الحزمة
|
|
16
|
+
- مدونة
|
|
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 | نفس الواجهة البرمجية، حزمة مختلفة
|
|
27
|
+
|
|
28
|
+
`@intlayer/vue-i18n` هو محول توافقي: يعرّض واجهة برمجية (API) من `vue-i18n` (`createI18n`، `useI18n`، `t()`، `d()`، `n()`، `$t`، `v-t`، `i18n.global.locale`...) ويقدمها من القواميس المترجمة بواسطة Intlayer. ملفات `.vue` الخاصة بك لا تتغير. ما يرتبط به `t("footer.github")` هو ما يتغير.
|
|
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). هذا يتعلق بما يغيره المحول عندما تحتفظ بمكوناتك كما هي.
|
|
31
|
+
|
|
32
|
+
<TOC/>
|
|
33
|
+
|
|
34
|
+
> **ملخص سريع**: على نفس تطبيق Vite + Vue 3، استبدال `vue-i18n` بـ `@intlayer/vue-i18n` أخذ JavaScript لكل صفحة من **134.9 KB إلى 47.0 KB** gzip (التطبيق بدون i18n يزن 41.3 KB)، وقت التشغيل من **24.3 KB إلى 7.9 KB**، متوسط المكون من **196 KB إلى 8.4 KB**، وتسرب السلاسل النصية للصفحات الأجنبية من **90% إلى 0%**، بدون تعديل أي ملف `.vue`. `createI18n({ messages })` يستمر في العمل كخيار بديل؛ أزل استيراد JSON للحصول على الأرقام أعلاه. كتل SFC `<i18n>` و `setLocaleMessage()` في وقت التشغيل هما الميزتان اللتان لا تنتقلان.
|
|
35
|
+
|
|
36
|
+
## ما هو `@intlayer/vue-i18n`
|
|
37
|
+
|
|
38
|
+
`vue-i18n` هي runtime. `createI18n({ messages: { en, fr, ... } })` تبني instance عام يحتفظ بكل رسالة من كل locale؛ `useI18n()` تربط كل component بها؛ `t("footer.github")` تمشي عبر الشجرة في وقت rendering. هذا التصميم هو ما يجعل SFC `<i18n>` blocks و `setLocaleMessage()` ممكنة، وهو أيضاً السبب في أن dependency graph لكل component يتضمن الشجرة بأكملها.
|
|
39
|
+
|
|
40
|
+
`@intlayer/vue-i18n` تحافظ على API وتستبدل الشجرة:
|
|
41
|
+
|
|
42
|
+
1. **Import aliasing.** `vueI18nVitePlugin()` من `@intlayer/vue-i18n/plugin` تغلف `vite-intlayer` وتضيف `resolve.alias` بحيث أن `vue-i18n` يتم حلها إلى `@intlayer/vue-i18n`. لم يتم إعادة تسمية أي import.
|
|
43
|
+
2. **JSON كمصدر الحقيقة.** يقرأ plugin `syncJSON` ملف `locales/{locale}.json` الموجود لديك باستخدام `format: "vue-i18n"` (لذلك يتم تحليل استيفاء `{name}`، `{0}` list والجمع بين الأنابيب `"car | cars"` بشكل صحيح) ويكتب الترجمات مرة أخرى عندما يحدثها CLI أو CMS.
|
|
44
|
+
3. **ربط موقع الاستدعاء.** تعيد مرحلة تحسين Intlayer كتابة مواقع استدعاء `useI18n()` بحيث يحصل المكون على القواميس الخاصة به مفاتيح الأسماء، في الإعدادات المحلية النشطة، كواردات يمكن للـ bundler تتبعها وتقسيمها.
|
|
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 كيلوبايت إلى 8 كيلوبايت.
|
|
69
|
+
|
|
70
|
+
## ما يحافظ عليه المحول وما يتجاهله وما لا يستبدله
|
|
71
|
+
|
|
72
|
+
| `vue-i18n` API | مع `@intlayer/vue-i18n` |
|
|
73
|
+
| ------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
74
|
+
| `useI18n()` → `{ t, d, n, te, tm, rt, locale, availableLocales }` | ✅ تم الاحتفاظ به. مفاتيح `t` مُكتوبة ضد قاموسك |
|
|
75
|
+
| `t("key", { name })`, `t("key", [a, b])`, `t("key", count)` | ✅ تم الاحتفاظ به. يتم حل `{name}`، `{0}` والجمع الفاصل بينها كما هو الحال من قبل |
|
|
76
|
+
| `d(date, "long")`, `n(value, "currency")` | ✅ تم الاحتفاظ به. يتم احترام `datetimeFormats` / `numberFormats` من `createI18n()`، مدعومة بـ `Intl` الأصلي |
|
|
77
|
+
| `i18n.global.locale.value = "fr"` | ✅ تم الحفاظ عليه. `WritableComputedRef` مدعوم بـ Intlayer الخاص بالعميل؛ التفاعلية تتصرف كما هي |
|
|
78
|
+
| `$t`, `$tc`, `$te`, `$tm`, `$rt`, `$d`, `$n`, `$i18n` (Options API) | ✅ تم الحفاظ عليه. تم تسجيله على `app.config.globalProperties` بواسطة `app.use(i18n)` |
|
|
79
|
+
| `v-t` directive | ✅ تم الحفاظ عليه |
|
|
80
|
+
| `legacy: true` | ✅ مقبول |
|
|
81
|
+
| `createI18n({ messages })` | ⚠️ يتم استخدام `messages` كـ **fallback في وقت التشغيل** مع تحذير في بيئة التطوير. قم بإزالة استيرادات JSON للحصول على مكاسب في حجم الحزمة |
|
|
82
|
+
| `setLocaleMessage()`, `mergeLocaleMessage()` | ❌ تحذير وعدم القيام بأي شيء. يتم استبدال تحميل الرسائل في وقت التشغيل بقواميس build-time |
|
|
83
|
+
| كتل `<i18n>` المخصصة في SFC | ❌ لا يتم قراءتها. انقل تلك الرسائل إلى JSON اللغة (أو `.content.ts` بجانب المكون) |
|
|
84
|
+
| `@nuxtjs/i18n` | ⚠️ محول منفصل، انظر [وثائق توافق Nuxt](https://intlayer.org/doc/compatibility/nuxtjs-i18n) |
|
|
85
|
+
|
|
86
|
+
## المعايير
|
|
87
|
+
|
|
88
|
+
### ما تم قياسه
|
|
89
|
+
|
|
90
|
+
تبني مجموعة [Benchmark Bloom](https://github.com/intlayer-org/benchmark-bloom) **نفس تطبيق Vite + Vue 3** مع كل إعداد: **10 صفحات** (الرئيسية، حول، مدونة، الوظائف، اتصل، الأسئلة الشائعة، التسعير، المنتجات، الإعدادات، الفريق)، **10 لغات** (`en`، `fr`، `es`، `de`، `it`، `pt`، `zh`، `ja`، `ko`، `ru`)، مكونات متطابقة وأمتعة متطابقة. تُقاس الصفحات في `en` و `fr`.
|
|
91
|
+
|
|
92
|
+
تم بناء كليهما في **الإعداد الثابت**، الذي تشحنه معظم مشاريع Vue: بالنسبة لـ `vue-i18n`، يتم استيراد JSON لكل لغة وتمريره إلى `createI18n({ messages })`؛ بالنسبة للمحول، نفس المكونات مع تغيير `vite.config.ts` و `intlayer.config.ts` وإزالة استيراد `messages`. يتم تضمين `vue-intlayer` الأصلي للمرجع.
|
|
93
|
+
|
|
94
|
+
لكل بناء، تسجل المجموعة:
|
|
95
|
+
|
|
96
|
+
- **حجم المكتبة**: حجم gzip (والمصغر) لمكون فارغ يستورد فقط مكتبة i18n.
|
|
97
|
+
- **صفحة JS**: JavaScript بصيغة gzip يتم تنزيله لكل صفحة، بمتوسط على جميع الصفحات والإعدادات المحلية.
|
|
98
|
+
- **تسرب الإعدادات المحلية %**: حصة السلاسل المترجمة في JavaScript المُنزَّل التي تنتمي إلى إعداد محلي لا يعرضه المستخدم.
|
|
99
|
+
- **تسرب الصفحة %**: حصة السلاسل المترجمة في JavaScript المُنزَّل التي تنتمي إلى صفحة لا يوجد عليها المستخدم.
|
|
100
|
+
- **متوسط المكون**: متوسط حجم gzip لكل مكون تم تجميعه بشكل منفصل.
|
|
101
|
+
- **تفاعلية E2E**: وقت الساعة الحائط بين تحديد إعداد محلي جديد وتحديث `html[lang]` في DOM (Playwright، 5 تكرارات).
|
|
102
|
+
- **تحميل الصفحة**: `PerformanceNavigationTiming.duration`.
|
|
103
|
+
|
|
104
|
+
> الأرقام أدناه تأتي من التشغيل بتاريخ **2026-09-12** مع `vue-i18n` 11.4.0 و `@intlayer/vue-i18n` 9.5.1. تطبيق الاختبار صغير عن قصد (عدة عشرات من السلاسل النصية لكل locale)، لذا فإن نسب تسرب الـ locale تصف **نمطًا**: فهي تزداد مع محتواك بينما تبقى تكلفة التشغيل ثابتة.
|
|
105
|
+
|
|
106
|
+
### النتائج على Vite + Vue 3
|
|
107
|
+
|
|
108
|
+
| الإعداد | الإستراتيجية | حجم المكتبة (gz) | حجم المكتبة (min) | متوسط صفحة JS (gz) | تسرب Locale | تسرب الصفحة | متوسط المكون (gz) | استجابة E2E | تحميل الصفحة |
|
|
109
|
+
| ------------------------ | ------------ | ---------------: | ----------------: | -----------------: | ----------: | ----------: | ----------------: | ----------: | -----------: |
|
|
110
|
+
| **base** (no 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
|
+
> عمود تسرب الصفحة في تطبيق الأساس مترك فارغاً: بدون مكتبة i18n، يلتقط بصمة الأصابع السلاسل المشفرة في الأجزاء المشتركة والرقم ليس ذا معنى.
|
|
117
|
+
|
|
118
|
+
**كيفية قراءته**
|
|
119
|
+
|
|
120
|
+
- **88 KB أقل لكل صفحة، نفس المكونات.** يأخذ `vue-i18n` تطبيق 41.3 KB إلى **134.9 KB**. يصل بناء المحول للمكونات نفسها إلى **47.0 KB**، 5.7 KB فوق تطبيق الأساس. معظم الفرق هو 74.9 KB من `src/locales` التي يسحبها `createI18n({ messages })` إلى كل صفحة والمحول لا يجمعها أبداً كتكتل.
|
|
121
|
+
- **Runtime ينكمش 3 مرات.** مكون فارغ يستورد فقط `vue-i18n` يكلف **24.3 KB gzip / 83.2 KB minified**: `@intlify/core-base`، مترجم الرسائل والـ runtime. المحول يكلف **7.9 KB / 23.2 KB**، معظمها نواة Intlayer بالإضافة إلى سطح API `vue-i18n`.
|
|
122
|
+
- **المكونات: أصغر 23 مرة.** مكون `useI18n()` مترجم بشكل معزول يبلغ متوسطه **196 KB**، لأن `t` مرتبط بالمثيل الذي يحتفظ بكل رسالة من كل locale. مع المحول، نفس المكون يبلغ متوسطه **8.4 KB**: فهو يصل إلى قاموسه الخاص.
|
|
123
|
+
- **تسرب البيانات.** يشحن `vue-i18n` كل locale وسلاسل كل صفحة على كل صفحة: تسرب locale بنسبة 50% (على locale المرقمة الاثنين؛ مع عشرة locales مجمعة فإن الهدر الفعلي أعلى)، تسرب صفحة بنسبة 90%. يقلل المحول تسرب الصفحة إلى **0%** لأن كل مكون يستورد فقط قاموسه الخاص. يجلس تسرب Locale عند 15% في هذا التشغيل `static`؛ `importMode: 'dynamic'` هو الإعداد الذي يزيله، وكان هذا التكوين ليس جزءاً من تشغيل Vue هذا.
|
|
124
|
+
- **التفاعلية وتحميل الصفحة.** تبديل Locale رخيص لكليهما (1.5-2.8 ms)؛ نظام التفاعلية في Vue يجعل الأمر كذلك بمجرد أن تكون الرسائل في الذاكرة. يذهب تحميل الصفحة من 13.6 ms إلى **9.3 ms**، متماشياً مع 88 KB أقل من JavaScript للتحليل.
|
|
125
|
+
- **حول الصفوف الأصلية.** `vue-intlayer` في هذا التشغيل جمعت كل اللغة في وضع `static` وحققت 57.1 كيلوبايت مع وقت تشغيل 3.9 كيلوبايت؛ قاموس المحول المتزامن حمل سلاسل لغات أجنبية أقل، وبالتالي الرقم الأقل لكل صفحة. وقت التشغيل الأصلي يبقى الأخف من بين الثلاثة، وموديل `.content.ts` الخاص به هو حيث تجد كتل SFC `<i18n>` معادلتها.
|
|
126
|
+
|
|
127
|
+
## لماذا تتحرك الأرقام
|
|
128
|
+
|
|
129
|
+
لم يتغير شيء في `src/components/`، لذا الفوائد تأتي من ما ترتبط به `useI18n`.
|
|
130
|
+
|
|
131
|
+
**مع `vue-i18n`**, الربط هو المثيل العام. `createI18n({ messages: { en, fr, ... } })` هو استيراد واحد يحتوي على كل شيء؛ كل مكون يستدعي `useI18n()` يمكنه الوصول إلى كل شيء، لذلك لا يمكن للـ bundler أن ينقسم دون المثيل. التحسين يعني _أنت_ تقسم `en.json` حسب المسار، تستدعي `setLocaleMessage()` في حارس التوجيه، وتحافظ على خريطة المسار إلى الملف صحيحة عند تحرك المكونات.
|
|
132
|
+
|
|
133
|
+
```bash
|
|
134
|
+
.
|
|
135
|
+
├── locales
|
|
136
|
+
│ ├── en.json # سلاسل كل صفحة
|
|
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`**، الربط هو القاموس. `syncJSON` يحول كل مفتاح من المستوى الأعلى في `en.json` إلى قاموس؛ تمرير التحسين يسلم المكون الذي يسمي مفاتيحه، حيث يتتبع bundler الواردات ويقسمها حسب الصفحة.
|
|
146
|
+
|
|
147
|
+
```bash
|
|
148
|
+
.
|
|
149
|
+
├── intlayer.config.ts # syncJSON({ format: "vue-i18n", source: ... })
|
|
150
|
+
├── locales
|
|
151
|
+
│ ├── en.json # لم يتغير، لا يزال مصدر الحقيقة
|
|
152
|
+
│ └── fr.json
|
|
153
|
+
├── .intlayer/ # تم إنشاؤه: قاموس واحد لكل مفتاح من المستوى الأعلى، لكل locale
|
|
154
|
+
└── src
|
|
155
|
+
├── i18n.ts # createI18n({}) ← تم إزالة استيراد messages
|
|
156
|
+
├── main.ts # app.use(i18n) ← لم يتغير
|
|
157
|
+
└── components
|
|
158
|
+
└── Footer.vue # useI18n(); t("footer.github") ← لم يتغير
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
سطر `messages` المستورد في `i18n.ts` هو السطر الوحيد الذي يجب حذفه. هذا هو 88 كيلوبايت.
|
|
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 ويوفر الأنواع.
|
|
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؛ "dynamic" تحميل النشط عند الطلب
|
|
200
|
+
importMode: "dynamic",
|
|
201
|
+
format: "vue-i18n",
|
|
202
|
+
},
|
|
203
|
+
plugins: [
|
|
204
|
+
syncJSON({
|
|
205
|
+
// لهجة vue-i18n: {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` في مكانه. كل مفتاح على المستوى الأعلى (`footer`, `hero`...) يصبح قاموس.
|
|
217
|
+
<Step number={3} title="أضف الـ plugin وحذف استيراد الرسائل">
|
|
218
|
+
|
|
219
|
+
```ts fileName="vite.config.ts"
|
|
220
|
+
import { defineConfig } from "vite";
|
|
221
|
+
import vue from "@vitejs/plugin-vue";
|
|
222
|
+
import { vueI18nVitePlugin } from "@intlayer/vue-i18n/plugin";
|
|
223
|
+
|
|
224
|
+
export default defineConfig({
|
|
225
|
+
plugins: [vue(), vueI18nVitePlugin()],
|
|
226
|
+
});
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
```ts fileName="src/i18n.ts"
|
|
230
|
+
import { createI18n } from "vue-i18n";
|
|
231
|
+
|
|
232
|
+
// قبل: createI18n({ locale: "en", messages: { en, fr, es } })
|
|
233
|
+
export const i18n = createI18n({ locale: "en" });
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
`vueI18nVitePlugin()` يغلف `vite-intlayer` (مراقبة المحتوى، تجميع القاموس، عملية التحسين) ويقوم بإنشاء alias لـ `vue-i18n` إلى الـ adapter. إزالة استيراد `messages` هو ما يقلل 88 KB؛ تركه في الكود يبقي التطبيق يعمل لكنه يشحن الاثنين معاً.
|
|
237
|
+
|
|
238
|
+
</Step>
|
|
239
|
+
</Steps>
|
|
240
|
+
|
|
241
|
+
### ما يمكنك حذفه لاحقًا
|
|
242
|
+
|
|
243
|
+
| الملف / النمط | السبب |
|
|
244
|
+
| ------------------------------------------------------ | --------------------------------------------------------------------- |
|
|
245
|
+
| `import en from "./locales/en.json"` والملفات المشابهة | يُستخدم فقط كآلية احتياطية من قِبل adapter. هنا كان موقع 88 كيلوبايت |
|
|
246
|
+
| `setLocaleMessage()` في route guards | عملية بلا تأثير. تحميل لكل مسار هو وظيفة المترجم الآن |
|
|
247
|
+
| `@intlify/unplugin-vue-i18n` | غير مطلوب: فهو يقوم بتجميع الرسائل وكتل SFC التي لا يقرأها adapter |
|
|
248
|
+
| كتل `<i18n>` في المكونات أحادية الملف (SFC) | لا تُقرأ؛ انقلها إلى ملفات JSON المحلية أو إلى `.content.ts` لكل مكون |
|
|
249
|
+
|
|
250
|
+
### ما الذي تكسبه بعيداً عن البايتات
|
|
251
|
+
|
|
252
|
+
- **مفاتيح مكتوبة.** `t("footer.github")` مكتوب مقابل قاموس `footer` المترجم؛ المسار الخاطئ هو خطأ في TypeScript بدلاً من عرض المفتاح كنص.
|
|
253
|
+
- **`npx intlayer test`** يفشل في CI عند وجود مفتاح مفقود في أي محلية. **`npx intlayer fill`** يترجم الناقصة باستخدام مفتاح مزود خاص بك (OpenAI أو Anthropic أو Mistral أو Gemini...) ويكتبها مرة أخرى في `locales/{locale}.json`.
|
|
254
|
+
- **محرر مرئي و CMS** يعملان على نفس JSON، لذا يقوم المطورون بعدم التحرير من خلال واجهة المستخدم وتحديث الملفات.
|
|
255
|
+
- **الانتقال التدريجي إلى `.content.ts`.** يمكن لأي مكون الانتقال من `useI18n()` إلى `useIntlayer("footer")` مع ملف محتوى مرافق. قواميس JSON و`.content.ts` موجودة وتندمج معاً.
|
|
256
|
+
|
|
257
|
+
## الحدود التي يجب معرفتها قبل البدء
|
|
258
|
+
|
|
259
|
+
- **كتل SFC `<i18n>` لا تُقرأ.** إذا كانت رسائلك موجودة داخل المكونات، فيجب نقلها إلى ملفات الإعدادات الإقليمية (أو إلى `.content.ts`، وهي نفس الفكرة مع الأنواع).
|
|
260
|
+
- **تحميل الرسائل في وقت التشغيل قد اختفى.** `setLocaleMessage()` و `mergeLocaleMessage()` تحذر وتعود. الترجمات المجلوبة من نظام إدارة المحتوى في وقت التشغيل تحتاج إلى نظام إدارة محتوى Intlayer، أو أوامر `intlayer pull` / `push`.
|
|
261
|
+
- **`messages` هو بديل، وليس مجاني.** الاحتفاظ باستيرادات JSON في `createI18n()` يحتفظ بـ 75 KB في الحزمة. احذفها بمجرد نجاح `intlayer test`.
|
|
262
|
+
- **المحول ليس runtime الأصلي.** 7.9 KB مقابل 3.9 KB لـ `vue-intlayer`. بمجرد انتقال كل component إلى `useIntlayer`، يمكنك حذفه.
|
|
263
|
+
|
|
264
|
+
## متى تستخدم أي منها؟
|
|
265
|
+
|
|
266
|
+
- **ابق على `vue-i18n`** إذا كان تطبيقك يعتمد على كتل SFC `<i18n>`، على تدفقات runtime `setLocaleMessage()`، أو إذا لم يكن 90 KB لكل صفحة مصدر قلق لجمهورك.
|
|
267
|
+
- **استخدم `@intlayer/vue-i18n`** إذا كنت على `vue-i18n` وتريد توفير 88 KB، و23x أصغر components، 0% page leakage، typed keys وفحوصات CI دون تعديل ملف `.vue`. هذه هي نقطة الدخول لـ codebase `vue-i18n` موجود.
|
|
268
|
+
- **اذهب للنسخة الأصلية (`vue-intlayer`)** للمشاريع الجديدة، أو بمجرد انتهاء المحول من عمله. لديها أخف runtime (3.9 KB) والنموذج `.content.ts` لكل component الذي يحل محل كتل `<i18n>` بمحتوى مكتوب (typed).
|
|
269
|
+
|
|
270
|
+
## المقارنات ذات الصلة
|
|
271
|
+
|
|
272
|
+
- [vue-i18n مقابل Intlayer](https://intlayer.org/blog/vue-i18n-vs-intlayer) (الميزات وتجربة المطور)
|
|
273
|
+
- [معيار vue-i18n مقابل Intlayer](https://intlayer.org/blog/vue-i18n-vs-intlayer-benchmark) (المكتبات، نفس المعيار)
|
|
274
|
+
- [next-intl مقابل @intlayer/next-intl](https://intlayer.org/blog/next-intl-vs-intlayer-next-intl) (نفس سلسلة المحولات)
|
|
275
|
+
- [i18next مقابل @intlayer/i18next](https://intlayer.org/blog/i18next-vs-intlayer-i18next) (نفس سلسلة المحولات)
|
|
276
|
+
- [Lingui مقابل @intlayer/lingui](https://intlayer.org/blog/lingui-vs-intlayer-lingui) (نفس سلسلة المحولات)
|
|
277
|
+
- [دليل الترحيل: من vue-i18n إلى Intlayer](https://intlayer.org/doc/migration/vue-i18n)
|
|
278
|
+
- [مرجع محول التوافق: vue-i18n](https://intlayer.org/doc/compatibility/vue-i18n), [Nuxt i18n](https://intlayer.org/doc/compatibility/nuxtjs-i18n)
|
|
279
|
+
|
|
280
|
+
## الخلاصة
|
|
281
|
+
|
|
282
|
+
يغير `@intlayer/vue-i18n` ما يرتبط به `useI18n()`: من مثيل عام يحمل كل رسالة من كل locale إلى قاموس مُجمّع لتلك المكون. في نفس تطبيق Vite + Vue 3 الذي هو **88 KB أقل لكل صفحة**، وقت تشغيل **أصغر 3 مرات**، مكونات **أصغر 23 مرة** و**تسرب صفحة 0%**، لملف إعدادات وسطر plugin وواحد استيراد محذوف. كتل SFC `<i18n>` وتحميل الرسائل في وقت التشغيل هما الشيئان اللذان لا يحملهما، وبقي runtime `vue-intlayer` الأصلي نصف حجمه.
|
|
283
|
+
|
|
284
|
+
جميع البيانات الأولية وتطبيقات الاختبار والسكريبتات موجودة في [مستودع Benchmark Bloom](https://github.com/intlayer-org/benchmark-bloom). قم بتشغيلها بنفسك.
|
|
285
|
+
|
|
286
|
+
راجع وثيقة ['Why Intlayer?'](https://intlayer.org/doc/why) للحصول على مزيد من التفاصيل.
|
|
File without changes
|
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
---
|
|
2
|
+
createdAt: 2026-09-09
|
|
3
|
+
updatedAt: 2026-09-09
|
|
4
|
+
title: "Die Geschichte der JavaScript-i18n: Von 2011 bis 2026"
|
|
5
|
+
description: "Erfahren Sie mehr über die Evolution der Frontend-Internationalisierung von 2011 bis 2026. Release-Daten, Architekturprobleme und Innovationen in React, Vue, Next.js, Angular, Svelte und Solid."
|
|
6
|
+
keywords:
|
|
7
|
+
- i18n Geschichte
|
|
8
|
+
- JavaScript Internationalisierung
|
|
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
|
+
# Die Geschichte der JavaScript-Internationalisierung (i18n)
|
|
24
|
+
|
|
25
|
+
Internationalisierung ist kein neues Thema. Lange vor JavaScript und dem modernen Web mussten Softwaresysteme bereits mit mehreren Sprachen, Währungen, Datumsformaten und regionalen Konventionen umgehen. Frühe grafische Betriebssysteme wie GEM und Mac OS lösten viele dieser Probleme bereits in den 1980er Jahren.
|
|
26
|
+
|
|
27
|
+
Dieselben Konzepte fanden ihren Weg in Backend-Frameworks. Ruby on Rails, Django, Java-Frameworks und PHP-Anwendungen entwickelten jeweils eigene Ansätze zur Internationalisierung. Die Kernfragen waren klar umrissen:
|
|
28
|
+
|
|
29
|
+
- Wo sollen Übersetzungen gespeichert werden?
|
|
30
|
+
- Wie formatieren wir Datumsangaben, Zahlen und Währungen?
|
|
31
|
+
- Wie handhaben wir Pluralformen und grammatikalische Unterschiede?
|
|
32
|
+
- Wie bestimmen wir die passende Sprache für den Nutzer?
|
|
33
|
+
|
|
34
|
+
Solange der Server vollständige HTML-Seiten erzeugte, war das Vorgehen überschaubar. Die Anwendung lud die passenden Texte, renderte das Dokument und lieferte es an den Browser aus.
|
|
35
|
+
|
|
36
|
+
> PHP und GNU gettext dienten als Wegbereiter für das `t()`-Helfer-Muster, das später in JavaScript und JSX allgegenwärtig wurde.
|
|
37
|
+
|
|
38
|
+
Dann übernahm JavaScript zunehmend die Kontrolle im Browser.
|
|
39
|
+
|
|
40
|
+
Mit dem Wechsel von rein serverseitigen Seiten zu komplexen Single-Page Applications (SPAs) verlagerte sich die Internationalisierung ins Frontend. Der Browser musste plötzlich Übersetzungen nachladen, Sprachen dynamisch umschalten, Werte formatieren, Pluralregeln anwenden und die Oberfläche ohne Seiten-Reload aktualisieren.
|
|
41
|
+
|
|
42
|
+
Daraus ergab sich eine zentrale Frage:
|
|
43
|
+
|
|
44
|
+
**Wie lässt sich eine Anwendung mehrsprachig gestalten, ohne jedem Nutzer gigantische Übersetzungsmengen und schweren Laufzeitcode aufzubürden?**
|
|
45
|
+
|
|
46
|
+
Diese Frage prägte die Entwicklung von JavaScript-i18n über mehr als ein Jahrzehnt.
|
|
47
|
+
|
|
48
|
+
Die Lösungen haben sich grundlegend gewandelt: von globalen JavaScript-Objekten und einfachen `t('key')`-Aufrufen über frameworkspezifische Bibliotheken, Typensicherheit mit TypeScript, Server Components und Tree-Shaking bis hin zu modernen Compiler-Ansätzen, die Übersetzungen direkt während des Builds in optimierten Code überführen.
|
|
49
|
+
|
|
50
|
+
Dieser Artikel beleuchtet diese Entwicklung von 2011 bis 2026: welche Probleme die einzelnen Werkzeuge lösen wollten, was funktionierte, wo Grenzen lagen und wie moderne Frontend-Architekturen die i18n von heute bestimmen.
|
|
51
|
+
|
|
52
|
+

|
|
53
|
+
|
|
54
|
+
## Inhaltsverzeichnis
|
|
55
|
+
|
|
56
|
+
<TOC/>
|
|
57
|
+
|
|
58
|
+
## Das frühe Web: JavaScript-Internationalisierung vor 2016
|
|
59
|
+
|
|
60
|
+
Um moderne i18n-Lösungen einordnen zu können, lohnt ein Blick auf die Arbeitsweisen zwischen 2011 und 2015.
|
|
61
|
+
|
|
62
|
+
### Verlagerung der Logik auf den Client
|
|
63
|
+
|
|
64
|
+
Anfang der 2010er Jahre lag die Internationalisierung fast ausschließlich beim Server. JavaScript diente meist nur als Ergänzung für Animationen, Formularprüfungen und kleinere DOM-Elemente via jQuery.
|
|
65
|
+
|
|
66
|
+
Als SPAs mit Backbone.js, Knockout.js und frühem AngularJS populär wurden, wanderte die Rendering-Logik direkt in den Browser. Der Client musste nun lokalisierte Datumsangaben darstellen, Währungen anpassen, Pluralregeln berechnen und Texte ohne Neuladen austauschen.
|
|
67
|
+
|
|
68
|
+
Doch der Browser von 2011 bot dafür kaum native Unterstützung:
|
|
69
|
+
|
|
70
|
+
<AccordionGroup>
|
|
71
|
+
<Accordion header="Keine native Internationalisierungs-API">
|
|
72
|
+
|
|
73
|
+
Die Spezifikation der ECMAScript Internationalization API (ECMA-402) wurde erst im Dezember 2012 mit dem globalen Objekt `Intl` verabschiedet. Vor der breiten Einführung in Browsern erforderten selbst einfache Formatierungen eigene Hilfsfunktionen oder schwere Polyfills.
|
|
74
|
+
|
|
75
|
+
</Accordion>
|
|
76
|
+
<Accordion header="Keine modernen Modul-Bundler">
|
|
77
|
+
|
|
78
|
+
Werkzeuge wie Webpack standen am Anfang, und native ES-Module existierten in Browsern nicht. Entwickler banden Skripte über `<script>`-Tags ein und legten Übersetzungen oft in globalen Objekten wie `window.translations = { ... }` ab.
|
|
79
|
+
|
|
80
|
+
</Accordion>
|
|
81
|
+
<Accordion header="Monolithische JSON-Dateien">
|
|
82
|
+
|
|
83
|
+
Übersetzungen wurden in riesigen, zentralen JSON-Dateien gepflegt. Ein Nutzer in Tokio, der lediglich die Startseite aufrief, lud gleichzeitig die Texte für Kontoeinstellungen, Abrechnungsdialoge und Administrationsbereiche herunter.
|
|
84
|
+
|
|
85
|
+
</Accordion>
|
|
86
|
+
</AccordionGroup>
|
|
87
|
+
|
|
88
|
+
### Die erste Welle clientseitiger Bibliotheken
|
|
89
|
+
|
|
90
|
+
Zwischen 2012 und 2015 entstand das Fundament moderner i18n in JavaScript:
|
|
91
|
+
|
|
92
|
+
<AccordionGroup>
|
|
93
|
+
<Accordion header="i18next (Januar 2012)">
|
|
94
|
+
|
|
95
|
+
Entwickelt von Jan Mühlemann, definierte `i18next` den Standard für Schlüssel-Wert-Wörterbücher zur Laufzeit. Es führte Pfadnavigation, Variableninterpolation, Pluralregeln und eine modulare Architektur für Sprachdetektoren und Backends ein. Es etablierte sich rasch als De-facto-Standard in Vanilla JS und Node.js.
|
|
96
|
+
|
|
97
|
+
</Accordion>
|
|
98
|
+
<Accordion header="vue-i18n (Mai 2014)">
|
|
99
|
+
|
|
100
|
+
Entwickelt von Kazuya Kawaguchi (Kazupon), passte `vue-i18n` die Internationalisierung an das Reaktivitätsmodell von Vue.js an und führte Vorlagendirektiven (`v-t`) sowie den Helfer `$t()` ein.
|
|
101
|
+
|
|
102
|
+
</Accordion>
|
|
103
|
+
<Accordion header="react-intl (Juni 2014)">
|
|
104
|
+
|
|
105
|
+
Als Teil des FormatJS-Projekts von Yahoo! brachte `react-intl` standardisierte ICU MessageFormat- und `Intl`-APIs über deklarative Komponenten wie `<FormattedMessage>` und `<FormattedDate>` in das React-Ökosystem.
|
|
106
|
+
|
|
107
|
+
</Accordion>
|
|
108
|
+
<Accordion header="react-i18next (Dezember 2015)">
|
|
109
|
+
|
|
110
|
+
Jan Mühlemann übertrug `i18next` in die React-Welt, zunächst mit Higher-Order Components (`withTranslation`) und Kontextanbietern, um Komponenten bei Sprachwechseln neu zu rendern.
|
|
111
|
+
|
|
112
|
+
</Accordion>
|
|
113
|
+
</AccordionGroup>
|
|
114
|
+
|
|
115
|
+
### Grenzen der Ära vor 2016
|
|
116
|
+
|
|
117
|
+
Obwohl diese Werkzeuge mehrsprachige Webanwendungen ermöglichten, brachten die damaligen Architekturen spürbare Nachteile mit sich:
|
|
118
|
+
|
|
119
|
+
<AccordionGroup>
|
|
120
|
+
<Accordion header="Fragile String-Schlüssel">
|
|
121
|
+
|
|
122
|
+
Schlüsselaufrufe wie `t('marketing.landing.hero.cta')` boten keinerlei statische Typprüfung. Tippfehler fielen oft erst im Produktivbetrieb durch leere Flächen oder unübersetzte Schlüssel auf.
|
|
123
|
+
|
|
124
|
+
</Accordion>
|
|
125
|
+
<Accordion header="Parsing-Aufwand zur Laufzeit">
|
|
126
|
+
|
|
127
|
+
Das Auswerten von ICU-Nachrichtensyntax und regulären Ausdrücken im Browser beanspruchte insbesondere auf Mobilgeräten messbare Rechenleistung.
|
|
128
|
+
|
|
129
|
+
</Accordion>
|
|
130
|
+
<Accordion header="Unnötig große Bundles">
|
|
131
|
+
|
|
132
|
+
Ohne komponentenbasiertes oder routenbasiertes Code-Splitting wurden sämtliche Übersetzungstexte auf einmal ausgeliefert, was die Ladezeiten verlängerte.
|
|
133
|
+
|
|
134
|
+
</Accordion>
|
|
135
|
+
<Accordion header="Kluft zwischen Code und Übersetzung">
|
|
136
|
+
|
|
137
|
+
Zentralisierte JSON-Dateien lagen weit entfernt von den Komponenten, die sie verwendeten. Verwaiste Schlüssel und fehlende Übersetzungen waren die häufige Folge.
|
|
138
|
+
|
|
139
|
+
</Accordion>
|
|
140
|
+
</AccordionGroup>
|
|
141
|
+
|
|
142
|
+
## Die Framework-Ära: Entwicklung über Ökosysteme hinweg
|
|
143
|
+
|
|
144
|
+
Zwischen 2016 und 2026 wandelte sich die Frontend-Entwicklung grundlegend. TypeScript wurde zum Branchenstandard, Komponentenmodelle reiften aus, Bundler wie Webpack, Vite und Turbopack etablierten granulares Code-Splitting, React Server Components verlagerten Render-Logik zurück auf den Server, und Compiler begannen, Anwendungscode direkt zu analysieren.
|
|
145
|
+
|
|
146
|
+
Die folgenden Tabs zeigen, wie die einzelnen Ökosysteme auf diese Herausforderungen reagierten. In diesen Umgebungen bieten `react-intlayer` und seine Pendants (`next-intlayer`, `vue-intlayer`, `angular-intlayer`, `svelte-intlayer` und `solid-intlayer`) leistungsfähige Implementierungen, die auf die jeweilige Laufzeitumgebung zugeschnitten sind.
|
|
147
|
+
|
|
148
|
+
<Tabs>
|
|
149
|
+
|
|
150
|
+
<Tab label="Core JavaScript" value="javascript">
|
|
151
|
+
|
|
152
|
+
| Erster Release | Bibliothek | Zielsetzung | Wichtigste Innovation |
|
|
153
|
+
| -------------- | ------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
154
|
+
| Januar 2012 | `i18next` | Standardisierung von Dictionary-Lookups zur Laufzeit für Browser und Node.js ohne Framework-Bindung. | Modulare Laufzeitarchitektur mit Trennung von Übersetzungslogik, Ladern, Detektoren und Caching. |
|
|
155
|
+
| Februar 2021 | `typesafe-i18n` | Vermeidung von Laufzeitfehlern und fehlerhaften Interpolationen durch ungetypte Zeichenketten. | Vollständig typisierte Übersetzungsfunktionen, die direkt aus Übersetzungsobjekten generiert werden, ohne Laufzeitabhängigkeiten. |
|
|
156
|
+
| Oktober 2023 | `paraglide` (`@inlang/paraglide-js`) | Beseitigung von Laufzeit-Dictionaries, schweren Parsern und unnötigem Bundle-Overhead. | Kompiliert Meldungen in reine, tree-shakable ECMAScript-Module und JavaScript-Funktionen. |
|
|
157
|
+
| April 2024 | `intlayer` | Ersatz schwer wartbarer Namespaces, Vermeidung von Content-Leaks zwischen Seiten, Reduzierung von Git-Merge-Konflikten und native Typsicherheit in TypeScript. | Colocation von `.content`-Dateien direkt am Komponentenaufruf, automatische Typgenerierung, integriertes visuelles CMS und KI-gestützte Übersetzungswerkzeuge per CLI. |
|
|
158
|
+
| Juni 2025 | `wuchale` | Beseitigung des manuellen Extrahierens von Texten und Erfindens von Übersetzungsschlüsseln während der Entwicklung. | AST-Vorverarbeitung, die Inline-Texte erkennt und direkt zur Build-Zeit in lokalisierte Funktionen ohne Wrapper überführt. |
|
|
159
|
+
|
|
160
|
+
</Tab>
|
|
161
|
+
|
|
162
|
+
<Tab label="React" value="react">
|
|
163
|
+
|
|
164
|
+
| Erster Release | Bibliothek | Zielsetzung | Wichtigste Innovation |
|
|
165
|
+
| -------------- | ---------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
166
|
+
| Juni 2014 | `react-intl` | Standardisierung der Formatierung von Zahlen, Daten, Währungen und komplexen Pluralen in React. | Deklarative Komponenten (`<FormattedMessage>`, `<FormattedDate>`) auf Basis von ICU MessageFormat und ECMA-402. |
|
|
167
|
+
| Dezember 2015 | `react-i18next` | Idiomatische React-Anbindung für `i18next` mit reaktivem Re-Rendering. | Kontinuierliche Weiterentwicklung von Higher-Order Components hin zu JSX-Interpolation mit `<Trans>` und dem `useTranslation`-Hook. |
|
|
168
|
+
| Januar 2018 | `@lingui/react` | Verringerung von Bundle-Größen durch Vermeidung schwerer ICU-Parser zur Laufzeit. | Babel/SWC-Makros zur Build-Zeit, die `<Trans>` und `t` in kompakte indizierte Arrays kompilieren. |
|
|
169
|
+
| Dezember 2020 | `use-intl` | Schlanke, hook-basierte und typsichere Alternative zu älteren React-i18n-Lösungen. | Ergonomische Hooks `useTranslations` und `useFormatter` mit tiefer TypeScript-Integration. |
|
|
170
|
+
| Februar 2021 | `@tolgee/react` | Verkürzung von Feedbackschleifen zwischen Entwicklern, Übersetzern und Designern. | In-Context-Bearbeitung im Browser per Alt-Klick mit Echtzeit-Aktualisierung und Screenshot-Erfassung. |
|
|
171
|
+
| April 2024 | `react-intlayer` | Optimierte React-Implementierung von Intlayer für den Komponenten-Lebenszyklus ohne zentrale JSON-Monolithen oder unübersichtliche Namespaces. | Leistungsfähiger `useIntlayer`-Hook, automatisch generierte TypeScript-Typen, Tree-Shaking pro Komponente und Live-Synchronisation mit dem visuellen CMS. |
|
|
172
|
+
| Juli 2024 | `gt-react` | Automatisierung manueller Datei-Exporte und Übersetzungsabläufe. | Cloud-basierte KI-Lokalisierung direkt in React-Komponenten über automatisierte Übersetzungspipelines. |
|
|
173
|
+
| August 2025 | `@wuchale/jsx` | Verzicht auf manuelle Schlüsselvergabe und sich wiederholende Hooks in JSX. | AST-Transformation, die JSX-Textknoten automatisch erkennt und in lokalisierte Äquivalente kompiliert. |
|
|
174
|
+
|
|
175
|
+
</Tab>
|
|
176
|
+
|
|
177
|
+
<Tab label="Next.js" value="nextjs">
|
|
178
|
+
|
|
179
|
+
| Erster Release | Bibliothek | Zielsetzung | Wichtigste Innovation |
|
|
180
|
+
| -------------- | ------------------------------------------- | --------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
181
|
+
| November 2018 | `next-i18next` | SSR- und SSG-Unterstützung mit `i18next` im Next.js Pages Router ohne clientseitige Abfragekaskaden. | `serverSideTranslations` und `appWithTranslation` zur Übergabe lokalisierter Namespaces über Page-Props. |
|
|
182
|
+
| Dezember 2019 | `next-translate` | Einfachere Konfiguration und reduziertes Bundle-Gewicht im Pages Router. | Webpack-Loader-Plugin, das gezielt nur die jeweils benötigten Übersetzungs-Namespaces pro Seite einbindet. |
|
|
183
|
+
| November 2020 | `next-intl` | Neuausrichtung der Internationalisierung auf App Router, React Server Components (RSC) und Streaming SSR. | Native Integration mit Next.js App Router Middleware, Server Actions und asynchronen Server Components ohne zwingendes Client-JS. |
|
|
184
|
+
| Juli 2022 | `next-international` | Maximale TypeScript-Typsicherheit bei minimalem Bundle-Overhead für Next.js. | Strikte Typgenerierung für abgegrenzte Übersetzungsschlüssel mit schlanken Adaptern für App Router und Pages Router. |
|
|
185
|
+
| April 2024 | `paraglide-next` (`@inlang/paraglide-next`) | Vorkompilierte Meldungen ohne Laufzeit-Bibliothek für Next.js App Router und Pages Router. | Middleware-Routing kombiniert mit tree-shakable Funktionen, wodurch Laufzeit-JSON-Parsing in RSC und Client-Bundles entfällt. |
|
|
186
|
+
| April 2024 | `next-intlayer` | Server-Component-Adapter ohne lästiges Weiterreichen von `t()`-Funktionen oder Wörterbüchern über Props. | Direkter Aufruf von `useIntlayer` in synchronen Server Components ohne Prop-Drilling, kaskadenfreies Server-Rendering, lokalisierte Middleware und Live-CMS-Sync. |
|
|
187
|
+
| September 2024 | `gt-next` | Automatisierte mehrsprachige Inhaltserstellung und dynamisches lokales Routing in Next.js mit KI. | App-Router-Integration, die cloudbasierte maschinelle Übersetzung mit Next.js Edge Middleware und Caching verknüpft. |
|
|
188
|
+
|
|
189
|
+
</Tab>
|
|
190
|
+
|
|
191
|
+
<Tab label="Vue & Nuxt" value="vue">
|
|
192
|
+
|
|
193
|
+
| Erster Release | Bibliothek | Zielsetzung | Wichtigste Innovation |
|
|
194
|
+
| -------------- | -------------- | -------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
195
|
+
| Mai 2014 | `vue-i18n` | Idiomatische, reaktive Internationalisierung für Vue-Anwendungen. | Tiefe Reaktivitätsanbindung, Vorlagendirektiven (`v-t`), `$t`-Helfer und eigene `<i18n>`-Blöcke in Single-File-Components. |
|
|
196
|
+
| November 2017 | `@nuxt/i18n` | Lokalisierte URL-Routen, SEO-hreflang-Tags und SSR-Hydration in Nuxt. | Full-Stack-Routingmodul mit Unterstützung für Routenpräfixe, Domains, SEO-Meta-Header und Lazy-Loading von Sprachfragmenten. |
|
|
197
|
+
| August 2019 | `fluent-vue` | Unterstützung komplexer grammatikalischer Fälle, Geschlechter und asymmetrischer Sprachstrukturen. | Integration der Mozilla Project Fluent Syntax in Vue, um verschachtelte Verzweigungen für sprachliche Feinheiten zu vermeiden. |
|
|
198
|
+
| April 2025 | `vue-intlayer` | Maßgeschneiderte Intlayer-Lösung für Vue 3 Composition API und Nuxt ohne Verschmutzung globaler Gültigkeitsbereiche. | Auf Vue 3 abgestimmtes `useIntlayer`-Composable mit Reaktivitäts-Tracking, klarer Komponenten-Isolation, vollständiger TypeScript-Autovervollständigung und CMS. |
|
|
199
|
+
|
|
200
|
+
</Tab>
|
|
201
|
+
|
|
202
|
+
<Tab label="Angular" value="angular">
|
|
203
|
+
|
|
204
|
+
| Erster Release | Bibliothek | Zielsetzung | Wichtigste Innovation |
|
|
205
|
+
| -------------- | ------------------- | ----------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
206
|
+
| Februar 2017 | `ngx-translate` | Dynamische Laufzeitübersetzung in Angular ohne separate Builds pro Sprache. | `TranslateService` und `translate`-Pipe für dynamisches Nachladen von Texten und Umschalten zur Laufzeit. |
|
|
207
|
+
| Juli 2019 | `@ngneat/transloco` | Beseitigung von Performanceengpässen und fehlender Isolation in älteren Angular-Bibliotheken. | Strukturelle Direktive (`*transloco`), isolierte Übersetzungen für Lazy-Loading-Module, SSR-Unterstützung und Extraktions-CLI. |
|
|
208
|
+
| September 2019 | `@angular/localize` | Modernisierung der internen Angular-i18n zur Vermeidung wiederholter TypeScript-Kompilierungen pro Sprache. | Tagged Template Literals mit `$localize`, die in einem schnellen Post-Build-Schritt im Ivy-Compiler verarbeitet werden. |
|
|
209
|
+
| Februar 2021 | `@tolgee/ngx` | Integration kollaborativer In-Context-Übersetzung und Screenshot-Erstellung in Angular-Workflows. | Angular-Pipes und -Direktiven mit direkter Anbindung an Tolgee für In-Browser-Übersetzung. |
|
|
210
|
+
| April 2025 | `angular-intlayer` | Native Intlayer-Implementierung für modernes Angular (Signals, Standalone Components und SSR). | Signal-basierte reaktive Inhaltsanbindung abgestimmt auf Angular Change Detection, Standalone Dependency Injection und Live-Synchronisation mit dem CMS. |
|
|
211
|
+
|
|
212
|
+
</Tab>
|
|
213
|
+
|
|
214
|
+
<Tab label="Svelte & SvelteKit" value="svelte">
|
|
215
|
+
|
|
216
|
+
| Erster Release | Bibliothek | Zielsetzung | Wichtigste Innovation |
|
|
217
|
+
| -------------- | ----------------- | ------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
218
|
+
| Juli 2018 | `svelte-i18n` | Reaktive Internationalisierungsbibliothek abgestimmt auf Svelte Stores. | Store-basierter `$t`-Zugriff für präzise DOM-Updates bei Sprachwechseln. |
|
|
219
|
+
| Dezember 2021 | `sveltekit-i18n` | Saubere Handhabung von SSR und routenbasiertem Nachladen in SvelteKit-Anwendungen. | Modulare Lade-Architektur, die exakt jene Übersetzungen und Formatierer abruft, die für die aktuelle Route nötig sind. |
|
|
220
|
+
| November 2021 | `@tolgee/svelte` | In-Context-Lokalisierung für Svelte-Anwendungen. | Svelte-Store-Anbindungen mit Integration in das Tolgee In-Context-Overlay und automatisierter Screenshot-Erstellung. |
|
|
221
|
+
| April 2025 | `svelte-intlayer` | Performante Intlayer-Implementierung speziell für Svelte 5 und SvelteKit. | Reaktive Bindings für Svelte 5 Runes (`$state`), komponentennahe `.content`-Deklarationen, konfigurationslose Build-Plugins und visuelles CMS. |
|
|
222
|
+
| Juli 2025 | `@wuchale/svelte` | Verzicht auf manuelle Wörterbuchdeklarationen und wiederkehrende `$t`-Importe in Svelte-Dateien. | Svelte-Präprozessor, der Templates zur Build-Zeit analysiert und Textknoten ohne zusätzliche Hüllen übersetzt. |
|
|
223
|
+
|
|
224
|
+
</Tab>
|
|
225
|
+
|
|
226
|
+
<Tab label="SolidJS" value="solid">
|
|
227
|
+
|
|
228
|
+
| Erster Release | Bibliothek | Zielsetzung | Wichtigste Innovation |
|
|
229
|
+
| -------------- | ------------------------ | ------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------- |
|
|
230
|
+
| September 2021 | `@solid-primitives/i18n` | Idiomatische i18n-Primitive passend zur feingranularen Reaktivität von SolidJS. | Signal-basierter Übersetzungsauflöser, der DOM-Knoten ohne virtuelles DOM oder unnötige Re-Renders aktualisiert. |
|
|
231
|
+
| April 2025 | `solid-intlayer` | Leistungsfähige Intlayer-Lösung nativ entwickelt für SolidJS und SolidStart. | Signal-optimierte Bindings ohne Virtual-DOM-Overhead, vollständige TypeScript-Schema-Autovervollständigung und visuelle Editor-Anbindung. |
|
|
232
|
+
| Juni 2026 | `@lingui/solid` | Erweiterung von Build-Zeit-Makroextraktion und ICU MessageFormat auf SolidJS. | Makrotransformationen angepasst an die Reaktivität von Solid, die Meldungen in kompakte Laufzeitstrukturen überführen. |
|
|
233
|
+
|
|
234
|
+
</Tab>
|
|
235
|
+
|
|
236
|
+
</Tabs>
|
|
237
|
+
|
|
238
|
+
## Die vier Architektur-Epochen der JavaScript-i18n
|
|
239
|
+
|
|
240
|
+

|
|
241
|
+
|
|
242
|
+
Rückblickend auf fünfzehn Jahre Entwicklung lässt sich die Geschichte der JavaScript-Internationalisierung in vier prägende Architektur-Epochen unterteilen:
|
|
243
|
+
|
|
244
|
+
<AccordionGroup>
|
|
245
|
+
<Accordion header="1. Die Ära der Laufzeit-Wörterbücher (2011 bis 2017)">
|
|
246
|
+
|
|
247
|
+
Geprägt von `i18next`, `react-intl` und `vue-i18n`. Anwendungen luden statische JSON-Dateien vollständig in den Speicher, und Laufzeitfunktionen glich Zeichenkettenschlüssel mit verschachtelten Objekten ab. Pluralisierung und Variablenersetzung wurden im Client über reguläre Ausdrücke und Parser abgewickelt.
|
|
248
|
+
|
|
249
|
+
</Accordion>
|
|
250
|
+
<Accordion header="2. Die Ära der Build-Makros und Typsicherheit (2018 bis 2021)">
|
|
251
|
+
|
|
252
|
+
Geprägt von `lingui`, `next-translate`, `transloco` und `typesafe-i18n`. Entwickler erkannten die Performancekosten des Parsings zur Laufzeit und die Fehleranfälligkeit ungetypter Schlüssel. Babel-Makros extrahierten Texte beim Build, Bundler-Plugins unterteilten Dictionaries nach Seiten, und TypeScript-Compiler begannen, Übersetzungsargumente statisch zu validieren.
|
|
253
|
+
|
|
254
|
+
</Accordion>
|
|
255
|
+
<Accordion header="3. Die Ära der Server Components und des Streamings (2022 bis 2024)">
|
|
256
|
+
|
|
257
|
+
Geprägt von `next-intl`, `next-international` und frühen RSC-Adaptern. Mit React Server Components und dem Next.js App Router lag das Hauptaugenmerk darauf, Inhalte serverseitig zu rendern, ohne Übersetzungskataloge oder schwere i18n-Laufzeiten an den Browser ausliefern zu müssen.
|
|
258
|
+
|
|
259
|
+
</Accordion>
|
|
260
|
+
<Accordion header="4. Die Ära moderner Compiler und einheitlicher Content-Systeme (2024 bis 2026)">
|
|
261
|
+
|
|
262
|
+
Geprägt von `paraglide`, `intlayer` und `wuchale`. Moderne Tools begreifen Internationalisierung als umfassende Inhaltsarchitektur statt reinen Zeichenkettenersatz. Compiler transformieren Nachrichten direkt in optimierten, tree-shakable Code, Inhaltsdeklarationen liegen direkt bei den Komponenten, und visuelle Editoren sowie automatisierte KI-Pipelines fügen sich nahtlos in Entwickler-Workflows ein. In diesem Ansatz trennt Intlayer Inhaltsdeklaration und automatische Typgenerierung von der Auslieferung und stellt maßgeschneiderte, performante Implementierungen (`react-intlayer`, `next-intlayer`, `vue-intlayer`, `angular-intlayer`, `svelte-intlayer` und `solid-intlayer`) bereit.
|
|
263
|
+
|
|
264
|
+
</Accordion>
|
|
265
|
+
</AccordionGroup>
|
|
266
|
+
|
|
267
|
+
## Fazit: Entwicklererfahrung, Performance und der Einfluss von KI
|
|
268
|
+
|
|
269
|
+
Über fünfzehn Jahre und vier Architekturphasen hinweg blieb die zentrale Herausforderung stets dieselbe: eine hervorragende Entwicklererfahrung (DX) und langfristige Wartbarkeit mit erstklassiger Client-Performance in Einklang zu bringen.
|
|
270
|
+
|
|
271
|
+
Was mit globalen Variablen und unübersichtlichen JSON-Dateien begann, hat sich zu komponentenlokalisierten Inhalten, automatisierter TypeScript-Typsicherheit, kaskadenfreiem Server-Rendering und kompilierungsbasierter Optimierung weiterentwickelt.
|
|
272
|
+
|
|
273
|
+
### Automatisierte Übersetzung und traditionelle Plattformen
|
|
274
|
+
|
|
275
|
+
Ein wesentlicher Wendepunkt der letzten Jahre ist die automatisierte Übersetzung mittels KI, die traditionelle Geschäftsmodelle klassischer Lokalisierungsplattformen infrage stellt.
|
|
276
|
+
|
|
277
|
+
Früher war die Zentralisierung in monolithischen JSON-Dateien ein notwendiger Kompromiss, um Übersetzungssysteme (TMS) anzubinden. Eine einzige Datei bot externen Übersetzern eine einfache Schnittstelle. Für Entwickler bedeutete dies jedoch gravierende architektonische Nachteile: häufige Git-Konflikte, verwaiste Schlüssel, fehlender Kontext auf Komponentenebene und unübersichtliche Namespaces.
|
|
278
|
+
|
|
279
|
+
Dank generativer KI und moderner Compiler-Werkzeuge steht die Developer Experience (DX) wieder im Mittelpunkt. Build-Tools und CLIs können komponentenbasierte Inhaltsdateien eigenständig auffinden, validieren und übersetzen, ohne dass für externe Übersetzungsprozesse architektonische Kompromisse nötig sind.
|
|
280
|
+
|
|
281
|
+
Kommerzielle Plattformen bauten über viele Jahre ihr Geschäftsmodell genau auf diesen manuellen Abläufen auf:
|
|
282
|
+
|
|
283
|
+
- Dienste wie **Locize** (die SaaS-Plattform hinter `i18next`) und **Crowdin** (Integrationspartner diverser Open-Source-Bibliotheken) setzten auf gehosteten Übersetzungsspeicher, Tarife mit Kontingenten und Abrechnung nach Wortanzahl.
|
|
284
|
+
- Da ihr Modell auf manuellen Zyklen und Volumen basiert, besteht wenig Anreiz, direkte, kostenfreie Automatisierungen ohne Zwischenschritte direkt in Entwicklungsumgebungen bereitzustellen.
|
|
285
|
+
|
|
286
|
+
### Neue KI-Tools im Vergleich zu direkten API-Kosten
|
|
287
|
+
|
|
288
|
+
Mit der Senkung der Übersetzungskosten bei gleichzeitig gestiegener sprachlicher Qualität durch moderne Sprachmodelle entstanden neue Anbieter:
|
|
289
|
+
|
|
290
|
+
- Werkzeuge wie Paraglide mit **linguo.dev** oder **General Translation** (`gt-react`, `gt-next`) setzen auf eigene Cloud-Pipelines mit fortlaufenden Abonnements.
|
|
291
|
+
- **Intlayer** hingegen integriert die KI-gestützte Übersetzung direkt in seine Open-Source-CLI. Teams hinterlegen einfach ihre eigenen API-Schlüssel (OpenAI, Anthropic, Mistral oder Google Gemini). Ohne Zwischengebühren oder Plattformbindung erfolgt die Übersetzung zu den reinen Rohkosten des gewählten KI-Anbieters.
|
|
292
|
+
|
|
293
|
+
### Mehr als i18n: Ein ganzheitliches System für mehrsprachige Inhalte
|
|
294
|
+
|
|
295
|
+
Moderne Webentwicklung geht weit über das Übersetzen einzelner Begriffe wie `"Absenden"` oder `"Anmelden"` hinaus. Heutige Anwendungen benötigen strukturierte, dynamische und reichhaltige Inhalte entlang komplexer Nutzeroberflächen.
|
|
296
|
+
|
|
297
|
+
Intlayer versteht sich daher nicht bloß als Schlüssel-Lookup-Werkzeug, sondern als ganzheitliches Content-System. Mit nativer Unterstützung für Markdown, HTML-Strukturen, verschachtelte Datenschemata und visuelle CMS-Bearbeitung verbindet es moderne Code-Architektur mit effizienten Redaktionsabläufen.
|
|
298
|
+
|
|
299
|
+
Weiterführende Vergleiche und praxisnahe Anleitungen finden Sie in folgenden Ressourcen:
|
|
300
|
+
|
|
301
|
+
- [Compiler vs. deklarative Internationalisierung](https://github.com/aymericzip/intlayer/blob/main/docs/blog/de/compiler_vs_declarative_i18n.md)
|
|
302
|
+
- [Komponentenbasierte vs. zentralisierte i18n](https://github.com/aymericzip/intlayer/blob/main/docs/blog/de/per-component_vs_centralized_i18n.md)
|
|
303
|
+
- [Performance und Benchmarks](https://intlayer.org/doc/benchmark)
|
|
304
|
+
- [Intlayer Kompatibilitäts-Adapter](https://intlayer.org/doc/concept/compatibility)
|