@intlayer/docs 9.5.3 → 9.5.4-canary.0
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 +8 -8
- package/blog/ar/history_of_i18n.md +54 -54
- package/blog/ar/how_to_pick_react_i18n_library.md +548 -0
- package/blog/ar/how_to_pick_solid_i18n_library.md +438 -0
- package/blog/ar/how_to_pick_svelte_i18n_library.md +454 -0
- package/blog/ar/how_to_pick_vue_i18n_library.md +442 -0
- package/blog/ar/is_i18next_outdated.md +5 -1
- package/blog/ar/is_next-intl_outdated.md +5 -1
- package/blog/ar/is_vue-i18n_outdated.md +7 -1
- package/blog/ar/next-i18next_vs_next-intl_vs_intlayer.md +8 -4
- package/blog/ar/per-component_vs_centralized_i18n.md +9 -4
- package/blog/ar/react-i18next_vs_react-intl_vs_intlayer.md +5 -1
- package/blog/de/history_of_i18n.md +54 -54
- package/blog/de/how_to_pick_react_i18n_library.md +548 -0
- package/blog/de/how_to_pick_solid_i18n_library.md +451 -0
- package/blog/de/how_to_pick_svelte_i18n_library.md +454 -0
- package/blog/de/how_to_pick_vue_i18n_library.md +448 -0
- package/blog/de/is_i18next_outdated.md +5 -1
- package/blog/de/is_next-intl_outdated.md +5 -1
- package/blog/de/is_vue-i18n_outdated.md +7 -1
- package/blog/de/next-i18next_vs_next-intl_vs_intlayer.md +9 -5
- package/blog/de/per-component_vs_centralized_i18n.md +9 -4
- package/blog/de/react-i18next_vs_react-intl_vs_intlayer.md +5 -1
- package/blog/en/history_of_i18n.md +54 -54
- package/blog/en/how_to_pick_react_i18n_library.md +542 -0
- package/blog/en/how_to_pick_solid_i18n_library.md +438 -0
- package/blog/en/how_to_pick_svelte_i18n_library.md +448 -0
- package/blog/en/how_to_pick_vue_i18n_library.md +442 -0
- package/blog/en/is_i18next_outdated.md +5 -1
- package/blog/en/is_next-intl_outdated.md +5 -1
- package/blog/en/is_vue-i18n_outdated.md +7 -1
- package/blog/en/list_i18n_technologies/frameworks/react-router.md +2 -3
- package/blog/en/next-i18next_vs_next-intl_vs_intlayer.md +9 -5
- package/blog/en/per-component_vs_centralized_i18n.md +9 -4
- package/blog/en/react-i18next_vs_react-intl_vs_intlayer.md +5 -1
- package/blog/en-GB/history_of_i18n.md +54 -54
- package/blog/en-GB/how_to_pick_react_i18n_library.md +542 -0
- package/blog/en-GB/how_to_pick_solid_i18n_library.md +438 -0
- package/blog/en-GB/how_to_pick_svelte_i18n_library.md +448 -0
- package/blog/en-GB/how_to_pick_vue_i18n_library.md +448 -0
- package/blog/en-GB/is_i18next_outdated.md +5 -1
- package/blog/en-GB/is_next-intl_outdated.md +5 -1
- package/blog/en-GB/is_vue-i18n_outdated.md +7 -1
- package/blog/en-GB/next-i18next_vs_next-intl_vs_intlayer.md +9 -5
- package/blog/en-GB/per-component_vs_centralized_i18n.md +9 -4
- package/blog/en-GB/react-i18next_vs_react-intl_vs_intlayer.md +5 -1
- package/blog/es/history_of_i18n.md +54 -54
- package/blog/es/how_to_pick_react_i18n_library.md +542 -0
- package/blog/es/how_to_pick_solid_i18n_library.md +446 -0
- package/blog/es/how_to_pick_svelte_i18n_library.md +448 -0
- package/blog/es/how_to_pick_vue_i18n_library.md +442 -0
- package/blog/es/is_i18next_outdated.md +5 -1
- package/blog/es/is_next-intl_outdated.md +5 -1
- package/blog/es/is_vue-i18n_outdated.md +7 -1
- package/blog/es/next-i18next_vs_next-intl_vs_intlayer.md +9 -5
- package/blog/es/per-component_vs_centralized_i18n.md +9 -4
- package/blog/es/react-i18next_vs_react-intl_vs_intlayer.md +5 -1
- package/blog/fr/history_of_i18n.md +54 -54
- package/blog/fr/how_to_pick_react_i18n_library.md +542 -0
- package/blog/fr/how_to_pick_solid_i18n_library.md +438 -0
- package/blog/fr/how_to_pick_svelte_i18n_library.md +448 -0
- package/blog/fr/how_to_pick_vue_i18n_library.md +442 -0
- package/blog/fr/is_i18next_outdated.md +5 -1
- package/blog/fr/is_next-intl_outdated.md +5 -1
- package/blog/fr/is_vue-i18n_outdated.md +7 -1
- package/blog/fr/next-i18next_vs_next-intl_vs_intlayer.md +9 -5
- package/blog/fr/per-component_vs_centralized_i18n.md +9 -4
- package/blog/fr/react-i18next_vs_react-intl_vs_intlayer.md +5 -1
- package/blog/hi/history_of_i18n.md +54 -54
- package/blog/hi/how_to_pick_react_i18n_library.md +548 -0
- package/blog/hi/how_to_pick_solid_i18n_library.md +451 -0
- package/blog/hi/how_to_pick_svelte_i18n_library.md +448 -0
- package/blog/hi/how_to_pick_vue_i18n_library.md +442 -0
- package/blog/hi/is_i18next_outdated.md +5 -1
- package/blog/hi/is_next-intl_outdated.md +5 -1
- package/blog/hi/is_vue-i18n_outdated.md +7 -1
- package/blog/hi/next-i18next_vs_next-intl_vs_intlayer.md +8 -4
- package/blog/hi/per-component_vs_centralized_i18n.md +9 -4
- package/blog/hi/react-i18next_vs_react-intl_vs_intlayer.md +5 -1
- package/blog/id/history_of_i18n.md +54 -54
- package/blog/id/how_to_pick_react_i18n_library.md +548 -0
- package/blog/id/how_to_pick_solid_i18n_library.md +451 -0
- package/blog/id/how_to_pick_svelte_i18n_library.md +454 -0
- package/blog/id/how_to_pick_vue_i18n_library.md +442 -0
- package/blog/id/is_i18next_outdated.md +5 -1
- package/blog/id/is_next-intl_outdated.md +5 -1
- package/blog/id/is_vue-i18n_outdated.md +7 -1
- package/blog/id/next-i18next_vs_next-intl_vs_intlayer.md +9 -5
- package/blog/id/per-component_vs_centralized_i18n.md +9 -4
- package/blog/id/react-i18next_vs_react-intl_vs_intlayer.md +5 -1
- package/blog/it/history_of_i18n.md +54 -54
- package/blog/it/how_to_pick_react_i18n_library.md +549 -0
- package/blog/it/how_to_pick_solid_i18n_library.md +451 -0
- package/blog/it/how_to_pick_svelte_i18n_library.md +455 -0
- package/blog/it/how_to_pick_vue_i18n_library.md +449 -0
- package/blog/it/is_i18next_outdated.md +5 -1
- package/blog/it/is_next-intl_outdated.md +5 -1
- package/blog/it/is_vue-i18n_outdated.md +7 -1
- package/blog/it/next-i18next_vs_next-intl_vs_intlayer.md +9 -5
- package/blog/it/per-component_vs_centralized_i18n.md +9 -4
- package/blog/it/react-i18next_vs_react-intl_vs_intlayer.md +5 -1
- package/blog/ja/history_of_i18n.md +54 -54
- package/blog/ja/how_to_pick_react_i18n_library.md +542 -0
- package/blog/ja/how_to_pick_solid_i18n_library.md +451 -0
- package/blog/ja/how_to_pick_svelte_i18n_library.md +457 -0
- package/blog/ja/how_to_pick_vue_i18n_library.md +442 -0
- package/blog/ja/is_i18next_outdated.md +5 -1
- package/blog/ja/is_next-intl_outdated.md +5 -1
- package/blog/ja/is_vue-i18n_outdated.md +7 -1
- package/blog/ja/next-i18next_vs_next-intl_vs_intlayer.md +9 -5
- package/blog/ja/per-component_vs_centralized_i18n.md +9 -4
- package/blog/ja/react-i18next_vs_react-intl_vs_intlayer.md +5 -1
- package/blog/ko/history_of_i18n.md +54 -54
- package/blog/ko/how_to_pick_react_i18n_library.md +548 -0
- package/blog/ko/how_to_pick_solid_i18n_library.md +451 -0
- package/blog/ko/how_to_pick_svelte_i18n_library.md +454 -0
- package/blog/ko/how_to_pick_vue_i18n_library.md +448 -0
- package/blog/ko/is_i18next_outdated.md +5 -1
- package/blog/ko/is_next-intl_outdated.md +5 -1
- package/blog/ko/is_vue-i18n_outdated.md +7 -1
- package/blog/ko/next-i18next_vs_next-intl_vs_intlayer.md +9 -5
- package/blog/ko/per-component_vs_centralized_i18n.md +9 -4
- package/blog/ko/react-i18next_vs_react-intl_vs_intlayer.md +5 -1
- package/blog/pl/history_of_i18n.md +54 -54
- package/blog/pl/how_to_pick_react_i18n_library.md +549 -0
- package/blog/pl/how_to_pick_solid_i18n_library.md +438 -0
- package/blog/pl/how_to_pick_svelte_i18n_library.md +460 -0
- package/blog/pl/how_to_pick_vue_i18n_library.md +442 -0
- package/blog/pl/is_i18next_outdated.md +5 -1
- package/blog/pl/is_next-intl_outdated.md +5 -1
- package/blog/pl/is_vue-i18n_outdated.md +7 -1
- package/blog/pl/next-i18next_vs_next-intl_vs_intlayer.md +9 -5
- package/blog/pl/per-component_vs_centralized_i18n.md +9 -4
- package/blog/pl/react-i18next_vs_react-intl_vs_intlayer.md +5 -1
- package/blog/pt/history_of_i18n.md +54 -54
- package/blog/pt/how_to_pick_react_i18n_library.md +549 -0
- package/blog/pt/how_to_pick_solid_i18n_library.md +451 -0
- package/blog/pt/how_to_pick_svelte_i18n_library.md +454 -0
- package/blog/pt/how_to_pick_vue_i18n_library.md +448 -0
- package/blog/pt/is_i18next_outdated.md +5 -1
- package/blog/pt/is_next-intl_outdated.md +5 -1
- package/blog/pt/is_vue-i18n_outdated.md +7 -1
- package/blog/pt/next-i18next_vs_next-intl_vs_intlayer.md +9 -5
- package/blog/pt/per-component_vs_centralized_i18n.md +9 -4
- package/blog/pt/react-i18next_vs_react-intl_vs_intlayer.md +5 -1
- package/blog/ru/history_of_i18n.md +54 -54
- package/blog/ru/how_to_pick_react_i18n_library.md +553 -0
- package/blog/ru/how_to_pick_solid_i18n_library.md +451 -0
- package/blog/ru/how_to_pick_svelte_i18n_library.md +459 -0
- package/blog/ru/how_to_pick_vue_i18n_library.md +453 -0
- package/blog/ru/is_i18next_outdated.md +5 -1
- package/blog/ru/is_next-intl_outdated.md +5 -1
- package/blog/ru/is_vue-i18n_outdated.md +7 -1
- package/blog/ru/next-i18next_vs_next-intl_vs_intlayer.md +8 -4
- package/blog/ru/per-component_vs_centralized_i18n.md +9 -4
- package/blog/ru/react-i18next_vs_react-intl_vs_intlayer.md +5 -1
- package/blog/tr/history_of_i18n.md +54 -54
- package/blog/tr/how_to_pick_react_i18n_library.md +548 -0
- package/blog/tr/how_to_pick_solid_i18n_library.md +451 -0
- package/blog/tr/how_to_pick_svelte_i18n_library.md +454 -0
- package/blog/tr/how_to_pick_vue_i18n_library.md +448 -0
- package/blog/tr/is_i18next_outdated.md +5 -1
- package/blog/tr/is_next-intl_outdated.md +5 -1
- package/blog/tr/is_vue-i18n_outdated.md +7 -1
- package/blog/tr/next-i18next_vs_next-intl_vs_intlayer.md +9 -5
- package/blog/tr/per-component_vs_centralized_i18n.md +9 -4
- package/blog/tr/react-i18next_vs_react-intl_vs_intlayer.md +5 -1
- package/blog/uk/history_of_i18n.md +54 -54
- package/blog/uk/how_to_pick_react_i18n_library.md +542 -0
- package/blog/uk/how_to_pick_solid_i18n_library.md +451 -0
- package/blog/uk/how_to_pick_svelte_i18n_library.md +448 -0
- package/blog/uk/how_to_pick_vue_i18n_library.md +443 -0
- package/blog/uk/is_i18next_outdated.md +5 -1
- package/blog/uk/is_next-intl_outdated.md +5 -1
- package/blog/uk/is_vue-i18n_outdated.md +7 -1
- package/blog/uk/next-i18next_vs_next-intl_vs_intlayer.md +9 -5
- package/blog/uk/per-component_vs_centralized_i18n.md +9 -4
- package/blog/uk/react-i18next_vs_react-intl_vs_intlayer.md +5 -1
- package/blog/vi/history_of_i18n.md +54 -54
- package/blog/vi/how_to_pick_react_i18n_library.md +548 -0
- package/blog/vi/how_to_pick_solid_i18n_library.md +438 -0
- package/blog/vi/how_to_pick_svelte_i18n_library.md +448 -0
- package/blog/vi/how_to_pick_vue_i18n_library.md +442 -0
- package/blog/vi/is_i18next_outdated.md +5 -1
- package/blog/vi/is_next-intl_outdated.md +5 -1
- package/blog/vi/is_vue-i18n_outdated.md +7 -1
- package/blog/vi/next-i18next_vs_next-intl_vs_intlayer.md +9 -5
- package/blog/vi/per-component_vs_centralized_i18n.md +9 -4
- package/blog/vi/react-i18next_vs_react-intl_vs_intlayer.md +5 -1
- package/blog/zh/history_of_i18n.md +54 -54
- package/blog/zh/how_to_pick_react_i18n_library.md +548 -0
- package/blog/zh/how_to_pick_solid_i18n_library.md +451 -0
- package/blog/zh/how_to_pick_svelte_i18n_library.md +454 -0
- package/blog/zh/how_to_pick_vue_i18n_library.md +448 -0
- package/blog/zh/is_i18next_outdated.md +5 -1
- package/blog/zh/is_next-intl_outdated.md +5 -1
- package/blog/zh/is_vue-i18n_outdated.md +7 -1
- package/blog/zh/next-i18next_vs_next-intl_vs_intlayer.md +9 -5
- package/blog/zh/per-component_vs_centralized_i18n.md +9 -4
- package/blog/zh/react-i18next_vs_react-intl_vs_intlayer.md +5 -1
- package/dist/cjs/generated/blog.entry.cjs +80 -0
- package/dist/cjs/generated/blog.entry.cjs.map +1 -1
- package/dist/cjs/index.cjs +1 -1
- package/dist/esm/generated/blog.entry.mjs +80 -0
- package/dist/esm/generated/blog.entry.mjs.map +1 -1
- package/dist/esm/index.mjs +1 -1
- package/dist/types/generated/blog.entry.d.ts +4 -0
- package/dist/types/generated/blog.entry.d.ts.map +1 -1
- package/docs/ar/bundle_optimization.md +5 -1
- package/docs/ar/how_works_intlayer.md +2 -2
- package/docs/ar/interest_of_intlayer.md +6 -6
- package/docs/ar/intlayer_CMS.md +1 -1
- package/docs/ar/intlayer_with_adonisjs.md +1 -1
- package/docs/ar/intlayer_with_analog.md +1 -1
- package/docs/ar/intlayer_with_angular_19.md +1 -1
- package/docs/ar/intlayer_with_angular_21.md +1 -1
- package/docs/ar/intlayer_with_astro.md +1 -1
- package/docs/ar/intlayer_with_astro_lit.md +1 -1
- package/docs/ar/intlayer_with_astro_preact.md +1 -1
- package/docs/ar/intlayer_with_astro_react.md +1 -1
- package/docs/ar/intlayer_with_astro_solid.md +1 -1
- package/docs/ar/intlayer_with_astro_svelte.md +1 -1
- package/docs/ar/intlayer_with_astro_vanilla.md +1 -1
- package/docs/ar/intlayer_with_astro_vue.md +1 -1
- package/docs/ar/intlayer_with_create_react_app.md +1 -1
- package/docs/ar/intlayer_with_express.md +1 -1
- package/docs/ar/intlayer_with_hono.md +1 -1
- package/docs/ar/intlayer_with_nestjs.md +1 -1
- package/docs/ar/intlayer_with_nextjs_14.md +1 -1
- package/docs/ar/intlayer_with_nextjs_15.md +1 -1
- package/docs/ar/intlayer_with_nextjs_16.md +1 -1
- package/docs/ar/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/ar/intlayer_with_react_router_v7.md +1 -1
- package/docs/ar/intlayer_with_vite+preact.md +1 -1
- package/docs/ar/intlayer_with_vite+react.md +1 -1
- package/docs/ar/intlayer_with_vite+vue.md +1 -1
- package/docs/ar/introduction.md +0 -1
- package/docs/ar/readme.md +8 -8
- package/docs/bn/bundle_optimization.md +5 -1
- package/docs/bn/interest_of_intlayer.md +21 -21
- package/docs/bn/intlayer_CMS.md +1 -1
- package/docs/bn/intlayer_with_angular_21.md +1 -1
- package/docs/bn/intlayer_with_hono.md +1 -1
- package/docs/bn/introduction.md +0 -1
- package/docs/cs/bundle_optimization.md +5 -1
- package/docs/cs/interest_of_intlayer.md +6 -6
- package/docs/cs/intlayer_with_angular_21.md +1 -1
- package/docs/cs/intlayer_with_hono.md +1 -1
- package/docs/cs/introduction.md +0 -1
- package/docs/de/bundle_optimization.md +5 -1
- package/docs/de/how_works_intlayer.md +2 -2
- package/docs/de/interest_of_intlayer.md +6 -6
- package/docs/de/intlayer_CMS.md +1 -1
- package/docs/de/intlayer_with_adonisjs.md +1 -1
- package/docs/de/intlayer_with_analog.md +1 -1
- package/docs/de/intlayer_with_angular_19.md +1 -1
- package/docs/de/intlayer_with_angular_21.md +1 -1
- package/docs/de/intlayer_with_astro.md +1 -1
- package/docs/de/intlayer_with_astro_lit.md +1 -1
- package/docs/de/intlayer_with_astro_preact.md +1 -1
- package/docs/de/intlayer_with_astro_react.md +1 -1
- package/docs/de/intlayer_with_astro_solid.md +1 -1
- package/docs/de/intlayer_with_astro_svelte.md +1 -1
- package/docs/de/intlayer_with_astro_vanilla.md +1 -1
- package/docs/de/intlayer_with_astro_vue.md +1 -1
- package/docs/de/intlayer_with_create_react_app.md +1 -1
- package/docs/de/intlayer_with_express.md +1 -1
- package/docs/de/intlayer_with_hono.md +1 -1
- package/docs/de/intlayer_with_nestjs.md +1 -1
- package/docs/de/intlayer_with_nextjs_14.md +1 -1
- package/docs/de/intlayer_with_nextjs_15.md +1 -1
- package/docs/de/intlayer_with_nextjs_16.md +1 -1
- package/docs/de/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/de/intlayer_with_vite+preact.md +1 -1
- package/docs/de/intlayer_with_vite+react.md +1 -1
- package/docs/de/intlayer_with_vite+vue.md +1 -1
- package/docs/de/introduction.md +0 -1
- package/docs/de/readme.md +8 -8
- package/docs/en/bundle_optimization.md +5 -1
- package/docs/en/how_works_intlayer.md +2 -2
- package/docs/en/interest_of_intlayer.md +6 -6
- package/docs/en/intlayer_CMS.md +1 -1
- package/docs/en/intlayer_with_adonisjs.md +1 -1
- package/docs/en/intlayer_with_analog.md +1 -1
- package/docs/en/intlayer_with_angular_19.md +1 -1
- package/docs/en/intlayer_with_angular_21.md +1 -1
- package/docs/en/intlayer_with_astro.md +1 -1
- package/docs/en/intlayer_with_astro_lit.md +1 -1
- package/docs/en/intlayer_with_astro_preact.md +1 -1
- package/docs/en/intlayer_with_astro_react.md +1 -1
- package/docs/en/intlayer_with_astro_solid.md +1 -1
- package/docs/en/intlayer_with_astro_svelte.md +1 -1
- package/docs/en/intlayer_with_astro_vanilla.md +1 -1
- package/docs/en/intlayer_with_astro_vue.md +1 -1
- package/docs/en/intlayer_with_create_react_app.md +1 -1
- package/docs/en/intlayer_with_express.md +1 -1
- package/docs/en/intlayer_with_hono.md +1 -1
- package/docs/en/intlayer_with_nestjs.md +1 -1
- package/docs/en/intlayer_with_nextjs_14.md +1 -1
- package/docs/en/intlayer_with_nextjs_15.md +1 -1
- package/docs/en/intlayer_with_nextjs_16.md +1 -1
- package/docs/en/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/en/intlayer_with_vite+preact.md +1 -1
- package/docs/en/intlayer_with_vite+react.md +1 -1
- package/docs/en/intlayer_with_vite+vue.md +1 -1
- package/docs/en/introduction.md +0 -1
- package/docs/en/readme.md +8 -8
- package/docs/en-GB/bundle_optimization.md +5 -1
- package/docs/en-GB/how_works_intlayer.md +2 -2
- package/docs/en-GB/interest_of_intlayer.md +6 -6
- package/docs/en-GB/intlayer_CMS.md +1 -1
- package/docs/en-GB/intlayer_with_adonisjs.md +1 -1
- package/docs/en-GB/intlayer_with_analog.md +1 -1
- package/docs/en-GB/intlayer_with_angular_19.md +1 -1
- package/docs/en-GB/intlayer_with_angular_21.md +1 -1
- package/docs/en-GB/intlayer_with_astro.md +1 -1
- package/docs/en-GB/intlayer_with_astro_lit.md +1 -1
- package/docs/en-GB/intlayer_with_astro_preact.md +1 -1
- package/docs/en-GB/intlayer_with_astro_react.md +1 -1
- package/docs/en-GB/intlayer_with_astro_solid.md +1 -1
- package/docs/en-GB/intlayer_with_astro_svelte.md +1 -1
- package/docs/en-GB/intlayer_with_astro_vanilla.md +1 -1
- package/docs/en-GB/intlayer_with_astro_vue.md +1 -1
- package/docs/en-GB/intlayer_with_create_react_app.md +1 -1
- package/docs/en-GB/intlayer_with_express.md +1 -1
- package/docs/en-GB/intlayer_with_hono.md +1 -1
- package/docs/en-GB/intlayer_with_nestjs.md +1 -1
- package/docs/en-GB/intlayer_with_nextjs_14.md +1 -1
- package/docs/en-GB/intlayer_with_nextjs_15.md +1 -1
- package/docs/en-GB/intlayer_with_nextjs_16.md +1 -1
- package/docs/en-GB/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/en-GB/intlayer_with_vite+preact.md +1 -1
- package/docs/en-GB/intlayer_with_vite+react.md +1 -1
- package/docs/en-GB/intlayer_with_vite+vue.md +1 -1
- package/docs/en-GB/introduction.md +0 -1
- package/docs/en-GB/readme.md +8 -8
- package/docs/es/bundle_optimization.md +5 -1
- package/docs/es/how_works_intlayer.md +2 -2
- package/docs/es/interest_of_intlayer.md +6 -6
- package/docs/es/intlayer_CMS.md +1 -1
- package/docs/es/intlayer_with_adonisjs.md +1 -1
- package/docs/es/intlayer_with_analog.md +1 -1
- package/docs/es/intlayer_with_angular_19.md +1 -1
- package/docs/es/intlayer_with_angular_21.md +1 -1
- package/docs/es/intlayer_with_astro.md +1 -1
- package/docs/es/intlayer_with_astro_lit.md +1 -1
- package/docs/es/intlayer_with_astro_preact.md +1 -1
- package/docs/es/intlayer_with_astro_react.md +1 -1
- package/docs/es/intlayer_with_astro_solid.md +1 -1
- package/docs/es/intlayer_with_astro_svelte.md +1 -1
- package/docs/es/intlayer_with_astro_vanilla.md +1 -1
- package/docs/es/intlayer_with_astro_vue.md +1 -1
- package/docs/es/intlayer_with_create_react_app.md +1 -1
- package/docs/es/intlayer_with_express.md +1 -1
- package/docs/es/intlayer_with_hono.md +1 -1
- package/docs/es/intlayer_with_nestjs.md +1 -1
- package/docs/es/intlayer_with_nextjs_14.md +1 -1
- package/docs/es/intlayer_with_nextjs_15.md +1 -1
- package/docs/es/intlayer_with_nextjs_16.md +1 -1
- package/docs/es/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/es/intlayer_with_vite+preact.md +1 -1
- package/docs/es/intlayer_with_vite+react.md +1 -1
- package/docs/es/intlayer_with_vite+vue.md +1 -1
- package/docs/es/introduction.md +0 -1
- package/docs/es/readme.md +8 -8
- package/docs/fr/bundle_optimization.md +5 -1
- package/docs/fr/how_works_intlayer.md +2 -2
- package/docs/fr/interest_of_intlayer.md +6 -6
- package/docs/fr/intlayer_CMS.md +1 -1
- package/docs/fr/intlayer_with_adonisjs.md +1 -1
- package/docs/fr/intlayer_with_analog.md +1 -1
- package/docs/fr/intlayer_with_angular_19.md +1 -1
- package/docs/fr/intlayer_with_angular_21.md +1 -1
- package/docs/fr/intlayer_with_astro.md +1 -1
- package/docs/fr/intlayer_with_astro_lit.md +1 -1
- package/docs/fr/intlayer_with_astro_preact.md +1 -1
- package/docs/fr/intlayer_with_astro_react.md +1 -1
- package/docs/fr/intlayer_with_astro_solid.md +1 -1
- package/docs/fr/intlayer_with_astro_svelte.md +1 -1
- package/docs/fr/intlayer_with_astro_vanilla.md +1 -1
- package/docs/fr/intlayer_with_astro_vue.md +1 -1
- package/docs/fr/intlayer_with_create_react_app.md +1 -1
- package/docs/fr/intlayer_with_express.md +1 -1
- package/docs/fr/intlayer_with_hono.md +1 -1
- package/docs/fr/intlayer_with_nestjs.md +1 -1
- package/docs/fr/intlayer_with_nextjs_14.md +1 -1
- package/docs/fr/intlayer_with_nextjs_15.md +1 -1
- package/docs/fr/intlayer_with_nextjs_16.md +1 -1
- package/docs/fr/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/fr/intlayer_with_react_router_v7.md +2 -2
- package/docs/fr/intlayer_with_vite+preact.md +1 -1
- package/docs/fr/intlayer_with_vite+react.md +1 -1
- package/docs/fr/intlayer_with_vite+vue.md +1 -1
- package/docs/fr/introduction.md +0 -1
- package/docs/fr/readme.md +8 -8
- package/docs/hi/bundle_optimization.md +5 -1
- package/docs/hi/how_works_intlayer.md +2 -2
- package/docs/hi/interest_of_intlayer.md +6 -6
- package/docs/hi/intlayer_CMS.md +1 -1
- package/docs/hi/intlayer_with_adonisjs.md +1 -1
- package/docs/hi/intlayer_with_analog.md +1 -1
- package/docs/hi/intlayer_with_angular_19.md +1 -1
- package/docs/hi/intlayer_with_angular_21.md +1 -1
- package/docs/hi/intlayer_with_astro.md +1 -1
- package/docs/hi/intlayer_with_astro_lit.md +1 -1
- package/docs/hi/intlayer_with_astro_preact.md +1 -1
- package/docs/hi/intlayer_with_astro_react.md +1 -1
- package/docs/hi/intlayer_with_astro_solid.md +1 -1
- package/docs/hi/intlayer_with_astro_svelte.md +1 -1
- package/docs/hi/intlayer_with_astro_vanilla.md +1 -1
- package/docs/hi/intlayer_with_astro_vue.md +1 -1
- package/docs/hi/intlayer_with_create_react_app.md +1 -1
- package/docs/hi/intlayer_with_express.md +1 -1
- package/docs/hi/intlayer_with_hono.md +1 -1
- package/docs/hi/intlayer_with_nestjs.md +1 -1
- package/docs/hi/intlayer_with_nextjs_14.md +1 -1
- package/docs/hi/intlayer_with_nextjs_15.md +1 -1
- package/docs/hi/intlayer_with_nextjs_16.md +1 -1
- package/docs/hi/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/hi/intlayer_with_react_router_v7.md +1 -1
- package/docs/hi/intlayer_with_vite+preact.md +1 -1
- package/docs/hi/intlayer_with_vite+react.md +1 -1
- package/docs/hi/intlayer_with_vite+vue.md +1 -1
- package/docs/hi/introduction.md +0 -1
- package/docs/hi/readme.md +8 -8
- package/docs/id/bundle_optimization.md +5 -1
- package/docs/id/how_works_intlayer.md +2 -2
- package/docs/id/interest_of_intlayer.md +6 -6
- package/docs/id/intlayer_CMS.md +1 -1
- package/docs/id/intlayer_with_adonisjs.md +1 -1
- package/docs/id/intlayer_with_analog.md +1 -1
- package/docs/id/intlayer_with_angular_19.md +1 -1
- package/docs/id/intlayer_with_angular_21.md +1 -1
- package/docs/id/intlayer_with_astro.md +1 -1
- package/docs/id/intlayer_with_astro_lit.md +1 -1
- package/docs/id/intlayer_with_astro_preact.md +1 -1
- package/docs/id/intlayer_with_astro_react.md +1 -1
- package/docs/id/intlayer_with_astro_solid.md +1 -1
- package/docs/id/intlayer_with_astro_svelte.md +1 -1
- package/docs/id/intlayer_with_astro_vanilla.md +1 -1
- package/docs/id/intlayer_with_astro_vue.md +1 -1
- package/docs/id/intlayer_with_create_react_app.md +1 -1
- package/docs/id/intlayer_with_express.md +1 -1
- package/docs/id/intlayer_with_hono.md +1 -1
- package/docs/id/intlayer_with_nestjs.md +1 -1
- package/docs/id/intlayer_with_nextjs_14.md +1 -1
- package/docs/id/intlayer_with_nextjs_15.md +1 -1
- package/docs/id/intlayer_with_nextjs_16.md +1 -1
- package/docs/id/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/id/intlayer_with_react_router_v7.md +1 -1
- package/docs/id/intlayer_with_vite+preact.md +1 -1
- package/docs/id/intlayer_with_vite+react.md +1 -1
- package/docs/id/intlayer_with_vite+vue.md +1 -1
- package/docs/id/introduction.md +0 -1
- package/docs/id/readme.md +8 -8
- package/docs/it/bundle_optimization.md +5 -1
- package/docs/it/how_works_intlayer.md +2 -2
- package/docs/it/interest_of_intlayer.md +6 -6
- package/docs/it/intlayer_CMS.md +1 -1
- package/docs/it/intlayer_with_adonisjs.md +1 -1
- package/docs/it/intlayer_with_analog.md +1 -1
- package/docs/it/intlayer_with_angular_19.md +1 -1
- package/docs/it/intlayer_with_angular_21.md +1 -1
- package/docs/it/intlayer_with_astro.md +1 -1
- package/docs/it/intlayer_with_astro_lit.md +1 -1
- package/docs/it/intlayer_with_astro_preact.md +1 -1
- package/docs/it/intlayer_with_astro_react.md +1 -1
- package/docs/it/intlayer_with_astro_solid.md +1 -1
- package/docs/it/intlayer_with_astro_svelte.md +1 -1
- package/docs/it/intlayer_with_astro_vanilla.md +1 -1
- package/docs/it/intlayer_with_astro_vue.md +1 -1
- package/docs/it/intlayer_with_create_react_app.md +1 -1
- package/docs/it/intlayer_with_express.md +1 -1
- package/docs/it/intlayer_with_hono.md +1 -1
- package/docs/it/intlayer_with_nestjs.md +1 -1
- package/docs/it/intlayer_with_nextjs_14.md +1 -1
- package/docs/it/intlayer_with_nextjs_15.md +1 -1
- package/docs/it/intlayer_with_nextjs_16.md +1 -1
- package/docs/it/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/it/intlayer_with_react_router_v7.md +2 -2
- package/docs/it/intlayer_with_vite+preact.md +1 -1
- package/docs/it/intlayer_with_vite+react.md +1 -1
- package/docs/it/intlayer_with_vite+vue.md +1 -1
- package/docs/it/introduction.md +0 -1
- package/docs/it/readme.md +8 -8
- package/docs/ja/bundle_optimization.md +5 -1
- package/docs/ja/how_works_intlayer.md +2 -2
- package/docs/ja/interest_of_intlayer.md +6 -6
- package/docs/ja/intlayer_CMS.md +1 -1
- package/docs/ja/intlayer_with_adonisjs.md +1 -1
- package/docs/ja/intlayer_with_analog.md +1 -1
- package/docs/ja/intlayer_with_angular_19.md +1 -1
- package/docs/ja/intlayer_with_angular_21.md +1 -1
- package/docs/ja/intlayer_with_astro.md +1 -1
- package/docs/ja/intlayer_with_astro_lit.md +1 -1
- package/docs/ja/intlayer_with_astro_preact.md +1 -1
- package/docs/ja/intlayer_with_astro_react.md +1 -1
- package/docs/ja/intlayer_with_astro_solid.md +1 -1
- package/docs/ja/intlayer_with_astro_svelte.md +1 -1
- package/docs/ja/intlayer_with_astro_vanilla.md +1 -1
- package/docs/ja/intlayer_with_astro_vue.md +1 -1
- package/docs/ja/intlayer_with_create_react_app.md +1 -1
- package/docs/ja/intlayer_with_express.md +1 -1
- package/docs/ja/intlayer_with_hono.md +1 -1
- package/docs/ja/intlayer_with_nestjs.md +1 -1
- package/docs/ja/intlayer_with_nextjs_14.md +1 -1
- package/docs/ja/intlayer_with_nextjs_15.md +1 -1
- package/docs/ja/intlayer_with_nextjs_16.md +1 -1
- package/docs/ja/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/ja/intlayer_with_vite+preact.md +1 -1
- package/docs/ja/intlayer_with_vite+react.md +1 -1
- package/docs/ja/intlayer_with_vite+vue.md +1 -1
- package/docs/ja/introduction.md +0 -1
- package/docs/ja/readme.md +8 -8
- package/docs/ko/bundle_optimization.md +5 -1
- package/docs/ko/how_works_intlayer.md +2 -2
- package/docs/ko/interest_of_intlayer.md +6 -6
- package/docs/ko/intlayer_CMS.md +1 -1
- package/docs/ko/intlayer_with_adonisjs.md +1 -1
- package/docs/ko/intlayer_with_analog.md +1 -1
- package/docs/ko/intlayer_with_angular_19.md +1 -1
- package/docs/ko/intlayer_with_angular_21.md +1 -1
- package/docs/ko/intlayer_with_astro.md +1 -1
- package/docs/ko/intlayer_with_astro_lit.md +1 -1
- package/docs/ko/intlayer_with_astro_preact.md +1 -1
- package/docs/ko/intlayer_with_astro_react.md +1 -1
- package/docs/ko/intlayer_with_astro_solid.md +1 -1
- package/docs/ko/intlayer_with_astro_svelte.md +1 -1
- package/docs/ko/intlayer_with_astro_vanilla.md +1 -1
- package/docs/ko/intlayer_with_astro_vue.md +1 -1
- package/docs/ko/intlayer_with_create_react_app.md +1 -1
- package/docs/ko/intlayer_with_express.md +1 -1
- package/docs/ko/intlayer_with_hono.md +1 -1
- package/docs/ko/intlayer_with_nestjs.md +1 -1
- package/docs/ko/intlayer_with_nextjs_14.md +1 -1
- package/docs/ko/intlayer_with_nextjs_15.md +1 -1
- package/docs/ko/intlayer_with_nextjs_16.md +1 -1
- package/docs/ko/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/ko/intlayer_with_react_router_v7.md +2 -2
- package/docs/ko/intlayer_with_vite+preact.md +1 -1
- package/docs/ko/intlayer_with_vite+react.md +1 -1
- package/docs/ko/intlayer_with_vite+vue.md +1 -1
- package/docs/ko/introduction.md +0 -1
- package/docs/ko/readme.md +8 -8
- package/docs/nl/bundle_optimization.md +5 -1
- package/docs/nl/interest_of_intlayer.md +6 -6
- package/docs/nl/intlayer_with_angular_21.md +1 -1
- package/docs/nl/intlayer_with_hono.md +1 -1
- package/docs/nl/introduction.md +0 -1
- package/docs/pl/bundle_optimization.md +5 -1
- package/docs/pl/how_works_intlayer.md +2 -2
- package/docs/pl/interest_of_intlayer.md +6 -6
- package/docs/pl/intlayer_CMS.md +1 -1
- package/docs/pl/intlayer_with_adonisjs.md +1 -1
- package/docs/pl/intlayer_with_analog.md +1 -1
- package/docs/pl/intlayer_with_angular_19.md +1 -1
- package/docs/pl/intlayer_with_angular_21.md +1 -1
- package/docs/pl/intlayer_with_astro.md +1 -1
- package/docs/pl/intlayer_with_astro_lit.md +1 -1
- package/docs/pl/intlayer_with_astro_preact.md +1 -1
- package/docs/pl/intlayer_with_astro_react.md +1 -1
- package/docs/pl/intlayer_with_astro_solid.md +1 -1
- package/docs/pl/intlayer_with_astro_svelte.md +1 -1
- package/docs/pl/intlayer_with_astro_vanilla.md +1 -1
- package/docs/pl/intlayer_with_astro_vue.md +1 -1
- package/docs/pl/intlayer_with_create_react_app.md +1 -1
- package/docs/pl/intlayer_with_express.md +1 -1
- package/docs/pl/intlayer_with_hono.md +1 -1
- package/docs/pl/intlayer_with_nestjs.md +1 -1
- package/docs/pl/intlayer_with_nextjs_14.md +1 -1
- package/docs/pl/intlayer_with_nextjs_15.md +1 -1
- package/docs/pl/intlayer_with_nextjs_16.md +1 -1
- package/docs/pl/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/pl/intlayer_with_react_router_v7.md +2 -2
- package/docs/pl/intlayer_with_vite+preact.md +1 -1
- package/docs/pl/intlayer_with_vite+react.md +1 -1
- package/docs/pl/intlayer_with_vite+vue.md +1 -1
- package/docs/pl/introduction.md +0 -1
- package/docs/pl/readme.md +8 -8
- package/docs/pt/bundle_optimization.md +5 -1
- package/docs/pt/how_works_intlayer.md +2 -2
- package/docs/pt/interest_of_intlayer.md +6 -6
- package/docs/pt/intlayer_CMS.md +1 -1
- package/docs/pt/intlayer_with_adonisjs.md +1 -1
- package/docs/pt/intlayer_with_analog.md +1 -1
- package/docs/pt/intlayer_with_angular_19.md +1 -1
- package/docs/pt/intlayer_with_angular_21.md +1 -1
- package/docs/pt/intlayer_with_astro.md +1 -1
- package/docs/pt/intlayer_with_astro_lit.md +1 -1
- package/docs/pt/intlayer_with_astro_preact.md +1 -1
- package/docs/pt/intlayer_with_astro_react.md +1 -1
- package/docs/pt/intlayer_with_astro_solid.md +1 -1
- package/docs/pt/intlayer_with_astro_svelte.md +1 -1
- package/docs/pt/intlayer_with_astro_vanilla.md +1 -1
- package/docs/pt/intlayer_with_astro_vue.md +1 -1
- package/docs/pt/intlayer_with_create_react_app.md +1 -1
- package/docs/pt/intlayer_with_express.md +1 -1
- package/docs/pt/intlayer_with_hono.md +1 -1
- package/docs/pt/intlayer_with_nestjs.md +1 -1
- package/docs/pt/intlayer_with_nextjs_14.md +1 -1
- package/docs/pt/intlayer_with_nextjs_15.md +1 -1
- package/docs/pt/intlayer_with_nextjs_16.md +1 -1
- package/docs/pt/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/pt/intlayer_with_react_router_v7.md +2 -2
- package/docs/pt/intlayer_with_vite+preact.md +1 -1
- package/docs/pt/intlayer_with_vite+react.md +1 -1
- package/docs/pt/intlayer_with_vite+vue.md +1 -1
- package/docs/pt/introduction.md +0 -1
- package/docs/pt/readme.md +8 -8
- package/docs/ru/bundle_optimization.md +5 -1
- package/docs/ru/how_works_intlayer.md +2 -2
- package/docs/ru/interest_of_intlayer.md +6 -6
- package/docs/ru/intlayer_CMS.md +1 -1
- package/docs/ru/intlayer_with_adonisjs.md +1 -1
- package/docs/ru/intlayer_with_analog.md +1 -1
- package/docs/ru/intlayer_with_angular_19.md +1 -1
- package/docs/ru/intlayer_with_angular_21.md +1 -1
- package/docs/ru/intlayer_with_astro.md +1 -1
- package/docs/ru/intlayer_with_astro_lit.md +1 -1
- package/docs/ru/intlayer_with_astro_preact.md +1 -1
- package/docs/ru/intlayer_with_astro_react.md +1 -1
- package/docs/ru/intlayer_with_astro_solid.md +1 -1
- package/docs/ru/intlayer_with_astro_svelte.md +1 -1
- package/docs/ru/intlayer_with_astro_vanilla.md +1 -1
- package/docs/ru/intlayer_with_astro_vue.md +1 -1
- package/docs/ru/intlayer_with_create_react_app.md +1 -1
- package/docs/ru/intlayer_with_express.md +1 -1
- package/docs/ru/intlayer_with_hono.md +1 -1
- package/docs/ru/intlayer_with_nestjs.md +1 -1
- package/docs/ru/intlayer_with_nextjs_14.md +1 -1
- package/docs/ru/intlayer_with_nextjs_15.md +1 -1
- package/docs/ru/intlayer_with_nextjs_16.md +1 -1
- package/docs/ru/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/ru/intlayer_with_react_router_v7.md +2 -2
- package/docs/ru/intlayer_with_vite+preact.md +1 -1
- package/docs/ru/intlayer_with_vite+react.md +1 -1
- package/docs/ru/intlayer_with_vite+vue.md +1 -1
- package/docs/ru/introduction.md +0 -1
- package/docs/ru/readme.md +8 -8
- package/docs/tr/bundle_optimization.md +5 -1
- package/docs/tr/how_works_intlayer.md +2 -2
- package/docs/tr/interest_of_intlayer.md +6 -6
- package/docs/tr/intlayer_CMS.md +1 -1
- package/docs/tr/intlayer_with_adonisjs.md +1 -1
- package/docs/tr/intlayer_with_analog.md +1 -1
- package/docs/tr/intlayer_with_angular_19.md +1 -1
- package/docs/tr/intlayer_with_angular_21.md +1 -1
- package/docs/tr/intlayer_with_astro.md +1 -1
- package/docs/tr/intlayer_with_astro_lit.md +1 -1
- package/docs/tr/intlayer_with_astro_preact.md +1 -1
- package/docs/tr/intlayer_with_astro_react.md +1 -1
- package/docs/tr/intlayer_with_astro_solid.md +1 -1
- package/docs/tr/intlayer_with_astro_svelte.md +1 -1
- package/docs/tr/intlayer_with_astro_vanilla.md +1 -1
- package/docs/tr/intlayer_with_astro_vue.md +1 -1
- package/docs/tr/intlayer_with_create_react_app.md +1 -1
- package/docs/tr/intlayer_with_express.md +1 -1
- package/docs/tr/intlayer_with_hono.md +1 -1
- package/docs/tr/intlayer_with_nestjs.md +1 -1
- package/docs/tr/intlayer_with_nextjs_14.md +1 -1
- package/docs/tr/intlayer_with_nextjs_15.md +1 -1
- package/docs/tr/intlayer_with_nextjs_16.md +1 -1
- package/docs/tr/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/tr/intlayer_with_react_router_v7.md +1 -1
- package/docs/tr/intlayer_with_vite+preact.md +1 -1
- package/docs/tr/intlayer_with_vite+react.md +1 -1
- package/docs/tr/intlayer_with_vite+vue.md +1 -1
- package/docs/tr/introduction.md +0 -1
- package/docs/tr/readme.md +8 -8
- package/docs/uk/bundle_optimization.md +5 -1
- package/docs/uk/how_works_intlayer.md +2 -2
- package/docs/uk/interest_of_intlayer.md +6 -6
- package/docs/uk/intlayer_CMS.md +1 -1
- package/docs/uk/intlayer_with_adonisjs.md +1 -1
- package/docs/uk/intlayer_with_analog.md +1 -1
- package/docs/uk/intlayer_with_angular_19.md +1 -1
- package/docs/uk/intlayer_with_angular_21.md +1 -1
- package/docs/uk/intlayer_with_astro.md +1 -1
- package/docs/uk/intlayer_with_astro_lit.md +1 -1
- package/docs/uk/intlayer_with_astro_preact.md +1 -1
- package/docs/uk/intlayer_with_astro_react.md +1 -1
- package/docs/uk/intlayer_with_astro_solid.md +1 -1
- package/docs/uk/intlayer_with_astro_svelte.md +1 -1
- package/docs/uk/intlayer_with_astro_vanilla.md +1 -1
- package/docs/uk/intlayer_with_astro_vue.md +1 -1
- package/docs/uk/intlayer_with_create_react_app.md +1 -1
- package/docs/uk/intlayer_with_express.md +1 -1
- package/docs/uk/intlayer_with_hono.md +1 -1
- package/docs/uk/intlayer_with_nestjs.md +1 -1
- package/docs/uk/intlayer_with_nextjs_14.md +1 -1
- package/docs/uk/intlayer_with_nextjs_15.md +1 -1
- package/docs/uk/intlayer_with_nextjs_16.md +1 -1
- package/docs/uk/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/uk/intlayer_with_react_router_v7.md +1 -1
- package/docs/uk/intlayer_with_vite+preact.md +1 -1
- package/docs/uk/intlayer_with_vite+react.md +1 -1
- package/docs/uk/intlayer_with_vite+vue.md +1 -1
- package/docs/uk/introduction.md +0 -1
- package/docs/uk/readme.md +8 -8
- package/docs/ur/bundle_optimization.md +5 -1
- package/docs/ur/interest_of_intlayer.md +6 -6
- package/docs/ur/intlayer_with_angular_21.md +1 -1
- package/docs/ur/intlayer_with_hono.md +1 -1
- package/docs/ur/introduction.md +0 -1
- package/docs/vi/bundle_optimization.md +5 -1
- package/docs/vi/how_works_intlayer.md +2 -2
- package/docs/vi/interest_of_intlayer.md +6 -6
- package/docs/vi/intlayer_CMS.md +1 -1
- package/docs/vi/intlayer_with_adonisjs.md +1 -1
- package/docs/vi/intlayer_with_analog.md +1 -1
- package/docs/vi/intlayer_with_angular_19.md +1 -1
- package/docs/vi/intlayer_with_angular_21.md +1 -1
- package/docs/vi/intlayer_with_astro.md +1 -1
- package/docs/vi/intlayer_with_astro_lit.md +1 -1
- package/docs/vi/intlayer_with_astro_preact.md +1 -1
- package/docs/vi/intlayer_with_astro_react.md +1 -1
- package/docs/vi/intlayer_with_astro_solid.md +1 -1
- package/docs/vi/intlayer_with_astro_svelte.md +1 -1
- package/docs/vi/intlayer_with_astro_vanilla.md +1 -1
- package/docs/vi/intlayer_with_astro_vue.md +1 -1
- package/docs/vi/intlayer_with_create_react_app.md +1 -1
- package/docs/vi/intlayer_with_express.md +1 -1
- package/docs/vi/intlayer_with_hono.md +1 -1
- package/docs/vi/intlayer_with_nestjs.md +1 -1
- package/docs/vi/intlayer_with_nextjs_14.md +1 -1
- package/docs/vi/intlayer_with_nextjs_15.md +1 -1
- package/docs/vi/intlayer_with_nextjs_16.md +1 -1
- package/docs/vi/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/vi/intlayer_with_vite+preact.md +1 -1
- package/docs/vi/intlayer_with_vite+react.md +1 -1
- package/docs/vi/intlayer_with_vite+vue.md +1 -1
- package/docs/vi/introduction.md +0 -1
- package/docs/vi/readme.md +8 -8
- package/docs/zh/bundle_optimization.md +5 -1
- package/docs/zh/how_works_intlayer.md +2 -2
- package/docs/zh/interest_of_intlayer.md +6 -6
- package/docs/zh/intlayer_CMS.md +1 -1
- package/docs/zh/intlayer_with_adonisjs.md +1 -1
- package/docs/zh/intlayer_with_analog.md +1 -1
- package/docs/zh/intlayer_with_angular_19.md +1 -1
- package/docs/zh/intlayer_with_angular_21.md +1 -1
- package/docs/zh/intlayer_with_astro.md +1 -1
- package/docs/zh/intlayer_with_astro_lit.md +1 -1
- package/docs/zh/intlayer_with_astro_preact.md +1 -1
- package/docs/zh/intlayer_with_astro_react.md +1 -1
- package/docs/zh/intlayer_with_astro_solid.md +1 -1
- package/docs/zh/intlayer_with_astro_svelte.md +1 -1
- package/docs/zh/intlayer_with_astro_vanilla.md +1 -1
- package/docs/zh/intlayer_with_astro_vue.md +1 -1
- package/docs/zh/intlayer_with_create_react_app.md +1 -1
- package/docs/zh/intlayer_with_express.md +1 -1
- package/docs/zh/intlayer_with_hono.md +1 -1
- package/docs/zh/intlayer_with_nestjs.md +1 -1
- package/docs/zh/intlayer_with_nextjs_14.md +1 -1
- package/docs/zh/intlayer_with_nextjs_15.md +1 -1
- package/docs/zh/intlayer_with_nextjs_16.md +1 -1
- package/docs/zh/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/zh/intlayer_with_react_router_v7.md +2 -2
- package/docs/zh/intlayer_with_vite+preact.md +1 -1
- package/docs/zh/intlayer_with_vite+react.md +1 -1
- package/docs/zh/intlayer_with_vite+vue.md +1 -1
- package/docs/zh/introduction.md +0 -1
- package/docs/zh/readme.md +8 -8
- package/docs/zh-TW/bundle_optimization.md +5 -1
- package/docs/zh-TW/interest_of_intlayer.md +6 -6
- package/docs/zh-TW/intlayer_with_angular_21.md +1 -1
- package/docs/zh-TW/introduction.md +0 -1
- package/package.json +8 -7
- package/src/generated/blog.entry.ts +80 -0
- package/blog/en/___per-component_vs_centralized_i18n.md +0 -255
- package/blog/pl/___per-component_vs_centralized_i18n.md +0 -100
- package/docs/en/benchmark/___NOTE.md +0 -101
- package/docs/en/benchmark/___nextjs.md +0 -197
- package/docs/en/benchmark/___solid.md +0 -12
- package/docs/en/benchmark/___svelte.md +0 -16
- package/docs/en/benchmark/___tanstack.md +0 -190
- package/docs/en/benchmark/___vue.md +0 -7
- package/docs/pl/benchmark/___NOTE.md +0 -101
- package/docs/pl/benchmark/___nextjs.md +0 -198
- package/docs/pl/benchmark/___solid.md +0 -36
- package/docs/pl/benchmark/___svelte.md +0 -36
- package/docs/pl/benchmark/___tanstack.md +0 -36
- package/docs/pl/benchmark/___vue.md +0 -36
|
@@ -0,0 +1,442 @@
|
|
|
1
|
+
---
|
|
2
|
+
createdAt: 2026-09-16
|
|
3
|
+
updatedAt: 2026-09-16
|
|
4
|
+
title: "Jak wybrać odpowiednią bibliotekę Vue i18n w 2026 roku"
|
|
5
|
+
description: Przewodnik decyzyjny dotyczący internacjonalizacji Vue i Nuxt. Na jakie pytania odpowiedzieć przed porównaniem vue-i18n, @nuxtjs/i18n, fluent-vue, Paraglide i Intlayer oraz ile każdy wybór kosztuje pod kątem bundle size, typowania i SSR payload.
|
|
6
|
+
keywords:
|
|
7
|
+
- vue i18n
|
|
8
|
+
- internacjonalizacja vue
|
|
9
|
+
- vue-i18n
|
|
10
|
+
- nuxt i18n
|
|
11
|
+
- fluent-vue
|
|
12
|
+
- Paraglide
|
|
13
|
+
- Intlayer
|
|
14
|
+
- porównanie bibliotek i18n
|
|
15
|
+
slugs:
|
|
16
|
+
- blog
|
|
17
|
+
- how-to-pick-vue-i18n-library
|
|
18
|
+
author: aymericzip
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
# Jak wybrać odpowiednią bibliotekę Vue i18n
|
|
22
|
+
|
|
23
|
+
"Vue i18n" to zarówno termin ogólny, jak i nazwa biblioteki instalowanej przez niemal wszystkich. Jest to jednocześnie wygodne i mylące: `vue-i18n` to solidny domyślny wybór, ale nie jedyna opcja, a pytania, które powinny kierować tą decyzją (SSR czy bez SSR, ile stron, kto pisze tłumaczenia), rzadko padają przed uruchomieniem `npm install`.
|
|
24
|
+
|
|
25
|
+
Ten przewodnik zadaje je w pierwszej kolejności, a następnie dopasowuje odpowiedzi do odpowiednich bibliotek, zarówno dla czystego Vite + Vue, jak i dla Nuxt.
|
|
26
|
+
|
|
27
|
+

