@intlayer/docs 9.5.2 → 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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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 +160 -0
- package/dist/cjs/generated/blog.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 +160 -0
- package/dist/esm/generated/blog.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 +8 -0
- package/dist/types/generated/blog.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/nextjs.md +1 -1
- package/docs/ar/benchmark/solid.md +1 -1
- package/docs/ar/benchmark/svelte.md +1 -1
- package/docs/ar/benchmark/tanstack.md +1 -1
- package/docs/ar/benchmark/vue.md +1 -1
- package/docs/ar/interest_of_intlayer.md +1 -1
- package/docs/bn/interest_of_intlayer.md +1 -1
- package/docs/cs/interest_of_intlayer.md +1 -1
- package/docs/de/benchmark/nextjs.md +1 -1
- package/docs/de/benchmark/solid.md +1 -1
- package/docs/de/benchmark/svelte.md +1 -1
- package/docs/de/benchmark/tanstack.md +1 -1
- package/docs/de/benchmark/vue.md +1 -1
- package/docs/de/interest_of_intlayer.md +1 -1
- package/docs/en/benchmark/nextjs.md +1 -1
- package/docs/en/benchmark/solid.md +1 -1
- package/docs/en/benchmark/svelte.md +1 -1
- package/docs/en/benchmark/tanstack.md +1 -1
- package/docs/en/benchmark/vue.md +1 -1
- package/docs/en/interest_of_intlayer.md +1 -1
- package/docs/en-GB/benchmark/nextjs.md +1 -1
- package/docs/en-GB/benchmark/solid.md +1 -1
- package/docs/en-GB/benchmark/svelte.md +1 -1
- package/docs/en-GB/benchmark/tanstack.md +1 -1
- package/docs/en-GB/benchmark/vue.md +1 -1
- package/docs/en-GB/interest_of_intlayer.md +1 -1
- package/docs/es/benchmark/nextjs.md +1 -1
- package/docs/es/benchmark/solid.md +1 -1
- package/docs/es/benchmark/svelte.md +1 -1
- package/docs/es/benchmark/tanstack.md +1 -1
- package/docs/es/benchmark/vue.md +1 -1
- package/docs/es/interest_of_intlayer.md +1 -1
- package/docs/fr/benchmark/nextjs.md +1 -1
- package/docs/fr/benchmark/solid.md +1 -1
- package/docs/fr/benchmark/svelte.md +1 -1
- package/docs/fr/benchmark/tanstack.md +1 -1
- package/docs/fr/benchmark/vue.md +1 -1
- package/docs/fr/interest_of_intlayer.md +1 -1
- package/docs/hi/benchmark/nextjs.md +1 -1
- package/docs/hi/benchmark/solid.md +1 -1
- package/docs/hi/benchmark/svelte.md +1 -1
- package/docs/hi/benchmark/tanstack.md +1 -1
- package/docs/hi/benchmark/vue.md +1 -1
- package/docs/hi/interest_of_intlayer.md +1 -1
- package/docs/id/benchmark/nextjs.md +1 -1
- package/docs/id/benchmark/solid.md +1 -1
- package/docs/id/benchmark/svelte.md +1 -1
- package/docs/id/benchmark/tanstack.md +1 -1
- package/docs/id/benchmark/vue.md +1 -1
- package/docs/id/interest_of_intlayer.md +1 -1
- package/docs/it/benchmark/nextjs.md +1 -1
- package/docs/it/benchmark/solid.md +1 -1
- package/docs/it/benchmark/svelte.md +1 -1
- package/docs/it/benchmark/tanstack.md +1 -1
- package/docs/it/benchmark/vue.md +1 -1
- package/docs/it/interest_of_intlayer.md +1 -1
- package/docs/ja/benchmark/nextjs.md +1 -1
- package/docs/ja/benchmark/solid.md +1 -1
- package/docs/ja/benchmark/svelte.md +1 -1
- package/docs/ja/benchmark/tanstack.md +1 -1
- package/docs/ja/benchmark/vue.md +1 -1
- package/docs/ja/interest_of_intlayer.md +1 -1
- package/docs/ko/benchmark/nextjs.md +1 -1
- package/docs/ko/benchmark/solid.md +1 -1
- package/docs/ko/benchmark/svelte.md +1 -1
- package/docs/ko/benchmark/tanstack.md +1 -1
- package/docs/ko/benchmark/vue.md +1 -1
- package/docs/ko/interest_of_intlayer.md +1 -1
- package/docs/nl/interest_of_intlayer.md +1 -1
- package/docs/pl/benchmark/nextjs.md +1 -1
- package/docs/pl/benchmark/solid.md +1 -1
- package/docs/pl/benchmark/svelte.md +1 -1
- package/docs/pl/benchmark/tanstack.md +1 -1
- package/docs/pl/benchmark/vue.md +1 -1
- package/docs/pl/interest_of_intlayer.md +1 -1
- package/docs/pt/benchmark/nextjs.md +1 -1
- package/docs/pt/benchmark/solid.md +1 -1
- package/docs/pt/benchmark/svelte.md +1 -1
- package/docs/pt/benchmark/tanstack.md +1 -1
- package/docs/pt/benchmark/vue.md +1 -1
- package/docs/pt/interest_of_intlayer.md +1 -1
- package/docs/ru/benchmark/nextjs.md +1 -1
- package/docs/ru/benchmark/solid.md +1 -1
- package/docs/ru/benchmark/svelte.md +1 -1
- package/docs/ru/benchmark/tanstack.md +1 -1
- package/docs/ru/benchmark/vue.md +1 -1
- package/docs/ru/interest_of_intlayer.md +1 -1
- package/docs/tr/benchmark/nextjs.md +1 -1
- package/docs/tr/benchmark/solid.md +1 -1
- package/docs/tr/benchmark/svelte.md +1 -1
- package/docs/tr/benchmark/tanstack.md +1 -1
- package/docs/tr/benchmark/vue.md +1 -1
- package/docs/tr/interest_of_intlayer.md +1 -1
- package/docs/uk/benchmark/nextjs.md +1 -1
- package/docs/uk/benchmark/solid.md +1 -1
- package/docs/uk/benchmark/svelte.md +1 -1
- package/docs/uk/benchmark/tanstack.md +1 -1
- package/docs/uk/benchmark/vue.md +1 -1
- package/docs/uk/interest_of_intlayer.md +1 -1
- package/docs/ur/interest_of_intlayer.md +1 -1
- package/docs/vi/benchmark/nextjs.md +1 -1
- package/docs/vi/benchmark/solid.md +1 -1
- package/docs/vi/benchmark/svelte.md +1 -1
- package/docs/vi/benchmark/tanstack.md +1 -1
- package/docs/vi/benchmark/vue.md +1 -1
- package/docs/vi/interest_of_intlayer.md +1 -1
- package/docs/zh/benchmark/nextjs.md +1 -1
- package/docs/zh/benchmark/solid.md +1 -1
- package/docs/zh/benchmark/svelte.md +1 -1
- package/docs/zh/benchmark/tanstack.md +1 -1
- package/docs/zh/benchmark/vue.md +1 -1
- package/docs/zh/interest_of_intlayer.md +1 -1
- 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 +6 -6
- package/src/generated/blog.entry.ts +160 -0
- package/src/generated/frequentQuestions.entry.ts +20 -0
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
---
|
|
2
|
+
createdAt: 2026-09-13
|
|
3
|
+
updatedAt: 2026-09-13
|
|
4
|
+
title: "Lingui vs @intlayer/lingui: Aynı Makrolar, Farklı Çalışma Zamanı"
|
|
5
|
+
description: "Bir React uygulaması Lingui makrolarını korurken bunları @intlayer/lingui uyumluluk adaptörü aracılığıyla sunduğunda ne değişir? Bileşen boyutu, hidrasyon, sızıntı ve sayfa başına JavaScript miktarı aynı TanStack Start kodunda ölçüldü; adaptörün geride kaldığı noktalar dahil."
|
|
6
|
+
keywords:
|
|
7
|
+
- Lingui
|
|
8
|
+
- "@intlayer/lingui"
|
|
9
|
+
- Intlayer
|
|
10
|
+
- Uyumluluk adaptörü
|
|
11
|
+
- Migrasyon
|
|
12
|
+
- Uluslararasılaşma
|
|
13
|
+
- i18n
|
|
14
|
+
- Benchmark
|
|
15
|
+
- Paket boyutu
|
|
16
|
+
- Blog
|
|
17
|
+
- React
|
|
18
|
+
- TanStack Start
|
|
19
|
+
- Vite
|
|
20
|
+
slugs:
|
|
21
|
+
- blog
|
|
22
|
+
- lingui-vs-intlayer-lingui
|
|
23
|
+
author: aymericzip
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
# Lingui VS @intlayer/lingui | Aynı Makrolar, Farklı Çalışma Zamanı
|
|
27
|
+
|
|
28
|
+
`@intlayer/lingui`, `@lingui/core` ve `@lingui/react` için bir uyumluluk adaptörüdür (compat adapter). `` t`...` ``, `<Trans>`, `useLingui()` ve `i18n._()` çağrılarınız tamamen aynı kalır; makrolar normal şekilde derlenmeye devam eder; değişen tek şey, çalışma zamanında (runtime) mesajların nereden geldiğidir. Dil başına tek bir derlenmiş katalog yerine, her çağrı noktası özel olarak kendisi için derlenmiş bir Intlayer sözlüğüne bağlanır.
|
|
29
|
+
|
|
30
|
+
Bu makale, aynı TanStack Start uygulaması üzerinde bu değişimi ölçmektedir: biri saf Lingui ile, diğeri adaptör ile inşa edilmiştir. Veriler [Benchmark Bloom](https://github.com/intlayer-org/benchmark-bloom) deposundan alınmıştır. İki kütüphanenin doğrudan karşılaştırması için [Lingui vs Intlayer](https://intlayer.org/tr/blog/lingui-vs-intlayer) yazısını okuyabilirsiniz. Bu yazı ise adaptörün neleri değiştirdiği ve nerede avantaj sağlamadığı üzerinedir.
|
|
31
|
+
|
|
32
|
+
<TOC/>
|
|
33
|
+
|
|
34
|
+
> **Özet (tl;dr)**: Aynı TanStack Start uygulamasında `@intlayer/lingui`, makrolara dokunmadan ortalama bileşen boyutunu gzip olarak **85.5 KB'tan 12.8 KB'a**, hidrasyon süresini **28 ms'den 19.7 ms'ye** ve dil değişimini **5.9 ms'den 2.9 ms'ye** düşürdü. Basit kurulumda (her kataloğun baştan yüklendiği durum) ayrıca **%90 sayfa sızıntısını** ortadan kaldırdı ve sayfa başına 12 KB tasarruf sağladı. Ancak tembel yüklemeli (lazy-loaded) kurulumda saf Lingui'nin 115 KB'lık değerine kıyasla **sayfa başına 137 KB** gönderir: Adaptör ICU sözdizimini çalışma zamanında çözümlerken Lingui önceden derlenmiş belirteç (token) dizileri sunar. Kaynak dil sızıntısı (~%9-10), çalışma zamanından değil bileşenlere gömülü `message` yedeğinden kaynaklandığı için iki tarafta da aynıdır. Adaptör bir Vite eklentisidir ve TanStack Start üzerinde ölçülmüştür.
|
|
35
|
+
|
|
36
|
+
## `@intlayer/lingui` nedir
|
|
37
|
+
|
|
38
|
+
Lingui bir derleyici ve bir çalışma zamanından oluşur. Kaynak kodunuzdaki makrolar her dil için bir `.po` (veya JSON) kataloğuna çıkarılır, dil başına bir JS modülüne derlenir ve `i18n.load()` + `i18n.activate()` aracılığıyla genel bir `I18n` örneğine yüklenir. Her `useLingui()` bu örneğe abone olur; her `_()` çağrısı etkin katalogda kendi kimliğini arar.
|
|
39
|
+
|
|
40
|
+
`@intlayer/lingui` makroları ve API'yi korur, katalog arama mantığını değiştirir:
|
|
41
|
+
|
|
42
|
+
1. **İçe aktarma takma adlandırması (Import aliasing).** `@intlayer/lingui/plugin` içindeki `lingui()` eklentisi `vite-intlayer`'ı sarmalar ve `@lingui/core` ile `@lingui/react`'in `@intlayer/lingui`'ye yönlenmesi için `resolve.alias` girdileri ekler. İçe aktarma kodlarınız değişmez.
|
|
43
|
+
2. **Tek doğruluk kaynağı olarak kataloglar.** `syncJSON` eklentisi (`.po` dosyaları için `syncPO`), mevcut kataloglarınızı okuyarak Intlayer sözlüklerine dönüştürür ve CLI veya CMS güncelleme yaptığında çevirileri dosyalara geri yazar. `splitKeys: "key-prefix"` ile noktalı kimliklerin (`footer.github`, `hero.title`) düz kataloğu, 244 KB'lık tek bir dosya yerine önek başına küçük sözlüklere bölünür.
|
|
44
|
+
3. **Çağrı noktası bağlama (Call-site binding).** Intlayer optimizasyon adımı, her dosyada `_`, `t` ve `<Trans>`'a iletilen kimlikleri toplar ve bileşene yalnızca eşleşen sözlükleri teslim eder. `<Trans id="hero.title">` bağımsız olarak bağlanır; `useLingui()` dosyada kullanılan tüm öneklere bağlanır. Nokta içermeyen kimlikler (karma kimlikler, `mockBanner`), Lingui'nin tek `messages` yedek sözlüğüne yönlendirilir.
|
|
45
|
+
|
|
46
|
+
```tsx fileName="src/components/Hero.tsx"
|
|
47
|
+
// Kodunuz, değişmeden kalır
|
|
48
|
+
import { useLingui } from "@lingui/react";
|
|
49
|
+
import { Trans } from "@lingui/react/macro";
|
|
50
|
+
|
|
51
|
+
const Hero = () => {
|
|
52
|
+
const { _ } = useLingui();
|
|
53
|
+
return (
|
|
54
|
+
<section>
|
|
55
|
+
<h1>{_({ id: "hero.title", message: "Measure what you ship" })}</h1>
|
|
56
|
+
<Trans id="hero.subtitle">Every byte counts</Trans>
|
|
57
|
+
</section>
|
|
58
|
+
);
|
|
59
|
+
};
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
```tsx fileName="Derleyicinin ürettiği kod (basitleştirilmiş)"
|
|
63
|
+
import _dicHash_hero from "../.intlayer/dictionaries/hero.mjs";
|
|
64
|
+
import {
|
|
65
|
+
useDictionary as useLingui,
|
|
66
|
+
TransDictionary as Trans,
|
|
67
|
+
} from "@intlayer/lingui";
|
|
68
|
+
|
|
69
|
+
const Hero = () => {
|
|
70
|
+
const { _ } = useLingui(_dicHash_hero);
|
|
71
|
+
return (
|
|
72
|
+
<section>
|
|
73
|
+
<h1>{_({ id: "hero.title", message: "Measure what you ship" })}</h1>
|
|
74
|
+
<Trans id="hero.subtitle" dictionary={_dicHash_hero}>
|
|
75
|
+
Every byte counts
|
|
76
|
+
</Trans>
|
|
77
|
+
</section>
|
|
78
|
+
);
|
|
79
|
+
};
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
Bileşen artık genel örneğe ve arkasındaki monolitik kataloğa erişmez. Yalnızca `hero` sözlüğüne erişir. Aşağıdaki tabloda bileşen boyutu sütununun 7 kat düşmesinin temel nedeni budur.
|
|
83
|
+
|
|
84
|
+
## Adaptörün koruduğu, yoksaydığı ve değiştirmediği özellikler
|
|
85
|
+
|
|
86
|
+
| Lingui API | `@intlayer/lingui` ile |
|
|
87
|
+
| ------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------- |
|
|
88
|
+
| `` t`...` ``, `msg`, `plural`, `select`, `<Trans>` makroları | ✅ Korunur. Intlayer adımından önce derleme sürecinde `@lingui/babel-plugin-lingui-macro` veya `@lingui/swc-plugin`'i tutun |
|
|
89
|
+
| `useLingui()` → `{ i18n, _, t }` | ✅ Korunur. Provider dışında da çalışır (dil bilgisi `react-intlayer`'dan türetilir) |
|
|
90
|
+
| `i18n._(id, values)`, `i18n.t()` | ✅ Korunur. Hem açık hem karma kimlikleri çözer |
|
|
91
|
+
| ICU çoğul ekleri, `select`, `selectordinal`, `#` | ✅ Korunur, Intlayer'ın ICU çözümleyicisi aracılığıyla |
|
|
92
|
+
| `i18n.date()`, `i18n.number()`, `formats` | ✅ Korunur, yerel `Intl` motoruyla desteklenir |
|
|
93
|
+
| `I18nProvider` | ✅ Korunur. `IntlayerProvider`'ı sarmalar; `activate()` ile yeniden render için `i18n.on("change")` dinler |
|
|
94
|
+
| `i18n.activate(locale)` | ✅ Korunur |
|
|
95
|
+
| `i18n.load(locale, messages)` / `loadAndActivate()` | ⚠️ **Çalışma zamanı yedeği** olarak kabul edilir. Derlenmiş sözlükler önceliklidir; geliştirici uyarısı verir |
|
|
96
|
+
| `setupI18n({ messages, missing })` | ⚠️ `messages` yedek olarak birleştirilir; `missing` yoksayılır |
|
|
97
|
+
| `lingui extract` / `lingui compile` | ✅ Mevcut iş akışınız aynen sürer. `syncPO` / `syncJSON`'u çıkarılan kataloglara yönlendirin |
|
|
98
|
+
| `I18nProvider` üzerindeki `defaultComponent` | ⚠️ Bağlamda saklanır ancak render sırasında uygulanmaz |
|
|
99
|
+
| Next.js | ❌ Eklenti `vite-intlayer`'ı sarmalar. Yalnızca Vite, TanStack Start ve React Router desteklenir |
|
|
100
|
+
|
|
101
|
+
## Benchmark karşılaştırması
|
|
102
|
+
|
|
103
|
+
### Neler ölçüldü
|
|
104
|
+
|
|
105
|
+
[Benchmark Bloom](https://github.com/intlayer-org/benchmark-bloom) test paketi, her yapılandırmada **aynı uygulamayı** derler: **10 sayfa** (home, about, blog, careers, contact, FAQ, pricing, products, settings, team), **10 dil** (`en`, `fr`, `es`, `de`, `it`, `pt`, `zh`, `ja`, `ko`, `ru`), aynı bileşenler ve aynı içerik. Sayfalar `en` ve `fr` dillerinde ölçülmüştür.
|
|
106
|
+
|
|
107
|
+
Lingui dört yükleme stratejisiyle test edildi: Derlenmiş tüm katalogların baştan içe aktarıldığı yapıdan (`static`), rota başına katalogların tembel yüklendiği yapıya (`scoped-dynamic`) kadar. Adaptör ise **aynı bileşenler** üzerinde, yalnızca `vite.config.ts` ve `intlayer.config.ts` dosyaları değiştirilerek çalıştırıldı. `static` satırı tüm dilleri paketler; `dynamic` satırı (`importMode: 'dynamic'`) etkin dili isteğe bağlı olarak yükler. "Scoped" varyantı yoktur: Optimizasyon adımı çağrı noktası bazında otomatik kapsam oluşturur.
|
|
108
|
+
|
|
109
|
+
Her derleme için şu metrikler kaydedilir:
|
|
110
|
+
|
|
111
|
+
- **Lib size**: Yalnızca i18n kütüphanesini içe aktaran boş bir bileşenin gzip boyutu.
|
|
112
|
+
- **Page JS**: Tüm sayfalar ve diller üzerinden ortalaması alınan, sayfa başına indirilen gzip JavaScript boyutu.
|
|
113
|
+
- **Locale leak %**: İndirilen JS içindeki, kullanıcının o an görüntülemediği dillere ait çevirilerin oranı.
|
|
114
|
+
- **Page leak %**: İndirilen JS içindeki, kullanıcının o an bulunmadığı sayfalara ait çevirilerin oranı.
|
|
115
|
+
- **Component avg**: İzole biçimde derlenen her bir bileşenin ortalama gzip boyutu.
|
|
116
|
+
- **E2E reactivity**: Yeni bir dil seçimi ile DOM'daki `html[lang]` etiketinin güncellenmesi arasındaki gerçek süre (Playwright, 5 tekrar).
|
|
117
|
+
- **Hydration**: React hidrasyon aşamasının süresi.
|
|
118
|
+
|
|
119
|
+
> Aşağıdaki veriler `@lingui/react` 6.6.0 ve `@intlayer/lingui` 9.5.1 ile **2026-09-12** tarihindeki çalıştırmadan alınmıştır. Test uygulaması bilinçli olarak küçük tutulmuştur (dil başına birkaç düzine metin); bu nedenle sızıntı yüzdeleri **yapısal bir örüntüyü** yansıtır: İçerik büyüdükçe artar, çalışma zamanı maliyeti ise sabit kalır.
|
|
120
|
+
|
|
121
|
+
### TanStack Start üzerindeki sonuçlar
|
|
122
|
+
|
|
123
|
+
| Yapılandırma | Strateji | Lib boyutu (gz) | Sayfa JS ort (gz) | Dil sızıntısı | Sayfa sızıntısı | Bileşen ort (gz) | E2E tepki | Hidrasyon |
|
|
124
|
+
| ---------------------- | -------------- | --------------: | ----------------: | ------------: | --------------: | ---------------: | ---------: | ----------: |
|
|
125
|
+
| **taban** (i18n yok) | - | 0.0 KB | 111.0 KB | 0.0% | 0.0% | 0.7 KB | 8.1 ms | 21.6 ms |
|
|
126
|
+
| Lingui | static | 11.2 KB | 152.2 KB | 50.0% | 90.0% | 58.0 KB | 3.9 ms | 19.9 ms |
|
|
127
|
+
| Lingui | dynamic | 11.2 KB | **115.2 KB** | 9.3% | 0.0% | 85.5 KB | 5.9 ms | 28.0 ms |
|
|
128
|
+
| Lingui | scoped-static | 11.2 KB | 120.8 KB | 4.0% | 0.0% | 147.9 KB | 7.1 ms | 33.9 ms |
|
|
129
|
+
| Lingui | scoped-dynamic | 11.2 KB | 120.2 KB | 8.6% | 0.0% | 83.7 KB | 42.1 ms | 32.9 ms |
|
|
130
|
+
| **`@intlayer/lingui`** | static | **10.3 KB** | 140.5 KB | 50.0% | **0.0%** | **14.9 KB** | **3.3 ms** | **11.3 ms** |
|
|
131
|
+
| **`@intlayer/lingui`** | dynamic | **10.3 KB** | 137.0 KB | 9.9% | **0.0%** | **12.8 KB** | **2.9 ms** | **19.7 ms** |
|
|
132
|
+
| `intlayer` (yerel) | static | 5.0 KB | 125.8 KB | 50.0% | 0.0% | 8.1 KB | 3.2 ms | 11.5 ms |
|
|
133
|
+
| `intlayer` (yerel) | dynamic | 5.0 KB | 118.6 KB | 0.0% | 0.0% | 6.3 KB | 3.6 ms | 14.1 ms |
|
|
134
|
+
|
|
135
|
+
**Sonuçların analizi**
|
|
136
|
+
|
|
137
|
+
- **Bileşenler: 7 kat daha küçük.** Adaptörün ana etkisi budur. Bağımsız olarak derlenen bir Lingui bileşeni, stratejiye bağlı olarak ortalama **58-148 KB** tutar; çünkü `useLingui()` genel örneğe ve ona yüklenen her kataloğa ulaşır. Adaptörlü aynı bileşen ortalama yalnızca **12.8-14.9 KB** tutar: Yalnızca kendi sözlüklerine ve ICU çözümleyicisine erişir.
|
|
138
|
+
- **Hidrasyon: 8-14 ms daha hızlı.** `i18n.load()` + `i18n.activate()` React hidrasyonundan önce istemcide çalışır; Lingui yapılandırması ne kadar tembel yüklemeliyse bu işlem o kadar uzar (28-34 ms). Adaptörde ise sözlükler, paketleyicinin sayfa parçasına önceden yerleştirdiği sıradan içe aktarmalar olarak gelir: `static` modda **11.3 ms**, `dynamic` modda **19.7 ms**.
|
|
139
|
+
- **Dil değiştirme: 2 kat daha hızlı ve takılma yok.** Lingui'nin optimize edilmiş `scoped-dynamic` kurulumu, rota kataloğu getirilip etkinleştirilene kadar ekran güncellenemediğinden `html[lang]` değişimini **42 ms**'de tamamlar. Adaptör her iki modda da istikrarlı şekilde **2.9-3.3 ms** seviyesindedir.
|
|
140
|
+
- **Basit kurulum otomatik olarak iyileşir.** Statik Lingui her sayfada tüm katalogları taşır: 152.2 KB ve %90 sayfa sızıntısı. Statik adaptör: 140.5 KB, %0 sayfa sızıntısı, aynı bileşenlerle.
|
|
141
|
+
- **Sayfa başına bayt: `dynamic` modda Lingui 22 KB ile öndedir.** Bu nokta dürüstçe değerlendirilmelidir. Lingui, derleme anında mesajları belirteç dizilerine dönüştürür ve yalnızca bunları gezen 11 KB'lık hafif bir çalışma zamanı gönderir. Adaptör ise Intlayer'ın ICU çözümleyicisini (yerel yapıya göre yaklaşık 15 KB daha fazla `@intlayer/core`), adaptör katmanını (~10 KB) ve `react-intlayer`'ı (~6 KB) taşır. Bu uygulamada sonuç **137.0 KB'a karşı 115.2 KB**'tır. Tek önceliğiniz sayfa başına asgari bayt ise ve zaten tembel yüklemeli Lingui kullanıyorsanız, adaptör bu metriğe katkı sağlamaz.
|
|
142
|
+
- **Dil sızıntısı iki tarafta da benzerdir.** `dynamic` modda Lingui %9.3, adaptör %9.9'dur. Bu durum bileşenlerin kendi kodundan kaynaklanır: `i18n._({ id: "careers-benefits.pay", message: "Top-of-market compensation" })` çağrısı yedek İngilizce metni taşır ve message alanı ayıklanmadıkça makro çıktısı da aynı şeyi yapar. Bu İngilizce metin, çeviriyi hangi çalışma zamanı sağlarsa sağlasın `fr` parçasına girer. Satır içi kaynak barındırmayan yerel Intlayer (`.content.ts`) ise tam %0'dır.
|
|
143
|
+
|
|
144
|
+
## Sayılar neden değişiyor ve biri neden sabit kalıyor
|
|
145
|
+
|
|
146
|
+
Bu sonuçları iki faktör belirler: **Bileşenin neye bağlandığı** ve **mesajların hangi biçimde taşındığı**.
|
|
147
|
+
|
|
148
|
+
**Bağlama mantığı.** Lingui'de temel bölme birimi dildir. `fr` için `messages.mjs` tek bir modüldür; onu yükleyen örneği içe aktaran her bileşen tüm içeriğe erişebilir, bu yüzden paketleyici dil seviyesinin altına inip bölme yapamaz. Adaptörde ise birim çağrı noktasıdır: `hero` ve `footer` bağımsız içe aktarmalardır; bileşen bazında bölünür ve talep üzerine yüklenir. Bileşen boyutu, hidrasyon ve sayfa sızıntısı iyileşmesi buradan doğar.
|
|
149
|
+
|
|
150
|
+
```bash
|
|
151
|
+
.
|
|
152
|
+
├── lingui.config.ts
|
|
153
|
+
└── src
|
|
154
|
+
├── i18n.ts # setupI18n(), load(), activate()
|
|
155
|
+
├── locales
|
|
156
|
+
│ ├── en/messages.mjs # lingui compile çıktısı, dil başına bir adet
|
|
157
|
+
│ └── fr/messages.mjs
|
|
158
|
+
└── components
|
|
159
|
+
└── Hero.tsx # useLingui(); _("hero.title")
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
```bash
|
|
163
|
+
.
|
|
164
|
+
├── intlayer.config.ts # syncJSON({ splitKeys: "key-prefix" })
|
|
165
|
+
├── .intlayer/ # üretilen: dil başına, kimlik öneki başına bir sözlük
|
|
166
|
+
└── src
|
|
167
|
+
├── locales
|
|
168
|
+
│ ├── en/messages.json # değişmedi, tek doğruluk kaynağı olmaya devam ediyor
|
|
169
|
+
│ └── fr/messages.json
|
|
170
|
+
└── components
|
|
171
|
+
└── Hero.tsx # useLingui(); _("hero.title") ← değişmedi
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
**Mesaj biçimi.** Lingui'nin derleme adımı `{count, plural, one {# item} other {# items}}` ifadesini bir belirteç dizisine dönüştürür; çalışma zamanı hiçbir zaman ICU sözdizimini ayrıştırmaz. Adaptör ise mesajı metin olarak tutar ve Intlayer'ın ICU çözümleyicisiyle ayrıştırır. Bu, sayfa başına bir kez ödenen yaklaşık 15 KB'lık sabit bir ek yüktür ve `dynamic` satırının diğer tüm alanlarda kazanırken toplam bayt boyutunda geride kalmasının nedenidir. Yerel Intlayer bundan kaçınır; çünkü `.content.ts` sözlükleri derleyicinin önceden çözümlediği `enu()` / `insert()` düğümlerini kullanır.
|
|
175
|
+
|
|
176
|
+
## Üç adımda geçiş
|
|
177
|
+
|
|
178
|
+
<Steps>
|
|
179
|
+
<Step number={1} title="Yükleme">
|
|
180
|
+
|
|
181
|
+
```bash packageManager="npm"
|
|
182
|
+
npx intlayer init --interactive
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
```bash packageManager="pnpm"
|
|
186
|
+
pnpm dlx intlayer init --interactive
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
```bash packageManager="yarn"
|
|
190
|
+
yarn dlx intlayer init --interactive
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
```bash packageManager="bun"
|
|
194
|
+
bunx intlayer init --interactive
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
Bu komut Lingui'yi tespit eder, `lingui.config.ts` dosyasını okuyarak `syncPO` (`.po` katalogları) veya `syncJSON` (JSON katalogları) seçimini yapar, `intlayer`, `react-intlayer`, `@intlayer/lingui` ve uygun senkronizasyon eklentisini kurar ve `vite.config.ts` içindeki `@lingui/vite-plugin`'i adaptör eklentisiyle değiştirir. `@lingui/core`, `@lingui/react` ve makro eklentinizi kurulu tutun: Makrolar derlenmeye devam eder ve adaptör Lingui'nin tiplerini kullanır.
|
|
198
|
+
|
|
199
|
+
</Step>
|
|
200
|
+
<Step number={2} title="Intlayer'ı kataloglarınıza bağlama">
|
|
201
|
+
|
|
202
|
+
JSON katalogları için (`lingui.config.ts` içinde `format: "minimal"` olduğunda):
|
|
203
|
+
|
|
204
|
+
```ts fileName="intlayer.config.ts"
|
|
205
|
+
import { Locales, type IntlayerConfig } from "intlayer";
|
|
206
|
+
import { syncJSON } from "@intlayer/sync-json-plugin";
|
|
207
|
+
|
|
208
|
+
const config: IntlayerConfig = {
|
|
209
|
+
internationalization: {
|
|
210
|
+
locales: [Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH],
|
|
211
|
+
defaultLocale: Locales.ENGLISH,
|
|
212
|
+
},
|
|
213
|
+
dictionary: {
|
|
214
|
+
importMode: "dynamic",
|
|
215
|
+
format: "icu",
|
|
216
|
+
},
|
|
217
|
+
plugins: [
|
|
218
|
+
syncJSON({
|
|
219
|
+
format: "icu",
|
|
220
|
+
source: ({ locale, key }) => `./src/locales/${locale}/${key}.json`,
|
|
221
|
+
// Noktalı kimlikleri ilk segmentlerine göre grupla: `footer.github` → `footer` sözlüğü
|
|
222
|
+
splitKeys: "key-prefix",
|
|
223
|
+
}),
|
|
224
|
+
],
|
|
225
|
+
};
|
|
226
|
+
|
|
227
|
+
export default config;
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
`.po` katalogları için, `syncJSON` yerine `@intlayer/sync-po-plugin`'den `syncPO` kullanın ve `.po` uzantılı aynı `source` desenini uygulayın. [Sync PO eklenti belgelerine](https://intlayer.org/tr/doc/plugin/sync-po) göz atabilirsiniz.
|
|
231
|
+
|
|
232
|
+
`splitKeys: "key-prefix"` bileşen boyutunu dramatik şekilde küçülten temel unsurdur. Katalog dosyası düz yapısını korur; bölme yalnızca üretilen sözlüklerde var olur ve geri yazma işlemi anahtarları otomatik olarak yeniden birleştirir.
|
|
233
|
+
|
|
234
|
+
</Step>
|
|
235
|
+
<Step number={3} title="Eklentiyi ekleme">
|
|
236
|
+
|
|
237
|
+
```ts fileName="vite.config.ts"
|
|
238
|
+
import { defineConfig } from "vite";
|
|
239
|
+
import { tanstackStart } from "@tanstack/react-start/plugin/vite";
|
|
240
|
+
import viteReact from "@vitejs/plugin-react";
|
|
241
|
+
import { lingui } from "@intlayer/lingui/plugin";
|
|
242
|
+
|
|
243
|
+
export default defineConfig({
|
|
244
|
+
plugins: [
|
|
245
|
+
tanstackStart(),
|
|
246
|
+
viteReact({
|
|
247
|
+
// Makro eklentinizi koruyun; Intlayer adımından önce çalışmalıdır
|
|
248
|
+
babel: { plugins: ["@lingui/babel-plugin-lingui-macro"] },
|
|
249
|
+
}),
|
|
250
|
+
lingui(),
|
|
251
|
+
],
|
|
252
|
+
});
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
`lingui()` eklentisi `vite-intlayer`'ı (içerik izleme, sözlük derleme, optimizasyon adımı) sarmalar ve `@lingui/core` ile `@lingui/react`'i adaptöre takma adlandırır. Projeyi derleyin ve ölçülen kazanımları hemen elde edin.
|
|
256
|
+
|
|
257
|
+
</Step>
|
|
258
|
+
</Steps>
|
|
259
|
+
|
|
260
|
+
### Sonrasında silebilecekleriniz
|
|
261
|
+
|
|
262
|
+
| Dosya / kalıp | Neden |
|
|
263
|
+
| ---------------------------------------------------- | --------------------------------------------------------------------------------------------- |
|
|
264
|
+
| `await import(\`./locales/${locale}/messages.mjs\`)` | Sözlükler doğrudan kullanan bileşenler tarafından içe aktarılır. `i18n.load()` yedeğe dönüşür |
|
|
265
|
+
| `i18n.load()` / `i18n.loadAndActivate()` | `i18n.activate(locale)` kalsın; elle katalog yükleme kodlarını kaldırın |
|
|
266
|
+
| Derleme betiğindeki `lingui compile` | Yalnızca JSON veya `.po` dosyalarını kaynak olarak kullanıp derlenmiş modülleri almıyorsanız |
|
|
267
|
+
|
|
268
|
+
### Bayt tasarrufu dışındaki kazanımlar
|
|
269
|
+
|
|
270
|
+
- **Eksik çevirilerin tespiti.** `npx intlayer test`, bir dilde eksik anahtar varsa CI derlemesini durdurur; `lingui extract` yalnızca istatistik raporlar.
|
|
271
|
+
- **`npx intlayer fill` ile otomatik doldurma.** Eksik çevirileri tercih ettiğiniz yapay zeka sağlayıcısı (OpenAI, Anthropic, Mistral, Gemini...) ile tamamlar ve kataloglarınıza geri kaydeder.
|
|
272
|
+
- **Görsel Düzenleyici ve CMS.** Aynı sözlükler üzerinde çalışır; teknik bilgisi olmayan ekip üyeleri bile arayüz üzerinden `.po` ve JSON dosyalarını düzenleyebilir.
|
|
273
|
+
- **`.content.ts` formatına kademeli geçiş.** İstediğiniz bir bileşeni dilediğiniz zaman `useLingui()`'den yanındaki içerik dosyasıyla `useIntlayer("hero")`'ya geçirebilirsiniz. İki sözlük türü sorunsuz biçimde bir arada çalışır.
|
|
274
|
+
|
|
275
|
+
## Başlamadan önce bilinmesi gereken sınırlar
|
|
276
|
+
|
|
277
|
+
- **`dynamic` moddaki sayfa başı maliyet.** Yukarıda belirtildiği gibi: Küçük bir uygulamada tembel yüklemeli Lingui kurulumuna kıyasla sayfa başına yaklaşık +20 KB beklenmelidir. Bu fark içerik arttıkça büyümez (kataloglardan değil çözümleyiciden kaynaklanır) ancak küçülmez de.
|
|
278
|
+
- **Kaynak dil sızıntısı devam eder.** Mesaj tanımlayıcıları ve makro çıktıları yedek olarak orijinal İngilizce metni içerir. Bunu tamamen ortadan kaldırmak için `message` alanını temizlemek veya bileşeni `.content.ts`'ye taşımak gerekir.
|
|
279
|
+
- **`i18n.load()` yalnızca bir yedektir.** Derlenmiş katalogları içe aktarmaya ve `load()` çağırmaya devam ederseniz hem eski hem yeni paketi yüklersiniz. Bu içe aktarmaları kaldırın.
|
|
280
|
+
- **Yalnızca Vite.** `@intlayer/lingui` için Next.js eklentisi yoktur. Lingui kullanan Next.js projeleri doğrudan [`next-intlayer`](https://intlayer.org/tr/doc/environment/nextjs) seçeneğini değerlendirmelidir.
|
|
281
|
+
- **`defaultComponent` uygulanmaz.** Her `<Trans>` etiketini otomatik sarmalamak için bu özelliğe güveniyorsanız bileşenlerinizde sarmalayıcıyı açıkça ekleyin.
|
|
282
|
+
|
|
283
|
+
## Hangisi ne zaman tercih edilmeli?
|
|
284
|
+
|
|
285
|
+
- **Lingui'de kalın**: Zaten `scoped-dynamic` mimarisini oturttuysanız, tek hedefiniz sayfa başına asgari bayt ise ve 42 ms'lik dil değişimi ile 30 ms'lik hidrasyon uygulamanız için uygunsa.
|
|
286
|
+
- **`@intlayer/lingui` kullanın**: Halihazırda Lingui kullanıyorsanız ve makrolara dokunmadan daha hafif bileşenler, hızlı hidrasyon ve dil değişimi, basit kurulumda %0 sayfa sızıntısı, tiplenmiş kimlikler, CI doğrulaması ve yapay zeka çevirisi istiyorsanız. Mevcut Lingui projeleri için ideal geçiş köprüsüdür.
|
|
287
|
+
- **Yerel Intlayer'a (`react-intlayer`) geçin**: Bileşenlerinizi kapsamlı biçimde elden geçirmeye başladığınızda. Karşılaştırma tablosunda **%0 dil sızıntısı**, 5 KB çalışma zamanı ve temel uygulamaya kıyasla yalnızca +7.6 KB sayfa başı fark sunan tek çözümdür.
|
|
288
|
+
|
|
289
|
+
## İlgili karşılaştırmalar
|
|
290
|
+
|
|
291
|
+
- [Lingui vs Intlayer](https://intlayer.org/tr/blog/lingui-vs-intlayer) (aynı benchmark üzerinde doğrudan kütüphane karşılaştırması)
|
|
292
|
+
- [next-intl vs @intlayer/next-intl](https://intlayer.org/tr/blog/next-intl-vs-intlayer-next-intl) (adaptör serisi karşılaştırması)
|
|
293
|
+
- [i18next vs @intlayer/i18next](https://intlayer.org/tr/blog/i18next-vs-intlayer-i18next) (adaptör serisi karşılaştırması)
|
|
294
|
+
- [vue-i18n vs @intlayer/vue-i18n](https://intlayer.org/tr/blog/vue-i18n-vs-intlayer-vue-i18n) (adaptör serisi karşılaştırması)
|
|
295
|
+
- [Uyumluluk adaptörü kılavuzu: Lingui](https://intlayer.org/tr/doc/compatibility/lingui)
|
|
296
|
+
- [Derleyici tabanlı vs bildirimsel i18n](https://intlayer.org/tr/blog/compiler-vs-declarative-i18n)
|
|
297
|
+
|
|
298
|
+
## Sonuç
|
|
299
|
+
|
|
300
|
+
`@intlayer/lingui`, Lingui çağrı noktalarının bağlandığı kaynağı kökten yeniler: Genel örnek ve devasa tekil dil kataloğu yerine, doğrudan o bileşene özel derlenmiş sözlüğe bağlanır. Aynı TanStack Start uygulamasında bu, hiçbir makroya dokunmadan **7 kat daha küçük bileşenler**, **8-14 ms daha hızlı hidrasyon**, **2 kat daha hızlı dil değişimi** ve 42 ms'lik gecikmenin ortadan kalkması anlamına gelir. Bileşenlerdeki yerleşik yedek metinleri değiştirmediği için kaynak dil sızıntısı sürer ve çalışma zamanında ICU ayrıştırdığı için dinamik modda saf Lingui'ye kıyasla sayfa başına yaklaşık 20 KB daha fazla veri gönderir. Tercihinizi yaparken uygulamanızın performans hedeflerini dikkate alın.
|
|
301
|
+
|
|
302
|
+
Tüm ham veriler, test uygulamaları ve kıyaslama betikleri [Benchmark Bloom deposunda](https://github.com/intlayer-org/benchmark-bloom) mevcuttur. Kendiniz de çalıştırabilirsiniz.
|
|
303
|
+
|
|
304
|
+
Daha fazla ayrıntı için ['Neden Intlayer?' dokümantasyonuna](https://intlayer.org/tr/doc/why) göz atabilirsiniz.
|