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

Paraglide JS — это библиотека интернационализации от inlang, в основе которой лежит компилятор. Сообщения хранятся в JSON-файлах, например `messages/en.json`, а компилятор превращает каждое из них в типизированную функцию, которую вы вызываете как `m.greeting({ name })`. Благодаря этому сборщик может отбросить сообщения, которые на странице не используются. А вот сам перевод Paraglide оставляет вам: каждое сообщение на каждом языке должны подготовить вы, переводчик или команда машинного перевода, которую вы запускаете по этим файлам. Библиотеки General Translation тоже выполняют рендеринг переводов, но General Translation ещё и создаёт их — из текстов, которые вы пишете один раз прямо в своих компонентах.

## Сильные стороны Paraglide JS

* **Типобезопасность.** Для ключей сообщений и параметров генерируются типы. В версии 2.29.0 и опечатка `m.greting()`, и вызов `m.greeting({})` без параметра `name` приводят к ошибкам TypeScript.
* **Размер бандла.** Сообщения компилируются в ES-модули, поэтому неиспользуемые удаляются при tree-shaking. В [опубликованном бенчмарке](https://paraglidejs.com/benchmark) Paraglide страница, использующая 100 из 200 сообщений в пяти локалях, передавала 47 КБ с Paraglide и 205 КБ с i18next.
* **Формы множественного числа и варианты.** Формат сообщений по умолчанию [объявляет селектор множественного числа](https://paraglidejs.com/variants) и выбирает вариант по категориям CLDR, таким как `one`, `few` и `many`. [Плагины](https://paraglidejs.com/file-formats) добавляют поддержку ICU MessageFormat 1 и файлов i18next, а форматтеры на основе `Intl` работают с числами, датами и относительным временем.
* **Стратегии определения локали.** Упорядоченный [список `strategy`](https://paraglidejs.com/strategy) разрешает локаль по URL, cookie-файлу, `localStorage`, предпочитаемому языку браузера, глобальной переменной, пользовательским стратегиям или `baseLocale`. В 2.29.0 [по умолчанию](https://github.com/opral/paraglide-js/blob/main/src/compiler/compiler-options.ts) используются `cookie`, `globalVariable`, затем `baseLocale`. Локализованные маршруты обрабатываются [серверным промежуточным ПО](https://paraglidejs.com/middleware) и `localizeUrl`.
* **Поддержка фреймворков.** Paraglide [работает с любым приложением на Vite](https://paraglidejs.com/vite) и предлагает руководства для React, Vue, Solid, SvelteKit, TanStack Start, React Router, Astro и Next.js. Именно это [дополнение устанавливается командой `npx sv add paraglide`](https://paraglidejs.com/sveltekit) в Svelte CLI. [Руководство по Next.js](https://paraglidejs.com/next-js) описывает поддержку App Router через плагин webpack, который запускается с флагом `--webpack`.
* **Бесплатные открытые инструменты.** Библиотека распространяется [по лицензии MIT](https://github.com/opral/paraglide-js/blob/main/LICENSE). [inlang CLI](https://inlang.com/m/2qj2w8pu/app-inlang-cli) проверяет проекты в CI, [Sherlock](https://inlang.com/m/r7kp499g/app-inlang-ideExtension) показывает переводы прямо в коде в VS Code, а [Fink](https://fink.inlang.com/) — бесплатный браузерный редактор, который коммитит изменения переводчиков в репозиторий GitHub.

## Что Paraglide JS оставляет на ваше усмотрение

Проект inlang — это папка `project.inlang`, в файле `settings.json` которой перечислены ваши локали, плагины и путь к файлам сообщений. Вот пример входящих сообщений (inbox) с простым сообщением, параметром и множественной формой:

```json title="messages/en.json"
{
  "inbox_title": "Inbox",
  "greeting": "Hello {name}!",
  "unread_messages": [
    {
      "declarations": ["input count", "local countPlural = count: plural"],
      "selectors": ["countPlural"],
      "match": {
        "countPlural=one": "You have {count} unread message.",
        "countPlural=*": "You have {count} unread messages."
      }
    }
  ]
}
```

```tsx title="Inbox.tsx"
import { m } from './paraglide/messages.js';

export function Inbox({ name, count }: { name: string; count: number }) {
  return (
    <section>
      <h1>{m.inbox_title()}</h1>
      <p>{m.greeting({ name })}</p>
      <p>{m.unread_messages({ count })}</p>
    </section>
  );
}
```

Для каждой из остальных локалей нужен собственный файл с теми же ключами и с теми вариантами, которые требуются этому языку: для польского это `one`, `few`, `many` и `*`. Если ключа нет в `messages/pl.json`, скомпилированная функция молча откатывается к базовой локали. Вот результат рендеринга компонента с польским файлом, в котором нет `greeting`:

```text title="Output"
pl  <h1>Skrzynka odbiorcza</h1><p>Hello Ada!</p><p>Masz 2 nieprzeczytane wiadomości.</p>
```

`npx @inlang/cli check` обнаружил проблему: сообщил, что у `greeting` нет польского перевода, и завершился с кодом 1, так что CI может не пропустить изменения с таким пробелом. Но восполнять его по-прежнему придётся вам. `inlang machine translate` переводит недостающие сообщения по умолчанию через бесплатный сервис, поддерживаемый сообществом, либо с вашим собственным ключом Google Cloud Translation или DeepL — по одному сообщению и без компонента, в котором оно используется. В документации самого inlang CLI отмечается, что агенты для написания кода, которым доступен контекст продукта и кода, способны выдавать более качественные черновики, чем универсальный машинный перевод.

## Переводы пишет General Translation

Библиотеки General Translation выполняют тот же рендеринг. Разница в том, где хранятся тексты и кто их переводит. Вот тот же почтовый ящик на `gt-react`:

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

export function Inbox({ name, count }: { name: string; count: number }) {
  return (
    <T>
      <section>
        <h1>Inbox</h1>
        <p>Hello <Var>{name}</Var>!</p>
        <Plural
          n={count}
          singular={<p>You have <Num>{count}</Num> unread message.</p>}
          plural={<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 и записывает перевод для каждой целевой локали, поэтому новое предложение переводится ещё до сборки и не отображается на английском. Значение в [`<Var>`](/docs/react/reference/components/var) никогда не отправляется в API, а [`<Plural>`](/docs/react/reference/components/plural) выбирает ветвь по правилам множественного числа для локали читателя. [`npx gt validate`](/docs/cli/reference/commands/validate) проверяет проект без обращения к API, а [`gt generate`](/docs/cli/reference/commands/generate) создаёт файлы шаблонов для команд, которые переводят вручную.

Заголовок, приветствие и ветви множественного числа внутри этого блока отправляются на перевод вместе. General Translation также применяет [Glossary и пользовательские промпты](/docs/platform/dashboard/guides/defining-context-for-translations), назначенные проекту, а рецензенты редактируют результаты в панели управления. Добавьте CLI в CI или настройте [Locadex](/docs/platform/locadex/quickstart), чтобы при изменении кода автоматически открывались пул-реквесты с переводами.

JavaScript-библиотеки General Translation распространяются по лицензии MIT и работают с готовыми переводами без учётной записи. Если включить переводы в сборку приложения, рендеринг не будет зависеть от облачного сервиса; доставка через CDN позволяет публиковать правки переводов независимо от релизов приложения. Подробнее о настройке см. в разделе [хранение переводов](/docs/react/guides/storing-translations).

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

## Paraglide JS и General Translation: краткое сравнение

| Возможность           | Paraglide JS                                                                                             | General Translation                                                                                                                        |
| --------------------- | -------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ |
| Как пишется текст     | Ключи в JSON-файле для каждой локали, вызываются как `m.key()`                                           | JSX внутри [`<T>`](/docs/react/reference/components/t), строки через [`useGT`](/docs/react/reference/hooks/use-gt) или словари с ключами   |
| Переводит ваш контент | Нет; `inlang machine translate` использует сервис сообщества, Google или DeepL                           | Да, с помощью [`npx gt translate`](/docs/cli/reference/commands/translate)                                                                 |
| Что видит переводчик  | Содержимое сообщений, переданное выбранному инструменту перевода                                         | Размеченный блок JSX, примечания разработчиков, а также назначенные Glossary и пользовательские промпты                                    |
| Типобезопасность      | Сгенерированные типы для каждого ключа и параметра                                                       | Встроенный JSX: нет ключей сообщений, в которых можно ошибиться                                                                            |
| Бандл                 | Tree-shaking на уровне отдельных сообщений                                                               | Переводы загружаются отдельно для каждой локали                                                                                            |
| Отсутствующий перевод | Используется базовая локаль; `inlang check` сообщает об этом                                             | Генерируется командой [`npx gt translate`](/docs/cli/reference/commands/translate); непереведённый контент отображается на языке-источнике |
| Фреймворки            | Приложения на Vite, React, Vue, Solid, SvelteKit, Astro, TanStack Start, React Router, Next.js (webpack) | React, Next.js, Vue, Node.js и [другие SDK](/docs/overview/get-started)                                                                    |
| Стоимость             | Бесплатно, открытый исходный код                                                                         | Библиотеки JavaScript бесплатны; [перевод оплачивается по факту использования](https://generaltranslation.com/pricing)                     |

Оставайтесь на Paraglide JS, если вы разрабатываете на SvelteKit, Astro или Solid, если для вас важнее всего tree-shaking на уровне сообщений и типизированные функции сообщений или если ваша команда уже сама пишет или заказывает переводы. Выбирайте General Translation, если хотите, чтобы текст оставался читаемым прямо в компонентах, а переводы на все языки генерировались при каждой сборке с учётом контекста вашего кода.

## Переход на General Translation по одному компоненту

Переносить приложение по одному компоненту вполне реально. Сообщения Paraglide — это обычные функции, которым не нужен провайдер, поэтому вызов `m.*` и блок [`<T>`](/docs/react/reference/components/t) могут рендериться рядом, пока вы постепенно переносите маршруты. Все шаги описаны в руководстве [Миграция с других библиотек интернационализации](/docs/react/guides/migrating-i18n-libraries) — начните с [Быстрого старта React](/docs/react/react-quickstart) или [Быстрого старта Next.js](/docs/react/nextjs-quickstart).

## Основные выводы

* Paraglide JS компилирует каталоги в типизированные функции с поддержкой tree-shaking. Переводы для этих каталогов можно создавать с помощью отдельных инструментов inlang.
* General Translation хранит текст непосредственно в [`<T>`](/docs/react/reference/components/t) и создаёт переводы с учётом контекста из вашего кода, Glossary и пользовательских промптов, а проверить их можно в панели управления.
* Пока вы переносите компоненты на General Translation, существующие сообщения Paraglide могут продолжать работать. Каждый мигрированный компонент хранит исходный текст и контекст перевода прямо в JSX.

## 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 ещё и выполняет перевод, используя ваш код как контекст.
- [General Translation или Intlayer: что выбрать?](https://generaltranslation.com/ru/kb/general-translation-vs-intlayer.mdx): Intlayer хранит контент каждого компонента в типизированном файле объявлений рядом с ним, где все языки записаны бок о бок, и может заполнять недостающие языки с помощью настроенного вами ИИ-провайдера. General Translation хранит тексты прямо в компонентах на одном языке и генерирует остальные языки с учётом контекста вашего кода.
- [Можно ли реализовать i18n без файлов перевода?](https://generaltranslation.com/ru/kb/i18n-without-translation-files.mdx): Да. С gt-react или gt-next контент остаётся встроенным прямо в ваши компоненты внутри компонента `<T>`, а переводы генерируются во время сборки, поэтому не нужно писать ключи и JSON-файлы для каждой локали и следить за их синхронизацией.
- [Как работать с формами множественного числа в React?](https://generaltranslation.com/ru/kb/how-to-handle-plurals-in-react.mdx): Не зашивайте логику выбора формы множественного числа в код с помощью проверок вроде n === 1. Для приложений только на английском хватит небольшой вспомогательной функции, но многоязычным приложениям нужны locale-aware правила множественного числа. С ними для любого языка справляется i18n-компонент, например `<Plural>` из gt-react или gt-next.
- [Почему стоит выбрать 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 переводит контент прямо в вашем коде с учётом контекста, выпускает все языки с каждым релизом и работает на библиотеках с открытым исходным кодом без привязки к поставщику.

## Previous and next questions

- Previous question: [General Translation или nestjs-i18n: что выбрать?](https://generaltranslation.com/ru/kb/general-translation-vs-nestjs-i18n.mdx)
- Next question: [General Translation или Symfony Translation: что выбрать?](https://generaltranslation.com/ru/kb/general-translation-vs-symfony-translation.mdx)

## Sitemap

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