@intlayer/docs 5.5.11 β†’ 5.5.12

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 (313) hide show
  1. package/blog/ar/intlayer_with_next-intl.md +0 -1
  2. package/blog/ar/list_i18n_technologies/CMS/wordpress.md +1 -1
  3. package/blog/ar/list_i18n_technologies/frameworks/angular.md +1 -1
  4. package/blog/ar/list_i18n_technologies/frameworks/flutter.md +1 -1
  5. package/blog/ar/list_i18n_technologies/frameworks/react-native.md +1 -1
  6. package/blog/ar/list_i18n_technologies/frameworks/react.md +1 -1
  7. package/blog/ar/list_i18n_technologies/frameworks/svelte.md +1 -1
  8. package/blog/ar/list_i18n_technologies/frameworks/vue.md +1 -1
  9. package/blog/ar/what_is_internationalization.md +2 -2
  10. package/blog/de/intlayer_with_next-intl.md +0 -1
  11. package/blog/de/list_i18n_technologies/CMS/wordpress.md +1 -1
  12. package/blog/de/list_i18n_technologies/frameworks/angular.md +1 -1
  13. package/blog/de/list_i18n_technologies/frameworks/flutter.md +1 -1
  14. package/blog/de/list_i18n_technologies/frameworks/react-native.md +1 -1
  15. package/blog/de/list_i18n_technologies/frameworks/react.md +1 -1
  16. package/blog/de/list_i18n_technologies/frameworks/svelte.md +1 -1
  17. package/blog/de/list_i18n_technologies/frameworks/vue.md +1 -1
  18. package/blog/de/what_is_internationalization.md +2 -2
  19. package/blog/en/intlayer_with_next-intl.md +0 -1
  20. package/blog/en/list_i18n_technologies/CMS/wordpress.md +1 -1
  21. package/blog/en/list_i18n_technologies/frameworks/angular.md +1 -1
  22. package/blog/en/list_i18n_technologies/frameworks/flutter.md +1 -1
  23. package/blog/en/list_i18n_technologies/frameworks/react-native.md +1 -1
  24. package/blog/en/list_i18n_technologies/frameworks/react.md +1 -1
  25. package/blog/en/list_i18n_technologies/frameworks/svelte.md +1 -1
  26. package/blog/en/list_i18n_technologies/frameworks/vue.md +1 -1
  27. package/blog/en/what_is_internationalization.md +2 -2
  28. package/blog/en-GB/intlayer_with_next-intl.md +0 -1
  29. package/blog/en-GB/list_i18n_technologies/CMS/wordpress.md +1 -1
  30. package/blog/en-GB/list_i18n_technologies/frameworks/angular.md +1 -1
  31. package/blog/en-GB/list_i18n_technologies/frameworks/flutter.md +1 -1
  32. package/blog/en-GB/list_i18n_technologies/frameworks/react-native.md +1 -1
  33. package/blog/en-GB/list_i18n_technologies/frameworks/svelte.md +1 -1
  34. package/blog/en-GB/list_i18n_technologies/frameworks/vue.md +1 -1
  35. package/blog/en-GB/what_is_internationalization.md +2 -2
  36. package/blog/es/intlayer_with_next-intl.md +0 -1
  37. package/blog/es/list_i18n_technologies/CMS/wordpress.md +1 -1
  38. package/blog/es/list_i18n_technologies/frameworks/angular.md +1 -1
  39. package/blog/es/list_i18n_technologies/frameworks/flutter.md +1 -1
  40. package/blog/es/list_i18n_technologies/frameworks/react-native.md +1 -1
  41. package/blog/es/list_i18n_technologies/frameworks/react.md +1 -1
  42. package/blog/es/list_i18n_technologies/frameworks/svelte.md +1 -1
  43. package/blog/es/list_i18n_technologies/frameworks/vue.md +1 -1
  44. package/blog/es/what_is_internationalization.md +2 -2
  45. package/blog/fr/intlayer_with_next-intl.md +0 -1
  46. package/blog/fr/list_i18n_technologies/CMS/wordpress.md +1 -1
  47. package/blog/fr/list_i18n_technologies/frameworks/angular.md +1 -1
  48. package/blog/fr/list_i18n_technologies/frameworks/flutter.md +1 -1
  49. package/blog/fr/list_i18n_technologies/frameworks/react-native.md +1 -1
  50. package/blog/fr/list_i18n_technologies/frameworks/react.md +1 -1
  51. package/blog/fr/list_i18n_technologies/frameworks/svelte.md +1 -1
  52. package/blog/fr/list_i18n_technologies/frameworks/vue.md +1 -1
  53. package/blog/fr/what_is_internationalization.md +2 -2
  54. package/blog/hi/list_i18n_technologies/CMS/wordpress.md +1 -1
  55. package/blog/hi/list_i18n_technologies/frameworks/angular.md +1 -1
  56. package/blog/hi/list_i18n_technologies/frameworks/flutter.md +1 -1
  57. package/blog/hi/list_i18n_technologies/frameworks/react-native.md +1 -1
  58. package/blog/hi/list_i18n_technologies/frameworks/react.md +1 -1
  59. package/blog/hi/list_i18n_technologies/frameworks/svelte.md +1 -1
  60. package/blog/hi/list_i18n_technologies/frameworks/vue.md +1 -1
  61. package/blog/hi/what_is_internationalization.md +2 -2
  62. package/blog/it/intlayer_with_next-intl.md +0 -1
  63. package/blog/it/list_i18n_technologies/CMS/wordpress.md +1 -1
  64. package/blog/it/list_i18n_technologies/frameworks/angular.md +1 -1
  65. package/blog/it/list_i18n_technologies/frameworks/react-native.md +1 -1
  66. package/blog/it/list_i18n_technologies/frameworks/react.md +1 -1
  67. package/blog/it/list_i18n_technologies/frameworks/svelte.md +1 -1
  68. package/blog/it/list_i18n_technologies/frameworks/vue.md +1 -1
  69. package/blog/it/what_is_internationalization.md +2 -2
  70. package/blog/ja/intlayer_with_next-intl.md +0 -1
  71. package/blog/ja/list_i18n_technologies/CMS/wordpress.md +1 -1
  72. package/blog/ja/list_i18n_technologies/frameworks/angular.md +1 -1
  73. package/blog/ja/list_i18n_technologies/frameworks/flutter.md +1 -1
  74. package/blog/ja/list_i18n_technologies/frameworks/react-native.md +1 -1
  75. package/blog/ja/list_i18n_technologies/frameworks/react.md +1 -1
  76. package/blog/ja/list_i18n_technologies/frameworks/svelte.md +1 -1
  77. package/blog/ja/list_i18n_technologies/frameworks/vue.md +1 -1
  78. package/blog/ja/what_is_internationalization.md +2 -2
  79. package/blog/ko/intlayer_with_next-intl.md +0 -1
  80. package/blog/ko/list_i18n_technologies/CMS/wordpress.md +1 -1
  81. package/blog/ko/list_i18n_technologies/frameworks/angular.md +1 -1
  82. package/blog/ko/list_i18n_technologies/frameworks/react-native.md +1 -1
  83. package/blog/ko/list_i18n_technologies/frameworks/react.md +1 -1
  84. package/blog/ko/list_i18n_technologies/frameworks/vue.md +1 -1
  85. package/blog/pt/intlayer_with_next-intl.md +0 -1
  86. package/blog/pt/list_i18n_technologies/CMS/wordpress.md +1 -1
  87. package/blog/pt/list_i18n_technologies/frameworks/angular.md +1 -1
  88. package/blog/pt/list_i18n_technologies/frameworks/flutter.md +1 -1
  89. package/blog/pt/list_i18n_technologies/frameworks/react-native.md +1 -1
  90. package/blog/pt/list_i18n_technologies/frameworks/react.md +1 -1
  91. package/blog/pt/list_i18n_technologies/frameworks/svelte.md +1 -1
  92. package/blog/pt/list_i18n_technologies/frameworks/vue.md +1 -1
  93. package/blog/pt/what_is_internationalization.md +2 -2
  94. package/blog/ru/intlayer_with_next-intl.md +0 -1
  95. package/blog/ru/list_i18n_technologies/CMS/wordpress.md +1 -1
  96. package/blog/ru/list_i18n_technologies/frameworks/angular.md +1 -1
  97. package/blog/ru/list_i18n_technologies/frameworks/flutter.md +1 -1
  98. package/blog/ru/list_i18n_technologies/frameworks/react-native.md +1 -1
  99. package/blog/ru/list_i18n_technologies/frameworks/react.md +1 -1
  100. package/blog/ru/list_i18n_technologies/frameworks/svelte.md +1 -1
  101. package/blog/ru/list_i18n_technologies/frameworks/vue.md +1 -1
  102. package/blog/ru/what_is_internationalization.md +2 -2
  103. package/blog/zh/intlayer_with_next-intl.md +0 -1
  104. package/blog/zh/list_i18n_technologies/CMS/wordpress.md +1 -1
  105. package/blog/zh/list_i18n_technologies/frameworks/angular.md +1 -1
  106. package/blog/zh/list_i18n_technologies/frameworks/flutter.md +1 -1
  107. package/blog/zh/list_i18n_technologies/frameworks/react-native.md +1 -1
  108. package/blog/zh/list_i18n_technologies/frameworks/react.md +1 -1
  109. package/blog/zh/list_i18n_technologies/frameworks/svelte.md +1 -1
  110. package/blog/zh/list_i18n_technologies/frameworks/vue.md +1 -1
  111. package/blog/zh/what_is_internationalization.md +2 -2
  112. package/dist/cjs/blog.cjs +2 -2
  113. package/dist/cjs/blog.cjs.map +1 -1
  114. package/dist/cjs/common.cjs +17 -6
  115. package/dist/cjs/common.cjs.map +1 -1
  116. package/dist/cjs/doc.cjs +2 -2
  117. package/dist/cjs/doc.cjs.map +1 -1
  118. package/dist/cjs/frequentQuestions.cjs +2 -2
  119. package/dist/cjs/frequentQuestions.cjs.map +1 -1
  120. package/dist/cjs/generated/blog.entry.cjs +1152 -252
  121. package/dist/cjs/generated/blog.entry.cjs.map +1 -1
  122. package/dist/cjs/generated/docs.entry.cjs +3778 -1124
  123. package/dist/cjs/generated/docs.entry.cjs.map +1 -1
  124. package/dist/cjs/generated/frequentQuestions.entry.cjs +794 -161
  125. package/dist/cjs/generated/frequentQuestions.entry.cjs.map +1 -1
  126. package/dist/cjs/generated/legal.entry.cjs +32 -31
  127. package/dist/cjs/generated/legal.entry.cjs.map +1 -1
  128. package/dist/cjs/legal.cjs +2 -2
  129. package/dist/cjs/legal.cjs.map +1 -1
  130. package/dist/esm/blog.mjs +2 -2
  131. package/dist/esm/blog.mjs.map +1 -1
  132. package/dist/esm/common.mjs +17 -6
  133. package/dist/esm/common.mjs.map +1 -1
  134. package/dist/esm/doc.mjs +2 -2
  135. package/dist/esm/doc.mjs.map +1 -1
  136. package/dist/esm/frequentQuestions.mjs +2 -2
  137. package/dist/esm/frequentQuestions.mjs.map +1 -1
  138. package/dist/esm/generated/blog.entry.mjs +1151 -252
  139. package/dist/esm/generated/blog.entry.mjs.map +1 -1
  140. package/dist/esm/generated/docs.entry.mjs +3777 -1124
  141. package/dist/esm/generated/docs.entry.mjs.map +1 -1
  142. package/dist/esm/generated/frequentQuestions.entry.mjs +793 -161
  143. package/dist/esm/generated/frequentQuestions.entry.mjs.map +1 -1
  144. package/dist/esm/generated/legal.entry.mjs +31 -31
  145. package/dist/esm/generated/legal.entry.mjs.map +1 -1
  146. package/dist/esm/legal.mjs +2 -2
  147. package/dist/esm/legal.mjs.map +1 -1
  148. package/dist/types/blog.d.ts +2 -2
  149. package/dist/types/blog.d.ts.map +1 -1
  150. package/dist/types/common.d.ts +3 -2
  151. package/dist/types/common.d.ts.map +1 -1
  152. package/dist/types/doc.d.ts +2 -2
  153. package/dist/types/doc.d.ts.map +1 -1
  154. package/dist/types/frequentQuestions.d.ts +2 -2
  155. package/dist/types/frequentQuestions.d.ts.map +1 -1
  156. package/dist/types/generated/blog.entry.d.ts.map +1 -1
  157. package/dist/types/generated/docs.entry.d.ts.map +1 -1
  158. package/dist/types/generated/frequentQuestions.entry.d.ts +1 -0
  159. package/dist/types/generated/frequentQuestions.entry.d.ts.map +1 -1
  160. package/dist/types/generated/legal.entry.d.ts.map +1 -1
  161. package/dist/types/legal.d.ts +2 -2
  162. package/dist/types/legal.d.ts.map +1 -1
  163. package/docs/ar/intlayer_with_vite+react.md +100 -108
  164. package/docs/de/intlayer_with_vite+react.md +121 -142
  165. package/docs/en/CI_CD.md +3 -1
  166. package/docs/en/autoFill.md +3 -1
  167. package/docs/en/configuration.md +4 -1
  168. package/docs/en/dictionary/condition.md +3 -1
  169. package/docs/en/dictionary/content_extention_customization.md +3 -1
  170. package/docs/en/dictionary/enumeration.md +3 -1
  171. package/docs/en/dictionary/file.md +3 -1
  172. package/docs/en/dictionary/function_fetching.md +3 -1
  173. package/docs/en/dictionary/get_started.md +3 -1
  174. package/docs/en/dictionary/insertion.md +3 -1
  175. package/docs/en/dictionary/markdown.md +3 -1
  176. package/docs/en/dictionary/nesting.md +3 -1
  177. package/docs/en/dictionary/translation.md +3 -1
  178. package/docs/en/how_works_intlayer.md +3 -1
  179. package/docs/en/index.md +3 -1
  180. package/docs/en/interest_of_intlayer.md +3 -1
  181. package/docs/en/intlayer_CMS.md +3 -1
  182. package/docs/en/intlayer_cli.md +3 -1
  183. package/docs/en/intlayer_visual_editor.md +3 -1
  184. package/docs/en/intlayer_with_angular.md +3 -1
  185. package/docs/en/intlayer_with_create_react_app.md +3 -1
  186. package/docs/en/intlayer_with_express.md +3 -1
  187. package/docs/en/intlayer_with_lynx+react.md +3 -1
  188. package/docs/en/intlayer_with_nextjs_14.md +6 -1
  189. package/docs/en/intlayer_with_nextjs_15.md +5 -1
  190. package/docs/en/intlayer_with_nextjs_page_router.md +5 -1
  191. package/docs/en/intlayer_with_nuxt.md +3 -1
  192. package/docs/en/intlayer_with_react_native+expo.md +3 -1
  193. package/docs/en/intlayer_with_vite+preact.md +3 -1
  194. package/docs/en/intlayer_with_vite+react.md +9 -7
  195. package/docs/en/intlayer_with_vite+solid.md +3 -1
  196. package/docs/en/intlayer_with_vite+svelte.md +3 -1
  197. package/docs/en/intlayer_with_vite+vue.md +3 -1
  198. package/docs/en/introduction.md +3 -1
  199. package/docs/en/mcp_server.md +42 -1
  200. package/docs/en/packages/@intlayer/api/index.md +3 -1
  201. package/docs/en/packages/@intlayer/chokidar/index.md +3 -1
  202. package/docs/en/packages/@intlayer/cli/index.md +3 -1
  203. package/docs/en/packages/@intlayer/config/index.md +3 -1
  204. package/docs/en/packages/@intlayer/core/index.md +3 -1
  205. package/docs/en/packages/@intlayer/design-system/index.md +3 -1
  206. package/docs/en/packages/@intlayer/dictionary-entry/index.md +3 -1
  207. package/docs/en/packages/@intlayer/editor/index.md +3 -1
  208. package/docs/en/packages/@intlayer/editor-react/index.md +3 -1
  209. package/docs/en/packages/@intlayer/webpack/index.md +3 -1
  210. package/docs/en/packages/angular-intlayer/index.md +3 -1
  211. package/docs/en/packages/express-intlayer/index.md +3 -1
  212. package/docs/en/packages/express-intlayer/t.md +3 -1
  213. package/docs/en/packages/intlayer/getConfiguration.md +3 -1
  214. package/docs/en/packages/intlayer/getEnumeration.md +3 -1
  215. package/docs/en/packages/intlayer/getHTMLTextDir.md +3 -1
  216. package/docs/en/packages/intlayer/getLocaleLang.md +3 -1
  217. package/docs/en/packages/intlayer/getLocaleName.md +3 -1
  218. package/docs/en/packages/intlayer/getLocalizedUrl.md +3 -1
  219. package/docs/en/packages/intlayer/getMultilingualUrls.md +3 -1
  220. package/docs/en/packages/intlayer/getPathWithoutLocale.md +3 -1
  221. package/docs/en/packages/intlayer/getTranslation.md +3 -1
  222. package/docs/en/packages/intlayer/getTranslationContent.md +3 -1
  223. package/docs/en/packages/intlayer/index.md +3 -1
  224. package/docs/en/packages/intlayer-cli/index.md +3 -1
  225. package/docs/en/packages/intlayer-editor/index.md +3 -1
  226. package/docs/en/packages/lynx-intlayer/index.md +3 -1
  227. package/docs/en/packages/next-intlayer/index.md +3 -1
  228. package/docs/en/packages/next-intlayer/t.md +3 -1
  229. package/docs/en/packages/next-intlayer/useDictionary.md +3 -1
  230. package/docs/en/packages/next-intlayer/useIntlayer.md +3 -1
  231. package/docs/en/packages/next-intlayer/useIntlayerAsync.md +3 -1
  232. package/docs/en/packages/next-intlayer/useLocale.md +3 -1
  233. package/docs/en/packages/nuxt-intlayer/index.md +3 -1
  234. package/docs/en/packages/preact-intlayer/index.md +3 -1
  235. package/docs/en/packages/react-intlayer/index.md +3 -1
  236. package/docs/en/packages/react-intlayer/t.md +3 -1
  237. package/docs/en/packages/react-intlayer/useDictionary.md +3 -1
  238. package/docs/en/packages/react-intlayer/useIntlayer.md +3 -1
  239. package/docs/en/packages/react-intlayer/useIntlayerAsync.md +3 -1
  240. package/docs/en/packages/react-intlayer/useLocale.md +3 -1
  241. package/docs/en/packages/react-native-intlayer/index.md +3 -1
  242. package/docs/en/packages/react-scripts-intlayer/index.md +3 -1
  243. package/docs/en/packages/solid-intlayer/index.md +3 -1
  244. package/docs/en/packages/svelte-intlayer/index.md +3 -1
  245. package/docs/en/packages/vite-intlayer/index.md +3 -1
  246. package/docs/en/packages/vue-intlayer/index.md +3 -1
  247. package/docs/en/per_locale_file.md +3 -1
  248. package/docs/en/roadmap.md +5 -2
  249. package/docs/en/vs_code_extension.md +3 -1
  250. package/docs/en-GB/intlayer_with_vite+react.md +64 -83
  251. package/docs/es/intlayer_with_vite+react.md +91 -94
  252. package/docs/fr/intlayer_with_vite+react.md +73 -65
  253. package/docs/hi/intlayer_with_vite+react.md +107 -107
  254. package/docs/it/intlayer_with_vite+react.md +156 -112
  255. package/docs/ja/intlayer_with_vite+react.md +153 -218
  256. package/docs/ko/intlayer_with_vite+react.md +116 -148
  257. package/docs/ko/packages/intlayer/getLocalizedUrl.md +1 -23
  258. package/docs/pt/intlayer_with_vite+react.md +110 -132
  259. package/docs/ru/intlayer_with_vite+react.md +98 -83
  260. package/docs/zh/intlayer_with_vite+react.md +147 -184
  261. package/docs/zh/packages/intlayer/getLocalizedUrl.md +1 -23
  262. package/frequent_questions/ar/build_error_CI_CD.md +75 -0
  263. package/frequent_questions/de/build_error_CI_CD.md +75 -0
  264. package/frequent_questions/en/build_error_CI_CD.md +75 -0
  265. package/frequent_questions/en-GB/build_error_CI_CD.md +75 -0
  266. package/frequent_questions/es/build_error_CI_CD.md +75 -0
  267. package/frequent_questions/fr/build_error_CI_CD.md +75 -0
  268. package/frequent_questions/hi/build_error_CI_CD.md +75 -0
  269. package/frequent_questions/it/build_error_CI_CD.md +75 -0
  270. package/frequent_questions/ja/build_error_CI_CD.md +75 -0
  271. package/frequent_questions/ja/intlayer_command_undefined.md +3 -3
  272. package/frequent_questions/ko/build_error_CI_CD.md +75 -0
  273. package/frequent_questions/ko/intlayer_command_undefined.md +3 -3
  274. package/frequent_questions/pt/build_error_CI_CD.md +75 -0
  275. package/frequent_questions/ru/build_error_CI_CD.md +75 -0
  276. package/frequent_questions/zh/build_error_CI_CD.md +75 -0
  277. package/frequent_questions/zh/intlayer_command_undefined.md +3 -3
  278. package/legal/ar/privacy_notice.md +83 -0
  279. package/legal/ar/terms_of_service.md +55 -0
  280. package/legal/de/privacy_notice.md +83 -0
  281. package/legal/de/terms_of_service.md +55 -0
  282. package/legal/en/privacy_notice.md +83 -0
  283. package/legal/en/terms_of_service.md +55 -0
  284. package/legal/en-GB/privacy_notice.md +83 -0
  285. package/legal/en-GB/terms_of_service.md +55 -0
  286. package/legal/es/privacy_notice.md +83 -0
  287. package/legal/es/terms_of_service.md +55 -0
  288. package/legal/fr/privacy_notice.md +83 -0
  289. package/legal/fr/terms_of_service.md +55 -0
  290. package/legal/hi/privacy_notice.md +83 -0
  291. package/legal/hi/terms_of_service.md +55 -0
  292. package/legal/it/privacy_notice.md +83 -0
  293. package/legal/it/terms_of_service.md +55 -0
  294. package/legal/ja/privacy_notice.md +83 -0
  295. package/legal/ja/terms_of_service.md +55 -0
  296. package/legal/ko/privacy_notice.md +83 -0
  297. package/legal/ko/terms_of_service.md +55 -0
  298. package/legal/pt/privacy_notice.md +83 -0
  299. package/legal/pt/terms_of_service.md +55 -0
  300. package/legal/ru/privacy_notice.md +83 -0
  301. package/legal/ru/terms_of_service.md +55 -0
  302. package/legal/zh/privacy_notice.md +83 -0
  303. package/legal/zh/terms_of_service.md +55 -0
  304. package/package.json +7 -6
  305. package/src/blog.ts +6 -4
  306. package/src/common.ts +23 -7
  307. package/src/doc.ts +6 -4
  308. package/src/frequentQuestions.ts +6 -4
  309. package/src/generated/blog.entry.ts +1177 -280
  310. package/src/generated/docs.entry.ts +3868 -1217
  311. package/src/generated/frequentQuestions.entry.ts +808 -178
  312. package/src/generated/legal.entry.ts +34 -36
  313. package/src/legal.ts +6 -4
