@intlayer/docs 6.1.5 → 6.1.6

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.
Files changed (284) hide show
  1. package/blog/ar/next-i18next_vs_next-intl_vs_intlayer.md +404 -173
  2. package/blog/de/next-i18next_vs_next-intl_vs_intlayer.md +262 -113
  3. package/blog/en/intlayer_with_next-i18next.mdx +431 -0
  4. package/blog/en/intlayer_with_next-intl.mdx +335 -0
  5. package/blog/en/next-i18next_vs_next-intl_vs_intlayer.md +463 -209
  6. package/blog/en-GB/next-i18next_vs_next-intl_vs_intlayer.md +38 -28
  7. package/blog/es/next-i18next_vs_next-intl_vs_intlayer.md +185 -71
  8. package/blog/fr/next-i18next_vs_next-intl_vs_intlayer.md +38 -28
  9. package/blog/it/next-i18next_vs_next-intl_vs_intlayer.md +38 -28
  10. package/blog/ja/next-i18next_vs_next-intl_vs_intlayer.md +38 -28
  11. package/blog/ko/next-i18next_vs_next-intl_vs_intlayer.md +38 -28
  12. package/blog/pt/next-i18next_vs_next-intl_vs_intlayer.md +38 -28
  13. package/blog/ru/next-i18next_vs_next-intl_vs_intlayer.md +36 -28
  14. package/blog/tr/next-i18next_vs_next-intl_vs_intlayer.md +2 -0
  15. package/blog/zh/next-i18next_vs_next-intl_vs_intlayer.md +38 -28
  16. package/dist/cjs/generated/docs.entry.cjs +32 -0
  17. package/dist/cjs/generated/docs.entry.cjs.map +1 -1
  18. package/dist/esm/generated/docs.entry.mjs +32 -0
  19. package/dist/esm/generated/docs.entry.mjs.map +1 -1
  20. package/dist/types/generated/docs.entry.d.ts +2 -0
  21. package/dist/types/generated/docs.entry.d.ts.map +1 -1
  22. package/docs/ar/component_i18n.md +186 -0
  23. package/docs/ar/intlayer_with_angular.md +2 -2
  24. package/docs/ar/intlayer_with_astro.md +246 -0
  25. package/docs/ar/intlayer_with_create_react_app.md +3 -2
  26. package/docs/ar/intlayer_with_express.md +2 -2
  27. package/docs/ar/intlayer_with_nestjs.md +2 -2
  28. package/docs/ar/intlayer_with_nextjs_14.md +2 -2
  29. package/docs/ar/intlayer_with_nextjs_15.md +2 -2
  30. package/docs/ar/intlayer_with_nextjs_page_router.md +2 -2
  31. package/docs/ar/intlayer_with_nuxt.md +2 -2
  32. package/docs/ar/intlayer_with_react_native+expo.md +11 -20
  33. package/docs/ar/intlayer_with_react_router_v7.md +195 -241
  34. package/docs/ar/intlayer_with_tanstack.md +198 -272
  35. package/docs/ar/intlayer_with_vite+preact.md +9 -9
  36. package/docs/ar/intlayer_with_vite+react.md +7 -7
  37. package/docs/ar/intlayer_with_vite+vue.md +9 -9
  38. package/docs/ar/vs_code_extension.md +48 -109
  39. package/docs/de/component_i18n.md +186 -0
  40. package/docs/de/intlayer_with_angular.md +2 -2
  41. package/docs/de/intlayer_with_astro.md +246 -0
  42. package/docs/de/intlayer_with_create_react_app.md +2 -2
  43. package/docs/de/intlayer_with_express.md +2 -2
  44. package/docs/de/intlayer_with_nestjs.md +2 -2
  45. package/docs/de/intlayer_with_nextjs_14.md +2 -2
  46. package/docs/de/intlayer_with_nextjs_15.md +2 -2
  47. package/docs/de/intlayer_with_nextjs_page_router.md +2 -2
  48. package/docs/de/intlayer_with_nuxt.md +2 -2
  49. package/docs/de/intlayer_with_react_native+expo.md +11 -20
  50. package/docs/de/intlayer_with_react_router_v7.md +193 -242
  51. package/docs/de/intlayer_with_tanstack.md +194 -266
  52. package/docs/de/intlayer_with_vite+preact.md +9 -9
  53. package/docs/de/intlayer_with_vite+react.md +9 -9
  54. package/docs/de/intlayer_with_vite+vue.md +11 -11
  55. package/docs/de/packages/vite-intlayer/index.md +3 -3
  56. package/docs/de/vs_code_extension.md +46 -107
  57. package/docs/en/component_i18n.md +186 -0
  58. package/docs/en/how_works_intlayer.md +1 -1
  59. package/docs/en/index.md +1 -1
  60. package/docs/en/intlayer_cli.md +1 -1
  61. package/docs/en/intlayer_with_angular.md +4 -4
  62. package/docs/en/intlayer_with_astro.md +246 -0
  63. package/docs/en/intlayer_with_create_react_app.md +4 -4
  64. package/docs/en/intlayer_with_express.md +3 -3
  65. package/docs/en/intlayer_with_lynx+react.md +1 -1
  66. package/docs/en/intlayer_with_nestjs.md +2 -2
  67. package/docs/en/intlayer_with_nextjs_14.md +31 -5
  68. package/docs/en/intlayer_with_nextjs_15.md +31 -5
  69. package/docs/en/intlayer_with_nextjs_page_router.md +5 -5
  70. package/docs/en/intlayer_with_nuxt.md +4 -4
  71. package/docs/en/intlayer_with_react_native+expo.md +46 -24
  72. package/docs/en/intlayer_with_react_router_v7.md +164 -211
  73. package/docs/en/intlayer_with_tanstack.md +166 -241
  74. package/docs/en/intlayer_with_vite+preact.md +12 -12
  75. package/docs/en/intlayer_with_vite+react.md +12 -12
  76. package/docs/en/intlayer_with_vite+solid.md +2 -2
  77. package/docs/en/intlayer_with_vite+svelte.md +2 -2
  78. package/docs/en/intlayer_with_vite+vue.md +12 -12
  79. package/docs/en/introduction.md +1 -1
  80. package/docs/en/packages/next-intlayer/useDictionary.md +1 -1
  81. package/docs/en/packages/next-intlayer/useIntlayer.md +1 -1
  82. package/docs/en/packages/react-intlayer/useDictionary.md +1 -1
  83. package/docs/en/packages/react-intlayer/useI18n.md +1 -1
  84. package/docs/en/packages/react-intlayer/useIntlayer.md +1 -1
  85. package/docs/en/releases/v6.md +1 -0
  86. package/docs/en/roadmap.md +1 -1
  87. package/docs/en/vs_code_extension.md +24 -114
  88. package/docs/en-GB/component_i18n.md +186 -0
  89. package/docs/en-GB/intlayer_with_angular.md +3 -3
  90. package/docs/en-GB/intlayer_with_astro.md +246 -0
  91. package/docs/en-GB/intlayer_with_create_react_app.md +5 -4
  92. package/docs/en-GB/intlayer_with_express.md +2 -2
  93. package/docs/en-GB/intlayer_with_nestjs.md +2 -2
  94. package/docs/en-GB/intlayer_with_nextjs_14.md +4 -4
  95. package/docs/en-GB/intlayer_with_nextjs_15.md +2 -2
  96. package/docs/en-GB/intlayer_with_nextjs_page_router.md +2 -2
  97. package/docs/en-GB/intlayer_with_nuxt.md +2 -2
  98. package/docs/en-GB/intlayer_with_react_native+expo.md +11 -20
  99. package/docs/en-GB/intlayer_with_react_router_v7.md +171 -220
  100. package/docs/en-GB/intlayer_with_tanstack.md +174 -248
  101. package/docs/en-GB/intlayer_with_vite+preact.md +9 -9
  102. package/docs/en-GB/intlayer_with_vite+react.md +9 -9
  103. package/docs/en-GB/intlayer_with_vite+vue.md +11 -11
  104. package/docs/en-GB/packages/next-intlayer/useIntlayer.md +1 -1
  105. package/docs/en-GB/packages/react-intlayer/useIntlayer.md +1 -1
  106. package/docs/en-GB/vs_code_extension.md +42 -103
  107. package/docs/es/component_i18n.md +182 -0
  108. package/docs/es/intlayer_with_angular.md +2 -2
  109. package/docs/es/intlayer_with_astro.md +246 -0
  110. package/docs/es/intlayer_with_create_react_app.md +3 -2
  111. package/docs/es/intlayer_with_express.md +2 -2
  112. package/docs/es/intlayer_with_nextjs_14.md +2 -2
  113. package/docs/es/intlayer_with_nextjs_15.md +2 -2
  114. package/docs/es/intlayer_with_react_native+expo.md +11 -20
  115. package/docs/es/intlayer_with_react_router_v7.md +188 -232
  116. package/docs/es/intlayer_with_tanstack.md +203 -273
  117. package/docs/es/intlayer_with_vite+preact.md +7 -7
  118. package/docs/es/intlayer_with_vite+react.md +7 -7
  119. package/docs/es/intlayer_with_vite+vue.md +9 -9
  120. package/docs/es/vs_code_extension.md +53 -114
  121. package/docs/fr/component_i18n.md +186 -0
  122. package/docs/fr/intlayer_with_angular.md +2 -2
  123. package/docs/fr/intlayer_with_astro.md +246 -0
  124. package/docs/fr/intlayer_with_create_react_app.md +3 -2
  125. package/docs/fr/intlayer_with_express.md +2 -2
  126. package/docs/fr/intlayer_with_nestjs.md +2 -2
  127. package/docs/fr/intlayer_with_nextjs_14.md +2 -2
  128. package/docs/fr/intlayer_with_react_native+expo.md +11 -20
  129. package/docs/fr/intlayer_with_react_router_v7.md +188 -248
  130. package/docs/fr/intlayer_with_tanstack.md +192 -265
  131. package/docs/fr/intlayer_with_vite+preact.md +7 -7
  132. package/docs/fr/intlayer_with_vite+react.md +7 -7
  133. package/docs/fr/intlayer_with_vite+vue.md +9 -9
  134. package/docs/fr/vs_code_extension.md +50 -111
  135. package/docs/hi/component_i18n.md +186 -0
  136. package/docs/hi/intlayer_cli.md +1 -4
  137. package/docs/hi/intlayer_with_angular.md +2 -2
  138. package/docs/hi/intlayer_with_astro.md +246 -0
  139. package/docs/hi/intlayer_with_create_react_app.md +2 -2
  140. package/docs/hi/intlayer_with_express.md +2 -2
  141. package/docs/hi/intlayer_with_nestjs.md +2 -2
  142. package/docs/hi/intlayer_with_nextjs_14.md +2 -2
  143. package/docs/hi/intlayer_with_nextjs_15.md +2 -2
  144. package/docs/hi/intlayer_with_nextjs_page_router.md +2 -2
  145. package/docs/hi/intlayer_with_nuxt.md +2 -2
  146. package/docs/hi/intlayer_with_react_native+expo.md +11 -20
  147. package/docs/hi/intlayer_with_react_router_v7.md +199 -243
  148. package/docs/hi/intlayer_with_tanstack.md +210 -285
  149. package/docs/hi/intlayer_with_vite+preact.md +9 -9
  150. package/docs/hi/intlayer_with_vite+react.md +9 -9
  151. package/docs/hi/intlayer_with_vite+solid.md +1 -1
  152. package/docs/hi/intlayer_with_vite+vue.md +11 -11
  153. package/docs/hi/vs_code_extension.md +49 -110
  154. package/docs/it/component_i18n.md +186 -0
  155. package/docs/it/intlayer_with_angular.md +2 -2
  156. package/docs/it/intlayer_with_astro.md +246 -0
  157. package/docs/it/intlayer_with_create_react_app.md +3 -2
  158. package/docs/it/intlayer_with_express.md +2 -2
  159. package/docs/it/intlayer_with_nestjs.md +2 -2
  160. package/docs/it/intlayer_with_nextjs_14.md +2 -2
  161. package/docs/it/intlayer_with_nextjs_15.md +2 -2
  162. package/docs/it/intlayer_with_nextjs_page_router.md +2 -2
  163. package/docs/it/intlayer_with_nuxt.md +2 -2
  164. package/docs/it/intlayer_with_react_native+expo.md +11 -21
  165. package/docs/it/intlayer_with_react_router_v7.md +195 -242
  166. package/docs/it/intlayer_with_tanstack.md +203 -267
  167. package/docs/it/intlayer_with_vite+preact.md +9 -9
  168. package/docs/it/intlayer_with_vite+react.md +13 -11
  169. package/docs/it/intlayer_with_vite+vue.md +11 -11
  170. package/docs/it/vs_code_extension.md +50 -111
  171. package/docs/ja/component_i18n.md +186 -0
  172. package/docs/ja/intlayer_with_angular.md +2 -2
  173. package/docs/ja/intlayer_with_astro.md +246 -0
  174. package/docs/ja/intlayer_with_create_react_app.md +3 -2
  175. package/docs/ja/intlayer_with_express.md +2 -2
  176. package/docs/ja/intlayer_with_nestjs.md +2 -2
  177. package/docs/ja/intlayer_with_nextjs_14.md +2 -2
  178. package/docs/ja/intlayer_with_nextjs_15.md +2 -2
  179. package/docs/ja/intlayer_with_nextjs_page_router.md +2 -2
  180. package/docs/ja/intlayer_with_nuxt.md +2 -2
  181. package/docs/ja/intlayer_with_react_native+expo.md +18 -29
  182. package/docs/ja/intlayer_with_react_router_v7.md +204 -250
  183. package/docs/ja/intlayer_with_tanstack.md +218 -286
  184. package/docs/ja/intlayer_with_vite+preact.md +9 -9
  185. package/docs/ja/intlayer_with_vite+react.md +11 -11
  186. package/docs/ja/intlayer_with_vite+vue.md +11 -11
  187. package/docs/ja/vs_code_extension.md +50 -111
  188. package/docs/ko/component_i18n.md +186 -0
  189. package/docs/ko/intlayer_with_angular.md +2 -2
  190. package/docs/ko/intlayer_with_astro.md +246 -0
  191. package/docs/ko/intlayer_with_create_react_app.md +3 -2
  192. package/docs/ko/intlayer_with_express.md +2 -2
  193. package/docs/ko/intlayer_with_nestjs.md +2 -2
  194. package/docs/ko/intlayer_with_nextjs_14.md +2 -2
  195. package/docs/ko/intlayer_with_nextjs_15.md +2 -2
  196. package/docs/ko/intlayer_with_nextjs_page_router.md +2 -2
  197. package/docs/ko/intlayer_with_nuxt.md +2 -2
  198. package/docs/ko/intlayer_with_react_native+expo.md +19 -28
  199. package/docs/ko/intlayer_with_react_router_v7.md +190 -244
  200. package/docs/ko/intlayer_with_tanstack.md +200 -270
  201. package/docs/ko/intlayer_with_vite+preact.md +9 -9
  202. package/docs/ko/intlayer_with_vite+react.md +9 -9
  203. package/docs/ko/intlayer_with_vite+vue.md +11 -11
  204. package/docs/ko/vs_code_extension.md +48 -109
  205. package/docs/pt/component_i18n.md +186 -0
  206. package/docs/pt/intlayer_with_angular.md +2 -2
  207. package/docs/pt/intlayer_with_astro.md +246 -0
  208. package/docs/pt/intlayer_with_create_react_app.md +3 -2
  209. package/docs/pt/intlayer_with_express.md +2 -2
  210. package/docs/pt/intlayer_with_nestjs.md +2 -2
  211. package/docs/pt/intlayer_with_nextjs_14.md +2 -2
  212. package/docs/pt/intlayer_with_nextjs_15.md +2 -2
  213. package/docs/pt/intlayer_with_nextjs_page_router.md +2 -2
  214. package/docs/pt/intlayer_with_nuxt.md +2 -2
  215. package/docs/pt/intlayer_with_react_native+expo.md +11 -20
  216. package/docs/pt/intlayer_with_react_router_v7.md +7 -13
  217. package/docs/pt/intlayer_with_tanstack.md +183 -258
  218. package/docs/pt/intlayer_with_vite+preact.md +9 -9
  219. package/docs/pt/intlayer_with_vite+react.md +9 -9
  220. package/docs/pt/intlayer_with_vite+vue.md +9 -9
  221. package/docs/pt/vs_code_extension.md +46 -107
  222. package/docs/ru/component_i18n.md +186 -0
  223. package/docs/ru/intlayer_with_angular.md +2 -2
  224. package/docs/ru/intlayer_with_astro.md +246 -0
  225. package/docs/ru/intlayer_with_create_react_app.md +3 -2
  226. package/docs/ru/intlayer_with_express.md +2 -2
  227. package/docs/ru/intlayer_with_nestjs.md +2 -2
  228. package/docs/ru/intlayer_with_nextjs_14.md +2 -2
  229. package/docs/ru/intlayer_with_nextjs_15.md +2 -2
  230. package/docs/ru/intlayer_with_nextjs_page_router.md +2 -2
  231. package/docs/ru/intlayer_with_nuxt.md +2 -2
  232. package/docs/ru/intlayer_with_react_native+expo.md +11 -20
  233. package/docs/ru/intlayer_with_react_router_v7.md +192 -238
  234. package/docs/ru/intlayer_with_tanstack.md +197 -269
  235. package/docs/ru/intlayer_with_vite+preact.md +9 -9
  236. package/docs/ru/intlayer_with_vite+react.md +9 -9
  237. package/docs/ru/intlayer_with_vite+vue.md +11 -11
  238. package/docs/ru/vs_code_extension.md +48 -109
  239. package/docs/tr/component_i18n.md +186 -0
  240. package/docs/tr/how_works_intlayer.md +1 -1
  241. package/docs/tr/index.md +1 -1
  242. package/docs/tr/intlayer_cli.md +1 -1
  243. package/docs/tr/intlayer_with_angular.md +4 -4
  244. package/docs/tr/intlayer_with_astro.md +246 -0
  245. package/docs/tr/intlayer_with_create_react_app.md +4 -4
  246. package/docs/tr/intlayer_with_express.md +3 -3
  247. package/docs/tr/intlayer_with_lynx+react.md +1 -1
  248. package/docs/tr/intlayer_with_nestjs.md +2 -2
  249. package/docs/tr/intlayer_with_nextjs_14.md +2 -2
  250. package/docs/tr/intlayer_with_nextjs_15.md +4 -4
  251. package/docs/tr/intlayer_with_nextjs_page_router.md +5 -5
  252. package/docs/tr/intlayer_with_nuxt.md +4 -4
  253. package/docs/tr/intlayer_with_react_native+expo.md +12 -21
  254. package/docs/tr/intlayer_with_react_router_v7.md +222 -267
  255. package/docs/tr/intlayer_with_tanstack.md +400 -303
  256. package/docs/tr/intlayer_with_vite+preact.md +12 -12
  257. package/docs/tr/intlayer_with_vite+react.md +12 -12
  258. package/docs/tr/intlayer_with_vite+solid.md +2 -2
  259. package/docs/tr/intlayer_with_vite+svelte.md +2 -2
  260. package/docs/tr/intlayer_with_vite+vue.md +12 -12
  261. package/docs/tr/introduction.md +1 -1
  262. package/docs/tr/packages/react-intlayer/useDictionary.md +1 -1
  263. package/docs/tr/packages/react-intlayer/useI18n.md +1 -1
  264. package/docs/tr/roadmap.md +1 -1
  265. package/docs/tr/vs_code_extension.md +54 -115
  266. package/docs/zh/component_i18n.md +186 -0
  267. package/docs/zh/intlayer_with_angular.md +2 -2
  268. package/docs/zh/intlayer_with_astro.md +246 -0
  269. package/docs/zh/intlayer_with_create_react_app.md +3 -2
  270. package/docs/zh/intlayer_with_express.md +2 -2
  271. package/docs/zh/intlayer_with_nestjs.md +2 -2
  272. package/docs/zh/intlayer_with_nextjs_14.md +2 -2
  273. package/docs/zh/intlayer_with_nextjs_15.md +2 -2
  274. package/docs/zh/intlayer_with_nextjs_page_router.md +2 -2
  275. package/docs/zh/intlayer_with_nuxt.md +2 -2
  276. package/docs/zh/intlayer_with_react_native+expo.md +19 -28
  277. package/docs/zh/intlayer_with_react_router_v7.md +200 -248
  278. package/docs/zh/intlayer_with_tanstack.md +208 -283
  279. package/docs/zh/intlayer_with_vite+preact.md +9 -9
  280. package/docs/zh/intlayer_with_vite+react.md +9 -9
  281. package/docs/zh/intlayer_with_vite+vue.md +9 -9
  282. package/docs/zh/vs_code_extension.md +51 -105
  283. package/package.json +10 -10
  284. package/src/generated/docs.entry.ts +32 -0
