# General Translation Knowledge Base: General Translation против i18next, react-intl и next-intl: какую библиотеку интернационализации выбрать?
URL: https://generaltranslation.com/ru/kb/general-translation-vs-i18n-libraries.mdx
Docs index: https://generaltranslation.com/llms.txt
Description: Библиотеки с открытым исходным кодом, такие как i18next, react-intl и next-intl, ничего не переводят. Они лишь отображают переводы, которые вы сами помещаете в файл каталога для каждого языка, — их пишете вы, ваши переводчики или сторонний сервис. Библиотеки General Translation тоже имеют открытый исходный код и делают то же самое, но General Translation ещё и выполняет перевод, используя ваш код как контекст.
Category: Интернационализация
Last updated: 2026-10-16
Authors: General Translation Team
Published: 2026-10-16

Во время работы приложения библиотека интернационализации (i18n) решает две задачи: выбирает сообщение для локали пользователя и форматирует формы множественного числа, даты и числа по правилам этой локали. Библиотеки с открытым исходным кодом, такие как i18next, react-intl, next-intl, Lingui и vue-i18n, справляются с обеими, но ни одна из них не переводит ваш контент. Эта работа ложится на вас ещё до запуска приложения: нужно поместить каждую строку в файл каталога — по ключу или путём извлечения встроенных сообщений, — перевести каждый каталог и поддерживать все каталоги в актуальном состоянии по мере изменения UI. Библиотеки General Translation решают те же задачи во время выполнения, а General Translation ещё и берёт на себя перевод: тексты остаются встроенными в ваши компоненты, а переводы генерируются на этапе сборки.

## В чём сильны признанные библиотеки

Все эти библиотеки зрелые, бесплатные и широко используются, и у каждой свои сильные стороны:

* **i18next** — самая скачиваемая. Она работает в любой среде JavaScript, а официальный `i18next-cli` извлекает ключи из вашего кода и генерирует для них типы TypeScript.
* **react-intl** (FormatJS) построена на ICU MessageFormat — стандартном синтаксисе для форм множественного числа и выбора вариантов. Её документация рекомендует писать каждое `defaultMessage` прямо в коде, сопровождая его описанием `description` для переводчиков, а затем собирать сообщения в каталог командой `formatjs extract`.
* **next-intl** создана для Next.js App Router. Её переводы работают в серверных компонентах, сообщения, которые используются только в серверных компонентах, можно не отправлять на клиент, а ключи сообщений поддерживают проверку типов. Её API для встроенных сообщений, появившийся в версии 4.5, по-прежнему помечен как экспериментальный.
* **Lingui** хранит исходный текст прямо в коде с помощью макросов вроде `<Trans>`, сама генерирует идентификаторы сообщений и извлекает сообщения в каталоги PO.
* **vue-i18n** — плагин i18n для Vue 3; сообщения хранятся в JSON, YAML или в блоках `<i18n>` внутри однофайловых компонентов.

Все они хранят переводы в форматах каталогов, таких как JSON и PO, с которыми уже работают переводчики и системы управления переводами (TMS).

## Что остаётся на вас

Ни одна из этих библиотек сама ничего не переводит. Переводы берутся от вас, ваших переводчиков или стороннего сервиса — например, Locize от команды i18next или TMS вроде Crowdin. Вот небольшой компонент входящих сообщений на react-i18next:

```json title="locales/en/translation.json"
{
  "inbox": {
    "title": "Inbox",
    "unread_one": "You have {{count}} unread message.",
    "unread_other": "You have {{count}} unread messages."
  }
}
```

```tsx title="Inbox.tsx"
import { useTranslation } from 'react-i18next';

export function Inbox({ count }: { count: number }) {
  const { t } = useTranslation();
  return (
    <section>
      <h1>{t('inbox.title')}</h1>
      <p>{t('inbox.unread', { count })}</p>
    </section>
  );
}
```

