# General Translation Knowledge Base: Альтернативы react-intl: General Translation или react-intl
URL: https://generaltranslation.com/ru/kb/general-translation-vs-react-intl.mdx
Docs index: https://generaltranslation.com/llms.txt
Description: General Translation позволяет React-командам сохранить синтаксис ICU-сообщений и при этом получить генерацию переводов, общую терминологию и проверку в панели управления. react-intl отвечает за форматирование и предоставляет инструменты FormatJS для работы с каталогами, а General Translation ещё и создаёт сами переводы.
Category: Интернационализация
Last updated: 2026-10-16
Authors: Kevin Wu, Jackie Chen
Published: 2026-10-16

react-intl — это [React-библиотека от FormatJS](https://formatjs.github.io/docs/react-intl). Каждое сообщение пишется прямо в коде как `defaultMessage` в формате ICU MessageFormat и снабжается описанием `description` для переводчиков. Затем команда `formatjs extract` собирает все сообщения в JSON-каталог, а переведённые каталоги рендерятся через `IntlProvider`. Сама библиотека ничего не переводит: извлечённый каталог достаётся вам, вашим переводчикам или системе управления переводами (TMS), а обратно приходят переведённые файлы, которые затем нужно скомпилировать. Библиотеки General Translation тоже рендерят ICU-сообщения, но General Translation вдобавок генерирует сами переводы.

## Сильные стороны react-intl

* **ICU MessageFormat повсюду.** [Формы множественного числа с `#` и точными совпадениями вроде `=0`, `select` и `selectordinal`](https://formatjs.github.io/docs/core-concepts/icu-syntax) на основе браузерных API `Intl`.
* **Встроенный исходный текст.** FormatJS [рекомендует писать `defaultMessage` и `description` прямо в коде](https://formatjs.github.io/docs/getting-started/message-declaration), а генерацию идентификаторов сообщений поручать `babel-plugin-formatjs` или `@swc/plugin-formatjs`, — так никому не приходится придумывать ключи.
* **Инструменты для рабочего процесса с TMS.** [`formatjs extract`](https://formatjs.github.io/docs/tooling/cli) записывает каталог, встроенные форматтеры создают файлы для Crowdin, Lokalise, Smartling и Transifex, `formatjs compile` заранее разбирает сообщения, а `formatjs verify` проверяет каталоги на отсутствующие и лишние ключи.
* **TypeScript.** [Версия 12 умеет типизировать ICU-аргументы каждого сообщения](https://formatjs.github.io/docs/react-intl/upgrade-guide-12.x).
* **Активная поддержка.** [Версия 12 вышла в сентябре 2026 года](https://github.com/formatjs/formatjs/blob/main/packages/react-intl/CHANGELOG.md), лицензия — BSD-3-Clause.

## Что react-intl оставляет на ваше усмотрение

Вот небольшой почтовый ящик на react-intl. Английский текст остаётся в компоненте в виде `defaultMessage`:

```jsx title="Inbox.jsx"
import { FormattedMessage } from 'react-intl';

export function Inbox({ count }) {
  return (
    <section>
      <h1>
        <FormattedMessage defaultMessage="Inbox" description="Heading of the inbox page" />
      </h1>
      <p>
        <FormattedMessage
          defaultMessage="You have {count, plural, one {# unread message} other {# unread messages}}."
          description="Number of unread messages in the inbox"
          values={{ count }}
        />
      </p>
    </section>
  );
}
```

`formatjs extract` превращает эти сообщения в каталог, где ключами служат сгенерированные идентификаторы:

```json title="lang/en.json"
{
  "U5vJOY": {
    "defaultMessage": "You have {count, plural, one {# unread message} other {# unread messages}}.",
    "description": "Number of unread messages in the inbox"
  },
  "gBGgGs": {
    "defaultMessage": "Inbox",
    "description": "Heading of the inbox page"
  }
}
```

Для каждого языка перевода нужны переведённые сообщения с неизменённым синтаксисом ICU. `IntlProvider` принимает строки сообщений или предварительно скомпилированные сообщения; последние готовит `formatjs compile`. Извлечённые дескрипторы содержат каждое сообщение вместе с его описанием. Чтобы ID генерировались так же, как в этом примере, подключите в сборку плагин Babel или SWC. В [Next.js App Router](https://formatjs.github.io/docs/guides/nextjs-app-router) компоненты react-intl работают в клиентских компонентах, а серверный код форматирует сообщения с помощью `createIntl` из `react-intl/server`.

## Сохраните сообщения ICU и сгенерируйте переводы

Библиотеки General Translation решают те же задачи, что и react-intl: выполняют рендеринг сообщений ICU, применяют правила множественного числа для каждой локали и форматируют числа, валюты и даты. Ваши строки ICU переносятся почти без изменений, поскольку [`useGT`](/docs/react/reference/hooks/use-gt) поддерживает тот же синтаксис:

```tsx title="Inbox.tsx"
import { useGT } from 'gt-react';

export function Inbox({ count }: { count: number }) {
  const gt = useGT();
  return (
    <section>
      <h1>{gt('Inbox', { $context: 'Heading of the inbox page' })}</h1>
      <p>
        {gt('You have {count, plural, one {# unread message} other {# unread messages}}.', {
          count,
          $context: 'Number of unread messages in the inbox',
        })}
      </p>
    </section>
  );
}
```

[`npx gt translate`](/docs/cli/reference/commands/translate) одной командой извлекает эти строки, генерирует переводы с учётом их контекстных заметок и записывает целевые каталоги. В примере оба описания FormatJS сохраняются как `$context`. Общие [термины Glossary и пользовательские промпты](/docs/platform/dashboard/guides/defining-context-for-translations) задают терминологию и тон, а рецензенты редактируют результаты в [панели управления](/docs/platform/dashboard/guides/reviewing-translations).

`#` форматируется с учётом локали, поэтому число 12345 отображается как &quot;12,345&quot; на английском и &quot;12.345&quot; на испанском. Для JSX с разметкой [`<T>`](/docs/react/reference/components/t) переводит весь размеченный блок вместе с элементами. В `gt-next` он работает непосредственно в серверных компонентах.

Панель управления, лендинг и iOS-приложение Ramp доступны более чем в 11 локалях благодаря General Translation. (См. [развёртывания в рабочей среде](https://generaltranslation.com/enterprise).)

## react-intl и General Translation: краткое сравнение

| Возможность           | react-intl                                                                                                                                     | General Translation                                                                                                         |
| --------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------- |
| Как пишутся тексты    | Встроенный `defaultMessage` в формате ICU, извлекаемый в JSON-каталог                                                                          | Встроенный JSX в [`<T>`](/docs/react/reference/components/t) или строки ICU в [`useGT`](/docs/react/reference/hooks/use-gt) |
| Переводит ваш контент | Нет                                                                                                                                            | Да, с помощью [`npx gt translate`](/docs/cli/reference/commands/translate)                                                  |
| Работа с каталогами   | Извлечение сообщений, перевод в рамках выбранного вами рабочего процесса, при необходимости — предварительная компиляция; ID генерирует плагин | [`npx gt translate`](/docs/cli/reference/commands/translate) извлекает и переводит контент перед сборкой                    |
| Контекст перевода     | Сообщение и его описание                                                                                                                       | Строки ICU с `$context`; размеченная структура JSX со встроенными компонентами; общие Glossary и пользовательские промпты   |
| Next.js App Router    | Компоненты внутри клиентских компонентов; `createIntl` на сервере                                                                              | [`<T>`](/docs/react/reference/components/t) в Серверных и Клиентских Компонентах                                            |
| Лицензия              | [BSD-3-Clause](https://github.com/formatjs/formatjs/blob/main/packages/react-intl/LICENSE.md)                                                  | JavaScript-библиотеки и CLI под лицензией MIT                                                                               |

Оставайтесь на react-intl, если ваши каталоги ICU и форматтеры TMS уже работают, если вы полагаетесь на типизированные аргументы сообщений или `formatjs verify` либо используете FormatJS вне React. Выбирайте General Translation, если хотите и дальше писать тексты в ICU, но при этом сделать генерацию и проверку переводов частью рабочего процесса разработки.

## Переход с react-intl

Переносите компоненты или маршруты по одному. Замените каждый `<FormattedMessage>` вызовом [`useGT`](/docs/react/reference/hooks/use-gt), сохранив исходную строку ICU и передав описание сообщения в `$context`, как показано выше. Для JSX с разметкой используйте [`<T context="…">`](/docs/react/reference/components/t#context). Для компонентов, которые ещё не перенесены, продолжайте загружать существующие каталоги react-intl. Когда будет перенесён последний компонент, удалите плагин FormatJS, а также скрипты извлечения и компиляции. (См. [Миграция с других библиотек интернационализации](/docs/react/guides/migrating-i18n-libraries).)

## Другие альтернативы react-intl

Команды, уходящие с react-intl, также рассматривают следующие библиотеки:

* **i18next:** выполняет рендеринг каталогов с ключами и поддерживает выбор форм множественного числа; в связке с react-i18next и next-i18next — популярный выбор для приложений на React и Next.js. (См. [General Translation vs. i18next](/kb/general-translation-vs-i18next).)
* **Lingui:** позволяет держать тексты прямо в коде и компилирует сообщения в каталоги с компактной средой выполнения. (См. [General Translation vs. Lingui](/kb/general-translation-vs-lingui).)
* **next-intl:** выполняет рендеринг сообщений из каталогов в приложениях Next.js на App Router, включая серверные компоненты. (См. [next-intl vs. gt-next](/kb/next-intl-vs-gt-next).)
* **Paraglide JS:** компилирует каталоги в типизированные tree-shakable функции сообщений. (См. [General Translation vs. Paraglide JS](/kb/general-translation-vs-paraglide).)
* **Intlayer:** хранит контент каждого компонента в типизированном файле объявлений, где все языки представлены рядом. (См. [General Translation vs. Intlayer](/kb/general-translation-vs-intlayer).)

## Ключевые выводы

* react-intl форматирует ICU-сообщения и предоставляет инструменты для работы с каталогами, но сами переводы создаются в отдельном рабочем процессе.
* General Translation извлекает и переводит строки одной командой CLI, сохраняя контекст из описаний (description) и предоставляя рецензентам редактор в панели управления.
* Ваши строки ICU переносятся в [`useGT`](/docs/react/reference/hooks/use-gt) практически без изменений — постепенно, компонент за компонентом.

## Related questions

- [General Translation против i18next, react-intl и next-intl: какую библиотеку интернационализации выбрать?](https://generaltranslation.com/ru/kb/general-translation-vs-i18n-libraries.mdx): Библиотеки с открытым исходным кодом, такие как i18next, react-intl и next-intl, ничего не переводят. Они лишь отображают переводы, которые вы сами помещаете в файл каталога для каждого языка, — их пишете вы, ваши переводчики или сторонний сервис. Библиотеки General Translation тоже имеют открытый исходный код и делают то же самое, но General Translation ещё и выполняет перевод, используя ваш код как контекст.
- [Альтернативы i18next: General Translation или i18next](https://generaltranslation.com/ru/kb/general-translation-vs-i18next.mdx): Выбирайте General Translation, если хотите хранить тексты прямо в React-компонентах и создавать переводы с учётом их JSX-структуры и контекста продукта. Можно также оставить i18next и переводить существующие каталоги с помощью General Translation. i18next отвечает за рендеринг сообщений и выбор форм множественного числа, а сами переводы предоставляет отдельный сервис.
- [General Translation или Lingui: что выбрать?](https://generaltranslation.com/ru/kb/general-translation-vs-lingui.mdx): Выбирайте General Translation, если хотите, как и в Lingui, держать тексты прямо в коде и генерировать переводы, используя структуру JSX в качестве контекста. Lingui извлекает встроенные сообщения в каталоги, которые затем переводят ваши переводчики или подключённый сервис. CLI General Translation обновляет переводы по мере изменения кода, а ваша команда проверяет их в панели управления.
- [General Translation или vue-i18n: что выбрать?](https://generaltranslation.com/ru/kb/general-translation-vs-vue-i18n.mdx): General Translation позволяет командам Vue писать исходные тексты прямо в шаблонах и создавать переводы с помощью CLI. Плагин gt-vue выполняет рендеринг этого контента с учётом локали, включая формы множественного числа и форматирование чисел. Выбирайте его, если хотите избавиться от поддержки исходных файлов с ключами; vue-i18n по-прежнему подходит командам, которые используют модуль i18n для Nuxt и уже сложившийся рабочий процесс с каталогами.
- [Как работать с формами множественного числа в React?](https://generaltranslation.com/ru/kb/how-to-handle-plurals-in-react.mdx): Не зашивайте логику выбора формы множественного числа в код с помощью проверок вроде n === 1. Для приложений только на английском хватит небольшой вспомогательной функции, но многоязычным приложениям нужны locale-aware правила множественного числа. С ними для любого языка справляется i18n-компонент, например `<Plural>` из gt-react или gt-next.

## Previous and next questions

- Previous question: [Альтернативы Phrase: General Translation или Phrase](https://generaltranslation.com/ru/kb/general-translation-vs-phrase.mdx)
- Next question: [Альтернативы Smartling: General Translation или Smartling](https://generaltranslation.com/ru/kb/general-translation-vs-smartling.mdx)

## Sitemap

See the [Knowledge Base sitemap](https://generaltranslation.com/ru/kb/sitemap.md) for every article.
