@intlayer/docs 5.7.2-canary.3 → 5.7.3
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 +82 -0
- package/dist/cjs/generated/docs.entry.cjs.map +1 -1
- package/dist/esm/generated/docs.entry.mjs +82 -0
- package/dist/esm/generated/docs.entry.mjs.map +1 -1
- package/dist/types/generated/docs.entry.d.ts +2 -0
- package/dist/types/generated/docs.entry.d.ts.map +1 -1
- package/docs/ar/dictionary/gender.md +275 -0
- package/docs/ar/how_works_intlayer.md +1 -1
- package/docs/ar/locale_mapper.md +246 -0
- package/docs/de/dictionary/gender.md +316 -0
- package/docs/de/how_works_intlayer.md +1 -1
- package/docs/de/locale_mapper.md +244 -0
- package/docs/en/dictionary/gender.md +275 -0
- package/docs/en/how_works_intlayer.md +1 -1
- package/docs/en/index.md +3 -0
- package/docs/en/locale_mapper.md +244 -0
- package/docs/en-GB/dictionary/gender.md +275 -0
- package/docs/en-GB/how_works_intlayer.md +1 -1
- package/docs/en-GB/locale_mapper.md +244 -0
- package/docs/es/dictionary/gender.md +275 -0
- package/docs/es/how_works_intlayer.md +1 -1
- package/docs/es/locale_mapper.md +244 -0
- package/docs/fr/dictionary/gender.md +276 -0
- package/docs/fr/how_works_intlayer.md +1 -1
- package/docs/fr/locale_mapper.md +244 -0
- package/docs/hi/dictionary/gender.md +276 -0
- package/docs/hi/how_works_intlayer.md +1 -1
- package/docs/hi/locale_mapper.md +244 -0
- package/docs/it/dictionary/gender.md +275 -0
- package/docs/it/how_works_intlayer.md +1 -1
- package/docs/it/locale_mapper.md +244 -0
- package/docs/ja/dictionary/gender.md +275 -0
- package/docs/ja/how_works_intlayer.md +1 -1
- package/docs/ja/locale_mapper.md +244 -0
- package/docs/ko/dictionary/gender.md +275 -0
- package/docs/ko/how_works_intlayer.md +1 -1
- package/docs/ko/locale_mapper.md +244 -0
- package/docs/pt/dictionary/gender.md +275 -0
- package/docs/pt/how_works_intlayer.md +1 -1
- package/docs/pt/locale_mapper.md +244 -0
- package/docs/ru/dictionary/gender.md +275 -0
- package/docs/ru/how_works_intlayer.md +1 -1
- package/docs/ru/locale_mapper.md +244 -0
- package/docs/zh/dictionary/gender.md +275 -0
- package/docs/zh/how_works_intlayer.md +1 -1
- package/docs/zh/locale_mapper.md +244 -0
- package/package.json +11 -11
- package/src/generated/docs.entry.ts +82 -0
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
---
|
|
2
|
+
createdAt: 2025-07-27
|
|
3
|
+
updatedAt: 2025-07-27
|
|
4
|
+
title: Контент на основе пола
|
|
5
|
+
description: Узнайте, как использовать контент на основе пола в Intlayer для динамического отображения содержимого в зависимости от пола. Следуйте этой документации, чтобы эффективно реализовать контент, специфичный для пола, в вашем проекте.
|
|
6
|
+
keywords:
|
|
7
|
+
- Контент на основе пола
|
|
8
|
+
- Динамическое отображение
|
|
9
|
+
- Документация
|
|
10
|
+
- Intlayer
|
|
11
|
+
- Next.js
|
|
12
|
+
- JavaScript
|
|
13
|
+
- React
|
|
14
|
+
slugs:
|
|
15
|
+
- doc
|
|
16
|
+
- concept
|
|
17
|
+
- content
|
|
18
|
+
- gender
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
# Контент на основе пола / Пол в Intlayer
|
|
22
|
+
|
|
23
|
+
## Как работает пол
|
|
24
|
+
|
|
25
|
+
В Intlayer контент на основе пола реализуется с помощью функции `gender`, которая сопоставляет конкретные значения пола ('male', 'female') с соответствующим содержимым. Такой подход позволяет динамически выбирать контент в зависимости от указанного пола. При интеграции с React Intlayer или Next Intlayer соответствующий контент автоматически выбирается в соответствии с полом, переданным во время выполнения.
|
|
26
|
+
|
|
27
|
+
## Настройка контента на основе пола
|
|
28
|
+
|
|
29
|
+
Чтобы настроить контент на основе пола в вашем проекте Intlayer, создайте модуль контента, который включает определения, специфичные для пола. Ниже приведены примеры в различных форматах.
|
|
30
|
+
|
|
31
|
+
```typescript fileName="**/*.content.ts" contentDeclarationFormat="typescript"
|
|
32
|
+
import { gender, type Dictionary } from "intlayer";
|
|
33
|
+
|
|
34
|
+
const myGenderContent = {
|
|
35
|
+
key: "my_key",
|
|
36
|
+
content: {
|
|
37
|
+
myGender: gender({
|
|
38
|
+
male: "мой контент для мужчин",
|
|
39
|
+
female: "мой контент для женщин",
|
|
40
|
+
fallback: "мой контент, когда пол не указан", // Необязательно
|
|
41
|
+
}),
|
|
42
|
+
},
|
|
43
|
+
} satisfies Dictionary;
|
|
44
|
+
|
|
45
|
+
export default myGenderContent;
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
```javascript fileName="**/*.content.mjs" contentDeclarationFormat="esm"
|
|
49
|
+
import { gender } from "intlayer";
|
|
50
|
+
|
|
51
|
+
/** @type {import('intlayer').Dictionary} */
|
|
52
|
+
const myGenderContent = {
|
|
53
|
+
key: "my_key",
|
|
54
|
+
content: {
|
|
55
|
+
myGender: gender({
|
|
56
|
+
male: "мой контент для мужчин",
|
|
57
|
+
female: "мой контент для женщин",
|
|
58
|
+
fallback: "мой контент, когда пол не указан", // Необязательно
|
|
59
|
+
}),
|
|
60
|
+
},
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
export default myGenderContent;
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
```javascript fileName="**/*.content.cjs" contentDeclarationFormat="commonjs"
|
|
67
|
+
const { gender } = require("intlayer");
|
|
68
|
+
|
|
69
|
+
/** @type {import('intlayer').Dictionary} */
|
|
70
|
+
const myGenderContent = {
|
|
71
|
+
key: "my_key",
|
|
72
|
+
content: {
|
|
73
|
+
myGender: gender({
|
|
74
|
+
male: "мой контент для мужчин",
|
|
75
|
+
female: "мой контент для женщин",
|
|
76
|
+
fallback: "мой контент, когда пол не указан", // Необязательно
|
|
77
|
+
}),
|
|
78
|
+
},
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
module.exports = myGenderContent;
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
```json5 fileName="**/*.content.json" contentDeclarationFormat="json"
|
|
85
|
+
{
|
|
86
|
+
"$schema": "https://intlayer.org/schema.json",
|
|
87
|
+
"key": "my_key",
|
|
88
|
+
"content": {
|
|
89
|
+
"myGender": {
|
|
90
|
+
"nodeType": "gender",
|
|
91
|
+
"gender": {
|
|
92
|
+
"male": "мой контент для мужчин",
|
|
93
|
+
"female": "мой контент для женщин",
|
|
94
|
+
"fallback": "мой контент, когда пол не указан", // Необязательно
|
|
95
|
+
},
|
|
96
|
+
},
|
|
97
|
+
},
|
|
98
|
+
}
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
> Если не указан fallback, в качестве fallback будет взят последний объявленный ключ, если пол не указан или не соответствует ни одному из определённых полов.
|
|
102
|
+
|
|
103
|
+
## Использование контента на основе пола с React Intlayer
|
|
104
|
+
|
|
105
|
+
Чтобы использовать контент, зависящий от пола, внутри React-компонента, импортируйте и используйте хук `useIntlayer` из пакета `react-intlayer`. Этот хук получает контент по указанному ключу и позволяет передать пол для выбора соответствующего варианта вывода.
|
|
106
|
+
|
|
107
|
+
```tsx fileName="**/*.tsx" codeFormat="typescript"
|
|
108
|
+
import type { FC } from "react";
|
|
109
|
+
import { useIntlayer } from "react-intlayer";
|
|
110
|
+
|
|
111
|
+
const GenderComponent: FC = () => {
|
|
112
|
+
const { myGender } = useIntlayer("my_key");
|
|
113
|
+
|
|
114
|
+
return (
|
|
115
|
+
<div>
|
|
116
|
+
<p>
|
|
117
|
+
{
|
|
118
|
+
/* Вывод: мой контент для мужчин */
|
|
119
|
+
myGender("male")
|
|
120
|
+
}
|
|
121
|
+
</p>
|
|
122
|
+
<p>
|
|
123
|
+
{
|
|
124
|
+
/* Вывод: мой контент для женщин */
|
|
125
|
+
myGender("female")
|
|
126
|
+
}
|
|
127
|
+
</p>
|
|
128
|
+
<p>
|
|
129
|
+
{
|
|
130
|
+
/* Вывод: мой контент для мужчин */
|
|
131
|
+
myGender("m")
|
|
132
|
+
}
|
|
133
|
+
</p>
|
|
134
|
+
<p>
|
|
135
|
+
{
|
|
136
|
+
/* Вывод: мой контент для женщин */
|
|
137
|
+
myGender("f")
|
|
138
|
+
}
|
|
139
|
+
</p>
|
|
140
|
+
<p>
|
|
141
|
+
{
|
|
142
|
+
/* Вывод: мой контент, когда пол не указан */
|
|
143
|
+
myGender("")
|
|
144
|
+
}
|
|
145
|
+
</p>
|
|
146
|
+
<p>
|
|
147
|
+
{
|
|
148
|
+
/* Вывод: мой контент, когда пол не указан */
|
|
149
|
+
myGender(undefined)
|
|
150
|
+
}
|
|
151
|
+
</p>
|
|
152
|
+
</div>
|
|
153
|
+
);
|
|
154
|
+
};
|
|
155
|
+
|
|
156
|
+
export default GenderComponent;
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
```javascript fileName="**/*.mjx" codeFormat="esm"
|
|
160
|
+
import { useIntlayer } from "react-intlayer";
|
|
161
|
+
|
|
162
|
+
const GenderComponent = () => {
|
|
163
|
+
const { myGender } = useIntlayer("my_key");
|
|
164
|
+
|
|
165
|
+
return (
|
|
166
|
+
<div>
|
|
167
|
+
<p>
|
|
168
|
+
{
|
|
169
|
+
/* Вывод: мой контент для мужчин */
|
|
170
|
+
myGender("male")
|
|
171
|
+
}
|
|
172
|
+
</p>
|
|
173
|
+
<p>
|
|
174
|
+
{
|
|
175
|
+
/* Вывод: мой контент для женщин */
|
|
176
|
+
myGender("female")
|
|
177
|
+
}
|
|
178
|
+
</p>
|
|
179
|
+
<p>
|
|
180
|
+
{
|
|
181
|
+
/* Вывод: мой контент для мужчин */
|
|
182
|
+
myGender("m")
|
|
183
|
+
}
|
|
184
|
+
</p>
|
|
185
|
+
<p>
|
|
186
|
+
{
|
|
187
|
+
/* Вывод: мой контент для женщин */
|
|
188
|
+
myGender("f")
|
|
189
|
+
}
|
|
190
|
+
</p>
|
|
191
|
+
<p>
|
|
192
|
+
{
|
|
193
|
+
/* Вывод: мой контент, когда пол не указан */
|
|
194
|
+
myGender("")
|
|
195
|
+
}
|
|
196
|
+
</p>
|
|
197
|
+
<p>
|
|
198
|
+
{
|
|
199
|
+
/* Вывод: мой контент, когда пол не указан */
|
|
200
|
+
myGender(undefined)
|
|
201
|
+
}
|
|
202
|
+
</p>
|
|
203
|
+
</div>
|
|
204
|
+
);
|
|
205
|
+
};
|
|
206
|
+
|
|
207
|
+
export default GenderComponent;
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
```javascript fileName="**/*.cjs" codeFormat="commonjs"
|
|
211
|
+
const { useIntlayer } = require("react-intlayer");
|
|
212
|
+
|
|
213
|
+
const GenderComponent = () => {
|
|
214
|
+
const { myGender } = useIntlayer("my_key");
|
|
215
|
+
|
|
216
|
+
return (
|
|
217
|
+
<div>
|
|
218
|
+
<p>
|
|
219
|
+
{
|
|
220
|
+
/* Вывод: мой контент для мужчин */
|
|
221
|
+
myGender("male")
|
|
222
|
+
}
|
|
223
|
+
</p>
|
|
224
|
+
<p>
|
|
225
|
+
{
|
|
226
|
+
/* Вывод: мой контент для женщин */
|
|
227
|
+
myGender("female")
|
|
228
|
+
}
|
|
229
|
+
</p>
|
|
230
|
+
<p>
|
|
231
|
+
{
|
|
232
|
+
/* Вывод: мой контент для мужчин */
|
|
233
|
+
myGender("m")
|
|
234
|
+
}
|
|
235
|
+
</p>
|
|
236
|
+
<p>
|
|
237
|
+
{
|
|
238
|
+
/* Вывод: мой контент для женщин */
|
|
239
|
+
myGender("f")
|
|
240
|
+
}
|
|
241
|
+
</p>
|
|
242
|
+
<p>
|
|
243
|
+
{
|
|
244
|
+
/* Вывод: мой контент, когда пол не указан */
|
|
245
|
+
myGender("")
|
|
246
|
+
}
|
|
247
|
+
</p>
|
|
248
|
+
<p>
|
|
249
|
+
{
|
|
250
|
+
/* Вывод: мой контент, когда пол не указан */
|
|
251
|
+
myGender(undefined)
|
|
252
|
+
}
|
|
253
|
+
</p>
|
|
254
|
+
</div>
|
|
255
|
+
);
|
|
256
|
+
};
|
|
257
|
+
|
|
258
|
+
module.exports = GenderComponent;
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
## Дополнительные ресурсы
|
|
262
|
+
|
|
263
|
+
Для получения более подробной информации о настройке и использовании обратитесь к следующим ресурсам:
|
|
264
|
+
|
|
265
|
+
- [Документация Intlayer CLI](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/intlayer_cli.md)
|
|
266
|
+
- [Документация React Intlayer](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/intlayer_with_create_react_app.md)
|
|
267
|
+
- [Документация Next Intlayer](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/intlayer_with_nextjs_15.md)
|
|
268
|
+
|
|
269
|
+
Эти ресурсы предлагают дополнительные сведения о настройке и использовании Intlayer в различных средах и фреймворках.
|
|
270
|
+
|
|
271
|
+
## История документации
|
|
272
|
+
|
|
273
|
+
| Версия | Дата | Изменения |
|
|
274
|
+
| ------ | ---------- | -------------------------------------- |
|
|
275
|
+
| 5.7.2 | 2025-07-27 | Введение контента, основанного на поле |
|
|
@@ -93,7 +93,7 @@ Intlayer также предоставляет визуальный редакт
|
|
|
93
93
|
|
|
94
94
|
- Сервер — это простое приложение на Express, которое прослушивает запросы от клиента и получает контент вашего приложения, такой как `dictionaries` и конфигурация, чтобы сделать его доступным на стороне клиента.
|
|
95
95
|
- С другой стороны, клиент — это приложение на React, которое используется для взаимодействия с вашим контентом через визуальный интерфейс.
|
|
96
|
-
Когда вы вызываете ваш контент с помощью `useIntlayer` и редактор включен, строки автоматически оборачиваются в объект Proxy с именем `IntlayerNode`. Этот узел использует `window.
|
|
96
|
+
Когда вы вызываете ваш контент с помощью `useIntlayer` и редактор включен, строки автоматически оборачиваются в объект Proxy с именем `IntlayerNode`. Этот узел использует `window.postMessage` для связи с обернутым iframe, содержащим интерфейс визуального редактора.
|
|
97
97
|
Со стороны редактора, редактор прослушивает эти сообщения и имитирует реальное взаимодействие с вашим контентом, позволяя редактировать текст напрямую в контексте вашего приложения.
|
|
98
98
|
|
|
99
99
|
## Оптимизация сборки приложения
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
---
|
|
2
|
+
createdAt: 2025-07-27
|
|
3
|
+
updatedAt: 2025-07-27
|
|
4
|
+
title: Отображатель локалей
|
|
5
|
+
description: Узнайте, как работает Отображатель локалей. Посмотрите шаги, которые использует Отображатель локалей в вашем приложении. Узнайте, что делают разные пакеты.
|
|
6
|
+
keywords:
|
|
7
|
+
- Отображатель локалей
|
|
8
|
+
- Начало работы
|
|
9
|
+
- Intlayer
|
|
10
|
+
- Приложение
|
|
11
|
+
- Пакеты
|
|
12
|
+
slugs:
|
|
13
|
+
- doc
|
|
14
|
+
- locale-mapper
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
# Отображатель локалей
|
|
18
|
+
|
|
19
|
+
Отображатель локалей — это мощный инструмент, который помогает работать с данными интернационализации в вашем приложении Intlayer. Он предоставляет три основные функции для преобразования и организации данных, специфичных для локали: `localeMap`, `localeFlatMap` и `localeRecord`.
|
|
20
|
+
|
|
21
|
+
## Как работает Отображатель локалей
|
|
22
|
+
|
|
23
|
+
Отображатель локалей работает с объектом `LocaleData`, который содержит всю необходимую информацию о локали:
|
|
24
|
+
|
|
25
|
+
```typescript
|
|
26
|
+
type LocaleData = {
|
|
27
|
+
locale: LocalesValues; // Текущий код локали (например, 'en', 'fr')
|
|
28
|
+
defaultLocale: LocalesValues; // Код локали по умолчанию
|
|
29
|
+
isDefault: boolean; // Является ли эта локаль локалью по умолчанию
|
|
30
|
+
locales: LocalesValues[]; // Массив всех доступных локалей
|
|
31
|
+
urlPrefix: string; // Префикс URL для этой локали (например, '/fr' или '')
|
|
32
|
+
};
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
Функции отображателя автоматически генерируют эти данные для каждой локали в вашей конфигурации, учитывая:
|
|
36
|
+
|
|
37
|
+
- Ваш список настроенных локалей
|
|
38
|
+
- Настройку локали по умолчанию
|
|
39
|
+
- Нужно ли добавлять префикс для локали по умолчанию в URL
|
|
40
|
+
|
|
41
|
+
## Основные функции
|
|
42
|
+
|
|
43
|
+
### `localeMap`
|
|
44
|
+
|
|
45
|
+
Преобразует каждую локаль в один объект с помощью функции отображения.
|
|
46
|
+
|
|
47
|
+
```typescript
|
|
48
|
+
localeMap<T>(
|
|
49
|
+
mapper: (locale: LocaleData) => T,
|
|
50
|
+
locales?: LocalesValues[],
|
|
51
|
+
defaultLocale?: LocalesValues,
|
|
52
|
+
prefixDefault?: boolean
|
|
53
|
+
): T[]
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
**Пример: Создание объектов маршрутов**
|
|
57
|
+
|
|
58
|
+
```typescript
|
|
59
|
+
import { localeMap } from "intlayer";
|
|
60
|
+
|
|
61
|
+
const routes = localeMap((localizedData) => ({
|
|
62
|
+
path: localizedData.urlPrefix,
|
|
63
|
+
name: localizedData.locale,
|
|
64
|
+
isDefault: localizedData.isDefault,
|
|
65
|
+
locales: localizedData.locales,
|
|
66
|
+
defaultLocale: localizedData.defaultLocale,
|
|
67
|
+
}));
|
|
68
|
+
|
|
69
|
+
// Результат:
|
|
70
|
+
// [
|
|
71
|
+
// { path: '/', name: 'en', isDefault: true, locales: ['en', 'fr', 'es'], defaultLocale: 'en' },
|
|
72
|
+
// { path: '/fr', name: 'fr', isDefault: false, locales: ['en', 'fr', 'es'], defaultLocale: 'en' },
|
|
73
|
+
// { path: '/es', name: 'es', isDefault: false, locales: ['en', 'fr', 'es'], defaultLocale: 'en' }
|
|
74
|
+
// ]
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### `localeFlatMap`
|
|
78
|
+
|
|
79
|
+
Похож на `localeMap`, но функция преобразования возвращает массив объектов, который затем объединяется в один плоский массив.
|
|
80
|
+
|
|
81
|
+
```typescript
|
|
82
|
+
localeFlatMap<T>(
|
|
83
|
+
mapper: (locale: LocaleData) => T[],
|
|
84
|
+
locales?: LocalesValues[],
|
|
85
|
+
defaultLocale?: LocalesValues,
|
|
86
|
+
prefixDefault?: boolean
|
|
87
|
+
): T[]
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
**Пример: Создание нескольких маршрутов для каждой локали**
|
|
91
|
+
|
|
92
|
+
```typescript
|
|
93
|
+
import { localeFlatMap } from "intlayer";
|
|
94
|
+
|
|
95
|
+
const routes = localeFlatMap((localizedData) => [
|
|
96
|
+
{
|
|
97
|
+
path: localizedData.urlPrefix,
|
|
98
|
+
name: localizedData.locale,
|
|
99
|
+
isDefault: localizedData.isDefault,
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
path: `${localizedData.urlPrefix}/about`,
|
|
103
|
+
name: `${localizedData.locale}-about`,
|
|
104
|
+
isDefault: localizedData.isDefault,
|
|
105
|
+
},
|
|
106
|
+
]);
|
|
107
|
+
|
|
108
|
+
// Результат:
|
|
109
|
+
// [
|
|
110
|
+
// { path: '/', name: 'en', isDefault: true },
|
|
111
|
+
// { path: '/about', name: 'en-about', isDefault: true },
|
|
112
|
+
// { path: '/fr', name: 'fr', isDefault: false },
|
|
113
|
+
// { path: '/fr/about', name: 'fr-about', isDefault: false },
|
|
114
|
+
// { path: '/es', name: 'es', isDefault: false },
|
|
115
|
+
// { path: '/es/about', name: 'es-about', isDefault: false }
|
|
116
|
+
// ]
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
### `localeRecord`
|
|
120
|
+
|
|
121
|
+
Создаёт объект-запись, где каждая локаль является ключом, отображающимся на значение, преобразованное функцией mapper.
|
|
122
|
+
|
|
123
|
+
```typescript
|
|
124
|
+
localeRecord<T>(
|
|
125
|
+
mapper: (locale: LocaleData) => T,
|
|
126
|
+
locales?: Locales[],
|
|
127
|
+
defaultLocale?: Locales,
|
|
128
|
+
prefixDefault?: boolean
|
|
129
|
+
): Record<Locales, T>
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
**Пример: Загрузка файлов переводов**
|
|
133
|
+
|
|
134
|
+
```typescript
|
|
135
|
+
import { localeRecord } from "intlayer";
|
|
136
|
+
|
|
137
|
+
const translations = localeRecord(({ locale }) =>
|
|
138
|
+
require(`./translations/${locale}.json`)
|
|
139
|
+
);
|
|
140
|
+
|
|
141
|
+
// Результат:
|
|
142
|
+
// {
|
|
143
|
+
// en: { welcome: 'Welcome', hello: 'Hello' },
|
|
144
|
+
// fr: { welcome: 'Bienvenue', hello: 'Bonjour' },
|
|
145
|
+
// es: { welcome: 'Bienvenido', hello: 'Hola' }
|
|
146
|
+
// }
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
## Настройка Locale Mapper
|
|
150
|
+
|
|
151
|
+
Locale Mapper автоматически использует вашу конфигурацию Intlayer, но вы можете переопределить значения по умолчанию, передав параметры:
|
|
152
|
+
|
|
153
|
+
### Использование конфигурации по умолчанию
|
|
154
|
+
|
|
155
|
+
```typescript
|
|
156
|
+
import { localeMap } from "intlayer";
|
|
157
|
+
|
|
158
|
+
// Использует конфигурацию из intlayer.config.ts
|
|
159
|
+
const routes = localeMap((data) => ({
|
|
160
|
+
path: data.urlPrefix,
|
|
161
|
+
locale: data.locale,
|
|
162
|
+
}));
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
### Переопределение конфигурации
|
|
166
|
+
|
|
167
|
+
```typescript
|
|
168
|
+
import { localeMap } from "intlayer";
|
|
169
|
+
|
|
170
|
+
// Переопределение локалей и локали по умолчанию
|
|
171
|
+
const customRoutes = localeMap(
|
|
172
|
+
(data) => ({ path: data.urlPrefix, locale: data.locale }),
|
|
173
|
+
// ["en", "fr", "de"], // Пользовательские локали
|
|
174
|
+
"en", // Пользовательская локаль по умолчанию
|
|
175
|
+
true // Добавлять префикс локали по умолчанию в URL
|
|
176
|
+
);
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
## Расширенные примеры использования
|
|
180
|
+
|
|
181
|
+
### Создание навигационных меню
|
|
182
|
+
|
|
183
|
+
```typescript
|
|
184
|
+
import { localeMap } from "intlayer";
|
|
185
|
+
|
|
186
|
+
const navigationItems = localeMap((data) => ({
|
|
187
|
+
label: data.locale.toUpperCase(),
|
|
188
|
+
href: data.urlPrefix || "/",
|
|
189
|
+
isActive: data.isDefault,
|
|
190
|
+
flag: `/flags/${data.locale}.svg`, // путь к изображению флага
|
|
191
|
+
}));
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
### Генерация данных для Sitemap
|
|
195
|
+
|
|
196
|
+
```typescript
|
|
197
|
+
import { localeFlatMap } from "intlayer";
|
|
198
|
+
|
|
199
|
+
const sitemapUrls = localeFlatMap((data) => [
|
|
200
|
+
{
|
|
201
|
+
url: `${data.urlPrefix}/`,
|
|
202
|
+
lastmod: new Date().toISOString(),
|
|
203
|
+
changefreq: "daily",
|
|
204
|
+
priority: data.isDefault ? 1.0 : 0.8,
|
|
205
|
+
},
|
|
206
|
+
{
|
|
207
|
+
url: `${data.urlPrefix}/about`,
|
|
208
|
+
lastmod: new Date().toISOString(),
|
|
209
|
+
changefreq: "monthly",
|
|
210
|
+
priority: data.isDefault ? 0.8 : 0.6,
|
|
211
|
+
},
|
|
212
|
+
]);
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
### Динамическая загрузка переводов
|
|
216
|
+
|
|
217
|
+
```typescript
|
|
218
|
+
import { localeRecord } from "intlayer";
|
|
219
|
+
|
|
220
|
+
const translationModules = localeRecord(({ locale }) => ({
|
|
221
|
+
messages: import(`./locales/${locale}/messages.json`), // импорт сообщений перевода
|
|
222
|
+
validation: import(`./locales/${locale}/validation.json`), // импорт правил валидации
|
|
223
|
+
metadata: {
|
|
224
|
+
locale,
|
|
225
|
+
direction: ["ar", "he", "fa"].includes(locale) ? "rtl" : "ltr", // направление текста: справа налево для арабского, иврита, фарси
|
|
226
|
+
},
|
|
227
|
+
}));
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
## Интеграция с конфигурацией
|
|
231
|
+
|
|
232
|
+
Locale Mapper бесшовно интегрируется с вашей конфигурацией Intlayer:
|
|
233
|
+
|
|
234
|
+
- **Локали**: Автоматически использует `configuration.internationalization.locales`
|
|
235
|
+
- **Локаль по умолчанию**: Использует `configuration.internationalization.defaultLocale`
|
|
236
|
+
- **Префикс URL**: Учитывает `configuration.middleware.prefixDefault`
|
|
237
|
+
|
|
238
|
+
Это обеспечивает согласованность во всем вашем приложении и уменьшает дублирование конфигурации.
|
|
239
|
+
|
|
240
|
+
## История документации
|
|
241
|
+
|
|
242
|
+
| Версия | Дата | Изменения |
|
|
243
|
+
| ------ | ---------- | --------------------------------------- |
|
|
244
|
+
| 5.7.2 | 2025-07-27 | Добавлена документация по locale mapper |
|