@intlayer/docs 7.3.11 → 7.3.12
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 +305 -421
- 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 +296 -394
- 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 +242 -321
- 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 +262 -358
- 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 +284 -375
- 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 +288 -387
- 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 +318 -434
- 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 +275 -376
- 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 +312 -408
- 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 +319 -414
- 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 +307 -406
- 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 +282 -457
- 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 +288 -403
- 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 +300 -410
- 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 +327 -392
- 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 +282 -399
- 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 +311 -444
- 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 +6 -6
- 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,68 @@ 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=IE3XWkZ6a5U
|
|
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
|
+
<iframe
|
|
50
|
+
src="https://stackblitz.com/github/aymericzip/intlayer-nuxt-4-template?embed=1&ctl=1&file=intlayer.config.ts"
|
|
51
|
+
className="m-auto overflow-hidden rounded-lg border-0 max-md:size-full max-md:h-[700px] md:aspect-16/9 md:w-full"
|
|
52
|
+
title="Demo CodeSandbox - Cómo internacionalizar tu aplicación usando Intlayer"
|
|
53
|
+
sandbox="allow-forms allow-modals allow-popups allow-presentation allow-same-origin allow-scripts"
|
|
54
|
+
loading="lazy"
|
|
55
|
+
/>
|
|
56
|
+
|
|
57
|
+
### Paso 1: Instalar Dependencias
|
|
58
|
+
|
|
59
|
+
<Tab defaultTab="video">
|
|
60
|
+
<TabItem label="Video" value="video">
|
|
61
|
+
|
|
62
|
+
<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/IE3XWkZ6a5U?autoplay=0&origin=http://intlayer.org&controls=0&rel=1"/>
|
|
63
|
+
|
|
64
|
+
</TabItem>
|
|
65
|
+
<TabItem label="Código" value="code">
|
|
66
|
+
|
|
67
|
+
<iframe
|
|
68
|
+
src="https://stackblitz.com/github/aymericzip/intlayer-nuxt-4-template?embed=1&ctl=1&file=intlayer.config.ts"
|
|
69
|
+
className="m-auto overflow-hidden rounded-lg border-0 max-md:size-full max-md:h-[700px] md:aspect-16/9 md:w-full"
|
|
70
|
+
title="Demo CodeSandbox - Cómo internacionalizar tu aplicación usando Intlayer"
|
|
71
|
+
sandbox="allow-forms allow-modals allow-popups allow-presentation allow-same-origin allow-scripts"
|
|
72
|
+
loading="lazy"
|
|
73
|
+
/>
|
|
74
|
+
|
|
75
|
+
</TabItem>
|
|
76
|
+
</Tab>
|
|
77
|
+
|
|
78
|
+
Consulta la [Plantilla de Aplicación](https://github.com/aymericzip/intlayer-nuxt-4-template) en GitHub.
|
|
44
79
|
|
|
45
80
|
Instala los paquetes necesarios usando npm:
|
|
46
81
|
|
|
@@ -61,13 +96,13 @@ yarn add --save-dev nuxt-intlayer
|
|
|
61
96
|
|
|
62
97
|
- **intlayer**
|
|
63
98
|
|
|
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/
|
|
99
|
+
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
100
|
|
|
66
101
|
- **vue-intlayer**
|
|
67
102
|
El paquete que integra Intlayer con aplicaciones Vue. Proporciona los composables para los componentes Vue.
|
|
68
103
|
|
|
69
104
|
- **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
|
|
105
|
+
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
106
|
|
|
72
107
|
### Paso 2: Configuración de tu proyecto
|
|
73
108
|
|
|
@@ -86,9 +121,6 @@ const config: IntlayerConfig = {
|
|
|
86
121
|
],
|
|
87
122
|
defaultLocale: Locales.ENGLISH,
|
|
88
123
|
},
|
|
89
|
-
content: {
|
|
90
|
-
contentDir: ["."], // Porque por defecto Intlayer observará los archivos de declaración de contenido desde el directorio `./src`
|
|
91
|
-
},
|
|
92
124
|
};
|
|
93
125
|
|
|
94
126
|
export default config;
|
|
@@ -98,7 +130,6 @@ export default config;
|
|
|
98
130
|
import { Locales } from "intlayer";
|
|
99
131
|
|
|
100
132
|
/** @type {import('intlayer').IntlayerConfig} */
|
|
101
|
-
// Configuración del archivo para Intlayer
|
|
102
133
|
const config = {
|
|
103
134
|
internationalization: {
|
|
104
135
|
locales: [
|
|
@@ -109,9 +140,6 @@ const config = {
|
|
|
109
140
|
],
|
|
110
141
|
defaultLocale: Locales.ENGLISH,
|
|
111
142
|
},
|
|
112
|
-
content: {
|
|
113
|
-
contentDir: ["."], // Directorio donde se encuentran las declaraciones de contenido
|
|
114
|
-
},
|
|
115
143
|
};
|
|
116
144
|
|
|
117
145
|
export default config;
|
|
@@ -121,7 +149,6 @@ export default config;
|
|
|
121
149
|
const { Locales } = require("intlayer");
|
|
122
150
|
|
|
123
151
|
/** @type {import('intlayer').IntlayerConfig} */
|
|
124
|
-
// Configuración del archivo para Intlayer
|
|
125
152
|
const config = {
|
|
126
153
|
internationalization: {
|
|
127
154
|
locales: [
|
|
@@ -132,17 +159,14 @@ const config = {
|
|
|
132
159
|
],
|
|
133
160
|
defaultLocale: Locales.ENGLISH,
|
|
134
161
|
},
|
|
135
|
-
content: {
|
|
136
|
-
contentDir: ["."],
|
|
137
|
-
},
|
|
138
162
|
};
|
|
139
163
|
|
|
140
164
|
module.exports = config;
|
|
141
165
|
```
|
|
142
166
|
|
|
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,
|
|
167
|
+
> 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
168
|
|
|
145
|
-
### Paso 3: Integra Intlayer en tu
|
|
169
|
+
### Paso 3: Integra Intlayer en tu Configuración de Nuxt
|
|
146
170
|
|
|
147
171
|
Agrega el módulo intlayer a tu configuración de Nuxt:
|
|
148
172
|
|
|
@@ -155,186 +179,46 @@ export default defineNuxtConfig({
|
|
|
155
179
|
});
|
|
156
180
|
```
|
|
157
181
|
|
|
158
|
-
> El módulo `nuxt-intlayer` maneja automáticamente la integración de Intlayer con Nuxt. Configura la construcción de
|
|
182
|
+
> 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
183
|
|
|
160
|
-
### Paso 4: Declara
|
|
184
|
+
### Paso 4: Declara tu Contenido
|
|
161
185
|
|
|
162
|
-
Crea y
|
|
186
|
+
Crea y gestiona tus declaraciones de contenido para almacenar traducciones:
|
|
163
187
|
|
|
164
|
-
```tsx fileName="
|
|
165
|
-
import {
|
|
188
|
+
```tsx fileName="content/home-page.content.ts" contentDeclarationFormat="typescript"
|
|
189
|
+
import { type Dictionary, t } from "intlayer";
|
|
166
190
|
|
|
167
|
-
const
|
|
168
|
-
key: "
|
|
191
|
+
const content = {
|
|
192
|
+
key: "home-page",
|
|
169
193
|
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 ",
|
|
194
|
+
title: t({
|
|
195
|
+
en: "Hello world",
|
|
196
|
+
fr: "Bonjour le monde",
|
|
197
|
+
es: "Hola mundo",
|
|
186
198
|
}),
|
|
187
|
-
|
|
188
|
-
en: "
|
|
189
|
-
fr: "
|
|
190
|
-
es: "
|
|
199
|
+
metaTitle: t({
|
|
200
|
+
en: "Welcome | My Application",
|
|
201
|
+
fr: "Bienvenue | Mon Application",
|
|
202
|
+
es: "Bienvenido | Mi Aplicación",
|
|
191
203
|
}),
|
|
192
|
-
|
|
193
|
-
en: "
|
|
194
|
-
fr: "
|
|
195
|
-
es: "
|
|
204
|
+
metaDescription: t({
|
|
205
|
+
en: "Discover your multilingual Nuxt app homepage powered by Intlayer.",
|
|
206
|
+
fr: "Découvrez la page d'accueil multilingue de votre application Nuxt propulsée par Intlayer.",
|
|
207
|
+
es: "Descubre la página de inicio multilingüe de tu aplicación Nuxt impulsada por Intlayer.",
|
|
196
208
|
}),
|
|
197
209
|
},
|
|
198
210
|
} satisfies Dictionary;
|
|
199
211
|
|
|
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;
|
|
208
|
-
```
|
|
209
|
-
|
|
210
|
-
```javascript fileName="components/helloWorld.content.mjs" contentDeclarationFormat="esm"
|
|
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
|
-
```
|
|
249
|
-
|
|
250
|
-
```javascript fileName="components/helloWorld.content.cjs" contentDeclarationFormat="commonjs"
|
|
251
|
-
const { t } = require("intlayer");
|
|
252
|
-
|
|
253
|
-
/** @type {import('intlayer').Dictionary} */
|
|
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
|
-
};
|
|
288
|
-
|
|
289
|
-
module.exports = helloWorldContent;
|
|
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
|
-
}
|
|
212
|
+
export default content;
|
|
329
213
|
```
|
|
330
214
|
|
|
331
|
-
>
|
|
215
|
+
> 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}`).
|
|
332
216
|
|
|
333
|
-
> Para más detalles,
|
|
217
|
+
> 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).
|
|
334
218
|
|
|
335
|
-
### Paso 5:
|
|
219
|
+
### Paso 5: Utiliza Intlayer en tu Código
|
|
336
220
|
|
|
337
|
-
|
|
221
|
+
Accede a tus diccionarios de contenido en toda tu aplicación Nuxt usando el composable `useIntlayer`:
|
|
338
222
|
|
|
339
223
|
```vue fileName="components/HelloWorld.vue"
|
|
340
224
|
<script setup lang="ts">
|
|
@@ -388,7 +272,7 @@ const countRef = ref(0);
|
|
|
388
272
|
Intlayer ofrece diferentes APIs para acceder a tu contenido:
|
|
389
273
|
|
|
390
274
|
- **Sintaxis basada en componentes** (recomendada):
|
|
391
|
-
Usa la sintaxis `<myContent
|
|
275
|
+
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
276
|
|
|
393
277
|
- **Sintaxis basada en cadenas**:
|
|
394
278
|
Usa `{{ myContent }}` para renderizar el contenido como texto plano, sin soporte para el Editor Visual.
|
|
@@ -398,71 +282,61 @@ Intlayer ofrece diferentes APIs para acceder a tu contenido:
|
|
|
398
282
|
|
|
399
283
|
- **Sintaxis de desestructuración**:
|
|
400
284
|
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.
|
|
285
|
+
- Usa `const content = useIntlayer("myContent");` y `{{ content.myContent }}` / `<content.myContent />`.
|
|
286
|
+
- O usa `const { myContent } = useIntlayer("myContent");` y `{{ myContent}}` / `<myContent/>` para desestructurar el contenido.
|
|
403
287
|
|
|
404
288
|
### (Opcional) Paso 6: Cambiar el idioma de tu contenido
|
|
405
289
|
|
|
406
290
|
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
291
|
|
|
408
|
-
Crea un componente para cambiar entre idiomas:
|
|
292
|
+
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
293
|
|
|
410
294
|
```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
295
|
<script setup lang="ts">
|
|
422
|
-
import {
|
|
423
|
-
import { getLocaleName } from "intlayer";
|
|
296
|
+
import { getLocaleName, getLocalizedUrl } from "intlayer";
|
|
424
297
|
import { useLocale } from "vue-intlayer";
|
|
425
298
|
|
|
426
|
-
//
|
|
299
|
+
// Nuxt importa automáticamente useRoute
|
|
300
|
+
const route = useRoute();
|
|
427
301
|
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
302
|
</script>
|
|
303
|
+
|
|
304
|
+
<template>
|
|
305
|
+
<nav class="locale-switcher">
|
|
306
|
+
<NuxtLink
|
|
307
|
+
v-for="localeEl in availableLocales"
|
|
308
|
+
:key="localeEl"
|
|
309
|
+
:to="getLocalizedUrl(route.fullPath, localeEl)"
|
|
310
|
+
class="locale-link"
|
|
311
|
+
:class="{ 'active-locale': localeEl === locale }"
|
|
312
|
+
@click="setLocale(localeEl)"
|
|
313
|
+
>
|
|
314
|
+
{{ getLocaleName(localeEl) }}
|
|
315
|
+
</NuxtLink>
|
|
316
|
+
</nav>
|
|
443
317
|
</template>
|
|
318
|
+
```
|
|
444
319
|
|
|
445
|
-
|
|
446
|
-
.locale-switcher {
|
|
447
|
-
margin: 1rem 0;
|
|
448
|
-
}
|
|
320
|
+
> 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
321
|
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
322
|
+
Luego, configura tu `app.vue` para usar layouts:
|
|
323
|
+
|
|
324
|
+
```vue fileName="app.vue"
|
|
325
|
+
<template>
|
|
326
|
+
<NuxtLayout>
|
|
327
|
+
<NuxtPage />
|
|
328
|
+
</NuxtLayout>
|
|
329
|
+
</template>
|
|
456
330
|
```
|
|
457
331
|
|
|
458
|
-
|
|
332
|
+
### (Opcional) Paso 6b: Crear un Layout con Navegación
|
|
459
333
|
|
|
460
|
-
|
|
334
|
+
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:
|
|
335
|
+
|
|
336
|
+
```vue fileName="layouts/default.vue"
|
|
461
337
|
<script setup lang="ts">
|
|
462
|
-
import
|
|
338
|
+
import Links from "~/components/Links.vue";
|
|
463
339
|
import LocaleSwitcher from "~/components/LocaleSwitcher.vue";
|
|
464
|
-
|
|
465
|
-
const content = useIntlayer("app"); // Crear archivo de declaración intlayer relacionado
|
|
466
340
|
</script>
|
|
467
341
|
|
|
468
342
|
<template>
|
|
@@ -471,15 +345,20 @@ const content = useIntlayer("app"); // Crear archivo de declaración intlayer re
|
|
|
471
345
|
<LocaleSwitcher />
|
|
472
346
|
</header>
|
|
473
347
|
<main>
|
|
474
|
-
<
|
|
348
|
+
<slot />
|
|
475
349
|
</main>
|
|
350
|
+
|
|
351
|
+
<Links href="/">Inicio</Links>
|
|
352
|
+
<Links href="/about">Acerca de</Links>
|
|
476
353
|
</div>
|
|
477
354
|
</template>
|
|
478
355
|
```
|
|
479
356
|
|
|
357
|
+
El componente `Links` (mostrado a continuación) asegura que los enlaces de navegación interna se localicen automáticamente.
|
|
358
|
+
|
|
480
359
|
### (Opcional) Paso 7: Añadir enrutamiento localizado a tu aplicación
|
|
481
360
|
|
|
482
|
-
Nuxt maneja automáticamente el enrutamiento localizado cuando se
|
|
361
|
+
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
362
|
|
|
484
363
|
Ejemplo:
|
|
485
364
|
|
|
@@ -491,249 +370,281 @@ pages/
|
|
|
491
370
|
└── index.vue → /contact, /fr/contact, /es/contact
|
|
492
371
|
```
|
|
493
372
|
|
|
494
|
-
Para crear
|
|
373
|
+
Para crear páginas localizadas, simplemente crea tus archivos Vue en el directorio `pages/`. Aquí tienes dos ejemplos de páginas:
|
|
374
|
+
|
|
375
|
+
**Página de inicio (`pages/index.vue`):**
|
|
376
|
+
|
|
377
|
+
```vue fileName="pages/index.vue"
|
|
378
|
+
<script setup lang="ts">
|
|
379
|
+
import { useIntlayer } from "vue-intlayer";
|
|
380
|
+
|
|
381
|
+
const content = useIntlayer("home-page");
|
|
382
|
+
|
|
383
|
+
useHead({
|
|
384
|
+
title: content.metaTitle.value,
|
|
385
|
+
meta: [
|
|
386
|
+
{
|
|
387
|
+
name: "description",
|
|
388
|
+
content: content.metaDescription.value,
|
|
389
|
+
},
|
|
390
|
+
],
|
|
391
|
+
});
|
|
392
|
+
</script>
|
|
393
|
+
|
|
394
|
+
<template>
|
|
395
|
+
<h1><content.title /></h1>
|
|
396
|
+
</template>
|
|
397
|
+
```
|
|
398
|
+
|
|
399
|
+
**Página Acerca de (`pages/about.vue`):**
|
|
495
400
|
|
|
496
401
|
```vue fileName="pages/about.vue"
|
|
497
402
|
<script setup lang="ts">
|
|
498
403
|
import { useIntlayer } from "vue-intlayer";
|
|
499
404
|
|
|
500
|
-
const content = useIntlayer("about");
|
|
405
|
+
const content = useIntlayer("about-page");
|
|
406
|
+
|
|
407
|
+
useHead({
|
|
408
|
+
title: content.metaTitle.raw, // Usa .raw para acceso a cadena primitiva
|
|
409
|
+
meta: [
|
|
410
|
+
{
|
|
411
|
+
name: "description",
|
|
412
|
+
content: content.metaDescription.raw, // Usa .raw para acceder a la cadena primitiva
|
|
413
|
+
},
|
|
414
|
+
],
|
|
415
|
+
});
|
|
501
416
|
</script>
|
|
502
417
|
|
|
503
418
|
<template>
|
|
504
|
-
<
|
|
505
|
-
<h1>{{ content.title }}</h1>
|
|
506
|
-
<p>{{ content.description }}</p>
|
|
507
|
-
</div>
|
|
419
|
+
<h1><content.title /></h1>
|
|
508
420
|
</template>
|
|
509
421
|
```
|
|
510
422
|
|
|
511
|
-
|
|
423
|
+
> 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.
|
|
424
|
+
|
|
425
|
+
El módulo `nuxt-intlayer` hará automáticamente:
|
|
512
426
|
|
|
513
|
-
- Detectar
|
|
514
|
-
- Gestionar el cambio de idioma
|
|
427
|
+
- Detectar la configuración regional preferida del usuario
|
|
428
|
+
- Gestionar el cambio de idioma vía URL
|
|
515
429
|
- Establecer el atributo `<html lang="">` apropiado
|
|
516
|
-
-
|
|
430
|
+
- Manejar las cookies de idioma
|
|
517
431
|
- Redirigir a los usuarios a la URL localizada correspondiente
|
|
518
432
|
|
|
519
433
|
### (Opcional) Paso 8: Crear un Componente de Enlace Localizado
|
|
520
434
|
|
|
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>
|
|
435
|
+
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
436
|
|
|
437
|
+
```vue fileName="components/Links.vue"
|
|
530
438
|
<script setup lang="ts">
|
|
531
|
-
import { computed } from "vue";
|
|
532
439
|
import { getLocalizedUrl } from "intlayer";
|
|
533
440
|
import { useLocale } from "vue-intlayer";
|
|
534
441
|
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
442
|
+
interface Props {
|
|
443
|
+
href: string;
|
|
444
|
+
locale?: string;
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
const props = defineProps<Props>();
|
|
541
448
|
|
|
542
|
-
const { locale } = useLocale();
|
|
449
|
+
const { locale: currentLocale } = useLocale();
|
|
543
450
|
|
|
544
|
-
//
|
|
545
|
-
const
|
|
451
|
+
// Calcular la ruta final
|
|
452
|
+
const finalPath = computed(() => {
|
|
453
|
+
// 1. Verificar si el enlace es externo
|
|
454
|
+
const isExternal = /^https?:\/\//.test(props.href || "");
|
|
546
455
|
|
|
547
|
-
//
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
456
|
+
// 2. Si es externo, devolver tal cual (NuxtLink maneja la generación de la etiqueta <a>)
|
|
457
|
+
if (isExternal) return props.href;
|
|
458
|
+
|
|
459
|
+
// 3. Si es interno, localiza la URL
|
|
460
|
+
const targetLocale = props.locale || currentLocale.value;
|
|
461
|
+
return getLocalizedUrl(props.href, targetLocale);
|
|
462
|
+
});
|
|
551
463
|
</script>
|
|
464
|
+
|
|
465
|
+
<template>
|
|
466
|
+
<NuxtLink :to="finalPath" v-bind="$attrs">
|
|
467
|
+
<slot />
|
|
468
|
+
</NuxtLink>
|
|
469
|
+
</template>
|
|
552
470
|
```
|
|
553
471
|
|
|
554
472
|
Luego usa este componente en toda tu aplicación:
|
|
555
473
|
|
|
556
|
-
```vue fileName="
|
|
474
|
+
```vue fileName="layouts/default.vue"
|
|
475
|
+
<script setup lang="ts">
|
|
476
|
+
import Links from "~/components/Links.vue";
|
|
477
|
+
import LocaleSwitcher from "~/components/LocaleSwitcher.vue";
|
|
478
|
+
</script>
|
|
479
|
+
|
|
557
480
|
<template>
|
|
558
481
|
<div>
|
|
559
|
-
<
|
|
560
|
-
|
|
561
|
-
</
|
|
562
|
-
<
|
|
563
|
-
|
|
564
|
-
</
|
|
482
|
+
<header>
|
|
483
|
+
<LocaleSwitcher />
|
|
484
|
+
</header>
|
|
485
|
+
<main>
|
|
486
|
+
<slot />
|
|
487
|
+
</main>
|
|
488
|
+
|
|
489
|
+
<Links href="/">Inicio</Links>
|
|
490
|
+
<Links href="/about">Acerca de</Links>
|
|
565
491
|
</div>
|
|
566
492
|
</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
493
|
```
|
|
575
494
|
|
|
495
|
+
> Al usar `NuxtLink` con rutas localizadas, aseguras que:
|
|
496
|
+
>
|
|
497
|
+
> - Los motores de búsqueda puedan rastrear e indexar todas las versiones de idioma de tus páginas
|
|
498
|
+
> - Los usuarios puedan compartir URLs localizadas directamente
|
|
499
|
+
> - El historial del navegador funcione correctamente con URLs que tienen prefijos de locale
|
|
500
|
+
|
|
576
501
|
### (Opcional) Paso 9: Manejar Metadatos y SEO
|
|
577
502
|
|
|
578
|
-
Nuxt
|
|
503
|
+
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
504
|
|
|
580
505
|
```vue fileName="pages/about.vue"
|
|
581
506
|
<script setup lang="ts">
|
|
582
|
-
import {
|
|
583
|
-
import { getIntlayer } from "intlayer";
|
|
584
|
-
import { useLocale } from "vue-intlayer";
|
|
507
|
+
import { useIntlayer } from "vue-intlayer";
|
|
585
508
|
|
|
586
|
-
|
|
587
|
-
const content =
|
|
509
|
+
// useHead se auto-importa en Nuxt
|
|
510
|
+
const content = useIntlayer("about-page");
|
|
588
511
|
|
|
589
|
-
|
|
590
|
-
title: content.
|
|
591
|
-
|
|
512
|
+
useHead({
|
|
513
|
+
title: content.metaTitle.raw, // Usa .raw para acceso a cadena primitiva
|
|
514
|
+
meta: [
|
|
515
|
+
{
|
|
516
|
+
name: "description",
|
|
517
|
+
content: content.metaDescription.raw, // Usar .raw para acceder al valor primitivo de cadena
|
|
518
|
+
},
|
|
519
|
+
],
|
|
592
520
|
});
|
|
593
521
|
</script>
|
|
594
522
|
|
|
595
523
|
<template>
|
|
596
|
-
<
|
|
597
|
-
<h1>{{ content.pageTitle }}</h1>
|
|
598
|
-
<p>{{ content.pageContent }}</p>
|
|
599
|
-
</div>
|
|
524
|
+
<h1><content.title /></h1>
|
|
600
525
|
</template>
|
|
601
526
|
```
|
|
602
527
|
|
|
528
|
+
> Alternativamente, puedes usar la función `import { getIntlayer } from "intlayer"` para obtener el contenido sin reactividad de Vue.
|
|
529
|
+
|
|
530
|
+
> **Accediendo a los valores del contenido:**
|
|
531
|
+
>
|
|
532
|
+
> - Usa `.raw` para obtener el valor primitivo de cadena (no reactivo)
|
|
533
|
+
> - Usa `.value` para obtener el valor reactivo
|
|
534
|
+
> - Usa la sintaxis de componente `<content.key />` para soporte del Editor Visual
|
|
535
|
+
|
|
603
536
|
Crea la declaración de contenido correspondiente:
|
|
604
537
|
|
|
605
|
-
```ts fileName="pages/about-
|
|
538
|
+
```ts fileName="pages/about-page.content.ts" contentDeclarationFormat="typescript"
|
|
606
539
|
import { t, type Dictionary } from "intlayer";
|
|
607
|
-
import type { useSeoMeta } from "nuxt/app";
|
|
608
540
|
|
|
609
|
-
const
|
|
610
|
-
key: "about-
|
|
541
|
+
const aboutPageContent = {
|
|
542
|
+
key: "about-page",
|
|
611
543
|
content: {
|
|
612
|
-
|
|
544
|
+
metaTitle: t({
|
|
613
545
|
en: "About Us - My Company",
|
|
614
546
|
fr: "À Propos - Ma Société",
|
|
615
547
|
es: "Acerca de Nosotros - Mi Empresa",
|
|
616
548
|
}),
|
|
617
|
-
|
|
549
|
+
metaDescription: t({
|
|
618
550
|
en: "Learn more about our company and our mission",
|
|
619
551
|
fr: "En savoir plus sur notre société et notre mission",
|
|
620
552
|
es: "Conozca más sobre nuestra empresa y nuestra misión",
|
|
621
553
|
}),
|
|
554
|
+
title: t({
|
|
555
|
+
en: "About Us",
|
|
556
|
+
fr: "À Propos",
|
|
557
|
+
es: "Acerca de Nosotros",
|
|
558
|
+
}),
|
|
622
559
|
},
|
|
623
|
-
} satisfies Dictionary
|
|
560
|
+
} satisfies Dictionary;
|
|
624
561
|
|
|
625
|
-
export default
|
|
562
|
+
export default aboutPageContent;
|
|
626
563
|
```
|
|
627
564
|
|
|
628
|
-
```
|
|
565
|
+
```javascript fileName="pages/about-page.content.mjs" contentDeclarationFormat="esm"
|
|
629
566
|
import { t } from "intlayer";
|
|
630
567
|
|
|
631
568
|
/** @type {import('intlayer').Dictionary} */
|
|
632
|
-
const
|
|
633
|
-
key: "about-
|
|
569
|
+
const aboutPageContent = {
|
|
570
|
+
key: "about-page",
|
|
634
571
|
content: {
|
|
635
|
-
|
|
636
|
-
zh: "关于我们 - 我的公司",
|
|
572
|
+
metaTitle: t({
|
|
637
573
|
en: "About Us - My Company",
|
|
638
574
|
fr: "À Propos - Ma Société",
|
|
639
575
|
es: "Acerca de Nosotros - Mi Empresa",
|
|
640
576
|
}),
|
|
641
|
-
|
|
642
|
-
zh: "了解更多关于我们公司和我们的使命",
|
|
577
|
+
metaDescription: t({
|
|
643
578
|
en: "Learn more about our company and our mission",
|
|
644
579
|
fr: "En savoir plus sur notre société et notre mission",
|
|
645
580
|
es: "Conozca más sobre nuestra empresa y nuestra misión",
|
|
646
581
|
}),
|
|
582
|
+
title: t({
|
|
583
|
+
en: "About Us",
|
|
584
|
+
fr: "À Propos",
|
|
585
|
+
es: "Acerca de Nosotros",
|
|
586
|
+
}),
|
|
647
587
|
},
|
|
648
588
|
};
|
|
649
589
|
|
|
650
|
-
export default
|
|
590
|
+
export default aboutPageContent;
|
|
651
591
|
```
|
|
652
592
|
|
|
653
|
-
```
|
|
593
|
+
```javascript fileName="pages/about-page.content.cjs" contentDeclarationFormat="commonjs"
|
|
654
594
|
const { t } = require("intlayer");
|
|
655
595
|
|
|
656
596
|
/** @type {import('intlayer').Dictionary} */
|
|
657
|
-
const
|
|
658
|
-
key: "about-
|
|
597
|
+
const aboutPageContent = {
|
|
598
|
+
key: "about-page",
|
|
659
599
|
content: {
|
|
660
|
-
|
|
661
|
-
zh: "关于我们 - 我的公司",
|
|
600
|
+
metaTitle: t({
|
|
662
601
|
en: "About Us - My Company",
|
|
663
602
|
fr: "À Propos - Ma Société",
|
|
664
603
|
es: "Acerca de Nosotros - Mi Empresa",
|
|
665
604
|
}),
|
|
666
|
-
|
|
667
|
-
zh: "了解更多关于我们公司和我们的使命",
|
|
605
|
+
metaDescription: t({
|
|
668
606
|
en: "Learn more about our company and our mission",
|
|
669
607
|
fr: "En savoir plus sur notre société et notre mission",
|
|
670
608
|
es: "Conozca más sobre nuestra empresa y nuestra misión",
|
|
671
609
|
}),
|
|
610
|
+
title: t({
|
|
611
|
+
en: "About Us",
|
|
612
|
+
fr: "À Propos",
|
|
613
|
+
es: "Acerca de Nosotros",
|
|
614
|
+
}),
|
|
672
615
|
},
|
|
673
616
|
};
|
|
674
617
|
|
|
675
|
-
module.exports =
|
|
618
|
+
module.exports = aboutPageContent;
|
|
676
619
|
```
|
|
677
620
|
|
|
678
|
-
```json fileName="pages/about-
|
|
621
|
+
```json fileName="pages/about-page.content.json" contentDeclarationFormat="json"
|
|
679
622
|
{
|
|
680
|
-
"
|
|
623
|
+
"$schema": "https://intlayer.org/schema.json",
|
|
624
|
+
"key": "about-page",
|
|
681
625
|
"content": {
|
|
682
|
-
"
|
|
626
|
+
"metaTitle": {
|
|
683
627
|
"nodeType": "translation",
|
|
684
|
-
"
|
|
685
|
-
"zh": "关于我们 - 我的公司",
|
|
628
|
+
"translation": {
|
|
686
629
|
"en": "About Us - My Company",
|
|
687
630
|
"fr": "À Propos - Ma Société",
|
|
688
631
|
"es": "Acerca de Nosotros - Mi Empresa"
|
|
689
632
|
}
|
|
690
633
|
},
|
|
691
|
-
"
|
|
634
|
+
"metaDescription": {
|
|
692
635
|
"nodeType": "translation",
|
|
693
|
-
"
|
|
694
|
-
"zh": "了解更多关于我们公司和我们的使命",
|
|
636
|
+
"translation": {
|
|
695
637
|
"en": "Learn more about our company and our mission",
|
|
696
638
|
"fr": "En savoir plus sur notre société et notre mission",
|
|
697
639
|
"es": "Conozca más sobre nuestra empresa y nuestra misión"
|
|
698
640
|
}
|
|
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
641
|
},
|
|
730
|
-
"
|
|
642
|
+
"title": {
|
|
731
643
|
"nodeType": "translation",
|
|
732
|
-
"
|
|
733
|
-
"
|
|
734
|
-
"
|
|
735
|
-
"
|
|
736
|
-
"es": "Conozca más sobre nuestra empresa y nuestra misión"
|
|
644
|
+
"translation": {
|
|
645
|
+
"en": "About Us",
|
|
646
|
+
"fr": "À Propos",
|
|
647
|
+
"es": "Acerca de Nosotros"
|
|
737
648
|
}
|
|
738
649
|
}
|
|
739
650
|
}
|
|
@@ -744,18 +655,18 @@ module.exports = aboutMetaContent;
|
|
|
744
655
|
|
|
745
656
|
Intlayer utiliza la ampliación de módulos para aprovechar las ventajas de TypeScript y fortalecer su base de código.
|
|
746
657
|
|
|
747
|
-

|
|
748
659
|
|
|
749
|
-

|
|
750
661
|
|
|
751
|
-
|
|
662
|
+
Asegúrate de que tu configuración de TypeScript incluya los tipos autogenerados.
|
|
752
663
|
|
|
753
664
|
```json5 fileName="tsconfig.json"
|
|
754
665
|
{
|
|
755
|
-
// ...
|
|
666
|
+
// ... Tus configuraciones existentes de TypeScript
|
|
756
667
|
"include": [
|
|
757
668
|
// ... Tus configuraciones existentes de TypeScript
|
|
758
|
-
".intlayer/**/*.ts", // Incluir los tipos
|
|
669
|
+
".intlayer/**/*.ts", // Incluir los tipos autogenerados
|
|
759
670
|
],
|
|
760
671
|
}
|
|
761
672
|
```
|
|
@@ -771,25 +682,23 @@ Para hacerlo, puedes agregar las siguientes instrucciones a tu archivo `.gitigno
|
|
|
771
682
|
.intlayer
|
|
772
683
|
```
|
|
773
684
|
|
|
774
|
-
### Extensión
|
|
685
|
+
### Extensión para VS Code
|
|
775
686
|
|
|
776
687
|
Para mejorar tu experiencia de desarrollo con Intlayer, puedes instalar la **Extensión oficial de Intlayer para VS Code**.
|
|
777
688
|
|
|
778
689
|
[Instalar desde el Marketplace de VS Code](https://marketplace.visualstudio.com/items?itemName=intlayer.intlayer-vs-code-extension)
|
|
779
690
|
|
|
780
|
-
Esta extensión
|
|
691
|
+
Esta extensión ofrece:
|
|
781
692
|
|
|
782
693
|
- **Autocompletado** para las claves de traducción.
|
|
783
694
|
- **Detección de errores en tiempo real** para traducciones faltantes.
|
|
784
|
-
- **
|
|
695
|
+
- **Previsualizaciones en línea** del contenido traducido.
|
|
785
696
|
- **Acciones rápidas** para crear y actualizar traducciones fácilmente.
|
|
786
697
|
|
|
787
|
-
Para más detalles sobre cómo usar la extensión,
|
|
698
|
+
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
699
|
|
|
789
700
|
---
|
|
790
701
|
|
|
791
702
|
### Ir más allá
|
|
792
703
|
|
|
793
|
-
Para ir más allá,
|
|
794
|
-
|
|
795
|
-
---
|
|
704
|
+
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).
|