@intlayer/docs 9.5.3 → 9.5.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -8
- package/blog/ar/history_of_i18n.md +54 -54
- package/blog/ar/how_to_pick_react_i18n_library.md +548 -0
- package/blog/ar/how_to_pick_solid_i18n_library.md +438 -0
- package/blog/ar/how_to_pick_svelte_i18n_library.md +454 -0
- package/blog/ar/how_to_pick_vue_i18n_library.md +442 -0
- package/blog/ar/is_i18next_outdated.md +5 -1
- package/blog/ar/is_next-intl_outdated.md +5 -1
- package/blog/ar/is_vue-i18n_outdated.md +7 -1
- package/blog/ar/next-i18next_vs_next-intl_vs_intlayer.md +8 -4
- package/blog/ar/per-component_vs_centralized_i18n.md +9 -4
- package/blog/ar/react-i18next_vs_react-intl_vs_intlayer.md +5 -1
- package/blog/de/history_of_i18n.md +54 -54
- package/blog/de/how_to_pick_react_i18n_library.md +548 -0
- package/blog/de/how_to_pick_solid_i18n_library.md +451 -0
- package/blog/de/how_to_pick_svelte_i18n_library.md +454 -0
- package/blog/de/how_to_pick_vue_i18n_library.md +448 -0
- package/blog/de/is_i18next_outdated.md +5 -1
- package/blog/de/is_next-intl_outdated.md +5 -1
- package/blog/de/is_vue-i18n_outdated.md +7 -1
- package/blog/de/next-i18next_vs_next-intl_vs_intlayer.md +9 -5
- package/blog/de/per-component_vs_centralized_i18n.md +9 -4
- package/blog/de/react-i18next_vs_react-intl_vs_intlayer.md +5 -1
- package/blog/en/history_of_i18n.md +54 -54
- package/blog/en/how_to_pick_react_i18n_library.md +542 -0
- package/blog/en/how_to_pick_solid_i18n_library.md +438 -0
- package/blog/en/how_to_pick_svelte_i18n_library.md +448 -0
- package/blog/en/how_to_pick_vue_i18n_library.md +442 -0
- package/blog/en/is_i18next_outdated.md +5 -1
- package/blog/en/is_next-intl_outdated.md +5 -1
- package/blog/en/is_vue-i18n_outdated.md +7 -1
- package/blog/en/list_i18n_technologies/frameworks/react-router.md +2 -3
- package/blog/en/next-i18next_vs_next-intl_vs_intlayer.md +9 -5
- package/blog/en/per-component_vs_centralized_i18n.md +9 -4
- package/blog/en/react-i18next_vs_react-intl_vs_intlayer.md +5 -1
- package/blog/en-GB/history_of_i18n.md +54 -54
- package/blog/en-GB/how_to_pick_react_i18n_library.md +542 -0
- package/blog/en-GB/how_to_pick_solid_i18n_library.md +438 -0
- package/blog/en-GB/how_to_pick_svelte_i18n_library.md +448 -0
- package/blog/en-GB/how_to_pick_vue_i18n_library.md +448 -0
- package/blog/en-GB/is_i18next_outdated.md +5 -1
- package/blog/en-GB/is_next-intl_outdated.md +5 -1
- package/blog/en-GB/is_vue-i18n_outdated.md +7 -1
- package/blog/en-GB/next-i18next_vs_next-intl_vs_intlayer.md +9 -5
- package/blog/en-GB/per-component_vs_centralized_i18n.md +9 -4
- package/blog/en-GB/react-i18next_vs_react-intl_vs_intlayer.md +5 -1
- package/blog/es/history_of_i18n.md +54 -54
- package/blog/es/how_to_pick_react_i18n_library.md +542 -0
- package/blog/es/how_to_pick_solid_i18n_library.md +446 -0
- package/blog/es/how_to_pick_svelte_i18n_library.md +448 -0
- package/blog/es/how_to_pick_vue_i18n_library.md +442 -0
- package/blog/es/is_i18next_outdated.md +5 -1
- package/blog/es/is_next-intl_outdated.md +5 -1
- package/blog/es/is_vue-i18n_outdated.md +7 -1
- package/blog/es/next-i18next_vs_next-intl_vs_intlayer.md +9 -5
- package/blog/es/per-component_vs_centralized_i18n.md +9 -4
- package/blog/es/react-i18next_vs_react-intl_vs_intlayer.md +5 -1
- package/blog/fr/history_of_i18n.md +54 -54
- package/blog/fr/how_to_pick_react_i18n_library.md +542 -0
- package/blog/fr/how_to_pick_solid_i18n_library.md +438 -0
- package/blog/fr/how_to_pick_svelte_i18n_library.md +448 -0
- package/blog/fr/how_to_pick_vue_i18n_library.md +442 -0
- package/blog/fr/is_i18next_outdated.md +5 -1
- package/blog/fr/is_next-intl_outdated.md +5 -1
- package/blog/fr/is_vue-i18n_outdated.md +7 -1
- package/blog/fr/next-i18next_vs_next-intl_vs_intlayer.md +9 -5
- package/blog/fr/per-component_vs_centralized_i18n.md +9 -4
- package/blog/fr/react-i18next_vs_react-intl_vs_intlayer.md +5 -1
- package/blog/hi/history_of_i18n.md +54 -54
- package/blog/hi/how_to_pick_react_i18n_library.md +548 -0
- package/blog/hi/how_to_pick_solid_i18n_library.md +451 -0
- package/blog/hi/how_to_pick_svelte_i18n_library.md +448 -0
- package/blog/hi/how_to_pick_vue_i18n_library.md +442 -0
- package/blog/hi/is_i18next_outdated.md +5 -1
- package/blog/hi/is_next-intl_outdated.md +5 -1
- package/blog/hi/is_vue-i18n_outdated.md +7 -1
- package/blog/hi/next-i18next_vs_next-intl_vs_intlayer.md +8 -4
- package/blog/hi/per-component_vs_centralized_i18n.md +9 -4
- package/blog/hi/react-i18next_vs_react-intl_vs_intlayer.md +5 -1
- package/blog/id/history_of_i18n.md +54 -54
- package/blog/id/how_to_pick_react_i18n_library.md +548 -0
- package/blog/id/how_to_pick_solid_i18n_library.md +451 -0
- package/blog/id/how_to_pick_svelte_i18n_library.md +454 -0
- package/blog/id/how_to_pick_vue_i18n_library.md +442 -0
- package/blog/id/is_i18next_outdated.md +5 -1
- package/blog/id/is_next-intl_outdated.md +5 -1
- package/blog/id/is_vue-i18n_outdated.md +7 -1
- package/blog/id/next-i18next_vs_next-intl_vs_intlayer.md +9 -5
- package/blog/id/per-component_vs_centralized_i18n.md +9 -4
- package/blog/id/react-i18next_vs_react-intl_vs_intlayer.md +5 -1
- package/blog/it/history_of_i18n.md +54 -54
- package/blog/it/how_to_pick_react_i18n_library.md +549 -0
- package/blog/it/how_to_pick_solid_i18n_library.md +451 -0
- package/blog/it/how_to_pick_svelte_i18n_library.md +455 -0
- package/blog/it/how_to_pick_vue_i18n_library.md +449 -0
- package/blog/it/is_i18next_outdated.md +5 -1
- package/blog/it/is_next-intl_outdated.md +5 -1
- package/blog/it/is_vue-i18n_outdated.md +7 -1
- package/blog/it/next-i18next_vs_next-intl_vs_intlayer.md +9 -5
- package/blog/it/per-component_vs_centralized_i18n.md +9 -4
- package/blog/it/react-i18next_vs_react-intl_vs_intlayer.md +5 -1
- package/blog/ja/history_of_i18n.md +54 -54
- package/blog/ja/how_to_pick_react_i18n_library.md +542 -0
- package/blog/ja/how_to_pick_solid_i18n_library.md +451 -0
- package/blog/ja/how_to_pick_svelte_i18n_library.md +457 -0
- package/blog/ja/how_to_pick_vue_i18n_library.md +442 -0
- package/blog/ja/is_i18next_outdated.md +5 -1
- package/blog/ja/is_next-intl_outdated.md +5 -1
- package/blog/ja/is_vue-i18n_outdated.md +7 -1
- package/blog/ja/next-i18next_vs_next-intl_vs_intlayer.md +9 -5
- package/blog/ja/per-component_vs_centralized_i18n.md +9 -4
- package/blog/ja/react-i18next_vs_react-intl_vs_intlayer.md +5 -1
- package/blog/ko/history_of_i18n.md +54 -54
- package/blog/ko/how_to_pick_react_i18n_library.md +548 -0
- package/blog/ko/how_to_pick_solid_i18n_library.md +451 -0
- package/blog/ko/how_to_pick_svelte_i18n_library.md +454 -0
- package/blog/ko/how_to_pick_vue_i18n_library.md +448 -0
- package/blog/ko/is_i18next_outdated.md +5 -1
- package/blog/ko/is_next-intl_outdated.md +5 -1
- package/blog/ko/is_vue-i18n_outdated.md +7 -1
- package/blog/ko/next-i18next_vs_next-intl_vs_intlayer.md +9 -5
- package/blog/ko/per-component_vs_centralized_i18n.md +9 -4
- package/blog/ko/react-i18next_vs_react-intl_vs_intlayer.md +5 -1
- package/blog/pl/history_of_i18n.md +54 -54
- package/blog/pl/how_to_pick_react_i18n_library.md +549 -0
- package/blog/pl/how_to_pick_solid_i18n_library.md +438 -0
- package/blog/pl/how_to_pick_svelte_i18n_library.md +460 -0
- package/blog/pl/how_to_pick_vue_i18n_library.md +442 -0
- package/blog/pl/is_i18next_outdated.md +5 -1
- package/blog/pl/is_next-intl_outdated.md +5 -1
- package/blog/pl/is_vue-i18n_outdated.md +7 -1
- package/blog/pl/next-i18next_vs_next-intl_vs_intlayer.md +9 -5
- package/blog/pl/per-component_vs_centralized_i18n.md +9 -4
- package/blog/pl/react-i18next_vs_react-intl_vs_intlayer.md +5 -1
- package/blog/pt/history_of_i18n.md +54 -54
- package/blog/pt/how_to_pick_react_i18n_library.md +549 -0
- package/blog/pt/how_to_pick_solid_i18n_library.md +451 -0
- package/blog/pt/how_to_pick_svelte_i18n_library.md +454 -0
- package/blog/pt/how_to_pick_vue_i18n_library.md +448 -0
- package/blog/pt/is_i18next_outdated.md +5 -1
- package/blog/pt/is_next-intl_outdated.md +5 -1
- package/blog/pt/is_vue-i18n_outdated.md +7 -1
- package/blog/pt/next-i18next_vs_next-intl_vs_intlayer.md +9 -5
- package/blog/pt/per-component_vs_centralized_i18n.md +9 -4
- package/blog/pt/react-i18next_vs_react-intl_vs_intlayer.md +5 -1
- package/blog/ru/history_of_i18n.md +54 -54
- package/blog/ru/how_to_pick_react_i18n_library.md +553 -0
- package/blog/ru/how_to_pick_solid_i18n_library.md +451 -0
- package/blog/ru/how_to_pick_svelte_i18n_library.md +459 -0
- package/blog/ru/how_to_pick_vue_i18n_library.md +453 -0
- package/blog/ru/is_i18next_outdated.md +5 -1
- package/blog/ru/is_next-intl_outdated.md +5 -1
- package/blog/ru/is_vue-i18n_outdated.md +7 -1
- package/blog/ru/next-i18next_vs_next-intl_vs_intlayer.md +8 -4
- package/blog/ru/per-component_vs_centralized_i18n.md +9 -4
- package/blog/ru/react-i18next_vs_react-intl_vs_intlayer.md +5 -1
- package/blog/tr/history_of_i18n.md +54 -54
- package/blog/tr/how_to_pick_react_i18n_library.md +548 -0
- package/blog/tr/how_to_pick_solid_i18n_library.md +451 -0
- package/blog/tr/how_to_pick_svelte_i18n_library.md +454 -0
- package/blog/tr/how_to_pick_vue_i18n_library.md +448 -0
- package/blog/tr/is_i18next_outdated.md +5 -1
- package/blog/tr/is_next-intl_outdated.md +5 -1
- package/blog/tr/is_vue-i18n_outdated.md +7 -1
- package/blog/tr/next-i18next_vs_next-intl_vs_intlayer.md +9 -5
- package/blog/tr/per-component_vs_centralized_i18n.md +9 -4
- package/blog/tr/react-i18next_vs_react-intl_vs_intlayer.md +5 -1
- package/blog/uk/history_of_i18n.md +54 -54
- package/blog/uk/how_to_pick_react_i18n_library.md +542 -0
- package/blog/uk/how_to_pick_solid_i18n_library.md +451 -0
- package/blog/uk/how_to_pick_svelte_i18n_library.md +448 -0
- package/blog/uk/how_to_pick_vue_i18n_library.md +443 -0
- package/blog/uk/is_i18next_outdated.md +5 -1
- package/blog/uk/is_next-intl_outdated.md +5 -1
- package/blog/uk/is_vue-i18n_outdated.md +7 -1
- package/blog/uk/next-i18next_vs_next-intl_vs_intlayer.md +9 -5
- package/blog/uk/per-component_vs_centralized_i18n.md +9 -4
- package/blog/uk/react-i18next_vs_react-intl_vs_intlayer.md +5 -1
- package/blog/vi/history_of_i18n.md +54 -54
- package/blog/vi/how_to_pick_react_i18n_library.md +548 -0
- package/blog/vi/how_to_pick_solid_i18n_library.md +438 -0
- package/blog/vi/how_to_pick_svelte_i18n_library.md +448 -0
- package/blog/vi/how_to_pick_vue_i18n_library.md +442 -0
- package/blog/vi/is_i18next_outdated.md +5 -1
- package/blog/vi/is_next-intl_outdated.md +5 -1
- package/blog/vi/is_vue-i18n_outdated.md +7 -1
- package/blog/vi/next-i18next_vs_next-intl_vs_intlayer.md +9 -5
- package/blog/vi/per-component_vs_centralized_i18n.md +9 -4
- package/blog/vi/react-i18next_vs_react-intl_vs_intlayer.md +5 -1
- package/blog/zh/history_of_i18n.md +54 -54
- package/blog/zh/how_to_pick_react_i18n_library.md +548 -0
- package/blog/zh/how_to_pick_solid_i18n_library.md +451 -0
- package/blog/zh/how_to_pick_svelte_i18n_library.md +454 -0
- package/blog/zh/how_to_pick_vue_i18n_library.md +448 -0
- package/blog/zh/is_i18next_outdated.md +5 -1
- package/blog/zh/is_next-intl_outdated.md +5 -1
- package/blog/zh/is_vue-i18n_outdated.md +7 -1
- package/blog/zh/next-i18next_vs_next-intl_vs_intlayer.md +9 -5
- package/blog/zh/per-component_vs_centralized_i18n.md +9 -4
- package/blog/zh/react-i18next_vs_react-intl_vs_intlayer.md +5 -1
- package/dist/cjs/generated/blog.entry.cjs +80 -0
- package/dist/cjs/generated/blog.entry.cjs.map +1 -1
- package/dist/cjs/index.cjs +1 -1
- package/dist/esm/generated/blog.entry.mjs +80 -0
- package/dist/esm/generated/blog.entry.mjs.map +1 -1
- package/dist/esm/index.mjs +1 -1
- package/dist/types/generated/blog.entry.d.ts +4 -0
- package/dist/types/generated/blog.entry.d.ts.map +1 -1
- package/docs/ar/bundle_optimization.md +5 -1
- package/docs/ar/how_works_intlayer.md +2 -2
- package/docs/ar/interest_of_intlayer.md +6 -6
- package/docs/ar/intlayer_CMS.md +1 -1
- package/docs/ar/intlayer_with_adonisjs.md +1 -1
- package/docs/ar/intlayer_with_analog.md +1 -1
- package/docs/ar/intlayer_with_angular_19.md +1 -1
- package/docs/ar/intlayer_with_angular_21.md +1 -1
- package/docs/ar/intlayer_with_astro.md +1 -1
- package/docs/ar/intlayer_with_astro_lit.md +1 -1
- package/docs/ar/intlayer_with_astro_preact.md +1 -1
- package/docs/ar/intlayer_with_astro_react.md +1 -1
- package/docs/ar/intlayer_with_astro_solid.md +1 -1
- package/docs/ar/intlayer_with_astro_svelte.md +1 -1
- package/docs/ar/intlayer_with_astro_vanilla.md +1 -1
- package/docs/ar/intlayer_with_astro_vue.md +1 -1
- package/docs/ar/intlayer_with_create_react_app.md +1 -1
- package/docs/ar/intlayer_with_express.md +1 -1
- package/docs/ar/intlayer_with_hono.md +1 -1
- package/docs/ar/intlayer_with_nestjs.md +1 -1
- package/docs/ar/intlayer_with_nextjs_14.md +1 -1
- package/docs/ar/intlayer_with_nextjs_15.md +1 -1
- package/docs/ar/intlayer_with_nextjs_16.md +1 -1
- package/docs/ar/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/ar/intlayer_with_react_router_v7.md +1 -1
- package/docs/ar/intlayer_with_vite+preact.md +1 -1
- package/docs/ar/intlayer_with_vite+react.md +1 -1
- package/docs/ar/intlayer_with_vite+vue.md +1 -1
- package/docs/ar/introduction.md +0 -1
- package/docs/ar/readme.md +8 -8
- package/docs/bn/bundle_optimization.md +5 -1
- package/docs/bn/interest_of_intlayer.md +21 -21
- package/docs/bn/intlayer_CMS.md +1 -1
- package/docs/bn/intlayer_with_angular_21.md +1 -1
- package/docs/bn/intlayer_with_hono.md +1 -1
- package/docs/bn/introduction.md +0 -1
- package/docs/cs/bundle_optimization.md +5 -1
- package/docs/cs/interest_of_intlayer.md +6 -6
- package/docs/cs/intlayer_with_angular_21.md +1 -1
- package/docs/cs/intlayer_with_hono.md +1 -1
- package/docs/cs/introduction.md +0 -1
- package/docs/de/bundle_optimization.md +5 -1
- package/docs/de/how_works_intlayer.md +2 -2
- package/docs/de/interest_of_intlayer.md +6 -6
- package/docs/de/intlayer_CMS.md +1 -1
- package/docs/de/intlayer_with_adonisjs.md +1 -1
- package/docs/de/intlayer_with_analog.md +1 -1
- package/docs/de/intlayer_with_angular_19.md +1 -1
- package/docs/de/intlayer_with_angular_21.md +1 -1
- package/docs/de/intlayer_with_astro.md +1 -1
- package/docs/de/intlayer_with_astro_lit.md +1 -1
- package/docs/de/intlayer_with_astro_preact.md +1 -1
- package/docs/de/intlayer_with_astro_react.md +1 -1
- package/docs/de/intlayer_with_astro_solid.md +1 -1
- package/docs/de/intlayer_with_astro_svelte.md +1 -1
- package/docs/de/intlayer_with_astro_vanilla.md +1 -1
- package/docs/de/intlayer_with_astro_vue.md +1 -1
- package/docs/de/intlayer_with_create_react_app.md +1 -1
- package/docs/de/intlayer_with_express.md +1 -1
- package/docs/de/intlayer_with_hono.md +1 -1
- package/docs/de/intlayer_with_nestjs.md +1 -1
- package/docs/de/intlayer_with_nextjs_14.md +1 -1
- package/docs/de/intlayer_with_nextjs_15.md +1 -1
- package/docs/de/intlayer_with_nextjs_16.md +1 -1
- package/docs/de/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/de/intlayer_with_vite+preact.md +1 -1
- package/docs/de/intlayer_with_vite+react.md +1 -1
- package/docs/de/intlayer_with_vite+vue.md +1 -1
- package/docs/de/introduction.md +0 -1
- package/docs/de/readme.md +8 -8
- package/docs/en/bundle_optimization.md +5 -1
- package/docs/en/how_works_intlayer.md +2 -2
- package/docs/en/interest_of_intlayer.md +6 -6
- package/docs/en/intlayer_CMS.md +1 -1
- package/docs/en/intlayer_with_adonisjs.md +1 -1
- package/docs/en/intlayer_with_analog.md +1 -1
- package/docs/en/intlayer_with_angular_19.md +1 -1
- package/docs/en/intlayer_with_angular_21.md +1 -1
- package/docs/en/intlayer_with_astro.md +1 -1
- package/docs/en/intlayer_with_astro_lit.md +1 -1
- package/docs/en/intlayer_with_astro_preact.md +1 -1
- package/docs/en/intlayer_with_astro_react.md +1 -1
- package/docs/en/intlayer_with_astro_solid.md +1 -1
- package/docs/en/intlayer_with_astro_svelte.md +1 -1
- package/docs/en/intlayer_with_astro_vanilla.md +1 -1
- package/docs/en/intlayer_with_astro_vue.md +1 -1
- package/docs/en/intlayer_with_create_react_app.md +1 -1
- package/docs/en/intlayer_with_express.md +1 -1
- package/docs/en/intlayer_with_hono.md +1 -1
- package/docs/en/intlayer_with_nestjs.md +1 -1
- package/docs/en/intlayer_with_nextjs_14.md +1 -1
- package/docs/en/intlayer_with_nextjs_15.md +1 -1
- package/docs/en/intlayer_with_nextjs_16.md +1 -1
- package/docs/en/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/en/intlayer_with_vite+preact.md +1 -1
- package/docs/en/intlayer_with_vite+react.md +1 -1
- package/docs/en/intlayer_with_vite+vue.md +1 -1
- package/docs/en/introduction.md +0 -1
- package/docs/en/readme.md +8 -8
- package/docs/en-GB/bundle_optimization.md +5 -1
- package/docs/en-GB/how_works_intlayer.md +2 -2
- package/docs/en-GB/interest_of_intlayer.md +6 -6
- package/docs/en-GB/intlayer_CMS.md +1 -1
- package/docs/en-GB/intlayer_with_adonisjs.md +1 -1
- package/docs/en-GB/intlayer_with_analog.md +1 -1
- package/docs/en-GB/intlayer_with_angular_19.md +1 -1
- package/docs/en-GB/intlayer_with_angular_21.md +1 -1
- package/docs/en-GB/intlayer_with_astro.md +1 -1
- package/docs/en-GB/intlayer_with_astro_lit.md +1 -1
- package/docs/en-GB/intlayer_with_astro_preact.md +1 -1
- package/docs/en-GB/intlayer_with_astro_react.md +1 -1
- package/docs/en-GB/intlayer_with_astro_solid.md +1 -1
- package/docs/en-GB/intlayer_with_astro_svelte.md +1 -1
- package/docs/en-GB/intlayer_with_astro_vanilla.md +1 -1
- package/docs/en-GB/intlayer_with_astro_vue.md +1 -1
- package/docs/en-GB/intlayer_with_create_react_app.md +1 -1
- package/docs/en-GB/intlayer_with_express.md +1 -1
- package/docs/en-GB/intlayer_with_hono.md +1 -1
- package/docs/en-GB/intlayer_with_nestjs.md +1 -1
- package/docs/en-GB/intlayer_with_nextjs_14.md +1 -1
- package/docs/en-GB/intlayer_with_nextjs_15.md +1 -1
- package/docs/en-GB/intlayer_with_nextjs_16.md +1 -1
- package/docs/en-GB/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/en-GB/intlayer_with_vite+preact.md +1 -1
- package/docs/en-GB/intlayer_with_vite+react.md +1 -1
- package/docs/en-GB/intlayer_with_vite+vue.md +1 -1
- package/docs/en-GB/introduction.md +0 -1
- package/docs/en-GB/readme.md +8 -8
- package/docs/es/bundle_optimization.md +5 -1
- package/docs/es/how_works_intlayer.md +2 -2
- package/docs/es/interest_of_intlayer.md +6 -6
- package/docs/es/intlayer_CMS.md +1 -1
- package/docs/es/intlayer_with_adonisjs.md +1 -1
- package/docs/es/intlayer_with_analog.md +1 -1
- package/docs/es/intlayer_with_angular_19.md +1 -1
- package/docs/es/intlayer_with_angular_21.md +1 -1
- package/docs/es/intlayer_with_astro.md +1 -1
- package/docs/es/intlayer_with_astro_lit.md +1 -1
- package/docs/es/intlayer_with_astro_preact.md +1 -1
- package/docs/es/intlayer_with_astro_react.md +1 -1
- package/docs/es/intlayer_with_astro_solid.md +1 -1
- package/docs/es/intlayer_with_astro_svelte.md +1 -1
- package/docs/es/intlayer_with_astro_vanilla.md +1 -1
- package/docs/es/intlayer_with_astro_vue.md +1 -1
- package/docs/es/intlayer_with_create_react_app.md +1 -1
- package/docs/es/intlayer_with_express.md +1 -1
- package/docs/es/intlayer_with_hono.md +1 -1
- package/docs/es/intlayer_with_nestjs.md +1 -1
- package/docs/es/intlayer_with_nextjs_14.md +1 -1
- package/docs/es/intlayer_with_nextjs_15.md +1 -1
- package/docs/es/intlayer_with_nextjs_16.md +1 -1
- package/docs/es/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/es/intlayer_with_vite+preact.md +1 -1
- package/docs/es/intlayer_with_vite+react.md +1 -1
- package/docs/es/intlayer_with_vite+vue.md +1 -1
- package/docs/es/introduction.md +0 -1
- package/docs/es/readme.md +8 -8
- package/docs/fr/bundle_optimization.md +5 -1
- package/docs/fr/how_works_intlayer.md +2 -2
- package/docs/fr/interest_of_intlayer.md +6 -6
- package/docs/fr/intlayer_CMS.md +1 -1
- package/docs/fr/intlayer_with_adonisjs.md +1 -1
- package/docs/fr/intlayer_with_analog.md +1 -1
- package/docs/fr/intlayer_with_angular_19.md +1 -1
- package/docs/fr/intlayer_with_angular_21.md +1 -1
- package/docs/fr/intlayer_with_astro.md +1 -1
- package/docs/fr/intlayer_with_astro_lit.md +1 -1
- package/docs/fr/intlayer_with_astro_preact.md +1 -1
- package/docs/fr/intlayer_with_astro_react.md +1 -1
- package/docs/fr/intlayer_with_astro_solid.md +1 -1
- package/docs/fr/intlayer_with_astro_svelte.md +1 -1
- package/docs/fr/intlayer_with_astro_vanilla.md +1 -1
- package/docs/fr/intlayer_with_astro_vue.md +1 -1
- package/docs/fr/intlayer_with_create_react_app.md +1 -1
- package/docs/fr/intlayer_with_express.md +1 -1
- package/docs/fr/intlayer_with_hono.md +1 -1
- package/docs/fr/intlayer_with_nestjs.md +1 -1
- package/docs/fr/intlayer_with_nextjs_14.md +1 -1
- package/docs/fr/intlayer_with_nextjs_15.md +1 -1
- package/docs/fr/intlayer_with_nextjs_16.md +1 -1
- package/docs/fr/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/fr/intlayer_with_react_router_v7.md +2 -2
- package/docs/fr/intlayer_with_vite+preact.md +1 -1
- package/docs/fr/intlayer_with_vite+react.md +1 -1
- package/docs/fr/intlayer_with_vite+vue.md +1 -1
- package/docs/fr/introduction.md +0 -1
- package/docs/fr/readme.md +8 -8
- package/docs/hi/bundle_optimization.md +5 -1
- package/docs/hi/how_works_intlayer.md +2 -2
- package/docs/hi/interest_of_intlayer.md +6 -6
- package/docs/hi/intlayer_CMS.md +1 -1
- package/docs/hi/intlayer_with_adonisjs.md +1 -1
- package/docs/hi/intlayer_with_analog.md +1 -1
- package/docs/hi/intlayer_with_angular_19.md +1 -1
- package/docs/hi/intlayer_with_angular_21.md +1 -1
- package/docs/hi/intlayer_with_astro.md +1 -1
- package/docs/hi/intlayer_with_astro_lit.md +1 -1
- package/docs/hi/intlayer_with_astro_preact.md +1 -1
- package/docs/hi/intlayer_with_astro_react.md +1 -1
- package/docs/hi/intlayer_with_astro_solid.md +1 -1
- package/docs/hi/intlayer_with_astro_svelte.md +1 -1
- package/docs/hi/intlayer_with_astro_vanilla.md +1 -1
- package/docs/hi/intlayer_with_astro_vue.md +1 -1
- package/docs/hi/intlayer_with_create_react_app.md +1 -1
- package/docs/hi/intlayer_with_express.md +1 -1
- package/docs/hi/intlayer_with_hono.md +1 -1
- package/docs/hi/intlayer_with_nestjs.md +1 -1
- package/docs/hi/intlayer_with_nextjs_14.md +1 -1
- package/docs/hi/intlayer_with_nextjs_15.md +1 -1
- package/docs/hi/intlayer_with_nextjs_16.md +1 -1
- package/docs/hi/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/hi/intlayer_with_react_router_v7.md +1 -1
- package/docs/hi/intlayer_with_vite+preact.md +1 -1
- package/docs/hi/intlayer_with_vite+react.md +1 -1
- package/docs/hi/intlayer_with_vite+vue.md +1 -1
- package/docs/hi/introduction.md +0 -1
- package/docs/hi/readme.md +8 -8
- package/docs/id/bundle_optimization.md +5 -1
- package/docs/id/how_works_intlayer.md +2 -2
- package/docs/id/interest_of_intlayer.md +6 -6
- package/docs/id/intlayer_CMS.md +1 -1
- package/docs/id/intlayer_with_adonisjs.md +1 -1
- package/docs/id/intlayer_with_analog.md +1 -1
- package/docs/id/intlayer_with_angular_19.md +1 -1
- package/docs/id/intlayer_with_angular_21.md +1 -1
- package/docs/id/intlayer_with_astro.md +1 -1
- package/docs/id/intlayer_with_astro_lit.md +1 -1
- package/docs/id/intlayer_with_astro_preact.md +1 -1
- package/docs/id/intlayer_with_astro_react.md +1 -1
- package/docs/id/intlayer_with_astro_solid.md +1 -1
- package/docs/id/intlayer_with_astro_svelte.md +1 -1
- package/docs/id/intlayer_with_astro_vanilla.md +1 -1
- package/docs/id/intlayer_with_astro_vue.md +1 -1
- package/docs/id/intlayer_with_create_react_app.md +1 -1
- package/docs/id/intlayer_with_express.md +1 -1
- package/docs/id/intlayer_with_hono.md +1 -1
- package/docs/id/intlayer_with_nestjs.md +1 -1
- package/docs/id/intlayer_with_nextjs_14.md +1 -1
- package/docs/id/intlayer_with_nextjs_15.md +1 -1
- package/docs/id/intlayer_with_nextjs_16.md +1 -1
- package/docs/id/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/id/intlayer_with_react_router_v7.md +1 -1
- package/docs/id/intlayer_with_vite+preact.md +1 -1
- package/docs/id/intlayer_with_vite+react.md +1 -1
- package/docs/id/intlayer_with_vite+vue.md +1 -1
- package/docs/id/introduction.md +0 -1
- package/docs/id/readme.md +8 -8
- package/docs/it/bundle_optimization.md +5 -1
- package/docs/it/how_works_intlayer.md +2 -2
- package/docs/it/interest_of_intlayer.md +6 -6
- package/docs/it/intlayer_CMS.md +1 -1
- package/docs/it/intlayer_with_adonisjs.md +1 -1
- package/docs/it/intlayer_with_analog.md +1 -1
- package/docs/it/intlayer_with_angular_19.md +1 -1
- package/docs/it/intlayer_with_angular_21.md +1 -1
- package/docs/it/intlayer_with_astro.md +1 -1
- package/docs/it/intlayer_with_astro_lit.md +1 -1
- package/docs/it/intlayer_with_astro_preact.md +1 -1
- package/docs/it/intlayer_with_astro_react.md +1 -1
- package/docs/it/intlayer_with_astro_solid.md +1 -1
- package/docs/it/intlayer_with_astro_svelte.md +1 -1
- package/docs/it/intlayer_with_astro_vanilla.md +1 -1
- package/docs/it/intlayer_with_astro_vue.md +1 -1
- package/docs/it/intlayer_with_create_react_app.md +1 -1
- package/docs/it/intlayer_with_express.md +1 -1
- package/docs/it/intlayer_with_hono.md +1 -1
- package/docs/it/intlayer_with_nestjs.md +1 -1
- package/docs/it/intlayer_with_nextjs_14.md +1 -1
- package/docs/it/intlayer_with_nextjs_15.md +1 -1
- package/docs/it/intlayer_with_nextjs_16.md +1 -1
- package/docs/it/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/it/intlayer_with_react_router_v7.md +2 -2
- package/docs/it/intlayer_with_vite+preact.md +1 -1
- package/docs/it/intlayer_with_vite+react.md +1 -1
- package/docs/it/intlayer_with_vite+vue.md +1 -1
- package/docs/it/introduction.md +0 -1
- package/docs/it/readme.md +8 -8
- package/docs/ja/bundle_optimization.md +5 -1
- package/docs/ja/how_works_intlayer.md +2 -2
- package/docs/ja/interest_of_intlayer.md +6 -6
- package/docs/ja/intlayer_CMS.md +1 -1
- package/docs/ja/intlayer_with_adonisjs.md +1 -1
- package/docs/ja/intlayer_with_analog.md +1 -1
- package/docs/ja/intlayer_with_angular_19.md +1 -1
- package/docs/ja/intlayer_with_angular_21.md +1 -1
- package/docs/ja/intlayer_with_astro.md +1 -1
- package/docs/ja/intlayer_with_astro_lit.md +1 -1
- package/docs/ja/intlayer_with_astro_preact.md +1 -1
- package/docs/ja/intlayer_with_astro_react.md +1 -1
- package/docs/ja/intlayer_with_astro_solid.md +1 -1
- package/docs/ja/intlayer_with_astro_svelte.md +1 -1
- package/docs/ja/intlayer_with_astro_vanilla.md +1 -1
- package/docs/ja/intlayer_with_astro_vue.md +1 -1
- package/docs/ja/intlayer_with_create_react_app.md +1 -1
- package/docs/ja/intlayer_with_express.md +1 -1
- package/docs/ja/intlayer_with_hono.md +1 -1
- package/docs/ja/intlayer_with_nestjs.md +1 -1
- package/docs/ja/intlayer_with_nextjs_14.md +1 -1
- package/docs/ja/intlayer_with_nextjs_15.md +1 -1
- package/docs/ja/intlayer_with_nextjs_16.md +1 -1
- package/docs/ja/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/ja/intlayer_with_vite+preact.md +1 -1
- package/docs/ja/intlayer_with_vite+react.md +1 -1
- package/docs/ja/intlayer_with_vite+vue.md +1 -1
- package/docs/ja/introduction.md +0 -1
- package/docs/ja/readme.md +8 -8
- package/docs/ko/bundle_optimization.md +5 -1
- package/docs/ko/how_works_intlayer.md +2 -2
- package/docs/ko/interest_of_intlayer.md +6 -6
- package/docs/ko/intlayer_CMS.md +1 -1
- package/docs/ko/intlayer_with_adonisjs.md +1 -1
- package/docs/ko/intlayer_with_analog.md +1 -1
- package/docs/ko/intlayer_with_angular_19.md +1 -1
- package/docs/ko/intlayer_with_angular_21.md +1 -1
- package/docs/ko/intlayer_with_astro.md +1 -1
- package/docs/ko/intlayer_with_astro_lit.md +1 -1
- package/docs/ko/intlayer_with_astro_preact.md +1 -1
- package/docs/ko/intlayer_with_astro_react.md +1 -1
- package/docs/ko/intlayer_with_astro_solid.md +1 -1
- package/docs/ko/intlayer_with_astro_svelte.md +1 -1
- package/docs/ko/intlayer_with_astro_vanilla.md +1 -1
- package/docs/ko/intlayer_with_astro_vue.md +1 -1
- package/docs/ko/intlayer_with_create_react_app.md +1 -1
- package/docs/ko/intlayer_with_express.md +1 -1
- package/docs/ko/intlayer_with_hono.md +1 -1
- package/docs/ko/intlayer_with_nestjs.md +1 -1
- package/docs/ko/intlayer_with_nextjs_14.md +1 -1
- package/docs/ko/intlayer_with_nextjs_15.md +1 -1
- package/docs/ko/intlayer_with_nextjs_16.md +1 -1
- package/docs/ko/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/ko/intlayer_with_react_router_v7.md +2 -2
- package/docs/ko/intlayer_with_vite+preact.md +1 -1
- package/docs/ko/intlayer_with_vite+react.md +1 -1
- package/docs/ko/intlayer_with_vite+vue.md +1 -1
- package/docs/ko/introduction.md +0 -1
- package/docs/ko/readme.md +8 -8
- package/docs/nl/bundle_optimization.md +5 -1
- package/docs/nl/interest_of_intlayer.md +6 -6
- package/docs/nl/intlayer_with_angular_21.md +1 -1
- package/docs/nl/intlayer_with_hono.md +1 -1
- package/docs/nl/introduction.md +0 -1
- package/docs/pl/bundle_optimization.md +5 -1
- package/docs/pl/how_works_intlayer.md +2 -2
- package/docs/pl/interest_of_intlayer.md +6 -6
- package/docs/pl/intlayer_CMS.md +1 -1
- package/docs/pl/intlayer_with_adonisjs.md +1 -1
- package/docs/pl/intlayer_with_analog.md +1 -1
- package/docs/pl/intlayer_with_angular_19.md +1 -1
- package/docs/pl/intlayer_with_angular_21.md +1 -1
- package/docs/pl/intlayer_with_astro.md +1 -1
- package/docs/pl/intlayer_with_astro_lit.md +1 -1
- package/docs/pl/intlayer_with_astro_preact.md +1 -1
- package/docs/pl/intlayer_with_astro_react.md +1 -1
- package/docs/pl/intlayer_with_astro_solid.md +1 -1
- package/docs/pl/intlayer_with_astro_svelte.md +1 -1
- package/docs/pl/intlayer_with_astro_vanilla.md +1 -1
- package/docs/pl/intlayer_with_astro_vue.md +1 -1
- package/docs/pl/intlayer_with_create_react_app.md +1 -1
- package/docs/pl/intlayer_with_express.md +1 -1
- package/docs/pl/intlayer_with_hono.md +1 -1
- package/docs/pl/intlayer_with_nestjs.md +1 -1
- package/docs/pl/intlayer_with_nextjs_14.md +1 -1
- package/docs/pl/intlayer_with_nextjs_15.md +1 -1
- package/docs/pl/intlayer_with_nextjs_16.md +1 -1
- package/docs/pl/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/pl/intlayer_with_react_router_v7.md +2 -2
- package/docs/pl/intlayer_with_vite+preact.md +1 -1
- package/docs/pl/intlayer_with_vite+react.md +1 -1
- package/docs/pl/intlayer_with_vite+vue.md +1 -1
- package/docs/pl/introduction.md +0 -1
- package/docs/pl/readme.md +8 -8
- package/docs/pt/bundle_optimization.md +5 -1
- package/docs/pt/how_works_intlayer.md +2 -2
- package/docs/pt/interest_of_intlayer.md +6 -6
- package/docs/pt/intlayer_CMS.md +1 -1
- package/docs/pt/intlayer_with_adonisjs.md +1 -1
- package/docs/pt/intlayer_with_analog.md +1 -1
- package/docs/pt/intlayer_with_angular_19.md +1 -1
- package/docs/pt/intlayer_with_angular_21.md +1 -1
- package/docs/pt/intlayer_with_astro.md +1 -1
- package/docs/pt/intlayer_with_astro_lit.md +1 -1
- package/docs/pt/intlayer_with_astro_preact.md +1 -1
- package/docs/pt/intlayer_with_astro_react.md +1 -1
- package/docs/pt/intlayer_with_astro_solid.md +1 -1
- package/docs/pt/intlayer_with_astro_svelte.md +1 -1
- package/docs/pt/intlayer_with_astro_vanilla.md +1 -1
- package/docs/pt/intlayer_with_astro_vue.md +1 -1
- package/docs/pt/intlayer_with_create_react_app.md +1 -1
- package/docs/pt/intlayer_with_express.md +1 -1
- package/docs/pt/intlayer_with_hono.md +1 -1
- package/docs/pt/intlayer_with_nestjs.md +1 -1
- package/docs/pt/intlayer_with_nextjs_14.md +1 -1
- package/docs/pt/intlayer_with_nextjs_15.md +1 -1
- package/docs/pt/intlayer_with_nextjs_16.md +1 -1
- package/docs/pt/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/pt/intlayer_with_react_router_v7.md +2 -2
- package/docs/pt/intlayer_with_vite+preact.md +1 -1
- package/docs/pt/intlayer_with_vite+react.md +1 -1
- package/docs/pt/intlayer_with_vite+vue.md +1 -1
- package/docs/pt/introduction.md +0 -1
- package/docs/pt/readme.md +8 -8
- package/docs/ru/bundle_optimization.md +5 -1
- package/docs/ru/how_works_intlayer.md +2 -2
- package/docs/ru/interest_of_intlayer.md +6 -6
- package/docs/ru/intlayer_CMS.md +1 -1
- package/docs/ru/intlayer_with_adonisjs.md +1 -1
- package/docs/ru/intlayer_with_analog.md +1 -1
- package/docs/ru/intlayer_with_angular_19.md +1 -1
- package/docs/ru/intlayer_with_angular_21.md +1 -1
- package/docs/ru/intlayer_with_astro.md +1 -1
- package/docs/ru/intlayer_with_astro_lit.md +1 -1
- package/docs/ru/intlayer_with_astro_preact.md +1 -1
- package/docs/ru/intlayer_with_astro_react.md +1 -1
- package/docs/ru/intlayer_with_astro_solid.md +1 -1
- package/docs/ru/intlayer_with_astro_svelte.md +1 -1
- package/docs/ru/intlayer_with_astro_vanilla.md +1 -1
- package/docs/ru/intlayer_with_astro_vue.md +1 -1
- package/docs/ru/intlayer_with_create_react_app.md +1 -1
- package/docs/ru/intlayer_with_express.md +1 -1
- package/docs/ru/intlayer_with_hono.md +1 -1
- package/docs/ru/intlayer_with_nestjs.md +1 -1
- package/docs/ru/intlayer_with_nextjs_14.md +1 -1
- package/docs/ru/intlayer_with_nextjs_15.md +1 -1
- package/docs/ru/intlayer_with_nextjs_16.md +1 -1
- package/docs/ru/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/ru/intlayer_with_react_router_v7.md +2 -2
- package/docs/ru/intlayer_with_vite+preact.md +1 -1
- package/docs/ru/intlayer_with_vite+react.md +1 -1
- package/docs/ru/intlayer_with_vite+vue.md +1 -1
- package/docs/ru/introduction.md +0 -1
- package/docs/ru/readme.md +8 -8
- package/docs/tr/bundle_optimization.md +5 -1
- package/docs/tr/how_works_intlayer.md +2 -2
- package/docs/tr/interest_of_intlayer.md +6 -6
- package/docs/tr/intlayer_CMS.md +1 -1
- package/docs/tr/intlayer_with_adonisjs.md +1 -1
- package/docs/tr/intlayer_with_analog.md +1 -1
- package/docs/tr/intlayer_with_angular_19.md +1 -1
- package/docs/tr/intlayer_with_angular_21.md +1 -1
- package/docs/tr/intlayer_with_astro.md +1 -1
- package/docs/tr/intlayer_with_astro_lit.md +1 -1
- package/docs/tr/intlayer_with_astro_preact.md +1 -1
- package/docs/tr/intlayer_with_astro_react.md +1 -1
- package/docs/tr/intlayer_with_astro_solid.md +1 -1
- package/docs/tr/intlayer_with_astro_svelte.md +1 -1
- package/docs/tr/intlayer_with_astro_vanilla.md +1 -1
- package/docs/tr/intlayer_with_astro_vue.md +1 -1
- package/docs/tr/intlayer_with_create_react_app.md +1 -1
- package/docs/tr/intlayer_with_express.md +1 -1
- package/docs/tr/intlayer_with_hono.md +1 -1
- package/docs/tr/intlayer_with_nestjs.md +1 -1
- package/docs/tr/intlayer_with_nextjs_14.md +1 -1
- package/docs/tr/intlayer_with_nextjs_15.md +1 -1
- package/docs/tr/intlayer_with_nextjs_16.md +1 -1
- package/docs/tr/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/tr/intlayer_with_react_router_v7.md +1 -1
- package/docs/tr/intlayer_with_vite+preact.md +1 -1
- package/docs/tr/intlayer_with_vite+react.md +1 -1
- package/docs/tr/intlayer_with_vite+vue.md +1 -1
- package/docs/tr/introduction.md +0 -1
- package/docs/tr/readme.md +8 -8
- package/docs/uk/bundle_optimization.md +5 -1
- package/docs/uk/how_works_intlayer.md +2 -2
- package/docs/uk/interest_of_intlayer.md +6 -6
- package/docs/uk/intlayer_CMS.md +1 -1
- package/docs/uk/intlayer_with_adonisjs.md +1 -1
- package/docs/uk/intlayer_with_analog.md +1 -1
- package/docs/uk/intlayer_with_angular_19.md +1 -1
- package/docs/uk/intlayer_with_angular_21.md +1 -1
- package/docs/uk/intlayer_with_astro.md +1 -1
- package/docs/uk/intlayer_with_astro_lit.md +1 -1
- package/docs/uk/intlayer_with_astro_preact.md +1 -1
- package/docs/uk/intlayer_with_astro_react.md +1 -1
- package/docs/uk/intlayer_with_astro_solid.md +1 -1
- package/docs/uk/intlayer_with_astro_svelte.md +1 -1
- package/docs/uk/intlayer_with_astro_vanilla.md +1 -1
- package/docs/uk/intlayer_with_astro_vue.md +1 -1
- package/docs/uk/intlayer_with_create_react_app.md +1 -1
- package/docs/uk/intlayer_with_express.md +1 -1
- package/docs/uk/intlayer_with_hono.md +1 -1
- package/docs/uk/intlayer_with_nestjs.md +1 -1
- package/docs/uk/intlayer_with_nextjs_14.md +1 -1
- package/docs/uk/intlayer_with_nextjs_15.md +1 -1
- package/docs/uk/intlayer_with_nextjs_16.md +1 -1
- package/docs/uk/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/uk/intlayer_with_react_router_v7.md +1 -1
- package/docs/uk/intlayer_with_vite+preact.md +1 -1
- package/docs/uk/intlayer_with_vite+react.md +1 -1
- package/docs/uk/intlayer_with_vite+vue.md +1 -1
- package/docs/uk/introduction.md +0 -1
- package/docs/uk/readme.md +8 -8
- package/docs/ur/bundle_optimization.md +5 -1
- package/docs/ur/interest_of_intlayer.md +6 -6
- package/docs/ur/intlayer_with_angular_21.md +1 -1
- package/docs/ur/intlayer_with_hono.md +1 -1
- package/docs/ur/introduction.md +0 -1
- package/docs/vi/bundle_optimization.md +5 -1
- package/docs/vi/how_works_intlayer.md +2 -2
- package/docs/vi/interest_of_intlayer.md +6 -6
- package/docs/vi/intlayer_CMS.md +1 -1
- package/docs/vi/intlayer_with_adonisjs.md +1 -1
- package/docs/vi/intlayer_with_analog.md +1 -1
- package/docs/vi/intlayer_with_angular_19.md +1 -1
- package/docs/vi/intlayer_with_angular_21.md +1 -1
- package/docs/vi/intlayer_with_astro.md +1 -1
- package/docs/vi/intlayer_with_astro_lit.md +1 -1
- package/docs/vi/intlayer_with_astro_preact.md +1 -1
- package/docs/vi/intlayer_with_astro_react.md +1 -1
- package/docs/vi/intlayer_with_astro_solid.md +1 -1
- package/docs/vi/intlayer_with_astro_svelte.md +1 -1
- package/docs/vi/intlayer_with_astro_vanilla.md +1 -1
- package/docs/vi/intlayer_with_astro_vue.md +1 -1
- package/docs/vi/intlayer_with_create_react_app.md +1 -1
- package/docs/vi/intlayer_with_express.md +1 -1
- package/docs/vi/intlayer_with_hono.md +1 -1
- package/docs/vi/intlayer_with_nestjs.md +1 -1
- package/docs/vi/intlayer_with_nextjs_14.md +1 -1
- package/docs/vi/intlayer_with_nextjs_15.md +1 -1
- package/docs/vi/intlayer_with_nextjs_16.md +1 -1
- package/docs/vi/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/vi/intlayer_with_vite+preact.md +1 -1
- package/docs/vi/intlayer_with_vite+react.md +1 -1
- package/docs/vi/intlayer_with_vite+vue.md +1 -1
- package/docs/vi/introduction.md +0 -1
- package/docs/vi/readme.md +8 -8
- package/docs/zh/bundle_optimization.md +5 -1
- package/docs/zh/how_works_intlayer.md +2 -2
- package/docs/zh/interest_of_intlayer.md +6 -6
- package/docs/zh/intlayer_CMS.md +1 -1
- package/docs/zh/intlayer_with_adonisjs.md +1 -1
- package/docs/zh/intlayer_with_analog.md +1 -1
- package/docs/zh/intlayer_with_angular_19.md +1 -1
- package/docs/zh/intlayer_with_angular_21.md +1 -1
- package/docs/zh/intlayer_with_astro.md +1 -1
- package/docs/zh/intlayer_with_astro_lit.md +1 -1
- package/docs/zh/intlayer_with_astro_preact.md +1 -1
- package/docs/zh/intlayer_with_astro_react.md +1 -1
- package/docs/zh/intlayer_with_astro_solid.md +1 -1
- package/docs/zh/intlayer_with_astro_svelte.md +1 -1
- package/docs/zh/intlayer_with_astro_vanilla.md +1 -1
- package/docs/zh/intlayer_with_astro_vue.md +1 -1
- package/docs/zh/intlayer_with_create_react_app.md +1 -1
- package/docs/zh/intlayer_with_express.md +1 -1
- package/docs/zh/intlayer_with_hono.md +1 -1
- package/docs/zh/intlayer_with_nestjs.md +1 -1
- package/docs/zh/intlayer_with_nextjs_14.md +1 -1
- package/docs/zh/intlayer_with_nextjs_15.md +1 -1
- package/docs/zh/intlayer_with_nextjs_16.md +1 -1
- package/docs/zh/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/zh/intlayer_with_react_router_v7.md +2 -2
- package/docs/zh/intlayer_with_vite+preact.md +1 -1
- package/docs/zh/intlayer_with_vite+react.md +1 -1
- package/docs/zh/intlayer_with_vite+vue.md +1 -1
- package/docs/zh/introduction.md +0 -1
- package/docs/zh/readme.md +8 -8
- package/docs/zh-TW/bundle_optimization.md +5 -1
- package/docs/zh-TW/interest_of_intlayer.md +6 -6
- package/docs/zh-TW/intlayer_with_angular_21.md +1 -1
- package/docs/zh-TW/introduction.md +0 -1
- package/package.json +8 -7
- package/src/generated/blog.entry.ts +80 -0
- package/blog/en/___per-component_vs_centralized_i18n.md +0 -255
- package/blog/pl/___per-component_vs_centralized_i18n.md +0 -100
- package/docs/en/benchmark/___NOTE.md +0 -101
- package/docs/en/benchmark/___nextjs.md +0 -197
- package/docs/en/benchmark/___solid.md +0 -12
- package/docs/en/benchmark/___svelte.md +0 -16
- package/docs/en/benchmark/___tanstack.md +0 -190
- package/docs/en/benchmark/___vue.md +0 -7
- package/docs/pl/benchmark/___NOTE.md +0 -101
- package/docs/pl/benchmark/___nextjs.md +0 -198
- package/docs/pl/benchmark/___solid.md +0 -36
- package/docs/pl/benchmark/___svelte.md +0 -36
- package/docs/pl/benchmark/___tanstack.md +0 -36
- package/docs/pl/benchmark/___vue.md +0 -36
|
@@ -0,0 +1,438 @@
|
|
|
1
|
+
---
|
|
2
|
+
createdAt: 2026-09-16
|
|
3
|
+
updatedAt: 2026-09-16
|
|
4
|
+
title: "Cách chọn đúng thư viện Solid i18n năm 2026"
|
|
5
|
+
description: Hướng dẫn ra quyết định cho việc quốc tế hóa (i18n) SolidJS và SolidStart. Những câu hỏi cần trả lời trước khi so sánh @solid-primitives/i18n, solid-i18next, Paraglide, Lingui và Intlayer, cùng chi phí của từng lựa chọn về tính phản ứng (reactivity), bundle size và typing.
|
|
6
|
+
keywords:
|
|
7
|
+
- solidjs i18n
|
|
8
|
+
- solid start i18n
|
|
9
|
+
- solid internationalization
|
|
10
|
+
- solid-primitives i18n
|
|
11
|
+
- solid-i18next
|
|
12
|
+
- Paraglide
|
|
13
|
+
- Lingui
|
|
14
|
+
- Intlayer
|
|
15
|
+
- so sánh thư viện i18n
|
|
16
|
+
slugs:
|
|
17
|
+
- blog
|
|
18
|
+
- how-to-pick-solid-i18n-library
|
|
19
|
+
author: aymericzip
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
# Cách chọn đúng thư viện Solid i18n
|
|
23
|
+
|
|
24
|
+
Mô hình phản ứng (reactivity) của Solid làm thay đổi hoàn toàn những gì một thư viện i18n cần phải làm. Các component chỉ chạy một lần duy nhất, vì vậy bản dịch được lưu trong một `const` lúc setup sẽ trở thành một chuỗi bị đóng băng (frozen string), và một thư viện trả về chuỗi thay vì accessors sẽ tạo ra một trang web chuyển đổi ngôn ngữ ở khắp mọi nơi ngoại trừ ba component mà ai đó đã viết như vậy. Việc chọn thư viện cho Solid một phần là về API, và một phần là về việc thư viện nào giúp bạn tránh mắc phải sai lầm đó nhất.
|
|
25
|
+
|
|
26
|
+
Hướng dẫn này liệt kê các câu hỏi cần trả lời trước, sau đó đối chiếu chúng với `@solid-primitives/i18n`, `solid-i18next`, Paraglide, `@lingui/solid` và Intlayer, dành cho Vite + Solid và cho SolidStart.
|
|
27
|
+
|
|
28
|
+

