@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,520 @@
|
|
|
1
|
+
---
|
|
2
|
+
createdAt: 2025-04-18
|
|
3
|
+
updatedAt: 2025-12-30
|
|
4
|
+
title: "Як перекласти ваш додаток на Vite та Svelte — посібник i18n 2026"
|
|
5
|
+
description: "Дізнайтеся, як зробити ваш вебсайт на Vite та Svelte багатомовним. Дотримуйтеся документації, щоб інтернаціоналізувати (i18n) і перекласти його."
|
|
6
|
+
keywords:
|
|
7
|
+
- Інтернаціоналізація
|
|
8
|
+
- Документація
|
|
9
|
+
- Intlayer
|
|
10
|
+
- Vite
|
|
11
|
+
- Svelte
|
|
12
|
+
- JavaScript
|
|
13
|
+
slugs:
|
|
14
|
+
- doc
|
|
15
|
+
- environment
|
|
16
|
+
- vite-and-svelte
|
|
17
|
+
applicationTemplate: https://github.com/aymericzip/intlayer-vite-svelte-template
|
|
18
|
+
history:
|
|
19
|
+
- version: 7.5.9
|
|
20
|
+
date: 2025-12-30
|
|
21
|
+
changes: Додано команду init
|
|
22
|
+
- version: 5.5.11
|
|
23
|
+
date: 2025-11-19
|
|
24
|
+
changes: Оновлено документацію
|
|
25
|
+
- version: 5.5.10
|
|
26
|
+
date: 2025-06-29
|
|
27
|
+
changes: Ініціалізовано історію
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
# Перекладіть ваш вебсайт на Vite та Svelte за допомогою Intlayer | Інтернаціоналізація (i18n)
|
|
31
|
+
|
|
32
|
+
## Зміст
|
|
33
|
+
|
|
34
|
+
<TOC/>
|
|
35
|
+
|
|
36
|
+
## Що таке Intlayer?
|
|
37
|
+
|
|
38
|
+
**Intlayer** — це інноваційна open-source бібліотека для інтернаціоналізації (i18n), створена для спрощення підтримки багатомовності в сучасних вебдодатках.
|
|
39
|
+
|
|
40
|
+
З Intlayer ви можете:
|
|
41
|
+
|
|
42
|
+
- **Легко керувати перекладами** за допомогою декларативних словників на рівні компонентів.
|
|
43
|
+
- **Динамічно локалізувати метадані, маршрути й вміст.**
|
|
44
|
+
- **Забезпечити підтримку TypeScript** за допомогою автогенерованих типів, що покращує автодоповнення та виявлення помилок.
|
|
45
|
+
- **Скористатися розширеними можливостями**, такими як динамічне визначення та перемикання локалі.
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## Покрокове керівництво зі встановлення Intlayer у Vite та Svelte додаток
|
|
50
|
+
|
|
51
|
+
<iframe
|
|
52
|
+
src="https://stackblitz.com/github/aymericzip/intlayer-vite-react-template?embed=1&ctl=1&file=intlayer.config.ts"
|
|
53
|
+
className="m-auto overflow-hidden rounded-lg border-0 max-md:size-full max-md:h-[700px] md:aspect-16/9 md:w-full"
|
|
54
|
+
title="Demo CodeSandbox - How to Internationalize your application using Intlayer"
|
|
55
|
+
sandbox="allow-forms allow-modals allow-popups allow-presentation allow-same-origin allow-scripts"
|
|
56
|
+
loading="lazy"
|
|
57
|
+
/>
|
|
58
|
+
|
|
59
|
+
Перегляньте [Application Template](https://github.com/aymericzip/intlayer-vite-svelte-template) на GitHub.
|
|
60
|
+
|
|
61
|
+
### Крок 1: Встановлення залежностей
|
|
62
|
+
|
|
63
|
+
Встановіть необхідні пакети за допомогою npm:
|
|
64
|
+
|
|
65
|
+
```bash packageManager="npm"
|
|
66
|
+
npm install intlayer svelte-intlayer
|
|
67
|
+
npm install vite-intlayer --save-dev
|
|
68
|
+
npx intlayer init
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
```bash packageManager="pnpm"
|
|
72
|
+
pnpm add intlayer svelte-intlayer
|
|
73
|
+
pnpm add vite-intlayer --save-dev
|
|
74
|
+
pnpm intlayer init
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
```bash packageManager="yarn"
|
|
78
|
+
yarn add intlayer svelte-intlayer
|
|
79
|
+
yarn add vite-intlayer --save-dev
|
|
80
|
+
yarn intlayer init
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
```bash packageManager="bun"
|
|
84
|
+
bun add intlayer svelte-intlayer
|
|
85
|
+
bun add vite-intlayer --save-dev
|
|
86
|
+
bunx intlayer init
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
- **intlayer**
|
|
90
|
+
|
|
91
|
+
Основний пакет, який надає інструменти для інтернаціоналізації: управління конфігурацією, переклади, [оголошення контенту](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).
|
|
92
|
+
|
|
93
|
+
- **svelte-intlayer**
|
|
94
|
+
Пакет, який інтегрує Intlayer у Svelte-додаток. Він надає провайдери контексту та хуки для інтернаціоналізації у Svelte.
|
|
95
|
+
|
|
96
|
+
- **vite-intlayer**
|
|
97
|
+
Містить плагін Vite для інтеграції Intlayer з [Vite bundler](https://vite.dev/guide/why.html#why-bundle-for-production), а також middleware для виявлення переважної мови користувача, керування cookies та обробки перенаправлень URL.
|
|
98
|
+
|
|
99
|
+
### Крок 2: Конфігурація вашого проєкту
|
|
100
|
+
|
|
101
|
+
Створіть конфігураційний файл для налаштування мов вашого застосунку:
|
|
102
|
+
|
|
103
|
+
```typescript fileName="intlayer.config.ts"
|
|
104
|
+
import { Locales, type IntlayerConfig } from "intlayer";
|
|
105
|
+
|
|
106
|
+
const config: IntlayerConfig = {
|
|
107
|
+
internationalization: {
|
|
108
|
+
locales: [
|
|
109
|
+
Locales.ENGLISH,
|
|
110
|
+
Locales.FRENCH,
|
|
111
|
+
Locales.SPANISH,
|
|
112
|
+
// Your other locales
|
|
113
|
+
],
|
|
114
|
+
defaultLocale: Locales.ENGLISH,
|
|
115
|
+
},
|
|
116
|
+
};
|
|
117
|
+
|
|
118
|
+
export default config;
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
> Через цей конфігураційний файл ви можете налаштувати локалізовані URL-адреси, перенаправлення в middleware, назви cookie, розташування та розширення ваших декларацій контенту, вимкнути логи Intlayer у консолі та інше. Для повного списку доступних параметрів зверніться до [документації з конфігурації](https://github.com/aymericzip/intlayer/blob/main/docs/docs/uk/configuration.md).
|
|
122
|
+
|
|
123
|
+
### Крок 3: Інтеграція Intlayer у конфігурацію Vite
|
|
124
|
+
|
|
125
|
+
Додайте плагін intlayer до вашої конфігурації.
|
|
126
|
+
|
|
127
|
+
```typescript fileName="vite.config.ts"
|
|
128
|
+
import { defineConfig } from "vite";
|
|
129
|
+
import { svelte } from "@sveltejs/vite-plugin-svelte";
|
|
130
|
+
import { intlayer } from "vite-intlayer";
|
|
131
|
+
|
|
132
|
+
// Документація конфігурації: https://vitejs.dev/config/
|
|
133
|
+
export default defineConfig({
|
|
134
|
+
plugins: [svelte(), intlayer()],
|
|
135
|
+
});
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
> Плагін Vite `intlayer()` використовується для інтеграції Intlayer з Vite. Він забезпечує побудову файлів декларацій контенту та відстежує їх у режимі розробки. Він визначає змінні середовища Intlayer у Vite-додатку. Додатково він надаєаліаси (aliases) для оптимізації продуктивності.
|
|
139
|
+
|
|
140
|
+
### Крок 4: Оголосіть свій контент
|
|
141
|
+
|
|
142
|
+
Створюйте та керуйте деклараціями контенту для зберігання перекладів:
|
|
143
|
+
|
|
144
|
+
```tsx fileName="src/app.content.tsx" contentDeclarationFormat="typescript"
|
|
145
|
+
import { t, type Dictionary } from "intlayer";
|
|
146
|
+
|
|
147
|
+
const appContent = {
|
|
148
|
+
key: "app",
|
|
149
|
+
content: {
|
|
150
|
+
title: t({
|
|
151
|
+
uk: "Привіт, світ",
|
|
152
|
+
en: "Hello World",
|
|
153
|
+
fr: "Bonjour le monde",
|
|
154
|
+
es: "Hola mundo",
|
|
155
|
+
}),
|
|
156
|
+
},
|
|
157
|
+
} satisfies Dictionary;
|
|
158
|
+
|
|
159
|
+
export default appContent;
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
```javascript fileName="src/app.content.mjs" contentDeclarationFormat="esm"
|
|
163
|
+
import { t } from "intlayer";
|
|
164
|
+
|
|
165
|
+
/** @type {import('intlayer').Dictionary} */ // Тип: Dictionary з intlayer
|
|
166
|
+
const appContent = {
|
|
167
|
+
key: "app",
|
|
168
|
+
content: {
|
|
169
|
+
title: t({
|
|
170
|
+
uk: "Привіт, світ",
|
|
171
|
+
en: "Hello World",
|
|
172
|
+
fr: "Bonjour le monde",
|
|
173
|
+
es: "Hola mundo",
|
|
174
|
+
}),
|
|
175
|
+
},
|
|
176
|
+
};
|
|
177
|
+
|
|
178
|
+
export default appContent;
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
```javascript fileName="src/app.content.cjs" contentDeclarationFormat="commonjs"
|
|
182
|
+
const { t } = require("intlayer");
|
|
183
|
+
|
|
184
|
+
/** @type {import('intlayer').Dictionary} */ // Тип: Dictionary з intlayer
|
|
185
|
+
const appContent = {
|
|
186
|
+
key: "app",
|
|
187
|
+
content: {
|
|
188
|
+
title: t({
|
|
189
|
+
uk: "Привіт, світ",
|
|
190
|
+
en: "Hello World",
|
|
191
|
+
fr: "Bonjour le monde",
|
|
192
|
+
es: "Hola mundo",
|
|
193
|
+
}),
|
|
194
|
+
},
|
|
195
|
+
};
|
|
196
|
+
|
|
197
|
+
module.exports = appContent;
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
```json fileName="src/app.content.json" contentDeclarationFormat="json"
|
|
201
|
+
{
|
|
202
|
+
"$schema": "https://intlayer.org/schema.json",
|
|
203
|
+
"key": "app",
|
|
204
|
+
"content": {
|
|
205
|
+
"title": {
|
|
206
|
+
"nodeType": "translation",
|
|
207
|
+
"translation": {
|
|
208
|
+
"uk": "Привіт, світ",
|
|
209
|
+
"en": "Hello World",
|
|
210
|
+
"fr": "Bonjour le monde",
|
|
211
|
+
"es": "Hola mundo"
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
> Ваші декларації контенту можуть бути визначені будь-де у вашому додатку, за умови, що вони знаходяться в директорії `contentDir` (за замовчуванням `./src`). І вони повинні відповідати розширенню файлу декларації контенту (за замовчуванням `.content.{json,ts,tsx,js,jsx,mjs,mjx,cjs,cjx}`).
|
|
219
|
+
|
|
220
|
+
> Для докладнішої інформації зверніться до [документації щодо декларації контенту](https://github.com/aymericzip/intlayer/blob/main/docs/docs/uk/dictionary/content_file.md).
|
|
221
|
+
|
|
222
|
+
### Крок 5: Використання Intlayer у вашому коді
|
|
223
|
+
|
|
224
|
+
```svelte fileName="src/App.svelte"
|
|
225
|
+
<script>
|
|
226
|
+
import { useIntlayer } from "svelte-intlayer";
|
|
227
|
+
|
|
228
|
+
const content = useIntlayer("app");
|
|
229
|
+
</script>
|
|
230
|
+
|
|
231
|
+
<div>
|
|
232
|
+
|
|
233
|
+
|
|
234
|
+
<!-- Відобразити вміст як простий контент -->
|
|
235
|
+
<h1>{$content.title}</h1>
|
|
236
|
+
<!-- Зробити вміст редагованим за допомогою редактора -->
|
|
237
|
+
<h1><svelte:component this={$content.title} /></h1>
|
|
238
|
+
<!-- Відобразити вміст як рядок -->
|
|
239
|
+
<div aria-label={$content.title.value}></div>
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
### (Необов'язково) Крок 6: Змініть мову вашого вмісту
|
|
243
|
+
|
|
244
|
+
```svelte fileName="src/App.svelte"
|
|
245
|
+
<script lang="ts">
|
|
246
|
+
import { getLocaleName } from 'intlayer';
|
|
247
|
+
import { useLocale } from 'svelte-intlayer';
|
|
248
|
+
|
|
249
|
+
// Отримати інформацію про локаль та функцію setLocale
|
|
250
|
+
const { locale, availableLocales, setLocale } = useLocale();
|
|
251
|
+
|
|
252
|
+
// Обробка зміни локалі
|
|
253
|
+
const changeLocale = (event: Event) => {
|
|
254
|
+
const target = event.target as HTMLSelectElement;
|
|
255
|
+
const newLocale = target.value;
|
|
256
|
+
setLocale(newLocale);
|
|
257
|
+
};
|
|
258
|
+
</script>
|
|
259
|
+
|
|
260
|
+
<div>
|
|
261
|
+
<select value={$locale} on:change={changeLocale}>
|
|
262
|
+
{#each availableLocales ?? [] as loc}
|
|
263
|
+
<option value={loc}>
|
|
264
|
+
{getLocaleName(loc)}
|
|
265
|
+
</option>
|
|
266
|
+
{/each}
|
|
267
|
+
</select>
|
|
268
|
+
</div>
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
### (Необов'язково) Крок 7: Відображення Markdown
|
|
272
|
+
|
|
273
|
+
Intlayer підтримує рендеринг вмісту в Markdown безпосередньо у вашому Svelte-застосунку. За замовчуванням Markdown розглядається як звичайний текст. Щоб перетворити Markdown у багате HTML-представлення, ви можете інтегрувати `@humanspeak/svelte-markdown` або інший Markdown-парсер.
|
|
274
|
+
|
|
275
|
+
> Щоб дізнатися, як оголосити markdown-контент за допомогою пакета `intlayer`, див. [документацію з markdown](https://github.com/aymericzip/intlayer/tree/main/docs/uk/dictionary/markdown.md).
|
|
276
|
+
|
|
277
|
+
```svelte fileName="src/App.svelte"
|
|
278
|
+
<script>
|
|
279
|
+
import { setIntlayerMarkdown } from "svelte-intlayer";
|
|
280
|
+
|
|
281
|
+
setIntlayerMarkdown((markdown) =>
|
|
282
|
+
// відобразити вміст markdown як рядок
|
|
283
|
+
return markdown;
|
|
284
|
+
);
|
|
285
|
+
</script>
|
|
286
|
+
|
|
287
|
+
<h1>{$content.markdownContent}</h1>
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
> Ви також можете отримати доступ до даних front-matter вашого markdown за допомогою властивості `content.markdownContent.metadata.xxx`.
|
|
291
|
+
|
|
292
|
+
### (Необов'язково) Крок 8: Налаштування intlayer editor / CMS
|
|
293
|
+
|
|
294
|
+
Щоб налаштувати intlayer editor, дотримуйтесь [документації intlayer editor](https://github.com/aymericzip/intlayer/blob/main/docs/docs/uk/intlayer_visual_editor.md).
|
|
295
|
+
|
|
296
|
+
Щоб налаштувати intlayer CMS, дотримуйтесь [документації intlayer CMS](https://github.com/aymericzip/intlayer/blob/main/docs/docs/uk/intlayer_CMS.md).
|
|
297
|
+
|
|
298
|
+
Паралельно, у вашому Svelte-застосунку потрібно додати наступний рядок у layout або в корені застосунку:
|
|
299
|
+
|
|
300
|
+
```svelte fileName="src/layout.svelte"
|
|
301
|
+
import { useIntlayerEditor } from "svelte-intlayer";
|
|
302
|
+
|
|
303
|
+
useIntlayerEditor();
|
|
304
|
+
```
|
|
305
|
+
|
|
306
|
+
### (Необов'язково) Крок 7: Додайте локалізований Routing у ваш застосунок
|
|
307
|
+
|
|
308
|
+
Щоб обробляти локалізовану маршрутизацію в Svelte-застосунку, ви можете використовувати `svelte-spa-router` разом з `localeFlatMap` від Intlayer для генерації маршрутів для кожної локалі.
|
|
309
|
+
|
|
310
|
+
Спочатку встановіть `svelte-spa-router`:
|
|
311
|
+
|
|
312
|
+
```bash packageManager="npm"
|
|
313
|
+
npm install svelte-spa-router
|
|
314
|
+
npx intlayer init
|
|
315
|
+
```
|
|
316
|
+
|
|
317
|
+
```bash packageManager="pnpm"
|
|
318
|
+
pnpm add svelte-spa-router
|
|
319
|
+
pnpm intlayer init
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
```bash packageManager="yarn"
|
|
323
|
+
yarn add svelte-spa-router
|
|
324
|
+
yarn intlayer init
|
|
325
|
+
```
|
|
326
|
+
|
|
327
|
+
```bash packageManager="bun"
|
|
328
|
+
bun add svelte-spa-router
|
|
329
|
+
```
|
|
330
|
+
|
|
331
|
+
Then, create a `Router.svelte` file to define your routes:
|
|
332
|
+
|
|
333
|
+
```svelte fileName="src/Router.svelte"
|
|
334
|
+
<script lang="ts">
|
|
335
|
+
import { localeFlatMap } from "intlayer";
|
|
336
|
+
import Router from "svelte-spa-router";
|
|
337
|
+
import { wrap } from "svelte-spa-router/wrap";
|
|
338
|
+
import App from "./App.svelte";
|
|
339
|
+
|
|
340
|
+
const routes = Object.fromEntries(
|
|
341
|
+
localeFlatMap(({locale, urlPrefix}) => [
|
|
342
|
+
[
|
|
343
|
+
urlPrefix || '/',
|
|
344
|
+
wrap({
|
|
345
|
+
component: App as any,
|
|
346
|
+
props: {
|
|
347
|
+
locale,
|
|
348
|
+
},
|
|
349
|
+
}),
|
|
350
|
+
],
|
|
351
|
+
])
|
|
352
|
+
);
|
|
353
|
+
</script>
|
|
354
|
+
|
|
355
|
+
<Router {routes} />
|
|
356
|
+
```
|
|
357
|
+
|
|
358
|
+
Update your `main.ts` to mount the `Router` component instead of `App`:
|
|
359
|
+
|
|
360
|
+
```typescript fileName="src/main.ts"
|
|
361
|
+
import { mount } from "svelte";
|
|
362
|
+
import Router from "./Router.svelte";
|
|
363
|
+
|
|
364
|
+
const app = mount(Router, {
|
|
365
|
+
target: document.getElementById("app")!,
|
|
366
|
+
});
|
|
367
|
+
|
|
368
|
+
export default app;
|
|
369
|
+
```
|
|
370
|
+
|
|
371
|
+
Нарешті, оновіть ваш `App.svelte`, щоб приймати проп `locale` і використовувати його з `useIntlayer`:
|
|
372
|
+
|
|
373
|
+
```svelte fileName="src/App.svelte"
|
|
374
|
+
<script lang="ts">
|
|
375
|
+
import type { Locale } from 'intlayer';
|
|
376
|
+
import { useIntlayer } from 'svelte-intlayer';
|
|
377
|
+
import Counter from './lib/Counter.svelte';
|
|
378
|
+
import LocaleSwitcher from './lib/LocaleSwitcher.svelte';
|
|
379
|
+
|
|
380
|
+
export let locale: Locale;
|
|
381
|
+
|
|
382
|
+
$: content = useIntlayer('app', locale);
|
|
383
|
+
</script>
|
|
384
|
+
|
|
385
|
+
<main>
|
|
386
|
+
<div class="locale-switcher-container">
|
|
387
|
+
<LocaleSwitcher currentLocale={locale} />
|
|
388
|
+
</div>
|
|
389
|
+
|
|
390
|
+
<!-- ... решта вашого додатка ... -->
|
|
391
|
+
</main>
|
|
392
|
+
```
|
|
393
|
+
|
|
394
|
+
#### Налаштування маршрутизації на стороні сервера (необов'язково)
|
|
395
|
+
|
|
396
|
+
Паралельно ви також можете використати `intlayerProxy` для додавання маршрутизації на стороні сервера до вашого застосунку. Цей плагін автоматично визначатиме поточну локаль на основі URL і встановлюватиме відповідний cookie для локалі. Якщо локаль не вказана, плагін обере найвідповіднішу локаль на основі налаштувань мови браузера користувача. Якщо локаль не буде виявлена, плагін виконає перенаправлення на локаль за замовчуванням.
|
|
397
|
+
|
|
398
|
+
> Зауважте, що для використання `intlayerProxy` в production потрібно перемістити пакет `vite-intlayer` з `devDependencies` до `dependencies`.
|
|
399
|
+
|
|
400
|
+
```typescript {3,7} fileName="vite.config.ts" codeFormat="typescript"
|
|
401
|
+
import { defineConfig } from "vite";
|
|
402
|
+
import { svelte } from "@sveltejs/vite-plugin-svelte";
|
|
403
|
+
import { intlayer, intlayerProxy } from "vite-intlayer";
|
|
404
|
+
|
|
405
|
+
// https://vitejs.dev/config/ - конфігурація Vite
|
|
406
|
+
export default defineConfig({
|
|
407
|
+
plugins: [svelte(), intlayer(), intlayerProxy()],
|
|
408
|
+
});
|
|
409
|
+
```
|
|
410
|
+
|
|
411
|
+
```javascript {3,7} fileName="vite.config.mjs" codeFormat="esm"
|
|
412
|
+
import { defineConfig } from "vite";
|
|
413
|
+
import { svelte } from "@sveltejs/vite-plugin-svelte";
|
|
414
|
+
import { intlayer, intlayerProxy } from "vite-intlayer";
|
|
415
|
+
|
|
416
|
+
// https://vitejs.dev/config/ - конфігурація Vite
|
|
417
|
+
export default defineConfig({
|
|
418
|
+
plugins: [svelte(), intlayer(), intlayerProxy()],
|
|
419
|
+
});
|
|
420
|
+
```
|
|
421
|
+
|
|
422
|
+
```javascript {3,7} fileName="vite.config.cjs" codeFormat="commonjs"
|
|
423
|
+
const { defineConfig } = require("vite");
|
|
424
|
+
const { svelte } = require("@sveltejs/vite-plugin-svelte");
|
|
425
|
+
const { intlayer, intlayerProxy } = require("vite-intlayer");
|
|
426
|
+
|
|
427
|
+
// https://vitejs.dev/config/ - конфігурація Vite
|
|
428
|
+
module.exports = defineConfig({
|
|
429
|
+
plugins: [svelte(), intlayer(), intlayerProxy()],
|
|
430
|
+
});
|
|
431
|
+
```
|
|
432
|
+
|
|
433
|
+
### (Необов'язково) Крок 8: Зміна URL при зміні локалі
|
|
434
|
+
|
|
435
|
+
Щоб дозволити користувачам змінювати мову й відповідно оновлювати URL, ви можете створити компонент `LocaleSwitcher`. Цей компонент використовуватиме `getLocalizedUrl` з `intlayer` та `push` із `svelte-spa-router`.
|
|
436
|
+
|
|
437
|
+
```svelte fileName="src/lib/LocaleSwitcher.svelte"
|
|
438
|
+
<script lang="ts">
|
|
439
|
+
import { getLocaleName, getLocalizedUrl } from "intlayer";
|
|
440
|
+
import { useLocale } from "svelte-intlayer";
|
|
441
|
+
import { push } from "svelte-spa-router";
|
|
442
|
+
|
|
443
|
+
export let currentLocale: string | undefined = undefined;
|
|
444
|
+
|
|
445
|
+
// Отримати інформацію про локаль
|
|
446
|
+
const { locale, availableLocales } = useLocale();
|
|
447
|
+
|
|
448
|
+
// Обробка зміни локалі
|
|
449
|
+
const changeLocale = (event: Event) => {
|
|
450
|
+
const target = event.target as HTMLSelectElement;
|
|
451
|
+
const newLocale = target.value;
|
|
452
|
+
const currentUrl = window.location.pathname;
|
|
453
|
+
const url = getLocalizedUrl( currentUrl, newLocale);
|
|
454
|
+
push(url);
|
|
455
|
+
};
|
|
456
|
+
</script>
|
|
457
|
+
|
|
458
|
+
<div class="locale-switcher">
|
|
459
|
+
<select value={currentLocale ?? $locale} onchange={changeLocale}>
|
|
460
|
+
{#each availableLocales ?? [] as loc}
|
|
461
|
+
<option value={loc}>
|
|
462
|
+
{getLocaleName(loc)}
|
|
463
|
+
</option>
|
|
464
|
+
{/each}
|
|
465
|
+
</select>
|
|
466
|
+
</div>
|
|
467
|
+
```
|
|
468
|
+
|
|
469
|
+
### (Необов'язково) Крок 9: Інтернаціоналізовані посилання
|
|
470
|
+
|
|
471
|
+
Для SEO рекомендується додавати префікс локалі до ваших маршрутів (наприклад, `/about`, `/fr/about`).
|
|
472
|
+
|
|
473
|
+
```svelte fileName="src/lib/components/Link.svelte"
|
|
474
|
+
<script lang="ts">
|
|
475
|
+
import { getLocalizedUrl } from "intlayer";
|
|
476
|
+
import { useLocale } from 'svelte-intlayer';
|
|
477
|
+
|
|
478
|
+
export let href = "";
|
|
479
|
+
const { locale } = useLocale();
|
|
480
|
+
|
|
481
|
+
// Helper to prefix URL
|
|
482
|
+
$: localizedHref = getLocalizedUrl(href, $locale);
|
|
483
|
+
</script>
|
|
484
|
+
|
|
485
|
+
<a href={localizedHref}>
|
|
486
|
+
<slot />
|
|
487
|
+
</a>
|
|
488
|
+
```
|
|
489
|
+
|
|
490
|
+
### Конфігурація Git
|
|
491
|
+
|
|
492
|
+
Рекомендується ігнорувати файли, згенеровані Intlayer. Це дозволяє уникнути їх коміту до вашого Git-репозиторію.
|
|
493
|
+
|
|
494
|
+
Для цього можна додати наступні інструкції до файлу `.gitignore`:
|
|
495
|
+
|
|
496
|
+
```plaintext
|
|
497
|
+
# Ігнорувати файли, згенеровані Intlayer
|
|
498
|
+
.intlayer
|
|
499
|
+
```
|
|
500
|
+
|
|
501
|
+
### Розширення VS Code
|
|
502
|
+
|
|
503
|
+
Щоб покращити ваш досвід розробки з Intlayer, ви можете встановити офіційне **Intlayer VS Code Extension**.
|
|
504
|
+
|
|
505
|
+
[Встановити з VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=intlayer.intlayer-vs-code-extension)
|
|
506
|
+
|
|
507
|
+
Це розширення надає:
|
|
508
|
+
|
|
509
|
+
- **Автозаповнення** для ключів перекладу.
|
|
510
|
+
- **Виявлення помилок у реальному часі** для відсутніх перекладів.
|
|
511
|
+
- **Вбудовані попередні перегляди** перекладеного контенту.
|
|
512
|
+
- **Швидкі дії** для швидкого створення й оновлення перекладів.
|
|
513
|
+
|
|
514
|
+
Для детальнішої інформації про використання розширення зверніться до документації [розширення Intlayer для VS Code](https://intlayer.org/doc/vs-code-extension).
|
|
515
|
+
|
|
516
|
+
---
|
|
517
|
+
|
|
518
|
+
### Розширені можливості
|
|
519
|
+
|
|
520
|
+
Щоб рухатися далі, ви можете реалізувати [візуальний редактор](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).
|