# General Translation Knowledge Base: next-intl の代替：gt-next と next-intl の比較
URL: https://generaltranslation.com/ja/kb/next-intl-vs-gt-next.mdx
Docs index: https://generaltranslation.com/llms.txt
Description: next-intl は、言語ごとのメッセージカタログに用意した翻訳をレンダリングします。gt-next も翻訳をレンダリングしますが、それに加えて General Translation が JSX にインラインで記述したテキストから翻訳を生成します。どちらも MIT ライセンスで、App Router とサーバーコンポーネントに対応しています。既存の next-intl のカタログが問題なく機能しているなら、移行せずにそのまま使い続けながら、General Translation で翻訳できます。
Category: ワークフローツール
Last updated: 2026-10-16
Authors: Jackie Chen
Published: 2026-10-16

next-intl と gt-next はどちらも、サーバーコンポーネントを含む Next.js App Router アプリのローカライズに対応しています。両者の違いは、翻訳をどこから得るかです。next-intl は、チームや翻訳サービスが言語ごとの JSON カタログに記述したメッセージを表示します。一方 gt-next では、翻訳元のテキストを JSX 内にインラインで記述し、General Translation がビルドの一環としてすべての翻訳を生成します。

つまり、選択肢は 3 つです。1 つ目は、next-intl と現在の翻訳プロセスをそのまま使い続けること。2 つ目は、next-intl を使い続けながら、コンポーネントには一切手を加えずに General Translation でカタログを翻訳すること。3 つ目は、gt-next を導入し、インラインのテキストと自動生成される翻訳を活用することです。

## next-intl と gt-next の比較

| 項目                     | next-intl                                              | gt-next (General Translation)                                                                                                                         |
| ---------------------- | ------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------- |
| コンテンツを翻訳してくれるか？        | いいえ。チームや Crowdin などのサービスが用意したメッセージをレンダリングします           | はい。[`gt translate`](/docs/cli/reference/commands/translate) がコードの文脈を踏まえて翻訳を生成します。チームで翻訳を書くこともできます                                                     |
| 翻訳元のテキストはどこに置くか？       | JSON カタログ内のキー付きメッセージ。`useExtracted` によるインライン抽出は実験的機能です | [`<T>`](/docs/react/reference/components/t) 内のインライン JSX と、[`useGT`](/docs/react/reference/hooks/use-gt) で扱う文字列。キー付きの辞書もサポートしています                      |
| サーバーコンポーネントに対応しているか？   | はい。同期コンポーネントと非同期コンポーネントでそれぞれ別の API を使います               | はい：[`<T>`](/docs/react/reference/components/t)、[`useGT`](/docs/react/reference/hooks/use-gt)、[`getGT`](/docs/react/nextjs/reference/functions/get-gt) |
| クライアントコンポーネントに対応しているか？ | `NextIntlClientProvider` の配下で使用                        | [`GTProvider`](/docs/react/reference/components/gt-provider) の配下で使用                                                                                   |
| ロケールルーティング             | ミドルウェアとロケールプレフィックス付きのルート                               | [`createNextMiddleware`](/docs/react/nextjs/app-router-middleware) と `app/[locale]` セグメント                                                             |
| 複数形                    | カタログごとに ICU MessageFormat で記述                          | [`<Plural>`](/docs/react/reference/components/plural) の分岐。ブロックの他の部分とまとめて翻訳されます                                                                        |
| 翻訳の配信                  | アプリにバンドルされたカタログファイル                                    | バンドルされたファイル、または再デプロイなしで更新できる General Translation の CDN                                                                                                |
| ライセンス                  | MIT                                                    | MIT                                                                                                                                                   |

