@intlayer/docs 9.2.0 → 9.3.1
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/README.md +24 -24
- package/blog/ar/index.md +1 -1
- package/blog/ar/rag_powered_documentation_assistant.md +1 -1
- package/blog/de/index.md +1 -1
- package/blog/en/index.md +1 -1
- package/blog/en-GB/index.md +1 -1
- package/blog/es/index.md +1 -1
- package/blog/fr/index.md +1 -1
- package/blog/hi/index.md +1 -1
- package/blog/id/index.md +1 -1
- package/blog/it/index.md +1 -1
- package/blog/ja/index.md +1 -1
- package/blog/ko/index.md +1 -1
- package/blog/pl/index.md +1 -1
- package/blog/pl/rag_powered_documentation_assistant.md +1 -1
- package/blog/pt/index.md +1 -1
- package/blog/ru/index.md +1 -1
- package/blog/uk/index.md +1 -1
- package/blog/vi/index.md +1 -1
- package/blog/zh/index.md +1 -1
- package/dist/cjs/_virtual/_rolldown/runtime.cjs +1 -2
- package/dist/cjs/authors2.cjs +0 -1
- package/dist/cjs/common.cjs +24 -1
- package/dist/cjs/common.cjs.map +1 -1
- package/dist/cjs/generated/blog.entry.cjs +35 -6
- package/dist/cjs/generated/blog.entry.cjs.map +1 -1
- package/dist/cjs/generated/docs.entry.cjs +35 -6
- package/dist/cjs/generated/docs.entry.cjs.map +1 -1
- package/dist/cjs/generated/frequentQuestions.entry.cjs +35 -6
- package/dist/cjs/generated/frequentQuestions.entry.cjs.map +1 -1
- package/dist/cjs/generated/legal.entry.cjs +35 -6
- package/dist/cjs/generated/legal.entry.cjs.map +1 -1
- package/dist/esm/common.mjs +24 -1
- package/dist/esm/common.mjs.map +1 -1
- package/dist/esm/generated/blog.entry.mjs +35 -6
- package/dist/esm/generated/blog.entry.mjs.map +1 -1
- package/dist/esm/generated/docs.entry.mjs +35 -6
- package/dist/esm/generated/docs.entry.mjs.map +1 -1
- package/dist/esm/generated/frequentQuestions.entry.mjs +35 -6
- package/dist/esm/generated/frequentQuestions.entry.mjs.map +1 -1
- package/dist/esm/generated/legal.entry.mjs +35 -6
- package/dist/esm/generated/legal.entry.mjs.map +1 -1
- package/dist/types/common.d.ts.map +1 -1
- package/dist/types/generated/blog.entry.d.ts.map +1 -1
- package/dist/types/generated/docs.entry.d.ts.map +1 -1
- package/dist/types/generated/frequentQuestions.entry.d.ts.map +1 -1
- package/dist/types/generated/legal.entry.d.ts.map +1 -1
- package/docs/ar/bundle_optimization.md +58 -25
- package/docs/ar/configuration.md +10 -10
- package/docs/ar/interest_of_intlayer.md +24 -22
- package/docs/ar/intlayer_with_express.md +1 -1
- package/docs/ar/intlayer_with_svelte_kit.md +1 -1
- package/docs/ar/intlayer_with_tanstack+solid.md +5 -3
- package/docs/ar/intlayer_with_tanstack.md +5 -3
- package/docs/ar/live-sync.md +4 -0
- package/docs/ar/lsp.md +114 -175
- package/docs/ar/readme.md +25 -25
- package/docs/bn/bundle_optimization.md +58 -25
- package/docs/bn/configuration.md +10 -10
- package/docs/bn/interest_of_intlayer.md +24 -22
- package/docs/cs/bundle_optimization.md +58 -25
- package/docs/cs/configuration.md +10 -10
- package/docs/cs/interest_of_intlayer.md +24 -22
- package/docs/de/bundle_optimization.md +58 -25
- package/docs/de/configuration.md +10 -10
- package/docs/de/interest_of_intlayer.md +24 -22
- package/docs/de/intlayer_with_svelte_kit.md +1 -1
- package/docs/de/intlayer_with_tanstack+solid.md +5 -3
- package/docs/de/intlayer_with_tanstack.md +5 -3
- package/docs/de/live-sync.md +4 -0
- package/docs/de/lsp.md +111 -172
- package/docs/de/readme.md +24 -24
- package/docs/en/bundle_optimization.md +51 -23
- package/docs/en/configuration.md +10 -10
- package/docs/en/interest_of_intlayer.md +24 -22
- package/docs/en/intlayer_with_svelte_kit.md +1 -1
- package/docs/en/intlayer_with_tanstack+solid.md +5 -3
- package/docs/en/intlayer_with_tanstack.md +5 -3
- package/docs/en/live-sync.md +4 -0
- package/docs/en/lsp.md +109 -170
- package/docs/en/readme.md +24 -24
- package/docs/en-GB/bundle_optimization.md +58 -25
- package/docs/en-GB/configuration.md +10 -10
- package/docs/en-GB/interest_of_intlayer.md +24 -22
- package/docs/en-GB/intlayer_with_svelte_kit.md +1 -1
- package/docs/en-GB/intlayer_with_tanstack+solid.md +5 -3
- package/docs/en-GB/intlayer_with_tanstack.md +5 -3
- package/docs/en-GB/live-sync.md +4 -0
- package/docs/en-GB/lsp.md +109 -170
- package/docs/en-GB/readme.md +24 -24
- package/docs/es/bundle_optimization.md +58 -25
- package/docs/es/configuration.md +10 -10
- package/docs/es/interest_of_intlayer.md +24 -22
- package/docs/es/intlayer_with_svelte_kit.md +1 -1
- package/docs/es/intlayer_with_tanstack+solid.md +5 -3
- package/docs/es/intlayer_with_tanstack.md +5 -3
- package/docs/es/live-sync.md +4 -0
- package/docs/es/lsp.md +114 -175
- package/docs/es/readme.md +24 -24
- package/docs/fr/bundle_optimization.md +58 -25
- package/docs/fr/configuration.md +10 -10
- package/docs/fr/interest_of_intlayer.md +24 -22
- package/docs/fr/intlayer_with_svelte_kit.md +1 -1
- package/docs/fr/intlayer_with_tanstack+solid.md +5 -3
- package/docs/fr/intlayer_with_tanstack.md +5 -3
- package/docs/fr/live-sync.md +4 -0
- package/docs/fr/lsp.md +110 -171
- package/docs/fr/readme.md +24 -24
- package/docs/hi/bundle_optimization.md +58 -25
- package/docs/hi/configuration.md +10 -10
- package/docs/hi/interest_of_intlayer.md +24 -22
- package/docs/hi/intlayer_with_express.md +1 -1
- package/docs/hi/intlayer_with_svelte_kit.md +1 -1
- package/docs/hi/intlayer_with_tanstack+solid.md +5 -3
- package/docs/hi/intlayer_with_tanstack.md +5 -3
- package/docs/hi/live-sync.md +4 -0
- package/docs/hi/lsp.md +113 -174
- package/docs/hi/readme.md +24 -24
- package/docs/id/bundle_optimization.md +58 -25
- package/docs/id/configuration.md +10 -10
- package/docs/id/interest_of_intlayer.md +24 -22
- package/docs/id/intlayer_with_svelte_kit.md +1 -1
- package/docs/id/intlayer_with_tanstack+solid.md +5 -3
- package/docs/id/intlayer_with_tanstack.md +5 -3
- package/docs/id/live-sync.md +4 -0
- package/docs/id/lsp.md +113 -174
- package/docs/id/readme.md +24 -24
- package/docs/it/bundle_optimization.md +58 -25
- package/docs/it/configuration.md +10 -10
- package/docs/it/interest_of_intlayer.md +24 -22
- package/docs/it/intlayer_with_svelte_kit.md +1 -1
- package/docs/it/intlayer_with_tanstack+solid.md +5 -3
- package/docs/it/intlayer_with_tanstack.md +5 -3
- package/docs/it/live-sync.md +4 -0
- package/docs/it/lsp.md +115 -176
- package/docs/it/readme.md +24 -24
- package/docs/ja/bundle_optimization.md +58 -25
- package/docs/ja/configuration.md +10 -10
- package/docs/ja/interest_of_intlayer.md +24 -22
- package/docs/ja/intlayer_with_tanstack+solid.md +5 -3
- package/docs/ja/intlayer_with_tanstack.md +5 -3
- package/docs/ja/live-sync.md +4 -0
- package/docs/ja/lsp.md +113 -174
- package/docs/ja/readme.md +24 -24
- package/docs/ko/bundle_optimization.md +58 -25
- package/docs/ko/configuration.md +10 -10
- package/docs/ko/interest_of_intlayer.md +24 -22
- package/docs/ko/intlayer_with_svelte_kit.md +1 -1
- package/docs/ko/intlayer_with_tanstack+solid.md +5 -3
- package/docs/ko/intlayer_with_tanstack.md +5 -3
- package/docs/ko/live-sync.md +4 -0
- package/docs/ko/lsp.md +112 -173
- package/docs/ko/readme.md +24 -24
- package/docs/nl/bundle_optimization.md +58 -25
- package/docs/nl/configuration.md +10 -10
- package/docs/nl/interest_of_intlayer.md +24 -22
- package/docs/pl/bundle_optimization.md +58 -25
- package/docs/pl/configuration.md +10 -10
- package/docs/pl/interest_of_intlayer.md +4 -2
- package/docs/pl/intlayer_with_svelte_kit.md +1 -1
- package/docs/pl/intlayer_with_tanstack+solid.md +5 -3
- package/docs/pl/intlayer_with_tanstack.md +5 -3
- package/docs/pl/live-sync.md +4 -0
- package/docs/pl/lsp.md +115 -176
- package/docs/pl/readme.md +24 -24
- package/docs/pt/bundle_optimization.md +58 -24
- package/docs/pt/configuration.md +10 -10
- package/docs/pt/interest_of_intlayer.md +24 -22
- package/docs/pt/intlayer_with_svelte_kit.md +1 -1
- package/docs/pt/intlayer_with_tanstack+solid.md +5 -3
- package/docs/pt/intlayer_with_tanstack.md +5 -3
- package/docs/pt/live-sync.md +4 -0
- package/docs/pt/lsp.md +113 -174
- package/docs/pt/readme.md +24 -24
- package/docs/ru/bundle_optimization.md +58 -25
- package/docs/ru/configuration.md +10 -10
- package/docs/ru/interest_of_intlayer.md +24 -22
- package/docs/ru/intlayer_with_nextjs_14.md +1 -1
- package/docs/ru/intlayer_with_nextjs_15.md +1 -1
- package/docs/ru/intlayer_with_svelte_kit.md +1 -1
- package/docs/ru/intlayer_with_tanstack+solid.md +5 -3
- package/docs/ru/intlayer_with_tanstack.md +5 -3
- package/docs/ru/live-sync.md +4 -0
- package/docs/ru/lsp.md +112 -173
- package/docs/ru/readme.md +24 -24
- package/docs/tr/bundle_optimization.md +58 -25
- package/docs/tr/configuration.md +10 -10
- package/docs/tr/interest_of_intlayer.md +24 -22
- package/docs/tr/intlayer_with_svelte_kit.md +1 -1
- package/docs/tr/intlayer_with_tanstack+solid.md +5 -3
- package/docs/tr/intlayer_with_tanstack.md +5 -3
- package/docs/tr/live-sync.md +4 -0
- package/docs/tr/lsp.md +113 -174
- package/docs/tr/readme.md +24 -24
- package/docs/uk/bundle_optimization.md +58 -25
- package/docs/uk/configuration.md +10 -10
- package/docs/uk/interest_of_intlayer.md +4 -2
- package/docs/uk/intlayer_with_svelte_kit.md +1 -1
- package/docs/uk/intlayer_with_tanstack+solid.md +5 -3
- package/docs/uk/intlayer_with_tanstack.md +5 -3
- package/docs/uk/live-sync.md +4 -0
- package/docs/uk/lsp.md +113 -174
- package/docs/uk/per_locale_file.md +1 -1
- package/docs/uk/readme.md +24 -24
- package/docs/ur/bundle_optimization.md +58 -25
- package/docs/ur/configuration.md +10 -10
- package/docs/ur/interest_of_intlayer.md +24 -22
- package/docs/vi/bundle_optimization.md +58 -25
- package/docs/vi/configuration.md +10 -10
- package/docs/vi/interest_of_intlayer.md +24 -22
- package/docs/vi/intlayer_with_svelte_kit.md +1 -1
- package/docs/vi/intlayer_with_tanstack+solid.md +5 -3
- package/docs/vi/intlayer_with_tanstack.md +5 -3
- package/docs/vi/live-sync.md +4 -0
- package/docs/vi/lsp.md +115 -176
- package/docs/vi/readme.md +24 -24
- package/docs/zh/bundle_optimization.md +58 -25
- package/docs/zh/configuration.md +10 -10
- package/docs/zh/interest_of_intlayer.md +24 -22
- package/docs/zh/intlayer_with_svelte_kit.md +1 -1
- package/docs/zh/intlayer_with_tanstack+solid.md +5 -3
- package/docs/zh/intlayer_with_tanstack.md +5 -3
- package/docs/zh/live-sync.md +4 -0
- package/docs/zh/lsp.md +113 -174
- package/docs/zh/readme.md +21 -21
- package/docs/zh-TW/bundle_optimization.md +58 -25
- package/docs/zh-TW/interest_of_intlayer.md +24 -22
- package/package.json +7 -7
- package/src/common.ts +39 -2
- package/src/generated/blog.entry.ts +39 -7
- package/src/generated/docs.entry.ts +39 -7
- package/src/generated/frequentQuestions.entry.ts +39 -7
- package/src/generated/legal.entry.ts +39 -7
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
createdAt: 2025-11-25
|
|
3
|
-
updatedAt: 2026-
|
|
3
|
+
updatedAt: 2026-08-09
|
|
4
4
|
title: Оптимізація розміру бандлу та продуктивності i18n
|
|
5
5
|
description: Зменште розмір бандлу вашого застосунку завдяки оптимізації контенту інтернаціоналізації (i18n). Дізнайтеся, як використовувати tree shaking та ліниве завантаження (lazy loading) для словників за допомогою Intlayer.
|
|
6
6
|
keywords:
|
|
@@ -16,6 +16,12 @@ slugs:
|
|
|
16
16
|
- concept
|
|
17
17
|
- bundle-optimization
|
|
18
18
|
history:
|
|
19
|
+
- version: 9.2.1
|
|
20
|
+
date: 2026-08-09
|
|
21
|
+
changes: "`purge` та `minify` тепер працюють у Next.js через `@intlayer/swc` — файл `babel.config.js` не потрібен"
|
|
22
|
+
- version: 8.12.0
|
|
23
|
+
date: 2026-06-24
|
|
24
|
+
changes: "Перелік плагінів Babel у потрібному порядку конвеєра (extract → purge → minify → optimize) у довідкових таблицях"
|
|
19
25
|
- version: 8.12.0
|
|
20
26
|
date: 2026-06-07
|
|
21
27
|
changes: "Додано `intlayerPurgeBabelPlugin` та `intlayerMinifyBabelPlugin` для Babel/Webpack; уточнено порядок конвеєра плагінів"
|
|
@@ -191,12 +197,14 @@ Intlayer використовує **підхід на рівні компоне
|
|
|
191
197
|
|
|
192
198
|
Ці плагіни використовуються безпосередньо в `babel.config.js` для налаштувань на базі Webpack (Next.js із Babel, CRA, кастомний Webpack тощо).
|
|
193
199
|
|
|
200
|
+
Таблиця нижче перелічує їх у потрібному порядку конвеєра (у тому самому порядку, в якому вони мають бути в `babel.config.js`):
|
|
201
|
+
|
|
194
202
|
| Плагін | Що він робить |
|
|
195
203
|
| :---------------------------- | :--------------------------------------------------------------------------------------------------------------------------------- |
|
|
196
204
|
| `intlayerExtractBabelPlugin` | Сканує файли `.content.ts` та записує зібрані словники до папки `.intlayer/` |
|
|
197
|
-
| `intlayerOptimizeBabelPlugin` | Переписує `useIntlayer('key')` на `useDictionary(hash)` та інжектить (вставляє) відповідний `import` словника |
|
|
198
205
|
| `intlayerPurgeBabelPlugin` | Сканує всі файли з кодом та видаляє **невикористані поля контенту** зі скомпільованих словників `.intlayer/**/*.json` |
|
|
199
206
|
| `intlayerMinifyBabelPlugin` | **Перейменовує ключі полів контенту** на короткі алфавітні псевдоніми (наприклад, `title` → `a`) у JSON-файлах та у вихідному коді |
|
|
207
|
+
| `intlayerOptimizeBabelPlugin` | Переписує `useIntlayer('key')` на `useDictionary(hash)` та інжектить (вставляє) відповідний `import` словника |
|
|
200
208
|
|
|
201
209
|
> **Порядок плагінів має значення.** У файлі `babel.config.js` плагіни `purge` та `minify` мають з'являтися **перед** плагіном `optimize`. Оскільки `optimize` замінює `useIntlayer('key')` на непрозорий (opaque) виклик `useDictionary(hash)`, він стирає інформацію про ключ словника. Але саме ця інформація потрібна на етапах `purge` та `minify`, щоб розпізнати, які поля контенту використовуються.
|
|
202
210
|
|
|
@@ -205,9 +213,9 @@ Intlayer використовує **підхід на рівні компоне
|
|
|
205
213
|
| Options helper | З яким плагіном використовується |
|
|
206
214
|
| :--------------------------- | :------------------------------- |
|
|
207
215
|
| `getExtractPluginOptions()` | `intlayerExtractBabelPlugin` |
|
|
208
|
-
| `getOptimizePluginOptions()` | `intlayerOptimizeBabelPlugin` |
|
|
209
216
|
| `getPurgePluginOptions()` | `intlayerPurgeBabelPlugin` |
|
|
210
217
|
| `getMinifyPluginOptions()` | `intlayerMinifyBabelPlugin` |
|
|
218
|
+
| `getOptimizePluginOptions()` | `intlayerOptimizeBabelPlugin` |
|
|
211
219
|
|
|
212
220
|
### Плагіни Vite (`vite-intlayer`)
|
|
213
221
|
|
|
@@ -220,6 +228,20 @@ Intlayer використовує **підхід на рівні компоне
|
|
|
220
228
|
| Dictionary minify | Аналогічно до етапу запису JSON плагіна `intlayerMinifyBabelPlugin` |
|
|
221
229
|
| Babel transform | Аналогічно до перейменування у вихідному коді плагіном `intlayerMinifyBabelPlugin` + `intlayerOptimizeBabelPlugin` |
|
|
222
230
|
|
|
231
|
+
### Плагін SWC (`@intlayer/swc`)
|
|
232
|
+
|
|
233
|
+
Користувачі Next.js **також ніколи не налаштовують це напряму**. Починаючи з **v9.2.1**, `withIntlayer()` у `next.config.ts` виконує весь конвеєр — purge, мініфікацію та переписування імпортів — спираючись лише на прапорці `build.purge` і `build.minify`.
|
|
234
|
+
|
|
235
|
+
Роботу поділено на дві частини, бо Wasm-плагін SWC перетворює по одному файлу за раз і не має доступу до файлової системи:
|
|
236
|
+
|
|
237
|
+
| Прохід | Де виконується | Що робить |
|
|
238
|
+
| :---------------------------------------------------- | :------------------------------- | :--------------------------------------------------------------------------------------------------- |
|
|
239
|
+
| Аналіз використання + purge/мініфікація JSON | Node, усередині `withIntlayer()` | Читає кожен вихідний файл компонента, переписує `.intlayer/**/*.json`, формує таблиці перейменування |
|
|
240
|
+
| Переписування вихідного коду (`content.title` → `.a`) | `@intlayer/swc` (Wasm) | Застосовує таблиці перейменування до відповідних звернень до властивостей у вашому коді |
|
|
241
|
+
| Переписування імпортів (`useIntlayer` → dict) | `@intlayer/swc` (Wasm) | Те саме, що `intlayerOptimizeBabelPlugin` |
|
|
242
|
+
|
|
243
|
+
Визначення того, _які_ поля не використовуються і _який_ псевдонім отримає кожне з них, потребує стану між файлами та файлового вводу-виводу, тож ця половина виконується в Node; плагін SWC отримує лише готові таблиці.
|
|
244
|
+
|
|
223
245
|
## Налаштування за платформами
|
|
224
246
|
|
|
225
247
|
<Tabs>
|
|
@@ -227,10 +249,12 @@ Intlayer використовує **підхід на рівні компоне
|
|
|
227
249
|
|
|
228
250
|
### Next.js
|
|
229
251
|
|
|
230
|
-
Next.js потребує плагіна `@intlayer/swc
|
|
252
|
+
Next.js потребує плагіна `@intlayer/swc`, оскільки Next.js використовує SWC для збірок. Починаючи з **v9.2.1** цей єдиний пакет охоплює весь конвеєр — оптимізацію (переписування імпортів), purge та мініфікацію.
|
|
231
253
|
|
|
232
254
|
> Цей плагін не встановлюється автоматично, адже плагіни SWC для Next.js ще мають експериментальний статус. У майбутньому це може змінитися.
|
|
233
255
|
|
|
256
|
+
> **Next.js 16.1.0 — мінімальна версія.** Це перший реліз, побудований на прямо сумісному ABI Wasm-плагінів SWC; більш ранні релізи відхиляють плагін. `withIntlayer` зчитує вашу версію Next.js і просто не реєструє плагін нижче 16.1.0 — такі збірки все одно проходять успішно, просто без оптимізації бандла.
|
|
257
|
+
|
|
234
258
|
<Tabs>
|
|
235
259
|
<Tab value="npm">
|
|
236
260
|
|
|
@@ -265,33 +289,40 @@ intlayer-swc-plugin = "*"
|
|
|
265
289
|
|
|
266
290
|
Після встановлення Intlayer автоматично виявить і почне використовувати цей плагін.
|
|
267
291
|
|
|
268
|
-
|
|
292
|
+
Проходи **purge та мініфікації** (видалення й перейменування полів) не потребують ані додаткового пакета, ані `babel.config.js`. Оберніть свою конфігурацію в `withIntlayer` і увімкніть прапорці в `intlayer.config.ts`:
|
|
269
293
|
|
|
270
|
-
```
|
|
271
|
-
|
|
294
|
+
```typescript fileName="next.config.ts"
|
|
295
|
+
import { withIntlayer } from "next-intlayer/server";
|
|
296
|
+
import type { NextConfig } from "next";
|
|
297
|
+
|
|
298
|
+
const nextConfig: NextConfig = {/* ваша конфігурація */};
|
|
299
|
+
|
|
300
|
+
export default withIntlayer(nextConfig);
|
|
272
301
|
```
|
|
273
302
|
|
|
274
|
-
```
|
|
275
|
-
|
|
276
|
-
intlayerPurgeBabelPlugin,
|
|
277
|
-
intlayerMinifyBabelPlugin,
|
|
278
|
-
getPurgePluginOptions,
|
|
279
|
-
getMinifyPluginOptions,
|
|
280
|
-
} = require("@intlayer/babel");
|
|
303
|
+
```typescript fileName="intlayer.config.ts"
|
|
304
|
+
import type { IntlayerConfig } from "intlayer";
|
|
281
305
|
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
//
|
|
286
|
-
|
|
287
|
-
// Minify: перейменувати ключі полів контенту в JSON-файлах та вихідному коді
|
|
288
|
-
[intlayerMinifyBabelPlugin, getMinifyPluginOptions()],
|
|
289
|
-
// Примітка: intlayerOptimizeBabelPlugin тут НЕ потрібен, тому що
|
|
290
|
-
// @intlayer/swc вже відповідає за переписування useIntlayer → useDictionary.
|
|
291
|
-
],
|
|
306
|
+
const config: IntlayerConfig = {
|
|
307
|
+
build: {
|
|
308
|
+
purge: true, // видаляє невикористані поля контенту зі зібраного JSON
|
|
309
|
+
minify: true, // перейменовує ключі полів контенту на короткі псевдоніми
|
|
310
|
+
},
|
|
292
311
|
};
|
|
312
|
+
|
|
313
|
+
export default config;
|
|
293
314
|
```
|
|
294
315
|
|
|
316
|
+
Під час `next build` `withIntlayer` аналізує ваші джерела, переписує скомпільовані словники та передає отримані таблиці перейменування полів до `@intlayer/swc`, який оновлює відповідні звернення до властивостей у вашому коді.
|
|
317
|
+
|
|
318
|
+
> Використовуйте асинхронний `withIntlayer`, а не `withIntlayerSync`. Синхронний варіант не запускає конвеєр аналізу, тож purge і мініфікація з ним не діють.
|
|
319
|
+
|
|
320
|
+
> Purge і мініфікація виконуються лише під час `next build` — конвеєр оптимізації вимкнено під час `next dev`.
|
|
321
|
+
|
|
322
|
+
> Вони також вимикаються, коли налаштовано викликачів з адаптерів сумісності (`swcExtraCallers`, які задають пакети сумісності, як-от `@intlayer/next-intl` чи `@intlayer/react-i18next`): ці місця виклику невидимі для аналізатора використання, тож purge видалив би поля, які код усе ще читає. Переписування імпортів залишається активним.
|
|
323
|
+
|
|
324
|
+
**Раніші версії (до 9.2.1)** потребували `@intlayer/babel` і файл `babel.config.js`, що оголошує `intlayerPurgeBabelPlugin` та `intlayerMinifyBabelPlugin`. Цей файл більше не потрібен і його можна видалити.
|
|
325
|
+
|
|
295
326
|
</Tab>
|
|
296
327
|
<Tab value="vite">
|
|
297
328
|
|
|
@@ -447,6 +478,8 @@ export default config;
|
|
|
447
478
|
|
|
448
479
|
> Мініфікація пропускається (skipped), коли `optimize` становить `false`, або коли `editor.enabled` становить `true` (візуальний редактор потребує оригінальних імен полів для їх редагування).
|
|
449
480
|
|
|
481
|
+
> У Next.js мініфікація також пропускається, коли `@intlayer/swc` не встановлено або його неможливо завантажити (Next.js нижче 16.1.0). Плагін — це та половина, що переписує звернення у вихідному коді, тож перейменування словників без нього залишило б ваш код таким, що читає імена полів, яких більше немає.
|
|
482
|
+
|
|
450
483
|
> Мініфікація також пропускається для словників, що завантажуються з `importMode: 'fetch'`, оскільки їхні JSON-дані постачаються з віддаленого API з оригінальними іменами полів — перейменування ключів на боці клієнта порушить зв'язок сервер/клієнт.
|
|
451
484
|
|
|
452
485
|
### Очищення (видалення невикористаних полів)
|
|
@@ -475,7 +508,7 @@ export default config;
|
|
|
475
508
|
{ "title": "…", "subtitle": "…" }
|
|
476
509
|
```
|
|
477
510
|
|
|
478
|
-
> Очищення пропускається, коли `optimize` становить `false`, або коли `editor.enabled` становить `true`.
|
|
511
|
+
> Очищення пропускається, коли `optimize` становить `false`, або коли `editor.enabled` становить `true`. У Next.js його додатково пропускають, коли `@intlayer/swc` недоступний і коли налаштовано викликачів з адаптерів сумісності.
|
|
479
512
|
|
|
480
513
|
> Очищення також консервативно пропускається, коли вихідний файл не може бути розпарсений, або коли результат виклику `useIntlayer` присвоюється змінній і далі передається способами, які статичний аналізатор не може відстежити (наприклад, поширюється у вигляді spread-об'єкта чи передається як prop без деструктуризації). В таких випадках весь словник зберігається повністю.
|
|
481
514
|
|
package/docs/uk/configuration.md
CHANGED
|
@@ -404,7 +404,7 @@ const config: IntlayerConfig = {
|
|
|
404
404
|
ai: {
|
|
405
405
|
/**
|
|
406
406
|
* Використовуваний провайдер AI.
|
|
407
|
-
* Варіанти: 'openai', 'anthropic', 'mistral', 'deepseek', 'gemini', 'ollama', 'openrouter', 'alibaba', 'fireworks', 'groq', 'huggingface', 'bedrock', 'googlevertex', 'togetherai', 'lmstudio'
|
|
407
|
+
* Варіанти: 'openai', 'anthropic', 'mistral', 'deepseek', 'gemini', 'ollama', 'openrouter', 'alibaba', 'fireworks', 'groq', 'huggingface', 'bedrock', 'googlevertex', 'togetherai', 'lmstudio', 'moonshotai'
|
|
408
408
|
* За замовчуванням: 'openai'
|
|
409
409
|
*/
|
|
410
410
|
provider: "openai",
|
|
@@ -1032,15 +1032,15 @@ Intlayer підтримує широкий спектр провайдерів A
|
|
|
1032
1032
|
- **Together.ai**
|
|
1033
1033
|
- **LM Studio**
|
|
1034
1034
|
|
|
1035
|
-
| Поле | Опис | Тип
|
|
1036
|
-
| -------------------- | --------------------------------------------------------------------------------------------------------------------------------- |
|
|
1037
|
-
| `provider` | Провайдер, який використовуватиметься для функцій AI в Intlayer. | `'openai'` | <br/> `'anthropic'` | <br/> `'mistral'` | <br/> `'deepseek'` | <br/> `'gemini'` | <br/> `'ollama'` | <br/> `'openrouter'` | <br/> `'alibaba'` | <br/> `'fireworks'` | <br/> `'groq'` | <br/> `'huggingface'` | <br/> `'bedrock'` | <br/> `'googleaistudio'` | <br/> `'googlevertex'` | <br/> `'togetherai'` | <br/> `'lmstudio'` | `undefined` | `'anthropic'` | Різні провайдери вимагають різних API-ключів та мають різні ціни. |
|
|
1038
|
-
| `model` | Модель AI, яка використовуватиметься для функцій AI. | `string`
|
|
1039
|
-
| `temperature` | Контролює випадковість відповідей AI. | `number`
|
|
1040
|
-
| `apiKey` | Ваш API-ключ для вибраного провайдера. | `string`
|
|
1041
|
-
| `applicationContext` | Додатковий контекст про ваш додаток, щоб допомогти AI генерувати точніші переклади (домен, цільова аудиторія, тон, термінологія). | `string`
|
|
1042
|
-
| `baseURL` | Базовий URL для AI API. | `string`
|
|
1043
|
-
| `dataSerialization` | Формат серіалізації даних для функцій AI. | `'json'` | <br/> `'toon'`
|
|
1035
|
+
| Поле | Опис | Тип | За замовчуванням | Приклад | Примітки |
|
|
1036
|
+
| -------------------- | --------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------- | ------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
1037
|
+
| `provider` | Провайдер, який використовуватиметься для функцій AI в Intlayer. | `'openai'` | <br/> `'anthropic'` | <br/> `'mistral'` | <br/> `'deepseek'` | <br/> `'gemini'` | <br/> `'ollama'` | <br/> `'openrouter'` | <br/> `'alibaba'` | <br/> `'fireworks'` | <br/> `'groq'` | <br/> `'huggingface'` | <br/> `'bedrock'` | <br/> `'googleaistudio'` | <br/> `'googlevertex'` | <br/> `'togetherai'` | <br/> `'lmstudio'` | <br/> `'moonshotai'` | `undefined` | `'anthropic'` | Різні провайдери вимагають різних API-ключів та мають різні ціни. |
|
|
1038
|
+
| `model` | Модель AI, яка використовуватиметься для функцій AI. | `string` | Немає | `'gpt-4o-2024-11-20'` | Конкретні моделі залежать від провайдера. |
|
|
1039
|
+
| `temperature` | Контролює випадковість відповідей AI. | `number` | Немає | `0.1` | Вища температура = креативніші та менш надійні відповіді. |
|
|
1040
|
+
| `apiKey` | Ваш API-ключ для вибраного провайдера. | `string` | Немає | `process.env.OPENAI_API_KEY` | Повинно зберігатися в секреті; використовуйте змінні середовища. |
|
|
1041
|
+
| `applicationContext` | Додатковий контекст про ваш додаток, щоб допомогти AI генерувати точніші переклади (домен, цільова аудиторія, тон, термінологія). | `string` | Немає | `'мій власний контекст додатка'` | Може використовуватися для додавання правил (наприклад: `"Ви не повинні перекладати свої URL"` ). |
|
|
1042
|
+
| `baseURL` | Базовий URL для AI API. | `string` | Немає | `'https://api.openai.com/v1'` <br/> `'http://localhost:5000'` | Може вказувати на локальні або власні кінцеві точки AI API. |
|
|
1043
|
+
| `dataSerialization` | Формат серіалізації даних для функцій AI. | `'json'` | <br/> `'toon'` | `undefined` | `'toon'` | • `'json'`: за замовчуванням, надійний; використовує більше токенів.<br/>• `'toon'`: менше токенів, менш стабільно.<br/>• Передає моделі контекст як додатковий параметр (reasoning effort тощо). |
|
|
1044
1044
|
|
|
1045
1045
|
---
|
|
1046
1046
|
|
|
@@ -211,7 +211,7 @@ export const ComponentExample = () => {
|
|
|
211
211
|
Цей підхід дозволяє вам:
|
|
212
212
|
|
|
213
213
|
1. **Підвищити швидкість розробки**
|
|
214
|
-
- `.content.{
|
|
214
|
+
- `.content.{ts|js|mjs|cjs|json|tsx|jsx|md|mdx|yaml|yml}` файли можна створити за допомогою розширення VSCode
|
|
215
215
|
- Інструменти автодоповнення AI в вашій IDE (такі як GitHub Copilot) можуть допомогти вам оголосити ваш контент, зменшуючи копіювання/вставлення
|
|
216
216
|
|
|
217
217
|
2. **Очистити ваш codebase**
|
|
@@ -254,7 +254,7 @@ export const ComponentExample = () => {
|
|
|
254
254
|
|  | **Переклад на основі штучного інтелекту**<br><br>Перетворіть ваш веб-сайт на 231 мову одним кліком, використовуючи розширені інструменти перекладу на основі штучного інтелекту Intlayer з вашим власним постачальником штучного інтелекту/ключем API. <br><br> - [Інтеграція CI/CD](https://intlayer.org/doc/concept/ci-cd) <br> - [CLI Intlayer](https://intlayer.org/doc/concept/cli) <br> - [Автоматичне заповнення](https://intlayer.org/doc/concept/auto-fill) |
|
|
255
255
|
|  | **Інтеграція MCP Server**<br><br>Надає MCP (Model Context Protocol) сервер для автоматизації IDE, що дозволяє безперешкодне управління контентом та робочі процеси i18n безпосередньо в вашому середовищі розробки. <br><br> - [MCP Server](https://github.com/aymericzip/intlayer/blob/main/docs/docs/uk/mcp_server.md) |
|
|
256
256
|
|  | **Розширення VSCode**<br><br>Intlayer надає розширення VSCode для допомоги в управлінні контентом та перекладами, побудові ваших словників, перекладі контенту та багато іншого. <br><br> - [Розширення VSCode](https://intlayer.org/doc/vs-code-extension) |
|
|
257
|
-
|  | **Взаємосумісність**<br><br>Дозволяє взаємосумісність з react-i18next, next-i18next, next-intl та react-intl. <br><br> - [Intlayer та react-intl](https://intlayer.org/blog/intlayer-with-react-intl) <br> - [Intlayer та next-intl](https://intlayer.org/blog/intlayer-with-next-intl) <br> - [Intlayer та next-i18next](https://intlayer.org/blog/intlayer-with-next-i18next)
|
|
257
|
+
|  | **Взаємосумісність**<br><br>Дозволяє взаємосумісність з react-i18next, next-i18next, next-intl та react-intl. <br><br> - [Intlayer та react-intl](https://intlayer.org/blog/intlayer-with-react-intl) <br> - [Intlayer та next-intl](https://intlayer.org/blog/intlayer-with-next-intl) <br> - [Intlayer та next-i18next](https://intlayer.org/blog/intlayer-with-next-i18next) <br> - [Адаптери сумісності Intlayer](https://intlayer.org/doc/compatibility) |
|
|
258
258
|
| Тестування відсутніх перекладів (CLI/CI) | ✅ CLI: npx intlayer content test (дружній до CI аудит) |
|
|
259
259
|
|
|
260
260
|
## Порівняння Intlayer з іншими рішеннями
|
|
@@ -294,3 +294,5 @@ export const ComponentExample = () => {
|
|
|
294
294
|
`intlayer` також може допомогти в управлінні просторами назв `react-intl`, `react-i18next`, `next-intl`, `next-i18next` та `vue-i18n`.
|
|
295
295
|
|
|
296
296
|
За допомогою `intlayer` ви можете оголосити свій вміст у форматі вашої улюбленої бібліотеки i18n, і intlayer згенерує простори назв у вибраному вами місці (наприклад: `/messages/{{locale}}/{{namespace}}.json`).
|
|
297
|
+
|
|
298
|
+
Якщо ви хочете й надалі використовувати API вашої поточної бібліотеки i18n, `intlayer` також надає **адаптери сумісності (compat adapters)**: пакети, що надають точно такий самий API, як `react-i18next`, `next-intl`, `react-intl`, `vue-i18n` та інші, але з вмістом зі словників Intlayer. Це дозволяє мігрувати поступово, не переписуючи код. Див. [документацію адаптерів сумісності](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/compat/index.md).
|
|
@@ -409,7 +409,7 @@ export const getLocale = (event: RequestEvent): Locale => {
|
|
|
409
409
|
};
|
|
410
410
|
```
|
|
411
411
|
|
|
412
|
-
> `getLocaleFromStorage` перевірятиме локаль у заголовку або cookie залежно від вашої конфігурації. Див. розділ [Configuration](https://intlayer.org/doc/configuration) для детальнішої інформації.
|
|
412
|
+
> `getLocaleFromStorage` перевірятиме локаль у заголовку або cookie залежно від вашої конфігурації. Див. розділ [Configuration](https://intlayer.org/doc/concept/configuration) для детальнішої інформації.
|
|
413
413
|
|
|
414
414
|
> Функція `localeDetector` обробляє заголовок `Accept-Language` і повертає найкраще співпадіння.
|
|
415
415
|
|
|
@@ -253,19 +253,21 @@ import {
|
|
|
253
253
|
HeadContent,
|
|
254
254
|
Scripts,
|
|
255
255
|
createRootRouteWithContext,
|
|
256
|
+
getRouteApi,
|
|
256
257
|
} from "@tanstack/solid-router";
|
|
257
258
|
import { HydrationScript } from "solid-js/web";
|
|
258
259
|
import { Suspense, type ParentComponent } from "solid-js";
|
|
259
260
|
import { IntlayerProvider } from "solid-intlayer";
|
|
260
261
|
import { defaultLocale, getHTMLTextDir } from "intlayer";
|
|
261
|
-
|
|
262
|
+
|
|
263
|
+
const localeRoute = getRouteApi("/{-$locale}");
|
|
262
264
|
|
|
263
265
|
export const Route = createRootRouteWithContext()({
|
|
264
266
|
shellComponent: RootComponent,
|
|
265
267
|
});
|
|
266
268
|
|
|
267
269
|
const RootComponent: ParentComponent = (props) => {
|
|
268
|
-
const params =
|
|
270
|
+
const params = localeRoute.useParams();
|
|
269
271
|
const locale = params()?.locale ?? defaultLocale;
|
|
270
272
|
|
|
271
273
|
return (
|
|
@@ -550,7 +552,7 @@ export default LocaleSwitcher;
|
|
|
550
552
|
|
|
551
553
|
```tsx fileName="src/routes/__root.tsx"
|
|
552
554
|
const RootComponent: ParentComponent = (props) => {
|
|
553
|
-
const params =
|
|
555
|
+
const params = localeRoute.useParams();
|
|
554
556
|
const locale = params()?.locale ?? defaultLocale;
|
|
555
557
|
|
|
556
558
|
return (
|
|
@@ -270,13 +270,15 @@ export default config;
|
|
|
270
270
|
```tsx fileName="src/routes/__root.tsx"
|
|
271
271
|
import {
|
|
272
272
|
createRootRouteWithContext,
|
|
273
|
+
getRouteApi,
|
|
273
274
|
HeadContent,
|
|
274
275
|
Scripts,
|
|
275
276
|
} from "@tanstack/react-router";
|
|
276
277
|
import { defaultLocale, getHTMLTextDir } from "intlayer";
|
|
277
278
|
import { type ReactNode } from "react";
|
|
278
279
|
import { IntlayerProvider } from "react-intlayer";
|
|
279
|
-
|
|
280
|
+
|
|
281
|
+
const localeRoute = getRouteApi("/{-$locale}");
|
|
280
282
|
|
|
281
283
|
export const Route = createRootRouteWithContext<{}>()({
|
|
282
284
|
head: () => ({
|
|
@@ -298,7 +300,7 @@ export const Route = createRootRouteWithContext<{}>()({
|
|
|
298
300
|
});
|
|
299
301
|
|
|
300
302
|
function RootDocument({ children }: { children: ReactNode }) {
|
|
301
|
-
const params =
|
|
303
|
+
const params = localeRoute.useParams();
|
|
302
304
|
const locale = params?.locale ?? defaultLocale;
|
|
303
305
|
|
|
304
306
|
return (
|
|
@@ -631,7 +633,7 @@ export const LocaleSwitcher: FC = () => {
|
|
|
631
633
|
|
|
632
634
|
```tsx fileName="src/routes/__root.tsx"
|
|
633
635
|
function RootDocument({ children }: { children: ReactNode }) {
|
|
634
|
-
const params =
|
|
636
|
+
const params = localeRoute.useParams();
|
|
635
637
|
const locale = params?.locale ?? defaultLocale;
|
|
636
638
|
|
|
637
639
|
return (
|