|
|
29
|
+
|
|
30
|
+
## Mục lục
|
|
31
|
+
|
|
32
|
+
<TOC/>
|
|
33
|
+
|
|
34
|
+
## Sáu câu hỏi cần trả lời trước khi so sánh các thư viện
|
|
35
|
+
|
|
36
|
+
1. **Vite SPA hay SolidStart?** Trong một SPA, locale có thể nằm hoàn toàn trong một signal. Trên SolidStart, locale phải được resolve trên server từ URL, và bất kỳ nội dung nào crawler cần thấy mà không cần JavaScript (`<html lang>`, `hreflang`) đều thuộc về `entry-server.tsx`.
|
|
37
|
+
2. **Khả năng phản ứng (reactivity) khi thay đổi locale cần mức độ nào?** Việc tải lại toàn bộ trang khi chuyển đổi ngôn ngữ có thể chấp nhận được với một số ứng dụng. Nếu không, các giá trị của thư viện phải là signals hoặc accessors, và việc đọc chúng phải được track (theo dõi), chứ không phải copy.
|
|
38
|
+
3. **Ai là người viết bản dịch?** Developer, một TMS, một agency bàn giao các chuỗi ICU, hay một AI pipeline. `solid-i18next` sử dụng định dạng của i18next. `@solid-primitives/i18n` nhận bất kỳ dictionary object nào của bạn. Hãy chọn thư viện khớp với bên cung cấp bản dịch.
|
|
39
|
+
4. **Có bao nhiêu locale và trang?** Hai locale và năm trang có thể đóng gói toàn bộ nội dung. Mười locale và bốn mươi route thì không thể, và lazy catalog kèm scoping sẽ trở thành chi phí chính.
|
|
40
|
+
5. **Bạn có cần type cho các key không?** `@solid-primitives/i18n` tự suy luận type từ source dictionary. `solid-i18next` yêu cầu khai báo thủ công. Các thư viện dạng compile-time sẽ tự động generate ra chúng.
|
|
41
|
+
6. **Bạn cần phạm vi tính năng (feature surface) nhiều đến mức nào?** Quản lý cookie, routing có tiền tố locale, redirects, formatters. Lựa chọn nhẹ nhất không có tính năng nào trong số này, và điều đó hoàn toàn ổn cho đến khi bạn thực sự cần chúng.
|
|
42
|
+
|
|
43
|
+
Hãy ghi lại các câu trả lời. Mọi nội dung bên dưới đều sẽ đối chiếu lại với chúng.
|
|
44
|
+
|
|
45
|
+
## Bức tranh toàn cảnh qua một hình ảnh
|
|
46
|
+
|
|
47
|
+
Solid là hệ sinh thái trẻ nhất ở đây và có ít lựa chọn nhất, trải qua ba làn sóng.
|
|
48
|
+
|
|
49
|
+