@@ -1,8 +1,8 @@
1
1
  ---
2
2
  createdAt: 2025-09-09
3
3
  updatedAt: 2025-09-09
4
- title: Tanstack Start에서 Intlayer로 시작하는 국제화
5
- description: Intlayer를 사용하여 Tanstack Start 애플리케이션에 국제화(i18n)를 추가하는 방법을 알아보세요. 로케일 인식 라우팅으로 앱을 다국어 지원으로 만드는 종합 가이드를 따라가세요.
4
+ title: Tanstack Start에서 Intlayer로 시작하는 국제화(i18n)
5
+ description: Intlayer를 사용하여 Tanstack Start 애플리케이션에 국제화(i18n)를 추가하는 방법을 배우세요. 로케일 인식 라우팅으로 앱을 다국어 지원으로 만드는 종합 가이드를 따르세요.
6
6
  keywords:
7
7
  - 국제화
8
8
  - 문서
@@ -15,15 +15,13 @@ keywords:
15
15
  slugs:
16
16
  - doc
17
17
  - environment
18
- - vite-and-react
19
18
  - tanstack-start
20
- applicationTemplate: https://github.com/AydinTheFirst/tanstack-start-intlayer
21
- author: AydinTheFirst
19
+ applicationTemplate: https://github.com/aymericzip/intlayer-tanstack-start-template
22
20
  ---
