@intlayer/docs 8.9.4-canary.0 → 8.9.5
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/dist/cjs/generated/docs.entry.cjs +20 -0
- package/dist/cjs/generated/docs.entry.cjs.map +1 -1
- package/dist/esm/generated/docs.entry.mjs +20 -0
- package/dist/esm/generated/docs.entry.mjs.map +1 -1
- package/dist/types/generated/docs.entry.d.ts +1 -0
- package/dist/types/generated/docs.entry.d.ts.map +1 -1
- package/docs/ar/benchmark/index.md +0 -3
- package/docs/ar/benchmark/nextjs.md +15 -6
- package/docs/ar/benchmark/solid.md +155 -0
- package/docs/ar/benchmark/svelte.md +148 -0
- package/docs/ar/benchmark/tanstack.md +12 -3
- package/docs/ar/benchmark/vue.md +160 -0
- package/docs/ar/configuration.md +16 -12
- package/docs/ar/dictionary/content_file.md +51 -1
- package/docs/ar/mcp_server.md +30 -17
- package/docs/ar/plugins/sync-po.md +333 -0
- package/docs/bn/configuration.md +16 -12
- package/docs/cs/configuration.md +16 -12
- package/docs/de/benchmark/index.md +0 -3
- package/docs/de/benchmark/nextjs.md +15 -6
- package/docs/de/benchmark/solid.md +155 -0
- package/docs/de/benchmark/svelte.md +148 -0
- package/docs/de/benchmark/tanstack.md +12 -3
- package/docs/de/benchmark/vue.md +160 -0
- package/docs/de/configuration.md +16 -12
- package/docs/de/dictionary/content_file.md +52 -2
- package/docs/de/mcp_server.md +29 -16
- package/docs/de/plugins/sync-po.md +332 -0
- package/docs/en/benchmark/nextjs.md +11 -2
- package/docs/en/benchmark/solid.md +22 -4
- package/docs/en/benchmark/svelte.md +17 -5
- package/docs/en/benchmark/tanstack.md +18 -3
- package/docs/en/benchmark/vue.md +17 -11
- package/docs/en/configuration.md +16 -13
- package/docs/en/dictionary/content_file.md +51 -1
- package/docs/en/mcp_server.md +31 -18
- package/docs/en/plugins/sync-po.md +333 -0
- package/docs/en-GB/benchmark/index.md +0 -3
- package/docs/en-GB/benchmark/nextjs.md +15 -6
- package/docs/en-GB/benchmark/solid.md +155 -0
- package/docs/en-GB/benchmark/svelte.md +148 -0
- package/docs/en-GB/benchmark/tanstack.md +12 -3
- package/docs/en-GB/benchmark/vue.md +160 -0
- package/docs/en-GB/configuration.md +15 -11
- package/docs/en-GB/dictionary/content_file.md +51 -1
- package/docs/en-GB/mcp_server.md +31 -18
- package/docs/en-GB/plugins/sync-po.md +333 -0
- package/docs/es/benchmark/index.md +0 -3
- package/docs/es/benchmark/nextjs.md +15 -6
- package/docs/es/benchmark/solid.md +155 -0
- package/docs/es/benchmark/svelte.md +148 -0
- package/docs/es/benchmark/tanstack.md +12 -3
- package/docs/es/benchmark/vue.md +160 -0
- package/docs/es/configuration.md +16 -12
- package/docs/es/dictionary/content_file.md +51 -1
- package/docs/es/mcp_server.md +30 -17
- package/docs/es/plugins/sync-po.md +333 -0
- package/docs/fr/benchmark/index.md +0 -3
- package/docs/fr/benchmark/nextjs.md +15 -6
- package/docs/fr/benchmark/solid.md +155 -0
- package/docs/fr/benchmark/svelte.md +148 -0
- package/docs/fr/benchmark/tanstack.md +12 -3
- package/docs/fr/benchmark/vue.md +160 -0
- package/docs/fr/configuration.md +16 -12
- package/docs/fr/dictionary/content_file.md +51 -1
- package/docs/fr/mcp_server.md +30 -17
- package/docs/fr/plugins/sync-po.md +333 -0
- package/docs/hi/benchmark/nextjs.md +15 -6
- package/docs/hi/benchmark/solid.md +155 -0
- package/docs/hi/benchmark/svelte.md +148 -0
- package/docs/hi/benchmark/tanstack.md +12 -3
- package/docs/hi/benchmark/vue.md +160 -0
- package/docs/hi/configuration.md +16 -12
- package/docs/hi/dictionary/content_file.md +51 -1
- package/docs/hi/mcp_server.md +31 -18
- package/docs/hi/plugins/sync-po.md +333 -0
- package/docs/id/benchmark/index.md +0 -3
- package/docs/id/benchmark/nextjs.md +15 -6
- package/docs/id/benchmark/solid.md +155 -0
- package/docs/id/benchmark/svelte.md +148 -0
- package/docs/id/benchmark/tanstack.md +12 -3
- package/docs/id/benchmark/vue.md +160 -0
- package/docs/id/configuration.md +16 -12
- package/docs/id/dictionary/content_file.md +51 -1
- package/docs/id/mcp_server.md +30 -17
- package/docs/id/plugins/sync-po.md +333 -0
- package/docs/it/benchmark/index.md +1 -4
- package/docs/it/benchmark/nextjs.md +15 -6
- package/docs/it/benchmark/solid.md +155 -0
- package/docs/it/benchmark/svelte.md +148 -0
- package/docs/it/benchmark/tanstack.md +12 -3
- package/docs/it/benchmark/vue.md +160 -0
- package/docs/it/configuration.md +16 -12
- package/docs/it/dictionary/content_file.md +51 -1
- package/docs/it/mcp_server.md +30 -17
- package/docs/it/plugins/sync-po.md +333 -0
- package/docs/ja/benchmark/index.md +5 -5
- package/docs/ja/benchmark/nextjs.md +15 -6
- package/docs/ja/benchmark/solid.md +155 -0
- package/docs/ja/benchmark/svelte.md +148 -0
- package/docs/ja/benchmark/tanstack.md +12 -3
- package/docs/ja/benchmark/vue.md +160 -0
- package/docs/ja/configuration.md +16 -12
- package/docs/ja/dictionary/content_file.md +50 -2
- package/docs/ja/intlayer_with_nextjs_no_locale_path.md +4 -3
- package/docs/ja/mcp_server.md +29 -16
- package/docs/ja/plugins/sync-po.md +333 -0
- package/docs/ko/benchmark/nextjs.md +15 -6
- package/docs/ko/benchmark/solid.md +155 -0
- package/docs/ko/benchmark/svelte.md +148 -0
- package/docs/ko/benchmark/tanstack.md +12 -3
- package/docs/ko/benchmark/vue.md +160 -0
- package/docs/ko/configuration.md +16 -12
- package/docs/ko/dictionary/content_file.md +51 -1
- package/docs/ko/intlayer_with_nextjs_no_locale_path.md +3 -2
- package/docs/ko/mcp_server.md +31 -18
- package/docs/ko/plugins/sync-po.md +333 -0
- package/docs/nl/configuration.md +16 -12
- package/docs/pl/benchmark/index.md +0 -3
- package/docs/pl/benchmark/nextjs.md +15 -6
- package/docs/pl/benchmark/solid.md +155 -0
- package/docs/pl/benchmark/svelte.md +148 -0
- package/docs/pl/benchmark/tanstack.md +12 -3
- package/docs/pl/benchmark/vue.md +160 -0
- package/docs/pl/configuration.md +16 -12
- package/docs/pl/dictionary/content_file.md +51 -1
- package/docs/pl/mcp_server.md +30 -17
- package/docs/pl/plugins/sync-po.md +333 -0
- package/docs/pt/benchmark/index.md +0 -3
- package/docs/pt/benchmark/nextjs.md +16 -7
- package/docs/pt/benchmark/solid.md +155 -0
- package/docs/pt/benchmark/svelte.md +148 -0
- package/docs/pt/benchmark/tanstack.md +13 -4
- package/docs/pt/benchmark/vue.md +160 -0
- package/docs/pt/configuration.md +16 -12
- package/docs/pt/dictionary/content_file.md +51 -1
- package/docs/pt/mcp_server.md +30 -17
- package/docs/pt/plugins/sync-po.md +333 -0
- package/docs/ru/benchmark/nextjs.md +15 -6
- package/docs/ru/benchmark/solid.md +155 -0
- package/docs/ru/benchmark/svelte.md +148 -0
- package/docs/ru/benchmark/tanstack.md +12 -3
- package/docs/ru/benchmark/vue.md +160 -0
- package/docs/ru/configuration.md +16 -12
- package/docs/ru/dictionary/content_file.md +52 -2
- package/docs/ru/mcp_server.md +30 -17
- package/docs/ru/plugins/sync-po.md +333 -0
- package/docs/tr/benchmark/index.md +0 -3
- package/docs/tr/benchmark/nextjs.md +15 -6
- package/docs/tr/benchmark/solid.md +155 -0
- package/docs/tr/benchmark/svelte.md +148 -0
- package/docs/tr/benchmark/tanstack.md +12 -3
- package/docs/tr/benchmark/vue.md +160 -0
- package/docs/tr/configuration.md +16 -12
- package/docs/tr/dictionary/content_file.md +51 -1
- package/docs/tr/mcp_server.md +31 -18
- package/docs/tr/plugins/sync-po.md +333 -0
- package/docs/uk/benchmark/nextjs.md +15 -6
- package/docs/uk/benchmark/solid.md +155 -0
- package/docs/uk/benchmark/svelte.md +148 -0
- package/docs/uk/benchmark/tanstack.md +12 -3
- package/docs/uk/benchmark/vue.md +160 -0
- package/docs/uk/configuration.md +16 -12
- package/docs/uk/dictionary/content_file.md +51 -1
- package/docs/uk/mcp_server.md +29 -16
- package/docs/uk/plugins/sync-po.md +333 -0
- package/docs/ur/configuration.md +16 -12
- package/docs/vi/benchmark/index.md +0 -3
- package/docs/vi/benchmark/nextjs.md +15 -6
- package/docs/vi/benchmark/solid.md +155 -0
- package/docs/vi/benchmark/svelte.md +148 -0
- package/docs/vi/benchmark/tanstack.md +12 -3
- package/docs/vi/benchmark/vue.md +160 -0
- package/docs/vi/configuration.md +16 -12
- package/docs/vi/dictionary/content_file.md +51 -1
- package/docs/vi/intlayer_with_nextjs_15.md +10 -57
- package/docs/vi/mcp_server.md +30 -17
- package/docs/vi/plugins/sync-po.md +333 -0
- package/docs/zh/benchmark/nextjs.md +15 -6
- package/docs/zh/benchmark/solid.md +155 -0
- package/docs/zh/benchmark/svelte.md +148 -0
- package/docs/zh/benchmark/tanstack.md +12 -3
- package/docs/zh/benchmark/vue.md +160 -0
- package/docs/zh/configuration.md +16 -12
- package/docs/zh/dictionary/content_file.md +51 -3
- package/docs/zh/mcp_server.md +31 -18
- package/docs/zh/plugins/sync-po.md +333 -0
- package/frequent_questions/ar/intlayerNode.md +3 -3
- package/frequent_questions/de/intlayerNode.md +3 -3
- package/frequent_questions/en/intlayerNode.md +3 -3
- package/frequent_questions/en-GB/intlayerNode.md +3 -3
- package/frequent_questions/es/intlayerNode.md +3 -3
- package/frequent_questions/fr/intlayerNode.md +3 -3
- package/frequent_questions/hi/intlayerNode.md +3 -3
- package/frequent_questions/id/intlayerNode.md +3 -3
- package/frequent_questions/it/intlayerNode.md +3 -3
- package/frequent_questions/ja/intlayerNode.md +3 -3
- package/frequent_questions/ko/intlayerNode.md +3 -3
- package/frequent_questions/pl/intlayerNode.md +3 -3
- package/frequent_questions/pt/intlayerNode.md +3 -3
- package/frequent_questions/ru/intlayerNode.md +3 -3
- package/frequent_questions/tr/intlayerNode.md +3 -3
- package/frequent_questions/uk/intlayerNode.md +3 -3
- package/frequent_questions/vi/intlayerNode.md +3 -3
- package/frequent_questions/zh/intlayerNode.md +3 -3
- package/package.json +8 -8
- package/src/generated/docs.entry.ts +20 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
createdAt: 2025-02-07
|
|
3
|
-
updatedAt: 2026-
|
|
3
|
+
updatedAt: 2026-05-12
|
|
4
4
|
title: Archivo de Contenido
|
|
5
5
|
description: Aprende a personalizar las extensiones para tus archivos de declaración de contenido. Sigue esta documentación para implementar condiciones de manera eficiente en tu proyecto.
|
|
6
6
|
keywords:
|
|
@@ -12,6 +12,9 @@ slugs:
|
|
|
12
12
|
- concept
|
|
13
13
|
- content
|
|
14
14
|
history:
|
|
15
|
+
- version: 8.9.0
|
|
16
|
+
date: 2026-05-12
|
|
17
|
+
changes: "Añadir tipo de nodo de contenido `plural`"
|
|
15
18
|
- version: 8.0.0
|
|
16
19
|
date: 2026-01-28
|
|
17
20
|
changes: "Añadir tipo de nodo de contenido `html`"
|
|
@@ -66,6 +69,7 @@ import { type ReactNode } from "react";
|
|
|
66
69
|
import {
|
|
67
70
|
t,
|
|
68
71
|
enu,
|
|
72
|
+
plural,
|
|
69
73
|
cond,
|
|
70
74
|
nest,
|
|
71
75
|
md,
|
|
@@ -85,6 +89,7 @@ interface Content {
|
|
|
85
89
|
};
|
|
86
90
|
multilingualContent: string;
|
|
87
91
|
quantityContent: string;
|
|
92
|
+
pluralContent: string;
|
|
88
93
|
conditionalContent: string;
|
|
89
94
|
markdownContent: never;
|
|
90
95
|
htmlContent: never;
|
|
@@ -120,6 +125,10 @@ export default {
|
|
|
120
125
|
">5": "Algunos coches",
|
|
121
126
|
">19": "Muchos coches",
|
|
122
127
|
}),
|
|
128
|
+
pluralContent: plural({
|
|
129
|
+
one: "One car",
|
|
130
|
+
other: "{{count}} cars",
|
|
131
|
+
}),
|
|
123
132
|
conditionalContent: cond({
|
|
124
133
|
true: "La validación está habilitada",
|
|
125
134
|
false: "La validación está deshabilitada",
|
|
@@ -174,6 +183,13 @@ export default {
|
|
|
174
183
|
">5": "Algunos coches",
|
|
175
184
|
">19": "Muchos coches",
|
|
176
185
|
},
|
|
186
|
+
"pluralContent": {
|
|
187
|
+
"nodeType": "plural",
|
|
188
|
+
"plural": {
|
|
189
|
+
"one": "One car",
|
|
190
|
+
"other": "{{count}} cars",
|
|
191
|
+
},
|
|
192
|
+
},
|
|
177
193
|
},
|
|
178
194
|
"conditionalContent": {
|
|
179
195
|
"nodeType": "condición",
|
|
@@ -221,6 +237,7 @@ Los nodos de contenido son los bloques de construcción del contenido del diccio
|
|
|
221
237
|
- **Valores primitivos**: cadenas, números, booleanos, null, undefined
|
|
222
238
|
- **Nodos tipados**: Tipos especiales de contenido como traducciones, condiciones, markdown, etc.
|
|
223
239
|
- **Funciones**: Contenido dinámico que puede evaluarse en tiempo de ejecución [ver Obtención de Funciones](https://github.com/aymericzip/intlayer/blob/main/docs/docs/es/dictionary/function_fetching.md)
|
|
240
|
+
- **Contenido Plural**: Ver Contenido Plural [Ver Contenido Plural](https://github.com/aymericzip/intlayer/blob/main/docs/docs/es/dictionary/plural.md)
|
|
224
241
|
- **Contenido anidado**: Referencias a otros diccionarios
|
|
225
242
|
|
|
226
243
|
#### Tipos de Contenido
|
|
@@ -539,6 +556,8 @@ multilingualContent: t({
|
|
|
539
556
|
});
|
|
540
557
|
```
|
|
541
558
|
|
|
559
|
+
> Ver [Contenido de Traducción (`t`) Doc](https://github.com/aymericzip/intlayer/blob/main/docs/docs/es/dictionary/translation.md) para más información.
|
|
560
|
+
|
|
542
561
|
### Contenido Condicional (`cond`)
|
|
543
562
|
|
|
544
563
|
Contenido que cambia basado en condiciones booleanas:
|
|
@@ -552,6 +571,8 @@ conditionalContent: cond({
|
|
|
552
571
|
});
|
|
553
572
|
```
|
|
554
573
|
|
|
574
|
+
> Ver [Contenido Condicional (`cond`) Doc](https://github.com/aymericzip/intlayer/blob/main/docs/docs/es/dictionary/condition.md) para más información.
|
|
575
|
+
|
|
555
576
|
### Contenido de Enumeración (`enu`)
|
|
556
577
|
|
|
557
578
|
Contenido que varía según valores enumerados:
|
|
@@ -566,6 +587,23 @@ statusContent: enu({
|
|
|
566
587
|
});
|
|
567
588
|
```
|
|
568
589
|
|
|
590
|
+
> Ver [Contenido de Enumeración (`enu`) Doc](https://github.com/aymericzip/intlayer/blob/main/docs/docs/es/dictionary/enumeration.md) para más información.
|
|
591
|
+
|
|
592
|
+
### Contenido Plural (`plural`)
|
|
593
|
+
|
|
594
|
+
Contenido que varía según las reglas de plural:
|
|
595
|
+
|
|
596
|
+
```typescript
|
|
597
|
+
import { plural } from "intlayer";
|
|
598
|
+
|
|
599
|
+
pluralContent: plural({
|
|
600
|
+
one: "One car",
|
|
601
|
+
other: "{{count}} cars",
|
|
602
|
+
});
|
|
603
|
+
```
|
|
604
|
+
|
|
605
|
+
> Ver [Contenido Plural Doc](https://github.com/aymericzip/intlayer/blob/main/docs/docs/es/dictionary/plural.md) para más información.
|
|
606
|
+
|
|
569
607
|
### Contenido de Inserción (`insert`)
|
|
570
608
|
|
|
571
609
|
Contenido que puede ser insertado en otro contenido:
|
|
@@ -576,6 +614,8 @@ import { insert } from "intlayer";
|
|
|
576
614
|
insertionContent: insert("Este texto puede ser insertado en cualquier lugar");
|
|
577
615
|
```
|
|
578
616
|
|
|
617
|
+
> Ver [Contenido de Inserción (`insert`) Doc](https://github.com/aymericzip/intlayer/blob/main/docs/docs/es/dictionary/insertion.md) para más información.
|
|
618
|
+
|
|
579
619
|
### Contenido Anidado (`nest`)
|
|
580
620
|
|
|
581
621
|
Referencias a otros diccionarios:
|
|
@@ -586,6 +626,8 @@ import { nest } from "intlayer";
|
|
|
586
626
|
nestedContent: nest("about-page");
|
|
587
627
|
```
|
|
588
628
|
|
|
629
|
+
> Ver [Contenido Anidado (`nest`) Doc](https://github.com/aymericzip/intlayer/blob/main/docs/docs/es/dictionary/nesting.md) para más información.
|
|
630
|
+
|
|
589
631
|
### Contenido Markdown (`md`)
|
|
590
632
|
|
|
591
633
|
Contenido de texto enriquecido en formato Markdown:
|
|
@@ -598,6 +640,8 @@ markdownContent: md(
|
|
|
598
640
|
);
|
|
599
641
|
```
|
|
600
642
|
|
|
643
|
+
> Ver [Contenido Markdown (`md`) Doc](https://github.com/aymericzip/intlayer/blob/main/docs/docs/es/dictionary/markdown.md) para más información.
|
|
644
|
+
|
|
601
645
|
### Contenido HTML (`html`)
|
|
602
646
|
|
|
603
647
|
Contenido HTML enriquecido que puede usar etiquetas estándar o componentes personalizados:
|
|
@@ -615,6 +659,8 @@ localizedHtmlContent: t({
|
|
|
615
659
|
});
|
|
616
660
|
```
|
|
617
661
|
|
|
662
|
+
> Ver [Contenido HTML (`html`) Doc](https://github.com/aymericzip/intlayer/blob/main/docs/docs/es/dictionary/html.md) para más información.
|
|
663
|
+
|
|
618
664
|
### Contenido según género (`gender`)
|
|
619
665
|
|
|
620
666
|
Contenido que varía según el género:
|
|
@@ -629,6 +675,8 @@ genderContent: gender({
|
|
|
629
675
|
});
|
|
630
676
|
```
|
|
631
677
|
|
|
678
|
+
> Ver [Contenido según género (`gender`) Doc](https://github.com/aymericzip/intlayer/blob/main/docs/docs/es/dictionary/gender.md) para más información.
|
|
679
|
+
|
|
632
680
|
### Contenido de archivo (`file`)
|
|
633
681
|
|
|
634
682
|
Referencias a archivos externos:
|
|
@@ -639,6 +687,8 @@ import { file } from "intlayer";
|
|
|
639
687
|
fileContent: file("./path/to/content.txt");
|
|
640
688
|
```
|
|
641
689
|
|
|
690
|
+
> Ver [Contenido de archivo (`file`) Doc](https://github.com/aymericzip/intlayer/blob/main/docs/docs/es/dictionary/file.md) para más información.
|
|
691
|
+
|
|
642
692
|
## Creación de archivos de contenido
|
|
643
693
|
|
|
644
694
|
### Estructura básica de un archivo de contenido
|
package/docs/es/mcp_server.md
CHANGED
|
@@ -23,7 +23,7 @@ history:
|
|
|
23
23
|
changes: "Añadida configuración de Claude Desktop"
|
|
24
24
|
- version: 5.5.12
|
|
25
25
|
date: 2025-07-10
|
|
26
|
-
changes: "Añadido transporte
|
|
26
|
+
changes: "Añadido transporte Streamable HTTP y servidor remoto"
|
|
27
27
|
- version: 5.5.10
|
|
28
28
|
date: 2025-06-29
|
|
29
29
|
changes: "Historial inicial"
|
|
@@ -51,12 +51,12 @@ Al habilitar el Servidor MCP de Intlayer en tu IDE, desbloqueas:
|
|
|
51
51
|
|
|
52
52
|
> Consulta la lista completa de comandos y opciones en la [documentación de la CLI de Intlayer](https://github.com/aymericzip/intlayer/blob/main/docs/docs/es/cli/index.md).
|
|
53
53
|
|
|
54
|
-
## Servidor local (stdio) vs Servidor remoto (
|
|
54
|
+
## Servidor local (stdio) vs Servidor remoto (Streamable HTTP)
|
|
55
55
|
|
|
56
56
|
El servidor MCP se puede usar de dos maneras:
|
|
57
57
|
|
|
58
58
|
- Servidor local (stdio)
|
|
59
|
-
- Servidor remoto (
|
|
59
|
+
- Servidor remoto (Streamable HTTP)
|
|
60
60
|
|
|
61
61
|
### Servidor local (stdio) (recomendado)
|
|
62
62
|
|
|
@@ -64,7 +64,7 @@ Intlayer proporciona un paquete NPM que puede instalarse localmente en tu máqui
|
|
|
64
64
|
|
|
65
65
|
Este servidor es la forma recomendada de usar el servidor MCP, ya que integra todas las funcionalidades del servidor MCP, incluyendo las herramientas CLI.
|
|
66
66
|
|
|
67
|
-
### Servidor remoto (
|
|
67
|
+
### Servidor remoto (Streamable HTTP)
|
|
68
68
|
|
|
69
69
|
El servidor MCP también puede usarse de forma remota, utilizando el método de transporte SSE. Este servidor está alojado por Intlayer y está disponible en https://mcp.intlayer.org. Este servidor puede ser accedido públicamente, sin ninguna autenticación, y es gratuito para usar.
|
|
70
70
|
|
|
@@ -97,7 +97,7 @@ bun x intlayer init mcp
|
|
|
97
97
|
Este comando hará lo siguiente:
|
|
98
98
|
|
|
99
99
|
1. Te preguntará qué plataforma estás usando (Cursor, VS Code, Claude Desktop, etc.).
|
|
100
|
-
2. Te preguntará qué método de transporte quieres usar (Servidor local (stdio) o Servidor remoto (
|
|
100
|
+
2. Te preguntará qué método de transporte quieres usar (Servidor local (stdio) o Servidor remoto (Streamable HTTP)).
|
|
101
101
|
3. Actualizará automáticamente tu archivo de configuración (por ejemplo, `.cursor/mcp.json`, `.vscode/mcp.json`, o la configuración global de Claude Desktop).
|
|
102
102
|
|
|
103
103
|
---
|
|
@@ -107,7 +107,7 @@ Este comando hará lo siguiente:
|
|
|
107
107
|
1. Abre la paleta de comandos (Ctrl+Shift+P o Cmd+Shift+P).
|
|
108
108
|
2. Escribe `Intlayer: Setup AI Agent Skills`
|
|
109
109
|
3. Elige la plataforma que usas (ej. `VS Code`, `Cursor`, `Windsurf`, `OpenCode`, `Claude Code`, `GitHub Copilot Workspace`, etc.).
|
|
110
|
-
4. Elige el MCP a instalar (stdio,
|
|
110
|
+
4. Elige el MCP a instalar (stdio, Streamable HTTP)
|
|
111
111
|
5. Presiona Enter.
|
|
112
112
|
|
|
113
113
|
---
|
|
@@ -131,16 +131,16 @@ En la raíz de tu proyecto, agrega el siguiente archivo de configuración `.curs
|
|
|
131
131
|
}
|
|
132
132
|
```
|
|
133
133
|
|
|
134
|
-
### Servidor remoto (
|
|
134
|
+
### Servidor remoto (Streamable HTTP)
|
|
135
135
|
|
|
136
|
-
Para conectarte a un servidor Intlayer MCP remoto usando Server-Sent Events (
|
|
136
|
+
Para conectarte a un servidor Intlayer MCP remoto usando Server-Sent Events (Streamable HTTP), puedes configurar tu cliente MCP para conectarse al servicio alojado.
|
|
137
137
|
|
|
138
138
|
```json fileName=".cursor/mcp.json"
|
|
139
139
|
{
|
|
140
140
|
"mcpServers": {
|
|
141
|
-
"intlayer": {
|
|
142
|
-
"
|
|
143
|
-
"
|
|
141
|
+
"intlayer-sse": {
|
|
142
|
+
"command": "npx",
|
|
143
|
+
"args": ["-y", "mcp-remote@latest", "https://mcp.intlayer.org"]
|
|
144
144
|
}
|
|
145
145
|
}
|
|
146
146
|
}
|
|
@@ -172,16 +172,16 @@ Crea un archivo `.vscode/mcp.json` en la raíz de tu proyecto:
|
|
|
172
172
|
}
|
|
173
173
|
```
|
|
174
174
|
|
|
175
|
-
### Servidor remoto (
|
|
175
|
+
### Servidor remoto (Streamable HTTP)
|
|
176
176
|
|
|
177
|
-
Para conectarte a un servidor Intlayer MCP remoto usando Server-Sent Events (
|
|
177
|
+
Para conectarte a un servidor Intlayer MCP remoto usando Server-Sent Events (Streamable HTTP), puedes configurar tu cliente MCP para conectarse al servicio alojado.
|
|
178
178
|
|
|
179
179
|
```json fileName=".vscode/mcp.json"
|
|
180
180
|
{
|
|
181
181
|
"servers": {
|
|
182
|
-
"intlayer": {
|
|
183
|
-
"
|
|
184
|
-
"
|
|
182
|
+
"intlayer-sse": {
|
|
183
|
+
"command": "npx",
|
|
184
|
+
"args": ["-y", "mcp-remote@latest", "https://mcp.intlayer.org"]
|
|
185
185
|
}
|
|
186
186
|
}
|
|
187
187
|
}
|
|
@@ -191,7 +191,7 @@ Para conectarte a un servidor Intlayer MCP remoto usando Server-Sent Events (SSE
|
|
|
191
191
|
|
|
192
192
|
## Configuración en ChatGPT
|
|
193
193
|
|
|
194
|
-
### Servidor remoto (
|
|
194
|
+
### Servidor remoto (Streamable HTTP)
|
|
195
195
|
|
|
196
196
|
Sigue la [documentación oficial](https://platform.openai.com/docs/mcp#test-and-connect-your-mcp-server) para configurar el servidor MCP en ChatGPT.
|
|
197
197
|
|
|
@@ -232,6 +232,19 @@ Ruta del archivo de configuración:
|
|
|
232
232
|
}
|
|
233
233
|
```
|
|
234
234
|
|
|
235
|
+
### Servidor remoto (Streamable HTTP)
|
|
236
|
+
|
|
237
|
+
```json fileName="claude_desktop_config.json"
|
|
238
|
+
{
|
|
239
|
+
"mcpServers": {
|
|
240
|
+
"intlayer-sse": {
|
|
241
|
+
"command": "npx",
|
|
242
|
+
"args": ["-y", "mcp-remote@latest", "https://mcp.intlayer.org"]
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
```
|
|
247
|
+
|
|
235
248
|
---
|
|
236
249
|
|
|
237
250
|
## Uso del Servidor MCP vía CLI
|
|
@@ -0,0 +1,333 @@
|
|
|
1
|
+
---
|
|
2
|
+
createdAt: 2026-05-10
|
|
3
|
+
updatedAt: 2026-05-10
|
|
4
|
+
title: Plugin Sync PO
|
|
5
|
+
description: Sincroniza diccionarios Intlayer con archivos Gettext PO. Mantén tu i18n existente mientras usas Intlayer para gestionar, traducir y probar tus mensajes.
|
|
6
|
+
keywords:
|
|
7
|
+
- Intlayer
|
|
8
|
+
- Sync PO
|
|
9
|
+
- Gettext
|
|
10
|
+
- i18n
|
|
11
|
+
- traducciones
|
|
12
|
+
slugs:
|
|
13
|
+
- doc
|
|
14
|
+
- plugin
|
|
15
|
+
- sync-po
|
|
16
|
+
youtubeVideo: https://www.youtube.com/watch?v=MpGMxniDHNg
|
|
17
|
+
history:
|
|
18
|
+
- version: 8.9.4
|
|
19
|
+
date: 2026-05-10
|
|
20
|
+
changes: "Documentación inicial del plugin Sync PO"
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
# Sync PO (puentes i18n) - Sync PO con soporte ICU / i18next
|
|
24
|
+
|
|
25
|
+
Utiliza Intlayer como un complemento para tu stack de i18n existente. Este plugin mantiene tus mensajes de Gettext PO sincronizados con los diccionarios de Intlayer para que puedas:
|
|
26
|
+
|
|
27
|
+
- Mantener tu flujo de trabajo de traducción basado en PO existente.
|
|
28
|
+
- Gestionar y traducir tus mensajes con Intlayer (CLI, CI, proveedores, CMS), sin refactorizar tu aplicación.
|
|
29
|
+
- Publicar tutoriales y contenido SEO dirigido a cada ecosistema, sugiriendo Intlayer como la capa de gestión de PO.
|
|
30
|
+
|
|
31
|
+
Notas y alcance actual:
|
|
32
|
+
|
|
33
|
+
- La externalización al CMS funciona para traducciones y texto clásico.
|
|
34
|
+
- Aún no hay soporte para inserciones, plurales/ICU o funciones avanzadas de tiempo de ejecución de otras librerías dentro de las propias entradas de PO.
|
|
35
|
+
- El editor visual aún no es compatible con salidas de i18n de terceros.
|
|
36
|
+
|
|
37
|
+
### Cuándo usar este plugin
|
|
38
|
+
|
|
39
|
+
- Ya utilizas archivos Gettext PO para tus traducciones.
|
|
40
|
+
- Quieres relleno asistido por IA, pruebas en CI y operaciones de contenido sin cambiar tu tiempo de ejecución de renderizado.
|
|
41
|
+
|
|
42
|
+
## Instalación
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
pnpm add -D @intlayer/sync-po-plugin
|
|
46
|
+
# o
|
|
47
|
+
npm i -D @intlayer/sync-po-plugin
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## Plugins
|
|
51
|
+
|
|
52
|
+
Este paquete proporciona dos plugins:
|
|
53
|
+
|
|
54
|
+
- `loadPO`: Carga archivos PO en los diccionarios de Intlayer.
|
|
55
|
+
- Este plugin se utiliza para cargar archivos PO desde una fuente y se integrarán en los diccionarios de Intlayer. Puede escanear toda la base de código y buscar archivos PO específicos.
|
|
56
|
+
Este plugin se puede utilizar:
|
|
57
|
+
- si utilizas una librería de i18n que impone una ubicación específica para cargar tus archivos PO, pero quieres colocar tu declaración de contenido donde desees en tu base de código.
|
|
58
|
+
- También se puede usar si quieres obtener tus mensajes de una fuente remota (ej: un CMS, una API, etc.) y almacenar tus mensajes en archivos PO.
|
|
59
|
+
|
|
60
|
+
> Internamente, este plugin escaneará toda la base de código, buscará archivos PO específicos y los cargará en los diccionarios de Intlayer.
|
|
61
|
+
> Ten en cuenta que este plugin no escribirá la salida ni las traducciones de vuelta en los archivos PO.
|
|
62
|
+
|
|
63
|
+
- `syncPO`: Sincroniza archivos PO con los diccionarios de Intlayer.
|
|
64
|
+
- Este plugin se utiliza para sincronizar archivos PO con los diccionarios de Intlayer. Puede escanear la ubicación dada y cargar los PO que coincidan con el patrón para archivos PO específicos. Este plugin es útil si quieres obtener los beneficios de Intlayer mientras usas otra librería de i18n.
|
|
65
|
+
|
|
66
|
+
## Uso de ambos plugins
|
|
67
|
+
|
|
68
|
+
```ts fileName="intlayer.config.ts"
|
|
69
|
+
import { Locales, type IntlayerConfig } from "intlayer";
|
|
70
|
+
import { loadPO, syncPO } from "@intlayer/sync-po-plugin";
|
|
71
|
+
|
|
72
|
+
const config: IntlayerConfig = {
|
|
73
|
+
internationalization: {
|
|
74
|
+
locales: [Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH],
|
|
75
|
+
defaultLocale: Locales.ENGLISH,
|
|
76
|
+
},
|
|
77
|
+
|
|
78
|
+
// Mantén tus archivos PO actuales sincronizados con los diccionarios de Intlayer
|
|
79
|
+
plugins: [
|
|
80
|
+
/**
|
|
81
|
+
* Cargará todos los archivos PO en src que coincidan con el patrón {key}.i18n.po
|
|
82
|
+
*/
|
|
83
|
+
loadPO({
|
|
84
|
+
source: ({ key }) => `./src/**/${key}.i18n.po`,
|
|
85
|
+
locale: Locales.ENGLISH,
|
|
86
|
+
priority: 1, // Asegura que estos archivos PO tengan prioridad sobre los archivos en `./locales/en/${key}.po`
|
|
87
|
+
}),
|
|
88
|
+
/**
|
|
89
|
+
* Cargará y escribirá la salida y las traducciones de vuelta en los archivos PO en el directorio locales
|
|
90
|
+
*/
|
|
91
|
+
syncPO({
|
|
92
|
+
source: ({ key, locale }) => `./locales/${locale}/${key}.po`,
|
|
93
|
+
priority: 0,
|
|
94
|
+
}),
|
|
95
|
+
],
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
export default config;
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
## Plugin `syncPO`
|
|
102
|
+
|
|
103
|
+
### Inicio rápido
|
|
104
|
+
|
|
105
|
+
Añade el plugin a tu `intlayer.config.ts` y apúntalo a tu estructura de PO existente.
|
|
106
|
+
|
|
107
|
+
```ts fileName="intlayer.config.ts"
|
|
108
|
+
import { Locales, type IntlayerConfig } from "intlayer";
|
|
109
|
+
import { syncPO } from "@intlayer/sync-po-plugin";
|
|
110
|
+
|
|
111
|
+
const config: IntlayerConfig = {
|
|
112
|
+
internationalization: {
|
|
113
|
+
locales: [Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH],
|
|
114
|
+
defaultLocale: Locales.ENGLISH,
|
|
115
|
+
},
|
|
116
|
+
|
|
117
|
+
// Mantén tus archivos PO actuales sincronizados con los diccionarios de Intlayer
|
|
118
|
+
plugins: [
|
|
119
|
+
syncPO({
|
|
120
|
+
// Diseño por idioma y por espacio de nombres
|
|
121
|
+
source: ({ key, locale }) => `./locales/${locale}/${key}.po`,
|
|
122
|
+
}),
|
|
123
|
+
],
|
|
124
|
+
};
|
|
125
|
+
|
|
126
|
+
export default config;
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
Alternativa: un solo archivo por idioma:
|
|
130
|
+
|
|
131
|
+
```ts fileName="intlayer.config.ts"
|
|
132
|
+
import { Locales, type IntlayerConfig } from "intlayer";
|
|
133
|
+
import { syncPO } from "@intlayer/sync-po-plugin";
|
|
134
|
+
|
|
135
|
+
const config: IntlayerConfig = {
|
|
136
|
+
internationalization: {
|
|
137
|
+
locales: [Locales.ENGLISH, Locales.FRENCH],
|
|
138
|
+
defaultLocale: Locales.ENGLISH,
|
|
139
|
+
},
|
|
140
|
+
plugins: [
|
|
141
|
+
syncPO({
|
|
142
|
+
source: ({ locale }) => `./locales/${locale}.po`,
|
|
143
|
+
}),
|
|
144
|
+
],
|
|
145
|
+
};
|
|
146
|
+
|
|
147
|
+
export default config;
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
#### Cómo funciona
|
|
151
|
+
|
|
152
|
+
- Lectura: el plugin descubre archivos PO desde tu constructor `source` y los carga como diccionarios de Intlayer.
|
|
153
|
+
- Escritura: después de las compilaciones y rellenos, escribe los PO localizados de vuelta en las mismas rutas (con los encabezados de Gettext adecuados).
|
|
154
|
+
- Autorrelleno: el plugin declara una ruta `autoFill` para cada diccionario. Ejecutar `intlayer fill` actualiza solo las traducciones faltantes en tus archivos PO por defecto.
|
|
155
|
+
|
|
156
|
+
API:
|
|
157
|
+
|
|
158
|
+
```ts
|
|
159
|
+
syncPO({
|
|
160
|
+
source: ({ key, locale }) => string, // requerido
|
|
161
|
+
location?: string, // etiqueta opcional, por defecto: "sync-po::path/to/source"
|
|
162
|
+
priority?: number, // prioridad opcional para resolución de conflictos, por defecto: 0
|
|
163
|
+
});
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
### Múltiples fuentes de PO y prioridad
|
|
167
|
+
|
|
168
|
+
Puedes añadir múltiples plugins `syncPO` para sincronizar diferentes fuentes de PO. Esto es útil cuando tienes múltiples fuentes de traducción o diferentes estructuras de PO en tu proyecto.
|
|
169
|
+
|
|
170
|
+
#### Sistema de prioridad
|
|
171
|
+
|
|
172
|
+
Cuando múltiples plugins se dirigen a la misma clave de diccionario, el parámetro `priority` determina qué plugin tiene precedencia:
|
|
173
|
+
|
|
174
|
+
- Los números de prioridad más altos ganan sobre los más bajos.
|
|
175
|
+
- La prioridad por defecto de los archivos `.content` es `0`.
|
|
176
|
+
- La prioridad por defecto de los plugins es `0`.
|
|
177
|
+
- Los plugins con la misma prioridad se procesan en el orden en que aparecen en la configuración.
|
|
178
|
+
|
|
179
|
+
```ts fileName="intlayer.config.ts"
|
|
180
|
+
import { Locales, type IntlayerConfig } from "intlayer";
|
|
181
|
+
import { syncPO } from "@intlayer/sync-po-plugin";
|
|
182
|
+
|
|
183
|
+
const config: IntlayerConfig = {
|
|
184
|
+
internationalization: {
|
|
185
|
+
locales: [Locales.ENGLISH, Locales.FRENCH],
|
|
186
|
+
defaultLocale: Locales.ENGLISH,
|
|
187
|
+
},
|
|
188
|
+
|
|
189
|
+
plugins: [
|
|
190
|
+
// Fuente PO principal (prioridad más alta)
|
|
191
|
+
syncPO({
|
|
192
|
+
source: ({ key, locale }) => `./locales/${locale}/${key}.po`,
|
|
193
|
+
location: "main-translations",
|
|
194
|
+
priority: 10,
|
|
195
|
+
}),
|
|
196
|
+
|
|
197
|
+
// Fuente PO de respaldo (prioridad más baja)
|
|
198
|
+
syncPO({
|
|
199
|
+
source: ({ locale }) => `./fallback-locales/${locale}.po`,
|
|
200
|
+
location: "fallback-translations",
|
|
201
|
+
priority: 5,
|
|
202
|
+
}),
|
|
203
|
+
|
|
204
|
+
// Fuente PO heredada (prioridad más baja)
|
|
205
|
+
syncPO({
|
|
206
|
+
source: ({ locale }) => `/my/other/app/legacy/${locale}/messages.po`,
|
|
207
|
+
location: "legacy-translations",
|
|
208
|
+
priority: 1,
|
|
209
|
+
}),
|
|
210
|
+
],
|
|
211
|
+
};
|
|
212
|
+
|
|
213
|
+
export default config;
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
## Plugin Load PO
|
|
217
|
+
|
|
218
|
+
### Inicio rápido
|
|
219
|
+
|
|
220
|
+
Añade el plugin a tu `intlayer.config.ts` para ingerir archivos PO existentes como diccionarios de Intlayer. Este plugin es de solo lectura (no escribe en el disco):
|
|
221
|
+
|
|
222
|
+
```ts fileName="intlayer.config.ts"
|
|
223
|
+
import { Locales, type IntlayerConfig } from "intlayer";
|
|
224
|
+
import { loadPO } from "@intlayer/sync-po-plugin";
|
|
225
|
+
|
|
226
|
+
const config: IntlayerConfig = {
|
|
227
|
+
internationalization: {
|
|
228
|
+
locales: [Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH],
|
|
229
|
+
defaultLocale: Locales.ENGLISH,
|
|
230
|
+
},
|
|
231
|
+
|
|
232
|
+
plugins: [
|
|
233
|
+
// Ingiere mensajes de PO ubicados en cualquier lugar de tu árbol de fuentes
|
|
234
|
+
loadPO({
|
|
235
|
+
source: ({ key }) => `./src/**/${key}.i18n.po`,
|
|
236
|
+
// Carga un solo idioma por instancia de plugin (por defecto el defaultLocale de la configuración)
|
|
237
|
+
locale: Locales.ENGLISH,
|
|
238
|
+
priority: 0,
|
|
239
|
+
}),
|
|
240
|
+
],
|
|
241
|
+
};
|
|
242
|
+
|
|
243
|
+
export default config;
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
Alternativa: diseño por idioma, todavía de solo lectura (solo se carga el idioma seleccionado):
|
|
247
|
+
|
|
248
|
+
```ts fileName="intlayer.config.ts"
|
|
249
|
+
import { Locales, type IntlayerConfig } from "intlayer";
|
|
250
|
+
import { loadPO } from "@intlayer/sync-po-plugin";
|
|
251
|
+
|
|
252
|
+
const config: IntlayerConfig = {
|
|
253
|
+
internationalization: {
|
|
254
|
+
locales: [Locales.ENGLISH, Locales.FRENCH],
|
|
255
|
+
defaultLocale: Locales.ENGLISH,
|
|
256
|
+
},
|
|
257
|
+
plugins: [
|
|
258
|
+
loadPO({
|
|
259
|
+
// Solo se cargarán los archivos para Locales.FRENCH desde este patrón
|
|
260
|
+
source: ({ key, locale }) => `./locales/${locale}/${key}.po`,
|
|
261
|
+
locale: Locales.FRENCH,
|
|
262
|
+
}),
|
|
263
|
+
],
|
|
264
|
+
};
|
|
265
|
+
|
|
266
|
+
export default config;
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
### Cómo funciona
|
|
270
|
+
|
|
271
|
+
- Descubrimiento: construye un glob desde tu constructor `source` y recopila los archivos PO coincidentes.
|
|
272
|
+
- Ingestión: carga cada archivo PO como un diccionario de Intlayer con el `locale` proporcionado.
|
|
273
|
+
- Solo lectura: no escribe ni formatea archivos de salida; usa `syncPO` si necesitas sincronización de ida y vuelta.
|
|
274
|
+
- Listo para autorrelleno: define una ruta `fill` para que `intlayer content fill` pueda poblar las claves faltantes.
|
|
275
|
+
|
|
276
|
+
### API
|
|
277
|
+
|
|
278
|
+
```ts
|
|
279
|
+
loadPO({
|
|
280
|
+
// Construye rutas a tus PO. `locale` es opcional si tu estructura no tiene segmento de idioma
|
|
281
|
+
source: ({ key, locale }) => string,
|
|
282
|
+
|
|
283
|
+
// Idioma de destino para los diccionarios cargados por esta instancia de plugin
|
|
284
|
+
// Por defecto configuration.internationalization.defaultLocale
|
|
285
|
+
locale?: Locale,
|
|
286
|
+
|
|
287
|
+
// Etiqueta opcional para identificar la fuente
|
|
288
|
+
location?: string, // por defecto: "plugin"
|
|
289
|
+
|
|
290
|
+
// Prioridad utilizada para la resolución de conflictos contra otras fuentes
|
|
291
|
+
priority?: number, // por defecto: 0
|
|
292
|
+
});
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
### Comportamiento y convenciones
|
|
296
|
+
|
|
297
|
+
- Si tu máscara `source` incluye un marcador de posición de idioma, solo se ingieren los archivos para el `locale` seleccionado.
|
|
298
|
+
- Si no hay un segmento `{key}` en tu máscara, la clave del diccionario es "index".
|
|
299
|
+
- Las claves se derivan de las rutas de los archivos sustituyendo el marcador de posición `{key}` en tu constructor `source`.
|
|
300
|
+
- El plugin solo utiliza archivos descubiertos y no fabrica idiomas o claves faltantes.
|
|
301
|
+
- La ruta `fill` se infiere de tu `source` y se utiliza para actualizar los valores faltantes a través de la CLI cuando optas por ello.
|
|
302
|
+
|
|
303
|
+
## Resolución de conflictos
|
|
304
|
+
|
|
305
|
+
Cuando la misma clave de traducción existe en múltiples fuentes de PO:
|
|
306
|
+
|
|
307
|
+
1. El plugin con la prioridad más alta determina el valor final.
|
|
308
|
+
2. Las fuentes de menor prioridad se utilizan como respaldo para las claves faltantes.
|
|
309
|
+
3. Esto te permite mantener las traducciones heredadas mientras migras gradualmente a nuevas estructuras.
|
|
310
|
+
|
|
311
|
+
## CLI
|
|
312
|
+
|
|
313
|
+
Los archivos PO sincronizados se considerarán como otros archivos `.content`. Eso significa que todos los comandos de intlayer estarán disponibles para los archivos PO sincronizados. Incluyendo:
|
|
314
|
+
|
|
315
|
+
- `intlayer content test` para probar si faltan traducciones
|
|
316
|
+
- `intlayer content list` para listar los archivos PO sincronizados
|
|
317
|
+
- `intlayer content fill` para completar las traducciones faltantes
|
|
318
|
+
- `intlayer content push` para subir los archivos PO sincronizados
|
|
319
|
+
- `intlayer content pull` para bajar los archivos PO sincronizados
|
|
320
|
+
|
|
321
|
+
Consulta [Intlayer CLI](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/cli/index.md) para más detalles.
|
|
322
|
+
|
|
323
|
+
## Limitaciones (actuales)
|
|
324
|
+
|
|
325
|
+
- No hay soporte para inserciones o plurales/ICU al dirigirse a librerías de terceros.
|
|
326
|
+
- El editor visual aún no está disponible para tiempos de ejecución que no sean Intlayer.
|
|
327
|
+
- Solo sincronización de PO; no se admiten formatos de catálogo que no sean PO.
|
|
328
|
+
|
|
329
|
+
## Por qué esto es importante
|
|
330
|
+
|
|
331
|
+
- Podemos recomendar soluciones de i18n establecidas y posicionar a Intlayer como un complemento.
|
|
332
|
+
- Aprovechamos su SEO/palabras clave con tutoriales que terminan sugiriendo Intlayer para gestionar PO.
|
|
333
|
+
- Amplía la audiencia a la que nos dirigimos de "nuevos proyectos" a "cualquier equipo que ya use i18n".
|
|
@@ -30,6 +30,3 @@ Les rapports détaillés et la documentation technique pour chaque framework se
|
|
|
30
30
|
- [**Vue Benchmark Report**](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/benchmark/vue.md)
|
|
31
31
|
- [**Solid Benchmark Report**](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/benchmark/solid.md)
|
|
32
32
|
- [**Svelte Benchmark Report**](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/benchmark/svelte.md)
|
|
33
|
-
- [**Vue Benchmark Report**](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/benchmark/vue.md)
|
|
34
|
-
- [**Solid Benchmark Report**](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/benchmark/solid.md)
|
|
35
|
-
- [**Svelte Benchmark Report**](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/benchmark/svelte.md)
|
|
@@ -61,6 +61,13 @@ Parce que le problème est complexe, de nombreuses solutions existent — certai
|
|
|
61
61
|
|
|
62
62
|
Intlayer tente d'optimiser l'ensemble de ces dimensions.
|
|
63
63
|
|
|
64
|
+
## TL;DR
|
|
65
|
+
|
|
66
|
+
- **Intlayer** & **next-translate** : Meilleurs choix pour la performance Next.js, offrant l'empreinte la plus faible et le meilleur support du rendu statique.
|
|
67
|
+
- **next-intl** : L'option la plus tendance mais lourde et complexe à optimiser pour les grandes applications.
|
|
68
|
+
- **next-i18next** : Populaire et riche en plugins, mais porte un poids de bundle significatif (~3× Intlayer).
|
|
69
|
+
- **À éviter** : **gt-next** et **lingo.dev** en raison de graves problèmes de performance, de verrouillage propriétaire et de bugs cassant le build.
|
|
70
|
+
|
|
64
71
|
## Testez votre application
|
|
65
72
|
|
|
66
73
|
Pour mettre en lumière ces problèmes, j'ai construit un scanner gratuit que vous pouvez essayer [ici](https://intlayer.org/i18n-seo-scanner).
|
|
@@ -99,14 +106,14 @@ Enfin, `Intlayer` applique une optimisation au moment du build afin que `useIntl
|
|
|
99
106
|
Pour ce benchmark, nous avons comparé les bibliothèques suivantes :
|
|
100
107
|
|
|
101
108
|
- `Base App` (Pas de bibliothèque i18n)
|
|
102
|
-
- `next-intlayer` (v8.7.
|
|
109
|
+
- `next-intlayer` (v8.7.12)
|
|
103
110
|
- `next-i18next` (v16.0.5)
|
|
104
111
|
- `next-intl` (v4.9.1)
|
|
105
112
|
- `@lingui/core` (v5.3.0)
|
|
106
113
|
- `next-translate` (v3.1.2)
|
|
107
114
|
- `next-international` (v1.3.1)
|
|
108
115
|
- `@inlang/paraglide-js` (v2.15.1)
|
|
109
|
-
-
|
|
116
|
+
- `@tolgee/react` (v7.0.0)
|
|
110
117
|
- `@lingo.dev/compiler` (v0.4.0)
|
|
111
118
|
- `wuchale` (v0.22.11)
|
|
112
119
|
- `gt-next` (v6.16.5)
|
|
@@ -161,10 +168,10 @@ Problèmes rencontrés :
|
|
|
161
168
|
|
|
162
169
|
**(General Translation)** (`gt-next@6.16.5`) :
|
|
163
170
|
|
|
164
|
-
- Pour une application de 110 Ko, `gt-
|
|
171
|
+
- Pour une application de 110 Ko, `gt-next` ajoute plus de 440 Ko supplémentaires.
|
|
165
172
|
- `Quota Exceeded, please upgrade your plan` dès le tout premier build avec General Translation.
|
|
166
173
|
- Les traductions ne sont pas rendues ; j'obtiens l'erreur `Error: <T> used on the client-side outside of <GTProvider>`, ce qui semble être un bug de la bibliothèque.
|
|
167
|
-
- Lors de l'implémentation de **gt-
|
|
174
|
+
- Lors de l'implémentation de **gt-next**, je suis également tombé sur un [problème](https://github.com/generaltranslation/gt/issues/1210#event-24510646961) avec la bibliothèque : `does not provide an export named 'printAST' - @formatjs/icu-messageformat-parser`, ce qui cassait l'application. Après avoir signalé ce problème, le mainteneur l'a corrigé sous 24 heures.
|
|
168
175
|
- La bibliothèque bloque le rendu statique des pages Next.js.
|
|
169
176
|
|
|
170
177
|
**(Lingo.dev)** (`@lingo.dev/compiler@0.4.0`) :
|
|
@@ -186,9 +193,11 @@ L'idée derrière `Wuchale` est intéressante mais pas encore viable. J'ai renco
|
|
|
186
193
|
Personnellement, je n'aime pas devoir régénérer des fichiers JS avant chaque push, ce qui crée un risque constant de conflit de fusion via les PRs. L'outil semble également plus axé sur Vite que sur Next.js.
|
|
187
194
|
Enfin, par rapport aux autres solutions, Paraglide n'utilise pas de "store" (ex: contexte React) pour récupérer la langue actuelle afin de rendre le contenu. Pour chaque nœud analysé, il demandera la langue au localStorage / cookie etc. Cela conduit à l'exécution d'une logique inutile qui impacte la réactivité des composants.
|
|
188
195
|
|
|
196
|
+
> Note sur paraglide : la solution injecte du code dans votre base de code à importer, par conséquent la métrique 'taille de la lib' dans le rapport de benchmark est presque de 0. La génération de code est une bonne chose, car la fonction utilisée n'inclura que la logique nécessaire (préfixe total vs pas de préfixe, cookie vs stockage etc). En comparaison, Intlayer procède à ce filtrage via des injections de variables d'environnement dans le build pour forcer le bundler à tree-shaker le contenu selon la logique. Grâce à cela, paraglide et intlayer finissent par être des solutions 6 à 10 fois plus légères que i18next ou next-intl.
|
|
197
|
+
|
|
189
198
|
### 3 — Solutions acceptables
|
|
190
199
|
|
|
191
|
-
**(Tolgee)** (
|
|
200
|
+
**(Tolgee)** (`@tolgee/react@7.0.0`) :
|
|
192
201
|
|
|
193
202
|
`Tolgee` traite bon nombre des problèmes mentionnés plus haut. Je l'ai trouvé plus difficile à adopter que des outils similaires. Il n'offre pas de sécurité de type (type safety), ce qui rend également plus difficile la détection des clés manquantes à la compilation. J'ai dû wrapper les fonctions de Tolgee avec les miennes pour ajouter la détection des clés manquantes.
|
|
194
203
|
|
|
@@ -216,7 +225,7 @@ Les formats de messages diffèrent également : `next-intl` utilise ICU MessageF
|
|
|
216
225
|
|
|
217
226
|
`next-translate` est ma recommandation principale si vous aimez une API de style `t()`. C'est élégant via `next-translate-plugin`, chargeant les namespaces via `getStaticProps` avec un loader Webpack / Turbopack. C'est aussi l'option la plus légère ici (env. 2,5 Ko). Pour le découpage en namespaces, la définition par page ou par route dans la config est bien pensée et plus facile à maintenir que les alternatives principales comme **next-intl** ou **next-i18next**. Dans la version `3.1.2`, j'ai noté que le rendu statique ne fonctionnait pas ; Next.js se repliait sur le rendu dynamique.
|
|
218
227
|
|
|
219
|
-
**(Intlayer)** (`next-intlayer@8.7.
|
|
228
|
+
**(Intlayer)** (`next-intlayer@8.7.12`) :
|
|
220
229
|
|
|
221
230
|
Je ne jugerai pas personnellement `next-intlayer` par souci d'objectivité, puisqu'il s'agit de ma propre solution.
|
|
222
231
|
|