@intlayer/docs 5.8.1-canary.0 → 6.0.0-canary.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (378) hide show
  1. package/blog/ar/rag_powered_documentation_assistant.md +282 -0
  2. package/blog/de/rag_powered_documentation_assistant.md +282 -0
  3. package/blog/en/rag_powered_documentation_assistant.md +289 -0
  4. package/blog/en-GB/rag_powered_documentation_assistant.md +284 -0
  5. package/blog/es/rag_powered_documentation_assistant.md +308 -0
  6. package/blog/fr/rag_powered_documentation_assistant.md +308 -0
  7. package/blog/hi/rag_powered_documentation_assistant.md +284 -0
  8. package/blog/it/rag_powered_documentation_assistant.md +284 -0
  9. package/blog/ja/rag_powered_documentation_assistant.md +284 -0
  10. package/blog/ko/rag_powered_documentation_assistant.md +283 -0
  11. package/blog/pt/rag_powered_documentation_assistant.md +284 -0
  12. package/blog/ru/rag_powered_documentation_assistant.md +284 -0
  13. package/blog/tr/index.md +69 -0
  14. package/blog/tr/internationalization_and_SEO.md +273 -0
  15. package/blog/tr/intlayer_with_i18next.md +162 -0
  16. package/blog/tr/intlayer_with_next-i18next.md +367 -0
  17. package/blog/tr/intlayer_with_next-intl.md +392 -0
  18. package/blog/tr/intlayer_with_react-i18next.md +346 -0
  19. package/blog/tr/intlayer_with_react-intl.md +345 -0
  20. package/blog/tr/list_i18n_technologies/CMS/drupal.md +143 -0
  21. package/blog/tr/list_i18n_technologies/CMS/wix.md +167 -0
  22. package/blog/tr/list_i18n_technologies/CMS/wordpress.md +188 -0
  23. package/blog/tr/list_i18n_technologies/frameworks/angular.md +125 -0
  24. package/blog/tr/list_i18n_technologies/frameworks/flutter.md +150 -0
  25. package/blog/tr/list_i18n_technologies/frameworks/react-native.md +217 -0
  26. package/blog/tr/list_i18n_technologies/frameworks/react.md +155 -0
  27. package/blog/tr/list_i18n_technologies/frameworks/svelte.md +129 -0
  28. package/blog/tr/list_i18n_technologies/frameworks/vue.md +130 -0
  29. package/blog/tr/next-i18next_vs_next-intl_vs_intlayer.md +170 -0
  30. package/blog/tr/rag_powered_documentation_assistant.md +284 -0
  31. package/blog/tr/react-i18next_vs_react-intl_vs_intlayer.md +162 -0
  32. package/blog/tr/vue-i18n_vs_intlayer.md +276 -0
  33. package/blog/tr/what_is_internationalization.md +166 -0
  34. package/blog/zh/rag_powered_documentation_assistant.md +284 -0
  35. package/dist/cjs/generated/blog.entry.cjs +212 -0
  36. package/dist/cjs/generated/blog.entry.cjs.map +1 -1
  37. package/dist/cjs/generated/docs.entry.cjs +660 -132
  38. package/dist/cjs/generated/docs.entry.cjs.map +1 -1
  39. package/dist/cjs/generated/frequentQuestions.entry.cjs +84 -0
  40. package/dist/cjs/generated/frequentQuestions.entry.cjs.map +1 -1
  41. package/dist/cjs/generated/legal.entry.cjs +6 -0
  42. package/dist/cjs/generated/legal.entry.cjs.map +1 -1
  43. package/dist/esm/generated/blog.entry.mjs +212 -0
  44. package/dist/esm/generated/blog.entry.mjs.map +1 -1
  45. package/dist/esm/generated/docs.entry.mjs +660 -132
  46. package/dist/esm/generated/docs.entry.mjs.map +1 -1
  47. package/dist/esm/generated/frequentQuestions.entry.mjs +84 -0
  48. package/dist/esm/generated/frequentQuestions.entry.mjs.map +1 -1
  49. package/dist/esm/generated/legal.entry.mjs +6 -0
  50. package/dist/esm/generated/legal.entry.mjs.map +1 -1
  51. package/dist/types/generated/blog.entry.d.ts +1 -0
  52. package/dist/types/generated/blog.entry.d.ts.map +1 -1
  53. package/dist/types/generated/docs.entry.d.ts +5 -2
  54. package/dist/types/generated/docs.entry.d.ts.map +1 -1
  55. package/dist/types/generated/frequentQuestions.entry.d.ts.map +1 -1
  56. package/dist/types/generated/legal.entry.d.ts.map +1 -1
  57. package/docs/ar/autoFill.md +41 -40
  58. package/docs/ar/configuration.md +202 -199
  59. package/docs/ar/dictionary/content_file.md +1059 -0
  60. package/docs/ar/intlayer_CMS.md +4 -4
  61. package/docs/ar/intlayer_with_nestjs.md +271 -0
  62. package/docs/ar/intlayer_with_nextjs_page_router.md +1 -1
  63. package/docs/ar/intlayer_with_react_router_v7.md +533 -0
  64. package/docs/ar/intlayer_with_tanstack.md +465 -299
  65. package/docs/ar/intlayer_with_vite+preact.md +7 -7
  66. package/docs/ar/intlayer_with_vite+react.md +7 -7
  67. package/docs/ar/intlayer_with_vite+vue.md +9 -9
  68. package/docs/ar/packages/vite-intlayer/index.md +3 -3
  69. package/docs/ar/readme.md +261 -0
  70. package/docs/ar/testing.md +199 -0
  71. package/docs/de/autoFill.md +42 -19
  72. package/docs/de/configuration.md +155 -147
  73. package/docs/de/dictionary/content_file.md +1059 -0
  74. package/docs/de/intlayer_CMS.md +4 -5
  75. package/docs/de/intlayer_with_nestjs.md +270 -0
  76. package/docs/de/intlayer_with_nextjs_page_router.md +1 -1
  77. package/docs/de/intlayer_with_react_router_v7.md +537 -0
  78. package/docs/de/intlayer_with_tanstack.md +469 -302
  79. package/docs/de/intlayer_with_vite+preact.md +7 -7
  80. package/docs/de/intlayer_with_vite+react.md +7 -7
  81. package/docs/de/intlayer_with_vite+vue.md +9 -9
  82. package/docs/de/packages/vite-intlayer/index.md +3 -3
  83. package/docs/de/readme.md +261 -0
  84. package/docs/de/testing.md +200 -0
  85. package/docs/en/CI_CD.md +4 -6
  86. package/docs/en/autoFill.md +25 -5
  87. package/docs/en/configuration.md +45 -54
  88. package/docs/en/dictionary/content_file.md +1054 -0
  89. package/docs/en/intlayer_CMS.md +8 -7
  90. package/docs/en/intlayer_cli.md +112 -5
  91. package/docs/en/intlayer_with_nestjs.md +268 -0
  92. package/docs/en/intlayer_with_nextjs_page_router.md +1 -1
  93. package/docs/en/intlayer_with_react_router_v7.md +531 -0
  94. package/docs/en/intlayer_with_tanstack.md +463 -294
  95. package/docs/en/intlayer_with_vite+preact.md +8 -8
  96. package/docs/en/intlayer_with_vite+react.md +8 -8
  97. package/docs/en/intlayer_with_vite+vue.md +8 -8
  98. package/docs/en/packages/intlayer/getLocalizedUrl.md +102 -25
  99. package/docs/en/packages/vite-intlayer/index.md +3 -3
  100. package/docs/en/readme.md +261 -0
  101. package/docs/en/testing.md +200 -0
  102. package/docs/en-GB/autoFill.md +29 -6
  103. package/docs/en-GB/configuration.md +79 -71
  104. package/docs/en-GB/dictionary/content_file.md +1084 -0
  105. package/docs/en-GB/intlayer_CMS.md +4 -5
  106. package/docs/en-GB/intlayer_with_nestjs.md +268 -0
  107. package/docs/en-GB/intlayer_with_nextjs_page_router.md +1 -1
  108. package/docs/en-GB/intlayer_with_react_router_v7.md +533 -0
  109. package/docs/en-GB/intlayer_with_tanstack.md +466 -299
  110. package/docs/en-GB/intlayer_with_vite+preact.md +7 -7
  111. package/docs/en-GB/intlayer_with_vite+react.md +7 -7
  112. package/docs/en-GB/intlayer_with_vite+vue.md +9 -9
  113. package/docs/en-GB/packages/vite-intlayer/index.md +3 -3
  114. package/docs/en-GB/readme.md +261 -0
  115. package/docs/en-GB/testing.md +200 -0
  116. package/docs/es/autoFill.md +45 -23
  117. package/docs/es/configuration.md +171 -167
  118. package/docs/es/dictionary/content_file.md +1088 -0
  119. package/docs/es/intlayer_CMS.md +4 -5
  120. package/docs/es/intlayer_with_nestjs.md +268 -0
  121. package/docs/es/intlayer_with_nextjs_page_router.md +1 -1
  122. package/docs/es/intlayer_with_react_router_v7.md +533 -0
  123. package/docs/es/intlayer_with_tanstack.md +469 -280
  124. package/docs/es/intlayer_with_vite+preact.md +7 -7
  125. package/docs/es/intlayer_with_vite+react.md +7 -7
  126. package/docs/es/intlayer_with_vite+vue.md +9 -9
  127. package/docs/es/packages/vite-intlayer/index.md +3 -3
  128. package/docs/es/readme.md +261 -0
  129. package/docs/es/testing.md +200 -0
  130. package/docs/fr/autoFill.md +47 -24
  131. package/docs/fr/configuration.md +213 -198
  132. package/docs/fr/dictionary/content_file.md +1054 -0
  133. package/docs/fr/intlayer_CMS.md +4 -5
  134. package/docs/fr/intlayer_with_nestjs.md +268 -0
  135. package/docs/fr/intlayer_with_nextjs_page_router.md +1 -1
  136. package/docs/fr/intlayer_with_react_router_v7.md +549 -0
  137. package/docs/fr/intlayer_with_tanstack.md +465 -279
  138. package/docs/fr/intlayer_with_vite+preact.md +7 -7
  139. package/docs/fr/intlayer_with_vite+react.md +7 -7
  140. package/docs/fr/intlayer_with_vite+vue.md +9 -9
  141. package/docs/fr/packages/vite-intlayer/index.md +3 -3
  142. package/docs/fr/readme.md +261 -0
  143. package/docs/fr/testing.md +200 -0
  144. package/docs/hi/autoFill.md +47 -25
  145. package/docs/hi/configuration.md +194 -189
  146. package/docs/hi/dictionary/content_file.md +1056 -0
  147. package/docs/hi/intlayer_CMS.md +4 -5
  148. package/docs/hi/intlayer_with_nestjs.md +269 -0
  149. package/docs/hi/intlayer_with_nextjs_page_router.md +1 -1
  150. package/docs/hi/intlayer_with_react_router_v7.md +533 -0
  151. package/docs/hi/intlayer_with_tanstack.md +467 -282
  152. package/docs/hi/intlayer_with_vite+preact.md +7 -7
  153. package/docs/hi/intlayer_with_vite+react.md +7 -7
  154. package/docs/hi/intlayer_with_vite+vue.md +9 -9
  155. package/docs/hi/packages/vite-intlayer/index.md +3 -3
  156. package/docs/hi/readme.md +261 -0
  157. package/docs/hi/testing.md +200 -0
  158. package/docs/it/autoFill.md +46 -24
  159. package/docs/it/configuration.md +169 -161
  160. package/docs/it/dictionary/content_file.md +1061 -0
  161. package/docs/it/intlayer_CMS.md +4 -5
  162. package/docs/it/intlayer_with_nestjs.md +268 -0
  163. package/docs/it/intlayer_with_nextjs_page_router.md +1 -1
  164. package/docs/it/intlayer_with_react_router_v7.md +535 -0
  165. package/docs/it/intlayer_with_tanstack.md +467 -301
  166. package/docs/it/intlayer_with_vite+preact.md +7 -7
  167. package/docs/it/intlayer_with_vite+react.md +7 -7
  168. package/docs/it/intlayer_with_vite+vue.md +9 -9
  169. package/docs/it/packages/vite-intlayer/index.md +3 -3
  170. package/docs/it/readme.md +261 -0
  171. package/docs/it/testing.md +200 -0
  172. package/docs/ja/autoFill.md +45 -23
  173. package/docs/ja/configuration.md +243 -204
  174. package/docs/ja/dictionary/content_file.md +1064 -0
  175. package/docs/ja/intlayer_CMS.md +4 -5
  176. package/docs/ja/intlayer_with_nestjs.md +268 -0
  177. package/docs/ja/intlayer_with_nextjs_page_router.md +1 -1
  178. package/docs/ja/intlayer_with_react_router_v7.md +534 -0
  179. package/docs/ja/intlayer_with_tanstack.md +467 -303
  180. package/docs/ja/intlayer_with_vite+preact.md +7 -7
  181. package/docs/ja/intlayer_with_vite+react.md +7 -7
  182. package/docs/ja/intlayer_with_vite+vue.md +9 -9
  183. package/docs/ja/packages/vite-intlayer/index.md +3 -3
  184. package/docs/ja/readme.md +263 -0
  185. package/docs/ja/testing.md +200 -0
  186. package/docs/ko/autoFill.md +39 -16
  187. package/docs/ko/configuration.md +217 -197
  188. package/docs/ko/dictionary/content_file.md +1060 -0
  189. package/docs/ko/intlayer_CMS.md +4 -5
  190. package/docs/ko/intlayer_with_nestjs.md +268 -0
  191. package/docs/ko/intlayer_with_nextjs_page_router.md +1 -1
  192. package/docs/ko/intlayer_with_react_router_v7.md +540 -0
  193. package/docs/ko/intlayer_with_tanstack.md +466 -302
  194. package/docs/ko/intlayer_with_vite+preact.md +7 -7
  195. package/docs/ko/intlayer_with_vite+react.md +7 -7
  196. package/docs/ko/intlayer_with_vite+vue.md +9 -9
  197. package/docs/ko/packages/vite-intlayer/index.md +3 -3
  198. package/docs/ko/readme.md +261 -0
  199. package/docs/ko/testing.md +200 -0
  200. package/docs/pt/autoFill.md +39 -15
  201. package/docs/pt/configuration.md +165 -147
  202. package/docs/pt/dictionary/content_file.md +1062 -0
  203. package/docs/pt/intlayer_CMS.md +4 -5
  204. package/docs/pt/intlayer_with_nestjs.md +271 -0
  205. package/docs/pt/intlayer_with_nextjs_page_router.md +1 -1
  206. package/docs/pt/intlayer_with_react_router_v7.md +535 -0
  207. package/docs/pt/intlayer_with_tanstack.md +469 -300
  208. package/docs/pt/intlayer_with_vite+preact.md +7 -7
  209. package/docs/pt/intlayer_with_vite+react.md +7 -7
  210. package/docs/pt/intlayer_with_vite+vue.md +9 -9
  211. package/docs/pt/packages/vite-intlayer/index.md +3 -3
  212. package/docs/pt/readme.md +261 -0
  213. package/docs/pt/testing.md +200 -0
  214. package/docs/ru/autoFill.md +52 -30
  215. package/docs/ru/configuration.md +164 -117
  216. package/docs/ru/dictionary/content_file.md +1064 -0
  217. package/docs/ru/intlayer_CMS.md +4 -4
  218. package/docs/ru/intlayer_with_nestjs.md +270 -0
  219. package/docs/ru/intlayer_with_nextjs_page_router.md +1 -1
  220. package/docs/ru/intlayer_with_react_router_v7.md +534 -0
  221. package/docs/ru/intlayer_with_tanstack.md +470 -305
  222. package/docs/ru/intlayer_with_vite+preact.md +7 -7
  223. package/docs/ru/intlayer_with_vite+react.md +7 -7
  224. package/docs/ru/intlayer_with_vite+vue.md +9 -9
  225. package/docs/ru/packages/vite-intlayer/index.md +3 -3
  226. package/docs/ru/readme.md +261 -0
  227. package/docs/ru/testing.md +202 -0
  228. package/docs/tr/CI_CD.md +198 -0
  229. package/docs/tr/autoFill.md +201 -0
  230. package/docs/tr/configuration.md +585 -0
  231. package/docs/tr/dictionary/condition.md +243 -0
  232. package/docs/tr/dictionary/content_file.md +1055 -0
  233. package/docs/tr/dictionary/enumeration.md +251 -0
  234. package/docs/tr/dictionary/file.md +228 -0
  235. package/docs/tr/dictionary/function_fetching.md +218 -0
  236. package/docs/tr/dictionary/gender.md +279 -0
  237. package/docs/tr/dictionary/insertion.md +191 -0
  238. package/docs/tr/dictionary/markdown.md +385 -0
  239. package/docs/tr/dictionary/nesting.md +279 -0
  240. package/docs/tr/dictionary/translation.md +315 -0
  241. package/docs/tr/formatters.md +618 -0
  242. package/docs/tr/how_works_intlayer.md +254 -0
  243. package/docs/tr/index.md +168 -0
  244. package/docs/tr/interest_of_intlayer.md +288 -0
  245. package/docs/tr/intlayer_CMS.md +347 -0
  246. package/docs/tr/intlayer_cli.md +570 -0
  247. package/docs/tr/intlayer_visual_editor.md +269 -0
  248. package/docs/tr/intlayer_with_angular.md +694 -0
  249. package/docs/tr/intlayer_with_create_react_app.md +1218 -0
  250. package/docs/tr/intlayer_with_express.md +415 -0
  251. package/docs/tr/intlayer_with_lynx+react.md +511 -0
  252. package/docs/tr/intlayer_with_nestjs.md +268 -0
  253. package/docs/tr/intlayer_with_nextjs_14.md +1029 -0
  254. package/docs/tr/intlayer_with_nextjs_15.md +1506 -0
  255. package/docs/tr/intlayer_with_nextjs_page_router.md +1484 -0
  256. package/docs/tr/intlayer_with_nuxt.md +773 -0
  257. package/docs/tr/intlayer_with_react_native+expo.md +660 -0
  258. package/docs/tr/intlayer_with_react_router_v7.md +531 -0
  259. package/docs/tr/intlayer_with_tanstack.md +452 -0
  260. package/docs/tr/intlayer_with_vite+preact.md +1673 -0
  261. package/docs/tr/intlayer_with_vite+react.md +1632 -0
  262. package/docs/tr/intlayer_with_vite+solid.md +288 -0
  263. package/docs/tr/intlayer_with_vite+svelte.md +288 -0
  264. package/docs/tr/intlayer_with_vite+vue.md +1042 -0
  265. package/docs/tr/introduction.md +209 -0
  266. package/docs/tr/locale_mapper.md +244 -0
  267. package/docs/tr/mcp_server.md +207 -0
  268. package/docs/tr/packages/@intlayer/api/index.md +58 -0
  269. package/docs/tr/packages/@intlayer/chokidar/index.md +57 -0
  270. package/docs/tr/packages/@intlayer/cli/index.md +47 -0
  271. package/docs/tr/packages/@intlayer/config/index.md +142 -0
  272. package/docs/tr/packages/@intlayer/core/index.md +51 -0
  273. package/docs/tr/packages/@intlayer/design-system/index.md +47 -0
  274. package/docs/tr/packages/@intlayer/dictionary-entry/index.md +53 -0
  275. package/docs/tr/packages/@intlayer/editor/index.md +47 -0
  276. package/docs/tr/packages/@intlayer/editor-react/index.md +47 -0
  277. package/docs/tr/packages/@intlayer/webpack/index.md +61 -0
  278. package/docs/tr/packages/angular-intlayer/index.md +59 -0
  279. package/docs/tr/packages/express-intlayer/index.md +258 -0
  280. package/docs/tr/packages/express-intlayer/t.md +459 -0
  281. package/docs/tr/packages/intlayer/getConfiguration.md +151 -0
  282. package/docs/tr/packages/intlayer/getEnumeration.md +165 -0
  283. package/docs/tr/packages/intlayer/getHTMLTextDir.md +127 -0
  284. package/docs/tr/packages/intlayer/getLocaleLang.md +87 -0
  285. package/docs/tr/packages/intlayer/getLocaleName.md +124 -0
  286. package/docs/tr/packages/intlayer/getLocalizedUrl.md +324 -0
  287. package/docs/tr/packages/intlayer/getMultilingualUrls.md +225 -0
  288. package/docs/tr/packages/intlayer/getPathWithoutLocale.md +81 -0
  289. package/docs/tr/packages/intlayer/getTranslation.md +196 -0
  290. package/docs/tr/packages/intlayer/getTranslationContent.md +195 -0
  291. package/docs/tr/packages/intlayer/index.md +505 -0
  292. package/docs/tr/packages/intlayer-cli/index.md +71 -0
  293. package/docs/tr/packages/intlayer-editor/index.md +139 -0
  294. package/docs/tr/packages/lynx-intlayer/index.md +85 -0
  295. package/docs/tr/packages/next-intlayer/index.md +154 -0
  296. package/docs/tr/packages/next-intlayer/t.md +354 -0
  297. package/docs/tr/packages/next-intlayer/useDictionary.md +270 -0
  298. package/docs/tr/packages/next-intlayer/useIntlayer.md +265 -0
  299. package/docs/tr/packages/next-intlayer/useLocale.md +133 -0
  300. package/docs/tr/packages/nuxt-intlayer/index.md +59 -0
  301. package/docs/tr/packages/preact-intlayer/index.md +55 -0
  302. package/docs/tr/packages/react-intlayer/index.md +148 -0
  303. package/docs/tr/packages/react-intlayer/t.md +304 -0
  304. package/docs/tr/packages/react-intlayer/useDictionary.md +554 -0
  305. package/docs/tr/packages/react-intlayer/useI18n.md +478 -0
  306. package/docs/tr/packages/react-intlayer/useIntlayer.md +253 -0
  307. package/docs/tr/packages/react-intlayer/useLocale.md +212 -0
  308. package/docs/tr/packages/react-native-intlayer/index.md +85 -0
  309. package/docs/tr/packages/react-scripts-intlayer/index.md +82 -0
  310. package/docs/tr/packages/solid-intlayer/index.md +56 -0
  311. package/docs/tr/packages/svelte-intlayer/index.md +55 -0
  312. package/docs/tr/packages/vite-intlayer/index.md +82 -0
  313. package/docs/tr/packages/vue-intlayer/index.md +59 -0
  314. package/docs/tr/per_locale_file.md +321 -0
  315. package/docs/tr/readme.md +261 -0
  316. package/docs/tr/roadmap.md +338 -0
  317. package/docs/tr/testing.md +200 -0
  318. package/docs/tr/vs_code_extension.md +154 -0
  319. package/docs/zh/autoFill.md +40 -18
  320. package/docs/zh/configuration.md +245 -226
  321. package/docs/zh/dictionary/content_file.md +1064 -0
  322. package/docs/zh/intlayer_CMS.md +4 -5
  323. package/docs/zh/intlayer_with_nestjs.md +268 -0
  324. package/docs/zh/intlayer_with_nextjs_page_router.md +1 -1
  325. package/docs/zh/intlayer_with_react_router_v7.md +535 -0
  326. package/docs/zh/intlayer_with_tanstack.md +468 -278
  327. package/docs/zh/intlayer_with_vite+preact.md +7 -7
  328. package/docs/zh/intlayer_with_vite+react.md +7 -7
  329. package/docs/zh/intlayer_with_vite+vue.md +7 -7
  330. package/docs/zh/packages/vite-intlayer/index.md +3 -3
  331. package/docs/zh/readme.md +261 -0
  332. package/docs/zh/testing.md +198 -0
  333. package/frequent_questions/tr/SSR_Next_no_[locale].md +105 -0
  334. package/frequent_questions/tr/array_as_content_declaration.md +72 -0
  335. package/frequent_questions/tr/build_dictionaries.md +59 -0
  336. package/frequent_questions/tr/build_error_CI_CD.md +75 -0
  337. package/frequent_questions/tr/customized_locale_list.md +65 -0
  338. package/frequent_questions/tr/domain_routing.md +114 -0
  339. package/frequent_questions/tr/esbuild_error.md +30 -0
  340. package/frequent_questions/tr/get_locale_cookie.md +142 -0
  341. package/frequent_questions/tr/intlayer_command_undefined.md +156 -0
  342. package/frequent_questions/tr/locale_incorect_in_url.md +74 -0
  343. package/frequent_questions/tr/static_rendering.md +45 -0
  344. package/frequent_questions/tr/translated_path_url.md +56 -0
  345. package/frequent_questions/tr/unknown_command.md +98 -0
  346. package/legal/tr/privacy_notice.md +83 -0
  347. package/legal/tr/terms_of_service.md +55 -0
  348. package/package.json +13 -13
  349. package/src/generated/blog.entry.ts +212 -0
  350. package/src/generated/docs.entry.ts +663 -135
  351. package/src/generated/frequentQuestions.entry.ts +85 -1
  352. package/src/generated/legal.entry.ts +7 -1
  353. package/docs/ar/dictionary/content_extention_customization.md +0 -100
  354. package/docs/ar/dictionary/get_started.md +0 -527
  355. package/docs/de/dictionary/content_extention_customization.md +0 -100
  356. package/docs/de/dictionary/get_started.md +0 -531
  357. package/docs/en/dictionary/content_extention_customization.md +0 -102
  358. package/docs/en/dictionary/get_started.md +0 -529
  359. package/docs/en-GB/dictionary/content_extention_customization.md +0 -100
  360. package/docs/en-GB/dictionary/get_started.md +0 -591
  361. package/docs/es/dictionary/content_extention_customization.md +0 -100
  362. package/docs/es/dictionary/get_started.md +0 -527
  363. package/docs/fr/dictionary/content_extention_customization.md +0 -100
  364. package/docs/fr/dictionary/get_started.md +0 -527
  365. package/docs/hi/dictionary/content_extention_customization.md +0 -100
  366. package/docs/hi/dictionary/get_started.md +0 -527
  367. package/docs/it/dictionary/content_extention_customization.md +0 -113
  368. package/docs/it/dictionary/get_started.md +0 -573
  369. package/docs/ja/dictionary/content_extention_customization.md +0 -113
  370. package/docs/ja/dictionary/get_started.md +0 -576
  371. package/docs/ko/dictionary/content_extention_customization.md +0 -100
  372. package/docs/ko/dictionary/get_started.md +0 -530
  373. package/docs/pt/dictionary/content_extention_customization.md +0 -100
  374. package/docs/pt/dictionary/get_started.md +0 -532
  375. package/docs/ru/dictionary/content_extention_customization.md +0 -100
  376. package/docs/ru/dictionary/get_started.md +0 -575
  377. package/docs/zh/dictionary/content_extention_customization.md +0 -117
  378. package/docs/zh/dictionary/get_started.md +0 -533
