@intlayer/docs 5.7.8 → 5.8.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 (297) hide show
  1. package/blog/ar/intlayer_with_next-i18next.md +5 -6
  2. package/blog/ar/intlayer_with_next-intl.md +3 -4
  3. package/blog/ar/intlayer_with_react-i18next.md +1 -1
  4. package/blog/ar/intlayer_with_react-intl.md +1 -1
  5. package/blog/ar/next-i18next_vs_next-intl_vs_intlayer.md +96 -219
  6. package/blog/ar/react-i18next_vs_react-intl_vs_intlayer.md +88 -129
  7. package/blog/ar/vue-i18n_vs_intlayer.md +268 -0
  8. package/blog/de/intlayer_with_next-i18next.md +5 -6
  9. package/blog/de/intlayer_with_react-intl.md +1 -1
  10. package/blog/de/next-i18next_vs_next-intl_vs_intlayer.md +93 -216
  11. package/blog/de/react-i18next_vs_react-intl_vs_intlayer.md +87 -128
  12. package/blog/de/vue-i18n_vs_intlayer.md +268 -0
  13. package/blog/en/intlayer_with_next-i18next.md +5 -6
  14. package/blog/en/intlayer_with_next-intl.md +3 -4
  15. package/blog/en/intlayer_with_react-i18next.md +1 -1
  16. package/blog/en/intlayer_with_react-intl.md +1 -1
  17. package/blog/en/next-i18next_vs_next-intl_vs_intlayer.md +89 -220
  18. package/blog/en/react-i18next_vs_react-intl_vs_intlayer.md +85 -123
  19. package/blog/en/vue-i18n_vs_intlayer.md +268 -0
  20. package/blog/en-GB/intlayer_with_next-i18next.md +5 -6
  21. package/blog/en-GB/intlayer_with_next-intl.md +3 -4
  22. package/blog/en-GB/intlayer_with_react-i18next.md +1 -1
  23. package/blog/en-GB/intlayer_with_react-intl.md +1 -1
  24. package/blog/en-GB/next-i18next_vs_next-intl_vs_intlayer.md +85 -218
  25. package/blog/en-GB/react-i18next_vs_react-intl_vs_intlayer.md +80 -130
  26. package/blog/en-GB/vue-i18n_vs_intlayer.md +258 -0
  27. package/blog/es/intlayer_with_next-i18next.md +5 -6
  28. package/blog/es/intlayer_with_next-intl.md +3 -4
  29. package/blog/es/intlayer_with_react-i18next.md +1 -1
  30. package/blog/es/intlayer_with_react-intl.md +1 -1
  31. package/blog/es/next-i18next_vs_next-intl_vs_intlayer.md +93 -216
  32. package/blog/es/react-i18next_vs_react-intl_vs_intlayer.md +87 -128
  33. package/blog/es/vue-i18n_vs_intlayer.md +268 -0
  34. package/blog/fr/intlayer_with_next-i18next.md +5 -6
  35. package/blog/fr/intlayer_with_next-intl.md +3 -4
  36. package/blog/fr/intlayer_with_react-i18next.md +1 -1
  37. package/blog/fr/intlayer_with_react-intl.md +1 -1
  38. package/blog/fr/next-i18next_vs_next-intl_vs_intlayer.md +91 -214
  39. package/blog/fr/react-i18next_vs_react-intl_vs_intlayer.md +86 -127
  40. package/blog/fr/vue-i18n_vs_intlayer.md +269 -0
  41. package/blog/hi/intlayer_with_next-i18next.md +5 -6
  42. package/blog/hi/intlayer_with_next-intl.md +3 -4
  43. package/blog/hi/intlayer_with_react-i18next.md +1 -1
  44. package/blog/hi/intlayer_with_react-intl.md +1 -1
  45. package/blog/hi/next-i18next_vs_next-intl_vs_intlayer.md +97 -220
  46. package/blog/hi/react-i18next_vs_react-intl_vs_intlayer.md +89 -130
  47. package/blog/hi/vue-i18n_vs_intlayer.md +268 -0
  48. package/blog/it/intlayer_with_next-i18next.md +5 -6
  49. package/blog/it/intlayer_with_next-intl.md +3 -4
  50. package/blog/it/intlayer_with_react-i18next.md +1 -1
  51. package/blog/it/intlayer_with_react-intl.md +1 -1
  52. package/blog/it/next-i18next_vs_next-intl_vs_intlayer.md +91 -214
  53. package/blog/it/react-i18next_vs_react-intl_vs_intlayer.md +86 -127
  54. package/blog/it/vue-i18n_vs_intlayer.md +268 -0
  55. package/blog/ja/intlayer_with_next-i18next.md +5 -6
  56. package/blog/ja/intlayer_with_next-intl.md +3 -4
  57. package/blog/ja/intlayer_with_react-intl.md +1 -1
  58. package/blog/ja/next-i18next_vs_next-intl_vs_intlayer.md +93 -216
  59. package/blog/ja/react-i18next_vs_react-intl_vs_intlayer.md +87 -128
  60. package/blog/ja/vue-i18n_vs_intlayer.md +268 -0
  61. package/blog/ko/intlayer_with_next-i18next.md +5 -6
  62. package/blog/ko/intlayer_with_next-intl.md +3 -4
  63. package/blog/ko/intlayer_with_react-intl.md +1 -1
  64. package/blog/ko/next-i18next_vs_next-intl_vs_intlayer.md +95 -217
  65. package/blog/ko/react-i18next_vs_react-intl_vs_intlayer.md +89 -130
  66. package/blog/ko/vue-i18n_vs_intlayer.md +268 -0
  67. package/blog/pt/intlayer_with_next-i18next.md +5 -6
  68. package/blog/pt/intlayer_with_next-intl.md +3 -4
  69. package/blog/pt/intlayer_with_react-intl.md +1 -1
  70. package/blog/pt/next-i18next_vs_next-intl_vs_intlayer.md +93 -216
  71. package/blog/pt/react-i18next_vs_react-intl_vs_intlayer.md +87 -128
  72. package/blog/pt/vue-i18n_vs_intlayer.md +268 -0
  73. package/blog/ru/intlayer_with_next-i18next.md +5 -6
  74. package/blog/ru/intlayer_with_next-intl.md +3 -4
  75. package/blog/ru/intlayer_with_react-i18next.md +1 -1
  76. package/blog/ru/intlayer_with_react-intl.md +1 -1
  77. package/blog/ru/next-i18next_vs_next-intl_vs_intlayer.md +94 -217
  78. package/blog/ru/react-i18next_vs_react-intl_vs_intlayer.md +87 -128
  79. package/blog/ru/vue-i18n_vs_intlayer.md +268 -0
  80. package/blog/zh/intlayer_with_next-i18next.md +5 -6
  81. package/blog/zh/intlayer_with_next-intl.md +3 -4
  82. package/blog/zh/intlayer_with_react-i18next.md +1 -1
  83. package/blog/zh/intlayer_with_react-intl.md +1 -1
  84. package/blog/zh/next-i18next_vs_next-intl_vs_intlayer.md +93 -216
  85. package/blog/zh/react-i18next_vs_react-intl_vs_intlayer.md +87 -128
  86. package/blog/zh/vue-i18n_vs_intlayer.md +269 -0
  87. package/dist/cjs/generated/blog.entry.cjs +41 -0
  88. package/dist/cjs/generated/blog.entry.cjs.map +1 -1
  89. package/dist/cjs/generated/docs.entry.cjs +41 -0
  90. package/dist/cjs/generated/docs.entry.cjs.map +1 -1
  91. package/dist/esm/generated/blog.entry.mjs +41 -0
  92. package/dist/esm/generated/blog.entry.mjs.map +1 -1
  93. package/dist/esm/generated/docs.entry.mjs +41 -0
  94. package/dist/esm/generated/docs.entry.mjs.map +1 -1
  95. package/dist/types/generated/blog.entry.d.ts +1 -0
  96. package/dist/types/generated/blog.entry.d.ts.map +1 -1
  97. package/dist/types/generated/docs.entry.d.ts +1 -0
  98. package/dist/types/generated/docs.entry.d.ts.map +1 -1
  99. package/docs/ar/formatters.md +625 -0
  100. package/docs/ar/how_works_intlayer.md +2 -4
  101. package/docs/ar/interest_of_intlayer.md +159 -49
  102. package/docs/ar/intlayer_CMS.md +2 -3
  103. package/docs/ar/intlayer_visual_editor.md +2 -3
  104. package/docs/ar/intlayer_with_tanstack.md +1 -1
  105. package/docs/ar/introduction.md +7 -7
  106. package/docs/ar/packages/intlayer/index.md +3 -3
  107. package/docs/ar/packages/next-intlayer/index.md +3 -3
  108. package/docs/de/formatters.md +649 -0
  109. package/docs/de/interest_of_intlayer.md +161 -47
  110. package/docs/de/introduction.md +5 -5
  111. package/docs/de/packages/intlayer/index.md +3 -3
  112. package/docs/de/packages/next-intlayer/index.md +3 -3
  113. package/docs/de/packages/react-intlayer/index.md +3 -3
  114. package/docs/en/dictionary/enumeration.md +2 -2
  115. package/docs/en/dictionary/function_fetching.md +2 -2
  116. package/docs/en/dictionary/get_started.md +2 -2
  117. package/docs/en/dictionary/translation.md +2 -2
  118. package/docs/en/formatters.md +618 -0
  119. package/docs/en/how_works_intlayer.md +2 -4
  120. package/docs/en/interest_of_intlayer.md +170 -46
  121. package/docs/en/intlayer_CMS.md +2 -3
  122. package/docs/en/intlayer_visual_editor.md +2 -3
  123. package/docs/en/intlayer_with_create_react_app.md +2 -2
  124. package/docs/en/intlayer_with_express.md +2 -2
  125. package/docs/en/intlayer_with_tanstack.md +1 -1
  126. package/docs/en/introduction.md +7 -7
  127. package/docs/en/packages/express-intlayer/index.md +2 -2
  128. package/docs/en/packages/intlayer/getConfiguration.md +2 -3
  129. package/docs/en/packages/intlayer/getEnumeration.md +2 -7
  130. package/docs/en/packages/intlayer/getHTMLTextDir.md +2 -4
  131. package/docs/en/packages/intlayer/getLocaleLang.md +2 -4
  132. package/docs/en/packages/intlayer/getLocaleName.md +2 -3
  133. package/docs/en/packages/intlayer/getLocalizedUrl.md +2 -8
  134. package/docs/en/packages/intlayer/getMultilingualUrls.md +2 -7
  135. package/docs/en/packages/intlayer/getPathWithoutLocale.md +2 -3
  136. package/docs/en/packages/intlayer/getTranslation.md +2 -4
  137. package/docs/en/packages/intlayer/index.md +5 -5
  138. package/docs/en/packages/next-intlayer/index.md +5 -5
  139. package/docs/en/packages/next-intlayer/t.md +2 -2
  140. package/docs/en/packages/next-intlayer/useDictionary.md +2 -2
  141. package/docs/en/packages/next-intlayer/useIntlayer.md +2 -2
  142. package/docs/en/packages/next-intlayer/useLocale.md +2 -2
  143. package/docs/en/packages/react-intlayer/index.md +5 -5
  144. package/docs/en/packages/react-intlayer/t.md +2 -2
  145. package/docs/en/packages/react-intlayer/useI18n.md +2 -2
  146. package/docs/en/packages/react-intlayer/useIntlayer.md +2 -2
  147. package/docs/en/packages/react-intlayer/useLocale.md +2 -2
  148. package/docs/en/packages/react-scripts-intlayer/index.md +2 -2
  149. package/docs/en/packages/solid-intlayer/index.md +2 -2
  150. package/docs/en/packages/vite-intlayer/index.md +2 -2
  151. package/docs/en-GB/formatters.md +625 -0
  152. package/docs/en-GB/how_works_intlayer.md +2 -4
  153. package/docs/en-GB/interest_of_intlayer.md +157 -53
  154. package/docs/en-GB/intlayer_with_tanstack.md +1 -1
  155. package/docs/en-GB/introduction.md +2 -2
  156. package/docs/en-GB/packages/intlayer/index.md +3 -3
  157. package/docs/en-GB/packages/next-intlayer/index.md +3 -3
  158. package/docs/en-GB/packages/react-intlayer/index.md +3 -3
  159. package/docs/es/formatters.md +649 -0
  160. package/docs/es/how_works_intlayer.md +2 -4
  161. package/docs/es/interest_of_intlayer.md +156 -47
  162. package/docs/es/intlayer_with_tanstack.md +1 -1
  163. package/docs/es/introduction.md +5 -5
  164. package/docs/es/packages/intlayer/index.md +3 -3
  165. package/docs/es/packages/next-intlayer/index.md +3 -3
  166. package/docs/fr/formatters.md +649 -0
  167. package/docs/fr/how_works_intlayer.md +2 -4
  168. package/docs/fr/interest_of_intlayer.md +157 -46
  169. package/docs/fr/intlayer_with_tanstack.md +1 -1
  170. package/docs/fr/introduction.md +5 -5
  171. package/docs/fr/packages/intlayer/index.md +3 -3
  172. package/docs/fr/packages/next-intlayer/index.md +3 -3
  173. package/docs/fr/packages/react-intlayer/index.md +3 -3
  174. package/docs/hi/formatters.md +630 -0
  175. package/docs/hi/how_works_intlayer.md +2 -4
  176. package/docs/hi/interest_of_intlayer.md +155 -42
  177. package/docs/hi/intlayer_with_tanstack.md +1 -1
  178. package/docs/hi/introduction.md +5 -5
  179. package/docs/hi/packages/intlayer/index.md +3 -3
  180. package/docs/hi/packages/next-intlayer/index.md +3 -3
  181. package/docs/hi/packages/react-intlayer/index.md +3 -3
  182. package/docs/it/formatters.md +647 -0
  183. package/docs/it/how_works_intlayer.md +2 -4
  184. package/docs/it/interest_of_intlayer.md +157 -46
  185. package/docs/it/intlayer_with_tanstack.md +1 -1
  186. package/docs/it/introduction.md +5 -5
  187. package/docs/it/packages/intlayer/index.md +3 -3
  188. package/docs/it/packages/next-intlayer/index.md +3 -3
  189. package/docs/it/packages/react-intlayer/index.md +3 -3
  190. package/docs/ja/formatters.md +649 -0
  191. package/docs/ja/how_works_intlayer.md +2 -4
  192. package/docs/ja/interest_of_intlayer.md +154 -48
  193. package/docs/ja/intlayer_with_tanstack.md +1 -1
  194. package/docs/ja/introduction.md +5 -5
  195. package/docs/ja/packages/intlayer/index.md +3 -3
  196. package/docs/ja/packages/next-intlayer/index.md +3 -3
  197. package/docs/ja/packages/react-intlayer/index.md +3 -3
  198. package/docs/ko/formatters.md +649 -0
  199. package/docs/ko/how_works_intlayer.md +2 -4
  200. package/docs/ko/interest_of_intlayer.md +157 -48
  201. package/docs/ko/intlayer_with_tanstack.md +1 -1
  202. package/docs/ko/introduction.md +5 -5
  203. package/docs/ko/packages/intlayer/index.md +3 -3
  204. package/docs/ko/packages/next-intlayer/index.md +3 -3
  205. package/docs/ko/packages/react-intlayer/index.md +3 -3
  206. package/docs/pt/formatters.md +625 -0
  207. package/docs/pt/how_works_intlayer.md +2 -4
  208. package/docs/pt/interest_of_intlayer.md +162 -47
  209. package/docs/pt/intlayer_with_tanstack.md +1 -1
  210. package/docs/pt/introduction.md +5 -5
  211. package/docs/pt/packages/intlayer/index.md +3 -3
  212. package/docs/pt/packages/next-intlayer/index.md +3 -3
  213. package/docs/pt/packages/react-intlayer/index.md +3 -3
  214. package/docs/ru/autoFill.md +2 -2
  215. package/docs/ru/configuration.md +1 -40
  216. package/docs/ru/formatters.md +649 -0
  217. package/docs/ru/how_works_intlayer.md +5 -7
  218. package/docs/ru/index.md +1 -1
  219. package/docs/ru/interest_of_intlayer.md +165 -50
  220. package/docs/ru/intlayer_CMS.md +7 -8
  221. package/docs/ru/intlayer_cli.md +4 -7
  222. package/docs/ru/intlayer_visual_editor.md +5 -6
  223. package/docs/ru/intlayer_with_angular.md +1 -1
  224. package/docs/ru/intlayer_with_create_react_app.md +5 -5
  225. package/docs/ru/intlayer_with_lynx+react.md +1 -1
  226. package/docs/ru/intlayer_with_nextjs_15.md +3 -3
  227. package/docs/ru/intlayer_with_nextjs_page_router.md +2 -2
  228. package/docs/ru/intlayer_with_nuxt.md +1 -1
  229. package/docs/ru/intlayer_with_react_native+expo.md +2 -2
  230. package/docs/ru/intlayer_with_tanstack.md +3 -3
  231. package/docs/ru/intlayer_with_vite+preact.md +3 -3
  232. package/docs/ru/intlayer_with_vite+react.md +3 -3
  233. package/docs/ru/intlayer_with_vite+solid.md +1 -1
  234. package/docs/ru/intlayer_with_vite+svelte.md +1 -1
  235. package/docs/ru/intlayer_with_vite+vue.md +2 -2
  236. package/docs/ru/introduction.md +8 -8
  237. package/docs/ru/locale_mapper.md +1 -1
  238. package/docs/ru/packages/@intlayer/api/index.md +2 -2
  239. package/docs/ru/packages/@intlayer/chokidar/index.md +1 -1
  240. package/docs/ru/packages/@intlayer/cli/index.md +2 -2
  241. package/docs/ru/packages/@intlayer/config/index.md +2 -2
  242. package/docs/ru/packages/@intlayer/core/index.md +2 -2
  243. package/docs/ru/packages/@intlayer/design-system/index.md +2 -2
  244. package/docs/ru/packages/@intlayer/dictionary-entry/index.md +2 -2
  245. package/docs/ru/packages/@intlayer/editor/index.md +1 -1
  246. package/docs/ru/packages/@intlayer/editor-react/index.md +1 -1
  247. package/docs/ru/packages/@intlayer/webpack/index.md +1 -1
  248. package/docs/ru/packages/angular-intlayer/index.md +1 -1
  249. package/docs/ru/packages/express-intlayer/index.md +3 -3
  250. package/docs/ru/packages/express-intlayer/t.md +1 -1
  251. package/docs/ru/packages/intlayer/getEnumeration.md +3 -8
  252. package/docs/ru/packages/intlayer/getTranslation.md +3 -5
  253. package/docs/ru/packages/intlayer/getTranslationContent.md +1 -3
  254. package/docs/ru/packages/intlayer/index.md +6 -6
  255. package/docs/ru/packages/intlayer-cli/index.md +1 -1
  256. package/docs/ru/packages/intlayer-editor/index.md +2 -2
  257. package/docs/ru/packages/lynx-intlayer/index.md +1 -1
  258. package/docs/ru/packages/next-intlayer/index.md +7 -7
  259. package/docs/ru/packages/next-intlayer/t.md +4 -4
  260. package/docs/ru/packages/next-intlayer/useLocale.md +3 -3
  261. package/docs/ru/packages/nuxt-intlayer/index.md +1 -1
  262. package/docs/ru/packages/preact-intlayer/index.md +1 -1
  263. package/docs/ru/packages/react-intlayer/index.md +7 -7
  264. package/docs/ru/packages/react-intlayer/t.md +4 -4
  265. package/docs/ru/packages/react-native-intlayer/index.md +1 -1
  266. package/docs/ru/packages/react-scripts-intlayer/index.md +3 -3
  267. package/docs/ru/packages/solid-intlayer/index.md +3 -3
  268. package/docs/ru/packages/svelte-intlayer/index.md +1 -1
  269. package/docs/ru/packages/vite-intlayer/index.md +3 -3
  270. package/docs/ru/packages/vue-intlayer/index.md +1 -1
  271. package/docs/ru/per_locale_file.md +1 -1
  272. package/docs/ru/roadmap.md +3 -5
  273. package/docs/ru/vs_code_extension.md +1 -1
  274. package/docs/zh/formatters.md +647 -0
  275. package/docs/zh/how_works_intlayer.md +2 -4
  276. package/docs/zh/interest_of_intlayer.md +155 -48
  277. package/docs/zh/intlayer_with_tanstack.md +1 -1
  278. package/docs/zh/introduction.md +5 -5
  279. package/docs/zh/packages/intlayer/index.md +3 -3
  280. package/docs/zh/packages/next-intlayer/index.md +3 -3
  281. package/docs/zh/packages/react-intlayer/index.md +3 -3
  282. package/frequent_questions/ar/domain_routing.md +1 -1
  283. package/frequent_questions/en/domain_routing.md +1 -1
  284. package/frequent_questions/en-GB/domain_routing.md +1 -1
  285. package/frequent_questions/es/domain_routing.md +1 -1
  286. package/frequent_questions/fr/domain_routing.md +1 -1
  287. package/frequent_questions/hi/domain_routing.md +1 -1
  288. package/frequent_questions/it/domain_routing.md +1 -1
  289. package/frequent_questions/ko/domain_routing.md +1 -1
  290. package/frequent_questions/pt/domain_routing.md +1 -1
  291. package/frequent_questions/ru/domain_routing.md +1 -1
  292. package/frequent_questions/ru/get_locale_cookie.md +4 -4
  293. package/frequent_questions/ru/static_rendering.md +1 -2
  294. package/frequent_questions/zh/domain_routing.md +1 -1
  295. package/package.json +11 -11
  296. package/src/generated/blog.entry.ts +41 -0
  297. package/src/generated/docs.entry.ts +41 -0