23
21
 
24
22
  # Intlayer와 Tanstack Start로 시작하는 국제화(i18n)
25
23
 
26
- 이 가이드는 Tanstack Start 프로젝트에서 로케일 인식 라우팅, TypeScript 지원 및 최신 개발 방식을 활용하여 **Intlayer**를 원활하게 통합하는 방법을 보여줍니다.
24
+ 이 가이드는 로케일 인식 라우팅, TypeScript 지원 및 최신 개발 방식을 갖춘 Tanstack Start 프로젝트에서 **Intlayer**를 통합하여 원활한 국제화(i18n)를 구현하는 방법을 보여줍니다.
27
25
 
28
26
  ## Intlayer란 무엇인가요?
29
27
 
@@ -33,8 +31,8 @@ Intlayer를 사용하면 다음을 할 수 있습니다:
33
31
 
34
32
  - **컴포넌트 수준에서 선언적 사전을 사용하여 번역을 쉽게 관리**할 수 있습니다.
35
33
  - **메타데이터, 라우트 및 콘텐츠를 동적으로 현지화**할 수 있습니다.
36
- - **자동 생성된 타입으로 TypeScript 지원을 보장**하여 자동 완성 및 오류 감지를 개선합니다.
37
- - **동적 로케일 감지 및 전환과 같은 고급 기능**을 활용할 수 있습니다.
34
+ - **자동 생성된 타입으로 TypeScript 지원을 보장**하여 자동 완성 및 오류 감지를 향상시킵니다.
35
+ - **동적 로케일 감지 및 전환과 같은 고급 기능을 활용**할 수 있습니다.
38
36
  - **Tanstack Start의 파일 기반 라우팅 시스템을 사용하여 로케일 인식 라우팅 활성화**.
