@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,549 @@
|
|
|
1
|
+
---
|
|
2
|
+
createdAt: 2026-09-16
|
|
3
|
+
updatedAt: 2026-09-16
|
|
4
|
+
title: "Como escolher a biblioteca de i18n certa para React em 2026"
|
|
5
|
+
description: Um guia de decisão para internacionalização em React. Quais perguntas responder antes de comparar react-i18next, react-intl, Lingui, use-intl, Paraglide e Intlayer, e o que cada escolha custa em tamanho de bundle, tipagem e manutenção.
|
|
6
|
+
keywords:
|
|
7
|
+
- react i18n
|
|
8
|
+
- react internationalization
|
|
9
|
+
- internacionalização react
|
|
10
|
+
- react-i18next
|
|
11
|
+
- react-intl
|
|
12
|
+
- Lingui
|
|
13
|
+
- use-intl
|
|
14
|
+
- Paraglide
|
|
15
|
+
- Intlayer
|
|
16
|
+
- comparação de bibliotecas i18n
|
|
17
|
+
slugs:
|
|
18
|
+
- blog
|
|
19
|
+
- how-to-pick-react-i18n-library
|
|
20
|
+
author: aymericzip
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
# Como escolher a biblioteca de i18n certa para React
|
|
24
|
+
|
|
25
|
+
O React não inclui nenhuma primitiva de i18n. A biblioteca que você escolhe no primeiro dia decide como as traduções são armazenadas, como elas chegam ao bundle e quanto trabalho continuará sendo seu nos próximos anos. A maioria das equipes escolhe pela popularidade e depois descobre os trade-offs quando atinge 2.000 chaves.
|
|
26
|
+
|
|
27
|
+
Este guia segue o caminho inverso: responda a algumas perguntas sobre o seu projeto primeiro e, em seguida, mapeie as respostas para as bibliotecas mais adequadas. O foco aqui é o React puro (Vite, React Router, TanStack Start). O Next.js tem suas próprias restrições, abordadas na [comparação para Next.js](https://github.com/aymericzip/intlayer/blob/main/docs/blog/pt/next-i18next_vs_next-intl_vs_intlayer.md).
|
|
28
|
+
|
|
29
|
+

|
|
30
|
+
|
|
31
|
+
## Índice
|
|
32
|
+
|
|
33
|
+
<TOC/>
|
|
34
|
+
|
|
35
|
+
## Seis perguntas a responder antes de comparar bibliotecas
|
|
36
|
+
|
|
37
|
+
Uma tabela de recursos é inútil sem saber quais linhas importam para você. Analise estes pontos primeiro.
|
|
38
|
+
|
|
39
|
+
1. **Como a aplicação é renderizada?** Apenas SPA, SSR com hidratação ou React Server Components. Hooks baseados em context funcionam em qualquer lugar em uma SPA. Com RSC, um hook força `"use client"` em todos os componentes que renderizam texto, portanto você também precisará de uma API no lado do servidor.
|
|
40
|
+
2. **Quem escreve as traduções?** Desenvolvedores, uma equipe interna usando um TMS, uma agência entregando arquivos ICU ou um pipeline de IA. Isso dita o formato do catálogo mais do que qualquer detalhe de API.
|
|
41
|
+
3. **Quantos locales e páginas?** Dois locales e cinco páginas podem se dar ao luxo de enviar tudo. Dez locales e cinquenta rotas não podem, e a estratégia de carregamento se torna o custo principal.
|
|
42
|
+
4. **Você precisa de tipos nas chaves?** Um erro de digitação em `t("checkout.totl")` compila em qualquer biblioteca baseada em chaves, a menos que você mesmo configure os tipos. Decida se isso é aceitável.
|
|
43
|
+
5. **O que a string contém?** Texto simples, plurais ou frases com um `<Link>` no meio. Conteúdo rico é onde a maioria das APIs se torna complicada.
|
|
44
|
+
6. **Quanto tempo o projeto vai durar?** Um protótipo de três meses e um produto de cinco anos não precisam da mesma quantidade de build tooling.
|
|
45
|
+
|
|
46
|
+
Anote as respostas. Tudo o que segue faz referência a elas.
|
|
47
|
+
|
|
48
|
+
## O panorama geral em uma imagem
|
|
49
|
+
|
|
50
|
+
Quinze anos de JavaScript i18n cabem em quatro ondas arquiteturais, e as bibliotecas React que você vai comparar vêm de ondas diferentes.
|
|
51
|
+
|
|
52
|
+

|
|
53
|
+
|
|
54
|
+
<AccordionGroup>
|
|
55
|
+
<Accordion header="Dicionários em runtime (2011 a 2017): i18next, react-intl">
|
|
56
|
+
|
|
57
|
+
Catálogos JSON carregados em memória, `t("a.b")` buscado em runtime, ICU ou uma sintaxe personalizada analisada no navegador. Maiores ecossistemas, runtimes mais pesados, tipos são opcionais (opt-in).
|
|
58
|
+
|
|
59
|
+
</Accordion>
|
|
60
|
+
<Accordion header="Macros em tempo de compilação (2018 a 2021): Lingui, typesafe-i18n">
|
|
61
|
+
|
|
62
|
+
Mensagens extraídas no build, compiladas para catálogos compactos, argumentos tipados. Uma etapa extra de build (`extract`, `compile`) em troca de bundles menores.
|
|
63
|
+
|
|
64
|
+
</Accordion>
|
|
65
|
+
<Accordion header="Server-first (2022 a 2024): use-intl / next-intl">
|
|
66
|
+
|
|
67
|
+
Projetado em torno de SSR e Server Components. Renderize no servidor, hidrate apenas o que o cliente precisa. Ainda baseado em chaves e centralizado.
|
|
68
|
+
|
|
69
|
+
</Accordion>
|
|
70
|
+
<Accordion header="Compilador e conteúdo colocalizado (2024 a 2026): Paraglide, Intlayer, wuchale">
|
|
71
|
+
|
|
72
|
+
O conteúdo é compilado em funções com tree-shaking ou dicionários por componente. Tipos são gerados, traduções ausentes quebram o build e a tradução por IA roda via CLI.
|
|
73
|
+
|
|
74
|
+
</Accordion>
|
|
75
|
+
</AccordionGroup>
|
|
76
|
+
|
|
77
|
+
A [história do JavaScript i18n](https://github.com/aymericzip/intlayer/blob/main/docs/blog/pt/history_of_i18n.md) detalha como cada onda respondeu aos problemas da anterior.
|
|
78
|
+
|
|
79
|
+
## A decisão que mais importa: onde o conteúdo fica e quando ele carrega
|
|
80
|
+
|
|
81
|
+
Toda biblioteca de i18n para React tem o mesmo formato: uma store, um provider, um hook. O que o provider recebe acaba no bundle do cliente ou no payload de hidratação. Portanto, as duas escolhas estruturais são:
|
|
82
|
+
|
|
83
|
+
- **Conteúdo centralizado ou com escopo.** Um `en.json` para a aplicação inteira, ou uma declaração por componente (ou por namespace).
|
|
84
|
+
- **Import estático ou dinâmico.** Tudo empacotado na inicialização, ou o locale e a rota ativos buscados sob demanda.
|
|
85
|
+
|
|
86
|
+
O gráfico abaixo estima o payload para uma aplicação teórica de 1 a 10 páginas, traduzida para 1 a 10 locales, com cerca de 30 KB de texto por página.
|
|
87
|
+
|
|
88
|
+

|
|
89
|
+
|
|
90
|
+
Conteúdo centralizado com imports estáticos cresce em ambos os eixos: 10 páginas vezes 10 locales representam 300 KB de texto em cada página. Imports dinâmicos removem o eixo dos locales. O escopo por componente remove o eixo das páginas. Apenas a combinação de ambos mantém o tamanho estável.
|
|
91
|
+
|
|
92
|
+
Isso não é uma propriedade da biblioteca, é uma propriedade de disciplina. O `react-i18next` pode ter escopo com namespaces e backends lazy. O `use-intl` pode ser dividido por rota. Mas nada impõe isso, e um `<Button>` compartilhado acessando `t("common:cta")` silenciosamente torna o `common` uma dependência de todas as rotas. O [benchmark](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pt/benchmark/index.md) mede isso como "vazamento de outras rotas" e "vazamento de outros locales", e é de onde vem a maior parte da diferença entre as bibliotecas.
|
|
93
|
+
|
|
94
|
+
Se a sua resposta para a pergunta 3 foi "muitos locales, muitas páginas", dê mais peso a esta seção do que a qualquer preferência de API. O artigo sobre [i18n por componente vs. centralizado](https://github.com/aymericzip/intlayer/blob/main/docs/blog/pt/per-component_vs_centralized_i18n.md) aprofunda o lado da manutenção dessa mesma escolha.
|
|
95
|
+
|
|
96
|
+
## Os candidatos
|
|
97
|
+
|
|
98
|
+
Os tamanhos das bibliotecas vêm do [benchmark no TanStack Start](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pt/benchmark/tanstack.md): provider mais hook em um componente vazio, após bundling, tree-shaking e minificação, 10 páginas e 10 locales. O conteúdo é medido separadamente.
|
|
99
|
+
|
|
100
|
+
| Biblioteca | Onda | Modelo de conteúdo | Segurança de tipos | Formato de mensagem | Tamanho da biblioteca |
|
|
101
|
+
| :---------------------- | :----------- | :---------------------------------------------- | :--------------------------------- | :---------------------------- | :--------------------------------------------------- |
|
|
102
|
+
| `react-i18next` | Runtime | JSON central, namespaces | 2/5 — Opt-in (`CustomTypeOptions`) | i18next (sufixos plurais) | ~18.4 kB |
|
|
103
|
+
| `react-intl` (FormatJS) | Runtime | JSON central, ICU | 2/5 — Opt-in (extração + union) | ICU | ~15.3 kB |
|
|
104
|
+
| `use-intl` | Server-first | JSON central, ICU | 2/5 — Opt-in (declaration merging) | ICU | ~14.1 kB |
|
|
105
|
+
| `@tolgee/react` | Runtime | Central, edição em contexto | 1/5 — Não | ICU | ~11.1 kB |
|
|
106
|
+
| Lingui | Macro | Texto de origem no código, catálogos compilados | 2/5 — Bom, a partir do compilador | ICU via macros | ~11.8 kB |
|
|
107
|
+
| Paraglide | Compilador | Projeto inlang, funções geradas | 3.5/5 — Gerados | Próprio | Próximo de zero (devido ao código gerado no projeto) |
|
|
108
|
+
| Intlayer | Compilador | `.content.ts` por componente | 5/5 — Gerados, ativo por padrão | Intlayer (+ ICU, i18next, PO) | ~5.0 kB |
|
|
109
|
+
|
|
110
|
+
> Os números são um snapshot das versões do benchmark e mudam com novos lançamentos. Execute o benchmark na sua própria aplicação antes de decidir apenas pelo tamanho.
|
|
111
|
+
> Segurança de tipos: 5/5 significa que chaves, parâmetros e cada locale são verificados sem configuração manual, incluindo formatadores de URL e helpers.
|
|
112
|
+
|
|
113
|
+
Duas coisas que a tabela não mostra. O `Paraglide` quase não envia biblioteca porque gera código dentro do seu repositório, o que significa uma etapa de regeneração antes de cada commit e conflitos de merge em arquivos gerados. E o `Intlayer` requer um plugin de bundler (`vite-intlayer` ou equivalente), portanto não pode rodar em uma configuração sem build.
|
|
114
|
+
|
|
115
|
+
## Mapeie suas respostas para uma biblioteca
|
|
116
|
+
|
|
117
|
+
<AccordionGroup>
|
|
118
|
+
<Accordion header="Protótipo, equipe pequena, poucos locales">
|
|
119
|
+
|
|
120
|
+
Escolha a solução mais simples que funcione e não invista além do necessário. `react-i18next` com um único JSON por locale é adequado, e uma década de respostas no Stack Overflow vai economizar seu tempo. Ignore namespaces até precisar deles. Se o protótipo se transformar em um produto, planeje uma migração para conteúdo com escopo; o [adaptador de compatibilidade do react-i18next](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pt/compat/react-i18next.md) torna isso incremental.
|
|
121
|
+
|
|
122
|
+
</Accordion>
|
|
123
|
+
<Accordion header="As traduções vêm de uma agência ou de um TMS que usa ICU">
|
|
124
|
+
|
|
125
|
+
O formato do catálogo já está decidido para você. `react-intl` é nativo em ICU e as ferramentas de extração do FormatJS foram criadas para esse pipeline. `use-intl` também lê ICU. `react-i18next` precisa do plugin ICU e de suas próprias chaves de plural caso contrário. O suporte a ICU no Intlayer ainda é parcial, portanto, se você recebe strings em ICU hoje, trate isso como um impedimento até que o suporte seja concluído.
|
|
126
|
+
|
|
127
|
+
</Accordion>
|
|
128
|
+
<Accordion header="Aplicação grande, muitas rotas, orçamento de bundle importa">
|
|
129
|
+
|
|
130
|
+
Prefira conteúdo com escopo e carregamento dinâmico por padrão, e não por convenção. `Lingui` e `Paraglide` chegam lá através da compilação. O Intlayer alcança isso por meio de declarações por componente, e o compilador envia apenas o que uma rota renderiza. Com `react-i18next` ou `use-intl`, planeje a estratégia de namespaces e lazy-loading no primeiro dia e exija isso em code review, pois as ferramentas não farão isso por você.
|
|
131
|
+
|
|
132
|
+
</Accordion>
|
|
133
|
+
<Accordion header="Type safety é inegociável">
|
|
134
|
+
|
|
135
|
+
Toda biblioteca baseada em chaves pode ser tipada, mas quase nenhuma vem assim por padrão. Se você não quer manter declaration merging que precisa resistir a namespaces carregados dinamicamente, escolha uma biblioteca onde os tipos são gerados a partir do conteúdo: `Lingui`, `Paraglide` ou Intlayer. O artigo sobre [detecção de traduções ausentes](https://github.com/aymericzip/intlayer/blob/main/docs/blog/pt/detecting_missing_translations.md) compara o que cada uma detecta em tempo de build.
|
|
136
|
+
|
|
137
|
+
</Accordion>
|
|
138
|
+
<Accordion header="Muito conteúdo rico: markdown, links dentro de frases, componentes por locale">
|
|
139
|
+
|
|
140
|
+
Nós ricos são onde o `t()` retornando uma string deixa a desejar. `react-i18next` e `Lingui` têm o `<Trans>`, `react-intl` tem tags de rich text, todos eles mais trabalhosos do que o caso de string simples. Os nós de conteúdo do Intlayer aceitam JSX, markdown e objetos aninhados diretamente, o que é a melhor escolha se o seu conteúdo vai além de simples rótulos de UI.
|
|
141
|
+
|
|
142
|
+
</Accordion>
|
|
143
|
+
<Accordion header="As traduções serão produzidas por IA, revisadas por desenvolvedores">
|
|
144
|
+
|
|
145
|
+
Nesse caso, um JSON centralizado não é mais um requisito, já que não há um TMS para importar arquivos. Conteúdo colocalizado junto com uma CLI que preenche locales ausentes é o caminho mais curto. O comando `fill` do Intlayer roda com sua própria chave de API (OpenAI, Anthropic, Mistral, Gemini) e traduz apenas o que foi alterado. Paraglide e Tolgee oferecem equivalentes hospedados com seus próprios planos.
|
|
146
|
+
|
|
147
|
+
</Accordion>
|
|
148
|
+
<Accordion header="Você pode migrar para o Next.js App Router mais tarde">
|
|
149
|
+
|
|
150
|
+
O React context não cruza a fronteira entre servidor e cliente. Bibliotecas construídas apenas sobre um hook de cliente (`react-i18next`, `react-intl`) precisarão de uma API de servidor paralela no dia em que você adotar RSC. `use-intl` (como `next-intl`) e Intlayer (como `next-intlayer`) já possuem essa divisão. Leia o [artigo sobre Next.js i18n](https://github.com/aymericzip/intlayer/blob/main/docs/blog/pt/list_i18n_technologies/frameworks/nextjs.md) antes de padronizar um modelo.
|
|
151
|
+
|
|
152
|
+
</Accordion>
|
|
153
|
+
</AccordionGroup>
|
|
154
|
+
|
|
155
|
+
## Onde cada biblioteca deixa a desejar
|
|
156
|
+
|
|
157
|
+
Limites honestos, já que todas as opções têm os seus.
|
|
158
|
+
|
|
159
|
+
- **`react-i18next`**: a mais pesada do conjunto, formato de plural próprio, tipagem depende da sua própria configuração manual, chaves sem uso acumulam-se silenciosamente.
|
|
160
|
+
- **`react-intl`**: DX verbosa (`useIntl()` e depois `formatMessage({ id })`), instância global vinculada a muitos nós.
|
|
161
|
+
- **`use-intl`**: simples para começar, difícil de otimizar. Namespaces, carregamento dinâmico e tipagem juntos tornam o desenvolvimento bem mais lento.
|
|
162
|
+
- **`Lingui`**: etapa extra de build com `extract` / `compile`, várias sintaxes sobrepostas (`t()`, tagged template, `i18n.t()`, `<Trans>`) que confundem desenvolvedores e assistentes de IA.
|
|
163
|
+
- **`Paraglide`**: arquivos gerados no repositório, o tree-shaking não surtiu efeito no benchmark React, e o locale é lido do storage a cada nó em vez de vir de uma store.
|
|
164
|
+
- **`Tolgee`**: sem tipos nas chaves, onboarding mais difícil, edição em contexto é o principal diferencial.
|
|
165
|
+
- **`Intlayer`**: plugin de build obrigatório, ecossistema menor, suporte parcial a ICU, conteúdo distribuído pela codebase por design, logo exportar um único JSON para um tradutor exige ferramentas.
|
|
166
|
+
- **`gt-react`, `lingo.dev`**: não recomendadas no benchmark: erros de cota no build, vendor lock-in e problemas de reatividade que exigiram forçar re-renderizações do provider.
|
|
167
|
+
|
|
168
|
+
## Como cada opção se parece no código
|
|
169
|
+
|
|
170
|
+
O mesmo componente, um resumo de carrinho com título e plural, escrito com cada candidata. A parte interessante não é o componente em si, mas onde o conteúdo fica e o que o verificador de tipos sabe sobre ele.
|
|
171
|
+
|
|
172
|
+
<Tabs defaultTab="react-i18next">
|
|
173
|
+
<Tab label="react-i18next" value="react-i18next">
|
|
174
|
+
|
|
175
|
+
<Tabs group="locale">
|
|
176
|
+
<Tab value="en" label="Inglês">
|
|
177
|
+
|
|
178
|
+
```json fileName="public/locales/en/cart.json"
|
|
179
|
+
{
|
|
180
|
+
"title": "Your cart",
|
|
181
|
+
"items_one": "{{count}} item",
|
|
182
|
+
"items_other": "{{count}} items"
|
|
183
|
+
}
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
</Tab>
|
|
187
|
+
<Tab value="fr" label="Francês">
|
|
188
|
+
|
|
189
|
+
```json fileName="public/locales/fr/cart.json"
|
|
190
|
+
{
|
|
191
|
+
"title": "Votre panier",
|
|
192
|
+
"items_one": "{{count}} article",
|
|
193
|
+
"items_other": "{{count}} articles"
|
|
194
|
+
}
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
</Tab>
|
|
198
|
+
<Tab value="es" label="Espanhol">
|
|
199
|
+
|
|
200
|
+
```json fileName="public/locales/es/cart.json"
|
|
201
|
+
{
|
|
202
|
+
"title": "Tu carrito",
|
|
203
|
+
"items_one": "{{count}} artículo",
|
|
204
|
+
"items_other": "{{count}} artículos"
|
|
205
|
+
}
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
</Tab>
|
|
209
|
+
</Tabs>
|
|
210
|
+
|
|
211
|
+
```tsx fileName="src/components/CartSummary.tsx"
|
|
212
|
+
import type { FC } from "react";
|
|
213
|
+
import { useTranslation } from "react-i18next";
|
|
214
|
+
|
|
215
|
+
export const CartSummary: FC<{ count: number }> = ({ count }) => {
|
|
216
|
+
const { t } = useTranslation("cart");
|
|
217
|
+
|
|
218
|
+
return (
|
|
219
|
+
<section>
|
|
220
|
+
<h2>{t("title")}</h2>
|
|
221
|
+
<p>{t("items", { count })}</p>
|
|
222
|
+
</section>
|
|
223
|
+
);
|
|
224
|
+
};
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
Plurais são chaves com sufixo resolvidas via `Intl.PluralRules`. `t` é `(key: string) => string` a menos que você declare `CustomTypeOptions`, então `t("titel")` compila sem erros.
|
|
228
|
+
|
|
229
|
+
</Tab>
|
|
230
|
+
<Tab label="react-intl" value="react-intl">
|
|
231
|
+
|
|
232
|
+
<Tabs group="locale">
|
|
233
|
+
<Tab value="en" label="Inglês">
|
|
234
|
+
|
|
235
|
+
```json fileName="src/locales/en.json"
|
|
236
|
+
{
|
|
237
|
+
"cart.title": "Your cart",
|
|
238
|
+
"cart.items": "{count, plural, one {# item} other {# items}}"
|
|
239
|
+
}
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
</Tab>
|
|
243
|
+
<Tab value="fr" label="Francês">
|
|
244
|
+
|
|
245
|
+
```json fileName="src/locales/fr.json"
|
|
246
|
+
{
|
|
247
|
+
"cart.title": "Votre panier",
|
|
248
|
+
"cart.items": "{count, plural, one {# article} other {# articles}}"
|
|
249
|
+
}
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
</Tab>
|
|
253
|
+
<Tab value="es" label="Espanhol">
|
|
254
|
+
|
|
255
|
+
```json fileName="src/locales/es.json"
|
|
256
|
+
{
|
|
257
|
+
"cart.title": "Tu carrito",
|
|
258
|
+
"cart.items": "{count, plural, one {# artículo} other {# artículos}}"
|
|
259
|
+
}
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
</Tab>
|
|
263
|
+
</Tabs>
|
|
264
|
+
|
|
265
|
+
```tsx fileName="src/components/CartSummary.tsx"
|
|
266
|
+
import type { FC } from "react";
|
|
267
|
+
import { FormattedMessage, useIntl } from "react-intl";
|
|
268
|
+
|
|
269
|
+
export const CartSummary: FC<{ count: number }> = ({ count }) => {
|
|
270
|
+
const intl = useIntl();
|
|
271
|
+
|
|
272
|
+
return (
|
|
273
|
+
<section>
|
|
274
|
+
<h2>
|
|
275
|
+
<FormattedMessage id="cart.title" />
|
|
276
|
+
</h2>
|
|
277
|
+
<p>{intl.formatMessage({ id: "cart.items" }, { count })}</p>
|
|
278
|
+
</section>
|
|
279
|
+
);
|
|
280
|
+
};
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
ICU de ponta a ponta, que é o que a maioria das plataformas de TMS exporta. Tipos em `id` vêm da etapa de extração do `formatjs` mais uma union gerada, não prontos de fábrica.
|
|
284
|
+
|
|
285
|
+
</Tab>
|
|
286
|
+
<Tab label="use-intl" value="use-intl">
|
|
287
|
+
|
|
288
|
+
<Tabs group="locale">
|
|
289
|
+
<Tab value="en" label="Inglês">
|
|
290
|
+
|
|
291
|
+
```json fileName="messages/en.json"
|
|
292
|
+
{
|
|
293
|
+
"Cart": {
|
|
294
|
+
"title": "Your cart",
|
|
295
|
+
"items": "{count, plural, one {# item} other {# items}}"
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
</Tab>
|
|
301
|
+
<Tab value="fr" label="Francês">
|
|
302
|
+
|
|
303
|
+
```json fileName="messages/fr.json"
|
|
304
|
+
{
|
|
305
|
+
"Cart": {
|
|
306
|
+
"title": "Votre panier",
|
|
307
|
+
"items": "{count, plural, one {# article} other {# articles}}"
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
</Tab>
|
|
313
|
+
<Tab value="es" label="Espanhol">
|
|
314
|
+
|
|
315
|
+
```json fileName="messages/es.json"
|
|
316
|
+
{
|
|
317
|
+
"Cart": {
|
|
318
|
+
"title": "Tu carrito",
|
|
319
|
+
"items": "{count, plural, one {# artículo} other {# artículos}}"
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
</Tab>
|
|
325
|
+
</Tabs>
|
|
326
|
+
|
|
327
|
+
```tsx fileName="src/components/CartSummary.tsx"
|
|
328
|
+
import type { FC } from "react";
|
|
329
|
+
import { useTranslations } from "use-intl";
|
|
330
|
+
|
|
331
|
+
export const CartSummary: FC<{ count: number }> = ({ count }) => {
|
|
332
|
+
const t = useTranslations("Cart");
|
|
333
|
+
|
|
334
|
+
return (
|
|
335
|
+
<section>
|
|
336
|
+
<h2>{t("title")}</h2>
|
|
337
|
+
<p>{t("items", { count })}</p>
|
|
338
|
+
</section>
|
|
339
|
+
);
|
|
340
|
+
};
|
|
341
|
+
```
|
|
342
|
+
|
|
343
|
+
Mesmo formato do `next-intl` sem os bindings do Next.js. Chaves são tipadas depois que você estende `AppConfig` com o tipo das mensagens; dividir namespaces fica por sua conta.
|
|
344
|
+
|
|
345
|
+
</Tab>
|
|
346
|
+
<Tab label="Lingui" value="lingui">
|
|
347
|
+
|
|
348
|
+
```po fileName="src/locales/fr/messages.po"
|
|
349
|
+
msgid "Your cart"
|
|
350
|
+
msgstr "Votre panier"
|
|
351
|
+
|
|
352
|
+
msgid "{count, plural, one {# item} other {# items}}"
|
|
353
|
+
msgstr "{count, plural, one {# article} other {# articles}}"
|
|
354
|
+
```
|
|
355
|
+
|
|
356
|
+
```tsx fileName="src/components/CartSummary.tsx"
|
|
357
|
+
import type { FC } from "react";
|
|
358
|
+
import { Plural, Trans } from "@lingui/react/macro";
|
|
359
|
+
|
|
360
|
+
export const CartSummary: FC<{ count: number }> = ({ count }) => (
|
|
361
|
+
<section>
|
|
362
|
+
<h2>
|
|
363
|
+
<Trans>Your cart</Trans>
|
|
364
|
+
</h2>
|
|
365
|
+
<p>
|
|
366
|
+
<Plural value={count} one="# item" other="# items" />
|
|
367
|
+
</p>
|
|
368
|
+
</section>
|
|
369
|
+
);
|
|
370
|
+
```
|
|
371
|
+
|
|
372
|
+
O idioma de origem fica no componente; outros locales ficam em arquivos `.po` sob IDs em hash após `lingui extract`. Esquecer o `extract` ou `compile` faz o fallback silencioso para o inglês.
|
|
373
|
+
|
|
374
|
+
</Tab>
|
|
375
|
+
<Tab label="Paraglide" value="paraglide">
|
|
376
|
+
|
|
377
|
+
<Tabs group="locale">
|
|
378
|
+
<Tab value="en" label="Inglês">
|
|
379
|
+
|
|
380
|
+
```json fileName="messages/en.json"
|
|
381
|
+
{
|
|
382
|
+
"cart_title": "Your cart",
|
|
383
|
+
"cart_items": "{count} items"
|
|
384
|
+
}
|
|
385
|
+
```
|
|
386
|
+
|
|
387
|
+
</Tab>
|
|
388
|
+
<Tab value="fr" label="Francês">
|
|
389
|
+
|
|
390
|
+
```json fileName="messages/fr.json"
|
|
391
|
+
{
|
|
392
|
+
"cart_title": "Votre panier",
|
|
393
|
+
"cart_items": "{count} articles"
|
|
394
|
+
}
|
|
395
|
+
```
|
|
396
|
+
|
|
397
|
+
</Tab>
|
|
398
|
+
<Tab value="es" label="Espanhol">
|
|
399
|
+
|
|
400
|
+
```json fileName="messages/es.json"
|
|
401
|
+
{
|
|
402
|
+
"cart_title": "Tu carrito",
|
|
403
|
+
"cart_items": "{count} artículos"
|
|
404
|
+
}
|
|
405
|
+
```
|
|
406
|
+
|
|
407
|
+
</Tab>
|
|
408
|
+
</Tabs>
|
|
409
|
+
|
|
410
|
+
```tsx fileName="src/components/CartSummary.tsx"
|
|
411
|
+
import type { FC } from "react";
|
|
412
|
+
import { m } from "../paraglide/messages.js";
|
|
413
|
+
|
|
414
|
+
export const CartSummary: FC<{ count: number }> = ({ count }) => (
|
|
415
|
+
<section>
|
|
416
|
+
<h2>{m.cart_title()}</h2>
|
|
417
|
+
<p>{m.cart_items({ count })}</p>
|
|
418
|
+
</section>
|
|
419
|
+
);
|
|
420
|
+
```
|
|
421
|
+
|
|
422
|
+
Cada mensagem é uma função gerada e tipada, portanto uma chave ausente resulta em erro de import. A pasta `paraglide/` é gerada dentro do seu repositório e regenerada a cada alteração.
|
|
423
|
+
|
|
424
|
+
</Tab>
|
|
425
|
+
<Tab label="Intlayer" value="intlayer">
|
|
426
|
+
|
|
427
|
+
```ts fileName="src/components/cartSummary.content.ts"
|
|
428
|
+
import { plural, t, type Dictionary } from "intlayer";
|
|
429
|
+
|
|
430
|
+
const cartSummaryContent = {
|
|
431
|
+
key: "cart-summary",
|
|
432
|
+
content: {
|
|
433
|
+
title: t({
|
|
434
|
+
pt: "Seu carrinho",
|
|
435
|
+
en: "Your cart",
|
|
436
|
+
fr: "Votre panier",
|
|
437
|
+
es: "Tu carrito",
|
|
438
|
+
}),
|
|
439
|
+
items: t({
|
|
440
|
+
pt: plural({ one: "{{count}} item", other: "{{count}} itens" }),
|
|
441
|
+
en: plural({ one: "{{count}} item", other: "{{count}} items" }),
|
|
442
|
+
fr: plural({ one: "{{count}} article", other: "{{count}} articles" }),
|
|
443
|
+
es: plural({ one: "{{count}} artículo", other: "{{count}} artículos" }),
|
|
444
|
+
}),
|
|
445
|
+
},
|
|
446
|
+
} satisfies Dictionary;
|
|
447
|
+
|
|
448
|
+
export default cartSummaryContent;
|
|
449
|
+
```
|
|
450
|
+
|
|
451
|
+
```tsx fileName="src/components/CartSummary.tsx"
|
|
452
|
+
import type { FC } from "react";
|
|
453
|
+
import { useIntlayer } from "react-intlayer";
|
|
454
|
+
|
|
455
|
+
export const CartSummary: FC<{ count: number }> = ({ count }) => {
|
|
456
|
+
const { title, items } = useIntlayer("cart-summary");
|
|
457
|
+
|
|
458
|
+
return (
|
|
459
|
+
<section>
|
|
460
|
+
<h2>{title}</h2>
|
|
461
|
+
<p>{items(count)}</p>
|
|
462
|
+
</section>
|
|
463
|
+
);
|
|
464
|
+
};
|
|
465
|
+
```
|
|
466
|
+
|
|
467
|
+
Todos os locales em um único arquivo ao lado do componente. Os tipos são gerados no build, de modo que `title` tem autocompletion e um erro de digitação falha no `tsc` sem necessidade de declaration merging. Excluir a pasta exclui as strings.
|
|
468
|
+
|
|
469
|
+
</Tab>
|
|
470
|
+
</Tabs>
|
|
471
|
+
|
|
472
|
+
Já usa `react-i18next`, `react-intl` ou `Lingui`? Os adaptadores de compatibilidade ([react-i18next](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pt/compat/react-i18next.md), [react-intl](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pt/compat/react-intl.md), [Lingui](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pt/compat/lingui.md)) criam aliases para os imports no nível do bundler para que a API existente continue funcionando enquanto você migra componente por componente. O [guia de migração](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pt/migration_from_react-i18next_to_intlayer.md) cobre o restante.
|
|
473
|
+
|
|
474
|
+
## Antes de tomar sua decisão
|
|
475
|
+
|
|
476
|
+
Uma tabela de funcionalidades mostra o que uma biblioteca faz hoje. Estes pontos mostram como será a convivência com ela no dia a dia.
|
|
477
|
+
|
|
478
|
+
**Verifique a atividade do repositório.**
|
|
479
|
+
|
|
480
|
+
Commits, tempo de resposta a issues e se a última versão minor foi lançada este ano. Um bom design sem mantenedores é uma migração à espera de acontecer.
|
|
481
|
+
|
|
482
|
+
**Não escolha pelo número de downloads no npm.**
|
|
483
|
+
|
|
484
|
+
A biblioteca mais instalada é a que foi lançada primeiro, não a que melhor se adapta a uma codebase React em 2026. Downloads medem história, não adequação.
|
|
485
|
+
|
|
486
|
+

|
|
487
|
+
|
|
488
|
+
**Pergunte quem financia o mantenedor e o que eles vendem.**
|
|
489
|
+
|
|
490
|
+
O `i18next` é apoiado pela Locize. O `next-intl` / `use-intl`, `vue-i18n`, `svelte-i18n` e Lingui são apoiados pelo Crowdin. Tolgee, Paraglide (inlang) e Intlayer mantêm suas próprias plataformas. Um fornecedor cuja receita depende de traduções hospedadas tem pouco incentivo para tornar a tradução gratuita dentro da sua cadeia de ferramentas. O Intlayer é o único do grupo que oferece tradução por IA via CLI com sua própria chave de API e um CMS que você pode auto-hospedar (self-host).
|
|
491
|
+
|
|
492
|
+
**Está pronto para agentes de IA?**
|
|
493
|
+
|
|
494
|
+
Os agentes ainda têm dificuldades com i18n: esquecem locales, inventam chaves e misturam sintaxes de mensagens. A biblioteca oferece [Agent Skills](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pt/agent_skills.md) ou um [servidor MCP](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pt/mcp_server.md) para que o agente possa listar, preencher e testar conteúdo? E o carregamento de conteúdo é otimizado por padrão, ou alguém precisa revisar namespaces e lazy imports a cada trimestre?
|
|
495
|
+
|
|
496
|
+
**Type safety pronto para uso.**
|
|
497
|
+
|
|
498
|
+
Não "pode ser tipado com configuração extra", mas "uma chave errada falha no `tsc` em uma instalação nova". Verifique o que acontece com uma chave inexistente e com um locale que está com uma tradução faltando.
|
|
499
|
+
|
|
500
|
+
**Detecção de conteúdo não utilizado.**
|
|
501
|
+
|
|
502
|
+
Os catálogos só aumentam. O build do Intlayer purga campos não utilizados e registra logs (`build.purge`). O Paraglide atinge isso por arquitetura, já que uma função de mensagem não chamada sofre tree-shaking. Todas as outras deixam essa limpeza para você.
|
|
503
|
+
|
|
504
|
+
**Experiência do desenvolvedor (DX).**
|
|
505
|
+
|
|
506
|
+
Tempo de configuração até a primeira string traduzida, um [LSP](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pt/lsp.md) ou [extensão para VS Code](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pt/vs_code_extension.md) que mostra a tradução ao passar o cursor e navega até a declaração, uma [CLI](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pt/cli/index.md) para preencher, testar e sincronizar (push), um [compilador](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pt/compiler.md) ou extrator que retira as strings fixas dos seus componentes para não gerir cada string chave a chave, e uma forma para não-desenvolvedores editarem conteúdo ([editor visual](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pt/intlayer_visual_editor.md) ou [CMS](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pt/intlayer_CMS.md)) sem a necessidade de um pull request.
|
|
507
|
+
|
|
508
|
+
## Perguntas Frequentes
|
|
509
|
+
|
|
510
|
+
<FAQ>
|
|
511
|
+
|
|
512
|
+
<Question title="O react-i18next ainda é um bom padrão em 2026?">
|
|
513
|
+
|
|
514
|
+
Sim para a maioria das equipes. Ele possui o maior ecossistema e o maior número de respostas na internet. Seus custos são reais, mas previsíveis: o runtime mais pesado, formato próprio de plural, além de type safety e escopo que você mesmo precisa configurar e manter.
|
|
515
|
+
|
|
516
|
+
</Question>
|
|
517
|
+
|
|
518
|
+
<Question title="Eu preciso de uma biblioteca baseada em compilador?">
|
|
519
|
+
|
|
520
|
+
Apenas se tamanho de bundle, tipos gerados ou verificações de chaves ausentes em tempo de build estiverem entre seus requisitos. Para uma aplicação pequena com dois locales, uma biblioteca de runtime é mais simples. O artigo sobre [compilador vs. i18n declarativo](https://github.com/aymericzip/intlayer/blob/main/docs/blog/pt/compiler_vs_declarative_i18n.md) explica o que os compiladores oferecem e onde podem falhar.
|
|
521
|
+
|
|
522
|
+
</Question>
|
|
523
|
+
|
|
524
|
+
<Question title="Posso trocar de biblioteca depois sem reescrever todos os componentes?">
|
|
525
|
+
|
|
526
|
+
Parcialmente. Bibliotecas baseadas em chaves compartilham formato suficiente para que um adaptador de compatibilidade possa mapear uma API para outra, que é como os adaptadores do Intlayer funcionam. Formatos de mensagem (ICU vs. i18next vs. helpers) não são convertidos automaticamente, então plurais e interpolações são a parte que você precisará ajustar.
|
|
527
|
+
|
|
528
|
+
</Question>
|
|
529
|
+
|
|
530
|
+
<Question title="A escolha da biblioteca afeta o SEO?">
|
|
531
|
+
|
|
532
|
+
Indiretamente. O que os crawlers veem é decidido pelo roteamento, `hreflang`, `<html lang>` e se o texto está no HTML renderizado pelo servidor. Algumas bibliotecas incluem utilitários para isso, a maioria deixa por sua conta. Veja o [guia de hreflang](https://github.com/aymericzip/intlayer/blob/main/docs/blog/pt/hreflang_guide_multilingual_seo.md).
|
|
533
|
+
|
|
534
|
+
</Question>
|
|
535
|
+
|
|
536
|
+
</FAQ>
|
|
537
|
+
|
|
538
|
+
## Indo além
|
|
539
|
+
|
|
540
|
+
- [Benchmark de bibliotecas de i18n: tamanho de bundle, vazamento e tempo de troca de locale](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pt/benchmark/index.md) e o [relatório para TanStack Start](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pt/benchmark/tanstack.md)
|
|
541
|
+
- [React i18n: como funciona o modelo de provider e quanto ele custa](https://github.com/aymericzip/intlayer/blob/main/docs/blog/pt/list_i18n_technologies/frameworks/react.md)
|
|
542
|
+
- [react-i18next vs react-intl vs Intlayer, recurso por recurso](https://github.com/aymericzip/intlayer/blob/main/docs/blog/pt/react-i18next_vs_react-intl_vs_intlayer.md)
|
|
543
|
+
- [next-i18next vs next-intl vs Intlayer](https://github.com/aymericzip/intlayer/blob/main/docs/blog/pt/next-i18next_vs_next-intl_vs_intlayer.md)
|
|
544
|
+
- [A história do JavaScript i18n](https://github.com/aymericzip/intlayer/blob/main/docs/blog/pt/history_of_i18n.md)
|
|
545
|
+
- [Compilador vs. i18n declarativo](https://github.com/aymericzip/intlayer/blob/main/docs/blog/pt/compiler_vs_declarative_i18n.md)
|
|
546
|
+
- [i18n por componente vs. centralizado](https://github.com/aymericzip/intlayer/blob/main/docs/blog/pt/per-component_vs_centralized_i18n.md)
|
|
547
|
+
- [Como funciona a otimização de bundle em tempo de build](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pt/bundle_optimization.md)
|
|
548
|
+
- [Configure i18n em uma aplicação Vite + React](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pt/intlayer_with_vite+react.md)
|
|
549
|
+
- O mesmo guia para [Vue](https://github.com/aymericzip/intlayer/blob/main/docs/blog/pt/how_to_pick_vue_i18n_library.md), [Svelte](https://github.com/aymericzip/intlayer/blob/main/docs/blog/pt/how_to_pick_svelte_i18n_library.md) e [Solid](https://github.com/aymericzip/intlayer/blob/main/docs/blog/pt/how_to_pick_solid_i18n_library.md)
|