@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.
Files changed (85) hide show
  1. package/dist/cjs/generated/docs.entry.cjs +44 -238
  2. package/dist/cjs/generated/docs.entry.cjs.map +1 -1
  3. package/dist/esm/generated/docs.entry.mjs +44 -238
  4. package/dist/esm/generated/docs.entry.mjs.map +1 -1
  5. package/dist/types/generated/docs.entry.d.ts +1 -2
  6. package/dist/types/generated/docs.entry.d.ts.map +1 -1
  7. package/docs/ar/CI_CD.md +67 -41
  8. package/docs/ar/intlayer_with_tanstack.md +457 -0
  9. package/docs/ar/packages/next-intlayer/index.md +0 -1
  10. package/docs/ar/packages/react-intlayer/index.md +0 -1
  11. package/docs/de/CI_CD.md +63 -37
  12. package/docs/de/intlayer_with_tanstack.md +458 -0
  13. package/docs/de/packages/next-intlayer/index.md +0 -1
  14. package/docs/de/packages/react-intlayer/index.md +0 -1
  15. package/docs/en/CI_CD.md +51 -27
  16. package/docs/en/intlayer_with_tanstack.md +452 -0
  17. package/docs/en/packages/next-intlayer/index.md +0 -1
  18. package/docs/en/packages/react-intlayer/index.md +0 -1
  19. package/docs/en-GB/CI_CD.md +58 -32
  20. package/docs/en-GB/intlayer_with_tanstack.md +457 -0
  21. package/docs/en-GB/packages/next-intlayer/index.md +0 -1
  22. package/docs/en-GB/packages/react-intlayer/index.md +0 -1
  23. package/docs/es/CI_CD.md +68 -42
  24. package/docs/es/intlayer_with_tanstack.md +435 -0
  25. package/docs/es/packages/next-intlayer/index.md +0 -1
  26. package/docs/es/packages/react-intlayer/index.md +0 -1
  27. package/docs/fr/intlayer_with_tanstack.md +435 -0
  28. package/docs/fr/packages/next-intlayer/index.md +0 -1
  29. package/docs/fr/packages/react-intlayer/index.md +0 -1
  30. package/docs/hi/CI_CD.md +69 -44
  31. package/docs/hi/intlayer_with_tanstack.md +438 -0
  32. package/docs/hi/packages/next-intlayer/index.md +0 -1
  33. package/docs/hi/packages/react-intlayer/index.md +0 -1
  34. package/docs/it/CI_CD.md +67 -41
  35. package/docs/it/intlayer_with_tanstack.md +457 -0
  36. package/docs/it/packages/next-intlayer/index.md +0 -1
  37. package/docs/it/packages/react-intlayer/index.md +0 -1
  38. package/docs/ja/CI_CD.md +67 -41
  39. package/docs/ja/intlayer_with_tanstack.md +457 -0
  40. package/docs/ja/packages/next-intlayer/index.md +0 -1
  41. package/docs/ja/packages/react-intlayer/index.md +0 -1
  42. package/docs/ko/CI_CD.md +63 -37
  43. package/docs/ko/intlayer_with_tanstack.md +457 -0
  44. package/docs/ko/packages/next-intlayer/index.md +0 -1
  45. package/docs/ko/packages/react-intlayer/index.md +0 -1
  46. package/docs/pt/CI_CD.md +67 -41
  47. package/docs/pt/intlayer_with_tanstack.md +457 -0
  48. package/docs/pt/packages/next-intlayer/index.md +0 -1
  49. package/docs/pt/packages/react-intlayer/index.md +0 -1
  50. package/docs/ru/CI_CD.md +70 -44
  51. package/docs/ru/intlayer_with_tanstack.md +458 -0
  52. package/docs/ru/packages/next-intlayer/index.md +0 -1
  53. package/docs/ru/packages/react-intlayer/index.md +0 -1
  54. package/docs/zh/CI_CD.md +62 -36
  55. package/docs/zh/intlayer_with_tanstack.md +435 -0
  56. package/docs/zh/packages/next-intlayer/index.md +0 -1
  57. package/docs/zh/packages/react-intlayer/index.md +0 -1
  58. package/package.json +9 -9
  59. package/src/generated/docs.entry.ts +44 -238
  60. package/docs/ar/packages/next-intlayer/useIntlayerAsync.md +0 -237
  61. package/docs/ar/packages/react-intlayer/useIntlayerAsync.md +0 -252
  62. package/docs/de/packages/next-intlayer/useIntlayerAsync.md +0 -262
  63. package/docs/de/packages/react-intlayer/useIntlayerAsync.md +0 -256
  64. package/docs/en/packages/next-intlayer/useIntlayerAsync.md +0 -239
  65. package/docs/en/packages/react-intlayer/useIntlayerAsync.md +0 -254
  66. package/docs/en-GB/packages/next-intlayer/useIntlayerAsync.md +0 -237
  67. package/docs/en-GB/packages/react-intlayer/useIntlayerAsync.md +0 -257
  68. package/docs/es/packages/next-intlayer/useIntlayerAsync.md +0 -240
  69. package/docs/es/packages/react-intlayer/useIntlayerAsync.md +0 -276
  70. package/docs/fr/packages/next-intlayer/useIntlayerAsync.md +0 -238
  71. package/docs/fr/packages/react-intlayer/useIntlayerAsync.md +0 -252
  72. package/docs/hi/packages/next-intlayer/useIntlayerAsync.md +0 -237
  73. package/docs/hi/packages/react-intlayer/useIntlayerAsync.md +0 -252
  74. package/docs/it/packages/next-intlayer/useIntlayerAsync.md +0 -237
  75. package/docs/it/packages/react-intlayer/useIntlayerAsync.md +0 -252
  76. package/docs/ja/packages/next-intlayer/useIntlayerAsync.md +0 -237
  77. package/docs/ja/packages/react-intlayer/useIntlayerAsync.md +0 -268
  78. package/docs/ko/packages/next-intlayer/useIntlayerAsync.md +0 -260
  79. package/docs/ko/packages/react-intlayer/useIntlayerAsync.md +0 -271
  80. package/docs/pt/packages/next-intlayer/useIntlayerAsync.md +0 -238
  81. package/docs/pt/packages/react-intlayer/useIntlayerAsync.md +0 -252
  82. package/docs/ru/packages/next-intlayer/useIntlayerAsync.md +0 -237
  83. package/docs/ru/packages/react-intlayer/useIntlayerAsync.md +0 -252
  84. package/docs/zh/packages/next-intlayer/useIntlayerAsync.md +0 -239
  85. package/docs/zh/packages/react-intlayer/useIntlayerAsync.md +0 -257
