@intlayer/docs 9.5.3 → 9.5.4
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,448 @@
|
|
|
1
|
+
---
|
|
2
|
+
createdAt: 2026-09-16
|
|
3
|
+
updatedAt: 2026-09-16
|
|
4
|
+
title: "Як вибрати правильну бібліотеку i18n для Svelte у 2026 році"
|
|
5
|
+
description: Практичний посібник з інтернаціоналізації для Svelte та SvelteKit. На які запитання відповісти перед порівнянням svelte-i18n, Paraglide, typesafe-i18n, wuchale та Intlayer, і скільки кожен вибір коштує у плані розміру bundle, типізації та безпеки SSR.
|
|
6
|
+
keywords:
|
|
7
|
+
- svelte i18n
|
|
8
|
+
- sveltekit i18n
|
|
9
|
+
- svelte інтернаціоналізація
|
|
10
|
+
- svelte-i18n
|
|
11
|
+
- Paraglide
|
|
12
|
+
- typesafe-i18n
|
|
13
|
+
- wuchale
|
|
14
|
+
- Intlayer
|
|
15
|
+
- порівняння бібліотек i18n
|
|
16
|
+
slugs:
|
|
17
|
+
- blog
|
|
18
|
+
- how-to-pick-svelte-i18n-library
|
|
19
|
+
author: aymericzip
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
# Як вибрати правильну бібліотеку i18n для Svelte
|
|
23
|
+
|
|
24
|
+
У Svelte немає вбудованих інструментів для i18n. Жодного `$t`, жодного примітиву локалі, жодного формату повідомлень. Кожен варіант, це стороннє рішення, і саме в екосистемі Svelte інтернаціоналізація часу компіляції (compile-time i18n) просунулася найдалі, тому кандидати відрізняються один від одного сильніше, ніж у React або Vue.
|
|
25
|
+
|
|
26
|
+
Цей посібник перелічує запитання, на які слід відповісти спочатку, а потім зіставляє відповіді з `svelte-i18n`, Paraglide, `typesafe-i18n`, `wuchale` та Intlayer для Vite + Svelte і для SvelteKit.
|
|
27
|
+
|
|
28
|
+

|
|
29
|
+
|
|
30
|
+
## Table of Contents
|
|
31
|
+
|
|
32
|
+
<TOC/>
|
|
33
|
+
|
|
34
|
+
## Шість запитань перед порівнянням бібліотек
|
|
35
|
+
|
|
36
|
+
1. **Vite SPA чи SvelteKit?** В SPA модуль-рівневий store (module-level store) є правильним рішенням: одна вкладка, один користувач, одна локаль. У SvelteKit той самий singleton розділяється між паралельними запитами на сервері, і запит B відрендериться мовою запиту A. Бібліотека або надає вам ізольовану структуру на рівні запиту (context, `locals`), або залишає це вам.
|
|
37
|
+
2. **Хто пише переклади?** Розробники, TMS, агенція, що надає рядки ICU, або AI-пайплайн. `svelte-i18n` підтримує ICU. Paraglide та `typesafe-i18n` використовують власний синтаксис. Обирайте відповідно до постачальника.
|
|
38
|
+
3. **Скільки локалей і сторінок?** Дві локалі та п'ять сторінок можуть надсилати все одразу. Десять локалей і сорок маршрутів не можуть, і різниця між runtime-каталогами та скомпільованими повідомленнями стає головною статтею витрат.
|
|
39
|
+
4. **Чи потрібна типізація ключів?** `$_("cart.totl")`, це помилка під час виконання в `svelte-i18n`. Бібліотеки часу компіляції роблять це помилкою типів за своєю структурою.
|
|
40
|
+
5. **Svelte 4 stores чи Svelte 5 runes?** Runes змінюють синтаксис стану локалі, але не проблему розділення стану. Проте `$state` у файлі `.ts` компілюється у звичайну змінну, тому runtime бібліотеки має підтримувати runes, якщо ви використовуєте Svelte 5.
|
|
41
|
+
6. **Чи готові ви до згенерованих файлів у репозиторії?** Paraglide та `typesafe-i18n` генерують JavaScript або TypeScript безпосередньо у ваше дерево сирцевого коду. Для деяких команд це прийнятно, інші ж отримують конфлікти злиття (merge conflicts) у кожній паралельній гілці.
|
|
42
|
+
|
|
43
|
+
Запишіть відповіді. Усе викладене нижче посилатиметься на них.
|
|
44
|
+
|
|
45
|
+
## Загальна картина
|
|
46
|
+
|
|
47
|
+
i18n для Svelte з'явився пізніше, ніж для React або Vue, і одразу перейшов до хвиль часу компіляції.
|
|
48
|
+
|
|
49
|
+

