@intlayer/docs 5.8.0-canary.0 → 5.8.1-canary.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 +2 -2
- 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 +2 -2
- 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 +2 -2
- package/blog/en/next-i18next_vs_next-intl_vs_intlayer.md +93 -216
- package/blog/en/react-i18next_vs_react-intl_vs_intlayer.md +88 -120
- package/blog/en/vue-i18n_vs_intlayer.md +276 -0
- package/blog/en-GB/intlayer_with_next-i18next.md +2 -2
- 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 +2 -2
- 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 +2 -2
- 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 +2 -2
- 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 +2 -2
- 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 +2 -2
- 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 +2 -2
- 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 +2 -2
- 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 +2 -2
- 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 +2 -2
- 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/esm/generated/blog.entry.mjs +41 -0
- package/dist/esm/generated/blog.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/docs/ar/formatters.md +417 -31
- package/docs/ar/how_works_intlayer.md +2 -4
- package/docs/ar/interest_of_intlayer.md +7 -10
- 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 +4 -4
- package/docs/de/formatters.md +444 -34
- package/docs/de/introduction.md +2 -2
- 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 +383 -15
- package/docs/en/how_works_intlayer.md +2 -4
- package/docs/en/interest_of_intlayer.md +48 -29
- 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 +4 -4
- 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 +2 -2
- package/docs/en/packages/next-intlayer/index.md +2 -2
- 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 +2 -2
- 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 +402 -16
- package/docs/en-GB/how_works_intlayer.md +2 -4
- package/docs/en-GB/interest_of_intlayer.md +7 -10
- package/docs/en-GB/intlayer_with_tanstack.md +1 -1
- package/docs/en-GB/introduction.md +2 -2
- package/docs/es/formatters.md +438 -28
- package/docs/es/how_works_intlayer.md +2 -4
- package/docs/es/interest_of_intlayer.md +7 -10
- package/docs/es/intlayer_with_tanstack.md +1 -1
- package/docs/es/introduction.md +2 -2
- package/docs/fr/formatters.md +438 -28
- package/docs/fr/how_works_intlayer.md +2 -4
- package/docs/fr/interest_of_intlayer.md +7 -10
- package/docs/fr/intlayer_with_tanstack.md +1 -1
- package/docs/fr/introduction.md +2 -2
- package/docs/hi/formatters.md +430 -39
- package/docs/hi/how_works_intlayer.md +2 -4
- package/docs/hi/interest_of_intlayer.md +7 -10
- package/docs/hi/intlayer_with_tanstack.md +1 -1
- package/docs/hi/introduction.md +2 -2
- package/docs/it/formatters.md +438 -30
- package/docs/it/how_works_intlayer.md +2 -4
- package/docs/it/interest_of_intlayer.md +7 -10
- package/docs/it/intlayer_with_tanstack.md +1 -1
- package/docs/it/introduction.md +2 -2
- package/docs/ja/formatters.md +435 -47
- package/docs/ja/how_works_intlayer.md +2 -4
- package/docs/ja/interest_of_intlayer.md +7 -10
- package/docs/ja/intlayer_with_tanstack.md +1 -1
- package/docs/ja/introduction.md +2 -2
- package/docs/ko/formatters.md +432 -41
- package/docs/ko/how_works_intlayer.md +2 -4
- package/docs/ko/interest_of_intlayer.md +7 -10
- package/docs/ko/intlayer_with_tanstack.md +1 -1
- package/docs/ko/introduction.md +2 -2
- package/docs/pt/formatters.md +416 -30
- package/docs/pt/how_works_intlayer.md +2 -4
- package/docs/pt/intlayer_with_tanstack.md +1 -1
- package/docs/pt/introduction.md +2 -2
- package/docs/ru/autoFill.md +2 -2
- package/docs/ru/configuration.md +1 -40
- package/docs/ru/formatters.md +438 -28
- package/docs/ru/how_works_intlayer.md +5 -7
- package/docs/ru/index.md +1 -1
- package/docs/ru/interest_of_intlayer.md +8 -11
- 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 +5 -5
- 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 +3 -3
- 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 +4 -4
- 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 +4 -4
- 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 +446 -38
- package/docs/zh/how_works_intlayer.md +2 -4
- package/docs/zh/interest_of_intlayer.md +7 -10
- package/docs/zh/intlayer_with_tanstack.md +1 -1
- package/docs/zh/introduction.md +2 -2
- 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 +9 -11
- package/src/generated/blog.entry.ts +42 -1
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
---
|
|
2
2
|
createdAt: 2025-01-02
|
|
3
3
|
updatedAt: 2025-06-29
|
|
4
|
-
title: react-
|
|
5
|
-
description:
|
|
4
|
+
title: react-i18next против react-intl против Intlayer
|
|
5
|
+
description: Интеграция react-i18next с next-intl и Intlayer для интернационализации (i18n) React-приложения
|
|
6
6
|
keywords:
|
|
7
7
|
- next-intl
|
|
8
8
|
- react-i18next
|
|
9
9
|
- Intlayer
|
|
10
10
|
- Интернационализация
|
|
11
|
-
-
|
|
11
|
+
- Блог
|
|
12
12
|
- Next.js
|
|
13
13
|
- JavaScript
|
|
14
14
|
- React
|
|
@@ -17,178 +17,137 @@ slugs:
|
|
|
17
17
|
- react-i18next-vs-react-intl-vs-intlayer
|
|
18
18
|
---
|
|
19
19
|
|
|
20
|
-
#
|
|
20
|
+
# react-Intl ПРОТИВ react-i18next ПРОТИВ intlayer | Интернационализация React (i18n)
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
Это руководство сравнивает три устоявшихся варианта i18n для **React**: **react-intl** (FormatJS), **react-i18next** (i18next) и **Intlayer**.
|
|
23
|
+
Мы сосредотачиваемся на **простых React** приложениях (например, Vite, CRA, SPA). Если вы используете Next.js, смотрите наше отдельное сравнение для Next.js.
|
|
23
24
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
## 1. Введение
|
|
27
|
-
|
|
28
|
-
Интернационализация (i18n) в React-приложениях может быть достигнута различными способами. Три представленные здесь библиотеки имеют разные философии дизайна, наборы функций и поддержку сообщества:
|
|
25
|
+
Мы оцениваем:
|
|
29
26
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
27
|
+
- Архитектура и организация контента
|
|
28
|
+
- TypeScript и безопасность
|
|
29
|
+
- Обработка отсутствующих переводов
|
|
30
|
+
- Богатый контент и возможности форматирования
|
|
31
|
+
- Производительность и поведение при загрузке
|
|
32
|
+
- Опыт разработчика (DX), инструменты и сопровождение
|
|
33
|
+
- SEO/маршрутизация (зависит от фреймворка)
|
|
33
34
|
|
|
34
|
-
|
|
35
|
+
> **Кратко**: Все три решения могут локализовать React-приложение. Если вам нужен **контент, ограниченный компонентом**, **строгая типизация TypeScript**, **проверка отсутствующих ключей во время сборки**, **деревья сжатых словарей** и встроенные редакторские инструменты (Визуальный редактор/CMS + опциональный AI-перевод), то **Intlayer** - самый полный выбор для модульных React-кодовых баз.
|
|
35
36
|
|
|
36
37
|
---
|
|
37
38
|
|
|
38
|
-
##
|
|
39
|
-
|
|
40
|
-
### Обзор
|
|
41
|
-
|
|
42
|
-
[**React-Intl**](https://formatjs.io/docs/react-intl/) является частью набора [FormatJS](https://formatjs.io/). Она предоставляет мощный набор **API и компонентов** для обработки форматирования сообщений, множественного числа, форматирования даты/времени и чисел. React-Intl широко используется в корпоративных приложениях, в основном потому, что она является частью экосистемы, которая стандартизирует синтаксис сообщений и форматирование.
|
|
43
|
-
|
|
44
|
-
### Ключевые особенности
|
|
45
|
-
|
|
46
|
-
- **Синтаксис ICU сообщений**: Предлагает комплексный синтаксис для интерполяции сообщений, множественного числа и прочего.
|
|
47
|
-
- **Локализованное форматирование**: Встроенные утилиты для форматирования дат, времени, чисел и относительного времени на основе локали.
|
|
48
|
-
- **Декларативные компоненты**: Экспонирует `<FormattedMessage>`, `<FormattedNumber>`, `<FormattedDate>` и др. для бесшовного использования в JSX.
|
|
49
|
-
- **Богатая экосистема**: Хорошо интегрируется с инструментами FormatJS (например, [babel-plugin-react-intl](https://formatjs.io/docs/tooling/babel-plugin/)) для извлечения, управления и компиляции сообщений.
|
|
50
|
-
|
|
51
|
-
### Типичный рабочий процесс
|
|
52
|
-
|
|
53
|
-
1. **Определите каталоги сообщений** (обычно JSON-файлы на локаль).
|
|
54
|
-
2. **Оберните ваше приложение** в `<IntlProvider locale="en" messages={messages}>`.
|
|
55
|
-
3. **Используйте** `<FormattedMessage id="myMessage" defaultMessage="Hello world" />` или хук `useIntl()` для доступа к строкам перевода.
|
|
56
|
-
|
|
57
|
-
### Плюсы
|
|
58
|
-
|
|
59
|
-
- Хорошо зарекомендована и используется во многих производственных средах.
|
|
60
|
-
- Расширенное форматирование сообщений, включая множественное число, род, часовые пояса и многое другое.
|
|
61
|
-
- Сильная поддержка инструментов для извлечения и компиляции сообщений.
|
|
62
|
-
|
|
63
|
-
### Минусы
|
|
39
|
+
## Общее позиционирование
|
|
64
40
|
|
|
65
|
-
-
|
|
66
|
-
-
|
|
41
|
+
- **react-intl** - форматирование, ориентированное на ICU и соответствующее стандартам (даты/числа/множественное число) с зрелым API. Каталоги обычно централизованы; безопасность ключей и проверка во время сборки в основном на вашей стороне.
|
|
42
|
+
- **react-i18next** - чрезвычайно популярный и гибкий; пространства имён, детекторы и множество плагинов (ICU, бекенды). Мощный, но конфигурация может разрастаться по мере масштабирования проектов.
|
|
43
|
+
- **Intlayer** - модель контента, ориентированная на компоненты React, **строгая типизация TS**, **проверки во время сборки**, **tree-shaking**, а также **Визуальный редактор/CMS** и **переводы с помощью ИИ**. Работает с React Router, Vite, CRA и др.
|
|
67
44
|
|
|
68
45
|
---
|
|
69
46
|
|
|
70
|
-
##
|
|
47
|
+
## Матрица возможностей (фокус на React)
|
|
48
|
+
|
|
49
|
+
| Особенность | `react-intlayer` (Intlayer) | `react-i18next` (i18next) | `react-intl` (FormatJS) |
|
|
50
|
+
| --------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------- |
|
|
51
|
+
| **Переводы рядом с компонентами** | ✅ Да, контент расположен рядом с каждым компонентом | ❌ Нет | ❌ Нет |
|
|
52
|
+
| **Интеграция с TypeScript** | ✅ Продвинутая, автоматически сгенерированные строгие типы | ⚠️ Базовая; дополнительная настройка для безопасности | ✅ Хорошая, но менее строгая |
|
|
53
|
+
| **Обнаружение отсутствующих переводов** | ✅ Подсветка ошибок TypeScript и ошибки/предупреждения во время сборки | ⚠️ В основном строки замены во время выполнения | ⚠️ Строки замены |
|
|
54
|
+
| **Расширенный контент (JSX/Markdown/компоненты)** | ✅ Прямая поддержка | ⚠️ Ограничено / только интерполяция | ⚠️ Синтаксис ICU, не настоящий JSX |
|
|
55
|
+
| **Перевод с использованием ИИ** | ✅ Да, поддерживает нескольких провайдеров ИИ. Можно использовать с собственными API-ключами. Учитывает контекст вашего приложения и объем контента | ❌ Нет | ❌ Нет |
|
|
56
|
+
| **Визуальный редактор** | ✅ Да, локальный визуальный редактор + опциональная CMS; может вынести содержимое кодовой базы; встраиваемый | ❌ Нет / доступен через внешние платформы локализации | ❌ Нет / доступен через внешние платформы локализации |
|
|
57
|
+
| **Локализованная маршрутизация** | ✅ Да, поддерживает локализованные пути из коробки (работает с Next.js и Vite) | ⚠️ Нет встроенной поддержки, требует плагинов (например, `next-i18next`) или кастомной настройки роутера | ❌ Нет, только форматирование сообщений, маршрутизация должна быть ручной |
|
|
58
|
+
| **Динамическая генерация маршрутов** | ✅ Да | ⚠️ Плагин/экосистема или ручная настройка | ❌ Не предоставляется |
|
|
59
|
+
| **Множественное число** | ✅ Шаблоны на основе перечислений | ✅ Настраиваемые (плагины, такие как i18next-icu) | ✅ (ICU) |
|
|
60
|
+
| **Форматирование (даты, числа, валюты)** | ✅ Оптимизированные форматтеры (Intl под капотом) | ⚠️ Через плагины или кастомное использование Intl | ✅ Форматтеры ICU |
|
|
61
|
+
| **Формат контента** | ✅ .tsx, .ts, .js, .json, .md, .txt, (.yaml в разработке) | ⚠️ .json | ✅ .json, .js |
|
|
62
|
+
| **Поддержка ICU** | ⚠️ В разработке | ⚠️ Через плагин (i18next-icu) | ✅ Да |
|
|
63
|
+
| **SEO помощники (hreflang, sitemap)** | ✅ Встроенные инструменты: помощники для sitemap, robots.txt, метаданных | ⚠️ Плагины сообщества/ручные настройки | ❌ Не является ядром |
|
|
64
|
+
| **Экосистема / Сообщество** | ⚠️ Меньше, но быстро растет и активна | ✅ Самая большая и зрелая | ✅ Большое |
|
|
65
|
+
| **Серверный рендеринг и серверные компоненты** | ✅ Да, оптимизировано для SSR / React Server Components | ⚠️ Поддерживается на уровне страницы, но необходимо передавать t-функции в дерево компонентов для дочерних серверных компонентов | ❌ Не поддерживается, необходимо передавать t-функции в дерево компонентов для дочерних серверных компонентов |
|
|
66
|
+
| **Tree-shaking (загрузка только используемого контента)** | ✅ Да, на уровне компонентов во время сборки через плагины Babel/SWC | ⚠️ Обычно загружает всё (можно улучшить с помощью пространств имён/разделения кода) | ⚠️ Обычно загружает всё |
|
|
67
|
+
| **Отложенная загрузка** | ✅ Да, по локалям / по словарям | ✅ Да (например, бэкенды/неймспейсы по требованию) | ✅ Да (разделение пакетов локалей) |
|
|
68
|
+
| **Удаление неиспользуемого контента** | ✅ Да, по словарям во время сборки | ❌ Нет, только через ручное разделение по неймспейсам | ❌ Нет, все объявленные сообщения включены в пакет |
|
|
69
|
+
| **Управление крупными проектами** | ✅ Поощряет модульность, подходит для дизайн-систем | ⚠️ Требует хорошей дисциплины в работе с файлами | ⚠️ Центральные каталоги могут стать большими |
|
|
71
70
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
[**React-i18next**](https://react.i18next.com/) – это расширение для React от [i18next](https://www.i18next.com/), одного из самых популярных JavaScript фреймворков для i18n. Он предлагает **обширные функции** для переводов во время выполнения, ленивой загрузки и определения языка, что делает его чрезвычайно гибким для разнообразных случаев использования.
|
|
75
|
-
|
|
76
|
-
### Ключевые особенности
|
|
77
|
-
|
|
78
|
-
- **Гибкая структура переводов**: Не привязан к одному формату, как ICU. Вы можете хранить переводы в JSON, использовать интерполяцию, множественное число и т. д.
|
|
79
|
-
- **Динамическое переключение языка**: Встроенные плагины для определения языка и обновления в режиме реального времени.
|
|
80
|
-
- **Вложенные и структурированные переводы**: Вы можете легко вложить переводы в JSON.
|
|
81
|
-
- **Обширная экосистема плагинов**: Для определения (браузер, путь, подсайт и др.), загрузки ресурсов, кэширования и многого другого.
|
|
82
|
-
|
|
83
|
-
### Типичный рабочий процесс
|
|
84
|
-
|
|
85
|
-
1. **Установите `i18next` и `react-i18next`.**
|
|
86
|
-
2. **Настройте i18n** для загрузки переводов (JSON) и настройки определения языка или запасного варианта.
|
|
87
|
-
3. **Оборачивайте ваше приложение** в `I18nextProvider`.
|
|
88
|
-
4. **Используйте хук `useTranslation()`** или компонент `<Trans>` для отображения переводов.
|
|
71
|
+
---
|
|
89
72
|
|
|
90
|
-
|
|
73
|
+
## Глубокое сравнение
|
|
91
74
|
|
|
92
|
-
|
|
93
|
-
- Очень активное сообщество и большая экосистема плагинов.
|
|
94
|
-
- Простота **динамической загрузки** переводов (например, с сервера, по запросу).
|
|
75
|
+
### 1) Архитектура и масштабируемость
|
|
95
76
|
|
|
96
|
-
|
|
77
|
+
- **react-intl / react-i18next**: Большинство настроек поддерживают **централизованные папки локалей** для каждого языка, иногда разделённые по **неймспейсам** (i18next). Хорошо работает на ранних этапах, но становится общей зоной пересечения по мере роста приложений.
|
|
78
|
+
- **Intlayer**: Продвигает использование **словарей на уровне компонентов (или функций)**, **расположенных рядом** с UI, который они обслуживают. Это сохраняет ясность владения, облегчает дублирование/миграцию компонентов и снижает количество изменений ключей между командами. Неиспользуемый контент легче выявить и удалить.
|
|
97
79
|
|
|
98
|
-
|
|
99
|
-
- Если вы предпочитаете строго типизированные переводы, может потребоваться дополнительная настройка TypeScript.
|
|
80
|
+
**Почему это важно:** Модульный контент отражает модульный UI. Большие React-кодовые базы остаются чище, когда переводы живут вместе с компонентами, которым они принадлежат.
|
|
100
81
|
|
|
101
82
|
---
|
|
102
83
|
|
|
103
|
-
|
|
84
|
+
### 2) TypeScript и безопасность
|
|
104
85
|
|
|
105
|
-
|
|
86
|
+
- **react-intl**: Надежные типы, но **нет автоматической типизации ключей**; вы сами обеспечиваете паттерны безопасности.
|
|
87
|
+
- **react-i18next**: Сильная типизация для хуков; **строгая типизация ключей** обычно требует дополнительной настройки или генераторов.
|
|
88
|
+
- **Intlayer**: **Автоматически генерирует строгие типы** на основе вашего контента. Автозаполнение в IDE и **ошибки на этапе компиляции** ловят опечатки и отсутствующие ключи до выполнения.
|
|
106
89
|
|
|
107
|
-
|
|
90
|
+
**Почему это важно:** Перемещение ошибок **влево** (на этап сборки/CI) снижает количество проблем в продакшене и ускоряет цикл обратной связи для разработчиков.
|
|
108
91
|
|
|
109
|
-
|
|
92
|
+
---
|
|
110
93
|
|
|
111
|
-
|
|
112
|
-
- **Встроенная маршрутизация и промежуточное ПО**: Дополнительные модули для локализованной маршрутизации (например, `/en/about`, `/fr/about`) и серверного промежуточного ПО для определения локали пользователя.
|
|
113
|
-
- **Автоматически сгенерированные типы TypeScript**: Обеспечивают безопасность типов с такими функциями, как автозаполнение и обнаружение ошибок на этапе компиляции.
|
|
114
|
-
- **Динамические и богатые переводы**: Могут включать JSX/TSX в переводы для более сложных случаев использования (например, ссылки, жирный текст, иконки в переводах).
|
|
94
|
+
### 3) Обработка отсутствующих переводов
|
|
115
95
|
|
|
116
|
-
|
|
96
|
+
- **react-intl / react-i18next**: По умолчанию используют **запасные варианты во время выполнения** (отображение ключа или локаль по умолчанию). Можно добавить линтеры/плагины, но гарантий на этапе сборки нет.
|
|
97
|
+
- **Intlayer**: **Обнаружение на этапе сборки** с предупреждениями или ошибками при отсутствии необходимых локалей/ключей.
|
|
117
98
|
|
|
118
|
-
|
|
119
|
-
2. **Создайте `intlayer.config.ts`** для определения доступных локалей и локали по умолчанию.
|
|
120
|
-
3. **Используйте CLI Intlayer** или плагин для **транспиляции** деклараций контента.
|
|
121
|
-
4. **Оборачивайте ваше приложение** в `<IntlayerProvider>` и получайте контент с помощью `useIntlayer("keyName")`.
|
|
99
|
+
**Почему это важно:** Сбой CI из-за отсутствующих строк предотвращает появление «загадочного английского» в неанглоязычных интерфейсах.
|
|
122
100
|
|
|
123
|
-
|
|
101
|
+
---
|
|
124
102
|
|
|
125
|
-
|
|
126
|
-
- **Богатый контент** возможен (например, передача узлов React в качестве переводов).
|
|
127
|
-
- **Локализованная маршрутизация** из коробки.
|
|
128
|
-
- Интегрирован с популярными инструментами сборки (CRA, Vite) для легкой настройки.
|
|
103
|
+
### 4) Богатый контент и форматирование
|
|
129
104
|
|
|
130
|
-
|
|
105
|
+
- **react-intl**: Отличная поддержка **ICU** для множественного числа, выборов, дат/чисел и составления сообщений. Можно использовать JSX, но ментальная модель остается ориентированной на сообщения.
|
|
106
|
+
- **react-i18next**: Гибкая интерполяция и **`<Trans>`** для встраивания элементов/компонентов; ICU доступен через плагин.
|
|
107
|
+
- **Intlayer**: Файлы контента могут включать **богатые узлы** (JSX/Markdown/компоненты) и **метаданные**. Форматирование использует Intl под капотом; шаблоны множественного числа эргономичны.
|
|
131
108
|
|
|
132
|
-
|
|
133
|
-
- Более сильный акцент на подходе «декларация контента на уровне компонента» , возможно, это будет сдвигом от типичных каталогов .json.
|
|
134
|
-
- Меньшая экосистема и сообщество по сравнению с более устоявшимися библиотеками.
|
|
109
|
+
**Почему это важно:** Сложные тексты UI (ссылки, выделенные части, встроенные компоненты) проще реализовать, когда библиотека чисто поддерживает React-узлы.
|
|
135
110
|
|
|
136
111
|
---
|
|
137
112
|
|
|
138
|
-
|
|
113
|
+
### 5) Производительность и поведение загрузки
|
|
114
|
+
|
|
115
|
+
- **react-intl / react-i18next**: Обычно вы самостоятельно управляете **разделением каталогов** и **ленивой загрузкой** (пространства имён/динамические импорты). Эффективно, но требует дисциплины.
|
|
116
|
+
- **Intlayer**: Выполняет **tree-shaking** неиспользуемых словарей и поддерживает **ленивую загрузку по словарям и локалям** из коробки.
|
|
139
117
|
|
|
140
|
-
|
|
141
|
-
| ---------------------------------------- | ---------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
142
|
-
| **Основное назначение** | Строковые переводы, форматирование даты/чисел, синтаксис ICU | Полнофункциональный i18n с простым динамическим переключением, вложением, экосистемой плагинов | Безопасные по типу переводы с фокусом на декларативном контенте, локализованной маршрутизации и необязательном серверном промежуточном ПО |
|
|
143
|
-
| **Подход** | Используйте `<IntlProvider>` и компоненты форматирования FormatJS | Используйте `I18nextProvider` и хук `useTranslation()` | Используйте `<IntlayerProvider>` и хук `useIntlayer()` с декларациями контента |
|
|
144
|
-
| **Формат локализации** | ICU-строки (каталоги JSON или JavaScript) | JSON-файлы ресурсов (или пользовательские загрузчики). ICU формат не обязателен через плагин i18next | Декларации `.content.[ts/js/tsx]` или JSON; могут содержать строки или компоненты React |
|
|
145
|
-
| **Маршрутизация** | Обрабатывается внешне (нет встроенной локализованной маршрутизации) | Обрабатывается внешне с плагинами i18next (определение пути, поддомен и др.) | Встроенная поддержка локализованной маршрутизации (например, `/en/about`, `/fr/about`), плюс необязательное серверное промежуточное ПО (для SSR/Vite) |
|
|
146
|
-
| **Поддержка TypeScript** | Хорошая (типы для официальных пакетов) | Хорошая, но требуется дополнительная настройка для строгих проверок переводов | Отличная (автоматически создаваемые определения типов для ключей и переводов содержимого) |
|
|
147
|
-
| **Множественное число и форматирование** | Расширенные: встроенное форматирование даты/времени/чисел, поддержка рода/множественного числа | Конфигурируемое множественное число. Форматирование даты/времени обычно выполняется с помощью внешних библиотек или плагина i18next | Может полагаться на стандартный JavaScript Intl или включать логику в контент. Не так специализирован, как FormatJS, но обрабатывает типичные случаи. |
|
|
148
|
-
| **Сообщество и экосистема** | Большое, часть экосистемы FormatJS | Очень большая, активная, множество плагинов (определение, кэширование, фреймворки) | Меньшая, но растущая; открытый исходный код, современный подход |
|
|
149
|
-
| **Кривая обучения** | Умеренная (изучение синтаксиса ICU сообщений, конвенций FormatJS) | Низкая до умеренной (простое использование, но сложная конфигурация может стать многословной) | Умеренная (концепция деклараций контента и специализированных шагов сборки) |
|
|
118
|
+
**Почему это важно:** Меньшие бандлы и меньше неиспользуемых строк улучшают производительность запуска и навигации.
|
|
150
119
|
|
|
151
120
|
---
|
|
152
121
|
|
|
153
|
-
|
|
122
|
+
### 6) DX, инструменты и сопровождение
|
|
154
123
|
|
|
155
|
-
|
|
124
|
+
- **react-intl / react-i18next**: Широкая экосистема сообщества; для редакционных рабочих процессов обычно используют внешние платформы локализации.
|
|
125
|
+
- **Intlayer**: Поставляется с **бесплатным визуальным редактором** и **опциональной CMS** (храните контент в Git или выносите его). Также предлагает **расширение для VSCode** для создания контента и **перевод с помощью ИИ** с использованием ваших собственных ключей провайдера.
|
|
156
126
|
|
|
157
|
-
|
|
158
|
-
- Вы предпочитаете более «**стандартизированный**» подход к переводам.
|
|
159
|
-
- Вам не требуется локализованная маршрутизация или строго типизированные ключи переводов.
|
|
127
|
+
**Почему это важно:** Встроенные инструменты сокращают цикл взаимодействия между разработчиками и авторами контента - меньше вспомогательного кода, меньше зависимостей от сторонних поставщиков.
|
|
160
128
|
|
|
161
|
-
|
|
129
|
+
---
|
|
162
130
|
|
|
163
|
-
|
|
164
|
-
- Вы хотите **определение языка на основе плагинов** (например, из URL, cookies, локального хранилища) или расширенное кэширование.
|
|
165
|
-
- Вам нужна самая большая экосистема с множеством существующих интеграций для различных фреймворков (Next.js, React Native и др.).
|
|
131
|
+
## Когда что выбирать?
|
|
166
132
|
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
- Вам нужна **встроенная локализованная маршрутизация** или вы хотите легко интегрировать ее в вашу настройку SSR или Vite.
|
|
171
|
-
- Вы стремитесь к современному подходу или просто хотите одну библиотеку, которая охватывает как **управление контентом** (i18n), так и **маршрутизацию** безопасным по типу способом.
|
|
133
|
+
- **Выбирайте react-intl**, если вам нужен **ICU-первый** формат сообщений с простым, соответствующим стандартам API, и ваша команда готова вручную поддерживать каталоги и проверки безопасности.
|
|
134
|
+
- **Выбирайте react-i18next**, если вам нужна **широкая экосистема i18next** (детекторы, бэкенды, плагин ICU, интеграции) и вы готовы к большей конфигурации ради гибкости.
|
|
135
|
+
- **Выбирайте Intlayer**, если вы цените **контент, ограниченный компонентом**, **строгую типизацию TypeScript**, **гарантии на этапе сборки**, **tree-shaking** и **встроенные инструменты редактирования** - особенно для **больших, модульных** React-приложений.
|
|
172
136
|
|
|
173
137
|
---
|
|
174
138
|
|
|
175
|
-
##
|
|
176
|
-
|
|
177
|
-
Каждая библиотека предлагает надежное решение для интернационализации React-приложения:
|
|
178
|
-
|
|
179
|
-
- **React-Intl** превосходит в форматировании сообщений и является популярным выбором для корпоративных решений с акцентом на синтаксис ICU сообщений.
|
|
180
|
-
- **React-i18next** предоставляет высоко гибкую, основанную на плагинах среду для сложных или динамических нужд i18n.
|
|
181
|
-
- **Intlayer** предлагает **современный, строго типизированный** подход, который объединяет декларации контента, усовершенствованную локализованную маршрутизацию и интеграции (CRA, Vite).
|
|
139
|
+
## Практические заметки по миграции (react-intl / react-i18next → Intlayer)
|
|
182
140
|
|
|
183
|
-
|
|
141
|
+
- **Мигрируйте постепенно**: начните с одной функции или маршрута; в период перехода сохраняйте старые каталоги параллельно.
|
|
142
|
+
- **Используйте словари на уровне компонентов**: размещайте контент рядом с компонентами, чтобы уменьшить связанность.
|
|
143
|
+
- **Включите строгие проверки**: позволяйте ошибкам на этапе сборки выявлять отсутствующие ключи/локали на ранних этапах CI.
|
|
144
|
+
- **Измеряйте размер бандлов**: ожидайте уменьшения размера по мере удаления неиспользуемых строк.
|
|
184
145
|
|
|
185
146
|
---
|
|
186
147
|
|
|
187
|
-
|
|
148
|
+
## Заключение
|
|
188
149
|
|
|
189
|
-
|
|
190
|
-
- [Документация React-i18next](https://react.i18next.com/)
|
|
191
|
-
- [Руководство по началу работы с Intlayer + CRA](#) (из ваших документов)
|
|
192
|
-
- [Руководство по началу работы с Intlayer + Vite & React](#) (из ваших документов)
|
|
150
|
+
Все три библиотеки эффективно локализуют React. Главное отличие - сколько **инфраструктуры** вам нужно построить, чтобы получить **безопасную, масштабируемую** систему:
|
|
193
151
|
|
|
194
|
-
|
|
152
|
+
- С **Intlayer** **модульный контент**, **строгая типизация TS**, **безопасность на этапе сборки**, **tree-shaking бандлов** и **редакционные инструменты** являются стандартом, а не рутиной.
|
|
153
|
+
- Если ваша команда ценит **поддерживаемость и скорость** в многоязычных, компонентно-ориентированных React-приложениях, Intlayer предлагает сегодня **самый полный** рабочий процесс для разработчиков и контента.
|