@@ -0,0 +1,458 @@
1
+ ---
2
+ createdAt: 2025-08-11
3
+ updatedAt: 2025-08-11
4
+ title: Начало работы с Intlayer в TanStack Start (React)
5
+ description: Добавьте i18n в ваше приложение TanStack Start с помощью Intlayer — словари на уровне компонентов, локализованные URL и SEO-дружественные метаданные.
6
+ keywords:
7
+ - Интернационализация
8
+ - Документация
9
+ - Intlayer
10
+ - TanStack Start
11
+ - TanStack Router
12
+ - React
13
+ - i18n
14
+ - JavaScript
15
+ slugs:
16
+ - doc
17
+ - environment
18
+ - tanstack-start
19
+ ---
20
+
21
+ # Начало работы с интернационализацией (i18n) с Intlayer и TanStack Start (React)
22
+
23
+ ## Что такое Intlayer?
24
+
25
+ **Intlayer** — это открытый набор инструментов i18n для приложений React. Он предоставляет вам:
26
+
27
+ - **Словари на уровне компонентов** с безопасностью TypeScript.
28
+ - **Динамические метаданные и маршруты** (готовые для SEO).
29
+ - **Переключение локали во время выполнения** (и вспомогательные функции для обнаружения/сохранения локалей).
30
+ - **Плагин Vite** для преобразований во время сборки + улучшения для разработки (DX).
31
+
32
+ В этом руководстве показано, как интегрировать Intlayer в проект **TanStack Start** (который использует Vite под капотом и TanStack Router для маршрутизации/SSR).
33
+
34
+ ---
35
+
36
+ ## Шаг 1: Установка зависимостей
37
+
38
+ ```bash
39
+ # npm
40
+ npm i intlayer react-intlayer
41
+ npm i -D vite-intlayer
42
+
43
+ # pnpm
44
+ pnpm add intlayer react-intlayer
45
+ pnpm add -D vite-intlayer
46
+
47
+ # yarn
48
+ yarn add intlayer react-intlayer
49
+ yarn add -D vite-intlayer
50
+ ```
51
+
52
+ - **intlayer**: ядро (конфигурация, словари, CLI/преобразования).
53
+ - **react-intlayer**: `<IntlayerProvider>` + хуки для React.
54
+ - **vite-intlayer**: плагин Vite, а также опциональное промежуточное ПО для обнаружения локали/перенаправлений (работает в режиме разработки и SSR/превью; для production SSR переместите в `dependencies`).
55
+
56
+ ---
57
+
58
+ ## Шаг 2: Настройка Intlayer
59
+
60
+ Создайте файл `intlayer.config.ts` в корне вашего проекта:
61
+
62
+ ```ts fileName="intlayer.config.ts"
63
+ import { Locales, type IntlayerConfig } from "intlayer";
64
+
65
+ const config: IntlayerConfig = {
66
+ internationalization: {
67
+ locales: [Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH],
68
+ defaultLocale: Locales.ENGLISH,
69
+ },
70
+ // Вы также можете настроить: contentDir, contentFileExtensions, параметры middleware и др.
71
+ };
72
+
73
+ export default config;
74
+ ```
75
+
76
+ Варианты CommonJS/ESM идентичны вашему оригинальному документу, если вы предпочитаете `cjs`/`mjs`.
77
+
78
+ > Полное описание конфигурации: смотрите документацию по конфигурации Intlayer.
79
+
80
+ ---
81
+
82
+ ## Шаг 3: Добавьте плагин Vite (и опциональный middleware)
83
+
84
+ **TanStack Start использует Vite**, поэтому добавьте плагин(и) Intlayer в ваш `vite.config.ts`:
85
+
86
+ ```ts fileName="vite.config.ts"
87
+ import { defineConfig } from "vite";
88
+ import react from "@vitejs/plugin-react-swc";
89
+ import { intlayerPlugin, intLayerMiddlewarePlugin } from "vite-intlayer";
90
+
91
+ export default defineConfig({
92
+ plugins: [
93
+ react(),
94
+ intlayerPlugin(),
95
+ // Необязательно, но рекомендуется для обнаружения локали, работы с куки и редиректов:
96
+ intLayerMiddlewarePlugin(),
97
+ ],
98
+ });
99
+ ```
100
+
101
+ > Если вы разворачиваете SSR, переместите `vite-intlayer` в `dependencies`, чтобы middleware работал в продакшене.
102
+
103
+ ---
104
+
105
+ ## Шаг 4: Объявите ваш контент
106
+
107
+ Размещайте ваши словари где угодно внутри `./src` (по умолчанию `contentDir`). Пример:
108
+
109
+ ```tsx fileName="src/app.content.tsx"
110
+ import { t, type Dictionary } from "intlayer";
111
+ import type { ReactNode } from "react";
112
+
113
+ const appContent = {
114
+ key: "app",
115
+ content: {
116
+ viteLogo: t({
117
+ ru: "Логотип Vite",
118
+ en: "Vite logo",
119
+ fr: "Logo Vite",
120
+ es: "Logo Vite",
121
+ }),
122
+ reactLogo: t({
123
+ ru: "Логотип React",
124
+ en: "React logo",
125
+ fr: "Logo React",
126
+ es: "Logo React",
127
+ }),
128
+ title: t({
129
+ ru: "TanStack Start + React",
130
+ en: "TanStack Start + React",
131
+ fr: "TanStack Start + React",
132
+ es: "TanStack Start + React",
133
+ }),
134
+ count: t({
135
+ ru: "счёт: ",
136
+ en: "count is ",
137
+ fr: "le compte est ",
138
+ es: "el recuento es ",
139
+ }),
140
+ edit: t<ReactNode>({
141
+ ru: (
142
+ <>
143
+ Редактируйте <code>src/routes/index.tsx</code> и сохраните, чтобы
144
+ проверить HMR
145
+ </>
146
+ ),
147
+ en: (
148
+ <>
149
+ Edit <code>src/routes/index.tsx</code> and save to test HMR
150
+ </>
151
+ ),
152
+ fr: (
153
+ <>
154
+ Éditez <code>src/routes/index.tsx</code> et enregistrez pour tester
155
+ HMR
156
+ </>
157
+ ),
158
+ es: (
159
+ <>
160
+ Edita <code>src/routes/index.tsx</code> y guarda para probar HMR
161
+ </>
162
+ ),
163
+ }),
164
+ readTheDocs: t({
165
+ ru: "Нажмите на логотипы, чтобы узнать больше",
166
+ en: "Click the logos to learn more",
167
+ fr: "Cliquez sur les logos pour en savoir plus",
168
+ es: "Haz clic en los logotipos para saber más",
169
+ }),
170
+ },
171
+ } satisfies Dictionary;
172
+
173
+ export default appContent;
174
+ ```
175
+
176
+ JSON/ESM/CJS варианты работают так же, как и в вашем исходном документе.
177
+
178
+ > TSX контент? Не забудьте `import React from "react"`, если ваша сборка этого требует.
179
+
180
+ ---
181
+
182
+ ## Шаг 5: Оберните TanStack Start с помощью Intlayer
183
+
184
+ С TanStack Start ваш **корневой маршрут** — это правильное место для установки провайдеров.
185
+
186
+ ```tsx fileName="src/routes/__root.tsx"
187
+ import {
188
+ Outlet,
189
+ createRootRoute,
190
+ Link as RouterLink,
191
+ } from "@tanstack/react-router";
192
+ import { IntlayerProvider, useIntlayer } from "react-intlayer";
193
+
194
+ function AppShell() {
195
+ // Пример использования словаря на верхнем уровне:
196
+ const content = useIntlayer("app");
197
+
198
+ return (
199
+ <div>
200
+ <nav className="flex gap-3 p-3">
201
+ <RouterLink to="/">Главная</RouterLink>
202
+ <RouterLink to="/about">О нас</RouterLink>
203
+ </nav>
204
+ <main className="p-6">
205
+ <h1>{content.title}</h1>
206
+ <Outlet />
207
+ </main>
208
+ </div>
209
+ );
210
+ }
211
+
212
+ export const Route = createRootRoute({
213
+ component: () => (
214
+ <IntlayerProvider>
215
+ <AppShell />
216
+ </IntlayerProvider>
217
+ ),
218
+ });
219
+ ```
220
+
221
+ Затем используйте ваш контент на страницах:
222
+
223
+ ```tsx fileName="src/routes/index.tsx"
224
+ import { createFileRoute } from "@tanstack/react-router";
225
+ import { useIntlayer } from "react-intlayer";
226
+ import reactLogo from "../assets/react.svg";
227
+
228
+ export const Route = createFileRoute("/")({
229
+ component: () => {
230
+ const content = useIntlayer("app");
231
+ return (
232
+ <>
233
+ <button>{content.count}0</button>
234
+ <p>{content.edit}</p>
235
+ <img
236
+ src={reactLogo}
237
+ alt={content.reactLogo.value}
238
+ width={48}
239
+ height={48}
240
+ />
241
+ <p className="opacity-70">{content.readTheDocs}</p>
242
+ </>
243
+ );
244
+ },
245
+ });
246
+ ```
247
+
248
+ > Атрибуты строк (`alt`, `title`, `aria-label` и др.) требуют использования `.value`:
249
+ >
250
+ > ```jsx
251
+ > <img alt={c.reactLogo.value} />
252
+ > ```
253
+
254
+ ---
255
+
256
+ ## (Необязательно) Шаг 6: Переключение локали (на клиенте)
257
+
258
+ ```tsx fileName="src/components/LocaleSwitcher.tsx"
259
+ import { Locales } from "intlayer";
260
+ import { useLocale } from "react-intlayer";
261
+
262
+ export function LocaleSwitcher() {
263
+ const { setLocale } = useLocale();
264
+ return (
265
+ <div className="flex gap-2">
266
+ <button onClick={() => setLocale(Locales.ENGLISH)}>Английский</button>
267
+ <button onClick={() => setLocale(Locales.FRENCH)}>Французский</button>
268
+ <button onClick={() => setLocale(Locales.SPANISH)}>Испанский</button>
269
+ </div>
270
+ );
271
+ }
272
+ ```
273
+
274
+ ---
275
+
276
+ ## (Необязательно) Шаг 7: Локализованная маршрутизация (SEO-дружественные URL)
277
+
278
+ У вас есть **два хороших варианта** с TanStack Start. Выберите один.
279
+
280
+ Создайте папку с динамическим сегментом `src/routes/$locale/`, чтобы ваши URL были вида `/:locale/...`. В макете `$locale` проверьте `params.locale`, установите `<IntlayerProvider locale=...>`, и отобразите `<Outlet />`. Этот подход прост, но остальные маршруты будут размещены внутри `$locale`, и вам понадобится дополнительное дерево без префикса, если вы _не_ хотите, чтобы префикс локали по умолчанию добавлялся.
281
+
282
+ ---
283
+
284
+ ## (Необязательно) Шаг 8: Обновление URL при переключении локали
285
+
286
+ При использовании шаблона A (basepath) переключение локалей означает **переход на другой базовый путь**:
287
+
288
+ ```tsx fileName="src/components/LocaleSwitcherNavigate.tsx"
289
+ import { useRouter } from "@tanstack/react-router";
290
+ import { Locales, getLocalizedUrl } from "intlayer";
291
+ import { useLocale } from "react-intlayer";
292
+
293
+ export function LocaleSwitcherNavigate() {
294
+ const router = useRouter();
295
+ const { locale, setLocale } = useLocale();
296
+
297
+ const change = async (next: Locales) => {
298
+ if (next === locale) return;
299
+ const nextPath = getLocalizedUrl(
300
+ window.location.pathname + window.location.search,
301
+ next
302
+ );
303
+ await router.navigate({ to: nextPath }); // сохраняет историю
304
+ setLocale(next);
305
+ };
306
+
307
+ return (
308
+ <div className="flex gap-2">
309
+ <button onClick={() => change(Locales.ENGLISH)}>English</button>
310
+ <button onClick={() => change(Locales.FRENCH)}>Français</button>
311
+ <button onClick={() => change(Locales.SPANISH)}>Español</button>
312
+ </div>
313
+ );
314
+ }
315
+ ```
316
+
317
+ ---
318
+
319
+ ## (Необязательно) Шаг 9: `<html lang>` и `dir` (TanStack Start Document)
320
+
321
+ TanStack Start предоставляет **Document** (корневой HTML-шаблон), который вы можете настроить. Установите `lang` и `dir` для доступности и SEO:
322
+
323
+ ```tsx fileName="src/routes/__root.tsx" {4,15}
324
+ import { Outlet, createRootRoute } from "@tanstack/react-router";
325
+ import { IntlayerProvider } from "react-intlayer";
326
+ import { getHTMLTextDir } from "intlayer";
327
+
328
+ function Document({
329
+ locale,
330
+ children,
331
+ }: {
332
+ locale: string;
333
+ children: React.ReactNode;
334
+ }) {
335
+ return (
336
+ <html lang={locale} dir={getHTMLTextDir(locale)}>
337
+ <head>
338
+ <meta charSet="utf-8" />
339
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
340
+ {/* ... */}
341
+ </head>
342
+ <body>{children}</body>
343
+ </html>
344
+ );
345
+ }
346
+
347
+ export const Route = createRootRoute({
348
+ component: () => (
349
+ <IntlayerProvider>
350
+ {/* Если вы вычисляете локаль на сервере, передайте её в Document; иначе клиент исправит после гидратации */}
351
+ <Document locale={document?.documentElement?.lang || "en"}>
352
+ <Outlet />
353
+ </Document>
354
+ </IntlayerProvider>
355
+ ),
356
+ });
357
+ ```
358
+
359
+ Для исправления на стороне клиента вы также можете использовать небольшой хук:
360
+
361
+ ```tsx fileName="src/hooks/useI18nHTMLAttributes.tsx"
362
+ import { useEffect } from "react";
363
+ import { useLocale } from "react-intlayer";
364
+ import { getHTMLTextDir } from "intlayer";
365
+
366
+ export const useI18nHTMLAttributes = () => {
367
+ const { locale } = useLocale();
368
+ useEffect(() => {
369
+ document.documentElement.lang = locale; // Устанавливаем атрибут lang для документа
370
+ document.documentElement.dir = getHTMLTextDir(locale); // Устанавливаем направление текста (ltr или rtl) в зависимости от локали
371
+ }, [locale]);
372
+ };
373
+ ```
374
+
375
+ ---
376
+
377
+ ## (Необязательно) Шаг 10: Локализованный компонент Link
378
+
379
+ TanStack Router предоставляет компонент `<Link/>`, но если вам когда-либо понадобится простой `<a>`, который автоматически добавляет префикс локали к внутренним URL:
380
+
381
+ ```tsx fileName="src/components/Link.tsx"
382
+ import { getLocalizedUrl } from "intlayer";
383
+ import {
384
+ forwardRef,
385
+ type AnchorHTMLAttributes,
386
+ type DetailedHTMLProps,
387
+ } from "react";
388
+ import { useLocale } from "react-intlayer";
389
+
390
+ export interface LinkProps
391
+ extends DetailedHTMLProps<
392
+ AnchorHTMLAttributes<HTMLAnchorElement>,
393
+ HTMLAnchorElement
394
+ > {}
395
+
396
+ const isExternal = (href?: string) => /^https?:\/\//.test(href ?? "");
397
+
398
+ export const Link = forwardRef<HTMLAnchorElement, LinkProps>(
399
+ ({ href, children, ...props }, ref) => {
400
+ const { locale } = useLocale();
401
+ const hrefI18n =
402
+ href && !isExternal(href) ? getLocalizedUrl(href, locale) : href;
403
+ return (
404
+ <a href={hrefI18n} ref={ref} {...props}>
405
+ {children}
406
+ </a>
407
+ );
408
+ }
409
+ );
410
+ Link.displayName = "Link";
411
+ ```
412
+
413
+ > Если вы используете шаблон A (basepath), то `<Link to="/about" />` из TanStack уже преобразуется в `/fr/about` через `basepath`, поэтому кастомная ссылка является необязательной.
414
+
415
+ ---
416
+
417
+ ## TypeScript
418
+
419
+ Включите сгенерированные Intlayer типы:
420
+
421
+ ```json5 fileName="tsconfig.json"
422
+ {
423
+ "include": ["src", ".intlayer/**/*.ts"],
424
+ }
425
+ ```
426
+
427
+ ---
428
+
429
+ ## Git
430
+
431
+ Игнорируйте сгенерированные артефакты Intlayer:
432
+
433
+ ```gitignore
434
+ .intlayer
435
+ ```
436
+
437
+ ---
438
+
439
+ ## Расширение VS Code
440
+
441
+ - **Расширение Intlayer для VS Code** → автодополнение, ошибки, встроенные превью, быстрые действия.
442
+ Marketplace: `intlayer.intlayer-vs-code-extension`
443
+
444
+ ---
445
+
446
+ ## Дальнейшие шаги
447
+
448
+ - Визуальный редактор
449
+ - Режим CMS
450
+ - Определение локали на краю / адаптеры
451
+
452
+ ---
453
+
454
+ ## История документации
455
+
456
+ | Версия | Дата | Изменения |
457
+ | ------ | ---------- | ---------------------------------- |
458
+ | 1.0.0 | 2025-08-11 | Добавлена адаптация TanStack Start |
@@ -279,7 +279,6 @@ Intlayer предоставляет множество функций, кото
279
279
  - [`useIntlayer()`](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/packages/next-intlayer/useIntlayer.md)