|
|
50
|
+
|
|
51
|
+
<AccordionGroup>
|
|
52
|
+
<Accordion header="Словники під час виконання (2019–2020): svelte-i18n, sveltekit-i18n">
|
|
53
|
+
|
|
54
|
+
JSON-каталоги, ICU парситься у браузері через `intl-messageformat`, локаль у stores на рівні модулів (`$locale`, `$_`). Найбільш поширений підхід, гарна документація, налаштування SSR залишається за вами.
|
|
55
|
+
|
|
56
|
+
</Accordion>
|
|
57
|
+
<Accordion header="Згенеровані типи (2020–2022): typesafe-i18n">
|
|
58
|
+
|
|
59
|
+
Генератор відстежує ваші каталоги та створює типізовані аксесори (`$LL.cart.total()`). Надійна модель, згенеровані файли в репозиторії, але репозиторій останнім часом розвивається повільно.
|
|
60
|
+
|
|
61
|
+
</Accordion>
|
|
62
|
+
<Accordion header="Компілятор і колокований контент (2022–2026): Paraglide, wuchale, Intlayer">
|
|
63
|
+
|
|
64
|
+
Paraglide компілює кожне повідомлення в окремо експортовану функцію, завдяки чому збирач через tree-shaking видаляє все, що маршрут ніколи не викликає. `wuchale` витягує рядки з розмітки під час збирання. Intlayer оголошує контент для кожного компонента окремо та генерує типи й словники на рівні компонентів.
|
|
65
|
+
|
|
66
|
+
</Accordion>
|
|
67
|
+
</AccordionGroup>
|
|
68
|
+
|
|
69
|
+
[Історія i18n у JavaScript](https://github.com/aymericzip/intlayer/blob/main/docs/blog/uk/history_of_i18n.md) детально розглядає кожну хвилю.
|
|
70
|
+
|
|
71
|
+
## Рішення, яке має найбільше значення: де живе контент і коли він завантажується
|
|
72
|
+
|
|
73
|
+
Два структурні вибори пояснюють більшу частину різниці в розмірі bundle між конфігураціями:
|
|
74
|
+
|
|
75
|
+
- **Централізований або ізольований (scoped) контент.** Один `locales/en.json` на весь застосунок або окреме оголошення для кожного компонента.
|
|
76
|
+
- **Статичний чи динамічний імпорт.** Усе на старті або активна локаль (а в ідеалі й активний маршрут), завантажена за вимогою.
|
|
77
|
+
|
|
78
|
+
Графік оцінює обсяг переданих даних для теоретичного застосунку від 1 до 10 сторінок, перекладеного на 1–10 локалей, з приблизно 30 КБ тексту на сторінку.
|
|
79
|
+
|
|
80
|
+

|
|
81
|
+
|
|
82
|
+
`svelte-i18n` за замовчуванням розташовується у верхньому лівому куті: `register("fr", () => import("./fr.json"))` забезпечує динамічне завантаження для кожної локалі, але каталог локалі є єдиним об'єктом, і його завантаження підтягує тексти кожної сторінки. Paraglide є цікавим випадком: оскільки кожне повідомлення є окремим експортом, tree-shaking дає оптимізацію за сторінками безкоштовно, і [бенчмарк Svelte](https://github.com/aymericzip/intlayer/blob/main/docs/docs/uk/benchmark/svelte.md) підтверджує, що це працює, як заявлено, на Vite + Svelte (на відміну від бенчмарків React і Next.js). Intlayer досягає того ж результату завдяки оголошенням на рівні компонентів.
|
|
83
|
+
|
|
84
|
+
Якщо вашою відповіддю на запитання 3 було «багато сторінок», надайте цьому розділу більшої ваги, ніж будь-яким уподобанням щодо API. Стаття про [покомпонентний та централізований i18n](https://github.com/aymericzip/intlayer/blob/main/docs/blog/uk/per-component_vs_centralized_i18n.md) розглядає аспект підтримки цього ж компромісу.
|
|
85
|
+
|
|
86
|
+
## Кандидати
|
|
87
|
+
|
|
88
|
+
Розміри бібліотек взяті з [бенчмарку Svelte](https://github.com/aymericzip/intlayer/blob/main/docs/docs/uk/benchmark/svelte.md): store плюс аксесор у порожньому компоненті після бандлінгу, tree-shaking та мініфікації для застосунку на 10 сторінок і 10 локалей. Контент вимірюється окремо.
|
|
89
|
+
|
|
90
|
+
| Бібліотека | Де зберігаються повідомлення | Стан локалі | Типобезпечність | Формат повідомлень | Розділення за маршрутами (Per-route) | Розмір бібліотеки |
|
|
91
|
+
| :-------------- | :-------------------------------------- | :----------------------------------------------------- | :---------------------------------- | :---------------------------- | :----------------------------------- | :------------------------------------------------------- |
|
|
92
|
+
| `svelte-i18n` | JSON-каталоги для кожної локалі | Svelte store на рівні модуля | 2/5 — Ручне union-оголошення | ICU | Ні | ~16.6 кБ |
|
|
93
|
+
| `typesafe-i18n` | Згенеровані TS-модулі | Store-адаптер | 4/5 — Згенеровані | Власний | Частково | Невеликий |
|
|
94
|
+
| Paraglide | Проєкт inlang, скомпільований у функції | Читається при кожному виклику з cookie, URL чи storage | 3.5/5 — Згенеровані | Власний | Так, через tree-shaking | Майже нульовий (за рахунок згенерованого коду в проєкті) |
|
|
95
|
+
| `wuchale` | Витягується з розмітки під час збирання | Store | Н/Д (без ключів) | Власний | Так | ~30.7 kB |
|
|
96
|
+
| Intlayer | `.content.ts` поруч із компонентом | Context плюс store, підтримка runes | 5/5 — Згенеровані, за замовчуванням | Intlayer (+ ICU, i18next, PO) | Так, для кожного компонента | ~3.6 kB |
|
|
97
|
+
|
|
98
|
+
> Показники є зрізом для версій із бенчмарку. Запустіть його на власному застосунку, перш ніж приймати рішення лише на основі розміру.
|
|
99
|
+
> Типобезпечність: 5/5 означає, що ключі, параметри та кожна локаль перевіряються без ручного налаштування, включаючи форматувальники URL та хелпери.
|
|
100
|
+
|
|
101
|
+
Майже нульовий розмір бібліотеки Paraglide досягається конструктивно: runtime генерується безпосередньо у ваш репозиторій. Intlayer потребує `vite-intlayer`, тому він не може працювати без етапу збирання (build step).
|
|
102
|
+
|
|
103
|
+
## Зіставте ваші відповіді з бібліотекою
|
|
104
|
+
|
|
105
|
+
<AccordionGroup>
|
|
106
|
+
<Accordion header="Vite SPA, невелика команда, кілька локалей">
|
|
107
|
+
|
|
108
|
+
`svelte-i18n`. Це найбільш задокументований варіант, `$_` природно виглядає в розмітці, а `register` разом із `waitLocale()` забезпечує ліниве завантаження (lazy loading) для кожної локалі. Заблокуйте перший рендеринг за допомогою `isLoading`, інакше користувачі побачать сирі ключі. Якщо в майбутньому в застосунку може з'явитися серверний рендеринг, помістіть локаль у контекст Svelte із самого початку замість використання module store; зараз це нічого не коштує, але позбавить від помилки, яка проявляється лише в production.
|
|
109
|
+
|
|
110
|
+
</Accordion>
|
|
111
|
+
<Accordion header="SvelteKit з маршрутизацією локалей та SSR">
|
|
112
|
+
|
|
113
|
+
Проблема розділення стану вирішує цей вибір. `svelte-i18n` працює на SvelteKit, але налаштування для кожного запиту (`hooks.server.ts`, `locals`, `load`, потім `setContext`) вам доведеться писати самостійно, і тут легко припуститися непомітної помилки. Paraglide постачається з інтеграцією для SvelteKit, яка керує маршрутизацією та зчитує локаль під час кожного виклику, уникаючи singleton. Intlayer встановлює локаль із даних `load` у context. Стаття про [SvelteKit i18n](https://github.com/aymericzip/intlayer/blob/main/docs/blog/uk/list_i18n_technologies/frameworks/sveltekit.md) пояснює вибір між `[[lang]]` та `reroute`, який варто зробити до вибору бібліотеки.
|
|
114
|
+
|
|
115
|
+
</Accordion>
|
|
116
|
+
<Accordion header="Переклади надходять від TMS або агенції у форматі ICU">
|
|
117
|
+
|
|
118
|
+
`svelte-i18n` нативно підтримує ICU через `intl-messageformat`, тому безпосередньо інтегрується з більшістю сервісів. Paraglide та `typesafe-i18n` використовують власний синтаксис і потребують конвертації. Підтримка ICU в Intlayer є частковою, тому якщо ви вже отримуєте ICU-рядки, вважайте це блокуючим фактором.
|
|
119
|
+
|
|
120
|
+
</Accordion>
|
|
121
|
+
<Accordion header="Розмір bundle є головним обмеженням">
|
|
122
|
+
|
|
123
|
+
Рішення часу компіляції (Compile-time). Tree-shaking у Paraglide працює на Vite + Svelte, а витрати на бібліотеку майже нульові. Словники Intlayer на рівні компонентів дають такий самий результат без згенерованих файлів у репозиторії. `svelte-i18n` постачає парсер ICU разом із повним каталогом і займає приблизно в 4.5 раза більше місця, ніж `svelte-intlayer` у бенчмарку, ще до додавання контенту.
|
|
124
|
+
|
|
125
|
+
</Accordion>
|
|
126
|
+
<Accordion header="Типобезпека є обов'язковою">
|
|
127
|
+
|
|
128
|
+
Будь-який варіант, крім чистого `svelte-i18n`, де єдиною типізацією є написане вручну union-оголошення, яке миттєво втрачає синхронізацію з JSON. `typesafe-i18n`, Paraglide та Intlayer генерують типи з контенту. Перевірте активність репозиторію `typesafe-i18n` перед тим, як переводити на нього кодову базу. Стаття про [виявлення відсутніх перекладів](https://github.com/aymericzip/intlayer/blob/main/docs/blog/uk/detecting_missing_translations.md) порівнює, що кожен інструмент відловлює під час збирання.
|
|
129
|
+
|
|
130
|
+
</Accordion>
|
|
131
|
+
<Accordion header="Ви не хочете бачити згенеровані файли в репозиторії">
|
|
132
|
+
|
|
133
|
+
Це виключає Paraglide та `typesafe-i18n`. `svelte-i18n` та Intlayer зберігають свій результат у `node_modules` або в директорії збирання; з Intlayer файли `.content.ts` є написаним вручну сирцевим кодом, а скомпільовані словники та типи зберігаються в `.intlayer/` та ігноруються системою контролю версій.
|
|
134
|
+
|
|
135
|
+
</Accordion>
|
|
136
|
+
<Accordion header="Переклади створюватимуться за допомогою AI">
|
|
137
|
+
|
|
138
|
+
У такому разі централізований JSON більше не має споживача, який би його виправдовував. Колокований контент разом із CLI, що заповнює відсутні локалі, є коротшим шляхом. Команда `fill` в Intlayer працює з вашим власним API-ключем (OpenAI, Anthropic, Mistral, Gemini) і повторно перекладає лише те, що змінилося. Екосистема inlang у Paraglide пропонує хмарні аналоги за власними тарифними планами.
|
|
139
|
+
|
|
140
|
+
</Accordion>
|
|
141
|
+
</AccordionGroup>
|
|
142
|
+
|
|
143
|
+
## Слабкі сторони кожної бібліотеки
|
|
144
|
+
|
|
145
|
+
- **`svelte-i18n`**: найважча серед усіх, відсутність типів для ключів, відсутність розділення за маршрутами (per-route splitting), store на рівні модуля, що призводить до витоку стану між запитами на SvelteKit, якщо ви не налаштуєте context власноруч.
|
|
146
|
+
- **`typesafe-i18n`**: фоновий процес відстеження (watcher), згенеровані файли в репозиторії та репозиторій, який останнім часом розвивається повільно.
|
|
147
|
+
- **Paraglide**: згенеровані файли фіксуються в репозиторії та перегенеровуються перед кожним push, конфлікти злиття в паралельних гілках, а локаль зчитується з cookie або storage при кожному виклику повідомлення, а не зі store, що створює зайве навантаження при зміні локалі.
|
|
148
|
+
- **`wuchale`**: цікава ідея вилучення рядків, але проєкт ще на ранній стадії. У бенчмарку React виникли проблеми з реактивністю, які вимагали примусового ререндерингу провайдера, а документація є досить лаконічною.
|
|
149
|
+
- **Intlayer**: обов'язковий плагін для збирання, менша екосистема, часткова підтримка ICU та контент, розподілений по кодовій базі за дизайном, тому експорт єдиного JSON для перекладача потребує додаткових інструментів.
|
|
150
|
+
|
|
151
|
+
## Як кожен варіант виглядає в коді
|
|
152
|
+
|
|
153
|
+
Один і той самий компонент, підсумок кошика із заголовком і формою множини, написаний для кожного кандидата. Найцікавіше тут не розмітка, а те, де живе контент, як зберігається локаль і що відомо системі перевірки типів.
|
|
154
|
+
|
|
155
|
+
<Tabs defaultTab="svelte-i18n">
|
|
156
|
+
<Tab label="svelte-i18n" value="svelte-i18n">
|
|
157
|
+
|
|
158
|
+
<Tabs group="locale">
|
|
159
|
+
<Tab value="en" label="Англійська">
|
|
160
|
+
|
|
161
|
+
```json fileName="src/locales/en.json"
|
|
162
|
+
{
|
|
163
|
+
"cart": {
|
|
164
|
+
"title": "Your cart",
|
|
165
|
+
"items": "{count, plural, one {# item} other {# items}}"
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
</Tab>
|
|
171
|
+
<Tab value="fr" label="Французька">
|
|
172
|
+
|
|
173
|
+
```json fileName="src/locales/fr.json"
|
|
174
|
+
{
|
|
175
|
+
"cart": {
|
|
176
|
+
"title": "Votre panier",
|
|
177
|
+
"items": "{count, plural, one {# article} other {# articles}}"
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
</Tab>
|
|
183
|
+
<Tab value="es" label="Іспанська">
|
|
184
|
+
|
|
185
|
+
```json fileName="src/locales/es.json"
|
|
186
|
+
{
|
|
187
|
+
"cart": {
|
|
188
|
+
"title": "Tu carrito",
|
|
189
|
+
"items": "{count, plural, one {# artículo} other {# artículos}}"
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
</Tab>
|
|
195
|
+
</Tabs>
|
|
196
|
+
|
|
197
|
+
```svelte fileName="src/lib/CartSummary.svelte"
|
|
198
|
+
<script lang="ts">
|
|
199
|
+
import { _ } from "svelte-i18n";
|
|
200
|
+
|
|
201
|
+
let { count }: { count: number } = $props();
|
|
202
|
+
</script>
|
|
203
|
+
|
|
204
|
+
<section>
|
|
205
|
+
<h2>{$_("cart.title")}</h2>
|
|
206
|
+
<p>{$_("cart.items", { values: { count } })}</p>
|
|
207
|
+
</section>
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
ICU через `intl-messageformat`, локаль у store на рівні модуля. `$_` приймає будь-який рядок; єдина типізація, це union-тип, написаний власноруч.
|
|
211
|
+
|
|
212
|
+
</Tab>
|
|
213
|
+
<Tab label="Paraglide" value="paraglide">
|
|
214
|
+
|
|
215
|
+
<Tabs group="locale">
|
|
216
|
+
<Tab value="en" label="Англійська">
|
|
217
|
+
|
|
218
|
+
```json fileName="messages/en.json"
|
|
219
|
+
{
|
|
220
|
+
"cart_title": "Your cart",
|
|
221
|
+
"cart_items": "{count} items"
|
|
222
|
+
}
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
</Tab>
|
|
226
|
+
<Tab value="fr" label="Французька">
|
|
227
|
+
|
|
228
|
+
```json fileName="messages/fr.json"
|
|
229
|
+
{
|
|
230
|
+
"cart_title": "Votre panier",
|
|
231
|
+
"cart_items": "{count} articles"
|
|
232
|
+
}
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
</Tab>
|
|
236
|
+
<Tab value="es" label="Іспанська">
|
|
237
|
+
|
|
238
|
+
```json fileName="messages/es.json"
|
|
239
|
+
{
|
|
240
|
+
"cart_title": "Tu carrito",
|
|
241
|
+
"cart_items": "{count} artículos"
|
|
242
|
+
}
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
</Tab>
|
|
246
|
+
</Tabs>
|
|
247
|
+
|
|
248
|
+
```svelte fileName="src/lib/CartSummary.svelte"
|
|
249
|
+
<script lang="ts">
|
|
250
|
+
import { m } from "$lib/paraglide/messages.js";
|
|
251
|
+
|
|
252
|
+
let { count }: { count: number } = $props();
|
|
253
|
+
</script>
|
|
254
|
+
|
|
255
|
+
<section>
|
|
256
|
+
<h2>{m.cart_title()}</h2>
|
|
257
|
+
<p>{m.cart_items({ count })}</p>
|
|
258
|
+
</section>
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
Кожне повідомлення, це згенерована типізована функція, яка видаляється через tree-shaking, якщо не викликається. Папка `paraglide/` генерується у ваш репозиторій, а локаль зчитується при кожному виклику, а не зі store.
|
|
262
|
+
|
|
263
|
+
</Tab>
|
|
264
|
+
<Tab label="typesafe-i18n" value="typesafe-i18n">
|
|
265
|
+
|
|
266
|
+
<Tabs group="locale">
|
|
267
|
+
<Tab value="en" label="Англійська">
|
|
268
|
+
|
|
269
|
+
```ts fileName="src/i18n/en/index.ts"
|
|
270
|
+
import type { BaseTranslation } from "../i18n-types";
|
|
271
|
+
|
|
272
|
+
const en = {
|
|
273
|
+
cart: {
|
|
274
|
+
title: "Your cart",
|
|
275
|
+
items: "{count} item{{s}}",
|
|
276
|
+
},
|
|
277
|
+
} satisfies BaseTranslation;
|
|
278
|
+
|
|
279
|
+
export default en;
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
</Tab>
|
|
283
|
+
<Tab value="fr" label="Французька">
|
|
284
|
+
|
|
285
|
+
```ts fileName="src/i18n/fr/index.ts"
|
|
286
|
+
import type { Translation } from "../i18n-types";
|
|
287
|
+
|
|
288
|
+
const fr = {
|
|
289
|
+
cart: {
|
|
290
|
+
title: "Votre panier",
|
|
291
|
+
items: "{count} article{{s}}",
|
|
292
|
+
},
|
|
293
|
+
} satisfies Translation;
|
|
294
|
+
|
|
295
|
+
export default fr;
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
</Tab>
|
|
299
|
+
<Tab value="es" label="Іспанська">
|
|
300
|
+
|
|
301
|
+
```ts fileName="src/i18n/es/index.ts"
|
|
302
|
+
import type { Translation } from "../i18n-types";
|
|
303
|
+
|
|
304
|
+
const es = {
|
|
305
|
+
cart: {
|
|
306
|
+
title: "Tu carrito",
|
|
307
|
+
items: "{count} artículo{{s}}",
|
|
308
|
+
},
|
|
309
|
+
} satisfies Translation;
|
|
310
|
+
|
|
311
|
+
export default es;
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
</Tab>
|
|
315
|
+
</Tabs>
|
|
316
|
+
|
|
317
|
+
```svelte fileName="src/lib/CartSummary.svelte"
|
|
318
|
+
<script lang="ts">
|
|
319
|
+
import LL from "$i18n/i18n-svelte";
|
|
320
|
+
|
|
321
|
+
let { count }: { count: number } = $props();
|
|
322
|
+
</script>
|
|
323
|
+
|
|
324
|
+
<section>
|
|
325
|
+
<h2>{$LL.cart.title()}</h2>
|
|
326
|
+
<p>{$LL.cart.items({ count })}</p>
|
|
327
|
+
</section>
|
|
328
|
+
```
|
|
329
|
+
|
|
330
|
+
Типізовані аксесори, згенеровані процесом watcher. Модель надійна; згенеровані файли живуть у репозиторії, а розвиток проєкту останнім часом сповільнився.
|
|
331
|
+
|
|
332
|
+
</Tab>
|
|
333
|
+
<Tab label="Intlayer" value="intlayer">
|
|
334
|
+
|
|
335
|
+
```ts fileName="src/lib/cartSummary.content.ts"
|
|
336
|
+
import { plural, t, type Dictionary } from "intlayer";
|
|
337
|
+
|
|
338
|
+
const cartSummaryContent = {
|
|
339
|
+
key: "cart-summary",
|
|
340
|
+
content: {
|
|
341
|
+
title: t({ en: "Your cart", fr: "Votre panier", es: "Tu carrito" }),
|
|
342
|
+
items: t({
|
|
343
|
+
en: plural({ one: "{{count}} item", other: "{{count}} items" }),
|
|
344
|
+
fr: plural({ one: "{{count}} article", other: "{{count}} articles" }),
|
|
345
|
+
es: plural({ one: "{{count}} artículo", other: "{{count}} artículos" }),
|
|
346
|
+
}),
|
|
347
|
+
},
|
|
348
|
+
} satisfies Dictionary;
|
|
349
|
+
|
|
350
|
+
export default cartSummaryContent;
|
|
351
|
+
```
|
|
352
|
+
|
|
353
|
+
```svelte fileName="src/lib/CartSummary.svelte"
|
|
354
|
+
<script lang="ts">
|
|
355
|
+
import { useIntlayer } from "svelte-intlayer";
|
|
356
|
+
|
|
357
|
+
let { count }: { count: number } = $props();
|
|
358
|
+
const content = useIntlayer("cart-summary");
|
|
359
|
+
</script>
|
|
360
|
+
|
|
361
|
+
<section>
|
|
362
|
+
<h2>{$content.title}</h2>
|
|
363
|
+
<p>{$content.items(count)}</p>
|
|
364
|
+
</section>
|
|
365
|
+
```
|
|
366
|
+
|
|
367
|
+
Усі локалі в одному файлі поруч із компонентом. `useIntlayer` повертає readable store, тому `$content`, це звична автоматична підписка (auto-subscription), а локаль зберігається в context (безпечно для SSR), а не в глобальному module singleton.
|
|
368
|
+
|
|
369
|
+
</Tab>
|
|
370
|
+
</Tabs>
|
|
371
|
+
|
|
372
|
+
Вже використовуєте `svelte-i18n`? [Адаптер сумісності `@intlayer/svelte-i18n`](https://github.com/aymericzip/intlayer/blob/main/docs/docs/uk/compat/svelte-i18n.md) створює аліас для пакета на рівні збирача, тому `$_`, `$date`, `$number` та ваші плоскі ключі продовжують працювати, поки Intlayer надає контент.
|
|
373
|
+
|
|
374
|
+
## Перед тим як зробити вибір
|
|
375
|
+
|
|
376
|
+
Таблиця функцій показує, що бібліотека робить сьогодні. Ці пункти підкажуть, як виглядатиме робота з нею на практиці.
|
|
377
|
+
|
|
378
|
+
**Перевірте активність репозиторію.**
|
|
379
|
+
|
|
380
|
+
Коміти, час відповіді на issue та те, чи виходив останній мінорний реліз цього року. Гарна архітектура без супроводу авторів, це майбутня міграція.
|
|
381
|
+
|
|
382
|
+
**Не обирайте за кількістю завантажень з npm.**
|
|
383
|
+
|
|
384
|
+
Найчастіше встановлюють ту бібліотеку, яка з'явилася першою, а не ту, яка підходить для кодової бази Svelte у 2026 році. Кількість завантажень вимірює історію, а не відповідність вимогам.
|
|
385
|
+
|
|
386
|
+

|
|
387
|
+
|
|
388
|
+
**Дізнайтеся, хто фінансує підтримку і що вони продають.**
|
|
389
|
+
|
|
390
|
+
`svelte-i18n` підтримується Crowdin, як і `next-intl` та `vue-i18n`. `i18next` підтримується Locize. Tolgee, Paraglide (inlang) та Intlayer розвивають власні платформи. Постачальник, чий дохід базується на платному хостингу перекладів, мало зацікавлений у тому, щоб переклади були безкоштовними всередині вашого інструментарію. Intlayer, єдиний з усіх, хто пропонує AI-переклад через CLI з вашим власним API-ключем, а також CMS, яку можна розгорнути самостійно (self-host).
|
|
391
|
+
|
|
392
|
+
**Чи готовий інструмент до роботи з AI-агентами?**
|
|
393
|
+
|
|
394
|
+
Агенти все ще відчувають труднощі з i18n: вони забувають локалі, вигадують ключі та плутають синтаксис повідомлень. Чи надає бібліотека [Agent Skills](https://github.com/aymericzip/intlayer/blob/main/docs/docs/uk/agent_skills.md) або [MCP-сервер](https://github.com/aymericzip/intlayer/blob/main/docs/docs/uk/mcp_server.md), щоб агент міг переглядати, заповнювати та тестувати контент? І чи оптимізовано завантаження контенту за замовчуванням, чи комусь доводиться щокварталу переглядати namespaces та lazy imports?
|
|
395
|
+
|
|
396
|
+
**Типобезпека «з коробки».**
|
|
397
|
+
|
|
398
|
+
Не «можна типізувати додатковими зусиллями», а «неправильний ключ викликає помилку `tsc` одразу після встановлення». Перевірте, що відбувається з неіснуючим ключем та з локаллю, у якій пропущено один переклад.
|
|
399
|
+
|
|
400
|
+
**Виявлення невикористаного контенту.**
|
|
401
|
+
|
|
402
|
+
Каталоги лише зростають. Збирання в Intlayer видаляє невикористані поля та записує їх у лог (`build.purge`). Paraglide досягає цього за рахунок архітектури, оскільки невикликана функція повідомлення видаляється через tree-shaking. Усі інші рішення залишають очищення на вас.
|
|
403
|
+
|
|
404
|
+
**Досвід розробника (Developer experience).**
|
|
405
|
+
|
|
406
|
+
Час налаштування до першого перекладеного рядка, [LSP](https://github.com/aymericzip/intlayer/blob/main/docs/docs/uk/lsp.md) або [розширення для VS Code](https://github.com/aymericzip/intlayer/blob/main/docs/docs/uk/vs_code_extension.md), які показують переклад при наведенні та переходять до оголошення, [CLI](https://github.com/aymericzip/intlayer/blob/main/docs/docs/uk/cli/index.md) для заповнення, тестування й публікації (push), [компілятор](https://github.com/aymericzip/intlayer/blob/main/docs/docs/uk/compiler.md) або екстрактор, який витягує захардкоджені рядки з компонентів, щоб не керувати кожним рядком ключ за ключем, а також можливість для нетехнічних спеціалістів редагувати контент ([візуальний редактор](https://github.com/aymericzip/intlayer/blob/main/docs/docs/uk/intlayer_visual_editor.md) або [CMS](https://github.com/aymericzip/intlayer/blob/main/docs/docs/uk/intlayer_CMS.md)) без створення pull request.
|
|
407
|
+
|
|
408
|
+
## Часті запитання
|
|
409
|
+
|
|
410
|
+
<FAQ>
|
|
411
|
+
|
|
412
|
+
<Question title="Чи залишається svelte-i18n правильним вибором за замовчуванням у 2026 році?">
|
|
413
|
+
|
|
414
|
+
Для Vite SPA з невеликим каталогом, так. Це найбільш задокументований варіант, і сумісність з ICU важлива для багатьох команд. На SvelteKit або за наявності понад кількох десятків сторінок його недоліки (відсутність типів, відсутність ізоляції, спільний store) починають накопичуватися.
|
|
415
|
+
|
|
416
|
+
</Question>
|
|
417
|
+
|
|
418
|
+
<Question title="Чи справді працює tree-shaking у Paraglide?">
|
|
419
|
+
|
|
420
|
+
На Vite + Svelte, так, бенчмарк це підтверджує. На React з TanStack Start або Next.js це не спрацювало в тому ж бенчмарку. Перевірте це на власному стеку, замість того щоб довіряти будь-якому з результатів.
|
|
421
|
+
|
|
422
|
+
</Question>
|
|
423
|
+
|
|
424
|
+
<Question title="Чи впливають runes на вибір бібліотеки?">
|
|
425
|
+
|
|
426
|
+
Вони змінюють синтаксис вашого власного стану локалі, а не проблему розділення стану. Важливо те, чи підтримує runtime бібліотеки runes у Svelte 5 і чи використовує вона context замість module store. Перевірте обидва аспекти.
|
|
427
|
+
|
|
428
|
+
</Question>
|
|
429
|
+
|
|
430
|
+
<Question title="Чи впливає вибір бібліотеки на SEO?">
|
|
431
|
+
|
|
432
|
+
Опосередковано. Для пошукових роботів важливі маршрутизація, `hreflang`, `<html lang>` і те, чи присутній текст у відрендереному сервером HTML. Дивіться [посібник з hreflang](https://github.com/aymericzip/intlayer/blob/main/docs/blog/uk/hreflang_guide_multilingual_seo.md).
|
|
433
|
+
|
|
434
|
+
</Question>
|
|
435
|
+
|
|
436
|
+
</FAQ>
|
|
437
|
+
|
|
438
|
+
## Додаткові матеріали
|
|
439
|
+
|
|
440
|
+
- [Бенчмарк Svelte i18n: розмір bundle, витік та час перемикання локалі](https://github.com/aymericzip/intlayer/blob/main/docs/docs/uk/benchmark/svelte.md)
|
|
441
|
+
- [Svelte i18n: stores, runes та пастка рівня модуля](https://github.com/aymericzip/intlayer/blob/main/docs/blog/uk/list_i18n_technologies/frameworks/svelte.md) і [SvelteKit i18n: маршрутизація, SSR та спільний стан](https://github.com/aymericzip/intlayer/blob/main/docs/blog/uk/list_i18n_technologies/frameworks/sveltekit.md)
|
|
442
|
+
- [Готовий адаптер сумісності для `svelte-i18n`](https://github.com/aymericzip/intlayer/blob/main/docs/docs/uk/compat/svelte-i18n.md)
|
|
443
|
+
- [Історія i18n у JavaScript](https://github.com/aymericzip/intlayer/blob/main/docs/blog/uk/history_of_i18n.md)
|
|
444
|
+
- [Компілятор проти декларативного i18n](https://github.com/aymericzip/intlayer/blob/main/docs/blog/uk/compiler_vs_declarative_i18n.md)
|
|
445
|
+
- [Покомпонентний та централізований i18n](https://github.com/aymericzip/intlayer/blob/main/docs/blog/uk/per-component_vs_centralized_i18n.md)
|
|
446
|
+
- [Як працює оптимізація bundle під час збирання](https://github.com/aymericzip/intlayer/blob/main/docs/docs/uk/bundle_optimization.md)
|
|
447
|
+
- [Налаштування i18n у застосунку Vite + Svelte](https://github.com/aymericzip/intlayer/blob/main/docs/docs/uk/intlayer_with_vite+svelte.md) та в [застосунку SvelteKit](https://github.com/aymericzip/intlayer/blob/main/docs/docs/uk/intlayer_with_svelte_kit.md)
|
|
448
|
+
- Аналогічні посібники для [React](https://github.com/aymericzip/intlayer/blob/main/docs/blog/uk/how_to_pick_react_i18n_library.md), [Vue](https://github.com/aymericzip/intlayer/blob/main/docs/blog/uk/how_to_pick_vue_i18n_library.md) та [Solid](https://github.com/aymericzip/intlayer/blob/main/docs/blog/uk/how_to_pick_solid_i18n_library.md)
|