@@ -1,14 +1,14 @@
1
1
  ---
2
2
  createdAt: 2025-01-02
3
3
  updatedAt: 2025-06-29
4
- title: react-i18n vs react-intl vs Intlayer
5
- description: Integra react-i18next con next-intl y Intlayer para la internacionalización (i18n) de una aplicación React
4
+ title: react-i18next vs react-intl vs Intlayer
5
+ description: Integrar react-i18next con next-intl e Intlayer para la internacionalización (i18n) de una aplicación React
6
6
  keywords:
7
7
  - next-intl
8
8
  - react-i18next
9
9
  - Intlayer
10
10
  - Internacionalización
11
- - Blogumentación
11
+ - Blog
12
12
  - Next.js
13
13
  - JavaScript
14
14
  - React
@@ -17,178 +17,137 @@ slugs:
17
17
  - react-i18next-vs-react-intl-vs-intlayer
18
18
  ---
19
19
 
20
- # React-Intl VS React-i18next VS Intlayer | React Internationalization (i18n)
20
+ # react-Intl VS react-i18next VS intlayer | Internacionalización (i18n) en React
21
21
 
22
- A continuación se presenta una comparación concisa de tres bibliotecas populares de i18n (internacionalización) para React: **React-Intl**, **React-i18next** e **Intlayer**. Cada biblioteca ofrece características y flujos de trabajo únicos para integrar el soporte multilingüe en su aplicación React. Después de leer esto, debería poder decidir cuál solución se adapta mejor a sus necesidades.
22
+ Esta guía compara tres opciones consolidadas de i18n para **React**: **react-intl** (FormatJS), **react-i18next** (i18next) y **Intlayer**.
23
+ Nos centramos en aplicaciones de **React puro** (por ejemplo, Vite, CRA, SPA). Si usas Next.js, consulta nuestra comparación dedicada a Next.js.
23
24
 