280
280
  - [`useDictionary()`](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/packages/next-intlayer/useDictionary.md)
281
281
  - [`useLocale()`](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/packages/next-intlayer/useLocale.md)
282
- - [`useIntlayerAsync()`](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/packages/next-intlayer/useIntlayerAsync.md)
283
282
 
284
283
  ## История документации
285
284
 
@@ -274,7 +274,6 @@ Intlayer предоставляет множество функций, кото
274
274
  - [`useIntlayer()`](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/packages/react-intlayer/useIntlayer.md)
275
275
  - [`useDictionary()`](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/packages/react-intlayer/useDictionary.md)
276
276
  - [`useLocale()`](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/packages/react-intlayer/useLocale.md)
277
- - [`useIntlayerAsync()`](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/packages/react-intlayer/useIntlayerAsync.md)
278
277
 
279
278
  ## История документации
280
279
 
package/docs/zh/CI_CD.md CHANGED
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  createdAt: 2025-05-20
3
- updatedAt: 2025-06-29
3
+ updatedAt: 2025-08-13
4
4
  title: CI/CD 集成
5
5
  description: 了解如何将 Intlayer 集成到您的 CI/CD 流水线中,实现内容管理和部署的自动化。
6
6
  keywords:
@@ -19,11 +19,11 @@ slugs:
19
19
 
