@intlayer/docs 9.0.0-canary.2 → 9.0.0-canary.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.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  createdAt: 2025-03-13
3
- updatedAt: 2025-12-13
3
+ updatedAt: 2026-06-21
4
4
  title: JSON Senkronizasyon Eklentisi
5
5
  description: Intlayer sözlüklerini üçüncü taraf i18n JSON dosyalarıyla (i18next, next-intl, react-intl, vue-i18n ve daha fazlası) senkronize edin. Mevcut i18n yapınızı koruyarak Intlayer ile mesajlarınızı yönetin, çevirin ve test edin.
6
6
  keywords:
@@ -24,6 +24,9 @@ slugs:
24
24
  - sync-json
25
25
  youtubeVideo: https://www.youtube.com/watch?v=MpGMxniDHNg
26
26
  history:
27
+ - version: 9.0.0
28
+ date: 2026-06-21
29
+ changes: "next-intl / react-intl tek dosya düzenleri için splitKeys seçeneği eklendi (üst düzey ad alanı anahtarı başına bir sözlük)"
27
30
  - version: 7.5.0
28
31
  date: 2025-12-13
29
32
  changes: "ICU ve i18next format desteği eklendi"
@@ -62,7 +65,63 @@ pnpm add -D @intlayer/sync-json-plugin
62
65
  npm i -D @intlayer/sync-json-plugin
63
66
  ```
64
67
 
65
- ## Hızlı başlangıç
68
+ ## Plugins
69
+
70
+ Bu paket iki eklenti sağlar:
71
+
72
+ - `loadJSON`: JSON dosyalarını Intlayer sözlüklerine yükler.
73
+ - Bu eklenti, bir kaynaktan JSON dosyalarını yüklemek için kullanılır ve Intlayer sözlüklerine yüklenecektir. Tüm kod tabanını tarayabilir ve belirli JSON dosyalarını arayabilir.
74
+ Bu eklenti şu durumlarda kullanılabilir:
75
+ - JSON'larınızın belirli bir konumda yüklenmesini zorunlu kılan bir i18n kütüphanesi kullanıyorsanız (örn: `next-intl`, `i18next`, `react-intl`, `vue-i18n`, vb.), ancak içerik bildirimlerinizi kod tabanınızda istediğiniz yere yerleştirmek istiyorsanız.
76
+ - Mesajlarınızı uzak bir kaynaktan (örn: bir CMS, bir API, vb.) almak ve mesajlarınızı JSON dosyalarında saklamak istiyorsanız da kullanılabilir.
77
+
78
+ > Arka planda, bu eklenti tüm kod tabanını tarayacak ve belirli JSON dosyalarını arayacak ve bunları Intlayer sözlüklerine yükleyecektir.
79
+ > Bu eklentinin çıktıyı ve çevirileri JSON dosyalarına geri yazmayacağını unutmayın.
80
+
81
+ - `syncJSON`: JSON dosyalarını Intlayer sözlükleriyle senkronize eder.
82
+ - Bu eklenti, JSON dosyalarını Intlayer sözlükleriyle senkronize etmek için kullanılır. Verilen konumu tarayabilir ve belirli JSON dosyaları için desene uyan JSON'u yükleyebilir. Bu eklenti, başka bir i18n kütüphanesi kullanırken Intlayer'ın faydalarından yararlanmak istiyorsanız kullanışlıdır.
83
+
84
+ ## Her iki eklentiyi de kullanma
85
+
86
+ ```ts fileName="intlayer.config.ts"
87
+ import { Locales, type IntlayerConfig } from "intlayer";
88
+ import { loadJSON, syncJSON } from "@intlayer/sync-json-plugin";
89
+
90
+ const config: IntlayerConfig = {
91
+ internationalization: {
92
+ locales: [Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH],
93
+ defaultLocale: Locales.ENGLISH,
94
+ },
95
+
96
+ // Mevcut JSON dosyalarınızı Intlayer sözlükleriyle senkronize tutun
97
+ plugins: [
98
+ /**
99
+ * src dizinindeki {key}.i18n.json desenine uyan tüm JSON dosyalarını yükleyecektir
100
+ */
101
+ loadJSON({
102
+ source: ({ key }) => `./src/**/${key}.i18n.json`,
103
+ locale: Locales.ENGLISH,
104
+ priority: 1, // Bu JSON dosyalarının `./locales/en/${key}.json` adresindeki dosyalara göre öncelikli olmasını sağlar
105
+ format: "intlayer", // JSON içeriğinin formatı
106
+ }),
107
+ /**
108
+ * Çıktıyı ve çevirileri locales dizinindeki JSON dosyalarına yükleyecek ve yazacaktır
109
+ */
110
+ syncJSON({
111
+ format: "i18next",
112
+ source: ({ key, locale }) => `./locales/${locale}/${key}.json`,
113
+ priority: 0,
114
+ format: "i18next",
115
+ }),
116
+ ],
117
+ };
118
+
119
+ export default config;
120
+ ```
121
+
122
+ ## `syncJSON` plugin
123
+
124
+ ### Hızlı başlangıç
66
125
 
67
126
  Eklentiyi `intlayer.config.ts` dosyanıza ekleyin ve mevcut JSON yapınıza işaret edin.
68
127
 
@@ -81,6 +140,7 @@ const config: IntlayerConfig = {
81
140
  syncJSON({
82
141
  // Yerel başına, ad alanı başına düzen (örneğin, next-intl, ad alanları ile i18next)
83
142
  source: ({ key, locale }) => `./locales/${locale}/${key}.json`,
143
+ format: "icu",
84
144
  }),
85
145
  ],
86
146
  };
@@ -91,14 +151,27 @@ export default config;
91
151
  Alternatif: her yerel için tek dosya (i18next/react-intl yapılandırmalarında yaygın):
92
152
 
93
153
  ```ts fileName="intlayer.config.ts"