@@ -1,347 +1,438 @@
1
1
  ---
2
- createdAt: 2025-08-11
3
- updatedAt: 2025-08-11
4
- title: Comenzando con Intlayer en TanStack Start (React)
5
- description: Añade i18n a tu aplicación TanStack Start usando Intlayer-diccionarios a nivel de componente, URLs localizadas y metadatos amigables para SEO.
2
+ createdAt: 2025-09-09
3
+ updatedAt: 2025-09-09
4
+ title: Comenzando con Intlayer en Tanstack Start
5
+ description: Aprende cómo agregar internacionalización (i18n) a tu aplicación Tanstack Start usando Intlayer. Sigue esta guía completa para hacer tu aplicación multilingüe con enrutamiento consciente del locale.
6
6
  keywords:
7
7
  - Internacionalización
8
8
  - Documentación
9
9
  - Intlayer
10
- - TanStack Start
11
- - TanStack Router
10
+ - Tanstack Start
12
11
  - React
13
12
  - i18n
14
- - JavaScript
13
+ - TypeScript
14
+ - Enrutamiento por Locale
15
15
  slugs:
16
16
  - doc
17
17
  - environment
18
+ - vite-and-react
18
19
  - tanstack-start
20
+ applicationTemplate: https://github.com/AydinTheFirst/tanstack-start-intlayer
21
+ author: AydinTheFirst
19
22
  ---
