@intlayer/docs 6.1.6-canary.0 → 6.1.6
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/blog/en/next-i18next_vs_next-intl_vs_intlayer.md +71 -80
- package/dist/cjs/generated/docs.entry.cjs +16 -0
- package/dist/cjs/generated/docs.entry.cjs.map +1 -1
- package/dist/esm/generated/docs.entry.mjs +16 -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_angular.md +2 -2
- package/docs/ar/intlayer_with_astro.md +246 -0
- package/docs/ar/intlayer_with_create_react_app.md +3 -2
- package/docs/ar/intlayer_with_express.md +2 -2
- package/docs/ar/intlayer_with_nestjs.md +2 -2
- package/docs/ar/intlayer_with_nextjs_14.md +2 -2
- package/docs/ar/intlayer_with_nextjs_15.md +2 -2
- package/docs/ar/intlayer_with_nextjs_page_router.md +2 -2
- package/docs/ar/intlayer_with_nuxt.md +2 -2
- package/docs/ar/intlayer_with_react_native+expo.md +11 -20
- package/docs/ar/intlayer_with_react_router_v7.md +195 -241
- package/docs/ar/intlayer_with_tanstack.md +198 -272
- package/docs/ar/intlayer_with_vite+preact.md +9 -9
- package/docs/ar/intlayer_with_vite+react.md +7 -7
- package/docs/ar/intlayer_with_vite+vue.md +9 -9
- package/docs/de/intlayer_with_angular.md +2 -2
- package/docs/de/intlayer_with_astro.md +246 -0
- package/docs/de/intlayer_with_create_react_app.md +2 -2
- package/docs/de/intlayer_with_express.md +2 -2
- package/docs/de/intlayer_with_nestjs.md +2 -2
- package/docs/de/intlayer_with_nextjs_14.md +2 -2
- package/docs/de/intlayer_with_nextjs_15.md +2 -2
- package/docs/de/intlayer_with_nextjs_page_router.md +2 -2
- package/docs/de/intlayer_with_nuxt.md +2 -2
- package/docs/de/intlayer_with_react_native+expo.md +11 -20
- package/docs/de/intlayer_with_react_router_v7.md +193 -242
- package/docs/de/intlayer_with_tanstack.md +194 -266
- package/docs/de/intlayer_with_vite+preact.md +9 -9
- package/docs/de/intlayer_with_vite+react.md +9 -9
- package/docs/de/intlayer_with_vite+vue.md +11 -11
- package/docs/de/packages/vite-intlayer/index.md +3 -3
- package/docs/en/how_works_intlayer.md +1 -1
- package/docs/en/index.md +1 -1
- package/docs/en/intlayer_cli.md +1 -1
- package/docs/en/intlayer_with_angular.md +4 -4
- package/docs/en/intlayer_with_astro.md +246 -0
- package/docs/en/intlayer_with_create_react_app.md +4 -4
- package/docs/en/intlayer_with_express.md +3 -3
- package/docs/en/intlayer_with_lynx+react.md +1 -1
- package/docs/en/intlayer_with_nestjs.md +2 -2
- package/docs/en/intlayer_with_nextjs_14.md +13 -4
- package/docs/en/intlayer_with_nextjs_15.md +13 -4
- package/docs/en/intlayer_with_nextjs_page_router.md +5 -5
- package/docs/en/intlayer_with_nuxt.md +4 -4
- package/docs/en/intlayer_with_react_native+expo.md +46 -24
- package/docs/en/intlayer_with_react_router_v7.md +164 -211
- package/docs/en/intlayer_with_tanstack.md +166 -241
- package/docs/en/intlayer_with_vite+preact.md +12 -12
- package/docs/en/intlayer_with_vite+react.md +12 -12
- package/docs/en/intlayer_with_vite+solid.md +2 -2
- package/docs/en/intlayer_with_vite+svelte.md +2 -2
- package/docs/en/intlayer_with_vite+vue.md +12 -12
- package/docs/en/introduction.md +1 -1
- package/docs/en/packages/next-intlayer/useDictionary.md +1 -1
- package/docs/en/packages/next-intlayer/useIntlayer.md +1 -1
- package/docs/en/packages/react-intlayer/useDictionary.md +1 -1
- package/docs/en/packages/react-intlayer/useI18n.md +1 -1
- package/docs/en/packages/react-intlayer/useIntlayer.md +1 -1
- package/docs/en/releases/v6.md +1 -0
- package/docs/en/roadmap.md +1 -1
- package/docs/en-GB/intlayer_with_angular.md +3 -3
- package/docs/en-GB/intlayer_with_astro.md +246 -0
- package/docs/en-GB/intlayer_with_create_react_app.md +5 -4
- package/docs/en-GB/intlayer_with_express.md +2 -2
- package/docs/en-GB/intlayer_with_nestjs.md +2 -2
- package/docs/en-GB/intlayer_with_nextjs_14.md +4 -4
- package/docs/en-GB/intlayer_with_nextjs_15.md +2 -2
- package/docs/en-GB/intlayer_with_nextjs_page_router.md +2 -2
- package/docs/en-GB/intlayer_with_nuxt.md +2 -2
- package/docs/en-GB/intlayer_with_react_native+expo.md +11 -20
- package/docs/en-GB/intlayer_with_react_router_v7.md +171 -220
- package/docs/en-GB/intlayer_with_tanstack.md +174 -248
- package/docs/en-GB/intlayer_with_vite+preact.md +9 -9
- package/docs/en-GB/intlayer_with_vite+react.md +9 -9
- package/docs/en-GB/intlayer_with_vite+vue.md +11 -11
- package/docs/en-GB/packages/next-intlayer/useIntlayer.md +1 -1
- package/docs/en-GB/packages/react-intlayer/useIntlayer.md +1 -1
- package/docs/es/intlayer_with_angular.md +2 -2
- package/docs/es/intlayer_with_astro.md +246 -0
- package/docs/es/intlayer_with_create_react_app.md +3 -2
- package/docs/es/intlayer_with_express.md +2 -2
- package/docs/es/intlayer_with_nextjs_14.md +2 -2
- package/docs/es/intlayer_with_nextjs_15.md +2 -2
- package/docs/es/intlayer_with_react_native+expo.md +11 -20
- package/docs/es/intlayer_with_react_router_v7.md +188 -232
- package/docs/es/intlayer_with_tanstack.md +203 -273
- package/docs/es/intlayer_with_vite+preact.md +7 -7
- package/docs/es/intlayer_with_vite+react.md +7 -7
- package/docs/es/intlayer_with_vite+vue.md +9 -9
- package/docs/fr/intlayer_with_angular.md +2 -2
- package/docs/fr/intlayer_with_astro.md +246 -0
- package/docs/fr/intlayer_with_create_react_app.md +3 -2
- package/docs/fr/intlayer_with_express.md +2 -2
- package/docs/fr/intlayer_with_nestjs.md +2 -2
- package/docs/fr/intlayer_with_nextjs_14.md +2 -2
- package/docs/fr/intlayer_with_react_native+expo.md +11 -20
- package/docs/fr/intlayer_with_react_router_v7.md +188 -248
- package/docs/fr/intlayer_with_tanstack.md +192 -265
- package/docs/fr/intlayer_with_vite+preact.md +7 -7
- package/docs/fr/intlayer_with_vite+react.md +7 -7
- package/docs/fr/intlayer_with_vite+vue.md +9 -9
- package/docs/hi/intlayer_cli.md +1 -4
- package/docs/hi/intlayer_with_angular.md +2 -2
- package/docs/hi/intlayer_with_astro.md +246 -0
- package/docs/hi/intlayer_with_create_react_app.md +2 -2
- package/docs/hi/intlayer_with_express.md +2 -2
- package/docs/hi/intlayer_with_nestjs.md +2 -2
- package/docs/hi/intlayer_with_nextjs_14.md +2 -2
- package/docs/hi/intlayer_with_nextjs_15.md +2 -2
- package/docs/hi/intlayer_with_nextjs_page_router.md +2 -2
- package/docs/hi/intlayer_with_nuxt.md +2 -2
- package/docs/hi/intlayer_with_react_native+expo.md +11 -20
- package/docs/hi/intlayer_with_react_router_v7.md +199 -243
- package/docs/hi/intlayer_with_tanstack.md +210 -285
- package/docs/hi/intlayer_with_vite+preact.md +9 -9
- package/docs/hi/intlayer_with_vite+react.md +9 -9
- package/docs/hi/intlayer_with_vite+solid.md +1 -1
- package/docs/hi/intlayer_with_vite+vue.md +11 -11
- package/docs/it/intlayer_with_angular.md +2 -2
- package/docs/it/intlayer_with_astro.md +246 -0
- package/docs/it/intlayer_with_create_react_app.md +3 -2
- package/docs/it/intlayer_with_express.md +2 -2
- package/docs/it/intlayer_with_nestjs.md +2 -2
- package/docs/it/intlayer_with_nextjs_14.md +2 -2
- package/docs/it/intlayer_with_nextjs_15.md +2 -2
- package/docs/it/intlayer_with_nextjs_page_router.md +2 -2
- package/docs/it/intlayer_with_nuxt.md +2 -2
- package/docs/it/intlayer_with_react_native+expo.md +11 -21
- package/docs/it/intlayer_with_react_router_v7.md +195 -242
- package/docs/it/intlayer_with_tanstack.md +203 -267
- package/docs/it/intlayer_with_vite+preact.md +9 -9
- package/docs/it/intlayer_with_vite+react.md +13 -11
- package/docs/it/intlayer_with_vite+vue.md +11 -11
- package/docs/ja/intlayer_with_angular.md +2 -2
- package/docs/ja/intlayer_with_astro.md +246 -0
- package/docs/ja/intlayer_with_create_react_app.md +3 -2
- package/docs/ja/intlayer_with_express.md +2 -2
- package/docs/ja/intlayer_with_nestjs.md +2 -2
- package/docs/ja/intlayer_with_nextjs_14.md +2 -2
- package/docs/ja/intlayer_with_nextjs_15.md +2 -2
- package/docs/ja/intlayer_with_nextjs_page_router.md +2 -2
- package/docs/ja/intlayer_with_nuxt.md +2 -2
- package/docs/ja/intlayer_with_react_native+expo.md +18 -29
- package/docs/ja/intlayer_with_react_router_v7.md +204 -250
- package/docs/ja/intlayer_with_tanstack.md +218 -286
- package/docs/ja/intlayer_with_vite+preact.md +9 -9
- package/docs/ja/intlayer_with_vite+react.md +11 -11
- package/docs/ja/intlayer_with_vite+vue.md +11 -11
- package/docs/ko/intlayer_with_angular.md +2 -2
- package/docs/ko/intlayer_with_astro.md +246 -0
- package/docs/ko/intlayer_with_create_react_app.md +3 -2
- package/docs/ko/intlayer_with_express.md +2 -2
- package/docs/ko/intlayer_with_nestjs.md +2 -2
- package/docs/ko/intlayer_with_nextjs_14.md +2 -2
- package/docs/ko/intlayer_with_nextjs_15.md +2 -2
- package/docs/ko/intlayer_with_nextjs_page_router.md +2 -2
- package/docs/ko/intlayer_with_nuxt.md +2 -2
- package/docs/ko/intlayer_with_react_native+expo.md +19 -28
- package/docs/ko/intlayer_with_react_router_v7.md +190 -244
- package/docs/ko/intlayer_with_tanstack.md +200 -270
- package/docs/ko/intlayer_with_vite+preact.md +9 -9
- package/docs/ko/intlayer_with_vite+react.md +9 -9
- package/docs/ko/intlayer_with_vite+vue.md +11 -11
- package/docs/pt/intlayer_with_angular.md +2 -2
- package/docs/pt/intlayer_with_astro.md +246 -0
- package/docs/pt/intlayer_with_create_react_app.md +3 -2
- package/docs/pt/intlayer_with_express.md +2 -2
- package/docs/pt/intlayer_with_nestjs.md +2 -2
- package/docs/pt/intlayer_with_nextjs_14.md +2 -2
- package/docs/pt/intlayer_with_nextjs_15.md +2 -2
- package/docs/pt/intlayer_with_nextjs_page_router.md +2 -2
- package/docs/pt/intlayer_with_nuxt.md +2 -2
- package/docs/pt/intlayer_with_react_native+expo.md +11 -20
- package/docs/pt/intlayer_with_react_router_v7.md +7 -13
- package/docs/pt/intlayer_with_tanstack.md +183 -258
- package/docs/pt/intlayer_with_vite+preact.md +9 -9
- package/docs/pt/intlayer_with_vite+react.md +9 -9
- package/docs/pt/intlayer_with_vite+vue.md +9 -9
- package/docs/ru/intlayer_with_angular.md +2 -2
- package/docs/ru/intlayer_with_astro.md +246 -0
- package/docs/ru/intlayer_with_create_react_app.md +3 -2
- package/docs/ru/intlayer_with_express.md +2 -2
- package/docs/ru/intlayer_with_nestjs.md +2 -2
- package/docs/ru/intlayer_with_nextjs_14.md +2 -2
- package/docs/ru/intlayer_with_nextjs_15.md +2 -2
- package/docs/ru/intlayer_with_nextjs_page_router.md +2 -2
- package/docs/ru/intlayer_with_nuxt.md +2 -2
- package/docs/ru/intlayer_with_react_native+expo.md +11 -20
- package/docs/ru/intlayer_with_react_router_v7.md +192 -238
- package/docs/ru/intlayer_with_tanstack.md +197 -269
- package/docs/ru/intlayer_with_vite+preact.md +9 -9
- package/docs/ru/intlayer_with_vite+react.md +9 -9
- package/docs/ru/intlayer_with_vite+vue.md +11 -11
- package/docs/tr/how_works_intlayer.md +1 -1
- package/docs/tr/index.md +1 -1
- package/docs/tr/intlayer_cli.md +1 -1
- package/docs/tr/intlayer_with_angular.md +4 -4
- package/docs/tr/intlayer_with_astro.md +246 -0
- package/docs/tr/intlayer_with_create_react_app.md +4 -4
- package/docs/tr/intlayer_with_express.md +3 -3
- package/docs/tr/intlayer_with_lynx+react.md +1 -1
- package/docs/tr/intlayer_with_nestjs.md +2 -2
- package/docs/tr/intlayer_with_nextjs_14.md +2 -2
- package/docs/tr/intlayer_with_nextjs_15.md +4 -4
- package/docs/tr/intlayer_with_nextjs_page_router.md +5 -5
- package/docs/tr/intlayer_with_nuxt.md +4 -4
- package/docs/tr/intlayer_with_react_native+expo.md +12 -21
- package/docs/tr/intlayer_with_react_router_v7.md +222 -267
- package/docs/tr/intlayer_with_tanstack.md +400 -303
- package/docs/tr/intlayer_with_vite+preact.md +12 -12
- package/docs/tr/intlayer_with_vite+react.md +12 -12
- package/docs/tr/intlayer_with_vite+solid.md +2 -2
- package/docs/tr/intlayer_with_vite+svelte.md +2 -2
- package/docs/tr/intlayer_with_vite+vue.md +12 -12
- package/docs/tr/introduction.md +1 -1
- package/docs/tr/packages/react-intlayer/useDictionary.md +1 -1
- package/docs/tr/packages/react-intlayer/useI18n.md +1 -1
- package/docs/tr/roadmap.md +1 -1
- package/docs/zh/intlayer_with_angular.md +2 -2
- package/docs/zh/intlayer_with_astro.md +246 -0
- package/docs/zh/intlayer_with_create_react_app.md +3 -2
- package/docs/zh/intlayer_with_express.md +2 -2
- package/docs/zh/intlayer_with_nestjs.md +2 -2
- package/docs/zh/intlayer_with_nextjs_14.md +2 -2
- package/docs/zh/intlayer_with_nextjs_15.md +2 -2
- package/docs/zh/intlayer_with_nextjs_page_router.md +2 -2
- package/docs/zh/intlayer_with_nuxt.md +2 -2
- package/docs/zh/intlayer_with_react_native+expo.md +19 -28
- package/docs/zh/intlayer_with_react_router_v7.md +200 -248
- package/docs/zh/intlayer_with_tanstack.md +208 -283
- package/docs/zh/intlayer_with_vite+preact.md +9 -9
- package/docs/zh/intlayer_with_vite+react.md +9 -9
- package/docs/zh/intlayer_with_vite+vue.md +9 -9
- package/package.json +11 -11
- package/src/generated/docs.entry.ts +16 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
createdAt: 2025-09-04
|
|
3
|
-
updatedAt: 2025-
|
|
3
|
+
updatedAt: 2025-10-03
|
|
4
4
|
title: Начало работы с Intlayer в React Router v7
|
|
5
5
|
description: Узнайте, как добавить интернационализацию (i18n) в ваше приложение на React Router v7 с помощью Intlayer. Следуйте этому подробному руководству, чтобы сделать ваше приложение многоязычным с маршрутизацией, учитывающей локаль.
|
|
6
6
|
keywords:
|
|
@@ -17,8 +17,7 @@ slugs:
|
|
|
17
17
|
- environment
|
|
18
18
|
- vite-and-react
|
|
19
19
|
- react-router-v7
|
|
20
|
-
applicationTemplate: https://github.com/
|
|
21
|
-
author: AydinTheFirst
|
|
20
|
+
applicationTemplate: https://github.com/aymericzip/intlayer-react-router-v7-template
|
|
22
21
|
---
|
|
23
22
|
|
|
24
23
|
# Начало работы с интернационализацией (i18n) с Intlayer и React Router v7
|
|
@@ -27,15 +26,15 @@ author: AydinTheFirst
|
|
|
27
26
|
|
|
28
27
|
## Что такое Intlayer?
|
|
29
28
|
|
|
30
|
-
**Intlayer** — это инновационная, открытая библиотека интернационализации (i18n),
|
|
29
|
+
**Intlayer** — это инновационная, открытая библиотека интернационализации (i18n), созданная для упрощения поддержки многоязычности в современных веб-приложениях.
|
|
31
30
|
|
|
32
31
|
С помощью Intlayer вы можете:
|
|
33
32
|
|
|
34
33
|
- **Легко управлять переводами** с использованием декларативных словарей на уровне компонентов.
|
|
35
34
|
- **Динамически локализовать метаданные**, маршруты и контент.
|
|
36
|
-
- **Обеспечить поддержку TypeScript** с
|
|
35
|
+
- **Обеспечить поддержку TypeScript** с автогенерируемыми типами, улучшая автодополнение и обнаружение ошибок.
|
|
37
36
|
- **Воспользоваться расширенными возможностями**, такими как динамическое определение и переключение локали.
|
|
38
|
-
-
|
|
37
|
+
- **Включить маршрутизацию с учетом локали** с помощью системы маршрутизации на основе конфигурации React Router v7.
|
|
39
38
|
|
|
40
39
|
---
|
|
41
40
|
|
|
@@ -65,7 +64,7 @@ pnpm add vite-intlayer --save-dev
|
|
|
65
64
|
Пакет, который интегрирует Intlayer с приложением React. Он предоставляет провайдеры контекста и хуки для интернационализации в React.
|
|
66
65
|
|
|
67
66
|
- **vite-intlayer**
|
|
68
|
-
Включает плагин Vite для интеграции Intlayer с [сборщиком Vite](https://vite.dev/guide/why.html#why-bundle-for-production), а также
|
|
67
|
+
Включает плагин Vite для интеграции Intlayer с [сборщиком Vite](https://vite.dev/guide/why.html#why-bundle-for-production), а также промежуточное ПО для определения предпочтительной локали пользователя, управления куки и обработки перенаправления URL.
|
|
69
68
|
|
|
70
69
|
### Шаг 2: Конфигурация вашего проекта
|
|
71
70
|
|
|
@@ -76,11 +75,8 @@ import { type IntlayerConfig, Locales } from "intlayer";
|
|
|
76
75
|
|
|
77
76
|
const config: IntlayerConfig = {
|
|
78
77
|
internationalization: {
|
|
79
|
-
defaultLocale: Locales.ENGLISH,
|
|
80
|
-
locales: [Locales.ENGLISH, Locales.
|
|
81
|
-
},
|
|
82
|
-
middleware: {
|
|
83
|
-
prefixDefault: true, // Всегда добавлять префикс для языка по умолчанию в URL
|
|
78
|
+
defaultLocale: Locales.ENGLISH, // Язык по умолчанию
|
|
79
|
+
locales: [Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH], // Поддерживаемые языки
|
|
84
80
|
},
|
|
85
81
|
};
|
|
86
82
|
|
|
@@ -93,11 +89,8 @@ import { Locales } from "intlayer";
|
|
|
93
89
|
/** @type {import('intlayer').IntlayerConfig} */
|
|
94
90
|
const config = {
|
|
95
91
|
internationalization: {
|
|
96
|
-
defaultLocale: Locales.ENGLISH,
|
|
97
|
-
locales: [Locales.ENGLISH, Locales.
|
|
98
|
-
},
|
|
99
|
-
middleware: {
|
|
100
|
-
prefixDefault: true,
|
|
92
|
+
defaultLocale: Locales.ENGLISH, // Язык по умолчанию
|
|
93
|
+
locales: [Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH], // Поддерживаемые языки
|
|
101
94
|
},
|
|
102
95
|
};
|
|
103
96
|
|
|
@@ -110,82 +103,76 @@ const { Locales } = require("intlayer");
|
|
|
110
103
|
/** @type {import('intlayer').IntlayerConfig} */
|
|
111
104
|
const config = {
|
|
112
105
|
internationalization: {
|
|
113
|
-
defaultLocale: Locales.ENGLISH,
|
|
114
|
-
locales: [Locales.ENGLISH, Locales.
|
|
115
|
-
},
|
|
116
|
-
middleware: {
|
|
117
|
-
prefixDefault: true,
|
|
106
|
+
defaultLocale: Locales.ENGLISH, // Язык по умолчанию
|
|
107
|
+
locales: [Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH], // Поддерживаемые языки
|
|
118
108
|
},
|
|
119
109
|
};
|
|
120
110
|
|
|
121
111
|
module.exports = config;
|
|
122
112
|
```
|
|
123
113
|
|
|
124
|
-
> С помощью этого файла конфигурации вы можете настроить локализованные URL
|
|
125
|
-
|
|
126
|
-
### Шаг 3: Настройка маршрутов React Router v7
|
|
127
|
-
|
|
128
|
-
Настройте конфигурацию маршрутизации с учетом локализации:
|
|
129
|
-
|
|
130
|
-
```typescript fileName="app/routes.ts" codeFormat="typescript"
|
|
131
|
-
import { layout, route, type RouteConfig } from "@react-router/dev/routes";
|
|
132
|
-
|
|
133
|
-
export default [
|
|
134
|
-
layout("routes/layout.tsx", [
|
|
135
|
-
route("/", "routes/page.tsx"), // Корневая страница - перенаправляет на локаль
|
|
136
|
-
route("/:lang", "routes/[lang]/page.tsx"), // Локализованная главная страница
|
|
137
|
-
route("/:lang/about", "routes/[lang]/about/page.tsx"), // Локализованная страница "О нас"
|
|
138
|
-
]),
|
|
139
|
-
] satisfies RouteConfig;
|
|
140
|
-
```
|
|
114
|
+
> С помощью этого файла конфигурации вы можете настроить локализованные URL-адреса, перенаправления в middleware, имена cookie, расположение и расширение ваших деклараций контента, отключить логи Intlayer в консоли и многое другое. Для полного списка доступных параметров обратитесь к [документации по конфигурации](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/configuration.md).
|
|
141
115
|
|
|
142
|
-
### Шаг
|
|
116
|
+
### Шаг 3: Интеграция Intlayer в вашу конфигурацию Vite
|
|
143
117
|
|
|
144
118
|
Добавьте плагин intlayer в вашу конфигурацию:
|
|
145
119
|
|
|
146
|
-
```typescript fileName="vite.config.ts"
|
|
120
|
+
```typescript fileName="vite.config.ts"
|
|
147
121
|
import { reactRouter } from "@react-router/dev/vite";
|
|
148
122
|
import { defineConfig } from "vite";
|
|
149
|
-
import {
|
|
123
|
+
import { intlayer } from "vite-intlayer";
|
|
150
124
|
import tsconfigPaths from "vite-tsconfig-paths";
|
|
151
125
|
|
|
152
126
|
export default defineConfig({
|
|
153
|
-
plugins: [
|
|
154
|
-
reactRouter(),
|
|
155
|
-
tsconfigPaths(),
|
|
156
|
-
intlayer(),
|
|
157
|
-
intlayerMiddlewarePlugin(),
|
|
158
|
-
],
|
|
127
|
+
plugins: [reactRouter(), tsconfigPaths(), intlayer()],
|
|
159
128
|
});
|
|
160
129
|
```
|
|
161
130
|
|
|
162
|
-
> Плагин Vite `intlayer()` используется для интеграции Intlayer с Vite. Он обеспечивает сборку файлов деклараций контента и отслеживает их в режиме разработки.
|
|
131
|
+
> Плагин Vite `intlayer()` используется для интеграции Intlayer с Vite. Он обеспечивает сборку файлов деклараций контента и отслеживает их в режиме разработки. Определяет переменные окружения Intlayer внутри приложения Vite. Кроме того, предоставляет алиасы для оптимизации производительности.
|
|
163
132
|
|
|
164
|
-
### Шаг
|
|
133
|
+
### Шаг 4: Настройка маршрутов React Router v7
|
|
165
134
|
|
|
166
|
-
Настройте
|
|
135
|
+
Настройте конфигурацию маршрутов с учетом локализации:
|
|
167
136
|
|
|
168
|
-
|
|
137
|
+
```typescript fileName="app/routes.ts"
|
|
138
|
+
import { layout, route, type RouteConfig } from "@react-router/dev/routes";
|
|
169
139
|
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
140
|
+
export default [
|
|
141
|
+
layout("routes/layout.tsx", [
|
|
142
|
+
route("/:lang?", "routes/page.tsx"), // Локализованная главная страница
|
|
143
|
+
route("/:lang?/about", "routes/about/page.tsx"), // Локализованная страница "О нас"
|
|
144
|
+
]),
|
|
145
|
+
] satisfies RouteConfig;
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
### Шаг 5: Создайте компоненты Layout
|
|
149
|
+
|
|
150
|
+
Настройте корневой layout и layout для конкретных локалей:
|
|
151
|
+
|
|
152
|
+
#### Корневой Layout
|
|
153
|
+
|
|
154
|
+
```tsx fileName="app/routes/layout.tsx"
|
|
173
155
|
import { IntlayerProvider } from "react-intlayer";
|
|
156
|
+
import { Outlet } from "react-router";
|
|
157
|
+
|
|
158
|
+
import type { Route } from "./+types/layout";
|
|
159
|
+
|
|
160
|
+
export default function RootLayout({ params }: Route.ComponentProps) {
|
|
161
|
+
const { locale } = params;
|
|
174
162
|
|
|
175
|
-
export default function RootLayout() {
|
|
176
163
|
return (
|
|
177
|
-
<IntlayerProvider>
|
|
164
|
+
<IntlayerProvider locale={locale}>
|
|
178
165
|
<Outlet />
|
|
179
166
|
</IntlayerProvider>
|
|
180
167
|
);
|
|
181
168
|
}
|
|
182
169
|
```
|
|
183
170
|
|
|
184
|
-
### Шаг 6: Объявите
|
|
171
|
+
### Шаг 6: Объявите ваш контент
|
|
185
172
|
|
|
186
|
-
Создайте и управляйте
|
|
173
|
+
Создайте и управляйте объявлениями контента для хранения переводов:
|
|
187
174
|
|
|
188
|
-
```tsx fileName="app/routes/[lang]/page.content.ts"
|
|
175
|
+
```tsx fileName="app/routes/[lang]/page.content.ts"
|
|
189
176
|
import { t, type Dictionary } from "intlayer";
|
|
190
177
|
|
|
191
178
|
const pageContent = {
|
|
@@ -193,19 +180,23 @@ const pageContent = {
|
|
|
193
180
|
content: {
|
|
194
181
|
title: t({
|
|
195
182
|
en: "Welcome to React Router v7 + Intlayer",
|
|
196
|
-
|
|
183
|
+
es: "Bienvenido a React Router v7 + Intlayer",
|
|
184
|
+
fr: "Bienvenue sur React Router v7 + Intlayer",
|
|
197
185
|
}),
|
|
198
186
|
description: t({
|
|
199
187
|
en: "Build multilingual applications with ease using React Router v7 and Intlayer.",
|
|
200
|
-
|
|
188
|
+
es: "Cree aplicaciones multilingües fácilmente usando React Router v7 y Intlayer.",
|
|
189
|
+
fr: "Créez des applications multilingues facilement avec React Router v7 et Intlayer.",
|
|
201
190
|
}),
|
|
202
191
|
aboutLink: t({
|
|
203
|
-
en: "
|
|
204
|
-
|
|
192
|
+
en: "Узнайте о нас",
|
|
193
|
+
es: "Aprender Sobre Nosotros",
|
|
194
|
+
fr: "En savoir plus sur nous",
|
|
205
195
|
}),
|
|
206
196
|
homeLink: t({
|
|
207
197
|
en: "Главная",
|
|
208
|
-
|
|
198
|
+
es: "Inicio",
|
|
199
|
+
fr: "Accueil",
|
|
209
200
|
}),
|
|
210
201
|
},
|
|
211
202
|
} satisfies Dictionary;
|
|
@@ -213,105 +204,92 @@ const pageContent = {
|
|
|
213
204
|
export default pageContent;
|
|
214
205
|
```
|
|
215
206
|
|
|
216
|
-
> Ваши
|
|
217
|
-
|
|
218
|
-
> Для получения дополнительной информации обратитесь к [документации по декларации контента](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/dictionary/get_started.md).
|
|
207
|
+
> Ваши объявления контента могут быть определены в любом месте вашего приложения, как только они включены в директорию `contentDir` (по умолчанию, `./app`). И соответствовать расширению файла объявления контента (по умолчанию, `.content.{json,ts,tsx,js,jsx,mjs,mjx,cjs,cjx}`).
|
|
219
208
|
|
|
220
|
-
|
|
209
|
+
> Для получения дополнительной информации обратитесь к [документации по объявлениям контента](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/dictionary/get_started.md).
|
|
221
210
|
|
|
222
|
-
|
|
211
|
+
### Шаг 7: Создайте компоненты с поддержкой локали
|
|
223
212
|
|
|
224
|
-
|
|
225
|
-
// app/components/localized-link.tsx
|
|
226
|
-
import { getLocalizedUrl } from "intlayer";
|
|
227
|
-
import { useLocale } from "react-intlayer";
|
|
228
|
-
import React from "react";
|
|
229
|
-
import { Link, useLocation } from "react-router";
|
|
213
|
+
Создайте компонент `LocalizedLink` для навигации с учётом локали:
|
|
230
214
|
|
|
231
|
-
|
|
215
|
+
```tsx fileName="app/components/localized-link.tsx"
|
|
216
|
+
import type { FC } from "react";
|
|
232
217
|
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
218
|
+
import { getLocalizedUrl, type LocalesValues } from "intlayer";
|
|
219
|
+
import { useLocale } from "react-intlayer";
|
|
220
|
+
import { Link, type LinkProps, type To } from "react-router";
|
|
236
221
|
|
|
237
|
-
|
|
238
|
-
const isExternal = (path: string) =>
|
|
239
|
-
/^([a-z][a-z0-9+.-]*:)?\/\//i.test(path) || path.startsWith("mailto:");
|
|
222
|
+
const isExternalLink = (to: string) => /^(https?:)?\/\//.test(to);
|
|
240
223
|
|
|
224
|
+
// Проверяет, является ли ссылка внешней
|
|
225
|
+
export const locacalizeTo = (to: To, locale: LocalesValues): To => {
|
|
241
226
|
if (typeof to === "string") {
|
|
242
|
-
if (
|
|
243
|
-
return
|
|
227
|
+
if (isExternalLink(to)) {
|
|
228
|
+
return to;
|
|
244
229
|
}
|
|
245
|
-
|
|
230
|
+
|
|
231
|
+
return getLocalizedUrl(to, locale);
|
|
246
232
|
}
|
|
247
233
|
|
|
248
|
-
if (to
|
|
249
|
-
|
|
250
|
-
if (pathname && pathname.startsWith("/") && !isExternal(pathname)) {
|
|
251
|
-
return (
|
|
252
|
-
<Link
|
|
253
|
-
to={{ ...to, pathname: getLocalizedUrl(pathname, locale) }}
|
|
254
|
-
{...props}
|
|
255
|
-
/>
|
|
256
|
-
);
|
|
257
|
-
}
|
|
258
|
-
return <Link to={to} {...props} />;
|
|
234
|
+
if (isExternalLink(to.pathname ?? "")) {
|
|
235
|
+
return to;
|
|
259
236
|
}
|
|
260
237
|
|
|
261
|
-
return
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
);
|
|
267
|
-
}
|
|
268
|
-
```
|
|
238
|
+
return {
|
|
239
|
+
...to,
|
|
240
|
+
pathname: getLocalizedUrl(to.pathname ?? "", locale),
|
|
241
|
+
};
|
|
242
|
+
};
|
|
269
243
|
|
|
270
|
-
|
|
244
|
+
// Компонент локализованной ссылки, учитывающий текущую локаль
|
|
245
|
+
export const LocalizedLink: FC<LinkProps> = (props) => {
|
|
246
|
+
const { locale } = useLocale();
|
|
271
247
|
|
|
272
|
-
|
|
248
|
+
return <Link {...props} to={locacalizeTo(props.to, locale)} />;
|
|
249
|
+
};
|
|
250
|
+
```
|
|
273
251
|
|
|
274
|
-
|
|
252
|
+
Если вы хотите навигировать по локализованным маршрутам, вы можете использовать хук `useLocalizedNavigate`:
|
|
275
253
|
|
|
276
|
-
```tsx fileName="app/
|
|
277
|
-
|
|
278
|
-
import {
|
|
279
|
-
import { Navigate } from "react-router";
|
|
254
|
+
```tsx fileName="app/hooks/useLocalizedNavigate.ts"
|
|
255
|
+
import { useLocale } from "intlayer";
|
|
256
|
+
import { type NavigateOptions, type To, useNavigate } from "react-router";
|
|
280
257
|
|
|
281
|
-
|
|
258
|
+
import { locacalizeTo } from "~/components/localized-link";
|
|
259
|
+
|
|
260
|
+
export const useLocalizedNavigate = () => {
|
|
261
|
+
const navigate = useNavigate();
|
|
282
262
|
const { locale } = useLocale();
|
|
283
263
|
|
|
284
|
-
|
|
285
|
-
|
|
264
|
+
const localizedNavigate = (to: To, options?: NavigateOptions) => {
|
|
265
|
+
const localedTo = locacalizeTo(to, locale);
|
|
266
|
+
|
|
267
|
+
navigate(localedTo, options);
|
|
268
|
+
};
|
|
269
|
+
|
|
270
|
+
return localizedNavigate;
|
|
271
|
+
};
|
|
286
272
|
```
|
|
287
273
|
|
|
274
|
+
### Шаг 8: Использование Intlayer на ваших страницах
|
|
275
|
+
|
|
276
|
+
Получайте доступ к вашим словарям контента по всему приложению:
|
|
277
|
+
|
|
288
278
|
#### Локализованная главная страница
|
|
289
279
|
|
|
290
|
-
```tsx fileName="app/routes/[lang]/page.tsx"
|
|
280
|
+
```tsx fileName="app/routes/[lang]/page.tsx"
|
|
291
281
|
import { useIntlayer } from "react-intlayer";
|
|
292
|
-
import LocalizedLink from "~/components/localized-link";
|
|
282
|
+
import { LocalizedLink } from "~/components/localized-link";
|
|
293
283
|
|
|
294
284
|
export default function Page() {
|
|
295
|
-
const
|
|
285
|
+
const { title, description, aboutLink } = useIntlayer("page");
|
|
296
286
|
|
|
297
287
|
return (
|
|
298
|
-
<div
|
|
299
|
-
<h1>{
|
|
300
|
-
<p>{
|
|
301
|
-
<nav
|
|
302
|
-
<LocalizedLink
|
|
303
|
-
to="/about"
|
|
304
|
-
style={{
|
|
305
|
-
display: "inline-block",
|
|
306
|
-
padding: "0.5rem 1rem",
|
|
307
|
-
backgroundColor: "#007bff",
|
|
308
|
-
color: "white",
|
|
309
|
-
textDecoration: "none",
|
|
310
|
-
borderRadius: "4px",
|
|
311
|
-
}}
|
|
312
|
-
>
|
|
313
|
-
{content.aboutLink}
|
|
314
|
-
</LocalizedLink>
|
|
288
|
+
<div>
|
|
289
|
+
<h1>{title}</h1>
|
|
290
|
+
<p>{description}</p>
|
|
291
|
+
<nav>
|
|
292
|
+
<LocalizedLink to="/about">{aboutLink}</LocalizedLink>
|
|
315
293
|
</nav>
|
|
316
294
|
</div>
|
|
317
295
|
);
|
|
@@ -324,43 +302,58 @@ export default function Page() {
|
|
|
324
302
|
|
|
325
303
|
Создайте компонент, позволяющий пользователям менять язык:
|
|
326
304
|
|
|
327
|
-
```tsx fileName="app/components/locale-switcher.tsx"
|
|
328
|
-
import {
|
|
329
|
-
import { useLocale } from "react-intlayer";
|
|
330
|
-
import { useLocation, useNavigate } from "react-router";
|
|
305
|
+
```tsx fileName="app/components/locale-switcher.tsx"
|
|
306
|
+
import type { FC } from "react";
|
|
331
307
|
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
308
|
+
import {
|
|
309
|
+
getHTMLTextDir,
|
|
310
|
+
getLocaleName,
|
|
311
|
+
getLocalizedUrl,
|
|
312
|
+
getPathWithoutLocale,
|
|
313
|
+
} from "intlayer";
|
|
314
|
+
import { setLocaleCookie, useIntlayer, useLocale } from "react-intlayer";
|
|
315
|
+
import { Link, useLocation } from "react-router";
|
|
336
316
|
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
};
|
|
317
|
+
export const LocaleSwitcher: FC = () => {
|
|
318
|
+
const { localeSwitcherLabel } = useIntlayer("locale-switcher");
|
|
319
|
+
const { pathname } = useLocation();
|
|
320
|
+
|
|
321
|
+
const { availableLocales, locale } = useLocale();
|
|
322
|
+
|
|
323
|
+
const pathWithoutLocale = getPathWithoutLocale(pathname);
|
|
345
324
|
|
|
346
325
|
return (
|
|
347
|
-
<
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
326
|
+
<ol>
|
|
327
|
+
{availableLocales.map((localeItem) => (
|
|
328
|
+
<li key={localeItem}>
|
|
329
|
+
<Link
|
|
330
|
+
aria-current={localeItem === locale ? "page" : undefined}
|
|
331
|
+
aria-label={`${localeSwitcherLabel.value} ${getLocaleName(localeItem)}`}
|
|
332
|
+
onClick={() => setLocaleCookie(localeItem)}
|
|
333
|
+
to={getLocalizedUrl(pathWithoutLocale, localeItem)}
|
|
334
|
+
>
|
|
335
|
+
<span>
|
|
336
|
+
{/* Локаль - например, FR */}
|
|
337
|
+
{localeItem}
|
|
338
|
+
</span>
|
|
339
|
+
<span>
|
|
340
|
+
{/* Язык на его собственной локали - например, Français */}
|
|
341
|
+
{getLocaleName(localeItem, locale)}
|
|
342
|
+
</span>
|
|
343
|
+
<span dir={getHTMLTextDir(localeItem)} lang={localeItem}>
|
|
344
|
+
{/* Язык на текущей локали - например, Francés при установленной локали Locales.SPANISH */}
|
|
345
|
+
{getLocaleName(localeItem)}
|
|
346
|
+
</span>
|
|
347
|
+
<span dir="ltr" lang={Locales.ENGLISH}>
|
|
348
|
+
{/* Язык на английском - например, French */}
|
|
349
|
+
{getLocaleName(localeItem, Locales.ENGLISH)}
|
|
350
|
+
</span>
|
|
351
|
+
</Link>
|
|
352
|
+
</li>
|
|
353
|
+
))}
|
|
354
|
+
</ol>
|
|
362
355
|
);
|
|
363
|
-
}
|
|
356
|
+
};
|
|
364
357
|
```
|
|
365
358
|
|
|
366
359
|
> Чтобы узнать больше о хуке `useLocale`, обратитесь к [документации](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/packages/react-intlayer/useLocale.md).
|
|
@@ -369,8 +362,7 @@ export default function LocaleSwitcher() {
|
|
|
369
362
|
|
|
370
363
|
Создайте хук для управления атрибутами lang и dir в HTML:
|
|
371
364
|
|
|
372
|
-
```tsx fileName="app/hooks/useI18nHTMLAttributes.tsx"
|
|
373
|
-
// app/hooks/useI18nHTMLAttributes.tsx
|
|
365
|
+
```tsx fileName="app/hooks/useI18nHTMLAttributes.tsx"
|
|
374
366
|
import { getHTMLTextDir } from "intlayer";
|
|
375
367
|
import { useEffect } from "react";
|
|
376
368
|
import { useLocale } from "react-intlayer";
|
|
@@ -387,15 +379,14 @@ export const useI18nHTMLAttributes = () => {
|
|
|
387
379
|
|
|
388
380
|
Затем используйте его в вашем корневом компоненте:
|
|
389
381
|
|
|
390
|
-
```tsx fileName="app/
|
|
391
|
-
// app/routes/layout.tsx
|
|
382
|
+
```tsx fileName="app/routes/layout.tsx"
|
|
392
383
|
import { Outlet } from "react-router";
|
|
393
384
|
import { IntlayerProvider } from "react-intlayer";
|
|
394
385
|
|
|
395
|
-
import { useI18nHTMLAttributes } from "app/hooks/useI18nHTMLAttributes"; //
|
|
386
|
+
import { useI18nHTMLAttributes } from "app/hooks/useI18nHTMLAttributes"; // импорт хука
|
|
396
387
|
|
|
397
388
|
export default function RootLayout() {
|
|
398
|
-
useI18nHTMLAttributes(); //
|
|
389
|
+
useI18nHTMLAttributes(); // вызов хука
|
|
399
390
|
|
|
400
391
|
return (
|
|
401
392
|
<IntlayerProvider>
|
|
@@ -405,45 +396,34 @@ export default function RootLayout() {
|
|
|
405
396
|
}
|
|
406
397
|
```
|
|
407
398
|
|
|
408
|
-
### Шаг 11:
|
|
399
|
+
### Шаг 11: Добавьте middleware (необязательно)
|
|
409
400
|
|
|
410
|
-
|
|
401
|
+
Вы также можете использовать `intlayerMiddleware` для добавления маршрутизации на стороне сервера в ваше приложение. Этот плагин автоматически определит текущую локаль на основе URL и установит соответствующее cookie с локалью. Если локаль не указана, плагин определит наиболее подходящую локаль на основе языковых предпочтений браузера пользователя. Если локаль не будет обнаружена, произойдет перенаправление на локаль по умолчанию.
|
|
411
402
|
|
|
412
|
-
|
|
413
|
-
# Построить словари Intlayer
|
|
414
|
-
npm run intlayer:build
|
|
403
|
+
> Обратите внимание, что для использования `intlayerMiddleware` в продакшене необходимо переместить пакет `vite-intlayer` из `devDependencies` в `dependencies`.
|
|
415
404
|
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
```bash packageManager="pnpm"
|
|
421
|
-
# Построить словари Intlayer
|
|
422
|
-
pnpm intlayer:build
|
|
405
|
+
```typescript {3,7} fileName="vite.config.ts"
|
|
406
|
+
import { defineConfig } from "vite";
|
|
407
|
+
import react from "@vitejs/plugin-react-swc";
|
|
408
|
+
import { intlayer, intlayerMiddleware } from "vite-intlayer";
|
|
423
409
|
|
|
424
|
-
|
|
425
|
-
|
|
410
|
+
// https://vitejs.dev/config/
|
|
411
|
+
export default defineConfig({
|
|
412
|
+
plugins: [react(), intlayer(), intlayerMiddleware()],
|
|
413
|
+
});
|
|
426
414
|
```
|
|
427
415
|
|
|
428
|
-
|
|
429
|
-
# Построить словари Intlayer
|
|
430
|
-
yarn intlayer:build
|
|
431
|
-
|
|
432
|
-
# Запустить сервер разработки
|
|
433
|
-
yarn dev
|
|
434
|
-
```
|
|
416
|
+
---
|
|
435
417
|
|
|
436
|
-
|
|
418
|
+
## Настройка TypeScript
|
|
437
419
|
|
|
438
|
-
Intlayer использует расширение модулей
|
|
420
|
+
Intlayer использует расширение модулей (module augmentation), чтобы использовать преимущества TypeScript и сделать ваш код более надежным.
|
|
439
421
|
|
|
440
|
-
Убедитесь, что ваша конфигурация TypeScript включает
|
|
422
|
+
Убедитесь, что ваша конфигурация TypeScript включает автоматически сгенерированные типы:
|
|
441
423
|
|
|
442
424
|
```json5 fileName="tsconfig.json"
|
|
443
425
|
{
|
|
444
|
-
|
|
445
|
-
// ... ваши существующие настройки TypeScript
|
|
446
|
-
},
|
|
426
|
+
// ... ваши существующие настройки
|
|
447
427
|
include: [
|
|
448
428
|
// ... ваши существующие включения
|
|
449
429
|
".intlayer/**/*.ts", // Включить автоматически сгенерированные типы
|
|
@@ -451,9 +431,11 @@ Intlayer использует расширение модулей для пол
|
|
|
451
431
|
}
|
|
452
432
|
```
|
|
453
433
|
|
|
454
|
-
|
|
434
|
+
---
|
|
455
435
|
|
|
456
|
-
|
|
436
|
+
## Конфигурация Git
|
|
437
|
+
|
|
438
|
+
Рекомендуется игнорировать файлы, сгенерированные Intlayer. Это позволит избежать их коммита в ваш Git-репозиторий.
|
|
457
439
|
|
|
458
440
|
Для этого вы можете добавить следующие инструкции в ваш файл `.gitignore`:
|
|
459
441
|
|
|
@@ -464,35 +446,6 @@ Intlayer использует расширение модулей для пол
|
|
|
464
446
|
|
|
465
447
|
---
|
|
466
448
|
|
|
467
|
-
## Развертывание в продакшн
|
|
468
|
-
|
|
469
|
-
При развертывании вашего приложения:
|
|
470
|
-
|
|
471
|
-
1. **Соберите ваше приложение:**
|
|
472
|
-
|
|
473
|
-
```bash
|
|
474
|
-
npm run build
|
|
475
|
-
```
|
|
476
|
-
|
|
477
|
-
2. **Постройте словари Intlayer:**
|
|
478
|
-
|
|
479
|
-
```bash
|
|
480
|
-
npm run intlayer:build
|
|
481
|
-
```
|
|
482
|
-
|
|
483
|
-
3. **Переместите `vite-intlayer` в зависимости**, если используете middleware в продакшне:
|
|
484
|
-
```bash
|
|
485
|
-
npm install vite-intlayer --save
|
|
486
|
-
```
|
|
487
|
-
|
|
488
|
-
Ваше приложение теперь будет поддерживать:
|
|
489
|
-
|
|
490
|
-
- **Структуру URL**: `/en`, `/en/about`, `/tr`, `/tr/about`
|
|
491
|
-
- **Автоматическое определение локали** на основе предпочтений браузера
|
|
492
|
-
- **Маршрутизацию с учётом локали** с React Router v7
|
|
493
|
-
- **Поддержку TypeScript** с автоматически сгенерированными типами
|
|
494
|
-
- **Серверный рендеринг** с правильной обработкой локали
|
|
495
|
-
|
|
496
449
|
## Расширение VS Code
|
|
497
450
|
|
|
498
451
|
Для улучшения вашего опыта разработки с Intlayer вы можете установить официальное **расширение Intlayer для VS Code**.
|
|
@@ -501,10 +454,10 @@ Intlayer использует расширение модулей для пол
|
|
|
501
454
|
|
|
502
455
|
Это расширение предоставляет:
|
|
503
456
|
|
|
504
|
-
-
|
|
457
|
+
- **Автозаполнение** ключей переводов.
|
|
505
458
|
- **Обнаружение ошибок в реальном времени** для отсутствующих переводов.
|
|
506
459
|
- **Встроенный просмотр** переведённого контента.
|
|
507
|
-
- **Быстрые действия** для
|
|
460
|
+
- **Быстрые действия** для простого создания и обновления переводов.
|
|
508
461
|
|
|
509
462
|
Для получения дополнительной информации о том, как использовать расширение, обратитесь к [документации расширения Intlayer для VS Code](https://intlayer.org/doc/vs-code-extension).
|
|
510
463
|
|
|
@@ -512,7 +465,7 @@ Intlayer использует расширение модулей для пол
|
|
|
512
465
|
|
|
513
466
|
## Продвинутые возможности
|
|
514
467
|
|
|
515
|
-
|
|
468
|
+
Чтобы пойти дальше, вы можете реализовать [визуальный редактор](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).
|
|
516
469
|
|
|
517
470
|
---
|
|
518
471
|
|
|
@@ -521,7 +474,7 @@ Intlayer использует расширение модулей для пол
|
|
|
521
474
|
- [Документация Intlayer](https://intlayer.org)
|
|
522
475
|
- [Документация React Router v7](https://reactrouter.com/)
|
|
523
476
|
- [Хук useIntlayer](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/packages/react-intlayer/useIntlayer.md)
|
|
524
|
-
- [useLocale
|
|
477
|
+
- [Хук useLocale](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/packages/react-intlayer/useLocale.md)
|
|
525
478
|
- [Объявление контента](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/dictionary/get_started.md)
|
|
526
479
|
- [Конфигурация](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/configuration.md)
|
|
527
480
|
|
|
@@ -529,6 +482,7 @@ Intlayer использует расширение модулей для пол
|
|
|
529
482
|
|
|
530
483
|
## История документации
|
|
531
484
|
|
|
532
|
-
| Версия | Дата
|
|
533
|
-
| ------ |
|
|
534
|
-
|
|
|
485
|
+
| Версия | Дата | Изменения |
|
|
486
|
+
| ------ | ---------- | ----------------------------- |
|
|
487
|
+
| 6.1.5 | 2025-10-03 | Обновлена документация |
|
|
488
|
+
| 5.8.2 | 2025-09-04 | Добавлено для React Router v7 |
|