@intlayer/docs 5.7.8 → 5.8.0
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/intlayer_with_next-i18next.md +5 -6
- package/blog/ar/intlayer_with_next-intl.md +3 -4
- package/blog/ar/intlayer_with_react-i18next.md +1 -1
- package/blog/ar/intlayer_with_react-intl.md +1 -1
- package/blog/ar/next-i18next_vs_next-intl_vs_intlayer.md +96 -219
- package/blog/ar/react-i18next_vs_react-intl_vs_intlayer.md +88 -129
- package/blog/ar/vue-i18n_vs_intlayer.md +268 -0
- package/blog/de/intlayer_with_next-i18next.md +5 -6
- package/blog/de/intlayer_with_react-intl.md +1 -1
- package/blog/de/next-i18next_vs_next-intl_vs_intlayer.md +93 -216
- package/blog/de/react-i18next_vs_react-intl_vs_intlayer.md +87 -128
- package/blog/de/vue-i18n_vs_intlayer.md +268 -0
- package/blog/en/intlayer_with_next-i18next.md +5 -6
- package/blog/en/intlayer_with_next-intl.md +3 -4
- package/blog/en/intlayer_with_react-i18next.md +1 -1
- package/blog/en/intlayer_with_react-intl.md +1 -1
- package/blog/en/next-i18next_vs_next-intl_vs_intlayer.md +89 -220
- package/blog/en/react-i18next_vs_react-intl_vs_intlayer.md +85 -123
- package/blog/en/vue-i18n_vs_intlayer.md +268 -0
- package/blog/en-GB/intlayer_with_next-i18next.md +5 -6
- package/blog/en-GB/intlayer_with_next-intl.md +3 -4
- package/blog/en-GB/intlayer_with_react-i18next.md +1 -1
- package/blog/en-GB/intlayer_with_react-intl.md +1 -1
- package/blog/en-GB/next-i18next_vs_next-intl_vs_intlayer.md +85 -218
- package/blog/en-GB/react-i18next_vs_react-intl_vs_intlayer.md +80 -130
- package/blog/en-GB/vue-i18n_vs_intlayer.md +258 -0
- package/blog/es/intlayer_with_next-i18next.md +5 -6
- package/blog/es/intlayer_with_next-intl.md +3 -4
- package/blog/es/intlayer_with_react-i18next.md +1 -1
- package/blog/es/intlayer_with_react-intl.md +1 -1
- package/blog/es/next-i18next_vs_next-intl_vs_intlayer.md +93 -216
- package/blog/es/react-i18next_vs_react-intl_vs_intlayer.md +87 -128
- package/blog/es/vue-i18n_vs_intlayer.md +268 -0
- package/blog/fr/intlayer_with_next-i18next.md +5 -6
- package/blog/fr/intlayer_with_next-intl.md +3 -4
- package/blog/fr/intlayer_with_react-i18next.md +1 -1
- package/blog/fr/intlayer_with_react-intl.md +1 -1
- package/blog/fr/next-i18next_vs_next-intl_vs_intlayer.md +91 -214
- package/blog/fr/react-i18next_vs_react-intl_vs_intlayer.md +86 -127
- package/blog/fr/vue-i18n_vs_intlayer.md +269 -0
- package/blog/hi/intlayer_with_next-i18next.md +5 -6
- package/blog/hi/intlayer_with_next-intl.md +3 -4
- package/blog/hi/intlayer_with_react-i18next.md +1 -1
- package/blog/hi/intlayer_with_react-intl.md +1 -1
- package/blog/hi/next-i18next_vs_next-intl_vs_intlayer.md +97 -220
- package/blog/hi/react-i18next_vs_react-intl_vs_intlayer.md +89 -130
- package/blog/hi/vue-i18n_vs_intlayer.md +268 -0
- package/blog/it/intlayer_with_next-i18next.md +5 -6
- package/blog/it/intlayer_with_next-intl.md +3 -4
- package/blog/it/intlayer_with_react-i18next.md +1 -1
- package/blog/it/intlayer_with_react-intl.md +1 -1
- package/blog/it/next-i18next_vs_next-intl_vs_intlayer.md +91 -214
- package/blog/it/react-i18next_vs_react-intl_vs_intlayer.md +86 -127
- package/blog/it/vue-i18n_vs_intlayer.md +268 -0
- package/blog/ja/intlayer_with_next-i18next.md +5 -6
- package/blog/ja/intlayer_with_next-intl.md +3 -4
- package/blog/ja/intlayer_with_react-intl.md +1 -1
- package/blog/ja/next-i18next_vs_next-intl_vs_intlayer.md +93 -216
- package/blog/ja/react-i18next_vs_react-intl_vs_intlayer.md +87 -128
- package/blog/ja/vue-i18n_vs_intlayer.md +268 -0
- package/blog/ko/intlayer_with_next-i18next.md +5 -6
- package/blog/ko/intlayer_with_next-intl.md +3 -4
- package/blog/ko/intlayer_with_react-intl.md +1 -1
- package/blog/ko/next-i18next_vs_next-intl_vs_intlayer.md +95 -217
- package/blog/ko/react-i18next_vs_react-intl_vs_intlayer.md +89 -130
- package/blog/ko/vue-i18n_vs_intlayer.md +268 -0
- package/blog/pt/intlayer_with_next-i18next.md +5 -6
- package/blog/pt/intlayer_with_next-intl.md +3 -4
- package/blog/pt/intlayer_with_react-intl.md +1 -1
- package/blog/pt/next-i18next_vs_next-intl_vs_intlayer.md +93 -216
- package/blog/pt/react-i18next_vs_react-intl_vs_intlayer.md +87 -128
- package/blog/pt/vue-i18n_vs_intlayer.md +268 -0
- package/blog/ru/intlayer_with_next-i18next.md +5 -6
- package/blog/ru/intlayer_with_next-intl.md +3 -4
- package/blog/ru/intlayer_with_react-i18next.md +1 -1
- package/blog/ru/intlayer_with_react-intl.md +1 -1
- package/blog/ru/next-i18next_vs_next-intl_vs_intlayer.md +94 -217
- package/blog/ru/react-i18next_vs_react-intl_vs_intlayer.md +87 -128
- package/blog/ru/vue-i18n_vs_intlayer.md +268 -0
- package/blog/zh/intlayer_with_next-i18next.md +5 -6
- package/blog/zh/intlayer_with_next-intl.md +3 -4
- package/blog/zh/intlayer_with_react-i18next.md +1 -1
- package/blog/zh/intlayer_with_react-intl.md +1 -1
- package/blog/zh/next-i18next_vs_next-intl_vs_intlayer.md +93 -216
- package/blog/zh/react-i18next_vs_react-intl_vs_intlayer.md +87 -128
- package/blog/zh/vue-i18n_vs_intlayer.md +269 -0
- package/dist/cjs/generated/blog.entry.cjs +41 -0
- package/dist/cjs/generated/blog.entry.cjs.map +1 -1
- package/dist/cjs/generated/docs.entry.cjs +41 -0
- package/dist/cjs/generated/docs.entry.cjs.map +1 -1
- package/dist/esm/generated/blog.entry.mjs +41 -0
- package/dist/esm/generated/blog.entry.mjs.map +1 -1
- package/dist/esm/generated/docs.entry.mjs +41 -0
- package/dist/esm/generated/docs.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/docs.entry.d.ts +1 -0
- package/dist/types/generated/docs.entry.d.ts.map +1 -1
- package/docs/ar/formatters.md +625 -0
- package/docs/ar/how_works_intlayer.md +2 -4
- package/docs/ar/interest_of_intlayer.md +159 -49
- package/docs/ar/intlayer_CMS.md +2 -3
- package/docs/ar/intlayer_visual_editor.md +2 -3
- package/docs/ar/intlayer_with_tanstack.md +1 -1
- package/docs/ar/introduction.md +7 -7
- package/docs/ar/packages/intlayer/index.md +3 -3
- package/docs/ar/packages/next-intlayer/index.md +3 -3
- package/docs/de/formatters.md +649 -0
- package/docs/de/interest_of_intlayer.md +161 -47
- package/docs/de/introduction.md +5 -5
- package/docs/de/packages/intlayer/index.md +3 -3
- package/docs/de/packages/next-intlayer/index.md +3 -3
- package/docs/de/packages/react-intlayer/index.md +3 -3
- package/docs/en/dictionary/enumeration.md +2 -2
- package/docs/en/dictionary/function_fetching.md +2 -2
- package/docs/en/dictionary/get_started.md +2 -2
- package/docs/en/dictionary/translation.md +2 -2
- package/docs/en/formatters.md +618 -0
- package/docs/en/how_works_intlayer.md +2 -4
- package/docs/en/interest_of_intlayer.md +170 -46
- package/docs/en/intlayer_CMS.md +2 -3
- package/docs/en/intlayer_visual_editor.md +2 -3
- package/docs/en/intlayer_with_create_react_app.md +2 -2
- package/docs/en/intlayer_with_express.md +2 -2
- package/docs/en/intlayer_with_tanstack.md +1 -1
- package/docs/en/introduction.md +7 -7
- package/docs/en/packages/express-intlayer/index.md +2 -2
- package/docs/en/packages/intlayer/getConfiguration.md +2 -3
- package/docs/en/packages/intlayer/getEnumeration.md +2 -7
- package/docs/en/packages/intlayer/getHTMLTextDir.md +2 -4
- package/docs/en/packages/intlayer/getLocaleLang.md +2 -4
- package/docs/en/packages/intlayer/getLocaleName.md +2 -3
- package/docs/en/packages/intlayer/getLocalizedUrl.md +2 -8
- package/docs/en/packages/intlayer/getMultilingualUrls.md +2 -7
- package/docs/en/packages/intlayer/getPathWithoutLocale.md +2 -3
- package/docs/en/packages/intlayer/getTranslation.md +2 -4
- package/docs/en/packages/intlayer/index.md +5 -5
- package/docs/en/packages/next-intlayer/index.md +5 -5
- package/docs/en/packages/next-intlayer/t.md +2 -2
- package/docs/en/packages/next-intlayer/useDictionary.md +2 -2
- package/docs/en/packages/next-intlayer/useIntlayer.md +2 -2
- package/docs/en/packages/next-intlayer/useLocale.md +2 -2
- package/docs/en/packages/react-intlayer/index.md +5 -5
- package/docs/en/packages/react-intlayer/t.md +2 -2
- package/docs/en/packages/react-intlayer/useI18n.md +2 -2
- package/docs/en/packages/react-intlayer/useIntlayer.md +2 -2
- package/docs/en/packages/react-intlayer/useLocale.md +2 -2
- package/docs/en/packages/react-scripts-intlayer/index.md +2 -2
- package/docs/en/packages/solid-intlayer/index.md +2 -2
- package/docs/en/packages/vite-intlayer/index.md +2 -2
- package/docs/en-GB/formatters.md +625 -0
- package/docs/en-GB/how_works_intlayer.md +2 -4
- package/docs/en-GB/interest_of_intlayer.md +157 -53
- package/docs/en-GB/intlayer_with_tanstack.md +1 -1
- package/docs/en-GB/introduction.md +2 -2
- package/docs/en-GB/packages/intlayer/index.md +3 -3
- package/docs/en-GB/packages/next-intlayer/index.md +3 -3
- package/docs/en-GB/packages/react-intlayer/index.md +3 -3
- package/docs/es/formatters.md +649 -0
- package/docs/es/how_works_intlayer.md +2 -4
- package/docs/es/interest_of_intlayer.md +156 -47
- package/docs/es/intlayer_with_tanstack.md +1 -1
- package/docs/es/introduction.md +5 -5
- package/docs/es/packages/intlayer/index.md +3 -3
- package/docs/es/packages/next-intlayer/index.md +3 -3
- package/docs/fr/formatters.md +649 -0
- package/docs/fr/how_works_intlayer.md +2 -4
- package/docs/fr/interest_of_intlayer.md +157 -46
- package/docs/fr/intlayer_with_tanstack.md +1 -1
- package/docs/fr/introduction.md +5 -5
- package/docs/fr/packages/intlayer/index.md +3 -3
- package/docs/fr/packages/next-intlayer/index.md +3 -3
- package/docs/fr/packages/react-intlayer/index.md +3 -3
- package/docs/hi/formatters.md +630 -0
- package/docs/hi/how_works_intlayer.md +2 -4
- package/docs/hi/interest_of_intlayer.md +155 -42
- package/docs/hi/intlayer_with_tanstack.md +1 -1
- package/docs/hi/introduction.md +5 -5
- package/docs/hi/packages/intlayer/index.md +3 -3
- package/docs/hi/packages/next-intlayer/index.md +3 -3
- package/docs/hi/packages/react-intlayer/index.md +3 -3
- package/docs/it/formatters.md +647 -0
- package/docs/it/how_works_intlayer.md +2 -4
- package/docs/it/interest_of_intlayer.md +157 -46
- package/docs/it/intlayer_with_tanstack.md +1 -1
- package/docs/it/introduction.md +5 -5
- package/docs/it/packages/intlayer/index.md +3 -3
- package/docs/it/packages/next-intlayer/index.md +3 -3
- package/docs/it/packages/react-intlayer/index.md +3 -3
- package/docs/ja/formatters.md +649 -0
- package/docs/ja/how_works_intlayer.md +2 -4
- package/docs/ja/interest_of_intlayer.md +154 -48
- package/docs/ja/intlayer_with_tanstack.md +1 -1
- package/docs/ja/introduction.md +5 -5
- package/docs/ja/packages/intlayer/index.md +3 -3
- package/docs/ja/packages/next-intlayer/index.md +3 -3
- package/docs/ja/packages/react-intlayer/index.md +3 -3
- package/docs/ko/formatters.md +649 -0
- package/docs/ko/how_works_intlayer.md +2 -4
- package/docs/ko/interest_of_intlayer.md +157 -48
- package/docs/ko/intlayer_with_tanstack.md +1 -1
- package/docs/ko/introduction.md +5 -5
- package/docs/ko/packages/intlayer/index.md +3 -3
- package/docs/ko/packages/next-intlayer/index.md +3 -3
- package/docs/ko/packages/react-intlayer/index.md +3 -3
- package/docs/pt/formatters.md +625 -0
- package/docs/pt/how_works_intlayer.md +2 -4
- package/docs/pt/interest_of_intlayer.md +162 -47
- package/docs/pt/intlayer_with_tanstack.md +1 -1
- package/docs/pt/introduction.md +5 -5
- package/docs/pt/packages/intlayer/index.md +3 -3
- package/docs/pt/packages/next-intlayer/index.md +3 -3
- package/docs/pt/packages/react-intlayer/index.md +3 -3
- package/docs/ru/autoFill.md +2 -2
- package/docs/ru/configuration.md +1 -40
- package/docs/ru/formatters.md +649 -0
- package/docs/ru/how_works_intlayer.md +5 -7
- package/docs/ru/index.md +1 -1
- package/docs/ru/interest_of_intlayer.md +165 -50
- package/docs/ru/intlayer_CMS.md +7 -8
- package/docs/ru/intlayer_cli.md +4 -7
- package/docs/ru/intlayer_visual_editor.md +5 -6
- package/docs/ru/intlayer_with_angular.md +1 -1
- package/docs/ru/intlayer_with_create_react_app.md +5 -5
- package/docs/ru/intlayer_with_lynx+react.md +1 -1
- package/docs/ru/intlayer_with_nextjs_15.md +3 -3
- package/docs/ru/intlayer_with_nextjs_page_router.md +2 -2
- package/docs/ru/intlayer_with_nuxt.md +1 -1
- package/docs/ru/intlayer_with_react_native+expo.md +2 -2
- package/docs/ru/intlayer_with_tanstack.md +3 -3
- package/docs/ru/intlayer_with_vite+preact.md +3 -3
- package/docs/ru/intlayer_with_vite+react.md +3 -3
- package/docs/ru/intlayer_with_vite+solid.md +1 -1
- package/docs/ru/intlayer_with_vite+svelte.md +1 -1
- package/docs/ru/intlayer_with_vite+vue.md +2 -2
- package/docs/ru/introduction.md +8 -8
- package/docs/ru/locale_mapper.md +1 -1
- package/docs/ru/packages/@intlayer/api/index.md +2 -2
- package/docs/ru/packages/@intlayer/chokidar/index.md +1 -1
- package/docs/ru/packages/@intlayer/cli/index.md +2 -2
- package/docs/ru/packages/@intlayer/config/index.md +2 -2
- package/docs/ru/packages/@intlayer/core/index.md +2 -2
- package/docs/ru/packages/@intlayer/design-system/index.md +2 -2
- package/docs/ru/packages/@intlayer/dictionary-entry/index.md +2 -2
- package/docs/ru/packages/@intlayer/editor/index.md +1 -1
- package/docs/ru/packages/@intlayer/editor-react/index.md +1 -1
- package/docs/ru/packages/@intlayer/webpack/index.md +1 -1
- package/docs/ru/packages/angular-intlayer/index.md +1 -1
- package/docs/ru/packages/express-intlayer/index.md +3 -3
- package/docs/ru/packages/express-intlayer/t.md +1 -1
- package/docs/ru/packages/intlayer/getEnumeration.md +3 -8
- package/docs/ru/packages/intlayer/getTranslation.md +3 -5
- package/docs/ru/packages/intlayer/getTranslationContent.md +1 -3
- package/docs/ru/packages/intlayer/index.md +6 -6
- package/docs/ru/packages/intlayer-cli/index.md +1 -1
- package/docs/ru/packages/intlayer-editor/index.md +2 -2
- package/docs/ru/packages/lynx-intlayer/index.md +1 -1
- package/docs/ru/packages/next-intlayer/index.md +7 -7
- package/docs/ru/packages/next-intlayer/t.md +4 -4
- package/docs/ru/packages/next-intlayer/useLocale.md +3 -3
- package/docs/ru/packages/nuxt-intlayer/index.md +1 -1
- package/docs/ru/packages/preact-intlayer/index.md +1 -1
- package/docs/ru/packages/react-intlayer/index.md +7 -7
- package/docs/ru/packages/react-intlayer/t.md +4 -4
- package/docs/ru/packages/react-native-intlayer/index.md +1 -1
- package/docs/ru/packages/react-scripts-intlayer/index.md +3 -3
- package/docs/ru/packages/solid-intlayer/index.md +3 -3
- package/docs/ru/packages/svelte-intlayer/index.md +1 -1
- package/docs/ru/packages/vite-intlayer/index.md +3 -3
- package/docs/ru/packages/vue-intlayer/index.md +1 -1
- package/docs/ru/per_locale_file.md +1 -1
- package/docs/ru/roadmap.md +3 -5
- package/docs/ru/vs_code_extension.md +1 -1
- package/docs/zh/formatters.md +647 -0
- package/docs/zh/how_works_intlayer.md +2 -4
- package/docs/zh/interest_of_intlayer.md +155 -48
- package/docs/zh/intlayer_with_tanstack.md +1 -1
- package/docs/zh/introduction.md +5 -5
- package/docs/zh/packages/intlayer/index.md +3 -3
- package/docs/zh/packages/next-intlayer/index.md +3 -3
- package/docs/zh/packages/react-intlayer/index.md +3 -3
- package/frequent_questions/ar/domain_routing.md +1 -1
- package/frequent_questions/en/domain_routing.md +1 -1
- package/frequent_questions/en-GB/domain_routing.md +1 -1
- package/frequent_questions/es/domain_routing.md +1 -1
- package/frequent_questions/fr/domain_routing.md +1 -1
- package/frequent_questions/hi/domain_routing.md +1 -1
- package/frequent_questions/it/domain_routing.md +1 -1
- package/frequent_questions/ko/domain_routing.md +1 -1
- package/frequent_questions/pt/domain_routing.md +1 -1
- package/frequent_questions/ru/domain_routing.md +1 -1
- package/frequent_questions/ru/get_locale_cookie.md +4 -4
- package/frequent_questions/ru/static_rendering.md +1 -2
- package/frequent_questions/zh/domain_routing.md +1 -1
- package/package.json +11 -11
- package/src/generated/blog.entry.ts +41 -0
- package/src/generated/docs.entry.ts +41 -0
|
@@ -0,0 +1,649 @@
|
|
|
1
|
+
---
|
|
2
|
+
createdAt: 2024-08-13
|
|
3
|
+
updatedAt: 2025-08-20
|
|
4
|
+
title: Форматтеры
|
|
5
|
+
description: Утилиты для форматирования с учётом локали на основе Intl для чисел, процентов, валюты, дат, относительного времени, единиц измерения и компактной записи. Включает кешированный помощник Intl.
|
|
6
|
+
keywords:
|
|
7
|
+
- Форматтеры
|
|
8
|
+
- Intl
|
|
9
|
+
- Число
|
|
10
|
+
- Валюта
|
|
11
|
+
- Процент
|
|
12
|
+
- Дата
|
|
13
|
+
- Относительное время
|
|
14
|
+
- Единицы измерения
|
|
15
|
+
- Компактный формат
|
|
16
|
+
- Список
|
|
17
|
+
- Интернационализация
|
|
18
|
+
slugs:
|
|
19
|
+
- doc
|
|
20
|
+
- formatters
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
# Форматтеры Intlayer
|
|
24
|
+
|
|
25
|
+
## Обзор
|
|
26
|
+
|
|
27
|
+
Intlayer предоставляет набор лёгких помощников, построенных поверх нативных API `Intl`, а также кешированный обёртку `Intl`, чтобы избежать многократного создания тяжёлых форматтеров. Эти утилиты полностью учитывают локаль и могут использоваться из основного пакета `intlayer`.
|
|
28
|
+
|
|
29
|
+
### Импорт
|
|
30
|
+
|
|
31
|
+
```ts
|
|
32
|
+
import {
|
|
33
|
+
Intl,
|
|
34
|
+
number,
|
|
35
|
+
percentage,
|
|
36
|
+
currency,
|
|
37
|
+
date,
|
|
38
|
+
relativeTime,
|
|
39
|
+
units,
|
|
40
|
+
compact,
|
|
41
|
+
list,
|
|
42
|
+
getLocaleName,
|
|
43
|
+
getLocaleLang,
|
|
44
|
+
getLocaleFromPath,
|
|
45
|
+
getPathWithoutLocale,
|
|
46
|
+
getLocalizedUrl,
|
|
47
|
+
getHTMLTextDir,
|
|
48
|
+
getContent,
|
|
49
|
+
getLocalisedContent,
|
|
50
|
+
getTranslation,
|
|
51
|
+
getIntlayer,
|
|
52
|
+
getIntlayerAsync,
|
|
53
|
+
} from "intlayer";
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
Если вы используете React, хуки также доступны; смотрите `react-intlayer/format`.
|
|
57
|
+
|
|
58
|
+
## Кешированный Intl
|
|
59
|
+
|
|
60
|
+
Экспортируемый `Intl` — это тонкая кешированная обёртка вокруг глобального `Intl`. Он мемоизирует экземпляры `NumberFormat`, `DateTimeFormat`, `RelativeTimeFormat`, `ListFormat`, `DisplayNames`, `Collator` и `PluralRules`, что позволяет избежать повторного создания одного и того же форматтера.
|
|
61
|
+
|
|
62
|
+
Поскольку создание форматтера относительно дорогостоящее, такое кеширование улучшает производительность без изменения поведения. Обёртка предоставляет тот же API, что и нативный `Intl`, поэтому использование идентично.
|
|
63
|
+
|
|
64
|
+
- Кеширование происходит на уровне процесса и прозрачно для вызывающих.
|
|
65
|
+
|
|
66
|
+
> Если `Intl.DisplayNames` недоступен в среде, выводится одно предупреждение только для разработчиков (рекомендуется использовать полифилл).
|
|
67
|
+
|
|
68
|
+
Примеры:
|
|
69
|
+
|
|
70
|
+
```ts
|
|
71
|
+
import { Intl } from "intlayer";
|
|
72
|
+
|
|
73
|
+
// Форматирование чисел
|
|
74
|
+
const numberFormat = new Intl.NumberFormat("en-GB", {
|
|
75
|
+
style: "currency",
|
|
76
|
+
currency: "GBP",
|
|
77
|
+
});
|
|
78
|
+
numberFormat.format(1234.5); // "£1,234.50"
|
|
79
|
+
|
|
80
|
+
// Отображение названий языков, регионов и т.д.
|
|
81
|
+
const displayNames = new Intl.DisplayNames("fr", { type: "language" });
|
|
82
|
+
displayNames.of("en"); // "anglais"
|
|
83
|
+
|
|
84
|
+
// Сортировка с учётом локали
|
|
85
|
+
const collator = new Intl.Collator("fr", { sensitivity: "base" });
|
|
86
|
+
collator.compare("é", "e"); // 0 (равны)
|
|
87
|
+
|
|
88
|
+
// Правила множественного числа
|
|
89
|
+
const pluralRules = new Intl.PluralRules("fr");
|
|
90
|
+
pluralRules.select(1); // "one"
|
|
91
|
+
pluralRules.select(2); // "other"
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
## Дополнительные утилиты Intl
|
|
95
|
+
|
|
96
|
+
Помимо помощников для форматтеров, вы также можете использовать кешированную обёртку Intl напрямую для других возможностей Intl:
|
|
97
|
+
|
|
98
|
+
### `Intl.DisplayNames`
|
|
99
|
+
|
|
100
|
+
Для локализованных названий языков, регионов, валют и систем письма:
|
|
101
|
+
|
|
102
|
+
```ts
|
|
103
|
+
import { Intl } from "intlayer";
|
|
104
|
+
|
|
105
|
+
const languageNames = new Intl.DisplayNames("en", { type: "language" });
|
|
106
|
+
languageNames.of("fr"); // "French"
|
|
107
|
+
|
|
108
|
+
const regionNames = new Intl.DisplayNames("fr", { type: "region" });
|
|
109
|
+
regionNames.of("US"); // "États-Unis"
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
### `Intl.Collator`
|
|
113
|
+
|
|
114
|
+
Для локализованного сравнения и сортировки строк:
|
|
115
|
+
|
|
116
|
+
```ts
|
|
117
|
+
import { Intl } from "intlayer";
|
|
118
|
+
|
|
119
|
+
const collator = new Intl.Collator("de", {
|
|
120
|
+
sensitivity: "base",
|
|
121
|
+
numeric: true,
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
const words = ["äpfel", "zebra", "100", "20"];
|
|
125
|
+
words.sort(collator.compare); // ["20", "100", "äpfel", "zebra"]
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### `Intl.PluralRules`
|
|
129
|
+
|
|
130
|
+
Для определения форм множественного числа в разных локалях:
|
|
131
|
+
|
|
132
|
+
```ts
|
|
133
|
+
import { Intl } from "intlayer";
|
|
134
|
+
|
|
135
|
+
const pluralRules = new Intl.PluralRules("ar");
|
|
136
|
+
pluralRules.select(0); // "zero"
|
|
137
|
+
pluralRules.select(1); // "one"
|
|
138
|
+
pluralRules.select(2); // "two"
|
|
139
|
+
pluralRules.select(3); // "few"
|
|
140
|
+
pluralRules.select(11); // "many"
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
## Утилиты локалей
|
|
144
|
+
|
|
145
|
+
### `getLocaleName(displayLocale, targetLocale?)`
|
|
146
|
+
|
|
147
|
+
Получает локализованное название локали на другом языке:
|
|
148
|
+
|
|
149
|
+
```ts
|
|
150
|
+
import { getLocaleName } from "intlayer";
|
|
151
|
+
|
|
152
|
+
getLocaleName("fr", "en"); // "French"
|
|
153
|
+
getLocaleName("en", "fr"); // "anglais"
|
|
154
|
+
getLocaleName("de", "es"); // "alemán"
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
- **displayLocale**: Локаль, для которой нужно получить название
|
|
158
|
+
- **targetLocale**: Локаль, на которой будет отображаться название (по умолчанию displayLocale)
|
|
159
|
+
|
|
160
|
+
### `getLocaleLang(locale?)`
|
|
161
|
+
|
|
162
|
+
Извлекает код языка из строки локали:
|
|
163
|
+
|
|
164
|
+
```ts
|
|
165
|
+
import { getLocaleLang } from "intlayer";
|
|
166
|
+
|
|
167
|
+
getLocaleLang("en-US"); // "en"
|
|
168
|
+
getLocaleLang("fr-CA"); // "fr"
|
|
169
|
+
getLocaleLang("de"); // "de"
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
- **locale**: Локаль, из которой нужно извлечь язык (по умолчанию текущая локаль)
|
|
173
|
+
|
|
174
|
+
### `getLocaleFromPath(inputUrl)`
|
|
175
|
+
|
|
176
|
+
Извлекает сегмент локали из URL или пути:
|
|
177
|
+
|
|
178
|
+
```ts
|
|
179
|
+
import { getLocaleFromPath } from "intlayer";
|
|
180
|
+
|
|
181
|
+
getLocaleFromPath("/en/dashboard"); // "en"
|
|
182
|
+
getLocaleFromPath("/fr/dashboard"); // "fr"
|
|
183
|
+
getLocaleFromPath("/dashboard"); // "en" (локаль по умолчанию)
|
|
184
|
+
getLocaleFromPath("https://example.com/es/about"); // "es"
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
- **inputUrl**: Полная строка URL или путь для обработки
|
|
188
|
+
- **returns**: Обнаруженная локаль или локаль по умолчанию, если локаль не найдена
|
|
189
|
+
|
|
190
|
+
### `getPathWithoutLocale(inputUrl, locales?)`
|
|
191
|
+
|
|
192
|
+
Удаляет сегмент локали из URL или пути:
|
|
193
|
+
|
|
194
|
+
```ts
|
|
195
|
+
import { getPathWithoutLocale } from "intlayer";
|
|
196
|
+
|
|
197
|
+
getPathWithoutLocale("/en/dashboard"); // "/dashboard"
|
|
198
|
+
getPathWithoutLocale("/fr/dashboard"); // "/dashboard"
|
|
199
|
+
getPathWithoutLocale("https://example.com/en/about"); // "https://example.com/about"
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
- **inputUrl**: Полная строка URL или путь для обработки
|
|
203
|
+
- **locales**: Необязательный массив поддерживаемых локалей (по умолчанию используется настроенный список локалей)
|
|
204
|
+
- **returns**: URL без сегмента локали
|
|
205
|
+
|
|
206
|
+
### `getLocalizedUrl(url, currentLocale, locales?, defaultLocale?, prefixDefault?)`
|
|
207
|
+
|
|
208
|
+
Генерирует локализованный URL для текущей локали:
|
|
209
|
+
|
|
210
|
+
```ts
|
|
211
|
+
import { getLocalizedUrl } from "intlayer";
|
|
212
|
+
|
|
213
|
+
getLocalizedUrl("/about", "fr", ["en", "fr"], "en", false); // "/fr/about"
|
|
214
|
+
getLocalizedUrl("/about", "en", ["en", "fr"], "en", false); // "/about"
|
|
215
|
+
getLocalizedUrl("https://example.com/about", "fr", ["en", "fr"], "en", true); // "https://example.com/fr/about"
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
- **url**: Исходный URL для локализации
|
|
219
|
+
- **currentLocale**: Текущая локаль
|
|
220
|
+
- **locales**: Необязательный массив поддерживаемых локалей (по умолчанию используется настроенный список локалей)
|
|
221
|
+
- **defaultLocale**: Необязательная локаль по умолчанию (по умолчанию используется настроенная локаль по умолчанию)
|
|
222
|
+
- **prefixDefault**: Добавлять ли префикс для локали по умолчанию (по умолчанию используется настроенное значение)
|
|
223
|
+
|
|
224
|
+
### `getHTMLTextDir(locale?)`
|
|
225
|
+
|
|
226
|
+
Возвращает направление текста для локали:
|
|
227
|
+
|
|
228
|
+
```ts
|
|
229
|
+
import { getHTMLTextDir } from "intlayer";
|
|
230
|
+
|
|
231
|
+
getHTMLTextDir("en-US"); // "ltr"
|
|
232
|
+
getHTMLTextDir("ar"); // "rtl"
|
|
233
|
+
getHTMLTextDir("he"); // "rtl"
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
- **locale**: Локаль, для которой нужно получить направление текста (по умолчанию текущая локаль)
|
|
237
|
+
- **returns**: `"ltr"`, `"rtl"` или `"auto"`
|
|
238
|
+
|
|
239
|
+
## Утилиты для обработки контента
|
|
240
|
+
|
|
241
|
+
### `getContent(node, nodeProps, locale?)`
|
|
242
|
+
|
|
243
|
+
Преобразует узел контента со всеми доступными плагинами (перевод, перечисление, вставка и т.д.):
|
|
244
|
+
|
|
245
|
+
```ts
|
|
246
|
+
import { getContent } from "intlayer";
|
|
247
|
+
|
|
248
|
+
const content = getContent(
|
|
249
|
+
contentNode,
|
|
250
|
+
{ dictionaryKey: "common", dictionaryPath: "/path/to/dict" },
|
|
251
|
+
"fr"
|
|
252
|
+
);
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
- **node**: Узел контента для преобразования
|
|
256
|
+
- **nodeProps**: Свойства для контекста преобразования
|
|
257
|
+
- **locale**: Необязательная локаль (по умолчанию используется настроенная локаль по умолчанию)
|
|
258
|
+
|
|
259
|
+
### `getLocalisedContent(node, locale, nodeProps, fallback?)`
|
|
260
|
+
|
|
261
|
+
Преобразует узел контента, используя только плагин перевода:
|
|
262
|
+
|
|
263
|
+
```ts
|
|
264
|
+
import { getLocalisedContent } from "intlayer";
|
|
265
|
+
|
|
266
|
+
const content = getLocalisedContent(
|
|
267
|
+
contentNode,
|
|
268
|
+
"fr",
|
|
269
|
+
{ dictionaryKey: "common" },
|
|
270
|
+
true // возврат к локали по умолчанию, если перевод отсутствует
|
|
271
|
+
);
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
- **node**: Узел контента для преобразования
|
|
275
|
+
- **locale**: Локаль, используемая для перевода
|
|
276
|
+
- **nodeProps**: Свойства для контекста преобразования
|
|
277
|
+
- **fallback**: Использовать ли резервный вариант с локалью по умолчанию (по умолчанию false)
|
|
278
|
+
|
|
279
|
+
### `getTranslation(languageContent, locale?, fallback?)`
|
|
280
|
+
|
|
281
|
+
Извлекает контент для конкретной локали из объекта с языковым содержимым:
|
|
282
|
+
|
|
283
|
+
```ts
|
|
284
|
+
import { getTranslation } from "intlayer";
|
|
285
|
+
|
|
286
|
+
const content = getTranslation(
|
|
287
|
+
{
|
|
288
|
+
en: "Hello",
|
|
289
|
+
fr: "Bonjour",
|
|
290
|
+
de: "Hallo",
|
|
291
|
+
},
|
|
292
|
+
"fr",
|
|
293
|
+
true
|
|
294
|
+
); // "Bonjour"
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
- **languageContent**: Объект, сопоставляющий локали с контентом
|
|
298
|
+
- **locale**: Целевая локаль (по умолчанию используется настроенная локаль по умолчанию)
|
|
299
|
+
- **fallback**: Использовать ли резервный вариант с локалью по умолчанию (по умолчанию true)
|
|
300
|
+
|
|
301
|
+
### `getIntlayer(dictionaryKey, locale?, plugins?)`
|
|
302
|
+
|
|
303
|
+
Получает и преобразует контент из словаря по ключу:
|
|
304
|
+
|
|
305
|
+
```ts
|
|
306
|
+
import { getIntlayer } from "intlayer";
|
|
307
|
+
|
|
308
|
+
const content = getIntlayer("common", "fr");
|
|
309
|
+
const nestedContent = getIntlayer("common", "fr", customPlugins);
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
- **dictionaryKey**: Ключ словаря для получения
|
|
313
|
+
- **locale**: Необязательная локаль (по умолчанию используется настроенная локаль по умолчанию)
|
|
314
|
+
- **plugins**: Необязательный массив пользовательских плагинов трансформации
|
|
315
|
+
|
|
316
|
+
### `getIntlayerAsync(dictionaryKey, locale?, plugins?)`
|
|
317
|
+
|
|
318
|
+
Асинхронно получает контент из удалённого словаря:
|
|
319
|
+
|
|
320
|
+
```ts
|
|
321
|
+
import { getIntlayerAsync } from "intlayer";
|
|
322
|
+
|
|
323
|
+
const content = await getIntlayerAsync("common", "fr");
|
|
324
|
+
```
|
|
325
|
+
|
|
326
|
+
- **dictionaryKey**: Ключ словаря для получения
|
|
327
|
+
- **locale**: Необязательная локаль (по умолчанию используется настроенная локаль по умолчанию)
|
|
328
|
+
- **plugins**: Необязательный массив пользовательских плагинов трансформации
|
|
329
|
+
|
|
330
|
+
## Форматтеры
|
|
331
|
+
|
|
332
|
+
Все ниже перечисленные помощники экспортируются из `intlayer`.
|
|
333
|
+
|
|
334
|
+
### `number(value, options?)`
|
|
335
|
+
|
|
336
|
+
Форматирует числовое значение с учетом локали, группировки и десятичных знаков.
|
|
337
|
+
|
|
338
|
+
- **value**: `number | string`
|
|
339
|
+
- **options**: `Intl.NumberFormatOptions & { locale?: LocalesValues }`
|
|
340
|
+
|
|
341
|
+
Примеры:
|
|
342
|
+
|
|
343
|
+
```ts
|
|
344
|
+
import { number } from "intlayer";
|
|
345
|
+
|
|
346
|
+
number(123456.789); // "123,456.789" (в en-US)
|
|
347
|
+
number("1000000", { locale: "fr" }); // "1 000 000"
|
|
348
|
+
number(1234.5, { minimumFractionDigits: 2 }); // "1,234.50"
|
|
349
|
+
```
|
|
350
|
+
|
|
351
|
+
### `percentage(value, options?)`
|
|
352
|
+
|
|
353
|
+
Форматирует число в строку с процентами.
|
|
354
|
+
|
|
355
|
+
Поведение: значения больше 1 интерпретируются как целые проценты и нормализуются (например, `25` → `25%`, `0.25` → `25%`).
|
|
356
|
+
|
|
357
|
+
- **value**: `number | string`
|
|
358
|
+
- **options**: `Intl.NumberFormatOptions & { locale?: LocalesValues }`
|
|
359
|
+
|
|
360
|
+
Примеры:
|
|
361
|
+
|
|
362
|
+
```ts
|
|
363
|
+
import { percentage } from "intlayer";
|
|
364
|
+
|
|
365
|
+
percentage(0.25); // "25%"
|
|
366
|
+
percentage(25); // "25%"
|
|
367
|
+
percentage(0.237, { minimumFractionDigits: 1 }); // "23.7%"
|
|
368
|
+
```
|
|
369
|
+
|
|
370
|
+
### `currency(value, options?)`
|
|
371
|
+
|
|
372
|
+
Форматирует значение как локализованную валюту. По умолчанию используется `USD` с двумя десятичными знаками.
|
|
373
|
+
|
|
374
|
+
- **value**: `number | string`
|
|
375
|
+
- **options**: `Intl.NumberFormatOptions & { locale?: LocalesValues }`
|
|
376
|
+
- Общие поля: `currency` (например, `"EUR"`), `currencyDisplay` (`"symbol" | "code" | "name"`)
|
|
377
|
+
|
|
378
|
+
Примеры:
|
|
379
|
+
|
|
380
|
+
```ts
|
|
381
|
+
import { currency } from "intlayer";
|
|
382
|
+
|
|
383
|
+
currency(1234.5, { currency: "EUR" }); // "€1,234.50"
|
|
384
|
+
currency("5000", { locale: "fr", currency: "CAD", currencyDisplay: "code" }); // "5 000,00 CAD"
|
|
385
|
+
```
|
|
386
|
+
|
|
387
|
+
### `date(date, optionsOrPreset?)`
|
|
388
|
+
|
|
389
|
+
Форматирует значение даты/времени с помощью `Intl.DateTimeFormat`.
|
|
390
|
+
|
|
391
|
+
- **date**: `Date | string | number`
|
|
392
|
+
- **optionsOrPreset**: `Intl.DateTimeFormatOptions & { locale?: LocalesValues }` или один из предустановленных вариантов:
|
|
393
|
+
- Предустановки: `"short" | "long" | "dateOnly" | "timeOnly" | "full"`
|
|
394
|
+
|
|
395
|
+
Примеры:
|
|
396
|
+
|
|
397
|
+
```ts
|
|
398
|
+
import { date } from "intlayer";
|
|
399
|
+
|
|
400
|
+
date(new Date(), "short"); // например, "08/02/25, 14:30"
|
|
401
|
+
date("2025-08-02T14:30:00Z", { locale: "fr", month: "long", day: "numeric" }); // "2 août"
|
|
402
|
+
```
|
|
403
|
+
|
|
404
|
+
### `relativeTime(from, to = new Date(), options?)`
|
|
405
|
+
|
|
406
|
+
Форматирует относительное время между двумя моментами с помощью `Intl.RelativeTimeFormat`.
|
|
407
|
+
|
|
408
|
+
- Передайте "now" в качестве первого аргумента и целевой момент вторым, чтобы получить естественную формулировку.
|
|
409
|
+
- **from**: `Date | string | number`
|
|
410
|
+
- **to**: `Date | string | number` (по умолчанию `new Date()`)
|
|
411
|
+
- **options**: `{ locale?: LocalesValues; unit?: Intl.RelativeTimeFormatUnit; numeric?: Intl.RelativeTimeFormatNumeric; style?: Intl.RelativeTimeFormatStyle }`
|
|
412
|
+
- По умолчанию `unit` равен `"second"`.
|
|
413
|
+
|
|
414
|
+
Примеры:
|
|
415
|
+
|
|
416
|
+
```ts
|
|
417
|
+
import { relativeTime } from "intlayer";
|
|
418
|
+
|
|
419
|
+
const now = new Date();
|
|
420
|
+
const in3Days = new Date(now.getTime() + 3 * 864e5);
|
|
421
|
+
relativeTime(now, in3Days, { unit: "day" }); // "через 3 дня"
|
|
422
|
+
|
|
423
|
+
const twoHoursAgo = new Date(now.getTime() - 2 * 3600e3);
|
|
424
|
+
relativeTime(now, twoHoursAgo, { unit: "hour", numeric: "auto" }); // "2 часа назад"
|
|
425
|
+
```
|
|
426
|
+
|
|
427
|
+
### `units(value, options?)`
|
|
428
|
+
|
|
429
|
+
Форматирует числовое значение как локализованную строку с единицей измерения, используя `Intl.NumberFormat` с `style: 'unit'`.
|
|
430
|
+
|
|
431
|
+
- **value**: `number | string`
|
|
432
|
+
- **options**: `Intl.NumberFormatOptions & { locale?: LocalesValues }`
|
|
433
|
+
- Общие поля: `unit` (например, `"kilometer"`, `"byte"`), `unitDisplay` (`"short" | "narrow" | "long"`)
|
|
434
|
+
- Значения по умолчанию: `unit: 'day'`, `unitDisplay: 'short'`, `useGrouping: false`
|
|
435
|
+
|
|
436
|
+
Примеры:
|
|
437
|
+
|
|
438
|
+
```ts
|
|
439
|
+
import { units } from "intlayer";
|
|
440
|
+
|
|
441
|
+
units(5, { unit: "kilometer", unitDisplay: "long", locale: "en-GB" }); // "5 kilometers"
|
|
442
|
+
units(1024, { unit: "byte", unitDisplay: "narrow" }); // "1,024B" (зависит от локали)
|
|
443
|
+
```
|
|
444
|
+
|
|
445
|
+
### `compact(value, options?)`
|
|
446
|
+
|
|
447
|
+
Форматирует число с использованием компактной нотации (например, `1.2K`, `1M`).
|
|
448
|
+
|
|
449
|
+
- **value**: `number | string`
|
|
450
|
+
- **options**: `Intl.NumberFormatOptions & { locale?: LocalesValues }` (использует `notation: 'compact'` под капотом)
|
|
451
|
+
|
|
452
|
+
Примеры:
|
|
453
|
+
|
|
454
|
+
```ts
|
|
455
|
+
import { compact } from "intlayer";
|
|
456
|
+
|
|
457
|
+
compact(1200); // "1.2K"
|
|
458
|
+
compact("1000000", { locale: "fr", compactDisplay: "long" }); // "1 million"
|
|
459
|
+
```
|
|
460
|
+
|
|
461
|
+
### `list(values, options?)`
|
|
462
|
+
|
|
463
|
+
Форматирует массив значений в локализованную строку списка с использованием `Intl.ListFormat`.
|
|
464
|
+
|
|
465
|
+
- **values**: `(string | number)[]`
|
|
466
|
+
- **options**: `Intl.ListFormatOptions & { locale?: LocalesValues }`
|
|
467
|
+
- Общие поля: `type` (`"conjunction" | "disjunction" | "unit"`), `style` (`"long" | "short" | "narrow"`)
|
|
468
|
+
- Значения по умолчанию: `type: 'conjunction'`, `style: 'long'`
|
|
469
|
+
|
|
470
|
+
Примеры:
|
|
471
|
+
|
|
472
|
+
```ts
|
|
473
|
+
import { list } from "intlayer";
|
|
474
|
+
|
|
475
|
+
list(["apple", "banana", "orange"]); // "apple, banana, and orange"
|
|
476
|
+
list(["red", "green", "blue"], { locale: "fr", type: "disjunction" }); // "rouge, vert ou bleu"
|
|
477
|
+
list([1, 2, 3], { type: "unit" }); // "1, 2, 3"
|
|
478
|
+
```
|
|
479
|
+
|
|
480
|
+
## Заметки
|
|
481
|
+
|
|
482
|
+
/// Все вспомогательные функции принимают входные данные в виде `string`; они внутренне приводятся к числам или датам.
|
|
483
|
+
/// Локаль по умолчанию берется из вашей настройки `internationalization.defaultLocale`, если не указана явно.
|
|
484
|
+
/// Эти утилиты являются тонкими обертками; для расширенного форматирования используйте стандартные опции `Intl`.
|
|
485
|
+
///
|
|
486
|
+
/// ## Точки входа и реэкспорты (`@index.ts`)
|
|
487
|
+
///
|
|
488
|
+
/// Форматтеры находятся в основном пакете и реэкспортируются из пакетов более высокого уровня для удобства импорта в разных средах выполнения:
|
|
489
|
+
///
|
|
490
|
+
/// Примеры:
|
|
491
|
+
///
|
|
492
|
+
/// ```ts
|
|
493
|
+
/// // Код приложения (рекомендуется)
|
|
494
|
+
/// import {
|
|
495
|
+
/// number,
|
|
496
|
+
/// currency,
|
|
497
|
+
/// date,
|
|
498
|
+
/// relativeTime,
|
|
499
|
+
/// units,
|
|
500
|
+
/// compact,
|
|
501
|
+
/// list,
|
|
502
|
+
/// Intl,
|
|
503
|
+
/// getLocaleName,
|
|
504
|
+
/// getLocaleLang,
|
|
505
|
+
/// getLocaleFromPath,
|
|
506
|
+
/// getPathWithoutLocale,
|
|
507
|
+
/// getLocalizedUrl,
|
|
508
|
+
/// getHTMLTextDir,
|
|
509
|
+
/// getContent,
|
|
510
|
+
/// getLocalisedContent,
|
|
511
|
+
/// getTranslation,
|
|
512
|
+
/// getIntlayer,
|
|
513
|
+
/// getIntlayerAsync,
|
|
514
|
+
///
|
|
515
|
+
} from "intlayer";
|
|
516
|
+
|
|
517
|
+
````
|
|
518
|
+
|
|
519
|
+
### React
|
|
520
|
+
|
|
521
|
+
Клиентские компоненты:
|
|
522
|
+
|
|
523
|
+
```tsx
|
|
524
|
+
import {
|
|
525
|
+
useNumber,
|
|
526
|
+
useCurrency,
|
|
527
|
+
useDate,
|
|
528
|
+
usePercentage,
|
|
529
|
+
useCompact,
|
|
530
|
+
useList,
|
|
531
|
+
useRelativeTime,
|
|
532
|
+
useUnit,
|
|
533
|
+
} from "react-intlayer/format";
|
|
534
|
+
// или в приложениях Next.js
|
|
535
|
+
import {
|
|
536
|
+
useNumber,
|
|
537
|
+
useCurrency,
|
|
538
|
+
useDate,
|
|
539
|
+
usePercentage,
|
|
540
|
+
useCompact,
|
|
541
|
+
useList,
|
|
542
|
+
useRelativeTime,
|
|
543
|
+
useUnit,
|
|
544
|
+
} from "next-intlayer/client/format";
|
|
545
|
+
|
|
546
|
+
const MyComponent = () => {
|
|
547
|
+
const number = useNumber();
|
|
548
|
+
const currency = useCurrency();
|
|
549
|
+
const date = useDate();
|
|
550
|
+
const percentage = usePercentage();
|
|
551
|
+
const compact = useCompact();
|
|
552
|
+
const list = useList();
|
|
553
|
+
const relativeTime = useRelativeTime();
|
|
554
|
+
const unit = useUnit();
|
|
555
|
+
|
|
556
|
+
return (
|
|
557
|
+
<div>
|
|
558
|
+
<p>{number(123456.789)}</p>
|
|
559
|
+
<p>{currency(1234.5, { currency: "EUR" })}</p>
|
|
560
|
+
<p>{date(new Date(), "short")}</p>
|
|
561
|
+
<p>{percentage(0.25)}</p>
|
|
562
|
+
<p>{compact(1200)}</p>
|
|
563
|
+
<p>{list(["apple", "banana", "orange"])}</p>
|
|
564
|
+
<p>{relativeTime(new Date(), new Date() + 1000)}</p>
|
|
565
|
+
<p>{unit(123456.789, { unit: "kilometer" })}</p>
|
|
566
|
+
</div>
|
|
567
|
+
);
|
|
568
|
+
};
|
|
569
|
+
````
|
|
570
|
+
|
|
571
|
+
Серверные компоненты (или React Server runtime):
|
|
572
|
+
|
|
573
|
+
```ts
|
|
574
|
+
import {
|
|
575
|
+
useNumber,
|
|
576
|
+
useCurrency,
|
|
577
|
+
useDate,
|
|
578
|
+
usePercentage,
|
|
579
|
+
useCompact,
|
|
580
|
+
useList,
|
|
581
|
+
useRelativeTime,
|
|
582
|
+
useUnit,
|
|
583
|
+
} from "react-intlayer/server/format";
|
|
584
|
+
// или в приложениях Next.js
|
|
585
|
+
import {
|
|
586
|
+
useNumber,
|
|
587
|
+
useCurrency,
|
|
588
|
+
useDate,
|
|
589
|
+
usePercentage,
|
|
590
|
+
useCompact,
|
|
591
|
+
useList,
|
|
592
|
+
useRelativeTime,
|
|
593
|
+
useUnit,
|
|
594
|
+
} from "next-intlayer/server/format";
|
|
595
|
+
```
|
|
596
|
+
|
|
597
|
+
> Эти хуки будут учитывать локаль из `IntlayerProvider` или `IntlayerServerProvider`
|
|
598
|
+
|
|
599
|
+
### Vue
|
|
600
|
+
|
|
601
|
+
Клиентские компоненты:
|
|
602
|
+
|
|
603
|
+
```ts
|
|
604
|
+
import {
|
|
605
|
+
useNumber,
|
|
606
|
+
useCurrency,
|
|
607
|
+
useDate,
|
|
608
|
+
usePercentage,
|
|
609
|
+
useCompact,
|
|
610
|
+
useList,
|
|
611
|
+
useRelativeTime,
|
|
612
|
+
useUnit,
|
|
613
|
+
} from "vue-intlayer/format";
|
|
614
|
+
```
|
|
615
|
+
|
|
616
|
+
> Эти композиции будут учитывать локаль из внедренного `IntlayerProvider`
|
|
617
|
+
|
|
618
|
+
## История документации
|
|
619
|
+
|
|
620
|
+
| Версия | Дата | Изменения |
|
|
621
|
+
| ------ | ---------- | ------------------------------------- |
|
|
622
|
+
| 5.8.0 | 2025-08-20 | Добавлены форматтеры для Vue |
|
|
623
|
+
| 5.8.0 | 2025-08-18 | Добавлена документация по форматтерам |
|
|
624
|
+
|
|
625
|
+
Компоненты клиента:
|
|
626
|
+
|
|
627
|
+
```ts
|
|
628
|
+
import {
|
|
629
|
+
useNumber,
|
|
630
|
+
useCurrency,
|
|
631
|
+
useDate,
|
|
632
|
+
usePercentage,
|
|
633
|
+
useCompact,
|
|
634
|
+
useList,
|
|
635
|
+
useRelativeTime,
|
|
636
|
+
useUnit,
|
|
637
|
+
} from "vue-intlayer/format";
|
|
638
|
+
```
|
|
639
|
+
|
|
640
|
+
> Эти композиционные функции будут учитывать локаль из внедренного `IntlayerProvider`
|
|
641
|
+
|
|
642
|
+
## История документации
|
|
643
|
+
|
|
644
|
+
| Версия | Дата | Изменения |
|
|
645
|
+
| ------ | ---------- | ---------------------------------------------------------------------------------------- |
|
|
646
|
+
| 5.8.0 | 2025-08-20 | Добавлены форматтеры списка |
|
|
647
|
+
| 5.8.0 | 2025-08-20 | Добавлены дополнительные утилиты Intl (DisplayNames, Collator, PluralRules) |
|
|
648
|
+
| 5.8.0 | 2025-08-20 | Добавлены утилиты локали (getLocaleName, getLocaleLang, getLocaleFromPath и др.) |
|
|
649
|
+
| 5.8.0 | 2025-08-20 | Добавлены утилиты для работы с контентом (getContent, getTranslation, getIntlayer и др.) |
|