web-dev-qa-db-ja.com

言語依存のロゴ

Drupal 8でカスタムロゴ画像を使用するにはどうすればよいですか?コンテンツと言語の翻訳構成ページに適切な設定がないようです。

3
Tony Patrinos

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文字の言語コードを返します。

さらに進んで、使用しているテンプレート(ページまたはブランディングブロックのいずれか)についてのみ、前処理ですべてをビルドできます。

5
Jeff Burnz

プログラミングをまったく必要としない、私たちの怠惰な人のためのより簡単なハックを見つけました-block--system-branding-block.html.twigに以下を追加してください:

<img src= "{{ path('<front>') ~ 'logo.png' }}" alt="{{ 'Home'|t }}" />

これにより、サイトのデフォルト言語(通常は英語)の場合はlogo.png、ロシア語の場合はrulogo.pngが検索されます。

1
Marassa
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;
  }
}
1

ジェフ・バーンズのアイデアが好きです。より「堅牢な」ソリューションが必要な場合は、独自のカスタムブロックタイプ(ハードコード)を作成し、そこにロジックを配置することで、何らかの理由で新しい言語のロゴが利用できない場合に、フォールバックが発生する可能性があります。

2番目の理由は、プレゼンテーションレイヤーにあらゆる種類のロジックを挿入するのが好きではないことです。

1
ssibal