@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,569 @@
|
|
|
1
|
+
---
|
|
2
|
+
createdAt: 2025-08-23
|
|
3
|
+
updatedAt: 2025-08-23
|
|
4
|
+
title: Intlayer CMS | Виносьте свій контент у Intlayer CMS
|
|
5
|
+
description: Виносьте свій контент у Intlayer CMS, щоб делегувати керування ним вашій команді.
|
|
6
|
+
keywords:
|
|
7
|
+
- CMS
|
|
8
|
+
- Visual Editor
|
|
9
|
+
- Internationalization
|
|
10
|
+
- Documentation
|
|
11
|
+
- Intlayer
|
|
12
|
+
- Next.js
|
|
13
|
+
- JavaScript
|
|
14
|
+
- React
|
|
15
|
+
slugs:
|
|
16
|
+
- doc
|
|
17
|
+
- concept
|
|
18
|
+
- cms
|
|
19
|
+
youtubeVideo: https://www.youtube.com/watch?v=UDDTnirwi_4
|
|
20
|
+
history:
|
|
21
|
+
- version: 6.0.1
|
|
22
|
+
date: 2025-09-22
|
|
23
|
+
changes: Додано документацію `liveSync`
|
|
24
|
+
- version: 6.0.0
|
|
25
|
+
date: 2025-09-04
|
|
26
|
+
changes: Замінено поле `hotReload` на `liveSync`
|
|
27
|
+
- version: 5.5.10
|
|
28
|
+
date: 2025-06-29
|
|
29
|
+
changes: Ініціалізовано історію
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
# Документація системи керування контентом Intlayer (CMS)
|
|
33
|
+
|
|
34
|
+
<iframe title="Візуальний редактор + CMS для вашого вебзастосунку: 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/UDDTnirwi_4?autoplay=0&origin=http://intlayer.org&controls=0&rel=1"/>
|
|
35
|
+
|
|
36
|
+
Intlayer CMS — це застосунок, який дозволяє винести вміст вашого проєкту Intlayer у зовнішню систему (CMS).
|
|
37
|
+
|
|
38
|
+
Для цього Intlayer вводить поняття «віддалених словників» (distant dictionaries).
|
|
39
|
+
|
|
40
|
+