20
20
  # 在 CI/CD 流水线中自动生成翻译
21
21
 
22
- Intlayer 允许自动生成内容声明文件的翻译。根据您的工作流程,有多种实现方式。
22
+ Intlayer 允许自动生成内容声明文件的翻译。根据您的工作流程,有多种方式可以实现这一点。
23
23
 
24
24
  ## 使用 CMS
25
25
 
26
- 使用 Intlayer,您可以采用一种工作流程,其中本地只声明单一语言环境,而所有翻译内容均通过 CMS 远程管理。这使得内容和翻译可以完全脱离代码库,提供给内容编辑者更大的灵活性,并支持热内容重载(无需重新构建应用即可应用更改)。
26
+ 使用 Intlayer,您可以采用一种工作流程,只在本地声明单一语言环境,而所有翻译内容则通过 CMS 远程管理。这使内容和翻译完全脱离代码库,为内容编辑者提供更大的灵活性,并支持热内容重载(无需重建应用即可应用更改)。
27
27
 
28
28
  ### 示例配置
29
29
 
@@ -45,7 +45,7 @@ const config: IntlayerConfig = {
45
45
  clientSecret: process.env.INTLAYER_CLIENT_SECRET,
46
46
  },
47
47
  ai: {
48
- applicationContext: "This is a test application", // 有助于确保一致的翻译生成
48
+ applicationContext: "这是一个测试应用程序", // 有助于确保一致的翻译生成
49
49
  },
