Entity Language Fallback
管理者が言語ごとに優先順位付きのフォールバック言語リストを設定できるようにし、Entityの表示およびアップキャスト操作に使用されます。
entity_language_fallback
インストール
composer require 'drupal/entity_language_fallback:8.x-1.6'
概要
Entity Language Fallbackモジュールは、サイト管理者が設定された各言語に対してフォールバック言語チェーンを定義できるようにすることで、Drupalの多言語機能を拡張します。コンテンツがリクエストされた言語で利用できない場合、モジュールは管理者が設定した優先順位に従って、設定されたフォールバック言語の翻訳に自動的にフォールバックします。
これは、すべてのコンテンツがすべての言語に翻訳されているわけではない多言語サイトで特に有用です。404エラーやアクセス拒否エラーを表示する代わりに、訪問者は設定されたフォールバックチェーンに従って次に利用可能な最適な言語でコンテンツを閲覧できます。
このモジュールはSearch APIとの深い統合も提供し、言語フォールバックを考慮してコンテンツをインデックス化する専用のデータソースとプロセッサを提供します。これにより、翻訳が不完全な場合でも検索結果が適切に表示されます。
Features
- 言語編集フォームを通じて、言語ごとに優先順位付きのフォールバック言語チェーンを設定
- Entityの表示およびアップキャスト操作における自動言語フォールバック
- hook_language_fallback_candidates_alterを介したDrupal Coreの言語フォールバック候補システムとの統合
- 現在のコンテンツ言語とは異なる言語を持つ可能性のあるフォールバックEntityに対するアクセス制御処理
- フォールバック翻訳を含むEntityをインデックス化するためのSearch APIデータソースプラグイン「Content Entity (with language fallback)」
- 検索インデックスアイテムにフォールバック翻訳を追加するSearch APIプロセッサプラグイン「Fallback language」
- フォールバックデータソースを使用するSearch APIインデックスに対するEntityの挿入、更新、削除操作の自動追跡
- パフォーマンス最適化のためのフォールバックチェーンとEntityアクセス結果の静的キャッシュ
Use Cases
不完全な翻訳を持つ地域サイト
多国籍企業が英語、ドイツ語、フランス語、イタリア語でウェブサイトを運営しています。すべてのコンテンツがすべての言語に翻訳されているわけではありません。ドイツ語を英語にフォールバック、フランス語を英語にフォールバック、イタリア語を英語にフォールバックするよう設定することで、どの言語の訪問者も、利用可能な場合は自分の言語でコンテンツを閲覧でき、利用できない場合は英語で閲覧できます。これにより404エラーを防ぎ、一貫したユーザー体験を維持できます。
共有コンテンツを持つ言語ファミリー
ウェブサイトが複数のスペイン語バリアント(スペイン、メキシコ、アルゼンチン)をサポートしています。es-ES(スペイン語 - スペイン)に翻訳されたコンテンツは、es-MXとes-ARのフォールバックとして使用できます。es-MXとes-ARをまずes-ESに、次に英語にフォールバックするよう設定します。これにより翻訳作業負荷を削減しながら、各オーディエンスに最も関連性の高いコンテンツを提供できます。
言語フォールバック付きSearch APIインデックス化
多言語サイトがSolrまたはElasticsearchでSearch APIを使用しています。標準の「Content」データソースの代わりに「Content (with language fallback)」データソースをインデックスに追加することで、検索結果にフォールバック言語のコンテンツが含まれます。スペイン語ユーザーがコンテンツを検索すると、まだスペイン語に翻訳されていない英語の記事が、適切なファセットとフィルタリングのためにスペイン語の言語メタデータでインデックス化されて見つかります。
段階的翻訳ワークフロー
組織が英語のコンテンツから始めて、段階的に他の言語に翻訳します。Entity言語フォールバックを使用すると、翻訳が存在しない場所に英語のコンテンツを表示しながら、すぐに複数の言語でローンチできます。翻訳が完了すると、設定変更なしで自動的にフォールバックコンテンツを置き換えます。
Tips
- フォールバック言語を論理的な階層で設定してください - 例えば、すべての言語がデフォルトのサイト言語にフォールバックすることで、最大限のコンテンツ可用性を確保できます
- Search APIを使用する場合、包括的なフォールバックインデックス化にはデータソースプラグイン(entity_language_fallback)を、既存のデータソースを強化するにはプロセッサプラグイン(fallback_language)を選択してください
- フォールバックチェーンは優先順位順に評価されます - 最も類似しているか好ましい言語を最初に配置してください
- フォールバック設定は言語ごとに行われ、オーディエンスの好みに基づいて異なる言語に対して異なるフォールバックチェーンを設定できます
- フォールバック設定の変更は、Entityの表示に反映するにはキャッシュクリアが、Search APIには再インデックス化が必要です
Technical Details
Admin Pages 1
/admin/config/regional/language/edit/{language}
このモジュールは既存の言語編集フォームに「Entityフォールバック言語」セクションを追加します。管理者は、選択した言語でコンテンツが利用できない場合にフォールバックとして使用する言語を設定できます。フォールバックは優先順位順にチェックされます。
Hooks 7
hook_language_fallback_candidates_alter
entity_upcastおよびentity_view操作の言語フォールバック候補を変更します。このhookはDrupal Coreの言語フォールバックシステムと統合し、設定されたフォールバック言語を注入します。
hook_form_language_admin_edit_form_alter
言語編集フォームに「Entityフォールバック言語」設定セクションを追加し、管理者が優先順位付きのフォールバック言語を設定できるようにします。
hook_entity_access
フォールバックEntityのアクセスチェックを処理します。現在のコンテンツ言語とは異なる言語を持つ可能性のあるフォールバック翻訳を使用してEntityが表示される場合に、適切なアクセスが付与されるようにします。
hook_entity_insert
entity_language_fallbackデータソースを使用するSearch APIインデックスに対して新しいEntityを追跡します。フォールバックチェーン内のすべての言語のアイテムIDを計算します。
hook_entity_update
Entityが変更されたときにSearch APIの追跡を更新します。古い翻訳状態と新しい翻訳状態を比較して、挿入、更新、削除された翻訳を処理します。
hook_entity_delete
フォールバックデータソースを使用するインデックスについて、削除されたEntityをSearch API追跡から削除します。
hook_search_api_index_items_alter
フォールバックデータソースによって付加された言語メタデータを使用して、インデックス化されるSearch APIアイテムに正しい言語を設定します。
Troubleshooting 3
以下を確認してください:1) Entityタイプが翻訳可能であること、2) admin/config/regional/languageでリクエストされた言語に対してフォールバック言語が設定されていること、3) Entityが設定されたフォールバック言語のいずれかで翻訳を持っていること、4) 設定変更後にすべてのキャッシュをクリアすること。
標準の「entity:*」データソースではなく、「entity_language_fallback:*」データソース(「Content (with language fallback)」とラベル表示)を使用していることを確認してください。データソースまたはフォールバック言語設定を変更した後、検索インデックスを再インデックス化してください。
このモジュールにはフォールバックEntityのアクセス処理が含まれています。アクセス問題が続く場合は、ソース翻訳(フォールバックコンテンツ)が適切なアクセス権限を持っていることを確認してください。モジュールはリクエストされた言語ではなく、実際のEntity言語に対してアクセスをチェックします。
Security Notes 3
- アクセス制御は適切に実施されます - モジュールはリクエストされた言語ではなく、フォールバックEntityの実際の言語に対してアクセスをチェックします
- モジュールはアクセスチェックでの無限再帰を避けるために、preventLoopingフラグ付きの静的キャッシュを使用します
- Search APIのEntity追跡は、インデックス化すべきでないEntityに対するsearch_api_skip_trackingフラグを尊重します