@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,548 @@
|
|
|
1
|
+
---
|
|
2
|
+
createdAt: 2025-03-09
|
|
3
|
+
updatedAt: 2025-12-30
|
|
4
|
+
title: Як перекласти ваш мобільний додаток Lynx і React – посібник з i18n 2026
|
|
5
|
+
description: Дізнайтеся, як зробити ваш мобільний додаток Lynx і React багатомовним. Дотримуйтеся документації, щоб інтернаціоналізувати (i18n) та перекласти його.
|
|
6
|
+
keywords:
|
|
7
|
+
- Інтернаціоналізація
|
|
8
|
+
- Документація
|
|
9
|
+
- Intlayer
|
|
10
|
+
- Vite
|
|
11
|
+
- React
|
|
12
|
+
- Lynx
|
|
13
|
+
- JavaScript
|
|
14
|
+
slugs:
|
|
15
|
+
- doc
|
|
16
|
+
- environment
|
|
17
|
+
- lynx-and-react
|
|
18
|
+
applicationTemplate: https://github.com/aymericzip/intlayer-lynx-template
|
|
19
|
+
history:
|
|
20
|
+
- version: 7.5.9
|
|
21
|
+
date: 2025-12-30
|
|
22
|
+
changes: Додано команду init
|
|
23
|
+
- version: 5.5.10
|
|
24
|
+
date: 2025-06-29
|
|
25
|
+
changes: Ініціалізація історії
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
# Перекладіть вебсайт вашого мобільного додатка Lynx і React за допомогою Intlayer | Інтернаціоналізація (i18n)
|
|
29
|
+
|
|
30
|
+
Перегляньте [шаблон застосунку](https://github.com/aymericzip/intlayer-lynx-template) на GitHub.
|
|
31
|
+
|
|
32
|
+
<iframe
|
|
33
|
+
src="https://stackblitz.com/github/aymericzip/intlayer-lynx-template?embed=1&ctl=1&file=intlayer.config.ts"
|
|
34
|
+
className="m-auto overflow-hidden rounded-lg border-0 max-md:size-full max-md:h-[700px] md:aspect-16/9 md:w-full"
|
|
35
|
+
title="Демо в CodeSandbox — Як інтернаціоналізувати ваш застосунок за допомогою Intlayer"
|
|
36
|
+
sandbox="allow-forms allow-modals allow-popups allow-presentation allow-same-origin allow-scripts"
|
|
37
|
+
loading="lazy"
|
|
38
|
+
/>
|
|
39
|
+
|
|
40
|
+
## Що таке Intlayer?
|
|
41
|
+
|
|
42
|
+
**Intlayer** — інноваційна, відкрита бібліотека для інтернаціоналізації (i18n), яка спрощує багатомовну підтримку в сучасних застосунках. Вона працює в багатьох JavaScript/TypeScript середовищах, **включно з Lynx** (через пакет `react-intlayer`).
|
|
43
|
+
|
|
44
|
+
За допомогою Intlayer ви можете:
|
|
45
|
+
|
|
46
|
+
- **Легко керувати перекладами** за допомогою декларативних словників на рівні компонентів.
|
|
47
|
+
- **Забезпечити підтримку TypeScript** завдяки автогенерованим типам.
|
|
48
|
+
- **Динамічно локалізувати** контент, включно з **рядками інтерфейсу** (а в React для web це також може локалізувати HTML-метадані тощо).
|
|
49
|
+
- **Користуватися розширеними можливостями**, такими як динамічне визначення локалі та її перемикання.
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
## Крок 1: Встановлення залежностей
|
|
54
|
+
|
|
55
|
+
З вашого проєкту Lynx встановіть наступні пакети:
|
|
56
|
+
|
|
57
|
+
```bash packageManager="npm"
|
|
58
|
+
npm install intlayer react-intlayer lynx-intlayer
|
|
59
|
+
npx intlayer init
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
```bash packageManager="pnpm"
|
|
63
|
+
pnpm add intlayer react-intlayer lynx-intlayer
|
|
64
|
+
pnpm intlayer init
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
```bash packageManager="yarn"
|
|
68
|
+
yarn add intlayer react-intlayer lynx-intlayer
|
|
69
|
+
yarn intlayer init
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
```bash packageManager="bun"
|
|
73
|
+
bun add intlayer react-intlayer lynx-intlayer
|
|
74
|
+
bunx intlayer init
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### Пакети
|
|
78
|
+
|
|
79
|
+
- **intlayer**
|
|
80
|
+
Основний інструментарій i18n для конфігурації, вмісту словників, генерації типів та CLI-команд.
|
|
81
|
+
|
|
82
|
+
- **react-intlayer**
|
|
83
|
+
Інтеграція для React, що надає context providers та React hooks, які ви використовуватимете в Lynx для отримання й перемикання локалей.
|
|
84
|
+
|
|
85
|
+
- **lynx-intlayer**
|
|
86
|
+
Інтеграція для Lynx, яка надає плагін для інтеграції Intlayer з бандлером Lynx.
|
|
87
|
+
|
|
88
|
+
///
|
|
89
|
+
|
|
90
|
+
---
|
|
91
|
+
|
|
92
|
+
## Крок 2: Створіть конфігураційний файл Intlayer
|
|
93
|
+
|
|
94
|
+
У корені вашого проєкту (або в будь-якому зручному місці) створіть **конфігураційний файл Intlayer**. Він може виглядати так:
|
|
95
|
+
|
|
96
|
+
```ts fileName="intlayer.config.ts" codeFormat="typescript"
|
|
97
|
+
import { Locales, type IntlayerConfig } from "intlayer";
|
|
98
|
+
|
|
99
|
+
const config: IntlayerConfig = {
|
|
100
|
+
internationalization: {
|
|
101
|
+
locales: [
|
|
102
|
+
Locales.ENGLISH,
|
|
103
|
+
Locales.FRENCH,
|
|
104
|
+
Locales.SPANISH,
|
|
105
|
+
// ... Додайте будь-які інші локалі, які вам потрібні
|
|
106
|
+
],
|
|
107
|
+
defaultLocale: Locales.ENGLISH,
|
|
108
|
+
},
|
|
109
|
+
};
|
|
110
|
+
|
|
111
|
+
export default config;
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
```js fileName="intlayer.config.mjs" codeFormat="esm"
|
|
115
|
+
import { Locales } from "intlayer";
|
|
116
|
+
|
|
117
|
+
/** @type {import('intlayer').IntlayerConfig} */
|
|
118
|
+
const config = {
|
|
119
|
+
internationalization: {
|
|
120
|
+
locales: [
|
|
121
|
+
Locales.ENGLISH,
|
|
122
|
+
Locales.FRENCH,
|
|
123
|
+
Locales.SPANISH,
|
|
124
|
+
// ... Додайте будь-які інші локалі, які вам потрібні
|
|
125
|
+
],
|
|
126
|
+
defaultLocale: Locales.ENGLISH,
|
|
127
|
+
},
|
|
128
|
+
};
|
|
129
|
+
|
|
130
|
+
export default config;
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
```js fileName="intlayer.config.js" codeFormat="commonjs"
|
|
134
|
+
const { Locales } = require("intlayer");
|
|
135
|
+
|
|
136
|
+
/** @type {import('intlayer').IntlayerConfig} */
|
|
137
|
+
const config = {
|
|
138
|
+
internationalization: {
|
|
139
|
+
locales: [Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH],
|
|
140
|
+
defaultLocale: Locales.ENGLISH,
|
|
141
|
+
},
|
|
142
|
+
};
|
|
143
|
+
|
|
144
|
+
module.exports = config;
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
У цій конфігурації ви можете:
|
|
148
|
+
|
|
149
|
+
- Налаштувати свій **список підтримуваних локалей**.
|
|
150
|
+
- Встановити **локаль за замовчуванням**.
|
|
151
|
+
- Надалі ви можете додати більш розширені опції (наприклад, логи, кастомні каталоги контенту тощо).
|
|
152
|
+
- Див. [документацію конфігурації Intlayer](https://github.com/aymericzip/intlayer/blob/main/docs/docs/uk/configuration.md) для деталей.
|
|
153
|
+
|
|
154
|
+
## Крок 3: Додайте плагін Intlayer у збирач Lynx
|
|
155
|
+
|
|
156
|
+
Щоб використовувати Intlayer з Lynx, потрібно додати плагін у файл `lynx.config.ts`:
|
|
157
|
+
|
|
158
|
+
```ts fileName="lynx.config.ts"
|
|
159
|
+
import { defineConfig } from "@lynx-js/rspeedy";
|
|
160
|
+
import { pluginIntlayerLynx } from "lynx-intlayer/plugin";
|
|
161
|
+
|
|
162
|
+
export default defineConfig({
|
|
163
|
+
plugins: [
|
|
164
|
+
// ... інші плагіни
|
|
165
|
+
pluginIntlayerLynx(),
|
|
166
|
+
],
|
|
167
|
+
});
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
## Крок 4: Додайте провайдера Intlayer
|
|
171
|
+
|
|
172
|
+
Щоб синхронізувати мову користувача по всьому додатку, обгорніть кореневий компонент компонентом `IntlayerProvider` з `react-intlayer`.
|
|
173
|
+
|
|
174
|
+
Також потрібно додати виклик функції `intlayerPolyfill`, щоб забезпечити правильну роботу Intlayer.
|
|
175
|
+
|
|
176
|
+
```tsx fileName="src/index.tsx"
|
|
177
|
+
import { root } from "@lynx-js/react";
|
|
178
|
+
|
|
179
|
+
import { App } from "./App.js";
|
|
180
|
+
import { IntlayerProvider } from "react-intlayer";
|
|
181
|
+
import { intlayerPolyfill } from "lynx-intlayer";
|
|
182
|
+
|
|
183
|
+
intlayerPolyfill();
|
|
184
|
+
|
|
185
|
+
root.render(
|
|
186
|
+
<IntlayerProvider>
|
|
187
|
+
<App />
|
|
188
|
+
</IntlayerProvider>
|
|
189
|
+
);
|
|
190
|
+
|
|
191
|
+
if (import.meta.webpackHot) {
|
|
192
|
+
import.meta.webpackHot.accept();
|
|
193
|
+
}
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
## Крок 5: Оголосіть свій контент
|
|
197
|
+
|
|
198
|
+
Створіть **файли декларації контенту** у будь-якому місці вашого проєкту (зазвичай у `src/`), використовуючи будь-який із форматів розширень, які підтримує Intlayer:
|
|
199
|
+
|
|
200
|
+
- `.content.json`
|
|
201
|
+
- `.content.ts`
|
|
202
|
+
- `.content.tsx`
|
|
203
|
+
- `.content.js`
|
|
204
|
+
- `.content.jsx`
|
|
205
|
+
- `.content.mjs`
|
|
206
|
+
- `.content.mjx`
|
|
207
|
+
- `.content.cjs`
|
|
208
|
+
- `.content.cjx`
|
|
209
|
+
- etc.
|
|
210
|
+
|
|
211
|
+
Приклад:
|
|
212
|
+
|
|
213
|
+
```tsx fileName="src/app.content.ts" contentDeclarationFormat="typescript"
|
|
214
|
+
import { t, type Dictionary } from "intlayer";
|
|
215
|
+
|
|
216
|
+
const appContent = {
|
|
217
|
+
key: "app",
|
|
218
|
+
content: {
|
|
219
|
+
title: "React",
|
|
220
|
+
subtitle: t({
|
|
221
|
+
uk: "на Lynx",
|
|
222
|
+
en: "on Lynx",
|
|
223
|
+
fr: "sur Lynx",
|
|
224
|
+
es: "en Lynx",
|
|
225
|
+
}),
|
|
226
|
+
description: t({
|
|
227
|
+
uk: "Натисніть на логотип і розважайтеся!",
|
|
228
|
+
en: "Tap the logo and have fun!",
|
|
229
|
+
fr: "Appuyez sur le logo et amusez-vous!",
|
|
230
|
+
es: "¡Toca el logo y diviértete!",
|
|
231
|
+
}),
|
|
232
|
+
hint: [
|
|
233
|
+
t({
|
|
234
|
+
uk: "Редагувати",
|
|
235
|
+
en: "Edit",
|
|
236
|
+
fr: "Modifier",
|
|
237
|
+
es: "Editar",
|
|
238
|
+
}),
|
|
239
|
+
" src/App.tsx ",
|
|
240
|
+
t({
|
|
241
|
+
uk: "щоб побачити оновлення!",
|
|
242
|
+
en: "to see updates!",
|
|
243
|
+
fr: "pour voir les mises à jour!",
|
|
244
|
+
es: "para ver actualizaciones!",
|
|
245
|
+
}),
|
|
246
|
+
],
|
|
247
|
+
},
|
|
248
|
+
} satisfies Dictionary;
|
|
249
|
+
|
|
250
|
+
export default appContent;
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
```jsx fileName="src/app.content.mjx" contentDeclarationFormat="esm"
|
|
254
|
+
import { t } from "intlayer";
|
|
255
|
+
|
|
256
|
+
const appContent = {
|
|
257
|
+
key: "app",
|
|
258
|
+
content: {
|
|
259
|
+
title: "React",
|
|
260
|
+
subtitle: t({
|
|
261
|
+
uk: "на Lynx",
|
|
262
|
+
en: "on Lynx",
|
|
263
|
+
fr: "sur Lynx",
|
|
264
|
+
es: "en Lynx",
|
|
265
|
+
}),
|
|
266
|
+
description: t({
|
|
267
|
+
uk: "Торкніться логотипу та розважайтеся!",
|
|
268
|
+
en: "Tap the logo and have fun!",
|
|
269
|
+
fr: "Appuyez sur le logo et amusez-vous!",
|
|
270
|
+
es: "¡Toca el logo y diviértete!",
|
|
271
|
+
}),
|
|
272
|
+
hint: [
|
|
273
|
+
t({
|
|
274
|
+
uk: "Редагувати",
|
|
275
|
+
en: "Edit",
|
|
276
|
+
fr: "Modifier",
|
|
277
|
+
es: "Editar",
|
|
278
|
+
}),
|
|
279
|
+
" src/App.tsx ",
|
|
280
|
+
t({
|
|
281
|
+
uk: "щоб побачити оновлення!",
|
|
282
|
+
en: "to see updates!",
|
|
283
|
+
fr: "pour voir les mises à jour!",
|
|
284
|
+
es: "para ver actualizaciones!",
|
|
285
|
+
}),
|
|
286
|
+
],
|
|
287
|
+
},
|
|
288
|
+
};
|
|
289
|
+
|
|
290
|
+
export default appContent;
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
```jsx fileName="src/app.content.csx" contentDeclarationFormat="commonjs"
|
|
294
|
+
const { t } = require("intlayer");
|
|
295
|
+
|
|
296
|
+
/** @type {import('intlayer').Dictionary} */
|
|
297
|
+
const appContent = {
|
|
298
|
+
key: "app",
|
|
299
|
+
content: {
|
|
300
|
+
title: "React",
|
|
301
|
+
subtitle: t({
|
|
302
|
+
uk: "на Lynx",
|
|
303
|
+
en: "on Lynx",
|
|
304
|
+
uk: "на Lynx",
|
|
305
|
+
fr: "sur Lynx",
|
|
306
|
+
es: "en Lynx",
|
|
307
|
+
}),
|
|
308
|
+
description: t({
|
|
309
|
+
uk: "Натисніть на логотип та повеселіться!",
|
|
310
|
+
en: "Tap the logo and have fun!",
|
|
311
|
+
fr: "Appuyez sur le logo et amusez-vous!",
|
|
312
|
+
es: "¡Toca el logo y diviértete!",
|
|
313
|
+
}),
|
|
314
|
+
hint: [
|
|
315
|
+
t({
|
|
316
|
+
uk: "Редагувати",
|
|
317
|
+
en: "Edit",
|
|
318
|
+
fr: "Modifier",
|
|
319
|
+
es: "Editar",
|
|
320
|
+
}),
|
|
321
|
+
" src/App.tsx ",
|
|
322
|
+
t({
|
|
323
|
+
uk: "щоб побачити оновлення!",
|
|
324
|
+
en: "to see updates!",
|
|
325
|
+
fr: "pour voir les mises à jour!",
|
|
326
|
+
es: "para ver actualizaciones!",
|
|
327
|
+
}),
|
|
328
|
+
],
|
|
329
|
+
},
|
|
330
|
+
};
|
|
331
|
+
|
|
332
|
+
module.exports = appContent;
|
|
333
|
+
```
|
|
334
|
+
|
|
335
|
+
```json fileName="src/app.content.json" contentDeclarationFormat="json"
|
|
336
|
+
{
|
|
337
|
+
"$schema": "https://intlayer.org/schema.json",
|
|
338
|
+
"key": "app",
|
|
339
|
+
"content": {
|
|
340
|
+
"title": "React",
|
|
341
|
+
"subtitle": {
|
|
342
|
+
"nodeType": "translation",
|
|
343
|
+
"translation": {
|
|
344
|
+
"uk": "на Lynx",
|
|
345
|
+
"en": "on Lynx",
|
|
346
|
+
"uk": "на Lynx",
|
|
347
|
+
"fr": "sur Lynx",
|
|
348
|
+
"es": "en Lynx"
|
|
349
|
+
}
|
|
350
|
+
},
|
|
351
|
+
"description": {
|
|
352
|
+
"nodeType": "translation",
|
|
353
|
+
"translation": {
|
|
354
|
+
"uk": "Торкніться логотипа та розважайтеся!",
|
|
355
|
+
"en": "Tap the logo and have fun!",
|
|
356
|
+
"fr": "Appuyez sur le logo et amusez-vous!",
|
|
357
|
+
"es": "¡Toca el logo y diviértete!"
|
|
358
|
+
}
|
|
359
|
+
},
|
|
360
|
+
"hint": [
|
|
361
|
+
{
|
|
362
|
+
"nodeType": "translation",
|
|
363
|
+
"translation": {
|
|
364
|
+
"uk": "Редагувати",
|
|
365
|
+
"en": "Edit",
|
|
366
|
+
"fr": "Modifier",
|
|
367
|
+
"es": "Editar"
|
|
368
|
+
}
|
|
369
|
+
},
|
|
370
|
+
" src/App.tsx ",
|
|
371
|
+
{
|
|
372
|
+
"nodeType": "translation",
|
|
373
|
+
"translation": {
|
|
374
|
+
"uk": "щоб побачити оновлення!",
|
|
375
|
+
"en": "to see updates!",
|
|
376
|
+
"fr": "pour voir les mises à jour!",
|
|
377
|
+
"es": "para ver actualizaciones!"
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
]
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
```
|
|
384
|
+
|
|
385
|
+
> Детальніше про декларації контенту див. [документацію Intlayer щодо файлів контенту](https://github.com/aymericzip/intlayer/blob/main/docs/docs/uk/dictionary/content_file.md).
|
|
386
|
+
|
|
387
|
+
---
|
|
388
|
+
|
|
389
|
+
## Крок 4: Використання Intlayer у ваших компонентах
|
|
390
|
+
|
|
391
|
+
Використайте хук `useIntlayer` у дочірніх компонентах, щоб отримувати локалізований контент.
|
|
392
|
+
|
|
393
|
+
```tsx fileName="src/App.tsx"
|
|
394
|
+
import { useCallback, useState } from "@lynx-js/react";
|
|
395
|
+
import { useIntlayer } from "react-intlayer";
|
|
396
|
+
|
|
397
|
+
import "./App.css";
|
|
398
|
+
import arrow from "./assets/arrow.png";
|
|
399
|
+
import lynxLogo from "./assets/lynx-logo.png";
|
|
400
|
+
import reactLynxLogo from "./assets/react-logo.png";
|
|
401
|
+
import { LocaleSwitcher } from "./components/LocaleSwitcher.jsx";
|
|
402
|
+
|
|
403
|
+
export const App = () => {
|
|
404
|
+
const [alterLogo, setAlterLogo] = useState(false);
|
|
405
|
+
const { title, subtitle, description, hint } = useIntlayer("app");
|
|
406
|
+
|
|
407
|
+
const onTap = useCallback(() => {
|
|
408
|
+
"лише фон";
|
|
409
|
+
setAlterLogo(!alterLogo);
|
|
410
|
+
}, [alterLogo]);
|
|
411
|
+
|
|
412
|
+
return (
|
|
413
|
+
<view>
|
|
414
|
+
<view className="Background" />
|
|
415
|
+
<view className="App">
|
|
416
|
+
<view className="Banner">
|
|
417
|
+
<view className="Logo" bindtap={onTap}>
|
|
418
|
+
{alterLogo ? (
|
|
419
|
+
<image src={reactLynxLogo} className="Logo--react" />
|
|
420
|
+
) : (
|
|
421
|
+
<image src={lynxLogo} className="Logo--lynx" />
|
|
422
|
+
)}
|
|
423
|
+
</view>
|
|
424
|
+
<text className="Title">{title}</text>
|
|
425
|
+
<text className="Subtitle">{subtitle}</text>
|
|
426
|
+
</view>
|
|
427
|
+
<view className="Content">
|
|
428
|
+
<image src={arrow} className="Arrow" />
|
|
429
|
+
<text className="Description">{description}</text>
|
|
430
|
+
<text className="Hint">
|
|
431
|
+
{hint[0]}
|
|
432
|
+
<text style={{ fontStyle: "italic" }}>{hint[1]}</text>
|
|
433
|
+
{hint[2]}
|
|
434
|
+
</text>
|
|
435
|
+
</view>
|
|
436
|
+
<LocaleSwitcher />
|
|
437
|
+
<view style={{ flex: 1 }}></view>
|
|
438
|
+
</view>
|
|
439
|
+
</view>
|
|
440
|
+
);
|
|
441
|
+
};
|
|
442
|
+
```
|
|
443
|
+
|
|
444
|
+
> Коли ви використовуєте `content.someKey` у властивостях, які очікують рядок (наприклад, `title` кнопки або `children` компонента `Text`), **викликайте `content.someKey.value`**, щоб отримати фактичний рядок.
|
|
445
|
+
|
|
446
|
+
---
|
|
447
|
+
|
|
448
|
+
## (Необов'язково) Крок 5: Змінити локаль додатка
|
|
449
|
+
|
|
450
|
+
Щоб перемикати локалі зсередини ваших компонентів, ви можете використовувати метод `setLocale` хука `useLocale`:
|
|
451
|
+
|
|
452
|
+
```tsx fileName="src/components/LocaleSwitcher.tsx"
|
|
453
|
+
import { type FC } from "react";
|
|
454
|
+
import { getLocaleName } from "intlayer";
|
|
455
|
+
import { useLocale } from "react-intlayer";
|
|
456
|
+
|
|
457
|
+
export const LocaleSwitcher: FC = () => {
|
|
458
|
+
const { setLocale, availableLocales, locale } = useLocale();
|
|
459
|
+
|
|
460
|
+
return (
|
|
461
|
+
<view
|
|
462
|
+
style={{
|
|
463
|
+
display: "flex",
|
|
464
|
+
flexDirection: "row",
|
|
465
|
+
justifyContent: "center",
|
|
466
|
+
alignItems: "center",
|
|
467
|
+
gap: 10,
|
|
468
|
+
}}
|
|
469
|
+
>
|
|
470
|
+
{availableLocales.map((localeEl) => (
|
|
471
|
+
<text
|
|
472
|
+
key={localeEl}
|
|
473
|
+
style={{
|
|
474
|
+
color: localeEl === locale ? "#fff" : "#888",
|
|
475
|
+
fontSize: "12px",
|
|
476
|
+
}}
|
|
477
|
+
bindtap={() => setLocale(localeEl)}
|
|
478
|
+
>
|
|
479
|
+
{getLocaleName(localeEl)}
|
|
480
|
+
</text>
|
|
481
|
+
))}
|
|
482
|
+
</view>
|
|
483
|
+
);
|
|
484
|
+
};
|
|
485
|
+
```
|
|
486
|
+
|
|
487
|
+
Це спричиняє повторний рендер усіх компонентів, що використовують вміст Intlayer, які тепер відображатимуть переклади для нової локалі.
|
|
488
|
+
|
|
489
|
+
> Дивіться [документацію `useLocale`](https://github.com/aymericzip/intlayer/blob/main/docs/docs/uk/packages/react-intlayer/useLocale.md) для детальнішої інформації.
|
|
490
|
+
|
|
491
|
+
## Налаштування TypeScript (якщо ви використовуєте TypeScript)
|
|
492
|
+
|
|
493
|
+
Intlayer генерує визначення типів у прихованій папці (за замовчуванням `.intlayer`) для покращення автозаповнення та виявлення помилок у перекладах:
|
|
494
|
+
|
|
495
|
+
```json5
|
|
496
|
+
// tsconfig.json
|
|
497
|
+
{
|
|
498
|
+
// ... ваша існуюча конфігурація TS
|
|
499
|
+
"include": [
|
|
500
|
+
"src", // ваш вихідний код
|
|
501
|
+
".intlayer/types/**/*.ts", // <-- переконайтеся, що автогенеровані типи включені
|
|
502
|
+
// ... все інше, що ви вже включаєте
|
|
503
|
+
],
|
|
504
|
+
}
|
|
505
|
+
```
|
|
506
|
+
|
|
507
|
+
Це забезпечує такі можливості:
|
|
508
|
+
|
|
509
|
+
- **Автозаповнення** для ключів вашого словника.
|
|
510
|
+
- **Перевірка типів**, яка попереджає, якщо ви звертаєтеся до неіснуючого ключа або тип не відповідає.
|
|
511
|
+
|
|
512
|
+
---
|
|
513
|
+
|
|
514
|
+
## Конфігурація Git
|
|
515
|
+
|
|
516
|
+
Щоб уникнути коміту автоматично згенерованих файлів Intlayer, додайте наступне до вашого `.gitignore`:
|
|
517
|
+
|
|
518
|
+
```plaintext
|
|
519
|
+
# Ігнорувати файли, згенеровані Intlayer
|
|
520
|
+
.intlayer
|
|
521
|
+
```
|
|
522
|
+
|
|
523
|
+
---
|
|
524
|
+
|
|
525
|
+
### Розширення VS Code
|
|
526
|
+
|
|
527
|
+
Щоб покращити ваш досвід розробки з Intlayer, ви можете встановити офіційне **Intlayer VS Code Extension**.
|
|
528
|
+
|
|
529
|
+
[Встановити з VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=intlayer.intlayer-vs-code-extension)
|
|
530
|
+
|
|
531
|
+
Розширення надає:
|
|
532
|
+
|
|
533
|
+
- **Автодоповнення** для ключів перекладу.
|
|
534
|
+
- **Виявлення помилок у реальному часі** для відсутніх перекладів.
|
|
535
|
+
- **Вбудовані попередні перегляди** перекладеного вмісту.
|
|
536
|
+
- **Швидкі дії** для зручного створення та оновлення перекладів.
|
|
537
|
+
|
|
538
|
+
Для детальнішої інформації про використання розширення див. документацію [Intlayer VS Code Extension](https://intlayer.org/doc/vs-code-extension).
|
|
539
|
+
|
|
540
|
+
---
|
|
541
|
+
|
|
542
|
+
## Додаткові можливості
|
|
543
|
+
|
|
544
|
+
- **Візуальний редактор**: Використовуйте [Intlayer Visual Editor](https://github.com/aymericzip/intlayer/blob/main/docs/docs/uk/intlayer_visual_editor.md) для візуального керування перекладами.
|
|
545
|
+
- **Інтеграція з CMS**: Ви також можете зовнішньо зберігати та отримувати вміст вашого словника з [CMS](https://github.com/aymericzip/intlayer/blob/main/docs/docs/uk/intlayer_CMS.md).
|
|
546
|
+
- **Команди CLI**: Ознайомтеся з [Intlayer CLI](https://github.com/aymericzip/intlayer/blob/main/docs/docs/uk/cli/index.md) для завдань, таких як **вилучення перекладів** або **перевірка відсутніх ключів**.
|
|
547
|
+
|
|
548
|
+
---
|