@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
|
@@ -15,10 +15,8 @@ keywords:
|
|
|
15
15
|
slugs:
|
|
16
16
|
- doc
|
|
17
17
|
- environment
|
|
18
|
-
- vite-and-react
|
|
19
18
|
- tanstack-start
|
|
20
|
-
applicationTemplate: https://github.com/
|
|
21
|
-
author: AydinTheFirst
|
|
19
|
+
applicationTemplate: https://github.com/aymericzip/intlayer-tanstack-start-template
|
|
22
20
|
---
|
|
23
21
|
|
|
24
22
|
# Начало работы с интернационализацией (i18n) с Intlayer и Tanstack Start
|
|
@@ -33,9 +31,9 @@ author: AydinTheFirst
|
|
|
33
31
|
|
|
34
32
|
- **Легко управлять переводами** с использованием декларативных словарей на уровне компонентов.
|
|
35
33
|
- **Динамически локализовать метаданные**, маршруты и контент.
|
|
36
|
-
- **Обеспечить поддержку TypeScript** с
|
|
37
|
-
- **Воспользоваться расширенными
|
|
38
|
-
- **Включите маршрутизацию с
|
|
34
|
+
- **Обеспечить поддержку TypeScript** с помощью автогенерируемых типов, улучшая автодополнение и обнаружение ошибок.
|
|
35
|
+
- **Воспользоваться расширенными функциями**, такими как динамическое определение и переключение локали.
|
|
36
|
+
- **Включите маршрутизацию с учетом локали** с помощью файловой системы маршрутизации Tanstack Start.
|
|
39
37
|
|
|
40
38
|
---
|
|
41
39
|
|
|
@@ -47,7 +45,7 @@ author: AydinTheFirst
|
|
|
47
45
|
|
|
48
46
|
### Шаг 2: Установите пакеты Intlayer
|
|
49
47
|
|
|
50
|
-
Установите необходимые
|
|
48
|
+
Установите необходимые пакеты, используя предпочитаемый менеджер пакетов:
|
|
51
49
|
|
|
52
50
|
```bash packageManager="npm"
|
|
53
51
|
npm install intlayer react-intlayer
|
|
@@ -69,13 +67,13 @@ pnpm add vite-intlayer --save-dev
|
|
|
69
67
|
Пакет, который интегрирует Intlayer с приложением React. Он предоставляет провайдеры контекста и хуки для интернационализации в React.
|
|
70
68
|
|
|
71
69
|
- **vite-intlayer**
|
|
72
|
-
Включает плагин Vite для интеграции Intlayer с [сборщиком Vite](https://vite.dev/guide/why.html#why-bundle-for-production), а также промежуточное ПО для определения предпочтительной локали пользователя, управления
|
|
70
|
+
Включает плагин Vite для интеграции Intlayer с [сборщиком Vite](https://vite.dev/guide/why.html#why-bundle-for-production), а также промежуточное ПО для определения предпочтительной локали пользователя, управления куки и обработки перенаправления URL.
|
|
73
71
|
|
|
74
72
|
### Шаг 3: Конфигурация вашего проекта
|
|
75
73
|
|
|
76
74
|
Создайте файл конфигурации для настройки языков вашего приложения:
|
|
77
75
|
|
|
78
|
-
```typescript fileName="intlayer.config.ts"
|
|
76
|
+
```typescript fileName="intlayer.config.ts"
|
|
79
77
|
import type { IntlayerConfig } from "intlayer";
|
|
80
78
|
|
|
81
79
|
import { Locales } from "intlayer";
|
|
@@ -83,79 +81,31 @@ import { Locales } from "intlayer";
|
|
|
83
81
|
const config: IntlayerConfig = {
|
|
84
82
|
internationalization: {
|
|
85
83
|
defaultLocale: Locales.ENGLISH, // Язык по умолчанию
|
|
86
|
-
locales: [
|
|
87
|
-
Locales.ENGLISH, // Английский
|
|
88
|
-
Locales.FRENCH, // Французский
|
|
89
|
-
Locales.SPANISH, // Испанский
|
|
90
|
-
// Ваши другие языки
|
|
91
|
-
],
|
|
84
|
+
locales: [Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH], // Поддерживаемые языки
|
|
92
85
|
},
|
|
93
86
|
};
|
|
94
87
|
|
|
95
88
|
export default config;
|
|
96
89
|
```
|
|
97
90
|
|
|
98
|
-
|
|
99
|
-
import { Locales } from "intlayer";
|
|
100
|
-
|
|
101
|
-
/** @type {import('intlayer').IntlayerConfig} */
|
|
102
|
-
const config = {
|
|
103
|
-
internationalization: {
|
|
104
|
-
defaultLocale: Locales.ENGLISH, // Язык по умолчанию
|
|
105
|
-
locales: [
|
|
106
|
-
Locales.ENGLISH, // Английский
|
|
107
|
-
Locales.FRENCH, // Французский
|
|
108
|
-
Locales.SPANISH, // Испанский
|
|
109
|
-
// Ваши другие языки
|
|
110
|
-
],
|
|
111
|
-
},
|
|
112
|
-
};
|
|
113
|
-
|
|
114
|
-
export default config;
|
|
115
|
-
```
|
|
116
|
-
|
|
117
|
-
```javascript fileName="intlayer.config.cjs" codeFormat="commonjs"
|
|
118
|
-
const { Locales } = require("intlayer");
|
|
119
|
-
|
|
120
|
-
/** @type {import('intlayer').IntlayerConfig} */
|
|
121
|
-
const config = {
|
|
122
|
-
internationalization: {
|
|
123
|
-
defaultLocale: Locales.ENGLISH, // Язык по умолчанию
|
|
124
|
-
locales: [
|
|
125
|
-
Locales.ENGLISH, // Английский
|
|
126
|
-
Locales.FRENCH, // Французский
|
|
127
|
-
Locales.SPANISH, // Испанский
|
|
128
|
-
// Ваши другие языки
|
|
129
|
-
],
|
|
130
|
-
},
|
|
131
|
-
};
|
|
132
|
-
|
|
133
|
-
module.exports = config;
|
|
134
|
-
```
|
|
135
|
-
|
|
136
|
-
> Через этот конфигурационный файл вы можете настроить локализованные URL, перенаправления в middleware, имена cookie, расположение и расширение ваших деклараций контента, отключить логи Intlayer в консоли и многое другое. Для полного списка доступных параметров обратитесь к [документации по конфигурации](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/configuration.md).
|
|
91
|
+
> С помощью этого файла конфигурации вы можете настроить локализованные URL, перенаправление через middleware, имена cookie, расположение и расширение ваших объявлений контента, отключить логи Intlayer в консоли и многое другое. Для полного списка доступных параметров обратитесь к [документации по конфигурации](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/configuration.md).
|
|
137
92
|
|
|
138
93
|
### Шаг 4: Интеграция Intlayer в вашу конфигурацию Vite
|
|
139
94
|
|
|
140
95
|
Добавьте плагин intlayer в вашу конфигурацию:
|
|
141
96
|
|
|
142
|
-
```typescript fileName="vite.config.ts"
|
|
97
|
+
```typescript fileName="vite.config.ts"
|
|
143
98
|
import { reactRouter } from "@react-router/dev/vite";
|
|
144
99
|
import { defineConfig } from "vite";
|
|
145
|
-
import {
|
|
100
|
+
import { intlayer } from "vite-intlayer";
|
|
146
101
|
import tsconfigPaths from "vite-tsconfig-paths";
|
|
147
102
|
|
|
148
103
|
export default defineConfig({
|
|
149
|
-
plugins: [
|
|
150
|
-
reactRouter(),
|
|
151
|
-
tsconfigPaths(),
|
|
152
|
-
intlayer(),
|
|
153
|
-
intlayerMiddlewarePlugin(),
|
|
154
|
-
],
|
|
104
|
+
plugins: [reactRouter(), tsconfigPaths(), intlayer()],
|
|
155
105
|
});
|
|
156
106
|
```
|
|
157
107
|
|
|
158
|
-
> Плагин Vite `intlayer()` используется для интеграции Intlayer с Vite. Он обеспечивает сборку файлов деклараций контента и их
|
|
108
|
+
> Плагин Vite `intlayer()` используется для интеграции Intlayer с Vite. Он обеспечивает сборку файлов деклараций контента и отслеживает их в режиме разработки. Также он определяет переменные окружения Intlayer внутри приложения Vite. Дополнительно плагин предоставляет алиасы для оптимизации производительности.
|
|
159
109
|
|
|
160
110
|
### Шаг 5: Создайте компоненты макета
|
|
161
111
|
|
|
@@ -163,10 +113,8 @@ export default defineConfig({
|
|
|
163
113
|
|
|
164
114
|
#### Корневой макет
|
|
165
115
|
|
|
166
|
-
```tsx fileName="src/routes/{-$locale}/route.tsx"
|
|
167
|
-
// src/routes/{-$locale}/route.tsx
|
|
116
|
+
```tsx fileName="src/routes/{-$locale}/route.tsx"
|
|
168
117
|
import { createFileRoute, Navigate, Outlet } from "@tanstack/react-router";
|
|
169
|
-
import { configuration } from "intlayer";
|
|
170
118
|
import { IntlayerProvider, useLocale } from "react-intlayer";
|
|
171
119
|
|
|
172
120
|
import { useI18nHTMLAttributes } from "@/hooks/useI18nHTMLAttributes";
|
|
@@ -176,21 +124,22 @@ export const Route = createFileRoute("/{-$locale}")({
|
|
|
176
124
|
});
|
|
177
125
|
|
|
178
126
|
function LayoutComponent() {
|
|
127
|
+
const { defaultLocale } = useLocale();
|
|
179
128
|
const { locale } = Route.useParams();
|
|
180
129
|
|
|
181
130
|
return (
|
|
182
|
-
<IntlayerProvider locale={
|
|
131
|
+
<IntlayerProvider locale={defaultLocale}>
|
|
183
132
|
<Outlet />
|
|
184
133
|
</IntlayerProvider>
|
|
185
134
|
);
|
|
186
135
|
}
|
|
187
136
|
```
|
|
188
137
|
|
|
189
|
-
### Шаг 6: Объявите
|
|
138
|
+
### Шаг 6: Объявите ваш контент
|
|
190
139
|
|
|
191
|
-
|
|
140
|
+
Создавайте и управляйте объявлениями контента для хранения переводов:
|
|
192
141
|
|
|
193
|
-
```tsx fileName="src/contents/page.content.ts"
|
|
142
|
+
```tsx fileName="src/contents/page.content.ts"
|
|
194
143
|
import type { Dictionary } from "intlayer";
|
|
195
144
|
|
|
196
145
|
import { t } from "intlayer";
|
|
@@ -199,25 +148,29 @@ const appContent = {
|
|
|
199
148
|
content: {
|
|
200
149
|
links: {
|
|
201
150
|
about: t({
|
|
151
|
+
ru: "О проекте",
|
|
202
152
|
en: "About",
|
|
203
153
|
es: "Acerca de",
|
|
204
154
|
fr: "À propos",
|
|
205
155
|
}),
|
|
206
156
|
home: t({
|
|
207
|
-
|
|
157
|
+
ru: "Главная",
|
|
158
|
+
en: "Home",
|
|
208
159
|
es: "Inicio",
|
|
209
160
|
fr: "Accueil",
|
|
210
161
|
}),
|
|
211
162
|
},
|
|
212
163
|
meta: {
|
|
213
164
|
description: t({
|
|
214
|
-
|
|
165
|
+
ru: "Это пример использования Intlayer с TanStack Router",
|
|
166
|
+
en: "This is an example of using Intlayer with TanStack Router",
|
|
215
167
|
es: "Este es un ejemplo de uso de Intlayer con TanStack Router",
|
|
216
168
|
fr: "Ceci est un exemple d'utilisation d'Intlayer avec TanStack Router",
|
|
217
169
|
}),
|
|
218
170
|
},
|
|
219
171
|
title: t({
|
|
220
|
-
|
|
172
|
+
ru: "Добро пожаловать в Intlayer + TanStack Router",
|
|
173
|
+
en: "Welcome to Intlayer + TanStack Router",
|
|
221
174
|
es: "Bienvenido a Intlayer + TanStack Router",
|
|
222
175
|
fr: "Bienvenue à Intlayer + TanStack Router",
|
|
223
176
|
}),
|
|
@@ -228,7 +181,7 @@ const appContent = {
|
|
|
228
181
|
export default appContent;
|
|
229
182
|
```
|
|
230
183
|
|
|
231
|
-
> Ваши объявления контента могут быть определены в любом месте вашего приложения, как только они
|
|
184
|
+
> Ваши объявления контента могут быть определены в любом месте вашего приложения, как только они включены в директорию `contentDir` (по умолчанию, `./app`). И соответствуют расширению файла объявления контента (по умолчанию, `.content.{json,ts,tsx,js,jsx,mjs,mjx,cjs,cjx}`).
|
|
232
185
|
|
|
233
186
|
> Для получения дополнительной информации обратитесь к [документации по объявлениям контента](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/dictionary/get_started.md).
|
|
234
187
|
|
|
@@ -236,59 +189,99 @@ export default appContent;
|
|
|
236
189
|
|
|
237
190
|
Создайте компонент `LocalizedLink` для навигации с учетом локали:
|
|
238
191
|
|
|
239
|
-
```tsx fileName="src/components/localized-link.tsx"
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
import { Link, type
|
|
243
|
-
import {
|
|
244
|
-
|
|
192
|
+
```tsx fileName="src/components/localized-link.tsx"
|
|
193
|
+
import type { FC } from "react";
|
|
194
|
+
|
|
195
|
+
import { Link, type LinkComponentProps } from "@tanstack/react-router";
|
|
196
|
+
import { useLocale } from "react.intlayer";
|
|
197
|
+
|
|
198
|
+
export const LOCALE_ROUTE = "{-$locale}" as const;
|
|
199
|
+
|
|
200
|
+
// Основная утилита
|
|
201
|
+
export type RemoveLocaleParam<T> = T extends string
|
|
202
|
+
? RemoveLocaleFromString<T>
|
|
203
|
+
: T;
|
|
204
|
+
|
|
205
|
+
export type To = RemoveLocaleParam<LinkComponentProps["to"]>;
|
|
206
|
+
|
|
207
|
+
type CollapseDoubleSlashes<S extends string> =
|
|
208
|
+
S extends `${infer H}//${infer T}` ? CollapseDoubleSlashes<`${H}/${T}`> : S;
|
|
245
209
|
|
|
246
210
|
type LocalizedLinkProps = {
|
|
247
|
-
to
|
|
248
|
-
} & Omit<
|
|
211
|
+
to?: To;
|
|
212
|
+
} & Omit<LinkComponentProps, "to">;
|
|
249
213
|
|
|
250
|
-
|
|
251
|
-
|
|
214
|
+
// Вспомогательные типы
|
|
215
|
+
type RemoveAll<
|
|
216
|
+
S extends string,
|
|
217
|
+
Sub extends string,
|
|
218
|
+
> = S extends `${infer H}${Sub}${infer T}` ? RemoveAll<`${H}${T}`, Sub> : S;
|
|
252
219
|
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
220
|
+
type RemoveLocaleFromString<S extends string> = CollapseDoubleSlashes<
|
|
221
|
+
RemoveAll<S, typeof LOCALE_ROUTE>
|
|
222
|
+
>;
|
|
256
223
|
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
: getLocalizedUrl(props.to, locale);
|
|
224
|
+
export const LocalizedLink: FC<LocalizedLinkProps> = (props) => {
|
|
225
|
+
const { locale } = useLocale();
|
|
260
226
|
|
|
261
|
-
return
|
|
262
|
-
|
|
227
|
+
return (
|
|
228
|
+
<Link
|
|
229
|
+
{...props}
|
|
230
|
+
params={{
|
|
231
|
+
locale,
|
|
232
|
+
...(typeof props?.params === "object" ? props?.params : {}),
|
|
233
|
+
}}
|
|
234
|
+
to={`/${LOCALE_ROUTE}${props.to}` as LinkComponentProps["to"]}
|
|
235
|
+
/>
|
|
236
|
+
);
|
|
237
|
+
};
|
|
263
238
|
```
|
|
264
239
|
|
|
265
|
-
|
|
240
|
+
Этот компонент выполняет две задачи:
|
|
266
241
|
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
import { getLocalizedUrl } from "intlayer";
|
|
272
|
-
import { useLocale } from "react-intlayer";
|
|
242
|
+
- Удаляет ненужный префикс `{-$locale}` из URL.
|
|
243
|
+
- Вставляет параметр локали в URL, чтобы пользователь был напрямую перенаправлен на локализованный маршрут.
|
|
244
|
+
|
|
245
|
+
Далее мы можем создать хук `useLocalizedNavigate` для программной навигации:
|
|
273
246
|
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
}
|
|
247
|
+
```tsx fileName="src/hooks/useLocalizedNavigate.tsx"
|
|
248
|
+
import { useLocale } from "react.intlayer";
|
|
249
|
+
import { useNavigate } from "@tanstack/react-router";
|
|
250
|
+
import { LOCALE_ROUTE } from "@/components/localized-link";
|
|
251
|
+
import type { FileRouteTypes } from "@/routeTree.gen";
|
|
277
252
|
|
|
278
253
|
export const useLocalizedNavigate = () => {
|
|
279
254
|
const navigate = useNavigate();
|
|
255
|
+
|
|
280
256
|
const { locale } = useLocale();
|
|
281
257
|
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
258
|
+
type StripLocalePrefix<T extends string> = T extends
|
|
259
|
+
| `/${typeof LOCALE_ROUTE}`
|
|
260
|
+
| `/${typeof LOCALE_ROUTE}/`
|
|
261
|
+
? "/" // Удаляем префикс локали, оставляя корень
|
|
262
|
+
: T extends `/${typeof LOCALE_ROUTE}/${infer Rest}`
|
|
263
|
+
? `/${Rest}` // Удаляем префикс локали, оставляя остальную часть пути
|
|
264
|
+
: never;
|
|
265
|
+
|
|
266
|
+
type LocalizedTo = StripLocalePrefix<FileRouteTypes["to"]>;
|
|
267
|
+
|
|
268
|
+
interface LocalizedNavigate {
|
|
269
|
+
(to: LocalizedTo): ReturnType<typeof navigate>;
|
|
270
|
+
(
|
|
271
|
+
opts: { to: LocalizedTo } & Record<string, unknown>
|
|
272
|
+
): ReturnType<typeof navigate>;
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
const localizedNavigate: LocalizedNavigate = (args: any) => {
|
|
276
|
+
if (typeof args === "string") {
|
|
277
|
+
return navigate({ to: `/${LOCALE_ROUTE}${args}`, params: { locale } });
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
const { to, ...rest } = args;
|
|
285
281
|
|
|
286
|
-
|
|
287
|
-
const to = isExternal(options.to)
|
|
288
|
-
? options.to
|
|
289
|
-
: getLocalizedUrl(options.to, locale);
|
|
282
|
+
const localedTo = `/${LOCALE_ROUTE}${to}` as any;
|
|
290
283
|
|
|
291
|
-
navigate({
|
|
284
|
+
return navigate({ to: localedTo, params: { locale, ...rest } as any });
|
|
292
285
|
};
|
|
293
286
|
|
|
294
287
|
return localizedNavigate;
|
|
@@ -299,26 +292,12 @@ export const useLocalizedNavigate = () => {
|
|
|
299
292
|
|
|
300
293
|
Получайте доступ к вашим словарям контента по всему приложению:
|
|
301
294
|
|
|
302
|
-
#### Страница перенаправления корня
|
|
303
|
-
|
|
304
|
-
```tsx fileName="src/routes/page.tsx" codeFormat="typescript"
|
|
305
|
-
// src/routes/page.tsx
|
|
306
|
-
import { useLocale } from "react-intlayer";
|
|
307
|
-
import { Navigate } from "react-router";
|
|
308
|
-
|
|
309
|
-
export default function Page() {
|
|
310
|
-
const { locale } = useLocale();
|
|
311
|
-
|
|
312
|
-
return <Navigate replace to={locale} />;
|
|
313
|
-
}
|
|
314
|
-
```
|
|
315
|
-
|
|
316
295
|
#### Локализованная главная страница
|
|
317
296
|
|
|
318
|
-
```tsx fileName="src/routes/{-$locale}/index.tsx"
|
|
297
|
+
```tsx fileName="src/routes/{-$locale}/index.tsx"
|
|
319
298
|
import { createFileRoute } from "@tanstack/react-router";
|
|
320
299
|
import { getIntlayer } from "intlayer";
|
|
321
|
-
import { useIntlayer } from "react
|
|
300
|
+
import { useIntlayer } from "react.intlayer";
|
|
322
301
|
|
|
323
302
|
import LocaleSwitcher from "@/components/locale-switcher";
|
|
324
303
|
import { LocalizedLink } from "@/components/localized-link";
|
|
@@ -344,16 +323,15 @@ function RouteComponent() {
|
|
|
344
323
|
const navigate = useLocalizedNavigate();
|
|
345
324
|
|
|
346
325
|
return (
|
|
347
|
-
<div
|
|
348
|
-
<div
|
|
326
|
+
<div>
|
|
327
|
+
<div>
|
|
349
328
|
{content.title}
|
|
350
329
|
<LocaleSwitcher />
|
|
351
|
-
<div
|
|
352
|
-
<a href="/">Индекс</a>
|
|
330
|
+
<div>
|
|
353
331
|
<LocalizedLink to="/">{content.links.home}</LocalizedLink>
|
|
354
332
|
<LocalizedLink to="/about">{content.links.about}</LocalizedLink>
|
|
355
333
|
</div>
|
|
356
|
-
<div
|
|
334
|
+
<div>
|
|
357
335
|
<button onClick={() => navigate({ to: "/" })}>
|
|
358
336
|
{content.links.home}
|
|
359
337
|
</button>
|
|
@@ -369,61 +347,69 @@ function RouteComponent() {
|
|
|
369
347
|
|
|
370
348
|
> Чтобы узнать больше о хуке `useIntlayer`, обратитесь к [документации](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/packages/react-intlayer/useIntlayer.md).
|
|
371
349
|
|
|
372
|
-
### Шаг 9: Создайте компонент
|
|
350
|
+
### Шаг 9: Создайте компонент переключателя локали
|
|
373
351
|
|
|
374
352
|
Создайте компонент, который позволит пользователям менять язык:
|
|
375
353
|
|
|
376
|
-
```tsx fileName="src/components/locale-switcher.tsx"
|
|
354
|
+
```tsx fileName="src/components/locale-switcher.tsx"
|
|
355
|
+
import type { FC } from "react";
|
|
356
|
+
|
|
377
357
|
import { useLocation } from "@tanstack/react-router";
|
|
378
|
-
import {
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
const {
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
const { availableLocales, locale, setLocale } = useLocale({
|
|
391
|
-
onLocaleChange: (newLocale) => {
|
|
392
|
-
const pathWithLocale = getLocalizedUrl(pathname + searchStr, newLocale);
|
|
393
|
-
location.replace(pathWithLocale);
|
|
394
|
-
},
|
|
395
|
-
});
|
|
358
|
+
import { getHTMLTextDir, getLocaleName, getPathWithoutLocale } from "intlayer";
|
|
359
|
+
import { setLocaleCookie, useIntlayer, useLocale } from "react-intlayer";
|
|
360
|
+
|
|
361
|
+
import { LocalizedLink, To } from "./localized-link";
|
|
362
|
+
|
|
363
|
+
export const LocaleSwitcher: FC = () => {
|
|
364
|
+
const { localeSwitcherLabel } = useIntlayer("locale-switcher");
|
|
365
|
+
const { pathname } = useLocation();
|
|
366
|
+
|
|
367
|
+
const { availableLocales, locale } = useLocale();
|
|
368
|
+
|
|
369
|
+
const pathWithoutLocale = getPathWithoutLocale(pathname);
|
|
396
370
|
|
|
397
371
|
return (
|
|
398
|
-
<
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
372
|
+
<ol>
|
|
373
|
+
{availableLocales.map((localeEl) => (
|
|
374
|
+
<li key={localeEl}>
|
|
375
|
+
<LocalizedLink
|
|
376
|
+
aria-current={localeEl === locale ? "page" : undefined}
|
|
377
|
+
aria-label={`${localeSwitcherLabel.value} ${getLocaleName(localeEl)}`}
|
|
378
|
+
onClick={() => setLocaleCookie(localeEl)}
|
|
379
|
+
params={{ locale: localeEl }}
|
|
380
|
+
to={pathWithoutLocale as To}
|
|
381
|
+
>
|
|
382
|
+
<span>
|
|
383
|
+
{/* Локаль - например, FR */}
|
|
384
|
+
{localeItem}
|
|
385
|
+
</span>
|
|
386
|
+
<span>
|
|
387
|
+
{/* Язык на его собственной локали - например, Français */}
|
|
388
|
+
{getLocaleName(localeItem, locale)}
|
|
389
|
+
</span>
|
|
390
|
+
<span dir={getHTMLTextDir(localeItem)} lang={localeItem}>
|
|
391
|
+
{/* Язык на текущей локали - например, Francés при установленной локали Locales.SPANISH */}
|
|
392
|
+
{getLocaleName(localeItem)}
|
|
393
|
+
</span>
|
|
394
|
+
<span dir="ltr" lang={Locales.ENGLISH}>
|
|
395
|
+
{/* Язык на английском - например, French */}
|
|
396
|
+
{getLocaleName(localeItem, Locales.ENGLISH)}
|
|
397
|
+
</span>
|
|
398
|
+
</LocalizedLink>
|
|
399
|
+
</li>
|
|
414
400
|
))}
|
|
415
|
-
</
|
|
401
|
+
</ol>
|
|
416
402
|
);
|
|
417
|
-
}
|
|
403
|
+
};
|
|
418
404
|
```
|
|
419
405
|
|
|
420
406
|
> Чтобы узнать больше о хуке `useLocale`, обратитесь к [документации](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/packages/react-intlayer/useLocale.md).
|
|
421
407
|
|
|
422
|
-
### Шаг 10:
|
|
408
|
+
### Шаг 10: Добавьте управление атрибутами HTML (необязательно)
|
|
423
409
|
|
|
424
410
|
Создайте хук для управления атрибутами lang и dir в HTML:
|
|
425
411
|
|
|
426
|
-
```tsx fileName="src/hooks/useI18nHTMLAttributes.tsx"
|
|
412
|
+
```tsx fileName="src/hooks/useI18nHTMLAttributes.tsx"
|
|
427
413
|
// src/hooks/useI18nHTMLAttributes.tsx
|
|
428
414
|
import { getHTMLTextDir } from "intlayer";
|
|
429
415
|
import { useEffect } from "react";
|
|
@@ -433,77 +419,75 @@ export const useI18nHTMLAttributes = () => {
|
|
|
433
419
|
const { locale } = useLocale();
|
|
434
420
|
|
|
435
421
|
useEffect(() => {
|
|
436
|
-
document.documentElement.lang = locale;
|
|
437
|
-
document.documentElement.dir = getHTMLTextDir(locale); // установка атрибута dir для документа
|
|
422
|
+
document.documentElement.lang = locale; // установка атрибута lang для корневого элемента документа
|
|
423
|
+
document.documentElement.dir = getHTMLTextDir(locale); // установка атрибута dir для корневого элемента документа
|
|
438
424
|
}, [locale]);
|
|
439
425
|
};
|
|
440
426
|
```
|
|
441
427
|
|
|
442
428
|
Затем используйте его в вашем корневом компоненте:
|
|
443
429
|
|
|
444
|
-
```tsx fileName="src/routes/{-$locale}/index.tsx"
|
|
430
|
+
```tsx fileName="src/routes/{-$locale}/index.tsx"
|
|
445
431
|
import { createFileRoute, Navigate, Outlet } from "@tanstack/react-router";
|
|
446
|
-
import { configuration } from "intlayer";
|
|
447
432
|
import { IntlayerProvider, useLocale } from "react-intlayer";
|
|
448
433
|
|
|
449
|
-
import { useI18nHTMLAttributes } from "@/hooks/useI18nHTMLAttributes"; //
|
|
434
|
+
import { useI18nHTMLAttributes } from "@/hooks/useI18nHTMLAttributes"; // импортируем хук
|
|
450
435
|
|
|
451
436
|
export const Route = createFileRoute("/{-$locale}")({
|
|
452
437
|
component: LayoutComponent,
|
|
453
438
|
});
|
|
454
439
|
|
|
455
440
|
function LayoutComponent() {
|
|
456
|
-
useI18nHTMLAttributes(); //
|
|
441
|
+
useI18nHTMLAttributes(); // добавляем эту строку
|
|
457
442
|
|
|
443
|
+
const { defaultLocale } = useLocale();
|
|
458
444
|
const { locale } = Route.useParams();
|
|
459
445
|
|
|
460
446
|
return (
|
|
461
|
-
<IntlayerProvider locale={locale}>
|
|
447
|
+
<IntlayerProvider locale={locale ?? defaultLocale}>
|
|
462
448
|
<Outlet />
|
|
463
449
|
</IntlayerProvider>
|
|
464
450
|
);
|
|
465
451
|
}
|
|
466
452
|
```
|
|
467
453
|
|
|
468
|
-
|
|
454
|
+
---
|
|
469
455
|
|
|
470
|
-
|
|
456
|
+
### Шаг 11: Добавление middleware (необязательно)
|
|
471
457
|
|
|
472
|
-
|
|
473
|
-
# Сборка словарей Intlayer
|
|
474
|
-
npm run intlayer:build
|
|
458
|
+
Вы также можете использовать `intlayerMiddleware` для добавления маршрутизации на стороне сервера в ваше приложение. Этот плагин автоматически определит текущую локаль на основе URL и установит соответствующий cookie с локалью. Если локаль не указана, плагин определит наиболее подходящую локаль на основе языковых предпочтений браузера пользователя. Если локаль не будет обнаружена, произойдет перенаправление на локаль по умолчанию.
|
|
475
459
|
|
|
476
|
-
|
|
477
|
-
npm run dev
|
|
478
|
-
```
|
|
460
|
+
> Обратите внимание, что для использования `intlayerMiddleware` в продакшене необходимо переместить пакет `vite-intlayer` из `devDependencies` в `dependencies`.
|
|
479
461
|
|
|
480
|
-
```
|
|
481
|
-
|
|
482
|
-
|
|
462
|
+
```typescript {3,7} fileName="vite.config.ts"
|
|
463
|
+
import { reactRouter } from "@react-router/dev/vite";
|
|
464
|
+
import tailwindcss from "@tailwindcss/vite";
|
|
465
|
+
import { defineConfig } from "vite";
|
|
466
|
+
import { intlayer, intlayerMiddleware } from "vite-intlayer";
|
|
467
|
+
import tsconfigPaths from "vite-tsconfig-paths";
|
|
483
468
|
|
|
484
|
-
|
|
485
|
-
|
|
469
|
+
export default defineConfig({
|
|
470
|
+
plugins: [
|
|
471
|
+
tailwindcss(),
|
|
472
|
+
reactRouter(),
|
|
473
|
+
tsconfigPaths(),
|
|
474
|
+
intlayer(),
|
|
475
|
+
intlayerMiddleware(),
|
|
476
|
+
],
|
|
477
|
+
});
|
|
486
478
|
```
|
|
487
479
|
|
|
488
|
-
|
|
489
|
-
# Сборка словарей Intlayer
|
|
490
|
-
yarn intlayer:build
|
|
491
|
-
|
|
492
|
-
# Запуск сервера разработки
|
|
493
|
-
yarn dev
|
|
494
|
-
```
|
|
480
|
+
---
|
|
495
481
|
|
|
496
482
|
### Шаг 12: Настройка TypeScript (необязательно)
|
|
497
483
|
|
|
498
|
-
Intlayer использует расширение модулей (module augmentation), чтобы использовать преимущества TypeScript и сделать
|
|
484
|
+
Intlayer использует расширение модулей (module augmentation), чтобы использовать преимущества TypeScript и сделать вашу кодовую базу более надежной.
|
|
499
485
|
|
|
500
486
|
Убедитесь, что ваша конфигурация TypeScript включает автоматически сгенерированные типы:
|
|
501
487
|
|
|
502
488
|
```json5 fileName="tsconfig.json"
|
|
503
489
|
{
|
|
504
|
-
|
|
505
|
-
// ... ваши существующие настройки TypeScript
|
|
506
|
-
},
|
|
490
|
+
// ... ваши существующие настройки
|
|
507
491
|
include: [
|
|
508
492
|
// ... ваши существующие включения
|
|
509
493
|
".intlayer/**/*.ts", // Включить автоматически сгенерированные типы
|
|
@@ -511,11 +495,13 @@ Intlayer использует расширение модулей (module augmen
|
|
|
511
495
|
}
|
|
512
496
|
```
|
|
513
497
|
|
|
498
|
+
---
|
|
499
|
+
|
|
514
500
|
### Конфигурация Git
|
|
515
501
|
|
|
516
|
-
Рекомендуется игнорировать файлы, сгенерированные Intlayer. Это позволит избежать их коммита в ваш
|
|
502
|
+
Рекомендуется игнорировать файлы, сгенерированные Intlayer. Это позволит избежать их коммита в ваш Git-репозиторий.
|
|
517
503
|
|
|
518
|
-
|
|
504
|
+
Чтобы сделать это, вы можете добавить следующие инструкции в ваш файл `.gitignore`:
|
|
519
505
|
|
|
520
506
|
```plaintext fileName=".gitignore"
|
|
521
507
|
# Игнорировать файлы, сгенерированные Intlayer
|
|
@@ -524,67 +510,9 @@ Intlayer использует расширение модулей (module augmen
|
|
|
524
510
|
|
|
525
511
|
---
|
|
526
512
|
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
```typescript fileName="src/routes/{-$locale}/rotue.tsx" codeFormat="typescript"
|
|
530
|
-
function LayoutComponent() {
|
|
531
|
-
useI18nHTMLAttributes();
|
|
532
|
-
|
|
533
|
-
const { locale } = Route.useParams();
|
|
534
|
-
const { locale: selectedLocale } = useLocale();
|
|
535
|
-
const { defaultLocale } = configuration.internationalization;
|
|
536
|
-
const { prefixDefault } = configuration.middleware;
|
|
537
|
-
|
|
538
|
-
// Перенаправление на локаль по умолчанию, если в URL отсутствует локаль и prefixDefault установлен в true
|
|
539
|
-
if (selectedLocale === defaultLocale && !locale && prefixDefault) {
|
|
540
|
-
return <Navigate replace to={defaultLocale} />;
|
|
541
|
-
}
|
|
542
|
-
|
|
543
|
-
// Перенаправление на выбранную локаль, если локаль в URL не совпадает с выбранной локалью
|
|
544
|
-
if (selectedLocale !== defaultLocale && !locale) {
|
|
545
|
-
return <Navigate replace to={selectedLocale} />;
|
|
546
|
-
}
|
|
547
|
-
|
|
548
|
-
return (
|
|
549
|
-
<IntlayerProvider locale={locale}>
|
|
550
|
-
<Outlet />
|
|
551
|
-
</IntlayerProvider>
|
|
552
|
-
);
|
|
553
|
-
}
|
|
554
|
-
```
|
|
555
|
-
|
|
556
|
-
## Развертывание в продакшн
|
|
557
|
-
|
|
558
|
-
При развертывании вашего приложения:
|
|
559
|
-
|
|
560
|
-
1. **Соберите ваше приложение:**
|
|
561
|
-
|
|
562
|
-
```bash
|
|
563
|
-
npm run build
|
|
564
|
-
```
|
|
565
|
-
|
|
566
|
-
2. **Соберите словари Intlayer:**
|
|
567
|
-
|
|
568
|
-
```bash
|
|
569
|
-
npm run intlayer:build
|
|
570
|
-
```
|
|
571
|
-
|
|
572
|
-
3. **Переместите `vite-intlayer` в зависимости**, если используете middleware в продакшн:
|
|
573
|
-
```bash
|
|
574
|
-
npm install vite-intlayer --save
|
|
575
|
-
```
|
|
576
|
-
|
|
577
|
-
Теперь ваше приложение будет поддерживать:
|
|
578
|
-
|
|
579
|
-
- **Структуру URL**: `/en`, `/en/about`, `/tr`, `/tr/about`
|
|
580
|
-
- **Автоматическое определение локали** на основе настроек браузера
|
|
581
|
-
- **Маршрутизацию с учётом локали** с использованием Tanstack Start
|
|
582
|
-
- **Поддержку TypeScript** с автогенерируемыми типами
|
|
583
|
-
- **Серверный рендеринг** с правильной обработкой локали
|
|
584
|
-
|
|
585
|
-
## Расширение для VS Code
|
|
513
|
+
## Расширение VS Code
|
|
586
514
|
|
|
587
|
-
|
|
515
|
+
Для улучшения вашего опыта разработки с Intlayer вы можете установить официальное **расширение Intlayer для VS Code**.
|
|
588
516
|
|
|
589
517
|
[Установить из VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=intlayer.intlayer-vs-code-extension)
|
|
590
518
|
|
|
@@ -593,15 +521,15 @@ function LayoutComponent() {
|
|
|
593
521
|
- **Автозаполнение** ключей переводов.
|
|
594
522
|
- **Обнаружение ошибок в реальном времени** для отсутствующих переводов.
|
|
595
523
|
- **Встроенный просмотр** переведённого контента.
|
|
596
|
-
- **Быстрые действия** для
|
|
524
|
+
- **Быстрые действия** для лёгкого создания и обновления переводов.
|
|
597
525
|
|
|
598
|
-
Для получения дополнительной информации о том, как использовать расширение, обратитесь к [документации
|
|
526
|
+
Для получения дополнительной информации о том, как использовать расширение, обратитесь к [документации расширения Intlayer для VS Code](https://intlayer.org/doc/vs-code-extension).
|
|
599
527
|
|
|
600
528
|
---
|
|
601
529
|
|
|
602
530
|
## Продвинутые возможности
|
|
603
531
|
|
|
604
|
-
|
|
532
|
+
Для расширения возможностей вы можете реализовать [визуальный редактор](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).
|
|
605
533
|
|
|
606
534
|
---
|
|
607
535
|
|
|
@@ -610,11 +538,11 @@ function LayoutComponent() {
|
|
|
610
538
|
- [Документация Intlayer](https://intlayer.org)
|
|
611
539
|
- [Документация Tanstack Start](https://reactrouter.com/)
|
|
612
540
|
- [Хук useIntlayer](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/packages/react-intlayer/useIntlayer.md)
|
|
613
|
-
- [
|
|
541
|
+
- [useLocale hook](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/packages/react-intlayer/useLocale.md)
|
|
614
542
|
- [Объявление контента](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/dictionary/get_started.md)
|
|
615
543
|
- [Конфигурация](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/configuration.md)
|
|
616
544
|
|
|
617
|
-
Это
|
|
545
|
+
Это исчерпывающее руководство содержит все необходимое для интеграции Intlayer с Tanstack Start для полностью интернационализированного приложения с маршрутизацией, учитывающей локаль, и поддержкой TypeScript.
|
|
618
546
|
|
|
619
547
|
## История документации
|
|
620
548
|
|