24
- ---
25
-
26
- ## 1. Introducción
27
-
28
- La internacionalización (i18n) en aplicaciones React se puede lograr de múltiples maneras. Las tres bibliotecas presentadas aquí tienen diferentes filosofías de diseño, conjuntos de características y soporte comunitario:
25
+ Evaluamos:
29
26
 
30
- 1. **React-Intl**
31
- 2. **React-i18next**
32
- 3. **Intlayer**
27
+ - Arquitectura y organización del contenido
28
+ - TypeScript y seguridad
29
+ - Manejo de traducciones faltantes
30
+ - Contenido enriquecido y capacidades de formato
31
+ - Rendimiento y comportamiento de carga
32
+ - Experiencia del desarrollador (DX), herramientas y mantenimiento
33
+ - SEO/ruteo (dependiente del framework)
33
34
 
34
- A continuación, encontrará una descripción general de cada solución, seguida de una comparación de características, pros y contras, y casos de uso de ejemplo.
35
+ > **resumen**: Los tres pueden localizar una aplicación React. Si quieres **contenido con alcance por componente**, **tipos estrictos en TypeScript**, **verificaciones de claves faltantes en tiempo de compilación**, **diccionarios optimizados por tree-shaking** y herramientas editoriales integradas (Editor Visual/CMS + traducción asistida por IA opcional), **Intlayer** es la opción más completa para bases de código React modulares.
35
36
 
36
37
  ---
37
38
 