|
|
41
|
+
|
|
42
|
+
## Зміст
|
|
43
|
+
|
|
44
|
+
<TOC/>
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
## Розуміння віддалених словників
|
|
49
|
+
|
|
50
|
+
Intlayer розрізняє 'local' та 'remote' словники.
|
|
51
|
+
|
|
52
|
+
- 'local' словник — це словник, який оголошений у вашому проєкті Intlayer. Наприклад файл декларації кнопки або ваша панель навігації. Виносити контент назовні в такому випадку не має сенсу, оскільки цей контент зазвичай не змінюється часто.
|
|
53
|
+
|
|
54
|
+
- 'remote' словник — це словник, яким керують через Intlayer CMS. Це може бути корисно, щоб дозволити вашій команді керувати контентом безпосередньо на вашому вебсайті, а також для використання функцій A/B тестування та автоматичної SEO-оптимізації.
|
|
55
|
+
|
|
56
|
+
## Візуальний редактор проти CMS
|
|
57
|
+
|
|
58
|
+
Редактор [Intlayer Visual](https://github.com/aymericzip/intlayer/blob/main/docs/docs/uk/intlayer_visual_editor.md) — це інструмент, який дозволяє керувати вашим вмістом у візуальному редакторі для локальних словників. Після внесення зміни вміст буде замінено в code-base. Це означає, що застосунок буде перебудовано, а сторінка перезавантажиться для відображення нового вмісту.
|
|
59
|
+
|
|
60
|
+
На відміну від цього, Intlayer CMS — це інструмент, який дозволяє керувати вмістом у візуальному редакторі для віддалених словників. Після внесення зміни вміст **не** вплине на ваш code-base. Вебсайт автоматично відобразить змінений вміст.
|
|
61
|
+
|
|
62
|
+
## Інтеграція
|
|
63
|
+
|
|
64
|
+
Для детальнішої інформації про встановлення пакета див. відповідний розділ нижче:
|
|
65
|
+
|
|
66
|
+
### Інтеграція з Next.js
|
|
67
|
+
|
|
68
|
+
Для інтеграції з Next.js зверніться до [керівництва з налаштування](https://github.com/aymericzip/intlayer/blob/main/docs/docs/uk/intlayer_with_nextjs_15.md).
|
|
69
|
+
|
|
70
|
+
### Інтеграція з Create React App
|
|
71
|
+
|
|
72
|
+
Для інтеграції з Create React App зверніться до [керівництва з налаштування](https://github.com/aymericzip/intlayer/blob/main/docs/docs/uk/intlayer_with_create_react_app.md).
|
|
73
|
+
|
|
74
|
+
### Інтеграція з Vite + React
|
|
75
|
+
|
|
76
|
+
Для інтеграції з Vite + React зверніться до [керівництва з налаштування](https://github.com/aymericzip/intlayer/blob/main/docs/docs/uk/intlayer_with_vite+react.md).
|
|
77
|
+
|
|
78
|
+
## Конфігурація
|
|
79
|
+
|
|
80
|
+
Запустіть наступну команду, щоб увійти в Intlayer CMS:
|
|
81
|
+
|
|
82
|
+
```bash packageManager="npm"
|
|
83
|
+
npx intlayer login
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
```bash packageManager="yarn"
|
|
87
|
+
yarn intlayer login
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
```bash packageManager="pnpm"
|
|
91
|
+
pnpm intlayer login
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
```bash packageManager="bun"
|
|
95
|
+
bunx intlayer login
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
Це відкриє ваш браузер за замовчуванням, щоб завершити процес автентифікації й отримати необхідні облікові дані (Client ID та Client Secret) для використання сервісів Intlayer.
|
|
99
|
+
|
|
100
|
+
У файлі конфігурації Intlayer ви можете налаштувати параметри CMS:
|
|
101
|
+
|
|
102
|
+
```typescript fileName="intlayer.config.ts" codeFormat="typescript"
|
|
103
|
+
import type { IntlayerConfig } from "intlayer";
|
|
104
|
+
|
|
105
|
+
const config: IntlayerConfig = {
|
|
106
|
+
// ... інші налаштування конфігурації
|
|
107
|
+
editor: {
|
|
108
|
+
/**
|
|
109
|
+
* Обов'язково
|
|
110
|
+
*
|
|
111
|
+
* URL застосунку.
|
|
112
|
+
* Це URL, що використовується візуальним редактором.
|
|
113
|
+
*/
|
|
114
|
+
applicationURL: process.env.INTLAYER_APPLICATION_URL,
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Обов'язково
|
|
118
|
+
*
|
|
119
|
+
* Client ID та client secret потрібні для увімкнення редактора.
|
|
120
|
+
* Вони дозволяють ідентифікувати користувача, який редагує контент.
|
|
121
|
+
* Їх можна отримати, створивши нового клієнта в Intlayer Dashboard - Projects (https://app.intlayer.org/projects).
|
|
122
|
+
* clientId: process.env.INTLAYER_CLIENT_ID,
|
|
123
|
+
* clientSecret: process.env.INTLAYER_CLIENT_SECRET,
|
|
124
|
+
*/
|
|
125
|
+
clientId: process.env.INTLAYER_CLIENT_ID,
|
|
126
|
+
clientSecret: process.env.INTLAYER_CLIENT_SECRET,
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Необов'язково
|
|
130
|
+
*
|
|
131
|
+
* Якщо ви розгортаєте Intlayer CMS самостійно, ви можете вказати URL CMS.
|
|
132
|
+
*
|
|
133
|
+
* URL Intlayer CMS.
|
|
134
|
+
* За замовчуванням встановлено на https://intlayer.org
|
|
135
|
+
*/
|
|
136
|
+
cmsURL: process.env.INTLAYER_CMS_URL,
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* Необов'язково
|
|
140
|
+
*
|
|
141
|
+
* У випадку, якщо ви самостійно розгортаєте Intlayer CMS, ви можете вказати URL бекенду.
|
|
142
|
+
*
|
|
143
|
+
* URL Intlayer CMS.
|
|
144
|
+
* За замовчуванням встановлено на https://back.intlayer.org
|
|
145
|
+
*/
|
|
146
|
+
backendURL: process.env.INTLAYER_BACKEND_URL,
|
|
147
|
+
},
|
|
148
|
+
};
|
|
149
|
+
|
|
150
|
+
export default config;
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
```javascript fileName="intlayer.config.mjs" codeFormat="esm"
|
|
154
|
+
/** @type {import('intlayer').IntlayerConfig} */
|
|
155
|
+
const config = {
|
|
156
|
+
// ... інші налаштування конфігурації
|
|
157
|
+
editor: {
|
|
158
|
+
/**
|
|
159
|
+
* Обов'язково
|
|
160
|
+
*
|
|
161
|
+
* URL застосунку.
|
|
162
|
+
* Це URL, на який спрямований візуальний редактор.
|
|
163
|
+
*/
|
|
164
|
+
applicationURL: process.env.INTLAYER_APPLICATION_URL,
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* Обов'язково
|
|
168
|
+
*
|
|
169
|
+
* Client ID та client secret необхідні для увімкнення редактора.
|
|
170
|
+
* Вони дозволяють ідентифікувати користувача, який редагує контент.
|
|
171
|
+
* Їх можна отримати, створивши нового клієнта в Intlayer Dashboard - Projects (https://app.intlayer.org/projects).
|
|
172
|
+
* clientId: process.env.INTLAYER_CLIENT_ID,
|
|
173
|
+
* clientSecret: process.env.INTLAYER_CLIENT_SECRET,
|
|
174
|
+
*/
|
|
175
|
+
clientId: process.env.INTLAYER_CLIENT_ID,
|
|
176
|
+
clientSecret: process.env.INTLAYER_CLIENT_SECRET,
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* Необов'язково
|
|
180
|
+
*
|
|
181
|
+
* Якщо ви розгортаєте Intlayer CMS самостійно, ви можете вказати URL CMS.
|
|
182
|
+
*
|
|
183
|
+
* URL Intlayer CMS.
|
|
184
|
+
* За замовчуванням встановлено https://intlayer.org
|
|
185
|
+
*/
|
|
186
|
+
cmsURL: process.env.INTLAYER_CMS_URL,
|
|
187
|
+
|
|
188
|
+
/**
|
|
189
|
+
* Необов'язково
|
|
190
|
+
*
|
|
191
|
+
* Якщо ви самостійно розгортаєте Intlayer CMS, ви можете вказати URL бекенду.
|
|
192
|
+
*
|
|
193
|
+
* URL Intlayer CMS.
|
|
194
|
+
* За замовчуванням встановлено на https://back.intlayer.org
|
|
195
|
+
*/
|
|
196
|
+
backendURL: process.env.INTLAYER_BACKEND_URL,
|
|
197
|
+
},
|
|
198
|
+
};
|
|
199
|
+
|
|
200
|
+
export default config;
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
```javascript fileName="intlayer.config.cjs" codeFormat="commonjs"
|
|
204
|
+
/** @type {import('intlayer').IntlayerConfig} */
|
|
205
|
+
const config = {
|
|
206
|
+
// ... інші параметри конфігурації
|
|
207
|
+
editor: {
|
|
208
|
+
/**
|
|
209
|
+
* Обов'язково
|
|
210
|
+
*
|
|
211
|
+
* URL додатка.
|
|
212
|
+
* Це URL, на який спрямований візуальний редактор.
|
|
213
|
+
*/
|
|
214
|
+
applicationURL: process.env.INTLAYER_APPLICATION_URL,
|
|
215
|
+
|
|
216
|
+
/**
|
|
217
|
+
* Обов'язково
|
|
218
|
+
*
|
|
219
|
+
* Client ID та client secret необхідні для увімкнення редактора.
|
|
220
|
+
* Вони дозволяють ідентифікувати користувача, який редагує вміст.
|
|
221
|
+
* Їх можна отримати, створивши нового клієнта в Intlayer Dashboard - Projects (https://app.intlayer.org/projects).
|
|
222
|
+
* clientId: process.env.INTLAYER_CLIENT_ID,
|
|
223
|
+
* clientSecret: process.env.INTLAYER_CLIENT_SECRET,
|
|
224
|
+
*/
|
|
225
|
+
clientId: process.env.INTLAYER_CLIENT_ID,
|
|
226
|
+
clientSecret: process.env.INTLAYER_CLIENT_SECRET,
|
|
227
|
+
|
|
228
|
+
/**
|
|
229
|
+
* Необов'язково
|
|
230
|
+
*
|
|
231
|
+
* Якщо ви самостійно розгортаєте Intlayer CMS, ви можете вказати URL CMS.
|
|
232
|
+
*
|
|
233
|
+
* URL Intlayer CMS.
|
|
234
|
+
* За замовчуванням встановлено https://intlayer.org
|
|
235
|
+
*/
|
|
236
|
+
cmsURL: process.env.INTLAYER_CMS_URL,
|
|
237
|
+
|
|
238
|
+
/**
|
|
239
|
+
* Необов'язково
|
|
240
|
+
*
|
|
241
|
+
* Якщо ви розгортаєте Intlayer CMS самостійно, ви можете вказати URL бекенду.
|
|
242
|
+
*
|
|
243
|
+
* URL Intlayer CMS.
|
|
244
|
+
* За замовчуванням встановлено https://back.intlayer.org
|
|
245
|
+
*/
|
|
246
|
+
backendURL: process.env.INTLAYER_BACKEND_URL,
|
|
247
|
+
},
|
|
248
|
+
};
|
|
249
|
+
|
|
250
|
+
module.exports = config;
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
> Якщо у вас немає client ID та client secret, ви можете отримати їх, створивши нового клієнта в [Intlayer Dashboard - Projects](https://app.intlayer.org/projects).
|
|
254
|
+
|
|
255
|
+
> Щоб побачити всі доступні параметри, зверніться до [документації з конфігурації](https://github.com/aymericzip/intlayer/blob/main/docs/docs/uk/configuration.md).
|
|
256
|
+
|
|
257
|
+
## Використання CMS
|
|
258
|
+
|
|
259
|
+
### Надіслати вашу конфігурацію
|
|
260
|
+
|
|
261
|
+
Щоб налаштувати Intlayer CMS, ви можете використовувати команди [intlayer CLI](https://github.com/aymericzip/intlayer/tree/main/docs/uk/intlayer_cli.md).
|
|
262
|
+
|
|
263
|
+
```bash
|
|
264
|
+
npx intlayer config push
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
> Якщо ви використовуєте змінні оточення в файлі конфігурації `intlayer.config.ts`, ви можете вказати потрібне оточення за допомогою аргументу `--env`:
|
|
268
|
+
|
|
269
|
+
```bash
|
|
270
|
+
npx intlayer config push --env production
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
Ця команда завантажує вашу конфігурацію в Intlayer CMS.
|
|
274
|
+
|
|
275
|
+
### Відправити словник
|
|
276
|
+
|
|
277
|
+
Щоб перетворити ваші локальні словники у віддалений словник, ви можете використовувати команди [intlayer CLI](https://github.com/aymericzip/intlayer/tree/main/docs/uk/intlayer_cli.md).
|
|
278
|
+
|
|
279
|
+
```bash
|
|
280
|
+
npx intlayer dictionary push -d my-first-dictionary-key
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
> Якщо ви використовуєте змінні середовища у вашому файлі конфігурації `intlayer.config.ts`, ви можете вказати потрібне середовище за допомогою аргументу `--env`:
|
|
284
|
+
|
|
285
|
+
```bash
|
|
286
|
+
npx intlayer dictionary push -d my-first-dictionary-key --env production
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
Ця команда завантажує ваші початкові словники контенту, роблячи їх доступними для асинхронного отримання та редагування через платформу Intlayer.
|
|
290
|
+
|
|
291
|
+
### Редагування словника
|
|
292
|
+
|
|
293
|
+
Потім ви зможете переглядати та керувати своїм словником у [Intlayer CMS](https://app.intlayer.org/content).
|
|
294
|
+
|
|
295
|
+
## Live Sync
|
|
296
|
+
|
|
297
|
+
Live Sync дозволяє вашому застосунку відображати зміни контенту з CMS під час виконання. Немає потреби у перебудові або повторному розгортанні. Коли увімкнено, оновлення передаються на сервер Live Sync, який оновлює словники, які читає ваш застосунок.
|
|
298
|
+
|
|
299
|
+
Увімкніть Live Sync, оновивши конфігурацію Intlayer:
|
|
300
|
+
|
|
301
|
+
```typescript fileName="intlayer.config.ts" codeFormat="typescript"
|
|
302
|
+
import type { IntlayerConfig } from "intlayer";
|
|
303
|
+
|
|
304
|
+
const config: IntlayerConfig = {
|
|
305
|
+
// ... other configuration settings
|
|
306
|
+
editor: {
|
|
307
|
+
/**
|
|
308
|
+
* Увімкнення гарячого перезавантаження конфігурацій локалей при виявленні змін.
|
|
309
|
+
* Наприклад, коли словник додається або оновлюється, застосунок оновлює
|
|
310
|
+
* вміст, що відображається на сторінці.
|
|
311
|
+
*
|
|
312
|
+
* Оскільки гаряче перезавантаження вимагає постійного з'єднання з сервером,
|
|
313
|
+
* воно доступне лише клієнтам плану `enterprise`.
|
|
314
|
+
*
|
|
315
|
+
* За замовчуванням: false
|
|
316
|
+
*/
|
|
317
|
+
liveSync: true,
|
|
318
|
+
},
|
|
319
|
+
build: {
|
|
320
|
+
/**
|
|
321
|
+
* Керує способом імпорту словників:
|
|
322
|
+
*
|
|
323
|
+
* - "live": словники завантажуються динамічно за допомогою Live Sync API.
|
|
324
|
+
* Замінює useIntlayer на useDictionaryDynamic.
|
|
325
|
+
*
|
|
326
|
+
* Примітка: режим live використовує Live Sync API для отримання словників. Якщо виклик API
|
|
327
|
+
* не вдасться, словники імпортуються динамічно.
|
|
328
|
+
* Примітка: режим live використовується лише для словників з віддаленим контентом і прапорцем "live".
|
|
329
|
+
* Інші використовують динамічний режим для кращої продуктивності.
|
|
330
|
+
*/
|
|
331
|
+
importMode: "live",
|
|
332
|
+
},
|
|
333
|
+
};
|
|
334
|
+
|
|
335
|
+
export default config;
|
|
336
|
+
```
|
|
337
|
+
|
|
338
|
+
```javascript fileName="intlayer.config.mjs" codeFormat="esm"
|
|
339
|
+
/** @type {import('intlayer').IntlayerConfig} */
|
|
340
|
+
const config = {
|
|
341
|
+
// ... інші налаштування конфігурації
|
|
342
|
+
editor: {
|
|
343
|
+
/**
|
|
344
|
+
* Вмикає гаряче перезавантаження конфігурацій локалей при виявленні змін.
|
|
345
|
+
* Наприклад, коли словник додається або оновлюється, додаток оновлює
|
|
346
|
+
* вміст, відображений на сторінці.
|
|
347
|
+
*
|
|
348
|
+
* Оскільки гаряче перезавантаження (hot reloading) вимагає безперервного з'єднання з сервером, воно
|
|
349
|
+
* доступне лише клієнтам з планом `enterprise`.
|
|
350
|
+
*
|
|
351
|
+
* За замовчуванням: false
|
|
352
|
+
*/
|
|
353
|
+
liveSync: true,
|
|
354
|
+
},
|
|
355
|
+
build: {
|
|
356
|
+
/**
|
|
357
|
+
* Контролює, як імпортуються словники:
|
|
358
|
+
*
|
|
359
|
+
* - "live": Словники отримуються динамічно за допомогою Live Sync API.
|
|
360
|
+
* Замінює useIntlayer на useDictionaryDynamic.
|
|
361
|
+
*
|
|
362
|
+
* Примітка: У live-режимі використовується Live Sync API для отримання словників. Якщо виклик API
|
|
363
|
+
* не вдається, словники імпортуються динамічно.
|
|
364
|
+
* Примітка: Тільки словники з віддаленим вмістом і прапором "live" використовують live-режим.
|
|
365
|
+
* Інші використовують динамічний режим для підвищення продуктивності.
|
|
366
|
+
*/
|
|
367
|
+
importMode: "live",
|
|
368
|
+
},
|
|
369
|
+
};
|
|
370
|
+
|
|
371
|
+
export default config;
|
|
372
|
+
```
|
|
373
|
+
|
|
374
|
+
```javascript fileName="intlayer.config.cjs" codeFormat="commonjs"
|
|
375
|
+
/** @type {import('intlayer').IntlayerConfig} */
|
|
376
|
+
const config = {
|
|
377
|
+
// ... інші налаштування конфігурації
|
|
378
|
+
editor: {
|
|
379
|
+
/**
|
|
380
|
+
* Увімкнення гарячого перезавантаження (hot reloading) конфігурацій локалей при виявленні змін.
|
|
381
|
+
* Наприклад, коли словник додається або оновлюється, додаток оновлює
|
|
382
|
+
* вміст, що відображається на сторінці.
|
|
383
|
+
*
|
|
384
|
+
* Оскільки гаряче перезавантаження потребує постійного з'єднання із сервером, воно
|
|
385
|
+
* доступне лише для клієнтів плану `enterprise`.
|
|
386
|
+
*
|
|
387
|
+
* За замовчуванням: false
|
|
388
|
+
*/
|
|
389
|
+
liveSync: true,
|
|
390
|
+
|
|
391
|
+
/**
|
|
392
|
+
* Порт сервера Live Sync.
|
|
393
|
+
*
|
|
394
|
+
* За замовчуванням: 4000
|
|
395
|
+
*/
|
|
396
|
+
liveSyncPort: 4000,
|
|
397
|
+
|
|
398
|
+
/**
|
|
399
|
+
* URL сервера Live Sync.
|
|
400
|
+
*
|
|
401
|
+
* За замовчуванням: http://localhost:{liveSyncPort}
|
|
402
|
+
*/
|
|
403
|
+
liveSyncURL: "https://live.example.com",
|
|
404
|
+
},
|
|
405
|
+
build: {
|
|
406
|
+
/**
|
|
407
|
+
* Керує тим, як імпортуються словники:
|
|
408
|
+
*
|
|
409
|
+
* - "live": словники завантажуються динамічно за допомогою Live Sync API.
|
|
410
|
+
* Замінює useIntlayer на useDictionaryDynamic.
|
|
411
|
+
*
|
|
412
|
+
* Примітка: режим live використовує Live Sync API для отримання словників. Якщо виклик API
|
|
413
|
+
* зазнає невдачі, словники імпортуються динамічно.
|
|
414
|
+
* Примітка: режим live використовується лише для словників з віддаленим вмістом і прапорцем "live".
|
|
415
|
+
* Інші використовують динамічний режим заради продуктивності.
|
|
416
|
+
*/
|
|
417
|
+
importMode: "live",
|
|
418
|
+
},
|
|
419
|
+
};
|
|
420
|
+
|
|
421
|
+
module.exports = config;
|
|
422
|
+
```
|
|
423
|
+
|
|
424
|
+
Запустіть Live Sync сервер, щоб обгорнути ваш додаток:
|
|
425
|
+
|
|
426
|
+
Приклад із окремим (standalone) сервером:
|
|
427
|
+
|
|
428
|
+
```json5 fileName="package.json"
|
|
429
|
+
{
|
|
430
|
+
"scripts": {
|
|
431
|
+
// ... інші скрипти
|
|
432
|
+
"live:start": "npx intlayer live",
|
|
433
|
+
},
|
|
434
|
+
}
|
|
435
|
+
```
|
|
436
|
+
|
|
437
|
+
Ви також можете запустити сервер вашого додатку паралельно, використовуючи аргумент `--process`.
|
|
438
|
+
|
|
439
|
+
Приклад із Next.js:
|
|
440
|
+
|
|
441
|
+
```json5 fileName="package.json"
|
|
442
|
+
{
|
|
443
|
+
"scripts": {
|
|
444
|
+
// ... інші скрипти
|
|
445
|
+
"build": "next build",
|
|
446
|
+
"dev": "next dev",
|
|
447
|
+
"start": "npx intlayer live --process 'next start'",
|
|
448
|
+
},
|
|
449
|
+
}
|
|
450
|
+
```
|
|
451
|
+
|
|
452
|
+
Приклад із Vite:
|
|
453
|
+
|
|
454
|
+
```json5 fileName="package.json"
|
|
455
|
+
{
|
|
456
|
+
"scripts": {
|
|
457
|
+
// ... інші скрипти
|
|
458
|
+
"build": "vite build",
|
|
459
|
+
"dev": "vite dev",
|
|
460
|
+
"start": "npx intlayer live --process 'vite start'",
|
|
461
|
+
},
|
|
462
|
+
}
|
|
463
|
+
```
|
|
464
|
+
|
|
465
|
+
Live Sync-сервер обгортає ваш додаток і автоматично застосовує оновлений контент у міру його надходження.
|
|
466
|
+
|
|
467
|
+
Щоб отримувати сповіщення про зміни з CMS, Live Sync-сервер підтримує SSE-з'єднання з бекендом. Коли вміст у CMS змінюється, бекенд пересилає оновлення до Live Sync-сервера, який записує нові словники. Ваш додаток відобразить оновлення при наступній навігації або перезавантаженні браузера — без необхідності перебудови.
|
|
468
|
+
|
|
469
|
+
Схема потоку (CMS/Backend -> Live Sync Server -> Application Server -> Frontend):
|
|
470
|
+
|
|
471
|
+

|
|
472
|
+
|
|
473
|
+
Як це працює:
|
|
474
|
+
|
|
475
|
+

|
|
476
|
+
|
|
477
|
+
### Робочий процес розробки (локально)
|
|
478
|
+
|
|
479
|
+
- Під час розробки всі віддалені словники завантажуються при запуску застосунку, тож ви можете швидко тестувати оновлення.
|
|
480
|
+
- Щоб протестувати Live Sync локально з Next.js, обгорніть ваш dev-сервер:
|
|
481
|
+
|
|
482
|
+
```json5 fileName="package.json"
|
|
483
|
+
{
|
|
484
|
+
"scripts": {
|
|
485
|
+
// ... інші скрипти
|
|
486
|
+
"dev": "npx intlayer live --process 'next dev'",
|
|
487
|
+
// "dev": "npx intlayer live --process 'vite dev'", // Для Vite
|
|
488
|
+
},
|
|
489
|
+
}
|
|
490
|
+
```
|
|
491
|
+
|
|
492
|
+
Увімкніть оптимізацію, щоб Intlayer застосовував трансформації Live import під час розробки:
|
|
493
|
+
|
|
494
|
+
```typescript fileName="intlayer.config.ts" codeFormat="typescript"
|
|
495
|
+
import type { IntlayerConfig } from "intlayer";
|
|
496
|
+
|
|
497
|
+
const config: IntlayerConfig = {
|
|
498
|
+
editor: {
|
|
499
|
+
applicationURL: "http://localhost:5173",
|
|
500
|
+
liveSyncURL: "http://localhost:4000",
|
|
501
|
+
liveSync: true,
|
|
502
|
+
},
|
|
503
|
+
build: {
|
|
504
|
+
optimize: true, // за замовчуванням: process.env.NODE_ENV === 'production'
|
|
505
|
+
importMode: "live",
|
|
506
|
+
},
|
|
507
|
+
};
|
|
508
|
+
|
|
509
|
+
export default config;
|
|
510
|
+
```
|
|
511
|
+
|
|
512
|
+
```javascript fileName="intlayer.config.mjs" codeFormat="esm"
|
|
513
|
+
/** @type {import('intlayer').IntlayerConfig} */
|
|
514
|
+
const config = {
|
|
515
|
+
editor: {
|
|
516
|
+
applicationURL: "http://localhost:5173",
|
|
517
|
+
liveSyncURL: "http://localhost:4000",
|
|
518
|
+
liveSync: true,
|
|
519
|
+
},
|
|
520
|
+
build: {
|
|
521
|
+
optimize: true, // за замовчуванням: process.env.NODE_ENV === 'production'
|
|
522
|
+
importMode: "live",
|
|
523
|
+
},
|
|
524
|
+
};
|
|
525
|
+
|
|
526
|
+
export default config;
|
|
527
|
+
```
|
|
528
|
+
|
|
529
|
+
```javascript fileName="intlayer.config.cjs" codeFormat="commonjs"
|
|
530
|
+
/** @type {import('intlayer').IntlayerConfig} */
|
|
531
|
+
const config = {
|
|
532
|
+
editor: {
|
|
533
|
+
applicationURL: "http://localhost:5173",
|
|
534
|
+
liveSyncURL: "http://localhost:4000",
|
|
535
|
+
liveSync: true,
|
|
536
|
+
},
|
|
537
|
+
build: {
|
|
538
|
+
optimize: true, // default: process.env.NODE_ENV === 'production'
|
|
539
|
+
importMode: "live",
|
|
540
|
+
},
|
|
541
|
+
};
|
|
542
|
+
|
|
543
|
+
module.exports = config;
|
|
544
|
+
```
|
|
545
|
+
|
|
546
|
+
Ця конфігурація обгортає ваш dev-сервер Live Sync-сервером, завантажує віддалені словники при старті та передає оновлення з CMS через SSE. Оновіть сторінку, щоб побачити зміни.
|
|
547
|
+
|
|
548
|
+
Примітки та обмеження:
|
|
549
|
+
|
|
550
|
+
- Додайте origin Live Sync до політики безпеки вашого сайту (CSP). Переконайтеся, що URL Live Sync дозволений у `connect-src` (і в `frame-ancestors`, якщо це доречно).
|
|
551
|
+
- Live Sync не працює зі статичним виводом. Для Next.js сторінка має бути динамічною, щоб отримувати оновлення під час виконання (наприклад, використовуйте `generateStaticParams`, `generateMetadata`, `getServerSideProps` або `getStaticProps` відповідно, щоб уникнути повного обмеження лише статикою).
|
|
552
|
+
- У CMS кожний словник має прапорець `live`. Лише словники з `live=true` завантажуються через API live sync; інші імпортуються динамічно і залишаються незмінними під час виконання.
|
|
553
|
+
- Прапорець `live` оцінюється для кожного словника під час збірки. Якщо віддалений контент не мав `live=true` під час збірки, потрібно перебудувати проект, щоб увімкнути Live Sync для цього словника.
|
|
554
|
+
- Сервер live sync має мати можливість записувати в `.intlayer`. У контейнерах переконайтеся, що є права запису до `/.intlayer`.
|
|
555
|
+
|
|
556
|
+
## Налагодження
|
|
557
|
+
|
|
558
|
+
Якщо у вас виникли проблеми з CMS, перевірте наступне:
|
|
559
|
+
|
|
560
|
+
- Застосунок запущено.
|
|
561
|
+
|
|
562
|
+
- Налаштування [`editor`](https://intlayer.org/doc/concept/configuration#editor-configuration) правильно встановлені у вашому конфігураційному файлі Intlayer.
|
|
563
|
+
- Обов'язкові поля:
|
|
564
|
+
- URL застосунку має відповідати тому, що ви вказали в конфігурації редактора (`applicationURL`).
|
|
565
|
+
- URL CMS
|
|
566
|
+
|
|
567
|
+
- Переконайтеся, що конфігурацію проєкту було pushed до Intlayer CMS.
|
|
568
|
+
|
|
569
|
+
- Візуальний редактор використовує iframe для відображення вашого вебсайту. Переконайтеся, що Content Security Policy (CSP) вашого сайту дозволяє URL CMS у `frame-ancestors` ('https://intlayer.org' за замовчуванням). Перевірте консоль редактора на наявність помилок.
|