@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,381 @@
|
|
|
1
|
+
---
|
|
2
|
+
createdAt: 2026-09-13
|
|
3
|
+
updatedAt: 2026-09-13
|
|
4
|
+
title: "Lingui vs Intlayer: 2026๋
๋ฒค์น๋งํฌ ๋ฐ ์ข
ํฉ ๋น๊ต"
|
|
5
|
+
description: "Next.js ๋ฐ TanStack Start ํ๊ฒฝ์์ ์ธก์ ๋ ๋ ์ปดํ์ผ๋ฌ ๊ธฐ๋ฐ i18n ๋ผ์ด๋ธ๋ฌ๋ฆฌ. ๋ฒ๋ค ํฌ๊ธฐ, ์ฝํ
์ธ ๋์, ์ปดํฌ๋ํธ ํฌ๊ธฐ, ํ์ด๋๋ ์ด์
, ์ธ์ด ์ ํ ๋ฐ์์ฑ ๋ฐ ๊ฐ๋ฐ์ ๊ฒฝํ ๋น๊ต."
|
|
6
|
+
keywords:
|
|
7
|
+
- Lingui
|
|
8
|
+
- Intlayer
|
|
9
|
+
- ๊ตญ์ ํ
|
|
10
|
+
- i18n
|
|
11
|
+
- ๋ฒค์น๋งํฌ
|
|
12
|
+
- ๋ฒ๋ค ํฌ๊ธฐ
|
|
13
|
+
- ์ปดํ์ผ๋ฌ
|
|
14
|
+
- ๋ธ๋ก๊ทธ
|
|
15
|
+
- Next.js
|
|
16
|
+
- TanStack Start
|
|
17
|
+
- JavaScript
|
|
18
|
+
- React
|
|
19
|
+
slugs:
|
|
20
|
+
- blog
|
|
21
|
+
- lingui-vs-intlayer
|
|
22
|
+
author: aymericzip
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
# Lingui VS Intlayer | React & Next.js ๊ตญ์ ํ (i18n) ๋ฒค์น๋งํฌ ๋น๊ต
|
|
26
|
+
|
|
27
|
+
Lingui์ Intlayer๋ ์ด๋ฒ ๋ฒค์น๋งํฌ์์ ๋จ์ํ ๋ฐํ์ ๋์ **์ปดํ์ผ๋ฌ**๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์๋ํ๋ ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์
๋๋ค. Lingui๋ ๋น๋ ์ ๋งคํฌ๋ก์์ ๋ฉ์์ง๋ฅผ ์ถ์ถํ์ฌ ์ธ์ด๋ณ ์นดํ๋ก๊ทธ๋ฅผ ์ปดํ์ผํฉ๋๋ค. Intlayer๋ ์ปดํฌ๋ํธ ๋จ์๋ก ๋์
๋๋ฆฌ๋ฅผ ์ปดํ์ผํ๊ณ ์ธ์ด๋ณ๋ก Tree-shaking์ ์ ์ฉํฉ๋๋ค. ์ด๋ก ์ ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ฑ๋ฅ์ ๋งค์ฐ ์ ์ฌํด์ผ ํ์ง๋ง, ์ค์ ์ธก์ ๋ฐ์ดํฐ๋ ๋ช
ํํ ์ฐจ์ด์ ์ ๋ณด์ฌ์ค๋๋ค.
|
|
28
|
+
|
|
29
|
+
๋ณธ ๋ฐ์ดํฐ๋ ๊ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํด ๋์ผํ ์ ํ๋ฆฌ์ผ์ด์
์ ๋น๋ํ๊ณ ๋ธ๋ผ์ฐ์ ๊ฐ ์ค์ ๋ก ๋ค์ด๋ก๋ํ์ฌ ์คํํ๋ ๋ฆฌ์์ค๋ฅผ ๊ธฐ๋กํ๋ ์คํ์์ค ํ
์คํธ ๋๊ตฌ์ธ [Benchmark Bloom](https://github.com/intlayer-org/benchmark-bloom)์์ ์ถ์ถ๋์์ต๋๋ค.
|
|
30
|
+
|
|
31
|
+
<TOC/>
|
|
32
|
+
|
|
33
|
+
> **์์ฝ (tl;dr)**: ์์ ํ์ด์ง๋น JavaScript ํฌ๊ธฐ ์ธก๋ฉด์์ Lingui๋ Intlayer์ ๊ฐ์ฅ ๊ทผ์ ํฉ๋๋ค. ์ง์ฐ ๋ก๋ฉ์ ์ค์ ํ TanStack Start์์๋ **115~120 KB** ๋ **118.6 KB**, Next.js์์๋ **148.6 KB** ๋ **141.3 KB**๋ฅผ ๊ธฐ๋กํ์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ค๋ฅธ ์งํ๋ค์์ ๊ฒฉ์ฐจ๊ฐ ๋ฒ์ด์ง๋๋ค. ๋จ๋
์ปดํ์ผ๋ ์ปดํฌ๋ํธ ํฌ๊ธฐ๋ Intlayer์ **6~8 KB**์ ๋นํด Lingui๋ **58~153 KB**์ ๋ฌํ๊ณ , ํ์ด๋๋ ์ด์
์๊ฐ์ Intlayer์ **11~14 ms** ๋๋น **28~34 ms**๊ฐ ์์๋๋ฉฐ, ์ต์ ํ๋ ์ค์ ์์๋ ๊ธฐ๋ณธ ์์ด ํด๋ฐฑ ๋ฌธ์์ด์ด ํ๋์ค์ด ํ์ด์ง๋ก **3~15%** ๋์๋ฉ๋๋ค. ๋ํ ์ด๋ฌํ ์ต์ ํ๋ฅผ ๊ตฌํํ๋ ค๋ฉด ๋ผ์ฐํธ๋ณ ์นดํ๋ก๊ทธ๋ฅผ ์๋์ผ๋ก ์ถ์ถ, ์ปดํ์ผ, ๋ถํ ํด์ผ ํฉ๋๋ค. Intlayer๋ ์ค์ ์์ด๋ ์ด๋ฅผ ๊ธฐ๋ณธ ์ ๊ณตํฉ๋๋ค.
|
|
34
|
+
|
|
35
|
+
## ํต์ฌ ์์ฝ
|
|
36
|
+
|
|
37
|
+
- **Lingui** - ๋งคํฌ๋ก ๊ธฐ๋ฐ(`` t`...` ``, `<Trans>`, `msg`), ICU MessageFormat, `.po` / JSON ์นดํ๋ก๊ทธ, `lingui extract` + `lingui compile` ์ํฌํ๋ก์ฐ. ๋ฉ์์ง ID๋ฅผ ์งง์ ํด์๋ก ์ปดํ์ผํ๊ณ ์ธ์ด๋ณ ๋์ ์นดํ๋ก๊ทธ ๋ก๋ฉ์ ์ง์. ์ค๋ ๊ธฐ๊ฐ ๊ฒ์ฆ๋์์ผ๋ฉฐ ํ๋ ์์ํฌ์ ๋
๋ฆฝ์ ์ด๊ณ , `.po` ๊ธฐ๋ฐ์ ๋ฒ์ญ ํด์ฒด์ธ์ด ํํํจ.
|
|
38
|
+
- **Intlayer** - ์ปดํฌ๋ํธ ์ค์ฌ ์ฝํ
์ธ ๋ชจ๋ธ. `.content.ts` ๋์
๋๋ฆฌ๊ฐ ํด๋น ์ปดํฌ๋ํธ ๋ฐ๋ก ์์ ์์นํ๋ฉฐ, ๋น๋ ํ์ ์ปดํ์ผ๋ฌ๊ฐ ์ปดํฌ๋ํธ ๋ฐ ์ธ์ด ๋จ์๋ก Tree-shaking๊ณผ ์ง์ฐ ๋ก๋ฉ์ ์๋ ์ฒ๋ฆฌ. ์ฝํ
์ธ ๋ก๋ถํฐ ์๊ฒฉํ TypeScript ํ์
์ ์๋ ์์ฑํ๊ณ ๋๋ฝ๋ ๋ฒ์ญ์ ๋น๋ ์๋ฌ๋ก ๊ฐ์ง. ๋ฏธ๋ค์จ์ด, SEO ํฌํผ, ๋น์ฃผ์ผ ์๋ํฐ / CMS ๋ฐ AI ๋ฒ์ญ ๊ธฐ๋ฅ ๊ธฐ๋ณธ ํ์ฌ.
|
|
39
|
+
|
|
40
|
+
| ๋ผ์ด๋ธ๋ฌ๋ฆฌ | GitHub Stars | ์ด ์ปค๋ฐ ์ | ์ต๊ทผ ์ปค๋ฐ | ์ต์ด ๋ฆด๋ฆฌ์ค | NPM ๋ฒ์ | NPM ๋ค์ด๋ก๋ ์ |
|
|
41
|
+
| --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- | ----------- | ------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------ |
|
|
42
|
+
| `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) |
|
|
43
|
+
| `lingui/js-lingui` | [](https://github.com/lingui/js-lingui/stargazers) | [](https://github.com/lingui/js-lingui/commits) | [](https://github.com/lingui/js-lingui/commits) | 2016๋
12์ | [](https://www.npmjs.com/package/@lingui/core) | [](https://www.npmjs.com/package/@lingui/core) |
|
|
44
|
+
|
|
45
|
+
> ๋ฐฐ์ง๋ ์๋์ผ๋ก ์
๋ฐ์ดํธ๋ฉ๋๋ค. ์ค๋
์ท ์์น๋ ์๊ฐ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง ์ ์์ต๋๋ค.
|
|
46
|
+
|
|
47
|
+
## ์ฃผ์ ๊ธฐ๋ฅ ์ผ๋์ผ ๋น๊ต
|
|
48
|
+
|
|
49
|
+
| ๊ธฐ๋ฅ | Intlayer (`react-intlayer` / `next-intlayer`) | Lingui (`@lingui/core` / `@lingui/react`) |
|
|
50
|
+
| ------------------------------------------- | ---------------------------------------------------------------------------- | ------------------------------------------------------------------------------------ |
|
|
51
|
+
| **์ปดํฌ๋ํธ ์ธ๊ทผ ๋ฒ์ญ ๊ด๋ฆฌ** | โ
์ง์, ๊ฐ ์ปดํฌ๋ํธ์ ๋์ผํ ์์น์ `.content.ts` ๋ฐฐ์น | โ ๏ธ JSX ๋ด ๋งคํฌ๋ก๋ก ์์ค ๋ฌธ์์ด ์์ฑ, ๋ฒ์ญ๋ฌธ์ ์ค์ ์ง์ค์ `.po` ์นดํ๋ก๊ทธ์์ ๊ด๋ฆฌ |
|
|
52
|
+
| **TypeScript ํตํฉ** | โ
์ฝํ
์ธ ๋ฅผ ๋ฐํ์ผ๋ก ์๊ฒฉํ ํ์
์๋ ์์ฑ | โ ๏ธ ๋งคํฌ๋ก๋ ํ์
์ด ์ง์ ๋์ง๋ง ๋ฉ์์ง ID๋ ๋ฏธ์ง์ , ์นดํ๋ก๊ทธ ๋๋ฝ ํค๋ ๊ฐ์ง ๋ถ๊ฐ |
|
|
53
|
+
| **๋๋ฝ๋ ๋ฒ์ญ ๊ฐ์ง** | โ
TypeScript ์ค๋ฅ + ๋น๋ ํ์ ์ค๋ฅ/๊ฒฝ๊ณ | โ ๏ธ `lingui extract`๊ฐ ํต๊ณ๋ฅผ ์ถ๋ ฅํ๋ฉฐ, ๋ฐํ์์๋ ์์ด ์๋ฌธ์ผ๋ก ์๋ ๋์ฒด๋จ |
|
|
54
|
+
| **๋ฆฌ์น ์ฝํ
์ธ (JSX / Markdown / ์ปดํฌ๋ํธ)** | โ
๊ธฐ๋ณธ ๋ค์ดํฐ๋ธ ์ง์ | โ
์ปดํฌ๋ํธ ์ค์ฒฉ์ด ๊ฐ๋ฅํ `<Trans>` ์ ๊ณต |
|
|
55
|
+
| **ICU ์ง์** | โ ๏ธ ๊ฐ๋ฐ ์งํ ์ค | โ
์ง์ (`plural`, `select`, `selectOrdinal` ๋งคํฌ๋ก) |
|
|
56
|
+
| **ํฌ๋งทํ
(๋ ์ง, ์ซ์, ํตํ)** | โ
`useNumber`, `useDate`, ... (๋ด๋ถ์ ์ผ๋ก `Intl` ํ์ฉ) | โ
`i18n.date()`, `i18n.number()` |
|
|
57
|
+
| **์ง์ญํ๋ ๋ผ์ฐํ
๋ฐ ๋ฏธ๋ค์จ์ด** | โ
๋ด์ฅ ํ๋ก์/๋ฏธ๋ค์จ์ด, `getMultilingualUrls` ์ ํธ๋ฆฌํฐ ์ ๊ณต | โ ์ฝ์ด ๋ฏธ์ง์ |
|
|
58
|
+
| **SEO ํฌํผ (hreflang, sitemap, robots)** | โ
๋ด์ฅ ํฌํผ ๊ธฐ๋ณธ ํ์ฌ | โ ์๋ ๊ตฌํ ํ์ |
|
|
59
|
+
| **๋๊ธฐ์ ์๋ฒ ์ปดํฌ๋ํธ (RSC)** | โ
`next-intlayer/server`์ `useIntlayer`๊ฐ ๋ชจ๋ ํ์ ์๋ฒ ์ปดํฌ๋ํธ์์ ๋์ | โ ๏ธ ์์ฒญ๋ง๋ค `I18n` ์ธ์คํด์ค ํ์ (Props ์ ๋ฌ ๋๋ `setI18n` ์ฌ์ฉ) |
|
|
60
|
+
| **Tree-shaking (์ฌ์ฉ๋ ์ฝํ
์ธ ๋ง ๋ฐฐํฌ)** | โ
์ปดํฌ๋ํธ๋ณ, ์ธ์ด๋ณ๋ก ์ปดํ์ผ๋ฌ๊ฐ ์ ์๋ ์ฒ๋ฆฌ | โ ๏ธ `lingui compile`์ ํตํ ์ธ์ด๋ณ ๋ถ๋ฆฌ ์ง์, ๋ผ์ฐํธ๋ณ ๋ถ๋ฆฌ๋ ์นดํ๋ก๊ทธ ์๋ ๋ถํ ํ์ |
|
|
61
|
+
| **์ง์ฐ ๋ก๋ฉ (Lazy loading)** | โ
`importMode: 'dynamic'` (์ค์ ํ ์ค๋ก ์๋ฃ) | โ ๏ธ ์ปดํ์ผ๋ ์นดํ๋ก๊ทธ `import()` ๋ฐ `i18n.load()` / `i18n.activate()` ์๋ ํธ์ถ ํ์ |
|
|
62
|
+
| **๋ฏธ์ฌ์ฉ ์ฝํ
์ธ ์ ๋ฆฌ** | โ
์ฌ์ฉ๋์ง ์๋ ๋์
๋๋ฆฌ๋ ๋น๋ ์ ์ ๊ฑฐ | โ
`lingui extract --clean`์ผ๋ก ์ค๋๋ ๋ฉ์์ง ์ ๋ฆฌ ๊ฐ๋ฅ |
|
|
63
|
+
| **๋๋ฝ ๋ฒ์ญ ํ
์คํธ (CLI / CI)** | โ
`npx intlayer content test` | โ ๏ธ `lingui extract` ํต๊ณ ํ์ธ (๊ธฐ๋ณธ์ ์ผ๋ก ์คํจ ์ข
๋ฃ ์ฝ๋๋ฅผ ๋ฐํํ์ง ์์) |
|
|
64
|
+
| **๋น๋ ํ์ดํ๋ผ์ธ** | โ
ํ๋ฌ๊ทธ์ธ 1๊ฐ (`@intlayer/swc` / `@intlayer/babel` / `vite-intlayer`) | โ ๏ธ ๋งคํฌ๋ก ํ๋ฌ๊ทธ์ธ(Babel ๋๋ SWC) + `extract` + `compile` ๊ฐ๋ณ ๋จ๊ณ ํ์ |
|
|
65
|
+
| **AI ๋ฒ์ญ ์๋ํ** | โ
๊ธฐ๋ณธ ๋ด์ฅ, ๋ณด์ ํ API ํค ์ฌ์ฉ (OpenAI, Anthropic, Mistral ๋ฑ) | โ ๋ฏธ์ง์ |
|
|
66
|
+
| **๋น์ฃผ์ผ ์๋ํฐ / CMS** | โ
๋ฌด๋ฃ Visual Editor + ์ ํํ CMS | โ ๋ฏธ์ง์ (`.po` ํ์ผ๋ก ์ธ๋ถ TMS์ ์ฐ๋) |
|
|
67
|
+
| **MCP ์๋ฒ ๋ฐ ์์ด์ ํธ ์คํฌ** | โ
์ง์ | โ ๋ฏธ์ง์ |
|
|
68
|
+
| **์ํ๊ณ ๋ฐ ์ปค๋ฎค๋ํฐ** | โ ๏ธ ์ ์์ด๋ ๊ฐํ๋ฅด๊ฒ ์ฑ์ฅ ์ค | โ
๊ฒ์ฆ๋จ, ํ๋ ์์ํฌ ๋
๋ฆฝ์ |
|
|
69
|
+
|
|
70
|
+
## ๋ฒค์น๋งํฌ ํ
์คํธ
|
|
71
|
+
|
|
72
|
+
### ๋ฌด์์ ์ธก์ ํ๋๊ฐ
|
|
73
|
+
|
|
74
|
+
[Benchmark Bloom](https://github.com/intlayer-org/benchmark-bloom) ์ ํ๊ตฐ์ ๊ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก **์์ ํ ๋์ผํ ์ ํ๋ฆฌ์ผ์ด์
**์ ๋น๋ํฉ๋๋ค: **10๊ฐ ํ์ด์ง**(home, about, blog, careers, contact, FAQ, pricing, products, settings, team), **10๊ฐ ์ธ์ด**(`en`, `fr`, `es`, `de`, `it`, `pt`, `zh`, `ja`, `ko`, `ru`), ๋์ผํ ์ปดํฌ๋ํธ ๋ฐ ๋์ผํ ์ฝํ
์ธ . ํ์ด์ง ์ธก์ ์ `en`๊ณผ `fr`์ ๋์์ผ๋ก ์งํ๋์์ต๋๋ค. ๊ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ต๋ 4๊ฐ์ง **๋ก๋ฉ ์ ๋ต**์ผ๋ก ๋น๋๋์์ต๋๋ค:
|
|
75
|
+
|
|
76
|
+
| ์ ๋ต | ์ค๋ช
| ์ผ๋ฐ์ ์ธ ์ ์ฉ ์ฌ๋ก |
|
|
77
|
+
| ------------------ | ---------------------------------------------------------------------------- | ------------------------------- |
|
|
78
|
+
| **static** | ๋ชจ๋ ์ธ์ด์ ์ปดํ์ผ๋ ์นดํ๋ก๊ทธ๋ฅผ ์ด๊ธฐ์ ํ ๋ฒ์ ์ํฌํธํ์ฌ ๋ก๋ | ๋น ๋ฅธ ํ๋กํ ํ์
, AI ์์ฑ ์ฝ๋ |
|
|
79
|
+
| **dynamic** | ํ์ฑ ์ธ์ด์ ์นดํ๋ก๊ทธ๋ง `import()`ํ์ง๋ง, ์ฌ์ดํธ ์ ์ฒด ํ์ด์ง๊ฐ ํฌํจ๋จ | ๋๋ถ๋ถ์ ์ผ๋ฐ ํ๋ก์ ํธ |
|
|
80
|
+
| **scoped-static** | ๋ผ์ฐํธ๋ณ๋ก ์นดํ๋ก๊ทธ๋ฅผ ๋ถํ ํ๋, ์ด๊ธฐ ๋ฒ๋ค์ ๋ชจ๋ ํฌํจ์ํด | ๋๋ฌธ ๊ฒฝ์ฐ |
|
|
81
|
+
| **scoped-dynamic** | ๋ผ์ฐํธ๋ณ ์นดํ๋ก๊ทธ ๋ถํ + ์ง์ฐ `import()`. ํ์ฌ ํ์ด์ง์ ํ์ฌ ์ธ์ด๋ง ๋ค์ด๋ก๋ | ์๊ฒฉํ ๋ฒ๋ค ํฌ๊ธฐ ์ ํ์ด ์๋ ์ฑ |
|
|
82
|
+
|
|
83
|
+
Intlayer๋ ๋ณ๋์ "scoped" ๋ฒ์ ์ด ํ์ํ์ง ์์ต๋๋ค. ์ปดํ์ผ๋ฌ๊ฐ **์ปดํฌ๋ํธ ๋จ์**๋ก ์ฝํ
์ธ ๋ฅผ ์๋ ๋ถํ ํ๋ฏ๋ก `static`๊ณผ `dynamic` ํ ์์ฒด๊ฐ ์ด๋ฏธ ์ต์ ์ผ๋ก ๋ถํ ๋์ด ์์ต๋๋ค.
|
|
84
|
+
|
|
85
|
+
๊ฐ ๋น๋๋ณ๋ก ๋ค์ ์งํ๋ฅผ ๊ธฐ๋กํฉ๋๋ค:
|
|
86
|
+
|
|
87
|
+
- **Lib size**: i18n ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ง ์ํฌํธํ๋ ๋น ์ปดํฌ๋ํธ์ gzip ํฌ๊ธฐ (๊ณ ์ ๋ฐํ์ ๋น์ฉ).
|
|
88
|
+
- **Page JS**: ์ ์ฒด ํ์ด์ง ๋ฐ ์ธ์ด ํ๊ท ์ผ๋ก ํ์ด์ง๋น ๋ค์ด๋ก๋๋ gzip JavaScript ํฌ๊ธฐ.
|
|
89
|
+
- **Locale leak %**: ๋ค์ด๋ก๋๋ JS ์ค ์ฌ์ฉ์๊ฐ ์กฐํํ์ง **์๋** ์ธ์ด์ ์ํ ๋ฒ์ญ ๋ฌธ์์ด์ ๋น์จ.
|
|
90
|
+
- **Page leak %**: ๋ค์ด๋ก๋๋ JS ์ค ์ฌ์ฉ์๊ฐ ๋จธ๋ฌผ๊ณ ์์ง **์๋** ํ์ด์ง์ ์ํ ๋ฒ์ญ ๋ฌธ์์ด์ ๋น์จ.
|
|
91
|
+
- **Component avg**: ๊ฐ ์ปดํฌ๋ํธ๋ฅผ ๋
๋ฆฝ์ ์ผ๋ก ์ปดํ์ผํ์ ๋์ ํ๊ท gzip ํฌ๊ธฐ.
|
|
92
|
+
- **E2E reactivity**: ์๋ก์ด ์ธ์ด๋ฅผ ์ ํํ ์์ ๋ถํฐ DOM์์ `html[lang]`์ด ๊ฐฑ์ ๋ ๋๊น์ง์ ์ค์ธก ์์ ์๊ฐ(Playwright, 5ํ ๋ฐ๋ณต ํ๊ท ).
|
|
93
|
+
- **Hydration**: React ํ์ด๋๋ ์ด์
๋จ๊ณ ์์ ์๊ฐ.
|
|
94
|
+
|
|
95
|
+
> ์๋ ์์น๋ `@lingui/react` 6.6.0 ๋ฐ `intlayer` 9.5.1์ ์ฌ์ฉํ **2026-09-12** ์ธก์ ๊ฒฐ๊ณผ์
๋๋ค. ํ
์คํธ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ฐ๊ฒฐํ๊ฒ ๊ตฌ์ฑ๋์์ผ๋ฏ๋ก, ๋์์จ์ ์ฝํ
์ธ ๊ท๋ชจ๊ฐ ์ปค์ง์๋ก ์ฌํ๋๋ **๊ตฌ์กฐ์ ํจํด**์ ๋๋ฌ๋
๋๋ค.
|
|
96
|
+
|
|
97
|
+
### Next.js ์ธก์ ๊ฒฐ๊ณผ
|
|
98
|
+
|
|
99
|
+
| ๋ผ์ด๋ธ๋ฌ๋ฆฌ | ์ ๋ต | Lib size (gz) | Page JS ํ๊ท (gz) | ์ธ์ด ๋์์จ | ํ์ด์ง ๋์์จ | ์ปดํฌ๋ํธ ํ๊ท (gz) | E2E ๋ฐ์์ฑ | ํ์ด๋๋ ์ด์
|
|
|
100
|
+
| -------------------- | -------------- | ------------: | ----------------: | ----------: | ------------: | -----------------: | ----------: | -----------: |
|
|
101
|
+
| **base** (i18n ์์) | - | 0.0 KB | 141.0 KB | 0.0% | 0.0% | 0.9 KB | 13.4 ms | 11.8 ms |
|
|
102
|
+
| Lingui | static | 11.9 KB | 207.4 KB | 50.0% | 90.0% | 73.3 KB | 15.3 ms | 15.2 ms |
|
|
103
|
+
| Lingui | dynamic | 11.9 KB | 145.4 KB | 2.8% | 89.9% | 19.9 KB | 15.7 ms | 12.7 ms |
|
|
104
|
+
| Lingui | scoped-static | 11.9 KB | 148.2 KB | 2.7% | 89.1% | 20.4 KB | 15.1 ms | 13.1 ms |
|
|
105
|
+
| Lingui | scoped-dynamic | 11.9 KB | 148.6 KB | 14.8% | 0.0% | 152.6 KB | 16.1 ms | 14.8 ms |
|
|
106
|
+
| **`next-intlayer`** | static | **5.5 KB** | **141.3 KB** | **0.0%** | **0.0%** | **8.5 KB** | 15.5 ms | 16.9 ms |
|
|
107
|
+
| **`next-intlayer`** | dynamic | **5.5 KB** | **141.3 KB** | **0.0%** | **0.0%** | **6.9 KB** | **15.3 ms** | 15.9 ms |
|
|
108
|
+
|
|
109
|
+
**์งํ ๋ถ์**
|
|
110
|
+
|
|
111
|
+
- **๋ฐํ์ ๊ณ ์ ๋น์ฉ.** ๋น ์ปดํฌ๋ํธ ๊ธฐ์ค Lingui๋ 11.9 KB gzip, Intlayer๋ 5.5 KB๋ฅผ ์ฐจ์งํฉ๋๋ค. ์ ์ฒด ํ์ด์ง ๊ธฐ์ค Lingui์ ์ต์ ๊ตฌ์ฑ์ Intlayer ๋๋น **+7.3 KB**(148.6 KB ๋ 141.3 KB)์ด๋ฉฐ, Intlayer๋ i18n์ด ์๋ ๊ธฐ๋ณธ ์ฑ ๋๋น ๋ถ๊ณผ **+0.3 KB** ์ฆ๊ฐ์ ๊ทธ์ณค์ต๋๋ค.
|
|
112
|
+
- **๋จ์ ๊ตฌ์ฑ์ ์น๋ช
์ ์ค๋ฒํค๋.** ๋ชจ๋ ์นดํ๋ก๊ทธ๋ฅผ ์ฌ์ ์ ๋ก๋ํ๋ฉด **ํ์ด์ง๋น 207.4 KB**๋ก ๊ธฐ๋ณธ ์ฑ ๋๋น +66 KB๊ฐ ๋์ด๋ฉ๋๋ค. ๋ฌธ์์ด์ ์ ๋ฐ์ ํ์ ์๋ ์ธ์ด์ด๊ณ , 90%๋ ๋ค๋ฅธ ํ์ด์ง์ ์ฝํ
์ธ ์
๋๋ค.
|
|
113
|
+
- **๋์ ๋ก๋ฉ์ ์ธ์ด๋ง ํด๊ฒฐํ ๋ฟ ํ์ด์ง๋ ํด๊ฒฐํ์ง ๋ชปํจ.** ์ธ์ด๋ณ ๋จ์ผ ์นดํ๋ก๊ทธ ๋ฐฉ์์์๋ ํ์ด์ง ๋์์จ์ด ์ฝ 90%๋ก ์ ์ง๋ฉ๋๋ค. ํ๋์ค์ด ์ ์ฒด ์นดํ๋ก๊ทธ๊ฐ ๋ชจ๋ ๊ฐ๋ณ ํ์ด์ง์ ์ ์ก๋๊ธฐ ๋๋ฌธ์
๋๋ค. Lingui์์ ํ์ด์ง ๋์๋ฅผ 0%๋ก ๋ง๋ค๋ ค๋ฉด `scoped-dynamic`(๋ผ์ฐํธ๋ณ๋ก ์นดํ๋ก๊ทธ๋ฅผ ์๋ ์ถ์ถ ๋ฐ ์ปดํ์ผํ์ฌ ๊ฐ ํ์ด์ง์ ์ง์ ๋ก๋)์ ๊ตฌ์ฑํด์ผ ํฉ๋๋ค.
|
|
114
|
+
- **์์ด ์๋ฌธ ํด๋ฐฑ์ ๋ฒ๋ค ์ ์
.** ์ต์ ํ๋ ์ค์ ์์๋ **ํ๋์ค์ด ํ์ด์ง์ 3~15%์ ์์ด ๋ฌธ์์ด์ด ํญ์ ํฌํจ**๋ฉ๋๋ค. Lingui ๋งคํฌ๋ก๋ ๋ง์ฝ์ ๋๋นํด ์๋ฌธ ๋ฌธ์์ด์ ๋ฒ๋ค์ ๋ณด๊ดํ๊ธฐ ๋๋ฌธ์
๋๋ค. Intlayer๋ ๋น๋ ์์ ์ ํด๋ฐฑ์ ์ฒ๋ฆฌํ๋ฏ๋ก ํ์ฑ ์ธ์ด๋ง ์ ๋ฌํฉ๋๋ค.
|
|
115
|
+
- **`scoped-dynamic`์์ ์ปดํฌ๋ํธ ํฌ๊ธฐ ๊ธ์ฆ.** ๊ฐ๋ณ ์ปดํ์ผ๋ ์ปดํฌ๋ํธ๋ ํ๊ท **152.6 KB**์ ๋ฌํฉ๋๋ค. ์ํฌํธ ์ฒด์ธ์ ํตํด ๋ผ์ฐํธ ์นดํ๋ก๊ทธ ์ ์ฒด์ ์ ๊ทผ ๊ฐ๋ฅํด์ง๊ธฐ ๋๋ฌธ์
๋๋ค. ๋์ผ ์ปดํฌ๋ํธ๋ฅผ `useIntlayer()`๋ก ๊ตฌ์ฑํ๋ฉด ํ๊ท **6.9 KB**์ ๋ถ๊ณผํฉ๋๋ค.
|
|
116
|
+
|
|
117
|
+
### TanStack Start ์ธก์ ๊ฒฐ๊ณผ
|
|
118
|
+
|
|
119
|
+
| ๋ผ์ด๋ธ๋ฌ๋ฆฌ | ์ ๋ต | Lib size (gz) | Page JS ํ๊ท (gz) | ์ธ์ด ๋์์จ | ํ์ด์ง ๋์์จ | ์ปดํฌ๋ํธ ํ๊ท (gz) | E2E ๋ฐ์์ฑ | ํ์ด๋๋ ์ด์
|
|
|
120
|
+
| --------------------------- | -------------- | ------------: | ----------------: | ----------: | ------------: | -----------------: | ---------: | -----------: |
|
|
121
|
+
| **base** (i18n ์์) | - | 0.0 KB | 111.0 KB | 0.0% | 0.0% | 0.7 KB | 8.1 ms | 21.6 ms |
|
|
122
|
+
| Lingui | static | 11.2 KB | 152.2 KB | 50.0% | 90.0% | 58.0 KB | 3.9 ms | 19.9 ms |
|
|
123
|
+
| Lingui | dynamic | 11.2 KB | 115.2 KB | 9.3% | 0.0% | 85.5 KB | 5.9 ms | 28.0 ms |
|
|
124
|
+
| Lingui | scoped-static | 11.2 KB | 120.8 KB | 4.0% | 0.0% | 147.9 KB | 7.1 ms | 33.9 ms |
|
|
125
|
+
| Lingui | scoped-dynamic | 11.2 KB | 120.2 KB | 8.6% | 0.0% | 83.7 KB | 42.1 ms | 32.9 ms |
|
|
126
|
+
| **`intlayer`** | static | **5.0 KB** | **125.8 KB** | 50.0% | **0.0%** | **8.1 KB** | **3.2 ms** | **11.5 ms** |
|
|
127
|
+
| **`intlayer`** | dynamic | **5.0 KB** | **118.6 KB** | **0.0%** | **0.0%** | **6.3 KB** | 3.6 ms | **14.1 ms** |
|
|
128
|
+
| `@intlayer/lingui` (์ด๋ํฐ) | dynamic | 10.3 KB | 137.0 KB | 9.9% | 0.0% | 12.8 KB | **2.9 ms** | 19.7 ms |
|
|
129
|
+
|
|
130
|
+
**์งํ ๋ถ์**
|
|
131
|
+
|
|
132
|
+
- **ํ์ด์ง๋น JS ํฌ๊ธฐ๋ Lingui๊ฐ ๋ฏธ์ธํ๊ฒ ์ฐ์ธ.** `dynamic` ๋ชจ๋์ Lingui๋ **115.2 KB**๋ก Intlayer์ 118.6 KB๋ณด๋ค 3.4 KB ๊ฐ๋ณ์ต๋๋ค. ํด์ ๊ธฐ๋ฐ์ ์ปดํ์ผ๋ ์นดํ๋ก๊ทธ๊ฐ ๊ณ ๋ฐ๋๋ก ์์ถ๋๋ฉฐ, TanStack Start ๋ผ์ฐํฐ๊ฐ ํ์ด์ง๋ฅผ ํจ๊ณผ์ ์ผ๋ก ๋ถํ ํ์ฌ `dynamic` ๋จ๊ณ์์ ์ด๋ฏธ ํ์ด์ง ๋์์จ์ด 0%๊ฐ ๋ฉ๋๋ค.
|
|
133
|
+
- **๊ทธ ์ธ ๋ชจ๋ ์์ญ์์๋ Intlayer๊ฐ ํ์คํ ์ฐ์.** ํ์ด๋๋ ์ด์
์๊ฐ์ Lingui๊ฐ **28~34 ms**์ธ ๋ฐ๋ฉด Intlayer๋ **11~14 ms**์
๋๋ค. `i18n.load()` + `i18n.activate()`๊ฐ React ํ์ด๋๋ ์ด์
์ ์ ํด๋ผ์ด์ธํธ์์ ์ฒ๋ฆฌ๋์ด์ผ ํ๊ธฐ ๋๋ฌธ์
๋๋ค. ๊ฐ๋ณ ์ปดํฌ๋ํธ ํฌ๊ธฐ ์ญ์ Lingui๊ฐ **58~148 KB**์ธ ๋ฐ๋ฉด Intlayer๋ **6~8 KB**์ด๋ฉฐ, ์ธ์ด ๋์์จ๋ ํด๋ฐฑ ๊ตฌ์กฐ๋ก ์ธํด Lingui๋ 0%๊ฐ ๋ ์ ์์ต๋๋ค.
|
|
134
|
+
- **์ต์ ํ ์ค์ ์์ ์ธ์ด ์ ํ ์ ์ง์ฐ ๋ฐ์.** `scoped-dynamic` Lingui๋ ๋ผ์ฐํธ ์นดํ๋ก๊ทธ๋ฅผ ๊ฐ์ ธ์ ํ์ฑํ๊ณ ํ์ฑํํ ๋๊น์ง ํ๋ฉด ๊ฐฑ์ ์ด ๋ฉ์ถ๋ฏ๋ก `html[lang]` ๋ณ๊ฒฝ์ **42 ms**๊ฐ ์์๋ฉ๋๋ค. Intlayer๋ ๋ ๋ชจ๋ ๋ชจ๋์์ **3~4 ms**๋ง์ ์ฆ๊ฐ ๋ฐ์ํฉ๋๋ค.
|
|
135
|
+
- **Intlayer์ `static`์ ์ด๋ฏธ ํ์ด์ง ๋์ 0% ๋ฌ์ฑ.** ํด๋น ํ์ด์ง์ ์ปดํฌ๋ํธ๊ฐ ์ค์ ๋ก ์ฌ์ฉํ๋ ๋์
๋๋ฆฌ๋ง ๋ฒ๋ค๋งํ๊ธฐ ๋๋ฌธ์
๋๋ค. ์ค์ ์ `importMode: 'dynamic'`์ ์ถ๊ฐํ๋ฉด ์ธ์ด ๋์๊น์ง ์๋ฒฝํ ์ ๊ฑฐ๋ฉ๋๋ค.
|
|
136
|
+
- **`@intlayer/lingui`**๋ Lingui์ ๋งคํฌ๋ก ๊ตฌ๋ฌธ์ ์ ์งํ๋ฉด์ Intlayer ๋์
๋๋ฆฌ๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ์๋นํฉ๋๋ค. ํ์ด์ง ํฌ๊ธฐ(๋งคํฌ๋ก ๋ฐํ์ ์ ์ง๋ก ์ธํด 137 KB)๋ฅผ ์ํญ ์๋ณดํ๋ ๋์ ํจ์ฌ ๊ฐ๋ฒผ์ด ์ปดํฌ๋ํธ(12.8 KB)์ ๋น ๋ฅธ ํ์ด๋๋ ์ด์
์ ์ป์ ์ ์์ด ํ๋ฅญํ ์ ํ ๊ฒฝ๋ก๊ฐ ๋ฉ๋๋ค.
|
|
137
|
+
|
|
138
|
+
## ์ ์ด๋ฐ ๊ฒฉ์ฐจ๊ฐ ๋ฐ์ํ๋๊ฐ? ๋ ์ปดํ์ผ๋ฌ์ ์๋ก ๋ค๋ฅธ ์์
๋จ์
|
|
139
|
+
|
|
140
|
+
๋ ๋๊ตฌ ๋ชจ๋ ์ปดํ์ผ๋ฌ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ํต์ฌ ์ฐจ์ด๋ **๋ฌด์์** ์ปดํ์ผํ๋๊ฐ์ ์์ต๋๋ค.
|
|
141
|
+
|
|
142
|
+
**Lingui๋ ์นดํ๋ก๊ทธ๋ฅผ ์ปดํ์ผํฉ๋๋ค.** ์์ค ๋ด ๋งคํฌ๋ก๋ ์ธ์ด๋ณ `.po` ํ์ผ๋ก ์ถ์ถ๋ ํ ์ธ์ด๋ณ JS ๋ชจ๋๋ก ์ปดํ์ผ๋ฉ๋๋ค. ๊ธฐ๋ณธ ๋จ์๋ **๋ก์ผ์ผ(์ธ์ด ์ ์ฒด)**์
๋๋ค. ๋ผ์ฐํธ๋ ์ปดํฌ๋ํธ ๋จ์๋ก ์ธ๋ถํํ๋ ค๋ฉด ์ฌ๋ฌ ์นดํ๋ก๊ทธ๋ฅผ ์์ฑํ๊ณ , `lingui.config.ts`์์ ๊ฐ ํ์ผ์ ๋ณ๋ ์ถ์ถํ๋๋ก ๋งคํํ ํ, ๊ฐ ๋ผ์ฐํธ์์ ์๋์ผ๋ก ๋ก๋ํด์ผ ํฉ๋๋ค. `I18n` ์ธ์คํด์ค๋ ์ ์ญ ์ํ์ด๋ฉฐ, ๋ชจ๋ `useLingui()`๊ฐ ์ปดํฌ๋ํธ๋ฅผ ์ด ์ ์ญ ์ธ์คํด์ค์ ์ข
์์ํต๋๋ค.
|
|
143
|
+
|
|
144
|
+
```bash
|
|
145
|
+
.
|
|
146
|
+
โโโ lingui.config.ts
|
|
147
|
+
โโโ src
|
|
148
|
+
โโโ i18n.ts # setupI18n(), load(), activate()
|
|
149
|
+
โโโ locales
|
|
150
|
+
โ โโโ en
|
|
151
|
+
โ โ โโโ messages.po
|
|
152
|
+
โ โ โโโ messages.mjs # lingui compile ๊ฒฐ๊ณผ๋ฌผ
|
|
153
|
+
โ โโโ fr
|
|
154
|
+
โ โโโ messages.po
|
|
155
|
+
โ โโโ messages.mjs
|
|
156
|
+
โโโ components
|
|
157
|
+
โ โโโ Counter.tsx # const { t } = useLingui(); t`Increment`
|
|
158
|
+
โโโ routes
|
|
159
|
+
โโโ $locale
|
|
160
|
+
โโโ about.tsx # await import(`../locales/${locale}/messages.mjs`)
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
**Intlayer๋ ๋์
๋๋ฆฌ๋ฅผ ์ปดํ์ผํฉ๋๋ค.** ๊ฐ `.content.ts` ํ์ผ์ ํน์ ํค์ ๊ฒฐํฉ๋ ๊ฐ๋ณ ๋์
๋๋ฆฌ์
๋๋ค. ์ปดํ์ผ๋ฌ๋ ์ด๋ค ์ปดํฌ๋ํธ๊ฐ ์ด๋ค ํค๋ฅผ ์ํฌํธํ๋์ง ์ถ์ ํ์ฌ, ๋์
๋๋ฆฌ๋ณ ๋ฐ ์ธ์ด๋ณ๋ก ํด๋น ์ปดํฌ๋ํธ์ ํ์ํ ์ต์ํ์ JSON๋ง ์์ฑํฉ๋๋ค. ๊ธฐ๋ณธ ๋จ์๋ **์ปดํฌ๋ํธ**์
๋๋ค. ๋ผ์ฐํธ ์ค์ฝํ ๋ถํ ์ ์ด ๊ตฌ์กฐ์ ์์ฐ์ค๋ฌ์ด ๊ฒฐ๊ณผ๋ฌผ์ด๋ฉฐ, ํ์ด์ง๋ ์ค์ง ๋ ๋๋ง์ ํ์ํ ์ปดํฌ๋ํธ์ ๋์
๋๋ฆฌ๋ง ๊ฐ์ ธ์ต๋๋ค.
|
|
164
|
+
|
|
165
|
+
```bash
|
|
166
|
+
.
|
|
167
|
+
โโโ intlayer.config.ts
|
|
168
|
+
โโโ src
|
|
169
|
+
โโโ components
|
|
170
|
+
โ โโโ Counter
|
|
171
|
+
โ โโโ index.tsx # useIntlayer("counter")
|
|
172
|
+
โ โโโ index.content.ts
|
|
173
|
+
โโโ routes
|
|
174
|
+
โโโ $locale
|
|
175
|
+
โโโ about.tsx
|
|
176
|
+
โโโ about.content.ts
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
์ด๊ฒ์ด ๋ฐ๋ก `scoped-dynamic` ํจํด์ด Intlayer์์๋ ๊ธฐ๋ณธ ๋น๋ ๊ฒฐ๊ณผ๋ฌผ์ธ ๋ฐ๋ฉด, Lingui์์๋ ๋ณต์กํ ์๋ ์์ง๋์ด๋ง ํ๋ก์ ํธ๊ฐ ๋๋ ๊ทผ๋ณธ์ ์ธ ์ด์ ์
๋๋ค.
|
|
180
|
+
|
|
181
|
+
> `dynamic` ํ์ ์ธก์ ๊ฒฐ๊ณผ๋ฅผ ์ฌํํ๋ ค๋ฉด `intlayer.config.ts`์์ `dictionary.importMode: 'dynamic'`์ ์ค์ ํ์ญ์์ค. ์์ธํ ๋ด์ฉ์ [๋ฒ๋ค ์ต์ ํ ๋ฌธ์](https://intlayer.org/ko/doc/concept/bundle-optimization)๋ฅผ ์ฐธ๊ณ ํ์๊ธฐ ๋ฐ๋๋๋ค.
|
|
182
|
+
|
|
183
|
+
## ๊ฐ๋ฐ์ ๊ฒฝํ (DX)
|
|
184
|
+
|
|
185
|
+
### ์ด๊ธฐ ์ค์
|
|
186
|
+
|
|
187
|
+
**Lingui**
|
|
188
|
+
|
|
189
|
+
```ts fileName="lingui.config.ts"
|
|
190
|
+
import { defineConfig } from "@lingui/cli";
|
|
191
|
+
|
|
192
|
+
export default defineConfig({
|
|
193
|
+
sourceLocale: "en",
|
|
194
|
+
locales: ["en", "fr"],
|
|
195
|
+
catalogs: [
|
|
196
|
+
{
|
|
197
|
+
path: "<rootDir>/src/locales/{locale}/messages",
|
|
198
|
+
include: ["src"],
|
|
199
|
+
},
|
|
200
|
+
],
|
|
201
|
+
});
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
```ts fileName="src/i18n.ts"
|
|
205
|
+
import { setupI18n } from "@lingui/core";
|
|
206
|
+
|
|
207
|
+
export const loadCatalog = async (locale: string) => {
|
|
208
|
+
const { messages } = await import(`./locales/${locale}/messages.mjs`);
|
|
209
|
+
const i18n = setupI18n();
|
|
210
|
+
i18n.load(locale, messages);
|
|
211
|
+
i18n.activate(locale);
|
|
212
|
+
return i18n;
|
|
213
|
+
};
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
์ดํ ๋ฒ๋ค๋ฌ์ `@lingui/babel-plugin-lingui-macro`(๋๋ `@lingui/swc-plugin`)๋ฅผ ์ถ๊ฐํ๊ณ , ์์ค ์์ ํ `lingui extract`, ๋น๋ ์ `lingui compile`์ ์คํํ๋ฉฐ, ์ต์์ ํธ๋ฆฌ๋ฅผ `<I18nProvider i18n={i18n}>`์ผ๋ก ๊ฐ์ธ์ผ ํฉ๋๋ค.
|
|
217
|
+
|
|
218
|
+
**Intlayer**
|
|
219
|
+
|
|
220
|
+
```ts fileName="intlayer.config.ts"
|
|
221
|
+
import { type IntlayerConfig, Locales } from "intlayer";
|
|
222
|
+
|
|
223
|
+
const config: IntlayerConfig = {
|
|
224
|
+
internationalization: {
|
|
225
|
+
locales: [Locales.ENGLISH, Locales.FRENCH],
|
|
226
|
+
defaultLocale: Locales.ENGLISH,
|
|
227
|
+
},
|
|
228
|
+
};
|
|
229
|
+
|
|
230
|
+
export default config;
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
`vite.config.ts`์ `intlayer()` ํ๋ฌ๊ทธ์ธ์ ์ถ๊ฐ(Next.js์ ๊ฒฝ์ฐ `next.config.ts`์ `withIntlayer()`)ํ๊ณ ํธ๋ฆฌ๋ฅผ `<IntlayerProvider>`๋ก ๊ฐ์ธ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค. ๋ณ๋์ ์ถ์ถ ๋ฐ ์ปดํ์ผ ๋ช
๋ น์ด ์์ด ๋ฒ๋ค๋ฌ ์คํ ์ ์๋์ผ๋ก ๋น๋๋ฉ๋๋ค.
|
|
234
|
+
|
|
235
|
+
### ์ปดํฌ๋ํธ ์์ฑ
|
|
236
|
+
|
|
237
|
+
**Lingui**
|
|
238
|
+
|
|
239
|
+
```tsx fileName="src/components/Counter.tsx"
|
|
240
|
+
import { useState } from "react";
|
|
241
|
+
import { useLingui } from "@lingui/react/macro";
|
|
242
|
+
import { Trans } from "@lingui/react/macro";
|
|
243
|
+
|
|
244
|
+
export const Counter = () => {
|
|
245
|
+
const { t, i18n } = useLingui();
|
|
246
|
+
const [count, setCount] = useState(0);
|
|
247
|
+
|
|
248
|
+
return (
|
|
249
|
+
<div>
|
|
250
|
+
<p>{i18n.number(count)}</p>
|
|
251
|
+
<button aria-label={t`Counter`} onClick={() => setCount((c) => c + 1)}>
|
|
252
|
+
<Trans>Increment</Trans>
|
|
253
|
+
</button>
|
|
254
|
+
</div>
|
|
255
|
+
);
|
|
256
|
+
};
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
์์ด ํ
์คํธ๋ ์ปดํฌ๋ํธ ๋ด๋ถ์ ์ง์ ์์ฑ๋๋ฉฐ, ํ๋์ค์ด ๋ฒ์ญ์ `lingui extract` ์คํ ํ `src/locales/fr/messages.po` ํ์ผ์ ํด์ ID ํํ๋ก ์ ์ฅ๋ฉ๋๋ค. ์ถ์ถ ๋๋ ์ปดํ์ผ์ ์์ด๋ฒ๋ฆฌ๋ฉด ์กฐ์ฉํ ์์ด ์๋ฌธ์ผ๋ก ๋์ฒด๋ฉ๋๋ค.
|
|
260
|
+
|
|
261
|
+
**Intlayer**
|
|
262
|
+
|
|
263
|
+
```ts fileName="src/components/Counter/index.content.ts"
|
|
264
|
+
import { t, type Dictionary } from "intlayer";
|
|
265
|
+
|
|
266
|
+
const counterContent = {
|
|
267
|
+
key: "counter",
|
|
268
|
+
content: {
|
|
269
|
+
label: t({ en: "Counter", fr: "Compteur" }),
|
|
270
|
+
increment: t({ en: "Increment", fr: "Incrรฉmenter" }),
|
|
271
|
+
},
|
|
272
|
+
} satisfies Dictionary;
|
|
273
|
+
|
|
274
|
+
export default counterContent;
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
```tsx fileName="src/components/Counter/index.tsx"
|
|
278
|
+
import { useState } from "react";
|
|
279
|
+
import { useIntlayer } from "react-intlayer";
|
|
280
|
+
import { useNumber } from "react-intlayer/format";
|
|
281
|
+
|
|
282
|
+
export const Counter = () => {
|
|
283
|
+
const { label, increment } = useIntlayer("counter");
|
|
284
|
+
const number = useNumber();
|
|
285
|
+
const [count, setCount] = useState(0);
|
|
286
|
+
|
|
287
|
+
return (
|
|
288
|
+
<div>
|
|
289
|
+
<p>{number(count)}</p>
|
|
290
|
+
<button aria-label={label} onClick={() => setCount((c) => c + 1)}>
|
|
291
|
+
{increment}
|
|
292
|
+
</button>
|
|
293
|
+
</div>
|
|
294
|
+
);
|
|
295
|
+
};
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
๋ ์ธ์ด๊ฐ ์ปดํฌ๋ํธ ๋ฐ๋ก ์ ๋จ์ผ ํ์ผ์ ํจ๊ป ์์นํฉ๋๋ค. ํ๋์ค์ด ๊ฐ์ด ๋๋ฝ๋๋ฉด ๋น๋๊ฐ ์คํจํ๋ฉฐ, ํค ์ด๋ฆ์ ์๋ชป ์
๋ ฅํ๋ฉด TypeScript๊ฐ ์ฆ์ ์ค๋ฅ๋ฅผ ๊ฐ์งํฉ๋๋ค.
|
|
299
|
+
|
|
300
|
+
### ์ปดํฌ๋ํธ ์ธ๋ถ์์์ ์ฌ์ฉ
|
|
301
|
+
|
|
302
|
+
๋ฉํ๋ฐ์ดํฐ, ๋ก๋, ์๋ฒ ํจ์ ๋ฑ React ํธ๋ฆฌ๊ฐ ์กด์ฌํ์ง ์๋ ๊ณณ์์์ ์ฌ์ฉ ๋ฐฉ์์
๋๋ค.
|
|
303
|
+
|
|
304
|
+
**Lingui**
|
|
305
|
+
|
|
306
|
+
```ts fileName="src/routes/$locale/about.tsx"
|
|
307
|
+
import { setupI18n } from "@lingui/core";
|
|
308
|
+
import { msg } from "@lingui/core/macro";
|
|
309
|
+
|
|
310
|
+
const title = msg`About us`;
|
|
311
|
+
|
|
312
|
+
export const loader = async ({ params }: { params: { locale: string } }) => {
|
|
313
|
+
const { messages } = await import(
|
|
314
|
+
`../../locales/${params.locale}/messages.mjs`
|
|
315
|
+
);
|
|
316
|
+
const i18n = setupI18n({
|
|
317
|
+
locale: params.locale,
|
|
318
|
+
messages: { [params.locale]: messages },
|
|
319
|
+
});
|
|
320
|
+
|
|
321
|
+
return { title: i18n._(title) };
|
|
322
|
+
};
|
|
323
|
+
```
|
|
324
|
+
|
|
325
|
+
ํธ์ถ๋ง๋ค ์๋ก์ด `I18n` ์ธ์คํด์ค๋ฅผ ์์ฑํ๊ณ , ์ ํฉํ ์นดํ๋ก๊ทธ๋ฅผ ์๋ ์ํฌํธํ ๋ค, `t` ๋์ `msg` + `i18n._()`๋ฅผ ์กฐํฉํด์ผ ํฉ๋๋ค. [๋ฒค์น๋งํฌ ๋
ธํธ](https://github.com/intlayer-org/benchmark-bloom/blob/main/report/NOTE.md)์์๋ ์ง์ ํ๋ฏ, ์ํฉ์ ๋ง์ถฐ `t`, `` t` ` ``, `i18n.t()`, `msg`, `<Trans>`๋ฅผ ์ ํํ๋ ๊ฒ์ ๋งค์ฐ ๋น์ง๊ด์ ์
๋๋ค.
|
|
326
|
+
|
|
327
|
+
**Intlayer**
|
|
328
|
+
|
|
329
|
+
```ts fileName="src/routes/$locale/about.tsx"
|
|
330
|
+
import { getIntlayer } from "intlayer";
|
|
331
|
+
|
|
332
|
+
export const loader = async ({ params }: { params: { locale: string } }) => {
|
|
333
|
+
const { title } = getIntlayer("about-metadata", params.locale);
|
|
334
|
+
|
|
335
|
+
return { title };
|
|
336
|
+
};
|
|
337
|
+
```
|
|
338
|
+
|
|
339
|
+
## Lingui ๋งคํฌ๋ก๋ ์ ์งํ๊ณ Intlayer ๋์
๋๋ฆฌ๋ก ์๋นํ๊ธฐ
|
|
340
|
+
|
|
341
|
+
`@intlayer/lingui`๋ `@lingui/core` ๋ฐ `@lingui/react`๋ฅผ ์ํ ์ํด๋ฆญ ํธํ ์ด๋ํฐ์
๋๋ค. ๋งคํฌ๋ก๋ ๊ธฐ์กด์ฒ๋ผ ์ปดํ์ผ๋๋ฉฐ ์์ฑ๋ `i18n._()` ํธ์ถ์ Intlayer ๋์
๋๋ฆฌ์์ ์๋น๋ฉ๋๋ค. `.po` ๋๊ธฐํ ํ๋ฌ๊ทธ์ธ์ด ๊ธฐ์กด ์นดํ๋ก๊ทธ๋ฅผ ๋จ์ผ ์ง์ค ๊ณต๊ธ์์ผ๋ก ์ ์งํด์ฃผ๋ฉฐ, ICU ๋ณต์ํ ๋ฐ ๋ถ๊ธฐ๋ฌธ๋ ์๋ฒฝํ ํธํ๋ฉ๋๋ค.
|
|
342
|
+
|
|
343
|
+
```ts fileName="vite.config.ts"
|
|
344
|
+
import { defineConfig } from "vite";
|
|
345
|
+
import { lingui } from "@intlayer/lingui/plugin";
|
|
346
|
+
|
|
347
|
+
export default defineConfig({
|
|
348
|
+
plugins: [lingui()],
|
|
349
|
+
});
|
|
350
|
+
```
|
|
351
|
+
|
|
352
|
+
๋น๋ ์ค์ ์์ Intlayer ์ปดํ์ผ๋ฌ ์ด์ ์ `@lingui/babel-plugin-lingui-macro` ๋๋ `@lingui/swc-plugin`์ด ์คํ๋๋๋ก ๊ตฌ์ฑํ์ญ์์ค. ์์ธํ ๋ด์ฉ์ [Lingui ํธํ์ฑ ๋ฌธ์](https://intlayer.org/ko/doc/compatibility/lingui)๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
|
|
353
|
+
|
|
354
|
+
## ์ธ์ ์ด๋ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ํํด์ผ ํ๋๊ฐ?
|
|
355
|
+
|
|
356
|
+
- **Lingui๋ฅผ ์ถ์ฒํ๋ ๊ฒฝ์ฐ**: ์ ๋ฐํ **ICU MessageFormat** ๊ตฌ๋ฌธ๊ณผ ํ์
์์ ํ ๋งคํฌ๋ก๊ฐ ํ์์ ์ธ ๊ฒฝ์ฐ, ๋ฒ์ญ ํ์ด ๊ธฐ์กด TMS์ ์ฐ๊ณ๋ **`.po`** ํ์ผ ๊ธฐ๋ฐ์ผ๋ก ์์
ํ๋ ๊ฒฝ์ฐ, JSX ๋ด ์ธ๋ผ์ธ ์๋ฌธ ์์ฑ์ ์ ํธํ๊ณ ์นดํ๋ก๊ทธ ์ถ์ถ/์ปดํ์ผ/๋ถํ ์ํฌํ๋ก์ฐ ๊ด๋ฆฌ์ ์ต์ํ ํ์ธ ๊ฒฝ์ฐ. ์ง์ฐ ๋ก๋ฉ์ ๊ฐ์ถ๋ฉด ํ์ด์ง ํฌ๊ธฐ๊ฐ ๋งค์ฐ ์ฐ์ํฉ๋๋ค.
|
|
357
|
+
- **Intlayer๋ฅผ ์ถ์ฒํ๋ ๊ฒฝ์ฐ**: **์ปดํฌ๋ํธ ์ค์ฝํ ์ฝํ
์ธ **, **์๊ฒฉํ TypeScript ์ฐ๋**, **๋น๋ ํ์ ๋๋ฝ ํค ๊ฐ์ง**, **๋ฌด์ค์ ์๋ Tree-shaking ๋ฐ ์ง์ฐ ๋ก๋ฉ**, ์ด๊ฒฝ๋ ์ปดํฌ๋ํธ, ๋น ๋ฅธ ํ์ด๋๋ ์ด์
, ์ง์ฐ ์๋ ์ธ์ด ์ ํ, ๊ธฐ๋ณธ ๋ด์ฅ๋ ์๋ํฐ ํดํท(๋น์ฃผ์ผ ์๋ํฐ, CMS, AI ๋ฒ์ญ, MCP ์๋ฒ)์ ์ํ๋ ๊ฒฝ์ฐ. ๋๊ท๋ชจ ๋ชจ๋ํ ํ๋ก์ ํธ๋ ๋์์ธ ์์คํ
์ ์ต์ ํ๋์ด ์์ต๋๋ค.
|
|
358
|
+
- **`@intlayer/lingui`๋ฅผ ์ถ์ฒํ๋ ๊ฒฝ์ฐ**: ๊ธฐ์กด Lingui ๊ธฐ๋ฐ ์ ํ๋ฆฌ์ผ์ด์
์์ ๋งคํฌ๋ก ์ฝ๋๋ฅผ ๊ฑด๋๋ฆฌ์ง ์๊ณ Intlayer์ ๋ชจ๋ํ ๋์
๋๋ฆฌ ๊ตฌ์กฐ๋ก ๋จ๊ณ์ ์ ํ์ ๊พํ ๋.
|
|
359
|
+
|
|
360
|
+
## ๊ด๋ จ ๋น๊ต ์๋ฃ
|
|
361
|
+
|
|
362
|
+
- [next-intl vs Intlayer](https://intlayer.org/ko/blog/next-intl-vs-intlayer) (๋์ผ ๋ฒค์น๋งํฌ)
|
|
363
|
+
- [i18next vs Intlayer](https://intlayer.org/ko/blog/i18next-vs-intlayer) (๋์ผ ๋ฒค์น๋งํฌ)
|
|
364
|
+
- [vue-i18n vs Intlayer](https://intlayer.org/ko/blog/vue-i18n-vs-intlayer-benchmark) (๋์ผ ๋ฒค์น๋งํฌ)
|
|
365
|
+
- [์ปดํ์ผ๋ฌ vs ์ ์ธํ i18n](https://intlayer.org/ko/blog/compiler-vs-declarative-i18n)
|
|
366
|
+
|
|
367
|
+
## GitHub ์คํ ์ถ์ด
|
|
368
|
+
|
|
369
|
+
GitHub ์คํ ์๋ ํ๋ก์ ํธ์ ์ธ์ง๋, ์ปค๋ฎค๋ํฐ ์ ๋ขฐ ๋ฐ ์ฅ๊ธฐ์ ์ธ ์ง์ ๊ฐ๋ฅ์ฑ์ ๊ฐ๋ ํ ์ ์๋ ์ค์ํ ์ฒ๋์
๋๋ค. ์ฝ๋ ํ์ง์ ์ง์ ํ๊ฐํ๋ ๊ฒ์ ์๋์ง๋ง, ์ผ๋ง๋ ๋ง์ ๊ฐ๋ฐ์๊ฐ ํ๋ก์ ํธ๋ฅผ ์ง์งํ๊ณ ์ฑํํ๋์ง ๋ณด์ฌ์ค๋๋ค.
|
|
370
|
+
|
|
371
|
+
[](https://star-history.com/#lingui/js-lingui&aymericzip/intlayer)
|
|
372
|
+
|
|
373
|
+
## ๊ฒฐ๋ก
|
|
374
|
+
|
|
375
|
+
Lingui๋ ์ด๋ฒ ๋ฒค์น๋งํฌ์์ ๋ฐํ์๊ณผ ์ปดํ์ผ๋ฌ๋ฅผ ๊ฒฐํฉํ ๊ฐ์ฅ ์ฐ์ํ ์ ํต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์
๋๋ค. ํด์ ๊ธฐ๋ฐ์ ์์ถ๋ ์นดํ๋ก๊ทธ ๋๋ถ์ ํ์ด์ง๋น JavaScript ํฌ๊ธฐ๋ฅผ Intlayer ์์ค์ ๊ทผ์ ํ๊ฒ ์ ์งํ๋ฉฐ, TanStack Start์์๋ ์์ฃผ ๊ทผ์ํ๊ฒ ์์๊ธฐ๋ ํฉ๋๋ค. ํ์ด์ง๋น ์์ ๋ฐ์ดํธ ์๋ง ํ๊ฐํ๋ค๋ฉด ์ฌ์ค์ ๋ฌด์น๋ถ์ ๊ฐ๊น์ต๋๋ค.
|
|
376
|
+
|
|
377
|
+
ํ์ง๋ง ํ๊ฐ ๊ธฐ์ค์ ๊ทธ๊ฒ๋ง์ด ์๋๋๋ค. Lingui ์ปดํ์ผ๋ฌ๋ ์ธ์ด ๋จ์์์ ๋ฉ์ถ๋ฉฐ, ๊ทธ ์ดํ ๋จ๊ณ(๋ผ์ฐํธ๋ณ ์นดํ๋ก๊ทธ ๋ถํ , ์ง์ฐ ๋ก๋ฉ, ํด๋ฐฑ ๋ฌธ์์ด ๋ถ๋ฆฌ)๋ ๋ชจ๋ ์๋ ์ค์ ์ ๋ชซ์ผ๋ก ๋จ์ต๋๋ค. ๋ฒค์น๋งํฌ๋ ์ด๋ฌํ ๊ตฌ์กฐ์ ํ๊ณ์ ๋น์ฉ์ ์ ๋๋ผํ๊ฒ ๋ณด์ฌ์ค๋๋ค: **10~20๋ฐฐ ๋ฌด๊ฑฐ์ด ์ปดํฌ๋ํธ**, **2~3๋ฐฐ ๋๋ฆฐ ํ์ด๋๋ ์ด์
**, ๊ตฌ์กฐ์ ์ผ๋ก ๋จ๋ **3~15%์ ์ธ์ด ๋์**, ์ต์ ํ ์ค์ ์์ ๋ฐ์ํ๋ **42 ms**์ ์ธ์ด ์ ํ ์ง์ฐ. ๋ฐ๋ฉด Intlayer ์ปดํ์ผ๋ฌ๋ ์ปดํฌ๋ํธ ๋จ์๋ก ์ ๋ฐ ์๋ํ์ฌ ๋ณ๋์ ๋ณต์กํ ์ค์ ์์ด๋ **6~8 KB**, **11~14 ms**, **0%**, **3~4 ms**๋ฅผ ์๋ฒฝํ ๊ตฌํํฉ๋๋ค.
|
|
378
|
+
|
|
379
|
+
๋ชจ๋ ์์ ์ธก์ ๋ฐ์ดํฐ, ํ
์คํธ ์ ํ๋ฆฌ์ผ์ด์
๋ฐ ์คํฌ๋ฆฝํธ๋ [Benchmark Bloom ์ ์ฅ์](https://github.com/intlayer-org/benchmark-bloom)์์ ์ง์ ํ์ธํ๊ณ ์คํํด ๋ณด์ค ์ ์์ต๋๋ค.
|
|
380
|
+
|
|
381
|
+
๋ ์์ธํ ์ ๋ณด๋ ['์ Intlayer์ธ๊ฐ?' ๋ฌธ์](https://intlayer.org/ko/doc/why)๋ฅผ ์ฐธ๊ณ ํ์๊ธฐ ๋ฐ๋๋๋ค.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
createdAt: 2025-08-23
|
|
3
|
-
updatedAt: 2026-
|
|
3
|
+
updatedAt: 2026-09-16
|
|
4
4
|
title: "next-i18next vs next-intl vs Intlayer - ์์ ํ ๋ฒ์ญ ๊ฐ์ด๋: next-i18next vs next-intl vs Intlayer: 2026 Comparison"
|
|
5
5
|
description: ๋ฒ๋ค ํฌ๊ธฐ, SEO, ์ฑ๋ฅ ๋ฐ ์ ์ง๋ณด์์ฑ์ ์ํ ์ต๊ณ ์ ์๋ฃจ์
. 2026๋
์ Next.js ์น์ฌ์ดํธ๋ฅผ ๋ค๊ตญ์ด๋ก ๋ง๋์ธ์, LLM ๋ฒ์ญ, Agent Skills & MCP.
|
|
6
6
|
keywords:
|
|
@@ -22,7 +22,7 @@ author: aymericzip
|
|
|
22
22
|
|
|
23
23
|
<TOC/>
|
|
24
24
|
|
|
25
|
-

|
|
26
26
|
|
|
27
27
|
Next.js๋ฅผ ์ํ ์ธ ๊ฐ์ง i18n ์ต์
์ธ next-i18next, next-intl, Intlayer์ ์ ์ฌ์ ๊ณผ ์ฐจ์ด์ ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
|
|
28
28
|
|
|
@@ -134,6 +134,10 @@ Next.js๋ ๊ตญ์ ํ๋ ๋ผ์ฐํ
(์: ๋ก์ผ์ผ ์ธ๊ทธ๋จผํธ)์ ๊ธฐ๋ณธ์ ์ผ
|
|
|
134
134
|
|
|
135
135
|
> ๋ด๊ฐ `/fr/about` ํ์ด์ง์ ์๋ค๋ฉด, `/en/about` ํ์ด์ง์ ์ฝํ
์ธ ๋ฅผ ๋ก๋ํ๊ณ ์ถ์ง ์์ต๋๋ค.
|
|
136
136
|
|
|
137
|
+
์๋ ๊ทธ๋ํ๋ 1~~10๊ฐ์ ํ์ด์ง๋ฅผ 1~~10๊ฐ ์ธ์ด๋ก ๋ฒ์ญํ ์ด๋ก ์์ ์ฑ(ํ์ด์ง๋น ์ฝ 30KB์ ํ
์คํธ)์ ์ฝํ
์ธ ์ฉ๋์ ์ถ์ ํ ๊ฒ์
๋๋ค. ๋ก์ผ์ผ๋ณ ๋์ ๋ก๋ฉ์ ์ธ์ด ์ถ์ ์์ ๊ณ , ์ปดํฌ๋ํธ๋ ๋ผ์ฐํธ ๋จ์๋ก ์ฝํ
์ธ ๋ฅผ ์ค์ฝํํ๋ฉด ํ์ด์ง ์ถ์ด ์์ด์ง๋ฉฐ, ๋ ๊ฐ์ง๋ฅผ ๊ฒฐํฉํ์ ๋๋ง ์ฉ๋์ด ์ผ์ ํ๊ฒ ์ ์ง๋ฉ๋๋ค.
|
|
138
|
+
|
|
139
|
+

|
|
140
|
+
|
|
137
141
|
๋ค์ ๋งํ์ง๋ง, ์ธ ๊ฐ์ง ์๋ฃจ์
๋ชจ๋ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ์ธ์งํ๊ณ ์์ผ๋ฉฐ ์ด๋ฌํ ์ต์ ํ๋ฅผ ๊ด๋ฆฌํ ์ ์๋๋ก ํฉ๋๋ค. ์ธ ์๋ฃจ์
๊ฐ์ ์ฐจ์ด๋ DX(๊ฐ๋ฐ์ ๊ฒฝํ)์ ์์ต๋๋ค.
|
|
138
142
|
|
|
139
143
|
`next-intl`๊ณผ `next-i18next`๋ ์ค์ ์ง์ค์ ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ์ฌ ๋ฒ์ญ์ ๊ด๋ฆฌํ๋ฉฐ, ๋ก์ผ์ผ๋ณ ๋ฐ ํ์ ํ์ผ๋ณ๋ก JSON์ ๋ถํ ํ ์ ์์ต๋๋ค. `next-i18next`์์๋ JSON ํ์ผ์ '๋ค์์คํ์ด์ค(namespaces)'๋ผ๊ณ ๋ถ๋ฅด๊ณ , `next-intl`์ ๋ฉ์์ง๋ฅผ ์ ์ธํ ์ ์๊ฒ ํฉ๋๋ค. `intlayer`์์๋ JSON ํ์ผ์ '์ฌ์ (dictionaries)'์ด๋ผ๊ณ ๋ถ๋ฆ
๋๋ค.
|
|
@@ -156,9 +160,9 @@ Next.js๋ ๊ตญ์ ํ๋ ๋ผ์ฐํ
(์: ๋ก์ผ์ผ ์ธ๊ทธ๋จผํธ)์ ๊ธฐ๋ณธ์ ์ผ
|
|
|
156
160
|
|
|
157
161
|
๋ค์์ vite + react ์ ํ๋ฆฌ์ผ์ด์
์์ `intlayer`๋ฅผ ์ฌ์ฉํ ๋ฒ๋ค ํฌ๊ธฐ ์ต์ ํ์ ์ํฅ ์์์
๋๋ค:
|
|
158
162
|
|
|
159
|
-
| ์ต์ ํ๋ ๋ฒ๋ค
|
|
160
|
-
|
|
|
161
|
-
|  |  |
|
|
162
166
|
|
|
163
167
|
## TypeScript ๋ฐ ์์ ์ฑ
|
|
164
168
|
|
|
@@ -1296,7 +1300,7 @@ middleware์ ์ค์ ์ `intlayer.config.ts` ํ์ผ์ ์ค์ํ๋์ด ์์ต๋
|
|
|
1296
1300
|
|
|
1297
1301
|
GitHub ์คํ๋ ํ๋ก์ ํธ์ ์ธ๊ธฐ, ์ปค๋ฎค๋ํฐ ์ ๋ขฐ๋, ๊ทธ๋ฆฌ๊ณ ์ฅ๊ธฐ์ ์ธ ๊ด๋ จ์ฑ์ ๊ฐ๋ ฅํ๊ฒ ๋ํ๋ด๋ ์งํ์
๋๋ค. ๊ธฐ์ ์ ํ์ง์ ์ง์ ์ ์ธ ์ฒ๋๋ ์๋์ง๋ง, ์ผ๋ง๋ ๋ง์ ๊ฐ๋ฐ์๊ฐ ํด๋น ํ๋ก์ ํธ๋ฅผ ์ ์ฉํ๋ค๊ณ ์๊ฐํ๊ณ , ์งํ ์ํฉ์ ํ๋ก์ฐํ๋ฉฐ, ์ฑํํ ๊ฐ๋ฅ์ฑ์ด ์๋์ง๋ฅผ ๋ฐ์ํฉ๋๋ค. ํ๋ก์ ํธ์ ๊ฐ์น๋ฅผ ํ๊ฐํ ๋, ์คํ๋ ๋์๋ค ๊ฐ์ ๊ด์ฌ๋๋ฅผ ๋น๊ตํ๊ณ ์ํ๊ณ ์ฑ์ฅ์ ๋ํ ํต์ฐฐ์ ์ ๊ณตํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
|
|
1298
1302
|
|
|
1299
|
-
[](https://
|
|
1303
|
+
[](https://star-history.com/#i18next/next-i18next&amannn/next-intl&aymericzip/intlayer)
|
|
1300
1304
|
|
|
1301
1305
|
## ๊ฒฐ๋ก
|
|
1302
1306
|
|