50
50
  };
51
51
 
@@ -77,7 +77,7 @@ const config: IntlayerConfig = {
77
77
  provider: "openai",
78
78
  apiKey: process.env.OPENAI_API_KEY, // 使用您自己的 API 密钥
79
79
 
80
- applicationContext: "这是一个测试应用", // 有助于确保翻译生成的一致性
80
+ applicationContext: "这是一个测试应用程序", // 有助于确保翻译生成的一致性
81
81
  },
82
82
  };
83
83
 
@@ -85,7 +85,7 @@ export default config;
85
85
  ```
86
86
 
87
87
  ```bash fileName=".husky/pre-push"
88
- npx intlayer build # 确保字典是最新的
88
+ npx intlayer build # 确保词典是最新的
89
89
  npx intlayer fill --unpushed --mode fill # 仅填充缺失内容,不更新已有内容
90
90
  ```
91
91
 
@@ -105,68 +105,94 @@ npx intlayer fill --base-dir ./app2 --unpushed --mode fill
105
105
 
106
106
  ## 使用 GitHub Actions
107
107
 
108
- Intlayer 提供了一个 CLI 命令用于自动填充和审查字典内容。您可以使用 GitHub Actions 将其集成到您的 CI/CD 工作流中。
108
+ Intlayer 提供了一个 CLI 命令,用于自动填充和审查词典内容。您可以将其集成到使用 GitHub Actions CI/CD 工作流中。
109
109
 
110
110
  ```yaml fileName=".github/workflows/intlayer-translate.yml"
