Next.js+next-intlで「手作業なし翻訳」による5言語対応サイトのスケール方法

Dev.to / 2026/5/12

💬 オピニオンDeveloper Stack & InfrastructureSignals & Early TrendsTools & Practical UsageIndustry & Market Moves

要点

  • 著者は、NBAジャージーに関するニッチなコンテンツサイトを、60本以上の記事の手作業翻訳を避けつつ、1言語から5言語へ拡張しました。
  • 解決策は、Next.js 16 App Routerとnext-intl v4(ロケールのルーティング/メッセージ処理)、MDX(コンテンツ)、そしてClaude APIと独自のバッチ翻訳パイプラインを組み合わせています。
  • コンテンツはロケール優先のディレクトリ構造で管理し、英語を“正”として扱い、各ロケールに翻訳済みのMDXファイルを用意します。
  • ルーティング設定では、英語はURLをきれいに保つ一方で、他言語は必要に応じてURLプレフィックスを付与し、ユーザー体験と整合性を高めています。
  • 本記事では、検索エンジンに言語別ページを正しく理解させるためのhreflangがSEO上の重要要素である点を強調しています。

なぜマルチ言語?

私はNBAユニフォームに関するニッチなコンテンツサイトを運営しています。バスケットボールはグローバルです――中国、日本、韓国、そしてラテンアメリカのファンが、同じユニフォームをそれぞれの言語で検索します。さらに4つのロケールを追加したことで、アクセス可能な検索トラフィックが一晩で5倍になりました。

しかし、60本以上の記事を4言語に手作業で翻訳する? そんなことはできません。

スタック

  • Next.js 16 App Router
  • next-intl v4 ルーティングとメッセージ処理用
  • MDX コンテンツ用
  • Claude API 翻訳用
  • カスタムパイプライン バッチ処理用

アーキテクチャ:ロケール優先のファイル構造

content/
├── en/
│   └── jerseys/
│       └── michael-jordan/
│           └── bulls-pinstripe.mdx
├── zh/
├── ja/
├── ko/
└── es/

各ロケールには独自のコンテンツディレクトリを用意します。英語版が正(source of truth)です。

next-intl によるルーティング

export const locales = ['en', 'zh', 'ja', 'ko', 'es'] as const;

export const routing = defineRouting({
  locales,
  defaultLocale: 'en',
  localePrefix: 'as-needed',
});

as-needed プレフィックスは、英語のURLはきれいなままにしつつ、他のロケールにはそのプレフィックスを付けるという意味です。

翻訳パイプライン

私は、英語のMDXを読み取り、不足している翻訳を確認し、Claude APIに送信して、フロントマターを保持しながら翻訳済みファイルを書き込むバッチ翻訳ツールを作りました。

Hreflang:決定的に重要なSEOパーツ

各ページには、その翻訳先を指す alternates が必要です。ページのメタデータ内だけでなく、サイトマップにも両方で設定します。

コンテンツのフォールバック戦略

翻訳が欠けている場合は、適切に英語へフォールバックします。404は発生しません。

結果

  • 英語の元記事 63本 → 5ロケールで合計267ページ
  • 手作業の翻訳作業ゼロ
  • ビルド時間:約45秒(全267ページ)

サイト:JerseyToMe