diff --git a/core/lib/Drupal/Core/Entity/EntityViewBuilder.php b/core/lib/Drupal/Core/Entity/EntityViewBuilder.php index bcfb7ef..cc0deaf 100644 --- a/core/lib/Drupal/Core/Entity/EntityViewBuilder.php +++ b/core/lib/Drupal/Core/Entity/EntityViewBuilder.php @@ -12,10 +12,9 @@ use Drupal\Core\Entity\Entity\EntityViewDisplay; use Drupal\Core\Field\FieldItemInterface; use Drupal\Core\Field\FieldItemListInterface; -use Drupal\Core\Language\LanguageInterface; use Drupal\Core\Language\LanguageManagerInterface; -use Drupal\Core\TypedData\TranslatableInterface; use Drupal\Core\Render\Element; +use Drupal\Core\TypedData\TranslatableInterface; use Symfony\Component\DependencyInjection\ContainerInterface; /** @@ -100,8 +99,8 @@ public static function createInstance(ContainerInterface $container, EntityTypeI /** * {@inheritdoc} */ - public function view(EntityInterface $entity, $view_mode = 'full') { - $build_list = $this->viewMultiple(array($entity), $view_mode); + public function view(EntityInterface $entity, $view_mode = 'full', $langcode = NULL) { + $build_list = $this->viewMultiple(array($entity), $view_mode, $langcode); // The default ::buildMultiple() #pre_render callback won't run, because we // extract a child element of the default renderable array. Thus we must @@ -116,7 +115,7 @@ public function view(EntityInterface $entity, $view_mode = 'full') { /** * {@inheritdoc} */ - public function viewMultiple(array $entities = array(), $view_mode = 'full') { + public function viewMultiple(array $entities = array(), $view_mode = 'full', $langcode = NULL) { $build_list = array( '#sorted' => TRUE, '#pre_render' => array(array($this, 'buildMultiple')), @@ -125,7 +124,7 @@ public function viewMultiple(array $entities = array(), $view_mode = 'full') { foreach ($entities as $key => $entity) { // Ensure that from now on we are dealing with the proper translation // object. - $entity = $this->entityManager->getTranslationFromContext($entity); + $entity = $this->entityManager->getTranslationFromContext($entity, $langcode); // Set build defaults. $build_list[$key] = $this->getBuildDefaults($entity, $view_mode); diff --git a/core/lib/Drupal/Core/Entity/EntityViewBuilderInterface.php b/core/lib/Drupal/Core/Entity/EntityViewBuilderInterface.php index 87df69f..eff6516 100644 --- a/core/lib/Drupal/Core/Entity/EntityViewBuilderInterface.php +++ b/core/lib/Drupal/Core/Entity/EntityViewBuilderInterface.php @@ -39,6 +39,9 @@ public function buildComponents(array &$build, array $entities, array $displays, * The entity to render. * @param string $view_mode * (optional) The view mode that should be used to render the entity. + * @param string $langcode + * (optional) For which language the entity should be rendered, defaults to + * the current content language. * * @return array * A render array for the entity. @@ -49,7 +52,7 @@ public function buildComponents(array &$build, array $entities, array $displays, * comment belongs to, or not passing one, and having the comment node not * be available for loading. */ - public function view(EntityInterface $entity, $view_mode = 'full'); + public function view(EntityInterface $entity, $view_mode = 'full', $langcode = NULL); /** * Builds the render array for the provided entities. @@ -58,6 +61,9 @@ public function view(EntityInterface $entity, $view_mode = 'full'); * An array of entities implementing EntityInterface to view. * @param string $view_mode * (optional) The view mode that should be used to render the entity. + * @param string $langcode + * (optional) For which language the entity should be rendered, defaults to + * the current content language. * * @return * A render array for the entities, indexed by the same keys as the @@ -69,7 +75,7 @@ public function view(EntityInterface $entity, $view_mode = 'full'); * comments belongs to, or not passing one, and having the comments node not * be available for loading. */ - public function viewMultiple(array $entities = array(), $view_mode = 'full'); + public function viewMultiple(array $entities = array(), $view_mode = 'full', $langcode = NULL); /** * Resets the entity render cache. diff --git a/core/lib/Drupal/Core/Entity/entity.api.php b/core/lib/Drupal/Core/Entity/entity.api.php index 7f20831..37fcdff 100644 --- a/core/lib/Drupal/Core/Entity/entity.api.php +++ b/core/lib/Drupal/Core/Entity/entity.api.php @@ -468,8 +468,10 @@ * @endcode * Then, to build and render the entity: * @code - * // The current translation language is used. - * $build = $view_builder->view($entity, 'view_mode_name'); + * // You can omit the language ID, by default the current content language will + * // be used. If no translation is available for the current language, fallback + * // rules will be used. + * $build = $view_builder->view($entity, 'view_mode_name', $language->getId()); * // $build is a render array. * $rendered = drupal_render($build); * @endcode @@ -502,6 +504,7 @@ * * @see i18n * @see entity_crud + * @see \Drupal\Core\Entity\EntityManagerInterface::getTranslationFromContext() * @} */ diff --git a/core/lib/Drupal/Core/Field/Plugin/Field/FieldFormatter/EntityReferenceEntityFormatter.php b/core/lib/Drupal/Core/Field/Plugin/Field/FieldFormatter/EntityReferenceEntityFormatter.php index 741f3ef..b98fc45 100644 --- a/core/lib/Drupal/Core/Field/Plugin/Field/FieldFormatter/EntityReferenceEntityFormatter.php +++ b/core/lib/Drupal/Core/Field/Plugin/Field/FieldFormatter/EntityReferenceEntityFormatter.php @@ -134,7 +134,7 @@ public function viewElements(FieldItemListInterface $items, $langcode) { } if ($entity->id()) { - $elements[$delta] = entity_view($entity, $view_mode); + $elements[$delta] = entity_view($entity, $view_mode, $entity->language()->getId()); // Add a resource attribute to set the mapping property's value to the // entity's url. Since we don't know what the markup of the entity will diff --git a/core/modules/aggregator/src/FeedViewBuilder.php b/core/modules/aggregator/src/FeedViewBuilder.php index a990b41..11b78ab 100644 --- a/core/modules/aggregator/src/FeedViewBuilder.php +++ b/core/modules/aggregator/src/FeedViewBuilder.php @@ -69,7 +69,7 @@ public function buildComponents(array &$build, array $entities, array $displays, $build[$id]['items'] = $this->entityManager ->getViewBuilder('aggregator_item') - ->viewMultiple($items, $view_mode); + ->viewMultiple($items, $view_mode, $entity->language()->getId()); if ($view_mode == 'full') { // Also add the pager. diff --git a/core/modules/block/src/BlockViewBuilder.php b/core/modules/block/src/BlockViewBuilder.php index 3baee2f..b05cf23 100644 --- a/core/modules/block/src/BlockViewBuilder.php +++ b/core/modules/block/src/BlockViewBuilder.php @@ -71,15 +71,15 @@ public function buildComponents(array &$build, array $entities, array $displays, /** * {@inheritdoc} */ - public function view(EntityInterface $entity, $view_mode = 'full') { - $build = $this->viewMultiple(array($entity), $view_mode); + public function view(EntityInterface $entity, $view_mode = 'full', $langcode = NULL) { + $build = $this->viewMultiple(array($entity), $view_mode, $langcode); return reset($build); } /** * {@inheritdoc} */ - public function viewMultiple(array $entities = array(), $view_mode = 'full') { + public function viewMultiple(array $entities = array(), $view_mode = 'full', $langcode = NULL) { /** @var \Drupal\block\BlockInterface[] $entities */ $build = array(); foreach ($entities as $entity) { @@ -116,7 +116,7 @@ public function viewMultiple(array $entities = array(), $view_mode = 'full') { // Assign a #lazy_builder callback, which will generate a #pre_render- // able block lazily (when necessary). $build[$entity_id] += [ - '#lazy_builder' => [static::class . '::lazyBuilder', [$entity_id, $view_mode]], + '#lazy_builder' => [static::class . '::lazyBuilder', [$entity_id, $view_mode, $langcode]], ]; } } diff --git a/core/modules/block_content/src/BlockContentViewBuilder.php b/core/modules/block_content/src/BlockContentViewBuilder.php index 976756f..87b7aed 100644 --- a/core/modules/block_content/src/BlockContentViewBuilder.php +++ b/core/modules/block_content/src/BlockContentViewBuilder.php @@ -19,15 +19,15 @@ class BlockContentViewBuilder extends EntityViewBuilder { /** * {@inheritdoc} */ - public function view(EntityInterface $entity, $view_mode = 'full') { - return $this->viewMultiple(array($entity), $view_mode)[0]; + public function view(EntityInterface $entity, $view_mode = 'full', $langcode = NULL) { + return $this->viewMultiple(array($entity), $view_mode, $langcode)[0]; } /** * {@inheritdoc} */ - public function viewMultiple(array $entities = array(), $view_mode = 'full') { - $build_list = parent::viewMultiple($entities, $view_mode); + public function viewMultiple(array $entities = array(), $view_mode = 'full', $langcode = NULL) { + $build_list = parent::viewMultiple($entities, $view_mode, $langcode); // Apply the buildMultiple() #pre_render callback immediately, to make // bubbling of attributes and contextual links to the actual block work. // @see \Drupal\block\BlockViewBuilder::buildBlock() diff --git a/core/modules/comment/comment.module b/core/modules/comment/comment.module index d90b1fc..4fcb7de 100644 --- a/core/modules/comment/comment.module +++ b/core/modules/comment/comment.module @@ -264,7 +264,7 @@ function comment_node_view_alter(array &$build, EntityInterface $node, EntityVie * Use \Drupal::entityManager()->getViewBuilder('comment')->view(). */ function comment_view(CommentInterface $comment, $view_mode = 'full', $langcode = NULL) { - return entity_view($comment, $view_mode); + return entity_view($comment, $view_mode, $langcode); } /** diff --git a/core/modules/contact/src/MessageViewBuilder.php b/core/modules/contact/src/MessageViewBuilder.php index fcf99a0..66c6873 100644 --- a/core/modules/contact/src/MessageViewBuilder.php +++ b/core/modules/contact/src/MessageViewBuilder.php @@ -50,8 +50,8 @@ public function buildComponents(array &$build, array $entities, array $displays, /** * {@inheritdoc} */ - public function view(EntityInterface $entity, $view_mode = 'full') { - $build = parent::view($entity, $view_mode); + public function view(EntityInterface $entity, $view_mode = 'full', $langcode = NULL) { + $build = parent::view($entity, $view_mode, $langcode); if ($view_mode == 'mail') { // Convert field labels into headings. diff --git a/core/modules/node/node.module b/core/modules/node/node.module index c63c684..0eaab5d 100644 --- a/core/modules/node/node.module +++ b/core/modules/node/node.module @@ -781,7 +781,7 @@ function node_get_recent($number = 10) { * An array as expected by drupal_render(). */ function node_view(NodeInterface $node, $view_mode = 'full', $langcode = NULL) { - return entity_view($node, $view_mode); + return entity_view($node, $view_mode, $langcode); } /** diff --git a/core/modules/node/src/Plugin/Search/NodeSearch.php b/core/modules/node/src/Plugin/Search/NodeSearch.php index 24c7f34..0c2c55e 100644 --- a/core/modules/node/src/Plugin/Search/NodeSearch.php +++ b/core/modules/node/src/Plugin/Search/NodeSearch.php @@ -326,7 +326,7 @@ protected function prepareResults(StatementInterface $found) { // Render the node. /** @var \Drupal\node\NodeInterface $node */ $node = $node_storage->load($item->sid)->getTranslation($item->langcode); - $build = $node_render->view($node, 'search_result'); + $build = $node_render->view($node, 'search_result', $item->langcode); /** @var \Drupal\node\NodeTypeInterface $type*/ $type = $this->entityManager->getStorage('node_type')->load($node->bundle()); @@ -454,7 +454,7 @@ protected function indexNode(NodeInterface $node) { foreach ($languages as $language) { $node = $node->getTranslation($language->getId()); // Render the node. - $build = $node_render->view($node, 'search_index'); + $build = $node_render->view($node, 'search_index', $language->getId()); unset($build['#theme']); diff --git a/core/modules/system/tests/modules/entity_test/src/EntityTestViewBuilderOverriddenView.php b/core/modules/system/tests/modules/entity_test/src/EntityTestViewBuilderOverriddenView.php index a712c47..8d44386 100644 --- a/core/modules/system/tests/modules/entity_test/src/EntityTestViewBuilderOverriddenView.php +++ b/core/modules/system/tests/modules/entity_test/src/EntityTestViewBuilderOverriddenView.php @@ -17,7 +17,7 @@ class EntityTestViewBuilderOverriddenView extends EntityTestViewBuilder { /** * {@inheritdoc} */ - public function view(EntityInterface $entity, $view_mode = 'full') { + public function view(EntityInterface $entity, $view_mode = 'full', $langcode = NULL) { $build = []; $build[$entity->id()]['#plain_text'] = $entity->label(); return $build; @@ -26,10 +26,10 @@ public function view(EntityInterface $entity, $view_mode = 'full') { /** * {@inheritdoc} */ - public function viewMultiple(array $entities = [], $view_mode = 'full') { + public function viewMultiple(array $entities = [], $view_mode = 'full', $langcode = NULL) { $build = []; foreach ($entities as $key => $entity) { - $build[$key] = $this->view($entity, $view_mode); + $build[$key] = $this->view($entity, $view_mode, $langcode); } return $build; } diff --git a/core/modules/taxonomy/taxonomy.module b/core/modules/taxonomy/taxonomy.module index 1af7a91..daae443 100644 --- a/core/modules/taxonomy/taxonomy.module +++ b/core/modules/taxonomy/taxonomy.module @@ -188,7 +188,7 @@ function taxonomy_check_vocabulary_hierarchy(VocabularyInterface $vocabulary, $c * A $page element suitable for use by drupal_render(). */ function taxonomy_term_view(Term $term, $view_mode = 'full', $langcode = NULL) { - return entity_view($term, $view_mode); + return entity_view($term, $view_mode, $langcode); } /** diff --git a/core/modules/tour/src/TourViewBuilder.php b/core/modules/tour/src/TourViewBuilder.php index ca2936d..caccf15 100644 --- a/core/modules/tour/src/TourViewBuilder.php +++ b/core/modules/tour/src/TourViewBuilder.php @@ -19,7 +19,7 @@ class TourViewBuilder extends EntityViewBuilder { /** * {@inheritdoc} */ - public function viewMultiple(array $entities = array(), $view_mode = 'full') { + public function viewMultiple(array $entities = array(), $view_mode = 'full', $langcode = NULL) { /** @var \Drupal\tour\TourInterface[] $entities */ $build = array(); foreach ($entities as $entity_id => $entity) { diff --git a/core/modules/user/user.module b/core/modules/user/user.module index 28335a7..7782954 100644 --- a/core/modules/user/user.module +++ b/core/modules/user/user.module @@ -882,7 +882,7 @@ function user_delete_multiple(array $uids) { * An array as expected by drupal_render(). */ function user_view($account, $view_mode = 'full', $langcode = NULL) { - return entity_view($account, $view_mode); + return entity_view($account, $view_mode, $langcode); } /**