|
|
50
|
+
|
|
51
|
+
<AccordionGroup>
|
|
52
|
+
<Accordion header="Runtime dictionaries: solid-i18next">
|
|
53
|
+
|
|
54
|
+
i18next được bọc lại cho Solid. Namespaces, backends, detectors, cùng một thập kỷ phát triển plugin. Là lựa chọn nặng nhất trong nhóm, mang chi phí tra cứu `t("a.b")` tương tự như trong React.
|
|
55
|
+
|
|
56
|
+
</Accordion>
|
|
57
|
+
<Accordion header="Primitives tối giản (2022): @solid-primitives/i18n">
|
|
58
|
+
|
|
59
|
+
Một dictionary phẳng do bạn làm chủ, một hàm `translator()` trả về các accessors, type được suy luận trực tiếp từ source object. Rất nhỏ gọn, không có scoping, không có routing, không có formatters. Đây là mặc định của cộng đồng.
|
|
60
|
+
|
|
61
|
+
</Accordion>
|
|
62
|
+
<Accordion header="Trình biên dịch và colocated content (2024 đến 2026): Paraglide, Intlayer, @lingui/solid">
|
|
63
|
+
|
|
64
|
+
Paraglide tạo ra một hàm cho mỗi message. Intlayer khai báo nội dung theo từng component trong các file `.content.ts` và trả về các node được hỗ trợ bởi signal. Binding cho Solid của Lingui ra mắt năm 2026, mang lại khả năng trích xuất dựa trên macro.
|
|
65
|
+
|
|
66
|
+
</Accordion>
|
|
67
|
+
</AccordionGroup>
|
|
68
|
+
|
|
69
|
+
Bài viết [lịch sử JavaScript i18n](https://github.com/aymericzip/intlayer/blob/main/docs/blog/vi/history_of_i18n.md) phân tích chi tiết từng làn sóng.
|
|
70
|
+
|
|
71
|
+
## Quyết định quan trọng nhất: nơi lưu trữ nội dung và thời điểm tải
|
|
72
|
+
|
|
73
|
+
Hai lựa chọn mang tính cấu trúc giải thích phần lớn sự khác biệt về kích thước bundle giữa các thiết lập:
|
|
74
|
+
|
|
75
|
+
- **Nội dung tập trung (centralized) hay phân phạm vi (scoped).** Một dictionary duy nhất cho toàn ứng dụng, hoặc một khai báo riêng cho từng component.
|
|
76
|
+
- **Static import hay dynamic import.** Toàn bộ nội dung khi khởi động, hoặc chỉ tải locale đang hoạt động (và lý tưởng nhất là route đang hoạt động) theo yêu cầu.
|
|
77
|
+
|
|
78
|
+
Biểu đồ dưới đây ước tính payload cho một ứng dụng giả định từ 1 đến 10 trang, được dịch sang 1 đến 10 locale, với khoảng 30 KB văn bản trên mỗi trang.
|
|
79
|
+
|
|
80
|
+

|
|
81
|
+
|
|
82
|
+
`@solid-primitives/i18n` không can thiệp vào cả hai trục: bạn dùng `createResource` cho dictionary của từng locale để tải động (dynamic loading), phần còn lại bạn tự xử lý. `solid-i18next` hỗ trợ namespaces và lazy backends, nhưng không có gì đảm bảo sự phân tách này, vì vậy một component dùng chung import `common` sẽ biến nó thành dependency của mọi route. Paraglide xử lý trục trang thông qua tree-shaking, mặc dù điều này chưa phát huy tác dụng trong triển khai [Solid benchmark](https://github.com/aymericzip/intlayer/blob/main/docs/docs/vi/benchmark/solid.md). Intlayer đạt được điều đó thông qua việc khai báo nội dung theo từng component.
|
|
83
|
+
|
|
84
|
+
Nếu câu trả lời của bạn cho câu hỏi 4 là "nhiều trang", hãy cân nhắc phần này hơn bất kỳ sở thích API nào. Bài viết [i18n theo từng component so với tập trung](https://github.com/aymericzip/intlayer/blob/main/docs/blog/vi/per-component_vs_centralized_i18n.md) phân tích khía cạnh bảo trì của cùng sự đánh đổi này.
|
|
85
|
+
|
|
86
|
+
## Các ứng cử viên
|
|
87
|
+
|
|
88
|
+
Kích thước thư viện được lấy từ [Solid benchmark](https://github.com/aymericzip/intlayer/blob/main/docs/docs/vi/benchmark/solid.md): provider kèm accessor trong một component trống, sau khi bundling, tree-shaking và minification, trên ứng dụng 10 trang và 10 locale. Nội dung được đo lường riêng biệt.
|
|
89
|
+
|
|
90
|
+
| Thư viện | Mô hình nội dung | Tính phản ứng khi đổi locale | An toàn kiểu | Scoping và lazy loading | Kích thước thư viện |
|
|
91
|
+
| :----------------------- | :----------------------------------------- | :----------------------------------------- | :---------------------------------- | :--------------------------------- | :------------------------------------------------- |
|
|
92
|
+
| `@solid-primitives/i18n` | Dictionary phẳng do bạn làm chủ | Signal, accessors trả về từ translator | 3/5 — Suy luận từ source dictionary | Không có sẵn | ~0.6 kB |
|
|
93
|
+
| `solid-i18next` | Catalog và namespace của i18next | Store, re-render qua provider | 2/5 — Khai báo thủ công | Namespaces, lazy backends | ~14.9 kB |
|
|
94
|
+
| Paraglide | inlang project, các hàm được generate | Đọc mỗi lần gọi từ cookie hoặc storage | 3.5/5 — Được generate | Tree-shaking (chưa có trong bench) | Gần như bằng 0 (do mã được sinh ra trong codebase) |
|
|
95
|
+
| `@lingui/solid` | Source text trong code, catalog đã compile | Dựa trên signal | 2/5 — Từ trình biên dịch | Theo từng catalog | ~11.8 kB |
|
|
96
|
+
| Intlayer | Một file `.content.ts` cho mỗi component | Node hỗ trợ signal, không re-run component | 5/5 — Được generate, bật mặc định | Có, theo từng component | ~4.3 kB |
|
|
97
|
+
|
|
98
|
+
> Các con số là ảnh chụp nhanh tại các phiên bản của bài benchmark. Kích thước của `@lingui/solid` lấy từ benchmark TanStack Start. Hãy chạy thử nghiệm trên ứng dụng của riêng bạn trước khi đưa ra quyết định chỉ dựa vào kích thước.
|
|
99
|
+
> An toàn kiểu: 5/5 nghĩa là khóa, tham số và mọi locale đều được kiểm tra mà không cần thiết lập thủ công, bao gồm cả trình định dạng URL và các helper.
|
|
100
|
+
|
|
101
|
+
Kích thước thư viện gần như bằng 0 của Paraglide là do bản chất thiết kế: runtime được generate trực tiếp vào repository của bạn. Intlayer cần `vite-intlayer`, vì vậy nó không thể chạy nếu không có bước build.
|
|
102
|
+
|
|
103
|
+
## Đối chiếu câu trả lời của bạn với thư viện phù hợp
|
|
104
|
+
|
|
105
|
+
<AccordionGroup>
|
|
106
|
+
<Accordion header="Vite SPA, catalog nhỏ, bạn muốn sự tối giản tối đa">
|
|
107
|
+
|
|
108
|
+
`@solid-primitives/i18n`. Một dictionary phẳng, một `translator()` trả về các accessors, type được suy luận mà không cần cấu hình phức tạp. Đây là câu trả lời chuẩn xác cho một ứng dụng nhỏ, và việc đọc source code chỉ mất mười phút. Những gì bạn sẽ phải tự viết: lưu trữ locale (locale persistence), routing, formatters và tách code theo route (per-route splitting). Nếu danh sách đó dài ra, đó là tín hiệu để chuyển đổi giải pháp.
|
|
109
|
+
|
|
110
|
+
</Accordion>
|
|
111
|
+
<Accordion header="Chuyển từ React sang với một codebase dùng i18next">
|
|
112
|
+
|
|
113
|
+
`solid-i18next` cho phép bạn tái sử dụng catalogs, namespaces, backends và detectors nguyên trạng. Đây là lựa chọn nặng nhất và mang lại các chi phí tương tự như `react-i18next`: khai báo type thủ công, tối ưu hóa khả thi nhưng tốn thời gian, và hàm `t()` trả về chuỗi, khiến lỗi đóng băng bản dịch (frozen translation) rất dễ xảy ra. Hãy bọc các lần đọc trong JSX hoặc một memo và không bao giờ lưu trữ chúng lúc setup.
|
|
114
|
+
|
|
115
|
+
</Accordion>
|
|
116
|
+
<Accordion header="SolidStart với route có tiền tố locale và SSR">
|
|
117
|
+
|
|
118
|
+
Locale phải được lấy từ URL phía server để cả hai bên đồng bộ; việc phát hiện locale ở client là quá muộn. `@solid-primitives/i18n` và `solid-i18next` để bạn tự xử lý route `[[locale]]`, `matchFilters`, redirect và các thẻ trong `entry-server.tsx`. Paraglide có một plugin Vite giúp xử lý routing. Intlayer cung cấp sẵn middleware và các helper cho route. Dù chọn giải pháp nào, hãy đặt `<html lang>` và `hreflang` trong `entry-server.tsx`; `@solidjs/meta` chỉ áp dụng trên client sau khi hydration trong SolidStart v2. Bài viết [Solid i18n](https://github.com/aymericzip/intlayer/blob/main/docs/blog/vi/list_i18n_technologies/frameworks/solid.md) hướng dẫn chi tiết cách thiết lập này.
|
|
119
|
+
|
|
120
|
+
</Accordion>
|
|
121
|
+
<Accordion header="Việc đổi locale phải tức thì và phân mảnh chi tiết (fine-grained)">
|
|
122
|
+
|
|
123
|
+
Hãy chọn một thư viện có giá trị là signals hoặc accessors và việc đọc giá trị được track đầy đủ. Accessors của `@solid-primitives/i18n` và các node của Intlayer đều chỉ cập nhật đúng các DOM node đọc chúng mà không làm component chạy lại (re-run). `solid-i18next` re-render thông qua provider. Paraglide đọc locale từ cookie hoặc storage trên mỗi lần gọi message thay vì từ một signal, cách này hoạt động được nhưng xử lý nhiều công việc trên mỗi node hơn mức cần thiết.
|
|
124
|
+
|
|
125
|
+
</Accordion>
|
|
126
|
+
<Accordion header="Ứng dụng lớn, nhiều route, giới hạn nghiêm ngặt về bundle">
|
|
127
|
+
|
|
128
|
+
Nội dung phân phạm vi (scoped) được biên dịch tại thời điểm build. Intlayer chỉ tải những gì một route thực sự render. Paraglide trên lý thuyết đạt được điều này qua tree-shaking; hãy kiểm tra lại trong thiết lập của bạn vì nó chưa phát huy tác dụng trong bài benchmark. Với `solid-i18next`, hãy lên kế hoạch cho chiến lược namespace và lazy-loading ngay từ ngày đầu và kiểm soát chặt chẽ khi code review.
|
|
129
|
+
|
|
130
|
+
</Accordion>
|
|
131
|
+
<Accordion header="Type safety là yêu cầu bắt buộc">
|
|
132
|
+
|
|
133
|
+
`@solid-primitives/i18n` cung cấp type được suy luận miễn phí, điều mà hầu hết các thư viện React không có. Đối với type được generate mà vẫn giữ được tính toàn vẹn qua lazy loading và chia tách route, Paraglide, `@lingui/solid` và Intlayer đều tạo ra type từ chính nội dung. Bài viết [phát hiện thiếu bản dịch](https://github.com/aymericzip/intlayer/blob/main/docs/blog/vi/detecting_missing_translations.md) so sánh những gì mỗi thư viện có thể bắt lỗi được tại thời điểm build.
|
|
134
|
+
|
|
135
|
+
</Accordion>
|
|
136
|
+
<Accordion header="Bản dịch sẽ được tạo bởi AI">
|
|
137
|
+
|
|
138
|
+
Khi đó, một dictionary tập trung không còn đối tượng sử dụng nào để biện minh cho sự tồn tại của nó. Nội dung đặt cùng component (colocated) kết hợp với một CLI tự động điền các locale còn thiếu là con đường ngắn hơn. Lệnh `fill` của Intlayer chạy với API key của riêng bạn (OpenAI, Anthropic, Mistral, Gemini) và chỉ dịch lại những gì đã thay đổi.
|
|
139
|
+
|
|
140
|
+
</Accordion>
|
|
141
|
+
</AccordionGroup>
|
|
142
|
+
|
|
143
|
+
## Nhược điểm của từng thư viện
|
|
144
|
+
|
|
145
|
+
- **`@solid-primitives/i18n`**: không có lazy loading hay scoping ngoài những gì bạn tự xây dựng, không có routing, không xử lý cookie, không có formatters. Tuyệt vời cho các ứng dụng nhỏ, nhanh chóng bộc lộ hạn chế đối với các ứng dụng chuyên nghiệp.
|
|
146
|
+
- **`solid-i18next`**: nặng nhất trong nhóm, type thủ công, định dạng số nhiều riêng, và `t()` trả về chuỗi nên bản dịch bị đóng băng nếu lưu tại bước setup.
|
|
147
|
+
- **Paraglide**: các file được generate phải commit vào repo và phải regenerate trước mỗi lần push, tree-shaking chưa hoạt động trong bài Solid benchmark, và locale được đọc từ storage trong mỗi lần gọi thay vì từ signal.
|
|
148
|
+
- **`@lingui/solid`**: mới ra mắt năm 2026, nên chưa có nhiều phản hồi từ môi trường production thực tế. Thừa hưởng bước build `extract` / `compile` của Lingui cùng nhiều cú pháp chồng chéo nhau.
|
|
149
|
+
- **Intlayer**: bắt buộc phải có build plugin, hệ sinh thái nhỏ hơn, hỗ trợ ICU một phần, và nội dung nằm rải rác trong codebase theo thiết kế, vì vậy việc xuất một file JSON duy nhất cho biên dịch viên cần công cụ hỗ trợ.
|
|
150
|
+
|
|
151
|
+
## Cú pháp code của từng lựa chọn
|
|
152
|
+
|
|
153
|
+
Cùng một component, bản tóm tắt giỏ hàng gồm tiêu đề và dạng số nhiều, được viết bằng từng ứng cử viên. Hãy chú ý vị trí đọc bản dịch: trong JSX nó được track, trong phần thân của setup nó là một chuỗi đóng băng.
|
|
154
|
+
|
|
155
|
+
<Tabs defaultTab="solid-primitives">
|
|
156
|
+
<Tab label="@solid-primitives/i18n" value="solid-primitives">
|
|
157
|
+
|
|
158
|
+
<Tabs group="locale">
|
|
159
|
+
<Tab value="en" label="Tiếng Anh">
|
|
160
|
+
|
|
161
|
+
```ts fileName="src/i18n/en.ts"
|
|
162
|
+
export const en = {
|
|
163
|
+
cart: { title: "Your cart", items: "{{ count }} items" },
|
|
164
|
+
};
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
</Tab>
|
|
168
|
+
<Tab value="fr" label="Tiếng Pháp">
|
|
169
|
+
|
|
170
|
+
```ts fileName="src/i18n/fr.ts"
|
|
171
|
+
import type { en } from "./en";
|
|
172
|
+
|
|
173
|
+
export const fr: typeof en = {
|
|
174
|
+
cart: { title: "Votre panier", items: "{{ count }} articles" },
|
|
175
|
+
};
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
</Tab>
|
|
179
|
+
<Tab value="es" label="Tiếng Tây Ban Nha">
|
|
180
|
+
|
|
181
|
+
```ts fileName="src/i18n/es.ts"
|
|
182
|
+
import type { en } from "./en";
|
|
183
|
+
|
|
184
|
+
export const es: typeof en = {
|
|
185
|
+
cart: { title: "Tu carrito", items: "{{ count }} artículos" },
|
|
186
|
+
};
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
</Tab>
|
|
190
|
+
</Tabs>
|
|
191
|
+
|
|
192
|
+
```ts fileName="src/i18n/index.ts"
|
|
193
|
+
import * as i18n from "@solid-primitives/i18n";
|
|
194
|
+
import { en } from "./en";
|
|
195
|
+
|
|
196
|
+
export const dictionary = () => i18n.flatten(en);
|
|
197
|
+
export const t = i18n.translator(dictionary, i18n.resolveTemplate);
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
```tsx fileName="src/components/CartSummary.tsx"
|
|
201
|
+
import type { Component } from "solid-js";
|
|
202
|
+
import { t } from "../i18n";
|
|
203
|
+
|
|
204
|
+
export const CartSummary: Component<{ count: number }> = (props) => (
|
|
205
|
+
<section>
|
|
206
|
+
<h2>{t("cart.title")}</h2>
|
|
207
|
+
<p>{t("cart.items", { count: props.count })}</p>
|
|
208
|
+
</section>
|
|
209
|
+
);
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
Key được định kiểu type từ object tiếng Anh mà không cần codegen. Không có quy tắc số nhiều, không có lazy loading và không có routing; bạn sẽ cần tự bổ sung từng phần.
|
|
213
|
+
|
|
214
|
+
</Tab>
|
|
215
|
+
<Tab label="solid-i18next" value="solid-i18next">
|
|
216
|
+
|
|
217
|
+
<Tabs group="locale">
|
|
218
|
+
<Tab value="en" label="Tiếng Anh">
|
|
219
|
+
|
|
220
|
+
```json fileName="public/locales/en/cart.json"
|
|
221
|
+
{
|
|
222
|
+
"title": "Your cart",
|
|
223
|
+
"items_one": "{{count}} item",
|
|
224
|
+
"items_other": "{{count}} items"
|
|
225
|
+
}
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
</Tab>
|
|
229
|
+
<Tab value="fr" label="Tiếng Pháp">
|
|
230
|
+
|
|
231
|
+
```json fileName="public/locales/fr/cart.json"
|
|
232
|
+
{
|
|
233
|
+
"title": "Votre panier",
|
|
234
|
+
"items_one": "{{count}} article",
|
|
235
|
+
"items_other": "{{count}} articles"
|
|
236
|
+
}
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
</Tab>
|
|
240
|
+
<Tab value="es" label="Tiếng Tây Ban Nha">
|
|
241
|
+
|
|
242
|
+
```json fileName="public/locales/es/cart.json"
|
|
243
|
+
{
|
|
244
|
+
"title": "Tu carrito",
|
|
245
|
+
"items_one": "{{count}} artículo",
|
|
246
|
+
"items_other": "{{count}} artículos"
|
|
247
|
+
}
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
</Tab>
|
|
251
|
+
</Tabs>
|
|
252
|
+
|
|
253
|
+
```tsx fileName="src/components/CartSummary.tsx"
|
|
254
|
+
import { useTransContext } from "@mbarzda/solid-i18next";
|
|
255
|
+
import type { Component } from "solid-js";
|
|
256
|
+
|
|
257
|
+
export const CartSummary: Component<{ count: number }> = (props) => {
|
|
258
|
+
const [t] = useTransContext();
|
|
259
|
+
|
|
260
|
+
return (
|
|
261
|
+
<section>
|
|
262
|
+
<h2>{t("cart:title")}</h2>
|
|
263
|
+
<p>{t("cart:items", { count: props.count })}</p>
|
|
264
|
+
</section>
|
|
265
|
+
);
|
|
266
|
+
};
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
Sử dụng catalogs, namespaces và plugins của i18next nguyên trạng. `t` trả về chuỗi, vì vậy `const title = t("cart:title")` lúc setup sẽ làm nó bị đóng băng; hãy giữ lệnh gọi bên trong JSX.
|
|
270
|
+
|
|
271
|
+
</Tab>
|
|
272
|
+
<Tab label="Paraglide" value="paraglide">
|
|
273
|
+
|
|
274
|
+
<Tabs group="locale">
|
|
275
|
+
<Tab value="en" label="Tiếng Anh">
|
|
276
|
+
|
|
277
|
+
```json fileName="messages/en.json"
|
|
278
|
+
{
|
|
279
|
+
"cart_title": "Your cart",
|
|
280
|
+
"cart_items": "{count} items"
|
|
281
|
+
}
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
</Tab>
|
|
285
|
+
<Tab value="fr" label="Tiếng Pháp">
|
|
286
|
+
|
|
287
|
+
```json fileName="messages/fr.json"
|
|
288
|
+
{
|
|
289
|
+
"cart_title": "Votre panier",
|
|
290
|
+
"cart_items": "{count} articles"
|
|
291
|
+
}
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
</Tab>
|
|
295
|
+
<Tab value="es" label="Tiếng Tây Ban Nha">
|
|
296
|
+
|
|
297
|
+
```json fileName="messages/es.json"
|
|
298
|
+
{
|
|
299
|
+
"cart_title": "Tu carrito",
|
|
300
|
+
"cart_items": "{count} artículos"
|
|
301
|
+
}
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
</Tab>
|
|
305
|
+
</Tabs>
|
|
306
|
+
|
|
307
|
+
```tsx fileName="src/components/CartSummary.tsx"
|
|
308
|
+
import type { Component } from "solid-js";
|
|
309
|
+
import { m } from "../paraglide/messages.js";
|
|
310
|
+
|
|
311
|
+
export const CartSummary: Component<{ count: number }> = (props) => (
|
|
312
|
+
<section>
|
|
313
|
+
<h2>{m.cart_title()}</h2>
|
|
314
|
+
<p>{m.cart_items({ count: props.count })}</p>
|
|
315
|
+
</section>
|
|
316
|
+
);
|
|
317
|
+
```
|
|
318
|
+
|
|
319
|
+
Mỗi message là một hàm có type được generate sẵn. Locale được đọc từ cookie hoặc storage trên mỗi lần gọi thay vì từ một signal, vì vậy khả năng phản ứng khi đổi ngôn ngữ bạn sẽ phải tự cấu hình.
|
|
320
|
+
|
|
321
|
+
</Tab>
|
|
322
|
+
<Tab label="Intlayer" value="intlayer">
|
|
323
|
+
|
|
324
|
+
```ts fileName="src/components/cartSummary.content.ts"
|
|
325
|
+
import { type Dictionary, plural, t } from "intlayer";
|
|
326
|
+
|
|
327
|
+
const cartSummaryContent = {
|
|
328
|
+
key: "cart-summary",
|
|
329
|
+
content: {
|
|
330
|
+
title: t({ en: "Your cart", fr: "Votre panier", es: "Tu carrito" }),
|
|
331
|
+
items: plural({
|
|
332
|
+
one: t({ en: "{{count}} item", fr: "{{count}} article" }),
|
|
333
|
+
other: t({ en: "{{count}} items", fr: "{{count}} articles" }),
|
|
334
|
+
}),
|
|
335
|
+
},
|
|
336
|
+
} satisfies Dictionary;
|
|
337
|
+
|
|
338
|
+
export default cartSummaryContent;
|
|
339
|
+
```
|
|
340
|
+
|
|
341
|
+
```tsx fileName="src/components/CartSummary.tsx"
|
|
342
|
+
import { useIntlayer } from "solid-intlayer";
|
|
343
|
+
import type { Component } from "solid-js";
|
|
344
|
+
|
|
345
|
+
export const CartSummary: Component<{ count: number }> = (props) => {
|
|
346
|
+
const content = useIntlayer("cart-summary");
|
|
347
|
+
|
|
348
|
+
return (
|
|
349
|
+
<section>
|
|
350
|
+
<h2>{content.title}</h2>
|
|
351
|
+
<p>{content.items(props.count)}</p>
|
|
352
|
+
</section>
|
|
353
|
+
);
|
|
354
|
+
};
|
|
355
|
+
```
|
|
356
|
+
|
|
357
|
+
Tất cả các locale nằm trong một file duy nhất cạnh component. `useIntlayer` trả về các node hỗ trợ signal, vì vậy việc thay đổi locale chỉ cập nhật đúng các DOM node đọc chúng. `{content.title}` trong JSX được track; `content.title.value` trong thân của setup thì không.
|
|
358
|
+
|
|
359
|
+
</Tab>
|
|
360
|
+
</Tabs>
|
|
361
|
+
|
|
362
|
+
Trên một codebase i18next hiện có, [i18next compat adapter](https://github.com/aymericzip/intlayer/blob/main/docs/docs/vi/compat/i18next.md) tạo alias cho package ở cấp độ bundler để các catalog và `t()` tiếp tục hoạt động trong khi Intlayer phân phối nội dung, và [hướng dẫn chuyển đổi](https://github.com/aymericzip/intlayer/blob/main/docs/docs/vi/migration_from_i18next_to_intlayer.md) sẽ phụ trách phần còn lại.
|
|
363
|
+
|
|
364
|
+
## Trước khi bạn đưa ra quyết định
|
|
365
|
+
|
|
366
|
+
Một bảng tính năng chỉ cho bạn biết một thư viện làm được gì hôm nay. Những điểm dưới đây cho bạn biết trải nghiệm sử dụng lâu dài sẽ ra sao.
|
|
367
|
+
|
|
368
|
+
**Kiểm tra mức độ hoạt động của repository.**
|
|
369
|
+
|
|
370
|
+
Số lượng commit, thời gian phản hồi issue, và liệu bản minor release gần nhất có diễn ra trong năm nay không. Một thiết kế tốt nhưng không có người duy trì sẽ là một cuộc di cư (migration) đang chờ đón bạn trong tương lai.
|
|
371
|
+
|
|
372
|
+
**Đừng chọn chỉ dựa vào lượt tải trên npm.**
|
|
373
|
+
|
|
374
|
+
Thư viện được cài đặt nhiều nhất là thư viện xuất hiện đầu tiên, chứ không phải thư viện phù hợp nhất với một codebase Solid năm 2026. Lượt tải đo lường lịch sử, không đo lường độ tương thích.
|
|
375
|
+
|
|
376
|
+

|
|
377
|
+
|
|
378
|
+
**Tìm hiểu xem ai tài trợ cho người bảo trì, và họ bán sản phẩm gì.**
|
|
379
|
+
|
|
380
|
+
`i18next` (đứng sau `solid-i18next`) được hậu thuẫn bởi Locize. `next-intl`, `vue-i18n`, `svelte-i18n` và Lingui được tài trợ bởi Crowdin. Tolgee, Paraglide (inlang) và Intlayer đều vận hành nền tảng riêng của họ. Một nhà cung cấp có doanh thu đến từ dịch vụ lưu trữ bản dịch (hosted translation) sẽ có rất ít lý do để cung cấp bản dịch miễn phí ngay bên trong chuỗi công cụ (toolchain) của bạn. Intlayer là thư viện duy nhất trong nhóm cung cấp tính năng dịch thuật bằng AI qua CLI với API key của chính bạn, cùng một CMS mà bạn có thể tự host (self-host).
|
|
381
|
+
|
|
382
|
+
**Thư viện đã sẵn sàng cho AI agent chưa?**
|
|
383
|
+
|
|
384
|
+
Các agent vẫn gặp khó khăn với i18n: chúng quên locale, tự bịa ra key và trộn lẫn các cú pháp message. Thư viện có cung cấp [Agent Skills](https://github.com/aymericzip/intlayer/blob/main/docs/docs/vi/agent_skills.md) hoặc [MCP server](https://github.com/aymericzip/intlayer/blob/main/docs/docs/vi/mcp_server.md) để agent có thể liệt kê, điền và kiểm thử nội dung không? Và việc nạp nội dung có được tối ưu hóa theo mặc định hay ai đó phải định kỳ rà soát namespaces và lazy imports hàng quý?
|
|
385
|
+
|
|
386
|
+
**Type safety ngay từ đầu.**
|
|
387
|
+
|
|
388
|
+
Không phải là "có thể định kiểu với cấu hình bổ sung" mà là "một key sai sẽ khiến `tsc` báo lỗi ngay trên một bản cài đặt mới". Hãy kiểm tra điều gì xảy ra với một key không tồn tại, và với một locale bị thiếu một bản dịch.
|
|
389
|
+
|
|
390
|
+
**Phát hiện nội dung không sử dụng.**
|
|
391
|
+
|
|
392
|
+
Các catalog chỉ có xu hướng phình to ra. Quá trình build của Intlayer sẽ loại bỏ các trường không dùng và ghi log (`build.purge`). Paraglide đạt được điều này nhờ kiến trúc, vì một hàm message không được gọi sẽ bị loại bỏ qua tree-shaking. Tất cả các thư viện khác đều để lại công việc dọn dẹp cho bạn.
|
|
393
|
+
|
|
394
|
+
**Developer experience.**
|
|
395
|
+
|
|
396
|
+
Thời gian setup cho đến chuỗi dịch đầu tiên, một [LSP](https://github.com/aymericzip/intlayer/blob/main/docs/docs/vi/lsp.md) hoặc [VS Code extension](https://github.com/aymericzip/intlayer/blob/main/docs/docs/vi/vs_code_extension.md) hiển thị bản dịch khi hover và nhảy tới khai báo, một [CLI](https://github.com/aymericzip/intlayer/blob/main/docs/docs/vi/cli/index.md) để fill, test và push, một [trình biên dịch](https://github.com/aymericzip/intlayer/blob/main/docs/docs/vi/compiler.md) hoặc trình trích xuất lấy các chuỗi hard-code ra khỏi component để bạn không phải quản lý từng chuỗi theo từng khóa, cùng cách để người không phải lập trình viên có thể chỉnh sửa nội dung ([visual editor](https://github.com/aymericzip/intlayer/blob/main/docs/docs/vi/intlayer_visual_editor.md) hoặc [CMS](https://github.com/aymericzip/intlayer/blob/main/docs/docs/vi/intlayer_CMS.md)) mà không cần tạo pull request.
|
|
397
|
+
|
|
398
|
+
## Câu hỏi thường gặp
|
|
399
|
+
|
|
400
|
+
<FAQ>
|
|
401
|
+
|
|
402
|
+
<Question title="Liệu @solid-primitives/i18n có đủ cho một ứng dụng production không?">
|
|
403
|
+
|
|
404
|
+
Với ứng dụng nhỏ, câu trả lời là có, và đây là lựa chọn nhẹ nhất hiện có. Nó sẽ không còn đủ khi bạn cần lazy catalog theo từng route, routing theo locale trên SolidStart, lưu trữ cookie hoặc formatters, bởi vì toàn bộ những phần đó bạn sẽ phải tự xây dựng.
|
|
405
|
+
|
|
406
|
+
</Question>
|
|
407
|
+
|
|
408
|
+
<Question title="Tại sao bản dịch của tôi không cập nhật khi đổi locale?">
|
|
409
|
+
|
|
410
|
+
Bởi vì các component trong Solid chỉ chạy một lần. Một bản dịch được đọc vào một `const` lúc setup là một chuỗi thông thường, không phải một subscription. Hãy đọc nó bên trong JSX, một effect hoặc một memo, hoặc chọn một thư viện có các giá trị là accessors để khó viết sai hơn.
|
|
411
|
+
|
|
412
|
+
</Question>
|
|
413
|
+
|
|
414
|
+
<Question title="Tôi có cần một thư viện dựa trên trình biên dịch (compiler) không?">
|
|
415
|
+
|
|
416
|
+
Chỉ khi bundle size, generated types hoặc việc kiểm tra thiếu key tại thời điểm build là các yêu cầu thực tế. Bài viết [i18n dạng compiler so với declarative](https://github.com/aymericzip/intlayer/blob/main/docs/blog/vi/compiler_vs_declarative_i18n.md) giải thích những gì trình biên dịch mang lại và những trường hợp chúng có thể xử lý không đúng.
|
|
417
|
+
|
|
418
|
+
</Question>
|
|
419
|
+
|
|
420
|
+
<Question title="Việc chọn thư viện có ảnh hưởng đến SEO không?">
|
|
421
|
+
|
|
422
|
+
Có, một cách gián tiếp. Các công cụ tìm kiếm quan tâm đến routing, `hreflang`, `<html lang>` và liệu văn bản có nằm trong HTML được render trên server hay không, điều mà trên SolidStart gắn liền với `entry-server.tsx`. Xem thêm [hướng dẫn hreflang](https://github.com/aymericzip/intlayer/blob/main/docs/blog/vi/hreflang_guide_multilingual_seo.md).
|
|
423
|
+
|
|
424
|
+
</Question>
|
|
425
|
+
|
|
426
|
+
</FAQ>
|
|
427
|
+
|
|
428
|
+
## Tìm hiểu thêm
|
|
429
|
+
|
|
430
|
+
- [Solid i18n benchmark: kích thước bundle, độ rò rỉ và thời gian chuyển đổi locale](https://github.com/aymericzip/intlayer/blob/main/docs/docs/vi/benchmark/solid.md)
|
|
431
|
+
- [Solid i18n: tại sao bản dịch bị đóng băng khi đổi locale](https://github.com/aymericzip/intlayer/blob/main/docs/blog/vi/list_i18n_technologies/frameworks/solid.md)
|
|
432
|
+
- [Drop-in i18next compat adapter](https://github.com/aymericzip/intlayer/blob/main/docs/docs/vi/compat/i18next.md) và [hướng dẫn chuyển đổi i18next](https://github.com/aymericzip/intlayer/blob/main/docs/docs/vi/migration_from_i18next_to_intlayer.md)
|
|
433
|
+
- [Lịch sử JavaScript i18n](https://github.com/aymericzip/intlayer/blob/main/docs/blog/vi/history_of_i18n.md)
|
|
434
|
+
- [i18n dạng compiler so với declarative](https://github.com/aymericzip/intlayer/blob/main/docs/blog/vi/compiler_vs_declarative_i18n.md)
|
|
435
|
+
- [i18n theo từng component so với tập trung](https://github.com/aymericzip/intlayer/blob/main/docs/blog/vi/per-component_vs_centralized_i18n.md)
|
|
436
|
+
- [Cách tối ưu hóa bundle hoạt động tại thời điểm build](https://github.com/aymericzip/intlayer/blob/main/docs/docs/vi/bundle_optimization.md)
|
|
437
|
+
- [Thiết lập i18n trong ứng dụng Vite + Solid](https://github.com/aymericzip/intlayer/blob/main/docs/docs/vi/intlayer_with_vite+solid.md) và trong [ứng dụng SolidStart](https://github.com/aymericzip/intlayer/blob/main/docs/docs/vi/intlayer_with_solid_start.md)
|
|
438
|
+
- Hướng dẫn tương tự cho [React](https://github.com/aymericzip/intlayer/blob/main/docs/blog/vi/how_to_pick_react_i18n_library.md), [Vue](https://github.com/aymericzip/intlayer/blob/main/docs/blog/vi/how_to_pick_vue_i18n_library.md) và [Svelte](https://github.com/aymericzip/intlayer/blob/main/docs/blog/vi/how_to_pick_svelte_i18n_library.md)
|