@intlayer/docs 7.3.11 → 7.3.13
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 +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/intlayer_with_nuxt.md +294 -438
- package/docs/ar/intlayer_with_react_router_v7.md +33 -4
- package/docs/ar/intlayer_with_react_router_v7_fs_routes.md +516 -0
- package/docs/ar/intlayer_with_tanstack.md +2 -12
- package/docs/ar/intlayer_with_vite+vue.md +1 -0
- package/docs/de/intlayer_with_nuxt.md +284 -410
- package/docs/de/intlayer_with_react_router_v7.md +33 -4
- package/docs/de/intlayer_with_react_router_v7_fs_routes.md +573 -0
- package/docs/de/intlayer_with_tanstack.md +1 -0
- package/docs/de/intlayer_with_vite+vue.md +1 -0
- package/docs/en/intlayer_with_nuxt.md +237 -341
- package/docs/en/intlayer_with_react_router_v7.md +24 -0
- package/docs/en/intlayer_with_react_router_v7_fs_routes.md +570 -0
- package/docs/en/intlayer_with_tanstack.md +2 -12
- package/docs/en/intlayer_with_vite+vue.md +49 -48
- package/docs/en-GB/intlayer_with_nuxt.md +254 -378
- package/docs/en-GB/intlayer_with_react_router_v7.md +33 -4
- package/docs/en-GB/intlayer_with_react_router_v7_fs_routes.md +513 -0
- package/docs/en-GB/intlayer_with_tanstack.md +2 -12
- package/docs/en-GB/intlayer_with_vite+vue.md +1 -0
- package/docs/es/intlayer_with_nuxt.md +271 -390
- package/docs/es/intlayer_with_react_router_v7.md +33 -4
- package/docs/es/intlayer_with_react_router_v7_fs_routes.md +575 -0
- package/docs/es/intlayer_with_tanstack.md +1 -0
- package/docs/es/intlayer_with_vite+vue.md +1 -2
- package/docs/fr/intlayer_with_nuxt.md +278 -405
- package/docs/fr/intlayer_with_react_router_v7.md +34 -5
- package/docs/fr/intlayer_with_react_router_v7_fs_routes.md +574 -0
- package/docs/fr/intlayer_with_tanstack.md +1 -0
- package/docs/fr/intlayer_with_vite+vue.md +1 -0
- package/docs/hi/intlayer_with_nuxt.md +303 -447
- package/docs/hi/intlayer_with_react_router_v7.md +33 -4
- package/docs/hi/intlayer_with_react_router_v7_fs_routes.md +518 -0
- package/docs/hi/intlayer_with_tanstack.md +2 -12
- package/docs/hi/intlayer_with_vite+vue.md +1 -0
- package/docs/id/intlayer_with_nuxt.md +266 -395
- package/docs/id/intlayer_with_react_router_v7.md +29 -4
- package/docs/id/intlayer_with_react_router_v7_fs_routes.md +521 -0
- package/docs/id/intlayer_with_tanstack.md +2 -12
- package/docs/id/intlayer_with_vite+vue.md +1 -0
- package/docs/it/intlayer_with_nuxt.md +299 -423
- package/docs/it/intlayer_with_react_router_v7.md +33 -4
- package/docs/it/intlayer_with_react_router_v7_fs_routes.md +574 -0
- package/docs/it/intlayer_with_tanstack.md +1 -0
- package/docs/ja/intlayer_with_nuxt.md +309 -432
- package/docs/ja/intlayer_with_react_router_v7.md +33 -4
- package/docs/ja/intlayer_with_react_router_v7_fs_routes.md +574 -0
- package/docs/ja/intlayer_with_tanstack.md +2 -12
- package/docs/ja/intlayer_with_vite+vue.md +1 -0
- package/docs/ko/intlayer_with_nuxt.md +295 -422
- package/docs/ko/intlayer_with_react_router_v7.md +33 -4
- package/docs/ko/intlayer_with_react_router_v7_fs_routes.md +515 -0
- package/docs/ko/intlayer_with_tanstack.md +2 -12
- package/docs/ko/intlayer_with_vite+vue.md +1 -0
- package/docs/pl/intlayer_with_nuxt.md +273 -476
- package/docs/pl/intlayer_with_react_router_v7.md +32 -5
- package/docs/pl/intlayer_with_react_router_v7_fs_routes.md +615 -0
- package/docs/pl/intlayer_with_tanstack.md +2 -12
- package/docs/pl/intlayer_with_vite+vue.md +1 -0
- package/docs/pt/intlayer_with_nuxt.md +277 -420
- package/docs/pt/intlayer_with_react_router_v7.md +28 -0
- package/docs/pt/intlayer_with_tanstack.md +1 -0
- package/docs/ru/intlayer_with_nuxt.md +287 -425
- package/docs/ru/intlayer_with_react_router_v7.md +33 -4
- package/docs/ru/intlayer_with_react_router_v7_fs_routes.md +574 -0
- package/docs/ru/intlayer_with_tanstack.md +1 -0
- package/docs/ru/intlayer_with_vite+vue.md +1 -0
- package/docs/tr/intlayer_with_nuxt.md +313 -406
- package/docs/tr/intlayer_with_react_router_v7.md +33 -4
- package/docs/tr/intlayer_with_react_router_v7_fs_routes.md +572 -0
- package/docs/tr/intlayer_with_tanstack.md +2 -12
- package/docs/tr/intlayer_with_vite+vue.md +1 -0
- package/docs/vi/intlayer_with_nuxt.md +273 -418
- package/docs/vi/intlayer_with_react_router_v7.md +29 -4
- package/docs/vi/intlayer_with_react_router_v7_fs_routes.md +523 -0
- package/docs/vi/intlayer_with_tanstack.md +2 -12
- package/docs/vi/intlayer_with_vite+vue.md +1 -0
- package/docs/zh/intlayer_with_nuxt.md +300 -461
- package/docs/zh/intlayer_with_react_router_v7.md +33 -4
- package/docs/zh/intlayer_with_react_router_v7_fs_routes.md +516 -0
- package/docs/zh/intlayer_with_tanstack.md +2 -12
- package/docs/zh/intlayer_with_vite+vue.md +1 -0
- package/package.json +10 -11
- package/src/generated/docs.entry.ts +19 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
createdAt: 2025-06-18
|
|
3
|
-
updatedAt: 2025-
|
|
4
|
-
title: Cómo traducir tu Nuxt
|
|
3
|
+
updatedAt: 2025-12-07
|
|
4
|
+
title: Cómo traducir tu aplicación Nuxt y Vue – Guía i18n 2025
|
|
5
5
|
description: Descubre cómo hacer tu sitio web Nuxt y Vue multilingüe. Sigue la documentación para internacionalizar (i18n) y traducirlo.
|
|
6
6
|
keywords:
|
|
7
7
|
- Internacionalización
|
|
@@ -14,33 +14,60 @@ slugs:
|
|
|
14
14
|
- doc
|
|
15
15
|
- environment
|
|
16
16
|
- nuxt-and-vue
|
|
17
|
-
applicationTemplate: https://github.com/aymericzip/intlayer-nuxt-template
|
|
17
|
+
applicationTemplate: https://github.com/aymericzip/intlayer-nuxt-4-template
|
|
18
|
+
youtubeVideo: https://www.youtube.com/watch?v=nhUcUAVQ6eQ
|
|
18
19
|
history:
|
|
20
|
+
- version: 7.3.11
|
|
21
|
+
date: 2025-12-07
|
|
22
|
+
changes: Actualización de LocaleSwitcher, SEO, metadatos
|
|
19
23
|
- version: 5.5.10
|
|
20
24
|
date: 2025-06-29
|
|
21
25
|
changes: Historial inicial
|
|
22
26
|
---
|
|
23
27
|
|
|
24
|
-
# Traduce tu Nuxt
|
|
28
|
+
# Traduce tu sitio web Nuxt y Vue usando Intlayer | Internacionalización (i18n)
|
|
25
29
|
|
|
26
|
-
|
|
30
|
+
## Tabla de Contenidos
|
|
31
|
+
|
|
32
|
+
<TOC/>
|
|
27
33
|
|
|
28
34
|
## ¿Qué es Intlayer?
|
|
29
35
|
|
|
30
|
-
**Intlayer** es una biblioteca innovadora y de código abierto para
|
|
36
|
+
**Intlayer** es una biblioteca innovadora y de código abierto para internacionalización (i18n) diseñada para simplificar el soporte multilingüe en aplicaciones web modernas.
|
|
31
37
|
|
|
32
38
|
Con Intlayer, puedes:
|
|
33
39
|
|
|
34
40
|
- **Gestionar traducciones fácilmente** usando diccionarios declarativos a nivel de componente.
|
|
35
41
|
- **Localizar dinámicamente metadatos**, rutas y contenido.
|
|
36
|
-
- **
|
|
37
|
-
- **Beneficiarte de funciones avanzadas**, como la detección y
|
|
42
|
+
- **Asegurar soporte para TypeScript** con tipos autogenerados, mejorando la autocompletación y detección de errores.
|
|
43
|
+
- **Beneficiarte de funciones avanzadas**, como la detección y cambio dinámico de locales.
|
|
38
44
|
|
|
39
45
|
---
|
|
40
46
|
|
|
41
47
|
## Guía paso a paso para configurar Intlayer en una aplicación Nuxt
|
|
42
48
|
|
|
43
|
-
|
|
49
|
+
<Tab defaultTab="video">
|
|
50
|
+
<TabItem label="Video" value="video">
|
|
51
|
+
|
|
52
|
+
<iframe title="¿Cómo traducir tu aplicación Nuxt y Vue usando Intlayer? Descubre Intlayer" class="m-auto aspect-[16/9] w-full overflow-hidden rounded-lg border-0" allow="autoplay; gyroscope;" loading="lazy" width="1080" height="auto" src="https://www.youtube.com/embed/nhUcUAVQ6eQ?autoplay=0&origin=http://intlayer.org&controls=0&rel=1"/>
|
|
53
|
+
|
|
54
|
+
</TabItem>
|
|
55
|
+
<TabItem label="Código" value="code">
|
|
56
|
+
|
|
57
|
+
<iframe
|
|
58
|
+
src="https://stackblitz.com/github/aymericzip/intlayer-nuxt-4-template?embed=1&ctl=1&file=intlayer.config.ts"
|
|
59
|
+
className="m-auto overflow-hidden rounded-lg border-0 max-md:size-full max-md:h-[700px] md:aspect-16/9 md:w-full"
|
|
60
|
+
title="Demo CodeSandbox - Cómo internacionalizar tu aplicación usando Intlayer"
|
|
61
|
+
sandbox="allow-forms allow-modals allow-popups allow-presentation allow-same-origin allow-scripts"
|
|
62
|
+
loading="lazy"
|
|
63
|
+
/>
|
|
64
|
+
|
|
65
|
+
</TabItem>
|
|
66
|
+
</Tab>
|
|
67
|
+
|
|
68
|
+
Consulta la [Plantilla de Aplicación](https://github.com/aymericzip/intlayer-nuxt-4-template) en GitHub.
|
|
69
|
+
|
|
70
|
+
### Paso 1: Instalar Dependencias
|
|
44
71
|
|
|
45
72
|
Instala los paquetes necesarios usando npm:
|
|
46
73
|
|
|
@@ -61,13 +88,13 @@ yarn add --save-dev nuxt-intlayer
|
|
|
61
88
|
|
|
62
89
|
- **intlayer**
|
|
63
90
|
|
|
64
|
-
El paquete principal que proporciona herramientas de internacionalización para la gestión de configuración, traducción, [declaración de contenido](https://github.com/aymericzip/intlayer/blob/main/docs/docs/es/dictionary/
|
|
91
|
+
El paquete principal que proporciona herramientas de internacionalización para la gestión de configuración, traducción, [declaración de contenido](https://github.com/aymericzip/intlayer/blob/main/docs/docs/es/dictionary/content_file.md), transpilación y [comandos CLI](https://github.com/aymericzip/intlayer/blob/main/docs/docs/es/cli/index.md).
|
|
65
92
|
|
|
66
93
|
- **vue-intlayer**
|
|
67
94
|
El paquete que integra Intlayer con aplicaciones Vue. Proporciona los composables para los componentes Vue.
|
|
68
95
|
|
|
69
96
|
- **nuxt-intlayer**
|
|
70
|
-
El módulo de Nuxt que integra Intlayer con aplicaciones Nuxt. Proporciona configuración automática, middleware para la detección de
|
|
97
|
+
El módulo de Nuxt que integra Intlayer con aplicaciones Nuxt. Proporciona configuración automática, middleware para la detección de locale, gestión de cookies y redirección de URL.
|
|
71
98
|
|
|
72
99
|
### Paso 2: Configuración de tu proyecto
|
|
73
100
|
|
|
@@ -86,9 +113,6 @@ const config: IntlayerConfig = {
|
|
|
86
113
|
],
|
|
87
114
|
defaultLocale: Locales.ENGLISH,
|
|
88
115
|
},
|
|
89
|
-
content: {
|
|
90
|
-
contentDir: ["."], // Porque por defecto Intlayer observará los archivos de declaración de contenido desde el directorio `./src`
|
|
91
|
-
},
|
|
92
116
|
};
|
|
93
117
|
|
|
94
118
|
export default config;
|
|
@@ -98,7 +122,6 @@ export default config;
|
|
|
98
122
|
import { Locales } from "intlayer";
|
|
99
123
|
|
|
100
124
|
/** @type {import('intlayer').IntlayerConfig} */
|
|
101
|
-
// Configuración del archivo para Intlayer
|
|
102
125
|
const config = {
|
|
103
126
|
internationalization: {
|
|
104
127
|
locales: [
|
|
@@ -109,9 +132,6 @@ const config = {
|
|
|
109
132
|
],
|
|
110
133
|
defaultLocale: Locales.ENGLISH,
|
|
111
134
|
},
|
|
112
|
-
content: {
|
|
113
|
-
contentDir: ["."], // Directorio donde se encuentran las declaraciones de contenido
|
|
114
|
-
},
|
|
115
135
|
};
|
|
116
136
|
|
|
117
137
|
export default config;
|
|
@@ -121,7 +141,6 @@ export default config;
|
|
|
121
141
|
const { Locales } = require("intlayer");
|
|
122
142
|
|
|
123
143
|
/** @type {import('intlayer').IntlayerConfig} */
|
|
124
|
-
// Configuración del archivo para Intlayer
|
|
125
144
|
const config = {
|
|
126
145
|
internationalization: {
|
|
127
146
|
locales: [
|
|
@@ -132,17 +151,14 @@ const config = {
|
|
|
132
151
|
],
|
|
133
152
|
defaultLocale: Locales.ENGLISH,
|
|
134
153
|
},
|
|
135
|
-
content: {
|
|
136
|
-
contentDir: ["."],
|
|
137
|
-
},
|
|
138
154
|
};
|
|
139
155
|
|
|
140
156
|
module.exports = config;
|
|
141
157
|
```
|
|
142
158
|
|
|
143
|
-
> A través de este archivo de configuración, puedes configurar URLs localizadas, redirección mediante middleware, nombres de cookies, la ubicación y extensión de tus declaraciones de contenido,
|
|
159
|
+
> A través de este archivo de configuración, puedes configurar URLs localizadas, redirección mediante middleware, nombres de cookies, la ubicación y extensión de tus declaraciones de contenido, desactivar los logs de Intlayer en la consola, y más. Para una lista completa de los parámetros disponibles, consulta la [documentación de configuración](https://github.com/aymericzip/intlayer/blob/main/docs/docs/es/configuration.md).
|
|
144
160
|
|
|
145
|
-
### Paso 3: Integra Intlayer en tu
|
|
161
|
+
### Paso 3: Integra Intlayer en tu Configuración de Nuxt
|
|
146
162
|
|
|
147
163
|
Agrega el módulo intlayer a tu configuración de Nuxt:
|
|
148
164
|
|
|
@@ -155,186 +171,46 @@ export default defineNuxtConfig({
|
|
|
155
171
|
});
|
|
156
172
|
```
|
|
157
173
|
|
|
158
|
-
> El módulo `nuxt-intlayer` maneja automáticamente la integración de Intlayer con Nuxt. Configura la construcción de
|
|
174
|
+
> El módulo `nuxt-intlayer` maneja automáticamente la integración de Intlayer con Nuxt. Configura la construcción de las declaraciones de contenido, monitorea los archivos en modo desarrollo, proporciona middleware para la detección de la locale y gestiona el enrutamiento localizado.
|
|
159
175
|
|
|
160
|
-
### Paso 4: Declara
|
|
176
|
+
### Paso 4: Declara tu Contenido
|
|
161
177
|
|
|
162
|
-
Crea y
|
|
178
|
+
Crea y gestiona tus declaraciones de contenido para almacenar traducciones:
|
|
163
179
|
|
|
164
|
-
```tsx fileName="
|
|
165
|
-
import {
|
|
180
|
+
```tsx fileName="content/home-page.content.ts" contentDeclarationFormat="typescript"
|
|
181
|
+
import { type Dictionary, t } from "intlayer";
|
|
166
182
|
|
|
167
|
-
const
|
|
168
|
-
key: "
|
|
183
|
+
const content = {
|
|
184
|
+
key: "home-page",
|
|
169
185
|
content: {
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
es: "Edita <code>components/HelloWorld.vue</code> y guarda para probar HMR",
|
|
175
|
-
}),
|
|
176
|
-
checkOut: t({ en: "Check out ", fr: "Vérifiez ", es: "Compruebe " }),
|
|
177
|
-
nuxtIntlayer: t({
|
|
178
|
-
en: "Nuxt Intlayer documentation",
|
|
179
|
-
fr: "Documentation de Nuxt Intlayer",
|
|
180
|
-
es: "Documentación de Nuxt Intlayer",
|
|
181
|
-
}),
|
|
182
|
-
learnMore: t({
|
|
183
|
-
en: "Learn more about Nuxt in the ",
|
|
184
|
-
fr: "En savoir plus sur Nuxt dans la ",
|
|
185
|
-
es: "Aprenda más sobre Nuxt en la ",
|
|
186
|
+
title: t({
|
|
187
|
+
en: "Hello world",
|
|
188
|
+
fr: "Bonjour le monde",
|
|
189
|
+
es: "Hola mundo",
|
|
186
190
|
}),
|
|
187
|
-
|
|
188
|
-
en: "
|
|
189
|
-
fr: "
|
|
190
|
-
es: "
|
|
191
|
+
metaTitle: t({
|
|
192
|
+
en: "Welcome | My Application",
|
|
193
|
+
fr: "Bienvenue | Mon Application",
|
|
194
|
+
es: "Bienvenido | Mi Aplicación",
|
|
191
195
|
}),
|
|
192
|
-
|
|
193
|
-
en: "
|
|
194
|
-
fr: "
|
|
195
|
-
es: "
|
|
196
|
+
metaDescription: t({
|
|
197
|
+
en: "Discover your multilingual Nuxt app homepage powered by Intlayer.",
|
|
198
|
+
fr: "Découvrez la page d'accueil multilingue de votre application Nuxt propulsée par Intlayer.",
|
|
199
|
+
es: "Descubre la página de inicio multilingüe de tu aplicación Nuxt impulsada por Intlayer.",
|
|
196
200
|
}),
|
|
197
201
|
},
|
|
198
202
|
} satisfies Dictionary;
|
|
199
203
|
|
|
200
|
-
export default
|
|
201
|
-
fr: "Cliquez sur le logo Nuxt pour en savoir plus",
|
|
202
|
-
es: "Haga clic en el logotipo de Nuxt para obtener más información",
|
|
203
|
-
}),
|
|
204
|
-
},
|
|
205
|
-
} satisfies Dictionary;
|
|
206
|
-
|
|
207
|
-
export default helloWorldContent;
|
|
204
|
+
export default content;
|
|
208
205
|
```
|
|
209
206
|
|
|
210
|
-
|
|
211
|
-
import { t } from "intlayer";
|
|
212
|
-
|
|
213
|
-
/** @type {import('intlayer').Dictionary} */
|
|
214
|
-
const helloWorldContent = {
|
|
215
|
-
key: "helloworld",
|
|
216
|
-
content: {
|
|
217
|
-
count: t({ en: "count is ", fr: "le compte est ", es: "el recuento es " }),
|
|
218
|
-
edit: t({
|
|
219
|
-
en: "Edit <code>components/HelloWorld.vue</code> and save to test HMR",
|
|
220
|
-
fr: "Éditez <code>components/HelloWorld.vue</code> et enregistrez pour tester HMR",
|
|
221
|
-
es: "Edita <code>components/HelloWorld.vue</code> y guarda para probar HMR",
|
|
222
|
-
}),
|
|
223
|
-
checkOut: t({ en: "Check out ", fr: "Vérifiez ", es: "Compruebe " }),
|
|
224
|
-
nuxtIntlayer: t({
|
|
225
|
-
en: "Nuxt Intlayer documentation",
|
|
226
|
-
fr: "Documentation de Nuxt Intlayer",
|
|
227
|
-
es: "Documentación de Nuxt Intlayer",
|
|
228
|
-
}),
|
|
229
|
-
learnMore: t({
|
|
230
|
-
en: "Learn more about Nuxt in the ",
|
|
231
|
-
fr: "En savoir plus sur Nuxt dans la ",
|
|
232
|
-
es: "Aprenda más sobre Nuxt en la ",
|
|
233
|
-
}),
|
|
234
|
-
nuxtDocs: t({
|
|
235
|
-
en: "Nuxt Documentation",
|
|
236
|
-
fr: "Documentation Nuxt",
|
|
237
|
-
es: "Documentación de Nuxt",
|
|
238
|
-
}),
|
|
239
|
-
readTheDocs: t({
|
|
240
|
-
en: "Click on the Nuxt logo to learn more",
|
|
241
|
-
fr: "Cliquez sur le logo Nuxt pour en savoir plus",
|
|
242
|
-
es: "Haga clic en el logotipo de Nuxt para obtener más información",
|
|
243
|
-
}),
|
|
244
|
-
},
|
|
245
|
-
};
|
|
246
|
-
|
|
247
|
-
export default helloWorldContent;
|
|
248
|
-
```
|
|
207
|
+
> Tus declaraciones de contenido pueden definirse en cualquier parte de tu aplicación siempre que estén incluidas en el directorio `contentDir` (por defecto, `./src`). Y coincidan con la extensión de archivo de declaración de contenido (por defecto, `.content.{json,ts,tsx,js,jsx,mjs,mjx,cjs,cjx}`).
|
|
249
208
|
|
|
250
|
-
|
|
251
|
-
const { t } = require("intlayer");
|
|
209
|
+
> 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).
|
|
252
210
|
|
|
253
|
-
|
|
254
|
-
const helloWorldContent = {
|
|
255
|
-
key: "helloworld",
|
|
256
|
-
content: {
|
|
257
|
-
count: t({ en: "count is ", fr: "le compte est ", es: "el recuento es " }),
|
|
258
|
-
edit: t({
|
|
259
|
-
en: "Edit <code>components/HelloWorld.vue</code> and save to test HMR",
|
|
260
|
-
fr: "Éditez <code>components/HelloWorld.vue</code> et enregistrez pour tester HMR",
|
|
261
|
-
es: "Edita <code>components/HelloWorld.vue</code> y guarda para probar HMR",
|
|
262
|
-
}),
|
|
263
|
-
checkOut: t({ en: "Check out ", fr: "Vérifiez ", es: "Compruebe " }),
|
|
264
|
-
nuxtIntlayer: t({
|
|
265
|
-
en: "Nuxt Intlayer documentation",
|
|
266
|
-
fr: "Documentation de Nuxt Intlayer",
|
|
267
|
-
es: "Documentación de Nuxt Intlayer",
|
|
268
|
-
}),
|
|
269
|
-
es: "Documentación de Nuxt Intlayer",
|
|
270
|
-
}),
|
|
271
|
-
learnMore: t({
|
|
272
|
-
en: "Learn more about Nuxt in the ",
|
|
273
|
-
fr: "En savoir plus sur Nuxt dans la ",
|
|
274
|
-
es: "Aprenda más sobre Nuxt en la ",
|
|
275
|
-
}),
|
|
276
|
-
nuxtDocs: t({
|
|
277
|
-
en: "Nuxt Documentation",
|
|
278
|
-
fr: "Documentation Nuxt",
|
|
279
|
-
es: "Documentación de Nuxt",
|
|
280
|
-
}),
|
|
281
|
-
readTheDocs: t({
|
|
282
|
-
en: "Click on the Nuxt logo to learn more",
|
|
283
|
-
fr: "Cliquez sur le logo Nuxt pour en savoir plus",
|
|
284
|
-
es: "Haga clic en el logotipo de Nuxt para obtener más información",
|
|
285
|
-
}),
|
|
286
|
-
},
|
|
287
|
-
};
|
|
211
|
+
### Paso 5: Utiliza Intlayer en tu Código
|
|
288
212
|
|
|
289
|
-
|
|
290
|
-
```
|
|
291
|
-
|
|
292
|
-
```json fileName="components/helloWorld.content.json" contentDeclarationFormat="json"
|
|
293
|
-
{
|
|
294
|
-
"$schema": "https://intlayer.org/schema.json",
|
|
295
|
-
"key": "helloworld",
|
|
296
|
-
"content": {
|
|
297
|
-
"count": {
|
|
298
|
-
"nodeType": "translation",
|
|
299
|
-
"translation": {
|
|
300
|
-
"en": "count is ",
|
|
301
|
-
"fr": "le compte est ",
|
|
302
|
-
"es": "el recuento es "
|
|
303
|
-
}
|
|
304
|
-
},
|
|
305
|
-
"edit": {
|
|
306
|
-
"nodeType": "translation",
|
|
307
|
-
"translation": {
|
|
308
|
-
"en": "Edit <code>components/HelloWorld.vue</code> and save to test HMR",
|
|
309
|
-
"fr": "Éditez <code>components/HelloWorld.vue</code> et enregistrez pour tester HMR",
|
|
310
|
-
"es": "Edita <code>components/HelloWorld.vue</code> y guarda para probar HMR"
|
|
311
|
-
}
|
|
312
|
-
},
|
|
313
|
-
"checkOut": {
|
|
314
|
-
"nodeType": "translation",
|
|
315
|
-
"translation": {
|
|
316
|
-
"en": "Check out ",
|
|
317
|
-
"fr": "Vérifiez ",
|
|
318
|
-
"es": "Compruebe "
|
|
319
|
-
}
|
|
320
|
-
},
|
|
321
|
-
"nuxtIntlayer": {
|
|
322
|
-
"nodeType": "translation",
|
|
323
|
-
"translation": {
|
|
324
|
-
"es": "Haga clic en el logotipo de Nuxt para obtener más información"
|
|
325
|
-
}
|
|
326
|
-
}
|
|
327
|
-
}
|
|
328
|
-
}
|
|
329
|
-
```
|
|
330
|
-
|
|
331
|
-
> Sus declaraciones de contenido pueden definirse en cualquier lugar de su aplicación siempre que estén incluidas en el directorio `contentDir` (por defecto, `./src`). Y coincidan con la extensión de archivo de declaración de contenido (por defecto, `.content.{json,ts,tsx,js,jsx,mjs,mjx,cjs,cjx}`).
|
|
332
|
-
|
|
333
|
-
> Para más detalles, consulte la [documentación de declaración de contenido](https://github.com/aymericzip/intlayer/blob/main/docs/docs/es/dictionary/get_started.md).
|
|
334
|
-
|
|
335
|
-
### Paso 5: Utilice Intlayer en su Código
|
|
336
|
-
|
|
337
|
-
Acceda a sus diccionarios de contenido en toda su aplicación Nuxt usando el composable `useIntlayer`:
|
|
213
|
+
Accede a tus diccionarios de contenido en toda tu aplicación Nuxt usando el composable `useIntlayer`:
|
|
338
214
|
|
|
339
215
|
```vue fileName="components/HelloWorld.vue"
|
|
340
216
|
<script setup lang="ts">
|
|
@@ -388,7 +264,7 @@ const countRef = ref(0);
|
|
|
388
264
|
Intlayer ofrece diferentes APIs para acceder a tu contenido:
|
|
389
265
|
|
|
390
266
|
- **Sintaxis basada en componentes** (recomendada):
|
|
391
|
-
Usa la sintaxis `<myContent
|
|
267
|
+
Usa la sintaxis `<myContent />`, o `<Component :is="myContent" />` para renderizar contenido como un Nodo de Intlayer. Esto se integra perfectamente con el [Editor Visual](https://github.com/aymericzip/intlayer/blob/main/docs/docs/es/intlayer_visual_editor.md) y el [CMS](https://github.com/aymericzip/intlayer/blob/main/docs/docs/es/intlayer_CMS.md).
|
|
392
268
|
|
|
393
269
|
- **Sintaxis basada en cadenas**:
|
|
394
270
|
Usa `{{ myContent }}` para renderizar el contenido como texto plano, sin soporte para el Editor Visual.
|
|
@@ -398,71 +274,61 @@ Intlayer ofrece diferentes APIs para acceder a tu contenido:
|
|
|
398
274
|
|
|
399
275
|
- **Sintaxis de desestructuración**:
|
|
400
276
|
El composable `useIntlayer` devuelve un Proxy con el contenido. Este proxy puede ser desestructurado para acceder al contenido manteniendo la reactividad.
|
|
401
|
-
- Usa `const content = useIntlayer("myContent");` y `{{ content.myContent }}` / `<content.myContent />`.
|
|
402
|
-
- O usa `const { myContent } = useIntlayer("myContent");` y `{{ myContent}}` / `<myContent/>` para desestructurar el contenido.
|
|
277
|
+
- Usa `const content = useIntlayer("myContent");` y `{{ content.myContent }}` / `<content.myContent />`.
|
|
278
|
+
- O usa `const { myContent } = useIntlayer("myContent");` y `{{ myContent}}` / `<myContent/>` para desestructurar el contenido.
|
|
403
279
|
|
|
404
280
|
### (Opcional) Paso 6: Cambiar el idioma de tu contenido
|
|
405
281
|
|
|
406
282
|
Para cambiar el idioma de tu contenido, puedes usar la función `setLocale` proporcionada por el composable `useLocale`. Esta función te permite establecer la configuración regional de la aplicación y actualizar el contenido en consecuencia.
|
|
407
283
|
|
|
408
|
-
Crea un componente para cambiar entre idiomas:
|
|
284
|
+
Crea un componente para cambiar entre idiomas usando `NuxtLink`. **Usar enlaces en lugar de botones para cambiar de idioma es una buena práctica para SEO y la descubribilidad de la página**, ya que permite a los motores de búsqueda rastrear e indexar todas las versiones localizadas de tus páginas:
|
|
409
285
|
|
|
410
286
|
```vue fileName="components/LocaleSwitcher.vue"
|
|
411
|
-
<template>
|
|
412
|
-
<div class="locale-switcher">
|
|
413
|
-
<select v-model="selectedLocale" @change="changeLocale">
|
|
414
|
-
<option v-for="loc in availableLocales" :key="loc" :value="loc">
|
|
415
|
-
{{ getLocaleName(loc) }}
|
|
416
|
-
</option>
|
|
417
|
-
</select>
|
|
418
|
-
</div>
|
|
419
|
-
</template>
|
|
420
|
-
|
|
421
287
|
<script setup lang="ts">
|
|
422
|
-
import {
|
|
423
|
-
import { getLocaleName } from "intlayer";
|
|
288
|
+
import { getLocaleName, getLocalizedUrl } from "intlayer";
|
|
424
289
|
import { useLocale } from "vue-intlayer";
|
|
425
290
|
|
|
426
|
-
//
|
|
291
|
+
// Nuxt importa automáticamente useRoute
|
|
292
|
+
const route = useRoute();
|
|
427
293
|
const { locale, availableLocales, setLocale } = useLocale();
|
|
428
|
-
|
|
429
|
-
// Rastrear el locale seleccionado con un ref
|
|
430
|
-
const selectedLocale = ref(locale.value);
|
|
431
|
-
|
|
432
|
-
// Actualizar el locale cuando cambia la selección
|
|
433
|
-
const changeLocale = () => setLocale(selectedLocale.value);
|
|
434
|
-
|
|
435
|
-
// Mantener selectedLocale sincronizado con el locale global
|
|
436
|
-
watch(
|
|
437
|
-
() => locale.value,
|
|
438
|
-
(newLocale) => {
|
|
439
|
-
selectedLocale.value = newLocale;
|
|
440
|
-
}
|
|
441
|
-
);
|
|
442
294
|
</script>
|
|
295
|
+
|
|
296
|
+
<template>
|
|
297
|
+
<nav class="locale-switcher">
|
|
298
|
+
<NuxtLink
|
|
299
|
+
v-for="localeEl in availableLocales"
|
|
300
|
+
:key="localeEl"
|
|
301
|
+
:to="getLocalizedUrl(route.fullPath, localeEl)"
|
|
302
|
+
class="locale-link"
|
|
303
|
+
:class="{ 'active-locale': localeEl === locale }"
|
|
304
|
+
@click="setLocale(localeEl)"
|
|
305
|
+
>
|
|
306
|
+
{{ getLocaleName(localeEl) }}
|
|
307
|
+
</NuxtLink>
|
|
308
|
+
</nav>
|
|
443
309
|
</template>
|
|
310
|
+
```
|
|
444
311
|
|
|
445
|
-
|
|
446
|
-
.locale-switcher {
|
|
447
|
-
margin: 1rem 0;
|
|
448
|
-
}
|
|
312
|
+
> Usar `NuxtLink` con atributos `href` adecuados (a través de `getLocalizedUrl`) asegura que los motores de búsqueda puedan descubrir todas las variantes de idioma de tus páginas. Esto es preferible a cambiar el idioma solo con JavaScript, ya que los rastreadores de motores de búsqueda pueden no seguirlo.
|
|
449
313
|
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
314
|
+
Luego, configura tu `app.vue` para usar layouts:
|
|
315
|
+
|
|
316
|
+
```vue fileName="app.vue"
|
|
317
|
+
<template>
|
|
318
|
+
<NuxtLayout>
|
|
319
|
+
<NuxtPage />
|
|
320
|
+
</NuxtLayout>
|
|
321
|
+
</template>
|
|
456
322
|
```
|
|
457
323
|
|
|
458
|
-
|
|
324
|
+
### (Opcional) Paso 6b: Crear un Layout con Navegación
|
|
459
325
|
|
|
460
|
-
|
|
326
|
+
Los layouts de Nuxt te permiten definir una estructura común para tus páginas. Crea un layout por defecto que incluya el selector de idioma y la navegación:
|
|
327
|
+
|
|
328
|
+
```vue fileName="layouts/default.vue"
|
|
461
329
|
<script setup lang="ts">
|
|
462
|
-
import
|
|
330
|
+
import Links from "~/components/Links.vue";
|
|
463
331
|
import LocaleSwitcher from "~/components/LocaleSwitcher.vue";
|
|
464
|
-
|
|
465
|
-
const content = useIntlayer("app"); // Crear archivo de declaración intlayer relacionado
|
|
466
332
|
</script>
|
|
467
333
|
|
|
468
334
|
<template>
|
|
@@ -471,15 +337,20 @@ const content = useIntlayer("app"); // Crear archivo de declaración intlayer re
|
|
|
471
337
|
<LocaleSwitcher />
|
|
472
338
|
</header>
|
|
473
339
|
<main>
|
|
474
|
-
<
|
|
340
|
+
<slot />
|
|
475
341
|
</main>
|
|
342
|
+
|
|
343
|
+
<Links href="/">Inicio</Links>
|
|
344
|
+
<Links href="/about">Acerca de</Links>
|
|
476
345
|
</div>
|
|
477
346
|
</template>
|
|
478
347
|
```
|
|
479
348
|
|
|
349
|
+
El componente `Links` (mostrado a continuación) asegura que los enlaces de navegación interna se localicen automáticamente.
|
|
350
|
+
|
|
480
351
|
### (Opcional) Paso 7: Añadir enrutamiento localizado a tu aplicación
|
|
481
352
|
|
|
482
|
-
Nuxt maneja automáticamente el enrutamiento localizado cuando se
|
|
353
|
+
Nuxt maneja automáticamente el enrutamiento localizado cuando se usa el módulo `nuxt-intlayer`. Esto crea rutas para cada idioma automáticamente basándose en la estructura del directorio de tus páginas.
|
|
483
354
|
|
|
484
355
|
Ejemplo:
|
|
485
356
|
|
|
@@ -491,275 +362,287 @@ pages/
|
|
|
491
362
|
└── index.vue → /contact, /fr/contact, /es/contact
|
|
492
363
|
```
|
|
493
364
|
|
|
494
|
-
Para crear
|
|
365
|
+
Para crear páginas localizadas, simplemente crea tus archivos Vue en el directorio `pages/`. Aquí tienes dos ejemplos de páginas:
|
|
366
|
+
|
|
367
|
+
**Página de inicio (`pages/index.vue`):**
|
|
368
|
+
|
|
369
|
+
```vue fileName="pages/index.vue"
|
|
370
|
+
<script setup lang="ts">
|
|
371
|
+
import { useIntlayer } from "vue-intlayer";
|
|
372
|
+
|
|
373
|
+
const content = useIntlayer("home-page");
|
|
374
|
+
|
|
375
|
+
useHead({
|
|
376
|
+
title: content.metaTitle.value,
|
|
377
|
+
meta: [
|
|
378
|
+
{
|
|
379
|
+
name: "description",
|
|
380
|
+
content: content.metaDescription.value,
|
|
381
|
+
},
|
|
382
|
+
],
|
|
383
|
+
});
|
|
384
|
+
</script>
|
|
385
|
+
|
|
386
|
+
<template>
|
|
387
|
+
<h1><content.title /></h1>
|
|
388
|
+
</template>
|
|
389
|
+
```
|
|
390
|
+
|
|
391
|
+
**Página Acerca de (`pages/about.vue`):**
|
|
495
392
|
|
|
496
393
|
```vue fileName="pages/about.vue"
|
|
497
394
|
<script setup lang="ts">
|
|
498
395
|
import { useIntlayer } from "vue-intlayer";
|
|
499
396
|
|
|
500
|
-
const content = useIntlayer("about");
|
|
397
|
+
const content = useIntlayer("about-page");
|
|
398
|
+
|
|
399
|
+
useHead({
|
|
400
|
+
title: content.metaTitle.raw, // Usa .raw para acceso a cadena primitiva
|
|
401
|
+
meta: [
|
|
402
|
+
{
|
|
403
|
+
name: "description",
|
|
404
|
+
content: content.metaDescription.raw, // Usa .raw para acceder a la cadena primitiva
|
|
405
|
+
},
|
|
406
|
+
],
|
|
407
|
+
});
|
|
501
408
|
</script>
|
|
502
409
|
|
|
503
410
|
<template>
|
|
504
|
-
<
|
|
505
|
-
<h1>{{ content.title }}</h1>
|
|
506
|
-
<p>{{ content.description }}</p>
|
|
507
|
-
</div>
|
|
411
|
+
<h1><content.title /></h1>
|
|
508
412
|
</template>
|
|
509
413
|
```
|
|
510
414
|
|
|
511
|
-
|
|
415
|
+
> Nota: `useHead` se importa automáticamente en Nuxt. Puedes acceder a los valores del contenido usando `.value` (reactivo) o `.raw` (cadena primitiva) según tus necesidades.
|
|
416
|
+
|
|
417
|
+
El módulo `nuxt-intlayer` hará automáticamente:
|
|
512
418
|
|
|
513
|
-
- Detectar
|
|
514
|
-
- Gestionar el cambio de idioma
|
|
419
|
+
- Detectar la configuración regional preferida del usuario
|
|
420
|
+
- Gestionar el cambio de idioma vía URL
|
|
515
421
|
- Establecer el atributo `<html lang="">` apropiado
|
|
516
|
-
-
|
|
422
|
+
- Manejar las cookies de idioma
|
|
517
423
|
- Redirigir a los usuarios a la URL localizada correspondiente
|
|
518
424
|
|
|
519
425
|
### (Opcional) Paso 8: Crear un Componente de Enlace Localizado
|
|
520
426
|
|
|
521
|
-
Para asegurar que la navegación de tu aplicación respete
|
|
522
|
-
|
|
523
|
-
```vue fileName="components/LocalizedLink.vue"
|
|
524
|
-
<template>
|
|
525
|
-
<NuxtLink :to="localizedHref" v-bind="$attrs">
|
|
526
|
-
<slot />
|
|
527
|
-
</NuxtLink>
|
|
528
|
-
</template>
|
|
427
|
+
Para asegurar que la navegación de tu aplicación respete la configuración regional actual, puedes crear un componente personalizado `Links`. Este componente antepone automáticamente a las URLs internas el idioma actual, lo cual es esencial para el **SEO y la descubribilidad de las páginas**.
|
|
529
428
|
|
|
429
|
+
```vue fileName="components/Links.vue"
|
|
530
430
|
<script setup lang="ts">
|
|
531
|
-
import { computed } from "vue";
|
|
532
431
|
import { getLocalizedUrl } from "intlayer";
|
|
533
432
|
import { useLocale } from "vue-intlayer";
|
|
534
433
|
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
434
|
+
interface Props {
|
|
435
|
+
href: string;
|
|
436
|
+
locale?: string;
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
const props = defineProps<Props>();
|
|
440
|
+
|
|
441
|
+
const { locale: currentLocale } = useLocale();
|
|
541
442
|
|
|
542
|
-
|
|
443
|
+
// Calcular la ruta final
|
|
444
|
+
const finalPath = computed(() => {
|
|
445
|
+
// 1. Verificar si el enlace es externo
|
|
446
|
+
const isExternal = /^https?:\/\//.test(props.href || "");
|
|
543
447
|
|
|
544
|
-
//
|
|
545
|
-
|
|
448
|
+
// 2. Si es externo, devolver tal cual (NuxtLink maneja la generación de la etiqueta <a>)
|
|
449
|
+
if (isExternal) return props.href;
|
|
546
450
|
|
|
547
|
-
//
|
|
548
|
-
const
|
|
549
|
-
|
|
550
|
-
);
|
|
451
|
+
// 3. Si es interno, localiza la URL
|
|
452
|
+
const targetLocale = props.locale || currentLocale.value;
|
|
453
|
+
return getLocalizedUrl(props.href, targetLocale);
|
|
454
|
+
});
|
|
551
455
|
</script>
|
|
456
|
+
|
|
457
|
+
<template>
|
|
458
|
+
<NuxtLink :to="finalPath" v-bind="$attrs">
|
|
459
|
+
<slot />
|
|
460
|
+
</NuxtLink>
|
|
461
|
+
</template>
|
|
552
462
|
```
|
|
553
463
|
|
|
554
464
|
Luego usa este componente en toda tu aplicación:
|
|
555
465
|
|
|
556
|
-
```vue fileName="
|
|
466
|
+
```vue fileName="layouts/default.vue"
|
|
467
|
+
<script setup lang="ts">
|
|
468
|
+
import Links from "~/components/Links.vue";
|
|
469
|
+
import LocaleSwitcher from "~/components/LocaleSwitcher.vue";
|
|
470
|
+
</script>
|
|
471
|
+
|
|
557
472
|
<template>
|
|
558
473
|
<div>
|
|
559
|
-
<
|
|
560
|
-
|
|
561
|
-
</
|
|
562
|
-
<
|
|
563
|
-
|
|
564
|
-
</
|
|
474
|
+
<header>
|
|
475
|
+
<LocaleSwitcher />
|
|
476
|
+
</header>
|
|
477
|
+
<main>
|
|
478
|
+
<slot />
|
|
479
|
+
</main>
|
|
480
|
+
|
|
481
|
+
<Links href="/">Inicio</Links>
|
|
482
|
+
<Links href="/about">Acerca de</Links>
|
|
565
483
|
</div>
|
|
566
484
|
</template>
|
|
567
|
-
|
|
568
|
-
<script setup lang="ts">
|
|
569
|
-
import { useIntlayer } from "vue-intlayer";
|
|
570
|
-
import LocalizedLink from "~/components/LocalizedLink.vue";
|
|
571
|
-
|
|
572
|
-
const content = useIntlayer("home");
|
|
573
|
-
</script>
|
|
574
485
|
```
|
|
575
486
|
|
|
487
|
+
> Al usar `NuxtLink` con rutas localizadas, aseguras que:
|
|
488
|
+
>
|
|
489
|
+
> - Los motores de búsqueda puedan rastrear e indexar todas las versiones de idioma de tus páginas
|
|
490
|
+
> - Los usuarios puedan compartir URLs localizadas directamente
|
|
491
|
+
> - El historial del navegador funcione correctamente con URLs que tienen prefijos de locale
|
|
492
|
+
|
|
576
493
|
### (Opcional) Paso 9: Manejar Metadatos y SEO
|
|
577
494
|
|
|
578
|
-
Nuxt
|
|
495
|
+
Nuxt proporciona excelentes capacidades SEO a través del composable `useHead` (auto-importado). Puedes usar Intlayer para manejar metadatos localizados usando el accesor `.raw` o `.value` para obtener el valor primitivo de cadena:
|
|
579
496
|
|
|
580
497
|
```vue fileName="pages/about.vue"
|
|
581
498
|
<script setup lang="ts">
|
|
582
|
-
import {
|
|
583
|
-
import { getIntlayer } from "intlayer";
|
|
584
|
-
import { useLocale } from "vue-intlayer";
|
|
499
|
+
import { useIntlayer } from "vue-intlayer";
|
|
585
500
|
|
|
586
|
-
|
|
587
|
-
const content =
|
|
501
|
+
// useHead se auto-importa en Nuxt
|
|
502
|
+
const content = useIntlayer("about-page");
|
|
588
503
|
|
|
589
|
-
|
|
590
|
-
title: content.
|
|
591
|
-
|
|
504
|
+
useHead({
|
|
505
|
+
title: content.metaTitle.raw, // Usa .raw para acceso a cadena primitiva
|
|
506
|
+
meta: [
|
|
507
|
+
{
|
|
508
|
+
name: "description",
|
|
509
|
+
content: content.metaDescription.raw, // Usar .raw para acceder al valor primitivo de cadena
|
|
510
|
+
},
|
|
511
|
+
],
|
|
592
512
|
});
|
|
593
513
|
</script>
|
|
594
514
|
|
|
595
515
|
<template>
|
|
596
|
-
<
|
|
597
|
-
<h1>{{ content.pageTitle }}</h1>
|
|
598
|
-
<p>{{ content.pageContent }}</p>
|
|
599
|
-
</div>
|
|
516
|
+
<h1><content.title /></h1>
|
|
600
517
|
</template>
|
|
601
518
|
```
|
|
602
519
|
|
|
520
|
+
> Alternativamente, puedes usar la función `import { getIntlayer } from "intlayer"` para obtener el contenido sin reactividad de Vue.
|
|
521
|
+
|
|
522
|
+
> **Accediendo a los valores del contenido:**
|
|
523
|
+
>
|
|
524
|
+
> - Usa `.raw` para obtener el valor primitivo de cadena (no reactivo)
|
|
525
|
+
> - Usa `.value` para obtener el valor reactivo
|
|
526
|
+
> - Usa la sintaxis de componente `<content.key />` para soporte del Editor Visual
|
|
527
|
+
|
|
603
528
|
Crea la declaración de contenido correspondiente:
|
|
604
529
|
|
|
605
|
-
```ts fileName="pages/about-
|
|
530
|
+
```ts fileName="pages/about-page.content.ts" contentDeclarationFormat="typescript"
|
|
606
531
|
import { t, type Dictionary } from "intlayer";
|
|
607
|
-
import type { useSeoMeta } from "nuxt/app";
|
|
608
532
|
|
|
609
|
-
const
|
|
610
|
-
key: "about-
|
|
533
|
+
const aboutPageContent = {
|
|
534
|
+
key: "about-page",
|
|
611
535
|
content: {
|
|
612
|
-
|
|
536
|
+
metaTitle: t({
|
|
613
537
|
en: "About Us - My Company",
|
|
614
538
|
fr: "À Propos - Ma Société",
|
|
615
539
|
es: "Acerca de Nosotros - Mi Empresa",
|
|
616
540
|
}),
|
|
617
|
-
|
|
541
|
+
metaDescription: t({
|
|
618
542
|
en: "Learn more about our company and our mission",
|
|
619
543
|
fr: "En savoir plus sur notre société et notre mission",
|
|
620
544
|
es: "Conozca más sobre nuestra empresa y nuestra misión",
|
|
621
545
|
}),
|
|
546
|
+
title: t({
|
|
547
|
+
en: "About Us",
|
|
548
|
+
fr: "À Propos",
|
|
549
|
+
es: "Acerca de Nosotros",
|
|
550
|
+
}),
|
|
622
551
|
},
|
|
623
|
-
} satisfies Dictionary
|
|
552
|
+
} satisfies Dictionary;
|
|
624
553
|
|
|
625
|
-
export default
|
|
554
|
+
export default aboutPageContent;
|
|
626
555
|
```
|
|
627
556
|
|
|
628
|
-
```
|
|
557
|
+
```javascript fileName="pages/about-page.content.mjs" contentDeclarationFormat="esm"
|
|
629
558
|
import { t } from "intlayer";
|
|
630
559
|
|
|
631
560
|
/** @type {import('intlayer').Dictionary} */
|
|
632
|
-
const
|
|
633
|
-
key: "about-
|
|
561
|
+
const aboutPageContent = {
|
|
562
|
+
key: "about-page",
|
|
634
563
|
content: {
|
|
635
|
-
|
|
636
|
-
zh: "关于我们 - 我的公司",
|
|
564
|
+
metaTitle: t({
|
|
637
565
|
en: "About Us - My Company",
|
|
638
566
|
fr: "À Propos - Ma Société",
|
|
639
567
|
es: "Acerca de Nosotros - Mi Empresa",
|
|
640
568
|
}),
|
|
641
|
-
|
|
642
|
-
zh: "了解更多关于我们公司和我们的使命",
|
|
569
|
+
metaDescription: t({
|
|
643
570
|
en: "Learn more about our company and our mission",
|
|
644
571
|
fr: "En savoir plus sur notre société et notre mission",
|
|
645
572
|
es: "Conozca más sobre nuestra empresa y nuestra misión",
|
|
646
573
|
}),
|
|
574
|
+
title: t({
|
|
575
|
+
en: "About Us",
|
|
576
|
+
fr: "À Propos",
|
|
577
|
+
es: "Acerca de Nosotros",
|
|
578
|
+
}),
|
|
647
579
|
},
|
|
648
580
|
};
|
|
649
581
|
|
|
650
|
-
export default
|
|
582
|
+
export default aboutPageContent;
|
|
651
583
|
```
|
|
652
584
|
|
|
653
|
-
```
|
|
585
|
+
```javascript fileName="pages/about-page.content.cjs" contentDeclarationFormat="commonjs"
|
|
654
586
|
const { t } = require("intlayer");
|
|
655
587
|
|
|
656
588
|
/** @type {import('intlayer').Dictionary} */
|
|
657
|
-
const
|
|
658
|
-
key: "about-
|
|
589
|
+
const aboutPageContent = {
|
|
590
|
+
key: "about-page",
|
|
659
591
|
content: {
|
|
660
|
-
|
|
661
|
-
zh: "关于我们 - 我的公司",
|
|
592
|
+
metaTitle: t({
|
|
662
593
|
en: "About Us - My Company",
|
|
663
594
|
fr: "À Propos - Ma Société",
|
|
664
595
|
es: "Acerca de Nosotros - Mi Empresa",
|
|
665
596
|
}),
|
|
666
|
-
|
|
667
|
-
zh: "了解更多关于我们公司和我们的使命",
|
|
597
|
+
metaDescription: t({
|
|
668
598
|
en: "Learn more about our company and our mission",
|
|
669
599
|
fr: "En savoir plus sur notre société et notre mission",
|
|
670
600
|
es: "Conozca más sobre nuestra empresa y nuestra misión",
|
|
671
601
|
}),
|
|
602
|
+
title: t({
|
|
603
|
+
en: "About Us",
|
|
604
|
+
fr: "À Propos",
|
|
605
|
+
es: "Acerca de Nosotros",
|
|
606
|
+
}),
|
|
672
607
|
},
|
|
673
608
|
};
|
|
674
609
|
|
|
675
|
-
module.exports =
|
|
610
|
+
module.exports = aboutPageContent;
|
|
676
611
|
```
|
|
677
612
|
|
|
678
|
-
```json fileName="pages/about-
|
|
613
|
+
```json fileName="pages/about-page.content.json" contentDeclarationFormat="json"
|
|
679
614
|
{
|
|
680
|
-
"
|
|
615
|
+
"$schema": "https://intlayer.org/schema.json",
|
|
616
|
+
"key": "about-page",
|
|
681
617
|
"content": {
|
|
682
|
-
"
|
|
618
|
+
"metaTitle": {
|
|
683
619
|
"nodeType": "translation",
|
|
684
|
-
"
|
|
685
|
-
"zh": "关于我们 - 我的公司",
|
|
620
|
+
"translation": {
|
|
686
621
|
"en": "About Us - My Company",
|
|
687
622
|
"fr": "À Propos - Ma Société",
|
|
688
623
|
"es": "Acerca de Nosotros - Mi Empresa"
|
|
689
624
|
}
|
|
690
625
|
},
|
|
691
|
-
"
|
|
626
|
+
"metaDescription": {
|
|
692
627
|
"nodeType": "translation",
|
|
693
|
-
"
|
|
694
|
-
"zh": "了解更多关于我们公司和我们的使命",
|
|
628
|
+
"translation": {
|
|
695
629
|
"en": "Learn more about our company and our mission",
|
|
696
630
|
"fr": "En savoir plus sur notre société et notre mission",
|
|
697
631
|
"es": "Conozca más sobre nuestra empresa y nuestra misión"
|
|
698
632
|
}
|
|
699
|
-
}
|
|
700
|
-
}
|
|
701
|
-
}
|
|
702
|
-
fr: "À Propos - Ma Société",
|
|
703
|
-
es: "Acerca de Nosotros - Mi Empresa",
|
|
704
|
-
}),
|
|
705
|
-
description: t({
|
|
706
|
-
zh: "了解更多关于我们公司和我们的使命",
|
|
707
|
-
en: "Learn more about our company and our mission",
|
|
708
|
-
fr: "En savoir plus sur notre société et notre mission",
|
|
709
|
-
es: "Conozca más sobre nuestra empresa y nuestra misión",
|
|
710
|
-
}),
|
|
711
|
-
},
|
|
712
|
-
};
|
|
713
|
-
|
|
714
|
-
module.exports = aboutMetaContent;
|
|
715
|
-
```
|
|
716
|
-
|
|
717
|
-
```json fileName="pages/about-meta.content.json" contentDeclarationFormat="json"
|
|
718
|
-
{
|
|
719
|
-
"key": "about-meta",
|
|
720
|
-
"content": {
|
|
721
|
-
"title": {
|
|
722
|
-
"nodeType": "translation",
|
|
723
|
-
"translations": {
|
|
724
|
-
"zh": "关于我们 - 我的公司",
|
|
725
|
-
"en": "About Us - My Company",
|
|
726
|
-
"fr": "À Propos - Ma Société",
|
|
727
|
-
"es": "Acerca de Nosotros - Mi Empresa"
|
|
728
|
-
}
|
|
729
633
|
},
|
|
730
|
-
"
|
|
634
|
+
"title": {
|
|
731
635
|
"nodeType": "translation",
|
|
732
|
-
"
|
|
733
|
-
"
|
|
734
|
-
"
|
|
735
|
-
"
|
|
736
|
-
"es": "Conozca más sobre nuestra empresa y nuestra misión"
|
|
636
|
+
"translation": {
|
|
637
|
+
"en": "About Us",
|
|
638
|
+
"fr": "À Propos",
|
|
639
|
+
"es": "Acerca de Nosotros"
|
|
737
640
|
}
|
|
738
641
|
}
|
|
739
642
|
}
|
|
740
643
|
}
|
|
741
644
|
```
|
|
742
645
|
|
|
743
|
-
### Configurar TypeScript
|
|
744
|
-
|
|
745
|
-
Intlayer utiliza la ampliación de módulos para aprovechar las ventajas de TypeScript y fortalecer su base de código.
|
|
746
|
-
|
|
747
|
-

