@intlayer/docs 5.8.0-canary.0 → 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.
- 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 +89 -220
- package/blog/en/react-i18next_vs_react-intl_vs_intlayer.md +85 -123
- package/blog/en/vue-i18n_vs_intlayer.md +268 -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 +40 -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 +7 -7
- package/src/generated/blog.entry.ts +41 -0
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
---
|
|
2
|
-
createdAt:
|
|
3
|
-
updatedAt: 2025-
|
|
2
|
+
createdAt: 2025-08-23
|
|
3
|
+
updatedAt: 2025-08-23
|
|
4
4
|
title: next-i18next vs next-intl vs Intlayer
|
|
5
|
-
description:
|
|
5
|
+
description: Comparación de next-i18next con next-intl e Intlayer para la internacionalización (i18n) de una aplicación Next.js
|
|
6
6
|
keywords:
|
|
7
7
|
- next-intl
|
|
8
8
|
- next-i18next
|
|
9
9
|
- Intlayer
|
|
10
10
|
- Internacionalización
|
|
11
|
-
-
|
|
11
|
+
- Blog
|
|
12
12
|
- Next.js
|
|
13
13
|
- JavaScript
|
|
14
14
|
- React
|
|
@@ -17,269 +17,146 @@ slugs:
|
|
|
17
17
|
- next-i18next-vs-next-intl-vs-intlayer
|
|
18
18
|
---
|
|
19
19
|
|
|
20
|
-
# next-i18next VS next-intl VS
|
|
20
|
+
# next-i18next VS next-intl VS intlayer | Internacionalización (i18n) en Next.js
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
Esta guía compara tres opciones de i18n ampliamente utilizadas para **Next.js**: **next-intl**, **next-i18next** e **Intlayer**.
|
|
23
|
+
Nos centramos en **Next.js 13+ App Router** (con **React Server Components**) y evaluamos:
|
|
23
24
|
|
|
24
|
-
|
|
25
|
+
1. **Arquitectura y organización del contenido**
|
|
26
|
+
2. **TypeScript y seguridad**
|
|
27
|
+
3. **Manejo de traducciones faltantes**
|
|
28
|
+
4. **Enrutamiento y middleware**
|
|
29
|
+
5. **Rendimiento y comportamiento de carga**
|
|
30
|
+
6. **Experiencia del desarrollador (DX), herramientas y mantenimiento**
|
|
31
|
+
7. **SEO y escalabilidad para proyectos grandes**
|
|
25
32
|
|
|
26
|
-
|
|
27
|
-
2. **Soporte para TypeScript**
|
|
28
|
-
3. **Gestión de traducciones faltantes**
|
|
29
|
-
4. **Soporte para Componentes del Servidor**
|
|
30
|
-
5. **Enrutamiento mejorado y middleware** para Next.js
|
|
31
|
-
6. **Simplicidad de configuración**
|
|
32
|
-
|
|
33
|
-
La guía también proporciona una **visión detallada de Intlayer**, mostrando por qué puede ser una opción sólida, especialmente para Next.js 13+, incluyendo **App Router** y **Componentes del Servidor**.
|
|
33
|
+
> **resumen**: Los tres pueden localizar una aplicación Next.js. 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 de App Router y SEO de primera clase**, **Intlayer** es la opción más completa y moderna.
|
|
34
34
|
|
|
35
35
|
---
|
|
36
36
|
|
|
37
|
-
##
|
|
38
|
-
|
|
39
|
-
### 1. next-intl
|
|
37
|
+
## Posicionamiento a alto nivel
|
|
40
38
|
|
|
41
|
-
**
|
|
39
|
+
- **next-intl** - Formateo de mensajes ligero y sencillo con soporte sólido para Next.js. Los catálogos centralizados son comunes; la experiencia del desarrollador (DX) es simple, pero la seguridad y el mantenimiento a gran escala siguen siendo principalmente tu responsabilidad.
|
|
40
|
+
- **next-i18next** - i18next con la apariencia de Next.js. Ecosistema maduro y características mediante plugins (por ejemplo, ICU), pero la configuración puede ser extensa y los catálogos tienden a centralizarse a medida que los proyectos crecen.
|
|
41
|
+
- **Intlayer** - Modelo de contenido centrado en componentes para Next.js, **tipado estricto en TS**, **verificaciones en tiempo de compilación**, **tree-shaking**, **middleware integrado y helpers de SEO**, **Editor Visual/CMS** opcional y **traducciones asistidas por IA**.
|
|
42
42
|
|
|
43
|
-
|
|
44
|
-
- **Soporte para TypeScript**: Integración básica de TypeScript. Existen algunas definiciones de tipo, pero no se centran en gran medida en la generación automática de definiciones de TypeScript a partir de tus archivos de traducción.
|
|
45
|
-
- **Traducciones faltantes**: Mecanismo de retroceso básico. Por defecto, retrocede a una clave o una cadena de idioma predeterminado. No hay herramientas robustas listas para usar para comprobaciones avanzadas de traducciones faltantes.
|
|
46
|
-
- **Soporte para Componentes del Servidor**: Funciona con Next.js 13+ en general, pero el patrón es menos especializado para un uso profundo del lado del servidor (por ejemplo, componentes del servidor con enrutamiento dinámico complejo).
|
|
47
|
-
- **Enrutamiento y Middleware**: El soporte para middleware es posible, pero limitado. Normalmente, se basa en el `Middleware` de Next.js para la detección de idiomas o configuración manual para reescribir rutas de idiomas.
|
|
48
|
-
- **Simplicidad de configuración**: Muy directo. Se necesita un mínimo de estructura.
|
|
43
|
+
---
|
|
49
44
|
|
|
50
|
-
|
|
45
|
+
## Comparación de características lado a lado (enfocado en Next.js)
|
|
46
|
+
|
|
47
|
+
| Característica | `next-intlayer` (Intlayer) | `next-intl` | `next-i18next` |
|
|
48
|
+
| ---------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------- |
|
|
49
|
+
| **Traducciones Cerca de los Componentes** | ✅ Sí, contenido colocalizado con cada componente | ❌ No | ❌ No |
|
|
50
|
+
| **Integración con TypeScript** | ✅ Avanzada, tipos estrictos generados automáticamente | ✅ Buena | ⚠️ Básica |
|
|
51
|
+
| **Detección de Traducciones Faltantes** | ✅ Resaltado de errores en TypeScript y error/advertencia en tiempo de compilación | ⚠️ Recurso alternativo en tiempo de ejecución | ⚠️ Recurso alternativo en tiempo de ejecución |
|
|
52
|
+
| **Contenido Enriquecido (JSX/Markdown/componentes)** | ✅ Soporte directo | ❌ No diseñado para nodos enriquecidos | ⚠️ Limitado |
|
|
53
|
+
| **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 |
|
|
54
|
+
| **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 |
|
|
55
|
+
| **Enrutamiento Localizado** | ✅ Sí, soporta rutas localizadas desde el inicio (funciona con Next.js y Vite) | ✅ Integrado, App Router soporta el segmento `[locale]` | ✅ Integrado |
|
|
56
|
+
| **Generación Dinámica de Rutas** | ✅ Sí | ✅ Sí | ✅ Sí |
|
|
57
|
+
| **Pluralización** | ✅ Patrones basados en enumeraciones | ✅ Bueno | ✅ Bueno |
|
|
58
|
+
| **Formato (fechas, números, monedas)** | ✅ Formateadores optimizados (Intl en el núcleo) | ✅ Bueno (helpers de Intl) | ✅ Bueno (helpers de Intl) |
|
|
59
|
+
| **Formato de contenido** | ✅ .tsx, .ts, .js, .json, .md, .txt, (.yaml en desarrollo) | ✅ .json, .js, .ts | ⚠️ .json |
|
|
60
|
+
| **Soporte ICU** | ⚠️ En desarrollo | ✅ Sí | ⚠️ A través de plugin (`i18next-icu`) |
|
|
61
|
+
| **Ayudantes SEO (hreflang, sitemap)** | ✅ Herramientas integradas: ayudantes para sitemap, robots.txt, metadatos | ✅ Bueno | ✅ Bueno |
|
|
62
|
+
| **Ecosistema / Comunidad** | ⚠️ Más pequeño pero creciendo rápido y reactivo | ✅ Mediano, enfocado en Next.js | ✅ Mediano, enfocado en Next.js |
|
|
63
|
+
| **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 | ⚠️ Soportado a nivel de página pero es necesario pasar funciones t en el árbol de componentes para los componentes hijos del servidor |
|
|
64
|
+
| **Tree-shaking (cargar solo contenido usado)** | ✅ Sí, por componente en tiempo de compilación mediante plugins de Babel/SWC | ⚠️ Parcial | ⚠️ Parcial |
|
|
65
|
+
| **Carga diferida** | ✅ Sí, por localización / por diccionario | ✅ Sí (por ruta/por localización), requiere gestión de espacios de nombres | ✅ Sí (por ruta/por localización), requiere gestión de espacios de nombres |
|
|
66
|
+
| **Eliminación de contenido no usado** | ✅ Sí, por diccionario en tiempo de compilación | ❌ No, puede ser gestionado manualmente con gestión de espacios de nombres | ❌ No, puede ser gestionado manualmente con gestión de espacios de nombres |
|
|
67
|
+
| **Gestión de Proyectos Grandes** | ✅ Fomenta la modularidad, adecuado para sistemas de diseño | ✅ Modular con configuración | ✅ Modular con configuración |
|
|
51
68
|
|
|
52
69
|
---
|
|
53
70
|
|
|
54
|
-
|
|
71
|
+
## Comparación detallada
|
|
55
72
|
|
|
56
|
-
|
|
73
|
+
### 1) Arquitectura y escalabilidad
|
|
57
74
|
|
|
58
|
-
- **
|
|
59
|
-
- **
|
|
60
|
-
- **Traducciones faltantes**: i18next ofrece interpolación/retiros. Sin embargo, la detección de traducciones faltantes normalmente requiere configuración adicional o complementos de terceros.
|
|
61
|
-
- **Soporte para Componentes del Servidor**: Se documenta el uso básico con Next.js 13, pero el uso avanzado (por ejemplo, integración profunda con componentes del servidor, generación de rutas dinámicas) puede ser complicado.
|
|
62
|
-
- **Enrutamiento y Middleware**: Se basa en gran medida en el `Middleware` de Next.js y reescrituras para subrutas de idiomas. Para configuraciones más complejas, es posible que debas profundizar en la configuración avanzada de i18next.
|
|
63
|
-
- **Simplicidad de configuración**: Enfoque familiar para aquellos acostumbrados a i18next. Sin embargo, puede volverse más pesado en boilerplate cuando se necesitan características avanzadas de i18n (nombres de espacio, múltiples idiomas de retroceso, etc.).
|
|
75
|
+
- **next-intl / next-i18next**: Por defecto usan **catálogos centralizados** por localización (más **espacios de nombres** en i18next). Funciona bien al principio, pero a menudo se convierte en una gran área compartida con aumento del acoplamiento y cambios frecuentes en las claves.
|
|
76
|
+
- **Intlayer**: Fomenta diccionarios **por componente** (o por funcionalidad) **ubicados junto** al código al que sirven. Esto reduce la carga cognitiva, facilita la duplicación/migración de piezas de la interfaz y disminuye los conflictos entre equipos. El contenido no utilizado es naturalmente más fácil de detectar y eliminar.
|
|
64
77
|
|
|
65
|
-
**
|
|
78
|
+
**Por qué importa:** En bases de código grandes o configuraciones de sistemas de diseño, el **contenido modular** escala mejor que los catálogos monolíticos.
|
|
66
79
|
|
|
67
80
|
---
|
|
68
81
|
|
|
69
|
-
###
|
|
70
|
-
|
|
71
|
-
**Enfoque principal**: Una moderna biblioteca de i18n de código abierto específicamente diseñada para el **App Router** de Next.js (12, 13, 14 y 15) con soporte integrado para **Componentes del Servidor** y **Turbopack**.
|
|
82
|
+
### 2) TypeScript y seguridad
|
|
72
83
|
|
|
73
|
-
|
|
84
|
+
- **next-intl**: Soporte sólido para TypeScript, pero **las claves no están estrictamente tipadas por defecto**; deberás mantener los patrones de seguridad manualmente.
|
|
85
|
+
- **next-i18next**: Tipos base para hooks; **la tipificación estricta de claves requiere herramientas/configuración adicional**.
|
|
86
|
+
- **Intlayer**: **Genera tipos estrictos** a partir de tu contenido. La **autocompletación en el IDE** y los **errores en tiempo de compilación** detectan errores tipográficos y claves faltantes antes del despliegue.
|
|
74
87
|
|
|
75
|
-
|
|
88
|
+
**Por qué es importante:** La tipificación fuerte desplaza las fallas hacia la **izquierda** (CI/compilación) en lugar de hacia la **derecha** (tiempo de ejecución).
|
|
76
89
|
|
|
77
|
-
|
|
78
|
-
- Esto hace que tu código sea más **modular y mantenible**, especialmente en grandes bases de código.
|
|
79
|
-
|
|
80
|
-
2. **Soporte para TypeScript**
|
|
81
|
-
|
|
82
|
-
- **Definiciones de tipo generadas automáticamente**: En el momento en que defines tu contenido, Intlayer genera tipos que potencian la autocompletar y detectan errores de traducción.
|
|
83
|
-
- Minimiza errores en tiempo de ejecución como claves faltantes y ofrece avanzado **autocompletar** directamente en tu IDE.
|
|
84
|
-
|
|
85
|
-
3. **Gestión de Traducciones Faltantes**
|
|
90
|
+
---
|
|
86
91
|
|
|
87
|
-
|
|
88
|
-
- Esto asegura que nunca envíes accidentalmente texto faltante entre tus idiomas.
|
|
92
|
+
### 3) Manejo de traducciones faltantes
|
|
89
93
|
|
|
90
|
-
|
|
94
|
+
- **next-intl / next-i18next**: Dependen de **respaldo en tiempo de ejecución** (por ejemplo, mostrar la clave o la configuración regional predeterminada). La compilación no falla.
|
|
95
|
+
- **Intlayer**: **Detección en tiempo de compilación** con **advertencias/errores** para locales o claves faltantes.
|
|
91
96
|
|
|
92
|
-
|
|
93
|
-
- Proporciona proveedores especializados (`IntlayerServerProvider`, `IntlayerClientProvider`) para **separar el contexto del servidor** (vital al tratar con Next.js 13+).
|
|
97
|
+
**Por qué es importante:** Detectar vacíos durante la compilación previene “cadenas misteriosas” en producción y se alinea con políticas estrictas de lanzamiento.
|
|
94
98
|
|
|
95
|
-
|
|
99
|
+
---
|
|
96
100
|
|
|
97
|
-
|
|
98
|
-
- Maneja dinámicamente rutas localizadas (por ejemplo, `/en-US/about` vs. `/fr/about`) con configuración mínima.
|
|
99
|
-
- Ofrece métodos de ayuda como `getMultilingualUrls` para generar enlaces de idiomas alternativos (genial para **SEO**).
|
|
101
|
+
### 4) Enrutamiento, middleware y estrategia de URL
|
|
100
102
|
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
- Un complemento envolvente `withIntlayer(nextConfig)` que **inyecta** todas las variables de entorno y observadores para tu contenido.
|
|
104
|
-
- **Sin grandes configuraciones de retroceso**: el sistema está diseñado para "funcionar" de inmediato con mínima fricción.
|
|
103
|
+
- Los tres funcionan con **enrutamiento localizado de Next.js** en el App Router.
|
|
104
|
+
- **Intlayer** va más allá con **middleware i18n** (detección de locale vía headers/cookies) y **helpers** para generar URLs localizadas y etiquetas `<link rel="alternate" hreflang="…">`.
|
|
105
105
|
|
|
106
|
-
|
|
106
|
+
**Por qué es importante:** Menos capas personalizadas; **UX consistente** y **SEO limpio** en todas las locales.
|
|
107
107
|
|
|
108
108
|
---
|
|
109
109
|
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
| **Característica** | **next-intl** | **next-i18next** | **Intlayer** |
|
|
113
|
-
| -------------------------------------------------- | -------------------------------------------- | ------------------------------------------------------ | --------------------------------------------------- |
|
|
114
|
-
| **Mantener traducciones cerca de los componentes** | Parcial - típicamente una carpeta de locales | No por defecto - a menudo `public/locales` | **Sí - recomendado y fácil** |
|
|
115
|
-
| **TypeScript Autogenerado** | Definiciones de TS básicas | Soporte básico de TS | **Sí - avanzado lista para usar** |
|
|
116
|
-
| **Detección de traducciones faltantes** | Principalmente cadenas de retroceso | Principalmente cadenas de retroceso | **Sí - comprobaciones en tiempo de construcción** |
|
|
117
|
-
| **Soporte para Componentes del Servidor** | Funciona pero no está especializado | Soportado pero puede ser verboso | **Soporte total con proveedores especializados** |
|
|
118
|
-
| **Enrutamiento y Middleware** | Integrado manualmente con middleware de Next | Proporcionado a través de configuración de reescritura | **Middleware de i18n dedicado + ganchos avanzados** |
|
|
119
|
-
| **Complejidad de configuración** | Simple, configuración mínima | Tradicional, puede ser verbosa para uso avanzado | **Un archivo de configuración y complemento** |
|
|
120
|
-
|
|
121
|
-
---
|
|
110
|
+
### 5) Alineación con Componentes del Servidor (RSC)
|
|
122
111
|
|
|
123
|
-
|
|
112
|
+
- **Todos** soportan Next.js 13+.
|
|
113
|
+
- **Intlayer** suaviza la **frontera servidor/cliente** con una API consistente y proveedores diseñados para RSC, para que no tengas que pasar formateadores o funciones t a través de árboles de componentes.
|
|
124
114
|
|
|
125
|
-
|
|
115
|
+
**Por qué es importante:** Modelo mental más limpio y menos casos límite en árboles híbridos.
|
|
126
116
|
|
|
127
|
-
|
|
117
|
+
---
|
|
128
118
|
|
|
129
|
-
|
|
119
|
+
### 6) Rendimiento y comportamiento de carga
|
|
130
120
|
|
|
131
|
-
|
|
121
|
+
- **next-intl / next-i18next**: Control parcial mediante **namespaces** y **divisiones a nivel de ruta**; riesgo de incluir cadenas no usadas si no se mantiene la disciplina.
|
|
122
|
+
- **Intlayer**: Realiza **tree-shaking** en la compilación y **carga perezosa por diccionario/locale**. El contenido no usado no se incluye.
|
|
132
123
|
|
|
133
|
-
|
|
124
|
+
**Por qué es importante:** Paquetes más pequeños y arranque más rápido, especialmente en sitios con múltiples locales.
|
|
134
125
|
|
|
135
|
-
|
|
126
|
+
---
|
|
136
127
|
|
|
137
|
-
|
|
128
|
+
### 7) Experiencia de desarrollo (DX), herramientas y mantenimiento
|
|
138
129
|
|
|
139
|
-
|
|
130
|
+
- **next-intl / next-i18next**: Normalmente conectarás plataformas externas para traducciones y flujos editoriales.
|
|
131
|
+
- **Intlayer**: Incluye un **Editor Visual gratuito** y un **CMS opcional** (compatible con Git o externalizado). Además, una **extensión para VSCode** para la creación de contenido y **traducciones asistidas por IA** usando tus propias claves de proveedor.
|
|
140
132
|
|
|
141
|
-
|
|
142
|
-
- Un `intlayerMiddleware` estándar no requiere reescrituras personalizadas profundas.
|
|
133
|
+
**Por qué es importante:** Reduce los costos operativos y acorta el ciclo entre desarrolladores y autores de contenido.
|
|
143
134
|
|
|
144
|
-
|
|
135
|
+
---
|
|
145
136
|
|
|
146
|
-
|
|
147
|
-
- Uso claro y directo para componentes **del servidor** y **del cliente** a través de `IntlayerServerProvider` y `IntlayerClientProvider`.
|
|
137
|
+
## ¿Cuándo elegir cuál?
|
|
148
138
|
|
|
149
|
-
|
|
150
|
-
|
|
139
|
+
- **Elige next-intl** si quieres una solución **mínima**, te sientes cómodo con catálogos centralizados y tu aplicación es de tamaño **pequeño a mediano**.
|
|
140
|
+
- **Elige next-i18next** si necesitas el **ecosistema de plugins de i18next** (por ejemplo, reglas avanzadas ICU mediante plugins) y tu equipo ya conoce i18next, aceptando **más configuración** para mayor flexibilidad.
|
|
141
|
+
- **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 **Next.js App Router** y **bases de código grandes y modulares**.
|
|
151
142
|
|
|
152
143
|
---
|
|
153
144
|
|
|
154
|
-
##
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
1. **Instalar y configurar**
|
|
162
|
-
|
|
163
|
-
```bash
|
|
164
|
-
npm install intlayer next-intlayer
|
|
165
|
-
```
|
|
166
|
-
|
|
167
|
-
```ts
|
|
168
|
-
// intlayer.config.ts
|
|
169
|
-
import { Locales, type IntlayerConfig } from "intlayer";
|
|
170
|
-
|
|
171
|
-
const config: IntlayerConfig = {
|
|
172
|
-
internationalization: {
|
|
173
|
-
locales: [Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH],
|
|
174
|
-
defaultLocale: Locales.ENGLISH,
|
|
175
|
-
},
|
|
176
|
-
};
|
|
177
|
-
export default config;
|
|
178
|
-
```
|
|
179
|
-
|
|
180
|
-
2. **Usar el complemento**
|
|
181
|
-
|
|
182
|
-
```ts
|
|
183
|
-
// next.config.mjs
|
|
184
|
-
import { withIntlayer } from "next-intlayer/server";
|
|
185
|
-
|
|
186
|
-
/** @type {import('next').NextConfig} */
|
|
187
|
-
const nextConfig = {};
|
|
188
|
-
|
|
189
|
-
export default withIntlayer(nextConfig);
|
|
190
|
-
```
|
|
191
|
-
|
|
192
|
-
3. **Agregar Middleware**
|
|
193
|
-
|
|
194
|
-
```ts
|
|
195
|
-
// src/middleware.ts
|
|
196
|
-
export { intlayerMiddleware as middleware } from "next-intlayer/middleware";
|
|
197
|
-
|
|
198
|
-
export const config = {
|
|
199
|
-
matcher:
|
|
200
|
-
"/((?!api|static|assets|robots|sitemap|sw|service-worker|manifest|.*\\..*|_next).*)",
|
|
201
|
-
};
|
|
202
|
-
```
|
|
203
|
-
|
|
204
|
-
4. **Crear un diseño localizado**
|
|
205
|
-
|
|
206
|
-
```tsx
|
|
207
|
-
// src/app/[locale]/layout.tsx
|
|
208
|
-
import { getHTMLTextDir } from "intlayer";
|
|
209
|
-
import { NextLayoutIntlayer } from "next-intlayer";
|
|
210
|
-
|
|
211
|
-
const LocaleLayout: NextLayoutIntlayer = async ({ children, params }) => {
|
|
212
|
-
const { locale } = params;
|
|
213
|
-
return (
|
|
214
|
-
<html lang={locale} dir={getHTMLTextDir(locale)}>
|
|
215
|
-
<body>{children}</body>
|
|
216
|
-
</html>
|
|
217
|
-
);
|
|
218
|
-
};
|
|
219
|
-
|
|
220
|
-
export { generateStaticParams } from "next-intlayer";
|
|
221
|
-
export default LocaleLayout;
|
|
222
|
-
```
|
|
223
|
-
|
|
224
|
-
5. **Declarar y usar contenido**
|
|
225
|
-
|
|
226
|
-
```tsx
|
|
227
|
-
// src/app/[locale]/page.content.ts
|
|
228
|
-
import { t } from "intlayer";
|
|
229
|
-
|
|
230
|
-
export default {
|
|
231
|
-
key: "page",
|
|
232
|
-
content: {
|
|
233
|
-
getStarted: {
|
|
234
|
-
main: t({
|
|
235
|
-
en: "Get started by editing",
|
|
236
|
-
fr: "Commencez par éditer",
|
|
237
|
-
es: "Comience por editar",
|
|
238
|
-
}),
|
|
239
|
-
pageLink: "src/app/page.tsx",
|
|
240
|
-
},
|
|
241
|
-
},
|
|
242
|
-
};
|
|
243
|
-
```
|
|
244
|
-
|
|
245
|
-
```tsx
|
|
246
|
-
// src/app/[locale]/page.tsx
|
|
247
|
-
import { IntlayerServerProvider } from "next-intlayer/server";
|
|
248
|
-
import { IntlayerClientProvider, useIntlayer } from "next-intlayer";
|
|
249
|
-
|
|
250
|
-
const PageContent = () => {
|
|
251
|
-
const { content } = useIntlayer("page");
|
|
252
|
-
return (
|
|
253
|
-
<>
|
|
254
|
-
<p>{content.getStarted.main}</p>
|
|
255
|
-
<code>{content.getStarted.pageLink}</code>
|
|
256
|
-
</>
|
|
257
|
-
);
|
|
258
|
-
};
|
|
259
|
-
|
|
260
|
-
export default function Page({ params }) {
|
|
261
|
-
return (
|
|
262
|
-
<IntlayerServerProvider locale={params.locale}>
|
|
263
|
-
<IntlayerClientProvider locale={params.locale}>
|
|
264
|
-
<PageContent />
|
|
265
|
-
</IntlayerClientProvider>
|
|
266
|
-
</IntlayerServerProvider>
|
|
267
|
-
);
|
|
268
|
-
}
|
|
269
|
-
```
|
|
270
|
-
|
|
271
|
-
</details>
|
|
145
|
+
## Notas prácticas de migración (next-intl / next-i18next → Intlayer)
|
|
146
|
+
|
|
147
|
+
- **Comience por función**: Mueva una ruta o componente a la vez a **diccionarios locales**.
|
|
148
|
+
- **Mantenga los catálogos antiguos en paralelo**: Haga una transición gradual durante la migración; evite un cambio radical.
|
|
149
|
+
- **Active las comprobaciones estrictas**: Permita que la detección en tiempo de compilación revele las brechas temprano.
|
|
150
|
+
- **Adopte middleware y ayudantes**: Estandarice la detección de locales y las etiquetas SEO en todo el sitio.
|
|
151
|
+
- **Mida los paquetes**: Espere **reducciones en el tamaño del paquete** a medida que se elimina contenido no utilizado.
|
|
272
152
|
|
|
273
153
|
---
|
|
274
154
|
|
|
275
155
|
## Conclusión
|
|
276
156
|
|
|
277
|
-
|
|
157
|
+
Las tres bibliotecas tienen éxito en la localización básica. La diferencia está en **cuánto trabajo debe hacer** para lograr una configuración robusta y escalable en **Next.js moderno**:
|
|
278
158
|
|
|
279
|
-
- **
|
|
280
|
-
-
|
|
281
|
-
- Ofrecer **auto-generación poderosa de TypeScript** para código más seguro
|
|
282
|
-
- Manejar **traducciones faltantes** en tiempo de construcción
|
|
283
|
-
- Proporcionar un **enfoque simplificado y de configuración única** con enrutamiento y middleware avanzados
|
|
159
|
+
- Con **Intlayer**, el **contenido modular**, **TS estricto**, **seguridad en tiempo de compilación**, **paquetes optimizados (tree-shaken)** y **herramientas de App Router + SEO de primera clase** son **valores predeterminados**, no tareas.
|
|
160
|
+
- Si tu equipo valora la **mantenibilidad y velocidad** en una aplicación multilingüe impulsada por componentes, Intlayer ofrece la experiencia **más completa** hoy en día.
|
|
284
161
|
|
|
285
|
-
|
|
162
|
+
Consulta el documento ['¿Por qué Intlayer?'](https://intlayer.org/doc/why) para más detalles.
|