Затем для каждого другого языка нужен отдельный файл, например `locales/es/translation.json`, который пишут вручную или отдают на перевод. Кроме того, в каждом файле формы множественного числа конкретного языка должны быть заданы отдельными ключами: в японском такая форма одна, в польском — четыре, а в арабском — шесть (`_zero`, `_one`, `_two`, `_few`, `_many` и `_other`). Строка, добавленная в компонент, отсутствует во всех остальных файлах, пока кто-нибудь её туда не внесёт, а переводчик каталога видит лишь `inbox.unread_other` и предложение, но не экран, на котором оно показывается.

## General Translation делает то же самое — и вдобавок генерирует переводы

Библиотеки General Translation выполняют ту же работу, что и i18next, react-intl и next-intl. Они выбирают нужные сообщения для каждой локали, применяют её правила множественного числа и форматируют числа, валюты и даты с помощью [`<Num>`](/docs/react/reference/components/num), [`<Currency>`](/docs/react/reference/components/currency) и [`<DateTime>`](/docs/react/reference/components/datetime). Они поддерживают переменные в стиле ICU в строках [`useGT`](/docs/react/reference/hooks/use-gt), словари с ключами через [`useTranslations`](/docs/react/reference/hooks/use-translations) для команд, которые предпочитают работать с ключами, а в `gt-next` — отдельный URL для каждой локали. Но на этом General Translation не останавливается и делает то, чего не умеют другие библиотеки: генерирует переводы.

Вот тот же почтовый ящик на `gt-react`. Текст остаётся в компоненте, [`<T>`](/docs/react/reference/components/t) помечает JSX, который нужно перевести, а [`<Plural>`](/docs/react/reference/components/plural) содержит английские формы:

```tsx title="Inbox.tsx"
import { T, Plural, Num } from 'gt-react';

export function Inbox({ count }: { count: number }) {
  return (
    <T>
      <section>
        <h1>Inbox</h1>
        <Plural
          n={count}
          one={<p>You have <Num>{count}</Num> unread message.</p>}
          other={<p>You have <Num>{count}</Num> unread messages.</p>}
        />
      </section>
    </T>
  );
}
```

Если запустить [`npx gt translate`](/docs/cli/reference/commands/translate) перед сборкой, каждый блок [`<T>`](/docs/react/reference/components/t) вместе со структурой его элементов отправляется в API General Translation, и для каждой целевой локали записывается перевод. Вы пишете только те формы множественного числа, которые есть в английском, а при переводе создаются формы, нужные каждому языку перевода, например польские `few` и `many`. Затем [`<Plural>`](/docs/react/reference/components/plural) выбирает переведённую ветку по правилам множественного числа для локали читателя. [`<Num>`](/docs/react/reference/components/num) форматирует число под локаль читателя во время рендеринга, а значение, обёрнутое в [`<Var>`](/docs/react/reference/components/var), никогда не отправляется в API. Если вы измените предложение, при следующем запуске оно будет переведено заново; если удалите компонент, вместе с ним удалятся и его переводы.

Библиотеки General Translation поддерживают Next.js (`gt-next`), React (`gt-react`), Vue 3 (`gt-vue`) и Node.js (`gt-node`); кроме того, есть экспериментальные библиотеки для React Native, TanStack Start и Python-фреймворков Flask и FastAPI. Они распространяются по лицензии MIT и работают без учётной записи General Translation: переводы можно загружать из любого источника, а [`gt generate`](/docs/cli/reference/commands/generate) создаёт файлы шаблонов для команд, которые переводят вручную. В основе `gt-react` и `gt-next` нет никакой сторонней библиотеки интернационализации: разбор и форматирование сообщений ICU реализованы в собственных пакетах General Translation. По умолчанию переводы поставляются в виде файлов в составе сборки, но их также можно загружать из CDN General Translation.

## Сравнение библиотек

