目次
1つの言語でコンテンツを管理するだけでも、すでに大きな課題です。3言語、5言語、あるいは20言語を追加すると、ほとんどのCMSプラットフォームが解決するために設計されていなかった問題が生じます。Headless CMSアーキテクチャはその解決策を提供しますが、多言語サポートが基盤から組み込まれている場合に限ります——プラグインとして後付けされるのではなく。
このガイドでは、Better i18nのコンテンツプラットフォームを実践的な参考例として使用しながら、スケーラブルな多言語Headless CMS戦略の構築方法を解説します。
CMSが「多言語対応」であるとはどういうことか?
実装の詳細に入る前に、本物の多言語サポートがどのようなものかを定義しておきましょう。CMSが多言語対応であるためには、3つの要件を満たす必要があります。
コンテンツ構造が言語を認識している。 スキーマは、翻訳が必要なフィールド(タイトル、説明、本文)と、ユニバーサルなフィールド(日付、真偽値、数値、メディアアセット)を区別します。
APIがローカライズされたコンテンツをネイティブに提供する。 別々のコンテンツツリーを管理したり、ロケールごとにエントリを複製したりすることなく、クエリパラメータを使ってあらゆる言語のコンテンツをリクエストできます。
翻訳ステータスが可視化されている。 編集者はCMSダッシュボードを離れることなく、どのエントリが翻訳済みか、どれが保留中か、どの言語で不足しているかを確認できます。
現在のCMSがこれら3つの基準のいずれかを満たすためにカスタムコードやサードパーティサービスを必要とする場合、スケールアップするにつれて摩擦を生み出す基盤の上に構築していることになります。
ステップ1:コンテンツモデルを設計する
コンテンツモデルは、コンテンツの構造を定義するスキーマです。設計図のように考えてください——フィールド、その型、検証ルールを指定します。
CollectionsとSingletons
ほとんどのコンテンツは2つのカテゴリに分類されます。
Collectionsは複数のエントリを持つモデルです。ブログ記事、製品ページ、FAQ、チームメンバープロフィール、changelogエントリはすべてCollectionsです。各Collectionは同じフィールド構造を共有する数百または数千のエントリを持つことができます。
Singletonsは単一のエントリを持つモデルです。ホームページのヒーローセクション、グローバルなサイト設定、または「About Us」ページはSingletonsです。Collectionsと同じフィールドの柔軟性を持ちますが、単一のインスタンスを表します。
正しいモデルタイプから始めることで、後の手直しを防げます。「これが複数になることはあるか?」と自問してください。もしそうなら、Collectionを使用してください。
適切なフィールドタイプの選択
Better i18nは19種類以上のフィールドタイプを提供しており、構造化データをtextareaに格納するような回避策に頼ることなく、コンテンツを正確にモデリングできます。
カテゴリ別の実践的な概要は次のとおりです。
テキストフィールド:
- Text — タイトル、ラベル、短い値のための1行文字列
- Textarea — 説明とサマリーのための複数行プレーンテキスト
- Rich Text — 見出し、リスト、埋め込み、インラインスタイルを含むフォーマットされたコンテンツのための完全なPlate.jsエディタ
データフィールド:
- Number — 整数または小数値(価格、数量、評価)
- Boolean — 真偽値トグル(注目フラグ、表示コントロール)
- Date / DateTime — オプションの時間精度を持つ日付ピッカー
- Enum — 定義済みオプションからの単一または複数選択(カテゴリ、タグ、ステータスラベル)
連絡先とリンクフィールド:
- URL — リンクと参照のための検証済みURLフィールド
- Email — 検証済みメールアドレスフィールド
- Phone — フォーマット検証付き電話番号フィールド
メディアとファイル:
- Files / Media — 画像、PDF、動画、その他のアセットをエントリに直接アップロード
リレーショナルフィールド:
- Relations — モデル間でエントリをリンク(例:ブログ記事の著者、製品のカテゴリ)
- Rollups — 関連エントリからデータを集計(例:著者ごとの記事数)
- Formulas — 同じエントリの他のフィールドに基づく計算値
システムフィールド:
- Unique ID — 各エントリの自動生成識別子
- Status — 組み込みワークフロー状態(draft、pending_review、published、archived)
- Created / Last Edited — 監査証跡のための自動タイムスタンプ
フィールドごとのローカライズ
ここで多言語CMSデザインが面白くなります。すべてのフィールドを翻訳する必要はありません。製品の価格はすべての言語で同じです。公開日はロケールごとに変わりません。画像URLは通常ユニバーサルです。
Better i18nでは、モデルレベルで各フィールドをローカライズ可能またはローカライズ不可としてマークできます。ローカライズ可能なフィールドは言語ごとに別々の値を持ちます。ローカライズ不可のフィールドはすべての翻訳で共有されます。
この区別が重要な理由は次のとおりです。
- 翻訳作業量を削減します(翻訳者は翻訳が必要なフィールドのみを確認します)
- データの不整合を防ぎます(ユニバーサル値は一度保存され、複製されません)
- APIレスポンスをクリーンに保ちます(ローカライズ不可のフィールドは要求された言語に関わらず一度だけ表示されます)
ステップ2:編集ワークフローを構築する
多言語コンテンツを管理するチームには、純粋なCRUD操作だけでは不十分です。ボトルネックを作ることなく品質を確保するワークフローが必要です。
ステータスライフサイクル
Better i18nの各エントリは4段階のライフサイクルに従います。
| ステータス | 意味 | API可視性 |
|---|---|---|
| Draft | 作業中 | デフォルトでは返されない |
| Pending Review | 編集承認待ち | デフォルトでは返されない |
| Published | 公開中のコンテンツ | APIクエリで返される |
| Archived | 保持されているが非アクティブ | デフォルトでは返されない |
このライフサイクルは言語ごとではなく、エントリごとに適用されます。一部の翻訳がまだdraftであっても、エントリを公開できます。APIはstatusクエリパラメータを尊重するため、フロントエンドは要求した状態のコンテンツのみを受け取ります。
スケールのためのバルク操作
複数の言語で数百のエントリを管理している場合、1つずつの更新はスケールしません。Better i18nはバルク操作をサポートしています。
- バルクステータス更新 — 複数のエントリを選択し、1回の操作でdraftからpublished(またはその他の遷移)に移動
- バルク削除 — 古いエントリをまとめて削除
これらの操作はダッシュボードと管理APIの両方で利用でき、CI/CDパイプラインやコンテンツ自動化スクリプトに統合できます。
ステップ3:REST APIを通じて統合する
「Headless CMS」の「Headless」とは、コンテンツが結合されたフロントエンドではなく、APIを通じて配信されることを意味します。Better i18nは3つのコアエンドポイントを持つパブリックREST APIを提供しています。
コアエンドポイント
GET /v1/content/:orgSlug/:projectSlug/models GET /v1/content/:orgSlug/:projectSlug/entries GET /v1/content/:orgSlug/:projectSlug/entries/:entrySlug
重要なクエリパラメータ
APIの真の力はクエリパラメータにあります。
言語フィルタリング:
GET /entries?language=fr
すべてのコンテンツをフランス語で返します。ローカライズ不可としてマークされたフィールドはユニバーサル値を返します。ローカライズ可能なフィールドは利用可能な場合はフランス語翻訳を返します。
ステータスフィルタリング:
GET /entries?status=published
公開済みエントリのみを返します。本番クエリのために言語と組み合わせます。
GET /entries?language=de&status=published
フィールド選択(スパースフィールドセット):
GET /entries?fields=title,slug,excerpt
フロントエンドが必要とするフィールドのみをリクエストすることでペイロードサイズを削減します。
リレーション展開:
GET /entries?expand=author,category
フォローアップリクエストを行う代わりに、関連エントリをインラインで解決します。これにより、多くのHeadless CMS統合を悩ませるN+1クエリ問題が解消されます。
カスタムフィールドによるフィルタリング:
GET /entries?filter[page_type]=feature
任意のカスタムフィールド値でエントリをフィルタリングします。精密なクエリのために複数のフィルターを組み合わせます。
ページネーションとソート:
GET /entries?page=2&limit=10&sort=createdAt&order=desc
柔軟なソートを持つ標準的なページネーション。レスポンスにはページネーションUIを構築するための合計数が含まれます。
認証
すべてのAPIリクエストはx-api-keyヘッダーで渡されるAPIキーが必要です。異なる権限を持つ複数のキーを作成できます——例えば、フロントエンド用の読み取り専用キーとCMS統合スクリプト用のフルアクセスキーなど。
curl -H "x-api-key: your-api-key" \ "https://api.better-i18n.com/v1/content/acme/website/entries?language=en&status=published"
ステップ4:AIコンテンツ生成を戦略的に活用する
Better i18nにはフィールドレベルのAI駆動コンテンツ生成機能が含まれています。generateFieldContent機能はモデル構造と既存のコンテンツを分析して、個々のフィールドの値を提案します。
AI生成が価値を生む場面
- SEOメタディスクリプション — エントリのタイトルと本文コンテンツに基づいてディスクリプションを生成
- 抜粋とサマリー — 長文コンテンツを簡潔なプレビューに凝縮
- 初稿 — モデルの構造に合った本文コンテンツの出発点を取得
- 画像のaltテキスト — 画像コンテキストに基づいて説明的なaltテキストを生成
人間の判断を保持すべき場面
AI生成は出発点であり、最終的なアウトプットではありません。空白フィールドへの不安を解消するために使用し、その後ブランドボイスと事実要件に合わせて編集してください。フィールドレベルのアプローチにより、どのフィールドがAI提案を使用し、どのフィールドが手動で書かれるかを正確に制御できます。
ステップ5:コンテンツアーキテクチャを計画する
基本的な構成要素が整ったら、多言語サイトの実践的なアーキテクチャを紹介します。
推奨モデル
| モデル | タイプ | 用途 |
|---|---|---|
pages | Collection | マーケティングページ、ランディングページ |
blog-posts | Collection | 記事、チュートリアル、お知らせ |
navigation | Singleton | サイトナビゲーション構造 |
site-settings | Singleton | グローバル設定(ロゴ、フッター、ソーシャルリンク) |
faq | Collection | よくある質問 |
changelog | Collection | 製品アップデートとリリースノート |
翻訳ワークフロー
- ソース言語でコンテンツを作成する。 チームの主要言語でエントリを書きます。
- 翻訳ステータスダッシュボードを使用して、翻訳が不足しているエントリを特定します。
- エントリエディタまたはAPIを使用して、フィールドごとに翻訳を追加します。
- 準備ができたら公開する — ステータスライフサイクルにより、ソース言語をすぐに公開し、翻訳が利用可能になったときに追加できます。
避けるべき一般的な落とし穴
言語ごとにエントリを複製する。 これが最も一般的なミスです。同じページの英語、フランス語、ドイツ語バージョンに別々のエントリを作成すると、それらの間のつながりが失われます。代わりに、フィールドごとの翻訳を持つ単一のエントリを使用してください。
ローカライズ不可フィールドを無視する。 ユニバーサルフィールド(価格、日付、真偽値フラグ)をローカライズ不可としてマークしないと、翻訳者が触れるべきでないフィールドを見ることになり、データの不整合リスクが生じます。
ステータスワークフローをスキップする。 レビュー段階なしにコンテンツを直接公開することは、ソロブロガーには機能しますが、チームでは機能しません。品質を維持するためにdraftからpublishedへのライフサイクルを使用してください。
APIから過剰にデータを取得する。 フロントエンドが必要とするものだけをリクエストするためにfieldsパラメータを使用してください。複数のAPI呼び出しを連鎖させる代わりに、単一のリクエストでリレーションを解決するためにexpandを使用してください。
はじめに
多言語コンテンツ戦略の構築に何ヶ月ものインフラ作業は必要ありません。Better i18nのHeadless CMSを使えば:
- Model Builderでコンテンツモデルを定義します
- ソース言語でエントリを作成します
- エントリエディタまたはAPIを使用して翻訳を追加します
- REST APIを通じてローカライズされたコンテンツをクエリします
- AI生成を使用してコンテンツ作成を加速します
モデル作成からAPI配信までのワークフロー全体が、多言語コンテンツを後付けの機能としてではなく、製品の核心部分として提供するチームのために設計されています。