@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,465 @@
|
|
|
1
|
+
---
|
|
2
|
+
createdAt: 2024-12-02
|
|
3
|
+
updatedAt: 2025-06-29
|
|
4
|
+
title: Документація: функція `t` у `express-intlayer`
|
|
5
|
+
description: Дізнайтеся, як використовувати функцію `t` у пакеті `express-intlayer`
|
|
6
|
+
keywords:
|
|
7
|
+
- t
|
|
8
|
+
- переклад
|
|
9
|
+
- Intlayer
|
|
10
|
+
- інтернаціоналізація
|
|
11
|
+
- документація
|
|
12
|
+
- Express
|
|
13
|
+
- JavaScript
|
|
14
|
+
- React
|
|
15
|
+
slugs:
|
|
16
|
+
- doc
|
|
17
|
+
- packages
|
|
18
|
+
- express-intlayer
|
|
19
|
+
- t
|
|
20
|
+
history:
|
|
21
|
+
- version: 5.5.10
|
|
22
|
+
date: 2025-06-29
|
|
23
|
+
changes: Ініціалізація історії
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
# Документація: функція `t` у `express-intlayer`
|
|
27
|
+
|
|
28
|
+
Функція `t` у пакеті `express-intlayer` — це основна утиліта для надання локалізованих відповідей у вашому додатку Express. Вона спрощує інтернаціоналізацію (i18n), динамічно підбираючи контент залежно від бажаної мови користувача.
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## Огляд
|
|
33
|
+
|
|
34
|
+
Функція `t` використовується для визначення та отримання перекладів для заданого набору мов. Вона автоматично визначає відповідну мову для повернення на основі налаштувань запиту клієнта, таких як заголовок `Accept-Language`. Якщо бажана мова недоступна, вона коректно повертає локаль за замовчуванням, вказану у вашій конфігурації.
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
## Ключові можливості
|
|
39
|
+
|
|
40
|
+
- **Динамічна локалізація**: автоматично обирає найвідповідніший переклад для клієнта.
|
|
41
|
+
- **Повернення до локалі за замовчуванням**: у разі недоступності бажаної мови використовується локаль за замовчуванням, що забезпечує безперервність користувацького досвіду.
|
|
42
|
+
- **Легкий і швидкий**: спроектовано для високопродуктивних застосунків, забезпечуючи мінімальні накладні витрати.
|
|
43
|
+
- **Підтримка Strict Mode**: Забезпечує суворе дотримання оголошених локалей для надійної роботи.
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
## Підпис функції
|
|
48
|
+
|
|
49
|
+
```typescript
|
|
50
|
+
t(translations: Record<string, string>): string;
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### Параметри
|
|
54
|
+
|
|
55
|
+
- `translations`: Об'єкт, де ключі — це коди локалей (наприклад, `en`, `fr`, `es-MX`), а значення — відповідні перекладені рядки.
|
|
56
|
+
|
|
57
|
+
### Повертає
|
|
58
|
+
|
|
59
|
+
- Рядок, що представляє вміст мовою, яку віддає перевагу клієнт.
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
## Завантаження обробника запитів інтернаціоналізації
|
|
64
|
+
|
|
65
|
+
Щоб забезпечити правильну роботу функціональності інтернаціоналізації, що надається `express-intlayer`, ви **повинні** завантажити middleware інтернаціоналізації на початку вашого Express-застосунку. Це активує функцію `t` і гарантує коректне визначення локалі та обробку перекладів.
|
|
66
|
+
|
|
67
|
+
Розмістіть middleware `app.use(intlayer())` **перед будь-якими маршрутами** у вашому додатку, щоб усі маршрути використовували інтернаціоналізацію:
|
|
68
|
+
|
|
69
|
+
```typescript {7} fileName="src/index.ts" codeFormat="typescript"
|
|
70
|
+
import express, { type Express } from "express";
|
|
71
|
+
import { intlayer } from "express-intlayer";
|
|
72
|
+
|
|
73
|
+
const app: Express = express();
|
|
74
|
+
|
|
75
|
+
// Завантажте обробник запитів інтернаціоналізації
|
|
76
|
+
app.use(intlayer());
|
|
77
|
+
|
|
78
|
+
// Визначте маршрути після завантаження middleware
|
|
79
|
+
app.get("/", (_req, res) => {
|
|
80
|
+
res.send(
|
|
81
|
+
t({
|
|
82
|
+
en: "Hello, World!",
|
|
83
|
+
fr: "Bonjour le monde!",
|
|
84
|
+
es: "¡Hola, Mundo!",
|
|
85
|
+
})
|
|
86
|
+
);
|
|
87
|
+
});
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
```javascript {7} fileName="src/index.mjs" codeFormat="esm"
|
|
91
|
+
import express from "express";
|
|
92
|
+
import { intlayer } from "express-intlayer";
|
|
93
|
+
|
|
94
|
+
const app = express();
|
|
95
|
+
|
|
96
|
+
// Завантажити обробник запитів інтернаціоналізації
|
|
97
|
+
app.use(intlayer());
|
|
98
|
+
|
|
99
|
+
// Визначте маршрути після завантаження middleware
|
|
100
|
+
app.get("/", (_req, res) => {
|
|
101
|
+
res.send(
|
|
102
|
+
t({
|
|
103
|
+
en: "Hello, World!",
|
|
104
|
+
fr: "Bonjour le monde!",
|
|
105
|
+
es: "¡Hola, Mundo!",
|
|
106
|
+
})
|
|
107
|
+
);
|
|
108
|
+
});
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
```javascript {7} fileName="src/index.cjs" codeFormat="commonjs"
|
|
112
|
+
const express = require("express");
|
|
113
|
+
const { intlayer } = require("express-intlayer");
|
|
114
|
+
|
|
115
|
+
const app = express();
|
|
116
|
+
|
|
117
|
+
// Завантажити обробник запитів інтернаціоналізації
|
|
118
|
+
app.use(intlayer());
|
|
119
|
+
|
|
120
|
+
// Визначте маршрути після завантаження middleware
|
|
121
|
+
app.get("/", (_req, res) => {
|
|
122
|
+
res.send(
|
|
123
|
+
t({
|
|
124
|
+
en: "Hello, World!",
|
|
125
|
+
fr: "Bonjour le monde!",
|
|
126
|
+
es: "¡Hola, Mundo!",
|
|
127
|
+
})
|
|
128
|
+
);
|
|
129
|
+
});
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
### Чому це потрібно
|
|
133
|
+
|
|
134
|
+
- **Виявлення локалі**: проміжне ПЗ `intlayer` обробляє вхідні запити, щоб визначити переважну локаль користувача на основі заголовків, cookies або інших налаштованих методів.
|
|
135
|
+
- **Контекст перекладу**: встановлює необхідний контекст для функції `t`, щоб вона працювала правильно, гарантуючи повернення перекладів потрібною мовою.
|
|
136
|
+
- **Запобігання помилкам**: без цього middleware використання функції `t` призведе до помилок виконання, оскільки необхідна інформація про локаль не буде доступна.
|
|
137
|
+
|
|
138
|
+
---
|
|
139
|
+
|
|
140
|
+
## Приклади використання
|
|
141
|
+
|
|
142
|
+
### Базовий приклад
|
|
143
|
+
|
|
144
|
+
Подача локалізованого контенту різними мовами:
|
|
145
|
+
|
|
146
|
+
```typescript fileName="src/index.ts" codeFormat="typescript"
|
|
147
|
+
app.get("/", (_req, res) => {
|
|
148
|
+
res.send(
|
|
149
|
+
t({
|
|
150
|
+
uk: "Ласкаво просимо!",
|
|
151
|
+
en: "Welcome!",
|
|
152
|
+
fr: "Bienvenue!",
|
|
153
|
+
es: "¡Bienvenido!",
|
|
154
|
+
})
|
|
155
|
+
);
|
|
156
|
+
});
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
```javascript fileName="src/index.mjs" codeFormat="esm"
|
|
160
|
+
app.get("/", (_req, res) => {
|
|
161
|
+
res.send(
|
|
162
|
+
t({
|
|
163
|
+
uk: "Ласкаво просимо!",
|
|
164
|
+
en: "Welcome!",
|
|
165
|
+
fr: "Bienvenue!",
|
|
166
|
+
es: "¡Bienvenido!",
|
|
167
|
+
})
|
|
168
|
+
);
|
|
169
|
+
});
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
```javascript fileName="src/index.cjs" codeFormat="commonjs"
|
|
173
|
+
app.get("/", (_req, res) => {
|
|
174
|
+
res.send(
|
|
175
|
+
t({
|
|
176
|
+
uk: "Ласкаво просимо!",
|
|
177
|
+
en: "Welcome!",
|
|
178
|
+
fr: "Bienvenue!",
|
|
179
|
+
es: "¡Bienvenido!",
|
|
180
|
+
})
|
|
181
|
+
);
|
|
182
|
+
});
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
**Запити клієнтів:**
|
|
186
|
+
|
|
187
|
+
- Клієнт з `Accept-Language: fr` отримає `Bienvenue!`.
|
|
188
|
+
- Клієнт з `Accept-Language: es` отримає `¡Bienvenido!`.
|
|
189
|
+
- Клієнт з `Accept-Language: de` отримає `Welcome!` (локаль за замовчуванням).
|
|
190
|
+
|
|
191
|
+
### Обробка помилок
|
|
192
|
+
|
|
193
|
+
Надайте повідомлення про помилки кількома мовами:
|
|
194
|
+
|
|
195
|
+
```typescript fileName="src/index.ts" codeFormat="typescript"
|
|
196
|
+
app.get("/error", (_req, res) => {
|
|
197
|
+
res.status(500).send(
|
|
198
|
+
t({
|
|
199
|
+
uk: "Сталася непередбачена помилка.",
|
|
200
|
+
en: "An unexpected error occurred.",
|
|
201
|
+
fr: "Une erreur inattendue s'est produite.",
|
|
202
|
+
es: "Ocurrió un error inesperado.",
|
|
203
|
+
})
|
|
204
|
+
);
|
|
205
|
+
});
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
```javascript fileName="src/index.mjs" codeFormat="esm"
|
|
209
|
+
app.get("/error", (_req, res) => {
|
|
210
|
+
res.status(500).send(
|
|
211
|
+
t({
|
|
212
|
+
uk: "Сталася непередбачена помилка.",
|
|
213
|
+
en: "An unexpected error occurred.",
|
|
214
|
+
fr: "Une erreur inattendue s'est produite.",
|
|
215
|
+
es: "Ocurrió un error inesperado.",
|
|
216
|
+
})
|
|
217
|
+
);
|
|
218
|
+
});
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
```javascript fileName="src/index.cjs" codeFormat="commonjs"
|
|
222
|
+
app.get("/error", (_req, res) => {
|
|
223
|
+
res.status(500).send(
|
|
224
|
+
t({
|
|
225
|
+
uk: "Сталася непередбачена помилка.",
|
|
226
|
+
en: "An unexpected error occurred.",
|
|
227
|
+
fr: "Une erreur inattendue s'est produite.",
|
|
228
|
+
es: "Ocurrió un error inesperado.",
|
|
229
|
+
})
|
|
230
|
+
);
|
|
231
|
+
});
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
---
|
|
235
|
+
|
|
236
|
+
### Використання варіантів локалі
|
|
237
|
+
|
|
238
|
+
Specify translations for locale-specific variants:
|
|
239
|
+
|
|
240
|
+
```typescript fileName="src/index.ts" codeFormat="typescript"
|
|
241
|
+
app.get("/greet", (_req, res) => {
|
|
242
|
+
res.send(
|
|
243
|
+
t({
|
|
244
|
+
en: "Hello!",
|
|
245
|
+
"en-GB": "Hello, mate!",
|
|
246
|
+
fr: "Bonjour!",
|
|
247
|
+
"es-MX": "¡Hola, amigo!",
|
|
248
|
+
"es-ES": "¡Hola!",
|
|
249
|
+
})
|
|
250
|
+
);
|
|
251
|
+
});
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
```javascript fileName="src/index.cjs" codeFormat="commonjs"
|
|
255
|
+
app.get("/greet", (_req, res) => {
|
|
256
|
+
res.send(
|
|
257
|
+
t({
|
|
258
|
+
en: "Hello!",
|
|
259
|
+
"en-GB": "Hello, mate!",
|
|
260
|
+
fr: "Bonjour!",
|
|
261
|
+
"es-MX": "¡Hola, amigo!",
|
|
262
|
+
"es-ES": "¡Hola!",
|
|
263
|
+
})
|
|
264
|
+
);
|
|
265
|
+
});
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
```javascript fileName="src/index.mjs" codeFormat="esm"
|
|
269
|
+
app.get("/greet", (_req, res) => {
|
|
270
|
+
res.send(
|
|
271
|
+
t({
|
|
272
|
+
en: "Hello!",
|
|
273
|
+
"en-GB": "Hello, mate!",
|
|
274
|
+
fr: "Bonjour!",
|
|
275
|
+
"es-MX": "¡Hola, amigo!",
|
|
276
|
+
"es-ES": "¡Hola!",
|
|
277
|
+
})
|
|
278
|
+
);
|
|
279
|
+
});
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
---
|
|
283
|
+
|
|
284
|
+
## Додаткові теми
|
|
285
|
+
|
|
286
|
+
### Механізм fallback
|
|
287
|
+
|
|
288
|
+
Якщо бажана локаль недоступна, функція `t` підставить значення з локалі за замовчуванням, визначеної в конфігурації (`defaultLocale`):
|
|
289
|
+
|
|
290
|
+
```typescript {5-6} fileName="intlayer.config.ts" codeFormat="typescript"
|
|
291
|
+
import { Locales, type IntlayerConfig } from "intlayer";
|
|
292
|
+
|
|
293
|
+
const config = {
|
|
294
|
+
internationalization: {
|
|
295
|
+
locales: [Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH],
|
|
296
|
+
defaultLocale: Locales.ENGLISH,
|
|
297
|
+
},
|
|
298
|
+
} satisfies IntlayerConfig;
|
|
299
|
+
|
|
300
|
+
export default config;
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
```javascript {5-6} fileName="intlayer.config.mjs" codeFormat="esm"
|
|
304
|
+
import { Locales } from "intlayer";
|
|
305
|
+
|
|
306
|
+
/** @type {import('intlayer').IntlayerConfig} */
|
|
307
|
+
const config = {
|
|
308
|
+
internationalization: {
|
|
309
|
+
locales: [Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH],
|
|
310
|
+
defaultLocale: Locales.ENGLISH,
|
|
311
|
+
},
|
|
312
|
+
};
|
|
313
|
+
|
|
314
|
+
export default config;
|
|
315
|
+
```
|
|
316
|
+
|
|
317
|
+
```javascript {5-6} fileName="intlayer.config.cjs" codeFormat="commonjs"
|
|
318
|
+
const { Locales } = require("intlayer");
|
|
319
|
+
|
|
320
|
+
/** @type {import('intlayer').IntlayerConfig} */
|
|
321
|
+
const config = {
|
|
322
|
+
internationalization: {
|
|
323
|
+
locales: [Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH],
|
|
324
|
+
defaultLocale: Locales.ENGLISH,
|
|
325
|
+
},
|
|
326
|
+
};
|
|
327
|
+
|
|
328
|
+
module.exports = config;
|
|
329
|
+
```
|
|
330
|
+
|
|
331
|
+
Наприклад:
|
|
332
|
+
|
|
333
|
+
- Якщо `defaultLocale` встановлено в `Locales.CHINESE`, а клієнт запитує `Locales.DUTCH`, повернутий переклад за замовчуванням буде значенням `Locales.CHINESE`.
|
|
334
|
+
- Якщо `defaultLocale` не визначено, функція `t` використає значення `Locales.ENGLISH`.
|
|
335
|
+
|
|
336
|
+
---
|
|
337
|
+
|
|
338
|
+
### Примусове застосування режиму `strict`
|
|
339
|
+
|
|
340
|
+
Налаштуйте функцію `t` для забезпечення суворої відповідності задекларованим локалям:
|
|
341
|
+
|
|
342
|
+
| Режим | Поведінка |
|
|
343
|
+
| ----------- | ------------------------------------------------------------------------------------------------------- |
|
|
344
|
+
| `strict` | Усі задекларовані локалі повинні мати переклади. Відсутні локалі призведуть до помилок. |
|
|
345
|
+
| `inclusive` | Задекларовані локалі повинні мати переклади. Відсутні локалі спричиняють попередження, але приймаються. |
|
|
346
|
+
| `loose` | Будь-яка наявна локаль приймається, навіть якщо не задекларована. |
|
|
347
|
+
|
|
348
|
+
Приклад конфігурації:
|
|
349
|
+
|
|
350
|
+
```typescript {7} fileName="intlayer.config.ts" codeFormat="typescript"
|
|
351
|
+
import { type IntlayerConfig } from "intlayer";
|
|
352
|
+
|
|
353
|
+
const config = {
|
|
354
|
+
// ... Ваша існуюча конфігурація
|
|
355
|
+
internationalization: {
|
|
356
|
+
// ... Ваші існуючі налаштування інтернаціоналізації
|
|
357
|
+
strictMode: "strict", // Застосовує строгий режим
|
|
358
|
+
},
|
|
359
|
+
} satisfies IntlayerConfig;
|
|
360
|
+
|
|
361
|
+
export default config;
|
|
362
|
+
```
|
|
363
|
+
|
|
364
|
+
```javascript {7} fileName="intlayer.config.mjs" codeFormat="esm"
|
|
365
|
+
import { type IntlayerConfig } from "intlayer";
|
|
366
|
+
|
|
367
|
+
const config = {
|
|
368
|
+
// ... Ваша існуюча конфігурація
|
|
369
|
+
internationalization: {
|
|
370
|
+
// ... Ваші існуючі налаштування інтернаціоналізації
|
|
371
|
+
strictMode: "strict", // Застосовує строгий режим
|
|
372
|
+
},
|
|
373
|
+
};
|
|
374
|
+
|
|
375
|
+
export default config;
|
|
376
|
+
```
|
|
377
|
+
|
|
378
|
+
```javascript {7} fileName="intlayer.config.cjs" codeFormat="commonjs"
|
|
379
|
+
/** @type {import('intlayer').IntlayerConfig} */
|
|
380
|
+
const config = {
|
|
381
|
+
// ... Ваша існуюча конфігурація
|
|
382
|
+
internationalization: {
|
|
383
|
+
// ... Ваша існуюча конфігурація інтернаціоналізації
|
|
384
|
+
strictMode: "strict", // Увімкнути строгий режим
|
|
385
|
+
},
|
|
386
|
+
};
|
|
387
|
+
|
|
388
|
+
module.exports = config;
|
|
389
|
+
```
|
|
390
|
+
|
|
391
|
+
---
|
|
392
|
+
|
|
393
|
+
### Інтеграція з TypeScript
|
|
394
|
+
|
|
395
|
+
Функція `t` є типобезпечною при використанні з TypeScript. Визначте типобезпечний об'єкт перекладів:
|
|
396
|
+
|
|
397
|
+
```typescript fileName="src/index.ts" codeFormat="typescript"
|
|
398
|
+
import { type LanguageContent } from "express-intlayer";
|
|
399
|
+
|
|
400
|
+
const translations: LanguageContent<string> = {
|
|
401
|
+
en: "Good morning!",
|
|
402
|
+
fr: "Bonjour!",
|
|
403
|
+
es: "¡Buenos días!",
|
|
404
|
+
};
|
|
405
|
+
|
|
406
|
+
app.get("/morning", (_req, res) => {
|
|
407
|
+
res.send(t(translations));
|
|
408
|
+
});
|
|
409
|
+
```
|
|
410
|
+
|
|
411
|
+
```javascript fileName="src/index.mjs" codeFormat="esm"
|
|
412
|
+
import { type LanguageContent } from "express-intlayer";
|
|
413
|
+
|
|
414
|
+
/** @type {import('express-intlayer').LanguageContent<string>} */
|
|
415
|
+
const translations = {
|
|
416
|
+
uk: "Доброго ранку!",
|
|
417
|
+
en: "Good morning!",
|
|
418
|
+
fr: "Bonjour!",
|
|
419
|
+
es: "¡Buenos días!",
|
|
420
|
+
};
|
|
421
|
+
|
|
422
|
+
app.get("/morning", (_req, res) => {
|
|
423
|
+
res.send(t(translations));
|
|
424
|
+
});
|
|
425
|
+
```
|
|
426
|
+
|
|
427
|
+
```javascript fileName="src/index.cjs" codeFormat="commonjs"
|
|
428
|
+
const { type LanguageContent } = require("express-intlayer");
|
|
429
|
+
|
|
430
|
+
/** @type {import('express-intlayer').LanguageContent<string>} */
|
|
431
|
+
const translations = {
|
|
432
|
+
uk: "Доброго ранку!",
|
|
433
|
+
en: "Good morning!",
|
|
434
|
+
fr: "Bonjour!",
|
|
435
|
+
es: "¡Buenos días!",
|
|
436
|
+
};
|
|
437
|
+
|
|
438
|
+
app.get("/morning", (_req, res) => {
|
|
439
|
+
res.send(t(translations));
|
|
440
|
+
});
|
|
441
|
+
```
|
|
442
|
+
|
|
443
|
+
---
|
|
444
|
+
|
|
445
|
+
### Загальні помилки та усунення неполадок
|
|
446
|
+
|
|
447
|
+
| Проблема | Причина | Рішення |
|
|
448
|
+
| ---------------------------- | ---------------------------------------- | ---------------------------------------------------------------- |
|
|
449
|
+
| `t` функція не працює | Middleware не підключено | Переконайтеся, що `app.use(intlayer())` додано перед маршрутами. |
|
|
450
|
+
| Помилка відсутніх перекладів | Увімкнено строгий режим без усіх локалей | Надайте всі необхідні переклади. |
|
|
451
|
+
|
|
452
|
+
---
|
|
453
|
+
|
|
454
|
+
## Поради для ефективного використання
|
|
455
|
+
|
|
456
|
+
1. **Централізуйте переклади**: Використовуйте централізований модуль або JSON-файли для керування перекладами, щоб покращити підтримуваність.
|
|
457
|
+
2. **Перевіряйте переклади**: Переконайтеся, що кожен мовний варіант має відповідний переклад, щоб уникнути непотрібного fallback.
|
|
458
|
+
3. **Поєднуйте з фронтенд i18n**: Синхронізуйте з фронтендовою інтернаціоналізацією для безперервного користувацького досвіду в додатку.
|
|
459
|
+
4. **Вимірюйте продуктивність**: Перевірте час відгуку вашого додатку при додаванні перекладів, щоб забезпечити мінімальний вплив.
|
|
460
|
+
|
|
461
|
+
---
|
|
462
|
+
|
|
463
|
+
## Висновок
|
|
464
|
+
|
|
465
|
+
Функція `t` — потужний інструмент для інтернаціоналізації бекенду. Правильно використовуючи її, ви можете створити більш інклюзивний та зручний додаток для глобальної аудиторії. Для просунутого використання та детальних опцій конфігурації див. [документацію](https://github.com/aymericzip/intlayer/blob/main/docs/docs/uk/configuration.md).
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
---
|
|
2
|
+
createdAt: 2025-08-23
|
|
3
|
+
updatedAt: 2025-08-23
|
|
4
|
+
title: Документація функції getEnumeration | intlayer
|
|
5
|
+
description: Дивіться, як використовувати функцію getEnumeration у пакеті intlayer
|
|
6
|
+
keywords:
|
|
7
|
+
- getEnumeration
|
|
8
|
+
- переклад
|
|
9
|
+
- Intlayer
|
|
10
|
+
- intlayer
|
|
11
|
+
- Інтернаціоналізація
|
|
12
|
+
- Документація
|
|
13
|
+
- Next.js
|
|
14
|
+
- JavaScript
|
|
15
|
+
- React
|
|
16
|
+
slugs:
|
|
17
|
+
- doc
|
|
18
|
+
- packages
|
|
19
|
+
- intlayer
|
|
20
|
+
- getEnumeration
|
|
21
|
+
history:
|
|
22
|
+
- version: 5.5.10
|
|
23
|
+
date: 2025-06-29
|
|
24
|
+
changes: Ініціалізація історії
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
# Документація: функція `getEnumeration` в `intlayer`
|
|
28
|
+
|
|
29
|
+
## Опис
|
|
30
|
+
|
|
31
|
+
Функція `getEnumeration` повертає контент, що відповідає певній кількості, на основі заздалегідь визначених умов в об'єкті перечислення. Умови задаються як ключі, а їхній пріоритет визначається порядком їх розташування в об'єкті.
|
|
32
|
+
|
|
33
|
+
## Параметри
|
|
34
|
+
|
|
35
|
+
- `enumerationContent: QuantityContent<Content>`
|
|
36
|
+
- **Опис**: Об'єкт, де ключі представляють умови (наприклад `<=`, `<`, `>=`, `=`), а значення — відповідний вміст. Порядок ключів визначає пріоритет їхнього зіставлення.
|
|
37
|
+
- **Тип**: `QuantityContent<Content>`
|
|
38
|
+
- `Content` може бути будь-якого типу.
|
|
39
|
+
|
|
40
|
+
- `quantity: number`
|
|
41
|
+
- **Опис**: Числове значення, яке використовується для співставлення з умовами в `enumerationContent`.
|
|
42
|
+
- **Тип**: `number`
|
|
43
|
+
|
|
44
|
+
## Повертає
|
|
45
|
+
|
|
46
|
+
- **Тип**: `Content`
|
|
47
|
+
- **Опис**: Вміст, що відповідає першій умові, яка збіглася в `enumerationContent`. Якщо збігів не знайдено, поведінка залежить від реалізації (наприклад, помилка або запасний вміст).
|
|
48
|
+
|
|
49
|
+
## Приклад використання
|
|
50
|
+
|
|
51
|
+
### Базове використання
|
|
52
|
+
|
|
53
|
+
```typescript codeFormat="typescript"
|
|
54
|
+
import { getEnumeration } from "intlayer";
|
|
55
|
+
|
|
56
|
+
const content = getEnumeration(
|
|
57
|
+
{
|
|
58
|
+
"<=-2.3": "У вас менше ніж -2.3",
|
|
59
|
+
"<1": "У вас менше ніж один",
|
|
60
|
+
"2": "У вас два",
|
|
61
|
+
">=3": "У вас три або більше",
|
|
62
|
+
},
|
|
63
|
+
2
|
|
64
|
+
);
|
|
65
|
+
|
|
66
|
+
console.log(content); // Вивід: "У вас два"
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
```javascript codeFormat="esm"
|
|
70
|
+
import { getEnumeration } from "intlayer";
|
|
71
|
+
|
|
72
|
+
const content = getEnumeration(
|
|
73
|
+
{
|
|
74
|
+
"<1": "У вас менше ніж один",
|
|
75
|
+
"2": "У вас два",
|
|
76
|
+
">=3": "У вас три або більше",
|
|
77
|
+
},
|
|
78
|
+
2
|
|
79
|
+
);
|
|
80
|
+
|
|
81
|
+
console.log(content); // Вивід: "У вас два"
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
```javascript codeFormat="commonjs"
|
|
85
|
+
const { getEnumeration } = require("intlayer");
|
|
86
|
+
|
|
87
|
+
const content = getEnumeration(
|
|
88
|
+
{
|
|
89
|
+
"<1": "У вас менше ніж один",
|
|
90
|
+
"2": "У вас два",
|
|
91
|
+
">=3": "У вас три або більше",
|
|
92
|
+
},
|
|
93
|
+
2
|
|
94
|
+
);
|
|
95
|
+
|
|
96
|
+
console.log(content); // Вивід: "You have two"
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
### Пріоритет умов
|
|
100
|
+
|
|
101
|
+
```typescript codeFormat="typescript"
|
|
102
|
+
import { getEnumeration } from "intlayer";
|
|
103
|
+
|
|
104
|
+
const content = getEnumeration(
|
|
105
|
+
{
|
|
106
|
+
"<4": "You have less than four",
|
|
107
|
+
"2": "You have two",
|
|
108
|
+
},
|
|
109
|
+
2
|
|
110
|
+
);
|
|
111
|
+
|
|
112
|
+
console.log(content); // Вивід: "You have less than four"
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
```javascript codeFormat="esm"
|
|
116
|
+
import { getEnumeration } from "intlayer";
|
|
117
|
+
|
|
118
|
+
const content = getEnumeration(
|
|
119
|
+
{
|
|
120
|
+
"<4": "You have less than four",
|
|
121
|
+
"2": "You have two",
|
|
122
|
+
},
|
|
123
|
+
2
|
|
124
|
+
);
|
|
125
|
+
|
|
126
|
+
console.log(content); // Вивід: "You have less than four"
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
```javascript codeFormat="commonjs"
|
|
130
|
+
const { getEnumeration } = require("intlayer");
|
|
131
|
+
|
|
132
|
+
const content = getEnumeration(
|
|
133
|
+
{
|
|
134
|
+
"<4": "You have less than four",
|
|
135
|
+
"2": "You have two",
|
|
136
|
+
},
|
|
137
|
+
2
|
|
138
|
+
);
|
|
139
|
+
|
|
140
|
+
console.log(content); // Вивід: "You have less than four"
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
## Граничні випадки
|
|
144
|
+
|
|
145
|
+
- **Відсутність відповідної умови:**
|
|
146
|
+
- Якщо жодна умова не відповідає переданій кількості, функція або поверне `undefined`, або явно обробить сценарій за замовчуванням (fallback).
|
|
147
|
+
|
|
148
|
+
- **Неоднозначні умови:**
|
|
149
|
+
- Якщо умови перекриваються, пріоритет має перша знайдена умова (в порядку визначення в об'єкті).
|
|
150
|
+
|
|
151
|
+
- **Невірні ключі:**
|
|
152
|
+
- Функція припускає, що всі ключі в `enumerationContent` є дійсними та розбираються як умови. Невірні або неправильно відформатовані ключі можуть призвести до непередбаченої поведінки.
|
|
153
|
+
|
|
154
|
+
- **Забезпечення TypeScript:**
|
|
155
|
+
- Функція гарантує, що тип `Content` узгоджений для всіх ключів, що дозволяє забезпечити типобезпеку при отриманні вмісту.
|
|
156
|
+
|
|
157
|
+
## Примітки
|
|
158
|
+
|
|
159
|
+
- Утиліта `findMatchingCondition` використовується для визначення відповідної умови на основі заданої кількості.
|