reverted: --- b/core/modules/views/src/Entity/Render/ConfigurableLanguageRenderer.php +++ a/core/modules/views/src/Entity/Render/ConfigurableLanguageRenderer.php @@ -39,7 +39,7 @@ /** * {@inheritdoc} */ + public function getLangcode(ResultRow $row) { - public function getLangcode(ResultRow $row, $relationship = 'none') { return $this->langcode; } reverted: --- b/core/modules/views/src/Entity/Render/DefaultLanguageRenderer.php +++ a/core/modules/views/src/Entity/Render/DefaultLanguageRenderer.php @@ -2,9 +2,18 @@ namespace Drupal\views\Entity\Render; +use Drupal\views\ResultRow; + /** * Renders entities in their default language. */ class DefaultLanguageRenderer extends EntityTranslationRendererBase { + /** + * {@inheritdoc} + */ + public function getLangcode(ResultRow $row) { + return $row->_entity->getUntranslated()->language()->getId(); + } + } diff -u b/core/modules/views/src/Entity/Render/EntityTranslationRenderTrait.php b/core/modules/views/src/Entity/Render/EntityTranslationRenderTrait.php --- b/core/modules/views/src/Entity/Render/EntityTranslationRenderTrait.php +++ b/core/modules/views/src/Entity/Render/EntityTranslationRenderTrait.php @@ -75,7 +75,7 @@ // picked. $translation = $entity; if ($entity instanceof TranslatableInterface && count($entity->getTranslationLanguages()) > 1) { - $langcode = $this->getEntityTranslationRenderer()->getLangcode($row, $relationship); + $langcode = $this->getEntityTranslationRenderer()->getLangcodeByRelationship($row, $relationship); $translation = $this->getEntityManager()->getTranslationFromContext($entity, $langcode); } return $translation; diff -u b/core/modules/views/src/Entity/Render/EntityTranslationRendererBase.php b/core/modules/views/src/Entity/Render/EntityTranslationRendererBase.php --- b/core/modules/views/src/Entity/Render/EntityTranslationRendererBase.php +++ b/core/modules/views/src/Entity/Render/EntityTranslationRendererBase.php @@ -15,13 +15,24 @@ * * @param \Drupal\views\ResultRow $row * The result row. + * + * @return string + * A language code. + */ + abstract public function getLangcode(ResultRow $row); + + /** + * Returns the language code for the given row based on the relationship. + * + * @param \Drupal\views\ResultRow $row + * The result row. * @param string $relationship * The relationship to be used, or 'none' by default. * * @return string * A language code. */ - public function getLangcode(ResultRow $row, $relationship = 'none') { + public function getLangcodeByRelationship(ResultRow $row, $relationship = 'none') { if ($entity = $this->getEntity($row, $relationship)) { return $entity->getUntranslated()->language()->getId(); } @@ -34,25 +45,49 @@ } /** - * Runs before each entity is rendered. + * {@inheritdoc} + */ + public function preRender(array $result) { + $view_builder = $this->view->rowPlugin->entityManager->getViewBuilder($this->entityType->id()); + + /** @var \Drupal\views\ResultRow $row */ + foreach ($result as $row) { + // @todo Take relationships into account. + // See https://www.drupal.org/node/2457999. + $entity = $row->_entity; + $entity->view = $this->view; + $this->build[$entity->id()] = $view_builder->view($entity, $this->view->rowPlugin->options['view_mode'], $this->getLangcode($row)); + } + } + + /** + * Runs before each entity is rendered if a relationship is needed. * * @param \Drupal\views\ResultRow[] $result * The full array of results from the query. * @param string $relationship * The relationship to be used, or 'none' by default. */ - public function preRender(array $result, $relationship = 'none') { + public function preRenderByRelationship(array $result, $relationship = 'none') { $view_builder = $this->view->rowPlugin->entityManager->getViewBuilder($this->entityType->id()); foreach ($result as $row) { if ($entity = $this->getEntity($row, $relationship)) { $entity->view = $this->view; - $this->build[$entity->id()] = $view_builder->view($entity, $this->view->rowPlugin->options['view_mode'], $this->getLangcode($row, $relationship)); + $this->build[$entity->id()] = $view_builder->view($entity, $this->view->rowPlugin->options['view_mode'], $this->getLangcodeByRelationship($row, $relationship)); } } } /** + * {@inheritdoc} + */ + public function render(ResultRow $row) { + $entity_id = $row->_entity->id(); + return $this->build[$entity_id]; + } + + /** * Renders entity data. * * @param \Drupal\views\ResultRow $row @@ -63,7 +98,7 @@ * @return array * A renderable array for the entity data contained in the result row. */ - public function render(ResultRow $row, $relationship = 'none') { + public function renderByRelationship(ResultRow $row, $relationship = 'none') { if ($entity = $this->getEntity($row, $relationship)) { $entity_id = $entity->id(); return $this->build[$entity_id]; @@ -71,7 +106,7 @@ } /** - * Gets the entity assosiated with a row. + * Gets the entity associated with a row. * * @param \Drupal\views\ResultRow $row * The result row. diff -u b/core/modules/views/src/Entity/Render/TranslationLanguageRenderer.php b/core/modules/views/src/Entity/Render/TranslationLanguageRenderer.php --- b/core/modules/views/src/Entity/Render/TranslationLanguageRenderer.php +++ b/core/modules/views/src/Entity/Render/TranslationLanguageRenderer.php @@ -40,14 +40,29 @@ /** * {@inheritdoc} */ - public function preRender(array $result, $relationship = 'none') { + public function preRender(array $result) { + $view_builder = $this->view->rowPlugin->entityManager->getViewBuilder($this->entityType->id()); + + /** @var \Drupal\views\ResultRow $row */ + foreach ($result as $row) { + $entity = $row->_entity; + $entity->view = $this->view; + $langcode = $this->getLangcode($row); + $this->build[$entity->id()][$langcode] = $view_builder->view($entity, $this->view->rowPlugin->options['view_mode'], $this->getLangcode($row)); + } + } + + /** + * {@inheritdoc} + */ + public function preRenderByRelationship(array $result, $relationship = 'none') { $view_builder = $this->view->rowPlugin->entityManager->getViewBuilder($this->entityType->id()); /** @var \Drupal\views\ResultRow $row */ foreach ($result as $row) { if ($entity = $this->getEntity($row, $relationship)) { $entity->view = $this->view; - $langcode = $this->getLangcode($row, $relationship); + $langcode = $this->getLangcodeByRelationship($row, $relationship); $this->build[$entity->id()][$langcode] = $view_builder->view($entity, $this->view->rowPlugin->options['view_mode'], $langcode); } } @@ -56,10 +71,19 @@ /** * {@inheritdoc} */ - public function render(ResultRow $row, $relationship = 'none') { + public function render(ResultRow $row) { + $entity_id = $row->_entity->id(); + $langcode = $this->getLangcode($row); + return $this->build[$entity_id][$langcode]; + } + + /** + * {@inheritdoc} + */ + public function renderByRelationship(ResultRow $row, $relationship = 'none') { if ($entity = $this->getEntity($row, $relationship)) { $entity_id = $entity->id(); - $langcode = $this->getLangcode($row, $relationship); + $langcode = $this->getLangcodeByRelationship($row, $relationship); return $this->build[$entity_id][$langcode]; } } @@ -67,7 +91,7 @@ /** * {@inheritdoc} */ - public function getLangcode(ResultRow $row, $relationship = 'none') { + public function getLangcode(ResultRow $row) { return isset($row->{$this->langcodeAlias}) ? $row->{$this->langcodeAlias} : $this->languageManager->getDefaultLanguage()->getId(); } diff -u b/core/modules/views/src/Plugin/views/row/EntityRow.php b/core/modules/views/src/Plugin/views/row/EntityRow.php --- b/core/modules/views/src/Plugin/views/row/EntityRow.php +++ b/core/modules/views/src/Plugin/views/row/EntityRow.php @@ -181,7 +181,7 @@ public function preRender($result) { parent::preRender($result); if ($result) { - $this->getEntityTranslationRenderer()->preRender($result, isset($this->options['relationship']) ? $this->options['relationship'] : 'none'); + $this->getEntityTranslationRenderer()->preRenderByRelationship($result, isset($this->options['relationship']) ? $this->options['relationship'] : 'none'); } } @@ -189,7 +189,7 @@ * {@inheritdoc} */ public function render($row) { - return $this->getEntityTranslationRenderer()->render($row, isset($this->options['relationship']) ? $this->options['relationship'] : 'none'); + return $this->getEntityTranslationRenderer()->renderByRelationship($row, isset($this->options['relationship']) ? $this->options['relationship'] : 'none'); } /**