@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,442 @@
|
|
|
1
|
+
---
|
|
2
|
+
createdAt: 2026-09-16
|
|
3
|
+
updatedAt: 2026-09-16
|
|
4
|
+
title: "2026年に最適なVue i18nライブラリの選び方"
|
|
5
|
+
description: VueおよびNuxtの国際化(i18n)決定ガイド。vue-i18n、@nuxtjs/i18n、fluent-vue、Paraglide、Intlayerを比較する前に答えるべき質問と、各選択肢のバンドルサイズ、型定義、SSRペイロードのトレードオフを解説します。
|
|
6
|
+
keywords:
|
|
7
|
+
- vue i18n
|
|
8
|
+
- vue 国際化
|
|
9
|
+
- vue-i18n
|
|
10
|
+
- nuxt i18n
|
|
11
|
+
- fluent-vue
|
|
12
|
+
- Paraglide
|
|
13
|
+
- Intlayer
|
|
14
|
+
- i18n ライブラリ 比較
|
|
15
|
+
slugs:
|
|
16
|
+
- blog
|
|
17
|
+
- how-to-pick-vue-i18n-library
|
|
18
|
+
author: aymericzip
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
# 最適なVue i18nライブラリの選び方
|
|
22
|
+
|
|
23
|
+
「Vue i18n」は一般的な用語であると同時に、ほぼすべての人が最初にインストールするライブラリの名前でもあります。これは便利である反面、誤解を招きやすい点でもあります。`vue-i18n` は優れたデフォルトの選択肢ですが、唯一の選択肢ではありません。また、選択の基準となるべき問い(SSRを使用するかどうか、ページ数、誰が翻訳を作成するかなど)は、`npm install` を実行する前に十分に検討されないことがよくあります。
|
|
24
|
+
|
|
25
|
+
本ガイドでは、まずこれらの検討すべき質問を整理し、その回答をもとに素のVite + VueおよびNuxtに最適なライブラリをマッピングします。
|
|
26
|
+
|
|
27
|
+

|
|
28
|
+
|
|
29
|
+
## 目次
|
|
30
|
+
|
|
31
|
+
<TOC/>
|
|
32
|
+
|
|
33
|
+
## ライブラリを比較する前に答えるべき6つの質問
|
|
34
|
+
|
|
35
|
+
1. **Vite SPAか、それともNuxtか?** SPAの場合、カタログのコストはJSバンドルの問題にとどまります。Nuxtの場合はHTMLペイロードの問題にもなります。メッセージがSSRステートにシリアライズされてハイドレーションされるためです。「vue-i18nが遅い」という報告の多くは、この理由からNuxtアプリケーションで発生しています。
|
|
36
|
+
2. **誰が翻訳を作成するか?** 開発者、TMS、ICU文字列を提供する翻訳会社、あるいはAIパイプラインか。`vue-i18n` はICUではなく独自のパイプ区切り複数形構文を使用します。外部から文字列を受け取る場合、この違いが重要になります。
|
|
37
|
+
3. **ロケール数とページ数はどのくらいか?** 2ロケール・5ページ程度であれば、すべてを一度に配信しても問題ありません。しかし、10ロケール・40ルートになるとそうはいかず、読み込み戦略が主なコスト要因になります。
|
|
38
|
+
4. **キーの型安全性が必要か?** `vue-i18n` では、メッセージスキーマのジェネリクスを渡さない限り `t("cart.totl")` のようなタイポもコンパイルが通ってしまいます。また、そのスキーマは遅延ロードされるカタログと競合しがちです。
|
|
39
|
+
5. **コンテンツに何が含まれるか?** UIラベルのみか、それともMarkdown、文章内のリンク、ロケールごとのブロックが含まれるか。リッチコンテンツを扱う場合、`t()` が単なる文字列を返す仕様は扱いづらくなります。
|
|
40
|
+
6. **CSP(コンテンツセキュリティポリシー)の制約はあるか?** デフォルトの `vue-i18n` ビルドはブラウザ上で `new Function` を使用してメッセージをコンパイルします。ランタイム専用ビルドを使用するには、ビルド時に事前コンパイルを行う `@intlify/unplugin-vue-i18n` が必要です。
|
|
41
|
+
|
|
42
|
+
これらの回答を書き留めておきましょう。以降の内容はすべてこれらに基づいて展開されます。
|
|
43
|
+
|
|
44
|
+
## 全体像を一目で把握する
|
|
45
|
+
|
|
46
|
+
Vueエコシステムのi18nライブラリはReactよりも数が少なく、それぞれ異なるアーキテクチャの世代から生まれています。
|
|
47
|
+
|
|
48
|
+

