# General Translation Knowledge Base: SEO用のタイトルとメタディスクリプションはどのように翻訳すればよいですか？
URL: https://generaltranslation.com/ja/kb/translate-seo-metadata.mdx
Docs index: https://generaltranslation.com/llms.txt
Description: 各言語版のタイトルとメタディスクリプションは、その言語で、対象市場で実際に検索される語句を使って作成します。こうした語句は直訳とは異なることがよくあります。そのうえで、Open Graph、カノニカル、hreflang、html lang、構造化データなど、関連するタグもローカライズします。General Translation の gt-next では、generateMetadata 内で getGT を使ってタイトルとディスクリプションを翻訳できます。
Category: 多言語SEO
Last updated: 2026-10-28
Authors: General Translation Team
Published: 2026-10-28

ページの言語版ごとに専用のタイトルとメタディスクリプションを用意し、そのページの言語で、対象市場のユーザーが実際に検索する語句を使って記述しましょう。そのうえで、関連するタグの内容も整合させます。具体的には、ページ自身を指すカノニカル URL、hreflang の代替リンク、`lang` 属性、Open Graph のロケール、翻訳済みの構造化データです。検索エンジンはこれらをもとに各検索結果のタイトルとスニペットを生成します。また、タイトルの言語や文字体系がページと一致しない場合、Google がタイトルを書き換えることがあります。

## 各ページでローカライズすべき項目

これらの多くは `<head>` 内や属性に含まれているため、レンダリングされたページをレビューしても目に入りません。