|
|
28
|
+
|
|
29
|
+
## Spis treści
|
|
30
|
+
|
|
31
|
+
<TOC/>
|
|
32
|
+
|
|
33
|
+
## Sześć pytań, na które warto odpowiedzieć przed porównaniem bibliotek
|
|
34
|
+
|
|
35
|
+
1. **Vite SPA czy Nuxt?** W SPA koszt katalogu tłumaczeń to problem wielkości JS bundle. W Nuxt to także problem wielkości HTML payload, ponieważ komunikaty są serializowane w stanie SSR i hydratowane. Z tego powodu większość zgłoszeń "vue-i18n działa wolno" pochodzi z aplikacji Nuxt.
|
|
36
|
+
2. **Kto pisze tłumaczenia?** Programiści, system TMS, agencja dostarczająca ciągi ICU czy potok AI. `vue-i18n` używa własnej składni liczby mnogiej oddzielanej pionową kreską (pipe), a nie ICU. Ma to kluczowe znaczenie, jeśli teksty pochodzą z zewnątrz.
|
|
37
|
+
3. **Ile języków i stron?** Dwa języki i pięć stron mogą dostarczać wszystko na raz. Dziesięć języków i czterdzieści tras już nie, a strategia ładowania staje się głównym kosztem.
|
|
38
|
+
4. **Czy potrzebujesz typowania kluczy?** `t("cart.totl")` kompiluje się w `vue-i18n`, chyba że przekażesz schemat komunikatów w parametrze generic, a ten schemat koliduje z leniwie ładowanymi katalogami (lazy loading).
|
|
39
|
+
5. **Co zawiera treść?** Same etykiety UI, czy także markdown, linki wewnątrz zdań i bloki specyficzne dla danego języka? Rozbudowana treść sprawia, że wywołanie `t()` zwracające zwykły string staje się niewygodne.
|
|
40
|
+
6. **Czy CSP stanowi ograniczenie?** Domyślny build `vue-i18n` kompiluje komunikaty w przeglądarce za pomocą `new Function`. Wersje runtime-only wymagają `@intlify/unplugin-vue-i18n` do prekompilacji w czasie budowania (build time).
|
|
41
|
+
|
|
42
|
+
Zapisz odpowiedzi. Wszystko poniżej odnosi się bezpośrednio do nich.
|
|
43
|
+
|
|
44
|
+
## Krajobraz w skrócie
|
|
45
|
+
|
|
46
|
+
Ekosystem Vue ma mniej bibliotek i18n niż React i wywodzą się one z różnych fal architektonicznych.
|
|
47
|
+
|
|
48
|
+

