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 151b70e..c0ed490 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;
@@ -204,7 +205,13 @@ public function preRender(&$values) {
       $operation = ($this->getDisplayMethod($bundle) == 'label') ? 'view label' : 'view';
       if ($entity->access($operation, $account)) {
         foreach ($to_load[$id] as list($i, $j)) {
-          $values[$i]->{$property_path}[$j] = $entity;
+          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 3397a9e..2761794 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/Tests/ViewsTest.php b/src/Tests/ViewsTest.php
index fae68b1..6d8b903 100644
--- a/src/Tests/ViewsTest.php
+++ b/src/Tests/ViewsTest.php
@@ -4,6 +4,8 @@
 
 use Drupal\Component\Utility\Html;
 use Drupal\Core\Url;
+use Drupal\entity_test\Entity\EntityTestMulRevChanged;
+use Drupal\language\Entity\ConfigurableLanguage;
 use Drupal\search_api\Entity\Index;
 use Drupal\search_api\Utility;
 
@@ -21,7 +23,7 @@ class ViewsTest extends WebTestBase {
    *
    * @var string[]
    */
-  public static $modules = array('search_api_test_views', 'views_ui');
+  public static $modules = array('search_api_test_views', 'views_ui', 'language');
 
   /**
    * A search index ID.
@@ -36,6 +38,9 @@ class ViewsTest extends WebTestBase {
   public function setUp() {
     parent::setUp();
 
+    // Add a second language.
+    ConfigurableLanguage::createFromLangcode('nl')->save();
+
     $this->setUpExampleStructure();
     \Drupal::getContainer()
       ->get('search_api.index_task_manager')
@@ -175,7 +180,7 @@ public function testView() {
     $this->checkResults($query, array(1, 2, 4, 5), 'Search with Keywords "not empty" filter');
 
     $query = array(
-      'language' => array('***LANGUAGE_language_content***'),
+      'language' => array('***LANGUAGE_site_default***'),
     );
     $this->checkResults($query, array(1, 2, 3, 4, 5), 'Search with "Page content language" filter');
     $query = array(
@@ -273,6 +278,19 @@ protected function checkResults(array $query, array $expected_results = NULL, $l
    * Test Views admin UI and field handlers.
    */
   public function testViewsAdmin() {
+    // Add some Dutch nodes.
+    foreach (array(1, 2, 3, 4, 5) as $id) {
+      $entity = EntityTestMulRevChanged::load($id);
+      $entity = $entity->addTranslation('nl', array(
+        'body' => "dutch node $id",
+        'category' => "dutch category $id",
+        'keywords' => array("dutch $id A", "dutch $id B"),
+      ));
+      $entity->save();
+    }
+    $this->entities = EntityTestMulRevChanged::loadMultiple();
+    $this->indexItems($this->indexId);
+
     // For viewing the user name and roles of the user associated with test
     // entities, the logged-in user needs to have the permission to administer
     // both users and permissions.
@@ -409,18 +427,28 @@ public function testViewsAdmin() {
           }
           $field_entity = $field_entity->{$direct_property}[0]->entity;
         }
-        if ($field != 'search_api_datasource') {
-          $data = Utility::extractFieldValues($field_entity->get($field));
-          if (!$data) {
-            $data = array('[EMPTY]');
-          }
+        // Check that both the English and the Dutch entity are present in the
+        // results, with their correct field values.
+        $entities = array($field_entity);
+        if ($field_entity->hasTranslation('nl')) {
+          $entities[] = $field_entity->getTranslation('nl');
         }
-        else {
-          $data = array('entity:entity_test_mulrev_changed');
+        foreach ($entities as $i => $field_entity) {
+          if ($field != 'search_api_datasource') {
+            $data = Utility::extractFieldValues($field_entity->get($field));
+            if (!$data) {
+              $data = array('[EMPTY]');
+            }
+          }
+          else {
+            $data = array('entity:entity_test_mulrev_changed');
+          }
+          $row_num = 2 * $id + $i - 1;
+          $prefix = "#$row_num [$field] ";
+          $text = $prefix . implode("|$prefix", $data);
+          $translated = $i ? ' [translated]' : '';
+          $this->assertText($text, "Correct value displayed for field $field on entity #$id (\"$text\")$translated");
         }
-        $prefix = "#$id [$field] ";
-        $text = $prefix . implode("|$prefix", $data);
-        $this->assertText($text, "Correct value displayed for field $field on entity #$id (\"$text\")");
       }
     }
   }
diff --git a/tests/search_api_test_example_content/config/install/field.storage.entity_test_mulrev_changed.body.yml b/tests/search_api_test_example_content/config/install/field.storage.entity_test_mulrev_changed.body.yml
index a03a334..80b2ed4 100644
--- a/tests/search_api_test_example_content/config/install/field.storage.entity_test_mulrev_changed.body.yml
+++ b/tests/search_api_test_example_content/config/install/field.storage.entity_test_mulrev_changed.body.yml
@@ -8,7 +8,7 @@ settings: {  }
 module: text
 locked: false
 cardinality: 1
-translatable: false
+translatable: true
 indexes: {  }
 dependencies:
   module:
diff --git a/tests/search_api_test_example_content/config/install/field.storage.entity_test_mulrev_changed.category.yml b/tests/search_api_test_example_content/config/install/field.storage.entity_test_mulrev_changed.category.yml
index 98e32df..aaf1b13 100644
--- a/tests/search_api_test_example_content/config/install/field.storage.entity_test_mulrev_changed.category.yml
+++ b/tests/search_api_test_example_content/config/install/field.storage.entity_test_mulrev_changed.category.yml
@@ -9,7 +9,7 @@ settings:
 module: Core
 locked: false
 cardinality: 1
-translatable: false
+translatable: true
 indexes: {  }
 dependencies:
   module:
diff --git a/tests/search_api_test_example_content/config/install/field.storage.entity_test_mulrev_changed.keywords.yml b/tests/search_api_test_example_content/config/install/field.storage.entity_test_mulrev_changed.keywords.yml
index ae0fdcf..0354534 100644
--- a/tests/search_api_test_example_content/config/install/field.storage.entity_test_mulrev_changed.keywords.yml
+++ b/tests/search_api_test_example_content/config/install/field.storage.entity_test_mulrev_changed.keywords.yml
@@ -9,7 +9,7 @@ settings:
 module: Core
 locked: false
 cardinality: -1
-translatable: false
+translatable: true
 indexes: {  }
 dependencies:
   module:
