@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: Comment traduire votre Nuxt
|
|
3
|
+
updatedAt: 2025-12-07
|
|
4
|
+
title: Comment traduire votre application Nuxt et Vue – guide i18n 2025
|
|
5
5
|
description: Découvrez comment rendre votre site Nuxt et Vue multilingue. Suivez la documentation pour internationaliser (i18n) et traduire votre site.
|
|
6
6
|
keywords:
|
|
7
7
|
- Internationalisation
|
|
@@ -14,16 +14,22 @@ 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: Mise à jour de LocaleSwitcher, SEO, métadonnées
|
|
19
23
|
- version: 5.5.10
|
|
20
24
|
date: 2025-06-29
|
|
21
25
|
changes: Historique initial
|
|
22
26
|
---
|
|
23
27
|
|
|
24
|
-
#
|
|
28
|
+
# Traduisez votre site Nuxt et Vue avec Intlayer | Internationalisation (i18n)
|
|
25
29
|
|
|
26
|
-
|
|
30
|
+
## Table des matières
|
|
31
|
+
|
|
32
|
+
<TOC/>
|
|
27
33
|
|
|
28
34
|
## Qu'est-ce qu'Intlayer ?
|
|
29
35
|
|
|
@@ -34,12 +40,33 @@ Avec Intlayer, vous pouvez :
|
|
|
34
40
|
- **Gérer facilement les traductions** en utilisant des dictionnaires déclaratifs au niveau des composants.
|
|
35
41
|
- **Localiser dynamiquement les métadonnées**, les routes et le contenu.
|
|
36
42
|
- **Assurer la prise en charge de TypeScript** avec des types générés automatiquement, améliorant l'autocomplétion et la détection d'erreurs.
|
|
37
|
-
- **Bénéficier de fonctionnalités avancées**, comme la détection et le changement dynamique de la
|
|
43
|
+
- **Bénéficier de fonctionnalités avancées**, comme la détection et le changement dynamique de la locale.
|
|
38
44
|
|
|
39
45
|
---
|
|
40
46
|
|
|
41
47
|
## Guide étape par étape pour configurer Intlayer dans une application Nuxt
|
|
42
48
|
|
|
49
|
+
<Tab defaultTab="video">
|
|
50
|
+
<TabItem label="Vidéo" value="video">
|
|
51
|
+
|
|
52
|
+
<iframe title="Comment traduire votre application Nuxt et Vue avec Intlayer ? Découvrez 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="Code" 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="Démo CodeSandbox - Comment internationaliser votre application avec 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
|
+
Voir le [Modèle d'application](https://github.com/aymericzip/intlayer-nuxt-4-template) sur GitHub.
|
|
69
|
+
|
|
43
70
|
### Étape 1 : Installer les dépendances
|
|
44
71
|
|
|
45
72
|
Installez les paquets nécessaires avec npm :
|
|
@@ -61,13 +88,13 @@ yarn add --save-dev nuxt-intlayer
|
|
|
61
88
|
|
|
62
89
|
- **intlayer**
|
|
63
90
|
|
|
64
|
-
Le
|
|
91
|
+
Le package principal qui fournit des outils d'internationalisation pour la gestion de la configuration, la traduction, la [déclaration de contenu](https://github.com/aymericzip/intlayer/blob/main/docs/docs/fr/dictionary/content_file.md), la transpilation, et les [commandes CLI](https://github.com/aymericzip/intlayer/blob/main/docs/docs/fr/cli/index.md).
|
|
65
92
|
|
|
66
93
|
- **vue-intlayer**
|
|
67
|
-
Le
|
|
94
|
+
Le package qui intègre Intlayer avec l'application Vue. Il fournit les composables pour les composants Vue.
|
|
68
95
|
|
|
69
96
|
- **nuxt-intlayer**
|
|
70
|
-
Le module Nuxt qui intègre Intlayer avec les applications Nuxt. Il fournit une configuration automatique, un middleware pour la détection de la
|
|
97
|
+
Le module Nuxt qui intègre Intlayer avec les applications Nuxt. Il fournit une configuration automatique, un middleware pour la détection de la locale, la gestion des cookies, et la redirection des URL.
|
|
71
98
|
|
|
72
99
|
### Étape 2 : Configuration de votre projet
|
|
73
100
|
|
|
@@ -82,13 +109,10 @@ const config: IntlayerConfig = {
|
|
|
82
109
|
Locales.ENGLISH,
|
|
83
110
|
Locales.FRENCH,
|
|
84
111
|
Locales.SPANISH,
|
|
85
|
-
// Vos autres
|
|
112
|
+
// Vos autres locales
|
|
86
113
|
],
|
|
87
114
|
defaultLocale: Locales.ENGLISH,
|
|
88
115
|
},
|
|
89
|
-
content: {
|
|
90
|
-
contentDir: ["."], // Parce que par défaut Intlayer surveillera les fichiers de déclaration de contenu depuis le répertoire `./src`
|
|
91
|
-
},
|
|
92
116
|
};
|
|
93
117
|
|
|
94
118
|
export default config;
|
|
@@ -98,20 +122,16 @@ export default config;
|
|
|
98
122
|
import { Locales } from "intlayer";
|
|
99
123
|
|
|
100
124
|
/** @type {import('intlayer').IntlayerConfig} */
|
|
101
|
-
// Configuration de l'internationalisation et du contenu
|
|
102
125
|
const config = {
|
|
103
126
|
internationalization: {
|
|
104
127
|
locales: [
|
|
105
128
|
Locales.ENGLISH,
|
|
106
129
|
Locales.FRENCH,
|
|
107
130
|
Locales.SPANISH,
|
|
108
|
-
// Vos autres
|
|
131
|
+
// Vos autres locales
|
|
109
132
|
],
|
|
110
133
|
defaultLocale: Locales.ENGLISH,
|
|
111
134
|
},
|
|
112
|
-
content: {
|
|
113
|
-
contentDir: ["."], // Répertoire de contenu à surveiller
|
|
114
|
-
},
|
|
115
135
|
};
|
|
116
136
|
|
|
117
137
|
export default config;
|
|
@@ -121,26 +141,22 @@ export default config;
|
|
|
121
141
|
const { Locales } = require("intlayer");
|
|
122
142
|
|
|
123
143
|
/** @type {import('intlayer').IntlayerConfig} */
|
|
124
|
-
// Configuration de l'internationalisation et du contenu
|
|
125
144
|
const config = {
|
|
126
145
|
internationalization: {
|
|
127
146
|
locales: [
|
|
128
147
|
Locales.ENGLISH,
|
|
129
148
|
Locales.FRENCH,
|
|
130
149
|
Locales.SPANISH,
|
|
131
|
-
// Vos autres
|
|
150
|
+
// Vos autres locales
|
|
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
|
-
> Grâce à ce fichier de configuration, vous pouvez configurer des URLs localisées, la redirection via middleware, les noms des cookies, l'emplacement et l'extension de vos déclarations de contenu, désactiver les logs
|
|
159
|
+
> Grâce à ce fichier de configuration, vous pouvez configurer des URLs localisées, la redirection via middleware, les noms des cookies, l'emplacement et l'extension de vos déclarations de contenu, désactiver les logs Intlayer dans la console, et bien plus encore. Pour une liste complète des paramètres disponibles, consultez la [documentation de configuration](https://github.com/aymericzip/intlayer/blob/main/docs/docs/fr/configuration.md).
|
|
144
160
|
|
|
145
161
|
### Étape 3 : Intégrer Intlayer dans votre configuration Nuxt
|
|
146
162
|
|
|
@@ -161,221 +177,36 @@ export default defineNuxtConfig({
|
|
|
161
177
|
|
|
162
178
|
Créez et gérez vos déclarations de contenu pour stocker les traductions :
|
|
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;
|
|
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
|
-
learnMore: t({
|
|
270
|
-
en: "Learn more about Nuxt in the ",
|
|
271
|
-
fr: "En savoir plus sur Nuxt dans la ",
|
|
272
|
-
es: "Aprenda más sobre Nuxt en la ",
|
|
273
|
-
}),
|
|
274
|
-
nuxtDocs: t({
|
|
275
|
-
en: "Nuxt Documentation",
|
|
276
|
-
fr: "Documentation Nuxt",
|
|
277
|
-
es: "Documentación de Nuxt",
|
|
278
|
-
}),
|
|
279
|
-
readTheDocs: t({
|
|
280
|
-
en: "Click on the Nuxt logo to learn more",
|
|
281
|
-
fr: "Cliquez sur le logo Nuxt pour en savoir plus",
|
|
282
|
-
es: "Haga clic en el logotipo de Nuxt para obtener más información",
|
|
283
|
-
}),
|
|
284
|
-
},
|
|
285
|
-
};
|
|
286
|
-
|
|
287
|
-
module.exports = helloWorldContent;
|
|
288
|
-
es: "Documentación de Nuxt Intlayer",
|
|
289
|
-
}),
|
|
290
|
-
learnMore: t({
|
|
291
|
-
en: "Learn more about Nuxt in the ",
|
|
292
|
-
fr: "En savoir plus sur Nuxt dans la ",
|
|
293
|
-
es: "Aprenda más sobre Nuxt en la ",
|
|
294
|
-
}),
|
|
295
|
-
nuxtDocs: t({
|
|
296
|
-
en: "Nuxt Documentation",
|
|
297
|
-
fr: "Documentation Nuxt",
|
|
298
|
-
es: "Documentación de Nuxt",
|
|
299
|
-
}),
|
|
300
|
-
readTheDocs: t({
|
|
301
|
-
en: "Click on the Nuxt logo to learn more",
|
|
302
|
-
fr: "Cliquez sur le logo Nuxt pour en savoir plus",
|
|
303
|
-
es: "Haga clic en el logotipo de Nuxt para obtener más información",
|
|
304
|
-
}),
|
|
305
|
-
},
|
|
306
|
-
};
|
|
307
|
-
|
|
308
|
-
module.exports = helloWorldContent;
|
|
204
|
+
export default content;
|
|
309
205
|
```
|
|
310
206
|
|
|
311
|
-
|
|
312
|
-
{
|
|
313
|
-
"$schema": "https://intlayer.org/schema.json",
|
|
314
|
-
"key": "helloworld",
|
|
315
|
-
"content": {
|
|
316
|
-
"count": {
|
|
317
|
-
"nodeType": "translation",
|
|
318
|
-
"translation": {
|
|
319
|
-
"en": "count is ",
|
|
320
|
-
"fr": "le compte est ",
|
|
321
|
-
"es": "el recuento es "
|
|
322
|
-
}
|
|
323
|
-
},
|
|
324
|
-
"edit": {
|
|
325
|
-
"nodeType": "translation",
|
|
326
|
-
"translation": {
|
|
327
|
-
"en": "Edit <code>components/HelloWorld.vue</code> and save to test HMR",
|
|
328
|
-
"fr": "Éditez <code>components/HelloWorld.vue</code> et enregistrez pour tester HMR",
|
|
329
|
-
"es": "Edita <code>components/HelloWorld.vue</code> y guarda para probar HMR"
|
|
330
|
-
}
|
|
331
|
-
},
|
|
332
|
-
"checkOut": {
|
|
333
|
-
"nodeType": "translation",
|
|
334
|
-
"translation": {
|
|
335
|
-
"en": "Check out ",
|
|
336
|
-
"fr": "Vérifiez ",
|
|
337
|
-
"es": "Compruebe "
|
|
338
|
-
}
|
|
339
|
-
},
|
|
340
|
-
"nuxtIntlayer": {
|
|
341
|
-
"nodeType": "translation",
|
|
342
|
-
"translation": {
|
|
343
|
-
"en": "Documentation de Nuxt Intlayer",
|
|
344
|
-
"fr": "Documentation de Nuxt Intlayer",
|
|
345
|
-
"es": "Documentación de Nuxt Intlayer"
|
|
346
|
-
}
|
|
347
|
-
},
|
|
348
|
-
"learnMore": {
|
|
349
|
-
"nodeType": "translation",
|
|
350
|
-
"translation": {
|
|
351
|
-
"en": "En savoir plus sur Nuxt dans la ",
|
|
352
|
-
"fr": "En savoir plus sur Nuxt dans la ",
|
|
353
|
-
"es": "Aprenda más sobre Nuxt en la "
|
|
354
|
-
}
|
|
355
|
-
},
|
|
356
|
-
"nuxtDocs": {
|
|
357
|
-
"nodeType": "translation",
|
|
358
|
-
"translation": {
|
|
359
|
-
"en": "Documentation Nuxt",
|
|
360
|
-
"fr": "Documentation Nuxt",
|
|
361
|
-
"es": "Documentación de Nuxt"
|
|
362
|
-
}
|
|
363
|
-
},
|
|
364
|
-
"readTheDocs": {
|
|
365
|
-
"nodeType": "translation",
|
|
366
|
-
"translation": {
|
|
367
|
-
"en": "Cliquez sur le logo Nuxt pour en savoir plus",
|
|
368
|
-
"fr": "Cliquez sur le logo Nuxt pour en savoir plus",
|
|
369
|
-
"es": "Haga clic en el logotipo de Nuxt para obtener más información"
|
|
370
|
-
}
|
|
371
|
-
}
|
|
372
|
-
}
|
|
373
|
-
}
|
|
374
|
-
```
|
|
375
|
-
|
|
376
|
-
> Vos déclarations de contenu peuvent être définies n'importe où dans votre application tant qu'elles sont incluses dans le répertoire `contentDir` (par défaut, `./src`). Et correspondent à l'extension de fichier de déclaration de contenu (par défaut, `.content.{json,ts,tsx,js,jsx,mjs,mjx,cjs,cjx}`).
|
|
207
|
+
> Vos déclarations de contenu peuvent être définies n'importe où dans votre application tant qu'elles sont incluses dans le répertoire `contentDir` (par défaut, `./src`). Et correspondent à l'extension des fichiers de déclaration de contenu (par défaut, `.content.{json,ts,tsx,js,jsx,mjs,mjx,cjs,cjx}`).
|
|
377
208
|
|
|
378
|
-
> Pour plus de détails,
|
|
209
|
+
> Pour plus de détails, consultez la [documentation sur la déclaration de contenu](https://github.com/aymericzip/intlayer/blob/main/docs/docs/fr/dictionary/content_file.md).
|
|
379
210
|
|
|
380
211
|
### Étape 5 : Utilisez Intlayer dans votre code
|
|
381
212
|
|
|
@@ -428,86 +259,76 @@ const countRef = ref(0);
|
|
|
428
259
|
</template>
|
|
429
260
|
```
|
|
430
261
|
|
|
431
|
-
####
|
|
262
|
+
#### Accès au contenu dans Intlayer
|
|
432
263
|
|
|
433
264
|
Intlayer propose différentes API pour accéder à votre contenu :
|
|
434
265
|
|
|
435
|
-
- **Syntaxe basée sur les composants** (recommandée) :
|
|
436
|
-
Utilisez la syntaxe `<myContent
|
|
266
|
+
- **Syntaxe basée sur les composants** (recommandée) :
|
|
267
|
+
Utilisez la syntaxe `<myContent />`, ou `<Component :is="myContent" />` pour rendre le contenu en tant que nœud Intlayer. Cela s'intègre parfaitement avec l'[Éditeur Visuel](https://github.com/aymericzip/intlayer/blob/main/docs/docs/fr/intlayer_visual_editor.md) et le [CMS](https://github.com/aymericzip/intlayer/blob/main/docs/docs/fr/intlayer_CMS.md).
|
|
437
268
|
|
|
438
|
-
- **Syntaxe basée sur les chaînes** :
|
|
269
|
+
- **Syntaxe basée sur les chaînes** :
|
|
439
270
|
Utilisez `{{ myContent }}` pour afficher le contenu en texte brut, sans support de l'Éditeur Visuel.
|
|
440
271
|
|
|
441
|
-
- **Syntaxe HTML brute** :
|
|
272
|
+
- **Syntaxe HTML brute** :
|
|
442
273
|
Utilisez `<div v-html="myContent" />` pour afficher le contenu en HTML brut, sans support de l'Éditeur Visuel.
|
|
443
274
|
|
|
444
|
-
- **Syntaxe de déstructuration** :
|
|
445
|
-
Le composable `useIntlayer` retourne un Proxy
|
|
446
|
-
- Utilisez `const content = useIntlayer("myContent");` et `{{ content.myContent }}` / `<content.myContent />`.
|
|
447
|
-
- Ou utilisez `const { myContent } = useIntlayer("myContent");` et `{{ myContent}}` / `<myContent/>` pour déstructurer le contenu.
|
|
275
|
+
- **Syntaxe de déstructuration** :
|
|
276
|
+
Le composable `useIntlayer` retourne un Proxy contenant le contenu. Ce proxy peut être déstructuré pour accéder au contenu tout en conservant la réactivité.
|
|
277
|
+
- Utilisez `const content = useIntlayer("myContent");` et `{{ content.myContent }}` / `<content.myContent />`.
|
|
278
|
+
- Ou utilisez `const { myContent } = useIntlayer("myContent");` et `{{ myContent}}` / `<myContent/>` pour déstructurer le contenu.
|
|
448
279
|
|
|
449
280
|
### (Optionnel) Étape 6 : Changer la langue de votre contenu
|
|
450
281
|
|
|
451
282
|
Pour changer la langue de votre contenu, vous pouvez utiliser la fonction `setLocale` fournie par le composable `useLocale`. Cette fonction vous permet de définir la locale de l'application et de mettre à jour le contenu en conséquence.
|
|
452
283
|
|
|
453
|
-
Créez un composant pour basculer entre les langues :
|
|
284
|
+
Créez un composant pour basculer entre les langues en utilisant `NuxtLink`. **Utiliser des liens plutôt que des boutons pour le changement de locale est une bonne pratique pour le SEO et la découvrabilité des pages**, car cela permet aux moteurs de recherche d'explorer et d'indexer toutes les versions localisées de vos pages :
|
|
454
285
|
|
|
455
286
|
```vue fileName="components/LocaleSwitcher.vue"
|
|
456
|
-
<template>
|
|
457
|
-
<div class="locale-switcher">
|
|
458
|
-
<select v-model="selectedLocale" @change="changeLocale">
|
|
459
|
-
<option v-for="loc in availableLocales" :key="loc" :value="loc">
|
|
460
|
-
{{ getLocaleName(loc) }}
|
|
461
|
-
</option>
|
|
462
|
-
</select>
|
|
463
|
-
</div>
|
|
464
|
-
</template>
|
|
465
|
-
|
|
466
287
|
<script setup lang="ts">
|
|
467
|
-
import {
|
|
468
|
-
import { getLocaleName } from "intlayer";
|
|
288
|
+
import { getLocaleName, getLocalizedUrl } from "intlayer";
|
|
469
289
|
import { useLocale } from "vue-intlayer";
|
|
470
290
|
|
|
471
|
-
//
|
|
291
|
+
// Nuxt importe automatiquement useRoute
|
|
292
|
+
const route = useRoute();
|
|
472
293
|
const { locale, availableLocales, setLocale } = useLocale();
|
|
473
|
-
|
|
474
|
-
// Suivre la locale sélectionnée avec un ref
|
|
475
|
-
const selectedLocale = ref(locale.value);
|
|
476
|
-
|
|
477
|
-
// Mettre à jour la locale lorsque la sélection change
|
|
478
|
-
const changeLocale = () => setLocale(selectedLocale.value);
|
|
479
|
-
|
|
480
|
-
// Garder selectedLocale synchronisé avec la locale globale
|
|
481
|
-
watch(
|
|
482
|
-
() => locale.value,
|
|
483
|
-
(newLocale) => {
|
|
484
|
-
selectedLocale.value = newLocale;
|
|
485
|
-
}
|
|
486
|
-
);
|
|
487
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>
|
|
488
309
|
</template>
|
|
310
|
+
```
|
|
489
311
|
|
|
490
|
-
|
|
491
|
-
.locale-switcher {
|
|
492
|
-
margin: 1rem 0;
|
|
493
|
-
}
|
|
312
|
+
> Utiliser `NuxtLink` avec des attributs `href` appropriés (via `getLocalizedUrl`) garantit que les moteurs de recherche peuvent découvrir toutes les variantes linguistiques de vos pages. Cela est préférable au changement de langue uniquement via JavaScript, que les robots des moteurs de recherche peuvent ne pas suivre.
|
|
494
313
|
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
314
|
+
Ensuite, configurez votre `app.vue` pour utiliser des layouts :
|
|
315
|
+
|
|
316
|
+
```vue fileName="app.vue"
|
|
317
|
+
<template>
|
|
318
|
+
<NuxtLayout>
|
|
319
|
+
<NuxtPage />
|
|
320
|
+
</NuxtLayout>
|
|
321
|
+
</template>
|
|
501
322
|
```
|
|
502
323
|
|
|
503
|
-
|
|
324
|
+
### (Optionnel) Étape 6b : Créer un layout avec navigation
|
|
504
325
|
|
|
505
|
-
|
|
326
|
+
Les layouts Nuxt vous permettent de définir une structure commune pour vos pages. Créez un layout par défaut qui inclut le sélecteur de langue et la navigation :
|
|
327
|
+
|
|
328
|
+
```vue fileName="layouts/default.vue"
|
|
506
329
|
<script setup lang="ts">
|
|
507
|
-
import
|
|
330
|
+
import Links from "~/components/Links.vue";
|
|
508
331
|
import LocaleSwitcher from "~/components/LocaleSwitcher.vue";
|
|
509
|
-
|
|
510
|
-
const content = useIntlayer("app"); // Créez le fichier de déclaration intlayer associé
|
|
511
332
|
</script>
|
|
512
333
|
|
|
513
334
|
<template>
|
|
@@ -516,15 +337,20 @@ const content = useIntlayer("app"); // Créez le fichier de déclaration intlaye
|
|
|
516
337
|
<LocaleSwitcher />
|
|
517
338
|
</header>
|
|
518
339
|
<main>
|
|
519
|
-
<
|
|
340
|
+
<slot />
|
|
520
341
|
</main>
|
|
342
|
+
|
|
343
|
+
<Links href="/">Accueil</Links>
|
|
344
|
+
<Links href="/about">À propos</Links>
|
|
521
345
|
</div>
|
|
522
346
|
</template>
|
|
523
347
|
```
|
|
524
348
|
|
|
525
|
-
|
|
349
|
+
Le composant `Links` (montré ci-dessous) garantit que les liens de navigation internes sont automatiquement localisés.
|
|
350
|
+
|
|
351
|
+
### (Optionnel) Étape 7 : Ajouter le routage localisé à votre application
|
|
526
352
|
|
|
527
|
-
Nuxt gère automatiquement le routage localisé lorsqu'on utilise le module `nuxt-intlayer`. Cela crée des routes pour chaque langue automatiquement en fonction de la structure de votre répertoire
|
|
353
|
+
Nuxt gère automatiquement le routage localisé lorsqu'on utilise le module `nuxt-intlayer`. Cela crée des routes pour chaque langue automatiquement en fonction de la structure de votre répertoire pages.
|
|
528
354
|
|
|
529
355
|
Exemple :
|
|
530
356
|
|
|
@@ -536,242 +362,291 @@ pages/
|
|
|
536
362
|
└── index.vue → /contact, /fr/contact, /es/contact
|
|
537
363
|
```
|
|
538
364
|
|
|
539
|
-
Pour créer
|
|
365
|
+
Pour créer des pages localisées, il suffit de créer vos fichiers Vue dans le répertoire `pages/`. Voici deux exemples de pages :
|
|
366
|
+
|
|
367
|
+
**Page d'accueil (`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
|
+
**Page À propos (`pages/about.vue`) :**
|
|
540
392
|
|
|
541
393
|
```vue fileName="pages/about.vue"
|
|
542
394
|
<script setup lang="ts">
|
|
543
395
|
import { useIntlayer } from "vue-intlayer";
|
|
544
396
|
|
|
545
|
-
const content = useIntlayer("about");
|
|
397
|
+
const content = useIntlayer("about-page");
|
|
398
|
+
|
|
399
|
+
useHead({
|
|
400
|
+
title: content.metaTitle.raw, // Utiliser .raw pour accéder à la chaîne primitive
|
|
401
|
+
meta: [
|
|
402
|
+
{
|
|
403
|
+
name: "description",
|
|
404
|
+
content: content.metaDescription.raw, // Utilisez .raw pour accéder à la chaîne primitive
|
|
405
|
+
},
|
|
406
|
+
],
|
|
407
|
+
});
|
|
546
408
|
</script>
|
|
547
409
|
|
|
548
410
|
<template>
|
|
549
|
-
<
|
|
550
|
-
<h1>{{ content.title }}</h1>
|
|
551
|
-
<p>{{ content.description }}</p>
|
|
552
|
-
</div>
|
|
411
|
+
<h1><content.title /></h1>
|
|
553
412
|
</template>
|
|
554
413
|
```
|
|
555
414
|
|
|
556
|
-
|
|
415
|
+
> Remarque : `useHead` est importé automatiquement dans Nuxt. Vous pouvez accéder aux valeurs du contenu en utilisant soit `.value` (réactif) soit `.raw` (chaîne primitive) selon vos besoins.
|
|
557
416
|
|
|
558
|
-
|
|
559
|
-
|
|
417
|
+
Le module `nuxt-intlayer` fera automatiquement :
|
|
418
|
+
|
|
419
|
+
- Détecter la locale préférée de l'utilisateur
|
|
420
|
+
- Gérer le changement de locale via l'URL
|
|
560
421
|
- Définir l'attribut `<html lang="">` approprié
|
|
561
|
-
- Gérer les cookies de
|
|
422
|
+
- Gérer les cookies de locale
|
|
562
423
|
- Rediriger les utilisateurs vers l'URL localisée appropriée
|
|
563
424
|
|
|
564
425
|
### (Optionnel) Étape 8 : Création d'un composant de lien localisé
|
|
565
426
|
|
|
566
|
-
Pour garantir que la navigation de votre application respecte la
|
|
567
|
-
|
|
568
|
-
```vue fileName="components/LocalizedLink.vue"
|
|
569
|
-
<template>
|
|
570
|
-
<NuxtLink :to="localizedHref" v-bind="$attrs">
|
|
571
|
-
<slot />
|
|
572
|
-
</NuxtLink>
|
|
573
|
-
</template>
|
|
427
|
+
Pour garantir que la navigation de votre application respecte la locale actuelle, vous pouvez créer un composant personnalisé `Links`. Ce composant préfixe automatiquement les URLs internes avec la langue courante, ce qui est essentiel pour le **SEO et la découvrabilité des pages**.
|
|
574
428
|
|
|
429
|
+
```vue fileName="components/Links.vue"
|
|
575
430
|
<script setup lang="ts">
|
|
576
|
-
import { computed } from "vue";
|
|
577
431
|
import { getLocalizedUrl } from "intlayer";
|
|
578
432
|
import { useLocale } from "vue-intlayer";
|
|
579
433
|
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
434
|
+
interface Props {
|
|
435
|
+
href: string;
|
|
436
|
+
locale?: string;
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
const props = defineProps<Props>();
|
|
440
|
+
|
|
441
|
+
const { locale: currentLocale } = useLocale();
|
|
586
442
|
|
|
587
|
-
|
|
443
|
+
// Calculer le chemin final
|
|
444
|
+
const finalPath = computed(() => {
|
|
445
|
+
// 1. Vérifier si le lien est externe
|
|
446
|
+
const isExternal = /^https?:\/\//.test(props.href || "");
|
|
588
447
|
|
|
589
|
-
//
|
|
590
|
-
|
|
448
|
+
// 2. Si externe, retourner tel quel (NuxtLink gère la génération de la balise <a>)
|
|
449
|
+
if (isExternal) return props.href;
|
|
591
450
|
|
|
592
|
-
//
|
|
593
|
-
const
|
|
594
|
-
|
|
595
|
-
);
|
|
451
|
+
// 3. Si le lien est interne, localiser l'URL
|
|
452
|
+
const targetLocale = props.locale || currentLocale.value;
|
|
453
|
+
return getLocalizedUrl(props.href, targetLocale);
|
|
454
|
+
});
|
|
596
455
|
</script>
|
|
456
|
+
|
|
457
|
+
<template>
|
|
458
|
+
<NuxtLink :to="finalPath" v-bind="$attrs">
|
|
459
|
+
<slot />
|
|
460
|
+
</NuxtLink>
|
|
461
|
+
</template>
|
|
597
462
|
```
|
|
598
463
|
|
|
599
464
|
Ensuite, utilisez ce composant dans toute votre application :
|
|
600
465
|
|
|
601
|
-
```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
|
+
|
|
602
472
|
<template>
|
|
603
473
|
<div>
|
|
604
|
-
<
|
|
605
|
-
|
|
606
|
-
</
|
|
607
|
-
<
|
|
608
|
-
|
|
609
|
-
</
|
|
474
|
+
<header>
|
|
475
|
+
<LocaleSwitcher />
|
|
476
|
+
</header>
|
|
477
|
+
<main>
|
|
478
|
+
<slot />
|
|
479
|
+
</main>
|
|
480
|
+
|
|
481
|
+
<Links href="/">Accueil</Links>
|
|
482
|
+
<Links href="/about">À propos</Links>
|
|
610
483
|
</div>
|
|
611
484
|
</template>
|
|
612
|
-
|
|
613
|
-
<script setup lang="ts">
|
|
614
|
-
import { useIntlayer } from "vue-intlayer";
|
|
615
|
-
import LocalizedLink from "~/components/LocalizedLink.vue";
|
|
616
|
-
|
|
617
|
-
const content = useIntlayer("home");
|
|
618
|
-
</script>
|
|
619
485
|
```
|
|
620
486
|
|
|
487
|
+
> En utilisant `NuxtLink` avec des chemins localisés, vous vous assurez que :
|
|
488
|
+
>
|
|
489
|
+
> - Les moteurs de recherche peuvent explorer et indexer toutes les versions linguistiques de vos pages
|
|
490
|
+
> - Les utilisateurs peuvent partager directement des URLs localisées
|
|
491
|
+
> - L'historique du navigateur fonctionne correctement avec des URLs préfixées par la locale
|
|
492
|
+
|
|
621
493
|
### (Optionnel) Étape 9 : Gérer les métadonnées et le SEO
|
|
622
494
|
|
|
623
|
-
Nuxt offre d'excellentes capacités SEO. Vous pouvez utiliser Intlayer pour gérer les métadonnées localisées :
|
|
495
|
+
Nuxt offre d'excellentes capacités SEO via le composable `useHead` (auto-importé). Vous pouvez utiliser Intlayer pour gérer les métadonnées localisées en utilisant l'accesseur `.raw` ou `.value` pour obtenir la valeur primitive de chaîne :
|
|
624
496
|
|
|
625
497
|
```vue fileName="pages/about.vue"
|
|
626
498
|
<script setup lang="ts">
|
|
627
|
-
import {
|
|
628
|
-
import { getIntlayer } from "intlayer";
|
|
629
|
-
import { useLocale } from "vue-intlayer";
|
|
499
|
+
import { useIntlayer } from "vue-intlayer";
|
|
630
500
|
|
|
631
|
-
|
|
632
|
-
const content =
|
|
501
|
+
// useHead est auto-importé dans Nuxt
|
|
502
|
+
const content = useIntlayer("about-page");
|
|
633
503
|
|
|
634
|
-
|
|
635
|
-
title: content.
|
|
636
|
-
|
|
504
|
+
useHead({
|
|
505
|
+
title: content.metaTitle.raw, // Utilisez .raw pour accéder à la chaîne primitive
|
|
506
|
+
meta: [
|
|
507
|
+
{
|
|
508
|
+
name: "description",
|
|
509
|
+
content: content.metaDescription.raw, // Utilisez .raw pour accéder à la chaîne primitive
|
|
510
|
+
},
|
|
511
|
+
],
|
|
637
512
|
});
|
|
638
513
|
</script>
|
|
639
514
|
|
|
640
515
|
<template>
|
|
641
|
-
<
|
|
642
|
-
<h1>{{ content.pageTitle }}</h1>
|
|
643
|
-
<p>{{ content.pageContent }}</p>
|
|
644
|
-
</div>
|
|
516
|
+
<h1><content.title /></h1>
|
|
645
517
|
</template>
|
|
646
518
|
```
|
|
647
519
|
|
|
520
|
+
> Alternativement, vous pouvez utiliser la fonction `import { getIntlayer } from "intlayer"` pour obtenir le contenu sans la réactivité de Vue.
|
|
521
|
+
|
|
522
|
+
> **Accéder aux valeurs du contenu :**
|
|
523
|
+
>
|
|
524
|
+
> - Utilisez `.raw` pour obtenir la valeur primitive de la chaîne (non réactive)
|
|
525
|
+
> - Utilisez `.value` pour obtenir la valeur réactive
|
|
526
|
+
> - Utilisez la syntaxe composant `<content.key />` pour le support de l'éditeur visuel
|
|
527
|
+
|
|
648
528
|
Créez la déclaration de contenu correspondante :
|
|
649
529
|
|
|
650
|
-
```ts fileName="pages/about-
|
|
530
|
+
```ts fileName="pages/about-page.content.ts" contentDeclarationFormat="typescript"
|
|
651
531
|
import { t, type Dictionary } from "intlayer";
|
|
652
|
-
import type { useSeoMeta } from "nuxt/app";
|
|
653
532
|
|
|
654
|
-
const
|
|
655
|
-
key: "about-
|
|
533
|
+
const aboutPageContent = {
|
|
534
|
+
key: "about-page",
|
|
656
535
|
content: {
|
|
657
|
-
|
|
536
|
+
metaTitle: t({
|
|
658
537
|
en: "About Us - My Company",
|
|
659
538
|
fr: "À Propos - Ma Société",
|
|
660
539
|
es: "Acerca de Nosotros - Mi Empresa",
|
|
661
540
|
}),
|
|
662
|
-
|
|
541
|
+
metaDescription: t({
|
|
663
542
|
en: "Learn more about our company and our mission",
|
|
664
543
|
fr: "En savoir plus sur notre société et notre mission",
|
|
665
544
|
es: "Conozca más sobre nuestra empresa y nuestra misión",
|
|
666
545
|
}),
|
|
546
|
+
title: t({
|
|
547
|
+
en: "About Us",
|
|
548
|
+
fr: "À Propos",
|
|
549
|
+
es: "Acerca de Nosotros",
|
|
550
|
+
}),
|
|
667
551
|
},
|
|
668
|
-
} satisfies Dictionary
|
|
552
|
+
} satisfies Dictionary;
|
|
669
553
|
|
|
670
|
-
export default
|
|
554
|
+
export default aboutPageContent;
|
|
671
555
|
```
|
|
672
556
|
|
|
673
|
-
```
|
|
557
|
+
```javascript fileName="pages/about-page.content.mjs" contentDeclarationFormat="esm"
|
|
674
558
|
import { t } from "intlayer";
|
|
675
559
|
|
|
676
560
|
/** @type {import('intlayer').Dictionary} */
|
|
677
|
-
const
|
|
678
|
-
key: "about-
|
|
561
|
+
const aboutPageContent = {
|
|
562
|
+
key: "about-page",
|
|
679
563
|
content: {
|
|
680
|
-
|
|
681
|
-
zh: "关于我们 - 我的公司",
|
|
564
|
+
metaTitle: t({
|
|
682
565
|
en: "About Us - My Company",
|
|
683
566
|
fr: "À Propos - Ma Société",
|
|
567
|
+
fr: "À Propos - Ma Société",
|
|
684
568
|
es: "Acerca de Nosotros - Mi Empresa",
|
|
685
569
|
}),
|
|
686
|
-
|
|
687
|
-
zh: "了解更多关于我们公司和我们的使命",
|
|
570
|
+
metaDescription: t({
|
|
688
571
|
en: "Learn more about our company and our mission",
|
|
689
572
|
fr: "En savoir plus sur notre société et notre mission",
|
|
690
573
|
es: "Conozca más sobre nuestra empresa y nuestra misión",
|
|
691
574
|
}),
|
|
575
|
+
title: t({
|
|
576
|
+
en: "About Us",
|
|
577
|
+
fr: "À Propos",
|
|
578
|
+
es: "Acerca de Nosotros",
|
|
579
|
+
}),
|
|
692
580
|
},
|
|
693
581
|
};
|
|
694
582
|
|
|
695
|
-
export default
|
|
583
|
+
export default aboutPageContent;
|
|
696
584
|
```
|
|
697
585
|
|
|
698
|
-
```
|
|
586
|
+
```javascript fileName="pages/about-page.content.cjs" contentDeclarationFormat="commonjs"
|
|
699
587
|
const { t } = require("intlayer");
|
|
700
588
|
|
|
701
589
|
/** @type {import('intlayer').Dictionary} */
|
|
702
|
-
const
|
|
703
|
-
key: "about-
|
|
590
|
+
const aboutPageContent = {
|
|
591
|
+
key: "about-page",
|
|
704
592
|
content: {
|
|
705
|
-
|
|
706
|
-
zh: "关于我们 - 我的公司",
|
|
593
|
+
metaTitle: t({
|
|
707
594
|
en: "About Us - My Company",
|
|
708
595
|
fr: "À Propos - Ma Société",
|
|
709
596
|
es: "Acerca de Nosotros - Mi Empresa",
|
|
710
597
|
}),
|
|
711
|
-
|
|
712
|
-
es: "Acerca de Nosotros - Mi Empresa",
|
|
713
|
-
}),
|
|
714
|
-
description: t({
|
|
715
|
-
zh: "了解更多关于我们公司和我们的使命",
|
|
598
|
+
metaDescription: t({
|
|
716
599
|
en: "Learn more about our company and our mission",
|
|
717
600
|
fr: "En savoir plus sur notre société et notre mission",
|
|
718
601
|
es: "Conozca más sobre nuestra empresa y nuestra misión",
|
|
719
602
|
}),
|
|
603
|
+
title: t({
|
|
604
|
+
en: "About Us",
|
|
605
|
+
fr: "À Propos",
|
|
606
|
+
es: "Acerca de Nosotros",
|
|
607
|
+
}),
|
|
720
608
|
},
|
|
721
609
|
};
|
|
722
610
|
|
|
723
|
-
module.exports =
|
|
611
|
+
module.exports = aboutPageContent;
|
|
724
612
|
```
|
|
725
613
|
|
|
726
|
-
```json fileName="pages/about-
|
|
614
|
+
```json fileName="pages/about-page.content.json" contentDeclarationFormat="json"
|
|
727
615
|
{
|
|
728
|
-
"
|
|
616
|
+
"$schema": "https://intlayer.org/schema.json",
|
|
617
|
+
"key": "about-page",
|
|
729
618
|
"content": {
|
|
730
|
-
"
|
|
619
|
+
"metaTitle": {
|
|
731
620
|
"nodeType": "translation",
|
|
732
|
-
"
|
|
733
|
-
"zh": "关于我们 - 我的公司",
|
|
621
|
+
"translation": {
|
|
734
622
|
"en": "About Us - My Company",
|
|
735
623
|
"fr": "À Propos - Ma Société",
|
|
736
624
|
"es": "Acerca de Nosotros - Mi Empresa"
|
|
737
625
|
}
|
|
738
626
|
},
|
|
739
|
-
"
|
|
627
|
+
"metaDescription": {
|
|
740
628
|
"nodeType": "translation",
|
|
741
|
-
"
|
|
742
|
-
"zh": "了解更多关于我们公司和我们的使命",
|
|
629
|
+
"translation": {
|
|
743
630
|
"en": "Learn more about our company and our mission",
|
|
744
631
|
"fr": "En savoir plus sur notre société et notre mission",
|
|
745
632
|
"es": "Conozca más sobre nuestra empresa y nuestra misión"
|
|
746
633
|
}
|
|
634
|
+
},
|
|
635
|
+
"title": {
|
|
636
|
+
"nodeType": "translation",
|
|
637
|
+
"translation": {
|
|
638
|
+
"en": "About Us",
|
|
639
|
+
"fr": "À Propos",
|
|
640
|
+
"es": "Acerca de Nosotros"
|
|
641
|
+
}
|
|
747
642
|
}
|
|
748
643
|
}
|
|
749
644
|
}
|
|
750
645
|
```
|
|
751
646
|
|
|
752
|
-
### Configurer TypeScript
|
|
753
|
-
|
|
754
|
-
Intlayer utilise l'augmentation de module pour bénéficier de TypeScript et renforcer votre base de code.
|
|
755
|
-
|
|
756
|
-

|
|
757
|
-
|
|
758
|
-

|
|
759
|
-
|
|
760
|
-
Assurez-vous que votre configuration TypeScript inclut les types générés automatiquement.
|
|
761
|
-
|
|
762
|
-
```json5 fileName="tsconfig.json"
|
|
763
|
-
{
|
|
764
|
-
// ... Vos configurations TypeScript existantes
|
|
765
|
-
"include": [
|
|
766
|
-
// ... Vos configurations TypeScript existantes
|
|
767
|
-
".intlayer/**/*.ts", // Inclure les types générés automatiquement
|
|
768
|
-
],
|
|
769
|
-
}
|
|
770
|
-
```
|
|
771
|
-
|
|
772
647
|
### Configuration Git
|
|
773
648
|
|
|
774
|
-
Il est recommandé d'ignorer les fichiers générés par Intlayer. Cela vous permet d'éviter de les
|
|
649
|
+
Il est recommandé d'ignorer les fichiers générés par Intlayer. Cela vous permet d'éviter de les committer dans votre dépôt Git.
|
|
775
650
|
|
|
776
651
|
Pour ce faire, vous pouvez ajouter les instructions suivantes dans votre fichier `.gitignore` :
|
|
777
652
|
|
|
@@ -782,23 +657,21 @@ Pour ce faire, vous pouvez ajouter les instructions suivantes dans votre fichier
|
|
|
782
657
|
|
|
783
658
|
### Extension VS Code
|
|
784
659
|
|
|
785
|
-
Pour améliorer votre expérience de développement avec Intlayer, vous pouvez installer l
|
|
660
|
+
Pour améliorer votre expérience de développement avec Intlayer, vous pouvez installer l’**extension officielle Intlayer pour VS Code**.
|
|
786
661
|
|
|
787
662
|
[Installer depuis le Marketplace VS Code](https://marketplace.visualstudio.com/items?itemName=intlayer.intlayer-vs-code-extension)
|
|
788
663
|
|
|
789
|
-
Cette extension
|
|
664
|
+
Cette extension offre :
|
|
790
665
|
|
|
791
666
|
- **Autocomplétion** pour les clés de traduction.
|
|
792
|
-
- **Détection d
|
|
667
|
+
- **Détection d’erreurs en temps réel** pour les traductions manquantes.
|
|
793
668
|
- **Aperçus en ligne** du contenu traduit.
|
|
794
669
|
- **Actions rapides** pour créer et mettre à jour facilement les traductions.
|
|
795
670
|
|
|
796
|
-
Pour plus de détails sur l
|
|
671
|
+
Pour plus de détails sur l’utilisation de l’extension, consultez la [documentation de l’extension Intlayer pour VS Code](https://intlayer.org/doc/vs-code-extension).
|
|
797
672
|
|
|
798
673
|
---
|
|
799
674
|
|
|
800
675
|
### Aller plus loin
|
|
801
676
|
|
|
802
|
-
Pour aller plus loin, vous pouvez implémenter l
|
|
803
|
-
|
|
804
|
-
---
|
|
677
|
+
Pour aller plus loin, vous pouvez implémenter l’[éditeur visuel](https://github.com/aymericzip/intlayer/blob/main/docs/docs/fr/intlayer_visual_editor.md) ou externaliser votre contenu en utilisant le [CMS](https://github.com/aymericzip/intlayer/blob/main/docs/docs/fr/intlayer_CMS.md).
|