39
37
 
40
38
  ---
@@ -73,7 +71,7 @@ pnpm add vite-intlayer --save-dev
73
71
 
74
72
  애플리케이션의 언어를 구성하기 위한 설정 파일을 만드세요:
75
73
 
76
- ```typescript fileName="intlayer.config.ts" codeFormat="typescript"
74
+ ```typescript fileName="intlayer.config.ts"
77
75
  import type { IntlayerConfig } from "intlayer";
78
76
 
79
77
  import { Locales } from "intlayer";
@@ -81,79 +79,31 @@ import { Locales } from "intlayer";
81
79
  const config: IntlayerConfig = {
82
80
  internationalization: {
83
81
  defaultLocale: Locales.ENGLISH,
84
- locales: [
85
- Locales.ENGLISH,
86
- Locales.FRENCH,
87
- Locales.SPANISH,
88
- // 다른 로케일들
89
- ],
82
+ locales: [Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH],
90
83
  },
91
84
  };
92
85
 
93
86
  export default config;
94
87
  ```
95
88
 
96
- ```javascript fileName="intlayer.config.mjs" codeFormat="esm"
97
- import { Locales } from "intlayer";
98
-
99
- /** @type {import('intlayer').IntlayerConfig} */
100
- const config = {
101
- internationalization: {
102
- defaultLocale: Locales.ENGLISH,
103
- locales: [
104
- Locales.ENGLISH,
105
- Locales.FRENCH,
106
- Locales.SPANISH,
107
- // 다른 로케일들
108
- ],
109
- },
110
- };
111
-
112
- export default config;
113
- ```
114
-
115
- ```javascript fileName="intlayer.config.cjs" codeFormat="commonjs"
116
- const { Locales } = require("intlayer");
117
-
118
- /** @type {import('intlayer').IntlayerConfig} */
119
- const config = {
120
- internationalization: {
121
- defaultLocale: Locales.ENGLISH,
122
- locales: [
123
- Locales.ENGLISH,
124
- Locales.FRENCH,
125
- Locales.SPANISH,
126
- // 다른 로케일들
127
- ],
128
- },
129
- };
130
-
131
- module.exports = config;
132
- ```
133
-
134
- > 이 구성 파일을 통해 지역화된 URL, 미들웨어 리디렉션, 쿠키 이름, 콘텐츠 선언의 위치 및 확장자 설정, 콘솔에서 Intlayer 로그 비활성화 등 다양한 설정을 할 수 있습니다. 사용 가능한 모든 매개변수 목록은 [구성 문서](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ko/configuration.md)를 참조하세요.
89
+ > 이 설정 파일을 통해 지역화된 URL, 미들웨어 리디렉션, 쿠키 이름, 콘텐츠 선언의 위치 및 확장자, 콘솔에서 Intlayer 로그 비활성화 등 다양한 설정을 할 수 있습니다. 사용 가능한 모든 매개변수 목록은 [설정 문서](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ko/configuration.md)를 참조하세요.
135
90
 
136
91
  ### 4단계: Vite 구성에 Intlayer 통합하기
137
92
 
138
- intlayer 플러그인을 구성에 추가하세요:
93
+ 구성에 intlayer 플러그인을 추가하세요:
139
94
 
140
- ```typescript fileName="vite.config.ts" codeFormat="typescript"
95
+ ```typescript fileName="vite.config.ts"
141
96
  import { reactRouter } from "@react-router/dev/vite";
142
97
  import { defineConfig } from "vite";
143
- import { intlayerMiddlewarePlugin, intlayer } from "vite-intlayer";
98
+ import { intlayer } from "vite-intlayer";
144
99
  import tsconfigPaths from "vite-tsconfig-paths";
145
100
 
146
101
  export default defineConfig({
147
- plugins: [
148
- reactRouter(),
149
- tsconfigPaths(),
150
- intlayer(),
151
- intlayerMiddlewarePlugin(),
152
- ],
102
+ plugins: [reactRouter(), tsconfigPaths(), intlayer()],
153
103
  });
154
104
  ```
155
105
 
156
- > `intlayer()` Vite 플러그인은 Intlayer를 Vite와 통합하는 데 사용됩니다. 이 플러그인은 콘텐츠 선언 파일을 빌드하고 개발 모드에서 이를 모니터링합니다. 또한 Vite 애플리케이션 내에서 Intlayer 환경 변수를 정의하며, 성능 최적화를 위해 별칭(alias)도 제공합니다.
106
+ > `intlayer()` Vite 플러그인은 Intlayer를 Vite와 통합하는 데 사용됩니다. 이 플러그인은 콘텐츠 선언 파일을 빌드하고 개발 모드에서 이를 모니터링합니다. 또한 Vite 애플리케이션 내에서 Intlayer 환경 변수를 정의합니다. 추가로, 성능 최적화를 위한 별칭(alias)도 제공합니다.
157
107
 
158
108
  ### 5단계: 레이아웃 컴포넌트 생성
159
109
 
