@intlayer/docs 5.8.0-canary.0 → 5.8.1-canary.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/blog/ar/intlayer_with_next-i18next.md +2 -2
- package/blog/ar/next-i18next_vs_next-intl_vs_intlayer.md +96 -219
- package/blog/ar/react-i18next_vs_react-intl_vs_intlayer.md +88 -129
- package/blog/ar/vue-i18n_vs_intlayer.md +268 -0
- package/blog/de/intlayer_with_next-i18next.md +2 -2
- package/blog/de/next-i18next_vs_next-intl_vs_intlayer.md +93 -216
- package/blog/de/react-i18next_vs_react-intl_vs_intlayer.md +87 -128
- package/blog/de/vue-i18n_vs_intlayer.md +268 -0
- package/blog/en/intlayer_with_next-i18next.md +2 -2
- package/blog/en/next-i18next_vs_next-intl_vs_intlayer.md +93 -216
- package/blog/en/react-i18next_vs_react-intl_vs_intlayer.md +88 -120
- package/blog/en/vue-i18n_vs_intlayer.md +276 -0
- package/blog/en-GB/intlayer_with_next-i18next.md +2 -2
- package/blog/en-GB/next-i18next_vs_next-intl_vs_intlayer.md +85 -218
- package/blog/en-GB/react-i18next_vs_react-intl_vs_intlayer.md +80 -130
- package/blog/en-GB/vue-i18n_vs_intlayer.md +258 -0
- package/blog/es/intlayer_with_next-i18next.md +2 -2
- package/blog/es/next-i18next_vs_next-intl_vs_intlayer.md +93 -216
- package/blog/es/react-i18next_vs_react-intl_vs_intlayer.md +87 -128
- package/blog/es/vue-i18n_vs_intlayer.md +268 -0
- package/blog/fr/intlayer_with_next-i18next.md +2 -2
- package/blog/fr/next-i18next_vs_next-intl_vs_intlayer.md +91 -214
- package/blog/fr/react-i18next_vs_react-intl_vs_intlayer.md +86 -127
- package/blog/fr/vue-i18n_vs_intlayer.md +269 -0
- package/blog/hi/intlayer_with_next-i18next.md +2 -2
- package/blog/hi/next-i18next_vs_next-intl_vs_intlayer.md +97 -220
- package/blog/hi/react-i18next_vs_react-intl_vs_intlayer.md +89 -130
- package/blog/hi/vue-i18n_vs_intlayer.md +268 -0
- package/blog/it/intlayer_with_next-i18next.md +2 -2
- package/blog/it/next-i18next_vs_next-intl_vs_intlayer.md +91 -214
- package/blog/it/react-i18next_vs_react-intl_vs_intlayer.md +86 -127
- package/blog/it/vue-i18n_vs_intlayer.md +268 -0
- package/blog/ja/intlayer_with_next-i18next.md +2 -2
- package/blog/ja/next-i18next_vs_next-intl_vs_intlayer.md +93 -216
- package/blog/ja/react-i18next_vs_react-intl_vs_intlayer.md +87 -128
- package/blog/ja/vue-i18n_vs_intlayer.md +268 -0
- package/blog/ko/intlayer_with_next-i18next.md +2 -2
- package/blog/ko/next-i18next_vs_next-intl_vs_intlayer.md +95 -217
- package/blog/ko/react-i18next_vs_react-intl_vs_intlayer.md +89 -130
- package/blog/ko/vue-i18n_vs_intlayer.md +268 -0
- package/blog/pt/intlayer_with_next-i18next.md +2 -2
- package/blog/pt/next-i18next_vs_next-intl_vs_intlayer.md +93 -216
- package/blog/pt/react-i18next_vs_react-intl_vs_intlayer.md +87 -128
- package/blog/pt/vue-i18n_vs_intlayer.md +268 -0
- package/blog/ru/intlayer_with_next-i18next.md +2 -2
- package/blog/ru/next-i18next_vs_next-intl_vs_intlayer.md +94 -217
- package/blog/ru/react-i18next_vs_react-intl_vs_intlayer.md +87 -128
- package/blog/ru/vue-i18n_vs_intlayer.md +268 -0
- package/blog/zh/intlayer_with_next-i18next.md +2 -2
- package/blog/zh/next-i18next_vs_next-intl_vs_intlayer.md +93 -216
- package/blog/zh/react-i18next_vs_react-intl_vs_intlayer.md +87 -128
- package/blog/zh/vue-i18n_vs_intlayer.md +269 -0
- package/dist/cjs/generated/blog.entry.cjs +41 -0
- package/dist/cjs/generated/blog.entry.cjs.map +1 -1
- package/dist/esm/generated/blog.entry.mjs +41 -0
- package/dist/esm/generated/blog.entry.mjs.map +1 -1
- package/dist/types/generated/blog.entry.d.ts +1 -0
- package/dist/types/generated/blog.entry.d.ts.map +1 -1
- package/docs/ar/formatters.md +417 -31
- package/docs/ar/how_works_intlayer.md +2 -4
- package/docs/ar/interest_of_intlayer.md +7 -10
- package/docs/ar/intlayer_CMS.md +2 -3
- package/docs/ar/intlayer_visual_editor.md +2 -3
- package/docs/ar/intlayer_with_tanstack.md +1 -1
- package/docs/ar/introduction.md +4 -4
- package/docs/de/formatters.md +444 -34
- package/docs/de/introduction.md +2 -2
- package/docs/en/dictionary/enumeration.md +2 -2
- package/docs/en/dictionary/function_fetching.md +2 -2
- package/docs/en/dictionary/get_started.md +2 -2
- package/docs/en/dictionary/translation.md +2 -2
- package/docs/en/formatters.md +383 -15
- package/docs/en/how_works_intlayer.md +2 -4
- package/docs/en/interest_of_intlayer.md +48 -29
- package/docs/en/intlayer_CMS.md +2 -3
- package/docs/en/intlayer_visual_editor.md +2 -3
- package/docs/en/intlayer_with_create_react_app.md +2 -2
- package/docs/en/intlayer_with_express.md +2 -2
- package/docs/en/intlayer_with_tanstack.md +1 -1
- package/docs/en/introduction.md +4 -4
- package/docs/en/packages/express-intlayer/index.md +2 -2
- package/docs/en/packages/intlayer/getConfiguration.md +2 -3
- package/docs/en/packages/intlayer/getEnumeration.md +2 -7
- package/docs/en/packages/intlayer/getHTMLTextDir.md +2 -4
- package/docs/en/packages/intlayer/getLocaleLang.md +2 -4
- package/docs/en/packages/intlayer/getLocaleName.md +2 -3
- package/docs/en/packages/intlayer/getLocalizedUrl.md +2 -8
- package/docs/en/packages/intlayer/getMultilingualUrls.md +2 -7
- package/docs/en/packages/intlayer/getPathWithoutLocale.md +2 -3
- package/docs/en/packages/intlayer/getTranslation.md +2 -4
- package/docs/en/packages/intlayer/index.md +2 -2
- package/docs/en/packages/next-intlayer/index.md +2 -2
- package/docs/en/packages/next-intlayer/t.md +2 -2
- package/docs/en/packages/next-intlayer/useDictionary.md +2 -2
- package/docs/en/packages/next-intlayer/useIntlayer.md +2 -2
- package/docs/en/packages/next-intlayer/useLocale.md +2 -2
- package/docs/en/packages/react-intlayer/index.md +2 -2
- package/docs/en/packages/react-intlayer/t.md +2 -2
- package/docs/en/packages/react-intlayer/useI18n.md +2 -2
- package/docs/en/packages/react-intlayer/useIntlayer.md +2 -2
- package/docs/en/packages/react-intlayer/useLocale.md +2 -2
- package/docs/en/packages/react-scripts-intlayer/index.md +2 -2
- package/docs/en/packages/solid-intlayer/index.md +2 -2
- package/docs/en/packages/vite-intlayer/index.md +2 -2
- package/docs/en-GB/formatters.md +402 -16
- package/docs/en-GB/how_works_intlayer.md +2 -4
- package/docs/en-GB/interest_of_intlayer.md +7 -10
- package/docs/en-GB/intlayer_with_tanstack.md +1 -1
- package/docs/en-GB/introduction.md +2 -2
- package/docs/es/formatters.md +438 -28
- package/docs/es/how_works_intlayer.md +2 -4
- package/docs/es/interest_of_intlayer.md +7 -10
- package/docs/es/intlayer_with_tanstack.md +1 -1
- package/docs/es/introduction.md +2 -2
- package/docs/fr/formatters.md +438 -28
- package/docs/fr/how_works_intlayer.md +2 -4
- package/docs/fr/interest_of_intlayer.md +7 -10
- package/docs/fr/intlayer_with_tanstack.md +1 -1
- package/docs/fr/introduction.md +2 -2
- package/docs/hi/formatters.md +430 -39
- package/docs/hi/how_works_intlayer.md +2 -4
- package/docs/hi/interest_of_intlayer.md +7 -10
- package/docs/hi/intlayer_with_tanstack.md +1 -1
- package/docs/hi/introduction.md +2 -2
- package/docs/it/formatters.md +438 -30
- package/docs/it/how_works_intlayer.md +2 -4
- package/docs/it/interest_of_intlayer.md +7 -10
- package/docs/it/intlayer_with_tanstack.md +1 -1
- package/docs/it/introduction.md +2 -2
- package/docs/ja/formatters.md +435 -47
- package/docs/ja/how_works_intlayer.md +2 -4
- package/docs/ja/interest_of_intlayer.md +7 -10
- package/docs/ja/intlayer_with_tanstack.md +1 -1
- package/docs/ja/introduction.md +2 -2
- package/docs/ko/formatters.md +432 -41
- package/docs/ko/how_works_intlayer.md +2 -4
- package/docs/ko/interest_of_intlayer.md +7 -10
- package/docs/ko/intlayer_with_tanstack.md +1 -1
- package/docs/ko/introduction.md +2 -2
- package/docs/pt/formatters.md +416 -30
- package/docs/pt/how_works_intlayer.md +2 -4
- package/docs/pt/intlayer_with_tanstack.md +1 -1
- package/docs/pt/introduction.md +2 -2
- package/docs/ru/autoFill.md +2 -2
- package/docs/ru/configuration.md +1 -40
- package/docs/ru/formatters.md +438 -28
- package/docs/ru/how_works_intlayer.md +5 -7
- package/docs/ru/index.md +1 -1
- package/docs/ru/interest_of_intlayer.md +8 -11
- package/docs/ru/intlayer_CMS.md +7 -8
- package/docs/ru/intlayer_cli.md +4 -7
- package/docs/ru/intlayer_visual_editor.md +5 -6
- package/docs/ru/intlayer_with_angular.md +1 -1
- package/docs/ru/intlayer_with_create_react_app.md +5 -5
- package/docs/ru/intlayer_with_lynx+react.md +1 -1
- package/docs/ru/intlayer_with_nextjs_15.md +3 -3
- package/docs/ru/intlayer_with_nextjs_page_router.md +2 -2
- package/docs/ru/intlayer_with_nuxt.md +1 -1
- package/docs/ru/intlayer_with_react_native+expo.md +2 -2
- package/docs/ru/intlayer_with_tanstack.md +3 -3
- package/docs/ru/intlayer_with_vite+preact.md +3 -3
- package/docs/ru/intlayer_with_vite+react.md +3 -3
- package/docs/ru/intlayer_with_vite+solid.md +1 -1
- package/docs/ru/intlayer_with_vite+svelte.md +1 -1
- package/docs/ru/intlayer_with_vite+vue.md +2 -2
- package/docs/ru/introduction.md +5 -5
- package/docs/ru/locale_mapper.md +1 -1
- package/docs/ru/packages/@intlayer/api/index.md +2 -2
- package/docs/ru/packages/@intlayer/chokidar/index.md +1 -1
- package/docs/ru/packages/@intlayer/cli/index.md +2 -2
- package/docs/ru/packages/@intlayer/config/index.md +2 -2
- package/docs/ru/packages/@intlayer/core/index.md +2 -2
- package/docs/ru/packages/@intlayer/design-system/index.md +2 -2
- package/docs/ru/packages/@intlayer/dictionary-entry/index.md +2 -2
- package/docs/ru/packages/@intlayer/editor/index.md +1 -1
- package/docs/ru/packages/@intlayer/editor-react/index.md +1 -1
- package/docs/ru/packages/@intlayer/webpack/index.md +1 -1
- package/docs/ru/packages/angular-intlayer/index.md +1 -1
- package/docs/ru/packages/express-intlayer/index.md +3 -3
- package/docs/ru/packages/express-intlayer/t.md +1 -1
- package/docs/ru/packages/intlayer/getEnumeration.md +3 -8
- package/docs/ru/packages/intlayer/getTranslation.md +3 -5
- package/docs/ru/packages/intlayer/getTranslationContent.md +1 -3
- package/docs/ru/packages/intlayer/index.md +3 -3
- package/docs/ru/packages/intlayer-cli/index.md +1 -1
- package/docs/ru/packages/intlayer-editor/index.md +2 -2
- package/docs/ru/packages/lynx-intlayer/index.md +1 -1
- package/docs/ru/packages/next-intlayer/index.md +4 -4
- package/docs/ru/packages/next-intlayer/t.md +4 -4
- package/docs/ru/packages/next-intlayer/useLocale.md +3 -3
- package/docs/ru/packages/nuxt-intlayer/index.md +1 -1
- package/docs/ru/packages/preact-intlayer/index.md +1 -1
- package/docs/ru/packages/react-intlayer/index.md +4 -4
- package/docs/ru/packages/react-intlayer/t.md +4 -4
- package/docs/ru/packages/react-native-intlayer/index.md +1 -1
- package/docs/ru/packages/react-scripts-intlayer/index.md +3 -3
- package/docs/ru/packages/solid-intlayer/index.md +3 -3
- package/docs/ru/packages/svelte-intlayer/index.md +1 -1
- package/docs/ru/packages/vite-intlayer/index.md +3 -3
- package/docs/ru/packages/vue-intlayer/index.md +1 -1
- package/docs/ru/per_locale_file.md +1 -1
- package/docs/ru/roadmap.md +3 -5
- package/docs/ru/vs_code_extension.md +1 -1
- package/docs/zh/formatters.md +446 -38
- package/docs/zh/how_works_intlayer.md +2 -4
- package/docs/zh/interest_of_intlayer.md +7 -10
- package/docs/zh/intlayer_with_tanstack.md +1 -1
- package/docs/zh/introduction.md +2 -2
- package/frequent_questions/ar/domain_routing.md +1 -1
- package/frequent_questions/en/domain_routing.md +1 -1
- package/frequent_questions/en-GB/domain_routing.md +1 -1
- package/frequent_questions/es/domain_routing.md +1 -1
- package/frequent_questions/fr/domain_routing.md +1 -1
- package/frequent_questions/hi/domain_routing.md +1 -1
- package/frequent_questions/it/domain_routing.md +1 -1
- package/frequent_questions/ko/domain_routing.md +1 -1
- package/frequent_questions/pt/domain_routing.md +1 -1
- package/frequent_questions/ru/domain_routing.md +1 -1
- package/frequent_questions/ru/get_locale_cookie.md +4 -4
- package/frequent_questions/ru/static_rendering.md +1 -2
- package/frequent_questions/zh/domain_routing.md +1 -1
- package/package.json +9 -11
- package/src/generated/blog.entry.ts +42 -1
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
---
|
|
2
2
|
createdAt: 2025-01-02
|
|
3
3
|
updatedAt: 2025-06-29
|
|
4
|
-
title: react-
|
|
5
|
-
description:
|
|
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
|
-
-
|
|
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
|
-
#
|
|
20
|
+
# react-Intl VS react-i18next VS intlayer | Internacionalización (i18n) en React
|
|
21
21
|
|
|
22
|
-
|
|
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
|
-
|
|
31
|
-
|
|
32
|
-
|
|
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
|
-
|
|
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
|
-
##
|
|
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
|
-
-
|
|
66
|
-
-
|
|
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
|
-
##
|
|
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
|
-
|
|
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
|
-
|
|
73
|
+
## Comparación detallada
|
|
91
74
|
|
|
92
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
84
|
+
### 2) TypeScript y seguridad
|
|
104
85
|
|
|
105
|
-
|
|
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
|
-
|
|
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
|
-
|
|
92
|
+
---
|
|
110
93
|
|
|
111
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
101
|
+
---
|
|
124
102
|
|
|
125
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
122
|
+
### 6) DX, herramientas y mantenimiento
|
|
154
123
|
|
|
155
|
-
|
|
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
|
-
|
|
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
|
-
|
|
129
|
+
---
|
|
162
130
|
|
|
163
|
-
|
|
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
|
-
|
|
168
|
-
|
|
169
|
-
|
|
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
|
-
##
|
|
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
|
-
|
|
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
|
-
|
|
148
|
+
## Conclusión
|
|
188
149
|
|
|
189
|
-
|
|
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
|
-
|
|
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.
|