20
23
 
21
- # Comenzando con la internacionalización (i18n) usando Intlayer y TanStack Start (React)
24
+ # Comenzando con la Internacionalización (i18n) usando Intlayer y Tanstack Start
25
+
26
+ Esta guía demuestra cómo integrar **Intlayer** para una internacionalización fluida en proyectos Tanstack Start con enrutamiento consciente del locale, soporte para TypeScript y prácticas modernas de desarrollo.
22
27
 
23
28
  ## ¿Qué es Intlayer?
24
29
 
25
- **Intlayer** es un conjunto de herramientas i18n de código abierto para aplicaciones React. Te ofrece:
30
+ **Intlayer** es una biblioteca innovadora y de código abierto para internacionalización (i18n) diseñada para simplificar el soporte multilingüe en aplicaciones web modernas.
26
31
 
27
- - **Diccionarios locales por componente** con seguridad de TypeScript.
28
- - **Metadatos y rutas dinámicas** (preparadas para SEO).
29
- - **Cambio de idioma en tiempo de ejecución** (y ayudas para detectar/persistir locales).
30
- - **Plugin de Vite** para transformaciones en tiempo de compilación + experiencia de desarrollo (DX).
32
+ Con Intlayer, puedes:
31
33
 
32
- Esta guía muestra cómo integrar Intlayer en un proyecto **TanStack Start** (que usa Vite internamente y TanStack Router para enrutamiento/SSR).
34
+ - **Gestionar traducciones fácilmente** usando diccionarios declarativos a nivel de componente.
35
+ - **Localizar dinámicamente metadatos**, rutas y contenido.
36
+ - **Garantizar soporte para TypeScript** con tipos autogenerados, mejorando la autocompletación y la detección de errores.
37
+ - **Beneficiarte de características avanzadas**, como la detección y cambio dinámico de locale.
38
+ - **Habilitar enrutamiento consciente del locale** con el sistema de enrutamiento basado en archivos de Tanstack Start.
33
39
 
