Layout Builder Asymmetric Translation
Layout Builderを使用するコンテンツエンティティの各翻訳に対して、非対称(異なる)レイアウトオーバーライドを有効にします。
layout_builder_at
インストール
composer require 'drupal/layout_builder_at:^3.0'
composer require 'drupal/layout_builder_at:8.x-2.15'
概要
Layout Builder Asymmetric Translationを使用すると、Layout Builderオーバーライドを使用するコンテンツアイテムの異なる言語翻訳に対して、異なるレイアウトとブロックを設定できます。これにより、異なる言語で異なるレイアウト配置が必要になるという一般的な多言語の課題が解決されます。
例えば、Articleノードに他のArticleノードには存在しない2つの追加ブロックを表示する必要がある場合、英語翻訳ではBlock Aを左側に、Block Bを右側に表示し、ドイツ語翻訳ではそれらを逆順に表示できます - Block Aを右側に、Block Bを左側に。
このモジュールは、レイアウトセクションフィールドを翻訳可能にすることで機能します。エンティティディスプレイでLayout Builderが有効になると、モジュールは自動的にlayout_builder__layoutフィールドを翻訳可能にします。これにより、各翻訳が独自の独立したセクションとブロックのセットを維持できます。
モジュールはまた、新しい翻訳を作成する際にソース翻訳からブロックをオプションでコピーできるフィールドウィジェットを提供し、エディターが同じレイアウトから開始して、ターゲット言語に必要な変更を加えることができます。
Features
- コンテンツエンティティの各言語翻訳に対して、異なるLayout Builderレイアウトとブロック配置を許可
- エンティティタイプでLayout Builderが有効になると、layout_builder__layoutフィールドを自動的に翻訳可能に設定
- モジュールインストール時に既存のレイアウトセクションフィールドを翻訳可能に変更
- 新しい翻訳を作成する際に表示される「ブロックを翻訳にコピー」チェックボックスウィジェットを提供
- 3つのウィジェット表示モード:未チェック(デフォルト)、チェック済み、または自動コピー用のチェック済み&非表示
- レイアウトに追加されたインラインブロックは、添付されているエンティティの言語を自動的に継承
- 正しい翻訳コンテキストでインラインブロックの依存関係を適切に処理
- 翻訳が削除されたときに翻訳固有のtempstoreデータをクリーンアップ
- 複製中にインラインブロック内のEntity Reference Revisionsフィールドをサポート
- 言語コンテンツ設定テーブルからLayout Builderの非翻訳可能フィールド警告を削除
Use Cases
言語ごとの異なるプロモーションブロック
マーケティングウェブサイトでは、英語とドイツ語のオーディエンスに異なるプロモーションバナーとコールトゥアクションブロックを表示する必要があります。このモジュールを使用すると、英語版では「Summer Sale」バナーを右サイドバーに表示し、ドイツ語版では「Sommerschlussverkauf」バナーを異なる画像とともに左サイドバーに表示できます。
言語固有のコンテンツ順序
ニュースサイトでは、読み方向に基づいて関連記事を異なる方法で表示します。英語レイアウトでは関連記事を右側に表示し、アラビア語翻訳では右から左への読みパターンに対応するために左側に表示します。
地域固有のブロック
ECサイトでは、地域/言語によって異なる決済プロバイダーブロックを表示する必要があります。米国英語版ではPayPalとクレジットカードブロックを表示し、ドイツ語版ではKlarnaとSEPA口座振替ブロックを異なる位置に表示します。
既存レイアウトからの翻訳開始
複雑なレイアウトを持つページのフランス語翻訳を作成する際、エディターは「ブロックを翻訳にコピー」をチェックして既存のすべてのブロックとその位置を複製し、ゼロから再構築する代わりにフランス語オーディエンス向けに必要な変更のみを加えることができます。
自動ブロックコピーワークフロー
翻訳が常にソース言語と同じレイアウトで開始すべきコンテンツタイプに対してウィジェットを「チェック済み&非表示」として設定し、すべてのブロックを自動的にコピーすることで翻訳ワークフローを効率化します。
Tips
- 常に新しい翻訳にブロックを自動的にコピーしたいコンテンツタイプには「チェック済み&非表示」ウィジェット設定を使用してください
- ブロックをコピーする際、インラインブロックコンテンツは完全に複製され、翻訳ごとに個別に編集可能な独立したコピーが作成されます
- モジュールはインストール時に既存のレイアウトフィールドを自動的に翻訳可能にするため、フィールドを再作成する必要はありません
- インラインブロック内のEntity Reference Revisionsフィールド(Paragraphsなど)も、ブロックをコピーする際に適切に複製されます
- モジュールインストール後、非対称翻訳を使用したい各エンティティタイプについて、コンテンツ言語設定でLayoutフィールドの翻訳を有効にすることを忘れないでください
Technical Details
Admin Pages 1
/admin/config/regional/content-language
エンティティタイプのLayout Builderレイアウトフィールドの翻訳を有効にします。これは、エンティティタイプごとにどのフィールドを翻訳可能にするかを設定するDrupal coreのページです。
Hooks 9
hook_module_implements_alter
Layout Builderのform_entity_form_display_edit_form_alter実装を削除し、翻訳可能な場合にレイアウトフィールドをフォーム表示で設定できるようにするモジュール独自の実装に置き換えます。
hook_theme_registry_alter
language_content_settings_table用のLayout Builderのpreprocess関数を削除し、「非翻訳可能」警告メッセージを排除します。このモジュールがレイアウトフィールドを翻訳可能にするためです。
hook_form_entity_form_display_edit_form_alter
エンティティフォームディスプレイ編集フォームを変更し、翻訳可能な場合にレイアウトフィールド設定を表示し、デフォルトのLayout Builder Widgetの選択を防ぐバリデーションを追加します。
hook_form_alter
エンティティフォームを変更し、ウィジェットにlayout_builder_at_accessフラグが設定されている場合に適切なラベル付きの「ブロックを翻訳にコピー」チェックボックスを表示します。
hook_layout_builder_section_storage_alter
coreのOverridesSectionStorageクラスをTranslatableOverridesSectionStorageに置き換え、翻訳でのLayoutタブへのアクセスを許可します。
hook_field_storage_config_presave
layout_sectionフィールドが保存される際に翻訳可能にします。これにより、Layout Builderオーバーライドの非対称翻訳が有効になります。
hook_form_layout_builder_add_block_alter
Layout Builderでブロックを追加する際に、インラインブロックのデフォルト言語をエンティティの言語に一致するよう設定します。この動作はsettings.phpで無効化できます。
hook_entity_translation_delete
エンティティ翻訳が削除されたときにLayout Builder tempstoreをクリーンアップし、その翻訳の未保存のレイアウト変更を削除します。
hook_install
モジュールがインストールされたときに、既存のすべてのlayout_sectionフィールドを翻訳可能にします(config sync中を除く)。
Troubleshooting 5
管理 > 環境設定 > 地域と言語 > コンテンツの言語でlayout_builder__layoutフィールドの翻訳が有効になっていることを確認してください。エンティティタイプの下にあるLayoutフィールドのチェックボックスをオンにしてください。
エンティティタイプのフォーム表示の管理を設定し、layout_builder__layoutフィールドに非表示またはデフォルトウィジェットではなく「Layout Builder Asymmetric Translation」ウィジェットを使用するよう設定してください。
デフォルトでは、インラインブロックはエンティティの言語を継承します。この動作を望まない場合は、settings.phpファイルに $settings['layout_builder_at_set_content_block_language_to_entity'] = FALSE; を追加してください。
このバリデーションエラーは、元のLayout Builderウィジェットが非対称翻訳をサポートしていないために発生します。「Layout Builder Asymmetric Translation」ウィジェットを選択するか、フォーム表示でフィールドを非表示にしてください。
これら2つのモジュールは相互に排他的であり、同じサイトで同時に使用することはできません。非対称(言語ごとに異なるレイアウト)または対称(言語間で同じレイアウト)のいずれかのアプローチを選択してください。
Security Notes 2
- モジュールはDrupalのcoreセキュリティカバレッジを使用し、Drupalのエンティティアクセスパターンに従います
- ブロックコピーはエンティティアクセス権限を尊重します - ユーザーはカスタムブロックを作成および編集するための適切な権限が必要です