出典：[next-intl App Router のセットアップ](https://next-intl.dev/docs/getting-started/app-router)、[next-intl のサーバー・クライアントでの使用方法](https://next-intl.dev/docs/environments/server-client-components)、[gt-next クイックスタート](/docs/react/nextjs-quickstart)。

## 同じ見出しは各ライブラリでどのように書くのか？

next-intl のカタログワークフローでは、翻訳元のメッセージは JSON ファイルに定義します。

```json
{
  "Projects": {
    "heading": "Find your next project"
  }
}
```

コンポーネントは、名前空間とキーを使ってメッセージを選びます：

```tsx
import { useTranslations } from 'next-intl';

export default function ProjectHeading() {
  const t = useTranslations('Projects');
  return <h1>{t('heading')}</h1>;
}
```

gt-next を使えば、同じ文をコンポーネント内にそのまま記述できます：

```tsx
import { T } from 'gt-next';

export default function ProjectHeading() {
  return (
    <T>
      <h1>Find your next project</h1>
    </T>
  );
}
```

どちらのスニペットも、各ライブラリのプロバイダーと設定が完了済みであることを前提としています。詳しくは [next-intl のセットアップガイド](https://next-intl.dev/docs/getting-started/app-router)と [`<T>` リファレンス](/docs/react/reference/components/t)を参照してください。

カタログを使えば、レビュアーはコードから切り離して文言を確認できます。一方、文言をインラインで記述すれば、レビュアーは各文をそれが属する JSX の中で確認でき、General Translation もその構造を文脈として翻訳に活用できます。それでも意味が曖昧な文言については、gt-next の [`<T>` で `context` プロパティを指定でき](/docs/react/reference/components/t#context)、next-intl でも[実験的な抽出機能でメッセージの説明を付けられます](https://next-intl.dev/docs/usage/extraction#descriptions)。

next-intl の実験的な [`useExtracted`](https://next-intl.dev/docs/usage/extraction) API でも、メッセージをインラインで記述してカタログに抽出できます。ただし、抽出で変わるのは文言の書き方だけです。抽出されたカタログ自体が翻訳されるわけではないため、チームや翻訳サービスによる翻訳は引き続き必要です。

## next-intl を使い続けたまま General Translation を利用できますか？

はい。`gt` CLI は `package.json` から next-intl を検出し、next-intl のメッセージ構文を保ったまま [JSON カタログを翻訳](/docs/cli/guides/generating-translations)します。コンポーネント、翻訳呼び出し、ルーティングを変更する必要はありません。

試してみるには、`gt.config.json` で翻訳元とターゲットのカタログを指定し、既存の翻訳をインポートしたうえで、新しいロケールを 1 つ翻訳します。レビュー担当者は [ダッシュボードの翻訳エディター](/docs/platform/dashboard/guides/reviewing-translations) で出力を修正できます。リポジトリにダウンロードしたカタログを直接編集する場合は、次回の翻訳実行前に [`gt save-local`](/docs/cli/reference/commands/save-local) を実行してください。これにより、編集内容が上書きされずに保持されます。

後で gt-next に移行する場合は、[移行ガイド](/docs/react/guides/migrating-i18n-libraries) を参照してください。レビュー済み翻訳のインポート方法、既存の辞書をそのまま使う方法、ルートを 1 つずつ移行しながら両方のライブラリを併用する方法を説明しています。

## 各ライブラリはサーバーコンポーネントとクライアントコンポーネントをどう扱うか

どちらのライブラリでも、App Router のページをローカライズするためにクライアントコンポーネントへ変換する必要はありません。違いは、それぞれの環境で呼び出す API です。

| コンポーネント        | next-intl                                                                                                                                                              | gt-next                                                                                                                                                            |
| -------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| 同期サーバーコンポーネント  | リクエスト設定を利用して [`useTranslations`](https://next-intl.dev/docs/environments/server-client-components#using-internationalization-in-server-components) を使用                 | JSX には [`<T>`](/docs/react/reference/components/t)、文字列には [`useGT`](/docs/react/reference/hooks/use-gt) を使用                                                         |
| 非同期サーバーコンポーネント | `next-intl/server` の [`getTranslations`](https://next-intl.dev/docs/environments/server-client-components#async-components) を await する                                 | `gt-next/server` の [`getGT`](/docs/react/nextjs/reference/functions/get-gt) を await し、返された関数を呼び出す                                                                  |
| クライアントコンポーネント  | `NextIntlClientProvider` 配下で [`useTranslations`](https://next-intl.dev/docs/environments/server-client-components#using-internationalization-in-client-components) を使用 | [`GTProvider`](/docs/react/reference/components/gt-provider) 配下で [`<T>`](/docs/react/reference/components/t) または [`useGT`](/docs/react/reference/hooks/use-gt) を使用 |

どちらのライブラリでも、インタラクティブなコントロールはクライアントコンポーネントに置き、それ以外のページ部分はサーバー側で翻訳してください。next-intl では、サーバーコンポーネントからクライアント側のコントロールへ[翻訳済みのラベルを渡す](https://next-intl.dev/docs/environments/server-client-components#option-1-passing-translated-labels-to-client-components)こともできます。これにより、クライアントにカタログ全体を送らずに済みます。

## 本番環境では gt-next の翻訳はどのように配信されますか？

gt-next は 2 つの配信方法をサポートしています。

* [ローカルローダー](/docs/react/guides/storing-translations)を使用して**翻訳をアプリにバンドルする**。本番環境のアプリは自身の翻訳ファイルを読み込むため、ランタイムに General Translation を呼び出すことは一切ありません。更新は次回のビルド時に反映されます。
* [リモート配信の設定](/docs/react/nextjs/config)を使用して **General Translation の CDN から翻訳を読み込む**。公開した編集内容は、再ビルドなしでデプロイ済みのアプリに反映されます (反映タイミングはバージョンとキャッシュの設定によります) 。

gt-next は [MIT ライセンス](https://github.com/generaltranslation/gt)で提供されています。next-intl がカタログをレンダリングするのと同じように、General Translation のアカウントがなくてもバンドルされた翻訳をレンダリングできます。

## gt-nextを本番環境で使用しているチームは？

General Translationは、Cursor、Ramp、Profound、Cognition、Sierra、ClickHouseの開発チームで採用されています。Profoundでは、Next.js App Routerで構築された主力製品のローカライズにGeneral Translationを活用しています。詳しくは[本番環境での導入事例](https://generaltranslation.com/enterprise)をご覧ください。

## next-intl と gt-next はどう使い分けるべきか？

**next-intl を使い続ける**のが適しているのは、そのカタログモデルがアプリに合っていて、現在の翻訳プロセスがうまく回っている場合です。主な不満がキー管理の煩雑さであれば、移行する前に next-intl の実験的な抽出機能を試してみてください。

**next-intl を使い続けながら General Translation を導入する**のが適しているのは、翻訳作業そのものがボトルネックになっている場合です。`gt` CLI は既存のカタログを翻訳するため、コンポーネント、関数呼び出し、ルーティングを変更する必要はありません。

**gt-next を選ぶ**のが適しているのは、文言を JSX 内にインラインで記述し、ビルドのたびに翻訳を生成したい場合です。まずは、サーバーコンポーネントとクライアントコンポーネント、複数形、リッチテキスト、メタデータをすべて含む 1 つのルートで試してみてください。置き換えの準備が整うまでは、そのルートのロケール URL と既存の翻訳はそのまま残しておき、他のルートを移行する前に本番環境ビルドで動作を確認してください。

まずは [Next.js App Router クイックスタート](/docs/react/nextjs-quickstart)をご覧ください。他のライブラリとの比較については、[General Translation と i18next、react-intl、next-intl の比較](/kb/general-translation-vs-i18n-libraries)を参照してください。

## よくある質問

### next-intl はコンテンツを翻訳しますか？

いいえ。next-intl が行うのは、カタログ内のメッセージのレンダリングと書式設定です。翻訳は、チームのメンバーや翻訳者、または [Crowdin](https://next-intl.dev/docs/workflows/localization-management) などのサービスが用意します。また、General Translation を使えば、移行せずに next-intl のカタログを翻訳することもできます。

### General Translation は next-intl と併用できますか？

はい。`gt` CLI は next-intl の JSON カタログを翻訳し、next-intl のメッセージ構文もそのまま維持します。そのため、既存のコンポーネントやルーティングは変更せずに使い続けられます。詳しくは[翻訳の生成](/docs/cli/guides/generating-translations)を参照してください。

### gt-next は無料のオープンソースですか？

はい。gt-next は MIT ライセンスで公開されており、アカウントがなくてもバンドルされた翻訳をレンダリングできます。General Translation のホスティングサービスを使って翻訳を生成する場合は、[料金](https://generaltranslation.com/pricing)をご確認ください。

### gt-next は React Server Components に対応していますか？

はい。同期サーバーコンポーネントでは [`<T>`](/docs/react/reference/components/t) と [`useGT`](/docs/react/reference/hooks/use-gt) を、非同期サーバーコンポーネントでは [`getGT`](/docs/react/nextjs/reference/functions/get-gt) を使用してください。

### next-intl から gt-next へはルート単位で段階的に移行できますか？

はい。[移行ガイド](/docs/react/guides/migrating-i18n-libraries)では、両方のライブラリを併用する方法、既存の翻訳をインポートする方法、そして必要な箇所ではキー付きの辞書をそのまま使い続ける方法を解説しています。

## next-intl のその他の代替ライブラリ

Next.jsアプリでは、以下のライブラリも比較検討されることがよくあります。

* **i18next:** キーベースのカタログを、複数形の選択に対応した形でレンダリングします。react-i18next や next-i18next と組み合わせて、React および Next.js アプリで広く採用されています。 ([General Translation vs. i18next](/kb/general-translation-vs-i18next) を参照してください。) 
* **react-intl:** ICU メッセージの書式設定を行います。Next.js App Router 向けのガイドも用意されています。 ([General Translation vs. react-intl](/kb/general-translation-vs-react-intl) を参照してください。) 
* **Paraglide JS:** カタログを、型付きでツリーシェイキング可能なメッセージ関数にコンパイルします。webpack ビルド向けの Next.js インテグレーションも提供されています。 ([General Translation vs. Paraglide JS](/kb/general-translation-vs-paraglide) を参照してください。)

## 重要なポイント

* next-intl と gt-next はどちらも App Router、サーバーコンポーネント、ロケールルーティングに対応しており、いずれも MIT ライセンスです。
* next-intl は、ユーザーが用意した翻訳をレンダリングします。gt-next も翻訳をレンダリングしますが、General Translation はそれに加えて、コードを文脈として活用し、インライン JSX から翻訳を生成します。
* General Translation を使うために移行する必要はありません。`gt` CLI で既存の next-intl のカタログをそのまま翻訳できます。
* 移行する場合は、ルートを1つずつ移行し、代わりの翻訳の準備が整うまでは既存の翻訳を読み込んだままにしてください。

## Related questions

- [General Translation vs. i18next、react-intl、next-intl：どのi18nライブラリを使うべきか？](https://generaltranslation.com/ja/kb/general-translation-vs-i18n-libraries.mdx): i18next、react-intl、next-intlなどのオープンソースライブラリ自体は、翻訳を一切行いません。これらが行うのは、あなた自身や翻訳者、あるいは別のサービスが作成し、言語ごとのカタログファイルに用意した翻訳を表示することだけです。General Translationのライブラリも同じくオープンソースで同じ役割を果たしますが、General Translationはさらに、コードを文脈として活用しながら翻訳そのものも行います。
- [多言語対応のNext.jsアプリでSEOを設定するには？](https://generaltranslation.com/ja/kb/multilingual-nextjs-seo.mdx): 言語ごとに専用のURLを用意し、html の lang 属性を設定します。各ページのカノニカルURLは自身を指すようにし、すべての言語の hreflang 代替リンクを追加します。さらに、タイトルと説明文を翻訳し、すべての言語版をサイトマップに掲載します。
- [翻訳ファイルなしで i18n はできますか？](https://generaltranslation.com/ja/kb/i18n-without-translation-files.mdx): はい。gt-react または gt-next を使えば、コンテンツは `<T>` コンポーネントで囲んだままコンポーネント内にインラインで記述でき、翻訳はビルド時に出力として生成されます。そのため、キーやロケールごとの JSON ファイルを作成したり、同期を保ったりする必要はありません。
- [React で複数形を扱うには？](https://generaltranslation.com/ja/kb/how-to-handle-plurals-in-react.mdx): n === 1 のような条件分岐で複数形の選択ロジックをハードコードするのは避けましょう。英語のみのアプリなら小さなヘルパーで十分ですが、多言語アプリではロケール対応の複数形規則が必要になります。gt-react や gt-next の `<Plural>` のような i18n コンポーネントを使えば、あらゆる言語の複数形に対応できます。

## Previous and next questions

- Previous question: [Lokalise の代替ツール：General Translation と Lokalise の比較](https://generaltranslation.com/ja/kb/general-translation-vs-lokalise.mdx)
- Next question: [Phrase の代替ツール：General Translation と Phrase の比較](https://generaltranslation.com/ja/kb/general-translation-vs-phrase.mdx)

## Sitemap

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