|
|
748
|
-
|
|
749
|
-

|
|
750
|
-
|
|
751
|
-
Asegúrese de que su configuración de TypeScript incluya los tipos autogenerados.
|
|
752
|
-
|
|
753
|
-
```json5 fileName="tsconfig.json"
|
|
754
|
-
{
|
|
755
|
-
// ... Sus configuraciones existentes de TypeScript
|
|
756
|
-
"include": [
|
|
757
|
-
// ... Tus configuraciones existentes de TypeScript
|
|
758
|
-
".intlayer/**/*.ts", // Incluir los tipos generados automáticamente
|
|
759
|
-
],
|
|
760
|
-
}
|
|
761
|
-
```
|
|
762
|
-
|
|
763
646
|
### Configuración de Git
|
|
764
647
|
|
|
765
648
|
Se recomienda ignorar los archivos generados por Intlayer. Esto te permite evitar comprometerlos en tu repositorio Git.
|
|
@@ -771,25 +654,23 @@ Para hacerlo, puedes agregar las siguientes instrucciones a tu archivo `.gitigno
|
|
|
771
654
|
.intlayer
|
|
772
655
|
```
|
|
773
656
|
|
|
774
|
-
### Extensión
|
|
657
|
+
### Extensión para VS Code
|
|
775
658
|
|
|
776
659
|
Para mejorar tu experiencia de desarrollo con Intlayer, puedes instalar la **Extensión oficial de Intlayer para VS Code**.
|
|
777
660
|
|
|
778
661
|
[Instalar desde el Marketplace de VS Code](https://marketplace.visualstudio.com/items?itemName=intlayer.intlayer-vs-code-extension)
|
|
779
662
|
|
|
780
|
-
Esta extensión
|
|
663
|
+
Esta extensión ofrece:
|
|
781
664
|
|
|
782
665
|
- **Autocompletado** para las claves de traducción.
|
|
783
666
|
- **Detección de errores en tiempo real** para traducciones faltantes.
|
|
784
|
-
- **
|
|
667
|
+
- **Previsualizaciones en línea** del contenido traducido.
|
|
785
668
|
- **Acciones rápidas** para crear y actualizar traducciones fácilmente.
|
|
786
669
|
|
|
787
|
-
Para más detalles sobre cómo usar la extensión,
|
|
670
|
+
Para más detalles sobre cómo usar la extensión, consulta la [documentación de la Extensión de Intlayer para VS Code](https://intlayer.org/doc/vs-code-extension).
|
|
788
671
|
|
|
789
672
|
---
|
|
790
673
|
|
|
791
674
|
### Ir más allá
|
|
792
675
|
|
|
793
|
-
Para ir más allá,
|
|
794
|
-
|
|
795
|
-
---
|
|
676
|
+
Para ir más allá, puedes implementar el [editor visual](https://github.com/aymericzip/intlayer/blob/main/docs/docs/es/intlayer_visual_editor.md) o externalizar tu contenido usando el [CMS](https://github.com/aymericzip/intlayer/blob/main/docs/docs/es/intlayer_CMS.md).
|