@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.
Files changed (229) hide show
  1. package/blog/ar/per-component_vs_centralized_i18n.md +248 -0
  2. package/blog/de/per-component_vs_centralized_i18n.md +248 -0
  3. package/blog/en/_per-component_vs_centralized_i18n.md +252 -0
  4. package/blog/en/per-component_vs_centralized_i18n.md +248 -0
  5. package/blog/en-GB/per-component_vs_centralized_i18n.md +247 -0
  6. package/blog/es/per-component_vs_centralized_i18n.md +245 -0
  7. package/blog/fr/per-component_vs_centralized_i18n.md +245 -0
  8. package/blog/hi/per-component_vs_centralized_i18n.md +249 -0
  9. package/blog/id/per-component_vs_centralized_i18n.md +248 -0
  10. package/blog/it/per-component_vs_centralized_i18n.md +247 -0
  11. package/blog/ja/per-component_vs_centralized_i18n.md +247 -0
  12. package/blog/ko/per-component_vs_centralized_i18n.md +246 -0
  13. package/blog/pl/per-component_vs_centralized_i18n.md +247 -0
  14. package/blog/pt/per-component_vs_centralized_i18n.md +246 -0
  15. package/blog/ru/per-component_vs_centralized_i18n.md +251 -0
  16. package/blog/tr/per-component_vs_centralized_i18n.md +244 -0
  17. package/blog/uk/compiler_vs_declarative_i18n.md +224 -0
  18. package/blog/uk/i18n_using_next-i18next.md +1086 -0
  19. package/blog/uk/i18n_using_next-intl.md +760 -0
  20. package/blog/uk/index.md +69 -0
  21. package/blog/uk/internationalization_and_SEO.md +273 -0
  22. package/blog/uk/intlayer_with_i18next.md +211 -0
  23. package/blog/uk/intlayer_with_next-i18next.md +202 -0
  24. package/blog/uk/intlayer_with_next-intl.md +203 -0
  25. package/blog/uk/intlayer_with_react-i18next.md +200 -0
  26. package/blog/uk/intlayer_with_react-intl.md +202 -0
  27. package/blog/uk/intlayer_with_vue-i18n.md +206 -0
  28. package/blog/uk/l10n_platform_alternative/Lokalise.md +80 -0
  29. package/blog/uk/l10n_platform_alternative/crowdin.md +80 -0
  30. package/blog/uk/l10n_platform_alternative/phrase.md +78 -0
  31. package/blog/uk/list_i18n_technologies/CMS/drupal.md +143 -0
  32. package/blog/uk/list_i18n_technologies/CMS/wix.md +167 -0
  33. package/blog/uk/list_i18n_technologies/CMS/wordpress.md +189 -0
  34. package/blog/uk/list_i18n_technologies/frameworks/angular.md +125 -0
  35. package/blog/uk/list_i18n_technologies/frameworks/flutter.md +128 -0
  36. package/blog/uk/list_i18n_technologies/frameworks/react-native.md +217 -0
  37. package/blog/uk/list_i18n_technologies/frameworks/react.md +155 -0
  38. package/blog/uk/list_i18n_technologies/frameworks/svelte.md +145 -0
  39. package/blog/uk/list_i18n_technologies/frameworks/vue.md +144 -0
  40. package/blog/uk/next-i18next_vs_next-intl_vs_intlayer.md +1499 -0
  41. package/blog/uk/nextjs-multilingual-seo-comparison.md +360 -0
  42. package/blog/uk/per-component_vs_centralized_i18n.md +248 -0
  43. package/blog/uk/rag_powered_documentation_assistant.md +288 -0
  44. package/blog/uk/react-i18next_vs_react-intl_vs_intlayer.md +164 -0
  45. package/blog/uk/vue-i18n_vs_intlayer.md +279 -0
  46. package/blog/uk/what_is_internationalization.md +167 -0
  47. package/blog/vi/per-component_vs_centralized_i18n.md +246 -0
  48. package/blog/zh/per-component_vs_centralized_i18n.md +248 -0
  49. package/dist/cjs/common.cjs.map +1 -1
  50. package/dist/cjs/generated/blog.entry.cjs +20 -0
  51. package/dist/cjs/generated/blog.entry.cjs.map +1 -1
  52. package/dist/cjs/generated/docs.entry.cjs.map +1 -1
  53. package/dist/cjs/generated/frequentQuestions.entry.cjs +20 -0
  54. package/dist/cjs/generated/frequentQuestions.entry.cjs.map +1 -1
  55. package/dist/cjs/generated/legal.entry.cjs.map +1 -1
  56. package/dist/esm/common.mjs.map +1 -1
  57. package/dist/esm/generated/blog.entry.mjs +20 -0
  58. package/dist/esm/generated/blog.entry.mjs.map +1 -1
  59. package/dist/esm/generated/docs.entry.mjs.map +1 -1
  60. package/dist/esm/generated/frequentQuestions.entry.mjs +20 -0
  61. package/dist/esm/generated/frequentQuestions.entry.mjs.map +1 -1
  62. package/dist/esm/generated/legal.entry.mjs.map +1 -1
  63. package/dist/types/generated/blog.entry.d.ts +1 -0
  64. package/dist/types/generated/blog.entry.d.ts.map +1 -1
  65. package/dist/types/generated/frequentQuestions.entry.d.ts +1 -0
  66. package/dist/types/generated/frequentQuestions.entry.d.ts.map +1 -1
  67. package/docs/ar/configuration.md +6 -1
  68. package/docs/ar/dictionary/content_file.md +6 -1
  69. package/docs/de/configuration.md +6 -1
  70. package/docs/de/dictionary/content_file.md +6 -1
  71. package/docs/en/configuration.md +6 -1
  72. package/docs/en/dictionary/content_file.md +6 -1
  73. package/docs/en-GB/configuration.md +6 -1
  74. package/docs/en-GB/dictionary/content_file.md +3 -1
  75. package/docs/es/configuration.md +6 -1
  76. package/docs/es/dictionary/content_file.md +6 -1
  77. package/docs/fr/configuration.md +6 -1
  78. package/docs/fr/dictionary/content_file.md +3 -1
  79. package/docs/hi/configuration.md +6 -1
  80. package/docs/hi/dictionary/content_file.md +3 -1
  81. package/docs/id/configuration.md +6 -1
  82. package/docs/id/dictionary/content_file.md +3 -1
  83. package/docs/it/configuration.md +6 -1
  84. package/docs/it/dictionary/content_file.md +3 -1
  85. package/docs/ja/configuration.md +6 -1
  86. package/docs/ja/dictionary/content_file.md +3 -1
  87. package/docs/ko/configuration.md +6 -1
  88. package/docs/ko/dictionary/content_file.md +3 -1
  89. package/docs/pl/configuration.md +3 -1
  90. package/docs/pl/dictionary/content_file.md +3 -1
  91. package/docs/pt/configuration.md +6 -1
  92. package/docs/pt/dictionary/content_file.md +3 -1
  93. package/docs/ru/configuration.md +6 -1
  94. package/docs/ru/dictionary/content_file.md +6 -1
  95. package/docs/tr/configuration.md +6 -1
  96. package/docs/tr/dictionary/content_file.md +3 -1
  97. package/docs/uk/CI_CD.md +198 -0
  98. package/docs/uk/autoFill.md +307 -0
  99. package/docs/uk/bundle_optimization.md +185 -0
  100. package/docs/uk/cli/build.md +64 -0
  101. package/docs/uk/cli/ci.md +137 -0
  102. package/docs/uk/cli/configuration.md +63 -0
  103. package/docs/uk/cli/debug.md +46 -0
  104. package/docs/uk/cli/doc-review.md +43 -0
  105. package/docs/uk/cli/doc-translate.md +132 -0
  106. package/docs/uk/cli/editor.md +28 -0
  107. package/docs/uk/cli/fill.md +130 -0
  108. package/docs/uk/cli/index.md +190 -0
  109. package/docs/uk/cli/init.md +84 -0
  110. package/docs/uk/cli/list.md +90 -0
  111. package/docs/uk/cli/list_projects.md +128 -0
  112. package/docs/uk/cli/live.md +41 -0
  113. package/docs/uk/cli/login.md +157 -0
  114. package/docs/uk/cli/pull.md +78 -0
  115. package/docs/uk/cli/push.md +98 -0
  116. package/docs/uk/cli/sdk.md +71 -0
  117. package/docs/uk/cli/test.md +76 -0
  118. package/docs/uk/cli/transform.md +65 -0
  119. package/docs/uk/cli/version.md +24 -0
  120. package/docs/uk/cli/watch.md +37 -0
  121. package/docs/uk/configuration.md +742 -0
  122. package/docs/uk/dictionary/condition.md +237 -0
  123. package/docs/uk/dictionary/content_file.md +1134 -0
  124. package/docs/uk/dictionary/enumeration.md +245 -0
  125. package/docs/uk/dictionary/file.md +232 -0
  126. package/docs/uk/dictionary/function_fetching.md +212 -0
  127. package/docs/uk/dictionary/gender.md +273 -0
  128. package/docs/uk/dictionary/insertion.md +187 -0
  129. package/docs/uk/dictionary/markdown.md +383 -0
  130. package/docs/uk/dictionary/nesting.md +273 -0
  131. package/docs/uk/dictionary/translation.md +332 -0
  132. package/docs/uk/formatters.md +595 -0
  133. package/docs/uk/how_works_intlayer.md +256 -0
  134. package/docs/uk/index.md +175 -0
  135. package/docs/uk/interest_of_intlayer.md +297 -0
  136. package/docs/uk/intlayer_CMS.md +569 -0
  137. package/docs/uk/intlayer_visual_editor.md +292 -0
  138. package/docs/uk/intlayer_with_angular.md +710 -0
  139. package/docs/uk/intlayer_with_astro.md +256 -0
  140. package/docs/uk/intlayer_with_create_react_app.md +1258 -0
  141. package/docs/uk/intlayer_with_express.md +429 -0
  142. package/docs/uk/intlayer_with_fastify.md +446 -0
  143. package/docs/uk/intlayer_with_lynx+react.md +548 -0
  144. package/docs/uk/intlayer_with_nestjs.md +283 -0
  145. package/docs/uk/intlayer_with_next-i18next.md +640 -0
  146. package/docs/uk/intlayer_with_next-intl.md +456 -0
  147. package/docs/uk/intlayer_with_nextjs_page_router.md +1541 -0
  148. package/docs/uk/intlayer_with_nuxt.md +711 -0
  149. package/docs/uk/intlayer_with_react_router_v7.md +600 -0
  150. package/docs/uk/intlayer_with_react_router_v7_fs_routes.md +669 -0
  151. package/docs/uk/intlayer_with_svelte_kit.md +579 -0
  152. package/docs/uk/intlayer_with_tanstack.md +818 -0
  153. package/docs/uk/intlayer_with_vite+preact.md +1748 -0
  154. package/docs/uk/intlayer_with_vite+react.md +1449 -0
  155. package/docs/uk/intlayer_with_vite+solid.md +302 -0
  156. package/docs/uk/intlayer_with_vite+svelte.md +520 -0
  157. package/docs/uk/intlayer_with_vite+vue.md +1113 -0
  158. package/docs/uk/introduction.md +222 -0
  159. package/docs/uk/locale_mapper.md +242 -0
  160. package/docs/uk/mcp_server.md +211 -0
  161. package/docs/uk/packages/express-intlayer/t.md +465 -0
  162. package/docs/uk/packages/intlayer/getEnumeration.md +159 -0
  163. package/docs/uk/packages/intlayer/getHTMLTextDir.md +121 -0
  164. package/docs/uk/packages/intlayer/getLocaleLang.md +81 -0
  165. package/docs/uk/packages/intlayer/getLocaleName.md +135 -0
  166. package/docs/uk/packages/intlayer/getLocalizedUrl.md +338 -0
  167. package/docs/uk/packages/intlayer/getMultilingualUrls.md +359 -0
  168. package/docs/uk/packages/intlayer/getPathWithoutLocale.md +75 -0
  169. package/docs/uk/packages/intlayer/getPrefix.md +213 -0
  170. package/docs/uk/packages/intlayer/getTranslation.md +190 -0
  171. package/docs/uk/packages/intlayer/getTranslationContent.md +189 -0
  172. package/docs/uk/packages/next-intlayer/t.md +365 -0
  173. package/docs/uk/packages/next-intlayer/useDictionary.md +276 -0
  174. package/docs/uk/packages/next-intlayer/useIntlayer.md +263 -0
  175. package/docs/uk/packages/next-intlayer/useLocale.md +166 -0
  176. package/docs/uk/packages/react-intlayer/t.md +311 -0
  177. package/docs/uk/packages/react-intlayer/useDictionary.md +295 -0
  178. package/docs/uk/packages/react-intlayer/useI18n.md +250 -0
  179. package/docs/uk/packages/react-intlayer/useIntlayer.md +251 -0
  180. package/docs/uk/packages/react-intlayer/useLocale.md +210 -0
  181. package/docs/uk/per_locale_file.md +345 -0
  182. package/docs/uk/plugins/sync-json.md +398 -0
  183. package/docs/uk/readme.md +265 -0
  184. package/docs/uk/releases/v6.md +305 -0
  185. package/docs/uk/releases/v7.md +624 -0
  186. package/docs/uk/roadmap.md +346 -0
  187. package/docs/uk/testing.md +204 -0
  188. package/docs/vi/configuration.md +6 -1
  189. package/docs/vi/dictionary/content_file.md +6 -1
  190. package/docs/zh/configuration.md +6 -1
  191. package/docs/zh/dictionary/content_file.md +6 -1
  192. package/frequent_questions/ar/error-vite-env-only.md +77 -0
  193. package/frequent_questions/de/error-vite-env-only.md +77 -0
  194. package/frequent_questions/en/error-vite-env-only.md +77 -0
  195. package/frequent_questions/en-GB/error-vite-env-only.md +77 -0
  196. package/frequent_questions/es/error-vite-env-only.md +76 -0
  197. package/frequent_questions/fr/error-vite-env-only.md +77 -0
  198. package/frequent_questions/hi/error-vite-env-only.md +77 -0
  199. package/frequent_questions/id/error-vite-env-only.md +77 -0
  200. package/frequent_questions/it/error-vite-env-only.md +77 -0
  201. package/frequent_questions/ja/error-vite-env-only.md +77 -0
  202. package/frequent_questions/ko/error-vite-env-only.md +77 -0
  203. package/frequent_questions/pl/error-vite-env-only.md +77 -0
  204. package/frequent_questions/pt/error-vite-env-only.md +77 -0
  205. package/frequent_questions/ru/error-vite-env-only.md +77 -0
  206. package/frequent_questions/tr/error-vite-env-only.md +77 -0
  207. package/frequent_questions/uk/SSR_Next_no_[locale].md +104 -0
  208. package/frequent_questions/uk/array_as_content_declaration.md +72 -0
  209. package/frequent_questions/uk/build_dictionaries.md +58 -0
  210. package/frequent_questions/uk/build_error_CI_CD.md +74 -0
  211. package/frequent_questions/uk/bun_set_up.md +53 -0
  212. package/frequent_questions/uk/customized_locale_list.md +64 -0
  213. package/frequent_questions/uk/domain_routing.md +113 -0
  214. package/frequent_questions/uk/error-vite-env-only.md +77 -0
  215. package/frequent_questions/uk/esbuild_error.md +29 -0
  216. package/frequent_questions/uk/get_locale_cookie.md +142 -0
  217. package/frequent_questions/uk/intlayer_command_undefined.md +155 -0
  218. package/frequent_questions/uk/locale_incorect_in_url.md +73 -0
  219. package/frequent_questions/uk/package_version_error.md +181 -0
  220. package/frequent_questions/uk/static_rendering.md +44 -0
  221. package/frequent_questions/uk/translated_path_url.md +55 -0
  222. package/frequent_questions/uk/unknown_command.md +97 -0
  223. package/frequent_questions/vi/error-vite-env-only.md +77 -0
  224. package/frequent_questions/zh/error-vite-env-only.md +77 -0
  225. package/legal/uk/privacy_notice.md +83 -0
  226. package/legal/uk/terms_of_service.md +55 -0
  227. package/package.json +9 -9
  228. package/src/generated/blog.entry.ts +20 -0
  229. package/src/generated/frequentQuestions.entry.ts +20 -0
