Language Hierarchy
多言語Drupalサイトで言語間の継承関係を設定し、自動的な翻訳フォールバックチェーンを有効にします。
language_hierarchy
インストール
composer require 'drupal/language_hierarchy:^2.0'
概要
Language Hierarchyは、多言語Drupalサイトのための強力なフォールバック機構を提供します。管理者が言語間の親子関係を定義できるようにし、特定の言語バリアントで翻訳が利用できない場合に、コンテンツと設定が自動的に祖先言語にフォールバックする階層を作成します。
このモジュールは、地域別の言語バリアント(例:メキシコ向けスペイン語と一般的なスペイン語、ドイツ向けドイツ語と一般的なドイツ語)を持つサイトで特に有用です。関連する言語間で翻訳を共有しながら、言語固有のオーバーライドを可能にしたい場合に適しています。es-MX(メキシコスペイン語)で翻訳がない場合、モジュールは自動的に親言語のes(スペイン語)で翻訳を探し、設定に従ってチェーンを上位にたどります。
このモジュールはDrupalの言語システムと深く統合されており、Languageモジュールの設定フォームを拡張して、管理者がビジュアルなドラッグ&ドロップインターフェースで言語階層を設定できるようにします。また、階層内での言語関連性によるコンテンツのフィルタリングとソートのためのViews統合も提供します。
Features
- ドラッグ&ドロップで並べ替え可能な階層ツリー構造を通じて、各言語のフォールバック言語を設定
- コンテンツEntityと設定翻訳の両方に対する自動翻訳フォールバック
- DrupalコアのLocaleモジュールとの統合による文字列翻訳フォールバックのサポート
- 現在のコンテンツ言語に対して最も具体的な翻訳のみを表示するViewsフィルタープラグイン
- 設定された階層内での言語関連性によってコンテンツを並べ替えるViewsソートプラグイン
- 直接翻訳と継承されたフォールバック翻訳を正しく区別するConfig Translation統合
- 特定の言語でコンテンツを表示する際にフォールバック翻訳へのリンクを防ぐEntityリンクのURL修正
- 言語階層の優先順位を考慮したパスエイリアスのクエリ変更
- 言語優先度を決定する際のクエリパフォーマンス最適化のためのデータベーステーブル(language_hierarchy_priority)
Use Cases
地域別スペイン語バリアント
サイトにはスペイン語(es)、メキシコスペイン語(es-MX)、スペインスペイン語(es-ES)のコンテンツがあります。es-MXとes-ESがesにフォールバックするように設定します。es-MXでサイトを閲覧している際、特定のコンテンツがメキシコスペイン語に翻訳されていない場合、一般的なスペイン語の翻訳が自動的に表示されます。これにより、地域別のカスタマイズを可能にしながら翻訳作業を削減できます。
ドイツ語圏の国々
サイトはドイツ(de-DE)、オーストリア(de-AT)、スイス(de-CH)をターゲットとし、英語を最終フォールバックとしています。設定:de-DE → de → en、de-AT → de → en、de-CH → de → en。共通のドイツ語コンテンツは一度だけ翻訳され、国固有のバリエーションは必要な場所でのみ作成されます。
設定翻訳の継承
サイト名、メールテンプレート、フィールドラベルなどのシステム設定は、親言語で一度翻訳すると、子言語に自動的に継承されます。子言語では言語固有のオーバーライドのみを作成する必要があります。
言語対応コンテンツリストを持つViews
現在のユーザーに最も関連性の高い言語でコンテンツを表示するViewを作成します。「最も関連性の高い翻訳」フィルターと「コンテンツ言語関連性」ソートを使用して、ユーザーの特定の言語に翻訳されたコンテンツを最初に表示し、親言語の翻訳、次に言語ニュートラルなコンテンツにフォールバックします。
Locale文字列翻訳の共有
インターフェース翻訳(t()文字列)は言語バリアント間で共有できます。親言語でUI文字列を一度翻訳すると、具体的にオーバーライドしない限り、すべての子言語に自動的に表示されます。
Tips
- 各言語を個別に編集するよりも、言語ページのドラッグ&ドロップインターフェースを使用して素早く階層管理を行う
- フォールバックチェーンは複数レベルの深さにできます - 例えば、es-MXはesにフォールバックし、esはenにフォールバックできます
- Viewsを作成する際は、最適な結果を得るために「最も関連性の高い翻訳」フィルターと「コンテンツ言語関連性」ソートを組み合わせる
- 意図的にフォールバック翻訳にリンクしたい場合は、URLオプション「language_hierarchy_fallback」をTRUEに設定する
- 言語ニュートラルなコンテンツ(und)はlocale_lookup操作中を除いて、常に最終フォールバック候補として含まれます
- 優先度テーブルは自動的に保持されます - 手動で管理する必要はありません
Technical Details
Admin Pages 2
/admin/config/regional/language
階層ツリーインターフェースを使用して言語階層関係を設定します。言語はドラッグ&ドロップ機能を使用して並べ替えたり、親言語を割り当てたりできます。テーブルには階層の深さを表すインデント、親言語選択ドロップダウン、言語IDが表示されます。
/admin/config/regional/language/edit/{language}
フォールバック言語設定を含む個々の言語設定を編集します。
Hooks 12
hook_language_fallback_candidates_alter
言語階層をたどることで言語のフォールバックチェーンを構築します。これはDrupalの言語システム全体でフォールバック機能を提供するコアメカニズムです。
hook_query_path_alias_language_fallback_alter
language_hierarchy_priorityテーブルを結合して優先度でソートすることにより、パスエイリアスをクエリする際のフォールバック候補を順序付けます。
hook_query_language_hierarchy_limit_alter
最も具体的な翻訳のみを表示するように結果を制限する複雑な相関サブクエリ実装。Viewsフィルタープラグインで使用されます。
hook_form_language_admin_edit_form_alter
言語編集フォームに「翻訳フォールバック言語」選択フィールドを追加します。
hook_form_language_admin_overview_form_alter
フラットな言語リストを、ドラッグ&ドロップによる並べ替えと親の割り当て機能を持つ階層ツリーに変換します。
hook_configurable_language_insert
新しい言語が作成された際に言語階層の優先度を更新します。
hook_configurable_language_update
言語が変更された際に言語階層の優先度を更新します。
hook_configurable_language_delete
言語が削除された際に言語階層の優先度を更新します。
hook_preprocess_node
特定の言語でコンテンツを表示する際にフォールバック翻訳を指さないようにNodeのURLを修正します。
hook_preprocess_taxonomy_term
フォールバック翻訳を指さないようにタクソノミータームのURLを修正します。
hook_preprocess_image_formatter
フォールバック翻訳を指さないように画像リンクのURLを修正します。
hook_preprocess_responsive_image_formatter
フォールバック翻訳を指さないようにレスポンシブ画像リンクのURLを修正します。
Troubleshooting 5
言語Entityでフォールバック言語が正しく設定されていることを確認してください。管理画面 > 環境設定 > 地域と言語 > 言語を確認し、「親」列に期待される親言語が表示されていることを確認してください。また、親言語にフォールバック対象として期待する翻訳が実際に存在することも確認してください。
「最も関連性の高い翻訳」フィルターはSQLクエリバックエンドのみをサポートしています。ViewがSQLクエリプラグインを使用していることを確認してください。また、フィルター設定でフィルターが有効になっている(チェックボックスがオンになっている)ことも確認してください。
これはモジュールのコントローラオーバーライドによって自動的に処理されるはずです。動作しない場合は、Config Translationモジュールが有効になっていることを確認し、すべてのキャッシュをクリアしてください。モジュールはConfig Translationが有効な場合にのみルートサブスクライバーを登録します。
文字列翻訳フォールバックはLocaleモジュールが有効な場合にのみ機能します。モジュールはLocaleが利用可能な場合にのみStringDatabaseStorageDecoratorサービスを動的に登録します。Localeを有効にしてコンテナを再構築してください。
言語優先度はlanguage_hierarchy_priorityデータベーステーブルに保存されます。language_hierarchy_update_priorities()を実行するか、言語Entityの保存をトリガーして再計算してください。これは言語のCRUD操作と設定インポート時に自動的に実行されます。