hafuture
Back to Blog

ハードコーディング vs next-intl:Next.jsで多言語SEOを完璧に実装する方法

Next.js App Routerでメタデータをハードコーディングせず、next-intlライブラリを活用してSEOに最適化された多言語ウェブサイトを構築する方法を解説します。

Next.jsi18nnext-intlSEOTechnical

多言語ウェブサイトを運営する際、最もよくある間違いがあります。それはメタデータを英語だけでハードコーディングすることです。今日は、この問題をnext-intlライブラリでどのようにきれいに解決できるかを共有します。

問題状況:英語で固定されたメタデータ

hafutureは韓国語、英語、日本語をサポートするグローバルサービスです。ある日、Google Search Consoleを確認していたところ、奇妙な点を発見しました。韓国語ページ(/ko)にアクセスしても、HTMLの<title><meta description>が英語で表示されていたのです。

<!-- /koページなのに英語? -->
<title>Free Online Tools for Text, PDF & Images | Hafuture</title>
<meta name="description" content="Fast, private, browser-based tools..." />

これは明らかにSEOに悪影響を及ぼし、韓国語の検索結果で不利益を受ける可能性があります。

原因:generateMetadataでのハードコーディング

問題の原因はlayout.tsxgenerateMetadata関数にありました:

// ❌ 間違ったアプローチ:ハードコーディング
export async function generateMetadata(): Promise<Metadata> {
  return {
    title: {
      default: "Free Online Tools for Text, PDF & Images | Hafuture",
      template: "%s | Hafuture",
    },
    description: "Fast, private, browser-based tools...",
  };
}

いくらnext-intlを使用していても、メタデータ部分で翻訳関数を呼び出さなければ、静的な英語テキストがそのまま出力されます。

解決策:getTranslationsの使用

next-intlはサーバーコンポーネントで使用できるgetTranslations関数を提供しています。これを活用すれば、generateMetadataでも動的に翻訳されたメタデータを生成できます。

ステップ1:メッセージファイルにMetadataセクションを追加

// messages/ja.json
{
  "Metadata": {
    "title": "テキスト、PDF、画像のための無料オンラインツール | Hafuture",
    "description": "高速でプライバシーを重視したブラウザベースのツール...",
    "ogTitle": "テキスト、PDF、画像のための無料オンラインツール | Hafuture"
  }
}

ステップ2:generateMetadataでgetTranslationsを呼び出す

// ✅ 正しいアプローチ:next-intlを使用
import { getTranslations } from "next-intl/server";

export async function generateMetadata(
  { params }: { params: Promise<{ locale: string }> }
): Promise<Metadata> {
  const { locale } = await params;
  const t = await getTranslations({ locale, namespace: "Metadata" });

  return {
    title: {
      default: t("title"),
      template: t("titleTemplate"),
    },
    description: t("description"),
    openGraph: {
      title: t("ogTitle"),
      description: t("ogDescription"),
    },
  };
}

ハードコーディング vs next-intl 比較

比較項目ハードコーディング(Custom)next-intlライブラリ
最終HTML結果実装スキルによって異なる完璧な結果を保証
実装難易度高い(サーバー/クライアント同期が必要)低い(Next.js専用設計)
ミスの可能性高い(メタデータの欠落など)低い(決まったパターン)
SEOへの影響不安定安定して高いスコア
メンテナンス困難容易(JSONファイルを編集するだけ)

結果確認

修正後、各言語のページのHTMLを確認すると:

韓国語(/ko):

<title>텍스트, PDF, 이미지를 위한 무료 온라인 도구 | Hafuture</title>
<meta property="og:locale" content="ko_KR" />

日本語(/ja):

<title>テキスト、PDF、画像のための無料オンラインツール | Hafuture</title>
<meta property="og:locale" content="ja_JP" />

これで検索エンジンが各言語に適したメタデータを正確に認識できるようになりました!

便利なツールを使ってみる

多言語対応でさらにスマートになったHafutureのツールをご紹介します:

結論

Next.js App Routerを使用しているなら、SEOのミスを防ぎ、メンテナンスを簡単にするためにnext-intlの導入を強くお勧めします。特にgenerateMetadatagetTranslationsを使用することで、「タイトル/説明が翻訳されない」問題を最もきれいに解決できます。

多言語対応は単にテキストを変えることではありません。ユーザーの言語と文化を尊重する第一歩なのですから!

ありがとうございました。🌏