34
40
  ---
35
41
 
36
- ## Paso 1: Instalar dependencias
42
+ ## Guía paso a paso para configurar Intlayer en una aplicación Tanstack Start
37
43
 
38
- ```bash
39
- # npm
40
- npm i intlayer react-intlayer
41
- npm i -D vite-intlayer
44
+ ### Paso 1: Crear el proyecto
42
45
 
43
- # pnpm
44
- pnpm add intlayer react-intlayer
45
- pnpm add -D vite-intlayer
46
+ Comienza creando un nuevo proyecto TanStack Start siguiendo la guía [Start new project](https://tanstack.com/start/latest/docs/framework/react/quick-start) en el sitio web de TanStack Start.
47
+
48
+ ### Paso 2: Instalar los paquetes de Intlayer
46
49
 
47
- # yarn
48
- yarn add intlayer react-intlayer
49
- yarn add -D vite-intlayer
50
+ Instala los paquetes necesarios usando tu gestor de paquetes preferido:
51
+
52
+ ```bash packageManager="npm"
53
+ npm install intlayer react-intlayer
54
+ npm install vite-intlayer --save-dev
50
55
  ```
51
56
 
52
- - **intlayer**: núcleo (configuración, diccionarios, CLI/transformaciones).
53
- - **react-intlayer**: `<IntlayerProvider>` + hooks para React.
54
- - **vite-intlayer**: plugin de Vite, además de middleware opcional para detección/redirección de locales (funciona en desarrollo y SSR/preview; mover a `dependencies` para SSR en producción).
57
+ ```bash packageManager="pnpm"
58
+ pnpm add intlayer react-intlayer
59
+ pnpm add vite-intlayer --save-dev
60
+ ```
55
61
 
56
- ---
62
+ - **intlayer**
63
+
64
+ - **intlayer**
65
+
66
+ El paquete principal que proporciona herramientas de internacionalización para la gestión de configuración, traducción, [declaración de contenido](https://github.com/aymericzip/intlayer/blob/main/docs/docs/es/dictionary/get_started.md), transpilación y [comandos CLI](https://github.com/aymericzip/intlayer/blob/main/docs/docs/es/intlayer_cli.md).
67
+
68
+ - **react-intlayer**
69
+ El paquete que integra Intlayer con aplicaciones React. Proporciona proveedores de contexto y hooks para la internacionalización en React.
70
+
71
+ - **vite-intlayer**
72
+ Incluye el plugin de Vite para integrar Intlayer con el [empaquetador Vite](https://vite.dev/guide/why.html#why-bundle-for-production), así como middleware para detectar el locale preferido del usuario, gestionar cookies y manejar redirecciones de URL.
57
73
 
58
- ## Paso 2: Configurar Intlayer
74
+ ### Paso 3: Configuración de tu proyecto
59
75
 
60
- Crea `intlayer.config.ts` en la raíz de tu proyecto:
76
+ Crea un archivo de configuración para configurar los idiomas de tu aplicación:
61
77
 
62
- ```ts fileName="intlayer.config.ts"
63
- import { Locales, type IntlayerConfig } from "intlayer";
78
+ ```typescript fileName="intlayer.config.ts" codeFormat="typescript"
79
+ import type { IntlayerConfig } from "intlayer";
80
+
81
+ import { Locales } from "intlayer";
64
82
 
65
83
  const config: IntlayerConfig = {
66
84
  internationalization: {
67
- locales: [Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH],
68
85
  defaultLocale: Locales.ENGLISH,
86
+ locales: [
87
+ Locales.ENGLISH,
88
+ Locales.FRENCH,
89
+ Locales.SPANISH,
90
+ // Tus otros idiomas
91
+ ],
69
92
  },
70
- // También puedes ajustar: contentDir, contentFileExtensions, opciones de middleware, etc.
71
93
  };
72
94
 
73
95
  export default config;
74
96
  ```
