@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
package/blog/uk/index.md
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
---
|
|
2
|
+
createdAt: 2024-24-12
|
|
3
|
+
updatedAt: 2025-06-29
|
|
4
|
+
title: Блог
|
|
5
|
+
description: Дізнайтеся про всі теми, пов'язані з Intlayer, інтернаціоналізацією та іншим
|
|
6
|
+
keywords:
|
|
7
|
+
- Intlayer
|
|
8
|
+
- Інтернаціоналізація
|
|
9
|
+
- Блог
|
|
10
|
+
- Next.js
|
|
11
|
+
- JavaScript
|
|
12
|
+
- React
|
|
13
|
+
slugs:
|
|
14
|
+
- blog
|
|
15
|
+
- search
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
# Інтернаціоналізація в JavaScript: розширення глобального охоплення та SEO
|
|
19
|
+
|
|
20
|
+
Ласкаво просимо до нашого блогу, присвяченого всьому, що стосується **інтернаціоналізації** для застосунків на JavaScript! Тут ми розглядаємо найкращі практики, стратегії та інструменти, які допомагають розробникам масштабувати свої цифрові продукти по всьому світу.
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## Чому інтернаціоналізація (i18n) важлива
|
|
25
|
+
|
|
26
|
+
У сьогоднішньому взаємозв’язаному світі користувачі очікують безшовного, локалізованого досвіду. Інтернаціоналізація (i18n) забезпечує можливість адаптації вашого веб-застосунку до різних мов і культурних особливостей. Впроваджуючи практики i18n з самого початку, ви відкриваєте для себе численні переваги, такі як:
|
|
27
|
+
|
|
28
|
+
1. **Покращений користувацький досвід:** Користувачам зручніше взаємодіяти з контентом рідною мовою.
|
|
29
|
+
2. **Ширше проникнення на ринку:** Наявність кількох мов допомагає виходити на нові регіони та розширювати базу користувачів.
|
|
30
|
+
3. **Покращена доступність:** Добре структурована i18n часто відповідає стандартам доступності, роблячи ваш додаток більш інклюзивним.
|
|
31
|
+
4. **Покращені SEO-показники:** Локалізований контент може підвищити вашу видимість у регіональних результатах пошуку.
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## Open-Source рішення для інтернаціоналізації
|
|
36
|
+
|
|
37
|
+
Створення інтернаціоналізованого додатка не має бути складним. Спільнота open-source пропонує багато потужних, добре підтримуваних інструментів і бібліотек, які спрощують локалізацію. Популярні рішення, такі як **react-intl**, **i18next** та **FormatJS**, надають гнучкі API та просту інтеграцію з сучасними JavaScript-фреймворками, такими як React, Vue і Angular.
|
|
38
|
+
|
|
39
|
+
### Ключові переваги open-source рішень
|
|
40
|
+
|
|
41
|
+
- **Гнучкість:** Бібліотеки, керовані спільнотою, швидко розвиваються і додають оновлення та нові функції відповідно до потреб.
|
|
42
|
+
- **Економія коштів:** Відсутність ліцензійних платежів, що спрощує тестування та масштабування вашого додатка.
|
|
43
|
+
- **Підтримка спільноти:** Великі спільноти зазвичай означають більше навчальних матеріалів, документації та готових плагінів.
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
## Оголошення та наступні кроки
|
|
48
|
+
|
|
49
|
+
Ми з радістю оголошуємо про майбутні підручники, найкращі практики та **кейси**, які покажуть, як оптимізувати ваші JavaScript-застосунки для глобальної аудиторії. Ось короткий огляд:
|
|
50
|
+
|
|
51
|
+
- **Поради з просунутої локалізації:** відточення pluralization, форматування дати/часу та динамічного контенту.
|
|
52
|
+
- **Оптимізація продуктивності:** мінімізація розмірів бандлів при підтримці кількох локалей.
|
|
53
|
+
- **Кейси від спільноти:** демонстрація реальних прикладів успішних i18n-реалізацій.
|
|
54
|
+
|
|
55
|
+
Слідкуйте за цими оновленнями та іншими матеріалами!
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
## Долучайтеся до нашого блогу!
|
|
60
|
+
|
|
61
|
+
Ми віримо в обмін знаннями, який ініціюється спільнотою. Якщо у вас є чудова ідея для публікації в блозі, пов'язана з інтернаціоналізацією, **SEO** або будь-якою іншою релевантною темою, нам буде приємно її почути. Ви можете надіслати Pull Request, додавши свою пропоновану статтю до нашого репозиторію на GitHub:
|
|
62
|
+
|
|
63
|
+
[**Надішліть свою публікацію тут**](https://github.com/aymericzip/intlayer/blob/main/docs/blog)
|
|
64
|
+
|
|
65
|
+
Ваші внески допомагають збагачувати цю платформу та розширювати можливості розробників у всьому світі.
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
**Дякуємо за увагу, і ласкаво просимо до нашої i18n-спільноти!** Слідкуйте за оновленнями, щоб отримувати більше ідей, порад і кращих практик щодо того, як вивести ваші JavaScript-застосунки на міжнародний рівень.
|
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
---
|
|
2
|
+
createdAt: 2024-12-24
|
|
3
|
+
updatedAt: 2025-06-29
|
|
4
|
+
title: SEO та інтернаціоналізація
|
|
5
|
+
description: Дізнайтеся, як оптимізувати ваш багатомовний вебсайт для пошукових систем та покращити SEO.
|
|
6
|
+
keywords:
|
|
7
|
+
- SEO
|
|
8
|
+
- Intlayer
|
|
9
|
+
- Інтернаціоналізація
|
|
10
|
+
- Блог
|
|
11
|
+
- Next.js
|
|
12
|
+
- JavaScript
|
|
13
|
+
- React
|
|
14
|
+
slugs:
|
|
15
|
+
- blog
|
|
16
|
+
- SEO-and-i18n
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
# SEO та I18n: остаточний посібник зі створення багатомовного вебсайту
|
|
20
|
+
|
|
21
|
+
Хочете охопити більше користувачів у світі? Зробити ваш вебсайт багатомовним — один із найкращих способів розширити аудиторію та покращити SEO (Search Engine Optimization). У цьому дописі блогу ми розкладемо по поличках основи міжнародного SEO, часто званого **i18n** (скорочення від "internationalization"), простими та зрозумілими словами. Ви дізнаєтеся про ключові рішення, які потрібно прийняти, як використовувати технічні елементи, такі як `hreflang`, і чому інструменти на кшталт **Intlayer** можуть спростити ваші багатомовні проєкти на Next.js.
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## 1. Що означає зробити ваш вебсайт багатомовним?
|
|
26
|
+
|
|
27
|
+
Багатомовний вебсайт пропонує свій вміст більш ніж однією мовою. Наприклад, у вас може бути англомовна версія (`example.com/en/`), франкомовна версія (`example.com/fr/`) та іспаномовна версія (`example.com/es/`). Такий підхід дозволяє пошуковим системам відображати користувачам відповідну мовну версію на основі їхніх уподобань або географічного розташування.
|
|
28
|
+
|
|
29
|
+
Коли зробити це правильно, ви створите значно зручніший досвід для користувачів, які не говорять англійською, що призведе до кращого залучення, вищих показників конверсії та покращення SEO в різних регіонах.
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## 2. Вибір правильної структури URL-адрес
|
|
34
|
+
|
|
35
|
+
Якщо ви вирішите мати кілька мовних версій, вам знадобиться чіткий і послідовний спосіб організувати URL-адреси сайту. Кожна мова (або регіон) повинна мати власну унікальну "адресу" в інтернеті. Нижче наведено три поширені способи структурування багатомовних сайтів:
|
|
36
|
+
|
|
37
|
+
1. Національні домени верхнього рівня (ccTLDs)
|
|
38
|
+
- Example: `example.fr`, `example.de`
|
|
39
|
+
- **Переваги:** Надсилає чіткий сигнал пошуковим системам щодо країни, на яку націлено вміст (наприклад, `.fr` = Франція).
|
|
40
|
+
- **Недоліки:** Управління кількома доменами може бути дорожчим і складнішим.
|
|
41
|
+
|
|
42
|
+
2. **Піддомени**
|
|
43
|
+
- **Example:** `fr.example.com`, `de.example.com`
|
|
44
|
+
- **Переваги:** Кожна мова "мешкає" на власному піддомені, що робить додавання або видалення мов відносно простим.
|
|
45
|
+
- **Недоліки:** Пошукові системи іноді трактують субдомени як окремі сайти, тому це може розпорошувати авторитет вашого головного домену.
|
|
46
|
+
|
|
47
|
+
3. **Підкаталоги (підпапки)**
|
|
48
|
+
- **Приклад:** `example.com/fr/`, `example.com/de/`
|
|
49
|
+
- **Переваги:** Легко керувати, і весь трафік спрямовується на один основний домен.
|
|
50
|
+
- **Недоліки:** Менш сильний сигнал для локального SEO порівняно з ccTLD (хоча за правильної реалізації це все одно ефективно).
|
|
51
|
+
|
|
52
|
+
> **Порада:** Якщо у вас глобальний бренд і ви хочете спростити управління, підкаталоги зазвичай працюють найкраще. Якщо ж ви орієнтуєтесь лише на одну-дві країни і хочете максимально підкреслити кожну з них, варто розглянути ccTLD.
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
## 3. Опановування таргетування мов за допомогою Hreflang
|
|
57
|
+
|
|
58
|
+
### 3.1. Що таке Hreflang?
|
|
59
|
+
|
|
60
|
+
Коли у вас є ідентичний або дуже схожий вміст кількома мовами, пошукові системи, такі як Google, можуть заплутатися щодо того, яку версію показувати користувачеві. **Hreflang** — це атрибут HTML, який вказує пошуковим системам, для якої мови (та регіону) призначена конкретна сторінка, а також які альтернативні мовні/регіональні сторінки існують.
|
|
61
|
+
|
|
62
|
+
### 3.2. Чому це важливо?
|
|
63
|
+
|
|
64
|
+
1. Це запобігає проблемам з **дублюванням контенту** (коли пошукові системи вважають, що ви публікуєте один і той же вміст кілька разів).
|
|
65
|
+
2. Це гарантує, що **франкомовні користувачі бачать французьку версію**, **іспаномовні користувачі бачать іспанську версію** та інші відповідні варіанти.
|
|
66
|
+
3. Це покращує загальний досвід користувача — підвищує залученість і покращує позиції в пошуковій видачі.
|
|
67
|
+
|
|
68
|
+
### 3.3. Як використовувати Hreflang у тегу `<head>`
|
|
69
|
+
|
|
70
|
+
У вашому HTML ви додасте щось на кшталт:
|
|
71
|
+
|
|
72
|
+
```html
|
|
73
|
+
<link rel="alternate" hreflang="en" href="https://example.com/en" />
|
|
74
|
+
<link rel="alternate" hreflang="fr" href="https://example.com/fr" />
|
|
75
|
+
<link rel="alternate" hreflang="es" href="https://example.com/es" />
|
|
76
|
+
<link rel="alternate" hreflang="x-default" href="https://example.com/en" />
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
- **`hreflang="en"`**: Вказує на англомовну версію сторінки.
|
|
80
|
+
- **`hreflang="fr"`**: Вказує на французьку версію сторінки.
|
|
81
|
+
- **`hreflang="es"`**: Вказує на іспаномовну версію сторінки.
|
|
82
|
+
- **`hreflang="x-default"`**: «fallback» — запасна мова або URL за замовчуванням, коли жодна з інших мов не відповідає вподобанням користувача.
|
|
83
|
+
|
|
84
|
+
> **Коротке зауваження:** Переконайтеся, що URL-адреси в цих тегах ведуть безпосередньо на фінальну сторінку, без будь-яких додаткових редиректів.
|
|
85
|
+
|
|
86
|
+
---
|
|
87
|
+
|
|
88
|
+
## 4. Робити контент справді «локальним» (не тільки перекладеним)
|
|
89
|
+
|
|
90
|
+
### 4.1. Локалізація vs. Переклад
|
|
91
|
+
|
|
92
|
+
- **Переклад** означає перетворення тексту з однієї мови на іншу дослівно.
|
|
93
|
+
- **Локалізація** означає адаптацію формату контенту, валюти, одиниць виміру та культурних відсилань для місцевої аудиторії. Наприклад, якщо ви орієнтуєтеся на Францію, ви використаєте `€` замість `$`, і, можливо, згадаєте місцеві свята чи регіонально-специфічні деталі.
|
|
94
|
+
|
|
95
|
+
### 4.2. Уникнення дубльованого контенту
|
|
96
|
+
|
|
97
|
+
Навіть за наявності якісних перекладів пошукові системи можуть позначити ваш сайт як такий, що містить дубльований контент, якщо сторінки надто схожі за структурою. hreflang допомагає пояснити, що ці сторінки не є дублікатами, а відрізняються мовною версією.
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
## 5. Необхідні технічні елементи SEO
|
|
102
|
+
|
|
103
|
+
### 5.1. Оголошення мови (`lang` і `dir`)
|
|
104
|
+
|
|
105
|
+
У тегові <html> ви можете вказати мову так:
|
|
106
|
+
|
|
107
|
+
```html
|
|
108
|
+
<html lang="en"></html>
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
- **`lang="en"`** допомагає браузерам та засобам доступності розпізнати мову.
|
|
112
|
+
|
|
113
|
+
Для мов, що пишуться справа наліво (наприклад, арабська або іврит), додайте:
|
|
114
|
+
|
|
115
|
+
```html
|
|
116
|
+
<html dir="rtl" lang="ar"></html>
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
- **`dir="rtl"`** задає напрямок тексту справа наліво.
|
|
120
|
+
|
|
121
|
+
### 5.2. Канонічні теги
|
|
122
|
+
|
|
123
|
+
Канонічні теги вказують пошуковим системам, яка сторінка є «оригіналом» або основною версією, якщо у вас є майже ідентичні сторінки. Зазвичай для мультимовних сайтів ви використовуєте **self-referencing** канонічний тег.
|
|
124
|
+
|
|
125
|
+
```html
|
|
126
|
+
<link rel="canonical" href="https://example.com/fr/produits" />
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
---
|
|
130
|
+
|
|
131
|
+
## 6. On-Page SEO у кількох мовах
|
|
132
|
+
|
|
133
|
+
### 6.1. Title & Meta Descriptions
|
|
134
|
+
|
|
135
|
+
- **Перекладені та оптимізовані** для кожної мови.
|
|
136
|
+
- Виконайте **дослідження ключових слів** для кожного ринку, оскільки те, що люди шукають англійською, може відрізнятися від пошукових запитів французькою чи іспанською.
|
|
137
|
+
|
|
138
|
+
### 6.2. Headers (H1, H2, H3)
|
|
139
|
+
|
|
140
|
+
Ваші заголовки мають відображати **локальні фрази** або **ключові слова** для кожного регіону. Не обмежуйтеся простим перекладом оригінального англійського заголовка через Google Translate.
|
|
141
|
+
|
|
142
|
+
### 6.3. Images & Media
|
|
143
|
+
|
|
144
|
+
- Локалізуйте alt-текст, підписи та імена файлів за потреби.
|
|
145
|
+
- Використовуйте візуальні матеріали, які резонують із цільовою культурою.
|
|
146
|
+
|
|
147
|
+
---
|
|
148
|
+
|
|
149
|
+
## 7. Language Switching & User Experience
|
|
150
|
+
|
|
151
|
+
### 7.1. Auto-Redirect or a Language Selector?
|
|
152
|
+
|
|
153
|
+
- **Автоматичне перенаправлення** (на основі IP або налаштувань браузера) може бути зручним, але воно може направляти мандрівників або користувачів із VPN на неправильну версію.
|
|
154
|
+
- **Селектор мови** часто є більш прозорим — користувачі можуть самі вибрати свою мову, якщо автоматично визначена мова неправильна.
|
|
155
|
+
|
|
156
|
+
Ось спрощений приклад Next.js + Intlayer:
|
|
157
|
+
|
|
158
|
+
```tsx
|
|
159
|
+
import { useLocation, useNavigate } from "react-router-dom";
|
|
160
|
+
import {
|
|
161
|
+
Locales,
|
|
162
|
+
getHTMLTextDir,
|
|
163
|
+
getLocaleName,
|
|
164
|
+
getLocalizedUrl,
|
|
165
|
+
} from "intlayer";
|
|
166
|
+
import { useLocale } from "react-intlayer";
|
|
167
|
+
import { type FC } from "react";
|
|
168
|
+
|
|
169
|
+
const LocaleSwitcher: FC = () => {
|
|
170
|
+
const { pathname, search } = useLocation(); // Отримати поточний шлях URL. Приклад: /fr/about?foo=bar
|
|
171
|
+
const navigate = useNavigate();
|
|
172
|
+
|
|
173
|
+
const { locale, availableLocales, setLocale } = useLocale({
|
|
174
|
+
onLocaleChange: (locale) => {
|
|
175
|
+
// Побудувати URL з оновленою локаллю
|
|
176
|
+
// Приклад: /es/about?foo=bar
|
|
177
|
+
const pathWithLocale = getLocalizedUrl(`${pathname}${search}`, locale);
|
|
178
|
+
|
|
179
|
+
// Update the URL path
|
|
180
|
+
navigate(pathWithLocale);
|
|
181
|
+
},
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
return (
|
|
185
|
+
<ol>
|
|
186
|
+
{availableLocales.map((localeItem) => (
|
|
187
|
+
<li key={localeItem}>
|
|
188
|
+
<a
|
|
189
|
+
href={getLocalizedUrl(location.pathname, localeItem)}
|
|
190
|
+
hrefLang={locale === localeItem ? "x-default" : localeItem}
|
|
191
|
+
aria-current={locale === localeItem ? "page" : undefined}
|
|
192
|
+
onClick={(e) => {
|
|
193
|
+
e.preventDefault();
|
|
194
|
+
setLocale(localeItem);
|
|
195
|
+
}}
|
|
196
|
+
>
|
|
197
|
+
<span>
|
|
198
|
+
{/* Локаль — наприклад FR */}
|
|
199
|
+
{localeItem}
|
|
200
|
+
</span>
|
|
201
|
+
<span>
|
|
202
|
+
{/* Назва мови у власній локалі — наприклад Français */}
|
|
203
|
+
{getLocaleName(localeItem, locale)}
|
|
204
|
+
</span>
|
|
205
|
+
<span dir={getHTMLTextDir(localeItem)} lang={localeItem}>
|
|
206
|
+
{/* Мова у поточній локалі — наприклад «Francés», коли поточна локаль встановлена на Locales.SPANISH */}
|
|
207
|
+
{getLocaleName(localeItem)}
|
|
208
|
+
</span>
|
|
209
|
+
<span dir="ltr" lang={Locales.ENGLISH}>
|
|
210
|
+
{/* Мова англійською — наприклад «French» */}
|
|
211
|
+
{getLocaleName(localeItem, Locales.ENGLISH)}
|
|
212
|
+
</span>
|
|
213
|
+
</a>
|
|
214
|
+
</li>
|
|
215
|
+
))}
|
|
216
|
+
</ol>
|
|
217
|
+
);
|
|
218
|
+
};
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
### 7.2. Збереження уподобань
|
|
222
|
+
|
|
223
|
+
- Зберігайте вибір мови користувача в **cookie** або **session**.
|
|
224
|
+
- Наступного разу, коли вони відвідають ваш сайт, ви можете автоматично завантажити їхню уподобану мову.
|
|
225
|
+
|
|
226
|
+
---
|
|
227
|
+
|
|
228
|
+
## 8. Створення локальних зворотних посилань
|
|
229
|
+
|
|
230
|
+
**Зворотні посилання (backlinks)** (посилання з зовнішніх сайтів на ваш сайт) залишаються важливим фактором SEO. Коли ви керуєте багатомовним сайтом, врахуйте:
|
|
231
|
+
|
|
232
|
+
- Налагодьте контакти з місцевими новинними сайтами, блогами або форумами. Наприклад, домен `.fr`, що вказує на вашу французьку піддиректорію, може підсилити локальне французьке SEO.
|
|
233
|
+
- Моніторте зворотні посилання за мовами, щоб визначити, які регіони потребують більше PR/маркетингових зусиль.
|
|
234
|
+
|
|
235
|
+
---
|
|
236
|
+
|
|
237
|
+
## 9. Моніторинг і підтримка вашого багатомовного сайту
|
|
238
|
+
|
|
239
|
+
### 9.1. Google Analytics і Search Console
|
|
240
|
+
|
|
241
|
+
- Розбивайте дані за кожним мовним каталогом (`/en/`, `/fr/`, `/es/`).
|
|
242
|
+
- Слідкуйте за **crawl errors**, **duplicate content flags** та **indexing issues** для кожної мови.
|
|
243
|
+
|
|
244
|
+
### 9.2. Регулярні оновлення контенту
|
|
245
|
+
|
|
246
|
+
- Підтримуйте переклади в актуальному стані. Якщо ви змінюєте опис продукту англійською, оновіть його французькою, іспанською тощо.
|
|
247
|
+
- Застарілі переклади можуть збивати з пантелику клієнтів і підривати довіру користувачів.
|
|
248
|
+
|
|
249
|
+
---
|
|
250
|
+
|
|
251
|
+
## 10. Поширені помилки, яких слід уникати
|
|
252
|
+
|
|
253
|
+
1. **Машинний переклад**
|
|
254
|
+
Автоматичні переклади без людської перевірки можуть містити численні помилки.
|
|
255
|
+
|
|
256
|
+
2. **Неправильні або відсутні теги `hreflang`**
|
|
257
|
+
Пошукові системи не зможуть визначити мовні версії самостійно, якщо ваші теги неповні або містять неправильні коди.
|
|
258
|
+
|
|
259
|
+
3. **Перемикання мови лише через `JavaScript`**
|
|
260
|
+
Якщо Google не може просканувати унікальні URL для кожної мови, ваші сторінки можуть не з'являтися у відповідних локальних результатах пошуку.
|
|
261
|
+
|
|
262
|
+
4. **Ігнорування культурних нюансів**
|
|
263
|
+
Жарт або фраза, що працює в одній країні, може бути образливою або беззмістовною в іншій.
|
|
264
|
+
|
|
265
|
+
---
|
|
266
|
+
|
|
267
|
+
## Підсумок
|
|
268
|
+
|
|
269
|
+
Створення багатомовного вебсайту — це не лише переклад тексту. Йдеться про ефективну структуру URL-адрес, використання тегів `hreflang`, щоб допомогти пошуковим системам показувати правильну версію, і забезпечення відмінного користувацького досвіду з локалізованими візуалами, селекторами мови та послідовною навігацією. Дотримання цих найкращих практик підготує вас до успіху на світових ринках, підвищить задоволеність користувачів і, зрештою, покращить SEO-показники в різних регіонах.
|
|
270
|
+
|
|
271
|
+
Якщо ви використовуєте Next.js (особливо App Router у Next.js 13+), інструмент на кшталт **Intlayer** може оптимізувати увесь цей процес. Він допомагає з усього — від генерації локалізованих sitemaps до автоматичного керування `hreflang` лінками, визначення мови та іншого, щоб ви могли зосередитися на створенні якісного багатомовного контенту.
|
|
272
|
+
|
|
273
|
+
**Готові вийти на глобальний рівень?** Почніть впроваджувати ці стратегії SEO та i18n вже зараз і спостерігайте, як нові відвідувачі з усього світу знаходять і взаємодіють з вашим сайтом!
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
---
|
|
2
|
+
createdAt: 2024-12-24
|
|
3
|
+
updatedAt: 2025-11-06
|
|
4
|
+
title: Як автоматизувати JSON-переклади i18next за допомогою Intlayer
|
|
5
|
+
description: Автоматизуйте ваші JSON-переклади за допомогою Intlayer та i18next для покращеної інтернаціоналізації в JavaScript-додатках.
|
|
6
|
+
keywords:
|
|
7
|
+
- Intlayer
|
|
8
|
+
- i18next
|
|
9
|
+
- Інтернаціоналізація
|
|
10
|
+
- i18n
|
|
11
|
+
- Локалізація
|
|
12
|
+
- Переклад
|
|
13
|
+
- React
|
|
14
|
+
- Next.js
|
|
15
|
+
- JavaScript
|
|
16
|
+
- TypeScript
|
|
17
|
+
- Міграція
|
|
18
|
+
- Інтеграція
|
|
19
|
+
slugs:
|
|
20
|
+
- blog
|
|
21
|
+
- intlayer-with-i18next
|
|
22
|
+
youtubeVideo: https://www.youtube.com/watch?v=MpGMxniDHNg
|
|
23
|
+
history:
|
|
24
|
+
- version: 7.5.0
|
|
25
|
+
date: 2025-12-13
|
|
26
|
+
changes: Додано підтримку формату i18next
|
|
27
|
+
- version: 7.0.7
|
|
28
|
+
date: 2025-11-06
|
|
29
|
+
changes: Додано документацію щодо підтримки AI-провайдера
|
|
30
|
+
- version: 7.0.6
|
|
31
|
+
date: 2025-11-01
|
|
32
|
+
changes: Додано плагін loadJSON
|
|
33
|
+
- version: 7.0.0
|
|
34
|
+
date: 2025-10-29
|
|
35
|
+
changes: Change to syncJSON plugin
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
# Як автоматизувати ваші JSON-переклади i18next за допомогою Intlayer
|
|
39
|
+
|
|
40
|
+
<iframe title="Як автоматизувати ваші JSON-переклади i18next за допомогою Intlayer" class="m-auto aspect-16/9 w-full overflow-hidden rounded-lg border-0" allow="autoplay; gyroscope;" loading="lazy" width="1080" height="auto" src="https://www.youtube.com/embed/MpGMxniDHNg?autoplay=0&origin=http://intlayer.org&controls=0&rel=1"/>
|
|
41
|
+
|
|
42
|
+
## Зміст
|
|
43
|
+
|
|
44
|
+
<TOC/>
|
|
45
|
+
|
|
46
|
+
## Що таке Intlayer?
|
|
47
|
+
|
|
48
|
+
**Intlayer** — інноваційна open-source бібліотека для інтернаціоналізації, створена для вирішення недоліків традиційних i18n-рішень. Вона пропонує сучасний підхід до керування контентом у JavaScript-додатках.
|
|
49
|
+
|
|
50
|
+
Дивіться конкретне порівняння з i18next у нашому дописі в блозі «next-i18next vs. next-intl vs. Intlayer»: https://github.com/aymericzip/intlayer/blob/main/docs/blog/uk/next-i18next_vs_next-intl_vs_intlayer.md
|
|
51
|
+
|
|
52
|
+
## Чому поєднувати Intlayer з i18next?
|
|
53
|
+
|
|
54
|
+
Хоча Intlayer пропонує відмінне автономне i18n-рішення (див. наш посібник з інтеграції Next.js: https://github.com/aymericzip/intlayer/blob/main/docs/docs/uk/intlayer_with_nextjs_16.md), ви можете захотіти поєднати його з i18next з кількох причин.
|
|
55
|
+
|
|
56
|
+
Intlayer пропонує широкий набір розширених функцій, що виходять за межі традиційних i18n-інструментів. Він допомагає вам:
|
|
57
|
+
|
|
58
|
+
- **Автоматично виявляти та заповнювати відсутні переклади**, щоб спростити локалізацію.
|
|
59
|
+
- **Тестувати та перевіряти ваші переклади** безпосередньо у ваших робочих процесах розробки або CI/CD.
|
|
60
|
+
- **Керувати контентом на рівні компонентів**, що дозволяє отримати чисту, масштабовану та легку в підтримці структуру в усьому вашому додатку.
|
|
61
|
+
- **Виносити контент за межі коду**, роблячи його простим для редагування всією вашою командою (розробники, перекладачі та контент-менеджери).
|
|
62
|
+
|
|
63
|
+
Однак, **i18next** залишається відмінним і широко застосовуваним рішенням для i18n завдяки своїй **дозрілій екосистемі**, **широкій підтримці спільноти** та **широкій сумісності з плагінами**.
|
|
64
|
+
|
|
65
|
+
Поєднавши **Intlayer** з **i18next**, ви отримуєте найкраще з обох світів — стабільність і зрілість екосистеми i18next разом із сучасним керуванням контентом, автоматизацією та покращенням developer experience від Intlayer.
|
|
66
|
+
|
|
67
|
+
Цей посібник пояснює, як використовувати Intlayer як **адаптер для i18next**, що дозволяє вам:
|
|
68
|
+
|
|
69
|
+
- Поступово мігрувати з i18next на Intlayer.
|
|
70
|
+
- Зберігайте існуючі плагіни та робочі процеси i18next.
|
|
71
|
+
- Автоматизуйте ваші JSON-переклади у CLI або в CI/CD конвеєрах.
|
|
72
|
+
- Тестуйте, синхронізуйте та керуйте перекладами ефективніше.
|
|
73
|
+
|
|
74
|
+
## Зміст
|
|
75
|
+
|
|
76
|
+
<TOC/>
|
|
77
|
+
|
|
78
|
+
## Покроковий посібник із налаштування Intlayer з i18next
|
|
79
|
+
|
|
80
|
+
### Крок 1: Встановлення залежностей
|
|
81
|
+
|
|
82
|
+
Встановіть необхідні пакети:
|
|
83
|
+
|
|
84
|
+
```bash packageManager="npm"
|
|
85
|
+
npm install intlayer @intlayer/sync-json-plugin --save-dev
|
|
86
|
+
npx intlayer init
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
```bash packageManager="pnpm"
|
|
90
|
+
pnpm add intlayer @intlayer/sync-json-plugin --save-dev
|
|
91
|
+
pnpm intlayer init
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
```bash packageManager="yarn"
|
|
95
|
+
yarn add intlayer @intlayer/sync-json-plugin --dev
|
|
96
|
+
yarn intlayer init
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
```bash packageManager="bun"
|
|
100
|
+
bun add intlayer @intlayer/sync-json-plugin --dev
|
|
101
|
+
bunx intlayer init
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
**Опис пакетів:**
|
|
105
|
+
|
|
106
|
+
- **intlayer**: Базова бібліотека для управління інтернаціоналізацією, декларації контенту та побудови
|
|
107
|
+
- **@intlayer/sync-json-plugin**: Плагін для експорту декларацій контенту Intlayer у формат JSON, сумісний з i18next
|
|
108
|
+
|
|
109
|
+
### Крок 2: Реалізуйте плагін Intlayer для обгортання JSON
|
|
110
|
+
|
|
111
|
+
Створіть файл конфігурації Intlayer, щоб визначити підтримувані локалі:
|
|
112
|
+
|
|
113
|
+
**Якщо ви також хочете експортувати JSON-словники для i18next**, додайте плагін `syncJSON`:
|
|
114
|
+
|
|
115
|
+
```typescript fileName="intlayer.config.ts"
|
|
116
|
+
import { Locales, type IntlayerConfig } from "intlayer";
|
|
117
|
+
import { syncJSON } from "@intlayer/sync-json-plugin";
|
|
118
|
+
|
|
119
|
+
const config: IntlayerConfig = {
|
|
120
|
+
internationalization: {
|
|
121
|
+
locales: [Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH],
|
|
122
|
+
defaultLocale: Locales.ENGLISH,
|
|
123
|
+
},
|
|
124
|
+
plugins: [
|
|
125
|
+
syncJSON({
|
|
126
|
+
source: ({ key, locale }) => `./locales/${locale}/${key}.json`,
|
|
127
|
+
}),
|
|
128
|
+
],
|
|
129
|
+
};
|
|
130
|
+
|
|
131
|
+
export default config;
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
Плагін `syncJSON` автоматично обгортає JSON. Він читає та записує JSON-файли, не змінюючи архітектуру їхнього вмісту.
|
|
135
|
+
|
|
136
|
+
Якщо ви хочете, щоб ці JSON-файли співіснували з файлами декларацій контенту Intlayer (`.content` файли), Intlayer оброблятиме їх таким чином:
|
|
137
|
+
|
|
138
|
+
1. завантажить як JSON, так і файли декларацій контенту і перетворить їх на словник Intlayer.
|
|
139
|
+
2. якщо виникають конфлікти між JSON та файлами декларацій контенту, Intlayer виконає злиття всіх словників. Результат залежатиме від пріоритету плагінів і пріоритету файлів декларацій контенту (усі параметри можна налаштувати).
|
|
140
|
+
|
|
141
|
+
Якщо зміни вносяться за допомогою CLI для перекладу JSON або через CMS, Intlayer оновить JSON-файл з новими перекладами.
|
|
142
|
+
|
|
143
|
+
Щоб дізнатися більше про плагін `syncJSON`, див. [документацію плагіна syncJSON](https://github.com/aymericzip/intlayer/blob/main/docs/docs/uk/plugins/sync-json.md).
|
|
144
|
+
|
|
145
|
+
### Крок 4: Налаштування AI-провайдера
|
|
146
|
+
|
|
147
|
+
Intlayer надає набір просунутих автоматизаційних та дружніх до розробника функцій для вашого робочого процесу i18next.
|
|
148
|
+
|
|
149
|
+
- **Автоматичне виявлення та заповнення відсутніх перекладів**: Intlayer сканує ваші JSON-словники, знаходить неперекладені або відсутні ключі і перекладає лише їх, тож 99% вашого JSON залишається незмінним.
|
|
150
|
+
- **Поблочний переклад великих JSON-файлів**: Коли ваші файли перекладу дуже великі, Intlayer автоматично розбиває обробку на керовані блоки, перекладаючи їх незалежно, щоб уникнути обмежень API та проблем з пам’яттю.
|
|
151
|
+
- **Паралелізація просторів імен (namespaces)**: Якщо у вас сотні просторів імен (або файлів), Intlayer паралелізує задачі перекладу, ефективно прискорюючи ваші CI/CD або масові операції перекладу.
|
|
152
|
+
- **Гнучка підтримка AI-провайдерів**: Обирайте улюбленого AI-провайдера (наприклад, OpenAI, Claude, Gemini), просто налаштувавши облікові дані. Використовуйте власний API-ключ і за потреби перемикайте провайдерів.
|
|
153
|
+
- **Стійка обробка відповідей AI**: Intlayer може обробляти крайові випадки, коли ваш AI-провайдер повертає текст або як рядок, або як об’єкт, навіть автоматично повторюючи спроби, якщо формат є непослідовним.
|
|
154
|
+
- Готовий для CLI та CI/CD: запускайте перевірки Intlayer і автозаповнення безпосередньо у ваших тестах або пайплайнах, роблячи процес локалізації надійним та автоматизованим.
|
|
155
|
+
- Інтегрується поверх наявної конфігурації: вам не потрібно змінювати i18next або основу Next.js. Intlayer працює як додатковий плагін до вашої поточної установки, надаючи всі ці переваги з мінімальною міграцією.
|
|
156
|
+
|
|
157
|
+
Ось приклад того, як налаштувати AI-провайдера:
|
|
158
|
+
|
|
159
|
+
```ts fileName="intlayer.config.ts"
|
|
160
|
+
import { Locales, type IntlayerConfig } from "intlayer";
|
|
161
|
+
import { loadJSON, syncJSON } from "@intlayer/sync-json-plugin";
|
|
162
|
+
|
|
163
|
+
const config: IntlayerConfig = {
|
|
164
|
+
internationalization: {
|
|
165
|
+
locales: [Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH],
|
|
166
|
+
defaultLocale: Locales.ENGLISH,
|
|
167
|
+
},
|
|
168
|
+
ai: {
|
|
169
|
+
provider: "openai",
|
|
170
|
+
model: "gpt-5-mini",
|
|
171
|
+
apiKey: process.env.OPENAI_API_KEY,
|
|
172
|
+
},
|
|
173
|
+
plugins: [
|
|
174
|
+
syncJSON({
|
|
175
|
+
source: ({ key, locale }) => `./locales/${locale}/${key}.json`,
|
|
176
|
+
}),
|
|
177
|
+
],
|
|
178
|
+
};
|
|
179
|
+
|
|
180
|
+
export default config;
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
Потім ви можете виконати наступну команду, щоб заповнити переклади:
|
|
184
|
+
|
|
185
|
+
```bash
|
|
186
|
+
npx intlayer fill
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
Це заповнить ваші переклади за допомогою AI-провайдера, якого ви налаштували.
|
|
190
|
+
|
|
191
|
+
> Перегляньте всіх доступних AI-провайдерів у [документації з конфігурації Intlayer AI](https://github.com/aymericzip/intlayer/blob/main/docs/docs/uk/configuration.md#ai-configuration).
|
|
192
|
+
> Перегляньте всі доступні команди в [документації Intlayer CLI](https://github.com/aymericzip/intlayer/blob/main/docs/docs/uk/cli/index.md).
|
|
193
|
+
|
|
194
|
+
---
|
|
195
|
+
|
|
196
|
+
## Налаштування Git
|
|
197
|
+
|
|
198
|
+
Рекомендується ігнорувати автоматично згенеровані файли Intlayer:
|
|
199
|
+
|
|
200
|
+
```plaintext fileName=".gitignore"
|
|
201
|
+
# Ігнорувати файли, згенеровані Intlayer
|
|
202
|
+
.intlayer
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
Ці файли можуть бути повторно згенеровані під час збірки і їх не потрібно додавати до системи контролю версій.
|
|
206
|
+
|
|
207
|
+
### Розширення для VS Code
|
|
208
|
+
|
|
209
|
+
Для покращення досвіду розробника встановіть офіційне **Intlayer VS Code Extension**:
|
|
210
|
+
|
|
211
|
+
[Встановити з VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=intlayer.intlayer-vs-code-extension)
|