web-dev-qa-db-fra.com

Comment obtenir une valeur de champ referencedEntity dans la langue du nœud actuel

J'essaie d'obtenir le contenu d'un nœud dans un bloc.

J'ai réussi à obtenir les champs que je voulais, mais ils sont toujours retournés dans la langue par défaut de mon site au lieu des traductions actuelles (ex./Node/1 et/fr/node/1 renvoie le même contenu anglais au lieu de la traduction)

Cela fonctionne bien pour les champs simples, mais ne peut pas le faire fonctionner pour les entités référencées:

Je suis dans une fonction Block build ():

$node = \Drupal::routeMatch()->getParameter('node');

// Simple text field : Correct value depending on language
$correctValue = $node->field_test_text->getValue(); 

// Paragraphs/referencedEntities
$paras = $node->get('field_paragraphes')->referencedEntities();
foreach ($paras as $para) {
   // Not translated, always in default language ?
   $badValue = $para->get('field_test_in_para')->getValue();
}

Merci beaucoup.

3
Flunch

Le code de votre problème (vous devez utiliser getTranslation pour obtenir une traduction et hasTranslation pour vérifier s'il s'agit bien d'une traduction ou non):

$lang_code = \Drupal::service('language_manager')->getCurrentLanguage()->getId();
$node = \Drupal::routeMatch()->getParameter('node');

// Paragraphs/referencedEntities
$paras = $node->get('field_paragraphes')->referencedEntities();
foreach ($paras as $para) {
  // Remember to check if translation exists
  if ($para->hasTranslation($lang_code)) {
    $para = $para->getTranslation($lang_code);
  }
   $goodValue = $para->get('field_test_in_para')->getValue();
}

Même si ce code fonctionnera et résoudra votre problème, vous pourriez vous demander si vous faites les choses correctement. La plupart du temps, lorsque vous faites les choses correctement, vous n'aurez pas besoin de gérer les traductions. De nombreux modules/systèmes le font automatiquement lors du rendu de trucs ou de l'utilisation de modules comme des vues. La plupart du temps, lorsque vous devez gérer vous-même les traductions, il existe un moyen plus simple de le faire.

10
googletorp

Vous pouvez essayer de forcer l'utilisation de la langue actuelle:

$langcode = $this->languageManager->getCurrentLanguage()->getId();
$value = $para->getTranslation($langcode)->field_test_in_para->value;

Ou essayez d'utiliser la langue du nœud:

$node_language = $node->language()->getId();
$value = $para->getTranslation($node_language)->field_test_in_para->value;
5
4k4