| Библиотека                                                       | Как пишется текст                                                                                                     | Переводит ваш контент? | Откуда берутся переводы                                                                                                                      | Формы множественного числа                                                                                                      |
| ---------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- | ---------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------- |
| [i18next](/kb/general-translation-vs-i18next) с `react-i18next`  | Ключи в JSON-файле для каждой локали                                                                                  | Нет                    | Вы, переводчики или сервис вроде Locize                                                                                                      | Отдельный ключ для каждой формы множественного числа                                                                            |
| [`react-intl`](/kb/general-translation-vs-react-intl) (FormatJS) | Встроенный текст `defaultMessage`, извлекаемый в JSON-каталог                                                         | Нет                    | Вы, переводчики или TMS                                                                                                                      | ICU MessageFormat                                                                                                               |
| `next-intl`                                                      | Ключи в JSON-файле для каждой локали                                                                                  | Нет                    | Вы, переводчики или TMS вроде Crowdin                                                                                                        | ICU MessageFormat                                                                                                               |
| [Lingui](/kb/general-translation-vs-lingui)                      | Встроенные макросы, извлекаемые в PO-каталоги                                                                         | Нет                    | Вы, переводчики или TMS вроде Crowdin                                                                                                        | ICU MessageFormat                                                                                                               |
| [`vue-i18n`](/kb/general-translation-vs-vue-i18n)                | Ключи в объектах сообщений для каждой локали                                                                          | Нет                    | Вы, переводчики или TMS                                                                                                                      | Формы, разделённые вертикальной чертой; в версии 11 для таких языков, как польский, требуется собственное правило               |
| General Translation (`gt-react`, `gt-next`, `gt-vue`)            | JSX внутри [`<T>`](/docs/react/reference/components/t) или строки через [`useGT`](/docs/react/reference/hooks/use-gt) | Да                     | Генерируются командой [`npx gt translate`](/docs/cli/reference/commands/translate) с учётом контекста вашего кода или пишутся вашей командой | Ветки [`<Plural>`](/docs/react/reference/components/plural); при переводе генерируются все формы, нужные каждому языку перевода |

Оставайтесь на i18next, react-intl, next-intl, Lingui или vue-i18n, если ваши каталоги и процесс перевода уже налажены, если переводчики или TMS работают с файлами каталогов или если ваш фреймворк не поддерживается библиотеками General Translation. Выбирайте библиотеки General Translation, если хотите, чтобы текст оставался читаемым прямо в компонентах, переводы генерировались с учётом контекста вашего кода, а все языки обновлялись с каждой сборкой, не дожидаясь очередного цикла перевода.

## Сохраните свою библиотеку или мигрируйте постепенно, по одному маршруту

Переходить на другую библиотеку не обязательно. CLI `gt` определяет `next-intl` или `i18next` по вашему `package.json` и переводит JSON-файлы библиотеки с сохранением синтаксиса сообщений. Проекты на `react-i18next` и `next-i18next` тоже поддерживаются, если `i18next` указан как прямая зависимость. Укажите в `gt.config.json` пути к вашим каталогам:

```json title="gt.config.json"
{
  "defaultLocale": "en",
  "locales": ["es", "fr", "ja"],
  "files": {
    "json": {
      "include": ["locales/[locale]/*.json"]
    }
  }
}
```

Чтобы дать ключу контекст, который не может передать сам текст, добавьте сопутствующий файл, например `locales/en/translation.metadata.json`, с записью `context` или `maxChars` для этого ключа. (См. [Метаданные, привязанные к ключам](/docs/cli/reference/keyed-metadata) и [Генерация переводов](/docs/cli/guides/generating-translations).)

Чтобы перейти на [`<T>`](/docs/react/reference/components/t), воспользуйтесь руководством [Миграция с библиотек интернационализации](/docs/react/guides/migrating-i18n-libraries). В нём описаны три пути: заменить поиск по ключу встроенным текстом, сохранить словари и вызывать [`useTranslations`](/docs/react/reference/hooks/use-translations) или использовать обе библиотеки параллельно, переводя маршруты по одному.

