diff --git a/core/lib/Drupal/Core/Entity/EntityViewBuilder.php b/core/lib/Drupal/Core/Entity/EntityViewBuilder.php index da1a43bc16..46fb468a74 100644 --- a/core/lib/Drupal/Core/Entity/EntityViewBuilder.php +++ b/core/lib/Drupal/Core/Entity/EntityViewBuilder.php @@ -5,6 +5,7 @@ use Drupal\Component\Utility\Crypt; use Drupal\Core\Cache\Cache; use Drupal\Core\Entity\Display\EntityViewDisplayInterface; +use Drupal\Core\Entity\EntityRepositoryInterface; use Drupal\Core\Entity\Entity\EntityViewDisplay; use Drupal\Core\Field\FieldItemInterface; use Drupal\Core\Field\FieldItemListInterface; @@ -42,6 +43,13 @@ class EntityViewBuilder extends EntityHandlerBase implements EntityHandlerInterf */ protected $entityManager; + /** + * The entity repository service. + * + * @var \Drupal\Core\Entity\EntityRepositoryInterface + */ + protected $entityRepository; + /** * The cache bin used to store the render cache. * @@ -83,13 +91,16 @@ class EntityViewBuilder extends EntityHandlerBase implements EntityHandlerInterf * The language manager. * @param \Drupal\Core\Theme\Registry $theme_registry * The theme registry. + * @param \Drupal\Core\Entity\EntityRepositoryInterface $entity_repository + * The entity repository. */ - public function __construct(EntityTypeInterface $entity_type, EntityManagerInterface $entity_manager, LanguageManagerInterface $language_manager, Registry $theme_registry = NULL) { + public function __construct(EntityTypeInterface $entity_type, EntityManagerInterface $entity_manager, LanguageManagerInterface $language_manager, Registry $theme_registry = NULL, $entity_repository = NULL) { $this->entityTypeId = $entity_type->id(); $this->entityType = $entity_type; $this->entityManager = $entity_manager; $this->languageManager = $language_manager; $this->themeRegistry = $theme_registry ?: \Drupal::service('theme.registry'); + $this->entityRepository = $entity_repository ?: \Drupal::service('entity.repository'); } /** @@ -100,7 +111,8 @@ public static function createInstance(ContainerInterface $container, EntityTypeI $entity_type, $container->get('entity.manager'), $container->get('language_manager'), - $container->get('theme.registry') + $container->get('theme.registry'), + $container->get('entity.repository') ); } @@ -427,7 +439,18 @@ protected function isViewModeCacheable($view_mode) { */ public function viewField(FieldItemListInterface $items, $display_options = []) { $entity = $items->getEntity(); - $field_name = $items->getFieldDefinition()->getName(); + $field_definition = $items->getFieldDefinition(); + + // Even when fields are set to not translatable, they still need to know + // which is the language of the current entity being rendered. + // This allow to render, for example, referenced entities in the same + // language than the current entity. + if (!$field_definition->isTranslatable() && + $entity instanceof TranslatableInterface && + $entity->isTranslatable()) { + $entity = $this->entityRepository->getTranslationFromContext($entity); + } + $field_name = $field_definition->getName(); $display = $this->getSingleFieldDisplay($entity, $field_name, $display_options); $output = [];