本記事は生成AIと共同で執筆しています。事実関係は可能な範囲で公式ドキュメント等と照合していますが、誤りが含まれている可能性があります。重要な判断を行う前にご自身でも一次情報をご確認ください。

Drupal 10 で多言語サイトを運用しています。日本語を既定言語、英語を /en 配下に置く二言語構成です。

このサイトで、ある静的ページの英語版を編集したい、という依頼がありました。編集担当者が CMS にログインして該当ページを開いたものの、英語を編集する画面が見当たらない、という状況です。

「編集できないなら権限だろう」と当たりをつけたくなりますが、実際には権限に到達する前段の設定も関わっていて、いくつかの条件が重なっていました。Drupal のコンテンツ翻訳(Content Translation)は、翻訳フォームが表示されるまでに独立した条件がいくつも必要で、どれか1つでも欠けるとフォーム自体が現れません。この記事では、その切り分けと解消の手順を記録します。

症状の整理

見えていた事実は次の2つでした。

  • 編集担当者のアカウントでは、CMS の該当ページに「翻訳」を追加する導線が出ない
  • 一方、管理者アカウントで同じページを開くと、翻訳の導線が出る

「管理者では出るが担当者では出ない」という差は、権限まわりを疑う手がかりになります。ただし後述するように、最初はこのページのコンテンツタイプ自体で翻訳が有効化されておらず、管理者でも翻訳タブが出ない状態から始まりました。つまり原因は権限だけではありませんでした。

コンテンツタイプごとに翻訳を有効化する

Drupal の翻訳は、サイト全体で一律にオンになるわけではなく、コンテンツタイプ(記事の種類)ごとに個別に有効化します。設定場所は次のページです。

/admin/config/regional/content-language

ここを確認すると、多くのコンテンツタイプは翻訳が有効になっていましたが、今回の対象になっている「基本ページ」のタイプだけが有効化されていませんでした。有効化されていないコンテンツタイプには、そもそも「翻訳」タブが誰にも表示されません。管理者であっても出ないのが本来の挙動です。

該当のコンテンツタイプの「翻訳可能」にチェックを入れ、翻訳したいフィールド(タイトルと本文)にチェックを入れて保存すると、翻訳タブが現れるようになります。この操作の直後から、管理者アカウントでは翻訳を追加できるようになりました。

コンテンツ言語設定で「基本ページ」を翻訳可能にし、タイトルと本文を翻訳対象のフィールドにチェックした状態のテーブル(再現イメージ・実データではありません)。

保存すると、翻訳用のメタデータフィールド(翻訳元・未更新フラグなど)の追加、バンドル情報キャッシュのクリア、ルーティングの再構築が同期的に実行されます(Batch API によるバッチ処理ではありません)。多くの場合はこの時点でキャッシュも再構築されますが、タブが出ないときは次のページで一度キャッシュをクリアすると反映されます。

/admin/config/development/performance

「編集できる」と「翻訳できる」は別の権限

コンテンツタイプを翻訳有効にした後も、編集担当者のアカウントでは翻訳タブが出ませんでした。管理者では出るのに担当者では出ない、という差がここで効いてきます。

紛らわしいのは、この担当者のロールが、対象のコンテンツタイプを編集する権限をすでに持っていた点です。つまり日本語の本文を編集することはできます。にもかかわらず翻訳ができないのは、Drupal では「コンテンツを編集する権限」と「コンテンツを翻訳する権限」が別物として分かれているためです。

さらに、翻訳の権限は次の2層に分かれています。

  • 動作の権限 … 翻訳項目を「生成する」「編集する」
  • 対象の権限 … どのコンテンツタイプを翻訳してよいか(translate <type> node)

この2つは AND 条件です。「生成・編集はできるが、どのタイプも対象になっていない」あるいはその逆では、翻訳フォームにたどり着けません。対象の権限は、先ほどコンテンツタイプを翻訳有効化したことで、権限一覧に新しい行として現れます。

なお例外として、Drupal 9.1 以降には「編集可能なコンテンツの翻訳を管理(translate editable entities)」という権限があり、これを付けると編集できるコンテンツはこの2層の権限が無くても翻訳できます。今回はこの権限は使わず、動作と対象を明示的に付与する方針にしました。

翻訳フォームが編集担当者に表示され、実際に編集できるまでに必要な3条件。①コンテンツタイプの翻訳有効化(これだけで管理者にはタブが出る)、②翻訳の動作権限(生成する・編集する)、③翻訳の対象権限(このタイプを翻訳)。①②③がすべて揃って初めて編集担当者が英語版を編集できる。

該当ロールの権限ページで、次の3つにチェックを入れて保存しました。

  • 翻訳項目を生成する(create content translations)
  • 翻訳項目を編集する(update content translations)
  • 対象のコンテンツタイプを翻訳する(translate <type> node、有効化後に現れる行)

ロール「ページ編集者」の権限ページ。コンテンツの翻訳の「生成する」「編集する」と「基本ページを翻訳(translate basic_page node)」にチェックが入り、対比として以前から付与済みの「基本ページ:任意のコンテンツを編集」も表示されている(再現イメージ・実データではありません)。

保存後、担当者に一度ログアウトして入り直してもらい(必要ならキャッシュクリア)、翻訳タブと「翻訳を追加」が表示されることを確認できました。

なぜ管理画面のクリック作業になるのか

今回の作業は、すべて Drupal の管理画面での操作でした。API でまとめて設定できないのか、という疑問は自然ですが、これは Drupal の設計に沿った結果です。

Drupal の JSON:API は、ノードやユーザーのような「コンテンツエンティティ」は読み書きできますが、コンテンツタイプ・ロール・権限・翻訳設定のような「設定エンティティ」は読み取り専用です。設定を自動化したい場合は、管理画面か、SSH 経由の Drush が現実的な手段になります。今回のように「翻訳を有効化してロールに権限を付ける」という操作は設定エンティティ側の変更なので、管理画面から行うのが素直でした。

種別JSON:API での操作
コンテンツエンティティノード、ユーザー読み書き可能
設定エンティティコンテンツタイプ、ロール、権限、翻訳設定読み取りのみ

まとめ

「英語版が編集できない」という症状の裏に、独立した条件が重なっていました。

  1. 該当コンテンツタイプで翻訳が有効化されていなかった → コンテンツ言語設定で有効化(これで管理者は編集可能に)
  2. 編集担当者のロールに翻訳の権限(動作+対象の2層)が無かった → 権限を付与して担当者も編集可能に

編集できることと翻訳できることが別権限であること、翻訳権限が「動作」と「対象」の2層に分かれていることが、特に見落としやすい部分でした。まず「管理者では出るか」を確認すると、コンテンツタイプ側の有効化の問題なのか、ロール側の権限の問題なのかを切り分けられます。