@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,600 @@
|
|
|
1
|
+
---
|
|
2
|
+
createdAt: 2025-09-04
|
|
3
|
+
updatedAt: 2025-12-30
|
|
4
|
+
title: Як перекласти ваш застосунок на React Router v7 – посібник i18n 2026
|
|
5
|
+
description: Дізнайтеся, як додати інтернаціоналізацію (i18n) до вашого застосунку на React Router v7 за допомогою Intlayer. Дотримуйтеся цього вичерпного посібника, щоб зробити ваш застосунок багатомовним із маршрутизацією, що враховує локаль.
|
|
6
|
+
keywords:
|
|
7
|
+
- Інтернаціоналізація
|
|
8
|
+
- Документація
|
|
9
|
+
- Intlayer
|
|
10
|
+
- React Router v7
|
|
11
|
+
- React
|
|
12
|
+
- i18n
|
|
13
|
+
- TypeScript
|
|
14
|
+
- Locale Routing
|
|
15
|
+
slugs:
|
|
16
|
+
- doc
|
|
17
|
+
- environment
|
|
18
|
+
- vite-and-react
|
|
19
|
+
- react-router-v7
|
|
20
|
+
applicationTemplate: https://github.com/aymericzip/intlayer-react-router-v7-template
|
|
21
|
+
youtubeVideo: https://www.youtube.com/watch?v=dS9L7uJeak4
|
|
22
|
+
history:
|
|
23
|
+
- version: 7.5.9
|
|
24
|
+
date: 2025-12-30
|
|
25
|
+
changes: Додано команду init
|
|
26
|
+
- version: 7.5.6
|
|
27
|
+
date: 2025-12-27
|
|
28
|
+
changes: Оновлено Layout і обробку 404
|
|
29
|
+
- version: 6.1.5
|
|
30
|
+
date: 2025-10-03
|
|
31
|
+
changes: Оновлено документацію
|
|
32
|
+
- version: 5.8.2
|
|
33
|
+
date: 2025-09-04
|
|
34
|
+
changes: Додано для React Router v7
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
# Перекладіть ваш вебсайт на React Router v7 за допомогою Intlayer | Інтернаціоналізація (i18n)
|
|
38
|
+
|
|
39
|
+
Цей посібник показує, як інтегрувати **Intlayer** для безшовної інтернаціоналізації в проєктах на React Router v7 з маршрутизацією, чутливою до локалі, підтримкою TypeScript та сучасними практиками розробки.
|
|
40
|
+
|
|
41
|
+
Цей посібник зосереджений на frontend-маршрутизації. Для маршрутизації з fs-routes зверніться до посібника [Intlayer з React Router v7 File-System Routes](https://github.com/aymericzip/intlayer/blob/main/docs/docs/uk/intlayer_with_react_router_v7_fs_routes.md).
|
|
42
|
+
|
|
43
|
+
## Зміст
|
|
44
|
+
|
|
45
|
+
<TOC/>
|
|
46
|
+
|
|
47
|
+
## Що таке Intlayer?
|
|
48
|
+
|
|
49
|
+
**Intlayer** — інноваційна open-source бібліотека для інтернаціоналізації (i18n), створена для спрощення підтримки багатомовності в сучасних веб-додатках.
|
|
50
|
+
|
|
51
|
+
З Intlayer ви можете:
|
|
52
|
+
|
|
53
|
+
- **Легко керувати перекладами** за допомогою декларативних словників на рівні компонентів.
|
|
54
|
+
- **Динамічно локалізувати метадані**, маршрути та контент.
|
|
55
|
+
- **Забезпечити підтримку TypeScript** за допомогою автогенерованих типів, що покращує автозаповнення та виявлення помилок.
|
|
56
|
+
- **Отримати вигоду від розширених можливостей**, таких як динамічне визначення та перемикання локалі.
|
|
57
|
+
- **Увімкнути маршрутизацію з урахуванням локалі** за допомогою конфігураційної системи маршрутизації React Router v7.
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## Покрокове керівництво з налаштування Intlayer у застосунку на React Router v7
|
|
62
|
+
|
|
63
|
+
<iframe
|
|
64
|
+
src="https://stackblitz.com/github/aymericzip/intlayer-react-router-v7-template?embed=1&ctl=1&file=intlayer.config.ts"
|
|
65
|
+
className="m-auto overflow-hidden rounded-lg border-0 max-md:size-full max-md:h-[700px] md:aspect-16/9 md:w-full"
|
|
66
|
+
title="Демо CodeSandbox — як інтернаціоналізувати ваш застосунок за допомогою Intlayer"
|
|
67
|
+
sandbox="allow-forms allow-modals allow-popups allow-presentation allow-same-origin allow-scripts"
|
|
68
|
+
loading="lazy"
|
|
69
|
+
/>
|
|
70
|
+
|
|
71
|
+
### Крок 1: Встановлення залежностей
|
|
72
|
+
|
|
73
|
+
Встановіть необхідні пакети, використовуючи ваш улюблений package manager:
|
|
74
|
+
|
|
75
|
+
```bash packageManager="npm"
|
|
76
|
+
npm install intlayer react-intlayer
|
|
77
|
+
npm install vite-intlayer --save-dev
|
|
78
|
+
npx intlayer init
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
```bash packageManager="pnpm"
|
|
82
|
+
pnpm add intlayer react-intlayer
|
|
83
|
+
pnpm add vite-intlayer --save-dev
|
|
84
|
+
pnpm intlayer init
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
```bash packageManager="yarn"
|
|
88
|
+
yarn add intlayer react-intlayer
|
|
89
|
+
yarn add vite-intlayer --save-dev
|
|
90
|
+
yarn intlayer init
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
```bash packageManager="bun"
|
|
94
|
+
bun add intlayer react-intlayer
|
|
95
|
+
bun add vite-intlayer --dev
|
|
96
|
+
bunx intlayer init
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
- **intlayer**
|
|
100
|
+
|
|
101
|
+
Базовий пакет, який надає інструменти інтернаціоналізації для керування конфігурацією, перекладів, [оголошення вмісту](https://github.com/aymericzip/intlayer/blob/main/docs/docs/uk/dictionary/content_file.md), транспіляції та [команд CLI](https://github.com/aymericzip/intlayer/blob/main/docs/docs/uk/cli/index.md).
|
|
102
|
+
|
|
103
|
+
- **react-intlayer**
|
|
104
|
+
Пакет, який інтегрує Intlayer у React-додаток. Він забезпечує провайдери контексту та хуки для інтернаціоналізації в React.
|
|
105
|
+
|
|
106
|
+
- **vite-intlayer**
|
|
107
|
+
Містить Vite-плагін для інтеграції Intlayer з [зборщиком Vite](https://vite.dev/guide/why.html#why-bundle-for-production), а також middleware для визначення переважної локалі користувача, керування cookie та обробки перенаправлень URL.
|
|
108
|
+
|
|
109
|
+
### Крок 2: Конфігурація вашого проєкту
|
|
110
|
+
|
|
111
|
+
## Покроковий посібник зі встановлення Intlayer у застосунок React Router v7 із маршрутами на основі файлової системи
|
|
112
|
+
|
|
113
|
+
<Tab defaultTab="video">
|
|
114
|
+
<TabItem label="Відео" value="video">
|
|
115
|
+
|
|
116
|
+
<iframe title="Як перекласти ваш застосунок React Router v7 за допомогою 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/dS9L7uJeak4?autoplay=0&origin=http://intlayer.org&controls=0&rel=1"/>
|
|
117
|
+
|
|
118
|
+
</TabItem>
|
|
119
|
+
<TabItem label="Код" value="code">
|
|
120
|
+
|
|
121
|
+
<iframe
|
|
122
|
+
src="https://stackblitz.com/github/aymericzip/intlayer-react-router-v7-template?embed=1&ctl=1&file=intlayer.config.ts"
|
|
123
|
+
className="m-auto overflow-hidden rounded-lg border-0 max-md:size-full max-md:h-[700px] md:aspect-16/9 md:w-full"
|
|
124
|
+
title="Демо CodeSandbox — Як інтернаціоналізувати ваш застосунок за допомогою Intlayer"
|
|
125
|
+
sandbox="allow-forms allow-modals allow-popups allow-presentation allow-same-origin allow-scripts"
|
|
126
|
+
loading="lazy"
|
|
127
|
+
/>
|
|
128
|
+
|
|
129
|
+
</TabItem>
|
|
130
|
+
</Tab>
|
|
131
|
+
|
|
132
|
+
Перегляньте [Шаблон застосунку](https://github.com/aymericzip/intlayer-react-router-v7-template) на GitHub.
|
|
133
|
+
|
|
134
|
+
Створіть конфігураційний файл для налаштування мов вашого застосунку:
|
|
135
|
+
|
|
136
|
+
```typescript fileName="intlayer.config.ts" codeFormat="typescript"
|
|
137
|
+
import { type IntlayerConfig, Locales } from "intlayer";
|
|
138
|
+
|
|
139
|
+
const config: IntlayerConfig = {
|
|
140
|
+
internationalization: {
|
|
141
|
+
defaultLocale: Locales.ENGLISH,
|
|
142
|
+
locales: [Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH],
|
|
143
|
+
},
|
|
144
|
+
};
|
|
145
|
+
|
|
146
|
+
export default config;
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
```javascript fileName="intlayer.config.mjs" codeFormat="esm"
|
|
150
|
+
import { Locales } from "intlayer";
|
|
151
|
+
|
|
152
|
+
/** @type {import('intlayer').IntlayerConfig} */
|
|
153
|
+
const config = {
|
|
154
|
+
internationalization: {
|
|
155
|
+
defaultLocale: Locales.ENGLISH,
|
|
156
|
+
locales: [Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH],
|
|
157
|
+
},
|
|
158
|
+
};
|
|
159
|
+
|
|
160
|
+
export default config;
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
```javascript fileName="intlayer.config.cjs" codeFormat="commonjs"
|
|
164
|
+
const { Locales } = require("intlayer");
|
|
165
|
+
|
|
166
|
+
/** @type {import('intlayer').IntlayerConfig} */
|
|
167
|
+
const config = {
|
|
168
|
+
internationalization: {
|
|
169
|
+
defaultLocale: Locales.ENGLISH,
|
|
170
|
+
locales: [Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH],
|
|
171
|
+
},
|
|
172
|
+
};
|
|
173
|
+
|
|
174
|
+
module.exports = config;
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
> Через цей файл конфігурації ви можете налаштувати локалізовані URL-адреси, перенаправлення через middleware, назви cookie, розташування та розширення ваших декларацій контенту, вимкнути логи Intlayer в консолі та інше. Для повного переліку доступних параметрів див. [документацію з конфігурації](https://github.com/aymericzip/intlayer/blob/main/docs/docs/uk/configuration.md).
|
|
178
|
+
|
|
179
|
+
### Крок 3: Інтеграція Intlayer у вашу конфігурацію Vite
|
|
180
|
+
|
|
181
|
+
Додайте плагін intlayer у вашу конфігурацію:
|
|
182
|
+
|
|
183
|
+
```typescript fileName="vite.config.ts"
|
|
184
|
+
import { reactRouter } from "@react-router/dev/vite";
|
|
185
|
+
import { defineConfig } from "vite";
|
|
186
|
+
import { intlayer } from "vite-intlayer";
|
|
187
|
+
import tsconfigPaths from "vite-tsconfig-paths";
|
|
188
|
+
|
|
189
|
+
export default defineConfig({
|
|
190
|
+
plugins: [reactRouter(), tsconfigPaths(), intlayer()],
|
|
191
|
+
});
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
> Плагін Vite `intlayer()` використовується для інтеграції Intlayer з Vite. Він забезпечує побудову файлів декларацій контенту та відстежує їх у режимі розробки. Він визначає змінні середовища Intlayer у застосунку Vite. Додатково надає aliases для оптимізації продуктивності.
|
|
195
|
+
|
|
196
|
+
### Крок 4: Налаштуйте маршрути React Router v7
|
|
197
|
+
|
|
198
|
+
Налаштуйте конфігурацію маршрутизації для маршрутів, які враховують локаль:
|
|
199
|
+
|
|
200
|
+
```typescript fileName="app/routes.ts"
|
|
201
|
+
import { layout, route, type RouteConfig } from "@react-router/dev/routes";
|
|
202
|
+
|
|
203
|
+
export default [
|
|
204
|
+
route("/:lang?", "routes/page.tsx"), // Локалізована домашня сторінка
|
|
205
|
+
route("/:lang?/about", "routes/about/page.tsx"), // Локалізована сторінка 'about'
|
|
206
|
+
] satisfies RouteConfig;
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
### Крок 5: Створіть компоненти layout
|
|
210
|
+
|
|
211
|
+
Налаштуйте свій root layout та layout-и для кожної локалі:
|
|
212
|
+
|
|
213
|
+
#### Кореневий layout
|
|
214
|
+
|
|
215
|
+
```tsx fileName="app/root.tsx"
|
|
216
|
+
import { getLocaleFromPath } from "intlayer";
|
|
217
|
+
import { IntlayerProvider } from "react-intlayer";
|
|
218
|
+
import {
|
|
219
|
+
data,
|
|
220
|
+
Meta,
|
|
221
|
+
Scripts,
|
|
222
|
+
ScrollRestoration,
|
|
223
|
+
useLoaderData,
|
|
224
|
+
} from "react-router";
|
|
225
|
+
import type { Route } from "./+types/root";
|
|
226
|
+
|
|
227
|
+
// ... Код App, links та ErrorBoundary без змін
|
|
228
|
+
|
|
229
|
+
export async function loader({ request }: Route.LoaderArgs) {
|
|
230
|
+
const locale = getLocaleFromPath(request.url);
|
|
231
|
+
|
|
232
|
+
if (!locale) {
|
|
233
|
+
throw data("Мова не підтримується", { status: 404 });
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
return { locale };
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
export function Layout({
|
|
240
|
+
children,
|
|
241
|
+
}: { children: React.ReactNode } & Route.ComponentProps) {
|
|
242
|
+
const data = useLoaderData<typeof loader>();
|
|
243
|
+
const { locale } = data ?? {};
|
|
244
|
+
|
|
245
|
+
return (
|
|
246
|
+
<html lang={locale}>
|
|
247
|
+
<head>
|
|
248
|
+
<meta charSet="utf-8" />
|
|
249
|
+
<meta content="width=device-width, initial-scale=1" name="viewport" />
|
|
250
|
+
<Meta />
|
|
251
|
+
<Links />
|
|
252
|
+
</head>
|
|
253
|
+
<body>
|
|
254
|
+
<IntlayerProvider locale={locale}>{children}</IntlayerProvider>
|
|
255
|
+
<ScrollRestoration />
|
|
256
|
+
<Scripts />
|
|
257
|
+
</body>
|
|
258
|
+
</html>
|
|
259
|
+
);
|
|
260
|
+
}
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
### Крок 6: Оголосіть ваш контент
|
|
264
|
+
|
|
265
|
+
Створіть і керуйте деклараціями контенту для збереження перекладів:
|
|
266
|
+
|
|
267
|
+
```tsx fileName="app/routes/[lang]/page.content.ts"
|
|
268
|
+
import { t, type Dictionary } from "intlayer";
|
|
269
|
+
|
|
270
|
+
const pageContent = {
|
|
271
|
+
key: "page",
|
|
272
|
+
content: {
|
|
273
|
+
title: t({
|
|
274
|
+
uk: "Ласкаво просимо до React Router v7 + Intlayer",
|
|
275
|
+
en: "Welcome to React Router v7 + Intlayer",
|
|
276
|
+
es: "Bienvenido a React Router v7 + Intlayer",
|
|
277
|
+
fr: "Bienvenue sur React Router v7 + Intlayer",
|
|
278
|
+
}),
|
|
279
|
+
description: t({
|
|
280
|
+
uk: "Створюйте багатомовні застосунки легко з React Router v7 та Intlayer.",
|
|
281
|
+
en: "Build multilingual applications with ease using React Router v7 and Intlayer.",
|
|
282
|
+
es: "Cree aplicaciones multilingües fácilmente usando React Router v7 y Intlayer.",
|
|
283
|
+
fr: "Créez des applications multilingues facilement avec React Router v7 et Intlayer.",
|
|
284
|
+
}),
|
|
285
|
+
aboutLink: t({
|
|
286
|
+
uk: "Дізнатися про нас",
|
|
287
|
+
en: "Learn About Us",
|
|
288
|
+
es: "Aprender Sobre Nosotros",
|
|
289
|
+
fr: "En savoir plus sur nous",
|
|
290
|
+
}),
|
|
291
|
+
homeLink: t({
|
|
292
|
+
uk: "Головна",
|
|
293
|
+
en: "Home",
|
|
294
|
+
es: "Inicio",
|
|
295
|
+
fr: "Accueil",
|
|
296
|
+
}),
|
|
297
|
+
},
|
|
298
|
+
} satisfies Dictionary;
|
|
299
|
+
|
|
300
|
+
export default pageContent;
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
> Ваші декларації контенту можуть бути визначені будь-де у вашому застосунку, якщо вони поміщені до директорії `contentDir` (за замовчуванням `./app`). І вони повинні відповідати розширенню файлу декларацій контенту (за замовчуванням `.content.{json,ts,tsx,js,jsx,mjs,mjx,cjs,cjx}`).
|
|
304
|
+
|
|
305
|
+
> Для докладнішої інформації див. [документацію з декларацій контенту](https://github.com/aymericzip/intlayer/blob/main/docs/docs/{{locale}}/dictionary/content_file.md).
|
|
306
|
+
|
|
307
|
+
### Крок 7: Створіть компоненти, які враховують локаль
|
|
308
|
+
|
|
309
|
+
Створіть компонент `LocalizedLink` для навігації з урахуванням локалі:
|
|
310
|
+
|
|
311
|
+
```tsx fileName="app/components/localized-link.tsx"
|
|
312
|
+
import type { FC } from "react";
|
|
313
|
+
|
|
314
|
+
import { getLocalizedUrl, type LocalesValues } from "intlayer";
|
|
315
|
+
import { useLocale } from "react-intlayer";
|
|
316
|
+
import { Link, type LinkProps, type To } from "react-router";
|
|
317
|
+
|
|
318
|
+
const isExternalLink = (to: string) => /^(https?:)?\/\//.test(to);
|
|
319
|
+
|
|
320
|
+
export const locacalizeTo = (to: To, locale: LocalesValues): To => {
|
|
321
|
+
if (typeof to === "string") {
|
|
322
|
+
if (isExternalLink(to)) {
|
|
323
|
+
return to;
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
return getLocalizedUrl(to, locale);
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
if (isExternalLink(to.pathname ?? "")) {
|
|
330
|
+
return to;
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
return {
|
|
334
|
+
...to,
|
|
335
|
+
pathname: getLocalizedUrl(to.pathname ?? "", locale),
|
|
336
|
+
};
|
|
337
|
+
};
|
|
338
|
+
|
|
339
|
+
export const LocalizedLink: FC<LinkProps> = (props) => {
|
|
340
|
+
const { locale } = useLocale();
|
|
341
|
+
|
|
342
|
+
return <Link {...props} to={locacalizeTo(props.to, locale)} />;
|
|
343
|
+
};
|
|
344
|
+
```
|
|
345
|
+
|
|
346
|
+
У разі, якщо ви хочете переходити на локалізовані маршрути, ви можете використати хук `useLocalizedNavigate`:
|
|
347
|
+
|
|
348
|
+
```tsx fileName="app/hooks/useLocalizedNavigate.ts"
|
|
349
|
+
import { useLocale } from "react-intlayer";
|
|
350
|
+
import { type NavigateOptions, type To, useNavigate } from "react-router";
|
|
351
|
+
|
|
352
|
+
import { locacalizeTo } from "~/components/localized-link";
|
|
353
|
+
|
|
354
|
+
export const useLocalizedNavigate = () => {
|
|
355
|
+
const navigate = useNavigate();
|
|
356
|
+
const { locale } = useLocale();
|
|
357
|
+
|
|
358
|
+
const localizedNavigate = (to: To, options?: NavigateOptions) => {
|
|
359
|
+
const localedTo = locacalizeTo(to, locale);
|
|
360
|
+
|
|
361
|
+
navigate(localedTo, options);
|
|
362
|
+
};
|
|
363
|
+
|
|
364
|
+
return localizedNavigate;
|
|
365
|
+
};
|
|
366
|
+
```
|
|
367
|
+
|
|
368
|
+
### Крок 8: Використання Intlayer на ваших сторінках
|
|
369
|
+
|
|
370
|
+
Отримуйте доступ до словників контенту у всьому вашому застосунку:
|
|
371
|
+
|
|
372
|
+
#### Локалізована домашня сторінка
|
|
373
|
+
|
|
374
|
+
```tsx fileName="app/routes/page.tsx"
|
|
375
|
+
import { getIntlayer, validatePrefix } from "intlayer";
|
|
376
|
+
import { useIntlayer } from "react-intlayer";
|
|
377
|
+
import { data } from "react-router";
|
|
378
|
+
|
|
379
|
+
import { LocaleSwitcher } from "~/components/locale-switcher";
|
|
380
|
+
|
|
381
|
+
import { Navbar } from "~/components/navbar";
|
|
382
|
+
import type { Route } from "./+types/page";
|
|
383
|
+
|
|
384
|
+
export const loader = ({ params }: Route.LoaderArgs) => {
|
|
385
|
+
const { locale } = params;
|
|
386
|
+
|
|
387
|
+
const { isValid } = validatePrefix(locale);
|
|
388
|
+
|
|
389
|
+
if (!isValid) {
|
|
390
|
+
throw data("Локаль не підтримується", { status: 404 });
|
|
391
|
+
}
|
|
392
|
+
};
|
|
393
|
+
|
|
394
|
+
export const meta: Route.MetaFunction = ({ params }) => {
|
|
395
|
+
const content = getIntlayer("page", params.locale);
|
|
396
|
+
|
|
397
|
+
return [
|
|
398
|
+
{ title: content.title },
|
|
399
|
+
{ content: content.description, name: "description" },
|
|
400
|
+
];
|
|
401
|
+
};
|
|
402
|
+
|
|
403
|
+
export default function Page() {
|
|
404
|
+
const { title, description, aboutLink } = useIntlayer("page");
|
|
405
|
+
|
|
406
|
+
return (
|
|
407
|
+
<div>
|
|
408
|
+
<h1>{title}</h1>
|
|
409
|
+
<p>{description}</p>
|
|
410
|
+
<nav>
|
|
411
|
+
<LocalizedLink to="/about">{aboutLink}</LocalizedLink>
|
|
412
|
+
</nav>
|
|
413
|
+
</div>
|
|
414
|
+
);
|
|
415
|
+
}
|
|
416
|
+
```
|
|
417
|
+
|
|
418
|
+
> Щоб дізнатися більше про хук `useIntlayer`, зверніться до [документації](https://github.com/aymericzip/intlayer/blob/main/docs/docs/uk/packages/react-intlayer/useIntlayer.md).
|
|
419
|
+
|
|
420
|
+
### Крок 9: Створіть компонент перемикача локалі
|
|
421
|
+
|
|
422
|
+
Створіть компонент, який дозволить користувачам змінювати мову:
|
|
423
|
+
|
|
424
|
+
```tsx fileName="app/components/locale-switcher.tsx"
|
|
425
|
+
import type { FC } from "react";
|
|
426
|
+
|
|
427
|
+
import {
|
|
428
|
+
getHTMLTextDir,
|
|
429
|
+
getLocaleName,
|
|
430
|
+
getLocalizedUrl,
|
|
431
|
+
getPathWithoutLocale,
|
|
432
|
+
} from "intlayer";
|
|
433
|
+
import { setLocaleInStorage, useIntlayer, useLocale } from "react-intlayer";
|
|
434
|
+
import { Link, useLocation } from "react-router";
|
|
435
|
+
|
|
436
|
+
export const LocaleSwitcher: FC = () => {
|
|
437
|
+
const { localeSwitcherLabel } = useIntlayer("locale-switcher");
|
|
438
|
+
const { pathname } = useLocation();
|
|
439
|
+
|
|
440
|
+
const { availableLocales, locale } = useLocale();
|
|
441
|
+
|
|
442
|
+
const pathWithoutLocale = getPathWithoutLocale(pathname);
|
|
443
|
+
|
|
444
|
+
return (
|
|
445
|
+
<ol>
|
|
446
|
+
{availableLocales.map((localeItem) => (
|
|
447
|
+
<li key={localeItem}>
|
|
448
|
+
<Link
|
|
449
|
+
aria-current={localeItem === locale ? "page" : undefined}
|
|
450
|
+
aria-label={`${localeSwitcherLabel.value} ${getLocaleName(localeItem)}`}
|
|
451
|
+
onClick={() => setLocale(localeItem)}
|
|
452
|
+
to={getLocalizedUrl(pathWithoutLocale, localeItem)}
|
|
453
|
+
>
|
|
454
|
+
<span>
|
|
455
|
+
{/* Локаль — напр. FR */}
|
|
456
|
+
{localeItem}
|
|
457
|
+
</span>
|
|
458
|
+
<span>
|
|
459
|
+
{/* Мова у власній локалі — напр., Français */}
|
|
460
|
+
{getLocaleName(localeItem, locale)}
|
|
461
|
+
</span>
|
|
462
|
+
<span dir={getHTMLTextDir(localeItem)} lang={localeItem}>
|
|
463
|
+
{/* Мова у поточній локалі — наприклад, Francés коли поточна локаль встановлена в Locales.SPANISH */}
|
|
464
|
+
{getLocaleName(localeItem)}
|
|
465
|
+
</span>
|
|
466
|
+
<span dir="ltr" lang={Locales.ENGLISH}>
|
|
467
|
+
{/* Мова англійською — напр., French */}
|
|
468
|
+
{getLocaleName(localeItem, Locales.ENGLISH)}
|
|
469
|
+
</span>
|
|
470
|
+
</Link>
|
|
471
|
+
</li>
|
|
472
|
+
))}
|
|
473
|
+
</ol>
|
|
474
|
+
);
|
|
475
|
+
};
|
|
476
|
+
```
|
|
477
|
+
|
|
478
|
+
> Щоб дізнатися більше про хук `useLocale`, зверніться до [документації](https://github.com/aymericzip/intlayer/blob/main/docs/docs/uk/packages/react-intlayer/useLocale.md).
|
|
479
|
+
|
|
480
|
+
### Крок 10: Додати керування атрибутами HTML (необов'язково)
|
|
481
|
+
|
|
482
|
+
Створіть хук для керування атрибутами lang та dir у HTML:
|
|
483
|
+
|
|
484
|
+
```tsx fileName="app/hooks/useI18nHTMLAttributes.tsx"
|
|
485
|
+
import { getHTMLTextDir } from "intlayer";
|
|
486
|
+
import { useEffect } from "react";
|
|
487
|
+
import { useLocale } from "react-intlayer";
|
|
488
|
+
|
|
489
|
+
export const useI18nHTMLAttributes = () => {
|
|
490
|
+
const { locale } = useLocale();
|
|
491
|
+
|
|
492
|
+
useEffect(() => {
|
|
493
|
+
document.documentElement.lang = locale;
|
|
494
|
+
document.documentElement.dir = getHTMLTextDir(locale);
|
|
495
|
+
}, [locale]);
|
|
496
|
+
};
|
|
497
|
+
```
|
|
498
|
+
|
|
499
|
+
Потім використайте його у вашому кореневому компоненті:
|
|
500
|
+
|
|
501
|
+
```tsx fileName="app/routes/layout.tsx"
|
|
502
|
+
import { Outlet } from "react-router";
|
|
503
|
+
import { IntlayerProvider } from "react-intlayer";
|
|
504
|
+
|
|
505
|
+
import { useI18nHTMLAttributes } from "app/hooks/useI18nHTMLAttributes"; // імпортуйте хук
|
|
506
|
+
|
|
507
|
+
export default function RootLayout() {
|
|
508
|
+
useI18nHTMLAttributes(); // виклик хука
|
|
509
|
+
|
|
510
|
+
return (
|
|
511
|
+
<IntlayerProvider>
|
|
512
|
+
<Outlet />
|
|
513
|
+
</IntlayerProvider>
|
|
514
|
+
);
|
|
515
|
+
}
|
|
516
|
+
```
|
|
517
|
+
|
|
518
|
+
### Крок 11: Додати middleware (необов'язково)
|
|
519
|
+
|
|
520
|
+
Ви також можете використовувати `intlayerProxy` для додавання маршрутизації на серверній стороні у ваш застосунок. Цей плагін автоматично визначає поточну locale на основі URL і встановлює відповідний cookie для locale. Якщо locale не вказано, плагін визначить найбільш підходящу locale на основі мовних налаштувань браузера користувача. Якщо ж жодну locale не буде виявлено, відбудеться перенаправлення на локаль за замовчуванням.
|
|
521
|
+
|
|
522
|
+
> Зауважте, що для використання `intlayerProxy` у production потрібно перемістити пакет `vite-intlayer` з `devDependencies` до `dependencies`.
|
|
523
|
+
|
|
524
|
+
```typescript {3,7} fileName="vite.config.ts"
|
|
525
|
+
import { defineConfig } from "vite";
|
|
526
|
+
import react from "@vitejs/plugin-react-swc";
|
|
527
|
+
import { intlayer, intlayerProxy } from "vite-intlayer";
|
|
528
|
+
|
|
529
|
+
// https://vitejs.dev/config/
|
|
530
|
+
export default defineConfig({
|
|
531
|
+
plugins: [react(), intlayer(), intlayerProxy()],
|
|
532
|
+
});
|
|
533
|
+
```
|
|
534
|
+
|
|
535
|
+
---
|
|
536
|
+
|
|
537
|
+
## Налаштування TypeScript
|
|
538
|
+
|
|
539
|
+
Intlayer використовує module augmentation, щоб отримати переваги TypeScript і зробити вашу codebase надійнішою.
|
|
540
|
+
|
|
541
|
+
Переконайтеся, що ваша конфігурація TypeScript включає автогенеровані типи:
|
|
542
|
+
|
|
543
|
+
```json5 fileName="tsconfig.json"
|
|
544
|
+
{
|
|
545
|
+
// ... ваші існуючі налаштування
|
|
546
|
+
include: [
|
|
547
|
+
// ... ваші існуючі includes
|
|
548
|
+
".intlayer/**/*.ts", // Включити автогенеровані типи
|
|
549
|
+
],
|
|
550
|
+
}
|
|
551
|
+
```
|
|
552
|
+
|
|
553
|
+
---
|
|
554
|
+
|
|
555
|
+
## Конфігурація Git
|
|
556
|
+
|
|
557
|
+
Рекомендується ігнорувати файли, згенеровані Intlayer. Це дозволить уникнути їх додавання до вашого репозиторію Git.
|
|
558
|
+
|
|
559
|
+
Для цього ви можете додати наступні інструкції до файлу `.gitignore`:
|
|
560
|
+
|
|
561
|
+
```plaintext fileName=".gitignore"
|
|
562
|
+
# Ігнорувати файли, згенеровані Intlayer
|
|
563
|
+
.intlayer
|
|
564
|
+
```
|
|
565
|
+
|
|
566
|
+
---
|
|
567
|
+
|
|
568
|
+
## Розширення VS Code
|
|
569
|
+
|
|
570
|
+
Щоб покращити досвід розробки з Intlayer, ви можете встановити офіційне розширення **Intlayer VS Code Extension**.
|
|
571
|
+
|
|
572
|
+
[Встановити з VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=intlayer.intlayer-vs-code-extension)
|
|
573
|
+
|
|
574
|
+
Це розширення надає:
|
|
575
|
+
|
|
576
|
+
- **Автодоповнення** для ключів перекладу.
|
|
577
|
+
- **Виявлення помилок у режимі реального часу** для відсутніх перекладів.
|
|
578
|
+
- **Вбудований перегляд** перекладеного вмісту.
|
|
579
|
+
- **Швидкі дії** для простого створення та оновлення перекладів.
|
|
580
|
+
|
|
581
|
+
Для отримання детальнішої інформації про використання розширення див. [документацію Intlayer VS Code Extension](https://intlayer.org/doc/vs-code-extension).
|
|
582
|
+
|
|
583
|
+
---
|
|
584
|
+
|
|
585
|
+
## Подальші кроки
|
|
586
|
+
|
|
587
|
+
Щоб рухатися далі, ви можете реалізувати [візуальний редактор](https://github.com/aymericzip/intlayer/blob/main/docs/docs/uk/intlayer_visual_editor.md) або винести ваш контент, використовуючи [CMS](https://github.com/aymericzip/intlayer/blob/main/docs/docs/uk/intlayer_CMS.md).
|
|
588
|
+
|
|
589
|
+
---
|
|
590
|
+
|
|
591
|
+
## Посилання на документацію
|
|
592
|
+
|
|
593
|
+
- [Документація Intlayer](https://intlayer.org)
|
|
594
|
+
- [Документація React Router v7](https://reactrouter.com/)
|
|
595
|
+
- [Хук useIntlayer](https://github.com/aymericzip/intlayer/blob/main/docs/docs/uk/packages/react-intlayer/useIntlayer.md)
|
|
596
|
+
- [Хук useLocale](https://github.com/aymericzip/intlayer/blob/main/docs/docs/uk/packages/react-intlayer/useLocale.md)
|
|
597
|
+
- [Оголошення контенту](https://github.com/aymericzip/intlayer/blob/main/docs/docs/uk/dictionary/content_file.md)
|
|
598
|
+
- [Конфігурація](https://github.com/aymericzip/intlayer/blob/main/docs/docs/uk/configuration.md)
|
|
599
|
+
|
|
600
|
+
Цей всебічний посібник містить усе необхідне для інтеграції Intlayer з React Router v7, щоб отримати повністю інтернаціоналізований додаток з маршрутизацією, яка враховує локаль, та підтримкою TypeScript.
|