General Translation доверяют лучшие команды разработчиков мира, в том числе в Cursor, Ramp, Profound, Cognition, Sierra и ClickHouse. Чтобы попробовать его в своём приложении, начните с руководства [Быстрый старт Next.js](/docs/react/nextjs-quickstart), [Быстрый старт React](/docs/react/react-quickstart) или [Быстрый старт Vue](/docs/vue/quickstart).

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

* i18next, react-intl, next-intl и другие библиотеки интернационализации с открытым исходным кодом ничего не переводят. Они лишь выполняют рендеринг и форматирование переводов, которые вы создаёте и поддерживаете в актуальном состоянии самостоятельно.
* Библиотеки General Translation выполняют тот же рендеринг и форматирование и тоже распространяются с открытым исходным кодом под лицензией MIT, но General Translation ещё и берёт на себя сам перевод — на основе текста, встроенного прямо в [`<T>`](/docs/react/reference/components/t). Поэтому нет никаких ключей и каталогов, которые нужно держать в синхронизации.
* Можно оставить i18next или next-intl и переводить их JSON-файлы с помощью CLI `gt` либо мигрировать постепенно, по одному маршруту за раз.

## Related questions

- [Почему стоит выбрать General Translation вместо TMS (Smartling, Lokalise, Phrase, Crowdin или Transifex)?](https://generaltranslation.com/ru/kb/general-translation-vs-tms.mdx): Система управления переводами (TMS), например Smartling, Lokalise, Phrase, Crowdin или Transifex, координирует работу переводчиков, но инженерам всё равно приходится извлекать строки, отправлять их на перевод, ждать результатов и встраивать переводы обратно в продукт. General Translation переводит контент прямо в вашем коде с учётом контекста, выпускает все языки с каждым релизом и работает на библиотеках с открытым исходным кодом без привязки к поставщику.
- [Альтернативы Google Translate: General Translation и Google Translate](https://generaltranslation.com/ru/kb/general-translation-vs-google-translate.mdx): Google Translate — быстрый способ перевести разовый текст, но чтобы выпустить продукт на другом языке, нужно переводить каждую строку с учётом контекста, соблюдать единую терминологию, правильно обрабатывать переменные и формы множественного числа, проводить ревью и выстроить процесс релизов. General Translation понимает контекст каждой строки в вашем коде и автоматизирует весь рабочий процесс локализации — от кода до ревью и каждого релиза.
- [Альтернативы i18next: General Translation или i18next](https://generaltranslation.com/ru/kb/general-translation-vs-i18next.mdx): Выбирайте General Translation, если хотите хранить тексты прямо в React-компонентах и создавать переводы с учётом их JSX-структуры и контекста продукта. Можно также оставить i18next и переводить существующие каталоги с помощью General Translation. i18next отвечает за рендеринг сообщений и выбор форм множественного числа, а сами переводы предоставляет отдельный сервис.
- [Альтернативы react-intl: General Translation или react-intl](https://generaltranslation.com/ru/kb/general-translation-vs-react-intl.mdx): General Translation позволяет React-командам сохранить синтаксис ICU-сообщений и при этом получить генерацию переводов, общую терминологию и проверку в панели управления. react-intl отвечает за форматирование и предоставляет инструменты FormatJS для работы с каталогами, а 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 и уже сложившийся рабочий процесс с каталогами.

## Previous and next questions

- Previous question: [General Translation или Weblate: что выбрать?](https://generaltranslation.com/ru/kb/general-translation-vs-weblate.mdx)
- Next question: [Альтернативы Crowdin: General Translation или Crowdin](https://generaltranslation.com/ru/kb/general-translation-vs-crowdin.mdx)

## Sitemap

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