@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,548 @@
|
|
|
1
|
+
---
|
|
2
|
+
createdAt: 2026-09-16
|
|
3
|
+
updatedAt: 2026-09-16
|
|
4
|
+
title: "كيفية اختيار مكتبة React i18n المناسبة في عام 2026"
|
|
5
|
+
description: دليل اتخاذ القرار لتدويل تطبيقات React. ما هي الأسئلة التي يجب الإجابة عليها قبل المقارنة بين react-i18next و react-intl و Lingui و use-intl و Paraglide و Intlayer، وتكلفة كل خيار من حيث حجم الحزمة (bundle size) والأمان البرمجي (typing) والصيانة.
|
|
6
|
+
keywords:
|
|
7
|
+
- react i18n
|
|
8
|
+
- react internationalization
|
|
9
|
+
- react-i18next
|
|
10
|
+
- react-intl
|
|
11
|
+
- Lingui
|
|
12
|
+
- use-intl
|
|
13
|
+
- Paraglide
|
|
14
|
+
- Intlayer
|
|
15
|
+
- مقارنة مكتبات i18n
|
|
16
|
+
slugs:
|
|
17
|
+
- blog
|
|
18
|
+
- how-to-pick-react-i18n-library
|
|
19
|
+
author: aymericzip
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
# كيفية اختيار مكتبة React i18n المناسبة
|
|
23
|
+
|
|
24
|
+
لا توفر React أي عنصر أولي (primitive) مدمج للتدويل (i18n). المكتبة التي تختارها من اليوم الأول تحدد كيفية تخزين الترجمات، وكيفية وصولها إلى الحزمة (bundle)، ومقدار العمل اليدوي الذي سيبقى على عاتقك للسنوات القليلة القادمة. تختار معظم الفرق بناءً على الشعبية فقط، ثم تكتشف التنازلات المعمارية عند الوصول إلى 2,000 مفتاح.
|
|
25
|
+
|
|
26
|
+
يسلك هذا الدليل الاتجاه المعاكس: أجب عن بعض الأسئلة حول مشروعك أولاً، ثم طابق الإجابات مع المكتبات المناسبة. يركز هذا الدليل على تطبيقات React البسيطة (Vite و React Router و TanStack Start). لدى Next.js قيودها الخاصة، والتي تم تناولها في [مقارنة Next.js](https://github.com/aymericzip/intlayer/blob/main/docs/blog/ar/next-i18next_vs_next-intl_vs_intlayer.md).
|
|
27
|
+
|
|
28
|
+

|
|
29
|
+
|
|
30
|
+
## جدول المحتويات
|
|
31
|
+
|
|
32
|
+
<TOC/>
|
|
33
|
+
|
|
34
|
+
## ستة أسئلة للإجابة عليها قبل مقارنة المكتبات
|
|
35
|
+
|
|
36
|
+
جدول المقارنة لا فائدة منه دون معرفة الصفوف التي تهمك فعلاً. راجع هذه الأسئلة أولاً.
|
|
37
|
+
|
|
38
|
+
1. **كيف يتم تصيير (render) التطبيق؟** هل هو SPA فقط، أم SSR مع التروية (hydration)، أم React Server Components؟ تعمل خطافات (hooks) السياق (Context-based) في كل مكان في تطبيقات SPA. أما مع RSC، يفرض الـ hook إضافة `"use client"` على كل مكون يعرض نصاً، وبالتالي ستحتاج إلى server-side API أيضاً.
|
|
39
|
+
2. **من يكتب الترجمات؟** المطورون، أم فريق داخلي يستخدم نظام إدارة الترجمة (TMS)، أم وكالة تسلم ملفات ICU، أم خط أنابيب ذكاء اصطناعي (AI pipeline)؟ يحدد هذا تنسيق الكتالوج أكثر من أي تفصيل في الـ API.
|
|
40
|
+
3. **كم عدد اللغات والصفحات؟** لغتان وخمس صفحات يمكنها تحمل تضمين كل شيء في الحزمة. أما عشر لغات وخمسون مساراً فلا يمكنها ذلك، وتصبح استراتيجية التحميل هي التكلفة الأساسية.
|
|
41
|
+
4. **هل تحتاج إلى أمان الأنواع على المفاتيح (types on keys)؟** الخطأ الإملائي في `t("checkout.totl")` يتم تجميعه بنجاح في جميع المكتبات المعتمدة على المفاتيح ما لم تقم بإعداد الأنواع بنفسك. قرر ما إذا كان ذلك مقبولاً لديك.
|
|
42
|
+
5. **ماذا يحتوي النص؟** نص عادي، أم صيغ جمع (plurals)، أم جمل تتوسطها روابط `<Link>`؟ المحتوى الغني (Rich content) هو النقطة التي تصبح فيها معظم واجهات برمجة التطبيقات معقدة.
|
|
43
|
+
6. **كم من الوقت سيستمر المشروع؟** نموذج أولي مدته ثلاثة أشهر لا يحتاج إلى نفس قدر أدوات البناء التي يحتاجها منتج مدته خمس سنوات.
|
|
44
|
+
|
|
45
|
+
اكتب الإجابات، فكل ما يلي يستند إليها.
|
|
46
|
+
|
|
47
|
+
## المشهد العام في صورة واحدة
|
|
48
|
+
|
|
49
|
+
خمسة عشر عاماً من JavaScript i18n تتلخص في أربع موجات معمارية، وتأتي مكتبات React التي ستقارن بينها من موجات مختلفة.
|
|
50
|
+
|
|
51
|
+

|
|
52
|
+
|
|
53
|
+
<AccordionGroup>
|
|
54
|
+
<Accordion header="قواميس وقت التشغيل (2011 إلى 2017): i18next و react-intl">
|
|
55
|
+
|
|
56
|
+
كتالوجات JSON يتم تحميلها في الذاكرة، ويتم البحث عن `t("a.b")` أثناء وقت التشغيل (runtime)، مع تحليل ICU أو صيغة مخصصة في المتصفح. أكبر الأنظمة البيئية، وأثقل أوقات التشغيل، والأنواع (types) اختيارية.
|
|
57
|
+
|
|
58
|
+
</Accordion>
|
|
59
|
+
<Accordion header="ماكرو وقت البناء (2018 إلى 2021): Lingui و typesafe-i18n">
|
|
60
|
+
|
|
61
|
+
يتم استخراج الرسائل أثناء البناء، وتجميعها في كتالوجات مضغوطة مع وسائط محددة الأنواع. خطوة بناء إضافية (`extract` و `compile`) مقابل حزم أصغر حجماً.
|
|
62
|
+
|
|
63
|
+
</Accordion>
|
|
64
|
+
<Accordion header="التركيز على الخادم أولاً (2022 إلى 2024): use-intl / next-intl">
|
|
65
|
+
|
|
66
|
+
مصممة حول SSR و Server Components. يتم التصيير على الخادم، وتروية (hydrate) ما يحتاجه العميل فقط. لا تزال معتمدة على المفاتيح ومركزية.
|
|
67
|
+
|
|
68
|
+
</Accordion>
|
|
69
|
+
<Accordion header="المترجم والمحتوى المشترك في الموقع (2024 إلى 2026): Paraglide و Intlayer و wuchale">
|
|
70
|
+
|
|
71
|
+
يتم تجميع المحتوى في دوال قابلة للـ tree-shaking أو قواميس مخصصة لكل مكون. يتم إنشاء الأنواع تلقائياً، والترجمات المفقودة تفشل البناء، وتعمل ترجمة الذكاء الاصطناعي مباشرة من الـ CLI.
|
|
72
|
+
|
|
73
|
+
</Accordion>
|
|
74
|
+
</AccordionGroup>
|
|
75
|
+
|
|
76
|
+
يوضح مقال [تاريخ JavaScript i18n](https://github.com/aymericzip/intlayer/blob/main/docs/blog/ar/history_of_i18n.md) بالتفصيل كيف عالجت كل موجة مشاكل الموجة السابقة.
|
|
77
|
+
|
|
78
|
+
## القرار الأكثر أهمية: أين يعيش المحتوى ومتى يتم تحميله
|
|
79
|
+
|
|
80
|
+
تمتلك كل مكتبة React i18n نفس الهيكل الأساسي: مخزن (store)، ومزود (provider)، وخطاف (hook). كل ما يستقبله الـ provider ينتهي به المطاف في حزمة العميل (client bundle) أو في حمولة التروية (hydration payload). لذا فإن الخيارين الهيكليين هما:
|
|
81
|
+
|
|
82
|
+
- **محتوى مركزي أو محدد النطاق (scoped).** ملف `en.json` واحد للتطبيق بأكمله، أو تصريح واحد لكل مكون (أو لكل namespace).
|
|
83
|
+
- **استيراد ثابت (static) أو ديناميكي (dynamic).** تجميع كل شيء عند بدء التشغيل، أو جلب اللغة والمسار النشطين عند الطلب.
|
|
84
|
+
|
|
85
|
+
يوضح الرسم البياني أدناه تقديراً للحمولة لتطبيق نظري يتكون من 1 إلى 10 صفحات، مترجم إلى 1 إلى 10 لغات، مع حوالي 30 كيلوبايت من النصوص لكل صفحة.
|
|
86
|
+
|
|
87
|
+

|
|
88
|
+
|
|
89
|
+
المحتوى المركزي ذو الاستيراد الثابت ينمو مع كلا المحورين: 10 صفحات مضروبة في 10 لغات تعني 300 كيلوبايت من النصوص في كل صفحة. الاستيرادات الديناميكية تلغي محور اللغات، وتحديد النطاق (scoping) يلغي محور الصفحات. الدمج بينهما فقط هو ما يبقي الحجم ثابتاً ومسطحاً.
|
|
90
|
+
|
|
91
|
+
هذه ليست ميزة مكتبة فحسب، بل هي مسألة انضباط برمجي. يمكن تقسيم `react-i18next` عبر namespaces و lazy backends. ويمكن تقسيم `use-intl` لكل مسار. ولكن لا يوجد ما يفرض ذلك تلقائياً، ومكون `<Button>` مشترك يستدعي `t("common:cta")` يجعل `common` بهدوء اعتمادية لجميع المسارات. يقيس [اختبار الأداء (benchmark)](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ar/benchmark/index.md) هذا تحت مسمى "التسريب من المسارات الأخرى" و"التسريب من اللغات الأخرى"، وهو مصدر معظم الفجوة بين المكتبات.
|
|
92
|
+
|
|
93
|
+
إذا كانت إجابتك على السؤال 3 هي "لغات متعددة وصفحات متعددة"، فركز على هذا القسم أكثر من أي تفضيل لواجهة الـ API. يتعمق مقال [الـ i18n لكل مكون مقابل المركزي](https://github.com/aymericzip/intlayer/blob/main/docs/blog/ar/per-component_vs_centralized_i18n.md) في جانب الصيانة لهذا الخيار.
|
|
94
|
+
|
|
95
|
+
## الخيارات المرشحة
|
|
96
|
+
|
|
97
|
+
أحجام المكتبات مأخوذة من [اختبار أداء TanStack Start](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ar/benchmark/tanstack.md): الـ provider بالإضافة إلى الـ hook في مكون فارغ، بعد التجميع والـ tree-shaking والـ minification، لـ 10 صفحات و10 لغات. يتم قياس المحتوى بشكل منفصل.
|
|
98
|
+
|
|
99
|
+
| المكتبة | الموجة | نموذج المحتوى | أمان الأنواع | تنسيق الرسائل | حجم المكتبة |
|
|
100
|
+
| :---------------------- | :----------- | :------------------------------------ | :---------------------------------- | :---------------------------- | :------------------------------------------------- |
|
|
101
|
+
| `react-i18next` | وقت التشغيل | JSON مركزي، namespaces | 2/5 — اختياري (`CustomTypeOptions`) | i18next (لواحق الجمع) | ~18.4 kB |
|
|
102
|
+
| `react-intl` (FormatJS) | وقت التشغيل | JSON مركزي، ICU | 2/5 — اختياري (استخراج + union) | ICU | ~15.3 kB |
|
|
103
|
+
| `use-intl` | الخادم أولاً | JSON مركزي، ICU | 2/5 — اختياري (دمج التصريحات) | ICU | ~14.1 kB |
|
|
104
|
+
| `@tolgee/react` | وقت التشغيل | مركزي، تحرير مباشر في السياق | 1/5 — لا | ICU | ~11.1 kB |
|
|
105
|
+
| Lingui | ماكرو | النص المصدري في الكود، كتالوجات مجمعة | 2/5 — جيد، من المترجم | ICU عبر الماكرو | ~11.8 kB |
|
|
106
|
+
| Paraglide | مترجم | مشروع inlang، دوال مولدة | 3.5/5 — مُولد | خاص | يقارب الصفر (بسبب الكود المولَّد داخل قاعدة الكود) |
|
|
107
|
+
| Intlayer | مترجم | `.content.ts` لكل مكون | 5/5 — مُولد، مفعّل افتراضياً | Intlayer (+ ICU, i18next, PO) | ~5.0 kB |
|
|
108
|
+
|
|
109
|
+
> الأرقام تمثل لقطة لإصدارات benchmark وتتغير مع التحديثات. قم بتشغيل اختبار الأداء على تطبيقك الخاص قبل اتخاذ القرار بناءً على الحجم وحده.
|
|
110
|
+
> أمان الأنواع: 5/5 يعني أن المفاتيح والمعاملات وكل لغة يتم التحقق منها دون إعداد يدوي، بما في ذلك منسق العناوين (URL formatter) والدوال المساعدة (helpers).
|
|
111
|
+
|
|
112
|
+
أمران لا يظهرهما الجدول: لا تشحن `Paraglide` أي مكتبة تقريباً لأنها تولد الكود داخل مستودعك، مما يعني خطوة إعادة توليد قبل كل commit وتعارضات دمج (merge conflicts) محتملة في الملفات المولدة. كما تتطلب `Intlayer` إضافة أداة تجميع (`vite-intlayer` أو ما يعادلها)، لذا لا يمكن تشغيلها في بيئة بدون أدوات بناء (no-build setup).
|
|
113
|
+
|
|
114
|
+
## مطابقة إجاباتك مع المكتبة المناسبة
|
|
115
|
+
|
|
116
|
+
<AccordionGroup>
|
|
117
|
+
<Accordion header="نموذج أولي، فريق صغير، لغات قليلة">
|
|
118
|
+
|
|
119
|
+
اختر أبسط حل يعمل وتجنب الاستثمار الزائد. يُعد `react-i18next` مع ملف JSON واحد لكل لغة كافياً، وستوفر لك إجابات عقد كامل على Stack Overflow الكثير من الوقت. تجنب الـ namespaces حتى تحتاجها فعلاً. إذا تحول النموذج الأولي إلى منتج، خصص وقتاً للانتقال إلى المحتوى المحدد النطاق (scoped)؛ يتيح لك [محول التوافق لـ react-i18next](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ar/compat/react-i18next.md) القيام بذلك تدريجياً.
|
|
120
|
+
|
|
121
|
+
</Accordion>
|
|
122
|
+
<Accordion header="الترجمات تأتي من وكالة أو TMS يدعم ICU">
|
|
123
|
+
|
|
124
|
+
تنسيق الكتالوج محدد مسبقاً لك. تدعم `react-intl` تنسيق ICU بشكل أصلي وأدوات استخراج FormatJS مبنية لهذا المسار. تقرأ `use-intl` صيغة ICU أيضاً. تحتاج `react-i18next` إلى إضافة ICU ومفاتيح الجمع الخاصة بها بخلاف ذلك. دعم Intlayer لـ ICU لا يزال جزئياً، لذا إذا كنت تتلقى نصوص ICU اليوم، فاعتبر ذلك عائقاً حتى اكتمال الدعم.
|
|
125
|
+
|
|
126
|
+
</Accordion>
|
|
127
|
+
<Accordion header="تطبيق كبير، مسارات متعددة، وميزانية الحزمة مهمة">
|
|
128
|
+
|
|
129
|
+
فضل المحتوى محدد النطاق والتحميل الديناميكي افتراضياً، وليس بمجرد اتفاق عرفي. تحقق `Lingui` و `Paraglide` ذلك عبر التجميع. وتحقق Intlayer ذلك عبر التصريحات المخصصة لكل مكون، حيث يشحن المترجم فقط ما يعرضه المسار. مع `react-i18next` أو `use-intl`، خطط لاستراتيجية الـ namespace والتحميل الكسول (lazy loading) من اليوم الأول وافرضها في مراجعة الكود، لأن الأدوات لن تفرضها تلقائياً.
|
|
130
|
+
|
|
131
|
+
</Accordion>
|
|
132
|
+
<Accordion header="أمان الأنواع (Type safety) غير قابل للتفاوض">
|
|
133
|
+
|
|
134
|
+
يمكن إضافة الأنواع إلى كل مكتبة معتمدة على المفاتيح، ولكن لا توفر أي منها ذلك تقريباً بشكل افتراضي. إذا كنت لا ترغب في صيانة دمج التصريحات (declaration merging) التي يجب أن تتوافق مع الـ namespaces المحملة بشكل كسول، فاختر مكتبة يتم فيها إنشاء الأنواع من المحتوى مباشرة: `Lingui` أو `Paraglide` أو Intlayer. يقارن مقال [اكتشاف الترجمات المفقودة](https://github.com/aymericzip/intlayer/blob/main/docs/blog/ar/detecting_missing_translations.md) ما تلتقطه كل أداة أثناء وقت البناء.
|
|
135
|
+
|
|
136
|
+
</Accordion>
|
|
137
|
+
<Accordion header="الكثير من المحتوى الغني: markdown، روابط داخل الجمل، مكونات خاصة بكل لغة">
|
|
138
|
+
|
|
139
|
+
العقد الغنية (Rich nodes) هي النقطة التي تفشل عندها دالة `t()` التي ترجع نصاً عادياً. تمتلك `react-i18next` و `Lingui` مكون `<Trans>`، وتمتلك `react-intl` وسوم النص الغني، وجميعها أكثر تعقيداً من حالة النص العادي. تقبل عقد المحتوى في Intlayer نصوص JSX و markdown والكائنات المتداخلة مباشرة، وهو الخيار الأنسب إذا كان المحتوى يتجاوز مجرد تسميات واجهة المستخدم.
|
|
140
|
+
|
|
141
|
+
</Accordion>
|
|
142
|
+
<Accordion header="سيتم إنشاء الترجمات بواسطة الذكاء الاصطناعي ومراجعتها بواسطة المطورين">
|
|
143
|
+
|
|
144
|
+
عندها لا يعد ملف JSON المركزي شرطاً لازماً، لعدم وجود نظام TMS للاستيراد إليه. المحتوى المشترك في نفس المكان (Colocated content) مع أداة CLI تملأ اللغات المفقودة هو المسار الأقصر. يعمل أمر `fill` في Intlayer باستخدام مفتاح API الخاص بك (OpenAI و Anthropic و Mistral و Gemini) ويترجم فقط ما تم تغييره. تقدم Paraglide و Tolgee حلولاً مستضافة مماثلة مع خطط أسعار خاصة بهما.
|
|
145
|
+
|
|
146
|
+
</Accordion>
|
|
147
|
+
<Accordion header="قد تنتقل إلى Next.js App Router لاحقاً">
|
|
148
|
+
|
|
149
|
+
لا يعبر سياق React حدود الخادم/العميل. ستحتاج المكتبات المبنية على خطاف عميل فقط (`react-i18next` و `react-intl`) إلى واجهة برمجة تطبيقات موازية للخادم فور اعتمادك لـ RSC. تمتلك `use-intl` (باسم `next-intl`) و Intlayer (باسم `next-intlayer`) هذا التقسيم بالفعل. اقرأ [مقال Next.js i18n](https://github.com/aymericzip/intlayer/blob/main/docs/blog/ar/list_i18n_technologies/frameworks/nextjs.md) قبل اعتماد نمط موحد.
|
|
150
|
+
|
|
151
|
+
</Accordion>
|
|
152
|
+
</AccordionGroup>
|
|
153
|
+
|
|
154
|
+
## نقاط القصور في كل مكتبة
|
|
155
|
+
|
|
156
|
+
حدود صريحة، لأن كل خيار ينطوي على عيوب.
|
|
157
|
+
|
|
158
|
+
- **`react-i18next`**: الأثقل بين المجموعة، تنسيق جمع خاص بها، الأنواع تتطلب إعداداً يدوياً وصيانة مستمرة، وتتراكم المفاتيح غير المستخدمة دون تنبيه.
|
|
159
|
+
- **`react-intl`**: تجربة مطور مطولة (`useIntl()` ثم `formatMessage({ id })`)، ومثيل عام مرتبط بعدة عقد.
|
|
160
|
+
- **`use-intl`**: سهلة في البداية، وصعبة في التحسين. الـ namespaces والتحميل الديناميكي والأنواع معاً تبطئ عملية التطوير كثيراً.
|
|
161
|
+
- **`Lingui`**: خطوة بناء إضافية لـ `extract` و `compile`، وعدة صيغ متداخلة (`t()`، القوالب ذات العلامات، `i18n.t()`، `<Trans>`) تربك كلاً من المطورين ومساعدي الذكاء الاصطناعي.
|
|
162
|
+
- **`Paraglide`**: ملفات مولدة داخل المستودع، لم يدخل الـ tree-shaking حيز التنفيذ الكامل في اختبار React، ويتم قراءة اللغة من التخزين في كل عقدة بدلاً من قراءتها من المخزن المركزي.
|
|
163
|
+
- **`Tolgee`**: لا توجد أنواع للمفاتيح، إعداد أصعب، والتحرير المباشر داخل السياق هو نقطة البيع الأساسية.
|
|
164
|
+
- **`Intlayer`**: إضافة بناء إلزامية، نظام بيئي أصغر، دعم جزئي لـ ICU، وتوزيع المحتوى عبر قاعدة الكود يعني أن تصدير ملف JSON واحد للمترجم يتطلب أدوات إضافية.
|
|
165
|
+
- **`gt-react`, `lingo.dev`**: غير موصى بهما في اختبار الأداء: أخطاء حصص الاستخدام (quota) أثناء البناء، والارتباط بمزود معين (vendor lock-in)، ومشاكل تفاعلية تطلبت إجبار الـ provider على إعادة التصيير.
|
|
166
|
+
|
|
167
|
+
## كيف يبدو كل خيار في الكود
|
|
168
|
+
|
|
169
|
+
نفس المكون، وهو ملخص عربة تسوق مع عنوان وصيغة جمع، مكتوباً بكل خيار مرشح. الجزء المثير للاهتمام ليس المكون نفسه، بل أين يعيش المحتوى وما يعرفه مدقق الأنواع عنه.
|
|
170
|
+
|
|
171
|
+
<Tabs defaultTab="react-i18next">
|
|
172
|
+
<Tab label="react-i18next" value="react-i18next">
|
|
173
|
+
|
|
174
|
+
<Tabs group="locale">
|
|
175
|
+
<Tab value="en" label="الإنجليزية">
|
|
176
|
+
|
|
177
|
+
```json fileName="public/locales/en/cart.json"
|
|
178
|
+
{
|
|
179
|
+
"title": "Your cart",
|
|
180
|
+
"items_one": "{{count}} item",
|
|
181
|
+
"items_other": "{{count}} items"
|
|
182
|
+
}
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
</Tab>
|
|
186
|
+
<Tab value="fr" label="الفرنسية">
|
|
187
|
+
|
|
188
|
+
```json fileName="public/locales/fr/cart.json"
|
|
189
|
+
{
|
|
190
|
+
"title": "Votre panier",
|
|
191
|
+
"items_one": "{{count}} article",
|
|
192
|
+
"items_other": "{{count}} articles"
|
|
193
|
+
}
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
</Tab>
|
|
197
|
+
<Tab value="es" label="الإسبانية">
|
|
198
|
+
|
|
199
|
+
```json fileName="public/locales/es/cart.json"
|
|
200
|
+
{
|
|
201
|
+
"title": "Tu carrito",
|
|
202
|
+
"items_one": "{{count}} artículo",
|
|
203
|
+
"items_other": "{{count}} artículos"
|
|
204
|
+
}
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
</Tab>
|
|
208
|
+
</Tabs>
|
|
209
|
+
|
|
210
|
+
```tsx fileName="src/components/CartSummary.tsx"
|
|
211
|
+
import type { FC } from "react";
|
|
212
|
+
import { useTranslation } from "react-i18next";
|
|
213
|
+
|
|
214
|
+
export const CartSummary: FC<{ count: number }> = ({ count }) => {
|
|
215
|
+
const { t } = useTranslation("cart");
|
|
216
|
+
|
|
217
|
+
return (
|
|
218
|
+
<section>
|
|
219
|
+
<h2>{t("title")}</h2>
|
|
220
|
+
<p>{t("items", { count })}</p>
|
|
221
|
+
</section>
|
|
222
|
+
);
|
|
223
|
+
};
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
صيغ الجمع هي مفاتيح لواحق يتم حلها من خلال `Intl.PluralRules`. الدالة `t` هي `(key: string) => string` ما لم تعلن عن `CustomTypeOptions`، لذا يتم تجميع `t("titel")` بنجاح دون أخطاء برمجية.
|
|
227
|
+
|
|
228
|
+
</Tab>
|
|
229
|
+
<Tab label="react-intl" value="react-intl">
|
|
230
|
+
|
|
231
|
+
<Tabs group="locale">
|
|
232
|
+
<Tab value="en" label="الإنجليزية">
|
|
233
|
+
|
|
234
|
+
```json fileName="src/locales/en.json"
|
|
235
|
+
{
|
|
236
|
+
"cart.title": "Your cart",
|
|
237
|
+
"cart.items": "{count, plural, one {# item} other {# items}}"
|
|
238
|
+
}
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
</Tab>
|
|
242
|
+
<Tab value="fr" label="الفرنسية">
|
|
243
|
+
|
|
244
|
+
```json fileName="src/locales/fr.json"
|
|
245
|
+
{
|
|
246
|
+
"cart.title": "Votre panier",
|
|
247
|
+
"cart.items": "{count, plural, one {# article} other {# articles}}"
|
|
248
|
+
}
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
</Tab>
|
|
252
|
+
<Tab value="es" label="الإسبانية">
|
|
253
|
+
|
|
254
|
+
```json fileName="src/locales/es.json"
|
|
255
|
+
{
|
|
256
|
+
"cart.title": "Tu carrito",
|
|
257
|
+
"cart.items": "{count, plural, one {# artículo} other {# artículos}}"
|
|
258
|
+
}
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
</Tab>
|
|
262
|
+
</Tabs>
|
|
263
|
+
|
|
264
|
+
```tsx fileName="src/components/CartSummary.tsx"
|
|
265
|
+
import type { FC } from "react";
|
|
266
|
+
import { FormattedMessage, useIntl } from "react-intl";
|
|
267
|
+
|
|
268
|
+
export const CartSummary: FC<{ count: number }> = ({ count }) => {
|
|
269
|
+
const intl = useIntl();
|
|
270
|
+
|
|
271
|
+
return (
|
|
272
|
+
<section>
|
|
273
|
+
<h2>
|
|
274
|
+
<FormattedMessage id="cart.title" />
|
|
275
|
+
</h2>
|
|
276
|
+
<p>{intl.formatMessage({ id: "cart.items" }, { count })}</p>
|
|
277
|
+
</section>
|
|
278
|
+
);
|
|
279
|
+
};
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
تنسيق ICU من البداية إلى النهاية، وهو ما تصدره معظم منصات TMS. تأتي الأنواع على `id` من خطوة استخراج `formatjs` بالإضافة إلى union مولد، وليس بشكل جاهز ومباشر.
|
|
283
|
+
|
|
284
|
+
</Tab>
|
|
285
|
+
<Tab label="use-intl" value="use-intl">
|
|
286
|
+
|
|
287
|
+
<Tabs group="locale">
|
|
288
|
+
<Tab value="en" label="الإنجليزية">
|
|
289
|
+
|
|
290
|
+
```json fileName="messages/en.json"
|
|
291
|
+
{
|
|
292
|
+
"Cart": {
|
|
293
|
+
"title": "Your cart",
|
|
294
|
+
"items": "{count, plural, one {# item} other {# items}}"
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
</Tab>
|
|
300
|
+
<Tab value="fr" label="الفرنسية">
|
|
301
|
+
|
|
302
|
+
```json fileName="messages/fr.json"
|
|
303
|
+
{
|
|
304
|
+
"Cart": {
|
|
305
|
+
"title": "Votre panier",
|
|
306
|
+
"items": "{count, plural, one {# article} other {# articles}}"
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
</Tab>
|
|
312
|
+
<Tab value="es" label="الإسبانية">
|
|
313
|
+
|
|
314
|
+
```json fileName="messages/es.json"
|
|
315
|
+
{
|
|
316
|
+
"Cart": {
|
|
317
|
+
"title": "Tu carrito",
|
|
318
|
+
"items": "{count, plural, one {# artículo} other {# artículos}}"
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
</Tab>
|
|
324
|
+
</Tabs>
|
|
325
|
+
|
|
326
|
+
```tsx fileName="src/components/CartSummary.tsx"
|
|
327
|
+
import type { FC } from "react";
|
|
328
|
+
import { useTranslations } from "use-intl";
|
|
329
|
+
|
|
330
|
+
export const CartSummary: FC<{ count: number }> = ({ count }) => {
|
|
331
|
+
const t = useTranslations("Cart");
|
|
332
|
+
|
|
333
|
+
return (
|
|
334
|
+
<section>
|
|
335
|
+
<h2>{t("title")}</h2>
|
|
336
|
+
<p>{t("items", { count })}</p>
|
|
337
|
+
</section>
|
|
338
|
+
);
|
|
339
|
+
};
|
|
340
|
+
```
|
|
341
|
+
|
|
342
|
+
نفس هيكل `next-intl` بدون ارتباطات Next.js. المفاتيح تصبح محددة الأنواع بمجرد توسيع `AppConfig` بنوع الرسائل؛ ويبقى تقسيم الـ namespaces مسؤوليتك.
|
|
343
|
+
|
|
344
|
+
</Tab>
|
|
345
|
+
<Tab label="Lingui" value="lingui">
|
|
346
|
+
|
|
347
|
+
```po fileName="src/locales/fr/messages.po"
|
|
348
|
+
msgid "Your cart"
|
|
349
|
+
msgstr "Votre panier"
|
|
350
|
+
|
|
351
|
+
msgid "{count, plural, one {# item} other {# items}}"
|
|
352
|
+
msgstr "{count, plural, one {# article} other {# articles}}"
|
|
353
|
+
```
|
|
354
|
+
|
|
355
|
+
```tsx fileName="src/components/CartSummary.tsx"
|
|
356
|
+
import type { FC } from "react";
|
|
357
|
+
import { Plural, Trans } from "@lingui/react/macro";
|
|
358
|
+
|
|
359
|
+
export const CartSummary: FC<{ count: number }> = ({ count }) => (
|
|
360
|
+
<section>
|
|
361
|
+
<h2>
|
|
362
|
+
<Trans>Your cart</Trans>
|
|
363
|
+
</h2>
|
|
364
|
+
<p>
|
|
365
|
+
<Plural value={count} one="# item" other="# items" />
|
|
366
|
+
</p>
|
|
367
|
+
</section>
|
|
368
|
+
);
|
|
369
|
+
```
|
|
370
|
+
|
|
371
|
+
اللغة المصدر تعيش داخل المكون؛ واللغات الأخرى تعيش في ملفات `.po` تحت معرفات مجزأة بعد تشغيل `lingui extract`. يؤدي نسيان `extract` أو `compile` إلى الرجوع بهدوء إلى اللغة الإنجليزية دون تنبيه.
|
|
372
|
+
|
|
373
|
+
</Tab>
|
|
374
|
+
<Tab label="Paraglide" value="paraglide">
|
|
375
|
+
|
|
376
|
+
<Tabs group="locale">
|
|
377
|
+
<Tab value="en" label="الإنجليزية">
|
|
378
|
+
|
|
379
|
+
```json fileName="messages/en.json"
|
|
380
|
+
{
|
|
381
|
+
"cart_title": "Your cart",
|
|
382
|
+
"cart_items": "{count} items"
|
|
383
|
+
}
|
|
384
|
+
```
|
|
385
|
+
|
|
386
|
+
</Tab>
|
|
387
|
+
<Tab value="fr" label="الفرنسية">
|
|
388
|
+
|
|
389
|
+
```json fileName="messages/fr.json"
|
|
390
|
+
{
|
|
391
|
+
"cart_title": "Votre panier",
|
|
392
|
+
"cart_items": "{count} articles"
|
|
393
|
+
}
|
|
394
|
+
```
|
|
395
|
+
|
|
396
|
+
</Tab>
|
|
397
|
+
<Tab value="es" label="الإسبانية">
|
|
398
|
+
|
|
399
|
+
```json fileName="messages/es.json"
|
|
400
|
+
{
|
|
401
|
+
"cart_title": "Tu carrito",
|
|
402
|
+
"cart_items": "{count} artículos"
|
|
403
|
+
}
|
|
404
|
+
```
|
|
405
|
+
|
|
406
|
+
</Tab>
|
|
407
|
+
</Tabs>
|
|
408
|
+
|
|
409
|
+
```tsx fileName="src/components/CartSummary.tsx"
|
|
410
|
+
import type { FC } from "react";
|
|
411
|
+
import { m } from "../paraglide/messages.js";
|
|
412
|
+
|
|
413
|
+
export const CartSummary: FC<{ count: number }> = ({ count }) => (
|
|
414
|
+
<section>
|
|
415
|
+
<h2>{m.cart_title()}</h2>
|
|
416
|
+
<p>{m.cart_items({ count })}</p>
|
|
417
|
+
</section>
|
|
418
|
+
);
|
|
419
|
+
```
|
|
420
|
+
|
|
421
|
+
كل رسالة عبارة عن دالة مولدة ومحددة الأنواع، لذا فإن المفتاح المفقود هو خطأ في الاستيراد (import error). يتم إنشاء مجلد `paraglide/` داخل المستودع وإعادة توليده مع كل تغيير.
|
|
422
|
+
|
|
423
|
+
</Tab>
|
|
424
|
+
<Tab label="Intlayer" value="intlayer">
|
|
425
|
+
|
|
426
|
+
```ts fileName="src/components/cartSummary.content.ts"
|
|
427
|
+
import { plural, t, type Dictionary } from "intlayer";
|
|
428
|
+
|
|
429
|
+
const cartSummaryContent = {
|
|
430
|
+
key: "cart-summary",
|
|
431
|
+
content: {
|
|
432
|
+
title: t({
|
|
433
|
+
ar: "عربة التسوق الخاصة بك",
|
|
434
|
+
en: "Your cart",
|
|
435
|
+
fr: "Votre panier",
|
|
436
|
+
es: "Tu carrito",
|
|
437
|
+
}),
|
|
438
|
+
items: t({
|
|
439
|
+
ar: plural({ one: "{{count}} عنصر", other: "{{count}} عناصر" }),
|
|
440
|
+
en: plural({ one: "{{count}} item", other: "{{count}} items" }),
|
|
441
|
+
fr: plural({ one: "{{count}} article", other: "{{count}} articles" }),
|
|
442
|
+
es: plural({ one: "{{count}} artículo", other: "{{count}} artículos" }),
|
|
443
|
+
}),
|
|
444
|
+
},
|
|
445
|
+
} satisfies Dictionary;
|
|
446
|
+
|
|
447
|
+
export default cartSummaryContent;
|
|
448
|
+
```
|
|
449
|
+
|
|
450
|
+
```tsx fileName="src/components/CartSummary.tsx"
|
|
451
|
+
import type { FC } from "react";
|
|
452
|
+
import { useIntlayer } from "react-intlayer";
|
|
453
|
+
|
|
454
|
+
export const CartSummary: FC<{ count: number }> = ({ count }) => {
|
|
455
|
+
const { title, items } = useIntlayer("cart-summary");
|
|
456
|
+
|
|
457
|
+
return (
|
|
458
|
+
<section>
|
|
459
|
+
<h2>{title}</h2>
|
|
460
|
+
<p>{items(count)}</p>
|
|
461
|
+
</section>
|
|
462
|
+
);
|
|
463
|
+
};
|
|
464
|
+
```
|
|
465
|
+
|
|
466
|
+
جميع اللغات في ملف واحد بجانب المكون. يتم إنشاء الأنواع أثناء البناء، لذا يكتمل `title` تلقائياً ويفشل أي خطأ إملائي في `tsc` دون الحاجة لدمج التصريحات. حذف المجلد يحذف نصوصه تلقائياً.
|
|
467
|
+
|
|
468
|
+
</Tab>
|
|
469
|
+
</Tabs>
|
|
470
|
+
|
|
471
|
+
هل تستخدم بالفعل `react-i18next` أو `react-intl` أو `Lingui`؟ تتيح محولات التوافق ([react-i18next](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ar/compat/react-i18next.md)، و [react-intl](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ar/compat/react-intl.md)، و [Lingui](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ar/compat/lingui.md)) إنشاء أسماء مستعارة (aliases) للاستيرادات على مستوى أداة التجميع بحيث تستمر واجهة الـ API الحالية في العمل أثناء نقلك للمكونات واحداً تلو الآخر. يغطي [دليل الهجرة](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ar/migration_from_react-i18next_to_intlayer.md) باقي التفاصيل.
|
|
472
|
+
|
|
473
|
+
## قبل أن تعتمد اختيارك النهائي
|
|
474
|
+
|
|
475
|
+
يخبرك جدول الميزات بما تفعله المكتبة اليوم. وتوضح لك هذه النقاط كيف ستكون تجربة العمل بها على المدى الطويل.
|
|
476
|
+
|
|
477
|
+
**تحقق من نشاط المستودع.**
|
|
478
|
+
|
|
479
|
+
الالتزامات (commits)، وسرعة الرد على المشكلات (issues)، وما إذا كان آخر إصدار فرعي قد صدر هذا العام. التصميم السليم بدون مسؤول صيانة يعني أنك ستواجه هجرة إجبارية مستقبلاً.
|
|
480
|
+
|
|
481
|
+
**لا تختر بناءً على عدد تنزيلات npm فقط.**
|
|
482
|
+
|
|
483
|
+
المكتبة الأكثر تثبيتاً هي أول مكتبة ظهرت، وليست بالضرورة المكتبة التي تناسب كود React في عام 2026. تقيس التنزيلات التاريخ وليس الملاءمة الحالية.
|
|
484
|
+
|
|
485
|
+

|
|
486
|
+
|
|
487
|
+
**اسأل من يدعم مسؤول الصيانة، وماذا يبيعون.**
|
|
488
|
+
|
|
489
|
+
تحظى `i18next` بدعم من Locize. وتدعم Crowdin كلاً من `next-intl` / `use-intl` و `vue-i18n` و `svelte-i18n` و Lingui. تدير كل من Tolgee و Paraglide (inlang) و Intlayer منصتها الخاصة. المزود الذي يعتمد دخله على الترجمة المستضافة لديه القليل من الدوافع لجعل الترجمة مجانية داخل سلسلة أدواتك. تعد Intlayer الوحيدة في المجموعة التي توفر ترجمة بالذكاء الاصطناعي عبر الـ CLI باستخدام مفتاح API الخاص بك، مع نظام إدارة محتوى (CMS) يمكنك استضافته ذاتياً.
|
|
490
|
+
|
|
491
|
+
**هل المكتبة جاهزة لوكلاء الذكاء الاصطناعي (AI agents)؟**
|
|
492
|
+
|
|
493
|
+
لا يزال الوكلاء يواجهون صعوبات مع التدويل: ينسون اللغات، ويخترعون مفاتيح من عندهم، ويخلطون بين صيغ الرسائل. هل توفر المكتبة [Agent Skills](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ar/agent_skills.md) أو [خادم MCP](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ar/mcp_server.md) حتى يتمكن الوكيل من سرد المحتوى وملئه واختباره؟ وهل يتم تحسين تحميل المحتوى افتراضياً، أم يتعين على شخص ما مراجعة الـ namespaces والاستيرادات الكسولة كل ربع سنة؟
|
|
494
|
+
|
|
495
|
+
**أمان الأنواع فور التثبيت.**
|
|
496
|
+
|
|
497
|
+
ليس "يمكن توفير الأنواع مع إعداد إضافي"، بل "المفتاح الخاطئ يفشل `tsc` في تثبيت جديد". تحقق مما يحدث مع مفتاح غير موجود، ومع لغة تفتقد ترجمة واحدة.
|
|
498
|
+
|
|
499
|
+
**اكتشاف المحتوى غير المستخدم.**
|
|
500
|
+
|
|
501
|
+
الكتالوجات تنمو باستمرار ولا تصغر من تلقاء نفسها. تقوم عملية بناء Intlayer بحذف الحقول غير المستخدمة وتسجيلها (`build.purge`). وتحقق Paraglide ذلك معمارياً، حيث يتم التخلص من دالة الرسالة غير المستدعاة عبر tree-shaking. أما باقي المكتبات فتترك مهمة تنظيف الكتالوجات عليك.
|
|
502
|
+
|
|
503
|
+
**تجربة المطور (DX).**
|
|
504
|
+
|
|
505
|
+
الوقت المستغرق من الإعداد حتى أول نص مترجم، ووجود [LSP](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ar/lsp.md) أو [إضافة VS Code](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ar/vs_code_extension.md) تعرض الترجمة عند التمرير وتنتقل إلى التصريح مباشرة، و [CLI](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ar/cli/index.md) للملء والاختبار والرفع، و[مُصرِّف](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ar/compiler.md) أو أداة استخراج تستخرج النصوص المكتوبة مباشرة في المكونات حتى لا تضطر إلى إدارة كل نص مفتاحًا بمفتاح، وطريقة لغير المطورين لتحرير المحتوى ([المحرر المرئي](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ar/intlayer_visual_editor.md) أو [نظام إدارة المحتوى (CMS)](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ar/intlayer_CMS.md)) بدون طلب سحب (pull request).
|
|
506
|
+
|
|
507
|
+
## الأسئلة الشائعة
|
|
508
|
+
|
|
509
|
+
<FAQ>
|
|
510
|
+
|
|
511
|
+
<Question title="هل لا تزال react-i18next خياراً افتراضياً جيداً في عام 2026؟">
|
|
512
|
+
|
|
513
|
+
نعم لمعظم الفرق. تمتلك أكبر نظام بيئي وأكبر عدد من الإجابات على الإنترنت. تكاليفها حقيقية ولكن يمكن التنبؤ بها: أثقل وقت تشغيل، وتنسيق جمع مخصص، وأمان الأنواع وتحديد النطاق الذي يجب عليك إعداده وحمايته بنفسك.
|
|
514
|
+
|
|
515
|
+
</Question>
|
|
516
|
+
|
|
517
|
+
<Question title="هل أحتاج إلى مكتبة معتمدة على المترجم؟">
|
|
518
|
+
|
|
519
|
+
فقط إذا كان حجم الحزمة، أو الأنواع المولدة، أو فحوصات المفاتيح المفقودة في وقت البناء من بين متطلباتك. بالنسبة لتطبيق صغير بلغتَين، فإن مكتبة وقت التشغيل أبسط. يشرح مقال [الـ i18n المعتمد على المترجم مقابل التصريحي](https://github.com/aymericzip/intlayer/blob/main/docs/blog/ar/compiler_vs_declarative_i18n.md) ما تمنحه لك المترجمات وما قد تخطئ فيه.
|
|
520
|
+
|
|
521
|
+
</Question>
|
|
522
|
+
|
|
523
|
+
<Question title="هل يمكنني تبديل المكتبة لاحقاً دون إعادة كتابة كل مكون؟">
|
|
524
|
+
|
|
525
|
+
جزئياً. تشترك المكتبات المعتمدة على المفاتيح في شكل كافٍ يتيح لمحول التوافق تعيين واجهة برمجة تطبيقات إلى أخرى، وهو ما تفعله محولات Intlayer. لا يتم تحويل تنسيقات الرسائل (ICU مقابل i18next مقابل الدوال المساعدة) تلقائياً، لذا فإن صيغ الجمع والاستيفاء (interpolation) هي الأجزاء التي ستقوم بتعديلها.
|
|
526
|
+
|
|
527
|
+
</Question>
|
|
528
|
+
|
|
529
|
+
<Question title="هل يؤثر اختيار المكتبة على تحسين محركات البحث (SEO)؟">
|
|
530
|
+
|
|
531
|
+
بشكل غير مباشر. ما تراه روبوتات الفهرسة يتحدد من خلال التوجيه (routing)، و `hreflang`، و `<html lang>`، وما إذا كان النص موجوداً في كود HTML المُصيّر على الخادم. توفر بعض المكتبات دوال مساعدة لذلك، بينما تترك معظمها الأمر لك. راجع [دليل hreflang](https://github.com/aymericzip/intlayer/blob/main/docs/blog/ar/hreflang_guide_multilingual_seo.md).
|
|
532
|
+
|
|
533
|
+
</Question>
|
|
534
|
+
|
|
535
|
+
</FAQ>
|
|
536
|
+
|
|
537
|
+
## للمزيد من التفاصيل
|
|
538
|
+
|
|
539
|
+
- [اختبار أداء مكتبات i18n: حجم الحزمة والتسريب وتوقيت تبديل اللغة](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ar/benchmark/index.md) و [تقرير TanStack Start](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ar/benchmark/tanstack.md)
|
|
540
|
+
- [React i18n: كيف يعمل نموذج المزود (provider) وتكلفته](https://github.com/aymericzip/intlayer/blob/main/docs/blog/ar/list_i18n_technologies/frameworks/react.md)
|
|
541
|
+
- [react-i18next مقابل react-intl مقابل Intlayer، ميزة بميزة](https://github.com/aymericzip/intlayer/blob/main/docs/blog/ar/react-i18next_vs_react-intl_vs_intlayer.md)
|
|
542
|
+
- [next-i18next مقابل next-intl مقابل Intlayer](https://github.com/aymericzip/intlayer/blob/main/docs/blog/ar/next-i18next_vs_next-intl_vs_intlayer.md)
|
|
543
|
+
- [تاريخ JavaScript i18n](https://github.com/aymericzip/intlayer/blob/main/docs/blog/ar/history_of_i18n.md)
|
|
544
|
+
- [الـ i18n المعتمد على المترجم مقابل التصريحي](https://github.com/aymericzip/intlayer/blob/main/docs/blog/ar/compiler_vs_declarative_i18n.md)
|
|
545
|
+
- [الـ i18n لكل مكون مقابل المركزي](https://github.com/aymericzip/intlayer/blob/main/docs/blog/ar/per-component_vs_centralized_i18n.md)
|
|
546
|
+
- [كيف يعمل تحسين الحزمة في وقت البناء](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ar/bundle_optimization.md)
|
|
547
|
+
- [إعداد i18n في تطبيق Vite + React](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ar/intlayer_with_vite+react.md)
|
|
548
|
+
- نفس الدليل لكل من [Vue](https://github.com/aymericzip/intlayer/blob/main/docs/blog/ar/how_to_pick_vue_i18n_library.md)، و [Svelte](https://github.com/aymericzip/intlayer/blob/main/docs/blog/ar/how_to_pick_svelte_i18n_library.md)، و [Solid](https://github.com/aymericzip/intlayer/blob/main/docs/blog/ar/how_to_pick_solid_i18n_library.md)
|