# General Translation Knowledge Base: Как перевести условный текст в JSX?
URL: https://generaltranslation.com/ru/kb/translate-conditional-jsx.mdx
Docs index: https://generaltranslation.com/llms.txt
Description: Не разбивайте предложение и переводите каждый его вариант целиком, ведь тернарный оператор дробит его на фрагменты, которые теряют смысл и своё место в порядке слов каждого языка. В General Translation для этого используется `<Branch>` внутри `<T>`, который переводит предложение как единое целое.
Category: Интернационализация
Last updated: 2026-10-21
Authors: Ernest McCarter
Published: 2025-09-26

Чтобы перевести условный текст в JSX (текст, который выбирается тернарным оператором или другим условием), не разбивайте предложение и переводите каждый его вариант целиком. Тернарный оператор вроде `I eat lunch at {atHome ? 'home' : 'work'}.` дробит одно предложение на фрагменты. При отдельном переводе слова &quot;home&quot; и &quot;work&quot; оторваны от предложения, которое придаёт им смысл, а код оставляет их в конце, как в английском. Однако порядок слов в разных языках разный: в китайском место ставится перед глаголом, например 我在家吃午餐 (&quot;Я обедаю дома&quot;).

| Подход                                                                                                                    | Сильные стороны                                                                                                                                                                                                                                         | Что остаётся на вас                                                                                                                                                                                                                                                                                 |
| ------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Только библиотека интернационализации (i18n) (`i18next`, `react-intl`, `next-intl`)                                       | Все варианты предложения хранятся в отдельных контекстных ключах (`i18next`) или в сообщении ICU (International Components for Unicode) `select` (`react-intl`, `next-intl`)                                                                            | Перенос предложения из JSX в файл ключей и написание каждого варианта на каждом языке                                                                                                                                                                                                               |
| Google Translate                                                                                                          | Быстрый универсальный перевод текста, по одной строке за раз                                                                                                                                                                                            | Запись каждого варианта полным предложением, перенос результатов обратно в код и повторение всего этого при каждом изменении текста                                                                                                                                                                 |
| Прямой вызов AI API (OpenAI API, Claude API)                                                                              | Естественный перевод всего предложения, если отправить его со всеми вариантами                                                                                                                                                                          | Сбор всех вариантов и их контекста, единообразие терминов от релиза к релизу, вычитка и загрузка результатов в приложение                                                                                                                                                                           |
| General Translation ([`<T>`](/docs/react/reference/components/t) с [`<Branch>`](/docs/react/reference/components/branch)) | [`<T>`](/docs/react/reference/components/t) переводит предложение как единое целое, все варианты собраны в одном [`<Branch>`](/docs/react/reference/components/branch), а формулировка каждого варианта может полностью меняться в зависимости от языка | Замена тернарного оператора на [`<Branch>`](/docs/react/reference/components/branch) (внутри [`<T>`](/docs/react/reference/components/t) это делает автоисправление ESLint), разовая настройка и повторный запуск [`npx gt translate`](/docs/cli/reference/commands/translate) при изменении текста |

Обычного тернарного оператора достаточно, если приложение выходит только на одном языке. Одной библиотеки i18n хватит, если текст уже хранится в файлах ключей, которые заполняют переводчики, а Google Translate или прямой вызов AI API подойдут для предложения, которое нужно перевести один раз. Используйте [`<Branch>`](/docs/react/reference/components/branch) внутри [`<T>`](/docs/react/reference/components/t), если предложение находится в JSX и перевод должен оставаться актуальным при изменении текста. Если формулировка зависит от числа, используйте [`<Plural>`](/docs/react/reference/components/plural), поскольку правила множественного числа в языках различаются: в английском 2 формы, а в арабском — 6.

В библиотеках `gt-react` и `gt-next` от General Translation условие обрабатывается компонентом [`<Branch>`](/docs/react/reference/components/branch) внутри [`<T>`](/docs/react/reference/components/t). Передайте значение в `branch` (строку, число или логическое значение), добавьте по пропу для каждого значения и поместите резервный вариант в `children` — он рендерится, если ни один проп не подошёл. Если условие затрагивает грамматику не одного слова, а всего предложения, помещайте в каждую ветвь предложение целиком, чтобы переводчики могли адаптировать всю формулировку. Встроенный тернарный оператор внутри [`<T>`](/docs/react/reference/components/t) превращается в [`<Branch>`](/docs/react/reference/components/branch) так:

```tsx
// Встроенное условное выражение
<T>{isActive ? 'Active' : 'Inactive'}</T>;

// Переводимые ветви
<T>
  <Branch branch={isActive} true="Active">
    Inactive
  </Branch>
</T>;
```

