@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.
- package/blog/ar/per-component_vs_centralized_i18n.md +248 -0
- package/blog/de/per-component_vs_centralized_i18n.md +248 -0
- package/blog/en/_per-component_vs_centralized_i18n.md +252 -0
- package/blog/en/per-component_vs_centralized_i18n.md +248 -0
- package/blog/en-GB/per-component_vs_centralized_i18n.md +247 -0
- package/blog/es/per-component_vs_centralized_i18n.md +245 -0
- package/blog/fr/per-component_vs_centralized_i18n.md +245 -0
- package/blog/hi/per-component_vs_centralized_i18n.md +249 -0
- package/blog/id/per-component_vs_centralized_i18n.md +248 -0
- package/blog/it/per-component_vs_centralized_i18n.md +247 -0
- package/blog/ja/per-component_vs_centralized_i18n.md +247 -0
- package/blog/ko/per-component_vs_centralized_i18n.md +246 -0
- package/blog/pl/per-component_vs_centralized_i18n.md +247 -0
- package/blog/pt/per-component_vs_centralized_i18n.md +246 -0
- package/blog/ru/per-component_vs_centralized_i18n.md +251 -0
- package/blog/tr/per-component_vs_centralized_i18n.md +244 -0
- package/blog/uk/compiler_vs_declarative_i18n.md +224 -0
- package/blog/uk/i18n_using_next-i18next.md +1086 -0
- package/blog/uk/i18n_using_next-intl.md +760 -0
- package/blog/uk/index.md +69 -0
- package/blog/uk/internationalization_and_SEO.md +273 -0
- package/blog/uk/intlayer_with_i18next.md +211 -0
- package/blog/uk/intlayer_with_next-i18next.md +202 -0
- package/blog/uk/intlayer_with_next-intl.md +203 -0
- package/blog/uk/intlayer_with_react-i18next.md +200 -0
- package/blog/uk/intlayer_with_react-intl.md +202 -0
- package/blog/uk/intlayer_with_vue-i18n.md +206 -0
- package/blog/uk/l10n_platform_alternative/Lokalise.md +80 -0
- package/blog/uk/l10n_platform_alternative/crowdin.md +80 -0
- package/blog/uk/l10n_platform_alternative/phrase.md +78 -0
- package/blog/uk/list_i18n_technologies/CMS/drupal.md +143 -0
- package/blog/uk/list_i18n_technologies/CMS/wix.md +167 -0
- package/blog/uk/list_i18n_technologies/CMS/wordpress.md +189 -0
- package/blog/uk/list_i18n_technologies/frameworks/angular.md +125 -0
- package/blog/uk/list_i18n_technologies/frameworks/flutter.md +128 -0
- package/blog/uk/list_i18n_technologies/frameworks/react-native.md +217 -0
- package/blog/uk/list_i18n_technologies/frameworks/react.md +155 -0
- package/blog/uk/list_i18n_technologies/frameworks/svelte.md +145 -0
- package/blog/uk/list_i18n_technologies/frameworks/vue.md +144 -0
- package/blog/uk/next-i18next_vs_next-intl_vs_intlayer.md +1499 -0
- package/blog/uk/nextjs-multilingual-seo-comparison.md +360 -0
- package/blog/uk/per-component_vs_centralized_i18n.md +248 -0
- package/blog/uk/rag_powered_documentation_assistant.md +288 -0
- package/blog/uk/react-i18next_vs_react-intl_vs_intlayer.md +164 -0
- package/blog/uk/vue-i18n_vs_intlayer.md +279 -0
- package/blog/uk/what_is_internationalization.md +167 -0
- package/blog/vi/per-component_vs_centralized_i18n.md +246 -0
- package/blog/zh/per-component_vs_centralized_i18n.md +248 -0
- package/dist/cjs/common.cjs.map +1 -1
- package/dist/cjs/generated/blog.entry.cjs +20 -0
- package/dist/cjs/generated/blog.entry.cjs.map +1 -1
- package/dist/cjs/generated/docs.entry.cjs.map +1 -1
- package/dist/cjs/generated/frequentQuestions.entry.cjs +20 -0
- package/dist/cjs/generated/frequentQuestions.entry.cjs.map +1 -1
- package/dist/cjs/generated/legal.entry.cjs.map +1 -1
- package/dist/esm/common.mjs.map +1 -1
- package/dist/esm/generated/blog.entry.mjs +20 -0
- package/dist/esm/generated/blog.entry.mjs.map +1 -1
- package/dist/esm/generated/docs.entry.mjs.map +1 -1
- package/dist/esm/generated/frequentQuestions.entry.mjs +20 -0
- package/dist/esm/generated/frequentQuestions.entry.mjs.map +1 -1
- package/dist/esm/generated/legal.entry.mjs.map +1 -1
- package/dist/types/generated/blog.entry.d.ts +1 -0
- package/dist/types/generated/blog.entry.d.ts.map +1 -1
- package/dist/types/generated/frequentQuestions.entry.d.ts +1 -0
- package/dist/types/generated/frequentQuestions.entry.d.ts.map +1 -1
- package/docs/ar/configuration.md +6 -1
- package/docs/ar/dictionary/content_file.md +6 -1
- package/docs/de/configuration.md +6 -1
- package/docs/de/dictionary/content_file.md +6 -1
- package/docs/en/configuration.md +6 -1
- package/docs/en/dictionary/content_file.md +6 -1
- package/docs/en-GB/configuration.md +6 -1
- package/docs/en-GB/dictionary/content_file.md +3 -1
- package/docs/es/configuration.md +6 -1
- package/docs/es/dictionary/content_file.md +6 -1
- package/docs/fr/configuration.md +6 -1
- package/docs/fr/dictionary/content_file.md +3 -1
- package/docs/hi/configuration.md +6 -1
- package/docs/hi/dictionary/content_file.md +3 -1
- package/docs/id/configuration.md +6 -1
- package/docs/id/dictionary/content_file.md +3 -1
- package/docs/it/configuration.md +6 -1
- package/docs/it/dictionary/content_file.md +3 -1
- package/docs/ja/configuration.md +6 -1
- package/docs/ja/dictionary/content_file.md +3 -1
- package/docs/ko/configuration.md +6 -1
- package/docs/ko/dictionary/content_file.md +3 -1
- package/docs/pl/configuration.md +3 -1
- package/docs/pl/dictionary/content_file.md +3 -1
- package/docs/pt/configuration.md +6 -1
- package/docs/pt/dictionary/content_file.md +3 -1
- package/docs/ru/configuration.md +6 -1
- package/docs/ru/dictionary/content_file.md +6 -1
- package/docs/tr/configuration.md +6 -1
- package/docs/tr/dictionary/content_file.md +3 -1
- package/docs/uk/CI_CD.md +198 -0
- package/docs/uk/autoFill.md +307 -0
- package/docs/uk/bundle_optimization.md +185 -0
- package/docs/uk/cli/build.md +64 -0
- package/docs/uk/cli/ci.md +137 -0
- package/docs/uk/cli/configuration.md +63 -0
- package/docs/uk/cli/debug.md +46 -0
- package/docs/uk/cli/doc-review.md +43 -0
- package/docs/uk/cli/doc-translate.md +132 -0
- package/docs/uk/cli/editor.md +28 -0
- package/docs/uk/cli/fill.md +130 -0
- package/docs/uk/cli/index.md +190 -0
- package/docs/uk/cli/init.md +84 -0
- package/docs/uk/cli/list.md +90 -0
- package/docs/uk/cli/list_projects.md +128 -0
- package/docs/uk/cli/live.md +41 -0
- package/docs/uk/cli/login.md +157 -0
- package/docs/uk/cli/pull.md +78 -0
- package/docs/uk/cli/push.md +98 -0
- package/docs/uk/cli/sdk.md +71 -0
- package/docs/uk/cli/test.md +76 -0
- package/docs/uk/cli/transform.md +65 -0
- package/docs/uk/cli/version.md +24 -0
- package/docs/uk/cli/watch.md +37 -0
- package/docs/uk/configuration.md +742 -0
- package/docs/uk/dictionary/condition.md +237 -0
- package/docs/uk/dictionary/content_file.md +1134 -0
- package/docs/uk/dictionary/enumeration.md +245 -0
- package/docs/uk/dictionary/file.md +232 -0
- package/docs/uk/dictionary/function_fetching.md +212 -0
- package/docs/uk/dictionary/gender.md +273 -0
- package/docs/uk/dictionary/insertion.md +187 -0
- package/docs/uk/dictionary/markdown.md +383 -0
- package/docs/uk/dictionary/nesting.md +273 -0
- package/docs/uk/dictionary/translation.md +332 -0
- package/docs/uk/formatters.md +595 -0
- package/docs/uk/how_works_intlayer.md +256 -0
- package/docs/uk/index.md +175 -0
- package/docs/uk/interest_of_intlayer.md +297 -0
- package/docs/uk/intlayer_CMS.md +569 -0
- package/docs/uk/intlayer_visual_editor.md +292 -0
- package/docs/uk/intlayer_with_angular.md +710 -0
- package/docs/uk/intlayer_with_astro.md +256 -0
- package/docs/uk/intlayer_with_create_react_app.md +1258 -0
- package/docs/uk/intlayer_with_express.md +429 -0
- package/docs/uk/intlayer_with_fastify.md +446 -0
- package/docs/uk/intlayer_with_lynx+react.md +548 -0
- package/docs/uk/intlayer_with_nestjs.md +283 -0
- package/docs/uk/intlayer_with_next-i18next.md +640 -0
- package/docs/uk/intlayer_with_next-intl.md +456 -0
- package/docs/uk/intlayer_with_nextjs_page_router.md +1541 -0
- package/docs/uk/intlayer_with_nuxt.md +711 -0
- package/docs/uk/intlayer_with_react_router_v7.md +600 -0
- package/docs/uk/intlayer_with_react_router_v7_fs_routes.md +669 -0
- package/docs/uk/intlayer_with_svelte_kit.md +579 -0
- package/docs/uk/intlayer_with_tanstack.md +818 -0
- package/docs/uk/intlayer_with_vite+preact.md +1748 -0
- package/docs/uk/intlayer_with_vite+react.md +1449 -0
- package/docs/uk/intlayer_with_vite+solid.md +302 -0
- package/docs/uk/intlayer_with_vite+svelte.md +520 -0
- package/docs/uk/intlayer_with_vite+vue.md +1113 -0
- package/docs/uk/introduction.md +222 -0
- package/docs/uk/locale_mapper.md +242 -0
- package/docs/uk/mcp_server.md +211 -0
- package/docs/uk/packages/express-intlayer/t.md +465 -0
- package/docs/uk/packages/intlayer/getEnumeration.md +159 -0
- package/docs/uk/packages/intlayer/getHTMLTextDir.md +121 -0
- package/docs/uk/packages/intlayer/getLocaleLang.md +81 -0
- package/docs/uk/packages/intlayer/getLocaleName.md +135 -0
- package/docs/uk/packages/intlayer/getLocalizedUrl.md +338 -0
- package/docs/uk/packages/intlayer/getMultilingualUrls.md +359 -0
- package/docs/uk/packages/intlayer/getPathWithoutLocale.md +75 -0
- package/docs/uk/packages/intlayer/getPrefix.md +213 -0
- package/docs/uk/packages/intlayer/getTranslation.md +190 -0
- package/docs/uk/packages/intlayer/getTranslationContent.md +189 -0
- package/docs/uk/packages/next-intlayer/t.md +365 -0
- package/docs/uk/packages/next-intlayer/useDictionary.md +276 -0
- package/docs/uk/packages/next-intlayer/useIntlayer.md +263 -0
- package/docs/uk/packages/next-intlayer/useLocale.md +166 -0
- package/docs/uk/packages/react-intlayer/t.md +311 -0
- package/docs/uk/packages/react-intlayer/useDictionary.md +295 -0
- package/docs/uk/packages/react-intlayer/useI18n.md +250 -0
- package/docs/uk/packages/react-intlayer/useIntlayer.md +251 -0
- package/docs/uk/packages/react-intlayer/useLocale.md +210 -0
- package/docs/uk/per_locale_file.md +345 -0
- package/docs/uk/plugins/sync-json.md +398 -0
- package/docs/uk/readme.md +265 -0
- package/docs/uk/releases/v6.md +305 -0
- package/docs/uk/releases/v7.md +624 -0
- package/docs/uk/roadmap.md +346 -0
- package/docs/uk/testing.md +204 -0
- package/docs/vi/configuration.md +6 -1
- package/docs/vi/dictionary/content_file.md +6 -1
- package/docs/zh/configuration.md +6 -1
- package/docs/zh/dictionary/content_file.md +6 -1
- package/frequent_questions/ar/error-vite-env-only.md +77 -0
- package/frequent_questions/de/error-vite-env-only.md +77 -0
- package/frequent_questions/en/error-vite-env-only.md +77 -0
- package/frequent_questions/en-GB/error-vite-env-only.md +77 -0
- package/frequent_questions/es/error-vite-env-only.md +76 -0
- package/frequent_questions/fr/error-vite-env-only.md +77 -0
- package/frequent_questions/hi/error-vite-env-only.md +77 -0
- package/frequent_questions/id/error-vite-env-only.md +77 -0
- package/frequent_questions/it/error-vite-env-only.md +77 -0
- package/frequent_questions/ja/error-vite-env-only.md +77 -0
- package/frequent_questions/ko/error-vite-env-only.md +77 -0
- package/frequent_questions/pl/error-vite-env-only.md +77 -0
- package/frequent_questions/pt/error-vite-env-only.md +77 -0
- package/frequent_questions/ru/error-vite-env-only.md +77 -0
- package/frequent_questions/tr/error-vite-env-only.md +77 -0
- package/frequent_questions/uk/SSR_Next_no_[locale].md +104 -0
- package/frequent_questions/uk/array_as_content_declaration.md +72 -0
- package/frequent_questions/uk/build_dictionaries.md +58 -0
- package/frequent_questions/uk/build_error_CI_CD.md +74 -0
- package/frequent_questions/uk/bun_set_up.md +53 -0
- package/frequent_questions/uk/customized_locale_list.md +64 -0
- package/frequent_questions/uk/domain_routing.md +113 -0
- package/frequent_questions/uk/error-vite-env-only.md +77 -0
- package/frequent_questions/uk/esbuild_error.md +29 -0
- package/frequent_questions/uk/get_locale_cookie.md +142 -0
- package/frequent_questions/uk/intlayer_command_undefined.md +155 -0
- package/frequent_questions/uk/locale_incorect_in_url.md +73 -0
- package/frequent_questions/uk/package_version_error.md +181 -0
- package/frequent_questions/uk/static_rendering.md +44 -0
- package/frequent_questions/uk/translated_path_url.md +55 -0
- package/frequent_questions/uk/unknown_command.md +97 -0
- package/frequent_questions/vi/error-vite-env-only.md +77 -0
- package/frequent_questions/zh/error-vite-env-only.md +77 -0
- package/legal/uk/privacy_notice.md +83 -0
- package/legal/uk/terms_of_service.md +55 -0
- package/package.json +9 -9
- package/src/generated/blog.entry.ts +20 -0
- 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&origin=http://intlayer.org&controls=0&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».
|