このページとあなたの好きなAIアシスタントを使ってドキュメントを要約します
バージョン履歴
- "初版"v9.5.102026/9/26
このページのコンテンツはAIを使用して翻訳されました。
英語の元のコンテンツの最新バージョンを見るこのドキュメントを改善するアイデアがある場合は、GitHubでプルリクエストを送信することで自由に貢献してください。
ドキュメントへのGitHubリンクドキュメントのMarkdownをクリップボードにコピー
2026年に Lingui を使用して Next.js アプリケーションを国際化する方法
目次
Lingui とは?
Lingui は、マクロとメッセージ抽出を中心に構築された i18n ライブラリです。コンポーネント内にソーステキスト( t`Hello` 、<Trans>Hello</Trans>)を記述すると、lingui extract がすべてのメッセージをカタログ(デフォルトでは PO ファイル)に収集し、ローダーがそれらをコンパクトな JavaScript にコンパイルします。メッセージには ICU MessageFormat が使用され、Lingui は App Router 内の React Server Components をサポートしています。
このガイドでは、Next.js 16 App Router プロジェクトで Lingui をセットアップします:
- SWC でコンパイルされるマクロにより、Turbopack の高速性を維持します。
- Server Components と Client Components が同じ
TransおよびuseLinguiAPI を共有します。 proxy.tsによるロケールルーティング:デフォルトロケールは/about、その他のロケールは/fr/about、および初回訪問時の言語検出。generateStaticParamsによるすべてのロケールの静的レンダリング。- 完全な多言語 SEO:翻訳された
generateMetadata、canonical、x-default付きのhreflang、Open Graph ロケール、JSON-LD、sitemap.ts、robots.ts、およびローカライズされた 404 ページ。
他のライブラリをお探しですか? next-intl ガイド、next-i18next ガイド、または Next.js + Intlayer ガイドをご覧ください。
TanStack Start をお使いですか? TanStack Start + Lingui ガイドをご覧ください。ライブラリの比較については、Lingui vs Intlayer および next-i18next vs next-intl vs Intlayer をお読みください。
Next.js における Lingui のベンチマーク結果
i18n ベンチマークでは、主要な各ライブラリを使用して同じ 10 ページ・10 ロケールの Next.js アプリを実行し、ブラウザが実際にダウンロードするサイズを測定しています。
動的な JSON 読み込み
実行時に翻訳を遅延読み込みします
スコープ付き JSON (ネームスペース)
ページごとの翻訳ネームスペース
I18n パフォーマンス ベンチマーク
この指標は何ですか?
国際化ライブラリバンドルの合計gzip圧縮サイズ。これには、ツリーシェイキングと縮小化(minification)後のプロバイダーとコンテンツ取得ロジックのみが含まれます。
なぜ重要なのか?
ライブラリのサイズが小さければ初期 JavaScript ペイロードが削減され、クライアント側でのダウンロードと実行が高速化されます।
表示形式
2026-09-26 に測定された Next.js 16 上の @lingui/core@6.6.0 に関する主要な数値(gzip):
テーブルをモーダルで開き、すべてのデータを明確に表示
| セットアップ | ライブラリサイズ | ページごとの JS | 他ロケールの混入 | 他ページの混入 |
|---|---|---|---|---|
| i18n なし(ベースアプリ) | - | 141.0 KB | 0% | 0% |
| Lingui(ロケールごとに 1 カタログ) | 72.1 KB | 145.4 KB | 2.8% | 89.9% |
@intlayer/lingui(互換レイヤー) | 10.7 KB | 221.6 KB | 50% | 90% |
next-intlayer(ネイティブ Intlayer) | 4.9 KB | 141.5 KB | 0% | 0% |
ポイント:
- ロケールごとに単一のカタログを使用しても、他のページのメッセージがクライアントプロバイダーに混入します。 カタログではなくレンダリング済み HTML を送信する Server Components に、できる限り多くのテキストを保持してください。
- Lingui のランタイムサイズは約 72 KB(gzip)です。
@intlayer/lingui互換アダプターを使用するとランタイムは約 11 KB に削減されますが、このベンチマークでは Next.js 互換セットアップでもカタログ全体がページに送信されます。ベースアプリと同等のサイズを維持できるのは、ネイティブのnext-intlayerAPI セットアップです。
完全なデータについては、Next.js ベンチマークレポート および ベンチマークリポジトリをご覧ください。
Next.js における機能比較
Next.js App Router プロジェクトで通常必要とされる機能において、Lingui が next-intl や Intlayer とどのように比較されるかを以下に示します:
テーブルをモーダルで開き、すべてのデータを明確に表示
| 機能 | next-intlayer (Intlayer) | Lingui | next-intl |
|---|---|---|---|
| コンポーネント近接の翻訳 | ✅ コンポーネントと同じ場所でコンテンツを管理 | ⚠️ ソーステキストはコンポーネント内、カタログは一元管理 | ❌ JSON を一元管理 |
| TypeScript 連携 | ✅ 自動生成される厳格な型定義 | ⚠️ マクロには型付けあり、メッセージカタログにはなし | ✅ AppConfig 拡張による良好なサポート |
| 未翻訳メッセージの検出 | ✅ TypeScript エラーおよびビルド時の警告 | ⚠️ ソーステキストへのランタイムフォールバック | ⚠️ ランタイムフォールバック |
| リッチコンテンツ(JSX、Markdown) | ✅ 直接サポート | ✅ <Trans> 内の JSX をサポート、Markdown は非対応 | ⚠️ t.rich 経由のタグ、Markdown は非対応 |
| AI 翻訳 | ✅ 自身のプロバイダーと API キーを使用(アプリのコンテキスト対応) | ❌ 非対応 | ❌ 非対応 |
| ビジュアルエディター / CMS | ✅ ローカルビジュアルエディター + オプションの CMS | ❌ 外部プラットフォーム経由 | ❌ 外部プラットフォーム経由 |
| ローカライズされたルーティング | ✅ 組み込み対応 | ❌ 独自の proxy.ts を記述 | ✅ 組み込みの [locale] セグメント |
| 複数形処理 | ✅ 列挙型ベース | ✅ ICU、<Plural> マクロ | ✅ ICU |
| コンテンツ形式 | ✅ .ts, .tsx, .js, .json, .md, .yaml | ✅ PO, JSON, CSV | ✅ .json, .js, .ts |
| ICU MessageFormat | ✅ format: "icu" 経由 | ✅ ネイティブ対応 | ✅ ネイティブ対応 |
| SEO ヘルパー(hreflang、sitemap) | ✅ メタデータ、sitemap、robots.txt ヘルパー | ❌ 手動実装 | ✅ 良好 |
| Server Components | ✅ 任意の Server Component で直接アクセス可能 | ⚠️ すべてのレイアウトとページで setI18n の呼び出しが必要 | ⚠️ コンポーネントごとに await getTranslations() が必要 |
| コンポーネント単位のツリーシェイキング | ✅ ビルド時(Babel / SWC) | ⚠️ ロケールごとに 1 カタログ、ページ単位の抽出機能は実験的 | ⚠️ ルートごとに pick() による手動対応 |
| ランタイムサイズ(gzip、ベンチマーク) | 4.9 KB | 72.1 KB | 14.7 KB |
| CI での未翻訳チェック | ✅ npx intlayer test | ✅ lingui compile --strict | ⚠️ 組み込みなし |
| エコシステム / コミュニティ | ⚠️ 比較的小規模だが急速に成長中 | ✅ 成熟 | ✅ 大規模 |
ランタイムサイズは Next.js ベンチマーク に基づいています。詳細な解説については、Lingui vs Intlayer をお読みください。
その他の Next.js ガイド:next-intl、next-i18next、Intlayer。
推奨される実践プラクティス
[locale]レイアウト内で<html>にlangとdirを設定する。- テキストには Server Components を優先する:サーバー側で HTML をレンダリングし、クライアントにカタログを送信する必要がなくなります。
- すべてのレイアウトとページで
initLingui(locale)を呼び出す。 ナビゲーション時にレイアウトは再レンダリングされないため、ページはレイアウトがロケールを設定したことに依存できません。 - ロケールごとに 1 つの URL を維持し、
generateStaticParamsを使ってすべてのロケールを事前レンダリングする。 canonical、hreflang、およびx-defaultを含めて、generateMetadata内でメタデータを翻訳する。sitemap.tsおよびrobots.tsの規約を使用して、多言語対応のサイトマップと robots.txt を生成する。- クローラーがすべての言語バージョンを発見できるように、言語切り替えには実際のリンク(
<a>)を使用する。 - 新しいメッセージが未翻訳のままリリースされないよう、CI で
lingui extractを実行する。
国際化と SEO に関するガイド、hreflang ガイド、および Next.js 多言語 SEO 比較 をご覧ください。
Next.js アプリケーションで Lingui をセットアップするためのステップバイステップガイド
作成するプロジェクト構造は以下のとおりです:
コードをクリップボードにコピー
依存関係のインストール
bashコードをコピーコードをクリップボードにコピー
- @lingui/core / @lingui/react: ランタイム、
I18nProvider、Server Components 用のsetI18n、およびマクロ(@lingui/core/macro、@lingui/react/macro)。 - @lingui/swc-plugin: Next.js の SWC パイプライン内でマクロをコンパイルします。
- @lingui/loader: インポート時に
.poカタログをコンパイルするため、lingui compileを事前に実行する必要がなくなります。 - @lingui/cli: メッセージをカタログに収集するための
lingui extractを提供します。
@lingui/swc-pluginは、Next.js の SWC バージョンに関連付けられた WebAssembly プラグインです。Next.js のアップグレード後にビルドが失敗する場合は、README に互換性があると記載されているバージョンにプラグインを更新してください。- @lingui/core / @lingui/react: ランタイム、
ロケール設定の一元化
単一のファイルでロケールと URL ヘルパーを定義します。ルーティング、メタデータ、サイトマップ、Lingui のすべてがこのファイルを参照します。
src/i18n/config.tsコードをコピーコードをクリップボードにコピー
Lingui と Next.js の設定
lingui.config.tsコードをコピーコードをクリップボードにコピー
SWC プラグインがマクロをコンパイルし、ローダーが Turbopack(Next.js 16 のデフォルト)および webpack の両方で
.poファイルをコンパイルします:next.config.tsコードをコピーコードをクリップボードにコピー
抽出用スクリプトを追加します:
package.jsonコードをコピーコードをクリップボードにコピー
カタログの読み込みとサーバーインスタンスの作成
Server Components には React コンテキストが存在しないため、Lingui は現在のレンダリング用インスタンスを登録するための
setI18nを提供しています。このモジュールは、サーバープロセスごとに 1 回すべてのカタログを読み込み、ロケールごとに 1 つのI18nインスタンスを作成します。これはserver-onlyであり、他のロケールのカタログがクライアントバンドルに到達することはありません。src/i18n/appRouterI18n.tsコードをコピーコードをクリップボードにコピー
src/i18n/initLingui.tsコードをコピーコードをクリップボードにコピー
TypeScript が
.poのインポートを受け入れられるように、モジュール宣言を一度定義します:src/i18n/po.d.tsコードをコピーコードをクリップボードにコピー
クライアントプロバイダーの作成
Client Components は React コンテキストから翻訳を読み取ります。プロバイダーはサーバーレイアウトからアクティブなロケールのカタログを受け取り、自身のインスタンスを一度だけ作成します。
src/components/LinguiClientProvider.tsxコードをコピーコードをクリップボードにコピー
動的ロケールルートの定義
[locale]セグメントがルートレイアウトを保持します。generateStaticParamsはビルド時にすべてのロケールを事前レンダリングし、dynamicParams = falseはその他のプレフィックスに対して 404 を返します。src/app/[locale]/layout.tsxコードをコピーコードをクリップボードにコピー
クライアントプロバイダーはアクティブなロケールのカタログ全体を受け取ります。これがベンチマークで「他ページの混入」として測定されるものです。テキストを Server Components に保持することで、クライアントが実際に必要とするデータを抑えられます。大規模なアプリの場合、Lingui の実験的なページ単位抽出機能(
lingui.config.tsのexperimental.extractor)により、エントリーポイントごとにカタログを分割できます。Server Components での翻訳の利用
Server Components は Client Components と同じマクロを使用します。レイアウトはその配下のページ間を移動する際に再レンダリングされないため、ページ内でも
initLinguiを実行する必要があります。src/app/[locale]/about/page.tsxコードをコピーコードをクリップボードにコピー
Client Components での翻訳の利用
Client Components も同じインポートを使用します。マクロは
LinguiClientProviderからインスタンスを読み取ります。src/components/Counter.tsxコードをコピーコードをクリップボードにコピー
メッセージの抽出と翻訳
抽出を実行します。Lingui は
src内で見つかったすべてのメッセージを各ロケールカタログに書き込みます:bashコードをコピーコードをクリップボードにコピー
次に、各エントリの
msgstrを翻訳します:src/locales/fr/messages.poコードをコピーコードをクリップボードにコピー
src/locales/es/messages.poコードをコピーコードをクリップボードにコピー
<0>プレースホルダーは<Trans>内の JSX 要素の位置を保持するため、翻訳者はマークアップに触れることなく位置を変更できます。ロケールルーティング用プロキシのセットアップ
オプションNext.js 16 では
middleware.tsがproxy.tsに変更されました。このプロキシは「必要に応じたプレフィックス(as-needed prefix)」戦略を実装します:/fr/aboutはそのまま提供されます。/en/aboutは/aboutにリダイレクトされるため、デフォルトロケールには単一の URL が設定されます。/aboutは URL を変更することなく、内部的に/en/aboutにリライトされます。/への初回訪問時は、優先言語(Cookie が最優先、次にAccept-Language)にリダイレクトされます。
src/i18n/negotiateLocale.tsコードをコピーコードをクリップボードにコピー
src/proxy.tsコードをコピーコードをクリップボードにコピー
コンテンツの言語の切り替え
オプションusePathnameはブラウザに表示されている URL(/aboutまたは/fr/about)を返します。ロケールを取り除いてから、各言語のリンクを構築します。スイッチャーはクローラーがすべての言語バージョンに到達できるように実際のリンクをレンダリングし、Cookie が明示的な選択を記憶します。src/components/LocaleSwitcher.tsxコードをコピーコードをクリップボードにコピー
ローカライズされた Link コンポーネントの作成
オプションsrc/components/LocalizedLink.tsxコードをコピーコードをクリップボードにコピー
LinguiClientProviderの内部でレンダリングされるため、Server Components からも動作します:tsxコードをコピーコードをクリップボードにコピー
メタデータの国際化
オプション各言語バージョンが個別に検索順位を獲得できるように、すべてのページで以下を公開します:
- 翻訳された
titleとdescription - 自身を指す canonical URL
- ロケールごとの
hreflangalternate、およびx-default - Open Graph の
locale、alternateLocale、url inLanguageを含む JSON-LD
generateMetadataは React ツリーの外部で実行されるため、msgマクロを使用してサーバーインスタンスを直接使用します:src/i18n/metadata.tsコードをコピーコードをクリップボードにコピー
src/app/[locale]/about/page.tsxコードをコピーコードをクリップボードにコピー
JSON-LD はページ自身によってレンダリングされます。ページファイルは Next.js のフィールドのみをエクスポートできるため、コンポーネントは専用のファイルに分けて保持します:
src/components/WebPageJsonLd.tsxコードをコピーコードをクリップボードにコピー
src/app/[locale]/about/page.tsxコードをコピーコードをクリップボードにコピー
- 翻訳された
サイトマップの国際化
オプションsitemap.tsの規約はalternates.languagesをサポートしており、Next.js はこれをxhtml:linkalternate としてレンダリングします。すべてのロケールのすべての URL をリストします:src/app/sitemap.tsコードをコピーコードをクリップボードにコピー
robots.txt の国際化
オプションプライベートルートはすべての言語に存在するため、
disallowはローカライズされたすべてのパスをカバーする必要があります:src/app/robots.tsコードをコピーコードをクリップボードにコピー
ローカライズされた 404 ページの処理
オプションnot-found.tsxは[locale]レイアウト内でレンダリングされるため、クライアントプロバイダーにアクセスできます。catch-all ルートは、ロケール内の不明なパスをここにルーティングします。Next.js は 404 レスポンスに自動的にnoindexを追加します。src/app/[locale]/not-found.tsxコードをコピーコードをクリップボードにコピー
src/app/[locale]/[...rest]/page.tsxコードをコピーコードをクリップボードにコピー
Server Actions でのロケールへのアクセス
オプションServer Actions はルートパラメータを受け取りません。最も確実な方法は、ロケールを把握しているページからフォームと一緒にロケールを送信することです:
src/app/[locale]/contact/page.tsxコードをコピーコードをクリップボードにコピー
src/app/actions/sendContactMessage.tsコードをコピーコードをクリップボードにコピー
マクロを維持したまま Intlayer でランタイムを削減
オプション@intlayer/lingui互換アダプターを使用すると、ソースコードを変更せずにそのまま利用できます。マクロは以前と同様にコンパイルされ、生成されたi18n._()、useLingui()、および<Trans>の呼び出しは Intlayer の辞書から提供されます。Next.js のベンチマークでは、ランタイムが 約 72.1 KB から約 10.7 KB(gzip)に削減されます。Next.js では、
next.config.ts(webpack および Turbopack)で@lingui/coreと@lingui/reactを@intlayer/linguiにエイリアスし、next-intlayer/serverのwithIntlayerで設定をラップすることでアダプターを接続します。マクロが最初にコンパイルされるように@lingui/swc-pluginはそのまま維持します。完全な設定方法は Lingui 互換ガイド をご覧ください。ベンチマーク表に示されているように、アダプターはランタイムサイズを削減しますが、Next.js 上で各ページに送信されるカタログのサイズはまだ削減されません。これは移行用のブリッジとして使用するのが最適です。動作を確認したら、各コンポーネントがレンダリングするコンテンツのみを送信するネイティブの
useIntlayerAPI へコンポーネントを段階的に移行します。Next.js + Intlayer ガイド、Lingui vs @intlayer/lingui、およびすべての 互換アダプター をご覧ください。Intlayer を使用した翻訳の自動化
オプションLingui はメッセージを抽出しますが、何十ものカタログを手作業で埋める作業には多くの時間がかかります。Intlayer は無料かつオープンソースであり、そのツール群は Lingui と連携して動作します:
- 自身の API キーとプロバイダーを使用して AI で翻訳する。自動入力 および CLI をご覧ください。
- PO 同期プラグイン を使用して PO ファイルを信頼できる唯一の情報源として維持する。
- CI で 未翻訳のメッセージをテストする。翻訳のテスト をご覧ください。
- scan コマンド を使用して、デプロイされたサイトの
hreflangの欠落、誤った canonical、ロケールの混入を 監査する。
よくある質問
はい。@lingui/react は React Server Components をサポートしています。Server Components は @lingui/react/server の setI18n でインスタンスを登録し、Client Components は I18nProvider から読み取り、両者とも同じ Trans および useLingui マクロを使用します。
Server Components にはコンテキストが存在しないため、インスタンスはレンダリングごとに登録されます。レイアウトはナビゲーションをまたいで保持され再レンダリングされないため、ページはレイアウトがロケールを設定したことに依存できません。各レイアウトとページの先頭で initLingui(locale) を呼び出すことで、それらを独立して動作させることができます。
@lingui/swc-plugin を使用してください。これにより SWC パイプラインと Turbopack が維持されます。Babel 設定を追加すると Next.js で SWC が無効化され、ビルドが遅くなります。唯一の注意点は、お使いの Next.js リリースの SWC バージョンと互換性のあるプラグインバージョンを維持することです。
getI18nInstance(locale) でサーバーインスタンスを取得し、msg マクロで宣言された記述子を翻訳します(例:i18n._(msg`About us`))。alternates.canonical、x-default 付きの alternates.languages、および openGraph.locale を返します。ステップ 13 に再利用可能なヘルパーが記載されています。
ベンチマーク では、ランタイムが約 72 KB(gzip)と測定されています。ロケールごとに 1 つのカタログを使用した場合、i18n なしの 141 KB に対してページサイズは約 145 KB になりますが、クライアントプロバイダーを通じて各ページに他のページのメッセージも受信されます。
Lingui は、コンポーネント内にソーステキストを記述し、PO ファイルや翻訳者と連携したいチームに適しています。next-intl は、JSON カタログと Next.js に緊密に統合された t("key") API を好むチームに適しています。next-i18next は i18next プラグインのエコシステムを活用できます。next-i18next vs next-intl vs Intlayer および Next.js ベンチマーク をご覧ください。
コメント
まだコメントはありません。最初のコメントを共有しましょう。