111
111
  name: Intlayer 自动填充
112
+ # 触发此工作流的条件
112
113
  on:
113
- push:
114
- branches: [ main ]
115
- paths:
116
- - 'src/**'
117
114
  pull_request:
118
- branches: [ main ]
119
- paths:
120
- - 'src/**'
121
- workflow_dispatch: {}
115
+ branches:
116
+ - "main"
117
+
118
+ permissions:
119
+ contents: write
120
+ pull-requests: write
122
121
 
123
122
  concurrency:
124
- group: 'autofill-${{ github.ref }}'
123
+ group: "autofill-${{ github.ref }}"
125
124
  cancel-in-progress: true
126
125
 
127
126
  jobs:
128
127
  autofill:
129
128
  runs-on: ubuntu-latest
130
129
  env:
131
- INTLAYER_CLIENT_ID: ${{ secrets.INTLAYER_CLIENT_ID }}
132
- INTLAYER_CLIENT_SECRET: ${{ secrets.INTLAYER_CLIENT_SECRET }}
133
- OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
130
+ # OpenAI
131
+ AI_MODEL: openai
132
+ AI_PROVIDER: gpt-5-mini
133
+ AI_API_KEY: ${{ secrets.AI_API_KEY }}
134
134
 
135
135
  steps:
136
+ # 第一步:从仓库获取最新代码
136
137
  - name: ⬇️ 签出仓库