| 要素              | 記述場所                                                              | 対応内容                                                                                                         |
| --------------- | ----------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------ |
| タイトル            | `<title>`                                                         | その市場で使われる検索語句に合わせ、ページの言語と文字体系で書き直す                                                                           |
| メタディスクリプション     | `<meta name="description">`                                       | ページごとに翻訳する。Google がスニペットとして表示することがある                                                                         |
| ソーシャルプレビュー      | `og:title`、`og:description`、`twitter:title`、`twitter:description` | タイトルやディスクリプションとあわせて翻訳する                                                                                      |
| Open Graph ロケール | `og:locale`、`og:locale:alternate`                                 | ページのロケールを `pt_BR` のような `language_TERRITORY` 形式で設定し、他のバージョンを列挙する                                              |
| 共有画像            | `og:image`、`og:image:alt`                                         | 代替テキストを翻訳する。画像内に文字がある場合はローカライズした画像を使う                                                                        |
| カノニカル URL       | `<link rel="canonical">`                                          | 各バージョンが自分自身を指すようにする                                                                                          |
| Hreflang 代替リンク  | `<link rel="alternate" hreflang>`                                 | そのページ自身を含め、すべてのバージョンを列挙する ([hreflang とは](/kb/what-is-hreflang)を参照)                                           |
| ドキュメントの言語       | `<html lang>`                                                     | ページのロケールコードを設定する。ブラウザやスクリーンリーダーが参照する                                                                         |
| 構造化データ          | JSON-LD                                                           | 名前と説明を翻訳し、`inLanguage` を設定する                                                                                 |
| 画像              | `<img alt>`、ファイル名                                                 | 代替テキストと、ローカライズした画像のファイル名を翻訳する                                                                                |
| URL スラッグ        | パス                                                                | 任意：`/de/pricing` ではなく `/de/preise` とする ([ローカライズされたスラッグ](/kb/multilingual-url-structure#localized-slugs)を参照)  |

[Open Graph プロトコル](https://ogp.me/)は `og:locale` を `language_TERRITORY` 形式 (デフォルトは `en_US`) と定めており、`og:image` を設定するページでは `og:image:alt` も設定すべきとしています。JSON-LD では、schema.org の [`inLanguage`](https://schema.org/inLanguage) に BCP 47 コードを指定します。また Google の[構造化データに関するガイドライン](https://developers.google.com/search/docs/appearance/structured-data/sd-policies)では、マークアップはページ上に表示されているコンテンツを記述するものでなければならないとしています。したがって、ドイツ語ページのマークアップにはドイツ語の名前と説明を記述します。Google の[画像に関するガイダンス](https://developers.google.com/search/docs/appearance/google-images)によると、Google は代替テキストを使って画像の内容を理解しており、ローカライズした画像についてはファイル名も翻訳することが推奨されています。

## 検索エンジンは翻訳済みメタデータをどう利用するか

検索結果のタイトルとスニペットはメタデータをもとに生成されますが、情報源はメタデータだけではありません。

* **タイトル。** Google の[タイトルリンクに関するガイド](https://developers.google.com/search/docs/appearance/title-link)では、`<title>` をページのメインコンテンツと同じ言語・同じ文字体系で記述するよう求めています。両者が一致しない場合 (たとえば、ヒンディー語のページに英語や翻字されたタイトルが付いている場合) 、Google はページの内容から独自にタイトルリンクを生成することがあります。
* **説明文。** Google は[主にページのコンテンツからスニペットを生成し](https://developers.google.com/search/docs/appearance/snippet)、メタディスクリプション のほうがページを的確に説明している場合にはそちらを使用します。また、ページごとに固有の説明文を用意することを推奨しています。つまり多言語サイトでは、ページごと・言語ごとに説明文が 1 つずつ必要になります。
* **ページそのものが最優先。** Google がローカライズ版を重複とみなすのは、[メインコンテンツが翻訳されていない場合](https://developers.google.com/search/docs/specialty/international/localized-versions)に限られます。また、ページの言語を判定する際に `lang` や hreflang は考慮されません。翻訳済みメタデータだけでは、翻訳されたページの代わりにはなりません。

## よくある間違い

### キーワードを逐語的に翻訳する

検索に使う言葉は市場ごとに異なります。スニーカーを探すとき、アメリカでは「sneakers」と検索しますが、イギリスでは「trainers」と検索します。携帯電話も、ブラジルでは「celular」、ポルトガルでは「telemóvel」、ドイツでは「Handy」と呼ばれます。英語のタイトルを直訳すると、その市場のユーザーが実際に入力する語を取りこぼすおそれがあります。ロケールごとに狙う語を決め (Search Console の検索パフォーマンスレポートを国で絞り込むと、すでにサイトへの流入につながっているクエリを確認できます) 、すべてのタイトルと説明文でその語を使うようにしてください。

### 英語の文字数制限をそのまま流用する

Google はタイトルやディスクリプションに文字数の上限を設けておらず、[デバイスの幅に合わせて切り詰めます](https://developers.google.com/search/docs/appearance/title-link)。英語を前提に決めた文字数の目安は、他の言語にはそのまま通用しません。W3C の記事「[翻訳におけるテキストサイズ](https://www.w3.org/International/articles/article-text-size)」では IBM のガイドラインが引用されており、一般的なタイトルにあたる 31〜50 文字の英語テキストは、翻訳後に平均で元の 140〜160% の長さになるとされています。また、中国語や韓国語の 1 文字は、ラテン文字約 2 文字分の幅を占めるとも指摘されています。主要な語句はタイトルの先頭に置きましょう。そうすれば、切り詰めで末尾が削られてもキーワードは残ります。

### すべてのカノニカルをソース言語のページに向けてしまう

翻訳ページのカノニカルが英語ページを指していると、Google はその翻訳ページを重複コンテンツとみなします。Google の[重複 URL に関するガイダンス](https://developers.google.com/search/docs/crawling-indexing/consolidate-duplicate-urls)では、hreflang を使用する場合は同じ言語のページをカノニカルに指定するよう推奨しています。 ([自己参照カノニカル](/kb/what-is-hreflang#should-hreflang-pages-use-self-referencing-canonicals)を参照してください。)

### 見えないタグの翻訳を忘れる

Open Graph タグ、JSON-LD、画像の代替テキストはレンダリング後のページには表示されません。そのため、ブラウザでドイツ語ページを確認するレビュアーは、これらが英語のまま残っていても気づきません。公開前に、ロケールごとにページのソースやソーシャルプレビューを確認してください。

## 翻訳済みメタデータを作成する方法

| アプローチ                                 | 市場固有の用語                                | 翻訳元の文言が変更されたとき                                                                        | 文字数                | レビュー            |
| ------------------------------------- | -------------------------------------- | ------------------------------------------------------------------------------------- | ------------------ | --------------- |
| 市場ごとに手作業で書く                           | キーワード調査に基づいて選定                         | 担当者がすべての言語を更新                                                                         | 執筆者が確認             | 工程に組み込み済み       |
| 機械翻訳 (Google Translate、DeepL)         | 翻訳元の文言をそのまま翻訳。DeepL の用語集で用語を固定可能       | 手作業で貼り付けるか、各社の API で自動化                                                               | 制御不可               | 別工程             |
| AI API を直接利用 (OpenAI API、Claude API)  | 市場ごとに使う用語などの指示に従う                      | スクリプトを再実行                                                                             | 上限を指示可能            | 別工程             |
| General Translation                   | ロケールごとの用語集、カスタムプロンプト、文字列ごとの `$context` | [`npx gt translate`](/docs/cli/reference/commands/translate) または Locadex が変更された文字列を翻訳 | `$maxChars` で上限を設定 | ダッシュボードの翻訳エディター |

各重点市場で検索トラフィックの大半を占める少数のページは、調査に基づくタイトルに手間をかける価値があるため、メタデータを手作業で書きましょう。機械翻訳は、後で人が手を入れる前提の下書きに向いています。タイトルや説明文がコードや CMS で管理されていて、翻訳元が変わるたびに再翻訳したい場合は General Translation を使い、特に重要なページだけをダッシュボードで手作業で調整しましょう。

## 実装方法

### Next.jsアプリの場合

App Routerでは、メタデータは`generateMetadata`から提供されるため、この関数が返す文字列を翻訳します。このページでは、リクエストのロケールに対応する翻訳関数を返すGeneral Translationの[`getGT`](/docs/react/nextjs/reference/functions/get-gt)を使用し、`/de/pricing`のようなロケールプレフィックス付きのルートを前提としています。

```tsx title="app/[locale]/pricing/page.tsx"
import type { Metadata } from 'next';
import { getGT, getLocale } from 'gt-next/server';

const LOCALES = ['en', 'de', 'fr', 'pt-BR'];
const pageUrl = (locale: string) => `https://example.com/${locale}/pricing`;

// BCP 47（pt-BR）を Open Graph の language_TERRITORY 形式（pt_BR）に変換します。
// maximize() は、リージョンのないコードに最も可能性の高いリージョンを補います（例: de → de-Latn-DE）。
function ogLocale(locale: string) {
  const { language, region } = new Intl.Locale(locale).maximize();
  return `${language}_${region}`;
}

export async function generateMetadata(): Promise<Metadata> {
  const gt = await getGT();
  const locale = await getLocale();

  // $context で、その文字列が何なのかを翻訳者に伝えます。
  const title = gt('Pricing for teams of every size', {
    $context: 'SEO title of the pricing page',
  });
  const description = gt(
    'Compare plans, see what each one includes, and start for free.',
    { $context: 'Meta description of the pricing page' },
  );

  return {
    title,
    description,
    alternates: { canonical: pageUrl(locale) }, // hreflang の代替リンクもここに追加します
    openGraph: {
      title,
      description,
      url: pageUrl(locale),
      locale: ogLocale(locale),
      alternateLocale: LOCALES.filter((l) => l !== locale).map(ogLocale),
      images: [
        {
          url: `https://example.com/og/pricing-${locale}.png`, // 画像にテキストが含まれる場合は、ロケールごとに1枚用意します
          alt: gt('Plan comparison table', { $context: 'Alt text of the share image' }),
        },
      ],
    },
    twitter: { card: 'summary_large_image', title, description },
  };
}
```

Next.js 16.4.3 と `gt-next` 11.4.16 でビルドすると、`/de/pricing` では title、description、Twitter の各タグに加えて、以下のロケール固有のタグがレンダリングされました：

```html title="/de/pricing"
<html lang="de">
<link rel="canonical" href="https://example.com/de/pricing"/>
<meta property="og:url" content="https://example.com/de/pricing"/>
<meta property="og:locale" content="de_DE"/>
<meta property="og:image" content="https://example.com/og/pricing-de.png"/>
<meta property="og:locale:alternate" content="en_US"/>
<meta property="og:locale:alternate" content="fr_FR"/>
<meta property="og:locale:alternate" content="pt_BR"/>
```

`lang` 属性は `[locale]` レイアウトで設定されます。ロケールルーティング、hreflang の代替リンク、サイトマップについては、[多言語対応の Next.jsアプリで SEO を設定するには？](/kb/multilingual-nextjs-seo) で解説しています。この記事では、公開済みロケールのレコードをもとに `alternates.languages` を構築しています。

### 静的サイトの場合

静的サイトジェネレーターは通常、ページのタイトルと説明文をフロントマターから取得するため、翻訳済みファイルごとに独自のタイトルと説明文を持つことになります。たとえば Docusaurus では、[`description` フロントマター](https://docusaurus.io/docs/api/plugins/@docusaurus/plugin-content-docs)が `<meta name="description">` と `og:description` の両方に使われ、翻訳されたドキュメントは `i18n/[locale]/docusaurus-plugin-content-docs/current/` 以下に配置されます。フロントマターは本文と一緒に翻訳してください。

### CMS またはサイトビルダーの場合

SEO フィールドはページ本文と同様にロケールごとに保存し、言語ごとに個別のタイトルとディスクリプションを設定できるようにします。WordPress や Shopify で運用していて、コードでサイトを構築しない場合は、Weglot などのプロキシを使えば、ページと一緒に[タイトル、メタディスクリプション、構造化データも翻訳](https://support.weglot.com/article/293-how-does-weglot-manage-the-seo)されます。 ([General Translation と Weglot の比較](/kb/general-translation-vs-weglot)を参照してください。)

## General TranslationによるSEOメタデータの翻訳方法

Next.js App Routerでは、General Translationの`gt-next`が、`generateMetadata`内で[`getGT`](/docs/react/nextjs/reference/functions/get-gt)に渡した文字列を翻訳します。CLIが検出できるよう文字列リテラルを渡し、`next build`の前に[`npx gt translate`](/docs/cli/reference/commands/translate)を実行してください。英語のタイトルを変更すると、次回のビルド時に新しいテキストがすべてのロケールに翻訳されます。上記のページでは、CLIのオフラインテンプレートコマンドである[`npx gt generate`](/docs/cli/reference/commands/generate)により、タイトル、説明文、代替テキストが翻訳元文字列として一覧表示されます。

メタデータに役立つ[翻訳オプション](/docs/react/reference/types/inline-translation-options)が2つあります。`$context`は、「料金ページのSEOタイトル」のように、その文字列が何なのかを翻訳時に伝えます。`$maxChars`は指定した文字数以内での翻訳を求めるもので、それでも上限を超えた場合は、`gt-next`がレンダリング時に上限の位置で切り詰め、省略記号を付けます。そのため、ピクセル単位の正確な制限ではなく、あくまで上限として扱ってください。このオプションは任意です。Googleは固定の文字数を定めておらず、上限を設けると良い翻訳が途中で切れてしまうこともあるため、シェアカードやCMSのフィールドなど、自社のレイアウトに厳密な上限がある場合にのみ指定してください。

市場固有のキーワードは、[コンテキストグループ](/docs/platform/dashboard/guides/defining-context-for-translations)に用語として追加します。用語集のエントリにはロケールごとの訳語を登録でき、カスタムプロンプトは特定のロケールだけに適用できます。General Translationは、タイトル、説明文、本文のいずれであっても、新しい翻訳にこの両方を適用します。公開前に[ダッシュボードの翻訳エディター](/docs/platform/dashboard/guides/reviewing-translations)で結果をレビューしてください。

用語集のない新規プロジェクト (`gt` 2.26.11および`gt-next` 11.4.16) でテストしたところ、`en-US`で書かれたランニングシューズのカテゴリページが、各市場で使われる用語で翻訳されました。タイトルと説明文はそれぞれ、対象ページ (オンライン靴店のランニングシューズカテゴリ) を示す`$context`を付けて[`getGT`](/docs/react/nextjs/reference/functions/get-gt)に渡しており、ビルド後のページは次のようにレンダリングされました。

```html title="Rendered metadata"
<!-- /en-US/running（翻訳元） -->
<title>Running Sneakers for Trail and Road</title>
<meta name="description" content="Shop lightweight running sneakers with cushioned soles for long runs on trails and city streets."/>

<!-- /en-GB/running -->
<title>Running Trainers for Trail and Road</title>
<meta name="description" content="Shop lightweight running trainers with cushioned soles for long runs on trails and city streets."/>

<!-- /de/running -->
<title>Laufschuhe für Gelände und Straße</title>
<meta name="description" content="Entdecke leichte Laufschuhe mit gut dämpfenden Sohlen für lange Läufe auf Trails und Straßen."/>
```

イギリス向けのページでは trainers が使われ、ドイツ語のタイトルでは逐語訳の &quot;Lauf-Sneaker&quot; ではなく、ランニングシューズを意味するドイツ語の Laufschuhe ([Duden](https://www.duden.de/rechtschreibung/Laufschuh)) が使われています。`$context` なしで同じタイトルを翻訳しても結果はまったく同じだったため、これほど明確な文字列であれば対象ロケールの指定だけで十分でした。また、ドイツ語のタイトルは英語より短くなっています (英語35文字に対して33文字) 。翻訳は必ず長くなると決めつけず、ロケールごとに文字数を確認してください。ただし、人の確認が必要な点が2つ残ります。1つ目に、ドイツ語の説明文はくだけた口調 (*Entdecke*) で読者に呼びかけているため、ブランドとして丁寧な *Sie* を使う場合は、ドイツ語向けに カスタムプロンプト を追加してください。2つ目に、モデルが選ぶ用語はあくまで検索行動についての推測にすぎません。その国で Search Console に表示されるクエリと照らし合わせ、重要な用語は用語集で固定してください。

アプリコード以外での対応は次のとおりです。

* **Payload CMS:** `gt-payload` を使用すると、Payload の SEO プラグインでレンダリングされるフィールドに、メタタイトルは60文字、メタディスクリプションは150文字の[推奨文字数](/docs/integrations/payload/reference/supported-content#character-limits)が適用されます。翻訳がこれを超えると、より短い翻訳が再リクエストされます。実際に切り詰められるのは、フィールドに `maxLength` も設定されている場合のみで、その際は単語の区切りで切り、ロケールに応じた省略記号が付加されます。
* **Mintlify:** Locadex はページタイトルや説明などの[フロントマターを翻訳](/docs/integrations/mintlify/reference/supported-content)するため、ドキュメントサイトの SEO メタデータがすべての言語で揃います。

Ramp は General Translation を使用して、ダッシュボード、ランディングページ、iOS アプリを11以上のロケールにローカライズしています。 ([本番環境での導入事例](https://generaltranslation.com/enterprise)をご覧ください。)

## 要点

* すべての title とメタディスクリプションは、そのページ自体の言語と文字体系で翻訳しましょう。ページと一致しない title は、Google によって書き換えられることがあります。
* 英語の用語を直訳するのではなく、`en-GB` では trainers、`en-US` では sneakers のように、市場ごとにキーワードを選びましょう。
* 英語の文字数制限を流用しないでください。Google はデバイスの表示幅に応じて切り詰めます。また、翻訳後の長さは言語や文字列ごとに異なるため、ロケールごとに計測しましょう。
* title の周辺にあるタグもローカライズしましょう。対象は、自己参照のカノニカル、hreflang、`lang`、`og:locale`、代替テキスト、JSON-LD です。
* Next.js では、General Translation の [`getGT`](/docs/react/nextjs/reference/functions/get-gt) を使って `generateMetadata` 内でメタデータを翻訳できます。`$context` で意図を伝え、厳密な文字数上限があるレイアウトでは任意の `$maxChars` で上限を指定できます。

## Related questions

- [多言語対応の Next.js アプリで SEO を設定するには？](https://generaltranslation.com/ja/kb/multilingual-nextjs-seo.mdx): 各言語に /en/about や /es/about のようなプレフィックス付きの URL を割り当て、公開している言語ごとに html lang、自己参照のカノニカル、x-default を含む hreflang の代替リンク、翻訳済みのタイトルと説明文、サイトマップのエントリを出力します。未公開のバージョンには noindex を指定します。General Translation の gt-next は各言語を専用の URL にルーティングし、getGT でタイトルを翻訳します。
- [hreflang とは？設定方法を解説](https://generaltranslation.com/ja/kb/what-is-hreflang.mdx): hreflang は、どの URL が同じページの言語版または地域版であるかを Google に伝え、検索結果に適切なページを表示させるための仕組みです。HTML の link タグ、HTTP の Link ヘッダー、またはサイトマップで追加し、すべてのリンクを相互に参照させたうえで、en-UK ではなく en-GB のような有効なコードを使用してください。
- [多言語サイトのサイトマップはどのように作成すればよいですか？](https://generaltranslation.com/ja/kb/multilingual-sitemap.mdx): 各ページのすべての言語版を、それぞれ独立した url エントリとして記載します。サイトマップで hreflang を指定する場合は、各エントリに自身を含むすべての言語版の xhtml:link 代替リンクを追加し、必要に応じて x-default も指定します。また、50,000 URL または 50MB を超える場合はファイルを分割します。General Translation の gt-next はロケールごとに個別の URL を割り当てるため、それらをサイトマップに記載できます。
- [多言語SEOにおけるサブディレクトリ・サブドメイン・ccTLDの比較](https://generaltranslation.com/ja/kb/multilingual-url-structure.mdx): 1つのプロダクトでサイトとリリースプロセスを共有するなら、example.com/de/ のようなサブディレクトリを使いましょう。国を示せるのは ccTLD だけで、サブドメインなら個別にホスティングできます。Google は ?lang= パラメータを推奨しておらず、.io や .ai のようなバニティドメインは汎用ドメインとして扱います。
- [ウェブサイトを多言語化するにはどうすればよいですか？](https://generaltranslation.com/ja/kb/make-website-multilingual.mdx): 翻訳をどこで管理するか（プロキシ、CMSプラグイン、サイトビルダー、または自前のコード）を選び、Googleの推奨どおり言語ごとに専用のURLを用意します。ページ全体に加えてタイトルとメタディスクリプションも翻訳し、hreflangで各言語版を関連付けます。また、訪問者を自動でリダイレクトするのではなく、言語切り替え機能を設置しましょう。

## Previous and next questions

- Previous question: [POファイルとPOTファイルはどのように翻訳すればよいですか？](https://generaltranslation.com/ja/kb/translate-po-files.mdx)
- Next question: [strings.xml で Android アプリをローカライズするには？](https://generaltranslation.com/ja/kb/localize-android-app.mdx)

## Sitemap

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