38
- ## 2. React-Intl
39
-
40
- ### Descripción General
41
-
42
- [**React-Intl**](https://formatjs.io/docs/react-intl/) es parte de la suite [FormatJS](https://formatjs.io/). Proporciona un conjunto poderoso de **APIs y componentes** para manejar el formato de mensajes, pluralización, fechas/hora y formateo de números. React-Intl es ampliamente utilizado en aplicaciones empresariales, principalmente porque es parte de un ecosistema que estandariza la sintaxis y el formato de los mensajes.
43
-
44
- ### Características Clave
45
-
46
- - **Sintaxis de Mensaje ICU**: Ofrece una sintaxis integral para interpolación de mensajes, pluralización y más.
47
- - **Formateo Localizado**: Utilidades integradas para formatear fechas, horas, números y tiempos relativos según la localidad.
48
- - **Componentes Declarativos**: Expone `<FormattedMessage>`, `<FormattedNumber>`, `<FormattedDate>`, etc., para un uso sin problemas en JSX.
49
- - **Rico Ecosistema**: Se integra bien con las herramientas de FormatJS (por ejemplo, [babel-plugin-react-intl](https://formatjs.io/docs/tooling/babel-plugin/) ) para extraer, gestionar y compilar mensajes.
50
-
51
- ### Flujo de Trabajo Típico
52
-
53
- 1. **Definir catálogos de mensajes** (normalmente archivos JSON por localidad).
54
- 2. **Wrap su aplicación** en `<IntlProvider locale="en" messages={messages}>`.
55
- 3. **Usar** `<FormattedMessage id="myMessage" defaultMessage="Hello world" />` o el hook `useIntl()` para acceder a las cadenas de traducción.
56
-
57
- ### Pros
58
-
59
- - Bien establecido y utilizado en muchos entornos de producción.
60
- - Formateo de mensajes avanzado, incluida la pluralización, género, zonas horarias y más.
61
- - Fuerte soporte de herramientas para la extracción y compilación de mensajes.
62
-
63
- ### Contras
39
+ ## Posicionamiento a alto nivel
64
40
 
65
- - Requiere familiaridad con el **formato de mensaje ICU**, que puede ser extenso.
66
- - No es tan sencillo manejar traducciones dinámicas o complejas que son más que solo texto.
41
+ - **react-intl** - Formateo basado en ICU y alineado con estándares (fechas/números/plurales) con una API madura. Los catálogos suelen estar centralizados; la seguridad de las claves y la validación en tiempo de compilación dependen en gran medida de ti.
42
+ - **react-i18next** - Extremadamente popular y flexible; namespaces, detectores y muchos plugins (ICU, backends). Potente, pero la configuración puede expandirse a medida que los proyectos crecen.
43
+ - **Intlayer** - Modelo de contenido centrado en componentes para React, **tipado estricto en TS**, **verificaciones en tiempo de compilación**, **tree-shaking**, además de **Editor Visual/CMS** y **traducciones asistidas por IA**. Funciona con React Router, Vite, CRA, etc.
67
44
 
68
45
  ---
69
46
 
70
- ## 3. React-i18next
47
+ ## Matriz de características (enfoque React)
48
+
49
+ | Característica | `react-intlayer` (Intlayer) | `react-i18next` (i18next) | `react-intl` (FormatJS) |
50
+ | ---------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------ |
51
+ | **Traducciones Cerca de los Componentes** | ✅ Sí, contenido ubicado junto a cada componente | ❌ No | ❌ No |
52
+ | **Integración con TypeScript** | ✅ Avanzada, tipos estrictos generados automáticamente | ⚠️ Básica; configuración extra para seguridad | ✅ Buena, pero menos estricta |
53
+ | **Detección de Traducciones Faltantes** | ✅ Resaltado de errores en TypeScript y error/advertencia en tiempo de compilación | ⚠️ Principalmente cadenas de reserva en tiempo de ejecución | ⚠️ Cadenas de reserva |
54
+ | **Contenido Enriquecido (JSX/Markdown/componentes)** | ✅ Soporte directo | ⚠️ Limitado / solo interpolación | ⚠️ Sintaxis ICU, no JSX real |
55
+ | **Traducción impulsada por IA** | ✅ Sí, soporta múltiples proveedores de IA. Usable con tus propias claves API. Considera el contexto de tu aplicación y el alcance del contenido | ❌ No | ❌ No |
56
+ | **Editor Visual** | ✅ Sí, Editor Visual local + CMS opcional; puede externalizar contenido de la base de código; embebible | ❌ No / disponible a través de plataformas externas de localización | ❌ No / disponible a través de plataformas externas de localización |
57
+ | **Enrutamiento Localizado** | ✅ Sí, soporta rutas localizadas desde el inicio (funciona con Next.js y Vite) | ⚠️ No incorporado, requiere plugins (p. ej. `next-i18next`) o configuración personalizada del enrutador | ❌ No, solo formateo de mensajes, el enrutamiento debe ser manual |
58
+ | **Generación Dinámica de Rutas** | ✅ Sí | ⚠️ Plugin/ecosistema o configuración manual | ❌ No proporcionado |
59
+ | **Pluralización** | ✅ Patrones basados en enumeraciones | ✅ Configurable (plugins como i18next-icu) | ✅ (ICU) |
60
+ | **Formateo (fechas, números, monedas)** | ✅ Formateadores optimizados (Intl en el núcleo) | ⚠️ A través de plugins o uso personalizado de Intl | ✅ Formateadores ICU |
61
+ | **Formato de contenido** | ✅ .tsx, .ts, .js, .json, .md, .txt, (.yaml en desarrollo) | ⚠️ .json | ✅ .json, .js |
62
+ | **Soporte ICU** | ⚠️ En desarrollo | ⚠️ A través de plugin (i18next-icu) | ✅ Sí |
63
+ | **Ayudantes SEO (hreflang, sitemap)** | ✅ Herramientas integradas: ayudantes para sitemap, robots.txt, metadatos | ⚠️ Plugins comunitarios/manual | ❌ No es núcleo |
64
+ | **Ecosistema / Comunidad** | ⚠️ Más pequeño pero creciendo rápido y reactivo | ✅ Más grande y maduro | ✅ Grande |
65
+ | **Renderizado del lado del servidor y Componentes del Servidor** | ✅ Sí, optimizado para SSR / Componentes del Servidor de React | ⚠️ Soportado a nivel de página pero es necesario pasar funciones t en el árbol de componentes para los componentes hijos del servidor | ❌ No soportado, es necesario pasar funciones t en el árbol de componentes para los componentes hijos del servidor |
66
+ | **Tree-shaking (cargar solo contenido usado)** | ✅ Sí, por componente en tiempo de compilación mediante plugins de Babel/SWC | ⚠️ Usualmente carga todo (puede mejorarse con namespaces/división de código) | ⚠️ Usualmente carga todo |
67
+ | **Carga diferida** | ✅ Sí, por localización / por diccionario | ✅ Sí (por ejemplo, backends/namespaces bajo demanda) | ✅ Sí (paquetes de localización divididos) |
68
+ | **Eliminación de contenido no usado** | ✅ Sí, por diccionario en tiempo de compilación | ❌ No, solo mediante segmentación manual de namespaces | ❌ No, todos los mensajes declarados se incluyen en el paquete |
69
+ | **Gestión de Proyectos Grandes** | ✅ Fomenta la modularidad, adecuado para sistemas de diseño | ⚠️ Requiere buena disciplina en los archivos | ⚠️ Los catálogos centrales pueden volverse grandes |
71
70
 
72
- ### Descripción General
73
-
74
- [**React-i18next**](https://react.i18next.com/) es una extensión de React de [i18next](https://www.i18next.com/), uno de los marcos de i18n de JavaScript más populares. Ofrece **extensas características** para traducciones en tiempo de ejecución, carga diferida y detección de idiomas, lo que lo hace extremadamente flexible para una amplia variedad de casos de uso.
75
-
76
- ### Características Clave
77
-
78
- - **Estructura de Traducción Flexible**: No está atada a un formato único como ICU. Puede almacenar traducciones en JSON, usar interpolación, pluralización, etc.
79
- - **Cambio de Idioma Dinámico**: Plugins de detección de idiomas integrados y actualizaciones en tiempo de ejecución.
80
- - **Traducciones Anidadas y Estructuradas**: Puede anidar traducciones fácilmente dentro de JSON.
81
- - **Extensa Ecosistema de Plugins**: Para detección (navegador, ruta, subdominio, etc.), carga de recursos, almacenamiento en caché y más.
82
-
83
- ### Flujo de Trabajo Típico
84
-
85
- 1. **Instalar `i18next` y `react-i18next`.**
86
- 2. **Configurar i18n** para cargar traducciones (JSON) y establecer la detección de idioma o el retroceso.
87
- 3. **Wrap su aplicación** en `I18nextProvider`.
88
- 4. **Usar el hook `useTranslation()`** o el componente `<Trans>` para mostrar traducciones.
71
+ ---
89
72
 
90
- ### Pros
73
+ ## Comparación detallada
91
74
 
92
- - Muy **flexible** y rica en características.
93
- - Comunidad muy activa y gran ecosistema de plugins.
94
- - Facilidad de **carga dinámica** de traducciones (por ejemplo, desde un servidor, bajo demanda).
75
+ ### 1) Arquitectura y escalabilidad
95
76
 
96
- ### Contras
77
+ - **react-intl / react-i18next**: La mayoría de las configuraciones mantienen **carpetas de localización centralizadas** por idioma, a veces divididas por **espacios de nombres** (namespaces) (i18next). Funciona bien al principio, pero se convierte en una superficie compartida a medida que las aplicaciones crecen.
78
+ - **Intlayer**: Promueve **diccionarios por componente (o por funcionalidad)** **ubicados junto** a la interfaz de usuario a la que sirven. Esto mantiene clara la propiedad, facilita la duplicación/migración de componentes y reduce la rotación de claves entre equipos. El contenido no utilizado es más fácil de identificar y eliminar.
97
79
 
98
- - **La configuración puede ser extensa**, especialmente si tiene necesidades más avanzadas.
99
- - Si prefiere traducciones fuertemente tipadas, puede necesitar configuraciones adicionales de TypeScript.
80
+ **Por qué importa:** El contenido modular refleja una interfaz modular. Las grandes bases de código React se mantienen más limpias cuando las traducciones conviven con los componentes a los que pertenecen.
100
81
 
101
82
  ---
102
83
 
103
- ## 4. Intlayer
84
+ ### 2) TypeScript y seguridad
104
85
 
105
- ### Descripción General
86
+ - **react-intl**: Tipados sólidos, pero **sin tipado automático de claves**; debes aplicar los patrones de seguridad tú mismo.
87
+ - **react-i18next**: Tipados fuertes para hooks; el **tipado estricto de claves** generalmente requiere configuración adicional o generadores.
88
+ - **Intlayer**: **Genera automáticamente tipos estrictos** a partir de tu contenido. La autocompletación del IDE y los **errores en tiempo de compilación** detectan errores tipográficos y claves faltantes antes de la ejecución.
106
89
 
107
- [**Intlayer**](https://github.com/aymericzip/intlayer) es una biblioteca de i18n más nueva y de código abierto centrada en **declaraciones de contenido a nivel de componente**, seguridad de tipos y **enrutamiento dinámico**. Está diseñado para flujos de trabajo modernos de React, apoyando tanto **Create React App** como configuraciones de **Vite**. También incluye características avanzadas como **enrutamiento basado en localidades** y **tipos de TypeScript auto-generados** para traducciones.
90
+ **Por qué es importante:** Mover los fallos hacia la **izquierda** (a la compilación/CI) reduce problemas en producción y acelera los ciclos de retroalimentación para los desarrolladores.
108
91
 
109
- ### Características Clave
92
+ ---
110
93
 
111
- - **Archivos de Contenido Declarativos**: Cada componente o módulo puede declarar sus traducciones en archivos dedicados `.content.tsx` o `.content.json`, manteniendo el contenido cerca de donde se utiliza.
112
- - **Enrutamiento y Middleware Integrados**: Módulos opcionales para enrutamiento localizado (por ejemplo, `/es/acerca`) y middleware de servidor para detectar la localidad del usuario.
113
- - **Tipos de TypeScript Auto-generados**: Asegura la seguridad de tipos con características como autocompletar y detección de errores en tiempo de compilación.
114
- - **Traducciones Dinámicas y Ricas**: Puede incluir JSX/TSX en traducciones para casos de uso más complejos (por ejemplo, enlaces, texto en negrita, iconos en traducciones).
94
+ ### 3) Manejo de traducciones faltantes
115
95
 
116
- ### Flujo de Trabajo Típico
96
+ - **react-intl / react-i18next**: Por defecto usan **respaldo en tiempo de ejecución** (eco de la clave o idioma predeterminado). Puedes agregar linting/plugins, pero no está garantizado en la compilación.
97
+ - **Intlayer**: **Detección en tiempo de compilación** con advertencias o errores cuando faltan locales o claves requeridas.
117
98
 
118
- 1. **Instalar `intlayer` y `react-intlayer`.**
119
- 2. **Crear `intlayer.config.ts`** para definir las localidades disponibles y la localidad predeterminada.
120
- 3. **Usar la CLI de Intlayer** o un plugin para **transpilar** declaraciones de contenido.
121
- 4. **Wrap su aplicación** en `<IntlayerProvider>` y recuperar contenido con `useIntlayer("keyName")`.
99
+ **Por qué es importante:** Que la CI falle por cadenas faltantes evita que “inglés misterioso” se filtre en interfaces no inglesas.
122
100
 
123
- ### Pros
101
+ ---
124
102
 
125
- - **Amigable con TypeScript** con generación de tipos integrado y verificación de errores.
126
- - **Contenido rico** posible (por ejemplo, pasar nodos React como traducciones).
127
- - **Enrutamiento Localizado** listo para usar.
128
- - Integrado con herramientas de construcción populares (CRA, Vite) para una configuración fácil.
103
+ ### 4) Contenido enriquecido y formato
129
104
 
130
- ### Contras
105
+ - **react-intl**: Excelente soporte **ICU** para plurales, selectores, fechas/números y composición de mensajes. Se puede usar JSX, pero el modelo mental sigue siendo centrado en el mensaje.
106
+ - **react-i18next**: Interpolación flexible y **`<Trans>`** para incrustar elementos/componentes; ICU disponible mediante un plugin.
107
+ - **Intlayer**: Los archivos de contenido pueden incluir **nodos enriquecidos** (JSX/Markdown/componentes) y **metadatos**. El formateo utiliza Intl internamente; los patrones de plural son ergonómicos.
131
108
 
132
- - Aún **relativamente nueva** en comparación con React-Intl o React-i18next.
133
- - Enfoque más pesado en un “declaración de contenido a nivel de componente” , puede ser un cambio respecto a los catálogos típicos .json.
134
- - Ecosistema y comunidad más pequeños en comparación con las bibliotecas más establecidas.
109
+ **Por qué es importante:** Los textos complejos de la interfaz de usuario (enlaces, partes en negrita, componentes en línea) son más fáciles cuando la biblioteca integra nodos React de forma limpia.
135
110
 
136
111
  ---
137
112
 
138
- ## 5. Comparación de Características
113
+ ### 5) Rendimiento y comportamiento de carga
114
+
115
+ - **react-intl / react-i18next**: Normalmente gestionas el **división de catálogos** y la **carga diferida** manualmente (espacios de nombres/importaciones dinámicas). Efectivo pero requiere disciplina.
116
+ - **Intlayer**: Realiza **tree-shaking** de diccionarios no usados y soporta **carga diferida por diccionario/por localización** de forma nativa.
139
117
 
140
- | **Características** | **React-Intl** | **React-i18next** | **Intlayer** |
141
- | ---------------------------- | ------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- |
142
- | **Caso de Uso Principal** | Traducciones basadas en cadenas, formateo de fechas/números, sintaxis de mensaje ICU | i18n completo con fácil cambio dinámico, anidamiento, ecosistema de plugins | Traducciones a prueba de tipos con enfoque en contenido declarativo, enrutamiento localizado, y middleware de servidor opcional |
143
- | **Enfoque** | Utiliza `<IntlProvider>` y componentes de mensajes de FormatJS | Utiliza `I18nextProvider` y el hook `useTranslation()` | Utiliza `<IntlayerProvider>` y el hook `useIntlayer()` con declaraciones de contenido |
144
- | **Formato de Localización** | Cadenas basadas en ICU (catálogos JSON o JavaScript) | Archivos de recursos JSON (o cargadores personalizados). El formato ICU es opcional a través del plugin de i18next | Declaraciones en `.content.[ts/js/tsx]` o JSON; puede contener cadenas o componentes React |
145
- | **Enrutamiento** | Manejado externamente (sin enrutamiento localizado incorporado) | Manejado externamente con plugins de i18next (detección de ruta, subdominio, etc.) | Soporte de enrutamiento localizado integrado (por ejemplo, `/es/acerca`), además de middleware de servidor opcional (para SSR/Vite) |
146
- | **Soporte para TypeScript** | Bueno (tipados para paquetes oficiales) | Bueno pero configuración adicional para traducciones tipadas si desea una verificación estricta | Excelente (definiciones de tipo auto-generadas para claves y traducciones de contenido) |
147
- | **Pluralización y Formateo** | Avanzado: formateo de fechas/hora/números incorporado, soporte para plural/género | Pluralización configurable. El formateo de fechas/hora generalmente se realiza a través de bibliotecas externas o del plugin de i18next | Puede depender del estándar JavaScript Intl o incrustar lógica en el contenido. No tan especializado como FormatJS, pero maneja casos típicos. |
148
- | **Comunidad y Ecosistema** | Grande, parte del ecosistema de FormatJS | Muy grande, altamente activa, muchos plugins (detección, almacenamiento en caché, marcos) | Más pequeño pero en crecimiento; enfoque moderno de código abierto |
149
- | **Curva de Aprendizaje** | Moderada (aprendiendo la sintaxis de mensajes ICU, convenciones de FormatJS) | Baja a moderada (uso sencillo, pero la configuración avanzada puede volverse extensa) | Moderada (concepto de declaraciones de contenido y pasos de compilación especializados) |
118
+ **Por qué importa:** Paquetes más pequeños y menos cadenas no usadas mejoran el rendimiento de inicio y navegación.
150
119
 
151
120
  ---
152
121
 
153
- ## 6. Cuándo Elegir Cada Uno
122
+ ### 6) DX, herramientas y mantenimiento
154
123
 
155
- 1. **React-Intl**
124
+ - **react-intl / react-i18next**: Ecosistema comunitario amplio; para flujos editoriales usualmente adoptas plataformas de localización externas.
125
+ - **Intlayer**: Incluye un **Editor Visual gratuito** y un **CMS opcional** (mantén el contenido en Git o externalízalo). También ofrece una **extensión para VSCode** para la creación de contenido y **traducción asistida por IA** usando tus propias claves de proveedor.
156
126
 
157
- - Necesita un **formato poderoso** para fechas/hora/números y una fuerte **sintaxis de mensajes ICU**.
158
- - Prefiere un enfoque más basado en “**estándares**” para traducciones.
159
- - No requiere enrutamiento localizado o claves de traducción fuertemente tipadas.
127
+ **Por qué es importante:** Las herramientas integradas acortan el ciclo entre desarrolladores y autores de contenido - menos código de unión, menos dependencias de proveedores.
160
128
 
161
- 2. **React-i18next**
129
+ ---
162
130
 
163
- - Necesita una solución **flexible y establecida** con **carga dinámica** y **a demanda** de traducciones.
164
- - Desea un plugin basado en **detección de idiomas** (por ejemplo, desde URL, cookies, almacenamiento local) o almacenamiento en caché avanzado.
165
- - Necesita el ecosistema más grande, con muchas integraciones existentes para varios marcos (Next.js, React Native, etc.).
131
+ ## ¿Cuándo elegir cuál?
166
132
 
167
- 3. **Intlayer**
168
- - Desea una integración **fuerte de TypeScript** con tipos _autogenerados_, asegurando que rara vez falte una clave de traducción.
169
- - Prefiere un **contenido declarativo** cercano al componente, posiblemente incluyendo nodos React o lógica avanzada en traducciones.
170
- - Requiere **enrutamiento localizado incorporado** o quiere incorporarlo fácilmente en su configuración SSR o Vite.
171
- - Desea un enfoque moderno o simplemente quiere una única biblioteca que cubra tanto **gestión de contenido** (i18n) como **enrutamiento** de manera segura en tipos.
133
+ - **Elige react-intl** si quieres un formateo de mensajes **priorizando ICU** con una API sencilla y alineada con estándares, y tu equipo está cómodo manteniendo catálogos y verificaciones de seguridad manualmente.
134
+ - **Elige react-i18next** si necesitas la **amplitud del ecosistema de i18next** (detectores, backends, plugin ICU, integraciones) y aceptas más configuración para ganar flexibilidad.
135
+ - **Elige Intlayer** si valoras el **contenido acotado por componente**, **TypeScript estricto**, **garantías en tiempo de compilación**, **tree-shaking** y herramientas editoriales **incluidas por defecto**, especialmente para aplicaciones React **grandes y modulares**.
172
136
 
173
137
  ---
174
138
 
175
- ## 7. Conclusión
176
-
177
- Cada biblioteca ofrece una solución robusta para internacionalizar una aplicación React:
178
-
179
- - **React-Intl** destaca en el formateo de mensajes y es una opción popular para soluciones empresariales que se centran en la sintaxis de mensajes ICU.
180
- - **React-i18next** proporciona un entorno altamente flexible y dirigido por plugins para necesidades avanzadas o dinámicas de i18n.
181
- - **Intlayer** ofrece un enfoque **moderno y fuertemente tipado** que fusiona declaraciones de contenido, enrutamiento localizado avanzado, y integraciones basadas en plugins (CRA, Vite).
139
+ ## Notas prácticas para la migración (react-intl / react-i18next → Intlayer)
182
140
 
183
- Su elección depende en gran medida de los requisitos del proyecto, la experiencia deseada para el desarrollador (DX) y cuán importantes son las traducciones tipadas o el enrutamiento avanzado. Si valora el enrutamiento localizado incorporado y la integración de TypeScript, **Intlayer** puede ser lo más atractivo. Si desea una solución probada en batalla y rica en ecosistemas, **React-i18next** es una excelente opción. Para necesidades de formateo basadas en ICU directas, **React-Intl** es una opción confiable.
141
+ - **Migra de forma incremental**: Comienza con una funcionalidad o ruta; mantén los catálogos heredados en paralelo durante la transición.
142
+ - **Adopta diccionarios por componente**: Ubica el contenido junto con los componentes para reducir el acoplamiento.
143
+ - **Activa verificaciones estrictas**: Permite que los errores en tiempo de compilación detecten claves/locales faltantes temprano en CI.
144
+ - **Mide los bundles**: Espera reducciones a medida que se eliminan cadenas no usadas.
184
145
 
185
146
  ---
186
147
 
187
- ### Lectura Adicional
148
+ ## Conclusión
188
149
 
189
- - [Documentación de React-Intl](https://formatjs.io/docs/react-intl/)
190
- - [Documentación de React-i18next](https://react.i18next.com/)
191
- - [Guía de Inicio Rápido de Intlayer + CRA](#) (de su doc)
192
- - [Guía de Inicio Rápido de Intlayer + Vite & React](#) (de su doc)
150
+ Las tres bibliotecas localizan React de manera efectiva. La diferencia radica en cuánto **infraestructura** debes construir para alcanzar una configuración **segura y escalable**:
193
151
 
194
- No dude en mezclar y combinar enfoques para adaptarse a sus requisitos; no hay una solución única para todos, y cada biblioteca continúa evolucionando para abordar nuevos casos de uso en el ecosistema React.
152
+ - Con **Intlayer**, el **contenido modular**, la **tipificación estricta en TS**, la **seguridad en tiempo de compilación**, los **paquetes optimizados por tree-shaking** y las **herramientas editoriales** son valores predeterminados, no tareas.
153
+ - Si tu equipo valora la **mantenibilidad y la velocidad** en aplicaciones React impulsadas por componentes y con múltiples locales, Intlayer ofrece el flujo de trabajo para desarrolladores y contenido más **completo** en la actualidad.
@@ -0,0 +1,268 @@
1
+ ---
2
+ createdAt: 2024-08-11
3
+ updatedAt: 2025-08-23
4
+ title: vue-i18n vs Intlayer
5
+ description: Comparación entre vue-i18n e Intlayer para la internacionalización (i18n) en aplicaciones Vue/Nuxt
6
+ keywords:
7
+ - vue-i18n
8
+ - Intlayer
9
+ - Internacionalización
10
+ - i18n
11
+ - Blog
12
+ - Vue
13
+ - Nuxt
14
+ - JavaScript
15
+ slugs:
16
+ - blog
17
+ - vue-i18n-vs-intlayer
18
+ ---
19
+
20
+ # vue-i18n VS Intlayer | Internacionalización (i18n) en Vue
21
+
22
+ Esta guía compara dos opciones populares de i18n para **Vue 3** (y **Nuxt**): **vue-i18n** e **Intlayer**.
23
+ Nos enfocamos en las herramientas modernas de Vue (Vite, Composition API) y evaluamos:
24
+
25
+ 1. **Arquitectura y organización del contenido**
26
+ 2. **TypeScript y seguridad**
27
+ 3. **Manejo de traducciones faltantes**
28
+ 4. **Estrategia de enrutamiento y URLs**
29
+ 5. **Rendimiento y comportamiento de carga**
30
+ 6. **Experiencia del desarrollador (DX), herramientas y mantenimiento**
31
+ 7. **SEO y escalabilidad para proyectos grandes**
32
+
33
+ > **resumen**: Ambos pueden localizar aplicaciones Vue. Si deseas **contenido con alcance por componente**, **tipos estrictos en TypeScript**, **verificaciones de claves faltantes en tiempo de compilación**, **diccionarios optimizados por tree-shaking**, y **helpers integrados para router/SEO** además de **Editor Visual y traducciones asistidas por IA**, **Intlayer** es la opción más completa y moderna.
34
+
35
+ ---
36
+
37
+ ## Posicionamiento a alto nivel
38
+
39
+ - **vue-i18n** - La biblioteca de i18n por excelencia para Vue. Formateo flexible de mensajes (estilo ICU), bloques SFC `<i18n>` para mensajes locales y un gran ecosistema. La seguridad y el mantenimiento a gran escala dependen principalmente de ti.
40
+ - **Intlayer** - Modelo de contenido centrado en componentes para Vue/Vite/Nuxt con **tipado estricto en TS**, **verificaciones en tiempo de compilación**, **tree-shaking**, **helpers para router y SEO**, **Editor Visual/CMS** opcional y **traducciones asistidas por IA**.
41
+
42
+ ---
43
+
44
+ ## Comparación de características lado a lado (enfocado en Vue)
45
+
46
+ | Característica | **Intlayer** | **vue-i18n** |
47
+ | ------------------------------------------------ | --------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------- |
48
+ | **Traducciones cerca de los componentes** | ✅ Sí, contenido ubicado por componente (por ejemplo, `MyComp.content.ts`) | ✅ Sí, mediante bloques `<i18n>` en SFC (opcional) |
49
+ | **Integración con TypeScript** | ✅ Avanzada, tipos **estrictos** auto-generados y autocompletado de claves | ✅ Buen tipado; **la seguridad estricta de claves requiere configuración/disciplina adicional** |
50
+ | **Detección de traducciones faltantes** | ✅ Advertencias/errores en **tiempo de compilación** y visibilidad en TS | ⚠️ Recaídas/advertencias en tiempo de ejecución |
51
+ | **Contenido enriquecido (componentes/Markdown)** | ✅ Soporte directo para nodos enriquecidos y archivos de contenido Markdown | ⚠️ Limitado (componentes vía `<i18n-t>`, Markdown mediante plugins externos) |
52
+ | **Traducción potenciada por IA** | ✅ Flujos de trabajo integrados usando tus propias claves de proveedores de IA | ❌ No integrado |
53
+ | **Editor Visual / CMS** | ✅ Editor Visual gratuito y CMS opcional | ❌ No integrado (usar plataformas externas) |
54
+ | **Enrutamiento localizado** | ✅ Helpers para Vue Router/Nuxt para generar rutas localizadas, URLs y `hreflang` | ⚠️ No es parte del núcleo (usar Nuxt i18n o configuración personalizada de Vue Router) |
55
+ | **Generación dinámica de rutas** | ✅ Sí | ❌ No proporcionado (lo proporciona Nuxt i18n) |
56
+ | **Pluralización y formateo** | ✅ Patrones de enumeración; formateadores basados en Intl | ✅ Mensajes estilo ICU; formateadores Intl |
57
+ | **Formatos de contenido** | ✅ `.ts`, `.js`, `.json`, `.md`, `.txt` (YAML en desarrollo) | ✅ `.json`, `.js` (más bloques SFC `<i18n>`) |
58
+ | **Soporte ICU** | ⚠️ En desarrollo | ✅ Sí |
59
+ | **Helpers SEO (sitemap, robots, metadata)** | ✅ Helpers integrados (independientes del framework) | ❌ No es parte del núcleo (Nuxt i18n/comunidad) |
60
+ | **SSR/SSG** | ✅ Funciona con Vue SSR y Nuxt; no bloquea el renderizado estático | ✅ Funciona con Vue SSR/Nuxt |
61
+ | **Tree-shaking (enviar solo contenido usado)** | ✅ Por componente en tiempo de compilación | ⚠️ Parcial; requiere división manual de código/mensajes asíncronos |
62
+ | **Carga diferida** | ✅ Por idioma / por diccionario | ✅ Soporte para mensajes de idioma asíncronos |
63
+ | **Purgar contenido no usado** | ✅ Sí (en tiempo de compilación) | ❌ No incorporado |
64
+ | **Mantenibilidad en proyectos grandes** | ✅ Fomenta una estructura modular y amigable con sistemas de diseño | ✅ Posible, pero requiere una fuerte disciplina en archivos/espacios de nombres |
65
+ | **Ecosistema / comunidad** | ⚠️ Más pequeño pero en rápido crecimiento | ✅ Grande y maduro en el ecosistema Vue |
66
+
67
+ ---
68
+
69
+ ## Comparación en profundidad
70
+
71
+ ### 1) Arquitectura y escalabilidad
72
+
73
+ - **vue-i18n**: Las configuraciones comunes usan **catálogos centralizados** por idioma (opcionalmente divididos en archivos/espacios de nombres). Los bloques `<i18n>` en SFC permiten mensajes locales, pero los equipos a menudo vuelven a catálogos compartidos a medida que los proyectos crecen.
74
+ - **Intlayer**: Promueve **diccionarios por componente** almacenados junto al componente al que sirven. Esto reduce conflictos entre equipos, mantiene el contenido accesible y limita naturalmente la deriva/las claves no usadas.
75
+
76
+ **Por qué es importante:** En aplicaciones Vue grandes o sistemas de diseño, el **contenido modular** escala mejor que los catálogos monolíticos.
77
+
78
+ ---
79
+
80
+ ### 2) TypeScript y seguridad
81
+
82
+ - **vue-i18n**: Buen soporte para TS; la **tipificación estricta de claves** generalmente requiere esquemas/generics personalizados y convenciones cuidadosas.
83
+ - **Intlayer**: **Genera tipos estrictos** a partir de tu contenido, proporcionando **autocompletado en el IDE** y **errores en tiempo de compilación** por errores tipográficos o claves faltantes.
84
+
85
+ **Por qué es importante:** La tipificación fuerte detecta problemas **antes** de la ejecución.
86
+
87
+ ---
88
+
89
+ ### 3) Manejo de traducciones faltantes
90
+
91
+ - **vue-i18n**: Advertencias y soluciones alternativas en **tiempo de ejecución** (por ejemplo, usar idioma o clave de reserva).
92
+ - **Intlayer**: Detección en **tiempo de compilación** con advertencias/errores a través de idiomas y claves.
93
+
94
+ **Por qué es importante:** La aplicación de reglas en tiempo de compilación mantiene la interfaz de producción limpia y consistente.
95
+
96
+ ---
97
+
98
+ ### 4) Estrategia de rutas y URLs (Vue Router/Nuxt)
99
+
100
+ - **Ambos** pueden trabajar con rutas localizadas.
101
+ - **Intlayer** proporciona ayudas para **generar rutas localizadas**, **gestionar prefijos de locales** y emitir **`<link rel="alternate" hreflang>`** para SEO. Con Nuxt, complementa el enrutamiento del framework.
102
+
103
+ **Por qué es importante:** Menos capas personalizadas y un **SEO más limpio** entre locales.
104
+
105
+ ---
106
+
107
+ ### 5) Rendimiento y comportamiento de carga
108
+
109
+ - **vue-i18n**: Soporta mensajes de locales asíncronos; evitar la sobrecarga de paquetes depende de ti (divide los catálogos con cuidado).
110
+ - **Intlayer**: Realiza **tree-shaking** en la compilación y **carga perezosa por diccionario/locale**. El contenido no usado no se incluye.
111
+
112
+ **Por qué es importante:** Paquetes más pequeños y un inicio más rápido para aplicaciones Vue multilingües.
113
+
114
+ ---
115
+
116
+ ### 6) Experiencia del desarrollador y herramientas
117
+
118
+ - **vue-i18n**: Documentación y comunidad maduras; normalmente dependerás de **plataformas de localización externas** para los flujos editoriales.
119
+ - **Intlayer**: Incluye un **Editor Visual gratuito**, un **CMS** opcional (compatible con Git o externalizado), una **extensión para VSCode**, utilidades **CLI/CI**, y **traducciones asistidas por IA** usando tus propias claves de proveedor.
120
+
121
+ **Por qué importa:** Menores costos operativos y un ciclo de desarrollo–contenido más corto.
122
+
123
+ ---
124
+
125
+ ### 7) SEO, SSR y SSG
126
+
127
+ - **Ambos** funcionan con Vue SSR y Nuxt.
128
+ - **Intlayer**: Añade **ayudas SEO** (sitemaps/metadata/`hreflang`) que son independientes del framework y funcionan bien con las compilaciones de Vue/Nuxt.
129
+
130
+ **Por qué importa:** SEO internacional sin configuraciones personalizadas.
131
+
132
+ ---
133
+
134
+ ## ¿Por qué Intlayer? (Problema y enfoque)
135
+
136
+ La mayoría de los stacks i18n (incluyendo **vue-i18n**) comienzan desde **catálogos centralizados**:
137
+
138
+ ```bash
139
+ .
140
+ ├── locales
141
+ │ ├── en.json
142
+ │ ├── es.json
143
+ │ └── fr.json
144
+ └── src
145
+ └── components
146
+ └── MyComponent.vue
147
+ ```
148
+
149
+ O con carpetas por idioma:
150
+
151
+ ```bash
152
+ .
153
+ ├── locales
154
+ │ ├── en
155
+ │ │ ├── footer.json
156
+ │ │ └── navbar.json
157
+ │ ├── fr
158
+ │ │ ├── footer.json
159
+ │ │ └── navbar.json
160
+ │ └── es
161
+ │ ├── footer.json
162
+ │ └── navbar.json
163
+ └── src
164
+ └── components
165
+ └── MyComponent.vue
166
+ ```
167
+
168
+ Esto a menudo ralentiza el desarrollo a medida que las aplicaciones crecen:
169
+
170
+ 1. **Para un nuevo componente** creas/editas catálogos remotos, configuras espacios de nombres y traduces (a menudo mediante copiar/pegar manual desde herramientas de IA).
171
+ 2. **Al cambiar componentes** buscas claves compartidas, traduces, mantienes las locales sincronizadas, eliminas claves obsoletas y alineas las estructuras JSON.
172
+
173
+ **Intlayer** delimita el contenido **por componente** y lo mantiene **junto al código**, como ya hacemos con CSS, historias, pruebas y documentación:
174
+
175
+ ```bash
176
+ .
177
+ └── components
178
+ └── MyComponent
179
+ ├── MyComponent.content.ts
180
+ └── MyComponent.vue
181
+ ```
182
+
183
+ **Declaración de contenido** (por componente):
184
+
185
+ ```ts fileName="./components/MyComponent/MyComponent.content.ts"
186
+ import { t, type Dictionary } from "intlayer";
187
+
188
+ const componentExampleContent = {
189
+ key: "component-example",
190
+ content: {
191
+ greeting: t({
192
+ en: "Hello World",
193
+ es: "Hola Mundo",
194
+ fr: "Bonjour le monde",
195
+ }),
196
+ },
197
+ } satisfies Dictionary;
198
+
199
+ export default componentExampleContent;
200
+ ```
201
+
202
+ **Uso en Vue** (API de composición):
203
+
204
+ ```vue fileName="./components/MyComponent/MyComponent.vue"
205
+ <script setup lang="ts">
206
+ import { useIntlayer } from "vue-intlayer"; // Integración con Vue
207
+ const { greeting } = useIntlayer("component-example");
208
+ </script>
209
+
210
+ <template>
211
+ <span>{{ greeting }}</span>
212
+ </template>
213
+ ```
214
+
215
+ Este enfoque:
216
+
217
+ - **Acelera el desarrollo** (declara una vez; el IDE/IA autocompleta).
218
+ - **Limpia la base de código** (1 componente = 1 diccionario).
219
+ - **Facilita la duplicación/migración** (copia un componente y su contenido juntos).
220
+ - **Evita claves muertas** (los componentes no usados no importan contenido).
221
+ - **Optimiza la carga** (los componentes cargados perezosamente traen su contenido consigo).
222
+
223
+ ---
224
+
225
+ ## Características adicionales de Intlayer (relevantes para Vue)
226
+
227
+ - **Soporte multiplataforma**: Funciona con Vue, Nuxt, Vite, React, Express y más.
228
+ - **Gestión de contenido potenciada por JavaScript**: Declara en código con total flexibilidad.
229
+ - **Archivo de declaración por localización**: Inicializa todas las localizaciones y deja que las herramientas generen el resto.
230
+ - **Entorno con tipado seguro**: Configuración fuerte de TS con autocompletado.
231
+ - **Recuperación de contenido simplificada**: Un solo hook/composable para obtener todo el contenido de un diccionario.
232
+ - **Código organizado**: 1 componente = 1 diccionario en la misma carpeta.
233
+ - **Enrutamiento mejorado**: Helpers para rutas y metadatos localizados en **Vue Router/Nuxt**.
234
+ - **Soporte Markdown**: Importa Markdown remoto/local por localización; expone frontmatter al código.
235
+ - **Editor visual gratuito y CMS opcional**: Creación de contenido sin una plataforma de localización de pago; sincronización amigable con Git.
236
+ - **Contenido tree-shakeable**: Solo se incluye lo que se usa; soporta carga diferida.
237
+ - **Compatible con renderizado estático**: No bloquea SSG.
238
+ - **Traducciones impulsadas por IA**: Traduce a 231 idiomas usando tu propio proveedor de IA/clave API.
239
+ - **Servidor MCP y extensión para VSCode**: Automatiza los flujos de trabajo de i18n y la creación de contenido dentro de tu IDE.
240
+ - **Interoperabilidad**: Puentes con **vue-i18n**, **react-i18next** y **react-intl** cuando sea necesario.
241
+
242
+ ---
243
+
244
+ ## ¿Cuándo elegir cuál?
245
+
246
+ - **Elige vue-i18n** si quieres el **enfoque estándar de Vue**, te sientes cómodo gestionando catálogos/espacios de nombres tú mismo, y tu aplicación es de **tamaño pequeño a mediano** (o ya dependes de Nuxt i18n).
247
+ - **Elige Intlayer** si valoras el **contenido con alcance por componente**, **TypeScript estricto**, **garantías en tiempo de compilación**, **tree-shaking**, y herramientas integradas para enrutamiento/SEO/editor-especialmente para **códigos grandes y modulares en Vue/Nuxt**.
248
+
249
+ ---
250
+
251
+ ## Notas prácticas para la migración (vue-i18n → Intlayer)
252
+
253
+ - **Comience por función**: Mueva una ruta/vista/componente a la vez a los diccionarios locales de Intlayer.
254
+ - **Puente durante la migración**: Mantenga los catálogos de vue-i18n en paralelo; reemplace gradualmente las búsquedas.
255
+ - **Active verificaciones estrictas**: Permita que la detección en tiempo de compilación identifique temprano claves/idiomas faltantes.
256
+ - **Adopte los ayudantes de router/SEO**: Estandarice la detección de idioma y las etiquetas `hreflang`.
257
+ - **Mida los paquetes**: Espere **reducciones en el tamaño del paquete** a medida que se excluye contenido no utilizado.
258
+
259
+ ---
260
+
261
+ ## Conclusión
262
+
263
+ Tanto **vue-i18n** como **Intlayer** localizan bien las aplicaciones Vue. La diferencia es **cuánto debe construir usted mismo** para lograr una configuración robusta y escalable:
264
+
265
+ - Con **Intlayer**, el **contenido modular**, **TS estricto**, **seguridad en tiempo de compilación**, **paquetes optimizados por árbol de dependencias** y las **herramientas para router/SEO/editor** vienen **listos para usar**.
266
+ - Si tu equipo prioriza la **mantenibilidad y velocidad** en una aplicación Vue/Nuxt multilingüe y basada en componentes, Intlayer ofrece la experiencia **más completa** hoy en día.
267
+
268
+ Consulta el documento ['¿Por qué Intlayer?'](https://intlayer.org/doc/why) para más detalles.
@@ -1,6 +1,6 @@
1
1
  ---
2
- createdAt: 2024-08-11
3
- updatedAt: 2025-06-29
2
+ createdAt: 2025-08-23
3
+ updatedAt: 2025-08-23
4
4
  title: Intlayer et next-i18next
5
5
  description: Integre Intlayer avec next-i18next pour une application Next.js
6
6
  keywords:
@@ -24,7 +24,6 @@ Les frameworks next-i18next et Intlayer sont des frameworks d'internationalisati
24
24
  Les deux solutions incluent trois notions principales :
25
25
 
26
26
  1. **Déclaration de Contenu** : La méthode pour définir le contenu traduisible de votre application.
27
-
28
27
  - Nommée `resource` dans le cas de `i18next`, la déclaration de contenu est un objet JSON structuré contenant des paires clé-valeur pour les traductions dans une ou plusieurs langues. Voir [documentation i18next](https://www.i18next.com/translation-function/essentials) pour plus d'informations.
29
28
  - Nommée `content declaration file` dans le cas de `Intlayer`, la déclaration de contenu peut être un fichier JSON, JS ou TS exportant les données structurées. Voir [documentation Intlayer](https://github.com/aymericzip/intlayer/blob/main/docs/docs/fr/doc/concept/content) pour plus d'informations.
30
29
 
@@ -213,8 +212,8 @@ const content = {
213
212
  content: {
214
213
  myTranslatedContent: t({
215
214
  en: "Hello World",
216
- fr: "Bonjour le monde",
217
215
  es: "Hola Mundo",
216
+ fr: "Bonjour le monde",
218
217
  }),
219
218
  },
220
219
  } satisfies Dictionary;
@@ -231,8 +230,8 @@ const content = {
231
230
  content: {
232
231
  myTranslatedContent: t({
233
232
  en: "Hello World",
234
- fr: "Bonjour le monde",
235
233
  es: "Hola Mundo",
234
+ fr: "Bonjour le monde",
236
235
  }),
237
236
  },
238
237
  };
@@ -246,8 +245,8 @@ module.exports = {
246
245
  content: {
247
246
  myTranslatedContent: t({
248
247
  en: "Hello World",
249
- fr: "Bonjour le monde",
250
248
  es: "Hola Mundo",
249
+ fr: "Bonjour le monde",
251
250
  }),
252
251
  },
253
252
  };