# General Translation Knowledge Base: JSX の条件付きテキストはどのように翻訳すればよいですか？
URL: https://generaltranslation.com/ja/kb/translate-conditional-jsx.mdx
Docs index: https://generaltranslation.com/llms.txt
Description: 文を分割せずに、すべてのバージョンを翻訳します。三項演算子を使うと文が断片に分かれ、断片は意味を失ううえ、各言語の語順に沿った位置にも置けなくなります。General Translation では `<T>` の中で `<Branch>` を使い、文をひとつの単位として翻訳します。
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;I eat lunch at home&quot;) のように場所を動詞の前に置きます。

| アプローチ                                                                                                                      | 得意なこと                                                                                                                                                          | 自分で対応する必要があること                                                                                                                                                                                                                          |
| -------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 国際化 (i18n) ライブラリ単体 (`i18next`、`react-intl`、`next-intl`)                                                                    | バージョンごとの文脈キー (`i18next`) または ICU (International Components for Unicode) の `select` メッセージ (`react-intl`、`next-intl`) で、文のすべてのバージョンを保持できる                        | 文を JSX からキーファイルに移し、すべての言語ですべてのバージョンを記述すること                                                                                                                                                                                              |
| Google Translate                                                                                                           | テキストを1文字列ずつ、高速かつ汎用的に翻訳できる                                                                                                                                      | 各バージョンを完全な文として書き出し、結果をコードに戻し、文言が変わるたびにその両方をやり直すこと                                                                                                                                                                                       |
| 生の 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 を使います。文が JSX 内にあり、文言が変わっても翻訳を最新に保つ必要がある場合は、[`<T>`](/docs/react/reference/components/t) 内で [`<Branch>`](/docs/react/reference/components/branch) を使います。数値によって文言が変わる場合は、代わりに [`<Plural>`](/docs/react/reference/components/plural) を使ってください。複数形規則は言語によって異なり、英語には2つ、アラビア語には6つの形があるためです。