|
|
49
|
+
|
|
50
|
+
<AccordionGroup>
|
|
51
|
+
<Accordion header="Słowniki runtime (2015 do 2019): vue-i18n, @nuxt/i18n">
|
|
52
|
+
|
|
53
|
+
`vue-i18n` pojawił się w 2015 roku i od tego czasu pozostaje domyślnym standardem. `@nuxt/i18n` opakowuje go, dodając routing językowy, tagi SEO i lazy loading dla poszczególnych wersji językowych. Komunikaty są kompilowane do render functions: w czasie budowania, jeśli dodasz unplugin, lub w przeglądarce w przeciwnym razie.
|
|
54
|
+
|
|
55
|
+
</Accordion>
|
|
56
|
+
<Accordion header="Alternatywne formaty (2020): fluent-vue">
|
|
57
|
+
|
|
58
|
+
Pliki `.ftl` z Mozilla Fluent wprowadziły bardziej przyjazną składnię komunikatów z wariantami uwzględniającymi gramatykę. Brak typowania kluczy, a wtyczka Vite ładuje wszystkie wersje językowe do każdej strony.
|
|
59
|
+
|
|
60
|
+
</Accordion>
|
|
61
|
+
<Accordion header="Kompilator i współdzielona treść (colocated content) (2024 do 2026): Paraglide, Intlayer">
|
|
62
|
+
|
|
63
|
+
Paraglide generuje jedną funkcję na każdy komunikat i pozwala bundlerowi na usunięcie reszty za pomocą tree-shakingu. Intlayer deklaruje treść dla poszczególnych komponentów w plikach `.content.ts`, generuje typy i dostarcza tylko to, co renderuje dana trasa.
|
|
64
|
+
|
|
65
|
+
</Accordion>
|
|
66
|
+
</AccordionGroup>
|
|
67
|
+
|
|
68
|
+
Artykuł [historia JavaScript i18n](https://github.com/aymericzip/intlayer/blob/main/docs/blog/pl/history_of_i18n.md) szczegółowo omawia każdą z tych fal.
|
|
69
|
+
|
|
70
|
+
## Najważniejsza decyzja: gdzie znajduje się treść i kiedy jest ładowana
|
|
71
|
+
|
|
72
|
+
Dwa wybory strukturalne tłumaczą większość różnic w wielkości bundle pomiędzy poszczególnymi konfiguracjami:
|
|
73
|
+
|
|
74
|
+
- **Treść scentralizowana czy scoped (zlokalizowana przy komponencie).** Jeden plik `locales/en.json` dla całej aplikacji lub pojedyncza deklaracja na komponent.
|
|
75
|
+
- **Import statyczny czy dynamiczny.** Wszystko przy starcie aplikacji lub aktywny język (a najlepiej aktywna trasa) pobierany na żądanie.
|
|
76
|
+
|
|
77
|
+
Wykres szacuje payload dla teoretycznej aplikacji o wielkości od 1 do 10 stron, przetłumaczonej na od 1 do 10 języków, z około 30 KB tekstu na stronę.
|
|
78
|
+
|
|
79
|
+

|
|
80
|
+
|
|
81
|
+
`vue-i18n` obsługuje oś dynamiczną: wywołanie `setLocaleMessage` po `import()` oznacza, że przestajesz przesyłać dziewięć wersji językowych, których nikt nie czyta. Nie daje jednak kontroli nad osią podziału na strony. Katalog językowy jest jednym obiektem, a jego załadowanie powoduje wczytanie tekstów dla wszystkich stron. W SPA nikt tego nie zauważa. W Nuxt, z `@nuxtjs/i18n` i ponad dziesięcioma stronami, każda trasa niesie teksty wszystkich innych tras, podwójnie: w JS chunk oraz w SSR payload.
|
|
82
|
+
|
|
83
|
+
Dokument [benchmark Vue](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pl/benchmark/vue.md) mierzy to jako "leakage z innych tras" oraz "leakage z innych języków". Jeśli Twoją odpowiedzią na pytanie 3 było "wiele stron", ta sekcja ma większą wagę niż jakiekolwiek preferencje dotyczące API. Wpis [per-component vs scentralizowane i18n](https://github.com/aymericzip/intlayer/blob/main/docs/blog/pl/per-component_vs_centralized_i18n.md) omawia kwestie utrzymania kodu dla tego samego kompromisu.
|
|
84
|
+
|
|
85
|
+
## Kandydaci
|
|
86
|
+
|
|
87
|
+
Rozmiary bibliotek pochodzą z dokumentu [benchmark Vue](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pl/benchmark/vue.md): plugin plus composable w pustym komponencie, po bundle, tree-shakingu i minifikacji, w aplikacji z 10 stronami i 10 językami. Treść jest mierzona osobno.
|
|
88
|
+
|
|
89
|
+
| Biblioteka | Model treści | Bezpieczeństwo typów | Format komunikatów | Podział na trasy (per-route) | Rozmiar biblioteki |
|
|
90
|
+
| :------------- | :--------------------------------------------------------- | :----------------------------------- | :---------------------------------- | :--------------------------- | :--------------------------------------------------- |
|
|
91
|
+
| `vue-i18n` | Centralne katalogi na język, opcjonalne bloki SFC `<i18n>` | 2/5 — Opcjonalne przez generic | Własny (pipe) | Nie | ~24.3 kB |
|
|
92
|
+
| `@nuxtjs/i18n` | Taki sam jak `vue-i18n`, plus routing i tagi SEO | 2/5 — Taki sam | Taki sam | Nie, tylko na język | ~24.3 kB |
|
|
93
|
+
| `fluent-vue` | Pliki `.ftl` (Mozilla Fluent) | 1/5 — Brak | Fluent | Nie | ~29.7 kB |
|
|
94
|
+
| Paraglide | Projekt inlang, generowane funkcje | 3.5/5 — Generowane | Własny | Przez tree-shaking | Bliski zeru (dzięki kodowi generowanemu w projekcie) |
|
|
95
|
+
| Intlayer | Jeden plik `.content.ts` na komponent | 5/5 — Generowane, domyślnie włączone | Intlayer (+ ICU, i18next, vue-i18n) | Tak, na komponent | ~3.9 kB |
|
|
96
|
+
|
|
97
|
+
> Liczby stanowią zrzut stanu dla wersji z benchmarku. Uruchom go we własnej aplikacji przed podjęciem decyzji wyłącznie na podstawie rozmiaru.
|
|
98
|
+
> Bezpieczeństwo typów: 5/5 oznacza, że klucze, parametry i każda lokalizacja są sprawdzane bez ręcznej konfiguracji, w tym formatery URL i helpery.
|
|
99
|
+
|
|
100
|
+
Niemal zerowy rozmiar biblioteki Paraglide wynika z jej konstrukcji: środowisko uruchomieniowe jest generowane w Twoim repozytorium, co oznacza konieczność regeneracji przed każdym pushem i ryzyko konfliktów scalania (merge conflicts) w wygenerowanych plikach. Intlayer wymaga `vite-intlayer` (lub modułu Nuxt), więc nie może działać bez etapu budowania.
|
|
101
|
+
|
|
102
|
+
## Dopasuj swoje odpowiedzi do biblioteki
|
|
103
|
+
|
|
104
|
+
<AccordionGroup>
|
|
105
|
+
<Accordion header="Vite SPA, mały zespół, niewiele języków">
|
|
106
|
+
|
|
107
|
+
`vue-i18n` w trybie Composition (`legacy: false`), z `@intlify/unplugin-vue-i18n`, dzięki czemu wysyłasz build runtime-only. Ładuj języki leniwie za pomocą `import()`. To rozwiązanie pokrywa większość małych aplikacji, a odpowiedzi społeczności są łatwo dostępne. Bloki SFC `<i18n>` umieszczają komunikaty obok komponentu, co pomaga, ale narzędzia do ekstrakcji i integracji z TMS są wokół nich skromniejsze niż w przypadku katalogów JSON, więc zdecyduj wcześnie, z czego korzysta zespół.
|
|
108
|
+
|
|
109
|
+
</Accordion>
|
|
110
|
+
<Accordion header="Nuxt z routingiem językowym, sitemapą i hreflang">
|
|
111
|
+
|
|
112
|
+
`@nuxtjs/i18n` zapewnia strategię routingu, tagi `hreflang` i wykrywanie języka bez pisania dodatkowego kodu, co samo w sobie uzasadnia jego wybór dla stron contentowych z kilkoma podstronami. Jego ograniczeniem jest katalog przypisany do całego języka: powyżej kilkunastu stron payload SSR zawiera teksty każdej trasy. W takim przypadku warto ręcznie skonfigurować `vue-i18n` z komunikatami dzielonymi per-route lub przejść na scoped content. Wpis [Nuxt i18n](https://github.com/aymericzip/intlayer/blob/main/docs/blog/pl/list_i18n_technologies/frameworks/nuxt.md) w pierwszej kolejności omawia wybór strategii routingu.
|
|
113
|
+
|
|
114
|
+
</Accordion>
|
|
115
|
+
<Accordion header="Tłumaczenia pochodzą z TMS lub agencji dostarczającej ICU">
|
|
116
|
+
|
|
117
|
+
Składnia liczby mnogiej w `vue-i18n` (`"no item | one item | {count} items"`) nie jest standardem ICU i nie jest przenośna. Tłumacze muszą zostać o tym poinformowani, a eksport z TMS jej nie wygeneruje. Należy uzgodnić format przed utworzeniem pierwszego katalogu lub wybrać bibliotekę, której format odpowiada dostawcy. Obsługa ICU w Intlayer jest częściowa, więc jeśli otrzymujesz ciągi ICU już teraz, potraktuj to również jako ograniczenie.
|
|
118
|
+
|
|
119
|
+
</Accordion>
|
|
120
|
+
<Accordion header="Duża aplikacja, wiele tras, budżet bundle lub SSR payload">
|
|
121
|
+
|
|
122
|
+
Wybierz scoped content kompilowany w czasie budowania. Paraglide osiąga to dzięki tree-shakingowi, który działa zgodnie z oczekiwaniami w Vite. Intlayer osiąga to dzięki deklaracjom per-component i dostarcza tylko to, co renderuje dana trasa. W przypadku `vue-i18n` można ręcznie podzielić komunikaty na trasy, ale nic tego nie wymusza, a współdzielony komponent importujący globalną przestrzeń nazw po cichu niweczy ten podział.
|
|
123
|
+
|
|
124
|
+
</Accordion>
|
|
125
|
+
<Accordion header="Bezpieczeństwo typów (type safety) jest bezdyskusyjne">
|
|
126
|
+
|
|
127
|
+
`vue-i18n` można otypować, przekazując schemat w parametrze generic do `createI18n`. Działa to poprawnie do momentu, gdy katalogi są ładowane leniwie (lazy loading), ponieważ schemat opisuje komunikaty, które mogą nie być jeszcze dostępne. Jeśli nie chcesz tego ręcznie utrzymywać, wybierz bibliotekę, której typy są generowane z treści: Paraglide lub Intlayer. Wpis [wykrywanie brakujących tłumaczeń](https://github.com/aymericzip/intlayer/blob/main/docs/blog/pl/detecting_missing_translations.md) porównuje, co każde z rozwiązań wychwytuje w czasie budowania.
|
|
128
|
+
|
|
129
|
+
</Accordion>
|
|
130
|
+
<Accordion header="Treść to coś więcej niż etykiety UI">
|
|
131
|
+
|
|
132
|
+
Strony w markdownie, zdania z komponentem `<RouterLink>` w środku, komponenty specyficzne dla danego języka. `vue-i18n` posiada `<i18n-t>` do interpolacji komponentów, co działa, ale jest rozwlekłe. Węzły treści Intlayer akceptują bezpośrednio markdown, HTML i zagnieżdżone obiekty, co znacznie lepiej pasuje do aplikacji bogatych w treść.
|
|
133
|
+
|
|
134
|
+
</Accordion>
|
|
135
|
+
<Accordion header="Tłumaczenia będą generowane przez AI">
|
|
136
|
+
|
|
137
|
+
W takim wypadku scentralizowany JSON traci odbiorcę, który uzasadniałby jego istnienie. Współdzielona treść (colocated content) wraz z CLI uzupełniającym brakujące języki to krótsza droga. Polecenie `fill` w Intlayer działa z Twoim własnym kluczem API (OpenAI, Anthropic, Mistral, Gemini) i tłumaczy ponownie tylko to, co uległo zmianie.
|
|
138
|
+
|
|
139
|
+
</Accordion>
|
|
140
|
+
</AccordionGroup>
|
|
141
|
+
|
|
142
|
+
## Gdzie każda biblioteka ma swoje ograniczenia
|
|
143
|
+
|
|
144
|
+
- **`vue-i18n`**: najcięższa z zestawu, własny format liczby mnogiej, typy są opcjonalne i niestabilne przy lazy loadingu, brak podziału per-route, martwe klucze gromadzą się po cichu. Pozostawienie `legacy: true` w aplikacji Vue 3 zachowuje warstwę kompatybilności z Vue 2 i uniemożliwia typowanie `useI18n()`.
|
|
145
|
+
- **`@nuxtjs/i18n`**: dziedziczy wszystkie powyższe cechy, a payload SSR niesie teksty wszystkich stron po przekroczeniu kilkunastu tras.
|
|
146
|
+
- **`fluent-vue`**: przejrzysta składnia komunikatów, brak typowania kluczy, a wtyczka Vite ładuje całą treść we wszystkich językach do każdej strony. Najcięższa w benchmarku.
|
|
147
|
+
- **Paraglide**: wygenerowane pliki commitowane do repozytorium, konieczność regeneracji przed każdym pushem, a język jest odczytywany z ciasteczka lub storage przy każdym wywołaniu komunikatu zamiast z reaktywnego store'a, co generuje dodatkowy narzut przy zmianie języka.
|
|
148
|
+
- **Intlayer**: obowiązkowy plugin do budowania, mniejszy ekosystem, częściowa obsługa ICU oraz treść rozproszona po codebase z założenia architektonicznego, przez co wyeksportowanie jednego pliku JSON dla tłumacza wymaga dedykowanych narzędzi.
|
|
149
|
+
|
|
150
|
+
## Jak każda opcja wygląda w kodzie
|
|
151
|
+
|
|
152
|
+
Ten sam komponent, podsumowanie koszyka z tytułem i liczbą mnogą, napisany z użyciem każdego kandydata. Najciekawszą częścią nie jest szablon, lecz to, gdzie znajduje się treść i co `vue-tsc` o niej wie.
|
|
153
|
+
|
|
154
|
+
<Tabs defaultTab="vue-i18n">
|
|
155
|
+
<Tab label="vue-i18n" value="vue-i18n">
|
|
156
|
+
|
|
157
|
+
<Tabs group="locale">
|
|
158
|
+
<Tab value="en" label="Angielski">
|
|
159
|
+
|
|
160
|
+
```json fileName="src/locales/en.json"
|
|
161
|
+
{
|
|
162
|
+
"cart": {
|
|
163
|
+
"title": "Your cart",
|
|
164
|
+
"items": "no item | one item | {count} items"
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
</Tab>
|
|
170
|
+
<Tab value="fr" label="Francuski">
|
|
171
|
+
|
|
172
|
+
```json fileName="src/locales/fr.json"
|
|
173
|
+
{
|
|
174
|
+
"cart": {
|
|
175
|
+
"title": "Votre panier",
|
|
176
|
+
"items": "aucun article | un article | {count} articles"
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
</Tab>
|
|
182
|
+
<Tab value="es" label="Hiszpański">
|
|
183
|
+
|
|
184
|
+
```json fileName="src/locales/es.json"
|
|
185
|
+
{
|
|
186
|
+
"cart": {
|
|
187
|
+
"title": "Tu carrito",
|
|
188
|
+
"items": "ningún artículo | un artículo | {count} artículos"
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
</Tab>
|
|
194
|
+
</Tabs>
|
|
195
|
+
|
|
196
|
+
```vue fileName="src/components/CartSummary.vue"
|
|
197
|
+
<script setup lang="ts">
|
|
198
|
+
import { useI18n } from "vue-i18n";
|
|
199
|
+
|
|
200
|
+
const props = defineProps<{ count: number }>();
|
|
201
|
+
const { t } = useI18n();
|
|
202
|
+
</script>
|
|
203
|
+
|
|
204
|
+
<template>
|
|
205
|
+
<section>
|
|
206
|
+
<h2>{{ t("cart.title") }}</h2>
|
|
207
|
+
<p>{{ t("cart.items", { count: props.count }, props.count) }}</p>
|
|
208
|
+
</section>
|
|
209
|
+
</template>
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
Formy liczby mnogiej oddzielane pionową kreską (pipe) to własny format vue-i18n, a nie ICU. Funkcja `t` akceptuje dowolny string, chyba że przekażesz schemat komunikatów w parametrze generic do `createI18n`.
|
|
213
|
+
|
|
214
|
+
</Tab>
|
|
215
|
+
<Tab label="fluent-vue" value="fluent-vue">
|
|
216
|
+
|
|
217
|
+
<Tabs group="locale">
|
|
218
|
+
<Tab value="en" label="Angielski">
|
|
219
|
+
|
|
220
|
+
```ftl fileName="src/locales/en.ftl"
|
|
221
|
+
cart-title = Your cart
|
|
222
|
+
cart-items = { $count ->
|
|
223
|
+
[one] { $count } item
|
|
224
|
+
*[other] { $count } items
|
|
225
|
+
}
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
</Tab>
|
|
229
|
+
<Tab value="fr" label="Francuski">
|
|
230
|
+
|
|
231
|
+
```ftl fileName="src/locales/fr.ftl"
|
|
232
|
+
cart-title = Votre panier
|
|
233
|
+
cart-items = { $count ->
|
|
234
|
+
[one] { $count } article
|
|
235
|
+
*[other] { $count } articles
|
|
236
|
+
}
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
</Tab>
|
|
240
|
+
<Tab value="es" label="Hiszpański">
|
|
241
|
+
|
|
242
|
+
```ftl fileName="src/locales/es.ftl"
|
|
243
|
+
cart-title = Tu carrito
|
|
244
|
+
cart-items = { $count ->
|
|
245
|
+
[one] { $count } artículo
|
|
246
|
+
*[other] { $count } artículos
|
|
247
|
+
}
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
</Tab>
|
|
251
|
+
</Tabs>
|
|
252
|
+
|
|
253
|
+
```vue fileName="src/components/CartSummary.vue"
|
|
254
|
+
<script setup lang="ts">
|
|
255
|
+
import { useFluent } from "fluent-vue";
|
|
256
|
+
|
|
257
|
+
const props = defineProps<{ count: number }>();
|
|
258
|
+
const { $t } = useFluent();
|
|
259
|
+
</script>
|
|
260
|
+
|
|
261
|
+
<template>
|
|
262
|
+
<section>
|
|
263
|
+
<h2>{{ $t("cart-title") }}</h2>
|
|
264
|
+
<p>{{ $t("cart-items", { count: props.count }) }}</p>
|
|
265
|
+
</section>
|
|
266
|
+
</template>
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
Składnia Fluent dobrze radzi sobie z liczbami mnogimi i wariantami gramatycznymi. Identyfikatory komunikatów są nietypowanymi stringami, a wtyczka Vite dołącza wszystkie wersje językowe do każdej strony.
|
|
270
|
+
|
|
271
|
+
</Tab>
|
|
272
|
+
<Tab label="Paraglide" value="paraglide">
|
|
273
|
+
|
|
274
|
+
<Tabs group="locale">
|
|
275
|
+
<Tab value="en" label="Angielski">
|
|
276
|
+
|
|
277
|
+
```json fileName="messages/en.json"
|
|
278
|
+
{
|
|
279
|
+
"cart_title": "Your cart",
|
|
280
|
+
"cart_items": "{count} items"
|
|
281
|
+
}
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
</Tab>
|
|
285
|
+
<Tab value="fr" label="Francuski">
|
|
286
|
+
|
|
287
|
+
```json fileName="messages/fr.json"
|
|
288
|
+
{
|
|
289
|
+
"cart_title": "Votre panier",
|
|
290
|
+
"cart_items": "{count} articles"
|
|
291
|
+
}
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
</Tab>
|
|
295
|
+
<Tab value="es" label="Hiszpański">
|
|
296
|
+
|
|
297
|
+
```json fileName="messages/es.json"
|
|
298
|
+
{
|
|
299
|
+
"cart_title": "Tu carrito",
|
|
300
|
+
"cart_items": "{count} artículos"
|
|
301
|
+
}
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
</Tab>
|
|
305
|
+
</Tabs>
|
|
306
|
+
|
|
307
|
+
```vue fileName="src/components/CartSummary.vue"
|
|
308
|
+
<script setup lang="ts">
|
|
309
|
+
import { m } from "../paraglide/messages.js";
|
|
310
|
+
|
|
311
|
+
const props = defineProps<{ count: number }>();
|
|
312
|
+
</script>
|
|
313
|
+
|
|
314
|
+
<template>
|
|
315
|
+
<section>
|
|
316
|
+
<h2>{{ m.cart_title() }}</h2>
|
|
317
|
+
<p>{{ m.cart_items({ count: props.count }) }}</p>
|
|
318
|
+
</section>
|
|
319
|
+
</template>
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
Każdy komunikat jest wygenerowaną, otypowaną funkcją, więc brakujący klucz oznacza błąd importu. Folder `paraglide/` jest generowany w Twoim repozytorium i odświeżany przy każdej zmianie.
|
|
323
|
+
|
|
324
|
+
</Tab>
|
|
325
|
+
<Tab label="Intlayer" value="intlayer">
|
|
326
|
+
|
|
327
|
+
```ts fileName="src/components/cartSummary.content.ts"
|
|
328
|
+
import { plural, t, type Dictionary } from "intlayer";
|
|
329
|
+
|
|
330
|
+
const cartSummaryContent = {
|
|
331
|
+
key: "cart-summary",
|
|
332
|
+
content: {
|
|
333
|
+
title: t({ en: "Your cart", fr: "Votre panier", es: "Tu carrito" }),
|
|
334
|
+
items: t({
|
|
335
|
+
en: plural({ one: "{{count}} item", other: "{{count}} items" }),
|
|
336
|
+
fr: plural({ one: "{{count}} article", other: "{{count}} articles" }),
|
|
337
|
+
es: plural({ one: "{{count}} artículo", other: "{{count}} artículos" }),
|
|
338
|
+
}),
|
|
339
|
+
},
|
|
340
|
+
} satisfies Dictionary;
|
|
341
|
+
|
|
342
|
+
export default cartSummaryContent;
|
|
343
|
+
```
|
|
344
|
+
|
|
345
|
+
```vue fileName="src/components/CartSummary.vue"
|
|
346
|
+
<script setup lang="ts">
|
|
347
|
+
import { useIntlayer } from "vue-intlayer";
|
|
348
|
+
|
|
349
|
+
const props = defineProps<{ count: number }>();
|
|
350
|
+
const { title, items } = useIntlayer("cart-summary");
|
|
351
|
+
</script>
|
|
352
|
+
|
|
353
|
+
<template>
|
|
354
|
+
<section>
|
|
355
|
+
<h2><title /></h2>
|
|
356
|
+
<p>{{ items(props.count) }}</p>
|
|
357
|
+
</section>
|
|
358
|
+
</template>
|
|
359
|
+
```
|
|
360
|
+
|
|
361
|
+
Wszystkie wersje językowe w jednym pliku obok komponentu. Typy są generowane podczas budowania, więc `title` ma autouzupełnianie, a literówka powoduje błąd `vue-tsc`. `<title />` renderuje węzeł, który może być edytowany w edytorze wizualnym; `{{ items(props.count) }}` zwraca zwykły ciąg tekstowy.
|
|
362
|
+
|
|
363
|
+
</Tab>
|
|
364
|
+
</Tabs>
|
|
365
|
+
|
|
366
|
+
Korzystasz już z `vue-i18n`? [Adapter kompatybilności `@intlayer/vue-i18n`](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pl/compat/vue-i18n.md) tworzy alias pakietu na poziomie bundlera, dzięki czemu `useI18n()`, `$t`, formy liczby mnogiej pipe i `v-t` działają nadal, podczas gdy Intlayer serwuje treść. [Przewodnik migracji](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pl/migration_from_vue-i18n_to_intlayer.md) opisuje późniejsze odejście od adaptera, dostępny jest również [przewodnik dedykowany dla Nuxt](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pl/migration_from_nuxtjs_i18n_to_intlayer.md).
|
|
367
|
+
|
|
368
|
+
## Zanim podejmiesz decyzję
|
|
369
|
+
|
|
370
|
+
Tabela funkcji pokazuje, co biblioteka potrafi dzisiaj. Poniższe punkty pokazują, jak będzie wyglądać codzienna praca z nią.
|
|
371
|
+
|
|
372
|
+
**Sprawdź aktywność repozytorium.**
|
|
373
|
+
|
|
374
|
+
Commity, czas odpowiedzi na issues oraz to, czy ostatnie wydanie minor miało miejsce w tym roku. Dobra architektura bez aktywnego maintainera to odroczona w czasie migracja.
|
|
375
|
+
|
|
376
|
+
**Nie wybieraj na podstawie liczby pobrań z npm.**
|
|
377
|
+
|
|
378
|
+
Najczęściej instalowaną biblioteką jest ta, która pojawiła się jako pierwsza, a nie ta, która najlepiej pasuje do bazy kodu Vue w 2026 roku. Liczba pobrań mierzy historię, a nie dopasowanie do projektu.
|
|
379
|
+
|
|
380
|
+

|
|
381
|
+
|
|
382
|
+
**Zapytaj, kto finansuje maintainera i co sprzedaje.**
|
|
383
|
+
|
|
384
|
+
`vue-i18n` jest wspierany przez Crowdin, podobnie jak `next-intl` i `svelte-i18n`. `i18next` jest wspierany przez Locize. Tolgee, Paraglide (inlang) i Intlayer prowadzą własne platformy. Dostawca, którego przychód zależy od hostowanego tłumaczenia, ma niewielki interes w tym, aby tłumaczenie było bezpłatne wewnątrz Twojego toolchaina. Intlayer jako jedyny w zestawieniu oferuje tłumaczenie AI przez CLI z Twoim własnym kluczem API oraz CMS, który możesz samodzielnie hostować (self-host).
|
|
385
|
+
|
|
386
|
+
**Czy jest gotowy na agentów AI?**
|
|
387
|
+
|
|
388
|
+
Agenci wciąż mają trudności z i18n: zapominają o wersjach językowych, wymyślają klucze i mieszają składnie komunikatów. Czy biblioteka dostarcza [Agent Skills](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pl/agent_skills.md) lub [serwer MCP](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pl/mcp_server.md), aby agent mógł listować, uzupełniać i testować treść? Oraz czy ładowanie treści jest domyślnie zoptymalizowane, czy ktoś musi co kwartał weryfikować przestrzenie nazw i dynamiczne importy?
|
|
389
|
+
|
|
390
|
+
**Bezpieczeństwo typów (type safety) od razu po instalacji.**
|
|
391
|
+
|
|
392
|
+
Nie "możliwe do otypowania przy dodatkowej konfiguracji", ale "błędny klucz powoduje błąd `tsc` w czystej instalacji". Sprawdź, co dzieje się w przypadku nieistniejącego klucza oraz języka, w którym brakuje jednego tłumaczenia.
|
|
393
|
+
|
|
394
|
+
**Wykrywanie nieużywanej treści.**
|
|
395
|
+
|
|
396
|
+
Katalogi zazwyczaj tylko rosną. Build Intlayera usuwa nieużywane pola i rejestruje je w logach (`build.purge`). Paraglide osiąga to dzięki architekturze, ponieważ niewywołana funkcja komunikatu jest usuwana przez tree-shaking. Każde inne rozwiązanie pozostawia sprzątanie programiście.
|
|
397
|
+
|
|
398
|
+
**Wygoda programisty (Developer experience).**
|
|
399
|
+
|
|
400
|
+
Czas konfiguracji do pierwszego przetłumaczonego tekstu, [LSP](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pl/lsp.md) lub [rozszerzenie VS Code](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pl/vs_code_extension.md) pokazujące tłumaczenie po najechaniu kursorem i przechodzące do deklaracji, [CLI](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pl/cli/index.md) do uzupełniania, testowania i publikacji, [kompilator](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pl/compiler.md) lub ekstraktor, który wyciąga zakodowane na stałe ciągi z komponentów, aby nie zarządzać każdym ciągiem klucz po kluczu oraz możliwość edycji treści przez osoby nietechniczne ([edytor wizualny](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pl/intlayer_visual_editor.md) lub [CMS](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pl/intlayer_CMS.md)) bez konieczności tworzenia pull requesta.
|
|
401
|
+
|
|
402
|
+
## Najczęściej zadawane pytania
|
|
403
|
+
|
|
404
|
+
<FAQ>
|
|
405
|
+
|
|
406
|
+
<Question title="Czy vue-i18n to wciąż właściwy wybór domyślny w 2026 roku?">
|
|
407
|
+
|
|
408
|
+
Dla większości aplikacji Vue, tak. Ekosystem jest największy, dokumentacja obszerna, a koszty przewidywalne: ciężki runtime, niestandardowy format liczby mnogiej oraz konieczność samodzielnego projektowania i utrzymywania podziału per-route.
|
|
409
|
+
|
|
410
|
+
</Question>
|
|
411
|
+
|
|
412
|
+
<Question title="Czy powinienem użyć @nuxtjs/i18n, czy ręcznie konfigurować vue-i18n w Nuxt?">
|
|
413
|
+
|
|
414
|
+
Użyj modułu, chyba że Twój routing jest nietypowy lub aplikacja ma zaledwie kilka stron. Ręczna konfiguracja oznacza konieczność samodzielnego tworzenia routingu językowego, middleware, tagów `hreflang` oraz sitemapy, co bywa bardziej skomplikowane, niż się wydaje.
|
|
415
|
+
|
|
416
|
+
</Question>
|
|
417
|
+
|
|
418
|
+
<Question title="Czy potrzebuję biblioteki opartej na kompilatorze?">
|
|
419
|
+
|
|
420
|
+
Tylko jeśli rozmiar bundle, SSR payload, generowane typy lub sprawdzanie brakujących kluczy w czasie budowania są rzeczywistymi wymaganiami. Wpis [kompilator vs deklaratywne i18n](https://github.com/aymericzip/intlayer/blob/main/docs/blog/pl/compiler_vs_declarative_i18n.md) wyjaśnia zalety kompilatorów i sytuacje, w których mogą sprawiać trudności.
|
|
421
|
+
|
|
422
|
+
</Question>
|
|
423
|
+
|
|
424
|
+
<Question title="Czy wybór biblioteki wpływa na SEO?">
|
|
425
|
+
|
|
426
|
+
Pośrednio. Roboty wyszukiwarek zwracają uwagę na routing, `hreflang`, atrybut `<html lang>` oraz to, czy tekst znajduje się w kodzie HTML wyrenderowanym po stronie serwera. Zobacz [przewodnik po hreflang](https://github.com/aymericzip/intlayer/blob/main/docs/blog/pl/hreflang_guide_multilingual_seo.md).
|
|
427
|
+
|
|
428
|
+
</Question>
|
|
429
|
+
|
|
430
|
+
</FAQ>
|
|
431
|
+
|
|
432
|
+
## Dowiedz się więcej
|
|
433
|
+
|
|
434
|
+
- [Benchmark Vue i18n: rozmiar bundle, leakage i czasy przełączania języków](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pl/benchmark/vue.md)
|
|
435
|
+
- [Vue i18n: jak działa vue-i18n i gdzie sprawia trudności](https://github.com/aymericzip/intlayer/blob/main/docs/blog/pl/list_i18n_technologies/frameworks/vue.md) oraz [wpis o Nuxt i18n](https://github.com/aymericzip/intlayer/blob/main/docs/blog/pl/list_i18n_technologies/frameworks/nuxt.md)
|
|
436
|
+
- [vue-i18n vs Intlayer, funkcja po funkcji](https://github.com/aymericzip/intlayer/blob/main/docs/blog/pl/vue-i18n_vs_intlayer.md) oraz [benchmark vue-i18n vs Intlayer](https://github.com/aymericzip/intlayer/blob/main/docs/blog/pl/vue-i18n_vs_intlayer_benchmark.md)
|
|
437
|
+
- [Czy vue-i18n jest przestarzałe?](https://github.com/aymericzip/intlayer/blob/main/docs/blog/pl/is_vue-i18n_outdated.md)
|
|
438
|
+
- [Historia JavaScript i18n](https://github.com/aymericzip/intlayer/blob/main/docs/blog/pl/history_of_i18n.md)
|
|
439
|
+
- [Kompilator vs deklaratywne i18n](https://github.com/aymericzip/intlayer/blob/main/docs/blog/pl/compiler_vs_declarative_i18n.md)
|
|
440
|
+
- [Per-component vs scentralizowane i18n](https://github.com/aymericzip/intlayer/blob/main/docs/blog/pl/per-component_vs_centralized_i18n.md)
|
|
441
|
+
- [Konfiguracja i18n w aplikacji Vite + Vue](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pl/intlayer_with_vite+vue.md) oraz w [aplikacji Nuxt](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pl/intlayer_with_nuxt.md)
|
|
442
|
+
- Ten sam przewodnik dla [React](https://github.com/aymericzip/intlayer/blob/main/docs/blog/pl/how_to_pick_react_i18n_library.md), [Svelte](https://github.com/aymericzip/intlayer/blob/main/docs/blog/pl/how_to_pick_svelte_i18n_library.md) oraz [Solid](https://github.com/aymericzip/intlayer/blob/main/docs/blog/pl/how_to_pick_solid_i18n_library.md)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
createdAt: 2026-09-02
|
|
3
|
-
updatedAt: 2026-09-
|
|
3
|
+
updatedAt: 2026-09-16
|
|
4
4
|
title: Czy i18next jest przestarzały w 2026 roku?
|
|
5
5
|
description: i18next napędza miliony stron internetowych, ale jego architektura runtime z 2011 roku zaczyna odstawać od standardów. Spojrzenie na rozmiar bundle, ograniczenia tree-shakingu i spowolniony rozwój.
|
|
6
6
|
keywords:
|
|
@@ -125,6 +125,10 @@ W Next.js `next-i18next` dodaje **76.7 KB gzipped** do projektu bazowego (+50%).
|
|
|
125
125
|
|
|
126
126
|
Domyślnie niemal **90% treści tłumaczeń** przesyłanych do danej trasy dotyczy innych podstron. Ręczne dzielenie na namespace'y jest uciążliwe i sprzyja błędom.
|
|
127
127
|
|
|
128
|
+
Poniższy wykres szacuje rozmiar treści dla teoretycznej aplikacji mającej od 1 do 10 stron, przetłumaczonej na 1 do 10 języków, z około 30 KB tekstu na stronę. Dynamiczne ładowanie treści per locale usuwa oś języków, ograniczenie treści do komponentu lub trasy usuwa oś stron, a tylko połączenie obu utrzymuje rozmiar na stałym poziomie.
|
|
129
|
+
|
|
130
|
+

|
|
131
|
+
|
|
128
132
|
**Opóźnienie hydratacji:**
|
|
129
133
|
|
|
130
134
|
Komponenty z `react-i18next` potrzebowały **85 ms** na hydratację w porównaniu do **24 ms** w Intlayer. Przekazywanie dużych struktur JSON spowalnia interaktywność.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
createdAt: 2026-09-02
|
|
3
|
-
updatedAt: 2026-09-
|
|
3
|
+
updatedAt: 2026-09-16
|
|
4
4
|
title: Czy next-intl jest przestarzały w 2026 roku?
|
|
5
5
|
description: next-intl stał się domyślnym wyborem dla Next.js App Router. Mimo to nadal obciąża bundle narzutem w runtime i wymaga ręcznego dzielenia na namespace'y.
|
|
6
6
|
keywords:
|
|
@@ -127,6 +127,10 @@ Ponieważ `messages` trafia do dostawcy klienta na samym szczycie drzewa, przegl
|
|
|
127
127
|
|
|
128
128
|
Można temu zapobiegać, wydzielając namespace'y i ładując je warunkowo. Utrzymywanie tej konfiguracji ręcznie bywa jednak czasochłonne i ryzykowne.
|
|
129
129
|
|
|
130
|
+
Poniższy wykres szacuje rozmiar treści dla teoretycznej aplikacji mającej od 1 do 10 stron, przetłumaczonej na 1 do 10 języków, z około 30 KB tekstu na stronę. Dynamiczne ładowanie treści per locale usuwa oś języków, ograniczenie treści do komponentu lub trasy usuwa oś stron, a tylko połączenie obu utrzymuje rozmiar na stałym poziomie.
|
|
131
|
+
|
|
132
|
+

|
|
133
|
+
|
|
130
134
|
Intlayer rozwiązuje ten problem analizą statyczną: [kompilator Intlayer](https://intlayer.org/pl/doc/compiler) przygotowuje dla każdej trasy wyłącznie te teksty, które faktycznie się na niej znajdują, redukując wyciek do **0.0%**.
|
|
131
135
|
|
|
132
136
|
## Dlaczego next-intl nie obsługuje tree-shakingu
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
createdAt: 2026-09-02
|
|
3
|
-
updatedAt: 2026-09-
|
|
3
|
+
updatedAt: 2026-09-16
|
|
4
4
|
title: Czy vue-i18n jest przestarzały w 2026 roku?
|
|
5
5
|
description: vue-i18n był standardem dla ekosystemu Vue i Nuxt przez dekadę. Jednak w naszych testach okazał się najcięższym runtime i18n w sieci. Wyjaśniamy dlaczego.
|
|
6
6
|
keywords:
|
|
@@ -116,6 +116,12 @@ W standardowym wariancie **90% pobieranych tekstów** dotyczy innych podstron. I
|
|
|
116
116
|
|
|
117
117
|
Komponenty z lokalnymi zakresami tłumaczeń osiągały w `vue-i18n` średnio 196 KB przez replikację słowników, podczas gdy w Intlayer było to **6.5 KB**.
|
|
118
118
|
|
|
119
|
+
**Jak skaluje się wyciek:**
|
|
120
|
+
|
|
121
|
+
Poniższy wykres szacuje rozmiar treści dla teoretycznej aplikacji mającej od 1 do 10 stron, przetłumaczonej na 1 do 10 języków, z około 30 KB tekstu na stronę. Dynamiczne ładowanie treści per locale usuwa oś języków, ograniczenie treści do komponentu lub trasy usuwa oś stron, a tylko połączenie obu utrzymuje rozmiar na stałym poziomie.
|
|
122
|
+
|
|
123
|
+

|
|
124
|
+
|
|
119
125
|
## Dlaczego vue-i18n jest ciężki?
|
|
120
126
|
|
|
121
127
|
### Parser AST przesyłany do przeglądarki
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
createdAt: 2025-08-23
|
|
3
|
-
updatedAt: 2026-
|
|
3
|
+
updatedAt: 2026-09-16
|
|
4
4
|
title: "next-i18next vs next-intl vs Intlayer - Kompletny przewodnik po tłumaczeniu next-i18next vs next-intl vs Intlayer: 2026 Comparison"
|
|
5
5
|
description: Najlepsze rozwiązanie dla rozmiaru bundle, SEO, wydajności & utrzymania. Uczyń swój Next.js stronę internetową wielojęzycznym w 2026, tłumaczenie LLM, Agent Skills & MCP.
|
|
6
6
|
keywords:
|
|
@@ -20,7 +20,7 @@ author: aymericzip
|
|
|
20
20
|
|
|
21
21
|
# next-i18next VS next-intl VS intlayer | Internacjonalizacja (i18n) Next.js
|
|
22
22
|
|
|
23
|
-

|
|
24
24
|
|
|
25
25
|
Przyjrzyjmy się podobieństwom i różnicom między trzema opcjami i18n dla Next.js: next-i18next, next-intl oraz Intlayer.
|
|
26
26
|
|
|
@@ -128,6 +128,10 @@ Dwa ważne zagadnienia:
|
|
|
128
128
|
|
|
129
129
|
> Jeśli jestem na stronie `/fr/about`, nie chcę ładować zawartości strony `/en/about`
|
|
130
130
|
|
|
131
|
+
Poniższy wykres szacuje rozmiar treści dla teoretycznej aplikacji mającej od 1 do 10 stron, przetłumaczonej na 1 do 10 języków, z około 30 KB tekstu na stronę. Dynamiczne ładowanie treści per locale usuwa oś języków, ograniczenie treści do komponentu lub trasy usuwa oś stron, a tylko połączenie obu utrzymuje rozmiar na stałym poziomie.
|
|
132
|
+
|
|
133
|
+

|
|
134
|
+
|
|
131
135
|
Ponownie, wszystkie trzy rozwiązania zdają sobie sprawę z tych problemów i pozwalają zarządzać tymi optymalizacjami. Różnica między tymi trzema rozwiązaniami to DX (Developer Experience).
|
|
132
136
|
|
|
133
137
|
`next-intl` i `next-i18next` używają scentralizowanego podejścia do zarządzania tłumaczeniami, pozwalając na podział plików JSON według lokalizacji i podplików. W `next-i18next` nazywamy pliki JSON 'namespaces'; `next-intl` pozwala deklarować wiadomości. W `intlayer` nazywamy pliki JSON 'dictionaries'.
|
|
@@ -152,9 +156,9 @@ W przypadku `next-intl` i `next-i18next` biblioteka wymaga załadowania pliku JS
|
|
|
152
156
|
|
|
153
157
|
Oto przykład wpływu optymalizacji rozmiaru bundle za pomocą `intlayer` w aplikacji vite + react:
|
|
154
158
|
|
|
155
|
-
| Zoptymalizowany pakiet
|
|
156
|
-
|
|
|
157
|
-
|  |  |
|
|
158
162
|
|
|
159
163
|
## TypeScript i bezpieczeństwo
|
|
160
164
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
createdAt: 2025-09-10
|
|
3
|
-
updatedAt:
|
|
3
|
+
updatedAt: 2026-09-16
|
|
4
4
|
title: "i18n per-komponentowy kontra scentralizowany: nowe podejście z Intlayer"
|
|
5
5
|
description: Dogłębna analiza strategii internacjonalizacji w React, porównująca podejścia scentralizowane, per-key i per-component oraz wprowadzająca Intlayer.
|
|
6
6
|
keywords:
|
|
@@ -63,6 +63,7 @@ Drobnoziarniste podejście (intlayer, inlang)
|
|
|
63
63
|
- pobieranie treści w sposób drobnoziarnisty, na poziomie klucza lub komponentu.
|
|
64
64
|
|
|
65
65
|
</Column>
|
|
66
|
+
|
|
66
67
|
</Columns>
|
|
67
68
|
|
|
68
69
|
> W tym wpisie na blogu nie będę się skupiał na rozwiązaniach opartych na kompilatorze, które już omówiłem tutaj: [Kompilator vs deklaratywne i18n](https://github.com/aymericzip/intlayer/blob/main/docs/blog/pl/compiler_vs_declarative_i18n.md).
|
|
@@ -79,6 +80,10 @@ Ogólnie rzecz biorąc, decyzja wygląda mniej więcej tak:
|
|
|
79
80
|
|
|
80
81
|
Oczywiście autorzy bibliotek zdają sobie sprawę z tych ograniczeń i proponują obejścia. Wśród nich: dzielenie na namespaces, dynamiczne ładowanie plików JSON (`await import()`), albo oczyszczanie zawartości podczas procesu budowania.
|
|
81
82
|
|
|
83
|
+
Poniższy wykres szacuje rozmiar treści dla teoretycznej aplikacji mającej od 1 do 10 stron, przetłumaczonej na 1 do 10 języków, z około 30 KB tekstu na stronę. Dynamiczne ładowanie treści per locale usuwa oś języków, ograniczenie treści do komponentu lub trasy usuwa oś stron, a tylko połączenie obu utrzymuje rozmiar na stałym poziomie.
|
|
84
|
+
|
|
85
|
+

|
|
86
|
+
|
|
82
87
|
Jednocześnie powinieneś wiedzieć, że gdy dynamicznie ładujesz swoją zawartość, wprowadzasz dodatkowe żądania do serwera. Każde dodatkowe `useState` lub hook oznacza dodatkowe żądanie do serwera.
|
|
83
88
|
|
|
84
89
|
> Aby rozwiązać ten problem, Intlayer proponuje grupowanie wielu definicji treści pod tym samym kluczem. Intlayer następnie scali tę zawartość.
|
|
@@ -111,9 +116,9 @@ Oczywiście, to ogromny krok naprzód. Przyjrzyjmy się porównaniu rozmiaru gł
|
|
|
111
116
|
|
|
112
117
|
Pierwszy przykład nie uwzględnia leniwego ładowania tłumaczeń dla każdego locale i nie stosuje podziału na namespaces. Drugi obejmuje content purging + dynamiczne ładowanie tłumaczeń.
|
|
113
118
|
|
|
114
|
-
| Zoptymalizowany bundle
|
|
115
|
-
|
|
|
116
|
-
|  |  |
|
|
117
122
|
|
|
118
123
|
Dzięki namespaces, przeszliśmy z tej struktury:
|
|
119
124
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
createdAt: 2025-01-02
|
|
3
|
-
updatedAt:
|
|
3
|
+
updatedAt: 2026-09-16
|
|
4
4
|
title: react-i18next vs react-intl vs Intlayer
|
|
5
5
|
description: Integracja react-i18next z next-intl i Intlayer dla internacjonalizacji (i18n) aplikacji React
|
|
6
6
|
keywords:
|
|
@@ -106,6 +106,10 @@ Oceniamy:
|
|
|
106
106
|
|
|
107
107
|
**Dlaczego to ważne:** Mniejsze paczki i mniej nieużywanych ciągów poprawiają wydajność uruchamiania i nawigacji.
|
|
108
108
|
|
|
109
|
+
Poniższy wykres szacuje rozmiar treści dla teoretycznej aplikacji mającej od 1 do 10 stron, przetłumaczonej na 1 do 10 języków, z około 30 KB tekstu na stronę. Dynamiczne ładowanie treści per locale usuwa oś języków, ograniczenie treści do komponentu lub trasy usuwa oś stron, a tylko połączenie obu utrzymuje rozmiar na stałym poziomie.
|
|
110
|
+
|
|
111
|
+

|
|
112
|
+
|
|
109
113
|
### 6) DX, narzędzia i utrzymanie
|
|
110
114
|
|
|
111
115
|
- **react-intl / react-i18next**: Szeroki ekosystem społeczności; do przepływów redakcyjnych zazwyczaj korzystasz z zewnętrznych platform lokalizacyjnych.
|