@@ -1,40 +1,40 @@
1
1
  ---
2
- createdAt: 2025-03-07
3
- updatedAt: 2025-06-29
4
- title: React Native 및 Expo λͺ¨λ°”일 μ•± λ²ˆμ—­ν•˜κΈ° (i18n)
5
- description: React Native 및 Expo λͺ¨λ°”일 앱을 λ‹€κ΅­μ–΄λ‘œ λ§Œλ“œλŠ” 방법을 μ•Œμ•„λ³΄μ„Έμš”. λ¬Έμ„œλ₯Ό 따라 κ΅­μ œν™”(i18n) 및 λ²ˆμ—­μ„ μ§„ν–‰ν•˜μ„Έμš”.
2
+ createdAt: 2024-03-07
3
+ updatedAt: 2024-03-07
4
+ title: Vite + Reactμ—μ„œ Intlayer μ‹œμž‘ν•˜κΈ°
5
+ description: Intlayerλ₯Ό μ‚¬μš©ν•˜μ—¬ Vite 및 React μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ— κ΅­μ œν™”(i18n)λ₯Ό μΆ”κ°€ν•˜λŠ” 방법을 λ°°μš°μ„Έμš”. 이 κ°€μ΄λ“œλ₯Ό 따라 앱을 λ‹€κ΅­μ–΄λ‘œ λ§Œλ“œμ„Έμš”.
6
6
  keywords:
7
7
  - κ΅­μ œν™”
8
8
  - λ¬Έμ„œ
9
9
  - Intlayer
10
10
  - Vite
11
11
  - React
12
- - React Native
13
- - JavaScript
12
+ - i18n
13
+ - μžλ°”μŠ€ν¬λ¦½νŠΈ
14
14
  slugs:
15
15
  - doc
16
16
  - environment
17
- - react-native-and-expo
17
+ - vite-and-react
18
18
  ---
19
19
 
20
- # Intlayer와 Vite, React둜 κ΅­μ œν™”(i18n) μ‹œμž‘ν•˜κΈ°
20
+ # Intlayer와 Vite 및 React둜 κ΅­μ œν™”(i18n) μ‹œμž‘ν•˜κΈ°
21
21
 