137
- uses: actions/checkout@v3
138
+ uses: actions/checkout@v4
138
139
  with:
139
- persist-credentials: true
140
+ persist-credentials: true # 保留凭据以创建拉取请求
141
+ fetch-depth: 0 # 获取完整的 git 历史以进行差异分析
140
142
 
143
+ # 步骤 2:设置 Node.js 环境
141
144
  - name: 🟢 设置 Node.js
142
- uses: actions/setup-node@v3
145
+ uses: actions/setup-node@v4
143
146
  with:
144
- node-version: 20
147
+ node-version: 20 # 使用 Node.js 20 LTS 以保证稳定性
145
148
 
149
+ # 步骤 3:安装项目依赖
146
150
  - name: 📦 安装依赖
147
- run: npm ci
151
+ run: npm install
152
+
153
+ # 步骤 4:全局安装 Intlayer CLI 以管理翻译
154
+ - name: 📦 安装 Intlayer
155
+ run: npm install -g intlayer-cli
148
156
 
157
+ # 步骤 5:构建 Intlayer 项目以生成翻译文件
149
158
  - name: ⚙️ 构建 Intlayer 项目
150
159
  run: npx intlayer build
151
160
 
161
+ # 步骤 6:使用 AI 自动填充缺失的翻译
152
162
  - name: 🤖 自动填充缺失的翻译