75
97
 
76
- Las variantes CommonJS/ESM son idénticas a tu documento original si prefieres `cjs`/`mjs`.
98
+ ```javascript fileName="intlayer.config.mjs" codeFormat="esm"
99
+ import { Locales } from "intlayer";
77
100
 
78
- > Referencia completa de configuración: consulta la documentación de configuración de Intlayer.
101
+ /** @type {import('intlayer').IntlayerConfig} */
102
+ const config = {
103
+ internationalization: {
104
+ defaultLocale: Locales.ENGLISH,
105
+ locales: [
106
+ Locales.ENGLISH,
107
+ Locales.FRENCH,
108
+ Locales.SPANISH,
109
+ // Tus otros idiomas
110
+ ],
111
+ },
112
+ };
79
113
 
80
- ---
114
+ export default config;
115
+ ```
81
116
 
82
- ## Paso 3: Añadir el plugin de Vite (y middleware opcional)
117
+ ```javascript fileName="intlayer.config.cjs" codeFormat="commonjs"
118
+ const { Locales } = require("intlayer");
83
119
 
84
- **TanStack Start usa Vite**, así que añade el/los plugin(s) de Intlayer a tu `vite.config.ts`:
120
+ /** @type {import('intlayer').IntlayerConfig} */
121
+ const config = {
122
+ internationalization: {
123
+ defaultLocale: Locales.ENGLISH,
124
+ locales: [
125
+ Locales.ENGLISH,
126
+ Locales.FRENCH,
127
+ Locales.SPANISH,
128
+ // Tus otros idiomas
129
+ ],
130
+ },
131
+ };
132
+
133
+ module.exports = config;
134
+ ```
135
+
136
+ > A través de este archivo de configuración, puedes configurar URLs localizadas, redirección de middleware, nombres de cookies, la ubicación y extensión de tus declaraciones de contenido, desactivar los registros de Intlayer en la consola y más. Para una lista completa de los parámetros disponibles, consulta la [documentación de configuración](https://github.com/aymericzip/intlayer/blob/main/docs/docs/es/configuration.md).
137
+
138
+ ### Paso 4: Integra Intlayer en tu configuración de Vite
85
139
 
86
- ```ts fileName="vite.config.ts"
140
+ Agrega el plugin intlayer en tu configuración:
141
+
142
+ ```typescript fileName="vite.config.ts" codeFormat="typescript"
143
+ import { reactRouter } from "@react-router/dev/vite";
87
144
  import { defineConfig } from "vite";
88
- import react from "@vitejs/plugin-react-swc";
89
- import { intlayerPlugin, intLayerMiddlewarePlugin } from "vite-intlayer";
145
+ import { intlayerMiddlewarePlugin, intlayerPlugin } from "vite-intlayer";
146
+ import tsconfigPaths from "vite-tsconfig-paths";
90
147
 
91
148
  export default defineConfig({
92
149
  plugins: [
93
- react(),
150
+ reactRouter(),
151
+ tsconfigPaths(),
94
152
  intlayerPlugin(),
95
- // Opcional pero recomendado para la detección de idioma, cookies y redirecciones:
96
- intLayerMiddlewarePlugin(),
153
+ intlayerMiddlewarePlugin(),
97
154
  ],
98
155
  });
99
156
  ```
100
157
 
101
- > Si despliegas SSR, mueve `vite-intlayer` a `dependencies` para que el middleware se ejecute en producción.
158
+ > El plugin `intlayerPlugin()` de Vite se utiliza para integrar Intlayer con Vite. Asegura la construcción de los archivos de declaración de contenido y los supervisa en modo desarrollo. Define las variables de entorno de Intlayer dentro de la aplicación Vite. Además, proporciona alias para optimizar el rendimiento.
102
159
 
103
- ---
160
+ ### Paso 5: Crear Componentes de Layout
161
+
162
+ Configura tu layout raíz y los layouts específicos por locale:
163
+
164
+ #### Layout Raíz
165
+
166
+ ```tsx fileName="src/routes/{-$locale}/route.tsx" codeFormat="typescript"
167
+ // src/routes/{-$locale}/route.tsx
168
+ import { createFileRoute, Navigate, Outlet } from "@tanstack/react-router";
169
+ import { configuration } from "intlayer";
170
+ import { IntlayerProvider, useLocale } from "react-intlayer";
171
+
172
+ import { useI18nHTMLAttributes } from "@/hooks/useI18nHTMLAttributes";
173
+
174
+ export const Route = createFileRoute("/{-$locale}")({
175
+ component: LayoutComponent,
176
+ });
177
+
178
+ function LayoutComponent() {
179
+ const { locale } = Route.useParams();
180
+
181
+ return (
182
+ <IntlayerProvider locale={locale}>
183
+ <Outlet />
184
+ </IntlayerProvider>
185
+ );
186
+ }
187
+ ```
104
188
 
105
- ## Paso 4: Declara tu contenido
189
+ ### Paso 6: Declara Tu Contenido
106
190
 
107
- Coloca tus diccionarios en cualquier lugar dentro de `./src` (contentDir por defecto). Ejemplo:
191
+ Crea y gestiona tus declaraciones de contenido para almacenar traducciones:
108
192
 
109
- ```tsx fileName="src/app.content.tsx"
110
- import { t, type Dictionary } from "intlayer";
111
- import type { ReactNode } from "react";
193
+ ```tsx fileName="src/contents/page.content.ts" contentDeclarationFormat="typescript"
194
+ import type { Dictionary } from "intlayer";
195
+
196
+ import { t } from "intlayer";
112
197
 
113
198
  const appContent = {
114
- key: "app",
115
199
  content: {
116
- viteLogo: t({ en: "Vite logo", fr: "Logo Vite", es: "Logo Vite" }),
117
- reactLogo: t({ en: "React logo", fr: "Logo React", es: "Logo React" }),
200
+ links: {
201
+ about: t({
202
+ en: "About",
203
+ es: "Acerca de",
204
+ fr: "À propos",
205
+ }),
206
+ home: t({
207
+ en: "Inicio",
208
+ es: "Inicio",
209
+ fr: "Accueil",
210
+ }),
211
+ },
212
+ meta: {
213
+ description: t({
214
+ en: "Este es un ejemplo de uso de Intlayer con TanStack Router",
215
+ es: "Este es un ejemplo de uso de Intlayer con TanStack Router",
216
+ fr: "Ceci est un exemple d'utilisation d'Intlayer avec TanStack Router",
217
+ }),
218
+ },
118
219
  title: t({
119
- en: "TanStack Start + React",
120
- fr: "TanStack Start + React",
121
- es: "TanStack Start + React",
122
- }),
123
- count: t({ en: "count is ", fr: "le compte est ", es: "el recuento es " }),
124
- edit: t<ReactNode>({
125
- en: (
126
- <>
127
- Edita <code>src/routes/index.tsx</code> y guarda para probar HMR
128
- </>
129
- ),
130
- fr: (
131
- <>
132
- Éditez <code>src/routes/index.tsx</code> et enregistrez pour tester
133
- HMR
134
- </>
135
- ),
136
- es: (
137
- <>
138
- Edita <code>src/routes/index.tsx</code> y guarda para probar HMR
139
- </>
140
- ),
141
- }),
142
- readTheDocs: t({
143
- en: "Haz clic en los logotipos para saber más",
144
- fr: "Cliquez sur les logos pour en savoir plus",
145
- es: "Haz clic en los logotipos para saber más",
220
+ en: "Bienvenido a Intlayer + TanStack Router",
221
+ es: "Bienvenido a Intlayer + TanStack Router",
222
+ fr: "Bienvenue à Intlayer + TanStack Router",
146
223
  }),
147
224
  },
225
+ key: "app",
148
226
  } satisfies Dictionary;
149
227
 
150
228
  export default appContent;
151
229
  ```
152
230
 
153
- Las variantes JSON/ESM/CJS funcionan igual que en tu documento original.
231
+ > Tus declaraciones de contenido pueden definirse en cualquier parte de tu aplicación tan pronto como se incluyan en el directorio `contentDir` (por defecto, `./app`). Y deben coincidir con la extensión del archivo de declaración de contenido (por defecto, `.content.{json,ts,tsx,js,jsx,mjs,mjx,cjs,cjx}`).
154
232
 
155
- > ¿Contenido TSX? No olvides `import React from "react"` si tu configuración lo requiere.
233
+ > Para más detalles, consulta la [documentación de declaración de contenido](https://github.com/aymericzip/intlayer/blob/main/docs/docs/es/dictionary/get_started.md).
156
234
 
157
- ---
235
+ ### Paso 7: Crear Componentes y Hooks Sensibles al Idioma
158
236
 
159
- ## Paso 5: Envuelve TanStack Start con Intlayer
237
+ Crea un componente `LocalizedLink` para navegación sensible al idioma:
160
238
 
161
- Con TanStack Start, tu **ruta raíz** es el lugar adecuado para establecer proveedores.
239
+ ```tsx fileName="src/components/localized-link.tsx" codeFormat="typescript"
240
+ // src/components/localized-link.tsx
241
+ // eslint-disable-next-line no-restricted-imports
242
+ import { Link, type LinkProps } from "@tanstack/react-router";
243
+ import { getLocalizedUrl } from "intlayer";
244
+ import { useLocale } from "react-intlayer";
162
245
 
163
- ```tsx fileName="src/routes/__root.tsx"
164
- import {
165
- Outlet,
166
- createRootRoute,
167
- Link as RouterLink,
168
- } from "@tanstack/react-router";
169
- import { IntlayerProvider, useIntlayer } from "react-intlayer";
170
-
171
- function AppShell() {
172
- // Ejemplo de uso de un diccionario en el nivel superior:
173
- const content = useIntlayer("app");
246
+ type LocalizedLinkProps = {
247
+ to: string;
248
+ } & Omit<LinkProps, "to">;
174
249
 
175
- return (
176
- <div>
177
- <nav className="flex gap-3 p-3">
178
- <RouterLink to="/">Inicio</RouterLink>
179
- <RouterLink to="/about">Acerca de</RouterLink>
180
- </nav>
181
- <main className="p-6">
182
- <h1>{content.title}</h1>
183
- <Outlet />
184
- </main>
185
- </div>
186
- );
187
- }
250
+ export function LocalizedLink(props: LocalizedLinkProps) {
251
+ const { locale } = useLocale();
188
252
 
189
- export const Route = createRootRoute({
190
- component: () => (
191
- <IntlayerProvider>
192
- <AppShell />
193
- </IntlayerProvider>
194
- ),
195
- });
196
- ```
253
+ const isExternal = (to: string) => {
254
+ return /^(https?:)?\/\//.test(to);
255
+ };
197
256
 
198
- Luego usa tu contenido en las páginas:
257
+ const to = isExternal(props.to)
258
+ ? props.to
259
+ : getLocalizedUrl(props.to, locale);
199
260
 
200
- ```tsx fileName="src/routes/index.tsx"
201
- import { createFileRoute } from "@tanstack/react-router";
202
- import { useIntlayer } from "react-intlayer";
203
- import reactLogo from "../assets/react.svg";
204
-
205
- export const Route = createFileRoute("/")({
206
- component: () => {
207
- const content = useIntlayer("app");
208
- return (
209
- <>
210
- <button>{content.count}0</button>
211
- <p>{content.edit}</p>
212
- <img
213
- src={reactLogo}
214
- alt={content.reactLogo.value}
215
- width={48}
216
- height={48}
217
- />
218
- <p className="opacity-70">{content.readTheDocs}</p>
219
- </>
220
- );
221
- },
222
- });
261
+ return <Link {...props} to={to as LinkProps["to"]} />;
262
+ }
223
263
  ```
224
264
 
225
- > Los atributos de cadena (`alt`, `title`, `aria-label`, …) necesitan `.value`:
226
- >
227
- > ```jsx
228
- > <img alt={c.reactLogo.value} />
229
- > ```
265
+ Crea un hook `useLocalizedNavigate` para la navegación programática:
230
266
 
231
- ---
267
+ ```tsx fileName="src/hooks/useLocalizedNavigate.tsx" codeFormat="typescript"
268
+ // src/hooks/useLocalizedNavigate.tsx
269
+ // eslint-disable-next-line no-restricted-imports
270
+ import { NavigateOptions, useNavigate } from "@tanstack/react-router";
271
+ import { getLocalizedUrl } from "intlayer";
272
+ import { useLocale } from "react-intlayer";
232
273
 
233
- ## (Opcional) Paso 6: Cambio de idioma (Cliente)
274
+ type LocalizedNavigateOptions = {
275
+ to: string;
276
+ } & Omit<NavigateOptions, "to">;
234
277
 
235
- ```tsx fileName="src/components/LocaleSwitcher.tsx"
236
- import { Locales } from "intlayer";
237
- import { useLocale } from "react-intlayer";
278
+ export const useLocalizedNavigate = () => {
279
+ const navigate = useNavigate();
280
+ const { locale } = useLocale();
238
281
 
239
- export function LocaleSwitcher() {
240
- const { setLocale } = useLocale();
241
- return (
242
- <div className="flex gap-2">
243
- <button onClick={() => setLocale(Locales.ENGLISH)}>Inglés</button>
244
- <button onClick={() => setLocale(Locales.FRENCH)}>Francés</button>
245
- <button onClick={() => setLocale(Locales.SPANISH)}>Español</button>
246
- </div>
247
- );
248
- }
282
+ const isExternal = (to: string) => {
283
+ // Comprueba si la URL es externa
284
+ return /^(https?:)?\/\//.test(to);
285
+ };
286
+
287
+ const localizedNavigate = (options: LocalizedNavigateOptions) => {
288
+ const to = isExternal(options.to)
289
+ ? options.to
290
+ : getLocalizedUrl(options.to, locale);
291
+
292
+ navigate({ ...options, to: to as NavigateOptions["to"] });
293
+ };
294
+
295
+ return localizedNavigate;
296
+ };
249
297
  ```
250
298
 
251
- ---
299
+ ### Paso 8: Utiliza Intlayer en tus Páginas
252
300
 
253
- ## (Opcional) Paso 7: Enrutamiento localizado (URLs amigables para SEO)
301
+ Accede a tus diccionarios de contenido en toda tu aplicación:
254
302
 
255
- Tienes **dos buenos patrones** con TanStack Start. Elige uno.
303
+ #### Página de Redirección Raíz
256
304
 
257
- Crea una carpeta de segmento dinámico `src/routes/$locale/` para que tus URLs sean `/:locale/...`. En el layout `$locale`, valida el `params.locale`, configura `<IntlayerProvider locale=...>`, y renderiza un `<Outlet />`. Este enfoque es sencillo, pero montarás el resto de tus rutas debajo de `$locale`, y necesitarás un árbol adicional sin prefijo si _no_ quieres que la configuración regional predeterminada tenga prefijo.
305
+ ```tsx fileName="src/routes/page.tsx" codeFormat="typescript"
306
+ // src/routes/page.tsx
307
+ import { useLocale } from "react-intlayer";
308
+ import { Navigate } from "react-router";
258
309
 
259
- ---
310
+ export default function Page() {
311
+ const { locale } = useLocale();
260
312
 
261
- ## (Opcional) Paso 8: Actualizar la URL al cambiar de idioma
313
+ return <Navigate replace to={locale} />;
314
+ }
315
+ ```
262
316
 
263
- Con el Patrón A (basepath), cambiar de idioma significa **navegar a un basepath diferente**:
317
+ #### Página de Inicio Localizada
264
318
 
265
- ```tsx fileName="src/components/LocaleSwitcherNavigate.tsx"
266
- import { useRouter } from "@tanstack/react-router";
267
- import { Locales, getLocalizedUrl } from "intlayer";
268
- import { useLocale } from "react-intlayer";
319
+ ```tsx fileName="src/routes/{-$locale}/index.tsx" codeFormat="typescript"
320
+ import { createFileRoute } from "@tanstack/react-router";
321
+ import { getIntlayer } from "intlayer";
322
+ import { useIntlayer } from "react-intlayer";
269
323
 
270
- export function LocaleSwitcherNavigate() {
271
- const router = useRouter();
272
- const { locale, setLocale } = useLocale();
273
-
274
- const change = async (next: Locales) => {
275
- if (next === locale) return;
276
- const nextPath = getLocalizedUrl(
277
- window.location.pathname + window.location.search,
278
- next
279
- );
280
- await router.navigate({ to: nextPath }); // preserva el historial
281
- setLocale(next);
282
- };
324
+ import LocaleSwitcher from "@/components/locale-switcher";
325
+ import { LocalizedLink } from "@/components/localized-link";
326
+ import { useLocalizedNavigate } from "@/hooks/useLocalizedNavigate";
327
+
328
+ export const Route = createFileRoute("/{-$locale}/")({
329
+ component: RouteComponent,
330
+ head: ({ params }) => {
331
+ const { locale } = params;
332
+ const metaContent = getIntlayer("app", locale);
333
+
334
+ return {
335
+ meta: [
336
+ { title: metaContent.title },
337
+ { content: metaContent.meta.description, name: "description" },
338
+ ],
339
+ };
340
+ },
341
+ });
342
+
343
+ function RouteComponent() {
344
+ const content = useIntlayer("app");
345
+ const navigate = useLocalizedNavigate();
283
346
 
284
347
  return (
285
- <div className="flex gap-2">
286
- <button onClick={() => change(Locales.ENGLISH)}>English</button>
287
- <button onClick={() => change(Locales.FRENCH)}>Français</button>
288
- <button onClick={() => change(Locales.SPANISH)}>Español</button>
348
+ <div className="grid place-items-center h-screen">
349
+ <div className="flex flex-col gap-4 items-center text-center">
350
+ {content.title}
351
+ <LocaleSwitcher />
352
+ <div className="flex gap-4">
353
+ <a href="/">Índice</a>
354
+ <LocalizedLink to="/">{content.links.home}</LocalizedLink>
355
+ <LocalizedLink to="/about">{content.links.about}</LocalizedLink>
356
+ </div>
357
+ <div className="flex gap-4">
358
+ <button onClick={() => navigate({ to: "/" })}>
359
+ {content.links.home}
360
+ </button>
361
+ <button onClick={() => navigate({ to: "/about" })}>
362
+ {content.links.about}
363
+ </button>
364
+ </div>
365
+ </div>
289
366
  </div>
290
367
  );
291
368
  }
292
369
  ```
293
370
 
294
- ---
371
+ > Para aprender más sobre el hook `useIntlayer`, consulta la [documentación](https://github.com/aymericzip/intlayer/blob/main/docs/docs/es/packages/react-intlayer/useIntlayer.md).
295
372
 
296
- ## (Opcional) Paso 9: `<html lang>` y `dir` (Documento TanStack Start)
373
+ ### Paso 9: Crear un Componente para Cambiar de Idioma
297
374
 
298
- TanStack Start expone un **Documento** (envoltorio raíz HTML) que puedes personalizar. Configura `lang` y `dir` para accesibilidad/SEO:
375
+ Crea un componente para permitir a los usuarios cambiar de idioma:
299
376
 
300
- ```tsx fileName="src/routes/__root.tsx" {4,15}
301
- import { Outlet, createRootRoute } from "@tanstack/react-router";
302
- import { IntlayerProvider } from "react-intlayer";
303
- import { getHTMLTextDir } from "intlayer";
377
+ ```tsx fileName="src/components/locale-switcher.tsx" codeFormat="typescript"
378
+ import { useLocation } from "@tanstack/react-router";
379
+ import {
380
+ getHTMLTextDir,
381
+ getLocaleName,
382
+ getLocalizedUrl,
383
+ Locales,
384
+ } from "intlayer";
385
+ import { useIntlayer, useLocale } from "react-intlayer";
386
+
387
+ export default function LocaleSwitcher() {
388
+ const { pathname, searchStr } = useLocation();
389
+ const content = useIntlayer("locale-switcher");
390
+
391
+ const { availableLocales, locale, setLocale } = useLocale({
392
+ onLocaleChange: (newLocale) => {
393
+ const pathWithLocale = getLocalizedUrl(pathname + searchStr, newLocale);
394
+ location.replace(pathWithLocale);
395
+ },
396
+ });
304
397
 
305
- function Document({
306
- locale,
307
- children,
308
- }: {
309
- locale: string;
310
- children: React.ReactNode;
311
- }) {
312
398
  return (
313
- <html lang={locale} dir={getHTMLTextDir(locale)}>
314
- <head>
315
- <meta charSet="utf-8" />
316
- <meta name="viewport" content="width=device-width, initial-scale=1" />
317
- {/* ... */}
318
- </head>
319
- <body>{children}</body>
320
- </html>
399
+ <select
400
+ aria-label={content.label.toString()}
401
+ onChange={(e) => setLocale(e.target.value)}
402
+ value={locale}
403
+ >
404
+ {availableLocales.map((localeItem) => (
405
+ <option
406
+ dir={getHTMLTextDir(localeItem)}
407
+ key={localeItem}
408
+ lang={localeItem}
409
+ value={localeItem}
410
+ >
411
+ {/* Ejemplo: Français (Francés) */}
412
+ {getLocaleName(localeItem, locale)} (
413
+ {getLocaleName(localeItem, Locales.ENGLISH)})
414
+ </option>
415
+ ))}
416
+ </select>
321
417
  );
322
418
  }
323
-
324
- export const Route = createRootRoute({
325
- component: () => (
326
- <IntlayerProvider>
327
- {/* Si calculas el locale en el servidor, pásalo al Document; de lo contrario, el cliente lo corregirá después de la hidratación */}
328
- <Document locale={document?.documentElement?.lang || "en"}>
329
- <Outlet />
330
- </Document>
331
- </IntlayerProvider>
332
- ),
333
- });
334
419
  ```
335
420
 
336
- Para la corrección del lado del cliente, también puedes mantener tu pequeño hook:
421
+ > Para aprender más sobre el hook `useLocale`, consulta la [documentación](https://github.com/aymericzip/intlayer/blob/main/docs/docs/es/packages/react-intlayer/useLocale.md).
422
+
423
+ ### Paso 10: Añadir gestión de atributos HTML (Opcional)
424
+
425
+ Crea un hook para gestionar los atributos lang y dir en HTML:
337
426
 
338
- ```tsx fileName="src/hooks/useI18nHTMLAttributes.tsx"
427
+ ```tsx fileName="src/hooks/useI18nHTMLAttributes.tsx" codeFormat="typescript"
428
+ // src/hooks/useI18nHTMLAttributes.tsx
429
+ import { getHTMLTextDir } from "intlayer";
339
430
  import { useEffect } from "react";
340
431
  import { useLocale } from "react-intlayer";
341
- import { getHTMLTextDir } from "intlayer";
342
432
 
343
433
  export const useI18nHTMLAttributes = () => {
344
434
  const { locale } = useLocale();
435
+
345
436
  useEffect(() => {
346
437
  document.documentElement.lang = locale;
347
438
  document.documentElement.dir = getHTMLTextDir(locale);
@@ -349,87 +440,185 @@ export const useI18nHTMLAttributes = () => {
349
440
  };
350
441
  ```
351
442
 
352
- ---
443
+ Luego úsalo en tu componente raíz:
353
444
 
354
- ## (Opcional) Paso 10: Componente Link localizado
445
+ ```tsx fileName="src/routes/{-$locale}/index.tsx" codeFormat="typescript"
446
+ import { createFileRoute, Navigate, Outlet } from "@tanstack/react-router";
447
+ import { configuration } from "intlayer";
448
+ import { IntlayerProvider, useLocale } from "react-intlayer";
355
449
 
356
- TanStack Router proporciona un `<Link/>`, pero si alguna vez necesitas un `<a>` simple que añada automáticamente el prefijo a las URLs internas:
450
+ import { useI18nHTMLAttributes } from "@/hooks/useI18nHTMLAttributes"; // importar el hook
357
451
 
358
- ```tsx fileName="src/components/Link.tsx"
359
- import { getLocalizedUrl } from "intlayer";
360
- import {
361
- forwardRef,
362
- type AnchorHTMLAttributes,
363
- type DetailedHTMLProps,
364
- } from "react";
365
- import { useLocale } from "react.intlayer";
366
-
367
- export interface LinkProps
368
- extends DetailedHTMLProps<
369
- AnchorHTMLAttributes<HTMLAnchorElement>,
370
- HTMLAnchorElement
371
- > {}
372
-
373
- const isExternal = (href?: string) => /^https?:\/\//.test(href ?? "");
374
-
375
- export const Link = forwardRef<HTMLAnchorElement, LinkProps>(
376
- ({ href, children, ...props }, ref) => {
377
- const { locale } = useLocale();
378
- const hrefI18n =
379
- href && !isExternal(href) ? getLocalizedUrl(href, locale) : href;
380
- return (
381
- <a href={hrefI18n} ref={ref} {...props}>
382
- {children}
383
- </a>
384
- );
385
- }
386
- );
387
- Link.displayName = "Link";
452
+ export const Route = createFileRoute("/{-$locale}")({
453
+ component: LayoutComponent,
454
+ });
455
+
456
+ function LayoutComponent() {
457
+ useI18nHTMLAttributes(); // agregar esta línea
458
+
459
+ const { locale } = Route.useParams();
460
+
461
+ return (
462
+ <IntlayerProvider locale={locale}>
463
+ <Outlet />
464
+ </IntlayerProvider>
465
+ );
466
+ }
388
467
  ```
389
468
 
390
- > Si usas el Patrón A (basepath), el `<Link to="/about" />` de TanStack ya resuelve a `/fr/about` mediante `basepath`, por lo que un enlace personalizado es opcional.
469
+ ### Paso 11: Construye y Ejecuta Tu Aplicación
391
470
 
392
- ---
471
+ Construye los diccionarios de contenido y ejecuta tu aplicación:
472
+
473
+ ```bash packageManager="npm"
474
+ # Construir diccionarios de Intlayer
475
+ npm run intlayer:build
393
476
 
394
- ## TypeScript
477
+ # Iniciar servidor de desarrollo
478
+ npm run dev
479
+ ```
480
+
481
+ ```bash packageManager="pnpm"
482
+ # Construir diccionarios de Intlayer
483
+ pnpm intlayer:build
484
+
485
+ # Iniciar servidor de desarrollo
486
+ pnpm dev
487
+ ```
488
+
489
+ ```bash packageManager="yarn"
490
+ # Construir diccionarios de Intlayer
491
+ yarn intlayer:build
395
492
 
396
- Incluye los tipos generados por Intlayer:
493
+ # Iniciar servidor de desarrollo
494
+ yarn dev
495
+ ```
496
+
497
+ ### Paso 12: Configurar TypeScript (Opcional)
498
+
499
+ Intlayer utiliza la ampliación de módulos para aprovechar las ventajas de TypeScript y fortalecer tu base de código.
500
+
501
+ Asegúrate de que tu configuración de TypeScript incluya los tipos autogenerados:
397
502
 
398
503
  ```json5 fileName="tsconfig.json"
399
504
  {
400
- "include": ["src", ".intlayer/**/*.ts"],
505
+ compilerOptions: {
506
+ // ... tus configuraciones existentes de TypeScript
507
+ },
508
+ include: [
509
+ // ... tus inclusiones existentes
510
+ ".intlayer/**/*.ts", // Incluir los tipos autogenerados
511
+ ],
401
512
  }
402
513
  ```
403
514
 
404
- ---
515
+ ### Configuración de Git
405
516
 
406
- ## Git
517
+ Se recomienda ignorar los archivos generados por Intlayer. Esto te permite evitar comprometerlos en tu repositorio Git.
407
518
 
408
- Ignora los artefactos generados por Intlayer:
519
+ Para hacerlo, puedes agregar las siguientes instrucciones a tu archivo `.gitignore`:
409
520
 
410
- ```gitignore
521
+ ```plaintext fileName=".gitignore"
522
+ # Ignorar los archivos generados por Intlayer
411
523
  .intlayer
412
524
  ```
413
525
 
414
526
  ---
415
527
 
416
- ## Extensión de VS Code
528
+ ### Paso 13: Crear Redirección (Opcional)
529
+
530
+ ```typescript fileName="src/routes/{-$locale}/rotue.tsx" codeFormat="typescript"
531
+ function LayoutComponent() {
532
+ useI18nHTMLAttributes();
533
+
534
+ const { locale } = Route.useParams();
535
+ const { locale: selectedLocale } = useLocale();
536
+ const { defaultLocale } = configuration.internationalization;
537
+ const { prefixDefault } = configuration.middleware;
538
+
539
+ // Redirigir a la configuración regional predeterminada si no hay configuración regional en la URL cuando prefixDefault es verdadero
540
+ if (selectedLocale === defaultLocale && !locale && prefixDefault) {
541
+ return <Navigate replace to={defaultLocale} />;
542
+ }
417
543
 
418
- - **Extensión Intlayer para VS Code** autocompletado, errores, vistas previas en línea, acciones rápidas.
419
- Marketplace: `intlayer.intlayer-vs-code-extension`
544
+ // Redirigir a la configuración regional seleccionada si la configuración regional en la URL no coincide con la seleccionada
545
+ if (selectedLocale !== defaultLocale && !locale) {
546
+ return <Navigate replace to={selectedLocale} />;
547
+ }
548
+
549
+ return (
550
+ <IntlayerProvider locale={locale}>
551
+ <Outlet />
552
+ </IntlayerProvider>
553
+ );
554
+ }
555
+ ```
556
+
557
+ ## Despliegue en Producción
558
+
559
+ Al desplegar tu aplicación:
560
+
561
+ 1. **Construye tu aplicación:**
562
+
563
+ ```bash
564
+ npm run build
565
+ ```
566
+
567
+ 2. **Construye los diccionarios de Intlayer:**
568
+
569
+ ```bash
570
+ npm run intlayer:build
571
+ ```
572
+
573
+ 3. **Mueve `vite-intlayer` a las dependencias** si usas middleware en producción:
574
+ ```bash
575
+ npm install vite-intlayer --save
576
+ ```
577
+
578
+ Tu aplicación ahora soportará:
579
+
580
+ - **Estructura de URL**: `/en`, `/en/about`, `/tr`, `/tr/about`
581
+ - **Detección automática de locale** basada en las preferencias del navegador
582
+ - **Ruteo consciente del locale** con Tanstack Start
583
+ - **Soporte para TypeScript** con tipos generados automáticamente
584
+ - **Renderizado del lado servidor** con manejo adecuado del locale
585
+
586
+ ## Extensión para VS Code
587
+
588
+ Para mejorar tu experiencia de desarrollo con Intlayer, puedes instalar la extensión oficial **Intlayer VS Code Extension**.
589
+
590
+ [Instalar desde el Marketplace de VS Code](https://marketplace.visualstudio.com/items?itemName=intlayer.intlayer-vs-code-extension)
591
+
592
+ Esta extensión ofrece:
593
+
594
+ - **Autocompletado** para las claves de traducción.
595
+ - **Detección de errores en tiempo real** para traducciones faltantes.
596
+ - **Vistas previas en línea** del contenido traducido.
597
+ - **Acciones rápidas** para crear y actualizar traducciones fácilmente.
598
+
599
+ Para más detalles sobre cómo usar la extensión, consulta la [documentación de la extensión Intlayer para VS Code](https://intlayer.org/doc/vs-code-extension).
420
600
 
421
601
  ---
422
602
 
423
603
  ## Ir Más Allá
424
604
 
425
- - Editor Visual
426
- - Modo CMS
427
- - Detección de locale en el edge / adaptadores
605
+ Para profundizar, puedes implementar el [editor visual](https://github.com/aymericzip/intlayer/blob/main/docs/docs/es/intlayer_visual_editor.md) o externalizar tu contenido usando el [CMS](https://github.com/aymericzip/intlayer/blob/main/docs/docs/es/intlayer_CMS.md).
428
606
 
429
607
  ---
430
608
 
431
- ## Historial de Documentación
609
+ ## Referencias de la Documentación
610
+
611
+ - [Documentación de Intlayer](https://intlayer.org)
612
+ - [Documentación de Tanstack Start](https://reactrouter.com/)
613
+ - [Hook useIntlayer](https://github.com/aymericzip/intlayer/blob/main/docs/docs/es/packages/react-intlayer/useIntlayer.md)
614
+ - [Hook useLocale](https://github.com/aymericzip/intlayer/blob/main/docs/docs/es/packages/react-intlayer/useLocale.md)
615
+ - [Declaración de Contenido](https://github.com/aymericzip/intlayer/blob/main/docs/docs/es/dictionary/get_started.md)
616
+ - [Configuración](https://github.com/aymericzip/intlayer/blob/main/docs/docs/es/configuration.md)
617
+
618
+ Esta guía completa proporciona todo lo que necesitas para integrar Intlayer con Tanstack Start para una aplicación completamente internacionalizada con enrutamiento consciente del locale y soporte para TypeScript.
619
+
620
+ ## Historial de la Documentación
432
621
 
433
- | Versión | Fecha | Cambios |
434
- | ------- | ---------- | -------------------------------------- |
435
- | 1.0.0 | 2025-08-11 | Adaptación inicial de TanStack añadida |
622
+ | Versión | Fecha | Cambios |
623
+ | ------- | ---------- | --------------------------- |
624
+ | 5.8.1 | 2025-09-09 | Añadido para Tanstack Start |