94
- plugins: [
95
- syncJSON({
96
- source: ({ locale }) => `./locales/${locale}.json`,
97
- }),
98
- ];
154
+ import { Locales, type IntlayerConfig } from "intlayer";
155
+ import { syncJSON } from "@intlayer/sync-json-plugin";
156
+
157
+ const config: IntlayerConfig = {
158
+ internationalization: {
159
+ locales: [Locales.ENGLISH, Locales.FRENCH],
160
+ defaultLocale: Locales.ENGLISH,
161
+ },
162
+ plugins: [
163
+ syncJSON({
164
+ format: "i18next",
165
+ source: ({ locale }) => `./locales/${locale}.json`,
166
+ format: "i18next",
167
+ }),
168
+ ],
169
+ };
170
+
171
+ export default config;
99
172
  ```
100
173
 
101
- ### Nasıl çalışır
174
+ #### Nasıl çalışır
102
175
 
103
176
  - Okuma: eklenti, `source` yapıcınızdan JSON dosyalarını keşfeder ve bunları Intlayer sözlükleri olarak yükler.
104
177
  - Yazma: derlemeler ve doldurmalar sonrası, yerelleştirilmiş JSON'u aynı yollara yazar (biçimlendirme sorunlarını önlemek için sonuna yeni satır ekleyerek).
@@ -112,6 +185,7 @@ syncJSON({
112
185
  location?: string, // isteğe bağlı etiket, varsayılan: "plugin"
113
186
  priority?: number, // isteğe bağlı öncelik, çakışma çözümü için, varsayılan: 0
114
187
  format?: 'intlayer' | 'icu' | 'i18next', // isteğe bağlı formatlayıcı, Intlayer runtime uyumluluğu için kullanılır
188
+ splitKeys?: boolean, // isteğe bağlı, tek bir dosyayı üst düzey anahtar başına bir sözlüğe böler (otomatik algılanır)
115
189
  });
116
190
  ```
117
191
 
@@ -136,18 +210,49 @@ syncJSON({
136
210
  }),