22
- GitHubμ—μ„œ [μ• ν”Œλ¦¬μΌ€μ΄μ…˜ ν…œν”Œλ¦Ώ](https://github.com/aymericzip/intlayer-vite-react-template)을 ν™•μΈν•˜μ„Έμš”.
22
+ GitHubμ—μ„œ [μ• ν”Œλ¦¬μΌ€μ΄μ…˜ ν…œν”Œλ¦Ώ](https://github.com/aymericzip/intlayer-vite-react-template)을 μ°Έμ‘°ν•˜μ„Έμš”.
23
23
 
24
- ## Intlayerλž€ λ¬΄μ—‡μΈκ°€μš”?
24
+ ## Intlayerλž€?
25
25
 
26
- **Intlayer**λŠ” ν˜„λŒ€ μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ λ‹€κ΅­μ–΄ 지원을 κ°„μ†Œν™”ν•˜κΈ° μœ„ν•΄ μ„€κ³„λœ ν˜μ‹ μ μΈ μ˜€ν”ˆ μ†ŒμŠ€ κ΅­μ œν™”(i18n) λΌμ΄λΈŒλŸ¬λ¦¬μž…λ‹ˆλ‹€.
26
+ **Intlayer**λŠ” μ΅œμ‹  μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ λ‹€κ΅­μ–΄ 지원을 κ°„μ†Œν™”ν•˜κΈ° μœ„ν•΄ μ„€κ³„λœ ν˜μ‹ μ μ΄κ³  μ˜€ν”ˆ μ†ŒμŠ€μΈ κ΅­μ œν™”(i18n) λΌμ΄λΈŒλŸ¬λ¦¬μž…λ‹ˆλ‹€.
27
27
 
28
28
  Intlayerλ₯Ό μ‚¬μš©ν•˜λ©΄ λ‹€μŒμ„ ν•  수 μžˆμŠ΅λ‹ˆλ‹€:
29
29
 
30
- - **μ»΄ν¬λ„ŒνŠΈ μˆ˜μ€€μ—μ„œ 선언적 사전을 μ‚¬μš©ν•˜μ—¬ λ²ˆμ—­μ„ μ‰½κ²Œ 관리**ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
30
+ - **μ»΄ν¬λ„ŒνŠΈ μˆ˜μ€€μ—μ„œ 선언적 사전을 μ‚¬μš©ν•˜μ—¬** λ²ˆμ—­μ„ μ‰½κ²Œ 관리할 수 μžˆμŠ΅λ‹ˆλ‹€.
31
31
  - **메타데이터, 라우트 및 μ½˜ν…μΈ λ₯Ό λ™μ μœΌλ‘œ ν˜„μ§€ν™”**ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
32
32
  - **μžλ™ μƒμ„±λœ νƒ€μž…μœΌλ‘œ TypeScript 지원을 보μž₯**ν•˜μ—¬ μžλ™ μ™„μ„± 및 였λ₯˜ 감지λ₯Ό ν–₯μƒμ‹œν‚΅λ‹ˆλ‹€.
33
33
  - **동적 λ‘œμΌ€μΌ 감지 및 μ „ν™˜κ³Ό 같은 κ³ κΈ‰ κΈ°λŠ₯**을 ν™œμš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
34
34
 
35
35
  ---
36
36
 
37
- ## Vite와 React μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ Intlayer μ„€μ • 단계별 κ°€μ΄λ“œ
37
+ ## Vite 및 React μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ Intlayer μ„€μ • 단계별 κ°€μ΄λ“œ
38
38
 
39
39
  ### 1단계: μ˜μ‘΄μ„± μ„€μΉ˜
40
40
 
@@ -60,14 +60,14 @@ yarn add --save-dev vite-intlayer
60
60
  ꡬ성 관리, λ²ˆμ—­, [μ½˜ν…μΈ  μ„ μ–Έ](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ko/dictionary/get_started.md), 트랜슀파일링 및 [CLI λͺ…λ Ήμ–΄](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ko/intlayer_cli.md)λ₯Ό μœ„ν•œ κ΅­μ œν™” 도ꡬλ₯Ό μ œκ³΅ν•˜λŠ” 핡심 νŒ¨ν‚€μ§€μž…λ‹ˆλ‹€.
61
61
 
62
62
  - **react-intlayer**
63
- Intlayerλ₯Ό React μ• ν”Œλ¦¬μΌ€μ΄μ…˜κ³Ό ν†΅ν•©ν•˜λŠ” νŒ¨ν‚€μ§€λ‘œ, React κ΅­μ œν™”λ₯Ό μœ„ν•œ μ»¨ν…μŠ€νŠΈ μ œκ³΅μžμ™€ 훅을 μ œκ³΅ν•©λ‹ˆλ‹€.
63
+ Intlayerλ₯Ό React μ• ν”Œλ¦¬μΌ€μ΄μ…˜κ³Ό ν†΅ν•©ν•˜λŠ” νŒ¨ν‚€μ§€λ‘œ, React κ΅­μ œν™”λ₯Ό μœ„ν•œ μ»¨ν…μŠ€νŠΈ ν”„λ‘œλ°”μ΄λ”μ™€ 훅을 μ œκ³΅ν•©λ‹ˆλ‹€.
64
64
 
65
65
  - **vite-intlayer**
66
- Vite λ²ˆλ“€λŸ¬([Vite bundler](https://vite.dev/guide/why.html#why-bundle-for-production))와 Intlayerλ₯Ό ν†΅ν•©ν•˜κΈ° μœ„ν•œ Vite ν”ŒλŸ¬κ·ΈμΈκ³Ό, μ‚¬μš©μžμ˜ μ„ ν˜Έ λ‘œμΌ€μΌ 감지, μΏ ν‚€ 관리, URL λ¦¬λ””λ ‰μ…˜ 처리λ₯Ό μœ„ν•œ 미듀웨어λ₯Ό ν¬ν•¨ν•©λ‹ˆλ‹€.
66
+ Intlayerλ₯Ό [Vite λ²ˆλ“€λŸ¬](https://vite.dev/guide/why.html#why-bundle-for-production)와 ν†΅ν•©ν•˜κΈ° μœ„ν•œ Vite ν”ŒλŸ¬κ·ΈμΈκ³Ό, μ‚¬μš©μžμ˜ μ„ ν˜Έ λ‘œμΌ€μΌ 감지, μΏ ν‚€ 관리, URL λ¦¬λ””λ ‰μ…˜ 처리λ₯Ό μœ„ν•œ 미듀웨어λ₯Ό ν¬ν•¨ν•©λ‹ˆλ‹€.
67
67
 
68
68
  ### 2단계: ν”„λ‘œμ νŠΈ ꡬ성
69
69
 
70
- μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μ–Έμ–΄λ₯Ό κ΅¬μ„±ν•˜κΈ° μœ„ν•œ μ„€μ • νŒŒμΌμ„ λ§Œλ“œμ„Έμš”:
70
+ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μ–Έμ–΄λ₯Ό κ΅¬μ„±ν•˜κΈ° μœ„ν•΄ μ„€μ • νŒŒμΌμ„ λ§Œλ“œμ„Έμš”:
71
71
 
72
72
  ```typescript fileName="intlayer.config.ts" codeFormat="typescript"
73
73
  import { Locales, type IntlayerConfig } from "intlayer";
@@ -164,7 +164,7 @@ module.exports = defineConfig({
164
164
  });
165
165
  ```
166
166
 
167
- > `intlayerPlugin()` Vite ν”ŒλŸ¬κ·ΈμΈμ€ Intlayerλ₯Ό Vite와 ν†΅ν•©ν•˜λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€. 이 ν”ŒλŸ¬κ·ΈμΈμ€ μ½˜ν…μΈ  μ„ μ–Έ 파일의 λΉŒλ“œλ₯Ό 보μž₯ν•˜κ³  개발 λͺ¨λ“œμ—μ„œ 이λ₯Ό λͺ¨λ‹ˆν„°λ§ν•©λ‹ˆλ‹€. λ˜ν•œ Vite μ• ν”Œλ¦¬μΌ€μ΄μ…˜ λ‚΄μ—μ„œ Intlayer ν™˜κ²½ λ³€μˆ˜λ₯Ό μ •μ˜ν•©λ‹ˆλ‹€. μΆ”κ°€λ‘œ, μ„±λŠ₯ μ΅œμ ν™”λ₯Ό μœ„ν•œ 별칭(alias)을 μ œκ³΅ν•©λ‹ˆλ‹€.
167
+ > `intlayerPlugin()` Vite ν”ŒλŸ¬κ·ΈμΈμ€ Intlayerλ₯Ό Vite와 ν†΅ν•©ν•˜λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€. 이 ν”ŒλŸ¬κ·ΈμΈμ€ μ½˜ν…μΈ  μ„ μ–Έ 파일의 λΉŒλ“œλ₯Ό 보μž₯ν•˜κ³  개발 λͺ¨λ“œμ—μ„œ 이λ₯Ό λͺ¨λ‹ˆν„°λ§ν•©λ‹ˆλ‹€. λ˜ν•œ Vite μ• ν”Œλ¦¬μΌ€μ΄μ…˜ λ‚΄μ—μ„œ Intlayer ν™˜κ²½ λ³€μˆ˜λ₯Ό μ •μ˜ν•©λ‹ˆλ‹€. μΆ”κ°€λ‘œ, μ„±λŠ₯ μ΅œμ ν™”λ₯Ό μœ„ν•œ 별칭(alias)도 μ œκ³΅ν•©λ‹ˆλ‹€.
168
168
 
169
169
  ### 4단계: μ½˜ν…μΈ  μ„ μ–Έν•˜κΈ°
170
170
 
@@ -204,12 +204,12 @@ const appContent = {
204
204
  ),
205
205
  fr: (
206
206
  <>
207
- <code>src/App.tsx</code>λ₯Ό νŽΈμ§‘ν•˜κ³  μ €μž₯ν•˜μ—¬ HMR을 ν…ŒμŠ€νŠΈν•˜μ„Έμš”
207
+ HMR을 ν…ŒμŠ€νŠΈν•˜λ €λ©΄ <code>src/App.tsx</code>λ₯Ό νŽΈμ§‘ν•˜κ³  μ €μž₯ν•˜μ„Έμš”
208
208
  </>
209
209
  ),
210
210
  es: (
211
211
  <>
212
- <code>src/App.tsx</code>λ₯Ό νŽΈμ§‘ν•˜κ³  μ €μž₯ν•˜μ—¬ HMR을 ν…ŒμŠ€νŠΈν•˜μ„Έμš”
212
+ HMR을 ν…ŒμŠ€νŠΈν•˜λ €λ©΄ <code>src/App.tsx</code>λ₯Ό νŽΈμ§‘ν•˜κ³  μ €μž₯ν•˜μ„Έμš”
213
213
  </>
214
214
  ),
215
215
  }),
@@ -235,13 +235,11 @@ const appContent = {
235
235
  viteLogo: t({
236
236
  en: "Vite logo",
237
237
  fr: "Logo Vite",
238
- ko: "Vite 둜고",
239
238
  es: "Logo Vite",
240
239
  }),
241
240
  reactLogo: t({
242
241
  en: "React logo",
243
242
  fr: "Logo React",
244
- ko: "React 둜고",
245
243
  es: "Logo React",
246
244
  }),
247
245
 
@@ -250,7 +248,6 @@ const appContent = {
250
248
  count: t({
251
249
  en: "count is ",
252
250
  fr: "le compte est ",
253
- ko: "μΉ΄μš΄νŠΈλŠ” ",
254
251
  es: "el recuento es ",
255
252
  }),
256
253
 
@@ -258,10 +255,11 @@ const appContent = {
258
255
  t <
259
256
  ReactNode >
260
257
  {
261
- // μ½˜ν…μΈ μ— React λ…Έλ“œλ₯Ό μ‚¬μš©ν•˜λŠ” 경우 Reactλ₯Ό λ°˜λ“œμ‹œ import ν•˜μ„Έμš”
258
+ // μ½˜ν…μΈ μ— React λ…Έλ“œλ₯Ό μ‚¬μš©ν•˜λŠ” 경우 Reactλ₯Ό λ°˜λ“œμ‹œ importν•˜μ„Έμš”
262
259
  en: (
263
260
  <>
264
- Edit <code>src/App.tsx</code> and save to test HMR
261
+ Edit <code>src/App.tsx</code> νŒŒμΌμ„ μˆ˜μ •ν•˜κ³  μ €μž₯ν•˜μ—¬ HMR을
262
+ ν…ŒμŠ€νŠΈν•˜μ„Έμš”
265
263
  </>
266
264
  ),
267
265
  fr: (
@@ -277,7 +275,6 @@ const appContent = {
277
275
  },
278
276
 
279
277
  readTheDocs: t({
280
- ko: "더 μ•Œμ•„λ³΄λ €λ©΄ Vite 및 React 둜고λ₯Ό ν΄λ¦­ν•˜μ„Έμš”",
281
278
  en: "Click on the Vite and React logos to learn more",
282
279
  fr: "Cliquez sur les logos Vite et React pour en savoir plus",
283
280
  es: "Haga clic en los logotipos de Vite y React para obtener mΓ‘s informaciΓ³n",
@@ -318,7 +315,7 @@ const appContent = {
318
315
  t <
319
316
  ReactNode >
320
317
  {
321
- // μ½˜ν…μΈ μ— React λ…Έλ“œλ₯Ό μ‚¬μš©ν•˜λŠ” 경우 Reactλ₯Ό λ°˜λ“œμ‹œ import ν•˜μ„Έμš”
318
+ // μ½˜ν…μΈ μ— React λ…Έλ“œλ₯Ό μ‚¬μš©ν•˜λŠ” 경우 Reactλ₯Ό μž„ν¬νŠΈν•˜λŠ” 것을 μžŠμ§€ λ§ˆμ„Έμš”
322
319
  en: (
323
320
  <>
324
321
  Edit <code>src/App.tsx</code> and save to test HMR
@@ -331,7 +328,7 @@ const appContent = {
331
328
  ),
332
329
  es: (
333
330
  <>
334
- Edita <code>src/App.tsx</code> 및 μ €μž₯ν•˜μ—¬ HMR을 ν…ŒμŠ€νŠΈν•˜μ„Έμš”
331
+ Edita <code>src/App.tsx</code> y guarda para probar HMR
335
332
  </>
336
333
  ),
337
334
  },
@@ -340,7 +337,7 @@ const appContent = {
340
337
  en: "Click on the Vite and React logos to learn more",
341
338
  fr: "Cliquez sur les logos Vite et React pour en savoir plus",
342
339
  es: "Haga clic en los logotipos de Vite y React para obtener mΓ‘s informaciΓ³n",
343
- ko: "더 μ•Œμ•„λ³΄λ €λ©΄ Vite 및 React 둜고λ₯Ό ν΄λ¦­ν•˜μ„Έμš”",
340
+ ko: "Vite 및 React 둜고λ₯Ό ν΄λ¦­ν•˜μ—¬ μžμ„Ένžˆ μ•Œμ•„λ³΄μ„Έμš”",
344
341
  }),
345
342
  },
346
343
  };
@@ -365,37 +362,37 @@ module.exports = appContent;
365
362
  "reactLogo": {
366
363
  "nodeType": "translation",
367
364
  "translation": {
368
- "ko": "React 둜고",
369
365
  "en": "React logo",
370
366
  "fr": "Logo React",
371
- "es": "Logo React"
367
+ "es": "Logo React",
368
+ "ko": "λ¦¬μ•‘νŠΈ 둜고"
372
369
  }
373
370
  },
374
371
  "title": {
375
372
  "nodeType": "translation",
376
373
  "translation": {
377
- "ko": "Vite + React",
378
374
  "en": "Vite + React",
379
375
  "fr": "Vite + React",
380
- "es": "Vite + React"
376
+ "es": "Vite + React",
377
+ "ko": "Vite + React"
381
378
  }
382
379
  },
383
380
  "count": {
384
381
  "nodeType": "translation",
385
382
  "translation": {
386
- "ko": "μΉ΄μš΄νŠΈλŠ” ",
387
383
  "en": "count is ",
388
384
  "fr": "le compte est ",
389
- "es": "el recuento es "
385
+ "es": "el recuento es ",
386
+ "ko": "μΉ΄μš΄νŠΈλŠ” "
390
387
  }
391
388
  },
392
389
  "edit": {
393
390
  "nodeType": "translation",
394
391
  "translation": {
395
- "ko": "src/App.tsxλ₯Ό νŽΈμ§‘ν•˜κ³  μ €μž₯ν•˜μ—¬ HMR을 ν…ŒμŠ€νŠΈν•˜μ„Έμš”",
396
392
  "en": "Edit src/App.tsx and save to test HMR",
397
393
  "fr": "Γ‰ditez src/App.tsx et enregistrez pour tester HMR",
398
- "es": "Edita src/App.tsx y guarda para probar HMR"
394
+ "es": "Edita src/App.tsx y guarda para probar HMR",
395
+ "ko": "src/App.tsxλ₯Ό νŽΈμ§‘ν•˜κ³  μ €μž₯ν•˜μ—¬ HMR을 ν…ŒμŠ€νŠΈν•˜μ„Έμš”"
399
396
  }
400
397
  },
401
398
  "readTheDocs": {
@@ -411,11 +408,11 @@ module.exports = appContent;
411
408
  }
412
409
  ```
413
410
 
414
- > μ• ν”Œλ¦¬μΌ€μ΄μ…˜ λ‚΄ μ–΄λ””μ„œλ“  `contentDir` 디렉토리(기본값은 `./src`)에 ν¬ν•¨λ˜λŠ” μ¦‰μ‹œ μ½˜ν…μΈ  선언을 μ •μ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 그리고 μ½˜ν…μΈ  μ„ μ–Έ 파일 ν™•μž₯자(기본값은 `.content.{json,ts,tsx,js,jsx,mjs,mjx,cjs,cjx}`)와 μΌμΉ˜ν•΄μ•Ό ν•©λ‹ˆλ‹€.
411
+ > μ• ν”Œλ¦¬μΌ€μ΄μ…˜ λ‚΄ μ–΄λ””μ—μ„œλ“  `contentDir` 디렉토리(κΈ°λ³Έκ°’: `./src`)에 ν¬ν•¨λ˜λ©΄ μ½˜ν…μΈ  선언을 μ •μ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 그리고 μ½˜ν…μΈ  μ„ μ–Έ 파일 ν™•μž₯자(κΈ°λ³Έκ°’: `.content.{json,ts,tsx,js,jsx,mjs,mjx,cjs,cjx}`)와 μΌμΉ˜ν•΄μ•Ό ν•©λ‹ˆλ‹€.
415
412
 
416
413
  > μžμ„Έν•œ λ‚΄μš©μ€ [μ½˜ν…μΈ  μ„ μ–Έ λ¬Έμ„œ](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ko/dictionary/get_started.md)λ₯Ό μ°Έμ‘°ν•˜μ„Έμš”.
417
414
 
418
- > μ½˜ν…μΈ  νŒŒμΌμ— TSX μ½”λ“œκ°€ ν¬ν•¨λœ 경우, μ½˜ν…μΈ  νŒŒμΌμ—μ„œ `import React from "react";`λ₯Ό μž„ν¬νŠΈν•˜λŠ” 것을 κ³ λ €ν•΄μ•Ό ν•©λ‹ˆλ‹€.
415
+ > μ½˜ν…μΈ  νŒŒμΌμ— TSX μ½”λ“œκ°€ ν¬ν•¨λœ 경우, μ½˜ν…μΈ  νŒŒμΌμ— `import React from "react";`λ₯Ό κ°€μ Έμ˜€λŠ” 것을 κ³ λ €ν•΄μ•Ό ν•©λ‹ˆλ‹€.
419
416
 
420
417
  ### 5단계: μ½”λ“œμ—μ„œ Intlayer μ‚¬μš©ν•˜κΈ°
421
418
 
@@ -568,7 +565,7 @@ module.exports = App;
568
565
  > <img src={content.image.src.value} alt={content.image.value} />
569
566
  > ```
570
567
 
571
- > `useIntlayer` 훅에 λŒ€ν•΄ 더 μ•Œκ³  μ‹Άλ‹€λ©΄, [λ¬Έμ„œ](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ko/packages/react-intlayer/useIntlayer.md)λ₯Ό μ°Έκ³ ν•˜μ„Έμš”.
568
+ > `useIntlayer` 훅에 λŒ€ν•΄ 더 μ•Œμ•„λ³΄λ €λ©΄ [λ¬Έμ„œ](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ko/packages/react-intlayer/useIntlayer.md)λ₯Ό μ°Έμ‘°ν•˜μ„Έμš”.
572
569
 
573
570
  ### (선택 사항) 6단계: μ½˜ν…μΈ μ˜ μ–Έμ–΄ λ³€κ²½ν•˜κΈ°
574
571
 
@@ -627,14 +624,14 @@ const LocaleSwitcher = () => {
627
624
  - https://example.com/fr/about
628
625
  ```
629
626
 
630
- > 기본적으둜 κΈ°λ³Έ λ‘œμΌ€μΌμ— λŒ€ν•΄μ„œλŠ” κ²½λ‘œμ— 접두사가 λΆ™μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. κΈ°λ³Έ λ‘œμΌ€μΌμ— 접두사λ₯Ό 뢙이고 μ‹Άλ‹€λ©΄, ꡬ성 νŒŒμΌμ—μ„œ `middleware.prefixDefault` μ˜΅μ…˜μ„ `true`둜 μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μžμ„Έν•œ λ‚΄μš©μ€ [ꡬ성 λ¬Έμ„œ](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ko/configuration.md)λ₯Ό μ°Έμ‘°ν•˜μ„Έμš”.
627
+ > 기본적으둜, κΈ°λ³Έ λ‘œμΌ€μΌμ— λŒ€ν•΄μ„œλŠ” κ²½λ‘œμ— 접두사가 λΆ™μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. κΈ°λ³Έ λ‘œμΌ€μΌμ— 접두사λ₯Ό 뢙이고 μ‹Άλ‹€λ©΄, ꡬ성 μ„€μ •μ—μ„œ `middleware.prefixDefault` μ˜΅μ…˜μ„ `true`둜 μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μžμ„Έν•œ λ‚΄μš©μ€ [ꡬ성 λ¬Έμ„œ](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ko/configuration.md)λ₯Ό μ°Έμ‘°ν•˜μ„Έμš”.
631
628
 
632
629
  μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ— μ§€μ—­ν™”λœ λΌμš°νŒ…μ„ μΆ”κ°€ν•˜λ €λ©΄, μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 라우트λ₯Ό 감싸고 λ‘œμΌ€μΌ 기반 λΌμš°νŒ…μ„ μ²˜λ¦¬ν•˜λŠ” `LocaleRouter` μ»΄ν¬λ„ŒνŠΈλ₯Ό 생성할 수 μžˆμŠ΅λ‹ˆλ‹€. λ‹€μŒμ€ [React Router](https://reactrouter.com/home)λ₯Ό μ‚¬μš©ν•œ μ˜ˆμ œμž…λ‹ˆλ‹€:
633
630
 
634
631
  ```tsx fileName="src/components/LocaleRouter.tsx" codeFormat="typescript"
635
632
  // ν•„μš”ν•œ μ˜μ‘΄μ„±κ³Ό ν•¨μˆ˜λ“€μ„ μž„ν¬νŠΈν•©λ‹ˆλ‹€
636
- import { type Locales, configuration, getPathWithoutLocale } from "intlayer"; // 'intlayer'μ—μ„œ μ œκ³΅ν•˜λŠ” μœ ν‹Έλ¦¬ν‹° ν•¨μˆ˜μ™€ νƒ€μž…
637
- import type { FC, PropsWithChildren } from "react"; // ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈμ™€ props νƒ€μž…μ„ μœ„ν•œ React νƒ€μž…
633
+ import { type Locales, configuration, getPathWithoutLocale } from "intlayer"; // 'intlayer'μ—μ„œ μ œκ³΅ν•˜λŠ” μœ ν‹Έλ¦¬ν‹° ν•¨μˆ˜ 및 νƒ€μž…
634
+ import type { FC, PropsWithChildren } from "react"; // ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈ 및 props νƒ€μž…
638
635
  import { IntlayerProvider } from "react-intlayer"; // κ΅­μ œν™” μ»¨ν…μŠ€νŠΈλ₯Ό μœ„ν•œ ν”„λ‘œλ°”μ΄λ”
639
636
  import {
640
637
  BrowserRouter,
@@ -644,7 +641,7 @@ import {
644
641
  useLocation,
645
642
  } from "react-router-dom"; // λ„€λΉ„κ²Œμ΄μ…˜ 관리λ₯Ό μœ„ν•œ λΌμš°ν„° μ»΄ν¬λ„ŒνŠΈ
646
643
 
647
- // Intlayerμ—μ„œ μ„€μ • ꡬ쑰 λΆ„ν•΄ ν• λ‹Ή
644
+ // Intlayerμ—μ„œ μ„€μ •κ°’ ꡬ쑰 λΆ„ν•΄ ν• λ‹Ή
648
645
  const { internationalization, middleware } = configuration;
649
646
  const { locales, defaultLocale } = internationalization;
650
647
 
@@ -667,7 +664,7 @@ const AppLocalized: FC<PropsWithChildren<{ locale: Locales }>> = ({
667
664
  );
668
665
 
669
666
  /**
670
- * middleware.prefixDefaultκ°€ true인 경우, κΈ°λ³Έ λ‘œμΌ€μΌμ€ 항상 접두사가 λΆ™μ–΄μ•Ό ν•©λ‹ˆλ‹€.
667
+ * middleware.prefixDefaultκ°€ true인 경우, κΈ°λ³Έ λ‘œμΌ€μΌμ€ 항상 μ ‘λ‘μ‚¬λ‘œ λΆ™μ–΄μ•Ό ν•©λ‹ˆλ‹€.
671
668
  */
672
669
  if (middleware.prefixDefault) {
673
670
  // λ‘œμΌ€μΌ μœ νš¨μ„± 검사
@@ -676,19 +673,19 @@ const AppLocalized: FC<PropsWithChildren<{ locale: Locales }>> = ({
676
673
  return (
677
674
  <Navigate
678
675
  to={`/${defaultLocale}/${pathWithoutLocale}${search}`}
679
- replace // ν˜„μž¬ 기둝 ν•­λͺ©μ„ μƒˆ ν•­λͺ©μœΌλ‘œ ꡐ체
676
+ replace // ν˜„μž¬ 기둝 ν•­λͺ©μ„ μƒˆ ν•­λͺ©μœΌλ‘œ κ΅μ²΄ν•©λ‹ˆλ‹€
680
677
  />
681
678
  );
682
679
  }
683
680
 
684
- // μžμ‹ μ»΄ν¬λ„ŒνŠΈλ₯Ό IntlayerProvider둜 감싸고 ν˜„μž¬ λ‘œμΌ€μΌμ„ μ„€μ •
681
+ // μžμ‹ μ»΄ν¬λ„ŒνŠΈλ₯Ό IntlayerProvider둜 감싸고 ν˜„μž¬ λ‘œμΌ€μΌμ„ μ„€μ •ν•©λ‹ˆλ‹€
685
682
  return (
686
683
  <IntlayerProvider locale={currentLocale}>{children}</IntlayerProvider>
687
684
  );
688
685
  } else {
689
686
  /**
690
687
  * middleware.prefixDefaultκ°€ false일 λ•Œ, κΈ°λ³Έ λ‘œμΌ€μΌμ€ 접두사가 λΆ™μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
691
- * ν˜„μž¬ λ‘œμΌ€μΌμ΄ μœ νš¨ν•˜κ³  κΈ°λ³Έ λ‘œμΌ€μΌμ΄ μ•„λ‹˜μ„ ν™•μΈν•©λ‹ˆλ‹€.
688
+ * ν˜„μž¬ λ‘œμΌ€μΌμ΄ μœ νš¨ν•˜λ©° κΈ°λ³Έ λ‘œμΌ€μΌμ΄ μ•„λ‹˜μ„ ν™•μΈν•©λ‹ˆλ‹€.
692
689
  */
693
690
  if (
694
691
  currentLocale.toString() !== defaultLocale.toString() &&
@@ -698,11 +695,11 @@ const AppLocalized: FC<PropsWithChildren<{ locale: Locales }>> = ({
698
695
  )
699
696
  .includes(currentLocale) // ν˜„μž¬ λ‘œμΌ€μΌμ΄ μœ νš¨ν•œ λ‘œμΌ€μΌ λͺ©λ‘μ— μžˆλŠ”μ§€ 확인
700
697
  ) {
701
- // λ‘œμΌ€μΌ 접두사가 μ—†λŠ” 경둜둜 λ¦¬λ””λ ‰μ…˜
698
+ // λ‘œμΌ€μΌ 접두어가 μ—†λŠ” 경둜둜 λ¦¬λ””λ ‰μ…˜
702
699
  return <Navigate to={`${pathWithoutLocale}${search}`} replace />;
703
700
  }
704
701
 
705
- // μžμ‹ μ»΄ν¬λ„ŒνŠΈλ₯Ό IntlayerProvider둜 감싸고 ν˜„μž¬ λ‘œμΌ€μΌ μ„€μ •
702
+ // IntlayerProvider둜 μžμ‹ μ»΄ν¬λ„ŒνŠΈλ₯Ό 감싸고 ν˜„μž¬ λ‘œμΌ€μΌ μ„€μ •
706
703
  return (
707
704
  <IntlayerProvider locale={currentLocale}>{children}</IntlayerProvider>
708
705
  );
@@ -722,10 +719,10 @@ export const LocaleRouter: FC<PropsWithChildren> = ({ children }) => (
722
719
  )
723
720
  .map((locale) => (
724
721
  <Route
725
- // λ‘œμΌ€μΌμ„ μΊ‘μ²˜ν•˜λŠ” 라우트 νŒ¨ν„΄ (예: /en/, /fr/) 및 이후 λͺ¨λ“  κ²½λ‘œμ™€ λ§€μΉ­
722
+ // λ‘œμΌ€μΌμ„ μΊ‘μ²˜ν•˜λŠ” 경둜 νŒ¨ν„΄ (예: /en/, /fr/) 및 이후 λͺ¨λ“  κ²½λ‘œμ™€ λ§€μΉ­
726
723
  path={`/${locale}/*`}
727
724
  key={locale}
728
- element={<AppLocalized locale={locale}>{children}</AppLocalized>} // λ‘œμΌ€μΌ 관리λ₯Ό μœ„ν•΄ children을 감쌈
725
+ element={<AppLocalized locale={locale}>{children}</AppLocalized>} // λ‘œμΌ€μΌ 관리λ₯Ό μœ„ν•΄ children을 λž˜ν•‘
729
726
  />
730
727
  ))}
731
728
 
@@ -736,7 +733,7 @@ export const LocaleRouter: FC<PropsWithChildren> = ({ children }) => (
736
733
  path="*"
737
734
  element={
738
735
  <AppLocalized locale={defaultLocale}>{children}</AppLocalized>
739
- } // λ‘œμΌ€μΌ 관리λ₯Ό μœ„ν•΄ children을 감쌈
736
+ } // λ‘œμΌ€μΌ 관리λ₯Ό μœ„ν•΄ children을 λž˜ν•‘
740
737
  />
741
738
  )
742
739
  }
@@ -746,9 +743,9 @@ export const LocaleRouter: FC<PropsWithChildren> = ({ children }) => (
746
743
  ```
747
744
 
748
745
  ```jsx fileName="src/components/LocaleRouter.mjx" codeFormat="esm"
749
- // ν•„μš”ν•œ 쒅속성과 ν•¨μˆ˜λ“€μ„ μž„ν¬νŠΈν•©λ‹ˆλ‹€.
750
- import { configuration, getPathWithoutLocale } from "intlayer"; // 'intlayer'μ—μ„œ μ œκ³΅ν•˜λŠ” μœ ν‹Έλ¦¬ν‹° ν•¨μˆ˜μ™€ νƒ€μž…λ“€
751
- // 'intlayer'μ—μ„œ μ œκ³΅ν•˜λŠ” μœ ν‹Έλ¦¬ν‹° ν•¨μˆ˜μ™€ νƒ€μž…λ“€
746
+ // ν•„μš”ν•œ μ˜μ‘΄μ„±κ³Ό ν•¨μˆ˜λ“€μ„ μž„ν¬νŠΈν•©λ‹ˆλ‹€.
747
+ import { configuration, getPathWithoutLocale } from "intlayer"; // 'intlayer'μ—μ„œ μ œκ³΅ν•˜λŠ” μœ ν‹Έλ¦¬ν‹° ν•¨μˆ˜μ™€ νƒ€μž…
748
+ // 'intlayer'μ—μ„œ μ œκ³΅ν•˜λŠ” μœ ν‹Έλ¦¬ν‹° ν•¨μˆ˜μ™€ νƒ€μž…
752
749
  import { IntlayerProvider } from "react-intlayer"; // κ΅­μ œν™” μ»¨ν…μŠ€νŠΈλ₯Ό μœ„ν•œ ν”„λ‘œλ°”μ΄λ”
753
750
  import {
754
751
  BrowserRouter,
@@ -763,9 +760,9 @@ const { internationalization, middleware } = configuration;
763
760
  const { locales, defaultLocale } = internationalization;
764
761
 
765
762
  /**
766
- * λ‘œμΌ€μΌ 처리λ₯Ό λ‹΄λ‹Ήν•˜λ©°, μžμ‹ μ»΄ν¬λ„ŒνŠΈλ₯Ό μ μ ˆν•œ λ‘œμΌ€μΌ μ»¨ν…μŠ€νŠΈλ‘œ κ°μ‹ΈλŠ” μ»΄ν¬λ„ŒνŠΈμž…λ‹ˆλ‹€.
763
+ * λ‘œμ»¬λΌμ΄μ œμ΄μ…˜μ„ μ²˜λ¦¬ν•˜κ³  μžμ‹ μ»΄ν¬λ„ŒνŠΈλ₯Ό μ μ ˆν•œ λ‘œμΌ€μΌ μ»¨ν…μŠ€νŠΈλ‘œ κ°μ‹ΈλŠ” μ»΄ν¬λ„ŒνŠΈμž…λ‹ˆλ‹€.
767
764
  /**
768
- * URL 기반 λ‘œμΌ€μΌ 감지 및 검증을 κ΄€λ¦¬ν•˜λŠ” μ»΄ν¬λ„ŒνŠΈμž…λ‹ˆλ‹€.
765
+ * URL 기반 λ‘œμΌ€μΌ 감지 및 검증을 κ΄€λ¦¬ν•©λ‹ˆλ‹€.
769
766
  */
770
767
  const AppLocalized = ({ children, locale }) => {
771
768
  const { pathname, search } = useLocation(); // ν˜„μž¬ URL 경둜λ₯Ό κ°€μ Έμ˜΅λ‹ˆλ‹€.
@@ -779,7 +776,7 @@ const AppLocalized = ({ children, locale }) => {
779
776
  );
780
777
 
781
778
  /**
782
- * middleware.prefixDefaultκ°€ true인 경우 κΈ°λ³Έ λ‘œμΌ€μΌμ€ 항상 μ ‘λ‘μ‚¬λ‘œ λΆ™μ–΄μ•Ό ν•©λ‹ˆλ‹€.
779
+ * middleware.prefixDefaultκ°€ true인 경우, κΈ°λ³Έ λ‘œμΌ€μΌμ€ 항상 μ ‘λ‘μ‚¬λ‘œ λΆ™μ–΄μ•Ό ν•©λ‹ˆλ‹€.
783
780
  */
784
781
  if (middleware.prefixDefault) {
785
782
  // λ‘œμΌ€μΌμ„ κ²€μ¦ν•©λ‹ˆλ‹€.
@@ -800,7 +797,7 @@ const AppLocalized = ({ children, locale }) => {
800
797
  } else {
801
798
  /**
802
799
  * middleware.prefixDefaultκ°€ false일 λ•Œ, κΈ°λ³Έ λ‘œμΌ€μΌμ€ 접두사가 λΆ™μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
803
- * ν˜„μž¬ λ‘œμΌ€μΌμ΄ μœ νš¨ν•˜κ³  κΈ°λ³Έ λ‘œμΌ€μΌμ΄ μ•„λ‹˜μ„ ν™•μΈν•©λ‹ˆλ‹€.
800
+ * ν˜„μž¬ λ‘œμΌ€μΌμ΄ μœ νš¨ν•˜λ©° κΈ°λ³Έ λ‘œμΌ€μΌμ΄ μ•„λ‹˜μ„ ν™•μΈν•©λ‹ˆλ‹€.
804
801
  */
805
802
  if (
806
803
  currentLocale.toString() !== defaultLocale.toString() &&
@@ -808,13 +805,13 @@ const AppLocalized = ({ children, locale }) => {
808
805
  .filter(
809
806
  (locale) => locale.toString() !== defaultLocale.toString() // κΈ°λ³Έ λ‘œμΌ€μΌ μ œμ™Έ
810
807
  )
811
- .includes(currentLocale) // ν˜„μž¬ λ‘œμΌ€μΌμ΄ μœ νš¨ν•œ λ‘œμΌ€μΌ λͺ©λ‘μ— ν¬ν•¨λ˜μ–΄ μžˆλŠ”μ§€ 확인
808
+ .includes(currentLocale) // ν˜„μž¬ λ‘œμΌ€μΌμ΄ μœ νš¨ν•œ λ‘œμΌ€μΌ λͺ©λ‘μ— μžˆλŠ”μ§€ 확인
812
809
  ) {
813
810
  // λ‘œμΌ€μΌ 접두사가 μ—†λŠ” 경둜둜 λ¦¬λ””λ ‰μ…˜
814
811
  return <Navigate to={`${pathWithoutLocale}${search}`} replace />;
815
812
  }
816
813
 
817
- // μžμ‹ μ»΄ν¬λ„ŒνŠΈλ₯Ό IntlayerProvider둜 감싸고 ν˜„μž¬ λ‘œμΌ€μΌ μ„€μ •
814
+ // IntlayerProvider둜 μžμ‹ μ»΄ν¬λ„ŒνŠΈλ₯Ό 감싸고 ν˜„μž¬ λ‘œμΌ€μΌ μ„€μ •
818
815
  return (
819
816
  <IntlayerProvider locale={currentLocale}>{children}</IntlayerProvider>
820
817
  );
@@ -842,7 +839,7 @@ export const LocaleRouter = ({ children }) => (
842
839
  ))}
843
840
 
844
841
  {
845
- // κΈ°λ³Έ λ‘œμΌ€μΌ 접두어 μ‚¬μš©μ΄ λΉ„ν™œμ„±ν™”λœ 경우, 루트 κ²½λ‘œμ—μ„œ 직접 μžμ‹ μ»΄ν¬λ„ŒνŠΈλ₯Ό λ Œλ”λ§
842
+ // κΈ°λ³Έ λ‘œμΌ€μΌ 접두어 μ‚¬μš©μ΄ λΉ„ν™œμ„±ν™”λœ 경우, 루트 κ²½λ‘œμ—μ„œ μžμ‹ μ»΄ν¬λ„ŒνŠΈλ₯Ό 직접 λ Œλ”λ§
846
843
  !middleware.prefixDefault && (
847
844
  <Route
848
845
  path="*"
@@ -858,8 +855,8 @@ export const LocaleRouter = ({ children }) => (
858
855
  ```
859
856
 
860
857
  ```jsx fileName="src/components/LocaleRouter.cjx" codeFormat="commonjs"
861
- // ν•„μš”ν•œ μ˜μ‘΄μ„±κ³Ό ν•¨μˆ˜λ“€μ„ μž„ν¬νŠΈν•©λ‹ˆλ‹€.
862
- const { configuration, getPathWithoutLocale } = require("intlayer"); // 'intlayer'μ—μ„œ μ œκ³΅ν•˜λŠ” μœ ν‹Έλ¦¬ν‹° ν•¨μˆ˜μ™€ νƒ€μž…
858
+ // ν•„μš”ν•œ 쒅속성과 ν•¨μˆ˜λ“€μ„ κ°€μ Έμ˜΅λ‹ˆλ‹€.
859
+ const { configuration, getPathWithoutLocale } = require("intlayer"); // 'intlayer'μ—μ„œ μ œκ³΅ν•˜λŠ” μœ ν‹Έλ¦¬ν‹° ν•¨μˆ˜ 및 νƒ€μž…
863
860
  const { IntlayerProvider, useLocale } = require("react-intlayer"); // κ΅­μ œν™” μ»¨ν…μŠ€νŠΈλ₯Ό μœ„ν•œ ν”„λ‘œλ°”μ΄λ”
864
861
  const {
865
862
  BrowserRouter,
@@ -867,7 +864,7 @@ const {
867
864
  Route,
868
865
  Navigate,
869
866
  useLocation,
870
- } = require("react-router-dom"); // λ„€λΉ„κ²Œμ΄μ…˜ 관리λ₯Ό μœ„ν•œ λΌμš°ν„° μ»΄ν¬λ„ŒνŠΈλ“€
867
+ } = require("react-router-dom"); // λ‚΄λΉ„κ²Œμ΄μ…˜ 관리λ₯Ό μœ„ν•œ λΌμš°ν„° μ»΄ν¬λ„ŒνŠΈ
871
868
 
872
869
  // Intlayerμ—μ„œ 섀정을 ꡬ쑰 λΆ„ν•΄ ν• λ‹Ήν•©λ‹ˆλ‹€.
873
870
  const { internationalization, middleware } = configuration;
@@ -883,33 +880,33 @@ const AppLocalized = ({ children, locale }) => {
883
880
  // ν˜„μž¬ λ‘œμΌ€μΌμ„ κ²°μ •ν•˜λ©°, μ œκ³΅λ˜μ§€ μ•Šμ€ 경우 κΈ°λ³Έ λ‘œμΌ€μΌλ‘œ λŒ€μ²΄ν•©λ‹ˆλ‹€.
884
881
  const currentLocale = locale ?? defaultLocale;
885
882
 
886
- // κ²½λ‘œμ—μ„œ λ‘œμΌ€μΌ 접두어λ₯Ό μ œκ±°ν•˜μ—¬ κΈ°λ³Έ 경둜λ₯Ό λ§Œλ“­λ‹ˆλ‹€.
883
+ // κ²½λ‘œμ—μ„œ λ‘œμΌ€μΌ 접두사λ₯Ό μ œκ±°ν•˜μ—¬ κΈ°λ³Έ 경둜λ₯Ό λ§Œλ“­λ‹ˆλ‹€.
887
884
  const pathWithoutLocale = getPathWithoutLocale(
888
885
  pathname // ν˜„μž¬ URL 경둜
889
886
  );
890
887
 
891
888
  /**
892
- * middleware.prefixDefaultκ°€ true인 경우, κΈ°λ³Έ λ‘œμΌ€μΌμ€ 항상 μ ‘λ‘μ–΄λ‘œ λΆ™μ–΄μ•Ό ν•©λ‹ˆλ‹€.
889
+ * middleware.prefixDefaultκ°€ true인 경우, κΈ°λ³Έ λ‘œμΌ€μΌμ€ 항상 μ ‘λ‘μ‚¬λ‘œ λΆ™μ–΄μ•Ό ν•©λ‹ˆλ‹€.
893
890
  */
894
891
  if (middleware.prefixDefault) {
895
- // λ‘œμΌ€μΌ μœ νš¨μ„± 검사
892
+ // λ‘œμΌ€μΌμ„ κ²€μ¦ν•©λ‹ˆλ‹€.
896
893
  if (!locale || !locales.includes(locale)) {
897
- // κΈ°λ³Έ λ‘œμΌ€μΌκ³Ό μ—…λ°μ΄νŠΈλœ 경둜둜 λ¦¬λ‹€μ΄λ ‰νŠΈν•©λ‹ˆλ‹€.
894
+ // μ—…λ°μ΄νŠΈλœ κ²½λ‘œμ™€ ν•¨κ»˜ κΈ°λ³Έ λ‘œμΌ€μΌλ‘œ λ¦¬λ‹€μ΄λ ‰νŠΈν•©λ‹ˆλ‹€.
898
895
  return (
899
896
  <Navigate
900
897
  to={`/${defaultLocale}/${pathWithoutLocale}${search}`}
901
- replace // ν˜„μž¬ 기둝 ν•­λͺ©μ„ μƒˆ ν•­λͺ©μœΌλ‘œ κ΅μ²΄ν•©λ‹ˆλ‹€.
898
+ replace // ν˜„μž¬ 기둝 ν•­λͺ©μ„ μƒˆ ν•­λͺ©μœΌλ‘œ ꡐ체
902
899
  />
903
900
  );
904
901
  }
905
902
 
906
- // μžμ‹ μ»΄ν¬λ„ŒνŠΈλ₯Ό IntlayerProvider둜 감싸고 ν˜„μž¬ λ‘œμΌ€μΌμ„ μ„€μ •ν•©λ‹ˆλ‹€.
903
+ // μžμ‹ μ»΄ν¬λ„ŒνŠΈλ₯Ό IntlayerProvider둜 감싸고 ν˜„μž¬ λ‘œμΌ€μΌμ„ μ„€μ •
907
904
  return (
908
905
  <IntlayerProvider locale={currentLocale}>{children}</IntlayerProvider>
909
906
  );
910
907
  } else {
911
908
  /**
912
- * middleware.prefixDefaultκ°€ false일 λ•Œ, κΈ°λ³Έ λ‘œμΌ€μΌμ€ μ ‘λ‘μ‚¬λ‘œ λΆ™μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
909
+ * middleware.prefixDefaultκ°€ false일 λ•Œ, κΈ°λ³Έ λ‘œμΌ€μΌμ€ 접두사가 λΆ™μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
913
910
  * ν˜„μž¬ λ‘œμΌ€μΌμ΄ μœ νš¨ν•˜λ©° κΈ°λ³Έ λ‘œμΌ€μΌμ΄ μ•„λ‹˜μ„ ν™•μΈν•©λ‹ˆλ‹€.
914
911
  */
915
912
  if (
@@ -920,7 +917,7 @@ const AppLocalized = ({ children, locale }) => {
920
917
  )
921
918
  .includes(currentLocale) // ν˜„μž¬ λ‘œμΌ€μΌμ΄ μœ νš¨ν•œ λ‘œμΌ€μΌ λͺ©λ‘μ— ν¬ν•¨λ˜μ–΄ μžˆλŠ”μ§€ 확인
922
919
  ) {
923
- // λ‘œμΌ€μΌ 접두사 없이 경둜둜 λ¦¬λ””λ ‰μ…˜ν•©λ‹ˆλ‹€.
920
+ // λ‘œμΌ€μΌ 접두사가 μ—†λŠ” 경둜둜 λ¦¬λ””λ ‰μ…˜ν•©λ‹ˆλ‹€.
924
921
  return <Navigate to={`${pathWithoutLocale}${search}`} replace />;
925
922
  }
926
923
 
@@ -933,7 +930,7 @@ const AppLocalized = ({ children, locale }) => {
933
930
 
934
931
  /**
935
932
  * λ‘œμΌ€μΌλ³„ 경둜λ₯Ό μ„€μ •ν•˜λŠ” λΌμš°ν„° μ»΄ν¬λ„ŒνŠΈμž…λ‹ˆλ‹€.
936
- * React Routerλ₯Ό μ‚¬μš©ν•˜μ—¬ λ„€λΉ„κ²Œμ΄μ…˜μ„ κ΄€λ¦¬ν•˜κ³  둜컬라이즈된 μ»΄ν¬λ„ŒνŠΈλ₯Ό λ Œλ”λ§ν•©λ‹ˆλ‹€.
933
+ * React Routerλ₯Ό μ‚¬μš©ν•˜μ—¬ λ‚΄λΉ„κ²Œμ΄μ…˜μ„ κ΄€λ¦¬ν•˜κ³  둜컬라이즈된 μ»΄ν¬λ„ŒνŠΈλ₯Ό λ Œλ”λ§ν•©λ‹ˆλ‹€.
937
934
  */
938
935
  const LocaleRouter = ({ children }) => (
939
936
  <BrowserRouter>
@@ -944,21 +941,21 @@ const LocaleRouter = ({ children }) => (
944
941
  )
945
942
  .map((locale) => (
946
943
  <Route
947
- // λ‘œμΌ€μΌμ„ μΊ‘μ²˜ν•˜λŠ” 경둜 νŒ¨ν„΄ (예: /en/, /fr/) 및 이후 λͺ¨λ“  경둜λ₯Ό λ§€μΉ­ν•©λ‹ˆλ‹€.
944
+ // λ‘œμΌ€μΌμ„ μΊ‘μ²˜ν•˜λŠ” 경둜 νŒ¨ν„΄ (예: /en/, /fr/) 및 이후 λͺ¨λ“  κ²½λ‘œμ™€ λ§€μΉ­ν•©λ‹ˆλ‹€.
948
945
  path={`/${locale}/*`}
949
946
  key={locale}
950
- element={<AppLocalized locale={locale}>{children}</AppLocalized>} // μžμ‹ μ»΄ν¬λ„ŒνŠΈλ₯Ό λ‘œμΌ€μΌ κ΄€λ¦¬λ‘œ κ°μŒ‰λ‹ˆλ‹€
947
+ element={<AppLocalized locale={locale}>{children}</AppLocalized>} // μžμ‹ μ»΄ν¬λ„ŒνŠΈλ₯Ό λ‘œμΌ€μΌ κ΄€λ¦¬λ‘œ 감쌈
951
948
  />
952
949
  ))}
953
950
 
954
951
  {
955
- // κΈ°λ³Έ λ‘œμΌ€μΌ 접두어 μ‚¬μš©μ΄ λΉ„ν™œμ„±ν™”λœ 경우, 루트 κ²½λ‘œμ—μ„œ μžμ‹ μ»΄ν¬λ„ŒνŠΈλ₯Ό 직접 λ Œλ”λ§ν•©λ‹ˆλ‹€
952
+ // κΈ°λ³Έ λ‘œμΌ€μΌ 접두어 μ‚¬μš©μ΄ λΉ„ν™œμ„±ν™”λœ 경우, 루트 κ²½λ‘œμ—μ„œ μžμ‹ μ»΄ν¬λ„ŒνŠΈλ₯Ό 직접 λ Œλ”λ§
956
953
  !middleware.prefixDefault && (
957
954
  <Route
958
955
  path="*"
959
956
  element={
960
957
  <AppLocalized locale={defaultLocale}>{children}</AppLocalized>
961
- } // μžμ‹ μ»΄ν¬λ„ŒνŠΈλ₯Ό λ‘œμΌ€μΌ κ΄€λ¦¬λ‘œ κ°μŒ‰λ‹ˆλ‹€
958
+ } // μžμ‹ μ»΄ν¬λ„ŒνŠΈλ₯Ό λ‘œμΌ€μΌ κ΄€λ¦¬λ‘œ 감쌈
962
959
  />
963
960
  )
964
961
  }
@@ -973,7 +970,7 @@ const LocaleRouter = ({ children }) => (
973
970
  import { LocaleRouter } from "./components/LocaleRouter";
974
971
  import type { FC } from "react";
975
972
 
976
- // ... λ‹Ήμ‹ μ˜ AppContent μ»΄ν¬λ„ŒνŠΈ
973
+ // ... μ—¬λŸ¬λΆ„μ˜ AppContent μ»΄ν¬λ„ŒνŠΈ
977
974
 
978
975
  const App: FC = () => (
979
976
  <LocaleRouter>
@@ -985,7 +982,7 @@ const App: FC = () => (
985
982
  ```jsx fileName="src/App.mjx" codeFormat="esm"
986
983
  import { LocaleRouter } from "./components/LocaleRouter";
987
984
 
988
- // ... λ‹Ήμ‹ μ˜ AppContent μ»΄ν¬λ„ŒνŠΈ
985
+ // ... μ—¬λŸ¬λΆ„μ˜ AppContent μ»΄ν¬λ„ŒνŠΈ
989
986
 
990
987
  const App = () => (
991
988
  <LocaleRouter>
@@ -997,7 +994,7 @@ const App = () => (
997
994
  ```jsx fileName="src/App.cjx" codeFormat="commonjs"
998
995
  const { LocaleRouter } = require("./components/LocaleRouter");
999
996
 
1000
- // ... λ‹Ήμ‹ μ˜ AppContent μ»΄ν¬λ„ŒνŠΈ
997
+ // ... μ—¬λŸ¬λΆ„μ˜ AppContent μ»΄ν¬λ„ŒνŠΈ
1001
998
 
1002
999
  const App = () => (
1003
1000
  <LocaleRouter>
@@ -1043,7 +1040,7 @@ module.exports = defineConfig({
1043
1040
 
1044
1041
  ### (선택 사항) 8단계: λ‘œμΌ€μΌμ΄ 변경될 λ•Œ URL λ³€κ²½ν•˜κΈ°
1045
1042
 
1046
- λ‘œμΌ€μΌμ΄ 변경될 λ•Œ URL을 λ³€κ²½ν•˜λ €λ©΄, `useLocale` ν›…μ—μ„œ μ œκ³΅ν•˜λŠ” `onLocaleChange` prop을 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ™μ‹œμ—, `react-router-dom`의 `useLocation`κ³Ό `useNavigate` 훅을 μ‚¬μš©ν•˜μ—¬ URL 경둜λ₯Ό μ—…λ°μ΄νŠΈν•  수 μžˆμŠ΅λ‹ˆλ‹€.
1043
+ λ‘œμΌ€μΌμ΄ 변경될 λ•Œ URL을 λ³€κ²½ν•˜λ €λ©΄, `useLocale` ν›…μ—μ„œ μ œκ³΅ν•˜λŠ” `onLocaleChange` 속성을 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ™μ‹œμ—, `react-router-dom`의 `useLocation`κ³Ό `useNavigate` 훅을 μ‚¬μš©ν•˜μ—¬ URL 경둜λ₯Ό μ—…λ°μ΄νŠΈν•  수 μžˆμŠ΅λ‹ˆλ‹€.
1047
1044
 
1048
1045
  ```tsx fileName="src/components/LocaleSwitcher.tsx" codeFormat="typescript"
1049
1046
  import { useLocation, useNavigate } from "react-router-dom";
@@ -1063,7 +1060,7 @@ const LocaleSwitcher: FC = () => {
1063
1060
  const { locale, availableLocales, setLocale } = useLocale({
1064
1061
  onLocaleChange: (locale) => {
1065
1062
  // μ—…λ°μ΄νŠΈλœ λ‘œμΌ€μΌλ‘œ URL을 κ΅¬μ„±ν•©λ‹ˆλ‹€
1066
- // μ˜ˆμ‹œ: /es/about?foo=bar
1063
+ // 예: /es/about?foo=bar
1067
1064
  const pathWithLocale = getLocalizedUrl(`${pathname}${search}`, locale);
1068
1065
 
1069
1066
  // URL 경둜λ₯Ό μ—…λ°μ΄νŠΈν•©λ‹ˆλ‹€
@@ -1091,11 +1088,11 @@ const LocaleSwitcher: FC = () => {
1091
1088
  {localeItem}
1092
1089
  </span>
1093
1090
  <span>
1094
- {/* ν•΄λ‹Ή λ‘œμΌ€μΌμ˜ μ–Έμ–΄λͺ… - 예: FranΓ§ais */}
1091
+ {/* ν•΄λ‹Ή λ‘œμΌ€μΌμ—μ„œμ˜ μ–Έμ–΄λͺ… - 예: FranΓ§ais */}
1095
1092
  {getLocaleName(localeItem, locale)}
1096
1093
  </span>
1097
1094
  <span dir={getHTMLTextDir(localeItem)} lang={localeItem}>
1098
- {/* ν˜„μž¬ λ‘œμΌ€μΌμ—μ„œμ˜ μ–Έμ–΄λͺ… - 예: FrancΓ©s (ν˜„μž¬ λ‘œμΌ€μΌμ΄ Locales.SPANISH인 경우) */}
1095
+ {/* ν˜„μž¬ λ‘œμΌ€μΌμ—μ„œμ˜ μ–Έμ–΄λͺ… - 예: FrancΓ©s (ν˜„μž¬ λ‘œμΌ€μΌμ΄ Locales.SPANISH일 λ•Œ) */}
1099
1096
  {getLocaleName(localeItem)}
1100
1097
  </span>
1101
1098
  <span dir="ltr" lang={Locales.ENGLISH}>
@@ -1159,11 +1156,11 @@ const LocaleSwitcher = () => {
1159
1156
  {getLocaleName(localeItem, locale)}
1160
1157
  </span>
1161
1158
  <span dir={getHTMLTextDir(localeItem)} lang={localeItem}>
1162
- {/* ν˜„μž¬ λ‘œμΌ€μΌμ—μ„œμ˜ μ–Έμ–΄ - 예: ν˜„μž¬ λ‘œμΌ€μΌμ΄ Locales.SPANISH둜 μ„€μ •λœ 경우 FrancΓ©s */}
1159
+ {/* ν˜„μž¬ λ‘œμΌ€μΌμ—μ„œμ˜ μ–Έμ–΄ - 예: Locales.SPANISH둜 μ„€μ •λœ ν˜„μž¬ λ‘œμΌ€μΌμ—μ„œ FrancΓ©s */}
1163
1160
  {getLocaleName(localeItem)}
1164
1161
  </span>
1165
1162
  <span dir="ltr" lang={Locales.ENGLISH}>
1166
- {/* μ˜μ–΄λ‘œ 된 μ–Έμ–΄λͺ… - 예: French */}
1163
+ {/* μ˜μ–΄λ‘œ 된 μ–Έμ–΄ - 예: French */}
1167
1164
  {getLocaleName(localeItem, Locales.ENGLISH)}
1168
1165
  </span>
1169
1166
  </a>
@@ -1227,7 +1224,7 @@ const LocaleSwitcher = () => {
1227
1224
  {getLocaleName(localeItem)}
1228
1225
  </span>
1229
1226
  <span dir="ltr" lang={Locales.ENGLISH}>
1230
- {/* μ˜μ–΄λ‘œ 된 μ–Έμ–΄ 이름 - 예: French */}
1227
+ {/* μ˜μ–΄λ‘œ 된 μ–Έμ–΄λͺ… - 예: French */}
1231
1228
  {getLocaleName(localeItem, Locales.ENGLISH)}
1232
1229
  </span>
1233
1230
  </a>
@@ -1253,19 +1250,19 @@ const LocaleSwitcher = () => {
1253
1250
 
1254
1251
  ---
1255
1252
 
1256
- ### (선택 사항) 9단계: HTML의 μ–Έμ–΄ 및 λ°©ν–₯ 속성 λ³€κ²½ν•˜κΈ°
1253
+ ### (선택 사항) 9단계: HTML의 μ–Έμ–΄ 및 λ°©ν–₯ 속성 λ³€κ²½
1257
1254
 
1258
1255
  μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ λ‹€κ΅­μ–΄λ₯Ό 지원할 λ•Œ, ν˜„μž¬ λ‘œμΌ€μΌμ— 맞게 `<html>` νƒœκ·Έμ˜ `lang` 및 `dir` 속성을 μ—…λ°μ΄νŠΈν•˜λŠ” 것이 맀우 μ€‘μš”ν•©λ‹ˆλ‹€. μ΄λ ‡κ²Œ ν•˜λ©΄ λ‹€μŒμ„ 보μž₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€:
1259
1256
 
1260
1257
  - **μ ‘κ·Όμ„±**: ν™”λ©΄ 낭독기 및 보쑰 κΈ°μˆ μ€ μ˜¬λ°”λ₯Έ `lang` 속성에 μ˜μ‘΄ν•˜μ—¬ μ½˜ν…μΈ λ₯Ό μ •ν™•ν•˜κ²Œ λ°œμŒν•˜κ³  ν•΄μ„ν•©λ‹ˆλ‹€.
1261
- - **ν…μŠ€νŠΈ λ Œλ”λ§**: `dir`(λ°©ν–₯) 속성은 ν…μŠ€νŠΈκ°€ μ˜¬λ°”λ₯Έ μˆœμ„œλ‘œ λ Œλ”λ§λ˜λ„λ‘ 보μž₯ν•©λ‹ˆλ‹€(예: μ˜μ–΄λŠ” μ™Όμͺ½μ—μ„œ 였λ₯Έμͺ½, μ•„λžμ–΄λ‚˜ νžˆλΈŒλ¦¬μ–΄λŠ” 였λ₯Έμͺ½μ—μ„œ μ™Όμͺ½). μ΄λŠ” 가독성에 ν•„μˆ˜μ μž…λ‹ˆλ‹€.
1262
- - **SEO**: 검색 엔진은 `lang` 속성을 μ‚¬μš©ν•˜μ—¬ νŽ˜μ΄μ§€μ˜ μ–Έμ–΄λ₯Ό νŒλ‹¨ν•˜κ³ , μ˜¬λ°”λ₯Έ ν˜„μ§€ν™”λœ μ½˜ν…μΈ λ₯Ό 검색 결과에 μ œκ³΅ν•˜λŠ” 데 도움을 μ€λ‹ˆλ‹€.
1258
+ - **ν…μŠ€νŠΈ λ Œλ”λ§**: `dir`(λ°©ν–₯) 속성은 ν…μŠ€νŠΈκ°€ μ˜¬λ°”λ₯Έ μˆœμ„œλ‘œ λ Œλ”λ§λ˜λ„λ‘ 보μž₯ν•©λ‹ˆλ‹€(예: μ˜μ–΄λŠ” μ™Όμͺ½μ—μ„œ 였λ₯Έμͺ½μœΌλ‘œ, μ•„λžμ–΄λ‚˜ νžˆλΈŒλ¦¬μ–΄λŠ” 였λ₯Έμͺ½μ—μ„œ μ™Όμͺ½μœΌλ‘œ), μ΄λŠ” 가독성에 ν•„μˆ˜μ μž…λ‹ˆλ‹€.
1259
+ - **SEO**: 검색 엔진은 `lang` 속성을 μ‚¬μš©ν•˜μ—¬ νŽ˜μ΄μ§€μ˜ μ–Έμ–΄λ₯Ό νŒλ‹¨ν•˜κ³ , 검색 κ²°κ³Όμ—μ„œ μ μ ˆν•œ ν˜„μ§€ν™”λœ μ½˜ν…μΈ λ₯Ό μ œκ³΅ν•˜λŠ” 데 도움을 μ€λ‹ˆλ‹€.
1263
1260
 
1264
1261
  λ‘œμΌ€μΌμ΄ 변경될 λ•Œ μ΄λŸ¬ν•œ 속성을 λ™μ μœΌλ‘œ μ—…λ°μ΄νŠΈν•˜λ©΄, μ§€μ›λ˜λŠ” λͺ¨λ“  μ–Έμ–΄μ—μ„œ μ‚¬μš©μžμ—κ²Œ μΌκ΄€λ˜κ³  μ ‘κ·Ό κ°€λŠ₯ν•œ κ²½ν—˜μ„ 보μž₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
1265
1262
 
1266
1263
  #### ν›… κ΅¬ν˜„ν•˜κΈ°
1267
1264
 
1268
- HTML 속성을 κ΄€λ¦¬ν•˜λŠ” μ»€μŠ€ν…€ 훅을 λ§Œλ“œμ„Έμš”. 이 훅은 λ‘œμΌ€μΌ 변경을 κ°μ§€ν•˜κ³  그에 따라 속성을 μ—…λ°μ΄νŠΈν•©λ‹ˆλ‹€:
1265
+ HTML 속성을 κ΄€λ¦¬ν•˜λŠ” μ»€μŠ€ν…€ 훅을 λ§Œλ“­λ‹ˆλ‹€. 이 훅은 λ‘œμΌ€μΌ 변경을 κ°μ§€ν•˜μ—¬ 속성을 적절히 μ—…λ°μ΄νŠΈν•©λ‹ˆλ‹€:
1269
1266
 
1270
1267
  ```tsx fileName="src/hooks/useI18nHTMLAttributes.tsx" codeFormat="typescript"
1271
1268
  import { useEffect } from "react";
@@ -1283,7 +1280,7 @@ export const useI18nHTMLAttributes = () => {
1283
1280
  const { locale } = useLocale();
1284
1281
 
1285
1282
  useEffect(() => {
1286
- // ν˜„μž¬ λ‘œμΌ€μΌμ— 맞게 μ–Έμ–΄ 속성을 μ—…λ°μ΄νŠΈν•©λ‹ˆλ‹€.
1283
+ // ν˜„μž¬ λ‘œμΌ€μΌλ‘œ μ–Έμ–΄ 속성을 μ—…λ°μ΄νŠΈν•©λ‹ˆλ‹€.
1287
1284
  document.documentElement.lang = locale;
1288
1285
 
1289
1286
  // ν˜„μž¬ λ‘œμΌ€μΌμ— 따라 ν…μŠ€νŠΈ λ°©ν–₯을 μ„€μ •ν•©λ‹ˆλ‹€.
@@ -1323,7 +1320,7 @@ const { useLocale } = require("react-intlayer");
1323
1320
  const { getHTMLTextDir } = require("intlayer");
1324
1321
 
1325
1322
  /**
1326
- * ν˜„μž¬ λ‘œμΌ€μΌμ„ 기반으둜 HTML <html> μš”μ†Œμ˜ `lang` 및 `dir` 속성을 μ—…λ°μ΄νŠΈν•©λ‹ˆλ‹€.
1323
+ * ν˜„μž¬ λ‘œμΌ€μΌμ— 따라 HTML <html> μš”μ†Œμ˜ `lang` 및 `dir` 속성을 μ—…λ°μ΄νŠΈν•©λ‹ˆλ‹€.
1327
1324
  * - `lang`: λΈŒλΌμš°μ €μ™€ 검색 엔진에 νŽ˜μ΄μ§€μ˜ μ–Έμ–΄λ₯Ό μ•Œλ¦½λ‹ˆλ‹€.
1328
1325
  * - `dir`: μ˜¬λ°”λ₯Έ 읽기 μˆœμ„œ 보μž₯을 μœ„ν•΄ μ„€μ •ν•©λ‹ˆλ‹€ (예: μ˜μ–΄λŠ” 'ltr', μ•„λžμ–΄λŠ” 'rtl').
1329
1326
  *
@@ -1355,7 +1352,7 @@ import { useI18nHTMLAttributes } from "./hooks/useI18nHTMLAttributes";
1355
1352
  import "./App.css";
1356
1353
 
1357
1354
  const AppContent: FC = () => {
1358
- // λ‘œμΌ€μΌμ— 따라 <html> νƒœκ·Έμ˜ lang 및 dir 속성을 μ—…λ°μ΄νŠΈν•˜κΈ° μœ„ν•΄ 훅을 μ μš©ν•©λ‹ˆλ‹€.
1355
+ // λ‘œμΌ€μΌμ— 따라 <html> νƒœκ·Έμ˜ langκ³Ό dir 속성을 μ—…λ°μ΄νŠΈν•˜κΈ° μœ„ν•΄ 훅을 μ μš©ν•©λ‹ˆλ‹€.
1359
1356
  useI18nHTMLAttributes();
1360
1357
 
1361
1358
  // ... μ»΄ν¬λ„ŒνŠΈμ˜ λ‚˜λ¨Έμ§€ λΆ€λΆ„
@@ -1379,7 +1376,7 @@ const AppContent = () => {
1379
1376
  // λ‘œμΌ€μΌμ— 따라 <html> νƒœκ·Έμ˜ lang 및 dir 속성을 μ—…λ°μ΄νŠΈν•˜κΈ° μœ„ν•΄ 훅을 μ μš©ν•©λ‹ˆλ‹€.
1380
1377
  useI18nHTMLAttributes();
1381
1378
 
1382
- // ... μ»΄ν¬λ„ŒνŠΈμ˜ λ‚˜λ¨Έμ§€ λΆ€λΆ„
1379
+ // ... λ‚˜λ¨Έμ§€ μ»΄ν¬λ„ŒνŠΈ λ‚΄μš©
1383
1380
  };
1384
1381
 
1385
1382
  const App = () => (
@@ -1403,11 +1400,6 @@ const AppContent = () => {
1403
1400
 
1404
1401
  // ... μ»΄ν¬λ„ŒνŠΈμ˜ λ‚˜λ¨Έμ§€ λΆ€λΆ„
1405
1402
  };
1406
- // λ‘œμΌ€μΌμ— 따라 <html> νƒœκ·Έμ˜ lang 및 dir 속성을 μ—…λ°μ΄νŠΈν•˜κΈ° μœ„ν•΄ 훅을 μ μš©ν•©λ‹ˆλ‹€.
1407
- useI18nHTMLAttributes();
1408
-
1409
- // ... λ‚˜λ¨Έμ§€ μ»΄ν¬λ„ŒνŠΈ λ‚΄μš©
1410
- };
1411
1403
 
1412
1404
  const App = () => (
1413
1405
  <IntlayerProvider>
@@ -1418,11 +1410,11 @@ const App = () => (
1418
1410
  module.exports = App;
1419
1411
  ```
1420
1412
 
1421
- 이 λ³€κ²½ 사항을 μ μš©ν•˜λ©΄ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ€ λ‹€μŒμ„ μˆ˜ν–‰ν•©λ‹ˆλ‹€:
1413
+ 이 λ³€κ²½ 사항을 μ μš©ν•˜λ©΄ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ€ λ‹€μŒμ„ 보μž₯ν•©λ‹ˆλ‹€:
1422
1414
 
1423
- - ν˜„μž¬ λ‘œμΌ€μΌμ„ μ˜¬λ°”λ₯΄κ²Œ λ°˜μ˜ν•˜λŠ” **μ–Έμ–΄**(`lang`) 속성을 보μž₯ν•˜μ—¬ SEO 및 λΈŒλΌμš°μ € λ™μž‘μ— μ€‘μš”ν•©λ‹ˆλ‹€.
1415
+ - ν˜„μž¬ λ‘œμΌ€μΌμ„ μ˜¬λ°”λ₯΄κ²Œ λ°˜μ˜ν•˜λŠ” **μ–Έμ–΄**(`lang`) μ†μ„±μœΌλ‘œ SEO 및 λΈŒλΌμš°μ € λ™μž‘μ— μ€‘μš”ν•©λ‹ˆλ‹€.
1424
1416
  - λ‘œμΌ€μΌμ— 따라 **ν…μŠ€νŠΈ λ°©ν–₯**(`dir`)을 μ‘°μ •ν•˜μ—¬, μ„œλ‘œ λ‹€λ₯Έ 읽기 μˆœμ„œλ₯Ό κ°€μ§„ 언어에 λŒ€ν•΄ 가독성과 μ‚¬μš©μ„±μ„ ν–₯μƒμ‹œν‚΅λ‹ˆλ‹€.
1425
- - 보쑰 기술이 졜적의 κΈ°λŠ₯을 μˆ˜ν–‰ν•˜λŠ” 데 μ˜μ‘΄ν•˜λŠ” μ΄λŸ¬ν•œ 속성듀 덕뢄에 더 **μ ‘κ·Όμ„± 높은** κ²½ν—˜μ„ μ œκ³΅ν•©λ‹ˆλ‹€.
1417
+ - 보쑰 기술이 μ΄λŸ¬ν•œ 속성에 μ˜μ‘΄ν•˜λ―€λ‘œ 더 **μ ‘κ·Όμ„± 높은** κ²½ν—˜μ„ μ œκ³΅ν•©λ‹ˆλ‹€.
1426
1418
 
1427
1419
  ### (선택 사항) 10단계: μ§€μ—­ν™”λœ 링크 μ»΄ν¬λ„ŒνŠΈ λ§Œλ“€κΈ°
1428
1420
 
@@ -1430,9 +1422,9 @@ module.exports = App;
1430
1422
 
1431
1423
  이 λ™μž‘μ€ μ—¬λŸ¬ κ°€μ§€ 이유둜 μœ μš©ν•©λ‹ˆλ‹€:
1432
1424
 
1433
- - **SEO 및 μ‚¬μš©μž κ²½ν—˜**: μ§€μ—­ν™”λœ URL은 검색 엔진이 언어별 νŽ˜μ΄μ§€λ₯Ό μ˜¬λ°”λ₯΄κ²Œ μΈλ±μ‹±ν•˜λ„λ‘ 도와주며, μ‚¬μš©μžκ°€ μ„ ν˜Έν•˜λŠ” μ–Έμ–΄λ‘œ 된 μ½˜ν…μΈ λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.
1434
- - **일관성**: μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ „λ°˜μ— 걸쳐 μ§€μ—­ν™”λœ 링크λ₯Ό μ‚¬μš©ν•¨μœΌλ‘œμ¨ λ‚΄λΉ„κ²Œμ΄μ…˜μ΄ ν˜„μž¬ λ‘œμΌ€μΌ λ‚΄μ—μ„œ μœ μ§€λ˜μ–΄ μ˜ˆμƒμΉ˜ λͺ»ν•œ μ–Έμ–΄ μ „ν™˜μ„ λ°©μ§€ν•©λ‹ˆλ‹€.
1435
- /// **μœ μ§€λ³΄μˆ˜μ„±**: λ‘œμ»¬λΌμ΄μ œμ΄μ…˜ λ‘œμ§μ„ 단일 μ»΄ν¬λ„ŒνŠΈμ— 쀑앙 μ§‘μ€‘ν™”ν•˜λ©΄ URL 관리λ₯Ό λ‹¨μˆœν™”ν•˜μ—¬ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μ„±μž₯함에 따라 μ½”λ“œλ² μ΄μŠ€λ₯Ό 더 μ‰½κ²Œ μœ μ§€λ³΄μˆ˜ν•˜κ³  ν™•μž₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
1425
+ - **SEO 및 μ‚¬μš©μž κ²½ν—˜**: μ§€μ—­ν™”λœ URL은 검색 엔진이 언어별 νŽ˜μ΄μ§€λ₯Ό μ˜¬λ°”λ₯΄κ²Œ μƒ‰μΈν™”ν•˜λ„λ‘ 돕고, μ‚¬μš©μžκ°€ μ„ ν˜Έν•˜λŠ” μ–Έμ–΄λ‘œ 된 μ½˜ν…μΈ λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.
1426
+ - **일관성**: μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ „λ°˜μ— 걸쳐 μ§€μ—­ν™”λœ 링크λ₯Ό μ‚¬μš©ν•¨μœΌλ‘œμ¨ λ‚΄λΉ„κ²Œμ΄μ…˜μ΄ ν˜„μž¬ λ‘œμΌ€μΌ λ‚΄μ—μ„œ μœ μ§€λ˜μ–΄ 예기치 μ•Šμ€ μ–Έμ–΄ μ „ν™˜μ„ λ°©μ§€ν•©λ‹ˆλ‹€.
1427
+ - **μœ μ§€λ³΄μˆ˜μ„±**: λ‘œμ»¬λΌμ΄μ œμ΄μ…˜ λ‘œμ§μ„ 단일 μ»΄ν¬λ„ŒνŠΈμ— 쀑앙 μ§‘μ€‘ν™”ν•˜λ©΄ URL 관리λ₯Ό λ‹¨μˆœν™”ν•˜μ—¬ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μ„±μž₯함에 따라 μ½”λ“œλ² μ΄μŠ€λ₯Ό 더 μ‰½κ²Œ μœ μ§€λ³΄μˆ˜ν•˜κ³  ν™•μž₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
1436
1428
 
1437
1429
  μ•„λž˜λŠ” TypeScript둜 κ΅¬ν˜„ν•œ 둜컬라이즈된 `Link` μ»΄ν¬λ„ŒνŠΈμž…λ‹ˆλ‹€:
1438
1430
 
@@ -1461,7 +1453,7 @@ export const checkIsExternalLink = (href?: string): boolean =>
1461
1453
  /**
1462
1454
  * ν˜„μž¬ λ‘œμΌ€μΌμ— 따라 href 속성을 μ‘°μ •ν•˜λŠ” μ»€μŠ€ν…€ Link μ»΄ν¬λ„ŒνŠΈμž…λ‹ˆλ‹€.
1463
1455
  * λ‚΄λΆ€ 링크의 경우 `getLocalizedUrl`을 μ‚¬μš©ν•˜μ—¬ URL μ•žμ— λ‘œμΌ€μΌμ„ λΆ™μž…λ‹ˆλ‹€ (예: /fr/about).
1464
- * 이λ₯Ό 톡해 λ‚΄λΉ„κ²Œμ΄μ…˜μ΄ λ™μΌν•œ λ‘œμΌ€μΌ μ»¨ν…μŠ€νŠΈ λ‚΄μ—μ„œ μœ μ§€λ˜λ„λ‘ ν•©λ‹ˆλ‹€.
1456
+ * 이λ₯Ό 톡해 λ‚΄λΉ„κ²Œμ΄μ…˜μ΄ λ™μΌν•œ λ‘œμΌ€μΌ μ»¨ν…μŠ€νŠΈ λ‚΄μ—μ„œ 이루어지도둝 보μž₯ν•©λ‹ˆλ‹€.
1465
1457
  */
1466
1458
  export const Link = forwardRef<HTMLAnchorElement, LinkProps>(
1467
1459
  ({ href, children, ...props }, ref) => {
@@ -1497,8 +1489,8 @@ export const checkIsExternalLink = (href?: string): boolean =>
1497
1489
 
1498
1490
  /**
1499
1491
  * ν˜„μž¬ λ‘œμΌ€μΌμ— 따라 href 속성을 μ‘°μ •ν•˜λŠ” μ»€μŠ€ν…€ Link μ»΄ν¬λ„ŒνŠΈμž…λ‹ˆλ‹€.
1500
- * λ‚΄λΆ€ 링크의 경우 `getLocalizedUrl`을 μ‚¬μš©ν•˜μ—¬ URL μ•žμ— λ‘œμΌ€μΌμ„ λΆ™μž…λ‹ˆλ‹€ (예: /fr/about).
1501
- * 이λ₯Ό 톡해 λ‚΄λΉ„κ²Œμ΄μ…˜μ΄ λ™μΌν•œ λ‘œμΌ€μΌ μ»¨ν…μŠ€νŠΈ λ‚΄μ—μ„œ μœ μ§€λ˜λ„λ‘ ν•©λ‹ˆλ‹€.
1492
+ * λ‚΄λΆ€ 링크의 경우 `getLocalizedUrl`을 μ‚¬μš©ν•˜μ—¬ URL μ•žμ— λ‘œμΌ€μΌ 접두사λ₯Ό λΆ™μž…λ‹ˆλ‹€ (예: /fr/about).
1493
+ * 이λ₯Ό 톡해 λ‚΄λΉ„κ²Œμ΄μ…˜μ΄ λ™μΌν•œ λ‘œμΌ€μΌ μ»¨ν…μŠ€νŠΈ λ‚΄μ—μ„œ 이루어지도둝 보μž₯ν•©λ‹ˆλ‹€.
1502
1494
  */
1503
1495
  export const Link = forwardRef(({ href, children, ...props }, ref) => {
1504
1496
  const { locale } = useLocale();
@@ -1532,13 +1524,13 @@ const checkIsExternalLink = (href) => /^https?:\/\//.test(href ?? "");
1532
1524
  /**
1533
1525
  * ν˜„μž¬ λ‘œμΌ€μΌμ— 따라 href 속성을 μ‘°μ •ν•˜λŠ” μ»€μŠ€ν…€ Link μ»΄ν¬λ„ŒνŠΈμž…λ‹ˆλ‹€.
1534
1526
  * λ‚΄λΆ€ 링크의 경우 `getLocalizedUrl`을 μ‚¬μš©ν•˜μ—¬ URL μ•žμ— λ‘œμΌ€μΌμ„ λΆ™μž…λ‹ˆλ‹€ (예: /fr/about).
1535
- * 이λ₯Ό 톡해 λ‚΄λΉ„κ²Œμ΄μ…˜μ΄ λ™μΌν•œ λ‘œμΌ€μΌ μ»¨ν…μŠ€νŠΈ λ‚΄μ—μ„œ μœ μ§€λ˜λ„λ‘ ν•©λ‹ˆλ‹€.
1527
+ * 이λ₯Ό 톡해 λ‚΄λΉ„κ²Œμ΄μ…˜μ΄ λ™μΌν•œ λ‘œμΌ€μΌ μ»¨ν…μŠ€νŠΈ λ‚΄μ—μ„œ 이루어지도둝 보μž₯ν•©λ‹ˆλ‹€.
1536
1528
  */
1537
1529
  const Link = forwardRef(({ href, children, ...props }, ref) => {
1538
1530
  const { locale } = useLocale();
1539
1531
  const isExternalLink = checkIsExternalLink(href);
1540
1532
 
1541
- // 링크가 λ‚΄λΆ€ 링크이고 μœ νš¨ν•œ hrefκ°€ 제곡된 경우, λ‘œμΌ€μΌμ΄ 적용된 URL을 κ°€μ Έμ˜΅λ‹ˆλ‹€.
1533
+ // 링크가 λ‚΄λΆ€ 링크이고 μœ νš¨ν•œ hrefκ°€ 제곡된 경우, 둜컬라이즈된 URL을 κ°€μ Έμ˜΅λ‹ˆλ‹€.
1542
1534
  const localizedHref = isExternalLink ? href : getLocalizedUrl(href, locale);
1543
1535
 
1544
1536
  return (
@@ -1556,7 +1548,7 @@ const Link = forwardRef(({ href, children, ...props }, ref) => {
1556
1548
  Link.displayName = "Link";
1557
1549
  ```
1558
1550
 
1559
- #### μž‘λ™ 방식
1551
+ #### μž‘λ™ 원리
1560
1552
 
1561
1553
  - **μ™ΈλΆ€ 링크 감지**:
1562
1554
  헬퍼 ν•¨μˆ˜ `checkIsExternalLink`λŠ” URL이 μ™ΈλΆ€ 링크인지 μ—¬λΆ€λ₯Ό νŒλ‹¨ν•©λ‹ˆλ‹€. μ™ΈλΆ€ λ§ν¬λŠ” ν˜„μ§€ν™”κ°€ ν•„μš” μ—†μœΌλ―€λ‘œ λ³€κ²½ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
@@ -1565,12 +1557,12 @@ Link.displayName = "Link";
1565
1557
  `useLocale` 훅은 ν˜„μž¬ λ‘œμΌ€μΌ(예: ν”„λž‘μŠ€μ–΄μ˜ 경우 `fr`)을 μ œκ³΅ν•©λ‹ˆλ‹€.
1566
1558
 
1567
1559
  - **URL ν˜„μ§€ν™”**:
1568
- λ‚΄λΆ€ 링크(즉, μ™ΈλΆ€ 링크가 μ•„λ‹Œ 경우)에 λŒ€ν•΄μ„œλŠ” `getLocalizedUrl`을 μ‚¬μš©ν•˜μ—¬ URL μ•žμ— ν˜„μž¬ λ‘œμΌ€μΌμ„ μžλ™μœΌλ‘œ λΆ™μž…λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ μ‚¬μš©μžκ°€ ν”„λž‘μŠ€μ–΄ λ‘œμΌ€μΌμ— μžˆλ‹€λ©΄, `href`에 `/about`을 전달할 경우 `/fr/about`둜 λ³€ν™˜λ©λ‹ˆλ‹€.
1560
+ λ‚΄λΆ€ 링크(즉, μ™ΈλΆ€ 링크가 μ•„λ‹Œ 경우)에 λŒ€ν•΄ `getLocalizedUrl`을 μ‚¬μš©ν•˜μ—¬ URL μ•žμ— ν˜„μž¬ λ‘œμΌ€μΌμ„ μžλ™μœΌλ‘œ λΆ™μž…λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ μ‚¬μš©μžκ°€ ν”„λž‘μŠ€μ–΄ λ‘œμΌ€μΌμ— μžˆλ‹€λ©΄, `href`에 `/about`을 μ „λ‹¬ν•˜λ©΄ `/fr/about`둜 λ³€ν™˜λ©λ‹ˆλ‹€.
1569
1561
 
1570
1562
  - **링크 λ°˜ν™˜**:
1571
1563
  μ»΄ν¬λ„ŒνŠΈλŠ” μ§€μ—­ν™”λœ URL을 κ°€μ§„ `<a>` μš”μ†Œλ₯Ό λ°˜ν™˜ν•˜μ—¬, λ‚΄λΉ„κ²Œμ΄μ…˜μ΄ ν˜„μž¬ λ‘œμΌ€μΌκ³Ό μΌμΉ˜ν•˜λ„λ‘ 보μž₯ν•©λ‹ˆλ‹€.
1572
1564
 
1573
- 이 `Link` μ»΄ν¬λ„ŒνŠΈλ₯Ό μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ „λ°˜μ— ν†΅ν•©ν•˜λ©΄, μΌκ΄€λ˜κ³  언어에 λ―Όκ°ν•œ μ‚¬μš©μž κ²½ν—˜μ„ μœ μ§€ν•  수 있으며, SEO 및 μ‚¬μš©μ„± ν–₯상에도 도움이 λ©λ‹ˆλ‹€.
1565
+ 이 `Link` μ»΄ν¬λ„ŒνŠΈλ₯Ό μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ „λ°˜μ— ν†΅ν•©ν•¨μœΌλ‘œμ¨, μΌκ΄€λ˜κ³  μ–Έμ–΄ 인식이 κ°€λŠ₯ν•œ μ‚¬μš©μž κ²½ν—˜μ„ μœ μ§€ν•  수 있으며, SEO 및 μ‚¬μš©μ„± ν–₯상에도 도움이 λ©λ‹ˆλ‹€.
1574
1566
 
1575
1567
  ### TypeScript ꡬ성
1576
1568
 
@@ -1586,39 +1578,15 @@ TypeScript ꡬ성에 μžλ™ μƒμ„±λœ νƒ€μž…μ΄ ν¬ν•¨λ˜μ–΄ μžˆλŠ”μ§€ ν™•μΈν•˜
1586
1578
  {
1587
1579
  // ... κΈ°μ‘΄ TypeScript ꡬ성
1588
1580
  "include": [
1589
- // ... κΈ°μ‘΄ TypeScript ꡬ성
1590
- ".intlayer/**/*.ts", // μžλ™ μƒμ„±λœ νƒ€μž… 포함
1591
- ],
1592
- }
1593
- ```
1594
-
1595
- μ»΄ν¬λ„ŒνŠΈλŠ” μ§€μ—­ν™”λœ URL을 κ°€μ§„ `<a>` μš”μ†Œλ₯Ό λ°˜ν™˜ν•˜μ—¬, λ‘œμΌ€μΌμ— λ§žλŠ” μΌκ΄€λœ λ‚΄λΉ„κ²Œμ΄μ…˜μ„ 보μž₯ν•©λ‹ˆλ‹€.
1596
-
1597
- 이 `Link` μ»΄ν¬λ„ŒνŠΈλ₯Ό μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ „λ°˜μ— ν†΅ν•©ν•˜λ©΄, μΌκ΄€λ˜κ³  μ–Έμ–΄λ₯Ό μΈμ‹ν•˜λŠ” μ‚¬μš©μž κ²½ν—˜μ„ μœ μ§€ν•˜λŠ” λ™μ‹œμ— SEO와 μ‚¬μš©μ„± ν–₯μƒμ˜ 이점을 λˆ„λ¦΄ 수 μžˆμŠ΅λ‹ˆλ‹€.
1598
-
1599
- ### TypeScript ꡬ성
1600
-
1601
- IntlayerλŠ” λͺ¨λ“ˆ 증강(module augmentation)을 μ‚¬μš©ν•˜μ—¬ TypeScript의 이점을 ν™œμš©ν•˜κ³  μ½”λ“œλ² μ΄μŠ€λ₯Ό λ”μš± κ²¬κ³ ν•˜κ²Œ λ§Œλ“­λ‹ˆλ‹€.
1602
-
1603
- ![alt text](https://github.com/aymericzip/intlayer/blob/main/docs/assets/autocompletion.png)
1604
-
1605
- ![alt text](https://github.com/aymericzip/intlayer/blob/main/docs/assets/translation_error.png)
1606
-
1607
- TypeScript ꡬ성에 μžλ™ μƒμ„±λœ νƒ€μž…μ΄ ν¬ν•¨λ˜μ–΄ μžˆλŠ”μ§€ ν™•μΈν•˜μ„Έμš”.
1608
-
1609
- ```json5 fileName="tsconfig.json"
1610
- {
1611
- // ... κΈ°μ‘΄ TypeScript ꡬ성
1612
- "include": [
1613
- // ... κΈ°μ‘΄ TypeScript ꡬ성
1581
+ // ... κΈ°μ‘΄ TypeScript μ„€μ •
1614
1582
  ".intlayer/**/*.ts", // μžλ™ μƒμ„±λœ νƒ€μž… 포함
1615
1583
  ],
1616
1584
  }
1617
1585
  ```
1618
1586
 
1619
- ### Git ꡬ성
1587
+ ### Git μ„€μ •
1620
1588
 
1621
- Intlayerκ°€ μƒμ„±ν•œ νŒŒμΌμ€ Git μ €μž₯μ†Œμ— μ»€λ°‹ν•˜μ§€ μ•Šλ„λ‘ λ¬΄μ‹œν•˜λŠ” 것이 ꢌμž₯λ©λ‹ˆλ‹€.
1589
+ Intlayerκ°€ μƒμ„±ν•œ νŒŒμΌλ“€μ€ Git μ €μž₯μ†Œμ— μ»€λ°‹ν•˜μ§€ μ•Šλ„λ‘ λ¬΄μ‹œν•˜λŠ” 것이 ꢌμž₯λ©λ‹ˆλ‹€.
1622
1590
 
1623
1591
  이λ₯Ό μœ„ν•΄ `.gitignore` νŒŒμΌμ— λ‹€μŒ 지침을 μΆ”κ°€ν•  수 μžˆμŠ΅λ‹ˆλ‹€:
1624
1592
 
@@ -1627,18 +1595,18 @@ Intlayerκ°€ μƒμ„±ν•œ νŒŒμΌμ€ Git μ €μž₯μ†Œμ— μ»€λ°‹ν•˜μ§€ μ•Šλ„λ‘ λ¬΄μ‹œ
1627
1595
  .intlayer
1628
1596
  ```
1629
1597
 
1630
- ### VS Code ν™•μž₯
1598
+ ### VS Code ν™•μž₯ ν”„λ‘œκ·Έλž¨
1631
1599
 
1632
- Intlayer와 ν•¨κ»˜ 개발 κ²½ν—˜μ„ ν–₯μƒμ‹œν‚€κΈ° μœ„ν•΄ 곡식 **Intlayer VS Code ν™•μž₯**을 μ„€μΉ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
1600
+ Intlayer와 ν•¨κ»˜ 개발 κ²½ν—˜μ„ ν–₯μƒμ‹œν‚€κΈ° μœ„ν•΄ 곡식 **Intlayer VS Code ν™•μž₯ ν”„λ‘œκ·Έλž¨**을 μ„€μΉ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
1633
1601
 
1634
1602
  [VS Code λ§ˆμΌ“ν”Œλ ˆμ΄μŠ€μ—μ„œ μ„€μΉ˜ν•˜κΈ°](https://marketplace.visualstudio.com/items?itemName=intlayer.intlayer-vs-code-extension)
1635
1603
 
1636
- 이 ν™•μž₯은 λ‹€μŒ κΈ°λŠ₯을 μ œκ³΅ν•©λ‹ˆλ‹€:
1604
+ 이 ν™•μž₯ ν”„λ‘œκ·Έλž¨μ€ λ‹€μŒ κΈ°λŠ₯을 μ œκ³΅ν•©λ‹ˆλ‹€:
1637
1605
 
1638
1606
  - λ²ˆμ—­ 킀에 λŒ€ν•œ **μžλ™ μ™„μ„±**.
1639
- - **λˆ„λ½λœ λ²ˆμ—­μ— λŒ€ν•œ μ‹€μ‹œκ°„ 였λ₯˜ 감지**.
1640
- - **λ²ˆμ—­λœ μ½˜ν…μΈ μ˜ 인라인 미리보기**.
1641
- - **λ²ˆμ—­μ„ μ‰½κ²Œ 생성 및 μ—…λ°μ΄νŠΈν•  수 μžˆλŠ” λΉ λ₯Έ μž‘μ—…**.
1607
+ - **μ‹€μ‹œκ°„ 였λ₯˜ 감지**둜 λˆ„λ½λœ λ²ˆμ—­μ„ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.
1608
+ - **인라인 미리보기**λ₯Ό 톡해 λ²ˆμ—­λœ λ‚΄μš©μ„ λ°”λ‘œ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.
1609
+ - **λΉ λ₯Έ μž‘μ—…**으둜 λ²ˆμ—­μ„ μ‰½κ²Œ μƒμ„±ν•˜κ³  μ—…λ°μ΄νŠΈν•  수 μžˆμŠ΅λ‹ˆλ‹€.
1642
1610
 
1643
1611
  ν™•μž₯ κΈ°λŠ₯ μ‚¬μš© 방법에 λŒ€ν•œ μžμ„Έν•œ λ‚΄μš©μ€ [Intlayer VS Code ν™•μž₯ λ¬Έμ„œ](https://intlayer.org/doc/vs-code-extension)λ₯Ό μ°Έμ‘°ν•˜μ„Έμš”.
1644
1612