|
|
49
|
+
|
|
50
|
+
<AccordionGroup>
|
|
51
|
+
<Accordion header="ランタイム辞書方式(2015年〜2019年): vue-i18n, @nuxt/i18n">
|
|
52
|
+
|
|
53
|
+
`vue-i18n` は2015年に登場し、それ以来デフォルトの地位を維持してきました。`@nuxt/i18n` はそれをラップし、ロケールルーティング、SEOタグ、ロケールごとの遅延ロード機能を提供します。メッセージはレンダリング関数にコンパイルされ、unpluginを追加した場合はビルド時に、それ以外の場合はブラウザ上でコンパイルされます。
|
|
54
|
+
|
|
55
|
+
</Accordion>
|
|
56
|
+
<Accordion header="代替フォーマット(2020年): fluent-vue">
|
|
57
|
+
|
|
58
|
+
Mozilla Fluentの `.ftl` ファイルにより、文法に応じた柔軟なバリアントを持つ扱いやすいメッセージ構文がもたらされました。キーの型定義はなく、Viteプラグインはすべてのロケールをすべてのページに読み込みます。
|
|
59
|
+
|
|
60
|
+
</Accordion>
|
|
61
|
+
<Accordion header="コンパイラおよびコロケーションコンテンツ方式(2024年〜2026年): Paraglide, Intlayer">
|
|
62
|
+
|
|
63
|
+
Paraglideはメッセージごとに1つの関数を生成し、残りはバンドラーのTree-shakingに任せます。Intlayerは `.content.ts` ファイルでコンポーネントごとにコンテンツを宣言し、型を自動生成して、そのルートがレンダリングするものだけを配信します。
|
|
64
|
+
|
|
65
|
+
</Accordion>
|
|
66
|
+
</AccordionGroup>
|
|
67
|
+
|
|
68
|
+
各世代の詳細については、[JavaScript i18nの歴史](https://github.com/aymericzip/intlayer/blob/main/docs/blog/ja/history_of_i18n.md)で解説しています。
|
|
69
|
+
|
|
70
|
+
## 最も重要な決定: コンテンツの配置場所と読み込みタイミング
|
|
71
|
+
|
|
72
|
+
構成の違いによるバンドルサイズの差の大部分は、主に2つの構造的選択によって生じます。
|
|
73
|
+
|
|
74
|
+
- **集中管理か、スコープ化されたコンテンツか。** アプリ全体で1つの `locales/en.json` を使うか、コンポーネントごとに宣言するか。
|
|
75
|
+
- **静的インポートか、動的インポートか。** 起動時にすべて読み込むか、アクティブなロケール(および理想的にはアクティブなルート)をオンデマンドで取得するか。
|
|
76
|
+
|
|
77
|
+
下のグラフは、ページあたり約30 KBのテキストを持ち、1〜10ページ、1〜10ロケールに翻訳された理論上のアプリにおけるペイロードの推定値です。
|
|
78
|
+
|
|
79
|
+

|
|
80
|
+
|
|
81
|
+
`vue-i18n` は動的インポートの軸をサポートしています。`import()` の後に `setLocaleMessage` を実行すれば、誰も読まない残り9ロケールの配信を停止できます。しかし、ページ単位の軸は提供されません。ロケールカタログは1つのオブジェクトであるため、それを読み込むとすべてのページのコピーが読み込まれます。SPAでは気づきにくいですが、Nuxtで `@nuxtjs/i18n` を使い10ページを超えると、各ルートが他のすべてのルートの文字列をJSチャンク内とSSRペイロード内の2回抱え込むことになります。
|
|
82
|
+
|
|
83
|
+
[Vueベンチマーク](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ja/benchmark/vue.md)では、これを「他ルートからの漏洩」および「他ロケールからの漏洩」として測定しています。質問3の回答が「ページ数が多い」だった場合、このセクションはAPIの好み以上に重要な要素となります。[コンポーネント単位 vs 集中管理 i18n](https://github.com/aymericzip/intlayer/blob/main/docs/blog/ja/per-component_vs_centralized_i18n.md)の記事では、同じトレードオフのメンテナンス面について詳しく説明しています。
|
|
84
|
+
|
|
85
|
+
## 候補となるライブラリ
|
|
86
|
+
|
|
87
|
+
ライブラリのサイズは、10ページ・10ロケールのアプリを対象に、バンドル、Tree-shaking、Minify後の空コンポーネント内のプラグイン+Composableを測定した[Vueベンチマーク](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ja/benchmark/vue.md)の数値です。コンテンツ自体は別途測定されています。
|
|
88
|
+
|
|
89
|
+
| ライブラリ | コンテンツモデル | 型安全性 | メッセージフォーマット | ルート単位の分割 | ライブラリサイズ |
|
|
90
|
+
| :------------- | :---------------------------------------------------------- | :--------------------------------------- | :---------------------------------- | :------------------------- | :----------------------------------------------- |
|
|
91
|
+
| `vue-i18n` | ロケールごとの中央カタログ、SFCの `<i18n>` ブロック(任意) | 2/5 — スキーマジェネリクス(オプトイン) | 独自(パイプ区切り複数形) | 不可 | ~24.3 kB |
|
|
92
|
+
| `@nuxtjs/i18n` | `vue-i18n` と同様+ルーティングおよびSEOタグ | 2/5 — 同様 | 同様 | 不可(ロケール単位のみ) | ~24.3 kB |
|
|
93
|
+
| `fluent-vue` | `.ftl` ファイル(Mozilla Fluent) | 1/5 — なし | Fluent | 不可 | ~29.7 kB |
|
|
94
|
+
| Paraglide | inlangプロジェクト、生成された関数 | 3.5/5 — 生成される | 独自 | Tree-shaking経由 | ほぼゼロ(コードベースに生成されるコードのため) |
|
|
95
|
+
| Intlayer | コンポーネントごとに1つの `.content.ts` | 5/5 — 生成される(デフォルトで有効) | Intlayer (+ ICU, i18next, vue-i18n) | 可能(コンポーネント単位) | ~3.9 kB |
|
|
96
|
+
|
|
97
|
+
> 数値はベンチマーク実施時のバージョンのスナップショットです。サイズだけで判断せず、ご自身のアプリで実際に測定することをおすすめします。
|
|
98
|
+
> 型安全性:5/5は、URLフォーマッターやヘルパーを含め、キー・パラメータ・すべてのロケールが手動設定なしに検証されることを意味します。
|
|
99
|
+
|
|
100
|
+
Paraglideのライブラリサイズがほぼゼロなのは設計によるものです。ランタイムがリポジトリ内に生成されるため、push前の再生成ステップが必要となり、生成ファイルでのマージコンフリクトが発生する可能性があります。Intlayerには `vite-intlayer`(またはNuxtモジュール)が必要なため、ビルドステップなしで実行することはできません。
|
|
101
|
+
|
|
102
|
+
## 回答をライブラリとマッチングする
|
|
103
|
+
|
|
104
|
+
<AccordionGroup>
|
|
105
|
+
<Accordion header="Vite SPA、少人数のチーム、ロケール数が少ない場合">
|
|
106
|
+
|
|
107
|
+
Compositionモード(`legacy: false`)の `vue-i18n` に `@intlify/unplugin-vue-i18n` を組み合わせ、ランタイム専用ビルドを配信します。`import()` を使用してロケールを遅延ロードします。これによりほとんどの小規模アプリをカバーでき、コミュニティの知見も豊富です。SFCの `<i18n>` ブロックはメッセージをコンポーネントと同じ場所に配置するのに役立ちますが、JSONカタログと比べて抽出ツールやTMS連携が少ないため、どちらを採用するかはチームで早期に決定しておきましょう。
|
|
108
|
+
|
|
109
|
+
</Accordion>
|
|
110
|
+
<Accordion header="ロケールルーティング、サイトマップ、hreflangを必要とするNuxtの場合">
|
|
111
|
+
|
|
112
|
+
`@nuxtjs/i18n` を使えば、ルーティング戦略、`hreflang` タグ、ロケール検出をコードなしで実現できるため、数ページのコンテンツサイトであればこれだけで採用する価値があります。制限となるのはロケール単位のカタログです。10ページ程度を超えると、SSRペイロードにすべてのルートのコピーが含まれるようになります。その場合は、`vue-i18n` を手動でルートごとに設定するか、スコープ化されたコンテンツに移行することを検討してください。[Nuxt i18nの記事](https://github.com/aymericzip/intlayer/blob/main/docs/blog/ja/list_i18n_technologies/frameworks/nuxt.md)では、まずルーティング戦略の選択について説明しています。
|
|
113
|
+
|
|
114
|
+
</Accordion>
|
|
115
|
+
<Accordion header="翻訳がTMSまたはICUを提供する翻訳会社から届く場合">
|
|
116
|
+
|
|
117
|
+
`vue-i18n` の複数形構文(`"no item | one item | {count} items"`)はICUではなく、移植性がありません。翻訳者に仕様を伝える必要があり、TMSのエクスポートでもそのまま生成されない場合があります。最初のカタログを作成する前にフォーマットを取り決めるか、ベンダーと一致するフォーマットを持つライブラリを選択してください。IntlayerのICUサポートは部分的なため、現在ICU文字列を受け取っている場合はその点にも留意が必要です。
|
|
118
|
+
|
|
119
|
+
</Accordion>
|
|
120
|
+
<Accordion header="大規模アプリ、多数のルート、バンドルまたはSSRペイロードの予算が厳しい場合">
|
|
121
|
+
|
|
122
|
+
ビルド時にコンパイルされるスコープ化されたコンテンツを選択するのが適しています。ParaglideはTree-shakingによってこれを実現し、Vite上で期待通りに動作します。Intlayerはコンポーネントごとの宣言によってこれを実現し、ルートがレンダリングするものだけを配信します。`vue-i18n` でも手動でメッセージをルートごとに分割できますが、強制力はなく、共有コンポーネントがグローバル名前空間をインポートすると容易に崩れてしまいます。
|
|
123
|
+
|
|
124
|
+
</Accordion>
|
|
125
|
+
<Accordion header="型安全性が必須条件である場合">
|
|
126
|
+
|
|
127
|
+
`vue-i18n` は `createI18n` にスキーマジェネリクスを渡すことで型付けが可能です。動作はしますが、カタログが遅延ロードされた瞬間に破綻します。スキーマがまだ存在しないメッセージまで記述してしまうためです。その保守を避けたい場合は、ParaglideやIntlayerのようにコンテンツから型が自動生成されるライブラリを選択してください。[翻訳漏れの検出](https://github.com/aymericzip/intlayer/blob/main/docs/blog/ja/detecting_missing_translations.md)の記事では、各ライブラリがビルド時に何をキャッチできるかを比較しています。
|
|
128
|
+
|
|
129
|
+
</Accordion>
|
|
130
|
+
<Accordion header="コンテンツがUIラベルにとどまらない場合">
|
|
131
|
+
|
|
132
|
+
Markdownページ、文中に `<RouterLink>` が入る文章、ロケールごとのコンポーネントなどがある場合です。`vue-i18n` にはコンポーネント補間のための `<i18n-t>` があり、機能はしますが冗長になりがちです。IntlayerのコンテンツノードはMarkdown、HTML、ネストされたオブジェクトを直接扱えるため、コンテンツ量の多いアプリに適しています。
|
|
133
|
+
|
|
134
|
+
</Accordion>
|
|
135
|
+
<Accordion header="翻訳をAIで生成する場合">
|
|
136
|
+
|
|
137
|
+
この場合、集中管理されたJSONを維持する理由はほとんどありません。コンポーネントと同じ場所に配置されたコンテンツと、不足しているロケールを補完するCLIを組み合わせるのが最短のアプローチです。Intlayerの `fill` コマンドは自身のAPIキー(OpenAI、Anthropic、Mistral、Gemini)を使用して実行され、変更された部分のみを再翻訳します。
|
|
138
|
+
|
|
139
|
+
</Accordion>
|
|
140
|
+
</AccordionGroup>
|
|
141
|
+
|
|
142
|
+
## 各ライブラリの注意点・弱点
|
|
143
|
+
|
|
144
|
+
- **`vue-i18n`**: 候補の中で最も重く、独自の複数形フォーマットを持ち、型定義はオプトインかつ遅延ロード時に壊れやすく、ルート単位のスコープ化がなく、使われていないキーが静かに蓄積します。Vue 3アプリで `legacy: true` のままにするとVue 2互換レイヤーが維持され、`useI18n()` の型安全性が失われます。
|
|
145
|
+
- **`@nuxtjs/i18n`**: 上記のすべてを引き継ぎ、十数ルートを超えるとSSRペイロードが全ページの文字列を抱え込みます。
|
|
146
|
+
- **`fluent-vue`**: 優れたメッセージ構文を持つものの、キーの型定義はなく、Viteプラグインが全言語の全コンテンツを全ページに読み込みます。ベンチマークで最も重い結果となっています。
|
|
147
|
+
- **Paraglide**: 生成されたファイルをリポジトリにコミットする必要があり、push前の再生成が必要で、ロケールがリアクティブなストアからではなくメッセージ呼び出しごとにクッキーやストレージから読み取られるため、ロケール変更時の処理コストがかかります。
|
|
148
|
+
- **Intlayer**: ビルドプラグインが必須で、エコシステムが比較的小さく、ICUサポートが部分的であり、設計上コンテンツがコードベース全体に分散しているため、翻訳者向けに1つのJSONをエクスポートするには専用のツールが必要です。
|
|
149
|
+
|
|
150
|
+
## 各選択肢のコード例
|
|
151
|
+
|
|
152
|
+
タイトルと複数形を含む同じカートサマリーコンポーネントを、各候補で実装した例です。注目すべきはテンプレートではなく、コンテンツがどこに置かれ、`vue-tsc` がそれをどのように認識するかです。
|
|
153
|
+
|
|
154
|
+
<Tabs defaultTab="vue-i18n">
|
|
155
|
+
<Tab label="vue-i18n" value="vue-i18n">
|
|
156
|
+
|
|
157
|
+
<Tabs group="locale">
|
|
158
|
+
<Tab value="en" label="英語">
|
|
159
|
+
|
|
160
|
+
```json fileName="src/locales/en.json"
|
|
161
|
+
{
|
|
162
|
+
"cart": {
|
|
163
|
+
"title": "Your cart",
|
|
164
|
+
"items": "no item | one item | {count} items"
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
</Tab>
|
|
170
|
+
<Tab value="fr" label="フランス語">
|
|
171
|
+
|
|
172
|
+
```json fileName="src/locales/fr.json"
|
|
173
|
+
{
|
|
174
|
+
"cart": {
|
|
175
|
+
"title": "Votre panier",
|
|
176
|
+
"items": "aucun article | un article | {count} articles"
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
</Tab>
|
|
182
|
+
<Tab value="es" label="スペイン語">
|
|
183
|
+
|
|
184
|
+
```json fileName="src/locales/es.json"
|
|
185
|
+
{
|
|
186
|
+
"cart": {
|
|
187
|
+
"title": "Tu carrito",
|
|
188
|
+
"items": "ningún artículo | un artículo | {count} artículos"
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
</Tab>
|
|
194
|
+
</Tabs>
|
|
195
|
+
|
|
196
|
+
```vue fileName="src/components/CartSummary.vue"
|
|
197
|
+
<script setup lang="ts">
|
|
198
|
+
import { useI18n } from "vue-i18n";
|
|
199
|
+
|
|
200
|
+
const props = defineProps<{ count: number }>();
|
|
201
|
+
const { t } = useI18n();
|
|
202
|
+
</script>
|
|
203
|
+
|
|
204
|
+
<template>
|
|
205
|
+
<section>
|
|
206
|
+
<h2>{{ t("cart.title") }}</h2>
|
|
207
|
+
<p>{{ t("cart.items", { count: props.count }, props.count) }}</p>
|
|
208
|
+
</section>
|
|
209
|
+
</template>
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
パイプ区切りの複数形はvue-i18n独自のフォーマットであり、ICUではありません。`createI18n` にメッセージスキーマのジェネリクスを渡さない限り、`t` は任意の文字列を受け付けます。
|
|
213
|
+
|
|
214
|
+
</Tab>
|
|
215
|
+
<Tab label="fluent-vue" value="fluent-vue">
|
|
216
|
+
|
|
217
|
+
<Tabs group="locale">
|
|
218
|
+
<Tab value="en" label="英語">
|
|
219
|
+
|
|
220
|
+
```ftl fileName="src/locales/en.ftl"
|
|
221
|
+
cart-title = Your cart
|
|
222
|
+
cart-items = { $count ->
|
|
223
|
+
[one] { $count } item
|
|
224
|
+
*[other] { $count } items
|
|
225
|
+
}
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
</Tab>
|
|
229
|
+
<Tab value="fr" label="フランス語">
|
|
230
|
+
|
|
231
|
+
```ftl fileName="src/locales/fr.ftl"
|
|
232
|
+
cart-title = Votre panier
|
|
233
|
+
cart-items = { $count ->
|
|
234
|
+
[one] { $count } article
|
|
235
|
+
*[other] { $count } articles
|
|
236
|
+
}
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
</Tab>
|
|
240
|
+
<Tab value="es" label="スペイン語">
|
|
241
|
+
|
|
242
|
+
```ftl fileName="src/locales/es.ftl"
|
|
243
|
+
cart-title = Tu carrito
|
|
244
|
+
cart-items = { $count ->
|
|
245
|
+
[one] { $count } artículo
|
|
246
|
+
*[other] { $count } artículos
|
|
247
|
+
}
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
</Tab>
|
|
251
|
+
</Tabs>
|
|
252
|
+
|
|
253
|
+
```vue fileName="src/components/CartSummary.vue"
|
|
254
|
+
<script setup lang="ts">
|
|
255
|
+
import { useFluent } from "fluent-vue";
|
|
256
|
+
|
|
257
|
+
const props = defineProps<{ count: number }>();
|
|
258
|
+
const { $t } = useFluent();
|
|
259
|
+
</script>
|
|
260
|
+
|
|
261
|
+
<template>
|
|
262
|
+
<section>
|
|
263
|
+
<h2>{{ $t("cart-title") }}</h2>
|
|
264
|
+
<p>{{ $t("cart-items", { count: props.count }) }}</p>
|
|
265
|
+
</section>
|
|
266
|
+
</template>
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
Fluentの構文は複数形や文法バリアントをうまく処理します。メッセージIDは型付けされていない文字列であり、Viteプラグインはすべてのロケールをすべてのページにバンドルします。
|
|
270
|
+
|
|
271
|
+
</Tab>
|
|
272
|
+
<Tab label="Paraglide" value="paraglide">
|
|
273
|
+
|
|
274
|
+
<Tabs group="locale">
|
|
275
|
+
<Tab value="en" label="英語">
|
|
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="フランス語">
|
|
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="スペイン語">
|
|
296
|
+
|
|
297
|
+
```json fileName="messages/es.json"
|
|
298
|
+
{
|
|
299
|
+
"cart_title": "Tu carrito",
|
|
300
|
+
"cart_items": "{count} artículos"
|
|
301
|
+
}
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
</Tab>
|
|
305
|
+
</Tabs>
|
|
306
|
+
|
|
307
|
+
```vue fileName="src/components/CartSummary.vue"
|
|
308
|
+
<script setup lang="ts">
|
|
309
|
+
import { m } from "../paraglide/messages.js";
|
|
310
|
+
|
|
311
|
+
const props = defineProps<{ count: number }>();
|
|
312
|
+
</script>
|
|
313
|
+
|
|
314
|
+
<template>
|
|
315
|
+
<section>
|
|
316
|
+
<h2>{{ m.cart_title() }}</h2>
|
|
317
|
+
<p>{{ m.cart_items({ count: props.count }) }}</p>
|
|
318
|
+
</section>
|
|
319
|
+
</template>
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
すべてのメッセージが生成された型付き関数であるため、キーが存在しない場合はインポートエラーになります。`paraglide/` フォルダはリポジトリ内に生成され、変更のたびに再生成されます。
|
|
323
|
+
|
|
324
|
+
</Tab>
|
|
325
|
+
<Tab label="Intlayer" value="intlayer">
|
|
326
|
+
|
|
327
|
+
```ts fileName="src/components/cartSummary.content.ts"
|
|
328
|
+
import { plural, t, type Dictionary } from "intlayer";
|
|
329
|
+
|
|
330
|
+
const cartSummaryContent = {
|
|
331
|
+
key: "cart-summary",
|
|
332
|
+
content: {
|
|
333
|
+
title: t({ en: "Your cart", fr: "Votre panier", es: "Tu carrito" }),
|
|
334
|
+
items: t({
|
|
335
|
+
en: plural({ one: "{{count}} item", other: "{{count}} items" }),
|
|
336
|
+
fr: plural({ one: "{{count}} article", other: "{{count}} articles" }),
|
|
337
|
+
es: plural({ one: "{{count}} artículo", other: "{{count}} artículos" }),
|
|
338
|
+
}),
|
|
339
|
+
},
|
|
340
|
+
} satisfies Dictionary;
|
|
341
|
+
|
|
342
|
+
export default cartSummaryContent;
|
|
343
|
+
```
|
|
344
|
+
|
|
345
|
+
```vue fileName="src/components/CartSummary.vue"
|
|
346
|
+
<script setup lang="ts">
|
|
347
|
+
import { useIntlayer } from "vue-intlayer";
|
|
348
|
+
|
|
349
|
+
const props = defineProps<{ count: number }>();
|
|
350
|
+
const { title, items } = useIntlayer("cart-summary");
|
|
351
|
+
</script>
|
|
352
|
+
|
|
353
|
+
<template>
|
|
354
|
+
<section>
|
|
355
|
+
<h2><title /></h2>
|
|
356
|
+
<p>{{ items(props.count) }}</p>
|
|
357
|
+
</section>
|
|
358
|
+
</template>
|
|
359
|
+
```
|
|
360
|
+
|
|
361
|
+
すべてのロケールがコンポーネントの隣の1つのファイルに収まります。型はビルド時に生成されるため、`title` は自動補完され、タイポは `vue-tsc` でエラーになります。`<title />` はビジュアルエディタが対象にできるノードをレンダリングし、`{{ items(props.count) }}` は通常の文字列を返します。
|
|
362
|
+
|
|
363
|
+
</Tab>
|
|
364
|
+
</Tabs>
|
|
365
|
+
|
|
366
|
+
すでに `vue-i18n` をお使いですか?[`@intlayer/vue-i18n` 互換アダプター](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ja/compat/vue-i18n.md)はバンドラーレベルでパッケージをエイリアス化するため、Intlayerがコンテンツを提供しながら、`useI18n()`、`$t`、パイプ複数形、`v-t` をそのまま使い続けることができます。その後のアダプターからの完全移行については[移行ガイド](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ja/migration_from_vue-i18n_to_intlayer.md)で説明しており、[Nuxt専用の移行ガイド](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ja/migration_from_nuxtjs_i18n_to_intlayer.md)も用意されています。
|
|
367
|
+
|
|
368
|
+
## 採用を決める前のチェックポイント
|
|
369
|
+
|
|
370
|
+
機能比較表はライブラリが現在何ができるかを示しますが、以下のポイントは実際に運用したときの体験を示します。
|
|
371
|
+
|
|
372
|
+
**リポジトリのアクティビティを確認する。**
|
|
373
|
+
|
|
374
|
+
コミット頻度、Issueへの対応速度、最新のマイナーリリースが今年行われたかどうかを確認してください。メンテナーのいない優れた設計は、いずれ移行作業を強いられることになります。
|
|
375
|
+
|
|
376
|
+
**npmのダウンロード数だけで選ばない。**
|
|
377
|
+
|
|
378
|
+
最も多くインストールされているライブラリは、最初にリリースされたものであり、必ずしも2026年のVueコードベースに最も適したものであるとは限りません。ダウンロード数は歴史を測る指標であり、現在の適合度を示すものではありません。
|
|
379
|
+
|
|
380
|
+

|
|
381
|
+
|
|
382
|
+
**誰がメンテナーに出資し、何を販売しているかを確認する。**
|
|
383
|
+
|
|
384
|
+
`vue-i18n` は、`next-intl` や `svelte-i18n` と同様にCrowdinの支援を受けています。`i18next` はLocizeの支援を受けています。Tolgee、Paraglide(inlang)、Intlayerはそれぞれ独自のプラットフォームを運営しています。ホスト型翻訳サービスを主な収益源とするベンダーは、ツールチェーン内での無料翻訳を促進する動機が薄くなります。Intlayerはこの中で唯一、自身のAPIキーを使用したCLI経由のAI翻訳と、セルフホスト可能なCMSを提供しています。
|
|
385
|
+
|
|
386
|
+
**AIエージェントに対応しているか?**
|
|
387
|
+
|
|
388
|
+
エージェントは依然としてi18nの扱いに苦戦します。ロケールの記述漏れ、キーの捏造、メッセージ構文の混同などが起きがちです。そのライブラリは、エージェントがコンテンツを一覧取得、補完、テストできるように[Agent Skills](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ja/agent_skills.md)や[MCPサーバー](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ja/mcp_server.md)を提供していますか?また、コンテンツの読み込みはデフォルトで最適化されていますか、それとも四半期ごとに名前空間や遅延インポートを見直す必要がありますか?
|
|
389
|
+
|
|
390
|
+
**導入直後からの型安全性。**
|
|
391
|
+
|
|
392
|
+
「追加の設定で型付けできる」ではなく、「新規インストール状態で存在しないキーを指定すると `tsc` が失敗する」かどうかです。存在しないキーを指定した場合や、1つの翻訳が欠落しているロケールがある場合に何が起きるかを確認してください。
|
|
393
|
+
|
|
394
|
+
**未使用コンテンツの検出。**
|
|
395
|
+
|
|
396
|
+
カタログは増え続ける一方です。Intlayerのビルドは未使用のフィールドをパージしてログを出力します(`build.purge`)。Paraglideは呼び出されないメッセージ関数がTree-shakingされるため、アーキテクチャ的にこれに対処します。それ以外のライブラリでは、不要なキーの整理は手動で行う必要があります。
|
|
397
|
+
|
|
398
|
+
**開発者体験(DX)。**
|
|
399
|
+
|
|
400
|
+
最初の翻訳文字列までのセットアップ時間、ホバー時に翻訳を表示して宣言にジャンプできる[LSP](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ja/lsp.md)または[VS Code拡張機能](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ja/vs_code_extension.md)、補完・テスト・pushを行うための[CLI](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ja/cli/index.md)、コンポーネント内のハードコードされた文字列を抽出してキーごとに管理する手間をなくす[コンパイラー](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ja/compiler.md)や抽出ツール、そして開発者以外がPull Requestなしでコンテンツを編集できる手段([ビジュアルエディタ](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ja/intlayer_visual_editor.md)や[CMS](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ja/intlayer_CMS.md))が用意されているかを確認してください。
|
|
401
|
+
|
|
402
|
+
## よくある質問
|
|
403
|
+
|
|
404
|
+
<FAQ>
|
|
405
|
+
|
|
406
|
+
<Question title="2026年でもvue-i18nは依然として適切なデフォルトの選択肢ですか?">
|
|
407
|
+
|
|
408
|
+
ほとんどのVueアプリにおいては「はい」です。エコシステムが最も大きく、ドキュメントも充実しており、コストも予測可能です。重いランタイム、独自の複数形フォーマット、手動で構築・維持が必要なルート単位のスコープ化などがそのコストにあたります。
|
|
409
|
+
|
|
410
|
+
</Question>
|
|
411
|
+
|
|
412
|
+
<Question title="Nuxtでは@nuxtjs/i18nを使うべきですか、それともvue-i18nを手動で設定すべきですか?">
|
|
413
|
+
|
|
414
|
+
ルーティングが特殊な場合やページ数がごく少ない場合を除き、モジュールを使用してください。手動で構築する場合、ロケールルート、ミドルウェア、`hreflang`、サイトマップを自前で再構築する必要があり、これらは見た目以上に複雑です。
|
|
415
|
+
|
|
416
|
+
</Question>
|
|
417
|
+
|
|
418
|
+
<Question title="コンパイラベースのライブラリは必要ですか?">
|
|
419
|
+
|
|
420
|
+
バンドルサイズ、SSRペイロード、生成される型、ビルド時のキー欠落チェックが実際の要件である場合にのみ必要です。[コンパイラ vs 宣言的 i18n](https://github.com/aymericzip/intlayer/blob/main/docs/blog/ja/compiler_vs_declarative_i18n.md)の記事では、コンパイラがもたらすメリットと注意すべき点について解説しています。
|
|
421
|
+
|
|
422
|
+
</Question>
|
|
423
|
+
|
|
424
|
+
<Question title="ライブラリの選択はSEOに影響しますか?">
|
|
425
|
+
|
|
426
|
+
間接的に影響します。クローラーはルーティング、`hreflang`、`<html lang>`、およびサーバーレンダリングされたHTML内にテキストが存在するかどうかを評価します。詳細は[hreflangガイド](https://github.com/aymericzip/intlayer/blob/main/docs/blog/ja/hreflang_guide_multilingual_seo.md)を参照してください。
|
|
427
|
+
|
|
428
|
+
</Question>
|
|
429
|
+
|
|
430
|
+
</FAQ>
|
|
431
|
+
|
|
432
|
+
## さらに詳しく
|
|
433
|
+
|
|
434
|
+
- [Vue i18n ベンチマーク: バンドルサイズ、漏洩、ロケール切り替え時間](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ja/benchmark/vue.md)
|
|
435
|
+
- [Vue i18n: vue-i18nの仕組みと課題点](https://github.com/aymericzip/intlayer/blob/main/docs/blog/ja/list_i18n_technologies/frameworks/vue.md)および[Nuxt i18nの記事](https://github.com/aymericzip/intlayer/blob/main/docs/blog/ja/list_i18n_technologies/frameworks/nuxt.md)
|
|
436
|
+
- [vue-i18n vs Intlayer 機能別徹底比較](https://github.com/aymericzip/intlayer/blob/main/docs/blog/ja/vue-i18n_vs_intlayer.md)および[vue-i18n vs Intlayer ベンチマーク](https://github.com/aymericzip/intlayer/blob/main/docs/blog/ja/vue-i18n_vs_intlayer_benchmark.md)
|
|
437
|
+
- [vue-i18nは時代遅れか?](https://github.com/aymericzip/intlayer/blob/main/docs/blog/ja/is_vue-i18n_outdated.md)
|
|
438
|
+
- [JavaScript i18nの歴史](https://github.com/aymericzip/intlayer/blob/main/docs/blog/ja/history_of_i18n.md)
|
|
439
|
+
- [コンパイラ vs 宣言的 i18n](https://github.com/aymericzip/intlayer/blob/main/docs/blog/ja/compiler_vs_declarative_i18n.md)
|
|
440
|
+
- [コンポーネント単位 vs 集中管理 i18n](https://github.com/aymericzip/intlayer/blob/main/docs/blog/ja/per-component_vs_centralized_i18n.md)
|
|
441
|
+
- [Vite + Vueアプリでi18nをセットアップする](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ja/intlayer_with_vite+vue.md)および[Nuxtアプリでのセットアップ](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ja/intlayer_with_nuxt.md)
|
|
442
|
+
- 他フレームワーク向けガイド: [React](https://github.com/aymericzip/intlayer/blob/main/docs/blog/ja/how_to_pick_react_i18n_library.md)、[Svelte](https://github.com/aymericzip/intlayer/blob/main/docs/blog/ja/how_to_pick_svelte_i18n_library.md)、[Solid](https://github.com/aymericzip/intlayer/blob/main/docs/blog/ja/how_to_pick_solid_i18n_library.md)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
createdAt: 2026-09-02
|
|
3
|
-
updatedAt: 2026-09-
|
|
3
|
+
updatedAt: 2026-09-16
|
|
4
4
|
title: 2026年においてi18nextは時代遅れなのか?
|
|
5
5
|
description: i18nextは数百万のWebサイトで利用されていますが、2011年設計のランタイムアーキテクチャには限界も見え始めています。バンドルサイズ、Tree-shakingの制約、進化の停滞を分析します。
|
|
6
6
|
keywords:
|
|
@@ -125,6 +125,10 @@ Next.js環境において、`next-i18next`は素の状態と比較して**76.7 K
|
|
|
125
125
|
|
|
126
126
|
デフォルト設定では、対象ルートに配信されるテキストの約**90%**が他ページ用のデータです。名前空間の手動分割は維持コストが高く、人為的ミスの原因になりやすいのが実情です。
|
|
127
127
|
|
|
128
|
+
以下のグラフは、1〜10ページを1〜10言語に翻訳した理論上のアプリ(1ページあたり約30KBのテキスト)のコンテンツ量を推定したものです。ロケールごとの動的読み込みは言語の軸を取り除き、コンポーネントやルート単位でコンテンツをスコープすることはページの軸を取り除きます。両方を組み合わせた場合のみ、コンテンツ量は一定に保たれます。
|
|
129
|
+
|
|
130
|
+

|
|
131
|
+
|
|
128
132
|
**ハイドレーション速度の差:**
|
|
129
133
|
|
|
130
134
|
`react-i18next`コンポーネントのハイドレーションに**85 ms**を要したのに対し、Intlayerは**24 ms**でした。巨大なJSON構造をクライアントコンポーネントへ渡す処理が、初期描画の応答性を低下させます。
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
createdAt: 2026-09-02
|
|
3
|
-
updatedAt: 2026-09-
|
|
3
|
+
updatedAt: 2026-09-16
|
|
4
4
|
title: 2026年においてnext-intlは時代遅れなのか?
|
|
5
5
|
description: next-intlはNext.js App Routerの定番となりました。しかし、ランタイムによるバンドルの肥大化や手動での名前空間管理という課題は残されています。
|
|
6
6
|
keywords:
|
|
@@ -127,6 +127,10 @@ export default async function RootLayout({ children, params }) {
|
|
|
127
127
|
|
|
128
128
|
JSONファイルを名前空間ごとに分けることで緩和できますが、どのルートにどの名前空間が必要かを人間が管理し続けるのは骨が折れる作業です。
|
|
129
129
|
|
|
130
|
+
以下のグラフは、1〜10ページを1〜10言語に翻訳した理論上のアプリ(1ページあたり約30KBのテキスト)のコンテンツ量を推定したものです。ロケールごとの動的読み込みは言語の軸を取り除き、コンポーネントやルート単位でコンテンツをスコープすることはページの軸を取り除きます。両方を組み合わせた場合のみ、コンテンツ量は一定に保たれます。
|
|
131
|
+
|
|
132
|
+

|
|
133
|
+
|
|
130
134
|
Intlayerはこの問題を静的解析で解決します。[Intlayerコンパイラ](https://intlayer.org/ja/doc/compiler)が該当ルートで使用されている文言だけを過不足なく抽出するため、ページ間のデータ漏洩率は**0.0%**となります。
|
|
131
135
|
|
|
132
136
|
## next-intlがTree-shakingを阻害する要因
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
createdAt: 2026-09-02
|
|
3
|
-
updatedAt: 2026-09-
|
|
3
|
+
updatedAt: 2026-09-16
|
|
4
4
|
title: 2026年においてvue-i18nは時代遅れなのか?
|
|
5
5
|
description: vue-i18nは10年以上にわたりVueとNuxtの標準として親しまれてきました。しかしベンチマークではWebで最も重いi18nランタイムという結果に。その理由を紐解きます。
|
|
6
6
|
keywords:
|
|
@@ -116,6 +116,12 @@ Vue自体のフットプリントが非常に小さいため(約31 KB)、`vu
|
|
|
116
116
|
|
|
117
117
|
辞書が重複してバンドルされるため、`vue-i18n`を使ったスコープ付きコンポーネントの平均サイズは196 KBに達しました。一方、Intlayerでは**6.5 KB**です。
|
|
118
118
|
|
|
119
|
+
**リークの増え方:**
|
|
120
|
+
|
|
121
|
+
以下のグラフは、1〜10ページを1〜10言語に翻訳した理論上のアプリ(1ページあたり約30KBのテキスト)のコンテンツ量を推定したものです。ロケールごとの動的読み込みは言語の軸を取り除き、コンポーネントやルート単位でコンテンツをスコープすることはページの軸を取り除きます。両方を組み合わせた場合のみ、コンテンツ量は一定に保たれます。
|
|
122
|
+
|
|
123
|
+

|
|
124
|
+
|
|
119
125
|
## なぜvue-i18nは重いのか?
|
|
120
126
|
|
|
121
127
|
### ブラウザへ同梱されるASTコンパイラ
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
createdAt: 2025-08-23
|
|
3
|
-
updatedAt: 2026-
|
|
3
|
+
updatedAt: 2026-09-16
|
|
4
4
|
title: "next-i18next vs next-intl vs Intlayer - 完全な翻訳ガイド: next-i18next vs next-intl vs Intlayer: 2026 Comparison"
|
|
5
5
|
description: バンドルサイズ、SEO、パフォーマンス、保守性のための最良のソリューション。2026年にNext.js ウェブサイトを多言語化しましょう。LLM翻訳、Agent Skills & MCP。
|
|
6
6
|
keywords:
|
|
@@ -22,7 +22,7 @@ author: aymericzip
|
|
|
22
22
|
|
|
23
23
|
<TOC/>
|
|
24
24
|
|
|
25
|
-

|
|
26
26
|
|
|
27
27
|
Next.js向けの3つのi18nオプション、next-i18next、next-intl、Intlayerの類似点と相違点を見ていきましょう。
|
|
28
28
|
|
|
@@ -134,6 +134,10 @@ Next.jsは国際化されたルーティング(例:ロケールセグメン
|
|
|
134
134
|
|
|
135
135
|
> `/fr/about` ページにいる場合、`/en/about` ページのコンテンツを読み込みたくない
|
|
136
136
|
|
|
137
|
+
以下のグラフは、1〜10ページを1〜10言語に翻訳した理論上のアプリ(1ページあたり約30KBのテキスト)のコンテンツ量を推定したものです。ロケールごとの動的読み込みは言語の軸を取り除き、コンポーネントやルート単位でコンテンツをスコープすることはページの軸を取り除きます。両方を組み合わせた場合のみ、コンテンツ量は一定に保たれます。
|
|
138
|
+
|
|
139
|
+

|
|
140
|
+
|
|
137
141
|
改めて、これら3つのソリューションはこれらの問題を認識しており、これらの最適化を管理することができます。3つのソリューションの違いはDX(開発者体験)にあります。
|
|
138
142
|
|
|
139
143
|
`next-intl` と `next-i18next` は翻訳を管理するために集中管理型のアプローチを使用しており、ロケールやサブファイルごとにJSONを分割することが可能です。`next-i18next` ではJSONファイルを「ネームスペース」と呼び、`next-intl` ではメッセージを宣言することができます。`intlayer` ではJSONファイルを「辞書」と呼びます。
|
|
@@ -156,9 +160,9 @@ Next.jsは国際化されたルーティング(例:ロケールセグメン
|
|
|
156
160
|
|
|
157
161
|
以下は、vite + react アプリケーションで `intlayer` を使用したバンドルサイズ最適化の影響の例です:
|
|
158
162
|
|
|
159
|
-
| 最適化されたバンドル
|
|
160
|
-
|
|
|
161
|
-
|  |  |
|
|
162
166
|
|
|
163
167
|
## TypeScript と安全性
|
|
164
168
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
createdAt: 2025-09-10
|
|
3
|
-
updatedAt:
|
|
3
|
+
updatedAt: 2026-09-16
|
|
4
4
|
title: "コンポーネント単位 vs 集中型 i18n: Intlayer を用いた新しいアプローチ"
|
|
5
5
|
description: React の国際化戦略を深掘りし、集中型、キー単位(per-key)、コンポーネント単位の各アプローチを比較し、Intlayer を紹介します。
|
|
6
6
|
keywords:
|
|
@@ -63,6 +63,7 @@ extension Localization on String {
|
|
|
63
63
|
- キー単位、またはコンポーネント単位でコンテンツ取得を細分化する。
|
|
64
64
|
|
|
65
65
|
</Column>
|
|
66
|
+
|
|
66
67
|
</Columns>
|
|
67
68
|
|
|
68
69
|
> このブログでは、すでに解説したためコンパイラベースのソリューションには焦点を当てません: [コンパイラ vs 宣言型 i18n](https://github.com/aymericzip/intlayer/blob/main/docs/blog/ja/compiler_vs_declarative_i18n.md).
|
|
@@ -80,6 +81,10 @@ extension Localization on String {
|
|
|
80
81
|
もちろん、ライブラリの作者はこれらの制約を認識しており、回避策を提供しています。
|
|
81
82
|
その中には:ネームスペースに分割すること、JSONファイルを動的に読み込むこと(`await import()`)、あるいはビルド時にコンテンツをパージすることなどがあります。
|
|
82
83
|
|
|
84
|
+
以下のグラフは、1〜10ページを1〜10言語に翻訳した理論上のアプリ(1ページあたり約30KBのテキスト)のコンテンツ量を推定したものです。ロケールごとの動的読み込みは言語の軸を取り除き、コンポーネントやルート単位でコンテンツをスコープすることはページの軸を取り除きます。両方を組み合わせた場合のみ、コンテンツ量は一定に保たれます。
|
|
85
|
+
|
|
86
|
+

|
|
87
|
+
|
|
83
88
|
同時に、コンテンツを動的に読み込むとサーバーへの追加リクエストが発生することを知っておくべきです。追加の `useState` や他のフックごとに、追加のサーバーリクエストが必要になります。
|
|
84
89
|
|
|
85
90
|
> この点を解決するために、Intlayer は複数のコンテンツ定義を同じキーの下にグループ化することを提案します。Intlayer はその後、それらのコンテンツをマージします。
|
|
@@ -112,9 +117,9 @@ extension Localization on String {
|
|
|
112
117
|
|
|
113
118
|
最初の例はロケールごとの遅延読み込み(lazy-loaded)翻訳や namespace 分割を含んでいません。2番目の例はコンテンツのパージ(不要な翻訳の削除)と翻訳の動的ロードを含みます。
|
|
114
119
|
|
|
115
|
-
| 最適化されたバンドル
|
|
116
|
-
|
|
|
117
|
-
|  |  |
|
|
118
123
|
|
|
119
124
|
名前空間のおかげで、次のような構成から移行しました:
|
|
120
125
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
createdAt: 2025-01-02
|
|
3
|
-
updatedAt:
|
|
3
|
+
updatedAt: 2026-09-16
|
|
4
4
|
title: react-i18next vs react-intl vs Intlayer
|
|
5
5
|
description: Reactアプリの国際化(i18n)のためにreact-i18nextをnext-intlおよびIntlayerと統合する方法
|
|
6
6
|
keywords:
|
|
@@ -104,6 +104,10 @@ author: aymericzip
|
|
|
104
104
|
|
|
105
105
|
**なぜ重要か:** バンドルサイズが小さくなり、未使用の文字列が減ることで、起動時間やナビゲーションのパフォーマンスが向上します。
|
|
106
106
|
|
|
107
|
+
以下のグラフは、1〜10ページを1〜10言語に翻訳した理論上のアプリ(1ページあたり約30KBのテキスト)のコンテンツ量を推定したものです。ロケールごとの動的読み込みは言語の軸を取り除き、コンポーネントやルート単位でコンテンツをスコープすることはページの軸を取り除きます。両方を組み合わせた場合のみ、コンテンツ量は一定に保たれます。
|
|
108
|
+
|
|
109
|
+

|
|
110
|
+
|
|
107
111
|
### 6) DX、ツール&メンテナンス
|
|
108
112
|
|
|
109
113
|
- **react-intl / react-i18next**: 幅広いコミュニティエコシステムがあり、編集ワークフローには通常、外部のローカリゼーションプラットフォームを採用します。
|