@intlayer/docs 9.5.2 → 9.5.4-canary.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -9
- 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/i18next_vs_intlayer-i18next.md +327 -0
- package/blog/ar/i18next_vs_intlayer.md +445 -0
- package/blog/ar/is_i18next_outdated.md +6 -2
- package/blog/ar/is_next-intl_outdated.md +6 -2
- package/blog/ar/is_vue-i18n_outdated.md +8 -2
- package/blog/ar/lingui_vs_intlayer-lingui.md +304 -0
- package/blog/ar/lingui_vs_intlayer.md +381 -0
- package/blog/ar/next-i18next_vs_next-intl_vs_intlayer.md +9 -5
- package/blog/ar/next-intl_vs_intlayer-next-intl.md +309 -0
- package/blog/ar/next-intl_vs_intlayer.md +397 -0
- package/blog/ar/per-component_vs_centralized_i18n.md +9 -4
- package/blog/ar/react-i18next_vs_react-intl_vs_intlayer.md +6 -2
- package/blog/ar/vue-i18n_vs_intlayer-vue-i18n.md +286 -0
- package/blog/ar/vue-i18n_vs_intlayer_benchmark.md +0 -0
- 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/i18next_vs_intlayer-i18next.md +327 -0
- package/blog/de/i18next_vs_intlayer.md +445 -0
- package/blog/de/is_i18next_outdated.md +6 -2
- package/blog/de/is_next-intl_outdated.md +6 -2
- package/blog/de/is_vue-i18n_outdated.md +8 -2
- package/blog/de/lingui_vs_intlayer-lingui.md +304 -0
- package/blog/de/lingui_vs_intlayer.md +381 -0
- package/blog/de/next-i18next_vs_next-intl_vs_intlayer.md +10 -6
- package/blog/de/next-intl_vs_intlayer-next-intl.md +309 -0
- package/blog/de/next-intl_vs_intlayer.md +415 -0
- 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/de/vue-i18n_vs_intlayer-vue-i18n.md +288 -0
- package/blog/de/vue-i18n_vs_intlayer_benchmark.md +355 -0
- 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/i18next_vs_intlayer-i18next.md +327 -0
- package/blog/en/i18next_vs_intlayer.md +445 -0
- package/blog/en/is_i18next_outdated.md +6 -2
- package/blog/en/is_next-intl_outdated.md +6 -2
- package/blog/en/is_vue-i18n_outdated.md +8 -2
- package/blog/en/lingui_vs_intlayer-lingui.md +304 -0
- package/blog/en/lingui_vs_intlayer.md +381 -0
- package/blog/en/list_i18n_technologies/frameworks/react-router.md +2 -3
- package/blog/en/next-i18next_vs_next-intl_vs_intlayer.md +10 -6
- package/blog/en/next-intl_vs_intlayer-next-intl.md +309 -0
- package/blog/en/next-intl_vs_intlayer.md +415 -0
- package/blog/en/per-component_vs_centralized_i18n.md +9 -4
- package/blog/en/react-i18next_vs_react-intl_vs_intlayer.md +6 -2
- package/blog/en/vue-i18n_vs_intlayer-vue-i18n.md +288 -0
- package/blog/en/vue-i18n_vs_intlayer.md +1 -1
- package/blog/en/vue-i18n_vs_intlayer_benchmark.md +361 -0
- 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/i18next_vs_intlayer-i18next.md +327 -0
- package/blog/en-GB/i18next_vs_intlayer.md +445 -0
- package/blog/en-GB/is_i18next_outdated.md +6 -2
- package/blog/en-GB/is_next-intl_outdated.md +6 -2
- package/blog/en-GB/is_vue-i18n_outdated.md +8 -2
- package/blog/en-GB/lingui_vs_intlayer-lingui.md +304 -0
- package/blog/en-GB/lingui_vs_intlayer.md +381 -0
- package/blog/en-GB/next-i18next_vs_next-intl_vs_intlayer.md +10 -6
- package/blog/en-GB/next-intl_vs_intlayer-next-intl.md +309 -0
- package/blog/en-GB/next-intl_vs_intlayer.md +415 -0
- package/blog/en-GB/per-component_vs_centralized_i18n.md +9 -4
- package/blog/en-GB/react-i18next_vs_react-intl_vs_intlayer.md +6 -2
- package/blog/en-GB/vue-i18n_vs_intlayer-vue-i18n.md +288 -0
- package/blog/en-GB/vue-i18n_vs_intlayer.md +1 -1
- package/blog/en-GB/vue-i18n_vs_intlayer_benchmark.md +245 -0
- 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/i18next_vs_intlayer-i18next.md +327 -0
- package/blog/es/i18next_vs_intlayer.md +445 -0
- package/blog/es/is_i18next_outdated.md +6 -2
- package/blog/es/is_next-intl_outdated.md +6 -2
- package/blog/es/is_vue-i18n_outdated.md +8 -2
- package/blog/es/lingui_vs_intlayer-lingui.md +304 -0
- package/blog/es/lingui_vs_intlayer.md +381 -0
- package/blog/es/next-i18next_vs_next-intl_vs_intlayer.md +10 -6
- package/blog/es/next-intl_vs_intlayer-next-intl.md +309 -0
- package/blog/es/next-intl_vs_intlayer.md +417 -0
- 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/es/vue-i18n_vs_intlayer-vue-i18n.md +288 -0
- package/blog/es/vue-i18n_vs_intlayer_benchmark.md +363 -0
- 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/i18next_vs_intlayer-i18next.md +327 -0
- package/blog/fr/i18next_vs_intlayer.md +445 -0
- package/blog/fr/is_i18next_outdated.md +6 -2
- package/blog/fr/is_next-intl_outdated.md +6 -2
- package/blog/fr/is_vue-i18n_outdated.md +8 -2
- package/blog/fr/lingui_vs_intlayer-lingui.md +304 -0
- package/blog/fr/lingui_vs_intlayer.md +381 -0
- package/blog/fr/next-i18next_vs_next-intl_vs_intlayer.md +10 -6
- package/blog/fr/next-intl_vs_intlayer-next-intl.md +309 -0
- package/blog/fr/next-intl_vs_intlayer.md +417 -0
- 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/fr/vue-i18n_vs_intlayer-vue-i18n.md +287 -0
- package/blog/fr/vue-i18n_vs_intlayer_benchmark.md +39 -0
- 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/i18next_vs_intlayer-i18next.md +327 -0
- package/blog/hi/i18next_vs_intlayer.md +445 -0
- package/blog/hi/is_i18next_outdated.md +6 -2
- package/blog/hi/is_next-intl_outdated.md +6 -2
- package/blog/hi/is_vue-i18n_outdated.md +8 -2
- package/blog/hi/lingui_vs_intlayer-lingui.md +304 -0
- package/blog/hi/lingui_vs_intlayer.md +381 -0
- package/blog/hi/next-i18next_vs_next-intl_vs_intlayer.md +8 -4
- package/blog/hi/next-intl_vs_intlayer-next-intl.md +309 -0
- package/blog/hi/next-intl_vs_intlayer.md +397 -0
- package/blog/hi/per-component_vs_centralized_i18n.md +9 -4
- package/blog/hi/react-i18next_vs_react-intl_vs_intlayer.md +6 -2
- package/blog/hi/vue-i18n_vs_intlayer-vue-i18n.md +288 -0
- package/blog/hi/vue-i18n_vs_intlayer_benchmark.md +0 -0
- 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/i18next_vs_intlayer-i18next.md +327 -0
- package/blog/id/i18next_vs_intlayer.md +445 -0
- package/blog/id/is_i18next_outdated.md +6 -2
- package/blog/id/is_next-intl_outdated.md +6 -2
- package/blog/id/is_vue-i18n_outdated.md +8 -2
- package/blog/id/lingui_vs_intlayer-lingui.md +304 -0
- package/blog/id/lingui_vs_intlayer.md +381 -0
- package/blog/id/next-i18next_vs_next-intl_vs_intlayer.md +10 -6
- package/blog/id/next-intl_vs_intlayer-next-intl.md +310 -0
- package/blog/id/next-intl_vs_intlayer.md +397 -0
- package/blog/id/per-component_vs_centralized_i18n.md +9 -4
- package/blog/id/react-i18next_vs_react-intl_vs_intlayer.md +6 -2
- package/blog/id/vue-i18n_vs_intlayer-vue-i18n.md +36 -0
- package/blog/id/vue-i18n_vs_intlayer.md +1 -1
- package/blog/id/vue-i18n_vs_intlayer_benchmark.md +41 -0
- 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/i18next_vs_intlayer-i18next.md +327 -0
- package/blog/it/i18next_vs_intlayer.md +445 -0
- package/blog/it/is_i18next_outdated.md +6 -2
- package/blog/it/is_next-intl_outdated.md +6 -2
- package/blog/it/is_vue-i18n_outdated.md +8 -2
- package/blog/it/lingui_vs_intlayer-lingui.md +304 -0
- package/blog/it/lingui_vs_intlayer.md +381 -0
- package/blog/it/next-i18next_vs_next-intl_vs_intlayer.md +10 -6
- package/blog/it/next-intl_vs_intlayer-next-intl.md +309 -0
- package/blog/it/next-intl_vs_intlayer.md +418 -0
- 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/it/vue-i18n_vs_intlayer-vue-i18n.md +288 -0
- package/blog/it/vue-i18n_vs_intlayer_benchmark.md +34 -0
- 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/i18next_vs_intlayer-i18next.md +327 -0
- package/blog/ja/i18next_vs_intlayer.md +447 -0
- package/blog/ja/is_i18next_outdated.md +6 -2
- package/blog/ja/is_next-intl_outdated.md +6 -2
- package/blog/ja/is_vue-i18n_outdated.md +8 -2
- package/blog/ja/lingui_vs_intlayer-lingui.md +304 -0
- package/blog/ja/lingui_vs_intlayer.md +381 -0
- package/blog/ja/next-i18next_vs_next-intl_vs_intlayer.md +10 -6
- package/blog/ja/next-intl_vs_intlayer-next-intl.md +310 -0
- package/blog/ja/next-intl_vs_intlayer.md +422 -0
- package/blog/ja/per-component_vs_centralized_i18n.md +9 -4
- package/blog/ja/react-i18next_vs_react-intl_vs_intlayer.md +6 -2
- package/blog/ja/vue-i18n_vs_intlayer-vue-i18n.md +288 -0
- package/blog/ja/vue-i18n_vs_intlayer.md +1 -1
- package/blog/ja/vue-i18n_vs_intlayer_benchmark.md +0 -0
- 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/i18next_vs_intlayer-i18next.md +327 -0
- package/blog/ko/i18next_vs_intlayer.md +447 -0
- package/blog/ko/is_i18next_outdated.md +6 -2
- package/blog/ko/is_next-intl_outdated.md +6 -2
- package/blog/ko/is_vue-i18n_outdated.md +8 -2
- package/blog/ko/lingui_vs_intlayer-lingui.md +304 -0
- package/blog/ko/lingui_vs_intlayer.md +381 -0
- package/blog/ko/next-i18next_vs_next-intl_vs_intlayer.md +10 -6
- package/blog/ko/next-intl_vs_intlayer-next-intl.md +309 -0
- package/blog/ko/next-intl_vs_intlayer.md +397 -0
- package/blog/ko/per-component_vs_centralized_i18n.md +9 -4
- package/blog/ko/react-i18next_vs_react-intl_vs_intlayer.md +6 -2
- package/blog/ko/vue-i18n_vs_intlayer-vue-i18n.md +288 -0
- package/blog/ko/vue-i18n_vs_intlayer.md +1 -1
- package/blog/ko/vue-i18n_vs_intlayer_benchmark.md +366 -0
- 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/i18next_vs_intlayer-i18next.md +327 -0
- package/blog/pl/i18next_vs_intlayer.md +445 -0
- package/blog/pl/is_i18next_outdated.md +6 -2
- package/blog/pl/is_next-intl_outdated.md +6 -2
- package/blog/pl/is_vue-i18n_outdated.md +8 -2
- package/blog/pl/lingui_vs_intlayer-lingui.md +304 -0
- package/blog/pl/lingui_vs_intlayer.md +381 -0
- package/blog/pl/next-i18next_vs_next-intl_vs_intlayer.md +10 -6
- package/blog/pl/next-intl_vs_intlayer-next-intl.md +309 -0
- package/blog/pl/next-intl_vs_intlayer.md +397 -0
- package/blog/pl/per-component_vs_centralized_i18n.md +9 -4
- package/blog/pl/react-i18next_vs_react-intl_vs_intlayer.md +6 -2
- package/blog/pl/vue-i18n_vs_intlayer-vue-i18n.md +289 -0
- package/blog/pl/vue-i18n_vs_intlayer.md +1 -1
- package/blog/pl/vue-i18n_vs_intlayer_benchmark.md +0 -0
- 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/i18next_vs_intlayer-i18next.md +327 -0
- package/blog/pt/i18next_vs_intlayer.md +445 -0
- package/blog/pt/is_i18next_outdated.md +6 -2
- package/blog/pt/is_next-intl_outdated.md +6 -2
- package/blog/pt/is_vue-i18n_outdated.md +8 -2
- package/blog/pt/lingui_vs_intlayer-lingui.md +304 -0
- package/blog/pt/lingui_vs_intlayer.md +381 -0
- package/blog/pt/next-i18next_vs_next-intl_vs_intlayer.md +10 -6
- package/blog/pt/next-intl_vs_intlayer-next-intl.md +309 -0
- package/blog/pt/next-intl_vs_intlayer.md +411 -0
- 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/pt/vue-i18n_vs_intlayer-vue-i18n.md +288 -0
- package/blog/pt/vue-i18n_vs_intlayer_benchmark.md +0 -0
- 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/i18next_vs_intlayer-i18next.md +327 -0
- package/blog/ru/i18next_vs_intlayer.md +445 -0
- package/blog/ru/is_i18next_outdated.md +6 -2
- package/blog/ru/is_next-intl_outdated.md +6 -2
- package/blog/ru/is_vue-i18n_outdated.md +8 -2
- package/blog/ru/lingui_vs_intlayer-lingui.md +304 -0
- package/blog/ru/lingui_vs_intlayer.md +381 -0
- package/blog/ru/next-i18next_vs_next-intl_vs_intlayer.md +9 -5
- package/blog/ru/next-intl_vs_intlayer-next-intl.md +309 -0
- package/blog/ru/next-intl_vs_intlayer.md +417 -0
- 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/ru/vue-i18n_vs_intlayer-vue-i18n.md +288 -0
- package/blog/ru/vue-i18n_vs_intlayer_benchmark.md +54 -0
- 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/i18next_vs_intlayer-i18next.md +327 -0
- package/blog/tr/i18next_vs_intlayer.md +445 -0
- package/blog/tr/is_i18next_outdated.md +6 -2
- package/blog/tr/is_next-intl_outdated.md +6 -2
- package/blog/tr/is_vue-i18n_outdated.md +8 -2
- package/blog/tr/lingui_vs_intlayer-lingui.md +304 -0
- package/blog/tr/lingui_vs_intlayer.md +381 -0
- package/blog/tr/next-i18next_vs_next-intl_vs_intlayer.md +10 -6
- package/blog/tr/next-intl_vs_intlayer-next-intl.md +309 -0
- package/blog/tr/next-intl_vs_intlayer.md +397 -0
- package/blog/tr/per-component_vs_centralized_i18n.md +9 -4
- package/blog/tr/react-i18next_vs_react-intl_vs_intlayer.md +6 -2
- package/blog/tr/vue-i18n_vs_intlayer-vue-i18n.md +288 -0
- package/blog/tr/vue-i18n_vs_intlayer.md +1 -1
- package/blog/tr/vue-i18n_vs_intlayer_benchmark.md +0 -0
- 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/i18next_vs_intlayer-i18next.md +327 -0
- package/blog/uk/i18next_vs_intlayer.md +445 -0
- package/blog/uk/is_i18next_outdated.md +6 -2
- package/blog/uk/is_next-intl_outdated.md +6 -2
- package/blog/uk/is_vue-i18n_outdated.md +8 -2
- package/blog/uk/lingui_vs_intlayer-lingui.md +304 -0
- package/blog/uk/lingui_vs_intlayer.md +381 -0
- package/blog/uk/next-i18next_vs_next-intl_vs_intlayer.md +10 -6
- package/blog/uk/next-intl_vs_intlayer-next-intl.md +309 -0
- package/blog/uk/next-intl_vs_intlayer.md +397 -0
- package/blog/uk/per-component_vs_centralized_i18n.md +9 -4
- package/blog/uk/react-i18next_vs_react-intl_vs_intlayer.md +6 -2
- package/blog/uk/vue-i18n_vs_intlayer-vue-i18n.md +270 -0
- package/blog/uk/vue-i18n_vs_intlayer.md +1 -1
- package/blog/uk/vue-i18n_vs_intlayer_benchmark.md +0 -0
- 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/i18next_vs_intlayer-i18next.md +327 -0
- package/blog/vi/i18next_vs_intlayer.md +445 -0
- package/blog/vi/is_i18next_outdated.md +6 -2
- package/blog/vi/is_next-intl_outdated.md +6 -2
- package/blog/vi/is_vue-i18n_outdated.md +8 -2
- package/blog/vi/lingui_vs_intlayer-lingui.md +304 -0
- package/blog/vi/lingui_vs_intlayer.md +381 -0
- package/blog/vi/next-i18next_vs_next-intl_vs_intlayer.md +10 -6
- package/blog/vi/next-intl_vs_intlayer-next-intl.md +309 -0
- package/blog/vi/next-intl_vs_intlayer.md +397 -0
- package/blog/vi/per-component_vs_centralized_i18n.md +9 -4
- package/blog/vi/react-i18next_vs_react-intl_vs_intlayer.md +6 -2
- package/blog/vi/vue-i18n_vs_intlayer-vue-i18n.md +288 -0
- package/blog/vi/vue-i18n_vs_intlayer.md +1 -1
- package/blog/vi/vue-i18n_vs_intlayer_benchmark.md +0 -0
- 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/i18next_vs_intlayer-i18next.md +327 -0
- package/blog/zh/i18next_vs_intlayer.md +445 -0
- package/blog/zh/is_i18next_outdated.md +6 -2
- package/blog/zh/is_next-intl_outdated.md +6 -2
- package/blog/zh/is_vue-i18n_outdated.md +8 -2
- package/blog/zh/lingui_vs_intlayer-lingui.md +304 -0
- package/blog/zh/lingui_vs_intlayer.md +381 -0
- package/blog/zh/next-i18next_vs_next-intl_vs_intlayer.md +10 -6
- package/blog/zh/next-intl_vs_intlayer-next-intl.md +309 -0
- package/blog/zh/next-intl_vs_intlayer.md +422 -0
- package/blog/zh/per-component_vs_centralized_i18n.md +9 -4
- package/blog/zh/react-i18next_vs_react-intl_vs_intlayer.md +6 -2
- package/blog/zh/vue-i18n_vs_intlayer-vue-i18n.md +288 -0
- package/blog/zh/vue-i18n_vs_intlayer.md +1 -1
- package/blog/zh/vue-i18n_vs_intlayer_benchmark.md +30 -0
- package/dist/cjs/generated/blog.entry.cjs +240 -0
- package/dist/cjs/generated/blog.entry.cjs.map +1 -1
- package/dist/cjs/generated/frequentQuestions.entry.cjs +20 -0
- package/dist/cjs/generated/frequentQuestions.entry.cjs.map +1 -1
- package/dist/cjs/index.cjs +1 -1
- package/dist/esm/generated/blog.entry.mjs +240 -0
- package/dist/esm/generated/blog.entry.mjs.map +1 -1
- package/dist/esm/generated/frequentQuestions.entry.mjs +20 -0
- package/dist/esm/generated/frequentQuestions.entry.mjs.map +1 -1
- package/dist/esm/index.mjs +1 -1
- package/dist/types/generated/blog.entry.d.ts +12 -0
- package/dist/types/generated/blog.entry.d.ts.map +1 -1
- package/dist/types/generated/frequentQuestions.entry.d.ts +1 -0
- package/dist/types/generated/frequentQuestions.entry.d.ts.map +1 -1
- package/docs/ar/benchmark/nextjs.md +1 -1
- package/docs/ar/benchmark/solid.md +1 -1
- package/docs/ar/benchmark/svelte.md +1 -1
- package/docs/ar/benchmark/tanstack.md +1 -1
- package/docs/ar/benchmark/vue.md +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 +7 -7
- 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 +22 -22
- 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 +7 -7
- 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/benchmark/nextjs.md +1 -1
- package/docs/de/benchmark/solid.md +1 -1
- package/docs/de/benchmark/svelte.md +1 -1
- package/docs/de/benchmark/tanstack.md +1 -1
- package/docs/de/benchmark/vue.md +1 -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 +7 -7
- 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/benchmark/nextjs.md +1 -1
- package/docs/en/benchmark/solid.md +1 -1
- package/docs/en/benchmark/svelte.md +1 -1
- package/docs/en/benchmark/tanstack.md +1 -1
- package/docs/en/benchmark/vue.md +1 -1
- package/docs/en/bundle_optimization.md +5 -1
- package/docs/en/how_works_intlayer.md +2 -2
- package/docs/en/interest_of_intlayer.md +7 -7
- 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/benchmark/nextjs.md +1 -1
- package/docs/en-GB/benchmark/solid.md +1 -1
- package/docs/en-GB/benchmark/svelte.md +1 -1
- package/docs/en-GB/benchmark/tanstack.md +1 -1
- package/docs/en-GB/benchmark/vue.md +1 -1
- 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 +7 -7
- 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/benchmark/nextjs.md +1 -1
- package/docs/es/benchmark/solid.md +1 -1
- package/docs/es/benchmark/svelte.md +1 -1
- package/docs/es/benchmark/tanstack.md +1 -1
- package/docs/es/benchmark/vue.md +1 -1
- package/docs/es/bundle_optimization.md +5 -1
- package/docs/es/how_works_intlayer.md +2 -2
- package/docs/es/interest_of_intlayer.md +7 -7
- 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/benchmark/nextjs.md +1 -1
- package/docs/fr/benchmark/solid.md +1 -1
- package/docs/fr/benchmark/svelte.md +1 -1
- package/docs/fr/benchmark/tanstack.md +1 -1
- package/docs/fr/benchmark/vue.md +1 -1
- package/docs/fr/bundle_optimization.md +5 -1
- package/docs/fr/how_works_intlayer.md +2 -2
- package/docs/fr/interest_of_intlayer.md +7 -7
- 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/benchmark/nextjs.md +1 -1
- package/docs/hi/benchmark/solid.md +1 -1
- package/docs/hi/benchmark/svelte.md +1 -1
- package/docs/hi/benchmark/tanstack.md +1 -1
- package/docs/hi/benchmark/vue.md +1 -1
- package/docs/hi/bundle_optimization.md +5 -1
- package/docs/hi/how_works_intlayer.md +2 -2
- package/docs/hi/interest_of_intlayer.md +7 -7
- 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/benchmark/nextjs.md +1 -1
- package/docs/id/benchmark/solid.md +1 -1
- package/docs/id/benchmark/svelte.md +1 -1
- package/docs/id/benchmark/tanstack.md +1 -1
- package/docs/id/benchmark/vue.md +1 -1
- package/docs/id/bundle_optimization.md +5 -1
- package/docs/id/how_works_intlayer.md +2 -2
- package/docs/id/interest_of_intlayer.md +7 -7
- 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/benchmark/nextjs.md +1 -1
- package/docs/it/benchmark/solid.md +1 -1
- package/docs/it/benchmark/svelte.md +1 -1
- package/docs/it/benchmark/tanstack.md +1 -1
- package/docs/it/benchmark/vue.md +1 -1
- package/docs/it/bundle_optimization.md +5 -1
- package/docs/it/how_works_intlayer.md +2 -2
- package/docs/it/interest_of_intlayer.md +7 -7
- 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/benchmark/nextjs.md +1 -1
- package/docs/ja/benchmark/solid.md +1 -1
- package/docs/ja/benchmark/svelte.md +1 -1
- package/docs/ja/benchmark/tanstack.md +1 -1
- package/docs/ja/benchmark/vue.md +1 -1
- package/docs/ja/bundle_optimization.md +5 -1
- package/docs/ja/how_works_intlayer.md +2 -2
- package/docs/ja/interest_of_intlayer.md +7 -7
- 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/benchmark/nextjs.md +1 -1
- package/docs/ko/benchmark/solid.md +1 -1
- package/docs/ko/benchmark/svelte.md +1 -1
- package/docs/ko/benchmark/tanstack.md +1 -1
- package/docs/ko/benchmark/vue.md +1 -1
- package/docs/ko/bundle_optimization.md +5 -1
- package/docs/ko/how_works_intlayer.md +2 -2
- package/docs/ko/interest_of_intlayer.md +7 -7
- 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 +7 -7
- 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/benchmark/nextjs.md +1 -1
- package/docs/pl/benchmark/solid.md +1 -1
- package/docs/pl/benchmark/svelte.md +1 -1
- package/docs/pl/benchmark/tanstack.md +1 -1
- package/docs/pl/benchmark/vue.md +1 -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 +7 -7
- 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/benchmark/nextjs.md +1 -1
- package/docs/pt/benchmark/solid.md +1 -1
- package/docs/pt/benchmark/svelte.md +1 -1
- package/docs/pt/benchmark/tanstack.md +1 -1
- package/docs/pt/benchmark/vue.md +1 -1
- package/docs/pt/bundle_optimization.md +5 -1
- package/docs/pt/how_works_intlayer.md +2 -2
- package/docs/pt/interest_of_intlayer.md +7 -7
- 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/benchmark/nextjs.md +1 -1
- package/docs/ru/benchmark/solid.md +1 -1
- package/docs/ru/benchmark/svelte.md +1 -1
- package/docs/ru/benchmark/tanstack.md +1 -1
- package/docs/ru/benchmark/vue.md +1 -1
- package/docs/ru/bundle_optimization.md +5 -1
- package/docs/ru/how_works_intlayer.md +2 -2
- package/docs/ru/interest_of_intlayer.md +7 -7
- 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/benchmark/nextjs.md +1 -1
- package/docs/tr/benchmark/solid.md +1 -1
- package/docs/tr/benchmark/svelte.md +1 -1
- package/docs/tr/benchmark/tanstack.md +1 -1
- package/docs/tr/benchmark/vue.md +1 -1
- package/docs/tr/bundle_optimization.md +5 -1
- package/docs/tr/how_works_intlayer.md +2 -2
- package/docs/tr/interest_of_intlayer.md +7 -7
- 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/benchmark/nextjs.md +1 -1
- package/docs/uk/benchmark/solid.md +1 -1
- package/docs/uk/benchmark/svelte.md +1 -1
- package/docs/uk/benchmark/tanstack.md +1 -1
- package/docs/uk/benchmark/vue.md +1 -1
- package/docs/uk/bundle_optimization.md +5 -1
- package/docs/uk/how_works_intlayer.md +2 -2
- package/docs/uk/interest_of_intlayer.md +7 -7
- 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 +7 -7
- 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/benchmark/nextjs.md +1 -1
- package/docs/vi/benchmark/solid.md +1 -1
- package/docs/vi/benchmark/svelte.md +1 -1
- package/docs/vi/benchmark/tanstack.md +1 -1
- package/docs/vi/benchmark/vue.md +1 -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 +7 -7
- 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/benchmark/nextjs.md +1 -1
- package/docs/zh/benchmark/solid.md +1 -1
- package/docs/zh/benchmark/svelte.md +1 -1
- package/docs/zh/benchmark/tanstack.md +1 -1
- package/docs/zh/benchmark/vue.md +1 -1
- package/docs/zh/bundle_optimization.md +5 -1
- package/docs/zh/how_works_intlayer.md +2 -2
- package/docs/zh/interest_of_intlayer.md +7 -7
- 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 +7 -7
- package/docs/zh-TW/intlayer_with_angular_21.md +1 -1
- package/docs/zh-TW/introduction.md +0 -1
- package/frequent_questions/ar/claude_code_token_consumption.md +152 -0
- package/frequent_questions/de/claude_code_token_consumption.md +152 -0
- package/frequent_questions/en/claude_code_token_consumption.md +152 -0
- package/frequent_questions/en-GB/claude_code_token_consumption.md +152 -0
- package/frequent_questions/es/claude_code_token_consumption.md +152 -0
- package/frequent_questions/fr/claude_code_token_consumption.md +152 -0
- package/frequent_questions/hi/claude_code_token_consumption.md +152 -0
- package/frequent_questions/id/claude_code_token_consumption.md +152 -0
- package/frequent_questions/it/claude_code_token_consumption.md +152 -0
- package/frequent_questions/ja/claude_code_token_consumption.md +152 -0
- package/frequent_questions/ko/claude_code_token_consumption.md +152 -0
- package/frequent_questions/pl/claude_code_token_consumption.md +152 -0
- package/frequent_questions/pt/claude_code_token_consumption.md +152 -0
- package/frequent_questions/ru/claude_code_token_consumption.md +152 -0
- package/frequent_questions/tr/claude_code_token_consumption.md +152 -0
- package/frequent_questions/uk/claude_code_token_consumption.md +152 -0
- package/frequent_questions/vi/claude_code_token_consumption.md +152 -0
- package/frequent_questions/zh/claude_code_token_consumption.md +152 -0
- package/package.json +8 -7
- package/src/generated/blog.entry.ts +240 -0
- package/src/generated/frequentQuestions.entry.ts +20 -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,366 @@
|
|
|
1
|
+
---
|
|
2
|
+
createdAt: 2026-09-13
|
|
3
|
+
updatedAt: 2026-09-13
|
|
4
|
+
title: "vue-i18n vs Intlayer: 2026 벤치마크"
|
|
5
|
+
description: 동일한 Vite + Vue 3 앱에서 측정한 vue-i18n과 Intlayer. 라이브러리 크기, 페이지별 JavaScript, 콘텐츠 누수, 컴포넌트 크기 및 로케일 전환 반응성, 숫자 설명 포함.
|
|
6
|
+
keywords:
|
|
7
|
+
- vue-i18n
|
|
8
|
+
- Intlayer
|
|
9
|
+
- 국제화
|
|
10
|
+
- i18n
|
|
11
|
+
- 벤치마크
|
|
12
|
+
- 번들 크기
|
|
13
|
+
- 블로그
|
|
14
|
+
- Vue
|
|
15
|
+
- Nuxt
|
|
16
|
+
- Vite
|
|
17
|
+
- JavaScript
|
|
18
|
+
slugs:
|
|
19
|
+
- blog
|
|
20
|
+
- vue-i18n-vs-intlayer-benchmark
|
|
21
|
+
author: aymericzip
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
# vue-i18n vs Intlayer | Vue 국제화 (i18n) 벤치마크
|
|
25
|
+
|
|
26
|
+
`vue-i18n`은 Vue를 위한 참조 i18n 라이브러리입니다. Intlayer는 컴파일러 기반의 컴포넌트 범위 대안으로 Vue 통합(`vue-intlayer`)을 제공합니다. 우리는 이미 그들의 [기능과 개발자 경험](https://intlayer.org/blog/vue-i18n-vs-intlayer)을 비교했습니다. 이 글은 앱이 빌드된 후 각각에 소요되는 비용을 살펴봅니다.
|
|
27
|
+
|
|
28
|
+
데이터는 [Benchmark Bloom](https://github.com/intlayer-org/benchmark-bloom)에서 나왔으며, 이는 각 라이브러리로 동일한 애플리케이션을 빌드하고 브라우저가 실제로 다운로드하고 실행하는 것을 기록하는 오픈소스 제품군입니다.
|
|
29
|
+
|
|
30
|
+
<TOC/>
|
|
31
|
+
|
|
32
|
+
> **tl;dr**: 동일한 Vite + Vue 3 앱에서 `vue-i18n`은 페이지당 **134.9 KB**의 gzipped JavaScript를 전달하는 반면, i18n이 없는 앱은 **41.3 KB**입니다. Intlayer는 **57.1 KB**를 전달합니다. `vue-i18n` runtime만 해도 **24.3 KB gzip**의 무게를 가지며 (Intlayer의 3.9 KB의 6배), 모든 페이지는 **외국어 페이지 문자열의 90%**를 포함하고, 격리되어 컴파일된 component는 전역 message tree에 바인딩되어 있어 **196 KB**를 끌어옵니다. `@intlayer/vue-i18n` adapter는 `vue-i18n` API를 유지하면서 페이지당 **47.0 KB**를 기록했습니다.
|
|
33
|
+
|
|
34
|
+
## 요약
|
|
35
|
+
|
|
36
|
+
- **vue-i18n** - Vue 2 / Vue 3를 위한 사실상의 i18n 라이브러리이며 `@nuxtjs/i18n`의 핵심입니다. ICU 스타일 메시지, SFC `<i18n>` 블록, `v-t` 지시문, `d()` / `n()` 포매터, 광범위한 생태계를 지원합니다. 메시지는 `createI18n()`에서 전역 인스턴스로 등록되며, 로케일당 lazy loading은 수동 `setLocaleMessage()` 패턴이고, 라우트당 분할은 직접 구축해야 합니다.
|
|
37
|
+
- **Intlayer** - 컴포넌트 중심 콘텐츠 모델입니다. `.content.ts` 딕셔너리는 이들이 제공하는 컴포넌트 옆에 위치하며, 빌드 타임 컴파일러(`vite-intlayer`)가 이들을 tree-shake하고 컴포넌트 및 로케일별로 lazy-load합니다. 콘텐츠에서 생성된 엄격한 TypeScript 타입이 있으며, 누락된 번역은 빌드 타임에 실패합니다. router / SEO 헬퍼, Visual Editor / CMS, AI 지원 번역을 함께 제공합니다.
|
|
38
|
+
|
|
39
|
+
| 라이브러리 | GitHub Stars | Total Commits | Last Commit | First Version | NPM Version | NPM Downloads |
|
|
40
|
+
| --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- | ------------- | ----------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------- |
|
|
41
|
+
| `aymericzip/intlayer` | [](https://github.com/aymericzip/intlayer/stargazers) | [](https://github.com/aymericzip/intlayer/commits) | [](https://github.com/aymericzip/intlayer/commits) | 2024년 4월 | [](https://www.npmjs.com/package/intlayer) | [](https://www.npmjs.com/package/intlayer) |
|
|
42
|
+
| `intlify/vue-i18n` | [](https://github.com/intlify/vue-i18n/stargazers) | [](https://github.com/intlify/vue-i18n/commits) | [](https://github.com/intlify/vue-i18n/commits) | Dec 2016 | [](https://www.npmjs.com/package/vue-i18n) | [](https://www.npmjs.com/package/vue-i18n) |
|
|
43
|
+
|
|
44
|
+
> 배지는 자동으로 업데이트됩니다. 스냅샷은 시간이 지남에 따라 달라질 수 있습니다.
|
|
45
|
+
|
|
46
|
+
## 기능 비교
|
|
47
|
+
|
|
48
|
+
| 기능 | `vue-intlayer` (Intlayer) | `vue-i18n` |
|
|
49
|
+
| --------------------------------------------- | -------------------------------------------------- | --------------------------------------------------------------------------- |
|
|
50
|
+
| **컴포넌트 근처의 번역** | ✅ 예, 각 컴포넌트와 함께 배치된 `.content.ts` | ✅ SFC `<i18n>` 블록을 통해 (선택적); 글로벌 카탈로그가 일반적인 설정입니다 |
|
|
51
|
+
| **TypeScript 통합** | ✅ 콘텐츠에서 자동 생성된 엄격한 타입 | ✅ 좋은 타입; 엄격한 키 안전성은 스키마 타입과 규율 필요 |
|
|
52
|
+
| **누락된 번역 감지** | ✅ TypeScript 에러 + 빌드 타임 에러/경고 | ⚠️ 런타임 폴백 + 콘솔 경고 |
|
|
53
|
+
| **풍부한 콘텐츠 (컴포넌트 / Markdown)** | ✅ 직접 지원 | ⚠️ `<i18n-t>` 컴포넌트 보간; Markdown은 외부 플러그인으로 지원 |
|
|
54
|
+
| **ICU 지원** | ⚠️ WIP | ✅ Yes |
|
|
55
|
+
| **포맷팅 (날짜, 숫자, 통화)** | ✅ Intl 기반 포매터 | ✅ `d()` / `n()` with `datetimeFormats` / `numberFormats` |
|
|
56
|
+
| **지역화된 라우팅** | ✅ Vue Router / Nuxt용 헬퍼, `getMultilingualUrls` | ⚠️ 핵심이 아님 (`@nuxtjs/i18n` 또는 커스텀 라우터 설정) |
|
|
57
|
+
| **SEO 헬퍼 (hreflang, sitemap, robots)** | ✅ 내장 헬퍼 | ❌ 핵심이 아님 |
|
|
58
|
+
| **트리 셰이킹 (사용된 콘텐츠만 번들에 포함)** | ✅ 컴포넌트별, 로캘별, 컴파일러에 의해 자동화됨 | ⚠️ 수동: 카탈로그 분할, 라우트당 `setLocaleMessage()` |
|
|
59
|
+
| **Lazy loading** | ✅ `importMode: 'dynamic'` (한 줄의 설정) | ✅ 수동 `import()` + `setLocaleMessage()` |
|
|
60
|
+
| **Purge unused content** | ✅ Dead dictionaries가 빌드 시간에 dropped됨 | ❌ Built-in이 아님 |
|
|
61
|
+
| **Testing missing translations (CLI / CI)** | ✅ `npx intlayer content test` | ⚠️ Third-party (`vue-i18n-extract`) |
|
|
62
|
+
| **AI-powered translation** | ✅ Built-in, 자신의 provider keys를 사용합니다 | ❌ No |
|
|
63
|
+
| **Visual Editor / CMS** | ✅ 무료 Visual Editor + 선택 사항 CMS | ❌ No (외부 현지화 플랫폼) |
|
|
64
|
+
| **MCP server & Agent Skills** | ✅ Yes | ❌ No |
|
|
65
|
+
| **Ecosystem / community** | ⚠️ 작지만 빠르게 성장 중 | ✅ Vue ecosystem에서 크고 성숙함 |
|
|
66
|
+
|
|
67
|
+
## 벤치마크
|
|
68
|
+
|
|
69
|
+
### 측정된 항목
|
|
70
|
+
|
|
71
|
+
[Benchmark Bloom](https://github.com/intlayer-org/benchmark-bloom) 제품군은 각 라이브러리로 **동일한 Vite + Vue 3 애플리케이션**을 빌드합니다: **10개 페이지** (home, about, blog, careers, contact, FAQ, pricing, products, settings, team), **10개 로케일** (`en`, `fr`, `es`, `de`, `it`, `pt`, `zh`, `ja`, `ko`, `ru`), 동일한 컴포넌트 및 동일한 콘텐츠. 페이지는 `en`과 `fr`에서 측정됩니다.
|
|
72
|
+
|
|
73
|
+
두 라이브러리 모두 **static** 구성으로 테스트되었습니다. 대부분의 Vue 프로젝트가 배포하는 구성입니다: `vue-i18n`의 경우, 모든 로케일의 JSON을 import하여 `createI18n({ messages })`로 전달; Intlayer의 경우, 기본 `importMode: 'static'`. 이 모드에서 Intlayer는 모든 로케일을 번들에 포함하지만, 컴파일러는 여전히 콘텐츠를 **컴포넌트당** 범위로 제한하므로, 페이지는 렌더링하는 컴포넌트의 사전만 전달합니다.
|
|
74
|
+
|
|
75
|
+
각 빌드에 대해 suite는 다음을 기록합니다:
|
|
76
|
+
|
|
77
|
+
- **Lib size**: i18n 라이브러리만 import하는 빈 component의 gzip 크기. runtime의 고정 비용입니다.
|
|
78
|
+
- **Page JS**: 모든 page와 locale에 걸쳐 평균화된 page당 다운로드되는 gzip JavaScript입니다.
|
|
79
|
+
- **Locale leak %**: 다운로드된 JS에서 발견된 번역된 문자열 중 사용자가 **보고 있지 않은** locale에 속하는 비율입니다 (`en`과 `fr`에서 fingerprint되므로, 50%는 "측정된 다른 locale이 완전히 존재한다"는 의미; 10개 locale이 번들되면, 실제 낭비는 더 높습니다).
|
|
80
|
+
- **Page leak %**: 다운로드된 JS에서 발견된 번역된 문자열 중 사용자가 **접근하지 않은** page에 속하는 비율입니다.
|
|
81
|
+
- **Component avg**: 각 component가 독립적으로 컴파일된 평균 gzip 크기입니다. 단일 component가 끌어당기는 i18n runtime과 catalog의 양을 보여줍니다.
|
|
82
|
+
- **E2E reactivity**: 새 locale을 선택한 후 DOM에서 `html[lang]`이 업데이트될 때까지의 벽시계 시간 (Playwright, 5회 반복).
|
|
83
|
+
- **Page load**: `PerformanceNavigationTiming.duration`.
|
|
84
|
+
|
|
85
|
+
> 아래 숫자는 **2026-09-12** 실행 데이터로 `vue-i18n` 11.4.0 및 `intlayer` 9.5.0 / 9.5.1을 사용합니다. 테스트 애플리케이션은 의도적으로 작습니다 (locale당 몇십 개의 문자열), 따라서 누출 백분율은 **패턴**을 나타냅니다: 콘텐츠가 증가하면 누출도 증가하지만 runtime 비용은 일정하게 유지됩니다.
|
|
86
|
+
|
|
87
|
+
### Vite + Vue 3에서의 결과
|
|
88
|
+
|
|
89
|
+
| Library | Strategy | Lib size (gz) | Lib size (min) | Page JS avg (gz) | Locale leak | Page leak | Component avg (gz) | E2E reactivity | Page load |
|
|
90
|
+
| ----------------------------- | -------- | ------------: | -------------: | ---------------: | ----------: | --------: | -----------------: | -------------: | --------: |
|
|
91
|
+
| **base** (i18n 없음) | - | 0.0 KB | 0.0 KB | 41.3 KB | 0.0% | - | 1.1 KB | 1.8 ms | 10.8 ms |
|
|
92
|
+
| `vue-i18n` | static | 24.3 KB | 83.2 KB | 134.9 KB | 50.0% | 90.0% | 196.0 KB | 2.8 ms | 13.6 ms |
|
|
93
|
+
| **`vue-intlayer`** | static | **3.9 KB** | **11.1 KB** | **57.1 KB** | 56.8% | **0.0%** | **7.7 KB** | **4.5 ms** | 13.8 ms |
|
|
94
|
+
| `@intlayer/vue-i18n` (compat) | static | 7.9 KB | 23.2 KB | 47.0 KB | 15.0% | 0.0% | 8.4 KB | 1.5 ms | 9.3 ms |
|
|
95
|
+
|
|
96
|
+
> 기본 앱의 page-leak 열은 비워두었습니다: i18n 라이브러리가 없으면 fingerprinting이 공유 청크의 하드코딩된 문자열을 선택하고 그 숫자는 의미가 없습니다.
|
|
97
|
+
|
|
98
|
+
**읽는 방법**
|
|
99
|
+
|
|
100
|
+
- **런타임 비용.** `vue-i18n`은 전체 벤치마크에서 가장 무거운 런타임 중 하나입니다: 이를 임포트하는 빈 컴포넌트의 경우 **gzip 24.3 KB / minified 83.2 KB**입니다. `vue-intlayer`는 3.9 KB gzip으로 비용이 듭니다. 이 격차는 당신이 가진 문자열의 수에 관계없이 모든 페이지에서 지불됩니다.
|
|
101
|
+
- **페이지당 JavaScript.** i18n이 없는 앱의 무게는 41.3 KB입니다. `vue-i18n`은 이를 3배 이상 늘려 **134.9 KB**가 되고, Intlayer는 **57.1 KB**로 +15.8 KB입니다. 대부분은 번들된 10개의 로케일입니다 (다음 포인트 참조).
|
|
102
|
+
- **Leakage.** `createI18n({ messages: { en, fr, ... } })`을 사용하면 모든 페이지가 모든 로케일과 모든 페이지의 문자열을 전달합니다: **50% 로케일 leakage** (두 개의 fingerprinted 로케일에서) 그리고 **90% 페이지 leakage**. Intlayer의 `static` 모드도 모든 로케일을 번들하므로 (따라서 비슷한 locale-leak 수치) **0% 페이지 leakage**를 가집니다: 페이지는 렌더링하는 컴포넌트의 사전만 가져옵니다. `importMode: 'dynamic'`으로 전환하면 로케일 leakage도 제거됩니다. 해당 구성은 이 Vue 실행에 포함되지 않았습니다.
|
|
103
|
+
- **컴포넌트 크기는 아키텍처를 보여줍니다.** `useI18n()`을 호출하는 컴포넌트는 평균 **196 KB**로 컴파일됩니다. `t()`가 모든 로케일의 모든 메시지를 보유하는 전역 인스턴스에 바인딩되기 때문입니다. `useIntlayer()`를 사용한 동일한 컴포넌트는 **7.7 KB**로 컴파일됩니다: 자체 딕셔너리에만 접근합니다.
|
|
104
|
+
- **반응성**은 둘 다 문제가 되지 않습니다(2-5 ms). Vue의 반응성 시스템은 메시지가 메모리에 있으면 로케일 전환을 저렴하게 만듭니다.
|
|
105
|
+
- **`@intlayer/vue-i18n`**, drop-in 어댑터는 `vue-i18n` API를 유지하며 페이지당 **47.0 KB**, 컴포넌트당 **8.4 KB**를 측정했으며, 애플리케이션 코드는 변경되지 않았습니다.
|
|
106
|
+
|
|
107
|
+
> 참고로, 동일한 실행에서 `fluent-vue`는 페이지당 171.8 KB, 29.7 KB의 runtime, 컴포넌트당 217 KB를 측정했습니다.
|
|
108
|
+
|
|
109
|
+
## 왜 이러한 간격이 있을까요? 전역 인스턴스 vs. 컴파일된 딕셔너리
|
|
110
|
+
|
|
111
|
+
`vue-i18n`은 런타임입니다. `createI18n()`은 로케일당 메시지 트리를 보유하는 글로벌 인스턴스를 구축하고, `useI18n()`은 각 컴포넌트를 이에 바인딩하며, `t("footer.github")`는 렌더 시간에 키를 조회합니다. 이것이 SFC `<i18n>` 블록, `v-t`, 그리고 런타임 메시지 로딩을 가능하게 하는 것이며, 또한 모든 컴포넌트의 의존성 그래프가 전체 트리를 포함하는 이유입니다:
|
|
112
|
+
|
|
113
|
+
```bash
|
|
114
|
+
.
|
|
115
|
+
├── locales
|
|
116
|
+
│ ├── en.json
|
|
117
|
+
│ ├── fr.json
|
|
118
|
+
│ └── ... # 로케일당 하나의 파일, 내부의 모든 페이지
|
|
119
|
+
└── src
|
|
120
|
+
├── i18n.ts # createI18n({ messages: { en, fr, ... } })
|
|
121
|
+
├── main.ts
|
|
122
|
+
└── components
|
|
123
|
+
└── Footer.vue # const { t } = useI18n(); t("footer.github")
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
최적화란 **당신이** `en.json`을 라우트별 파일로 분할하고, **당신이** 라우터 가드에서 `setLocaleMessage()`를 호출하고, 컴포넌트가 이동할 때 라우트-파일 맵을 올바르게 유지하는 것을 의미합니다. 런타임은 컴포넌트가 어떤 키를 요청할지 알 수 없기 때문에 당신을 위해 이를 수행할 수 없습니다.
|
|
127
|
+
|
|
128
|
+
Intlayer는 그 지식을 빌드로 이동합니다. 콘텐츠는 컴포넌트 옆에 선언되고, `vite-intlayer`는 어떤 컴포넌트가 어떤 dictionary를 import하는지 해결합니다:
|
|
129
|
+
|
|
130
|
+
```bash
|
|
131
|
+
.
|
|
132
|
+
├── intlayer.config.ts
|
|
133
|
+
└── src
|
|
134
|
+
├── main.ts # createApp(App).use(intlayer)
|
|
135
|
+
└── components
|
|
136
|
+
└── Footer
|
|
137
|
+
├── Footer.vue # useIntlayer("footer")
|
|
138
|
+
└── Footer.content.ts
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
컴파일러는 각 딕셔너리와 locale별로 component가 필요로 하는 정확한 JSON을 내보내고, 아무도 import하지 않는 딕셔너리는 제거합니다. Per-route 범위는 per-component 범위의 결과이지, 수행할 작업이 아닙니다.
|
|
142
|
+
|
|
143
|
+
> 사용하지 않는 locale도 제거하려면 `intlayer.config.ts`에서 `dictionary.importMode: 'dynamic'`을 설정하세요. [bundle optimization doc](https://intlayer.org/doc/concept/bundle-optimization)을 참조하세요.
|
|
144
|
+
|
|
145
|
+
## 개발자 경험
|
|
146
|
+
|
|
147
|
+
### 설정
|
|
148
|
+
|
|
149
|
+
**vue-i18n**
|
|
150
|
+
|
|
151
|
+
```ts fileName="src/i18n.ts"
|
|
152
|
+
import { createI18n } from "vue-i18n";
|
|
153
|
+
import en from "../locales/en.json";
|
|
154
|
+
import fr from "../locales/fr.json";
|
|
155
|
+
|
|
156
|
+
export const i18n = createI18n({
|
|
157
|
+
legacy: false,
|
|
158
|
+
locale: "en",
|
|
159
|
+
fallbackLocale: "en",
|
|
160
|
+
messages: { en, fr },
|
|
161
|
+
});
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
```ts fileName="src/main.ts"
|
|
165
|
+
import { createApp } from "vue";
|
|
166
|
+
import App from "./App.vue";
|
|
167
|
+
import router from "./router";
|
|
168
|
+
import { i18n } from "./i18n";
|
|
169
|
+
|
|
170
|
+
createApp(App).use(router).use(i18n).mount("#app");
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
**Intlayer**
|
|
174
|
+
|
|
175
|
+
```ts fileName="intlayer.config.ts"
|
|
176
|
+
import { type IntlayerConfig, Locales } from "intlayer";
|
|
177
|
+
|
|
178
|
+
// Intlayer 설정
|
|
179
|
+
const config: IntlayerConfig = {
|
|
180
|
+
internationalization: {
|
|
181
|
+
locales: [Locales.ENGLISH, Locales.FRENCH],
|
|
182
|
+
defaultLocale: Locales.ENGLISH,
|
|
183
|
+
},
|
|
184
|
+
};
|
|
185
|
+
|
|
186
|
+
export default config;
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
```ts fileName="vite.config.ts"
|
|
190
|
+
import { defineConfig } from "vite";
|
|
191
|
+
import vue from "@vitejs/plugin-vue";
|
|
192
|
+
import { intlayer } from "vite-intlayer";
|
|
193
|
+
|
|
194
|
+
export default defineConfig({
|
|
195
|
+
plugins: [intlayer(), vue()],
|
|
196
|
+
});
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
```ts fileName="src/main.ts"
|
|
200
|
+
import { createApp } from "vue";
|
|
201
|
+
import { intlayer } from "vue-intlayer";
|
|
202
|
+
import App from "./App.vue";
|
|
203
|
+
import router from "./router";
|
|
204
|
+
|
|
205
|
+
createApp(App).use(intlayer).use(router).mount("#app");
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
### Component
|
|
209
|
+
|
|
210
|
+
**vue-i18n**
|
|
211
|
+
|
|
212
|
+
```json fileName="locales/en.json"
|
|
213
|
+
{
|
|
214
|
+
"counter": {
|
|
215
|
+
"label": "Counter",
|
|
216
|
+
"increment": "Increment"
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
```vue fileName="src/components/Counter.vue"
|
|
222
|
+
<script setup lang="ts">
|
|
223
|
+
import { ref } from "vue";
|
|
224
|
+
import { useI18n } from "vue-i18n";
|
|
225
|
+
|
|
226
|
+
const { t, n } = useI18n();
|
|
227
|
+
const count = ref(0);
|
|
228
|
+
</script>
|
|
229
|
+
|
|
230
|
+
<template>
|
|
231
|
+
<div>
|
|
232
|
+
<p>{{ n(count) }}</p>
|
|
233
|
+
<button :aria-label="t('counter.label')" @click="count++">
|
|
234
|
+
{{ t("counter.increment") }}
|
|
235
|
+
</button>
|
|
236
|
+
</div>
|
|
237
|
+
</template>
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
`t('counter.label')`은 메시지 스키마를 직접 입력할 때까지 문자열이며, 오타가 있으면 키가 렌더링됩니다.
|
|
241
|
+
|
|
242
|
+
**Intlayer**
|
|
243
|
+
|
|
244
|
+
```ts fileName="src/components/Counter/Counter.content.ts"
|
|
245
|
+
import { t, type Dictionary } from "intlayer";
|
|
246
|
+
|
|
247
|
+
// Counter 컴포넌트의 콘텐츠 정의
|
|
248
|
+
const counterContent = {
|
|
249
|
+
key: "counter",
|
|
250
|
+
content: {
|
|
251
|
+
label: t({ ko: "카운터", en: "Counter", fr: "Compteur" }),
|
|
252
|
+
increment: t({ ko: "증가", en: "Increment", fr: "Incrémenter" }),
|
|
253
|
+
},
|
|
254
|
+
} satisfies Dictionary;
|
|
255
|
+
|
|
256
|
+
export default counterContent;
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
```vue fileName="src/components/Counter/Counter.vue"
|
|
260
|
+
<script setup lang="ts">
|
|
261
|
+
import { ref } from "vue";
|
|
262
|
+
import { useIntlayer } from "vue-intlayer";
|
|
263
|
+
import { useNumber } from "vue-intlayer/format";
|
|
264
|
+
|
|
265
|
+
// Counter 콘텐츠에서 label과 increment 가져오기
|
|
266
|
+
const { label, increment } = useIntlayer("counter");
|
|
267
|
+
// 숫자 포맷팅 유틸리티 초기화
|
|
268
|
+
const number = useNumber();
|
|
269
|
+
const count = ref(0);
|
|
270
|
+
</script>
|
|
271
|
+
|
|
272
|
+
<template>
|
|
273
|
+
<div>
|
|
274
|
+
<p>{{ number.value(count) }}</p>
|
|
275
|
+
<button :aria-label="label" @click="count++">
|
|
276
|
+
{{ increment }}
|
|
277
|
+
</button>
|
|
278
|
+
</div>
|
|
279
|
+
</template>
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
`label`과 `increment`는 타입이 지정되어 있습니다. 오타는 TypeScript 오류이고, 누락된 프랑스어 값은 빌드 오류입니다.
|
|
283
|
+
|
|
284
|
+
### 로케일별 지연 로딩
|
|
285
|
+
|
|
286
|
+
**vue-i18n**
|
|
287
|
+
|
|
288
|
+
```ts fileName="src/i18n.ts"
|
|
289
|
+
import { nextTick } from "vue";
|
|
290
|
+
import { createI18n } from "vue-i18n";
|
|
291
|
+
|
|
292
|
+
export const i18n = createI18n({
|
|
293
|
+
legacy: false,
|
|
294
|
+
locale: "en",
|
|
295
|
+
fallbackLocale: "en",
|
|
296
|
+
});
|
|
297
|
+
|
|
298
|
+
export const loadLocaleMessages = async (locale: string) => {
|
|
299
|
+
// 로케일별 메시지를 비동기로 가져옵니다
|
|
300
|
+
const messages = await import(`../locales/${locale}.json`);
|
|
301
|
+
i18n.global.setLocaleMessage(locale, messages.default);
|
|
302
|
+
await nextTick();
|
|
303
|
+
i18n.global.locale.value = locale;
|
|
304
|
+
};
|
|
305
|
+
```
|
|
306
|
+
|
|
307
|
+
그런 다음 라우터 가드에서 `loadLocaleMessages()`를 호출하고, 페이지별 범위 지정을 원한다면 `locales/{locale}.json`을 경로별로 직접 분할합니다.
|
|
308
|
+
|
|
309
|
+
**Intlayer**
|
|
310
|
+
|
|
311
|
+
```ts fileName="intlayer.config.ts"
|
|
312
|
+
const config: IntlayerConfig = {
|
|
313
|
+
// ...
|
|
314
|
+
dictionary: {
|
|
315
|
+
importMode: "dynamic",
|
|
316
|
+
},
|
|
317
|
+
};
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
## vue-i18n API를 유지하면서 Intlayer의 출력 얻기
|
|
321
|
+
|
|
322
|
+
`@intlayer/vue-i18n`은 drop-in 어댑터입니다: `useI18n()`, `t()`, `d()`, `n()`, `{name}` 및 `{0}` 보간, 파이프 복수형(`"car | cars"`), `v-t` 및 `i18n.global.locale`이 계속 작동하며, `vite-intlayer`로 컴파일된 Intlayer 사전에서 제공됩니다.
|
|
323
|
+
|
|
324
|
+
```ts fileName="vite.config.ts"
|
|
325
|
+
import { defineConfig } from "vite";
|
|
326
|
+
import vue from "@vitejs/plugin-vue";
|
|
327
|
+
import vueI18nVitePlugin from "@intlayer/vue-i18n/plugin";
|
|
328
|
+
|
|
329
|
+
export default defineConfig({
|
|
330
|
+
plugins: [vue(), vueI18nVitePlugin()],
|
|
331
|
+
});
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
벤치마크에서 동일한 앱의 호환성 빌드는 **페이지당 134.9 KB에서 47.0 KB로**, **컴포넌트당 196 KB에서 8.4 KB로** 감소했으며, 컴포넌트는 변경되지 않았습니다. 기존의 `locales/{locale}.json`은 JSON sync 플러그인을 통해 진실의 원천으로 유지될 수 있습니다.
|
|
335
|
+
|
|
336
|
+
[vue-i18n 마이그레이션 가이드](https://intlayer.org/doc/migration/vue-i18n)와 [호환성 문서](https://intlayer.org/doc/compatibility/vue-i18n)를 참조하세요. Nuxt 사용자는 [`@nuxtjs/i18n` 호환성](https://intlayer.org/doc/compatibility/nuxtjs-i18n)을 통해 동일한 경로를 사용할 수 있습니다.
|
|
337
|
+
|
|
338
|
+
## 어떤 것을 선택할 때?
|
|
339
|
+
|
|
340
|
+
- **vue-i18n을 선택하세요** 표준 Vue 접근 방식을 원하거나, ICU 메시지나 SFC `<i18n>` 블록에 의존하거나, 이미 `@nuxtjs/i18n`을 사용 중이거나, 번역 플랫폼이 중앙집중식 JSON을 기대하는 경우. Bundle 크기가 중요하다면 카탈로그 분할 및 경로별 lazy-loading 시간을 고려하세요.
|
|
341
|
+
- **Intlayer를 선택하세요** **component-scoped content**, **strict TypeScript**, **build-time missing-key errors**, **zero-effort tree-shaking and lazy loading**, 그리고 built-in editorial tooling(Visual Editor, CMS, AI translation, MCP server)을 원하는 경우. 특히 대규모의 모듈식 Vue / Nuxt codebase와 design system에 적합합니다.
|
|
342
|
+
- **`@intlayer/vue-i18n`을 선택하세요** 이미 `vue-i18n`을 사용 중이고 재작성 없이 bundle 이점을 원하는 경우.
|
|
343
|
+
|
|
344
|
+
## 관련 비교
|
|
345
|
+
|
|
346
|
+
- [next-intl vs Intlayer](https://intlayer.org/blog/next-intl-vs-intlayer) (동일한 벤치마크)
|
|
347
|
+
- [i18next vs Intlayer](https://intlayer.org/blog/i18next-vs-intlayer) (동일한 벤치마크)
|
|
348
|
+
- [Lingui vs Intlayer](https://intlayer.org/blog/lingui-vs-intlayer) (동일한 벤치마크)
|
|
349
|
+
- [vue-i18n vs Intlayer (기능 & DX)](https://intlayer.org/blog/vue-i18n-vs-intlayer)
|
|
350
|
+
- [vue-i18n이 구식인가?](https://intlayer.org/blog/is-vue-i18n-outdated)
|
|
351
|
+
|
|
352
|
+
## GitHub STARs
|
|
353
|
+
|
|
354
|
+
GitHub 별은 프로젝트의 인기도, 커뮤니티의 신뢰, 그리고 장기적 관련성을 나타내는 강력한 지표입니다. 기술적 품질의 직접적인 척도는 아니지만, 얼마나 많은 개발자가 프로젝트를 유용하다고 생각하고, 그 진행 상황을 따라가며, 이를 채택할 가능성이 높은지를 반영합니다.
|
|
355
|
+
|
|
356
|
+
[](https://star-history.com/#intlify/vue-i18n&aymericzip/intlayer)
|
|
357
|
+
|
|
358
|
+
## 결론
|
|
359
|
+
|
|
360
|
+
`vue-i18n`은 성숙하고 유연하며 Vue와 깊이 있게 통합되어 있습니다. 벤치마크는 Vite 빌드에서 runtime-first 설계의 비용을 보여줍니다: **24 KB gzip runtime**, **페이지당 134.9 KB** (i18n 없이 41 KB인 앱의 경우), **모든 페이지에서 90% 외부 페이지 콘텐츠**, 그리고 각 컴포넌트가 전역 메시지 트리에 연결되어 있기 때문에 **196 KB**에 도달합니다.
|
|
361
|
+
|
|
362
|
+
Intlayer는 컴파일러로 작업을 이동합니다. 컴포넌트별 딕셔너리와 데드 콘텐츠 제거는 관례가 아닌 빌드 출력입니다. 동일한 앱에서: **3.9 KB runtime**, **페이지당 57.1 KB**, **0% 페이지 누출**, 컴포넌트는 **25배 더 작음**. 그리고 리라이트가 선택지가 아니라면, `@intlayer/vue-i18n`은 컴포넌트를 건드리지 않고도 대부분의 방식으로 작동합니다.
|
|
363
|
+
|
|
364
|
+
모든 원본 데이터, 테스트 앱 및 스크립트는 [Benchmark Bloom 저장소](https://github.com/intlayer-org/benchmark-bloom)에 있습니다. 직접 실행해보세요.
|
|
365
|
+
|
|
366
|
+
자세한 내용은 ['Intlayer를 선택해야 하는 이유?' 문서](https://intlayer.org/doc/why)를 참조하세요.
|
|
@@ -49,7 +49,7 @@ Odpowiedzi ulegały znacznym zmianom: od obiektów globalnych i wywołań `t('kl
|
|
|
49
49
|
|
|
50
50
|
Ten artykuł przedstawia tę ewolucję w latach 2011-2026: co próbowała rozwiązać każda generacja narzędzi, co okazało się sukcesem, gdzie napotkano ograniczenia oraz jak współczesna architektura frontendu wpływa na dzisiejszą obsługę i18n.
|
|
51
51
|
|
|
52
|
-

|
|
53
53
|
|
|
54
54
|
## Spis treści
|
|
55
55
|
|
|
@@ -149,87 +149,87 @@ Poniższe zakładki ilustrują, jak poszczególne ekosystemy odpowiadały na te
|
|
|
149
149
|
|
|
150
150
|
<Tab label="Core JavaScript" value="javascript">
|
|
151
151
|
|
|
152
|
-
| Pierwsze wydanie | Biblioteka | Cel powstania | Kluczowa innowacja |
|
|
153
|
-
| ---------------- | ------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
154
|
-
| Styczeń 2012 | `i18next` | Standaryzacja odpytywania słowników w runtime dla przeglądarki i Node.js bez przywiązania do konkretnego frameworka. | Modułowa architektura oddzielająca silnik tłumaczeń od loaderów, detektorów języka i pamięci podręcznej. |
|
|
155
|
-
| Luty 2021 | `typesafe-i18n` | Zapobieganie błędom w czasie wykonywania i problemom z interpolacją wynikającym z nieoatypowanych kluczy tekstowych. | W pełni otypowane funkcje tłumaczeń generowane bezpośrednio z obiektów tłumaczeń bez dodatkowych zależności w runtime. |
|
|
156
|
-
| Październik 2023 | `paraglide` (`@inlang/paraglide-js`) | Eliminacja odpytywania słowników w runtime, ciężkich parserów i rozrostu paczek kodu. | Kompilacja wiadomości do czystych modułów ECMAScript i funkcji wspierających tree-shaking. |
|
|
157
|
-
|
|
|
158
|
-
| Czerwiec 2025 | `wuchale` | Usunięcie konieczności ręcznego wyciągania ciągów znaków i wymyślania nazw kluczy podczas programowania. | Przetwarzanie na poziomie AST, które wykrywa tekst inline i kompiluje go do zlokalizowanych funkcji bez dodatkowego narzutu na etapie budowania. |
|
|
152
|
+
| Pierwsze wydanie | Biblioteka | Autor | Cel powstania | Kluczowa innowacja |
|
|
153
|
+
| ---------------- | ------------------------------------ | ------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
154
|
+
| Styczeń 2012 | `i18next` | Jan Mühlemann (`@jamuhl`) | Standaryzacja odpytywania słowników w runtime dla przeglądarki i Node.js bez przywiązania do konkretnego frameworka. | Modułowa architektura oddzielająca silnik tłumaczeń od loaderów, detektorów języka i pamięci podręcznej. |
|
|
155
|
+
| Luty 2021 | `typesafe-i18n` | Ivan Hofer (`@ivanhofer`) | Zapobieganie błędom w czasie wykonywania i problemom z interpolacją wynikającym z nieoatypowanych kluczy tekstowych. | W pełni otypowane funkcje tłumaczeń generowane bezpośrednio z obiektów tłumaczeń bez dodatkowych zależności w runtime. |
|
|
156
|
+
| Październik 2023 | `paraglide` (`@inlang/paraglide-js`) | Samuel Stroschein (`@samuelstroschein`) / Inlang (`@inlang`) | Eliminacja odpytywania słowników w runtime, ciężkich parserów i rozrostu paczek kodu. | Kompilacja wiadomości do czystych modułów ECMAScript i funkcji wspierających tree-shaking. |
|
|
157
|
+
| Sierpień 2024 | `intlayer` | Aymeric Pineau (`@aymericzip`) | Zastąpienie trudnych w utrzymaniu przestrzeni nazw, zapobieganie wyciekom treści między podstronami, redukcja konfliktów w git i natywne typowanie w TypeScript. | Kolokacja plików `.content` bezpośrednio przy komponentach, automatyczna generacja typów TypeScript, wbudowany wizualny CMS i narzędzia CLI do tłumaczeń z AI. |
|
|
158
|
+
| Czerwiec 2025 | `wuchale` | Kidus Adugna (`@K1DV5`) | Usunięcie konieczności ręcznego wyciągania ciągów znaków i wymyślania nazw kluczy podczas programowania. | Przetwarzanie na poziomie AST, które wykrywa tekst inline i kompiluje go do zlokalizowanych funkcji bez dodatkowego narzutu na etapie budowania. |
|
|
159
159
|
|
|
160
160
|
</Tab>
|
|
161
161
|
|
|
162
162
|
<Tab label="React" value="react">
|
|
163
163
|
|
|
164
|
-
| Pierwsze wydanie | Biblioteka | Cel powstania | Kluczowa innowacja |
|
|
165
|
-
| ---------------- | ---------------- | ----------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
166
|
-
| Czerwiec 2014 | `react-intl` | Standaryzacja formatowania liczb, dat, walut oraz złożonych form liczby mnogiej w React. | Deklaratywne komponenty (`<FormattedMessage>`, `<FormattedDate>`) oparte na standardach ICU MessageFormat i ECMA-402. |
|
|
167
|
-
| Grudzień 2015 | `react-i18next` | Zapewnienie idiomicznej integracji `i18next` w aplikacjach React z reaktywnym odświeżaniem widoków. | Ewolucja wraz z Reactem: od komponentów wyższego rzędu do interpolacji JSX za pomocą `<Trans>` oraz hooka `useTranslation`. |
|
|
168
|
-
| Styczeń 2018 | `@lingui/react` | Zmniejszenie wagi bundle'a wynikającej z obecności parserów ICU w kodzie klienckim. | Makra Babel/SWC kompilujące `<Trans>` i `t` do kompaktowych tablic indeksowanych już w trakcie budowania projektu. |
|
|
169
|
-
| Grudzień 2020 | `use-intl` | Lekka, oparta na hookach i bezpieczna pod kątem typów alternatywa dla starszych bibliotek w React. | Ergonomiczne hooki `useTranslations` i `useFormatter` z głęboką integracją z TypeScriptem. |
|
|
170
|
-
| Luty 2021 | `@tolgee/react` | Skrócenie pętli informacji zwrotnej między deweloperami, tłumaczami i projektantami. | Edycja w kontekście przeglądarki umożliwiająca edycję tekstów po kliknięciu z klawiszem Alt oraz automatyczne tworzenie zrzutów ekranu. |
|
|
171
|
-
|
|
|
172
|
-
| Lipiec 2024 | `gt-react` | Automatyzacja ręcznego eksportu plików i utrzymywania tłumaczeń. | Zautomatyzowana lokalizacja oparta na AI bezpośrednio w komponentach React z wykorzystaniem potoków chmurowych. |
|
|
173
|
-
|
|
|
164
|
+
| Pierwsze wydanie | Biblioteka | Autor | Cel powstania | Kluczowa innowacja |
|
|
165
|
+
| ---------------- | ---------------- | ------------------------------ | ----------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
166
|
+
| Czerwiec 2014 | `react-intl` | Yahoo! / FormatJS | Standaryzacja formatowania liczb, dat, walut oraz złożonych form liczby mnogiej w React. | Deklaratywne komponenty (`<FormattedMessage>`, `<FormattedDate>`) oparte na standardach ICU MessageFormat i ECMA-402. |
|
|
167
|
+
| Grudzień 2015 | `react-i18next` | Jan Mühlemann (`@jamuhl`) | Zapewnienie idiomicznej integracji `i18next` w aplikacjach React z reaktywnym odświeżaniem widoków. | Ewolucja wraz z Reactem: od komponentów wyższego rzędu do interpolacji JSX za pomocą `<Trans>` oraz hooka `useTranslation`. |
|
|
168
|
+
| Styczeń 2018 | `@lingui/react` | Tomáš Ehrlich (`@tricoder42`) | Zmniejszenie wagi bundle'a wynikającej z obecności parserów ICU w kodzie klienckim. | Makra Babel/SWC kompilujące `<Trans>` i `t` do kompaktowych tablic indeksowanych już w trakcie budowania projektu. |
|
|
169
|
+
| Grudzień 2020 | `use-intl` | Jan Amann (`@amannn`) | Lekka, oparta na hookach i bezpieczna pod kątem typów alternatywa dla starszych bibliotek w React. | Ergonomiczne hooki `useTranslations` i `useFormatter` z głęboką integracją z TypeScriptem. |
|
|
170
|
+
| Luty 2021 | `@tolgee/react` | Jan Cizmar (`@jcizmar`) | Skrócenie pętli informacji zwrotnej między deweloperami, tłumaczami i projektantami. | Edycja w kontekście przeglądarki umożliwiająca edycję tekstów po kliknięciu z klawiszem Alt oraz automatyczne tworzenie zrzutów ekranu. |
|
|
171
|
+
| Sierpień 2024 | `react-intlayer` | Aymeric Pineau (`@aymericzip`) | Wydajna implementacja Intlayer dopasowana do cyklu życia komponentów Reacta, bez monolitycznych plików JSON i złożonych nazw. | Dedykowany hook `useIntlayer`, automatyczne generowanie typów TypeScript, tree-shaking na poziomie komponentów i bezpośrednia synchronizacja z wizualnym CMS. |
|
|
172
|
+
| Lipiec 2024 | `gt-react` | Ernest McCarter (`@eoinest`) | Automatyzacja ręcznego eksportu plików i utrzymywania tłumaczeń. | Zautomatyzowana lokalizacja oparta na AI bezpośrednio w komponentach React z wykorzystaniem potoków chmurowych. |
|
|
173
|
+
| Czerwiec 2025 | `@wuchale/jsx` | Kidus Adugna (`@K1DV5`) | Rezygnacja z ręcznego nazywania kluczy i powtarzalnych hooków podczas pisania kodu JSX. | Przekształcanie AST automatycznie wykrywające węzły tekstowe w JSX i kompilujące je do ich zlokalizowanych odpowiedników. |
|
|
174
174
|
|
|
175
175
|
</Tab>
|
|
176
176
|
|
|
177
177
|
<Tab label="Next.js" value="nextjs">
|
|
178
178
|
|
|
179
|
-
| Pierwsze wydanie | Biblioteka | Cel powstania | Kluczowa innowacja |
|
|
180
|
-
| ---------------- | ------------------------------------------- | ---------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
181
|
-
| Listopad 2018 | `next-i18next` | Obsługa SSR i SSG z użyciem `i18next` w Next.js Pages Router bez kaskadowych zapytań po stronie klienta. | Funkcje `serverSideTranslations` i `appWithTranslation` przekazujące zlokalizowane przestrzenie nazw w propsach stron. |
|
|
182
|
-
| Grudzień
|
|
183
|
-
|
|
|
184
|
-
| Lipiec 2022 | `next-international` | Maksymalizacja bezpieczeństwa typów w TypeScript przy minimalnym narzucie na bundle klienta w Next.js. | Ścisłe typowanie dla wyodrębnionych kluczy tłumaczeń z lekkimi adapterami dla App Router i Pages Router. |
|
|
185
|
-
|
|
|
186
|
-
|
|
|
187
|
-
|
|
|
179
|
+
| Pierwsze wydanie | Biblioteka | Autor | Cel powstania | Kluczowa innowacja |
|
|
180
|
+
| ---------------- | ------------------------------------------- | ------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
181
|
+
| Listopad 2018 | `next-i18next` | Isaac Hinman (`@isaachinman`) | Obsługa SSR i SSG z użyciem `i18next` w Next.js Pages Router bez kaskadowych zapytań po stronie klienta. | Funkcje `serverSideTranslations` i `appWithTranslation` przekazujące zlokalizowane przestrzenie nazw w propsach stron. |
|
|
182
|
+
| Grudzień 2020 | `next-translate` | Arvin Wiyono (`@arvinn`) / Vinissimus (`@vinissimus`) | Uproszczenie konfiguracji i redukcja rozmiaru paczek w aplikacjach Next.js Pages Router. | Wtyczka do Webpack loadera wstrzykująca wyłącznie te przestrzenie nazw, które są wymagane przez konkretną podstronę. |
|
|
183
|
+
| Grudzień 2020 | `next-intl` | Jan Amann (`@amannn`) | Nowe podejście do internacjonalizacji z myślą o App Router, React Server Components (RSC) i strumieniowanym SSR. | Natywna integracja z middleware Next.js App Router, Server Actions i asynchronicznymi Server Components bez konieczności wysyłania kodu na klienta. |
|
|
184
|
+
| Lipiec 2022 | `next-international` | Tom Dussaix (`@tom-dussaix`) | Maksymalizacja bezpieczeństwa typów w TypeScript przy minimalnym narzucie na bundle klienta w Next.js. | Ścisłe typowanie dla wyodrębnionych kluczy tłumaczeń z lekkimi adapterami dla App Router i Pages Router. |
|
|
185
|
+
| Październik 2023 | `paraglide-next` (`@inlang/paraglide-next`) | Samuel Stroschein (`@samuelstroschein`) / Inlang (`@inlang`) | Dostarczenie prekompilowanych komunikatów bez narzutu biblioteki runtime dla Next.js App Router i Pages Router. | Routing oparty na middleware połączony z funkcjami wiadomości wspierającymi tree-shaking, co eliminuje parsowanie JSON w RSC i paczkach klienta. |
|
|
186
|
+
| Sierpień 2024 | `next-intlayer` | Aymeric Pineau (`@aymericzip`) | Adapter dla Server Components bez uciążliwego przekazywania funkcji `t()` czy słowników przez propsy. | Wywoływanie `useIntlayer` w synchronicznych Server Components bez prop-drillingu, renderowanie bez kaskad na serwerze, lokalny middleware i podgląd w CMS. |
|
|
187
|
+
| Lipiec 2024 | `gt-next` | Ernest McCarter (`@eoinest`) | Automatyzacja generowania treści wielojęzycznych i dynamicznego routingu w Next.js przy użyciu AI. | Integracja z App Router łącząca tłumaczenie maszynowe w chmurze z middleware brzegowym (edge) i warstwami buforowania Next.js. |
|
|
188
188
|
|
|
189
189
|
</Tab>
|
|
190
190
|
|
|
191
191
|
<Tab label="Vue & Nuxt" value="vue">
|
|
192
192
|
|
|
193
|
-
| Pierwsze wydanie | Biblioteka | Cel powstania | Kluczowa innowacja |
|
|
194
|
-
| ---------------- | -------------- | ------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
195
|
-
| Maj 2014 | `vue-i18n` | Zapewnienie reaktywnej, naturalnej internacjonalizacji dla aplikacji tworzonych w Vue.js. | Ścisła integracja z reaktywnością Vue, dyrektywy szablonów (`v-t`), funkcje pomocnicze `$t` oraz bloki `<i18n>` w komponentach SFC. |
|
|
196
|
-
| Listopad 2017 | `@nuxt/i18n` | Obsługa zlokalizowanych adresów URL, tagów SEO hreflang oraz hydratacji SSR w Nuxt. | Pełny moduł routingu generujący trasy (prefiksy, domeny), nagłówki meta SEO oraz wspierający leniwe ładowanie fragmentów słowników. |
|
|
197
|
-
| Sierpień
|
|
198
|
-
|
|
|
193
|
+
| Pierwsze wydanie | Biblioteka | Autor | Cel powstania | Kluczowa innowacja |
|
|
194
|
+
| ---------------- | -------------- | ------------------------------------------- | ------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
195
|
+
| Maj 2014 | `vue-i18n` | Kazupon (`@kazupon`) | Zapewnienie reaktywnej, naturalnej internacjonalizacji dla aplikacji tworzonych w Vue.js. | Ścisła integracja z reaktywnością Vue, dyrektywy szablonów (`v-t`), funkcje pomocnicze `$t` oraz bloki `<i18n>` w komponentach SFC. |
|
|
196
|
+
| Listopad 2017 | `@nuxt/i18n` | Społeczność Nuxt | Obsługa zlokalizowanych adresów URL, tagów SEO hreflang oraz hydratacji SSR w Nuxt. | Pełny moduł routingu generujący trasy (prefiksy, domeny), nagłówki meta SEO oraz wspierający leniwe ładowanie fragmentów słowników. |
|
|
197
|
+
| Sierpień 2020 | `fluent-vue` | Mozilla (`@mozilla`) / Demivan (`@demivan`) | Obsługa złożonych form gramatycznych, odmian i niesymetrycznych struktur językowych w Vue. | Integracja składni Project Fluent od Mozilli w środowisku Vue, co eliminuje zawiłe warunki logiczne w szablonach. |
|
|
198
|
+
| Styczeń 2025 | `vue-intlayer` | Aymeric Pineau (`@aymericzip`) | Dedykowana integracja Intlayer dla Composition API w Vue 3 i Nuxt, eliminująca zanieczyszczanie zasięgu globalnego. | Composable `useIntlayer` zoptymalizowany pod kątem reaktywności Vue 3, izolacja komponentów, pełne autouzupełnianie w TypeScript i edycja w wizualnym CMS. |
|
|
199
199
|
|
|
200
200
|
</Tab>
|
|
201
201
|
|
|
202
202
|
<Tab label="Angular" value="angular">
|
|
203
203
|
|
|
204
|
-
| Pierwsze wydanie | Biblioteka | Cel powstania | Kluczowa innowacja |
|
|
205
|
-
| ---------------- | ------------------- | --------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
206
|
-
| Luty 2017 | `ngx-translate` | Dynamiczne tłumaczenie w czasie wykonywania w Angularze bez konieczności budowania osobnych paczek dla języków. | Serwis `TranslateService` oraz pipe `translate` umożliwiające asynchroniczne pobieranie treści i zmianę języka w locie. |
|
|
207
|
-
| Lipiec 2019 | `@ngneat/transloco` | Usunięcie problemów wydajnościowych i braku modułowości obecnych we wcześniejszych rozwiązaniach w Angularze. | Dyrektywa strukturalna (`*transloco`), izolowane tłumaczenia dla modułów ładowanych leniwie, wsparcie dla SSR oraz narzędzie CLI do ekstrakcji tekstów. |
|
|
208
|
-
| Wrzesień 2019 | `@angular/localize` | Nowoczesne podejście do wbudowanej w Angulara i18n bez potrzeby wielokrotnej rekompilacji kodu TypeScript. | Tagowane literały szablonów z `$localize` modyfikowane w szybkim kroku po kompilacji w silniku Ivy. |
|
|
209
|
-
| Luty 2021 | `@tolgee/ngx` | Wdrożenie tłumaczenia w kontekście interfejsu oraz wykonywania zrzutów ekranu w projektach Angulara. | Pipe'y i dyrektywy połączone z platformą Tolgee pozwalające na edycję tekstów bezpośrednio w oknie przeglądarki. |
|
|
210
|
-
|
|
|
204
|
+
| Pierwsze wydanie | Biblioteka | Autor | Cel powstania | Kluczowa innowacja |
|
|
205
|
+
| ---------------- | ------------------- | ------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
206
|
+
| Luty 2017 | `ngx-translate` | Olivier Combe (`@ocombe`) | Dynamiczne tłumaczenie w czasie wykonywania w Angularze bez konieczności budowania osobnych paczek dla języków. | Serwis `TranslateService` oraz pipe `translate` umożliwiające asynchroniczne pobieranie treści i zmianę języka w locie. |
|
|
207
|
+
| Lipiec 2019 | `@ngneat/transloco` | Netanel Basal (`@NetanelBasal`) & Shahar Kazaz (`@shahar_k`) | Usunięcie problemów wydajnościowych i braku modułowości obecnych we wcześniejszych rozwiązaniach w Angularze. | Dyrektywa strukturalna (`*transloco`), izolowane tłumaczenia dla modułów ładowanych leniwie, wsparcie dla SSR oraz narzędzie CLI do ekstrakcji tekstów. |
|
|
208
|
+
| Wrzesień 2019 | `@angular/localize` | Zespół Angular (@angular) | Nowoczesne podejście do wbudowanej w Angulara i18n bez potrzeby wielokrotnej rekompilacji kodu TypeScript. | Tagowane literały szablonów z `$localize` modyfikowane w szybkim kroku po kompilacji w silniku Ivy. |
|
|
209
|
+
| Luty 2021 | `@tolgee/ngx` | Jan Cizmar (`@jcizmar`) | Wdrożenie tłumaczenia w kontekście interfejsu oraz wykonywania zrzutów ekranu w projektach Angulara. | Pipe'y i dyrektywy połączone z platformą Tolgee pozwalające na edycję tekstów bezpośrednio w oknie przeglądarki. |
|
|
210
|
+
| Marzec 2026 | `angular-intlayer` | Aymeric Pineau (`@aymericzip`) | Natywna integracja Intlayer dla nowoczesnego Angulara (Signals, komponenty standalone i SSR). | Reaktywna obsługa oparta na Signals, dopasowana do detekcji zmian Angulara, wstrzykiwanie zależności w komponentach standalone i synchronizacja z CMS. |
|
|
211
211
|
|
|
212
212
|
</Tab>
|
|
213
213
|
|
|
214
214
|
<Tab label="Svelte & SvelteKit" value="svelte">
|
|
215
215
|
|
|
216
|
-
| Pierwsze wydanie | Biblioteka | Cel powstania | Kluczowa innowacja |
|
|
217
|
-
| ---------------- | ----------------- | ------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
218
|
-
| Lipiec 2018 | `svelte-i18n` | Reaktywna biblioteka internacjonalizacji dostosowana do store'ów w Svelte. | Obsługa `$t` powiązana ze store'ami, zapewniająca precyzyjne aktualizacje drzewa DOM po zmianie języka. |
|
|
219
|
-
| Grudzień 2021 | `sveltekit-i18n` | Właściwa obsługa SSR oraz pobierania tłumaczeń dla konkretnych tras w projektach SvelteKit. | Modułowy mechanizm pobierający wyłącznie te zasoby językowe i formatery, które są wymagane przez aktualną trasę. |
|
|
220
|
-
| Listopad 2021 | `@tolgee/svelte` | Tłumaczenie w kontekście interfejsu dla aplikacji Svelte. | Powiązanie ze store'ami Svelte zintegrowane z nakładką Tolgee oraz funkcją automatycznego tworzenia zrzutów ekranu. |
|
|
221
|
-
|
|
|
222
|
-
| Lipiec 2025 | `@wuchale/svelte` | Wyeliminowanie konieczności tworzenia słowników i powtarzalnego importowania funkcji `$t`. | Preprocesor Svelte analizujący szablony podczas kompilacji i przekształcający węzły tekstowe na zlokalizowany kod bez dodatkowych wrapperów. |
|
|
216
|
+
| Pierwsze wydanie | Biblioteka | Autor | Cel powstania | Kluczowa innowacja |
|
|
217
|
+
| ---------------- | ----------------- | ------------------------------ | ------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
218
|
+
| Lipiec 2018 | `svelte-i18n` | Kaisermann (`@kaisermann`) | Reaktywna biblioteka internacjonalizacji dostosowana do store'ów w Svelte. | Obsługa `$t` powiązana ze store'ami, zapewniająca precyzyjne aktualizacje drzewa DOM po zmianie języka. |
|
|
219
|
+
| Grudzień 2021 | `sveltekit-i18n` | Ivan Fevrier (`@ivanfevrier`) | Właściwa obsługa SSR oraz pobierania tłumaczeń dla konkretnych tras w projektach SvelteKit. | Modułowy mechanizm pobierający wyłącznie te zasoby językowe i formatery, które są wymagane przez aktualną trasę. |
|
|
220
|
+
| Listopad 2021 | `@tolgee/svelte` | Jan Cizmar (`@jcizmar`) | Tłumaczenie w kontekście interfejsu dla aplikacji Svelte. | Powiązanie ze store'ami Svelte zintegrowane z nakładką Tolgee oraz funkcją automatycznego tworzenia zrzutów ekranu. |
|
|
221
|
+
| Październik 2025 | `svelte-intlayer` | Aymeric Pineau (`@aymericzip`) | Wydajna implementacja Intlayer zaprojektowana bezpośrednio z myślą o Svelte 5 i SvelteKit. | Reaktywne powiązania dla Runes w Svelte 5 (`$state`), deklaracje `.content` przy komponentach, bezkonfiguracyjne pluginy i obsługa w wizualnym CMS. |
|
|
222
|
+
| Lipiec 2025 | `@wuchale/svelte` | Kidus Adugna (`@K1DV5`) | Wyeliminowanie konieczności tworzenia słowników i powtarzalnego importowania funkcji `$t`. | Preprocesor Svelte analizujący szablony podczas kompilacji i przekształcający węzły tekstowe na zlokalizowany kod bez dodatkowych wrapperów. |
|
|
223
223
|
|
|
224
224
|
</Tab>
|
|
225
225
|
|
|
226
226
|
<Tab label="SolidJS" value="solid">
|
|
227
227
|
|
|
228
|
-
| Pierwsze wydanie | Biblioteka | Cel powstania | Kluczowa innowacja |
|
|
229
|
-
| ---------------- | ------------------------ | ------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
230
|
-
| Wrzesień 2021 | `@solid-primitives/i18n` | Stworzenie prymitywu i18n dopasowanego do precyzyjnego modelu reaktywności w SolidJS. | Reaktywny resolver tłumaczeń oparty na sygnałach, aktualizujący elementy DOM bez udziału Virtual DOM i zbędnych ponownych renderów. |
|
|
231
|
-
|
|
|
232
|
-
| Czerwiec 2026 | `@lingui/solid` | Zastosowanie makroekstrakcji w czasie budowy oraz formatu ICU MessageFormat w projektach SolidJS. | Przekształcenia oparte na makrach dopasowane do modelu reaktywności SolidJS, kompilujące wiadomości do zwięzłych struktur czasu wykonania. |
|
|
228
|
+
| Pierwsze wydanie | Biblioteka | Autor | Cel powstania | Kluczowa innowacja |
|
|
229
|
+
| ---------------- | ------------------------ | ------------------------------ | ------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
230
|
+
| Wrzesień 2021 | `@solid-primitives/i18n` | Społeczność SolidJS | Stworzenie prymitywu i18n dopasowanego do precyzyjnego modelu reaktywności w SolidJS. | Reaktywny resolver tłumaczeń oparty na sygnałach, aktualizujący elementy DOM bez udziału Virtual DOM i zbędnych ponownych renderów. |
|
|
231
|
+
| Lipiec 2025 | `solid-intlayer` | Aymeric Pineau (`@aymericzip`) | Wydajne rozwiązanie Intlayer zaprojektowane natywnie dla SolidJS i SolidStart. | Powiązania zoptymalizowane pod kątem sygnałów SolidJS bez obciążenia Virtual DOM, pełna autokompletacja schematów TypeScript i edytor wizualny. |
|
|
232
|
+
| Czerwiec 2026 | `@lingui/solid` | Tomáš Ehrlich (`@tricoder42`) | Zastosowanie makroekstrakcji w czasie budowy oraz formatu ICU MessageFormat w projektach SolidJS. | Przekształcenia oparte na makrach dopasowane do modelu reaktywności SolidJS, kompilujące wiadomości do zwięzłych struktur czasu wykonania. |
|
|
233
233
|
|
|
234
234
|
</Tab>
|
|
235
235
|
|
|
@@ -237,7 +237,7 @@ Poniższe zakładki ilustrują, jak poszczególne ekosystemy odpowiadały na te
|
|
|
237
237
|
|
|
238
238
|
## Cztery ery architektoniczne JavaScript i18n
|
|
239
239
|
|
|
240
|
-

|
|
241
241
|
|
|
242
242
|
Analizując piętnaście lat innowacji, historię internacjonalizacji w środowisku JavaScript można ująć w czterech etapach architektonicznych:
|
|
243
243
|
|
|
@@ -287,7 +287,7 @@ Przez lata komercyjne platformy opierały swoje usługi na pośrednictwie w tych
|
|
|
287
287
|
|
|
288
288
|
Gdy modele językowe obniżyły koszt tłumaczenia do ułamków grosza przy zachowaniu wysokiej jakości, na rynku pojawiły się nowe narzędzia:
|
|
289
289
|
|
|
290
|
-
- Platformy takie jak
|
|
290
|
+
- Platformy takie jak **lingo.dev** czy **General Translation** (`gt-react`, `gt-next`) oferują własne płatne subskrypcje i chmurowe potoki pośredniczące.
|
|
291
291
|
- Z kolei **Intlayer** udostępnia automatyczne tłumaczenie z użyciem AI bezpośrednio z poziomu swojej konsoli CLI, umożliwiając zespołom korzystanie z własnych kluczy API (OpenAI, Anthropic, Mistral czy Google Gemini). Bez marż pośredników i bez uzależnienia od jednego dostawcy, rozliczenie odbywa się według podstawowych stawek wybranego modelu.
|
|
292
292
|
|
|
293
293
|
### Więcej niż i18n: kompletny system treści wielojęzycznych
|