@@ -0,0 +1,72 @@
1
+ ---
2
+ createdAt: 2025-05-20
3
+ updatedAt: 2025-06-29
4
+ title: Чи можна використовувати масив як декларацію контенту?
5
+ description: Дізнайтеся, як використовувати масив як декларацію контенту.
6
+ keywords:
7
+ - масив
8
+ - вміст
9
+ - оголошення
10
+ - intlayer
11
+ slugs:
12
+ - frequent-questions
13
+ - array-as-content-declaration
14
+ ---
15
+
16
+ # Чи можна використовувати масив як декларацію контенту?
17
+
18
+ Так — ви можете використовувати масив як декларацію контенту.
19
+
20
+ ```ts
21
+ import { t, type Dictionary } from "intlayer";
22
+
23
+ const exampleContent = {
24
+ key: "example",
25
+ content: {
26
+ test: t({
27
+ uk: ["Тест", "Тест2", "Тест3"],
28
+ en: ["Test", "Test2", "Test3"],
29
+ fr: ["Test", "Test2", "Test3"],
30
+ es: ["Test", "Test2", "Test3"],
31
+ }),
32
+ },
33
+ };
34
+
35
+ export default exampleContent;
36
+ ```
37
+
38
+ Далі ви можете використовувати контент ось так:
39
+
40
+ ```tsx
41
+ import { useIntlayer } from "react-intlayer";
42
+
43
+ const Example = () => {
44
+ const content = useIntlayer("example");
45
+
46
+ return (
47
+ <div>
48
+ {content.test.map((item) => (
49
+ <div key={item.value}>{item}</div>
50
+ ))}
51
+ </div>
52
+ );
53
+ };
54
+ ```
55
+
56
+ ```vue
57
+ <script setup lang="ts">
58
+ import { useIntlayer } from "vue-intlayer";
59
+
60
+ const content = useIntlayer("example");
61
+ </script>
62
+
63
+ <template>
64
+ <div>
65
+ <div v-for="item in content.test" :key="item.value">
66
+ {{ item }}
67
+ </div>
68
+ </div>
69
+ </template>
70
+ ```
71
+
72
+ .value дозволяє отримати значення контенту, яке не обгорнуте в `IntlayerNode`.
@@ -0,0 +1,58 @@
1
+ ---
2
+ createdAt: 2025-05-20
3
+ updatedAt: 2025-06-29
4
+ title: Як згенерувати словники?
5
+ description: Дізнайтеся, як згенерувати словники.
6
+ keywords:
7
+ - build
8
+ - словники
9
+ - intlayer
10
+ - команда
11
+ - watch
12
+ - vscode
13
+ - плагін
14
+ - framework
15
+ - next.js
16
+ - vite
17
+ slugs:
18
+ - frequent-questions
19
+ - build-dictionaries
20
+ ---
21
+
22
+ # Build Dictionaries
23
+
24
+ ## How to Build Dictionaries
25
+
26
+ Intlayer provides a command-line tool to build dictionaries.
27
+
28
+ ```bash
29
+ npx intlayer dictionaries build
30
+ ```
31
+
32
+ This command:
33
+
34
+ - Scans all content declaration files (`.content.{ts,tsx,js,mjs,cjs,json,...}`) in your project.
35
+ - Generates dictionaries and stores them in the `.intlayer/dictionary` folder.
36
+
37
+ ### Watch Mode
38
+
39
+ Якщо ви хочете автоматично оновлювати словники при внесенні змін у файли декларацій контенту, виконайте таку команду:
40
+
41
+ ```bash
42
+ npx intlayer dictionaries build --watch
43
+ ```
44
+
45
+ У цьому режимі Intlayer скануватиме та будуватиме словники щоразу, коли вносяться зміни у файли декларацій контенту, і автоматично оновлюватиме папку `.intlayer/dictionary`.
46
+
47
+ ### Використання розширення VSCode
48
+
49
+ Ви також можете використовувати [розширення Intlayer для VSCode](https://github.com/aymericzip/intlayer/tree/main/docs/uk/vs_code_extension.md), щоб покращити роботу з Intlayer у VSCode.
50
+
51
+ ### Використання плагіна для вашого улюбленого фреймворка
52
+
53
+ Якщо ви використовуєте фреймворк на кшталт Next.js (Webpack / Turbopack), Vite, React Native, Lynx тощо, Intlayer надає плагін, який ви можете використати для інтеграції Intlayer у ваш додаток.
54
+
55
+ Intlayer збирає словники перед збіркою вашого додатка.
56
+ Аналогічно, у режимі розробки Intlayer стежитиме за змінами у файлах декларації контенту й автоматично перебудовуватиме словники.
57
+
58
+ Тому зверніться до документації, специфічної для вашого фреймворку, щоб дізнатися, як інтегрувати плагін.
@@ -0,0 +1,74 @@
1
+ ---
2
+ createdAt: 2025-05-20
3
+ updatedAt: 2025-06-29
4
+ title: Помилка збірки в CI/CD
5
+ description: Дізнайтеся, як виправити помилки збірки, що виникають у середовищах CI/CD.
6
+ keywords:
7
+ - build
8
+ - error
9
+ - ci
10
+ - cd
11
+ - pipeline
12
+ - intlayer
13
+ - dictionaries
14
+ - next.js
15
+ - prebuild
16
+ - automation
17
+ slugs:
18
+ - frequent-questions
19
+ - build-error-ci-cd
20
+ ---
21
+
22
+ # Помилка під час збірки в CI/CD
23
+
24
+ Якщо ви отримуєте таку помилку в Next.js:
25
+
26
+ ```text
27
+ Error: An error occurred in the Server Components render. The specific message is omitted in production builds to avoid leaking sensitive details. A digest property is included on this error instance which may provide additional details about the nature of the error
28
+ ```
29
+
30
+ Ось кілька рішень:
31
+
32
+ ## 1. Відсутні словники
33
+
34
+ Переконайтеся, що dictionaries будуються під час етапу збірки.
35
+
36
+ Часто збірка працює локально, але не в CI/CD. Причина в тому, що локально каталог `.intlayer` присутній, а в CI/CD його немає, бо він виключений із збірки.
37
+
38
+ Ви можете виправити це, додавши скрипт prebuild у `package.json` вашого проєкту.
39
+
40
+ ```json5 fileName=package.json
41
+ {
42
+ // інше ...
43
+ "scripts": {
44
+ "prebuild": "npx intlayer dictionaries build", // Виконається перед збіркою
45
+ "build": "next build",
46
+ },
47
+ }
48
+ ```
49
+
50
+ > Зауважте, що якщо ви використовуєте функцію `withIntlayer`, або еквівалентний bundler plugin для вашого фреймворку, скрипт prebuild буде виконаний перед збіркою.
51
+
52
+ ## 2. Відсутні змінні середовища під час збірки / виконання
53
+
54
+ У контейнері або на платформі з автоматичним деплоєм рекомендується виключати файл `.env` з процесу збірки.
55
+
56
+ ```text fileName=".gitignore or .dockerignore"
57
+ # Змінні середовища
58
+ .env
59
+ **/.env
60
+ .env.*
61
+ **/.env.*
62
+ ```
63
+
64
+ Якщо ваші змінні середовища недоступні під час збірки, буде викинута помилка.
65
+
66
+ ```ts
67
+ import { Metadata } from "next";
68
+
69
+ export const generateMetadata = async ({ params }): Promise<Metadata> => ({
70
+ metadataBase: new URL(process.env.NEXT_PUBLIC_URL),
71
+ });
72
+ ```
73
+
74
+ Ймовірно, це не пов'язано з Intlayer. Тому перевірте свої змінні середовища під час збірки на вашій CI/CD-платформі.
@@ -0,0 +1,53 @@
1
+ ---
2
+ createdAt: 2025-05-20
3
+ updatedAt: 2025-06-29
4
+ title: Отримую помилку module not found при використанні bun
5
+ description: Виправлення помилки при використанні bun.
6
+ keywords:
7
+ - bun
8
+ - модуль не знайдено
9
+ - intlayer
10
+ - конфігурація
11
+ - пакетний менеджер
12
+ slugs:
13
+ - frequent-questions
14
+ - bun-set-up
15
+ ---
16
+
17
+ # Отримую помилку 'module not found' при використанні bun
18
+
19
+ ## Опис проблеми
20
+
21
+ При використанні bun ви можете зіткнутися з помилкою на кшталт цієї:
22
+
23
+ ```bash
24
+ Cannot find package 'intlayer' from '/workspace/packages/@intlayer/config/dist/cjs/utils/ESMxCJSHelpers.cjs' undefined
25
+ ```
26
+
27
+ ## Причина
28
+
29
+ Intlayer використовує `require` внутрішньо. А bun обмежує область дії функції `require`, через що вона резолвить лише пакети пакета `@intlayer/config`, а не весь проєкт.
30
+
31
+ ## Рішення
32
+
33
+ ### Надайте функцію `require` у конфігурації
34
+
35
+ ```ts
36
+ const config: IntlayerConfig = {
37
+ build: {
38
+ require,
39
+ },
40
+ };
41
+
42
+ export default config;
43
+ ```
44
+
45
+ ```ts fileName="next.config.ts" codeFormat="typescript"
46
+ import { withIntlayer } from "next-intlayer/server";
47
+
48
+ const configuration = withIntlayer({
49
+ require,
50
+ });
51
+
52
+ export default configuration;
53
+ ```
@@ -0,0 +1,64 @@
1
+ ---
2
+ createdAt: 2025-05-20
3
+ updatedAt: 2025-06-29
4
+ title: Як налаштувати список локалей?
5
+ description: Дізнайтеся, як налаштувати список локалей.
6
+ keywords:
7
+ - локалі
8
+ - список
9
+ - intlayer
10
+ - конфігурація
11
+ - availableLocales
12
+ - defaultLocale
13
+ - useLocale
14
+ - hook
15
+ - локаль
16
+ - список
17
+ slugs:
18
+ - frequent-questions
19
+ - customized-locale-list
20
+ ---
21
+
22
+ # Чи можна заблокувати певну мову, наприклад англійську? Я додаю англійську у свої словники, але поки не хочу, щоб англійська була доступна на сайті
23
+
24
+ Так, ви можете заблокувати певну мову, наприклад англійську, використавши опцію `availableLocales` у конфігурації Intlayer.
25
+
26
+ ```ts
27
+ import { IntlayerConfig } from "intlayer";
28
+
29
+ const config: IntlayerConfig = {
30
+ locales: [Locales.FRENCH, Locales.SPANISH, Locales.ENGLISH],
31
+ availableLocales: [Locales.FRENCH, Locales.SPANISH],
32
+ defaultLocale: Locales.FRENCH,
33
+ };
34
+ ```
35
+
36
+ або
37
+
38
+ ```ts
39
+ import { IntlayerConfig } from "intlayer";
40
+
41
+ const locales = [Locales.FRENCH, Locales.SPANISH, Locales.ENGLISH];
42
+
43
+ const config: IntlayerConfig = {
44
+ locales,
45
+ availableLocales: locales.filter((locale) => locale !== Locales.ENGLISH),
46
+ defaultLocale: Locales.FRENCH,
47
+ };
48
+ ```
49
+
50
+ Ця конфігурація змінить типи вашої функції `t()` так, щоб вони включали лише доступні локалі.
51
+
52
+ Опція availableLocales є необов'язковою — якщо ви її не вкажете, будуть доступні всі локалі.
53
+
54
+ Увага: усі локалі, включені в опцію `availableLocales`, повинні бути також включені в опцію `locales`.
55
+
56
+ Зауважте, що якщо ви використовуєте хук `useLocale`, опція `availableLocales` буде використана для встановлення доступу до списку локалей.
57
+
58
+ ```ts
59
+ import { useLocale } from "react-intlayer";
60
+
61
+ const { availableLocales } = useLocale();
62
+
63
+ console.log(availableLocales); // Виведе: [Locales.FRENCH, Locales.SPANISH]
64
+ ```
@@ -0,0 +1,113 @@
1
+ ---
2
+ createdAt: 2025-05-20
3
+ updatedAt: 2025-06-29
4
+ title: Як налаштувати маршрутизацію на основі домену?
5
+ description: Дізнайтеся, як налаштувати маршрутизацію на основі домену.
6
+ keywords:
7
+ - домен
8
+ - маршрутизація
9
+ - intlayer
10
+ - конфігурація
11
+ - middleware
12
+ - react-router
13
+ - vue-router
14
+ - next.js
15
+ - vite
16
+ - фреймворк
17
+ slugs:
18
+ - frequent-questions
19
+ - domain-routing
20
+ ---
21
+
22
+ # Як налаштувати **маршрутизацію на основі домену** в Intlayer замість шляхів `/[locale]/`?
23
+
24
+ ## Коротка відповідь
25
+
26
+ Маршрутизація на основі домену простіша за маршрутизацію через шляхи (`example.com/[locale]/`), оскільки ви можете пропустити всю конфігурацію middleware та маршрутизації. Просто розгорніть ваш додаток на кожному мовному домені та встановіть по одній змінній оточення для кожного домену.
27
+
28
+ ## Покроково
29
+
30
+ 1. **Розгорніть додаток окремо для кожного домену** (`example.com`, `exemple.fr`, `ejemplo.es`, …).
31
+ 2. Для кожного розгортання встановіть `LOCALE` (та звичайні змінні оточення Intlayer) у локаль, яку має обслуговувати цей домен.
32
+ 3. Посилайтеся на цю змінну як `defaultLocale` у вашому `intlayer.config.[ts|js]`.
33
+
34
+ ```ts
35
+ import { Locales, type IntlayerConfig } from "intlayer";
36
+
37
+ const config: IntlayerConfig = {
38
+ internationalization: {
39
+ locales: [Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH],
40
+ defaultLocale: process.env.LOCALE, // 👈 домен визначає локаль
41
+ },
42
+ // ... решта вашої конфігурації
43
+ };
44
+
45
+ export default config;
46
+ ```
47
+
48
+ Ось і все — те саме працює для **Next.js**, **Vite + React**, **Vite + Vue** тощо.
49
+
50
+ ## Що якщо всі домени вказують на **те саме** розгортання?
51
+
52
+ Якщо всі домени вказують на той самий бандл застосунку, вам потрібно визначати хост під час виконання та передавати локаль вручну через провайдер.
53
+
54
+ ### Для Next.js
55
+
56
+ ```tsx
57
+ // src/IntlayerProvider.tsx
58
+ import {
59
+ IntlayerClientProvider,
60
+ type IntlayerClientProviderProps,
61
+ } from "next-intlayer";
62
+ import { IntlayerServerProvider } from "next-intlayer/server";
63
+ import type { FC } from "react";
64
+
65
+ export const IntlayerProvider: FC<IntlayerClientProviderProps> = ({
66
+ children,
67
+ locale,
68
+ }) => {
69
+ const resolvedLocale = locale ?? getLocaleFromHostname();
70
+ return (
71
+ <IntlayerServerProvider locale={resolvedLocale}>
72
+ <IntlayerClientProvider locale={resolvedLocale}>
73
+ {children}
74
+ </IntlayerClientProvider>
75
+ </IntlayerServerProvider>
76
+ );
77
+ };
78
+ ```
79
+
80
+ ### Для Vue
81
+
82
+ ```ts
83
+ import { createApp } from "vue";
84
+ import { installIntlayer } from "vue-intlayer";
85
+ import App from "./App.vue";
86
+ import { router } from "./routes";
87
+
88
+ const app = createApp(App);
89
+ app.use(router);
90
+ installIntlayer(app, getLocaleFromHostname());
91
+ app.mount("#app");
92
+ ```
93
+
94
+ Замініть `getLocaleFromHostname()` своєю власною логікою визначення локалі.
95
+
96
+ ## Оновіть ваш перемикач локалі
97
+
98
+ Коли використовується маршрутизація на основі доменів, зміна мови означає перехід на інший домен:
99
+
100
+ ```ts
101
+ const { locale } = useLocale();
102
+
103
+ function changeLanguage(target: Locale) {
104
+ window.location.href = domainForLocale[target];
105
+ }
106
+ ```
107
+
108
+ ## Переваги маршрутизації на основі доменів
109
+
110
+ 1. **Простіша конфігурація**: Немає потреби налаштовувати `intlayerProxy`, `generateStaticParams`, `react-router` або `vue-router`
111
+ 2. **Краще SEO**: Кожна мова має власний домен
112
+ 3. **Чистіші URL-адреси**: Немає префікса локалі в шляху
113
+ 4. **Простіше обслуговування**: Розгортання для кожної мови незалежне
@@ -0,0 +1,77 @@
1
+ ---
2
+ createdAt: 2026-01-11
3
+ updatedAt: 2026-01-11
4
+ title: `vite-env-only` & Intlayer – хибнопозитивна помилка відхилення `node:fs`
5
+ description: Чому vite-env-only повідомляє про відхилений імпорт `node:fs` з Intlayer + React-Router + Vite і що робити.
6
+ keywords:
7
+ - intlayer
8
+ - vite
9
+ - react-router
10
+ - vite-env-only
11
+ - node:fs
12
+ - відхилений імпорт
13
+ - alias
14
+ - клієнтський бандл
15
+ slugs:
16
+ - frequent-questions
17
+ - vite-env-only-node-fs-false-positive
18
+ ---
19
+
20
+ # vite-env-only відхиляє `node:fs` в Intlayer
21
+
22
+ Якщо ви використовували плагін **vite-env-only** (як зазначено в старих рекомендаціях React-Router v7) і бачите:
23
+
24
+ ```bash
25
+
26
+ Error: [vite-env-only] Import denied
27
+
28
+ * Denied by specifier pattern: /^node:/
29
+ * Importer: index.html
30
+ * Import: "node:fs"
31
+
32
+ ```
33
+
34
+ …незважаючи на те, що **в клієнтському бандлі немає `node:fs`**, це — **хибне спрацювання**.
35
+
36
+ ## Чому це відбувається
37
+
38
+ `vite-env-only` виконує перевірку на основі Babel **на ранньому етапі резолюції графа Vite**, _перед_:
39
+
40
+ - aliasing (включаючи відповідності Intlayer для browser vs node),
41
+ - dead-code elimination,
42
+ - SSR vs client resolution,
43
+ - віртуальні модулі, як-от ті в React-Router.
44
+
45
+ Пакети Intlayer містять код, який може працювати як у Node, так і в браузері. На _проміжному_ етапі в графі може з'явитися вбудований модуль Node, наприклад `node:fs`, **перед тим як** Vite видалить його з клієнтської збірки. `vite-env-only` помічає це і відразу видає помилку, хоча у фінальному бандлі його немає.
46
+
47
+ ## React-Router і серверні модулі
48
+
49
+ У документації React-Router щодо **конвенцій серверних модулів**
50
+ (https://reactrouter.com/api/framework-conventions/server-modules), команда **чітко рекомендує використовувати `vite-env-only`**, щоб запобігти потраплянню імпортів, призначених лише для сервера, у клієнтський бандл.
51
+
52
+ Однак ці конвенції покладаються на aliasing Vite, conditional exports і tree-shaking для видалення коду, призначеного лише для сервера. Хоча aliasing і conditional exports вже застосовані, деякі утиліти на основі Node все ще присутні в пакетах на кшталт `@intlayer/core` на цьому етапі (хоча вони ніколи не імпортуються на клієнті). Оскільки tree-shaking ще не відбувся, ці функції все ще парсяться Babel, і `vite-env-only` виявляє їхні імпорти `node:` та породжує false positive — хоча вони коректно очищуються з фінального клієнтського бандлу.
53
+
54
+ ## Як виправити / обійти
55
+
56
+ ### Рекомендовано: Видалити `vite-env-only`
57
+
58
+ Просто видаліть цей плагін. У багатьох випадках він не потрібен — Vite вже обробляє розрізнення імпортів для клієнта та сервера через власний механізм резолюції.
59
+
60
+ Це виправляє хибну відмову через `node:fs` без змін в Intlayer.
61
+
62
+ ### Натомість перевірте фінальну збірку
63
+
64
+ Якщо ви все ще хочете переконатися, що в клієнтському бандлі немає вбудованих модулів Node, робіть це **після збірки**, наприклад:
65
+
66
+ ```bash
67
+ pnpm build
68
+ grep -R "node:" dist/
69
+ ```
70
+
71
+ Якщо результатів немає, ваші клієнтські бандли чисті.
72
+
73
+ ## Підсумок
74
+
75
+ - `vite-env-only` може видавати помилку на `node:fs`, оскільки перевіряє занадто рано.
76
+ - Vite + Intlayer + конвенції server modules у React-Router зазвичай правильно видаляють посилання, призначені тільки для сервера.
77
+ - Видалення плагіна або перевірка _фінального виводу_ зазвичай є найкращим рішенням.
@@ -0,0 +1,29 @@
1
+ ---
2
+ createdAt: 2025-05-20
3
+ updatedAt: 2025-06-29
4
+ title: Помилка ESBuild
5
+ description: Дізнайтеся, як виправляти помилки ESBuild.
6
+ keywords:
7
+ - esbuild
8
+ - error
9
+ - intlayer
10
+ - plugin
11
+ - framework
12
+ - next.js
13
+ - vite
14
+ - react-native
15
+ - lynx
16
+ slugs:
17
+ - frequent-questions
18
+ - esbuild-error
19
+ ---
20
+
21
+ # Помилка ESBuild
22
+
23
+ Якщо під час збірки ви стикаєтеся з помилкою ESBuild, швидше за все плагін Intlayer налаштовано неправильно.
24
+
25
+ ESBuild відповідає за читання файлів декларації контенту (`.content.{ts,js,mjs,cjs,json}`) та генерацію відповідних словників у папці `.intlayer/dictionary`. А також за читання файлу конфігурації (`intlayer.config.ts`).
26
+
27
+ Intlayer надає плагіни для інтеграції з вашими бандлерами. Це призначено для створення псевдонімів (alias) для компонентів, які мають виконуватися лише на сервері.
28
+
29
+ Якщо ви використовуєте фреймворк, такий як Next.js (Webpack / Turbopack), Vite, React Native, Lynx тощо, Intlayer надає плагін, який можна використати для інтеграції Intlayer у ваш застосунок. Тому зверніться до специфічної документації вашого фреймворка, щоб дізнатися, як інтегрувати плагін.
@@ -0,0 +1,142 @@
1
+ ---
2
+ createdAt: 2025-05-20
3
+ updatedAt: 2025-06-29
4
+ title: Як отримати локаль із cookie / заголовків?
5
+ description: Дізнайтеся, як отримати локаль із cookie / заголовків.
6
+ keywords:
7
+ - cookie
8
+ - headers
9
+ - intlayer
10
+ - locale
11
+ - hook
12
+ - useLocale
13
+ - useLocaleCookie
14
+ - next.js
15
+ - react-intlayer
16
+ - vue-intlayer
17
+ slugs:
18
+ - frequent-questions
19
+ - get-locale-cookie
20
+ ---
21
+
22
+ # Як отримати локаль із cookie / заголовків
23
+
24
+ ## Використання хуків (рекомендується)
25
+
26
+ У більшості випадків рекомендовано отримувати поточну локаль за допомогою хука `useLocale`, оскільки вона вирішується автоматично. Це працює аналогічно до `useLocale` composable у Vue.js.
27
+
28
+ ```ts
29
+ import { useLocale } from "next-intlayer";
30
+ // or import { useLocale } from "react-intlayer";
31
+ // або імпортуйте { useLocale } з "vue-intlayer";
32
+
33
+ // Використання на клієнті
34
+ const { locale } = useLocale();
35
+ ```
36
+
37
+ Для серверних компонентів ви можете імпортувати його з:
38
+
39
+ ```tsx
40
+ import { useLocale } from "next-intlayer/server";
41
+
42
+ const Test = () => {
43
+ const { locale } = useLocale();
44
+ return <>{locale}</>;
45
+ };
46
+
47
+ const Page = async ({ params }) => {
48
+ const { locale } = await params;
49
+
50
+ return (
51
+ <IntlayerServerProvider locale={locale}>
52
+ <Test />
53
+ </IntlayerServerProvider>
54
+ );
55
+ };
56
+ ```
57
+
58
+ Також існує хук `useLocaleCookie`, який лише повертає значення cookie.
59
+
60
+ ## Ручна конфігурація cookie
61
+
62
+ Ви можете задати власну назву cookie, наприклад
63
+
64
+ ```ts
65
+ import { type IntlayerConfig } from "intlayer";
66
+
67
+ const config: IntlayerConfig = {
68
+ middleware: {
69
+ cookieName: "myCustomLocaleCookie", // за замовчуванням 'intlayer-locale'
70
+ },
71
+ };
72
+
73
+ export default config;
74
+ ```
75
+
76
+ отримати його наступним чином
77
+
78
+ ### На стороні клієнта
79
+
80
+ ```ts
81
+ // Використання імені cookie за замовчуванням
82
+ const locale = document.cookie
83
+ .split("; ")
84
+ .find((row) => row.startsWith("intlayer-locale="))
85
+ ?.split("=")[1];
86
+
87
+ // Використання користувацького імені cookie
88
+ const locale = document.cookie
89
+ .split("; ")
90
+ .find((row) => row.startsWith("myCustomLocaleCookie="))
91
+ ?.split("=")[1];
92
+ ```
93
+
94
+ ### На сервері (Next.js)
95
+
96
+ ```ts
97
+ import { cookies } from "next/headers";
98
+
99
+ // Використання імені cookie за замовчуванням
100
+ const locale = cookies().get("intlayer-locale")?.value;
101
+
102
+ // Використання користувацького імені cookie
103
+ const locale = cookies().get("myCustomLocaleCookie")?.value;
104
+ ```
105
+
106
+ ### Якщо локаль ще не встановлена
107
+
108
+ Локаль встановлюється в cookie лише після того, як користувач явно вибере локаль. За замовчуванням для нових відвідувачів локаль визначається за полями заголовків.
109
+
110
+ Ви можете визначити бажану локаль користувача з заголовків запиту. Ось приклад, як це можна реалізувати:
111
+
112
+ ```ts
113
+ /**
114
+ * Визначає локаль з заголовків запиту
115
+ *
116
+ * Заголовок accept-language є найважливішим для визначення локалі.
117
+ * Він містить список кодів мов зі значеннями якості (q-values), які вказують
118
+ * пріоритетні мови користувача в порядку переваги.
119
+ *
120
+ * Приклад: "en-US,en;q=0.9,fr;q=0.8,es;q=0.7"
121
+ * - en-US — основна мова (q=1.0 мається на увазі)
122
+ * - en — другий вибір (q=0.9)
123
+ * - fr — третій вибір (q=0.8)
124
+ * - es — четвертий вибір (q=0.7)
125
+ */
126
+ import { localeDetector } from "@intlayer/core";
127
+
128
+ /**
129
+ * Приклад negotiator headers, які зазвичай надсилають браузери
130
+ * Ці заголовки допомагають визначити переважну мову користувача
131
+ */
132
+ const exampleNegotiatorHeaders: Record<string, string> = {
133
+ "accept-language": "en-US,en;q=0.9,fr;q=0.8,es;q=0.7",
134
+ "accept":
135
+ "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
136
+ "user-agent":
137
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36",
138
+ };
139
+
140
+ // Приклад використання:
141
+ const detectedLocale = localeDetector(exampleNegotiatorHeaders);
142
+ ```