# 多言語サイトのヘッドレスCMSの選び方と作り方：翻訳・公開・hreflang

公開日: 2026-10-20 | 更新日: 2026-10-20 | URL: https://blog.genko.me/multilingual-headless-cms

> 多言語サイト向けヘッドレスCMSは、言語数だけでなく翻訳モデル、言語別公開、フォールバックで選びます。genko.meで日英の記事を配信する手順と、Contentful・Sanityとの違い、hreflangの設計を解説します。

多言語サイトのヘッドレスCMSは、翻訳の保存方法、言語ごとの公開、未翻訳時の表示を基準に選びます。genko.meは共通のコンテンツIDとフィールド構成に言語版を持ち、値と公開状態を言語別に管理する方式です。日英のブログなら、同じ記事を対応づけたうえで英語版だけ後から公開し、サイト側で言語別URLとhreflangを設定できます。

本記事はgenko.meの運営側が執筆しています。製品仕様と他社資料は2026年10月20日に確認しています。[genko.me](https://genko.me/)だけでなく、フィールド単位の翻訳設計を重視する場合の選択肢も紹介します。

## 多言語CMSのフィールド単位・エントリ単位とは

フィールド単位は、一つの原稿内でタイトルや本文に言語別の値を持たせる設計です。エントリ単位は、言語ごとに原稿を分け、翻訳の対応関係を管理する設計です。名称だけで公開やIDの挙動までは決まらないため、製品ごとの仕様を確認します。

| 設計 | 向いている内容 | 先に決めたいこと |
| --- | --- | --- |
| フィールド単位 | 共通項目が多い商品情報など | 翻訳対象、共有値、公開時の必須条件 |
| エントリ単位 | 地域ごとに構成が違う記事など | 翻訳の紐付け、言語別URL、共有値の更新 |
| 共通IDに言語版を持つ方式 | 同じ記事を言語別に運用するブログ | コピー後の差分、言語別公開、欠けた翻訳 |

例えば画像と製品番号は共通、説明文だけ翻訳したい場合と、地域ごとに事例や見出しを変えたい場合では必要な設計が違います。「多言語対応あり」という表記だけで判断しないでください。

## Contentful・Sanity・genko.meの多言語設計を比較する

| CMS | 公式資料で確認できる設計 | 検討しやすい用途 |
| --- | --- | --- |
| Contentful | フィールドのローカライズとカスタムフォールバック | 翻訳対象の項目や代替言語を細かく設計したい |
| Sanity | フィールド単位とドキュメント単位の両方を案内 | コンテンツ構造に合わせて翻訳モデルを作りたい |
| genko.me | 同じID・フィールド構成で言語版の値と公開状態を管理 | 同じブログ記事を各言語のペースで公開したい |

Contentfulはローカライズするフィールドを選べ、欠けた翻訳のための代替言語の連鎖も設定できます。項目単位の共有と翻訳を細かく組み立てたい場合に検討しやすい方式です。[Contentful公式資料](https://www.contentful.com/developers/docs/tutorials/general/setting-locales/)

Sanityは両方式と補助プラグインを案内しています。公式資料ではフィールド単位は一つのドキュメントに複数言語を持ち、ドキュメント単位は言語ごとに独立公開できる設計と説明しています。柔軟さを求める場合の候補です。[Sanity公式資料](https://www.sanity.io/docs/studio/localization)

genko.meは言語ごとの別APIを作る方式ではありません。コンテンツIDとフィールド構成が共通なので、言語間で記事を対応づけやすい一方、コピー後の値を自動同期する機能として扱わないことが大切です。

## genko.meで多言語ブログを作る手順

1. オーナーがワークスペースのメイン言語とサブ言語を設定します。
2. 対象APIの設定で多言語を有効にします。
3. メイン言語の記事からサブ言語の下書きをコピーします。
4. 本文・タイトルなどを翻訳し、その言語のプレビューを確認します。
5. 各言語版を必要なタイミングで公開します。
6. サイトから`lang`を指定して取得します。

Freeはサブ言語を1つ、Plus・Proは上限なく設定できます。つまりFreeでメイン言語と合わせた日英構成を作れます。ただし言語版の本文も原稿容量に含まれます。[プランと上限](https://docs.genko.me/studio/plans)を確認してください。

言語を追加しただけでは翻訳原稿は作成されません。メイン言語からコピーした値は、その後の元原稿の変更に自動追従しません。公開後の追記を各翻訳へ反映する担当と手順を決めておきます。具体的な画面操作は[多言語コンテンツ](https://docs.genko.me/guides/multilingual-content)にあります。

## REST APIで英語版の記事を取得する

`blog`というAPIと対象記事があり、英語版を公開済みとします。キーをサーバー側に設定し、ワークスペースと記事IDを置き換えます。

```bash
curl --get 'https://api.genko.me/v1/your-workspace/blog/abcDEF123456' \
  -H "X-API-KEY: ${GENKO_API_KEY}" \
  --data-urlencode 'lang=en' \
  --data-urlencode 'include=_langs'
```

英語版が未作成または非公開なら、単一取得は既定で404です。`lang`を省略するとメイン言語を返します。英語ページなのに日本語が自動表示されると決めつけず、存在しない翻訳の扱いをサイト側で実装します。

`include=_langs`を付けると、実際に返した言語と公開中の言語一覧を取得できます。

```json
{ "_langs": { "current": "en", "available": ["ja", "en"] } }
```

公開済みの言語だけに切り替えリンクを出す用途に使えます。全パラメータは[配信API](https://docs.genko.me/api-reference/delivery)と[クエリ仕様](https://docs.genko.me/api-reference/queries)を参照してください。

## SDKで言語を指定して一覧を取得する

次は、`title`を持つ`blog`をサーバー側から取得する例です。手動定義は取得方法を示すもので、CMS側にAPIを作成しません。SDK導入済みで、APIキーの設定が必要です。

```ts
import { createGenko, listApi } from "@genko-me/sdk";

const apiKey = process.env.GENKO_API_KEY;
if (!apiKey) throw new Error("GENKO_API_KEY is required");

const genko = createGenko({
  workspace: "your-workspace",
  apiKey,
  apis: { blog: listApi<{ title: string }>() },
});

const { contents } = await genko.apis.blog.list({
  lang: "en",
  include: ["_langs"],
});

for (const post of contents) {
  console.log(post.id, post.title, post._langs?.available);
}
```

英語版が公開されている原稿を取得します。SDKでは`langFallback: true`、HTTPでは`lang_fallback=true`を追加すると、指定言語の公開版がない場合に公開中のメイン言語を返せます。既定では無効です。[SDKクエリ](https://docs.genko.me/sdk/queries)で細部を確認できます。

商品一覧で原語の説明を残したい場合と、完全な英語記事だけを掲載したい場合では方針が違います。後者ではフォールバックを使わず、英語版が公開されてから導線を追加するほうがわかりやすくなります。

## 多言語SEOのURLとhreflangを設定する

CMSの言語版と、サイトのURLは別に設計します。例えば日本語を`/articles/example`、英語を`/en/articles/example`に割り当て、共通IDから対応するURLを組み立てます。スラッグを翻訳するなら、言語ごとのスラッグと対応関係も保持してください。

Googleは各言語ページに自分自身と対応する他言語ページを含むhreflangを記載し、完全なURLを使うよう案内しています。対応するページ同士には相互リンクが必要です。[Google公式ガイド](https://developers.google.com/search/docs/specialty/international/localized-versions)

例えば次の要素を、対応する日英ページの`head`へ同じ組み合わせで出力します。これはCMSの設定ではなく、サイト側の出力例です。

```html
<link rel="alternate" hreflang="ja" href="https://example.com/articles/example" />
<link rel="alternate" hreflang="en" href="https://example.com/en/articles/example" />
```

英語版が未公開なら、そのURLを対応ページとして機械的に並べない運用にします。`_langs.available`など公開状態を使い、言語切り替えとhreflangが指す先を揃えます。hreflangだけで検索順位やAI検索での引用が保証されるわけではありません。

## 翻訳を公開した後の運用で注意すること

公開予定、終了日時、プレビューキー、履歴は言語ごとです。日本語が公開済みでも、英語が下書きなら通常配信では読めません。Webhookでサイトを更新する場合、言語版のイベントに付く`lang`も見て、対象URLを更新します。

公開中の未公開の変更も言語別に管理できます。別言語へ修正が伝わったと思い込まず、翻訳済み一覧と修正待ち一覧を運用上分けると確認しやすくなります。なおワークスペースからサブ言語を外すと、その原稿と履歴が削除されるため、不要と判断する前に書き出しを確認してください。

AIで翻訳を補助する場合も、本文、内部リンク、地域固有の情報を人が確認します。MCPでの言語版管理は[ClaudeのCMS連携](https://blog.genko.me/claude-mcp-cms)、料金の入口は[無料ヘッドレスCMS比較](https://blog.genko.me/free-headless-cms)を参照してください。

## よくある質問

### 多言語サイトは言語ごとに別のAPIが必要ですか？

genko.meでは、一つのAPIの同じコンテンツIDに言語版を持たせます。APIごとに多言語を有効にする必要があります。

### 翻訳していない記事は自動で日本語になりますか？

既定ではフォールバックしません。公開中のメイン言語を代わりに返すには、HTTPの`lang_fallback=true`またはSDKの`langFallback: true`を明示します。

### 無料プランで日本語と英語のブログを作れますか？

2026年10月時点のFreeはメイン言語に加えてサブ言語を1つ設定できます。原稿とメディアの容量など、ほかのプラン条件も合わせて確認してください。

### hreflangはCMSが自動で出力しますか？

この記事の構成では、サイト側で各言語のURLから出力します。CMSに翻訳があることだけで、Webページのheadが設定されるわけではありません。

## 出典

2026年10月20日確認。

- [genko.me 多言語コンテンツ](https://docs.genko.me/guides/multilingual-content)
- [genko.me SDKクエリ](https://docs.genko.me/sdk/queries)
- [genko.me プランと上限](https://docs.genko.me/studio/plans)
- [Contentful Localization](https://www.contentful.com/developers/docs/tutorials/general/setting-locales/)
- [Sanity Localization](https://www.sanity.io/docs/studio/localization)
- [Google：言語や地域の異なるページ](https://developers.google.com/search/docs/specialty/international/localized-versions)
