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..74a831b
--- /dev/null
+++ b/src/Plugin/views/EntityTranslationRenderer.php
@@ -0,0 +1,28 @@
+<?php
+
+namespace Drupal\search_api\Plugin\views;
+
+use Drupal\Core\Language\LanguageInterface;
+use Drupal\views\Entity\Render\TranslationLanguageRenderer;
+use Drupal\views\ResultRow;
+
+/**
+ * Renders entity translations in their row language.
+ */
+class EntityTranslationRenderer extends TranslationLanguageRenderer {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getLangcode(ResultRow $row) {
+    if (!empty($row->search_api_language)) {
+      return $row->search_api_language;
+    }
+    // If our normal query plugin is used, this shouldn't really ever happen,
+    // but if it does we fall back to the current request's content language.
+    return $this->languageManager
+      ->getCurrentLanguage(LanguageInterface::TYPE_CONTENT)
+      ->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 146a005..94f7e2a 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 af60abf..7122b59 100644
--- a/src/Tests/ViewsTest.php
+++ b/src/Tests/ViewsTest.php
@@ -5,6 +5,8 @@
 use Drupal\Component\Utility\Html;
 use Drupal\Core\StringTranslation\StringTranslationTrait;
 use Drupal\Core\Url;
+use Drupal\entity_test\Entity\EntityTestMulRevChanged;
+use Drupal\language\Entity\ConfigurableLanguage;
 use Drupal\search_api\Entity\Index;
 use Drupal\simpletest\WebTestBase as SimpletestWebTestBase;
 use Symfony\Component\DependencyInjection\ContainerInterface;
@@ -25,7 +27,11 @@ class ViewsTest extends SimpletestWebTestBase {
    *
    * @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.
@@ -40,6 +46,9 @@ class ViewsTest extends SimpletestWebTestBase {
   public function setUp() {
     parent::setUp();
 
+    // Add a second language.
+    ConfigurableLanguage::createFromLangcode('nl')->save();
+
     \Drupal::getContainer()
       ->get('search_api.index_task_manager')
       ->addItemsAll(Index::load($this->indexId));
@@ -197,7 +206,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(
@@ -295,6 +304,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.
@@ -431,18 +453,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:
