@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,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
|
+
```
|