ESLint-плагин General Translation `@generaltranslation/react-core-linter` помечает тернарный оператор внутри [`<T>`](/docs/react/reference/components/t), а команда `npx eslint . --fix` преобразует его в [`<Branch>`](/docs/react/reference/components/branch). Затем [`npx gt translate`](/docs/cli/reference/commands/translate) переводит каждый [`<T>`](/docs/react/reference/components/t) на все локали, перечисленные в `gt.config.json`. Пошаговые инструкции приведены в руководстве [Работа с формами множественного числа и ветвями](/docs/react/guides/handling-plurals-and-branches), а в [обзоре React](/docs/react/overview#frameworks) есть ссылки на «Быстрый старт» для каждого фреймворка.

## Video

The video is narrated in English, with English captions.

[How do I translate conditional text in JSX?](https://caxecubb9c64cezv.public.blob.vercel-storage.com/films/kb-translate-conditional-jsx.mp4) (46 с)

General Translation lets you wrap whole sentences in `T` and express conditions with `Branch`. Run `npx gt init`, choose Japanese and Chinese and sign in, put the sentence in a `T` component with a `Branch` so the translator sees it whole, then run `npx gt translate` to write Japanese and Chinese with the place before the verb.

## Как перевести предложение с переменной и ссылкой в React?

Чтобы перевести предложение с переменной и ссылкой, храните само предложение, переменную и текст ссылки в одной записи перевода. Тогда для каждого языка предложение доступно целиком, и имя со ссылкой можно поставить туда, где этого требует грамматика. Если разбить `Hi {name}, read the terms of service before you continue.` на «Hi», «read the», «terms of service» и «before you continue», переводчики получат четыре фрагмента без контекста предложения, а в коде сохранится английский порядок слов.

| Подход                                                                                                              | Как в предложении обозначена ссылка                                                                | Что остаётся на вас                                                                                                        |
| ------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------- |
| Отдельные строки для каждой части                                                                                   | Текст ссылки — отдельная строка                                                                    | Фрагменты без контекста предложения, в английском порядке слов                                                             |
| react-i18next `<Trans>`                                                                                             | Нумерованный тег, например `<3>terms of service</3>`, или именованный тег из пропа `components`    | Написание строки на каждом языке и перенумерация тегов при изменении JSX                                                   |
| react-intl `<FormattedMessage>`                                                                                     | Именованный тег, например `<link>terms of service</link>`, который рендерится функцией из `values` | Написание сообщения на каждом языке и поддержание соответствия имён тегов ключам `values`                                  |
| General Translation ([`<T>`](/docs/react/reference/components/t) с [`<Var>`](/docs/react/reference/components/var)) | Ссылка в виде JSX прямо внутри предложения                                                         | Однократная настройка и повторный запуск [`npx gt translate`](/docs/cli/reference/commands/translate) при изменении текста |

Используйте отдельные строки только для текста, который не входит в предложение, например для автономной подписи кнопки. Используйте `<Trans>` из react-i18next или `<FormattedMessage>` из react-intl, если текст уже хранится в файлах каталогов, которые заполняют переводчики, и отдавайте предпочтение именованным тегам — они не меняются при изменении окружающего JSX. Используйте [`<T>`](/docs/react/reference/components/t) с [`<Var>`](/docs/react/reference/components/var) от General Translation, если предложение находится в JSX и перевод должен оставаться актуальным при изменении текста.

Библиотеки `gt-react` и `gt-next` от General Translation сохраняют предложение целиком с помощью [`<T>`](/docs/react/reference/components/t): оберните предложение в [`<T>`](/docs/react/reference/components/t), поместите динамическое значение в [`<Var>`](/docs/react/reference/components/var) и запишите ссылку как обычный JSX внутри предложения.

```tsx
import { T, Var } from 'gt-react';

export function TermsNotice({ name }: { name: string }) {
  return (
    <T>
      <p>
        Hi <Var>{name}</Var>, read the <a href="/terms">terms of service</a> before you continue.
      </p>
    </T>
  );
}
```

Компонент [`<T>`](/docs/react/reference/components/t) от General Translation переводит абзац целиком, включая текст ссылки, и оставляет элемент `<a>` и его `href` без изменений. [`<Var>`](/docs/react/reference/components/var) выполняет рендеринг `name` как есть, никогда не отправляет это значение в API General Translation и подставляет его туда, где оно должно стоять в предложении на каждой локали. Если написать `{name}` без [`<Var>`](/docs/react/reference/components/var), правило линтера [`static-jsx`](/docs/react/reference/lint-rules#static-jsx) от General Translation отметит это место как ошибку, а `npx eslint . --fix` обернёт его в [`<Var>`](/docs/react/reference/components/var). В Next.js App Router импортируйте [`<T>`](/docs/react/reference/components/t) и [`<Var>`](/docs/react/reference/components/var) из пакета `gt-next` от General Translation, а ссылку оформляйте с помощью [`Link` из `gt-next/link`](/docs/react/nextjs/link): этот компонент добавляет префикс локали к внутренним URL, так что для посетителя из Испании `/terms` превращается в `/es/terms`.

## Как Trans из react-i18next и T из General Translation обрабатывают вложенные элементы?

Компонент `<Trans>` из react-i18next выполняет рендеринг предложения с React-элементами на основе одной строки для каждого языка. В этой строке каждый элемент обозначается своей позицией среди дочерних элементов `<Trans>`. В этом предложении дочерние элементы — это текст перед именем, значение `name`, текст перед ссылкой, сама ссылка и завершающий текст. Значит, ссылка — дочерний элемент с индексом 3 (отсчёт ведётся с 0):

```tsx
import { Trans } from 'react-i18next';

export function TermsNotice({ name }: { name: string }) {
  return (
    <Trans i18nKey="termsNotice">
      Hi {{ name }}, read the <a href="/terms">terms of service</a> before you continue.
    </Trans>
  );
}
```

```json title="locales/en/translation.json"
{
  "termsNotice": "Hi {{name}}, read the <3>terms of service</3> before you continue."
}
```

Элемент, вложенный в другой элемент, получает номер среди дочерних элементов своего родителя. Элементы без атрибутов из короткого списка по умолчанию (`<br>`, `<strong>`, `<i>` и `<p>`) сохраняют в строке собственные имена. Проп `components` заменяет номера именами: с `components={{ termsLink: <a href="/terms" /> }}` строка выглядит как `<termsLink>terms of service</termsLink>`. `<FormattedMessage>` из react-intl тоже использует имена: сообщение содержит `<link>terms of service</link>`, а `values` сопоставляет `link` с функцией, которая возвращает элемент `<a>`.

Если вложенные элементы в `<Trans>` перестают переводиться, обычно это означает, что строка и JSX не совпадают. Стоит добавить или удалить дочерний элемент перед ссылкой — и все последующие номера сдвигаются, поэтому строку приходится перенумеровывать на каждом языке. Номер, указывающий не на тот дочерний элемент, приводит к рендерингу не того содержимого или к потере ссылки, а именованный тег, отсутствующий в `components`, выводится как обычный текст.

С [`<T>`](/docs/react/reference/components/t) от General Translation не нужно ни писать строку перевода, ни следить за синхронизацией номеров. Источником служит сам JSX между тегами [`<T>`](/docs/react/reference/components/t): General Translation определяет запись по её содержимому и сохраняет каждый вложенный элемент вместе с его тегом и внутренним идентификатором, который General Translation назначает сам. Текст внутри любого элемента между тегами [`<T>`](/docs/react/reference/components/t) переводится вместе с остальным предложением на любом уровне вложенности — как в этом примере из [справочника по `<T>`](/docs/react/reference/components/t#overview) General Translation:

```tsx
<T>
  Today, I went to
  <p>
    the <b>store</b> to buy some <i>groceries</i>.
  </p>
</T>
```

Компонент [`<T>`](/docs/react/reference/components/t) от General Translation переводит только содержимое, написанное непосредственно между его тегами. Поэтому дочерний компонент, который сам выполняет рендеринг своего текста, например `<Footer />`, не переводится внешним [`<T>`](/docs/react/reference/components/t). Вместо этого передайте такой текст компоненту в качестве дочерних элементов и не вкладывайте один [`<T>`](/docs/react/reference/components/t) в другой. Пошаговые инструкции для каждого фреймворка приведены в разделе [Перевод JSX](/docs/react/guides/translating-jsx).

## Related questions

- [Как работать с формами множественного числа в React?](https://generaltranslation.com/ru/kb/how-to-handle-plurals-in-react.mdx): Чтобы работать с формами множественного числа в React, задайте для каждого языка по одному предложению на каждую форму множественного числа и выбирайте нужное по правилам множественного числа этого языка — ведь в английском 2 формы, в русском 4, а в арабском 6. Компонент `<Plural>` от General Translation в gt-react и gt-next принимает формы на исходном языке, а General Translation генерирует формы, нужные каждому языку перевода.
- [Можно ли делать i18n без файлов перевода?](https://generaltranslation.com/ru/kb/i18n-without-translation-files.mdx): Да. Библиотеки gt-react и gt-next от General Translation обеспечивают i18n для React и Next.js без ключей перевода и без отдельного JSON-файла для каждого языка, который приходится поддерживать. Тексты остаются встроенными в JSX внутри компонента `<T>`, а команда gt translate генерирует переводы для каждого языка во время сборки, учитывая контекст из вашего кода. Locadex может поддерживать их в актуальном состоянии через пул-реквесты.
- [Как перевести приложение на Flask или FastAPI?](https://generaltranslation.com/ru/kb/translate-python-app.mdx): Отметьте строки, которые видит пользователь, определите локаль для каждого запроса (обычно по заголовку Accept-Language) и загрузите переводы для этой локали. В приложениях на Flask обычно используют Flask-Babel с каталогами gettext, а в приложениях на FastAPI Babel подключают через промежуточное ПО. CLI от General Translation заполняет эти каталоги, а экспериментальные SDK gt-flask и gt-fastapi переводят встроенные строки t() без всяких каталогов.

## Previous and next questions

- Previous question: [Как работать с формами множественного числа в React?](https://generaltranslation.com/ru/kb/how-to-handle-plurals-in-react.mdx)
- Next question: [Как настроить SEO для многоязычного приложения Next.js?](https://generaltranslation.com/ru/kb/multilingual-nextjs-seo.mdx)

## Sitemap

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