137
211
  ```
138
212
 
139
- ## Birden fazla JSON kaynağı ve öncelik
213
+ #### `splitKeys` (boolean)
214
+
215
+ **İlk düzey anahtarları ad alanları olan** tek bir JSON dosyasının, tüm dosyayı tutan tek bir sözlük yerine, üst düzey anahtar başına bir sözlük haline gelip gelmeyeceğini kontrol eder.
216
+
217
+ Bu, `next-intl` ve `react-intl` gibi kütüphanelerin ad alanı modeline uyar; burada bir `messages/{locale}.json` dosyası, ilk düzey anahtarlarıyla birden çok ad alanını gruplandırır ve her biri bağımsız olarak ele alınır (örneğin, `useTranslations('Hero')` `Hero` sözlüğüne çözümlenir).
218
+
219
+ - `undefined` (varsayılan): **otomatik algılanır** — `source` deseninde `{key}` segmenti yoksa dosya bölünür (bir dosya her ad alanını tutar), aksi takdirde tek bir sözlük olarak kalır (anahtar başına bir dosya).
220
+ - `true`: her üst düzey anahtarı her zaman kendi sözlüğüne böler.
221
+ - `false`: asla bölmez; tüm dosya tek bir sözlük haline gelir.
222
+
223
+ Tek bir `messages/{locale}.json` dosyası verildiğinde:
224
+
225
+ ```json fileName="messages/en.json"
226
+ {
227
+ "Hero": { "title": "Full-stack developer" },
228
+ "Nav": { "work": "Work", "about": "About" },
229
+ "About": { "lead": "I build apps end to end." }
230
+ }
231
+ ```
232
+
233
+ ```ts fileName="intlayer.config.ts"
234
+ syncJSON({
235
+ format: "icu",
236
+ source: ({ locale }) => `./messages/${locale}.json`,
237
+ // splitKeys: true, // desenin `{key}` segmenti olmadığı için ima edilir
238
+ }),
239
+ ```
240
+
241
+ Bu, üç sözlük (`Hero`, `Nav` ve `About`) üretir, böylece `useTranslations('Hero')` (next-intl) doğru şekilde çözümlenir. Geri yazma işleminde, tüm ad alanları aynı yerel başına dosyada yeniden birleştirilir.
242
+
243
+ > `source` içinde açık `{key}` segmentini koruduğunuzda (örneğin, `./locales/${locale}/${key}.json`), her dosya zaten bir ad alanıdır, bu nedenle bölme varsayılan olarak devre dışıdır.
244
+
245
+ ### Multiple JSON sources and priority
140
246
 
141
247
  Farklı JSON kaynaklarını senkronize etmek için birden fazla `syncJSON` eklentisi ekleyebilirsiniz. Bu, projenizde birden fazla i18n kütüphanesi veya farklı JSON yapıları olduğunda faydalıdır.
142
248
 
143
- ### Öncelik sistemi
249
+ #### Öncelik sistemi
144
250
 
145
251
  Birden fazla eklenti aynı sözlük anahtarını hedeflediğinde, `priority` parametresi hangi eklentinin öncelikli olduğunu belirler:
146
252
 
147
253
  - Daha yüksek öncelik numaraları, daha düşük olanlara karşı kazanır
148
-
149
254
  - `.content` dosyalarının varsayılan önceliği `0`'dır
150
- - Eklentilerin içerik dosyalarının varsayılan önceliği `-1`'dir
255
+ - Eklentilerin varsayılan önceliği `0`'dır
151
256
  - Aynı önceliğe sahip eklentiler, yapılandırmada göründükleri sırayla işlenir
152
257
 
153
258
  ```ts fileName="intlayer.config.ts"
