@intlayer/docs 7.5.12 → 7.5.14

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 (229) hide show
  1. package/blog/ar/per-component_vs_centralized_i18n.md +248 -0
  2. package/blog/de/per-component_vs_centralized_i18n.md +248 -0
  3. package/blog/en/_per-component_vs_centralized_i18n.md +252 -0
  4. package/blog/en/per-component_vs_centralized_i18n.md +248 -0
  5. package/blog/en-GB/per-component_vs_centralized_i18n.md +247 -0
  6. package/blog/es/per-component_vs_centralized_i18n.md +245 -0
  7. package/blog/fr/per-component_vs_centralized_i18n.md +245 -0
  8. package/blog/hi/per-component_vs_centralized_i18n.md +249 -0
  9. package/blog/id/per-component_vs_centralized_i18n.md +248 -0
  10. package/blog/it/per-component_vs_centralized_i18n.md +247 -0
  11. package/blog/ja/per-component_vs_centralized_i18n.md +247 -0
  12. package/blog/ko/per-component_vs_centralized_i18n.md +246 -0
  13. package/blog/pl/per-component_vs_centralized_i18n.md +247 -0
  14. package/blog/pt/per-component_vs_centralized_i18n.md +246 -0
  15. package/blog/ru/per-component_vs_centralized_i18n.md +251 -0
  16. package/blog/tr/per-component_vs_centralized_i18n.md +244 -0
  17. package/blog/uk/compiler_vs_declarative_i18n.md +224 -0
  18. package/blog/uk/i18n_using_next-i18next.md +1086 -0
  19. package/blog/uk/i18n_using_next-intl.md +760 -0
  20. package/blog/uk/index.md +69 -0
  21. package/blog/uk/internationalization_and_SEO.md +273 -0
  22. package/blog/uk/intlayer_with_i18next.md +211 -0
  23. package/blog/uk/intlayer_with_next-i18next.md +202 -0
  24. package/blog/uk/intlayer_with_next-intl.md +203 -0
  25. package/blog/uk/intlayer_with_react-i18next.md +200 -0
  26. package/blog/uk/intlayer_with_react-intl.md +202 -0
  27. package/blog/uk/intlayer_with_vue-i18n.md +206 -0
  28. package/blog/uk/l10n_platform_alternative/Lokalise.md +80 -0
  29. package/blog/uk/l10n_platform_alternative/crowdin.md +80 -0
  30. package/blog/uk/l10n_platform_alternative/phrase.md +78 -0
  31. package/blog/uk/list_i18n_technologies/CMS/drupal.md +143 -0
  32. package/blog/uk/list_i18n_technologies/CMS/wix.md +167 -0
  33. package/blog/uk/list_i18n_technologies/CMS/wordpress.md +189 -0
  34. package/blog/uk/list_i18n_technologies/frameworks/angular.md +125 -0
  35. package/blog/uk/list_i18n_technologies/frameworks/flutter.md +128 -0
  36. package/blog/uk/list_i18n_technologies/frameworks/react-native.md +217 -0
  37. package/blog/uk/list_i18n_technologies/frameworks/react.md +155 -0
  38. package/blog/uk/list_i18n_technologies/frameworks/svelte.md +145 -0
  39. package/blog/uk/list_i18n_technologies/frameworks/vue.md +144 -0
  40. package/blog/uk/next-i18next_vs_next-intl_vs_intlayer.md +1499 -0
  41. package/blog/uk/nextjs-multilingual-seo-comparison.md +360 -0
  42. package/blog/uk/per-component_vs_centralized_i18n.md +248 -0
  43. package/blog/uk/rag_powered_documentation_assistant.md +288 -0
  44. package/blog/uk/react-i18next_vs_react-intl_vs_intlayer.md +164 -0
  45. package/blog/uk/vue-i18n_vs_intlayer.md +279 -0
  46. package/blog/uk/what_is_internationalization.md +167 -0
  47. package/blog/vi/per-component_vs_centralized_i18n.md +246 -0
  48. package/blog/zh/per-component_vs_centralized_i18n.md +248 -0
  49. package/dist/cjs/common.cjs.map +1 -1
  50. package/dist/cjs/generated/blog.entry.cjs +20 -0
  51. package/dist/cjs/generated/blog.entry.cjs.map +1 -1
  52. package/dist/cjs/generated/docs.entry.cjs.map +1 -1
  53. package/dist/cjs/generated/frequentQuestions.entry.cjs +20 -0
  54. package/dist/cjs/generated/frequentQuestions.entry.cjs.map +1 -1
  55. package/dist/cjs/generated/legal.entry.cjs.map +1 -1
  56. package/dist/esm/common.mjs.map +1 -1
  57. package/dist/esm/generated/blog.entry.mjs +20 -0
  58. package/dist/esm/generated/blog.entry.mjs.map +1 -1
  59. package/dist/esm/generated/docs.entry.mjs.map +1 -1
  60. package/dist/esm/generated/frequentQuestions.entry.mjs +20 -0
  61. package/dist/esm/generated/frequentQuestions.entry.mjs.map +1 -1
  62. package/dist/esm/generated/legal.entry.mjs.map +1 -1
  63. package/dist/types/generated/blog.entry.d.ts +1 -0
  64. package/dist/types/generated/blog.entry.d.ts.map +1 -1
  65. package/dist/types/generated/frequentQuestions.entry.d.ts +1 -0
  66. package/dist/types/generated/frequentQuestions.entry.d.ts.map +1 -1
  67. package/docs/ar/configuration.md +6 -1
  68. package/docs/ar/dictionary/content_file.md +6 -1
  69. package/docs/de/configuration.md +6 -1
  70. package/docs/de/dictionary/content_file.md +6 -1
  71. package/docs/en/configuration.md +6 -1
  72. package/docs/en/dictionary/content_file.md +6 -1
  73. package/docs/en-GB/configuration.md +6 -1
  74. package/docs/en-GB/dictionary/content_file.md +3 -1
  75. package/docs/es/configuration.md +6 -1
  76. package/docs/es/dictionary/content_file.md +6 -1
  77. package/docs/fr/configuration.md +6 -1
  78. package/docs/fr/dictionary/content_file.md +3 -1
  79. package/docs/hi/configuration.md +6 -1
  80. package/docs/hi/dictionary/content_file.md +3 -1
  81. package/docs/id/configuration.md +6 -1
  82. package/docs/id/dictionary/content_file.md +3 -1
  83. package/docs/it/configuration.md +6 -1
  84. package/docs/it/dictionary/content_file.md +3 -1
  85. package/docs/ja/configuration.md +6 -1
  86. package/docs/ja/dictionary/content_file.md +3 -1
  87. package/docs/ko/configuration.md +6 -1
  88. package/docs/ko/dictionary/content_file.md +3 -1
  89. package/docs/pl/configuration.md +3 -1
  90. package/docs/pl/dictionary/content_file.md +3 -1
  91. package/docs/pt/configuration.md +6 -1
  92. package/docs/pt/dictionary/content_file.md +3 -1
  93. package/docs/ru/configuration.md +6 -1
  94. package/docs/ru/dictionary/content_file.md +6 -1
  95. package/docs/tr/configuration.md +6 -1
  96. package/docs/tr/dictionary/content_file.md +3 -1
  97. package/docs/uk/CI_CD.md +198 -0
  98. package/docs/uk/autoFill.md +307 -0
  99. package/docs/uk/bundle_optimization.md +185 -0
  100. package/docs/uk/cli/build.md +64 -0
  101. package/docs/uk/cli/ci.md +137 -0
  102. package/docs/uk/cli/configuration.md +63 -0
  103. package/docs/uk/cli/debug.md +46 -0
  104. package/docs/uk/cli/doc-review.md +43 -0
  105. package/docs/uk/cli/doc-translate.md +132 -0
  106. package/docs/uk/cli/editor.md +28 -0
  107. package/docs/uk/cli/fill.md +130 -0
  108. package/docs/uk/cli/index.md +190 -0
  109. package/docs/uk/cli/init.md +84 -0
  110. package/docs/uk/cli/list.md +90 -0
  111. package/docs/uk/cli/list_projects.md +128 -0
  112. package/docs/uk/cli/live.md +41 -0
  113. package/docs/uk/cli/login.md +157 -0
  114. package/docs/uk/cli/pull.md +78 -0
  115. package/docs/uk/cli/push.md +98 -0
  116. package/docs/uk/cli/sdk.md +71 -0
  117. package/docs/uk/cli/test.md +76 -0
  118. package/docs/uk/cli/transform.md +65 -0
  119. package/docs/uk/cli/version.md +24 -0
  120. package/docs/uk/cli/watch.md +37 -0
  121. package/docs/uk/configuration.md +742 -0
  122. package/docs/uk/dictionary/condition.md +237 -0
  123. package/docs/uk/dictionary/content_file.md +1134 -0
  124. package/docs/uk/dictionary/enumeration.md +245 -0
  125. package/docs/uk/dictionary/file.md +232 -0
  126. package/docs/uk/dictionary/function_fetching.md +212 -0
  127. package/docs/uk/dictionary/gender.md +273 -0
  128. package/docs/uk/dictionary/insertion.md +187 -0
  129. package/docs/uk/dictionary/markdown.md +383 -0
  130. package/docs/uk/dictionary/nesting.md +273 -0
  131. package/docs/uk/dictionary/translation.md +332 -0
  132. package/docs/uk/formatters.md +595 -0
  133. package/docs/uk/how_works_intlayer.md +256 -0
  134. package/docs/uk/index.md +175 -0
  135. package/docs/uk/interest_of_intlayer.md +297 -0
  136. package/docs/uk/intlayer_CMS.md +569 -0
  137. package/docs/uk/intlayer_visual_editor.md +292 -0
  138. package/docs/uk/intlayer_with_angular.md +710 -0
  139. package/docs/uk/intlayer_with_astro.md +256 -0
  140. package/docs/uk/intlayer_with_create_react_app.md +1258 -0
  141. package/docs/uk/intlayer_with_express.md +429 -0
  142. package/docs/uk/intlayer_with_fastify.md +446 -0
  143. package/docs/uk/intlayer_with_lynx+react.md +548 -0
  144. package/docs/uk/intlayer_with_nestjs.md +283 -0
  145. package/docs/uk/intlayer_with_next-i18next.md +640 -0
  146. package/docs/uk/intlayer_with_next-intl.md +456 -0
  147. package/docs/uk/intlayer_with_nextjs_page_router.md +1541 -0
  148. package/docs/uk/intlayer_with_nuxt.md +711 -0
  149. package/docs/uk/intlayer_with_react_router_v7.md +600 -0
  150. package/docs/uk/intlayer_with_react_router_v7_fs_routes.md +669 -0
  151. package/docs/uk/intlayer_with_svelte_kit.md +579 -0
  152. package/docs/uk/intlayer_with_tanstack.md +818 -0
  153. package/docs/uk/intlayer_with_vite+preact.md +1748 -0
  154. package/docs/uk/intlayer_with_vite+react.md +1449 -0
  155. package/docs/uk/intlayer_with_vite+solid.md +302 -0
  156. package/docs/uk/intlayer_with_vite+svelte.md +520 -0
  157. package/docs/uk/intlayer_with_vite+vue.md +1113 -0
  158. package/docs/uk/introduction.md +222 -0
  159. package/docs/uk/locale_mapper.md +242 -0
  160. package/docs/uk/mcp_server.md +211 -0
  161. package/docs/uk/packages/express-intlayer/t.md +465 -0
  162. package/docs/uk/packages/intlayer/getEnumeration.md +159 -0
  163. package/docs/uk/packages/intlayer/getHTMLTextDir.md +121 -0
  164. package/docs/uk/packages/intlayer/getLocaleLang.md +81 -0
  165. package/docs/uk/packages/intlayer/getLocaleName.md +135 -0
  166. package/docs/uk/packages/intlayer/getLocalizedUrl.md +338 -0
  167. package/docs/uk/packages/intlayer/getMultilingualUrls.md +359 -0
  168. package/docs/uk/packages/intlayer/getPathWithoutLocale.md +75 -0
  169. package/docs/uk/packages/intlayer/getPrefix.md +213 -0
  170. package/docs/uk/packages/intlayer/getTranslation.md +190 -0
  171. package/docs/uk/packages/intlayer/getTranslationContent.md +189 -0
  172. package/docs/uk/packages/next-intlayer/t.md +365 -0
  173. package/docs/uk/packages/next-intlayer/useDictionary.md +276 -0
  174. package/docs/uk/packages/next-intlayer/useIntlayer.md +263 -0
  175. package/docs/uk/packages/next-intlayer/useLocale.md +166 -0
  176. package/docs/uk/packages/react-intlayer/t.md +311 -0
  177. package/docs/uk/packages/react-intlayer/useDictionary.md +295 -0
  178. package/docs/uk/packages/react-intlayer/useI18n.md +250 -0
  179. package/docs/uk/packages/react-intlayer/useIntlayer.md +251 -0
  180. package/docs/uk/packages/react-intlayer/useLocale.md +210 -0
  181. package/docs/uk/per_locale_file.md +345 -0
  182. package/docs/uk/plugins/sync-json.md +398 -0
  183. package/docs/uk/readme.md +265 -0
  184. package/docs/uk/releases/v6.md +305 -0
  185. package/docs/uk/releases/v7.md +624 -0
  186. package/docs/uk/roadmap.md +346 -0
  187. package/docs/uk/testing.md +204 -0
  188. package/docs/vi/configuration.md +6 -1
  189. package/docs/vi/dictionary/content_file.md +6 -1
  190. package/docs/zh/configuration.md +6 -1
  191. package/docs/zh/dictionary/content_file.md +6 -1
  192. package/frequent_questions/ar/error-vite-env-only.md +77 -0
  193. package/frequent_questions/de/error-vite-env-only.md +77 -0
  194. package/frequent_questions/en/error-vite-env-only.md +77 -0
  195. package/frequent_questions/en-GB/error-vite-env-only.md +77 -0
  196. package/frequent_questions/es/error-vite-env-only.md +76 -0
  197. package/frequent_questions/fr/error-vite-env-only.md +77 -0
  198. package/frequent_questions/hi/error-vite-env-only.md +77 -0
  199. package/frequent_questions/id/error-vite-env-only.md +77 -0
  200. package/frequent_questions/it/error-vite-env-only.md +77 -0
  201. package/frequent_questions/ja/error-vite-env-only.md +77 -0
  202. package/frequent_questions/ko/error-vite-env-only.md +77 -0
  203. package/frequent_questions/pl/error-vite-env-only.md +77 -0
  204. package/frequent_questions/pt/error-vite-env-only.md +77 -0
  205. package/frequent_questions/ru/error-vite-env-only.md +77 -0
  206. package/frequent_questions/tr/error-vite-env-only.md +77 -0
  207. package/frequent_questions/uk/SSR_Next_no_[locale].md +104 -0
  208. package/frequent_questions/uk/array_as_content_declaration.md +72 -0
  209. package/frequent_questions/uk/build_dictionaries.md +58 -0
  210. package/frequent_questions/uk/build_error_CI_CD.md +74 -0
  211. package/frequent_questions/uk/bun_set_up.md +53 -0
  212. package/frequent_questions/uk/customized_locale_list.md +64 -0
  213. package/frequent_questions/uk/domain_routing.md +113 -0
  214. package/frequent_questions/uk/error-vite-env-only.md +77 -0
  215. package/frequent_questions/uk/esbuild_error.md +29 -0
  216. package/frequent_questions/uk/get_locale_cookie.md +142 -0
  217. package/frequent_questions/uk/intlayer_command_undefined.md +155 -0
  218. package/frequent_questions/uk/locale_incorect_in_url.md +73 -0
  219. package/frequent_questions/uk/package_version_error.md +181 -0
  220. package/frequent_questions/uk/static_rendering.md +44 -0
  221. package/frequent_questions/uk/translated_path_url.md +55 -0
  222. package/frequent_questions/uk/unknown_command.md +97 -0
  223. package/frequent_questions/vi/error-vite-env-only.md +77 -0
  224. package/frequent_questions/zh/error-vite-env-only.md +77 -0
  225. package/legal/uk/privacy_notice.md +83 -0
  226. package/legal/uk/terms_of_service.md +55 -0
  227. package/package.json +9 -9
  228. package/src/generated/blog.entry.ts +20 -0
  229. package/src/generated/frequentQuestions.entry.ts +20 -0
