web-dev-qa-db-ja.com

テンプレートで現在の言語を取得する

Drupal 7では、現在の言語は私たちがアクセスできるグローバル変数です

global $language;
$langcode = $language->language; 

Twig file in Drupal 8(in page--front.html.twig 例えば)?

7
Yusef

私は自分の答えを見つけてここに投稿したので、後で他の人を助けるかもしれません。

まず、_MYTHEME.theme_で:

In Drupal 8.2言語が template_preprocess_page の変数をページングするために追加されました。しかし、現在のバージョン8.1では存在しませんでした。私はそれを追加しました:

_function MYTHEME_preprocess_page(&$vars) {

  $language = \Drupal::languageManager()->getCurrentLanguage()->getId();
  $vars['language'] = $language;
}
_

次に、Twigファイルで_{{ language }}_を使用します。また、{{ language.getName() }}を使用して言語名を取得できます。

更新

Drupal 8.2以降、グローバル変数languageが存在するため、最初に追加する必要はありません。

_{% if language.getId() == 'en' %}
  Do something
{% else %}
  Do something else
{% endif %}
_

更新コメントをありがとう@Lucas

on Drupal>8.7.5

_{% if language.getId() == 'en' %} should be {% if language == 'en' %} 
_
17
Yusef

Drupalバージョン8.2.3では、language変数はすでにTwigテンプレートで使用できます。使用例は次のとおりです。

{% if language.getId() == 'en' %}
  Do something
{% else %}
  Do something else
{% endif %}
12

{{ language }}は機能しますが、pageコンテキストでのみです。

この質問の例(page--front.html.twig)はたまたま機能します。

Xdebugで8.7.6を試しました。 page.html.twig以外の場所から呼び出されると、{Drupal\Core\Language\Language}ではなくnullを返します。

それが機能していると報告している人もいれば、そうでない人もいると思います。 node.html.twigなどの下で使用できます。この場合でも、テーマのpreprocess()関数でそれを提供する必要があります。

7
hehongbo

Page.html.twigとDrupal 8.7.6では、以下を使用する必要がありました。

{% if language.id == 'en' %}または{{ language.id == 'en' ? 'active' : 'not-active' }}

他の提案は機能しませんでした。

3
Taikahessu