@@ -190,73 +295,140 @@ const config: IntlayerConfig = {
190
295
  export default config;
191
296
  ```
192
297
 
193
- ### Çakışma çözümü
298
+ ## Load JSON plugin
194
299
 
195
- Aynı çeviri anahtarı birden fazla JSON kaynağında mevcutsa:
300
+ ### Hızlı başlangıç
196
301
 
197
- 1. En yüksek önceliğe sahip eklenti nihai değeri belirler
198
- 2. Daha düşük öncelikli kaynaklar, eksik anahtarlar için yedek olarak kullanılır
199
- 3. Bu, eski çevirileri korumanıza ve yeni yapılara kademeli olarak geçiş yapmanıza olanak tanır
302
+ Mevcut JSON dosyalarını Intlayer sözlükleri olarak almak için eklentiyi `intlayer.config.ts` dosyanıza ekleyin. Bu eklenti salt okunurdur (diske yazma yapmaz):
200
303
 
201
- ## Entegrasyonlar
304
+ ```ts fileName="intlayer.config.ts"
305
+ import { Locales, type IntlayerConfig } from "intlayer";
306
+ import { loadJSON } from "@intlayer/sync-json-plugin";
202
307
 
203
- Aşağıda yaygın eşlemeler bulunmaktadır. Çalışma zamanınızı değiştirmeyin; sadece eklentiyi ekleyin.
308
+ const config: IntlayerConfig = {
309
+ internationalization: {
310
+ locales: [Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH],
311
+ defaultLocale: Locales.ENGLISH,
312
+ },
204
313
 
205
- ### i18next
314
+ plugins: [
315
+ // Kaynak ağacınızın herhangi bir yerinde bulunan JSON mesajlarını alın
316
+ loadJSON({
317
+ source: ({ key }) => `./src/**/${key}.i18n.json`,
318
+ // Eklenti örneği başına tek bir yerel yükleyin (yapılandırma varsayılan yereline ayarlanır)
319
+ locale: Locales.ENGLISH,
320
+ priority: 0,
321
+ }),
322
+ ],
323
+ };
206
324
 
207
- Tipik dosya düzeni: `./public/locales/{locale}/{namespace}.json` veya `./locales/{locale}/{namespace}.json`.
325
+ export default config;
326
+ ```
327
+
328
+ Alternatif: yerel başına düzen, yine salt okunur (yalnızca seçilen yerel yüklenir):
208
329
 
209
330
  ```ts fileName="intlayer.config.ts"
210
- import { syncJSON } from "@intlayer/sync-json-plugin";
331
+ import { Locales, type IntlayerConfig } from "intlayer";
332
+ import { loadJSON } from "@intlayer/sync-json-plugin";
211
333
 
212
- export default {
334
+ const config: IntlayerConfig = {
335
+ internationalization: {
336
+ locales: [Locales.ENGLISH, Locales.FRENCH],
337
+ defaultLocale: Locales.ENGLISH,
338
+ },
213
339
  plugins: [
214
- syncJSON({
215
- format: "i18next",
340
+ loadJSON({
341
+ // Bu desenden yalnızca Locales.FRENCH için dosyalar yüklenecektir
216
342
  source: ({ key, locale }) => `./locales/${locale}/${key}.json`,
343
+ locale: Locales.FRENCH,
217
344
  }),
218
345
  ],
219
346
  };
347
+
348
+ export default config;
220
349
  ```
221
350
 
222
- ### next-intl
351
+ ### Nasıl çalışır
352
+
353
+ - Keşfet: `source` yapıcınızdan bir glob oluşturur ve eşleşen JSON dosyalarını toplar.
354
+ - Al: her JSON dosyasını sağlanan `locale` ile bir Intlayer sözlüğü olarak yükler.
355
+ - Salt okunur: çıktı dosyalarını yazmaz veya biçimlendirmez; gidiş-dönüş senkronizasyonuna ihtiyacınız varsa `syncJSON` kullanın.
356
+ - Otomatik doldurmaya hazır: `fill` deseni tanımlar, böylece `intlayer content fill` eksik anahtarları CLI aracılığıyla doldurabilir.
223
357
 
224
- Her yerel için JSON mesajları (genellikle `./messages/{locale}.json`) veya her ad alanı için.
358
+ ### API
225
359
 
226
- ```ts fileName="intlayer.config.ts"
227
- plugins: [
228
- syncJSON({
229
- source: ({ locale, key }) => `./messages/${locale}/${key}.json`,
230
- }),
231
- ];
360
+ ```ts
361
+ loadJSON({
362
+ // JSON'unuza giden yolları oluşturun. Yapınızda yerel segment yoksa `locale` isteğe bağlıdır
363
+ source: ({ key, locale }) => string,
364
+
365
+ // Bu eklenti örneği tarafından yüklenen sözlükler için hedef yerel
366
+ // configuration.internationalization.defaultLocale varsayılanına ayarlanır
367
+ locale?: Locale,
368
+
369
+ // Kaynağı tanımlamak için isteğe bağlı etiket
370
+ location?: string, // varsayılan: "plugin"
371
+
372
+ // Diğer kaynaklara karşı çakışma çözümü için kullanılan öncelik
373
+ priority?: number, // varsayılan: 0
374
+
375
+ // JSON içeriği için isteğe bağlı formatlayıcı
376
+ format?: 'intlayer' | 'icu' | 'i18next', // varsayılan: 'intlayer'
377
+
378
+ // Tek bir dosyayı üst düzey anahtar başına bir sözlüğe böler (otomatik algılanır)
379
+ splitKeys?: boolean,
380
+ });
232
381
  ```
233
382
 
234
- Ayrıca bakınız: `docs/tr/intlayer_with_next-intl.md`.
383
+ #### `format` ('intlayer' | 'icu' | 'i18next')
384
+
385
+ JSON dosyalarını yüklerken sözlük içeriği için kullanılacak formatlayıcıyı belirtir. Bu, çeşitli i18n kütüphaneleriyle uyumlu farklı mesaj formatlama sözdizimlerini kullanmanıza olanak tanır.
235
386
 
236
- ### react-intl
387
+ - `'intlayer'`: Varsayılan Intlayer formatlayıcısı (varsayılan).
388
+ - `'icu'`: ICU mesaj formatlamasını kullanır (react-intl, vue-i18n gibi kütüphanelerle uyumlu).
389
+ - `'i18next'`: i18next mesaj formatlamasını kullanır (i18next, next-i18next, Solid-i18next ile uyumlu).
237
390
 
238
- Her yerel için tek JSON yaygındır:
391
+ **Örnek:**
239
392
 
240
- ```ts fileName="intlayer.config.ts"
241
- plugins: [
242
- syncJSON({
243
- source: ({ locale }) => `./locales/${locale}.json`,
244
- }),
245
- ];
393
+ ```ts
394
+ loadJSON({
395
+ source: ({ key }) => `./src/**/${key}.i18n.json`,
396
+ locale: Locales.ENGLISH,
397
+ format: "icu", // Uyumluluk için ICU formatlaması kullan
398
+ }),
246
399
  ```
247
400
 
248
- ### vue-i18n
401
+ #### `splitKeys` (boolean)
249
402
 
250
- Her yerel için ya da her ad alanı için tek bir dosya olabilir:
403
+ [`syncJSON`](#splitkeys-boolean) ile aynı davranış: tek bir JSON dosyası, ilk düzey anahtarlarıyla birden çok ad alanını gruplandırdığında, her üst düzey anahtar kendi sözlüğü haline gelir.
251
404
 
252
- ```ts fileName="intlayer.config.ts"
253
- plugins: [
254
- syncJSON({
255
- source: ({ key, locale }) => `./src/locales/${locale}/${key}.json`,
256
- }),
257
- ];
405
+ - `undefined` (varsayılan): **otomatik algılanır** — `source` deseninde `{key}` segmenti yoksa bölünür, aksi takdirde tek bir sözlük olur.
406
+ - `true` / `false`: bölmeyi zorlar veya devre dışı bırakır.
407
+
408
+ ```ts
409
+ loadJSON({
410
+ source: ({ locale }) => `./messages/${locale}.json`,
411
+ format: "icu",
412
+ // splitKeys otomatik etkinleştirildi: `Hero`, `Nav`, `About`, … her biri bir sözlük haline gelir
413
+ }),
258
414
  ```
259
415
 
416
+ ### Behavior and conventions
417
+
418
+ - `source` maskeniz bir yerel yer tutucusu içeriyorsa, yalnızca seçilen `locale` için dosyalar alınır.
419
+ - Maskenizde `{key}` segmenti yoksa, dosyanın her üst düzey anahtarı varsayılan olarak kendi sözlüğü haline gelir (bkz. [`splitKeys`](#splitkeys-boolean)). Bunun yerine tüm dosyayı tek bir `index` sözlüğü olarak yüklemek için `splitKeys: false` olarak ayarlayın.
420
+ - Anahtarlar, `source` yapıcınızdaki `{key}` yer tutucusunun yerine geçirilerek dosya yollarından türetilir.
421
+ - Eklenti yalnızca keşfedilen dosyaları kullanır ve eksik yerelleri veya anahtarları uydurmaz.
422
+ - `fill` yolu, `source`'unuzdan çıkarılır ve CLI aracılığıyla eksik değerleri güncellemek için kullanılır.
423
+
424
+ ## Conflict resolution
425
+
426
+ Aynı çeviri anahtarı birden fazla JSON kaynağında mevcutsa:
427
+
428
+ 1. En yüksek önceliğe sahip eklenti nihai değeri belirler
429
+ 2. Daha düşük öncelikli kaynaklar, eksik anahtarlar için yedek olarak kullanılır
430
+ 3. Bu, eski çevirileri korumanıza ve yeni yapılara kademeli olarak geçiş yapmanıza olanak tanır
431
+
260
432
  ## CLI
261
433
 
262
434
  Eşzamanlanmış JSON dosyaları diğer `.content` dosyaları gibi kabul edilecektir. Bu, tüm intlayer komutlarının eşzamanlanmış JSON dosyaları için de kullanılabilir olduğu anlamına gelir. Şunları içerir:
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  createdAt: 2025-03-13
3
- updatedAt: 2025-12-13
3
+ updatedAt: 2026-06-21
4
4
  title: Плагін Sync JSON
5
5
  description: Синхронізуйте словники Intlayer із зовнішніми i18n JSON-файлами (i18next, next-intl, react-intl, vue-i18n та ін.). Залишайте ваш існуючий i18n-стек і використовуйте Intlayer для керування, перекладу та тестування повідомлень.
6
6
  keywords:
@@ -24,6 +24,9 @@ slugs:
24
24
  - sync-json
25
25
  youtubeVideo: https://www.youtube.com/watch?v=MpGMxniDHNg
26
26
  history:
27
+ - version: 9.0.0
28
+ date: 2026-06-21
29
+ changes: "Додано опцію splitKeys (один словник на ключ простору імен верхнього рівня) для макетів next-intl / react-intl з одним файлом"
27
30
  - version: 7.5.0
28
31
  date: 2025-12-13
29
32
  changes: "Додано підтримку форматів ICU та i18next"
@@ -182,6 +185,7 @@ syncJSON({
182
185
  location?: string, // необов'язковий ярлик, за замовчуванням: "plugin"
183
186
  priority?: number, // необов'язковий пріоритет для вирішення конфліктів, за замовчуванням: 0
184
187
  format?: 'intlayer' | 'icu' | 'i18next', // необов'язковий форматтер, використовується для сумісності з intlayer runtime
188
+ splitKeys?: boolean, // необов'язково, розділяє один файл на один словник для кожного ключа простору імен верхнього рівня (автоматично визначається)
185
189
  });
186
190
  ```
187
191
 
@@ -205,6 +209,38 @@ syncJSON({
205
209
  }),
206
210
  ```
207
211
 
212
+ #### `splitKeys` (boolean)
213
+
214
+ Контролює, чи повинен один JSON-файл, **ключі першого рівня якого є просторами імен**, стати одним словником на ключ верхнього рівня, замість одного словника, що містить весь файл.
215
+
216
+ Це відповідає моделі просторів імен таких бібліотек, як `next-intl` та `react-intl`, де один файл `messages/{locale}.json` групує кілька просторів імен за ключами першого рівня, кожен з яких адресується незалежно (наприклад, `useTranslations('Hero')` розв'язується до словника `Hero`).
217
+
218
+ - `undefined` (за замовчуванням): **автоматично визначається** — файл розділяється, коли шаблон `source` не має сегмента `{key}` (один файл містить кожен простір імен), і залишається як єдиний словник в іншому випадку (один файл на ключ).
219
+ - `true`: завжди розділяти кожен ключ верхнього рівня на окремий словник.
220
+ - `false`: ніколи не розділяти; весь файл стає єдиним словником.
221
+
222
+ Дано один файл `messages/{locale}.json`:
223
+
224
+ ```json fileName="messages/en.json"
225
+ {
226
+ "Hero": { "title": "Full-stack developer" },
227
+ "Nav": { "work": "Work", "about": "About" },
228
+ "About": { "lead": "I build apps end to end." }
229
+ }
230
+ ```
231
+
232
+ ```ts fileName="intlayer.config.ts"
233
+ syncJSON({
234
+ format: "icu",
235
+ source: ({ locale }) => `./messages/${locale}.json`,
236
+ // splitKeys: true, // мається на увазі, оскільки шаблон не має сегмента `{key}`
237
+ }),
238
+ ```
239
+
240
+ Це створює три словники — `Hero`, `Nav` та `About` — тому `useTranslations('Hero')` (next-intl) розв'язується коректно. При зворотному записі всі простори імен знову збираються в той самий файл для кожної локалі.
241
+
242
+ > Коли ви зберігаєте явний сегмент `{key}` у вашому `source` (наприклад, `./locales/${locale}/${key}.json`), кожен файл вже є одним простором імен, тому розділення за замовчуванням вимкнено.
243
+
208
244
  ### Кілька джерел JSON та пріоритет
209
245
 
210
246
  Ви можете додавати кілька плагінів `syncJSON` для синхронізації різних джерел JSON. Це корисно, коли у вашому проєкті використовується декілька i18n бібліотек або різні структури JSON.
@@ -337,6 +373,9 @@ loadJSON({
337
373
 
338
374
  // Необов'язковий форматувач для JSON-вмісту
339
375
  format?: 'intlayer' | 'icu' | 'i18next', // за замовчуванням: 'intlayer'
376
+
377
+ // Розділяє один файл на один словник для кожного ключа верхнього рівня (автоматично визначається)
378
+ splitKeys?: boolean,
340
379
  });
341
380
  ```
342
381
 
@@ -358,10 +397,25 @@ loadJSON({
358
397
  }),
359
398
  ```
360
399
 
400
+ #### `splitKeys` (boolean)
401
+
402
+ Така ж поведінка, як і в [`syncJSON`](#splitkeys-boolean): коли один JSON-файл групує кілька просторів імен за ключами першого рівня, кожен ключ верхнього рівня стає окремим словником.
403
+
404
+ - `undefined` (за замовчуванням): **автоматично визначається** — розділяється, коли шаблон `source` не має сегмента `{key}`, інакше — єдиний словник.
405
+ - `true` / `false`: примусово ввімкнути або вимкнути розділення.
406
+
407
+ ```ts
408
+ loadJSON({
409
+ source: ({ locale }) => `./messages/${locale}.json`,
410
+ format: "icu",
411
+ // splitKeys auto-enabled: `Hero`, `Nav`, `About`, … each become a dictionary
412
+ }),
413
+ ```
414
+
361
415
  ### Поведінка та конвенції
362
416
 
363
417
  - Якщо ваша маска `source` містить плейсхолдер локалі, імпортуються лише файли для обраної `locale`.
364
- - Якщо в масці немає сегмента `{key}`, ключ словника, "index".
418
+ - Якщо в масці немає сегмента `{key}`, кожен ключ верхнього рівня файлу за замовчуванням стає окремим словником (див. [`splitKeys`](#splitkeys-boolean)). Встановіть `splitKeys: false`, щоб замість цього завантажити весь файл як єдиний словник `index`.
365
419
  - Ключі виводяться зі шляхів файлів шляхом підстановки плейсхолдера `{key}` у вашому source builder.
366
420
  - Плагін використовує лише виявлені файли і не створює відсутні локалі чи ключі.
367
421
  - Шлях `fill` виводиться з вашого `source` і використовується для оновлення відсутніх значень через CLI, якщо ви погодитесь.