@@ -0,0 +1,398 @@
1
+ ---
2
+ createdAt: 2025-03-13
3
+ updatedAt: 2025-12-13
4
+ title: Плагін Sync JSON
5
+ description: Синхронізуйте словники Intlayer із зовнішніми i18n JSON-файлами (i18next, next-intl, react-intl, vue-i18n та ін.). Залишайте ваш існуючий i18n-стек і використовуйте Intlayer для керування, перекладу та тестування повідомлень.
6
+ keywords:
7
+ - Intlayer
8
+ - Sync JSON
9
+ - i18next
10
+ - next-intl
11
+ - react-intl
12
+ - vue-i18n
13
+ - next-translate
14
+ - nuxt-i18n
15
+ - LinguiJS
16
+ - Polyglot.js
17
+ - Solid-i18next
18
+ - svelte-i18n
19
+ - i18n
20
+ - переклади
21
+ slugs:
22
+ - doc
23
+ - plugin
24
+ - sync-json
25
+ youtubeVideo: https://www.youtube.com/watch?v=MpGMxniDHNg
26
+ history:
27
+ - version: 7.5.0
28
+ date: 2025-12-13
29
+ changes: Додано підтримку форматів ICU та i18next
30
+ - version: 6.1.6
31
+ date: 2025-10-05
32
+ changes: Початкова документація плагіна Sync JSON
33
+ ---
34
+
35
+ # Sync JSON (містки i18n) - Синхронізація JSON з підтримкою ICU / i18next
36
+
37
+ <iframe title="Як синхронізувати ваші JSON-переклади з Intlayer" class="m-auto aspect-16/9 w-full overflow-hidden rounded-lg border-0" allow="autoplay; gyroscope;" loading="lazy" width="1080" height="auto" src="https://www.youtube.com/embed/MpGMxniDHNg?autoplay=0&amp;origin=http://intlayer.org&amp;controls=0&amp;rel=1"/>
38
+
39
+ Використовуйте Intlayer як додаток до вашого існуючого стеку i18n. Цей плагін синхронізує ваші JSON-повідомлення зі словниками Intlayer, тож ви можете:
40
+
41
+ - Продовжувати використовувати i18next, next‑intl, react‑intl, vue‑i18n, next‑translate, nuxt‑i18n, Solid‑i18next, svelte‑i18n тощо.
42
+ - Керувати та перекладати ваші повідомлення за допомогою Intlayer (CLI, CI, providers, CMS), без рефакторингу додатка.
43
+ - Публікуйте навчальні матеріали та SEO‑контент, орієнтований на кожну екосистему, пропонуючи Intlayer як шар управління JSON.
44
+
45
+ Зауваги та поточна область охоплення:
46
+
47
+ - Екстерналізація в CMS працює для перекладів та звичайного тексту.
48
+ - Поки що немає підтримки вставок, форм множини/ICU або розширених runtime‑функцій інших бібліотек.
49
+ - Візуальний редактор поки що не підтримується для виходів сторонніх i18n‑бібліотек.
50
+
51
+ ### Коли використовувати цей плагін
52
+
53
+ - Ви вже використовуєте i18n‑бібліотеку та зберігаєте повідомлення в JSON‑файлах.
54
+ - Ви хочете AI‑допомогу при заповненні, тестування в CI та операції з контентом без зміни runtime для рендерингу.
55
+
56
+ ## Встановлення
57
+
58
+ ```bash
59
+ pnpm add -D @intlayer/sync-json-plugin
60
+ # or
61
+ npm i -D @intlayer/sync-json-plugin
62
+ ```
63
+
64
+ ## Плагіни
65
+
66
+ Цей пакет надає два плагіни:
67
+
68
+ - `loadJSON`: Завантажувати JSON‑файли в словники Intlayer.
69
+ - Цей плагін використовується для завантаження JSON-файлів з джерела і поміщає їх у словники Intlayer. Він може просканувати весь codebase і знайти конкретні JSON-файли.
70
+ Цей плагін можна використовувати
71
+ - якщо ви використовуєте i18n-бібліотеку, яка вимагає певного розташування для завантаження ваших JSON (наприклад: `next-intl`, `i18next`, `react-intl`, `vue-i18n` тощо), але ви хочете розміщувати декларації контенту там, де вам зручно у вашому codebase.
72
+ - Також його можна використовувати, якщо ви хочете отримувати повідомлення з віддаленого джерела (наприклад: CMS, API тощо) і зберігати ці повідомлення в JSON-файлах.
73
+
74
+ > Під капотом цей плагін просканує весь codebase, знайде конкретні JSON-файли і завантажить їх у словники Intlayer.
75
+ > Зауважте, цей плагін не записує результат і переклади назад у JSON-файли.
76
+
77
+ - `syncJSON`: Синхронізує JSON-файли зі словниками Intlayer.
78
+ - Цей плагін використовується для синхронізації JSON-файлів зі словниками Intlayer. Він може просканувати вказане розташування та завантажити JSON-файли, що відповідають заданому шаблону. Цей плагін корисний, якщо ви хочете отримати переваги Intlayer, використовуючи іншу i18n-бібліотеку.
79
+
80
+ ## Використання обох плагінів
81
+
82
+ ```ts fileName="intlayer.config.ts"
83
+ import { Locales, type IntlayerConfig } from "intlayer";
84
+ import { loadJSON, syncJSON } from "@intlayer/sync-json-plugin";
85
+
86
+ const config: IntlayerConfig = {
87
+ internationalization: {
88
+ locales: [Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH],
89
+ defaultLocale: Locales.ENGLISH,
90
+ },
91
+
92
+ // Тримайте ваші поточні JSON-файли синхронізованими зі словниками Intlayer
93
+ plugins: [
94
+ /**
95
+ * Завантажить усі JSON-файли у src, що відповідають шаблону {key}.i18n.json
96
+ */
97
+ loadJSON({
98
+ source: ({ key }) => `./src/**/${key}.i18n.json`,
99
+ locale: Locales.ENGLISH,
100
+ priority: 1, // Ensures these JSON files take precedence over files at `./locales/en/${key}.json`
101
+ format: "intlayer", // Format of the JSON content
102
+ }),
103
+ /**
104
+ * Завантажить та запише результати й переклади назад у JSON-файли в директорії locales
105
+ */
106
+ syncJSON({
107
+ format: "i18next",
108
+ source: ({ key, locale }) => `./locales/${locale}/${key}.json`,
109
+ priority: 0,
110
+ format: "i18next",
111
+ }),
112
+ ],
113
+ };
114
+
115
+ export default config;
116
+ ```
117
+
118
+ ## Плагін `syncJSON`
119
+
120
+ ### Швидкий старт
121
+
122
+ Додайте плагін до вашого `intlayer.config.ts` і вкажіть шлях до наявної структури JSON.
123
+
124
+ ```ts fileName="intlayer.config.ts"
125
+ import { Locales, type IntlayerConfig } from "intlayer";
126
+ import { syncJSON } from "@intlayer/sync-json-plugin";
127
+
128
+ const config: IntlayerConfig = {
129
+ internationalization: {
130
+ locales: [Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH],
131
+ defaultLocale: Locales.ENGLISH,
132
+ },
133
+
134
+ // Підтримуйте поточні JSON-файли синхронізованими зі словниками Intlayer
135
+ plugins: [
136
+ syncJSON({
137
+ // Розміщення по локалі та namespace (наприклад, next-intl, i18next з namespaces)
138
+ source: ({ key, locale }) => `./locales/${locale}/${key}.json`,
139
+ format: "icu",
140
+ }),
141
+ ],
142
+ };
143
+
144
+ export default config;
145
+ ```
146
+
147
+ Альтернатива: один файл на мову (поширено для налаштувань i18next/react-intl):
148
+
149
+ ```ts fileName="intlayer.config.ts"
150
+ import { Locales, type IntlayerConfig } from "intlayer";
151
+ import { syncJSON } from "@intlayer/sync-json-plugin";
152
+
153
+ const config: IntlayerConfig = {
154
+ internationalization: {
155
+ locales: [Locales.ENGLISH, Locales.FRENCH],
156
+ defaultLocale: Locales.ENGLISH,
157
+ },
158
+ plugins: [
159
+ syncJSON({
160
+ format: "i18next",
161
+ source: ({ locale }) => `./locales/${locale}.json`,
162
+ format: "i18next",
163
+ }),
164
+ ],
165
+ };
166
+
167
+ export default config;
168
+ ```
169
+
170
+ #### Як це працює
171
+
172
+ - Зчитування: плагін знаходить JSON-файли через ваш builder `source` і завантажує їх як словники Intlayer.
173
+ - Запис: після збірок і заповнення, він записує локалізований JSON назад за тими самими шляхами (з кінцевим символом нового рядка, щоб уникнути проблем з форматуванням).
174
+ - Автозаповнення: плагін оголошує шлях `autoFill` для кожного словника. Запуск `intlayer fill` за замовчуванням оновлює лише відсутні переклади у ваших JSON-файлах.
175
+
176
+ API:
177
+
178
+ ```ts
179
+ syncJSON({
180
+ source: ({ key, locale }) => string, // обов'язково
181
+ location?: string, // необов'язковий ярлик, за замовчуванням: "plugin"
182
+ priority?: number, // необов'язковий пріоритет для вирішення конфліктів, за замовчуванням: 0
183
+ format?: 'intlayer' | 'icu' | 'i18next', // необов'язковий форматтер, використовується для сумісності з intlayer runtime
184
+ });
185
+ ```
186
+
187
+ #### `format` ('intlayer' | 'icu' | 'i18next')
188
+
189
+ Визначає форматер, який буде використовуватися для вмісту словника під час синхронізації JSON-файлів. Це дозволяє використовувати різні синтакси форматування повідомлень, сумісні з Intlayer runtime.
190
+
191
+ - `undefined`: Форматер не використовуватиметься, JSON-контент буде використовуватися як є.
192
+ - `'intlayer'`: Форматер Intlayer за замовчуванням.
193
+ - `'icu'`: Використовує форматування повідомлень ICU (сумісне з бібліотеками на кшталт react-intl, vue-i18n).
194
+ - `'i18next'`: Використовує форматування повідомлень i18next (сумісне з i18next, next-i18next, Solid-i18next).
195
+
196
+ > Зверніть увагу, що використання форматера перетворює ваш JSON-контент на вході та на виході. Для складних правил JSON, наприклад ICU plurals, парсинг може не забезпечити відповідності 1:1 між вхідними та вихідними даними. Якщо ви не використовуєте Intlayer runtime, можливо, краще не встановлювати форматер.
197
+
198
+ **Приклад:**
199
+
200
+ ```ts
201
+ syncJSON({
202
+ source: ({ key, locale }) => `./locales/${locale}/${key}.json`,
203
+ format: "i18next", // Використовувати форматування i18next для сумісності
204
+ }),
205
+ ```
206
+
207
+ ### Кілька джерел JSON та пріоритет
208
+
209
+ Ви можете додавати кілька плагінів `syncJSON` для синхронізації різних джерел JSON. Це корисно, коли у вашому проєкті використовується декілька i18n бібліотек або різні структури JSON.
210
+
211
+ #### Система пріоритетів
212
+
213
+ Коли декілька плагінів орієнтуються на той самий ключ словника, параметр `priority` визначає, який плагін матиме перевагу:
214
+
215
+ - Вищі значення пріоритету мають перевагу над нижчими
216
+ - Пріоритет за замовчуванням для файлів `.content` — `0`
217
+ - Пріоритет плагінів за замовчуванням — `0`
218
+ - Плагіни з однаковим пріоритетом обробляються в порядку їхнього розміщення в конфігурації
219
+
220
+ ```ts fileName="intlayer.config.ts"
221
+ import { Locales, type IntlayerConfig } from "intlayer";
222
+ import { syncJSON } from "@intlayer/sync-json-plugin";
223
+
224
+ const config: IntlayerConfig = {
225
+ internationalization: {
226
+ locales: [Locales.ENGLISH, Locales.FRENCH],
227
+ defaultLocale: Locales.ENGLISH,
228
+ },
229
+
230
+ plugins: [
231
+ // Основне джерело JSON (найвищий пріоритет)
232
+ syncJSON({
233
+ format: "i18next",
234
+ source: ({ key, locale }) => `./locales/${locale}/${key}.json`,
235
+ location: "main-translations",
236
+ priority: 10,
237
+ }),
238
+
239
+ // Резервне джерело JSON (нижчий пріоритет)
240
+ syncJSON({
241
+ format: "i18next",
242
+ source: ({ locale }) => `./fallback-locales/${locale}.json`,
243
+ location: "fallback-translations",
244
+ priority: 5,
245
+ }),
246
+
247
+ // Спадкове джерело JSON (найнижчий пріоритет)
248
+ syncJSON({
249
+ format: "i18next",
250
+ source: ({ locale }) => `/my/other/app/legacy/${locale}/messages.json`,
251
+ location: "legacy-translations",
252
+ priority: 1,
253
+ }),
254
+ ],
255
+ };
256
+
257
+ export default config;
258
+ ```
259
+
260
+ ## Плагін loadJSON
261
+
262
+ ### Швидкий старт
263
+
264
+ Додайте плагін у ваш `intlayer.config.ts`, щоб імпортувати наявні JSON-файли як словники Intlayer. Цей плагін лише для читання (без запису на диск):
265
+
266
+ ```ts fileName="intlayer.config.ts"
267
+ import { Locales, type IntlayerConfig } from "intlayer";
268
+ import { loadJSON } from "@intlayer/sync-json-plugin";
269
+
270
+ const config: IntlayerConfig = {
271
+ internationalization: {
272
+ locales: [Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH],
273
+ defaultLocale: Locales.ENGLISH,
274
+ },
275
+
276
+ plugins: [
277
+ // Імпортувати JSON-повідомлення, розташовані в будь-якому місці структури вашого проєкту
278
+ loadJSON({
279
+ source: ({ key }) => `./src/**/${key}.i18n.json`,
280
+ // Завантажує одну локаль на екземпляр плагіна (за замовчуванням — config.defaultLocale)
281
+ locale: Locales.ENGLISH,
282
+ priority: 0,
283
+ }),
284
+ ],
285
+ };
286
+
287
+ export default config;
288
+ ```
289
+
290
+ Альтернатива: макет по локалях, все ще лише для читання (завантажується тільки обрана локаль):
291
+
292
+ ```ts fileName="intlayer.config.ts"
293
+ import { Locales, type IntlayerConfig } from "intlayer";
294
+ import { loadJSON } from "@intlayer/sync-json-plugin";
295
+
296
+ const config: IntlayerConfig = {
297
+ internationalization: {
298
+ locales: [Locales.ENGLISH, Locales.FRENCH],
299
+ defaultLocale: Locales.ENGLISH,
300
+ },
301
+ plugins: [
302
+ loadJSON({
303
+ // За цим шаблоном завантажуватимуться лише файли для Locales.FRENCH
304
+ source: ({ key, locale }) => `./locales/${locale}/${key}.json`,
305
+ locale: Locales.FRENCH,
306
+ }),
307
+ ],
308
+ };
309
+
310
+ export default config;
311
+ ```
312
+
313
+ ### Як це працює
314
+
315
+ - Виявлення (Discover): будує glob з вашого `source` builder і збирає відповідні JSON-файли.
316
+ - Імпорт (Ingest): завантажує кожен JSON-файл як словник Intlayer з вказаною `locale`.
317
+ - Тільки для читання (Read‑only): не записує і не форматирує вихідні файли; використовуйте `syncJSON`, якщо вам потрібен двосторонній синхрон.
318
+ - Готово до авто‑заповнення (Auto‑fill ready): визначає шаблон `fill`, щоб `intlayer content fill` міг заповнювати відсутні ключі.
319
+
320
+ ### API
321
+
322
+ ```ts
323
+ loadJSON({
324
+ // Побудувати шляхи до ваших JSON-файлів. `locale` необов'язковий, якщо у вашій структурі немає сегмента локалі
325
+ source: ({ key, locale }) => string,
326
+
327
+ // Цільова локаль для словників, завантажених цим екземпляром плагіна
328
+ // За замовчуванням — configuration.internationalization.defaultLocale
329
+ locale?: Locale,
330
+
331
+ // Необов'язковий мітка для ідентифікації джерела
332
+ location?: string, // за замовчуванням: "plugin"
333
+
334
+ // Пріоритет, що використовується для вирішення конфліктів із іншими джерелами
335
+ priority?: number, // за замовчуванням: 0
336
+
337
+ // Необов'язковий форматувач для JSON-вмісту
338
+ format?: 'intlayer' | 'icu' | 'i18next', // за замовчуванням: 'intlayer'
339
+ });
340
+ ```
341
+
342
+ #### `format` ('intlayer' | 'icu' | 'i18next')
343
+
344
+ Вказує форматувач, який використовується для вмісту словника при завантаженні JSON-файлів. Це дозволяє використовувати різні синтаксиси форматування повідомлень, сумісні з різними i18n-бібліотеками.
345
+
346
+ - `'intlayer'`: Форматувач Intlayer за замовчуванням.
347
+ - `'icu'`: Використовує форматування повідомлень ICU (сумісне з бібліотеками, такими як react-intl, vue-i18n).
348
+ - `'i18next'`: Використовує форматування i18next (сумісне з i18next, next-i18next, Solid-i18next).
349
+
350
+ **Приклад:**
351
+
352
+ ```ts
353
+ loadJSON({
354
+ source: ({ key }) => `./src/**/${key}.i18n.json`,
355
+ locale: Locales.ENGLISH,
356
+ format: "icu", // Використовувати форматування ICU для сумісності
357
+ }),
358
+ ```
359
+
360
+ ### Поведінка та конвенції
361
+
362
+ - Якщо ваша маска `source` містить плейсхолдер локалі, імпортуються лише файли для обраної `locale`.
363
+ - Якщо в масці немає сегмента `{key}`, ключ словника — "index".
364
+ - Ключі виводяться зі шляхів файлів шляхом підстановки плейсхолдера `{key}` у вашому source builder.
365
+ - Плагін використовує лише виявлені файли і не створює відсутні локалі чи ключі.
366
+ - Шлях `fill` виводиться з вашого `source` і використовується для оновлення відсутніх значень через CLI, якщо ви погодитесь.
367
+
368
+ ## Вирішення конфліктів
369
+
370
+ Коли один і той самий ключ перекладу існує в кількох JSON-джерелах:
371
+
372
+ 1. Плагін з найвищим пріоритетом визначає остаточне значення
373
+ 2. Джерела з нижчим пріоритетом використовуються як резервні джерела для відсутніх ключів
374
+ 3. Це дозволяє зберігати наявні (legacy) переклади під час поступової міграції до нових структур
375
+
376
+ ## Інтерфейс командного рядка (CLI)
377
+
378
+ Синхронізовані JSON-файли розглядатимуться як інші `.content` файли. Це означає, що всі команди intlayer будуть доступні для синхронізованих JSON-файлів. Включно з:
379
+
380
+ - `intlayer content test` — щоб перевірити, чи є відсутні переклади
381
+ - `intlayer content list` — перелічити синхронізовані JSON-файли
382
+ - `intlayer content fill` — заповнити відсутні переклади
383
+ - `intlayer content push` — відправити (push) синхронізовані JSON-файли
384
+ - `intlayer content pull` — отримати (pull) синхронізовані JSON-файли
385
+
386
+ Дивіться [Intlayer CLI](https://github.com/aymericzip/intlayer/blob/main/docs/docs/uk/cli/index.md) для детальнішої інформації.
387
+
388
+ ## Поточні обмеження
389
+
390
+ - Відсутня підтримка вставок або plurals/ICU при орієнтації на сторонні бібліотеки.
391
+ - Візуальний редактор поки недоступний для рантаймів, що не є Intlayer.
392
+ - Підтримується лише синхронізація JSON; формати каталогів, відмінні від JSON, не підтримуються.
393
+
394
+ ## Чому це важливо
395
+
396
+ - Ми можемо рекомендувати усталені i18n-рішення й позиціонувати Intlayer як доповнення.
397
+ - Ми використовуємо їхнє SEO та ключові слова через навчальні матеріали, які наприкінці пропонують використовувати Intlayer для керування JSON.
398
+ - Розширює цільову аудиторію з «нових проєктів» до «будь-якої команди, що вже використовує i18n».