153
- run: npx intlayer fill --git-diff --mode fill
154
-
155
- - name: 📤 创建或更新翻译拉取请求
156
- uses: peter-evans/create-pull-request@v4
157
- with:
158
- commit-message: chore: 自动填充缺失的翻译 [skip ci]
159
- branch: auto-translations
160
- title: chore: 更新缺失的翻译
161
- labels: translation, automated
163
+ run: npx intlayer fill --git-diff --mode fill --provider $AI_PROVIDER --model $AI_MODEL --api-key $AI_API_KEY
164
+
165
+ # 第7步:检查是否有更改并提交
166
+ - name: � 检查更改
167
+ id: check-changes
168
+ run: |
169
+ if [ -n "$(git status --porcelain)" ]; then
170
+ echo "has-changes=true" >> $GITHUB_OUTPUT
171
+ else
172
+ echo "has-changes=false" >> $GITHUB_OUTPUT
173
+ fi
174
+
175
+ # 第8步:如果存在更改,则提交并推送
176
+ - name: 📤 提交并推送更改
177
+ if: steps.check-changes.outputs.has-changes == 'true'
178
+ run: |
179
+ git config --local user.email "action@github.com"
180
+ git config --local user.name "GitHub Action"
181
+ git add .
182
+ git commit -m "chore: 自动填充缺失的翻译 [skip ci]"
183
+ git push origin HEAD:${{ github.head_ref }}
162
184
  ```
163
185
 
164
- > Husky 相同,在 monorepo 的情况下,您可以使用 `--base-dir` 参数来顺序处理每个应用。
186
+ 要设置环境变量,请前往 GitHub 设置 Secrets and variables → Actions 并添加密钥(API_KEY)。
187
+
188
+ > 与 Husky 相同,在单一仓库(monorepo)的情况下,可以使用 `--base-dir` 参数依次处理每个应用。
165
189
 
166
- > 默认情况下,`--git-diff` 参数会过滤包含从基线(默认 `origin/main`)到当前分支(默认:`HEAD`)的更改的字典。
190
+ > 默认情况下,`--git-diff` 参数会筛选包含从基线(默认 `origin/main`)到当前分支(默认 `HEAD`)的更改的字典。
167
191
 
168
192
  > 有关 Intlayer CLI 命令及其用法的更多信息,请参阅 [CLI 文档](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/intlayer_cli.md)。
169
193
 
170
194
  ## 文档历史
171
195
 
172
- - 5.5.10 - 2025-06-29:初始化历史
196
+ | 版本 | 日期 | 变更 |
197
+ | ------ | ---------- | -------------- |
198
+ | 5.5.10 | 2025-06-29 | 初始化历史记录 |