@intlayer/docs 7.3.10 → 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: Как перевести ваше Nuxt
|
|
3
|
+
updatedAt: 2025-12-07
|
|
4
|
+
title: Как перевести ваше приложение Nuxt и Vue – руководство по i18n 2025
|
|
5
5
|
description: Узнайте, как сделать ваш сайт на Nuxt и Vue многоязычным. Следуйте документации для интернационализации (i18n) и перевода.
|
|
6
6
|
keywords:
|
|
7
7
|
- Интернационализация
|
|
@@ -14,34 +14,69 @@ 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: Обновление LocaleSwitcher, SEO, метаданных
|
|
19
23
|
- version: 5.5.10
|
|
20
24
|
date: 2025-06-29
|
|
21
25
|
changes: Инициализация истории
|
|
22
26
|
---
|
|
23
27
|
|
|
24
|
-
#
|
|
28
|
+
# Перевод вашего сайта на Nuxt и Vue с использованием Intlayer | Интернационализация (i18n)
|
|
25
29
|
|
|
26
|
-
|
|
30
|
+
## Содержание
|
|
31
|
+
|
|
32
|
+
<TOC/>
|
|
27
33
|
|
|
28
34
|
## Что такое Intlayer?
|
|
29
35
|
|
|
30
|
-
**Intlayer**
|
|
36
|
+
**Intlayer** — это инновационная, открытая библиотека интернационализации (i18n), созданная для упрощения поддержки многоязычности в современных веб-приложениях.
|
|
31
37
|
|
|
32
38
|
С помощью Intlayer вы можете:
|
|
33
39
|
|
|
34
40
|
- **Легко управлять переводами** с использованием декларативных словарей на уровне компонентов.
|
|
35
41
|
- **Динамически локализовать метаданные**, маршруты и контент.
|
|
36
|
-
- **Обеспечить поддержку TypeScript** с
|
|
42
|
+
- **Обеспечить поддержку TypeScript** с автогенерируемыми типами, улучшая автодополнение и обнаружение ошибок.
|
|
37
43
|
- **Воспользоваться расширенными возможностями**, такими как динамическое определение и переключение локали.
|
|
38
44
|
|
|
39
45
|
---
|
|
40
46
|
|
|
41
47
|
## Пошаговое руководство по настройке Intlayer в приложении Nuxt
|
|
42
48
|
|
|
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="Демонстрация CodeSandbox - Как интернационализировать ваше приложение с помощью Intlayer"
|
|
53
|
+
sandbox="allow-forms allow-modals allow-popups allow-presentation allow-same-origin allow-scripts"
|
|
54
|
+
loading="lazy"
|
|
55
|
+
/>
|
|
56
|
+
|
|
43
57
|
### Шаг 1: Установка зависимостей
|
|
44
58
|
|
|
59
|
+
<Tab defaultTab="video">
|
|
60
|
+
<TabItem label="Видео" value="video">
|
|
61
|
+
|
|
62
|
+
<iframe title="Как перевести ваше приложение Nuxt и Vue с помощью Intlayer? Откройте для себя 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="Код" 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="Демонстрация CodeSandbox - Как интернационализировать ваше приложение с помощью 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
|
+
Смотрите [Шаблон приложения](https://github.com/aymericzip/intlayer-nuxt-4-template) на GitHub.
|
|
79
|
+
|
|
45
80
|
Установите необходимые пакеты с помощью npm:
|
|
46
81
|
|
|
47
82
|
```bash packageManager="npm"
|
|
@@ -61,13 +96,13 @@ yarn add --save-dev nuxt-intlayer
|
|
|
61
96
|
|
|
62
97
|
- **intlayer**
|
|
63
98
|
|
|
64
|
-
Основной пакет,
|
|
99
|
+
Основной пакет, предоставляющий инструменты интернационализации для управления конфигурацией, перевода, [объявления контента](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/dictionary/content_file.md), транспиляции и [CLI-команд](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/cli/index.md).
|
|
65
100
|
|
|
66
101
|
- **vue-intlayer**
|
|
67
|
-
Пакет, который интегрирует Intlayer с приложением Vue. Он
|
|
102
|
+
Пакет, который интегрирует Intlayer с приложением Vue. Он содержит composables для Vue-компонентов.
|
|
68
103
|
|
|
69
104
|
- **nuxt-intlayer**
|
|
70
|
-
Модуль Nuxt, который интегрирует Intlayer с приложениями Nuxt. Он обеспечивает автоматическую настройку,
|
|
105
|
+
Модуль Nuxt, который интегрирует Intlayer с приложениями Nuxt. Он обеспечивает автоматическую настройку, middleware для определения локали, управление cookie и перенаправление URL.
|
|
71
106
|
|
|
72
107
|
### Шаг 2: Конфигурация вашего проекта
|
|
73
108
|
|
|
@@ -86,9 +121,6 @@ const config: IntlayerConfig = {
|
|
|
86
121
|
],
|
|
87
122
|
defaultLocale: Locales.ENGLISH,
|
|
88
123
|
},
|
|
89
|
-
content: {
|
|
90
|
-
contentDir: ["."], // По умолчанию Intlayer будет отслеживать файлы объявления контента из директории `./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
|
-
// Конфигурация 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: ["."], // Каталоги с декларациями контента
|
|
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
|
-
// Конфигурация Intlayer
|
|
125
152
|
const config = {
|
|
126
153
|
internationalization: {
|
|
127
154
|
locales: [
|
|
@@ -132,15 +159,12 @@ 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
|
-
>
|
|
167
|
+
> Через этот конфигурационный файл вы можете настроить локализованные URL, перенаправление через middleware, имена cookie, расположение и расширение ваших деклараций контента, отключить логи Intlayer в консоли и многое другое. Для полного списка доступных параметров обратитесь к [документации по конфигурации](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/configuration.md).
|
|
144
168
|
|
|
145
169
|
### Шаг 3: Интеграция Intlayer в вашу конфигурацию Nuxt
|
|
146
170
|
|
|
@@ -161,239 +185,40 @@ export default defineNuxtConfig({
|
|
|
161
185
|
|
|
162
186
|
Создайте и управляйте вашими декларациями контента для хранения переводов:
|
|
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
|
|
212
|
+
export default content;
|
|
201
213
|
```
|
|
202
214
|
|
|
203
|
-
|
|
204
|
-
import { t } from "intlayer";
|
|
215
|
+
> Ваши декларации контента могут быть определены в любом месте вашего приложения, при условии, что они включены в директорию `contentDir` (по умолчанию, `./src`). И соответствуют расширению файла декларации контента (по умолчанию, `.content.{json,ts,tsx,js,jsx,mjs,mjx,cjs,cjx}`).
|
|
205
216
|
|
|
206
|
-
|
|
207
|
-
const helloWorldContent = {
|
|
208
|
-
key: "helloworld",
|
|
209
|
-
content: {
|
|
210
|
-
count: t({ ru: "счёт равен ", en: "count is ", fr: "le compte est ", es: "el recuento es " }),
|
|
211
|
-
edit: t({
|
|
212
|
-
ru: "Редактируйте <code>components/HelloWorld.vue</code> и сохраните, чтобы проверить HMR",
|
|
213
|
-
en: "Edit <code>components/HelloWorld.vue</code> and save to test HMR",
|
|
214
|
-
fr: "Éditez <code>components/HelloWorld.vue</code> et enregistrez pour tester HMR",
|
|
215
|
-
es: "Edita <code>components/HelloWorld.vue</code> y guarda para probar HMR",
|
|
216
|
-
}),
|
|
217
|
-
fr: "Cliquez sur le logo Nuxt pour en savoir plus",
|
|
218
|
-
es: "Haga clic en el logotipo de Nuxt para obtener más información",
|
|
219
|
-
}),
|
|
220
|
-
},
|
|
221
|
-
} satisfies Dictionary;
|
|
217
|
+
> Для получения дополнительной информации обратитесь к [документации по декларации контента](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/dictionary/content_file.md).
|
|
222
218
|
|
|
223
|
-
|
|
224
|
-
```
|
|
219
|
+
### Шаг 5: Использование Intlayer в вашем коде
|
|
225
220
|
|
|
226
|
-
|
|
227
|
-
import { t } from "intlayer";
|
|
228
|
-
|
|
229
|
-
/** @type {import('intlayer').Dictionary} */
|
|
230
|
-
const helloWorldContent = {
|
|
231
|
-
key: "helloworld",
|
|
232
|
-
content: {
|
|
233
|
-
count: t({ en: "count is ", fr: "le compte est ", es: "el recuento es " }),
|
|
234
|
-
edit: t({
|
|
235
|
-
en: "Edit <code>components/HelloWorld.vue</code> and save to test HMR",
|
|
236
|
-
fr: "Éditez <code>components/HelloWorld.vue</code> et enregistrez pour tester HMR",
|
|
237
|
-
es: "Edita <code>components/HelloWorld.vue</code> y guarda para probar HMR",
|
|
238
|
-
}),
|
|
239
|
-
checkOut: t({
|
|
240
|
-
ru: "Посмотрите ",
|
|
241
|
-
en: "Check out ",
|
|
242
|
-
fr: "Vérifiez ",
|
|
243
|
-
es: "Compruebe ",
|
|
244
|
-
}),
|
|
245
|
-
nuxtIntlayer: t({
|
|
246
|
-
ru: "Документация Nuxt Intlayer",
|
|
247
|
-
en: "Nuxt Intlayer documentation",
|
|
248
|
-
fr: "Documentation de Nuxt Intlayer",
|
|
249
|
-
es: "Documentación de Nuxt Intlayer",
|
|
250
|
-
}),
|
|
251
|
-
learnMore: t({
|
|
252
|
-
ru: "Узнайте больше о Nuxt в ",
|
|
253
|
-
en: "Learn more about Nuxt in the ",
|
|
254
|
-
fr: "En savoir plus sur Nuxt dans la ",
|
|
255
|
-
es: "Aprenda más sobre Nuxt en la ",
|
|
256
|
-
}),
|
|
257
|
-
nuxtDocs: t({
|
|
258
|
-
ru: "Документация Nuxt",
|
|
259
|
-
en: "Nuxt Documentation",
|
|
260
|
-
fr: "Documentation Nuxt",
|
|
261
|
-
es: "Documentación de Nuxt",
|
|
262
|
-
}),
|
|
263
|
-
readTheDocs: t({
|
|
264
|
-
ru: "Нажмите на логотип Nuxt, чтобы узнать больше",
|
|
265
|
-
en: "Click on the Nuxt logo to learn more",
|
|
266
|
-
fr: "Cliquez sur le logo Nuxt pour en savoir plus",
|
|
267
|
-
es: "Haga clic en el logotipo de Nuxt para obtener más información",
|
|
268
|
-
}),
|
|
269
|
-
},
|
|
270
|
-
};
|
|
271
|
-
|
|
272
|
-
export default helloWorldContent;
|
|
273
|
-
```
|
|
274
|
-
|
|
275
|
-
```javascript fileName="components/helloWorld.content.cjs" contentDeclarationFormat="commonjs"
|
|
276
|
-
const { t } = require("intlayer");
|
|
277
|
-
|
|
278
|
-
/** @type {import('intlayer').Dictionary} */
|
|
279
|
-
const helloWorldContent = {
|
|
280
|
-
key: "helloworld",
|
|
281
|
-
content: {
|
|
282
|
-
count: t({
|
|
283
|
-
ru: "счёт равен ",
|
|
284
|
-
en: "count is ",
|
|
285
|
-
fr: "le compte est ",
|
|
286
|
-
es: "el recuento es ",
|
|
287
|
-
}),
|
|
288
|
-
edit: t({
|
|
289
|
-
ru: "Редактируйте <code>components/HelloWorld.vue</code> и сохраните, чтобы проверить HMR",
|
|
290
|
-
en: "Edit <code>components/HelloWorld.vue</code> and save to test HMR",
|
|
291
|
-
fr: "Éditez <code>components/HelloWorld.vue</code> et enregistrez pour tester HMR",
|
|
292
|
-
es: "Edita <code>components/HelloWorld.vue</code> y guarda para probar HMR",
|
|
293
|
-
}),
|
|
294
|
-
checkOut: t({
|
|
295
|
-
ru: "Посмотрите ",
|
|
296
|
-
en: "Check out ",
|
|
297
|
-
fr: "Vérifiez ",
|
|
298
|
-
es: "Compruebe ",
|
|
299
|
-
}),
|
|
300
|
-
nuxtIntlayer: t({
|
|
301
|
-
ru: "Документация Nuxt Intlayer",
|
|
302
|
-
en: "Nuxt Intlayer documentation",
|
|
303
|
-
fr: "Documentation de Nuxt Intlayer",
|
|
304
|
-
ru: "Узнайте больше о Nuxt в ",
|
|
305
|
-
en: "Learn more about Nuxt in the ",
|
|
306
|
-
fr: "En savoir plus sur Nuxt dans la ",
|
|
307
|
-
es: "Aprenda más sobre Nuxt en la ",
|
|
308
|
-
}),
|
|
309
|
-
nuxtDocs: t({
|
|
310
|
-
ru: "Документация Nuxt",
|
|
311
|
-
en: "Nuxt Documentation",
|
|
312
|
-
fr: "Documentation Nuxt",
|
|
313
|
-
es: "Documentación de Nuxt",
|
|
314
|
-
}),
|
|
315
|
-
readTheDocs: t({
|
|
316
|
-
ru: "Нажмите на логотип Nuxt, чтобы узнать больше",
|
|
317
|
-
en: "Click on the Nuxt logo to learn more",
|
|
318
|
-
fr: "Cliquez sur le logo Nuxt pour en savoir plus",
|
|
319
|
-
es: "Haga clic en el logotipo de Nuxt para obtener más información",
|
|
320
|
-
}),
|
|
321
|
-
},
|
|
322
|
-
};
|
|
323
|
-
|
|
324
|
-
module.exports = helloWorldContent;
|
|
325
|
-
```
|
|
326
|
-
|
|
327
|
-
```json fileName="components/helloWorld.content.json" contentDeclarationFormat="json"
|
|
328
|
-
{
|
|
329
|
-
"$schema": "https://intlayer.org/schema.json",
|
|
330
|
-
"key": "helloworld",
|
|
331
|
-
"content": {
|
|
332
|
-
"count": {
|
|
333
|
-
"nodeType": "translation",
|
|
334
|
-
"translation": {
|
|
335
|
-
"ru": "счёт равен ",
|
|
336
|
-
"en": "count is ",
|
|
337
|
-
"fr": "le compte est ",
|
|
338
|
-
"es": "el recuento es "
|
|
339
|
-
}
|
|
340
|
-
},
|
|
341
|
-
"edit": {
|
|
342
|
-
"nodeType": "translation",
|
|
343
|
-
"translation": {
|
|
344
|
-
"ru": "Отредактируйте <code>components/HelloWorld.vue</code> и сохраните, чтобы протестировать HMR",
|
|
345
|
-
"en": "Edit <code>components/HelloWorld.vue</code> and save to test HMR",
|
|
346
|
-
"fr": "Éditez <code>components/HelloWorld.vue</code> et enregistrez pour tester HMR",
|
|
347
|
-
"es": "Edita <code>components/HelloWorld.vue</code> y guarda para probar HMR"
|
|
348
|
-
}
|
|
349
|
-
},
|
|
350
|
-
"checkOut": {
|
|
351
|
-
"nodeType": "translation",
|
|
352
|
-
"translation": {
|
|
353
|
-
"ru": "Посмотрите ",
|
|
354
|
-
"en": "Check out ",
|
|
355
|
-
"fr": "Vérifiez ",
|
|
356
|
-
"es": "Compruebe "
|
|
357
|
-
}
|
|
358
|
-
},
|
|
359
|
-
"nuxtIntlayer": {
|
|
360
|
-
"nodeType": "translation",
|
|
361
|
-
"translation": {
|
|
362
|
-
"ru": "Документация Nuxt Intlayer"
|
|
363
|
-
}
|
|
364
|
-
},
|
|
365
|
-
"learnMore": {
|
|
366
|
-
"nodeType": "translation",
|
|
367
|
-
"translation": {
|
|
368
|
-
"ru": "Узнайте больше о Nuxt в "
|
|
369
|
-
}
|
|
370
|
-
},
|
|
371
|
-
"nuxtDocs": {
|
|
372
|
-
"nodeType": "translation",
|
|
373
|
-
"translation": {
|
|
374
|
-
"ru": "Документация Nuxt"
|
|
375
|
-
}
|
|
376
|
-
},
|
|
377
|
-
"readTheDocs": {
|
|
378
|
-
"nodeType": "translation",
|
|
379
|
-
"translation": {
|
|
380
|
-
"ru": "Нажмите на логотип Nuxt, чтобы узнать больше"
|
|
381
|
-
}
|
|
382
|
-
}
|
|
383
|
-
"es": "Haga clic en el logotipo de Nuxt para obtener más información"
|
|
384
|
-
}
|
|
385
|
-
}
|
|
386
|
-
}
|
|
387
|
-
}
|
|
388
|
-
```
|
|
389
|
-
|
|
390
|
-
> Ваши объявления контента могут быть определены в любом месте вашего приложения, при условии, что они включены в каталог `contentDir` (по умолчанию, `./src`). И соответствуют расширению файла объявления контента (по умолчанию, `.content.{json,ts,tsx,js,jsx,mjs,mjx,cjs,cjx}`).
|
|
391
|
-
|
|
392
|
-
> Для получения дополнительной информации обратитесь к [документации по объявлениям контента](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/dictionary/get_started.md).
|
|
393
|
-
|
|
394
|
-
### Шаг 5: Используйте Intlayer в вашем коде
|
|
395
|
-
|
|
396
|
-
Получайте доступ к вашим словарям контента по всему приложению Nuxt с помощью композиции `useIntlayer`:
|
|
221
|
+
Получайте доступ к вашим словарям контента по всему приложению Nuxt, используя композицию `useIntlayer`:
|
|
397
222
|
|
|
398
223
|
```vue fileName="components/HelloWorld.vue"
|
|
399
224
|
<script setup lang="ts">
|
|
@@ -447,81 +272,71 @@ const countRef = ref(0);
|
|
|
447
272
|
Intlayer предлагает различные API для доступа к вашему контенту:
|
|
448
273
|
|
|
449
274
|
- **Синтаксис на основе компонентов** (рекомендуется):
|
|
450
|
-
Используйте синтаксис `<myContent />` или `<Component :is="myContent" />` для
|
|
275
|
+
Используйте синтаксис `<myContent />` или `<Component :is="myContent" />` для рендеринга контента как узла Intlayer. Это обеспечивает бесшовную интеграцию с [Визуальным редактором](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/intlayer_visual_editor.md) и [CMS](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/intlayer_CMS.md).
|
|
451
276
|
|
|
452
277
|
- **Синтаксис на основе строк**:
|
|
453
|
-
Используйте `{{ myContent }}
|
|
278
|
+
Используйте `{{ myContent }}`, чтобы отобразить контент как простой текст, без поддержки Визуального редактора.
|
|
454
279
|
|
|
455
|
-
- **Синтаксис
|
|
456
|
-
Используйте `<div v-html="myContent"
|
|
280
|
+
- **Синтаксис сырого HTML**:
|
|
281
|
+
Используйте `<div v-html="myContent" />`, чтобы отобразить контент как сырой HTML, без поддержки Визуального редактора.
|
|
457
282
|
|
|
458
283
|
- **Синтаксис деструктуризации**:
|
|
459
|
-
|
|
284
|
+
Композиция `useIntlayer` возвращает Proxy с контентом. Этот прокси можно деструктурировать для доступа к контенту, сохраняя реактивность.
|
|
460
285
|
- Используйте `const content = useIntlayer("myContent");` и `{{ content.myContent }}` / `<content.myContent />`.
|
|
461
|
-
- Или используйте `const { myContent } = useIntlayer("myContent");` и `{{ myContent}}` / `<myContent/>` для деструктуризации
|
|
286
|
+
- Или используйте `const { myContent } = useIntlayer("myContent");` и `{{ myContent}}` / `<myContent/>` для деструктуризации контента.
|
|
462
287
|
|
|
463
288
|
### (Необязательно) Шаг 6: Изменение языка вашего контента
|
|
464
289
|
|
|
465
|
-
|
|
290
|
+
Чтобы изменить язык вашего контента, вы можете использовать функцию `setLocale`, предоставляемую композаблом `useLocale`. Эта функция позволяет установить локаль приложения и обновить контент соответственно.
|
|
466
291
|
|
|
467
|
-
Создайте компонент для переключения между
|
|
292
|
+
Создайте компонент для переключения между языками с помощью `NuxtLink`. **Использование ссылок вместо кнопок для переключения локали — это лучшая практика для SEO и обнаруживаемости страниц**, так как это позволяет поисковым системам сканировать и индексировать все локализованные версии ваших страниц:
|
|
468
293
|
|
|
469
294
|
```vue fileName="components/LocaleSwitcher.vue"
|
|
470
|
-
<template>
|
|
471
|
-
<div class="locale-switcher">
|
|
472
|
-
<select v-model="selectedLocale" @change="changeLocale">
|
|
473
|
-
<option v-for="loc in availableLocales" :key="loc" :value="loc">
|
|
474
|
-
{{ getLocaleName(loc) }}
|
|
475
|
-
</option>
|
|
476
|
-
</select>
|
|
477
|
-
</div>
|
|
478
|
-
</template>
|
|
479
|
-
|
|
480
295
|
<script setup lang="ts">
|
|
481
|
-
import {
|
|
482
|
-
import { getLocaleName } from "intlayer";
|
|
296
|
+
import { getLocaleName, getLocalizedUrl } from "intlayer";
|
|
483
297
|
import { useLocale } from "vue-intlayer";
|
|
484
298
|
|
|
485
|
-
//
|
|
299
|
+
// Nuxt автоматически импортирует useRoute
|
|
300
|
+
const route = useRoute();
|
|
486
301
|
const { locale, availableLocales, setLocale } = useLocale();
|
|
487
|
-
|
|
488
|
-
// Отслеживаем выбранную локаль с помощью ref
|
|
489
|
-
const selectedLocale = ref(locale.value);
|
|
490
|
-
|
|
491
|
-
// Обновляем локаль при изменении выбора
|
|
492
|
-
const changeLocale = () => setLocale(selectedLocale.value);
|
|
493
|
-
|
|
494
|
-
// Синхронизируем selectedLocale с глобальной локалью
|
|
495
|
-
watch(
|
|
496
|
-
() => locale.value,
|
|
497
|
-
(newLocale) => {
|
|
498
|
-
selectedLocale.value = newLocale;
|
|
499
|
-
}
|
|
500
|
-
);
|
|
501
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>
|
|
502
317
|
</template>
|
|
318
|
+
```
|
|
503
319
|
|
|
504
|
-
|
|
505
|
-
.locale-switcher {
|
|
506
|
-
margin: 1rem 0;
|
|
507
|
-
}
|
|
320
|
+
> Использование `NuxtLink` с правильными атрибутами `href` (через `getLocalizedUrl`) гарантирует, что поисковые системы смогут обнаружить все языковые варианты ваших страниц. Это предпочтительнее, чем переключение локали только с помощью JavaScript, которое поисковые роботы могут не распознать.
|
|
508
321
|
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
322
|
+
Затем настройте ваш `app.vue` для использования layouts:
|
|
323
|
+
|
|
324
|
+
```vue fileName="app.vue"
|
|
325
|
+
<template>
|
|
326
|
+
<NuxtLayout>
|
|
327
|
+
<NuxtPage />
|
|
328
|
+
</NuxtLayout>
|
|
329
|
+
</template>
|
|
515
330
|
```
|
|
516
331
|
|
|
517
|
-
|
|
332
|
+
### (Необязательно) Шаг 6b: Создайте Layout с навигацией
|
|
518
333
|
|
|
519
|
-
|
|
334
|
+
Layouts в Nuxt позволяют определить общую структуру для ваших страниц. Создайте layout по умолчанию, который включает переключатель локали и навигацию:
|
|
335
|
+
|
|
336
|
+
```vue fileName="layouts/default.vue"
|
|
520
337
|
<script setup lang="ts">
|
|
521
|
-
import
|
|
338
|
+
import Links from "~/components/Links.vue";
|
|
522
339
|
import LocaleSwitcher from "~/components/LocaleSwitcher.vue";
|
|
523
|
-
|
|
524
|
-
const content = useIntlayer("app"); // Создайте связанный файл декларации intlayer
|
|
525
340
|
</script>
|
|
526
341
|
|
|
527
342
|
<template>
|
|
@@ -530,15 +345,20 @@ const content = useIntlayer("app"); // Создайте связанный фа
|
|
|
530
345
|
<LocaleSwitcher />
|
|
531
346
|
</header>
|
|
532
347
|
<main>
|
|
533
|
-
<
|
|
348
|
+
<slot />
|
|
534
349
|
</main>
|
|
350
|
+
|
|
351
|
+
<Links href="/">Главная</Links>
|
|
352
|
+
<Links href="/about">О нас</Links>
|
|
535
353
|
</div>
|
|
536
354
|
</template>
|
|
537
355
|
```
|
|
538
356
|
|
|
539
|
-
|
|
357
|
+
Компонент `Links` (показан ниже) гарантирует, что внутренние навигационные ссылки автоматически локализуются.
|
|
358
|
+
|
|
359
|
+
### (Необязательно) Шаг 7: Добавьте локализованный роутинг в ваше приложение
|
|
540
360
|
|
|
541
|
-
Nuxt автоматически обрабатывает
|
|
361
|
+
Nuxt автоматически обрабатывает локализованный роутинг при использовании модуля `nuxt-intlayer`. Это создает маршруты для каждого языка автоматически на основе структуры вашего каталога страниц.
|
|
542
362
|
|
|
543
363
|
Пример:
|
|
544
364
|
|
|
@@ -550,213 +370,285 @@ pages/
|
|
|
550
370
|
└── index.vue → /contact, /fr/contact, /es/contact
|
|
551
371
|
```
|
|
552
372
|
|
|
553
|
-
Чтобы создать
|
|
373
|
+
Чтобы создать локализованные страницы, просто создайте ваши Vue-файлы в директории `pages/`. Вот два примера страниц:
|
|
374
|
+
|
|
375
|
+
**Главная страница (`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
|
+
**Страница "О нас" (`pages/about.vue`):**
|
|
554
400
|
|
|
555
401
|
```vue fileName="pages/about.vue"
|
|
556
402
|
<script setup lang="ts">
|
|
557
403
|
import { useIntlayer } from "vue-intlayer";
|
|
558
404
|
|
|
559
|
-
const content = useIntlayer("about");
|
|
405
|
+
const content = useIntlayer("about-page");
|
|
406
|
+
|
|
407
|
+
useHead({
|
|
408
|
+
title: content.metaTitle.raw, // Используйте .raw для доступа к примитивной строке
|
|
409
|
+
meta: [
|
|
410
|
+
{
|
|
411
|
+
name: "description",
|
|
412
|
+
content: content.metaDescription.raw, // Используйте .raw для доступа к примитивной строке
|
|
413
|
+
},
|
|
414
|
+
],
|
|
415
|
+
});
|
|
560
416
|
</script>
|
|
561
417
|
|
|
562
418
|
<template>
|
|
563
|
-
<
|
|
564
|
-
<h1>{{ content.title }}</h1>
|
|
565
|
-
<p>{{ content.description }}</p>
|
|
566
|
-
</div>
|
|
419
|
+
<h1><content.title /></h1>
|
|
567
420
|
</template>
|
|
568
421
|
```
|
|
569
422
|
|
|
423
|
+
> Примечание: `useHead` автоматически импортируется в Nuxt. Вы можете получать доступ к значениям контента, используя либо `.value` (реактивный), либо `.raw` (примитивная строка), в зависимости от ваших потребностей.
|
|
424
|
+
|
|
570
425
|
Модуль `nuxt-intlayer` автоматически:
|
|
571
426
|
|
|
572
|
-
- Определяет
|
|
573
|
-
- Обрабатывает переключение
|
|
427
|
+
- Определяет предпочитаемую локаль пользователя
|
|
428
|
+
- Обрабатывает переключение локали через URL
|
|
574
429
|
- Устанавливает соответствующий атрибут `<html lang="">`
|
|
575
|
-
- Управляет куки
|
|
430
|
+
- Управляет куки локали
|
|
576
431
|
- Перенаправляет пользователей на соответствующий локализованный URL
|
|
577
432
|
|
|
578
|
-
### (Необязательно) Шаг 8: Создание компонента
|
|
433
|
+
### (Необязательно) Шаг 8: Создание локализованного компонента ссылок
|
|
579
434
|
|
|
580
|
-
Чтобы
|
|
581
|
-
|
|
582
|
-
```vue fileName="components/LocalizedLink.vue"
|
|
583
|
-
<template>
|
|
584
|
-
<NuxtLink :to="localizedHref" v-bind="$attrs">
|
|
585
|
-
<slot />
|
|
586
|
-
</NuxtLink>
|
|
587
|
-
</template>
|
|
435
|
+
Чтобы навигация вашего приложения учитывала текущую локаль, вы можете создать пользовательский компонент `Links`. Этот компонент автоматически добавляет префикс текущего языка к внутренним URL, что важно для **SEO и обнаруживаемости страниц**.
|
|
588
436
|
|
|
437
|
+
```vue fileName="components/Links.vue"
|
|
589
438
|
<script setup lang="ts">
|
|
590
|
-
import { computed } from "vue";
|
|
591
439
|
import { getLocalizedUrl } from "intlayer";
|
|
592
440
|
import { useLocale } from "vue-intlayer";
|
|
593
441
|
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
442
|
+
interface Props {
|
|
443
|
+
href: string;
|
|
444
|
+
locale?: string;
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
const props = defineProps<Props>();
|
|
448
|
+
|
|
449
|
+
const { locale: currentLocale } = useLocale();
|
|
600
450
|
|
|
601
|
-
|
|
451
|
+
// Вычисляем итоговый путь
|
|
452
|
+
const finalPath = computed(() => {
|
|
453
|
+
// 1. Проверяем, является ли ссылка внешней
|
|
454
|
+
const isExternal = /^https?:\/\//.test(props.href || "");
|
|
602
455
|
|
|
603
|
-
//
|
|
604
|
-
|
|
456
|
+
// 2. Если внешняя, возвращаем как есть (NuxtLink обрабатывает генерацию тега <a>)
|
|
457
|
+
if (isExternal) return props.href;
|
|
605
458
|
|
|
606
|
-
//
|
|
607
|
-
const
|
|
608
|
-
|
|
609
|
-
);
|
|
459
|
+
// 3. Если ссылка внутренняя, локализуем URL
|
|
460
|
+
const targetLocale = props.locale || currentLocale.value;
|
|
461
|
+
return getLocalizedUrl(props.href, targetLocale);
|
|
462
|
+
});
|
|
610
463
|
</script>
|
|
464
|
+
|
|
465
|
+
<template>
|
|
466
|
+
<NuxtLink :to="finalPath" v-bind="$attrs">
|
|
467
|
+
<slot />
|
|
468
|
+
</NuxtLink>
|
|
469
|
+
</template>
|
|
611
470
|
```
|
|
612
471
|
|
|
613
472
|
Затем используйте этот компонент по всему вашему приложению:
|
|
614
473
|
|
|
615
|
-
```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
|
+
|
|
616
480
|
<template>
|
|
617
481
|
<div>
|
|
618
|
-
<
|
|
619
|
-
|
|
620
|
-
</
|
|
621
|
-
<
|
|
622
|
-
|
|
623
|
-
</
|
|
482
|
+
<header>
|
|
483
|
+
<LocaleSwitcher />
|
|
484
|
+
</header>
|
|
485
|
+
<main>
|
|
486
|
+
<slot />
|
|
487
|
+
</main>
|
|
488
|
+
|
|
489
|
+
<Links href="/">Главная</Links>
|
|
490
|
+
<Links href="/about">О нас</Links>
|
|
624
491
|
</div>
|
|
625
492
|
</template>
|
|
626
|
-
|
|
627
|
-
<script setup lang="ts">
|
|
628
|
-
import { useIntlayer } from "vue-intlayer";
|
|
629
|
-
import LocalizedLink from "~/components/LocalizedLink.vue";
|
|
630
|
-
|
|
631
|
-
const content = useIntlayer("home");
|
|
632
|
-
</script>
|
|
633
493
|
```
|
|
634
494
|
|
|
635
|
-
|
|
495
|
+
> Используя `NuxtLink` с локализованными путями, вы обеспечиваете:
|
|
496
|
+
>
|
|
497
|
+
> - Поисковые системы могут сканировать и индексировать все языковые версии ваших страниц
|
|
498
|
+
> - Пользователи могут напрямую делиться локализованными URL
|
|
499
|
+
> - История браузера корректно работает с URL, содержащими префикс локали
|
|
500
|
+
|
|
501
|
+
### (Необязательно) Шаг 9: Работа с метаданными и SEO
|
|
636
502
|
|
|
637
|
-
Nuxt предоставляет отличные возможности для SEO. Вы можете использовать Intlayer для обработки локализованных
|
|
503
|
+
Nuxt предоставляет отличные возможности для SEO через композицию `useHead` (автоматически импортируется). Вы можете использовать Intlayer для обработки локализованных метаданных, используя аксессоры `.raw` или `.value` для получения примитивного строкового значения:
|
|
638
504
|
|
|
639
505
|
```vue fileName="pages/about.vue"
|
|
640
506
|
<script setup lang="ts">
|
|
641
|
-
import {
|
|
642
|
-
import { getIntlayer } from "intlayer";
|
|
643
|
-
import { useLocale } from "vue-intlayer";
|
|
507
|
+
import { useIntlayer } from "vue-intlayer";
|
|
644
508
|
|
|
645
|
-
|
|
646
|
-
const content =
|
|
509
|
+
// useHead автоматически импортируется в Nuxt
|
|
510
|
+
const content = useIntlayer("about-page");
|
|
647
511
|
|
|
648
|
-
|
|
649
|
-
title: content.
|
|
650
|
-
|
|
512
|
+
useHead({
|
|
513
|
+
title: content.metaTitle.raw, // Используйте .raw для доступа к примитивной строке
|
|
514
|
+
meta: [
|
|
515
|
+
{
|
|
516
|
+
name: "description",
|
|
517
|
+
content: content.metaDescription.raw, // Используйте .raw для доступа к примитивной строке
|
|
518
|
+
},
|
|
519
|
+
],
|
|
651
520
|
});
|
|
652
521
|
</script>
|
|
653
522
|
|
|
654
523
|
<template>
|
|
655
|
-
<
|
|
656
|
-
<h1>{{ content.pageTitle }}</h1>
|
|
657
|
-
<p>{{ content.pageContent }}</p>
|
|
658
|
-
</div>
|
|
524
|
+
<h1><content.title /></h1>
|
|
659
525
|
</template>
|
|
660
526
|
```
|
|
661
527
|
|
|
528
|
+
> В качестве альтернативы, вы можете использовать функцию `import { getIntlayer } from "intlayer"`, чтобы получить контент без реактивности Vue.
|
|
529
|
+
|
|
530
|
+
> **Доступ к значениям контента:**
|
|
531
|
+
>
|
|
532
|
+
> - Используйте `.raw` для получения примитивного строкового значения (не реактивного)
|
|
533
|
+
> - Используйте `.value` для получения реактивного значения
|
|
534
|
+
> - Используйте синтаксис компонента `<content.key />` для поддержки Визуального Редактора
|
|
535
|
+
|
|
662
536
|
Создайте соответствующее объявление контента:
|
|
663
537
|
|
|
664
|
-
```ts fileName="pages/about-
|
|
538
|
+
```ts fileName="pages/about-page.content.ts" contentDeclarationFormat="typescript"
|
|
665
539
|
import { t, type Dictionary } from "intlayer";
|
|
666
|
-
import type { useSeoMeta } from "nuxt/app";
|
|
667
540
|
|
|
668
|
-
const
|
|
669
|
-
key: "about-
|
|
541
|
+
const aboutPageContent = {
|
|
542
|
+
key: "about-page",
|
|
670
543
|
content: {
|
|
671
|
-
|
|
672
|
-
ru: "О нас - Моя компания",
|
|
544
|
+
metaTitle: t({
|
|
673
545
|
en: "About Us - My Company",
|
|
674
546
|
fr: "À Propos - Ma Société",
|
|
675
547
|
es: "Acerca de Nosotros - Mi Empresa",
|
|
676
548
|
}),
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
en: "Learn more about our company and our mission",
|
|
549
|
+
metaDescription: t({
|
|
550
|
+
en: "Узнайте больше о нашей компании и нашей миссии",
|
|
680
551
|
fr: "En savoir plus sur notre société et notre mission",
|
|
681
552
|
es: "Conozca más sobre nuestra empresa y nuestra misión",
|
|
682
553
|
}),
|
|
554
|
+
title: t({
|
|
555
|
+
en: "О нас",
|
|
556
|
+
fr: "À Propos",
|
|
557
|
+
es: "Acerca de Nosotros",
|
|
558
|
+
}),
|
|
683
559
|
},
|
|
684
|
-
} satisfies Dictionary
|
|
560
|
+
} satisfies Dictionary;
|
|
685
561
|
|
|
686
|
-
export default
|
|
562
|
+
export default aboutPageContent;
|
|
687
563
|
```
|
|
688
564
|
|
|
689
|
-
```
|
|
565
|
+
```javascript fileName="pages/about-page.content.mjs" contentDeclarationFormat="esm"
|
|
690
566
|
import { t } from "intlayer";
|
|
691
567
|
|
|
692
568
|
/** @type {import('intlayer').Dictionary} */
|
|
693
|
-
const
|
|
694
|
-
key: "about-
|
|
569
|
+
const aboutPageContent = {
|
|
570
|
+
key: "about-page",
|
|
695
571
|
content: {
|
|
696
|
-
|
|
697
|
-
zh: "关于我们 - 我的公司",
|
|
572
|
+
metaTitle: t({
|
|
698
573
|
en: "О нас - Моя компания",
|
|
699
574
|
fr: "À Propos - Ma Société",
|
|
700
575
|
es: "Acerca de Nosotros - Mi Empresa",
|
|
701
576
|
}),
|
|
702
|
-
|
|
703
|
-
zh: "了解更多关于我们公司和我们的使命",
|
|
577
|
+
metaDescription: t({
|
|
704
578
|
en: "Узнайте больше о нашей компании и нашей миссии",
|
|
705
579
|
fr: "En savoir plus sur notre société et notre mission",
|
|
706
580
|
es: "Conozca más sobre nuestra empresa y nuestra misión",
|
|
707
581
|
}),
|
|
582
|
+
title: t({
|
|
583
|
+
en: "О нас",
|
|
584
|
+
fr: "À Propos",
|
|
585
|
+
es: "Acerca de Nosotros",
|
|
586
|
+
}),
|
|
708
587
|
},
|
|
709
588
|
};
|
|
710
589
|
|
|
711
|
-
export default
|
|
590
|
+
export default aboutPageContent;
|
|
712
591
|
```
|
|
713
592
|
|
|
714
|
-
```
|
|
593
|
+
```javascript fileName="pages/about-page.content.cjs" contentDeclarationFormat="commonjs"
|
|
715
594
|
const { t } = require("intlayer");
|
|
716
595
|
|
|
717
596
|
/** @type {import('intlayer').Dictionary} */
|
|
718
|
-
const
|
|
719
|
-
key: "about-
|
|
597
|
+
const aboutPageContent = {
|
|
598
|
+
key: "about-page",
|
|
720
599
|
content: {
|
|
721
|
-
|
|
722
|
-
zh: "关于我们 - 我的公司",
|
|
600
|
+
metaTitle: t({
|
|
723
601
|
en: "О нас - Моя компания",
|
|
724
602
|
fr: "À Propos - Ma Société",
|
|
725
603
|
es: "Acerca de Nosotros - Mi Empresa",
|
|
726
604
|
}),
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
en: "Узнайте больше о нашей компании и нашей миссии",
|
|
605
|
+
metaDescription: t({
|
|
606
|
+
en: "Learn more about our company and our mission",
|
|
730
607
|
fr: "En savoir plus sur notre société et notre mission",
|
|
731
608
|
es: "Conozca más sobre nuestra empresa y nuestra misión",
|
|
609
|
+
ru: "Узнайте больше о нашей компании и нашей миссии",
|
|
610
|
+
}),
|
|
611
|
+
title: t({
|
|
612
|
+
en: "About Us",
|
|
613
|
+
fr: "À Propos",
|
|
614
|
+
es: "Acerca de Nosotros",
|
|
615
|
+
ru: "О нас",
|
|
732
616
|
}),
|
|
733
617
|
},
|
|
734
618
|
};
|
|
735
619
|
|
|
736
|
-
module.exports =
|
|
620
|
+
module.exports = aboutPageContent;
|
|
737
621
|
```
|
|
738
622
|
|
|
739
|
-
```json fileName="pages/about-
|
|
623
|
+
```json fileName="pages/about-page.content.json" contentDeclarationFormat="json"
|
|
740
624
|
{
|
|
741
|
-
"
|
|
625
|
+
"$schema": "https://intlayer.org/schema.json",
|
|
626
|
+
"key": "about-page",
|
|
742
627
|
"content": {
|
|
743
|
-
"
|
|
628
|
+
"metaTitle": {
|
|
744
629
|
"nodeType": "translation",
|
|
745
|
-
"
|
|
746
|
-
"
|
|
747
|
-
"en": "О нас - Моя компания",
|
|
630
|
+
"translation": {
|
|
631
|
+
"en": "About Us - My Company",
|
|
748
632
|
"fr": "À Propos - Ma Société",
|
|
749
|
-
"es": "Acerca de Nosotros - Mi Empresa"
|
|
633
|
+
"es": "Acerca de Nosotros - Mi Empresa",
|
|
634
|
+
"ru": "О нас - Моя компания"
|
|
750
635
|
}
|
|
751
636
|
},
|
|
752
|
-
"
|
|
637
|
+
"metaDescription": {
|
|
753
638
|
"nodeType": "translation",
|
|
754
|
-
"
|
|
755
|
-
"
|
|
756
|
-
"en": "Learn more about our company and our mission",
|
|
639
|
+
"translation": {
|
|
640
|
+
"en": "Узнайте больше о нашей компании и нашей миссии",
|
|
757
641
|
"fr": "En savoir plus sur notre société et notre mission",
|
|
758
642
|
"es": "Conozca más sobre nuestra empresa y nuestra misión"
|
|
759
643
|
}
|
|
644
|
+
},
|
|
645
|
+
"title": {
|
|
646
|
+
"nodeType": "translation",
|
|
647
|
+
"translation": {
|
|
648
|
+
"en": "О нас",
|
|
649
|
+
"fr": "À Propos",
|
|
650
|
+
"es": "Acerca de Nosotros"
|
|
651
|
+
}
|
|
760
652
|
}
|
|
761
653
|
}
|
|
762
654
|
}
|
|
@@ -766,27 +658,27 @@ module.exports = aboutMetaContent;
|
|
|
766
658
|
|
|
767
659
|
Intlayer использует расширение модулей (module augmentation), чтобы использовать преимущества TypeScript и сделать вашу кодовую базу более надежной.
|
|
768
660
|
|
|
769
|
-

|
|
770
662
|
|
|
771
|
-

|
|
772
664
|
|
|
773
|
-
Убедитесь, что ваша конфигурация TypeScript включает
|
|
665
|
+
Убедитесь, что ваша конфигурация TypeScript включает автогенерируемые типы.
|
|
774
666
|
|
|
775
667
|
```json5 fileName="tsconfig.json"
|
|
776
668
|
{
|
|
777
669
|
// ... Ваши существующие настройки TypeScript
|
|
778
670
|
"include": [
|
|
779
|
-
// ... Ваши существующие
|
|
780
|
-
".intlayer/**/*.ts", // Включить
|
|
671
|
+
// ... Ваши существующие настройки TypeScript
|
|
672
|
+
".intlayer/**/*.ts", // Включить автогенерируемые типы
|
|
781
673
|
],
|
|
782
674
|
}
|
|
783
675
|
```
|
|
784
676
|
|
|
785
677
|
### Конфигурация Git
|
|
786
678
|
|
|
787
|
-
Рекомендуется игнорировать файлы, сгенерированные Intlayer. Это позволит избежать их коммита в ваш
|
|
679
|
+
Рекомендуется игнорировать файлы, сгенерированные Intlayer. Это позволит избежать их коммита в ваш Git-репозиторий.
|
|
788
680
|
|
|
789
|
-
Для этого вы можете добавить следующие инструкции в файл `.gitignore`:
|
|
681
|
+
Для этого вы можете добавить следующие инструкции в ваш файл `.gitignore`:
|
|
790
682
|
|
|
791
683
|
```plaintext fileName=".gitignore"
|
|
792
684
|
# Игнорировать файлы, сгенерированные Intlayer
|
|
@@ -795,23 +687,21 @@ Intlayer использует расширение модулей (module augmen
|
|
|
795
687
|
|
|
796
688
|
### Расширение VS Code
|
|
797
689
|
|
|
798
|
-
|
|
690
|
+
Чтобы улучшить ваш опыт разработки с Intlayer, вы можете установить официальное расширение **Intlayer VS Code Extension**.
|
|
799
691
|
|
|
800
692
|
[Установить из VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=intlayer.intlayer-vs-code-extension)
|
|
801
693
|
|
|
802
694
|
Это расширение предоставляет:
|
|
803
695
|
|
|
804
|
-
-
|
|
696
|
+
- **Автозаполнение** ключей переводов.
|
|
805
697
|
- **Обнаружение ошибок в реальном времени** для отсутствующих переводов.
|
|
806
|
-
- **Встроенный просмотр**
|
|
807
|
-
- **Быстрые действия** для
|
|
698
|
+
- **Встроенный просмотр** переведённого контента.
|
|
699
|
+
- **Быстрые действия** для лёгкого создания и обновления переводов.
|
|
808
700
|
|
|
809
|
-
Для получения дополнительной информации о том, как использовать расширение, обратитесь к [документации
|
|
701
|
+
Для получения дополнительной информации о том, как использовать расширение, обратитесь к [документации Intlayer VS Code Extension](https://intlayer.org/doc/vs-code-extension).
|
|
810
702
|
|
|
811
703
|
---
|
|
812
704
|
|
|
813
|
-
###
|
|
814
|
-
|
|
815
|
-
Для расширения возможностей вы можете реализовать [визуальный редактор](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/intlayer_visual_editor.md) или вынести ваш контент во внешний [CMS](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/intlayer_CMS.md).
|
|
705
|
+
### Продвинуться дальше
|
|
816
706
|
|
|
817
|
-
|
|
707
|
+
Чтобы продвинуться дальше, вы можете реализовать [визуальный редактор](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/intlayer_visual_editor.md) или вынести ваш контент, используя [CMS](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/intlayer_CMS.md).
|