Drupal 8でカスタムロゴ画像を使用するにはどうすればよいですか?コンテンツと言語の翻訳構成ページに適切な設定がないようです。
Langaugeはブロックの可視性条件であるため、複数のブランディングブロックを使用してパスをハードコーディングできます。
自動的に設定するのは少し難しく、前処理の$ variablesで言語を使用できないため、追加する必要があります。これらをすべての前処理関数とテンプレートに追加できます。
_/**
* Preprocess variables for all templates.
* @param $variables
*/
function HOOK_preprocess(&$variables) {
// Inject the current language into every template to ease theme development.
$variables['current_language'] = \Drupal::languageManager()->getCurrentLanguage();
// Inject a usable directory path.
$variables['theme_path'] = base_path() . $variables['directory'];
}
_
ブランドブロックまたはページテンプレートでこれらを使用して、言語固有のロゴへのパスを設定できます。例:
_<img src="{{ theme_path ~ '/logo-' ~ current_language.getID() ~ '.svg' }}" alt="{{ 'Home'|t }}" />
_
したがって、テーマルートに英語の場合はlogo-en.svg、スウェーデン語の場合はlogo-sv.svgなどがあり、getID()
は2文字の言語コードを返します。
さらに進んで、使用しているテンプレート(ページまたはブランディングブロックのいずれか)についてのみ、前処理ですべてをビルドできます。
プログラミングをまったく必要としない、私たちの怠惰な人のためのより簡単なハックを見つけました-block--system-branding-block.html.twig
に以下を追加してください:
<img src= "{{ path('<front>') ~ 'logo.png' }}" alt="{{ 'Home'|t }}" />
これにより、サイトのデフォルト言語(通常は英語)の場合はlogo.png、ロシア語の場合はrulogo.pngが検索されます。
function MYTHEME_preprocess_block(&$variables) {
$language = \Drupal::languageManager()->getCurrentLanguage()->getId();
$variables['language'] = $language;
switch ($variables['base_plugin_id']) {
case 'system_branding_block':
if ($variables['content']['site_logo']['#access'] && $variables['content']['site_logo']['#uri'] && $variables['language']=='fr') {
$variables['site_logo'] = str_replace('.svg', '-fr.svg', $variables['content']['site_logo']['#uri']);
}
break;
}
}
ジェフ・バーンズのアイデアが好きです。より「堅牢な」ソリューションが必要な場合は、独自のカスタムブロックタイプ(ハードコード)を作成し、そこにロジックを配置することで、何らかの理由で新しい言語のロゴが利用できない場合に、フォールバックが発生する可能性があります。
2番目の理由は、プレゼンテーションレイヤーにあらゆる種類のロジックを挿入するのが好きではないことです。