@@ -161,10 +111,8 @@ export default defineConfig({
161
111
 
162
112
  #### 루트 레이아웃
163
113
 
164
- ```tsx fileName="src/routes/{-$locale}/route.tsx" codeFormat="typescript"
165
- // src/routes/{-$locale}/route.tsx
114
+ ```tsx fileName="src/routes/{-$locale}/route.tsx"
166
115
  import { createFileRoute, Navigate, Outlet } from "@tanstack/react-router";
167
- import { configuration } from "intlayer";
168
116
  import { IntlayerProvider, useLocale } from "react-intlayer";
169
117
 
170
118
  import { useI18nHTMLAttributes } from "@/hooks/useI18nHTMLAttributes";
@@ -174,21 +122,22 @@ export const Route = createFileRoute("/{-$locale}")({
174
122
  });
175
123
 
176
124
  function LayoutComponent() {
125
+ const { defaultLocale } = useLocale();
177
126
  const { locale } = Route.useParams();
178
127
 
179
128
  return (
180
- <IntlayerProvider locale={locale}>
129
+ <IntlayerProvider locale={defaultLocale}>
181
130
  <Outlet />
182
131
  </IntlayerProvider>
183
132
  );
184
133
  }
185
134
  ```
186
135
 
187
- ### 6단계: 콘텐츠 선언하기
136
+ ### 6단계: 콘텐츠 선언
188
137
 
189
138
  번역을 저장하기 위해 콘텐츠 선언을 생성하고 관리하세요:
190
139
 
191
- ```tsx fileName="src/contents/page.content.ts" contentDeclarationFormat="typescript"
140
+ ```tsx fileName="src/contents/page.content.ts"
192
141
  import type { Dictionary } from "intlayer";
193
142
 
194
143
  import { t } from "intlayer";
@@ -197,25 +146,29 @@ const appContent = {
197
146
  content: {
198
147
  links: {
199
148
  about: t({
149
+ ko: "소개",
200
150
  en: "About",
201
151
  es: "Acerca de",
202
152
  fr: "À propos",
203
153
  }),
204
154
  home: t({
205
- en: "홈",
155
+ ko: "홈",
156
+ en: "Home",
206
157
  es: "Inicio",
207
158
  fr: "Accueil",
208
159
  }),
209
160
  },
210
161
  meta: {
211
162
  description: t({
212
- en: "이것은 TanStack Router와 함께 Intlayer를 사용하는 예제입니다",
163
+ ko: "이것은 TanStack Router와 함께 Intlayer를 사용하는 예제입니다",
164
+ en: "This is an example of using Intlayer with TanStack Router",
213
165
  es: "Este es un ejemplo de uso de Intlayer con TanStack Router",
214
166
  fr: "Ceci est un exemple d'utilisation d'Intlayer avec TanStack Router",
215
167
  }),
216
168
  },
217
169
  title: t({
218
- en: "Intlayer + TanStack Router에 오신 것을 환영합니다",
170
+ ko: "Intlayer + TanStack Router에 오신 것을 환영합니다",
171
+ en: "Welcome to Intlayer + TanStack Router",
219
172
  es: "Bienvenido a Intlayer + TanStack Router",
220
173
  fr: "Bienvenue à Intlayer + TanStack Router",
221
174
  }),
@@ -226,7 +179,7 @@ const appContent = {
226
179
  export default appContent;
227
180
  ```
228
181
 
229
- > 콘텐츠 선언은 애플리케이션 내 어디에서든 정의할 수 있으며, `contentDir` 디렉토리(기본값은 `./app`)에 포함되기만 하면 됩니다. 그리고 콘텐츠 선언 파일 확장자(기본값은 `.content.{json,ts,tsx,js,jsx,mjs,mjx,cjs,cjx}`)와 일치해야 합니다.
182
+ > 콘텐츠 선언은 애플리케이션 내 어디에서나 정의할 수 있으며, `contentDir` 디렉토리(기본값: `./app`)에 포함되면 자동으로 인식됩니다. 또한 콘텐츠 선언 파일 확장자(기본값: `.content.{json,ts,tsx,js,jsx,mjs,mjx,cjs,cjx}`)와 일치해야 합니다.
230
183
 
231
184
  > 자세한 내용은 [콘텐츠 선언 문서](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ko/dictionary/get_started.md)를 참조하세요.
232
185
 
@@ -234,59 +187,99 @@ export default appContent;
234
187
 
235
188
  로케일 인식 내비게이션을 위한 `LocalizedLink` 컴포넌트를 생성합니다:
236
189
 
237
- ```tsx fileName="src/components/localized-link.tsx" codeFormat="typescript"
238
- // src/components/localized-link.tsx
239
- // eslint-disable-next-line no-restricted-imports
240
- import { Link, type LinkProps } from "@tanstack/react-router";
241
- import { getLocalizedUrl } from "intlayer";
190
+ ```tsx fileName="src/components/localized-link.tsx"
191
+ import type { FC } from "react";
192
+
193
+ import { Link, type LinkComponentProps } from "@tanstack/react-router";
242
194
  import { useLocale } from "react-intlayer";
243
195
 
196
+ export const LOCALE_ROUTE = "{-$locale}" as const;
197
+
198
+ // 주요 유틸리티
199
+ export type RemoveLocaleParam<T> = T extends string
200
+ ? RemoveLocaleFromString<T>
201
+ : T;
202
+
203
+ export type To = RemoveLocaleParam<LinkComponentProps["to"]>;
204
+
205
+ type CollapseDoubleSlashes<S extends string> =
206
+ S extends `${infer H}//${infer T}` ? CollapseDoubleSlashes<`${H}/${T}`> : S;
207
+
244
208
  type LocalizedLinkProps = {
245
- to: string;
246
- } & Omit<LinkProps, "to">;
209
+ to?: To;
210
+ } & Omit<LinkComponentProps, "to">;
247
211
 
248
- export function LocalizedLink(props: LocalizedLinkProps) {
249
- const { locale } = useLocale();
212
+ // 헬퍼 함수들
213
+ type RemoveAll<
214
+ S extends string,
215
+ Sub extends string,
216
+ > = S extends `${infer H}${Sub}${infer T}` ? RemoveAll<`${H}${T}`, Sub> : S;
250
217
 
251
- const isExternal = (to: string) => {
252
- return /^(https?:)?\/\//.test(to);
253
- };
218
+ type RemoveLocaleFromString<S extends string> = CollapseDoubleSlashes<
219
+ RemoveAll<S, typeof LOCALE_ROUTE>
220
+ >;
254
221
 
255
- const to = isExternal(props.to)
256
- ? props.to
257
- : getLocalizedUrl(props.to, locale);
222
+ export const LocalizedLink: FC<LocalizedLinkProps> = (props) => {
223
+ const { locale } = useLocale();
258
224
 
259
- return <Link {...props} to={to as LinkProps["to"]} />;
260
- }
225
+ return (
226
+ <Link
227
+ {...props}
228
+ params={{
229
+ locale,
230
+ ...(typeof props?.params === "object" ? props?.params : {}),
231
+ }}
232
+ to={`/${LOCALE_ROUTE}${props.to}` as LinkComponentProps["to"]}
233
+ />
234
+ );
235
+ };
261
236
  ```
262
237
 
263
- 프로그래밍 방식 내비게이션을 위한 `useLocalizedNavigate` 훅을 생성하세요:
238
+ 컴포넌트는 가지 목적을 가지고 있습니다:
264
239
 
265
- ```tsx fileName="src/hooks/useLocalizedNavigate.tsx" codeFormat="typescript"
266
- // src/hooks/useLocalizedNavigate.tsx
267
- // eslint-disable-next-line no-restricted-imports
268
- import { NavigateOptions, useNavigate } from "@tanstack/react-router";
269
- import { getLocalizedUrl } from "intlayer";
270
- import { useLocale } from "react-intlayer";
240
+ - URL에서 불필요한 `{-$locale}` 접두사를 제거합니다.
241
+ - URL에 locale 매개변수를 주입하여 사용자가 로컬라이즈된 경로로 직접 리디렉션되도록 보장합니다.
271
242
 
272
- type LocalizedNavigateOptions = {
273
- to: string;
274
- } & Omit<NavigateOptions, "to">;
243
+ 다음, 프로그래밍 방식의 내비게이션을 위해 `useLocalizedNavigate` 훅을 생성할 수 있습니다:
244
+
245
+ ```tsx fileName="src/hooks/useLocalizedNavigate.tsx"
246
+ import { useLocale } from "react-intlayer";
247
+ import { useNavigate } from "@tanstack/react-router";
248
+ import { LOCALE_ROUTE } from "@/components/localized-link";
249
+ import type { FileRouteTypes } from "@/routeTree.gen";
275
250
 
276
251
  export const useLocalizedNavigate = () => {
277
252
  const navigate = useNavigate();
253
+
278
254
  const { locale } = useLocale();
279
255
 
280
- const isExternal = (to: string) => {
281
- return /^(https?:)?\/\//.test(to);
282
- };
256
+ type StripLocalePrefix<T extends string> = T extends
257
+ | `/${typeof LOCALE_ROUTE}`
258
+ | `/${typeof LOCALE_ROUTE}/`
259
+ ? "/"
260
+ : T extends `/${typeof LOCALE_ROUTE}/${infer Rest}`
261
+ ? `/${Rest}`
262
+ : never;
263
+
264
+ type LocalizedTo = StripLocalePrefix<FileRouteTypes["to"]>;
265
+
266
+ interface LocalizedNavigate {
267
+ (to: LocalizedTo): ReturnType<typeof navigate>;
268
+ (
269
+ opts: { to: LocalizedTo } & Record<string, unknown>
270
+ ): ReturnType<typeof navigate>;
271
+ }
272
+
273
+ const localizedNavigate: LocalizedNavigate = (args: any) => {
274
+ if (typeof args === "string") {
275
+ return navigate({ to: `/${LOCALE_ROUTE}${args}`, params: { locale } });
276
+ }
277
+
278
+ const { to, ...rest } = args;
283
279
 
284
- const localizedNavigate = (options: LocalizedNavigateOptions) => {
285
- const to = isExternal(options.to)
286
- ? options.to
287
- : getLocalizedUrl(options.to, locale);
280
+ const localedTo = `/${LOCALE_ROUTE}${to}` as any;
288
281
 
289
- navigate({ ...options, to: to as NavigateOptions["to"] });
282
+ return navigate({ to: localedTo, params: { locale, ...rest } as any });
290
283
  };
291
284
 
292
285
  return localizedNavigate;
@@ -295,25 +288,11 @@ export const useLocalizedNavigate = () => {
295
288
 
296
289
  ### 8단계: 페이지에서 Intlayer 사용하기
297
290
 
298
- 애플리케이션 전반에서 콘텐츠 사전을 접근하세요:
291
+ 애플리케이션 전반에서 콘텐츠 사전을 액세스하세요:
299
292
 
300
- #### 루트 리디렉션 페이지
301
-
302
- ```tsx fileName="src/routes/page.tsx" codeFormat="typescript"
303
- // src/routes/page.tsx
304
- import { useLocale } from "intlayer";
305
- import { Navigate } from "react-router";
306
-
307
- export default function Page() {
308
- const { locale } = useLocale();
293
+ #### 현지화된 페이지
309
294
 
310
- return <Navigate replace to={locale} />;
311
- }
312
- ```
313
-
314
- #### 지역화된 홈 페이지
315
-
316
- ```tsx fileName="src/routes/{-$locale}/index.tsx" codeFormat="typescript"
295
+ ```tsx fileName="src/routes/{-$locale}/index.tsx"
317
296
  import { createFileRoute } from "@tanstack/react-router";
318
297
  import { getIntlayer } from "intlayer";
319
298
  import { useIntlayer } from "react-intlayer";
@@ -342,16 +321,15 @@ function RouteComponent() {
342
321
  const navigate = useLocalizedNavigate();
343
322
 
344
323
  return (
345
- <div className="grid place-items-center h-screen">
346
- <div className="flex flex-col gap-4 items-center text-center">
324
+ <div>
325
+ <div>
347
326
  {content.title}
348
327
  <LocaleSwitcher />
349
- <div className="flex gap-4">
350
- <a href="/">인덱스</a>
328
+ <div>
351
329
  <LocalizedLink to="/">{content.links.home}</LocalizedLink>
352
330
  <LocalizedLink to="/about">{content.links.about}</LocalizedLink>
353
331
  </div>
354
- <div className="flex gap-4">
332
+ <div>
355
333
  <button onClick={() => navigate({ to: "/" })}>
356
334
  {content.links.home}
357
335
  </button>
@@ -365,63 +343,71 @@ function RouteComponent() {
365
343
  }
366
344
  ```
367
345
 
368
- > `useIntlayer` 훅에 대해 더 알아보려면 [문서](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ko/packages/react-intlayer/useIntlayer.md)를 참조하세요.
346
+ > `useIntlayer` 훅에 대해 더 알아보려면 [문서](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ko/packages/react-intlayer/useIntlayer.md)를 참고하세요.
369
347
 
370
348
  ### 9단계: 로케일 스위처 컴포넌트 만들기
371
349
 
372
350
  사용자가 언어를 변경할 수 있도록 컴포넌트를 만듭니다:
373
351
 
374
- ```tsx fileName="src/components/locale-switcher.tsx" codeFormat="typescript"
352
+ ```tsx fileName="src/components/locale-switcher.tsx"
353
+ import type { FC } from "react";
354
+
375
355
  import { useLocation } from "@tanstack/react-router";
376
- import {
377
- getHTMLTextDir,
378
- getLocaleName,
379
- getLocalizedUrl,
380
- Locales,
381
- } from "intlayer";
382
- import { useIntlayer, useLocale } from "react-intlayer";
383
-
384
- export default function LocaleSwitcher() {
385
- const { pathname, searchStr } = useLocation();
386
- const content = useIntlayer("locale-switcher");
387
-
388
- const { availableLocales, locale, setLocale } = useLocale({
389
- onLocaleChange: (newLocale) => {
390
- const pathWithLocale = getLocalizedUrl(pathname + searchStr, newLocale);
391
- location.replace(pathWithLocale); // 새로운 로케일 경로로 페이지를 대체합니다.
392
- },
393
- });
356
+ import { getHTMLTextDir, getLocaleName, getPathWithoutLocale } from "intlayer";
357
+ import { setLocaleCookie, useIntlayer, useLocale } from "react-intlayer";
358
+
359
+ import { LocalizedLink, To } from "./localized-link";
360
+
361
+ export const LocaleSwitcher: FC = () => {
362
+ const { localeSwitcherLabel } = useIntlayer("locale-switcher");
363
+ const { pathname } = useLocation();
364
+
365
+ const { availableLocales, locale } = useLocale();
366
+
367
+ const pathWithoutLocale = getPathWithoutLocale(pathname);
394
368
 
395
369
  return (
396
- <select
397
- aria-label={content.label.toString()} // 접근성을 위한 라벨
398
- onChange={(e) => setLocale(e.target.value)} // 선택된 로케일로 변경
399
- value={locale} // 현재 선택된 로케일 값
400
- >
401
- {availableLocales.map((localeItem) => (
402
- <option
403
- dir={getHTMLTextDir(localeItem)}
404
- key={localeItem}
405
- lang={localeItem}
406
- value={localeItem}
407
- >
408
- {/* 예시: Français (프랑스어) */}
409
- {getLocaleName(localeItem, locale)} (
410
- {getLocaleName(localeItem, Locales.ENGLISH)})
411
- </option>
370
+ <ol>
371
+ {availableLocales.map((localeEl) => (
372
+ <li key={localeEl}>
373
+ <LocalizedLink
374
+ aria-current={localeEl === locale ? "page" : undefined}
375
+ aria-label={`${localeSwitcherLabel.value} ${getLocaleName(localeEl)}`}
376
+ onClick={() => setLocaleCookie(localeEl)}
377
+ params={{ locale: localeEl }}
378
+ to={pathWithoutLocale as To}
379
+ >
380
+ <span>
381
+ {/* 로케일 - 예: FR */}
382
+ {localeItem}
383
+ </span>
384
+ <span>
385
+ {/* 해당 로케일 내 언어 - 예: Français */}
386
+ {getLocaleName(localeItem, locale)}
387
+ </span>
388
+ <span dir={getHTMLTextDir(localeItem)} lang={localeItem}>
389
+ {/* 현재 로케일 내 언어 - 예: 현재 로케일이 Locales.SPANISH일 때 Francés */}
390
+ {getLocaleName(localeItem)}
391
+ </span>
392
+ <span dir="ltr" lang={Locales.ENGLISH}>
393
+ {/* 영어로 된 언어 - 예: French */}
394
+ {getLocaleName(localeItem, Locales.ENGLISH)}
395
+ </span>
396
+ </LocalizedLink>
397
+ </li>
412
398
  ))}
413
- </select>
399
+ </ol>
414
400
  );
415
- }
401
+ };
416
402
  ```
417
403
 
418
404
  > `useLocale` 훅에 대해 더 알아보려면 [문서](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ko/packages/react-intlayer/useLocale.md)를 참조하세요.
419
405
 
420
406
  ### 10단계: HTML 속성 관리 추가 (선택 사항)
421
407
 
422
- HTML lang 및 dir 속성을 관리하는 훅을 만듭니다:
408
+ HTML lang 및 dir 속성을 관리하는 훅을 만듭니다:
423
409
 
424
- ```tsx fileName="src/hooks/useI18nHTMLAttributes.tsx" codeFormat="typescript"
410
+ ```tsx fileName="src/hooks/useI18nHTMLAttributes.tsx"
425
411
  // src/hooks/useI18nHTMLAttributes.tsx
426
412
  import { getHTMLTextDir } from "intlayer";
427
413
  import { useEffect } from "react";
@@ -439,9 +425,8 @@ export const useI18nHTMLAttributes = () => {
439
425
 
440
426
  그런 다음 루트 컴포넌트에서 사용하세요:
441
427
 
442
- ```tsx fileName="src/routes/{-$locale}/index.tsx" codeFormat="typescript"
428
+ ```tsx fileName="src/routes/{-$locale}/index.tsx"
443
429
  import { createFileRoute, Navigate, Outlet } from "@tanstack/react-router";
444
- import { configuration } from "intlayer";
445
430
  import { IntlayerProvider, useLocale } from "react-intlayer";
446
431
 
447
432
  import { useI18nHTMLAttributes } from "@/hooks/useI18nHTMLAttributes"; // 훅을 임포트합니다.
@@ -451,57 +436,56 @@ export const Route = createFileRoute("/{-$locale}")({
451
436
  });
452
437
 
453
438
  function LayoutComponent() {
454
- useI18nHTMLAttributes(); // 이 줄을 추가하세요
439
+ useI18nHTMLAttributes(); // 이 줄을 추가합니다.
455
440
 
441
+ const { defaultLocale } = useLocale();
456
442
  const { locale } = Route.useParams();
457
443
 
458
444
  return (
459
- <IntlayerProvider locale={locale}>
445
+ <IntlayerProvider locale={locale ?? defaultLocale}>
460
446
  <Outlet />
461
447
  </IntlayerProvider>
462
448
  );
463
449
  }
464
450
  ```
465
451
 
466
- ### 11단계: 애플리케이션 빌드 및 실행
452
+ ---
467
453
 
468
- 콘텐츠 사전을 빌드하고 애플리케이션을 실행하세요:
454
+ ### 11단계: 미들웨어 추가 (선택 사항)
469
455
 
470
- ```bash packageManager="npm"
471
- # Intlayer 사전 빌드
472
- npm run intlayer:build
456
+ `intlayerMiddleware`를 사용하여 애플리케이션에 서버 사이드 라우팅을 추가할 수도 있습니다. 이 플러그인은 URL을 기반으로 현재 로케일을 자동으로 감지하고 적절한 로케일 쿠키를 설정합니다. 로케일이 지정되지 않은 경우, 플러그인은 사용자의 브라우저 언어 설정을 기반으로 가장 적합한 로케일을 결정합니다. 로케일이 감지되지 않으면 기본 로케일로 리디렉션합니다.
473
457
 
474
- # 개발 서버 시작
475
- npm run dev
476
- ```
458
+ > `intlayerMiddleware`를 프로덕션 환경에서 사용하려면 `vite-intlayer` 패키지를 `devDependencies`에서 `dependencies`로 변경해야 한다는 점에 유의하세요.
477
459
 
478
- ```bash packageManager="pnpm"
479
- # Intlayer 사전 빌드
480
- pnpm intlayer:build
460
+ ```typescript {3,7} fileName="vite.config.ts"
461
+ import { reactRouter } from "@react-router/dev/vite";
462
+ import tailwindcss from "@tailwindcss/vite";
463
+ import { defineConfig } from "vite";
464
+ import { intlayer, intlayerMiddleware } from "vite-intlayer";
465
+ import tsconfigPaths from "vite-tsconfig-paths";
481
466
 
482
- # 개발 서버 시작
483
- pnpm dev
467
+ export default defineConfig({
468
+ plugins: [
469
+ tailwindcss(),
470
+ reactRouter(),
471
+ tsconfigPaths(),
472
+ intlayer(),
473
+ intlayerMiddleware(),
474
+ ],
475
+ });
484
476
  ```
485
477
 
486
- ```bash packageManager="yarn"
487
- # Intlayer 사전 빌드
488
- yarn intlayer:build
489
-
490
- # 개발 서버 시작
491
- yarn dev
492
- ```
478
+ ---
493
479
 
494
480
  ### 12단계: TypeScript 구성 (선택 사항)
495
481
 
496
- Intlayer는 TypeScript의 이점을 활용하고 코드베이스를 더욱 견고하게 만들기 위해 모듈 확장을 사용합니다.
482
+ Intlayer는 모듈 확장을 사용하여 TypeScript의 이점을 활용하고 코드베이스를 더욱 견고하게 만듭니다.
497
483
 
498
484
  TypeScript 구성에 자동 생성된 타입이 포함되어 있는지 확인하세요:
499
485
 
500
486
  ```json5 fileName="tsconfig.json"
501
487
  {
502
- compilerOptions: {
503
- // ... 기존 TypeScript 구성
504
- },
488
+ // ... 기존 구성
505
489
  include: [
506
490
  // ... 기존 포함 항목
507
491
  ".intlayer/**/*.ts", // 자동 생성된 타입 포함
@@ -509,91 +493,37 @@ TypeScript 구성에 자동 생성된 타입이 포함되어 있는지 확인하
509
493
  }
510
494
  ```
511
495
 
496
+ ---
497
+
512
498
  ### Git 구성
513
499
 
514
- Intlayer가 생성한 파일들은 Git 저장소에 커밋하지 않도록 무시하는 것이 권장됩니다.
500
+ Intlayer가 생성한 파일은 Git 저장소에 커밋하지 않도록 무시하는 것이 권장됩니다.
515
501
 
516
- 이를 위해 `.gitignore` 파일에 다음 내용을 추가할 수 있습니다:
502
+ 이를 위해 `.gitignore` 파일에 다음 지침을 추가할 수 있습니다:
503
+
504
+ 이를 위해 `.gitignore` 파일에 다음 지침을 추가할 수 있습니다:
517
505
 
518
506
  ```plaintext fileName=".gitignore"
519
- # Intlayer 생성한 파일 무시
507
+ # Intlayer에서 생성된 파일 무시
520
508
  .intlayer
521
509
  ```
522
510
 
523
511
  ---
524
512
 
525
- ### 13단계: 리디렉션 생성 (선택 사항)
526
-
527
- ```typescript fileName="src/routes/{-$locale}/rotue.tsx" codeFormat="typescript"
528
- function LayoutComponent() {
529
- useI18nHTMLAttributes();
530
-
531
- const { locale } = Route.useParams();
532
- const { locale: selectedLocale } = useLocale();
533
- const { defaultLocale } = configuration.internationalization;
534
- const { prefixDefault } = configuration.middleware;
535
-
536
- // prefixDefault가 true일 때 URL에 로케일이 없으면 기본 로케일로 리디렉션
537
- if (selectedLocale === defaultLocale && !locale && prefixDefault) {
538
- return <Navigate replace to={defaultLocale} />;
539
- }
540
-
541
- // URL의 로케일이 선택된 로케일과 다르면 선택된 로케일로 리디렉션
542
- if (selectedLocale !== defaultLocale && !locale) {
543
- return <Navigate replace to={selectedLocale} />;
544
- }
545
-
546
- return (
547
- <IntlayerProvider locale={locale}>
548
- <Outlet />
549
- </IntlayerProvider>
550
- );
551
- }
552
- ```
553
-
554
- ## 프로덕션 배포
555
-
556
- 애플리케이션을 배포할 때:
557
-
558
- 1. **애플리케이션 빌드:**
559
-
560
- ```bash
561
- npm run build
562
- ```
563
-
564
- 2. **Intlayer 사전 빌드:**
565
-
566
- ```bash
567
- npm run intlayer:build
568
- ```
569
-
570
- 3. **프로덕션에서 미들웨어를 사용하는 경우 `vite-intlayer`를 dependencies로 이동:**
571
- ```bash
572
- npm install vite-intlayer --save
573
- ```
574
-
575
- 이제 애플리케이션은 다음을 지원합니다:
576
-
577
- - **URL 구조**: `/en`, `/en/about`, `/tr`, `/tr/about`
578
- - **브라우저 환경설정을 기반으로 한 자동 로케일 감지**
579
- - **Tanstack Start를 이용한 로케일 인식 라우팅**
580
- - **자동 생성 타입을 포함한 TypeScript 지원**
581
- - **적절한 로케일 처리를 포함한 서버 사이드 렌더링**
582
-
583
- ## VS 코드 확장 기능
513
+ ## VS 코드 확장 프로그램
584
514
 
585
- Intlayer 개발 경험을 향상시키기 위해 공식 **Intlayer VS Code 확장 프로그램**을 설치할 수 있습니다.
515
+ Intlayer 함께 개발 경험을 향상시키기 위해 공식 **Intlayer VS 코드 확장 프로그램**을 설치할 수 있습니다.
586
516
 
587
- [VS Code 마켓플레이스에서 설치하기](https://marketplace.visualstudio.com/items?itemName=intlayer.intlayer-vs-code-extension)
517
+ [VS 코드 마켓플레이스에서 설치하기](https://marketplace.visualstudio.com/items?itemName=intlayer.intlayer-vs-code-extension)
588
518
 
589
519
  이 확장 프로그램은 다음을 제공합니다:
590
520
 
591
- - 번역 키에 대한 **자동 완성** 기능.
521
+ - 번역 키에 대한 **자동 완성**.
592
522
  - 누락된 번역에 대한 **실시간 오류 감지**.
593
523
  - 번역된 콘텐츠의 **인라인 미리보기**.
594
524
  - 번역을 쉽게 생성하고 업데이트할 수 있는 **빠른 작업**.
595
525
 
596
- 확장 프로그램 사용 방법에 대한 자세한 내용은 [Intlayer VS Code 확장 프로그램 문서](https://intlayer.org/doc/vs-code-extension)를 참조하세요.
526
+ 확장 기능 사용 방법에 대한 자세한 내용은 [Intlayer VS Code 확장 문서](https://intlayer.org/doc/vs-code-extension)를 참조하세요.
597
527
 
598
528
  ---
599
529
 
@@ -603,19 +533,19 @@ Intlayer 개발 경험을 향상시키기 위해 공식 **Intlayer VS Code 확
603
533
 
604
534
  ---
605
535
 
606
- ## 문서 참조
536
+ ## 문서 참고 자료
607
537
 
608
538
  - [Intlayer 문서](https://intlayer.org)
609
539
  - [Tanstack Start 문서](https://reactrouter.com/)
610
540
  - [useIntlayer 훅](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ko/packages/react-intlayer/useIntlayer.md)
611
541
  - [useLocale 훅](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ko/packages/react-intlayer/useLocale.md)
612
542
  - [콘텐츠 선언](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ko/dictionary/get_started.md)
613
- - [구성](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ko/configuration.md)
543
+ - [설정](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ko/configuration.md)
614
544
 
615
545
  이 종합 가이드는 지역 인식 라우팅과 TypeScript 지원을 갖춘 완전한 국제화 애플리케이션을 위해 Intlayer를 Tanstack Start와 통합하는 데 필요한 모든 것을 제공합니다.
616
546
 
617
547
  ## 문서 이력
618
548
 
619
- | 버전 | 날짜 | 변경 사항 |
620
- | ----- | ---------- | ----------------------- |
621
- | 5.8.1 | 2025-09-09 | Tanstack Start용 추가됨 |
549
+ | 버전 | 날짜 | 변경 사항 |
550
+ | ----- | ---------- | --------------------- |
551
+ | 5.8.1 | 2025-09-09 | Tanstack Start용 추가 |