@intlayer/docs 5.7.6 → 5.7.8
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 +44 -238
- package/dist/cjs/generated/docs.entry.cjs.map +1 -1
- package/dist/esm/generated/docs.entry.mjs +44 -238
- package/dist/esm/generated/docs.entry.mjs.map +1 -1
- package/dist/types/generated/docs.entry.d.ts +1 -2
- package/dist/types/generated/docs.entry.d.ts.map +1 -1
- package/docs/ar/CI_CD.md +67 -41
- package/docs/ar/intlayer_with_tanstack.md +457 -0
- package/docs/ar/packages/next-intlayer/index.md +0 -1
- package/docs/ar/packages/react-intlayer/index.md +0 -1
- package/docs/de/CI_CD.md +63 -37
- package/docs/de/intlayer_with_tanstack.md +458 -0
- package/docs/de/packages/next-intlayer/index.md +0 -1
- package/docs/de/packages/react-intlayer/index.md +0 -1
- package/docs/en/CI_CD.md +51 -27
- package/docs/en/intlayer_with_tanstack.md +452 -0
- package/docs/en/packages/next-intlayer/index.md +0 -1
- package/docs/en/packages/react-intlayer/index.md +0 -1
- package/docs/en-GB/CI_CD.md +58 -32
- package/docs/en-GB/intlayer_with_tanstack.md +457 -0
- package/docs/en-GB/packages/next-intlayer/index.md +0 -1
- package/docs/en-GB/packages/react-intlayer/index.md +0 -1
- package/docs/es/CI_CD.md +68 -42
- package/docs/es/intlayer_with_tanstack.md +435 -0
- package/docs/es/packages/next-intlayer/index.md +0 -1
- package/docs/es/packages/react-intlayer/index.md +0 -1
- package/docs/fr/intlayer_with_tanstack.md +435 -0
- package/docs/fr/packages/next-intlayer/index.md +0 -1
- package/docs/fr/packages/react-intlayer/index.md +0 -1
- package/docs/hi/CI_CD.md +69 -44
- package/docs/hi/intlayer_with_tanstack.md +438 -0
- package/docs/hi/packages/next-intlayer/index.md +0 -1
- package/docs/hi/packages/react-intlayer/index.md +0 -1
- package/docs/it/CI_CD.md +67 -41
- package/docs/it/intlayer_with_tanstack.md +457 -0
- package/docs/it/packages/next-intlayer/index.md +0 -1
- package/docs/it/packages/react-intlayer/index.md +0 -1
- package/docs/ja/CI_CD.md +67 -41
- package/docs/ja/intlayer_with_tanstack.md +457 -0
- package/docs/ja/packages/next-intlayer/index.md +0 -1
- package/docs/ja/packages/react-intlayer/index.md +0 -1
- package/docs/ko/CI_CD.md +63 -37
- package/docs/ko/intlayer_with_tanstack.md +457 -0
- package/docs/ko/packages/next-intlayer/index.md +0 -1
- package/docs/ko/packages/react-intlayer/index.md +0 -1
- package/docs/pt/CI_CD.md +67 -41
- package/docs/pt/intlayer_with_tanstack.md +457 -0
- package/docs/pt/packages/next-intlayer/index.md +0 -1
- package/docs/pt/packages/react-intlayer/index.md +0 -1
- package/docs/ru/CI_CD.md +70 -44
- package/docs/ru/intlayer_with_tanstack.md +458 -0
- package/docs/ru/packages/next-intlayer/index.md +0 -1
- package/docs/ru/packages/react-intlayer/index.md +0 -1
- package/docs/zh/CI_CD.md +62 -36
- package/docs/zh/intlayer_with_tanstack.md +435 -0
- package/docs/zh/packages/next-intlayer/index.md +0 -1
- package/docs/zh/packages/react-intlayer/index.md +0 -1
- package/package.json +9 -9
- package/src/generated/docs.entry.ts +44 -238
- package/docs/ar/packages/next-intlayer/useIntlayerAsync.md +0 -237
- package/docs/ar/packages/react-intlayer/useIntlayerAsync.md +0 -252
- package/docs/de/packages/next-intlayer/useIntlayerAsync.md +0 -262
- package/docs/de/packages/react-intlayer/useIntlayerAsync.md +0 -256
- package/docs/en/packages/next-intlayer/useIntlayerAsync.md +0 -239
- package/docs/en/packages/react-intlayer/useIntlayerAsync.md +0 -254
- package/docs/en-GB/packages/next-intlayer/useIntlayerAsync.md +0 -237
- package/docs/en-GB/packages/react-intlayer/useIntlayerAsync.md +0 -257
- package/docs/es/packages/next-intlayer/useIntlayerAsync.md +0 -240
- package/docs/es/packages/react-intlayer/useIntlayerAsync.md +0 -276
- package/docs/fr/packages/next-intlayer/useIntlayerAsync.md +0 -238
- package/docs/fr/packages/react-intlayer/useIntlayerAsync.md +0 -252
- package/docs/hi/packages/next-intlayer/useIntlayerAsync.md +0 -237
- package/docs/hi/packages/react-intlayer/useIntlayerAsync.md +0 -252
- package/docs/it/packages/next-intlayer/useIntlayerAsync.md +0 -237
- package/docs/it/packages/react-intlayer/useIntlayerAsync.md +0 -252
- package/docs/ja/packages/next-intlayer/useIntlayerAsync.md +0 -237
- package/docs/ja/packages/react-intlayer/useIntlayerAsync.md +0 -268
- package/docs/ko/packages/next-intlayer/useIntlayerAsync.md +0 -260
- package/docs/ko/packages/react-intlayer/useIntlayerAsync.md +0 -271
- package/docs/pt/packages/next-intlayer/useIntlayerAsync.md +0 -238
- package/docs/pt/packages/react-intlayer/useIntlayerAsync.md +0 -252
- package/docs/ru/packages/next-intlayer/useIntlayerAsync.md +0 -237
- package/docs/ru/packages/react-intlayer/useIntlayerAsync.md +0 -252
- package/docs/zh/packages/next-intlayer/useIntlayerAsync.md +0 -239
- package/docs/zh/packages/react-intlayer/useIntlayerAsync.md +0 -257
|
@@ -1,252 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
createdAt: 2024-08-11
|
|
3
|
-
updatedAt: 2025-06-29
|
|
4
|
-
title: Документация по хуку useIntlayerAsync | react-intlayer
|
|
5
|
-
description: Узнайте, как использовать хук useIntlayerAsync для пакета react-intlayer
|
|
6
|
-
keywords:
|
|
7
|
-
- useIntlayerAsync
|
|
8
|
-
- словарь
|
|
9
|
-
- ключ
|
|
10
|
-
- Intlayer
|
|
11
|
-
- Интернационализация
|
|
12
|
-
- Документация
|
|
13
|
-
- Next.js
|
|
14
|
-
- JavaScript
|
|
15
|
-
- React
|
|
16
|
-
slugs:
|
|
17
|
-
- doc
|
|
18
|
-
- packages
|
|
19
|
-
- react-intlayer
|
|
20
|
-
- useIntlayerAsync
|
|
21
|
-
---
|
|
22
|
-
|
|
23
|
-
# Интеграция с React: Документация по хуку `useIntlayerAsync`
|
|
24
|
-
|
|
25
|
-
Хук `useIntlayerAsync` расширяет функциональность `useIntlayer`, возвращая не только предварительно загруженные словари, но и асинхронно получая обновления, что делает его идеальным для приложений, которые часто обновляют локализованный контент после первоначального рендера.
|
|
26
|
-
|
|
27
|
-
## Обзор
|
|
28
|
-
|
|
29
|
-
- **Асинхронная загрузка словарей:**
|
|
30
|
-
При первоначальном монтировании `useIntlayerAsync` сначала возвращает любой предварительно загруженный или статически включённый словарь локали (так же, как и `useIntlayer`), а затем асинхронно загружает и объединяет любые новые доступные удалённые словари.
|
|
31
|
-
- **Управление состоянием загрузки:**
|
|
32
|
-
Хук также предоставляет состояние `isLoading`, которое указывает, когда происходит загрузка удалённого словаря. Это позволяет разработчикам отображать индикаторы загрузки или скелетоны для более плавного пользовательского опыта.
|
|
33
|
-
|
|
34
|
-
## Настройка окружения
|
|
35
|
-
|
|
36
|
-
Intlayer предоставляет безголовую систему управления источниками контента (CSM), которая позволяет неразработчикам легко управлять и обновлять содержимое приложения. Используя интуитивно понятную панель управления Intlayer, ваша команда может редактировать локализованный текст, изображения и другие ресурсы без прямого изменения кода. Это упрощает процесс управления контентом, способствует сотрудничеству и обеспечивает возможность быстрого и лёгкого внесения обновлений.
|
|
37
|
-
|
|
38
|
-
Чтобы начать работу с Intlayer:
|
|
39
|
-
|
|
40
|
-
1. **Зарегистрируйтесь и получите токен доступа** на [https://intlayer.org/dashboard](https://intlayer.org/dashboard).
|
|
41
|
-
2. **Добавьте учетные данные в файл конфигурации:**
|
|
42
|
-
В вашем React-проекте настройте клиент Intlayer с вашими учетными данными:
|
|
43
|
-
|
|
44
|
-
```typescript fileName="intlayer.config.ts" codeFormat="typescript"
|
|
45
|
-
import type { IntlayerConfig } from "intlayer";
|
|
46
|
-
|
|
47
|
-
export default {
|
|
48
|
-
// ...
|
|
49
|
-
editor: {
|
|
50
|
-
clientId: process.env.INTLAYER_CLIENT_ID,
|
|
51
|
-
clientSecret: process.env.INTLAYER_CLIENT_SECRET,
|
|
52
|
-
},
|
|
53
|
-
} satisfies IntlayerConfig;
|
|
54
|
-
```
|
|
55
|
-
|
|
56
|
-
```javascript fileName="intlayer.config.mjs" codeFormat="esm"
|
|
57
|
-
import { type IntlayerConfig } from "intlayer";
|
|
58
|
-
|
|
59
|
-
/** @type {import('intlayer').IntlayerConfig} */
|
|
60
|
-
const config = {
|
|
61
|
-
// ...
|
|
62
|
-
editor: {
|
|
63
|
-
clientId: process.env.INTLAYER_CLIENT_ID,
|
|
64
|
-
clientSecret: process.env.INTLAYER_CLIENT_SECRET,
|
|
65
|
-
},
|
|
66
|
-
};
|
|
67
|
-
|
|
68
|
-
export default config;
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
```javascript fileName="intlayer.config.cjs" codeFormat="commonjs"
|
|
72
|
-
/** @type {import('intlayer').IntlayerConfig} */
|
|
73
|
-
const config = {
|
|
74
|
-
// ...
|
|
75
|
-
editor: {
|
|
76
|
-
clientId: process.env.INTLAYER_CLIENT_ID,
|
|
77
|
-
clientSecret: process.env.INTLAYER_CLIENT_SECRET,
|
|
78
|
-
},
|
|
79
|
-
};
|
|
80
|
-
|
|
81
|
-
module.exports = config;
|
|
82
|
-
```
|
|
83
|
-
|
|
84
|
-
3. **Отправка нового словаря локализации в Intlayer:**
|
|
85
|
-
|
|
86
|
-
```bash
|
|
87
|
-
npx intlayer dictionary push -d my-first-dictionary-key
|
|
88
|
-
```
|
|
89
|
-
|
|
90
|
-
Эта команда загружает ваши начальные словари контента, делая их доступными для асинхронного получения и редактирования через платформу Intlayer.
|
|
91
|
-
|
|
92
|
-
## Импорт `useIntlayerAsync` в React
|
|
93
|
-
|
|
94
|
-
В ваших React-компонентах импортируйте `useIntlayerAsync`:
|
|
95
|
-
|
|
96
|
-
```ts codeFormat="typescript"
|
|
97
|
-
import { useIntlayerAsync } from "react-intlayer";
|
|
98
|
-
```
|
|
99
|
-
|
|
100
|
-
```js codeFormat="esm"
|
|
101
|
-
import { useIntlayerAsync } from "react-intlayer";
|
|
102
|
-
```
|
|
103
|
-
|
|
104
|
-
```js codeFormat="commonjs"
|
|
105
|
-
const { useIntlayerAsync } = require("react-intlayer");
|
|
106
|
-
```
|
|
107
|
-
|
|
108
|
-
## Параметры
|
|
109
|
-
|
|
110
|
-
1. **`key`**:
|
|
111
|
-
**Тип**: `DictionaryKeys`
|
|
112
|
-
Ключ словаря, используемый для идентификации блока локализованного контента. Этот ключ должен быть определён в ваших файлах декларации контента.
|
|
113
|
-
|
|
114
|
-
2. **`locale`** (необязательно):
|
|
115
|
-
**Тип**: `Locales`
|
|
116
|
-
Конкретная локаль, на которую вы хотите ориентироваться. Если не указано, хук использует локаль из текущего контекста Intlayer.
|
|
117
|
-
|
|
118
|
-
3. **`isRenderEditor`** (необязательно, по умолчанию `true`):
|
|
119
|
-
**Тип**: `boolean`
|
|
120
|
-
Определяет, должен ли контент быть готов к отображению с наложением редактора Intlayer. Если установлено в `false`, возвращаемые данные словаря не будут содержать функции, специфичные для редактора.
|
|
121
|
-
|
|
122
|
-
## Возвращаемое значение
|
|
123
|
-
|
|
124
|
-
Хук возвращает объект словаря, содержащий локализованный контент, ключами которого являются `key` и `locale`. Также он включает булево значение `isLoading`, указывающее, загружается ли в данный момент удалённый словарь.
|
|
125
|
-
|
|
126
|
-
## Пример использования в React-компоненте
|
|
127
|
-
|
|
128
|
-
```tsx fileName="src/components/ComponentExample.tsx" codeFormat="typescript"
|
|
129
|
-
import { useEffect, type FC } from "react";
|
|
130
|
-
import { useIntlayerAsync } from "react-intlayer";
|
|
131
|
-
|
|
132
|
-
export const ComponentExample: FC = () => {
|
|
133
|
-
const { title, description, isLoading } = useIntlayerAsync("async-component");
|
|
134
|
-
|
|
135
|
-
useEffect(() => {
|
|
136
|
-
if (isLoading) {
|
|
137
|
-
console.log("Контент загружается...");
|
|
138
|
-
}
|
|
139
|
-
}, [isLoading]);
|
|
140
|
-
|
|
141
|
-
return (
|
|
142
|
-
<div>
|
|
143
|
-
{isLoading ? (
|
|
144
|
-
<div>
|
|
145
|
-
<h1>Загрузка…</h1>
|
|
146
|
-
<p>Пожалуйста, подождите, пока контент обновляется.</p>
|
|
147
|
-
</div>
|
|
148
|
-
) : (
|
|
149
|
-
<div>
|
|
150
|
-
<h1>{title.value}</h1>
|
|
151
|
-
<p>{description.value}</p>
|
|
152
|
-
</div>
|
|
153
|
-
)}
|
|
154
|
-
</div>
|
|
155
|
-
);
|
|
156
|
-
};
|
|
157
|
-
```
|
|
158
|
-
|
|
159
|
-
```jsx fileName="src/components/ComponentExample.mjx" codeFormat="esm"
|
|
160
|
-
import { useEffect } from "react";
|
|
161
|
-
import { useIntlayerAsync } from "react-intlayer";
|
|
162
|
-
|
|
163
|
-
const ComponentExample = () => {
|
|
164
|
-
const { title, description, isLoading } = useIntlayerAsync("async-component");
|
|
165
|
-
|
|
166
|
-
useEffect(() => {
|
|
167
|
-
if (isLoading) {
|
|
168
|
-
console.log("Контент загружается...");
|
|
169
|
-
}
|
|
170
|
-
}, [isLoading]);
|
|
171
|
-
|
|
172
|
-
return (
|
|
173
|
-
<div>
|
|
174
|
-
{isLoading ? (
|
|
175
|
-
<div>
|
|
176
|
-
<h1>Загрузка…</h1>
|
|
177
|
-
<p>Пожалуйста, подождите, пока контент обновляется.</p>
|
|
178
|
-
</div>
|
|
179
|
-
) : (
|
|
180
|
-
<div>
|
|
181
|
-
<h1>{title.value}</h1>
|
|
182
|
-
<p>{description.value}</p>
|
|
183
|
-
</div>
|
|
184
|
-
)}
|
|
185
|
-
</div>
|
|
186
|
-
);
|
|
187
|
-
};
|
|
188
|
-
```
|
|
189
|
-
|
|
190
|
-
```jsx fileName="src/components/ComponentExample.csx" codeFormat="commonjs"
|
|
191
|
-
const { useEffect } = require("react");
|
|
192
|
-
const { useIntlayerAsync } = require("react-intlayer");
|
|
193
|
-
|
|
194
|
-
const ComponentExample = () => {
|
|
195
|
-
const { title, description, isLoading } = useIntlayerAsync("async-component");
|
|
196
|
-
|
|
197
|
-
useEffect(() => {
|
|
198
|
-
if (isLoading) {
|
|
199
|
-
console.log("Контент загружается...");
|
|
200
|
-
}
|
|
201
|
-
}, [isLoading]);
|
|
202
|
-
|
|
203
|
-
return (
|
|
204
|
-
<div>
|
|
205
|
-
{isLoading ? (
|
|
206
|
-
<div>
|
|
207
|
-
<h1>Загрузка…</h1>
|
|
208
|
-
<p>Пожалуйста, подождите, пока контент обновляется.</p>
|
|
209
|
-
</div>
|
|
210
|
-
) : (
|
|
211
|
-
<div>
|
|
212
|
-
<h1>{title.value}</h1>
|
|
213
|
-
<p>{description.value}</p>
|
|
214
|
-
</div>
|
|
215
|
-
)}
|
|
216
|
-
</div>
|
|
217
|
-
);
|
|
218
|
-
};
|
|
219
|
-
```
|
|
220
|
-
|
|
221
|
-
**Ключевые моменты:**
|
|
222
|
-
|
|
223
|
-
- При первоначальном рендере `title` и `description` берутся из предварительно загруженного или статически встроенного словаря локали.
|
|
224
|
-
- Пока `isLoading` равно `true`, в фоновом режиме выполняется запрос на получение обновлённого словаря.
|
|
225
|
-
- После завершения запроса `title` и `description` обновляются с новым содержимым, а `isLoading` возвращается в `false`.
|
|
226
|
-
|
|
227
|
-
## Обработка локализации атрибутов
|
|
228
|
-
|
|
229
|
-
Вы также можете получать локализованные значения атрибутов для различных HTML-свойств (например, `alt`, `title`, `aria-label`):
|
|
230
|
-
|
|
231
|
-
```jsx
|
|
232
|
-
<img src={title.image.src.value} alt={title.image.alt.value} />
|
|
233
|
-
```
|
|
234
|
-
|
|
235
|
-
## Файлы словарей
|
|
236
|
-
|
|
237
|
-
Все ключи содержимого должны быть определены в ваших файлах декларации содержимого для обеспечения типовой безопасности и предотвращения ошибок во время выполнения. Эти файлы позволяют выполнять проверку TypeScript, гарантируя, что вы всегда ссылаетесь на существующие ключи и локали.
|
|
238
|
-
|
|
239
|
-
Инструкции по настройке файлов декларации контента доступны [здесь](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/dictionary/get_started.md).
|
|
240
|
-
|
|
241
|
-
## Дополнительная информация
|
|
242
|
-
|
|
243
|
-
- **Визуальный редактор Intlayer:**
|
|
244
|
-
Интеграция с визуальным редактором Intlayer для управления и редактирования контента непосредственно из пользовательского интерфейса. Подробнее [здесь](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/intlayer_visual_editor.md).
|
|
245
|
-
|
|
246
|
-
---
|
|
247
|
-
|
|
248
|
-
В итоге, `useIntlayerAsync` — это мощный React-хук, предназначенный для улучшения пользовательского опыта и поддержания актуальности контента путем объединения предварительно отрендеренных или предварительно загруженных словарей с асинхронными обновлениями словарей. Используя `isLoading` и декларации контента на основе TypeScript, вы можете бесшовно интегрировать динамический, локализованный контент в ваши React-приложения.
|
|
249
|
-
|
|
250
|
-
## История документации
|
|
251
|
-
|
|
252
|
-
- 5.5.10 - 2025-06-29: Инициализация истории
|
|
@@ -1,239 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
createdAt: 2024-08-11
|
|
3
|
-
updatedAt: 2025-06-29
|
|
4
|
-
title: useIntlayerAsync Hook 文档 | next-intlayer
|
|
5
|
-
description: 查看如何使用 next-intlayer 包中的 useIntlayerAsync Hook
|
|
6
|
-
keywords:
|
|
7
|
-
- useIntlayerAsync
|
|
8
|
-
- 字典
|
|
9
|
-
- 键
|
|
10
|
-
- Intlayer
|
|
11
|
-
- 国际化
|
|
12
|
-
- 文档
|
|
13
|
-
- Next.js
|
|
14
|
-
- JavaScript
|
|
15
|
-
- React
|
|
16
|
-
slugs:
|
|
17
|
-
- doc
|
|
18
|
-
- packages
|
|
19
|
-
- next-intlayer
|
|
20
|
-
- useIntlayerAsync
|
|
21
|
-
---
|
|
22
|
-
|
|
23
|
-
# Next.js 集成:`useIntlayerAsync` Hook 文档
|
|
24
|
-
|
|
25
|
-
`useIntlayerAsync` Hook 扩展了 `useIntlayer` 的功能,不仅返回预渲染的字典,还能异步获取更新,非常适合那些在初始渲染后频繁更新本地化内容的应用。
|
|
26
|
-
|
|
27
|
-
## 概述
|
|
28
|
-
|
|
29
|
-
- **异步字典加载:**
|
|
30
|
-
在客户端,`useIntlayerAsync` 首先返回预渲染的本地化字典(与 `useIntlayer` 相同),然后异步获取并合并任何新可用的远程字典。
|
|
31
|
-
- **进度状态管理:**
|
|
32
|
-
该 Hook 还提供了一个 `isLoading` 状态,指示何时正在获取远程字典。这样开发者可以显示加载指示器或骨架屏,以提供更流畅的用户体验。
|
|
33
|
-
|
|
34
|
-
## 环境设置
|
|
35
|
-
|
|
36
|
-
Intlayer 提供了一个无头内容源管理(CSM)系统,使非开发人员能够无缝管理和更新应用内容。通过使用 Intlayer 直观的仪表盘,您的团队可以编辑本地化文本、图像和其他资源,而无需直接修改代码。这简化了内容管理流程,促进了协作,并确保更新能够快速且轻松地完成。
|
|
37
|
-
|
|
38
|
-
要开始使用 Intlayer,您首先需要在 [仪表盘](https://intlayer.org/dashboard) 注册并获取访问令牌。获得凭证后,将其添加到您的配置文件中,如下所示:
|
|
39
|
-
|
|
40
|
-
```typescript fileName="intlayer.config.ts" codeFormat="typescript"
|
|
41
|
-
import type { IntlayerConfig } from "intlayer";
|
|
42
|
-
|
|
43
|
-
export default {
|
|
44
|
-
// ...
|
|
45
|
-
editor: {
|
|
46
|
-
clientId: process.env.INTLAYER_CLIENT_ID,
|
|
47
|
-
clientSecret: process.env.INTLAYER_CLIENT_SECRET,
|
|
48
|
-
},
|
|
49
|
-
} satisfies IntlayerConfig;
|
|
50
|
-
```
|
|
51
|
-
|
|
52
|
-
```javascript fileName="intlayer.config.mjs" codeFormat="esm"
|
|
53
|
-
import { type IntlayerConfig } from "intlayer";
|
|
54
|
-
|
|
55
|
-
/** @type {import('intlayer').IntlayerConfig} */
|
|
56
|
-
// 配置对象
|
|
57
|
-
const config = {
|
|
58
|
-
// ...
|
|
59
|
-
editor: {
|
|
60
|
-
clientId: process.env.INTLAYER_CLIENT_ID, // 客户端ID
|
|
61
|
-
clientSecret: process.env.INTLAYER_CLIENT_SECRET, // 客户端密钥
|
|
62
|
-
},
|
|
63
|
-
};
|
|
64
|
-
|
|
65
|
-
export default config;
|
|
66
|
-
```
|
|
67
|
-
|
|
68
|
-
```javascript fileName="intlayer.config.cjs" codeFormat="commonjs"
|
|
69
|
-
/** @type {import('intlayer').IntlayerConfig} */
|
|
70
|
-
// 配置对象
|
|
71
|
-
const config = {
|
|
72
|
-
// ...
|
|
73
|
-
editor: {
|
|
74
|
-
clientId: process.env.INTLAYER_CLIENT_ID, // 客户端ID
|
|
75
|
-
clientSecret: process.env.INTLAYER_CLIENT_SECRET, // 客户端密钥
|
|
76
|
-
},
|
|
77
|
-
};
|
|
78
|
-
|
|
79
|
-
module.exports = config;
|
|
80
|
-
```
|
|
81
|
-
|
|
82
|
-
配置好您的凭据后,您可以通过运行以下命令将新的本地化词典推送到 Intlayer:
|
|
83
|
-
|
|
84
|
-
```bash
|
|
85
|
-
npx intlayer dictionary push -d my-first-dictionary-key
|
|
86
|
-
```
|
|
87
|
-
|
|
88
|
-
此命令会上传您的初始内容词典,使其可通过 Intlayer 平台进行异步获取和编辑。
|
|
89
|
-
|
|
90
|
-
## 在 Next.js 中导入 `useIntlayerAsync`
|
|
91
|
-
|
|
92
|
-
由于 `useIntlayerAsync` 旨在用于**客户端**组件,您需要从与 `useIntlayer` 相同的客户端入口导入它:
|
|
93
|
-
|
|
94
|
-
```tsx codeFormat="typescript"
|
|
95
|
-
"use client";
|
|
96
|
-
|
|
97
|
-
import { useIntlayerAsync } from "next-intlayer";
|
|
98
|
-
```
|
|
99
|
-
|
|
100
|
-
```javascript codeFormat="esm"
|
|
101
|
-
"use client";
|
|
102
|
-
|
|
103
|
-
import { useIntlayerAsync } from "next-intlayer";
|
|
104
|
-
```
|
|
105
|
-
|
|
106
|
-
```javascript codeFormat="commonjs"
|
|
107
|
-
"use client";
|
|
108
|
-
|
|
109
|
-
const { useIntlayerAsync } = require("next-intlayer");
|
|
110
|
-
```
|
|
111
|
-
|
|
112
|
-
如果您使用的是 Next.js App Router 并且服务器组件与客户端组件分开,请确保导入文件顶部标注了 `"use client"`。
|
|
113
|
-
|
|
114
|
-
## 参数
|
|
115
|
-
|
|
116
|
-
1. **`key`**:
|
|
117
|
-
**类型**:`DictionaryKeys`
|
|
118
|
-
用于标识本地化内容块的字典键。该键应在您的内容声明文件中定义。
|
|
119
|
-
|
|
120
|
-
2. **`locale`**(可选):
|
|
121
|
-
**类型**:`Locales`
|
|
122
|
-
您想要定位的特定语言环境。如果省略,钩子将使用客户端上下文中的语言环境。
|
|
123
|
-
|
|
124
|
-
3. **`isRenderEditor`**(可选,默认值为 `true`):
|
|
125
|
-
**类型**:`boolean`
|
|
126
|
-
确定内容是否应准备好通过 Intlayer 编辑器覆盖层进行渲染。如果设置为 `false`,返回的字典数据将不包含编辑器特定的功能。
|
|
127
|
-
|
|
128
|
-
## 返回值
|
|
129
|
-
|
|
130
|
-
该 Hook 返回一个字典对象,包含以 `key` 和 `locale` 为键的本地化内容。同时还包含一个 `isLoading` 布尔值,指示是否正在获取远程字典。
|
|
131
|
-
|
|
132
|
-
## 在 Next.js 中的示例用法
|
|
133
|
-
|
|
134
|
-
### 客户端组件示例
|
|
135
|
-
|
|
136
|
-
```tsx fileName="src/components/AsyncClientComponentExample.tsx" codeFormat="typescript"
|
|
137
|
-
"use client";
|
|
138
|
-
|
|
139
|
-
import { useEffect, type FC } from "react";
|
|
140
|
-
import { useIntlayerAsync } from "next-intlayer";
|
|
141
|
-
|
|
142
|
-
export const AsyncClientComponentExample: FC = () => {
|
|
143
|
-
const { title, description, isLoading } = useIntlayerAsync("async-component");
|
|
144
|
-
|
|
145
|
-
useEffect(() => {
|
|
146
|
-
if (isLoading) {
|
|
147
|
-
console.log("内容正在加载...");
|
|
148
|
-
}
|
|
149
|
-
}, [isLoading]);
|
|
150
|
-
|
|
151
|
-
return (
|
|
152
|
-
<div>
|
|
153
|
-
<h1>{title.value}</h1>
|
|
154
|
-
<p>{description.value}</p>
|
|
155
|
-
</div>
|
|
156
|
-
);
|
|
157
|
-
};
|
|
158
|
-
```
|
|
159
|
-
|
|
160
|
-
```jsx fileName="src/components/AsyncClientComponentExample.mjx" codeFormat="esm"
|
|
161
|
-
"use client";
|
|
162
|
-
|
|
163
|
-
import { useEffect } from "react";
|
|
164
|
-
import { useIntlayerAsync } from "next-intlayer";
|
|
165
|
-
|
|
166
|
-
const AsyncClientComponentExample = () => {
|
|
167
|
-
const { title, description, isLoading } = useIntlayerAsync("async-component");
|
|
168
|
-
|
|
169
|
-
useEffect(() => {
|
|
170
|
-
if (isLoading) {
|
|
171
|
-
console.log("内容正在加载...");
|
|
172
|
-
}
|
|
173
|
-
}, [isLoading]);
|
|
174
|
-
|
|
175
|
-
return (
|
|
176
|
-
<div>
|
|
177
|
-
<h1>{title.value}</h1>
|
|
178
|
-
<p>{description.value}</p>
|
|
179
|
-
</div>
|
|
180
|
-
);
|
|
181
|
-
};
|
|
182
|
-
```
|
|
183
|
-
|
|
184
|
-
```jsx fileName="src/components/AsyncClientComponentExample.csx" codeFormat="commonjs"
|
|
185
|
-
"use client";
|
|
186
|
-
|
|
187
|
-
const { useEffect } = require("react");
|
|
188
|
-
const { useIntlayerAsync } = require("next-intlayer");
|
|
189
|
-
|
|
190
|
-
const AsyncClientComponentExample = () => {
|
|
191
|
-
const { title, description, isLoading } = useIntlayerAsync("async-component");
|
|
192
|
-
|
|
193
|
-
useEffect(() => {
|
|
194
|
-
if (isLoading) {
|
|
195
|
-
console.log("内容正在加载...");
|
|
196
|
-
}
|
|
197
|
-
}, [isLoading]);
|
|
198
|
-
|
|
199
|
-
return (
|
|
200
|
-
<div>
|
|
201
|
-
<h1>{title.value}</h1>
|
|
202
|
-
<p>{description.value}</p>
|
|
203
|
-
</div>
|
|
204
|
-
);
|
|
205
|
-
};
|
|
206
|
-
```
|
|
207
|
-
|
|
208
|
-
**关键点:**
|
|
209
|
-
|
|
210
|
-
- 在初始渲染时,`title` 和 `description` 来自预渲染的本地化字典。
|
|
211
|
-
- 当 `isLoading` 为 `true` 时,会在后台发起远程请求以获取更新后的字典。
|
|
212
|
-
- 请求完成后,`title` 和 `description` 会更新为最新内容,且 `isLoading` 会变回 `false`。
|
|
213
|
-
|
|
214
|
-
## 处理属性本地化
|
|
215
|
-
|
|
216
|
-
与 `useIntlayer` 类似,您可以获取各种 HTML 属性的本地化属性值(例如 `alt`、`title`、`aria-label`):
|
|
217
|
-
|
|
218
|
-
```tsx
|
|
219
|
-
<img src={title.image.src.value} alt={title.image.alt.value} />
|
|
220
|
-
```
|
|
221
|
-
|
|
222
|
-
## 字典文件
|
|
223
|
-
|
|
224
|
-
所有内容键必须在您的内容声明文件中定义,以确保类型安全并防止运行时错误。这些文件支持 TypeScript 验证,确保您始终引用存在的键和语言环境。
|
|
225
|
-
|
|
226
|
-
/// 设置内容声明文件的说明请参见[这里](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/dictionary/get_started.md)。
|
|
227
|
-
|
|
228
|
-
## 进一步信息
|
|
229
|
-
|
|
230
|
-
- **Intlayer 可视化编辑器:**
|
|
231
|
-
集成 Intlayer 可视化编辑器,直接从 UI 管理和编辑内容。更多详情请见[这里](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/intlayer_visual_editor.md)。
|
|
232
|
-
|
|
233
|
-
---
|
|
234
|
-
|
|
235
|
-
**总结**,`useIntlayerAsync` 是一个强大的客户端钩子,旨在通过结合预渲染字典与异步字典更新,提升用户体验并保持内容的新鲜度。通过利用 `isLoading` 和基于 TypeScript 的内容声明,您可以无缝地将动态、本地化的内容集成到您的 Next.js 应用中。
|
|
236
|
-
|
|
237
|
-
## 文档历史
|
|
238
|
-
|
|
239
|
-
- 5.5.10 - 2025-06-29:初始化历史
|