General Translation の `gt-react` および `gt-next` ライブラリでは、[`<T>`](/docs/react/reference/components/t) 内の [`<Branch>`](/docs/react/reference/components/branch) コンポーネントで条件を処理します。値を `branch` (文字列、数値、または真偽値) として渡し、値ごとにプロパティを1つずつ追加し、フォールバックを `children` に記述します。フォールバックは、どのプロパティにも一致しない場合にレンダリングされます。条件によって1語にとどまらず文法が変わる場合は、各ブランチに完全な文を記述し、翻訳者が文言全体を調整できるようにしましょう。[`<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>;
```

General Translation の ESLint プラグイン `@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 で変数とリンクを含む文を翻訳するにはどうすればよいですか？

変数とリンクを含む文を翻訳するには、文、変数、リンクテキストを 1 つの翻訳エントリにまとめます。こうすることで各言語に文全体が渡され、それぞれの文法に合わせて名前とリンクを適切な位置に配置できます。`Hi {name}, read the terms of service before you continue.` を &quot;Hi&quot;、&quot;read the&quot;、&quot;terms of service&quot;、&quot;before you continue&quot; に分割すると、翻訳者には前後の文脈のない 4 つの断片が渡されるうえ、コード上でも英語の語順のまま固定されてしまいます。

| アプローチ                                                                                                                | 文の中でリンクを示す方法                                                           | 開発者側に残る作業                                                                             |
| -------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------- | ------------------------------------------------------------------------------------- |
| 各部分を個別の文字列にする                                                                                                        | リンクテキストが独立した文字列になる                                                     | 前後の文脈がなく、英語の語順に固定された断片                                                                |
| 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) の再実行 |

個別の文字列は、スタンドアロンのボタンラベルなど、文の一部ではないテキストにのみ使用してください。翻訳者が記入するカタログファイルで文言をすでに管理している場合は、react-i18next の `<Trans>` または react-intl の `<FormattedMessage>` を使用し、周囲の JSX が変わっても影響を受けない名前付きタグを優先してください。文が JSX 内にあり、文言が変わっても翻訳を常に最新に保つ必要がある場合は、General Translation の [`<T>`](/docs/react/reference/components/t) と [`<Var>`](/docs/react/reference/components/var) を使用してください。

General Translation の `gt-react` および `gt-next` ライブラリでは、[`<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>
  );
}
```

General Translation の [`<T>`](/docs/react/reference/components/t) は、リンクテキストを含めて段落全体を1つの単位として翻訳し、`<a>` 要素とその `href` は記述したまま保持します。[`<Var>`](/docs/react/reference/components/var) は `name` をそのままレンダリングし、General Translation API には一切送信せず、各ロケールの文で必要な位置に配置します。[`<Var>`](/docs/react/reference/components/var) を使わずに `{name}` と記述すると、General Translation の [`static-jsx`](/docs/react/reference/lint-rules#static-jsx) lint ルールで検出され、`npx eslint . --fix` を実行すると [`<Var>`](/docs/react/reference/components/var) で自動的にラップされます。Next.js の App Router では、General Translation の `gt-next` から [`<T>`](/docs/react/reference/components/t) と [`<Var>`](/docs/react/reference/components/var) をインポートし、リンクには [`gt-next/link` の `Link`](/docs/react/nextjs/link) を使用します。`Link` は内部 URL にロケールプレフィックスを付加するため、スペイン語のユーザーがアクセスすると `/terms` は `/es/terms` になります。

## react-i18next の Trans と General Translation の T は、ネストされた要素をどのように扱うのか？

react-i18next の `<Trans>` コンポーネントは、React 要素を含む文を、言語ごとに 1 つの文字列からレンダリングします。この文字列では、各要素を `<Trans>` の子要素内での位置によって示します。この文の子要素は、名前の前のテキスト、`name` の値、リンクの前のテキスト、リンク、末尾のテキストの 5 つです。したがって、0 から数えるとリンクは子要素 3 になります。

```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>` になります。react-intl の `<FormattedMessage>` も名前を使います。メッセージには `<link>terms of service</link>` が含まれ、`values` で `link` を `<a>` 要素を返す関数にマッピングします。

`<Trans>` でネストされた要素が翻訳されなくなった場合、原因はたいてい文字列と JSX の不一致です。リンクより前に子要素を追加・削除すると、それ以降の番号がすべてずれるため、全言語の文字列で番号を振り直さなければなりません。番号が誤った子要素を指していると、誤ったコンテンツがレンダリングされたり、リンクが消えたりします。また、`components` にない名前付きタグは、そのままテキストとしてレンダリングされます。

General Translation の [`<T>`](/docs/react/reference/components/t) なら、翻訳文字列を書く必要も、番号の同期を保つ必要もありません。[`<T>`](/docs/react/reference/components/t) タグで囲んだ JSX がそのまま翻訳元になります。General Translation はそのコンテンツからエントリを識別し、ネストされた各要素を、そのタグおよび General Translation が割り当てる内部識別子とともに記録します。[`<T>`](/docs/react/reference/components/t) タグの間に書いた要素内のテキストは、ネストの深さにかかわらず、文の残りの部分と一緒に翻訳されます。General Translation の [`<T>` リファレンス](/docs/react/reference/components/t#overview)にある次の例をご覧ください：

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

General Translation の [`<T>`](/docs/react/reference/components/t) が翻訳するのは、タグの間に直接記述されたコンテンツだけです。そのため、`<Footer />` のように内部で独自にテキストをレンダリングする子コンポーネントは、外側の [`<T>`](/docs/react/reference/components/t) では翻訳されません。このようなテキストは子要素としてコンポーネントに渡してください。また、[`<T>`](/docs/react/reference/components/t) を別の [`<T>`](/docs/react/reference/components/t) の中にネストすることは避けてください。フレームワークごとの手順は、[JSX の翻訳](/docs/react/guides/translating-jsx)を参照してください。

## Related questions

- [React で複数形を扱うにはどうすればよいですか？](https://generaltranslation.com/ja/kb/how-to-handle-plurals-in-react.mdx): React で複数形を扱うには、各言語の複数形ごとに文を 1 つずつ用意し、その言語の複数形規則に従って選択します。英語の複数形は 2 種類ですが、ロシア語は 4 種類、アラビア語は 6 種類あるためです。gt-react と gt-next に含まれる General Translation の `<Plural>` コンポーネントに翻訳元の形を渡せば、各対象言語に必要な形は General Translation が生成します。
- [翻訳ファイルなしでi18nは実現できますか？](https://generaltranslation.com/ja/kb/i18n-without-translation-files.mdx): はい。General Translationの gt-react と gt-next ライブラリを使えば、翻訳キーも、言語ごとに管理するJSONファイルもなしで、ReactとNext.jsのi18nを実現できます。文言は `<T>` コンポーネント内のJSXにインラインで記述したままで、gt translate コマンドがコードから得た文脈をもとに、ビルド時に各言語の翻訳を生成します。さらにLocadexを使えば、プルリクエストを通じて翻訳を常に最新の状態に保てます。
- [TanStack Start に i18n を追加するには？](https://generaltranslation.com/ja/kb/add-i18n-to-tanstack-start.mdx): TanStack Start には組み込みの i18n がないため、サーバーリクエストごとにロケールを解決し（通常は URL プレフィックスまたはクッキーから）、レンダリング前にメッセージを読み込むライブラリを追加します。Paraglide JS、react-i18next、Lingui は自分で用意した翻訳をレンダリングするのに対し、General Translation の実験的な gt-tanstack-start は、JSX 内にインラインで記述したテキストから翻訳を生成することもできます。

## Previous and next questions

- Previous question: [React で複数形を扱うにはどうすればよいですか？](https://generaltranslation.com/ja/kb/how-to-handle-plurals-in-react.mdx)
- Next question: [多言語対応の Next.js アプリで SEO を設定するには？](https://generaltranslation.com/ja/kb/multilingual-nextjs-seo.mdx)

## Sitemap

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