@intlayer/docs 7.5.9 → 7.5.10
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/README.md +9 -2
- package/dist/cjs/generated/docs.entry.cjs +19 -0
- package/dist/cjs/generated/docs.entry.cjs.map +1 -1
- package/dist/esm/generated/docs.entry.mjs +19 -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/cli/push.md +1 -1
- package/docs/ar/configuration.md +3 -3
- package/docs/ar/interest_of_intlayer.md +1 -1
- package/docs/ar/intlayer_CMS.md +5 -5
- package/docs/ar/intlayer_with_express.md +1 -0
- package/docs/ar/intlayer_with_fastify.md +516 -0
- package/docs/ar/readme.md +1 -1
- package/docs/de/cli/push.md +1 -1
- package/docs/de/configuration.md +3 -3
- package/docs/de/interest_of_intlayer.md +1 -1
- package/docs/de/intlayer_CMS.md +5 -5
- package/docs/de/intlayer_with_express.md +1 -0
- package/docs/de/intlayer_with_fastify.md +449 -0
- package/docs/de/readme.md +1 -1
- package/docs/en/cli/push.md +1 -1
- package/docs/en/configuration.md +3 -3
- package/docs/en/interest_of_intlayer.md +1 -1
- package/docs/en/intlayer_CMS.md +5 -5
- package/docs/en/intlayer_with_express.md +1 -0
- package/docs/en/intlayer_with_fastify.md +439 -0
- package/docs/en/readme.md +3 -1
- package/docs/en-GB/cli/push.md +1 -1
- package/docs/en-GB/configuration.md +3 -3
- package/docs/en-GB/interest_of_intlayer.md +1 -1
- package/docs/en-GB/intlayer_CMS.md +5 -5
- package/docs/en-GB/intlayer_with_express.md +1 -0
- package/docs/en-GB/intlayer_with_fastify.md +445 -0
- package/docs/en-GB/readme.md +3 -1
- package/docs/es/cli/push.md +1 -1
- package/docs/es/configuration.md +3 -3
- package/docs/es/interest_of_intlayer.md +1 -1
- package/docs/es/intlayer_CMS.md +5 -5
- package/docs/es/intlayer_with_express.md +1 -0
- package/docs/es/intlayer_with_fastify.md +480 -0
- package/docs/es/readme.md +1 -1
- package/docs/fr/cli/push.md +1 -1
- package/docs/fr/configuration.md +3 -3
- package/docs/fr/interest_of_intlayer.md +1 -1
- package/docs/fr/intlayer_CMS.md +5 -5
- package/docs/fr/intlayer_with_express.md +1 -0
- package/docs/fr/intlayer_with_fastify.md +439 -0
- package/docs/fr/readme.md +1 -1
- package/docs/hi/cli/push.md +1 -1
- package/docs/hi/configuration.md +3 -3
- package/docs/hi/interest_of_intlayer.md +1 -1
- package/docs/hi/intlayer_CMS.md +5 -5
- package/docs/hi/intlayer_with_express.md +1 -0
- package/docs/hi/intlayer_with_fastify.md +540 -0
- package/docs/hi/readme.md +1 -1
- package/docs/id/cli/push.md +1 -1
- package/docs/id/configuration.md +3 -3
- package/docs/id/interest_of_intlayer.md +1 -1
- package/docs/id/intlayer_CMS.md +5 -5
- package/docs/id/intlayer_with_express.md +1 -0
- package/docs/id/intlayer_with_fastify.md +470 -0
- package/docs/id/readme.md +1 -1
- package/docs/it/cli/push.md +1 -1
- package/docs/it/configuration.md +3 -3
- package/docs/it/interest_of_intlayer.md +1 -1
- package/docs/it/intlayer_CMS.md +5 -5
- package/docs/it/intlayer_with_express.md +1 -0
- package/docs/it/intlayer_with_fastify.md +445 -0
- package/docs/it/readme.md +1 -1
- package/docs/ja/cli/push.md +1 -1
- package/docs/ja/configuration.md +3 -3
- package/docs/ja/interest_of_intlayer.md +1 -1
- package/docs/ja/intlayer_CMS.md +5 -5
- package/docs/ja/intlayer_with_express.md +1 -0
- package/docs/ja/intlayer_with_fastify.md +516 -0
- package/docs/ja/readme.md +1 -1
- package/docs/ko/cli/push.md +1 -1
- package/docs/ko/configuration.md +3 -3
- package/docs/ko/interest_of_intlayer.md +1 -1
- package/docs/ko/intlayer_CMS.md +5 -5
- package/docs/ko/intlayer_with_express.md +1 -0
- package/docs/ko/intlayer_with_fastify.md +463 -0
- package/docs/ko/readme.md +1 -1
- package/docs/pl/cli/push.md +1 -1
- package/docs/pl/configuration.md +3 -3
- package/docs/pl/interest_of_intlayer.md +1 -1
- package/docs/pl/intlayer_CMS.md +5 -5
- package/docs/pl/intlayer_with_express.md +1 -0
- package/docs/pl/intlayer_with_fastify.md +457 -0
- package/docs/pl/readme.md +1 -1
- package/docs/pt/cli/push.md +1 -1
- package/docs/pt/configuration.md +3 -3
- package/docs/pt/interest_of_intlayer.md +1 -1
- package/docs/pt/intlayer_CMS.md +5 -5
- package/docs/pt/intlayer_with_express.md +1 -0
- package/docs/pt/intlayer_with_fastify.md +502 -0
- package/docs/pt/readme.md +1 -1
- package/docs/ru/cli/push.md +1 -1
- package/docs/ru/configuration.md +3 -3
- package/docs/ru/interest_of_intlayer.md +1 -1
- package/docs/ru/intlayer_CMS.md +5 -5
- package/docs/ru/intlayer_with_express.md +1 -0
- package/docs/ru/intlayer_with_fastify.md +468 -0
- package/docs/ru/readme.md +1 -1
- package/docs/tr/cli/push.md +1 -1
- package/docs/tr/configuration.md +3 -3
- package/docs/tr/interest_of_intlayer.md +1 -1
- package/docs/tr/intlayer_CMS.md +5 -5
- package/docs/tr/intlayer_with_express.md +1 -0
- package/docs/tr/intlayer_with_fastify.md +471 -0
- package/docs/tr/readme.md +1 -1
- package/docs/vi/cli/push.md +1 -1
- package/docs/vi/configuration.md +3 -3
- package/docs/vi/interest_of_intlayer.md +1 -1
- package/docs/vi/intlayer_CMS.md +5 -5
- package/docs/vi/intlayer_with_express.md +1 -0
- package/docs/vi/intlayer_with_fastify.md +490 -0
- package/docs/vi/readme.md +1 -1
- package/docs/zh/cli/push.md +1 -1
- package/docs/zh/configuration.md +3 -3
- package/docs/zh/interest_of_intlayer.md +1 -1
- package/docs/zh/intlayer_CMS.md +5 -5
- package/docs/zh/intlayer_with_express.md +1 -0
- package/docs/zh/intlayer_with_fastify.md +451 -0
- package/docs/zh/readme.md +1 -1
- package/package.json +6 -6
- package/src/generated/docs.entry.ts +19 -0
|
@@ -0,0 +1,480 @@
|
|
|
1
|
+
---
|
|
2
|
+
createdAt: 2025-12-30
|
|
3
|
+
updatedAt: 2025-12-30
|
|
4
|
+
title: Cómo traducir tu backend con Fastify – guía i18n 2026
|
|
5
|
+
description: Descubre cómo hacer tu backend con Fastify multilingüe. Sigue la documentación para internacionalizar (i18n) y traducirlo.
|
|
6
|
+
keywords:
|
|
7
|
+
- Internacionalización
|
|
8
|
+
- Documentación
|
|
9
|
+
- Intlayer
|
|
10
|
+
- Fastify
|
|
11
|
+
- JavaScript
|
|
12
|
+
- Backend
|
|
13
|
+
slugs:
|
|
14
|
+
- doc
|
|
15
|
+
- environment
|
|
16
|
+
- fastify
|
|
17
|
+
applicationTemplate: https://github.com/aymericzip/intlayer-fastify-template
|
|
18
|
+
history:
|
|
19
|
+
- version: 7.6.0
|
|
20
|
+
date: 2025-12-31
|
|
21
|
+
changes: Agregar comando init
|
|
22
|
+
- version: 7.6.0
|
|
23
|
+
date: 2025-12-31
|
|
24
|
+
changes: Historial inicial
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
# Traduce tu backend de Fastify usando Intlayer | Internacionalización (i18n)
|
|
28
|
+
|
|
29
|
+
`fastify-intlayer` es un potente plugin de internacionalización (i18n) para aplicaciones Fastify, diseñado para hacer que tus servicios backend sean accesibles globalmente proporcionando respuestas localizadas basadas en las preferencias del cliente.
|
|
30
|
+
|
|
31
|
+
### Casos de uso prácticos
|
|
32
|
+
|
|
33
|
+
- **Mostrar errores del backend en el idioma del usuario**: Cuando ocurre un error, mostrar mensajes en la lengua nativa del usuario mejora la comprensión y reduce la frustración. Esto es especialmente útil para mensajes de error dinámicos que podrían mostrarse en componentes frontend como toasts o modales.
|
|
34
|
+
|
|
35
|
+
`fastify-intlayer` es un potente plugin de internacionalización (i18n) para aplicaciones Fastify, diseñado para hacer que tus servicios backend sean accesibles globalmente proporcionando respuestas localizadas según las preferencias del cliente.
|
|
36
|
+
|
|
37
|
+
### Casos de uso prácticos
|
|
38
|
+
|
|
39
|
+
- **Mostrar errores del backend en el idioma del usuario**: Cuando ocurre un error, mostrar mensajes en la lengua nativa del usuario mejora la comprensión y reduce la frustración. Esto es especialmente útil para mensajes de error dinámicos que podrían mostrarse en componentes front-end como toasts o modals.
|
|
40
|
+
- **Recuperar contenido multilingüe**: Para aplicaciones que obtienen contenido de una base de datos, la internacionalización garantiza que puedas servir ese contenido en varios idiomas. Esto es crucial para plataformas como sitios de comercio electrónico o sistemas de gestión de contenido que necesitan mostrar descripciones de productos, artículos y otros contenidos en el idioma preferido por el usuario.
|
|
41
|
+
- **Enviar correos electrónicos multilingües**: Ya sean correos transaccionales, campañas de marketing o notificaciones, enviar correos en el idioma del destinatario puede aumentar significativamente el compromiso y la efectividad.
|
|
42
|
+
- **Notificaciones push multilingües**: Para aplicaciones móviles, enviar notificaciones push en el idioma preferido del usuario puede mejorar la interacción y la retención. Este toque personal puede hacer que las notificaciones se sientan más relevantes y accionables.
|
|
43
|
+
- **Otras comunicaciones**: Cualquier forma de comunicación desde el backend, como mensajes SMS, alertas del sistema o actualizaciones de la interfaz de usuario, se beneficia de estar en el idioma del usuario, garantizando claridad y mejorando la experiencia de usuario en general.
|
|
44
|
+
|
|
45
|
+
Al internacionalizar el backend, tu aplicación no solo respeta las diferencias culturales, sino que también se alinea mejor con las necesidades del mercado global, convirtiéndolo en un paso clave para escalar tus servicios a nivel mundial.
|
|
46
|
+
|
|
47
|
+
## Primeros pasos
|
|
48
|
+
|
|
49
|
+
### Instalación
|
|
50
|
+
|
|
51
|
+
Para comenzar a usar `fastify-intlayer`, instala el paquete usando npm:
|
|
52
|
+
|
|
53
|
+
```bash packageManager="npm"
|
|
54
|
+
npm install intlayer fastify-intlayer
|
|
55
|
+
npx intlayer init
|
|
56
|
+
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
```bash packageManager="pnpm"
|
|
60
|
+
pnpm add intlayer fastify-intlayer
|
|
61
|
+
pnpm intlayer init
|
|
62
|
+
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
```bash packageManager="yarn"
|
|
66
|
+
yarn add intlayer fastify-intlayer
|
|
67
|
+
yarn intlayer init
|
|
68
|
+
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
```bash packageManager="bun"
|
|
72
|
+
bun add intlayer fastify-intlayer
|
|
73
|
+
bunx intlayer init
|
|
74
|
+
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### Configuración
|
|
78
|
+
|
|
79
|
+
Configura los ajustes de internacionalización creando un archivo `intlayer.config.ts` en la raíz de tu proyecto:
|
|
80
|
+
|
|
81
|
+
```typescript fileName="intlayer.config.ts" codeFormat="typescript"
|
|
82
|
+
import { Locales, type IntlayerConfig } from "intlayer";
|
|
83
|
+
|
|
84
|
+
const config: IntlayerConfig = {
|
|
85
|
+
internationalization: {
|
|
86
|
+
locales: [
|
|
87
|
+
Locales.ENGLISH,
|
|
88
|
+
Locales.FRENCH,
|
|
89
|
+
Locales.SPANISH_MEXICO,
|
|
90
|
+
Locales.SPANISH_SPAIN,
|
|
91
|
+
],
|
|
92
|
+
defaultLocale: Locales.ENGLISH,
|
|
93
|
+
},
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
export default config;
|
|
97
|
+
defaultLocale: Locales.ENGLISH,
|
|
98
|
+
},
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
export default config;
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
```javascript fileName="intlayer.config.mjs" codeFormat="esm"
|
|
105
|
+
import { Locales } from "intlayer";
|
|
106
|
+
|
|
107
|
+
/** @type {import('intlayer').IntlayerConfig} */
|
|
108
|
+
const config = {
|
|
109
|
+
internationalization: {
|
|
110
|
+
locales: [
|
|
111
|
+
Locales.ENGLISH,
|
|
112
|
+
Locales.FRENCH,
|
|
113
|
+
Locales.SPANISH_MEXICO,
|
|
114
|
+
Locales.SPANISH_SPAIN,
|
|
115
|
+
],
|
|
116
|
+
defaultLocale: Locales.ENGLISH,
|
|
117
|
+
},
|
|
118
|
+
};
|
|
119
|
+
|
|
120
|
+
export default config;
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
```javascript fileName="intlayer.config.cjs" codeFormat="commonjs"
|
|
124
|
+
const { Locales } = require("intlayer");
|
|
125
|
+
|
|
126
|
+
/** @type {import('intlayer').IntlayerConfig} */
|
|
127
|
+
const config = {
|
|
128
|
+
internationalization: {
|
|
129
|
+
locales: [
|
|
130
|
+
Locales.ENGLISH,
|
|
131
|
+
Locales.FRENCH,
|
|
132
|
+
Locales.SPANISH_MEXICO,
|
|
133
|
+
Locales.SPANISH_SPAIN,
|
|
134
|
+
],
|
|
135
|
+
defaultLocale: Locales.ENGLISH,
|
|
136
|
+
},
|
|
137
|
+
};
|
|
138
|
+
|
|
139
|
+
module.exports = config;
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
### Declara tu contenido
|
|
143
|
+
|
|
144
|
+
Crea y gestiona tus declaraciones de contenido para almacenar traducciones:
|
|
145
|
+
|
|
146
|
+
```typescript fileName="src/index.content.ts" contentDeclarationFormat="typescript"
|
|
147
|
+
import { t, type Dictionary } from "intlayer";
|
|
148
|
+
|
|
149
|
+
const indexContent = {
|
|
150
|
+
key: "index",
|
|
151
|
+
content: {
|
|
152
|
+
exampleOfContent: t({
|
|
153
|
+
es: "Ejemplo de contenido devuelto en español",
|
|
154
|
+
en: "Example of returned content in English",
|
|
155
|
+
fr: "Exemple de contenu renvoyé en français",
|
|
156
|
+
"es-ES": "Ejemplo de contenido devuelto en español (España)",
|
|
157
|
+
"es-MX": "Ejemplo de contenido devuelto en español (México)",
|
|
158
|
+
}),
|
|
159
|
+
},
|
|
160
|
+
} satisfies Dictionary;
|
|
161
|
+
|
|
162
|
+
export default indexContent;
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
```javascript fileName="src/index.content.mjs" contentDeclarationFormat="esm"
|
|
166
|
+
import { t } from "intlayer";
|
|
167
|
+
|
|
168
|
+
/** @type {import('intlayer').Dictionary} */
|
|
169
|
+
const indexContent = {
|
|
170
|
+
key: "index",
|
|
171
|
+
content: {
|
|
172
|
+
exampleOfContent: t({
|
|
173
|
+
es: "Ejemplo de contenido devuelto en español",
|
|
174
|
+
en: "Example of returned content in English",
|
|
175
|
+
fr: "Exemple de contenu renvoyé en français",
|
|
176
|
+
"es-ES": "Ejemplo de contenido devuelto en español (España)",
|
|
177
|
+
"es-MX": "Ejemplo de contenido devuelto en español (México)",
|
|
178
|
+
}),
|
|
179
|
+
},
|
|
180
|
+
};
|
|
181
|
+
|
|
182
|
+
export default indexContent;
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
```javascript fileName="src/index.content.cjs" contentDeclarationFormat="commonjs"
|
|
186
|
+
const { t } = require("intlayer");
|
|
187
|
+
|
|
188
|
+
/** @type {import('intlayer').Dictionary} */
|
|
189
|
+
const indexContent = {
|
|
190
|
+
key: "index",
|
|
191
|
+
content: {
|
|
192
|
+
exampleOfContent: t({
|
|
193
|
+
es: "Ejemplo de contenido devuelto en español",
|
|
194
|
+
en: "Example of returned content in English",
|
|
195
|
+
fr: "Exemple de contenu renvoyé en français",
|
|
196
|
+
"es": "Ejemplo de contenido devuelto en español",
|
|
197
|
+
"es-ES": "Ejemplo de contenido devuelto en español (España)",
|
|
198
|
+
"es-MX": "Ejemplo de contenido devuelto en español (México)",
|
|
199
|
+
}),
|
|
200
|
+
},
|
|
201
|
+
};
|
|
202
|
+
|
|
203
|
+
module.exports = indexContent;
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
```json fileName="src/index.content.json" contentDeclarationFormat="json"
|
|
207
|
+
{
|
|
208
|
+
"$schema": "https://intlayer.org/schema.json",
|
|
209
|
+
"key": "index",
|
|
210
|
+
"content": {
|
|
211
|
+
"exampleOfContent": {
|
|
212
|
+
"nodeType": "translation",
|
|
213
|
+
"translation": {
|
|
214
|
+
"es": "Ejemplo de contenido devuelto en español",
|
|
215
|
+
"en": "Example of returned content in English",
|
|
216
|
+
"fr": "Exemple de contenu renvoyé en français",
|
|
217
|
+
"es-ES": "Ejemplo de contenido devuelto en español (España)",
|
|
218
|
+
"es-MX": "Ejemplo de contenido devuelto en español (México)"
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
> Tus declaraciones de contenido pueden definirse en cualquier parte de tu aplicación siempre que se incluyan en el directorio `contentDir` (por defecto, `./src`). Y que coincidan con la extensión de archivo de declaración de contenido (por defecto, `.content.{json,ts,tsx,js,jsx,mjs,mjx,cjs,cjx}`).
|
|
226
|
+
|
|
227
|
+
> Para más detalles, consulta la [documentación de declaración de contenido](https://github.com/aymericzip/intlayer/blob/main/docs/docs/es/dictionary/content_file.md).
|
|
228
|
+
|
|
229
|
+
### Configuración de la aplicación Fastify
|
|
230
|
+
|
|
231
|
+
Configura tu aplicación Fastify para usar `fastify-intlayer`:
|
|
232
|
+
|
|
233
|
+
```typescript fileName="src/index.ts" codeFormat="typescript"
|
|
234
|
+
import Fastify from "fastify";
|
|
235
|
+
import { intlayer, t, getDictionary, getIntlayer } from "fastify-intlayer";
|
|
236
|
+
import dictionaryExample from "./index.content";
|
|
237
|
+
|
|
238
|
+
const fastify = Fastify({ logger: true });
|
|
239
|
+
|
|
240
|
+
// Cargar el plugin de internacionalización
|
|
241
|
+
await fastify.register(intlayer);
|
|
242
|
+
|
|
243
|
+
// Rutas
|
|
244
|
+
fastify.get("/t_example", async (_req, reply) => {
|
|
245
|
+
return t({
|
|
246
|
+
es: "Ejemplo de contenido devuelto en español",
|
|
247
|
+
en: "Example of returned content in English",
|
|
248
|
+
fr: "Exemple de contenu renvoyé en français",
|
|
249
|
+
"es-ES": "Ejemplo de contenido devuelto en español (España)",
|
|
250
|
+
"es-MX": "Ejemplo de contenido devuelto en español (México)",
|
|
251
|
+
});
|
|
252
|
+
});
|
|
253
|
+
|
|
254
|
+
fastify.get("/getIntlayer_example", async (_req, reply) => {
|
|
255
|
+
return getIntlayer("index").exampleOfContent;
|
|
256
|
+
});
|
|
257
|
+
|
|
258
|
+
fastify.get("/getDictionary_example", async (_req, reply) => {
|
|
259
|
+
return getDictionary(dictionaryExample).exampleOfContent;
|
|
260
|
+
});
|
|
261
|
+
|
|
262
|
+
// Iniciar servidor
|
|
263
|
+
const start = async () => {
|
|
264
|
+
try {
|
|
265
|
+
await fastify.listen({ port: 3000 });
|
|
266
|
+
} catch (err) {
|
|
267
|
+
fastify.log.error(err);
|
|
268
|
+
process.exit(1);
|
|
269
|
+
}
|
|
270
|
+
};
|
|
271
|
+
|
|
272
|
+
start();
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
```javascript fileName="src/index.mjs" codeFormat="esm"
|
|
276
|
+
import Fastify from "fastify";
|
|
277
|
+
import { intlayer, t, getDictionary, getIntlayer } from "fastify-intlayer";
|
|
278
|
+
import dictionaryExample from "./index.content";
|
|
279
|
+
|
|
280
|
+
const fastify = Fastify({ logger: true });
|
|
281
|
+
|
|
282
|
+
// Cargar plugin de internacionalización
|
|
283
|
+
await fastify.register(intlayer);
|
|
284
|
+
|
|
285
|
+
// Rutas
|
|
286
|
+
fastify.get("/t_example", async (_req, reply) => {
|
|
287
|
+
return t({
|
|
288
|
+
es: "Ejemplo de contenido devuelto en español",
|
|
289
|
+
en: "Example of returned content in English",
|
|
290
|
+
fr: "Exemple de contenu renvoyé en français",
|
|
291
|
+
"es-ES": "Ejemplo de contenido devuelto en español (España)",
|
|
292
|
+
"es-MX": "Ejemplo de contenido devuelto en español (México)",
|
|
293
|
+
});
|
|
294
|
+
});
|
|
295
|
+
|
|
296
|
+
fastify.get("/getIntlayer_example", async (_req, reply) => {
|
|
297
|
+
return getIntlayer("index").exampleOfContent;
|
|
298
|
+
});
|
|
299
|
+
|
|
300
|
+
fastify.get("/getDictionary_example", async (_req, reply) => {
|
|
301
|
+
return getDictionary(dictionaryExample).exampleOfContent;
|
|
302
|
+
});
|
|
303
|
+
|
|
304
|
+
// Iniciar servidor
|
|
305
|
+
const start = async () => {
|
|
306
|
+
try {
|
|
307
|
+
await fastify.listen({ port: 3000 });
|
|
308
|
+
} catch (err) {
|
|
309
|
+
fastify.log.error(err);
|
|
310
|
+
process.exit(1);
|
|
311
|
+
}
|
|
312
|
+
};
|
|
313
|
+
|
|
314
|
+
start();
|
|
315
|
+
```
|
|
316
|
+
|
|
317
|
+
```javascript fileName="src/index.cjs" codeFormat="commonjs"
|
|
318
|
+
const Fastify = require("fastify");
|
|
319
|
+
const { intlayer, t, getDictionary, getIntlayer } = require("fastify-intlayer");
|
|
320
|
+
const dictionaryExample = require("./index.content");
|
|
321
|
+
|
|
322
|
+
const fastify = Fastify({ logger: true });
|
|
323
|
+
|
|
324
|
+
// Envoltorio para iniciar el servidor con async/await
|
|
325
|
+
const start = async () => {
|
|
326
|
+
try {
|
|
327
|
+
// Cargar el plugin de internacionalización
|
|
328
|
+
await fastify.register(intlayer);
|
|
329
|
+
|
|
330
|
+
// Rutas
|
|
331
|
+
fastify.get("/t_example", async (_req, reply) => {
|
|
332
|
+
return t({
|
|
333
|
+
es: "Ejemplo de contenido devuelto en español",
|
|
334
|
+
en: "Example of returned content in English",
|
|
335
|
+
fr: "Exemple de contenu renvoyé en français",
|
|
336
|
+
"es-ES": "Ejemplo de contenido devuelto en español (España)",
|
|
337
|
+
"es-MX": "Ejemplo de contenido devuelto en español (México)",
|
|
338
|
+
});
|
|
339
|
+
});
|
|
340
|
+
|
|
341
|
+
fastify.get("/getIntlayer_example", async (_req, reply) => {
|
|
342
|
+
return getIntlayer("index").exampleOfContent;
|
|
343
|
+
});
|
|
344
|
+
|
|
345
|
+
fastify.get("/getDictionary_example", async (_req, reply) => {
|
|
346
|
+
return getDictionary(dictionaryExample).exampleOfContent;
|
|
347
|
+
});
|
|
348
|
+
|
|
349
|
+
await fastify.listen({ port: 3000 });
|
|
350
|
+
} catch (err) {
|
|
351
|
+
fastify.log.error(err);
|
|
352
|
+
process.exit(1);
|
|
353
|
+
}
|
|
354
|
+
};
|
|
355
|
+
|
|
356
|
+
start();
|
|
357
|
+
```
|
|
358
|
+
|
|
359
|
+
### Compatibilidad
|
|
360
|
+
|
|
361
|
+
`fastify-intlayer` es completamente compatible con:
|
|
362
|
+
|
|
363
|
+
- [`react-intlayer`](<https://www.google.com/search?q=%5Bhttps://github.com/aymericzip/intlayer/blob/main/docs/docs/es/packages/react-intlayer/index.md%5D(https://github.com/aymericzip/intlayer/blob/main/docs/docs/es/packages/react-intlayer/index.md)>) para aplicaciones React
|
|
364
|
+
- [`next-intlayer`](<https://www.google.com/search?q=%5Bhttps://github.com/aymericzip/intlayer/blob/main/docs/docs/es/packages/next-intlayer/index.md%5D(https://github.com/aymericzip/intlayer/blob/main/docs/docs/es/packages/next-intlayer/index.md)>) para aplicaciones Next.js
|
|
365
|
+
|
|
366
|
+
- [`react-intlayer`](<https://www.google.com/search?q=%5Bhttps://github.com/aymericzip/intlayer/blob/main/docs/docs/es/packages/react-intlayer/index.md%5D(https://github.com/aymericzip/intlayer/blob/main/docs/docs/es/packages/react-intlayer/index.md)>) para aplicaciones React
|
|
367
|
+
- [`next-intlayer`](<https://www.google.com/search?q=%5Bhttps://github.com/aymericzip/intlayer/blob/main/docs/docs/es/packages/next-intlayer/index.md%5D(https://github.com/aymericzip/intlayer/blob/main/docs/docs/es/packages/next-intlayer/index.md)>) para aplicaciones Next.js
|
|
368
|
+
- [`vite-intlayer`](<https://www.google.com/search?q=%5Bhttps://github.com/aymericzip/intlayer/blob/main/docs/docs/es/packages/vite-intlayer/index.md%5D(https://github.com/aymericzip/intlayer/blob/main/docs/docs/es/packages/vite-intlayer/index.md)>) para aplicaciones Vite
|
|
369
|
+
|
|
370
|
+
También funciona sin problemas con cualquier solución de internacionalización en diversos entornos, incluidos navegadores y solicitudes API. Puedes personalizar el middleware para detectar la locale a través de headers o cookies:
|
|
371
|
+
|
|
372
|
+
```typescript fileName="intlayer.config.ts" codeFormat="typescript"
|
|
373
|
+
import { Locales, type IntlayerConfig } from "intlayer";
|
|
374
|
+
|
|
375
|
+
const config: IntlayerConfig = {
|
|
376
|
+
// ... Otras opciones de configuración
|
|
377
|
+
middleware: {
|
|
378
|
+
headerName: "my-locale-header",
|
|
379
|
+
cookieName: "my-locale-cookie",
|
|
380
|
+
},
|
|
381
|
+
};
|
|
382
|
+
|
|
383
|
+
export default config;
|
|
384
|
+
```
|
|
385
|
+
|
|
386
|
+
```javascript fileName="intlayer.config.mjs" codeFormat="esm"
|
|
387
|
+
import { Locales } from "intlayer";
|
|
388
|
+
|
|
389
|
+
/** @type {import('intlayer').IntlayerConfig} */
|
|
390
|
+
const config = {
|
|
391
|
+
// ... Otras opciones de configuración
|
|
392
|
+
middleware: {
|
|
393
|
+
headerName: "my-locale-header",
|
|
394
|
+
cookieName: "my-locale-cookie",
|
|
395
|
+
},
|
|
396
|
+
};
|
|
397
|
+
|
|
398
|
+
export default config;
|
|
399
|
+
```
|
|
400
|
+
|
|
401
|
+
```javascript fileName="intlayer.config.cjs" codeFormat="commonjs"
|
|
402
|
+
const { Locales } = require("intlayer");
|
|
403
|
+
|
|
404
|
+
/** @type {import('intlayer').IntlayerConfig} */
|
|
405
|
+
const config = {
|
|
406
|
+
// ... Otras opciones de configuración
|
|
407
|
+
middleware: {
|
|
408
|
+
headerName: "my-locale-header",
|
|
409
|
+
cookieName: "my-locale-cookie",
|
|
410
|
+
},
|
|
411
|
+
};
|
|
412
|
+
|
|
413
|
+
module.exports = config;
|
|
414
|
+
```
|
|
415
|
+
|
|
416
|
+
Por defecto, `fastify-intlayer` interpretará la cabecera `Accept-Language` para determinar el idioma preferido del cliente.
|
|
417
|
+
|
|
418
|
+
> Para más información sobre la configuración y temas avanzados, visita nuestra [documentación](https://github.com/aymericzip/intlayer/blob/main/docs/docs/es/configuration.md).
|
|
419
|
+
|
|
420
|
+
### Configurar TypeScript
|
|
421
|
+
|
|
422
|
+
`fastify-intlayer` aprovecha las robustas capacidades de TypeScript para mejorar el proceso de internacionalización. El tipado estático de TypeScript garantiza que cada clave de traducción esté incluida, reduciendo el riesgo de traducciones faltantes y mejorando la mantenibilidad.
|
|
423
|
+
|
|
424
|
+
Asegúrate de que los tipos autogenerados (por defecto en ./types/intlayer.d.ts) estén incluidos en tu archivo tsconfig.json.
|
|
425
|
+
|
|
426
|
+
```json5 fileName="tsconfig.json"
|
|
427
|
+
{
|
|
428
|
+
// ... Tus configuraciones existentes de TypeScript
|
|
429
|
+
"include": [
|
|
430
|
+
// ... Tus configuraciones existentes de TypeScript
|
|
431
|
+
".intlayer/**/*.ts", // Incluir los tipos autogenerados
|
|
432
|
+
],
|
|
433
|
+
}
|
|
434
|
+
```
|
|
435
|
+
|
|
436
|
+
### Extensión de VS Code
|
|
437
|
+
|
|
438
|
+
Para mejorar tu experiencia de desarrollo con Intlayer, puedes instalar la extensión oficial **Intlayer VS Code Extension**.
|
|
439
|
+
|
|
440
|
+
[Instalar desde el Marketplace de VS Code](https://marketplace.visualstudio.com/items?itemName=intlayer.intlayer-vs-code-extension)
|
|
441
|
+
|
|
442
|
+
Esta extensión proporciona:
|
|
443
|
+
|
|
444
|
+
- **Autocompletion** para las claves de traducción.
|
|
445
|
+
- **Detección de errores en tiempo real** para traducciones faltantes.
|
|
446
|
+
- **Vistas previas en línea** del contenido traducido.
|
|
447
|
+
- **Acciones rápidas** para crear y actualizar traducciones fácilmente.
|
|
448
|
+
|
|
449
|
+
Para más detalles sobre cómo usar la extensión, consulta la [documentación de la Extensión de VS Code de Intlayer](https://intlayer.org/doc/vs-code-extension).
|
|
450
|
+
|
|
451
|
+
### Configuración de Git
|
|
452
|
+
|
|
453
|
+
Se recomienda ignorar los archivos generados por Intlayer. Esto te permite evitar comprometerlos en tu repositorio Git.
|
|
454
|
+
|
|
455
|
+
### Extensión de VS Code
|
|
456
|
+
|
|
457
|
+
Para mejorar tu experiencia de desarrollo con Intlayer, puedes instalar la **Extensión oficial de Intlayer para VS Code**.
|
|
458
|
+
|
|
459
|
+
[Instalar desde el Marketplace de VS Code](https://marketplace.visualstudio.com/items?itemName=intlayer.intlayer-vs-code-extension)
|
|
460
|
+
|
|
461
|
+
Esta extensión proporciona:
|
|
462
|
+
|
|
463
|
+
- **Autocompletado** para claves de traducción.
|
|
464
|
+
- **Detección de errores en tiempo real** para traducciones faltantes.
|
|
465
|
+
- **Previsualizaciones en línea** del contenido traducido.
|
|
466
|
+
- **Acciones rápidas** para crear y actualizar traducciones fácilmente.
|
|
467
|
+
|
|
468
|
+
Para más detalles sobre cómo usar la extensión, consulta la [documentación de la Extensión Intlayer para VS Code](https://intlayer.org/doc/vs-code-extension).
|
|
469
|
+
|
|
470
|
+
### Configuración de Git
|
|
471
|
+
|
|
472
|
+
Se recomienda ignorar los archivos generados por Intlayer. Esto te permite evitar confirmarlos en tu repositorio Git.
|
|
473
|
+
|
|
474
|
+
Para ello, puedes agregar las siguientes instrucciones a tu archivo `.gitignore`:
|
|
475
|
+
|
|
476
|
+
```plaintext fileName=".gitignore"
|
|
477
|
+
# Ignorar los archivos generados por Intlayer
|
|
478
|
+
.intlayer
|
|
479
|
+
|
|
480
|
+
```
|
package/docs/es/readme.md
CHANGED
|
@@ -50,7 +50,7 @@ Con **archivos de contenido por localidad**, **autocompletado en TypeScript**, *
|
|
|
50
50
|
| Característica | Descripción |
|
|
51
51
|
| --------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
52
52
|
| <img src="https://github.com/aymericzip/intlayer/blob/main/docs/assets/frameworks.png?raw=true" alt="Feature" width="700"> | **Compatibilidad entre Frameworks**<br><br>Intlayer es compatible con todos los principales frameworks y bibliotecas, incluyendo Next.js, React, Vite, Vue.js, Nuxt, Preact, Express y más. |
|
|
53
|
-
| <img src="https://github.com/aymericzip/intlayer/blob/main/docs/assets/javascript_content_management.
|
|
53
|
+
| <img src="https://github.com/aymericzip/intlayer/blob/main/docs/assets/javascript_content_management.jpg?raw=true" alt="Feature" width="700"> | **Gestión de Contenido Potenciada por JavaScript**<br><br>Aprovecha la flexibilidad de JavaScript para definir y gestionar tu contenido de manera eficiente. <br><br> - [Declaración de contenido](https://intlayer.org/doc/concept/content) |
|
|
54
54
|
| <img src="https://github.com/aymericzip/intlayer/blob/main/docs/assets/per_locale_content_declaration_file.png?raw=true" alt="Feature" width="700"> | **Archivo de Declaración de Contenido por Localidad**<br><br>Acelera tu desarrollo declarando tu contenido una vez, antes de la generación automática.<br><br> - [Archivo de Declaración de Contenido por Localidad](https://intlayer.org/doc/concept/per-locale-file) |
|
|
55
55
|
| <img src="https://github.com/aymericzip/intlayer/blob/main/docs/assets/autocompletion.png?raw=true" alt="Feature" width="700"> | **Entorno con Tipos Seguros**<br><br>Aprovecha TypeScript para asegurar que tus definiciones de contenido y código estén libres de errores, además de beneficiarte de la autocompletación en el IDE.<br><br> - [Configuración de TypeScript](https://intlayer.org/doc/environment/vite-and-react#configure-typescript) |
|
|
56
56
|
| <img src="https://github.com/aymericzip/intlayer/blob/main/docs/assets/config_file.png?raw=true" alt="Feature" width="700"> | **Configuración Simplificada**<br><br>Ponte en marcha rápidamente con una configuración mínima. Ajusta fácilmente los ajustes para internacionalización, enrutamiento, IA, compilación y manejo de contenido.<br><br> - [Explora la integración con Next.js](https://intlayer.org/doc/environment/nextjs) |
|
package/docs/fr/cli/push.md
CHANGED
|
@@ -23,7 +23,7 @@ slugs:
|
|
|
23
23
|
npx intlayer dictionary push
|
|
24
24
|
```
|
|
25
25
|
|
|
26
|
-
Si [l'éditeur intlayer](https://github.com/aymericzip/intlayer/blob/main/docs/docs/fr/intlayer_visual_editor.md) est installé, vous pouvez également pousser les dictionnaires vers l'éditeur. Cette commande permettra de rendre les dictionnaires disponibles dans [l'éditeur](https://intlayer.org/
|
|
26
|
+
Si [l'éditeur intlayer](https://github.com/aymericzip/intlayer/blob/main/docs/docs/fr/intlayer_visual_editor.md) est installé, vous pouvez également pousser les dictionnaires vers l'éditeur. Cette commande permettra de rendre les dictionnaires disponibles dans [l'éditeur](https://app.intlayer.org/). De cette manière, vous pouvez partager vos dictionnaires avec votre équipe et éditer votre contenu sans modifier le code de votre application.
|
|
27
27
|
|
|
28
28
|
## Alias :
|
|
29
29
|
|
package/docs/fr/configuration.md
CHANGED
|
@@ -246,14 +246,14 @@ Définit les paramètres liés à l'éditeur intégré, y compris le port du ser
|
|
|
246
246
|
- **clientId** :
|
|
247
247
|
- _Type_ : `string` | `undefined`
|
|
248
248
|
- _Par défaut_ : `undefined`
|
|
249
|
-
- _Description_ : clientId et clientSecret permettent aux packages intlayer de s'authentifier auprès du backend en utilisant l'authentification oAuth2. Un jeton d'accès est utilisé pour authentifier l'utilisateur lié au projet. Pour obtenir un jeton d'accès, rendez-vous sur https://intlayer.org/
|
|
249
|
+
- _Description_ : clientId et clientSecret permettent aux packages intlayer de s'authentifier auprès du backend en utilisant l'authentification oAuth2. Un jeton d'accès est utilisé pour authentifier l'utilisateur lié au projet. Pour obtenir un jeton d'accès, rendez-vous sur https://app.intlayer.org/project et créez un compte.
|
|
250
250
|
- _Exemple_ : `true`
|
|
251
251
|
- _Note_ : Important : Le clientId et le clientSecret doivent rester secrets et ne pas être partagés publiquement. Veuillez vous assurer de les conserver dans un endroit sécurisé, comme des variables d'environnement.
|
|
252
252
|
|
|
253
253
|
- **clientSecret** :
|
|
254
254
|
- _Type_ : `string` | `undefined`
|
|
255
255
|
- _Défaut_ : `undefined`
|
|
256
|
-
- _Description_ : clientId et clientSecret permettent aux packages intlayer de s'authentifier auprès du backend en utilisant l'authentification oAuth2. Un jeton d'accès est utilisé pour authentifier l'utilisateur lié au projet. Pour obtenir un jeton d'accès, rendez-vous sur https://intlayer.org/
|
|
256
|
+
- _Description_ : clientId et clientSecret permettent aux packages intlayer de s'authentifier auprès du backend en utilisant l'authentification oAuth2. Un jeton d'accès est utilisé pour authentifier l'utilisateur lié au projet. Pour obtenir un jeton d'accès, rendez-vous sur https://app.intlayer.org/project et créez un compte.
|
|
257
257
|
- _Exemple_ : `true`
|
|
258
258
|
- _Note_ : Important : Le clientId et le clientSecret doivent rester secrets et ne pas être partagés publiquement. Veuillez vous assurer de les conserver dans un endroit sécurisé, comme des variables d'environnement.
|
|
259
259
|
|
|
@@ -469,7 +469,7 @@ Paramètres qui contrôlent le logger, y compris le préfixe à utiliser.
|
|
|
469
469
|
|
|
470
470
|
Paramètres qui contrôlent les fonctionnalités d'IA d'Intlayer, y compris le fournisseur, le modèle et la clé API.
|
|
471
471
|
|
|
472
|
-
Cette configuration est optionnelle si vous êtes inscrit sur le [Tableau de bord Intlayer](https://intlayer.org/
|
|
472
|
+
Cette configuration est optionnelle si vous êtes inscrit sur le [Tableau de bord Intlayer](https://app.intlayer.org/project) en utilisant une clé d'accès. Intlayer gérera automatiquement la solution d'IA la plus efficace et la plus rentable pour vos besoins. Utiliser les options par défaut garantit une meilleure maintenabilité à long terme, car Intlayer met continuellement à jour pour utiliser les modèles les plus pertinents.
|
|
473
473
|
|
|
474
474
|
Si vous préférez utiliser votre propre clé API ou un modèle spécifique, vous pouvez définir votre configuration IA personnalisée.
|
|
475
475
|
Cette configuration IA sera utilisée globalement dans votre environnement Intlayer. Les commandes CLI utiliseront ces paramètres par défaut pour les commandes (par exemple `fill`), ainsi que le SDK, l'éditeur visuel et le CMS. Vous pouvez remplacer ces valeurs par défaut pour des cas d'utilisation spécifiques en utilisant des paramètres de commande.
|
|
@@ -226,7 +226,7 @@ Cette approche vous permet de :
|
|
|
226
226
|
| Fonctionnalité | Description |
|
|
227
227
|
| ------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
228
228
|
|  | **Support Multi-Frameworks**<br><br>Intlayer est compatible avec tous les principaux frameworks et bibliothèques, y compris Next.js, React, Vite, Vue.js, Nuxt, Preact, Express, et bien d'autres. |
|
|
229
|
-
|  | **Gestion de contenu propulsée par JavaScript**<br><br>Exploitez la flexibilité de JavaScript pour définir et gérer votre contenu efficacement. <br><br> - [Déclaration de contenu](https://intlayer.org/doc/concept/content) |
|
|
230
230
|
|  | **Fichier de Déclaration de Contenu par Langue**<br><br>Accélérez votre développement en déclarant votre contenu une seule fois, avant la génération automatique.<br><br> - [Fichier de Déclaration de Contenu par Langue](https://intlayer.org/doc/concept/per-locale-file) |
|
|
231
231
|
|  | **Environnement Typé**<br><br>Exploitez TypeScript pour garantir que vos définitions de contenu et votre code sont sans erreur, tout en bénéficiant de l'autocomplétion dans votre IDE.<br><br> - [Configuration TypeScript](https://intlayer.org/doc/environment/vite-and-react#configure-typescript) |
|
|
232
232
|
|  | **Configuration Simplifiée**<br><br>Démarrez rapidement avec une configuration minimale. Ajustez facilement les paramètres pour l’internationalisation, le routage, l’IA, la compilation et la gestion du contenu.<br><br> - [Explorer l’intégration Next.js](https://intlayer.org/doc/environment/nextjs) |
|
package/docs/fr/intlayer_CMS.md
CHANGED
|
@@ -92,7 +92,7 @@ const config: IntlayerConfig = {
|
|
|
92
92
|
*
|
|
93
93
|
* L'ID client et le secret client sont nécessaires pour activer l'éditeur.
|
|
94
94
|
* Ils permettent d'identifier l'utilisateur qui édite le contenu.
|
|
95
|
-
* Ils peuvent être obtenus en créant un nouveau client dans le tableau de bord Intlayer - Projets (https://intlayer.org/
|
|
95
|
+
* Ils peuvent être obtenus en créant un nouveau client dans le tableau de bord Intlayer - Projets (https://app.intlayer.org/projects).
|
|
96
96
|
* clientId: process.env.INTLAYER_CLIENT_ID,
|
|
97
97
|
* clientSecret: process.env.INTLAYER_CLIENT_SECRET,
|
|
98
98
|
*/
|
|
@@ -142,7 +142,7 @@ const config = {
|
|
|
142
142
|
*
|
|
143
143
|
* L'ID client et le secret client sont nécessaires pour activer l'éditeur.
|
|
144
144
|
* Ils permettent d'identifier l'utilisateur qui édite le contenu.
|
|
145
|
-
* Ils peuvent être obtenus en créant un nouveau client dans le tableau de bord Intlayer - Projets (https://intlayer.org/
|
|
145
|
+
* Ils peuvent être obtenus en créant un nouveau client dans le tableau de bord Intlayer - Projets (https://app.intlayer.org/projects).
|
|
146
146
|
* clientId: process.env.INTLAYER_CLIENT_ID,
|
|
147
147
|
* clientSecret: process.env.INTLAYER_CLIENT_SECRET,
|
|
148
148
|
*/
|
|
@@ -192,7 +192,7 @@ const config = {
|
|
|
192
192
|
*
|
|
193
193
|
* L'ID client et le secret client sont nécessaires pour activer l'éditeur.
|
|
194
194
|
* Ils permettent d'identifier l'utilisateur qui édite le contenu.
|
|
195
|
-
* Ils peuvent être obtenus en créant un nouveau client dans le Tableau de bord Intlayer - Projets (https://intlayer.org/
|
|
195
|
+
* Ils peuvent être obtenus en créant un nouveau client dans le Tableau de bord Intlayer - Projets (https://app.intlayer.org/projects).
|
|
196
196
|
* clientId: process.env.INTLAYER_CLIENT_ID,
|
|
197
197
|
* clientSecret: process.env.INTLAYER_CLIENT_SECRET,
|
|
198
198
|
*/
|
|
@@ -224,7 +224,7 @@ const config = {
|
|
|
224
224
|
module.exports = config;
|
|
225
225
|
```
|
|
226
226
|
|
|
227
|
-
> Si vous ne disposez pas d'un ID client et d'un secret client, vous pouvez les obtenir en créant un nouveau client dans le [Tableau de bord Intlayer - Projets](https://intlayer.org/
|
|
227
|
+
> Si vous ne disposez pas d'un ID client et d'un secret client, vous pouvez les obtenir en créant un nouveau client dans le [Tableau de bord Intlayer - Projets](https://app.intlayer.org/projects).
|
|
228
228
|
|
|
229
229
|
> Pour voir tous les paramètres disponibles, référez-vous à la [documentation de configuration](https://github.com/aymericzip/intlayer/blob/main/docs/docs/fr/configuration.md).
|
|
230
230
|
|
|
@@ -264,7 +264,7 @@ Cette commande télécharge vos dictionnaires de contenu initiaux, les rendant d
|
|
|
264
264
|
|
|
265
265
|
### Modifier le dictionnaire
|
|
266
266
|
|
|
267
|
-
Vous pourrez alors voir et gérer votre dictionnaire dans le [CMS Intlayer](https://intlayer.org/
|
|
267
|
+
Vous pourrez alors voir et gérer votre dictionnaire dans le [CMS Intlayer](https://app.intlayer.org/content).
|
|
268
268
|
|
|
269
269
|
## Synchronisation en direct
|
|
270
270
|
|