@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: Как перевести ваше Nuxt
|
|
3
|
+
updatedAt: 2025-12-07
|
|
4
|
+
title: Как перевести ваше приложение Nuxt и Vue – руководство по i18n 2025
|
|
5
5
|
description: Узнайте, как сделать ваш сайт на Nuxt и Vue многоязычным. Следуйте документации для интернационализации (i18n) и перевода.
|
|
6
6
|
keywords:
|
|
7
7
|
- Интернационализация
|
|
@@ -14,32 +14,59 @@ 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: Обновление 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
|
+
<Tab defaultTab="video">
|
|
50
|
+
<TabItem label="Видео" value="video">
|
|
51
|
+
|
|
52
|
+
<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/nhUcUAVQ6eQ?autoplay=0&origin=http://intlayer.org&controls=0&rel=1"/>
|
|
53
|
+
|
|
54
|
+
</TabItem>
|
|
55
|
+
<TabItem label="Код" 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="Демонстрация CodeSandbox - Как интернационализировать ваше приложение с помощью 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
|
+
Смотрите [Шаблон приложения](https://github.com/aymericzip/intlayer-nuxt-4-template) на GitHub.
|
|
69
|
+
|
|
43
70
|
### Шаг 1: Установка зависимостей
|
|
44
71
|
|
|
45
72
|
Установите необходимые пакеты с помощью npm:
|
|
@@ -61,13 +88,13 @@ yarn add --save-dev nuxt-intlayer
|
|
|
61
88
|
|
|
62
89
|
- **intlayer**
|
|
63
90
|
|
|
64
|
-
Основной пакет,
|
|
91
|
+
Основной пакет, предоставляющий инструменты интернационализации для управления конфигурацией, перевода, [объявления контента](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
92
|
|
|
66
93
|
- **vue-intlayer**
|
|
67
|
-
Пакет, который интегрирует Intlayer с приложением Vue. Он
|
|
94
|
+
Пакет, который интегрирует Intlayer с приложением Vue. Он содержит composables для Vue-компонентов.
|
|
68
95
|
|
|
69
96
|
- **nuxt-intlayer**
|
|
70
|
-
Модуль Nuxt, который интегрирует Intlayer с приложениями Nuxt. Он обеспечивает автоматическую настройку,
|
|
97
|
+
Модуль Nuxt, который интегрирует Intlayer с приложениями Nuxt. Он обеспечивает автоматическую настройку, middleware для определения локали, управление cookie и перенаправление URL.
|
|
71
98
|
|
|
72
99
|
### Шаг 2: Конфигурация вашего проекта
|
|
73
100
|
|
|
@@ -86,9 +113,6 @@ const config: IntlayerConfig = {
|
|
|
86
113
|
],
|
|
87
114
|
defaultLocale: Locales.ENGLISH,
|
|
88
115
|
},
|
|
89
|
-
content: {
|
|
90
|
-
contentDir: ["."], // По умолчанию Intlayer будет отслеживать файлы объявления контента из директории `./src`
|
|
91
|
-
},
|
|
92
116
|
};
|
|
93
117
|
|
|
94
118
|
export default config;
|
|
@@ -98,7 +122,6 @@ export default config;
|
|
|
98
122
|
import { Locales } from "intlayer";
|
|
99
123
|
|
|
100
124
|
/** @type {import('intlayer').IntlayerConfig} */
|
|
101
|
-
// Конфигурация Intlayer
|
|
102
125
|
const config = {
|
|
103
126
|
internationalization: {
|
|
104
127
|
locales: [
|
|
@@ -109,9 +132,6 @@ const config = {
|
|
|
109
132
|
],
|
|
110
133
|
defaultLocale: Locales.ENGLISH,
|
|
111
134
|
},
|
|
112
|
-
content: {
|
|
113
|
-
contentDir: ["."], // Каталоги с декларациями контента
|
|
114
|
-
},
|
|
115
135
|
};
|
|
116
136
|
|
|
117
137
|
export default config;
|
|
@@ -121,7 +141,6 @@ export default config;
|
|
|
121
141
|
const { Locales } = require("intlayer");
|
|
122
142
|
|
|
123
143
|
/** @type {import('intlayer').IntlayerConfig} */
|
|
124
|
-
// Конфигурация Intlayer
|
|
125
144
|
const config = {
|
|
126
145
|
internationalization: {
|
|
127
146
|
locales: [
|
|
@@ -132,15 +151,12 @@ const config = {
|
|
|
132
151
|
],
|
|
133
152
|
defaultLocale: Locales.ENGLISH,
|
|
134
153
|
},
|
|
135
|
-
content: {
|
|
136
|
-
contentDir: ["."],
|
|
137
|
-
},
|
|
138
154
|
};
|
|
139
155
|
|
|
140
156
|
module.exports = config;
|
|
141
157
|
```
|
|
142
158
|
|
|
143
|
-
>
|
|
159
|
+
> Через этот конфигурационный файл вы можете настроить локализованные URL, перенаправление через middleware, имена cookie, расположение и расширение ваших деклараций контента, отключить логи Intlayer в консоли и многое другое. Для полного списка доступных параметров обратитесь к [документации по конфигурации](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/configuration.md).
|
|
144
160
|
|
|
145
161
|
### Шаг 3: Интеграция Intlayer в вашу конфигурацию Nuxt
|
|
146
162
|
|
|
@@ -161,239 +177,40 @@ export default defineNuxtConfig({
|
|
|
161
177
|
|
|
162
178
|
Создайте и управляйте вашими декларациями контента для хранения переводов:
|
|
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
|
|
204
|
+
export default content;
|
|
201
205
|
```
|
|
202
206
|
|
|
203
|
-
|
|
204
|
-
import { t } from "intlayer";
|
|
207
|
+
> Ваши декларации контента могут быть определены в любом месте вашего приложения, при условии, что они включены в директорию `contentDir` (по умолчанию, `./src`). И соответствуют расширению файла декларации контента (по умолчанию, `.content.{json,ts,tsx,js,jsx,mjs,mjx,cjs,cjx}`).
|
|
205
208
|
|
|
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;
|
|
209
|
+
> Для получения дополнительной информации обратитесь к [документации по декларации контента](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/dictionary/content_file.md).
|
|
222
210
|
|
|
223
|
-
|
|
224
|
-
```
|
|
211
|
+
### Шаг 5: Использование Intlayer в вашем коде
|
|
225
212
|
|
|
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`:
|
|
213
|
+
Получайте доступ к вашим словарям контента по всему приложению Nuxt, используя композицию `useIntlayer`:
|
|
397
214
|
|
|
398
215
|
```vue fileName="components/HelloWorld.vue"
|
|
399
216
|
<script setup lang="ts">
|
|
@@ -447,81 +264,71 @@ const countRef = ref(0);
|
|
|
447
264
|
Intlayer предлагает различные API для доступа к вашему контенту:
|
|
448
265
|
|
|
449
266
|
- **Синтаксис на основе компонентов** (рекомендуется):
|
|
450
|
-
Используйте синтаксис `<myContent />` или `<Component :is="myContent" />` для
|
|
267
|
+
Используйте синтаксис `<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
268
|
|
|
452
269
|
- **Синтаксис на основе строк**:
|
|
453
|
-
Используйте `{{ myContent }}
|
|
270
|
+
Используйте `{{ myContent }}`, чтобы отобразить контент как простой текст, без поддержки Визуального редактора.
|
|
454
271
|
|
|
455
|
-
- **Синтаксис
|
|
456
|
-
Используйте `<div v-html="myContent"
|
|
272
|
+
- **Синтаксис сырого HTML**:
|
|
273
|
+
Используйте `<div v-html="myContent" />`, чтобы отобразить контент как сырой HTML, без поддержки Визуального редактора.
|
|
457
274
|
|
|
458
275
|
- **Синтаксис деструктуризации**:
|
|
459
|
-
|
|
276
|
+
Композиция `useIntlayer` возвращает Proxy с контентом. Этот прокси можно деструктурировать для доступа к контенту, сохраняя реактивность.
|
|
460
277
|
- Используйте `const content = useIntlayer("myContent");` и `{{ content.myContent }}` / `<content.myContent />`.
|
|
461
|
-
- Или используйте `const { myContent } = useIntlayer("myContent");` и `{{ myContent}}` / `<myContent/>` для деструктуризации
|
|
278
|
+
- Или используйте `const { myContent } = useIntlayer("myContent");` и `{{ myContent}}` / `<myContent/>` для деструктуризации контента.
|
|
462
279
|
|
|
463
280
|
### (Необязательно) Шаг 6: Изменение языка вашего контента
|
|
464
281
|
|
|
465
|
-
|
|
282
|
+
Чтобы изменить язык вашего контента, вы можете использовать функцию `setLocale`, предоставляемую композаблом `useLocale`. Эта функция позволяет установить локаль приложения и обновить контент соответственно.
|
|
466
283
|
|
|
467
|
-
Создайте компонент для переключения между
|
|
284
|
+
Создайте компонент для переключения между языками с помощью `NuxtLink`. **Использование ссылок вместо кнопок для переключения локали — это лучшая практика для SEO и обнаруживаемости страниц**, так как это позволяет поисковым системам сканировать и индексировать все локализованные версии ваших страниц:
|
|
468
285
|
|
|
469
286
|
```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
287
|
<script setup lang="ts">
|
|
481
|
-
import {
|
|
482
|
-
import { getLocaleName } from "intlayer";
|
|
288
|
+
import { getLocaleName, getLocalizedUrl } from "intlayer";
|
|
483
289
|
import { useLocale } from "vue-intlayer";
|
|
484
290
|
|
|
485
|
-
//
|
|
291
|
+
// Nuxt автоматически импортирует useRoute
|
|
292
|
+
const route = useRoute();
|
|
486
293
|
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
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>
|
|
502
309
|
</template>
|
|
310
|
+
```
|
|
503
311
|
|
|
504
|
-
|
|
505
|
-
.locale-switcher {
|
|
506
|
-
margin: 1rem 0;
|
|
507
|
-
}
|
|
312
|
+
> Использование `NuxtLink` с правильными атрибутами `href` (через `getLocalizedUrl`) гарантирует, что поисковые системы смогут обнаружить все языковые варианты ваших страниц. Это предпочтительнее, чем переключение локали только с помощью JavaScript, которое поисковые роботы могут не распознать.
|
|
508
313
|
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
314
|
+
Затем настройте ваш `app.vue` для использования layouts:
|
|
315
|
+
|
|
316
|
+
```vue fileName="app.vue"
|
|
317
|
+
<template>
|
|
318
|
+
<NuxtLayout>
|
|
319
|
+
<NuxtPage />
|
|
320
|
+
</NuxtLayout>
|
|
321
|
+
</template>
|
|
515
322
|
```
|
|
516
323
|
|
|
517
|
-
|
|
324
|
+
### (Необязательно) Шаг 6b: Создайте Layout с навигацией
|
|
518
325
|
|
|
519
|
-
|
|
326
|
+
Layouts в Nuxt позволяют определить общую структуру для ваших страниц. Создайте layout по умолчанию, который включает переключатель локали и навигацию:
|
|
327
|
+
|
|
328
|
+
```vue fileName="layouts/default.vue"
|
|
520
329
|
<script setup lang="ts">
|
|
521
|
-
import
|
|
330
|
+
import Links from "~/components/Links.vue";
|
|
522
331
|
import LocaleSwitcher from "~/components/LocaleSwitcher.vue";
|
|
523
|
-
|
|
524
|
-
const content = useIntlayer("app"); // Создайте связанный файл декларации intlayer
|
|
525
332
|
</script>
|
|
526
333
|
|
|
527
334
|
<template>
|
|
@@ -530,15 +337,20 @@ const content = useIntlayer("app"); // Создайте связанный фа
|
|
|
530
337
|
<LocaleSwitcher />
|
|
531
338
|
</header>
|
|
532
339
|
<main>
|
|
533
|
-
<
|
|
340
|
+
<slot />
|
|
534
341
|
</main>
|
|
342
|
+
|
|
343
|
+
<Links href="/">Главная</Links>
|
|
344
|
+
<Links href="/about">О нас</Links>
|
|
535
345
|
</div>
|
|
536
346
|
</template>
|
|
537
347
|
```
|
|
538
348
|
|
|
539
|
-
|
|
349
|
+
Компонент `Links` (показан ниже) гарантирует, что внутренние навигационные ссылки автоматически локализуются.
|
|
540
350
|
|
|
541
|
-
|
|
351
|
+
### (Необязательно) Шаг 7: Добавьте локализованный роутинг в ваше приложение
|
|
352
|
+
|
|
353
|
+
Nuxt автоматически обрабатывает локализованный роутинг при использовании модуля `nuxt-intlayer`. Это создает маршруты для каждого языка автоматически на основе структуры вашего каталога страниц.
|
|
542
354
|
|
|
543
355
|
Пример:
|
|
544
356
|
|
|
@@ -550,243 +362,295 @@ pages/
|
|
|
550
362
|
└── index.vue → /contact, /fr/contact, /es/contact
|
|
551
363
|
```
|
|
552
364
|
|
|
553
|
-
Чтобы создать
|
|
365
|
+
Чтобы создать локализованные страницы, просто создайте ваши Vue-файлы в директории `pages/`. Вот два примера страниц:
|
|
366
|
+
|
|
367
|
+
**Главная страница (`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
|
+
**Страница "О нас" (`pages/about.vue`):**
|
|
554
392
|
|
|
555
393
|
```vue fileName="pages/about.vue"
|
|
556
394
|
<script setup lang="ts">
|
|
557
395
|
import { useIntlayer } from "vue-intlayer";
|
|
558
396
|
|
|
559
|
-
const content = useIntlayer("about");
|
|
397
|
+
const content = useIntlayer("about-page");
|
|
398
|
+
|
|
399
|
+
useHead({
|
|
400
|
+
title: content.metaTitle.raw, // Используйте .raw для доступа к примитивной строке
|
|
401
|
+
meta: [
|
|
402
|
+
{
|
|
403
|
+
name: "description",
|
|
404
|
+
content: content.metaDescription.raw, // Используйте .raw для доступа к примитивной строке
|
|
405
|
+
},
|
|
406
|
+
],
|
|
407
|
+
});
|
|
560
408
|
</script>
|
|
561
409
|
|
|
562
410
|
<template>
|
|
563
|
-
<
|
|
564
|
-
<h1>{{ content.title }}</h1>
|
|
565
|
-
<p>{{ content.description }}</p>
|
|
566
|
-
</div>
|
|
411
|
+
<h1><content.title /></h1>
|
|
567
412
|
</template>
|
|
568
413
|
```
|
|
569
414
|
|
|
415
|
+
> Примечание: `useHead` автоматически импортируется в Nuxt. Вы можете получать доступ к значениям контента, используя либо `.value` (реактивный), либо `.raw` (примитивная строка), в зависимости от ваших потребностей.
|
|
416
|
+
|
|
570
417
|
Модуль `nuxt-intlayer` автоматически:
|
|
571
418
|
|
|
572
|
-
- Определяет
|
|
573
|
-
- Обрабатывает переключение
|
|
419
|
+
- Определяет предпочитаемую локаль пользователя
|
|
420
|
+
- Обрабатывает переключение локали через URL
|
|
574
421
|
- Устанавливает соответствующий атрибут `<html lang="">`
|
|
575
|
-
- Управляет куки
|
|
422
|
+
- Управляет куки локали
|
|
576
423
|
- Перенаправляет пользователей на соответствующий локализованный URL
|
|
577
424
|
|
|
578
|
-
### (Необязательно) Шаг 8: Создание компонента
|
|
579
|
-
|
|
580
|
-
Чтобы обеспечить навигацию вашего приложения с учетом текущего языка, вы можете создать пользовательский компонент `LocalizedLink`. Этот компонент автоматически добавляет префикс текущего языка к внутренним URL.
|
|
425
|
+
### (Необязательно) Шаг 8: Создание локализованного компонента ссылок
|
|
581
426
|
|
|
582
|
-
|
|
583
|
-
<template>
|
|
584
|
-
<NuxtLink :to="localizedHref" v-bind="$attrs">
|
|
585
|
-
<slot />
|
|
586
|
-
</NuxtLink>
|
|
587
|
-
</template>
|
|
427
|
+
Чтобы навигация вашего приложения учитывала текущую локаль, вы можете создать пользовательский компонент `Links`. Этот компонент автоматически добавляет префикс текущего языка к внутренним URL, что важно для **SEO и обнаруживаемости страниц**.
|
|
588
428
|
|
|
429
|
+
```vue fileName="components/Links.vue"
|
|
589
430
|
<script setup lang="ts">
|
|
590
|
-
import { computed } from "vue";
|
|
591
431
|
import { getLocalizedUrl } from "intlayer";
|
|
592
432
|
import { useLocale } from "vue-intlayer";
|
|
593
433
|
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
},
|
|
599
|
-
});
|
|
434
|
+
interface Props {
|
|
435
|
+
href: string;
|
|
436
|
+
locale?: string;
|
|
437
|
+
}
|
|
600
438
|
|
|
601
|
-
const
|
|
439
|
+
const props = defineProps<Props>();
|
|
602
440
|
|
|
603
|
-
|
|
604
|
-
const isExternalLink = computed(() => /^https?:\/\//.test(props.to || ""));
|
|
441
|
+
const { locale: currentLocale } = useLocale();
|
|
605
442
|
|
|
606
|
-
//
|
|
607
|
-
const
|
|
608
|
-
|
|
609
|
-
);
|
|
443
|
+
// Вычисляем итоговый путь
|
|
444
|
+
const finalPath = computed(() => {
|
|
445
|
+
// 1. Проверяем, является ли ссылка внешней
|
|
446
|
+
const isExternal = /^https?:\/\//.test(props.href || "");
|
|
447
|
+
|
|
448
|
+
// 2. Если внешняя, возвращаем как есть (NuxtLink обрабатывает генерацию тега <a>)
|
|
449
|
+
if (isExternal) return props.href;
|
|
450
|
+
|
|
451
|
+
// 3. Если ссылка внутренняя, локализуем URL
|
|
452
|
+
const targetLocale = props.locale || currentLocale.value;
|
|
453
|
+
return getLocalizedUrl(props.href, targetLocale);
|
|
454
|
+
});
|
|
610
455
|
</script>
|
|
456
|
+
|
|
457
|
+
<template>
|
|
458
|
+
<NuxtLink :to="finalPath" v-bind="$attrs">
|
|
459
|
+
<slot />
|
|
460
|
+
</NuxtLink>
|
|
461
|
+
</template>
|
|
611
462
|
```
|
|
612
463
|
|
|
613
464
|
Затем используйте этот компонент по всему вашему приложению:
|
|
614
465
|
|
|
615
|
-
```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
|
+
|
|
616
472
|
<template>
|
|
617
473
|
<div>
|
|
618
|
-
<
|
|
619
|
-
|
|
620
|
-
</
|
|
621
|
-
<
|
|
622
|
-
|
|
623
|
-
</
|
|
474
|
+
<header>
|
|
475
|
+
<LocaleSwitcher />
|
|
476
|
+
</header>
|
|
477
|
+
<main>
|
|
478
|
+
<slot />
|
|
479
|
+
</main>
|
|
480
|
+
|
|
481
|
+
<Links href="/">Главная</Links>
|
|
482
|
+
<Links href="/about">О нас</Links>
|
|
624
483
|
</div>
|
|
625
484
|
</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
485
|
```
|
|
634
486
|
|
|
635
|
-
|
|
487
|
+
> Используя `NuxtLink` с локализованными путями, вы обеспечиваете:
|
|
488
|
+
>
|
|
489
|
+
> - Поисковые системы могут сканировать и индексировать все языковые версии ваших страниц
|
|
490
|
+
> - Пользователи могут напрямую делиться локализованными URL
|
|
491
|
+
> - История браузера корректно работает с URL, содержащими префикс локали
|
|
492
|
+
|
|
493
|
+
### (Необязательно) Шаг 9: Работа с метаданными и SEO
|
|
636
494
|
|
|
637
|
-
Nuxt предоставляет отличные возможности для SEO. Вы можете использовать Intlayer для обработки локализованных
|
|
495
|
+
Nuxt предоставляет отличные возможности для SEO через композицию `useHead` (автоматически импортируется). Вы можете использовать Intlayer для обработки локализованных метаданных, используя аксессоры `.raw` или `.value` для получения примитивного строкового значения:
|
|
638
496
|
|
|
639
497
|
```vue fileName="pages/about.vue"
|
|
640
498
|
<script setup lang="ts">
|
|
641
|
-
import {
|
|
642
|
-
import { getIntlayer } from "intlayer";
|
|
643
|
-
import { useLocale } from "vue-intlayer";
|
|
499
|
+
import { useIntlayer } from "vue-intlayer";
|
|
644
500
|
|
|
645
|
-
|
|
646
|
-
const content =
|
|
501
|
+
// useHead автоматически импортируется в Nuxt
|
|
502
|
+
const content = useIntlayer("about-page");
|
|
647
503
|
|
|
648
|
-
|
|
649
|
-
title: content.
|
|
650
|
-
|
|
504
|
+
useHead({
|
|
505
|
+
title: content.metaTitle.raw, // Используйте .raw для доступа к примитивной строке
|
|
506
|
+
meta: [
|
|
507
|
+
{
|
|
508
|
+
name: "description",
|
|
509
|
+
content: content.metaDescription.raw, // Используйте .raw для доступа к примитивной строке
|
|
510
|
+
},
|
|
511
|
+
],
|
|
651
512
|
});
|
|
652
513
|
</script>
|
|
653
514
|
|
|
654
515
|
<template>
|
|
655
|
-
<
|
|
656
|
-
<h1>{{ content.pageTitle }}</h1>
|
|
657
|
-
<p>{{ content.pageContent }}</p>
|
|
658
|
-
</div>
|
|
516
|
+
<h1><content.title /></h1>
|
|
659
517
|
</template>
|
|
660
518
|
```
|
|
661
519
|
|
|
520
|
+
> В качестве альтернативы, вы можете использовать функцию `import { getIntlayer } from "intlayer"`, чтобы получить контент без реактивности Vue.
|
|
521
|
+
|
|
522
|
+
> **Доступ к значениям контента:**
|
|
523
|
+
>
|
|
524
|
+
> - Используйте `.raw` для получения примитивного строкового значения (не реактивного)
|
|
525
|
+
> - Используйте `.value` для получения реактивного значения
|
|
526
|
+
> - Используйте синтаксис компонента `<content.key />` для поддержки Визуального Редактора
|
|
527
|
+
|
|
662
528
|
Создайте соответствующее объявление контента:
|
|
663
529
|
|
|
664
|
-
```ts fileName="pages/about-
|
|
530
|
+
```ts fileName="pages/about-page.content.ts" contentDeclarationFormat="typescript"
|
|
665
531
|
import { t, type Dictionary } from "intlayer";
|
|
666
|
-
import type { useSeoMeta } from "nuxt/app";
|
|
667
532
|
|
|
668
|
-
const
|
|
669
|
-
key: "about-
|
|
533
|
+
const aboutPageContent = {
|
|
534
|
+
key: "about-page",
|
|
670
535
|
content: {
|
|
671
|
-
|
|
672
|
-
ru: "О нас - Моя компания",
|
|
536
|
+
metaTitle: t({
|
|
673
537
|
en: "About Us - My Company",
|
|
674
538
|
fr: "À Propos - Ma Société",
|
|
675
539
|
es: "Acerca de Nosotros - Mi Empresa",
|
|
676
540
|
}),
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
en: "Learn more about our company and our mission",
|
|
541
|
+
metaDescription: t({
|
|
542
|
+
en: "Узнайте больше о нашей компании и нашей миссии",
|
|
680
543
|
fr: "En savoir plus sur notre société et notre mission",
|
|
681
544
|
es: "Conozca más sobre nuestra empresa y nuestra misión",
|
|
682
545
|
}),
|
|
546
|
+
title: t({
|
|
547
|
+
en: "О нас",
|
|
548
|
+
fr: "À Propos",
|
|
549
|
+
es: "Acerca de Nosotros",
|
|
550
|
+
}),
|
|
683
551
|
},
|
|
684
|
-
} satisfies Dictionary
|
|
552
|
+
} satisfies Dictionary;
|
|
685
553
|
|
|
686
|
-
export default
|
|
554
|
+
export default aboutPageContent;
|
|
687
555
|
```
|
|
688
556
|
|
|
689
|
-
```
|
|
557
|
+
```javascript fileName="pages/about-page.content.mjs" contentDeclarationFormat="esm"
|
|
690
558
|
import { t } from "intlayer";
|
|
691
559
|
|
|
692
560
|
/** @type {import('intlayer').Dictionary} */
|
|
693
|
-
const
|
|
694
|
-
key: "about-
|
|
561
|
+
const aboutPageContent = {
|
|
562
|
+
key: "about-page",
|
|
695
563
|
content: {
|
|
696
|
-
|
|
697
|
-
zh: "关于我们 - 我的公司",
|
|
564
|
+
metaTitle: t({
|
|
698
565
|
en: "О нас - Моя компания",
|
|
699
566
|
fr: "À Propos - Ma Société",
|
|
700
567
|
es: "Acerca de Nosotros - Mi Empresa",
|
|
701
568
|
}),
|
|
702
|
-
|
|
703
|
-
zh: "了解更多关于我们公司和我们的使命",
|
|
569
|
+
metaDescription: t({
|
|
704
570
|
en: "Узнайте больше о нашей компании и нашей миссии",
|
|
705
571
|
fr: "En savoir plus sur notre société et notre mission",
|
|
706
572
|
es: "Conozca más sobre nuestra empresa y nuestra misión",
|
|
707
573
|
}),
|
|
574
|
+
title: t({
|
|
575
|
+
en: "О нас",
|
|
576
|
+
fr: "À Propos",
|
|
577
|
+
es: "Acerca de Nosotros",
|
|
578
|
+
}),
|
|
708
579
|
},
|
|
709
580
|
};
|
|
710
581
|
|
|
711
|
-
export default
|
|
582
|
+
export default aboutPageContent;
|
|
712
583
|
```
|
|
713
584
|
|
|
714
|
-
```
|
|
585
|
+
```javascript fileName="pages/about-page.content.cjs" contentDeclarationFormat="commonjs"
|
|
715
586
|
const { t } = require("intlayer");
|
|
716
587
|
|
|
717
588
|
/** @type {import('intlayer').Dictionary} */
|
|
718
|
-
const
|
|
719
|
-
key: "about-
|
|
589
|
+
const aboutPageContent = {
|
|
590
|
+
key: "about-page",
|
|
720
591
|
content: {
|
|
721
|
-
|
|
722
|
-
zh: "关于我们 - 我的公司",
|
|
592
|
+
metaTitle: t({
|
|
723
593
|
en: "О нас - Моя компания",
|
|
724
594
|
fr: "À Propos - Ma Société",
|
|
725
595
|
es: "Acerca de Nosotros - Mi Empresa",
|
|
726
596
|
}),
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
en: "Узнайте больше о нашей компании и нашей миссии",
|
|
597
|
+
metaDescription: t({
|
|
598
|
+
en: "Learn more about our company and our mission",
|
|
730
599
|
fr: "En savoir plus sur notre société et notre mission",
|
|
731
600
|
es: "Conozca más sobre nuestra empresa y nuestra misión",
|
|
601
|
+
ru: "Узнайте больше о нашей компании и нашей миссии",
|
|
602
|
+
}),
|
|
603
|
+
title: t({
|
|
604
|
+
en: "About Us",
|
|
605
|
+
fr: "À Propos",
|
|
606
|
+
es: "Acerca de Nosotros",
|
|
607
|
+
ru: "О нас",
|
|
732
608
|
}),
|
|
733
609
|
},
|
|
734
610
|
};
|
|
735
611
|
|
|
736
|
-
module.exports =
|
|
612
|
+
module.exports = aboutPageContent;
|
|
737
613
|
```
|
|
738
614
|
|
|
739
|
-
```json fileName="pages/about-
|
|
615
|
+
```json fileName="pages/about-page.content.json" contentDeclarationFormat="json"
|
|
740
616
|
{
|
|
741
|
-
"
|
|
617
|
+
"$schema": "https://intlayer.org/schema.json",
|
|
618
|
+
"key": "about-page",
|
|
742
619
|
"content": {
|
|
743
|
-
"
|
|
620
|
+
"metaTitle": {
|
|
744
621
|
"nodeType": "translation",
|
|
745
|
-
"
|
|
746
|
-
"
|
|
747
|
-
"en": "О нас - Моя компания",
|
|
622
|
+
"translation": {
|
|
623
|
+
"en": "About Us - My Company",
|
|
748
624
|
"fr": "À Propos - Ma Société",
|
|
749
|
-
"es": "Acerca de Nosotros - Mi Empresa"
|
|
625
|
+
"es": "Acerca de Nosotros - Mi Empresa",
|
|
626
|
+
"ru": "О нас - Моя компания"
|
|
750
627
|
}
|
|
751
628
|
},
|
|
752
|
-
"
|
|
629
|
+
"metaDescription": {
|
|
753
630
|
"nodeType": "translation",
|
|
754
|
-
"
|
|
755
|
-
"
|
|
756
|
-
"en": "Learn more about our company and our mission",
|
|
631
|
+
"translation": {
|
|
632
|
+
"en": "Узнайте больше о нашей компании и нашей миссии",
|
|
757
633
|
"fr": "En savoir plus sur notre société et notre mission",
|
|
758
634
|
"es": "Conozca más sobre nuestra empresa y nuestra misión"
|
|
759
635
|
}
|
|
636
|
+
},
|
|
637
|
+
"title": {
|
|
638
|
+
"nodeType": "translation",
|
|
639
|
+
"translation": {
|
|
640
|
+
"en": "О нас",
|
|
641
|
+
"fr": "À Propos",
|
|
642
|
+
"es": "Acerca de Nosotros"
|
|
643
|
+
}
|
|
760
644
|
}
|
|
761
645
|
}
|
|
762
646
|
}
|
|
763
647
|
```
|
|
764
648
|
|
|
765
|
-
### Настройка TypeScript
|
|
766
|
-
|
|
767
|
-
Intlayer использует расширение модулей (module augmentation), чтобы использовать преимущества TypeScript и сделать вашу кодовую базу более надежной.
|
|
768
|
-
|
|
769
|
-

|
|
770
|
-
|
|
771
|
-

|
|
772
|
-
|
|
773
|
-
Убедитесь, что ваша конфигурация TypeScript включает автоматически сгенерированные типы.
|
|
774
|
-
|
|
775
|
-
```json5 fileName="tsconfig.json"
|
|
776
|
-
{
|
|
777
|
-
// ... Ваши существующие настройки TypeScript
|
|
778
|
-
"include": [
|
|
779
|
-
// ... Ваши существующие конфигурации TypeScript
|
|
780
|
-
".intlayer/**/*.ts", // Включить автоматически сгенерированные типы
|
|
781
|
-
],
|
|
782
|
-
}
|
|
783
|
-
```
|
|
784
|
-
|
|
785
649
|
### Конфигурация Git
|
|
786
650
|
|
|
787
|
-
Рекомендуется игнорировать файлы, сгенерированные Intlayer. Это позволит избежать их коммита в ваш
|
|
651
|
+
Рекомендуется игнорировать файлы, сгенерированные Intlayer. Это позволит избежать их коммита в ваш Git-репозиторий.
|
|
788
652
|
|
|
789
|
-
Для этого вы можете добавить следующие инструкции в файл `.gitignore`:
|
|
653
|
+
Для этого вы можете добавить следующие инструкции в ваш файл `.gitignore`:
|
|
790
654
|
|
|
791
655
|
```plaintext fileName=".gitignore"
|
|
792
656
|
# Игнорировать файлы, сгенерированные Intlayer
|
|
@@ -795,23 +659,21 @@ Intlayer использует расширение модулей (module augmen
|
|
|
795
659
|
|
|
796
660
|
### Расширение VS Code
|
|
797
661
|
|
|
798
|
-
|
|
662
|
+
Чтобы улучшить ваш опыт разработки с Intlayer, вы можете установить официальное расширение **Intlayer VS Code Extension**.
|
|
799
663
|
|
|
800
664
|
[Установить из VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=intlayer.intlayer-vs-code-extension)
|
|
801
665
|
|
|
802
666
|
Это расширение предоставляет:
|
|
803
667
|
|
|
804
|
-
-
|
|
668
|
+
- **Автозаполнение** ключей переводов.
|
|
805
669
|
- **Обнаружение ошибок в реальном времени** для отсутствующих переводов.
|
|
806
|
-
- **Встроенный просмотр**
|
|
807
|
-
- **Быстрые действия** для
|
|
670
|
+
- **Встроенный просмотр** переведённого контента.
|
|
671
|
+
- **Быстрые действия** для лёгкого создания и обновления переводов.
|
|
808
672
|
|
|
809
|
-
Для получения дополнительной информации о том, как использовать расширение, обратитесь к [документации
|
|
673
|
+
Для получения дополнительной информации о том, как использовать расширение, обратитесь к [документации Intlayer VS Code Extension](https://intlayer.org/doc/vs-code-extension).
|
|
810
674
|
|
|
811
675
|
---
|
|
812
676
|
|
|
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).
|
|
677
|
+
### Продвинуться дальше
|
|
816
678
|
|
|
817
|
-
|
|
679
|
+
Чтобы продвинуться дальше, вы можете реализовать [визуальный редактор](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).
|