diff --git a/src/Plugin/views/EntityFieldRenderer.php b/src/Plugin/views/EntityFieldRenderer.php
index c90fcaa..b47eb95 100644
--- a/src/Plugin/views/EntityFieldRenderer.php
+++ b/src/Plugin/views/EntityFieldRenderer.php
@@ -74,6 +74,18 @@ public function compatibleWithField(FieldHandlerInterface $field) {
   /**
    * {@inheritdoc}
    */
+  protected function getEntityTranslationRenderer() {
+    if (!isset($this->entityTranslationRenderer)) {
+      $entity_type = $this->getEntityManager()
+        ->getDefinition($this->getEntityTypeId());
+      $this->entityTranslationRenderer = new EntityTranslationRenderer($this->view, $this->getLanguageManager(), $entity_type);
+    }
+    return $this->entityTranslationRenderer;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   protected function getRenderableFieldIds() {
     $field_ids = [];
     foreach ($this->view->field as $field_id => $field) {
diff --git a/src/Plugin/views/EntityTranslationRenderer.php b/src/Plugin/views/EntityTranslationRenderer.php
new file mode 100644
index 0000000..485ada9
--- /dev/null
+++ b/src/Plugin/views/EntityTranslationRenderer.php
@@ -0,0 +1,25 @@
+<?php
+
+namespace Drupal\search_api\Plugin\views;
+
+use Drupal\Core\Entity\EntityTypeInterface;
+use Drupal\Core\Language\LanguageManagerInterface;
+use Drupal\views\Entity\Render\TranslationLanguageRenderer;
+use Drupal\views\ResultRow;
+use Drupal\views\ViewExecutable;
+
+/**
+ * Renders entity translations in their row language.
+ */
+class EntityTranslationRenderer extends TranslationLanguageRenderer {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getLangcode(ResultRow $row) {
+    return isset($row->search_api_language)
+      ? $row->search_api_language
+      : $this->languageManager->getDefaultLanguage()->getId();
+  }
+
+}
diff --git a/src/Plugin/views/field/SearchApiEntity.php b/src/Plugin/views/field/SearchApiEntity.php
index 115892a..28142c0 100644
--- a/src/Plugin/views/field/SearchApiEntity.php
+++ b/src/Plugin/views/field/SearchApiEntity.php
@@ -5,6 +5,7 @@
 use Drupal\Core\Entity\EntityDisplayRepositoryInterface;
 use Drupal\Core\Entity\EntityInterface;
 use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\TypedData\TranslatableInterface;
 use Drupal\views\FieldAPIHandlerTrait;
 use Drupal\views\ResultRow;
 use Symfony\Component\DependencyInjection\ContainerInterface;
@@ -201,6 +202,10 @@ public function preRender(&$values) {
     foreach ($entities as $id => $entity) {
       foreach ($to_load[$id] as list($i, $j)) {
         if ($entity->access('view', $account)) {
+          $langcode = $values[$i]->search_api_language;
+          if ($entity instanceof TranslatableInterface && $entity->hasTranslation($langcode)) {
+            $entity = $entity->getTranslation($langcode);
+          }
           $values[$i]->{$property_path}[$j] = $entity;
         }
       }
diff --git a/src/Plugin/views/field/SearchApiFieldTrait.php b/src/Plugin/views/field/SearchApiFieldTrait.php
index 6b69730..5e35ec4 100644
--- a/src/Plugin/views/field/SearchApiFieldTrait.php
+++ b/src/Plugin/views/field/SearchApiFieldTrait.php
@@ -2,6 +2,7 @@
 
 namespace Drupal\search_api\Plugin\views\field;
 
+use Drupal\Core\Entity\ContentEntityInterface;
 use Drupal\Core\Entity\EntityInterface;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\TypedData\ComplexDataInterface;
@@ -370,6 +371,9 @@ public function preRender(&$values) {
                   if (!$value->access('view', $account)) {
                     continue;
                   }
+                  if ($value instanceof ContentEntityInterface && $value->hasTranslation($row->search_api_language)) {
+                    $typed_data = $value->getTranslation($row->search_api_language)->getTypedData();
+                  }
                 }
 
                 if ($typed_data instanceof ListInterface) {
diff --git a/src/Plugin/views/query/SearchApiQuery.php b/src/Plugin/views/query/SearchApiQuery.php
index e58b1b2..a4e3d9a 100644
--- a/src/Plugin/views/query/SearchApiQuery.php
+++ b/src/Plugin/views/query/SearchApiQuery.php
@@ -556,6 +556,9 @@ protected function addResults(array $results, ViewExecutable $view) {
       $values['search_api_datasource'] = $result->getDatasourceId();
       $values['search_api_relevance'] = $result->getScore();
       $values['search_api_excerpt'] = $result->getExcerpt() ?: '';
+      // @todo Temporary hack until language is a first-class property of our
+      //   items, like the others above. See #2641392.
+      list(, $values['search_api_language']) = Utility::splitPropertyPath($item_id, TRUE);
 
       // Gather any properties from the search results.
       foreach ($result->getFields(FALSE) as $field_id => $field) {
