diff --git a/jsonapi.services.yml b/jsonapi.services.yml
index f42e648..d1502bf 100644
--- a/jsonapi.services.yml
+++ b/jsonapi.services.yml
@@ -43,7 +43,7 @@ services:
       - { name: normalizer, priority: 21 }
   serializer.normalizer.jsonapi_document_toplevel.jsonapi:
     class: Drupal\jsonapi\Normalizer\JsonApiDocumentTopLevelNormalizer
-    arguments: ['@jsonapi.link_manager', '@jsonapi.current_context', '@entity_type.manager']
+    arguments: ['@jsonapi.link_manager', '@jsonapi.current_context', '@entity_type.manager', '@entity.repository']
     tags:
       - { name: normalizer, priority: 22 }
   serializer.normalizer.entity_reference_field.jsonapi:
diff --git a/src/Controller/EntityResource.php b/src/Controller/EntityResource.php
index 907171b..0d10fe3 100644
--- a/src/Controller/EntityResource.php
+++ b/src/Controller/EntityResource.php
@@ -9,6 +9,7 @@ use Drupal\Core\Config\Entity\ConfigEntityInterface;
 use Drupal\Core\Entity\ContentEntityInterface;
 use Drupal\Core\Entity\EntityFieldManagerInterface;
 use Drupal\Core\Entity\EntityInterface;
+use Drupal\Core\Entity\EntityRepositoryInterface;
 use Drupal\Core\Entity\EntityStorageInterface;
 use Drupal\Core\Entity\EntityTypeManagerInterface;
 use Drupal\Core\Entity\FieldableEntityInterface;
@@ -77,6 +78,13 @@ class EntityResource {
   protected $pluginManager;
 
   /**
+   * The entity repository.
+   *
+   * @var \Drupal\Core\Entity\EntityRepositoryInterface
+   */
+  protected $entityRepository;
+
+  /**
    * Instantiates a EntityResource object.
    *
    * @param \Drupal\jsonapi\ResourceType\ResourceType $resource_type
@@ -91,14 +99,17 @@ class EntityResource {
    *   The current context.
    * @param \Drupal\Core\Field\FieldTypePluginManagerInterface $plugin_manager
    *   The plugin manager for fields.
+   * @param \Drupal\Core\Entity\EntityRepositoryInterface $entity_repository
+   *   The entity repository.
    */
-  public function __construct(ResourceType $resource_type, EntityTypeManagerInterface $entity_type_manager, QueryBuilder $query_builder, EntityFieldManagerInterface $field_manager, CurrentContext $current_context, FieldTypePluginManagerInterface $plugin_manager) {
+  public function __construct(ResourceType $resource_type, EntityTypeManagerInterface $entity_type_manager, QueryBuilder $query_builder, EntityFieldManagerInterface $field_manager, CurrentContext $current_context, FieldTypePluginManagerInterface $plugin_manager, EntityRepositoryInterface $entity_repository) {
     $this->resourceType = $resource_type;
     $this->entityTypeManager = $entity_type_manager;
     $this->queryBuilder = $query_builder;
     $this->fieldManager = $field_manager;
     $this->currentContext = $current_context;
     $this->pluginManager = $plugin_manager;
+    $this->entityRepository = $entity_repository;
   }
 
   /**
@@ -698,7 +709,8 @@ class EntityResource {
   protected function loadEntitiesWithAccess(EntityStorageInterface $storage, $ids) {
     $output = [];
     foreach ($storage->loadMultiple($ids) as $entity) {
-      $output[$entity->id()] = static::getEntityAndAccess($entity);
+      $translated_entity = $this->entityRepository->getTranslationFromContext($entity, NULL, ['operation' => 'entity_upcast']);
+      $output[$entity->id()] = static::getEntityAndAccess($translated_entity);
     }
     return $output;
   }
diff --git a/src/Controller/RequestHandler.php b/src/Controller/RequestHandler.php
index c318b5a..7aec2b0 100644
--- a/src/Controller/RequestHandler.php
+++ b/src/Controller/RequestHandler.php
@@ -275,13 +275,16 @@ class RequestHandler implements ContainerAwareInterface, ContainerInjectionInter
     $field_manager = $this->container->get('entity_field.manager');
     /* @var \Drupal\Core\Field\FieldTypePluginManagerInterface $plugin_manager */
     $plugin_manager = $this->container->get('plugin.manager.field.field_type');
+    /** @var \Drupal\Core\Entity\EntityRepositoryInterface $entity_repository */
+    $entity_repository = $this->container->get('entity.repository');
     $resource = new EntityResource(
       $resource_type_repository->get($route->getRequirement('_entity_type'), $route->getRequirement('_bundle')),
       $entity_type_manager,
       $query_builder,
       $field_manager,
       $current_context,
-      $plugin_manager
+      $plugin_manager,
+      $entity_repository
     );
     return $resource;
   }
diff --git a/tests/src/Functional/JsonApiFunctionalTest.php b/tests/src/Functional/JsonApiFunctionalTest.php
index acfbf8d..8321f2e 100644
--- a/tests/src/Functional/JsonApiFunctionalTest.php
+++ b/tests/src/Functional/JsonApiFunctionalTest.php
@@ -10,6 +10,7 @@ use Drupal\field\Entity\FieldStorageConfig;
 use Drupal\field\Tests\EntityReference\EntityReferenceTestTrait;
 use Drupal\file\Entity\File;
 use Drupal\jsonapi\Routing\Param\OffsetPage;
+use Drupal\language\Entity\ConfigurableLanguage;
 use Drupal\taxonomy\Entity\Term;
 use Drupal\taxonomy\Entity\Vocabulary;
 use Drupal\Tests\BrowserTestBase;
@@ -414,6 +415,28 @@ class JsonApiFunctionalTest extends BrowserTestBase {
   }
 
   /**
+   * Tests reading multilingual content.
+   */
+  public function testReadMultilingual() {
+    $this->setupMultilingual();
+
+    $this->createDefaultContent(5, 5, TRUE, TRUE, TRUE);
+
+    // Test reading an individual entity.
+    $output = Json::decode($this->drupalGet('/jsonapi/node/article/' . $this->nodes[0]->uuid()));
+    $this->assertEquals($this->nodes[0]->getTitle(), $output['data']['attributes']['title']);
+
+    $output = Json::decode($this->drupalGet('/es/jsonapi/node/article/' . $this->nodes[0]->uuid()));
+    $this->assertEquals($this->nodes[0]->getTitle() . ' (es)', $output['data']['attributes']['title']);
+
+    // Test reading a collection of entities.
+
+    $output = Json::decode($this->drupalGet('/es/jsonapi/node/article'));
+    $this->assertEquals($this->nodes[0]->getTitle() . ' (es)', $output['data'][0]['attributes']['title']);
+  }
+
+
+  /**
    * Test POST, PATCH and DELETE.
    */
   public function testWrite() {
@@ -707,15 +730,23 @@ class JsonApiFunctionalTest extends BrowserTestBase {
    *   Set to TRUE if you want to add an image to the generated articles.
    * @param bool $article_has_link
    *   Set to TRUE if you want to add a link to the generated articles.
+   * @param bool $is_multilingual
+   *   (optional) Set to TRUE if you want to enable multilingual content.
    */
-  protected function createDefaultContent($num_articles, $num_tags, $article_has_image, $article_has_link) {
+  protected function createDefaultContent($num_articles, $num_tags, $article_has_image, $article_has_link, $is_multilingual = FALSE) {
     $random = $this->getRandomGenerator();
     for ($created_tags = 0; $created_tags < $num_tags; $created_tags++) {
       $term = Term::create([
         'vid' => 'tags',
         'name' => $random->name(),
       ]);
+
+      if ($is_multilingual) {
+        $term->addTranslation('es', ['name' => $term->getName() . ' (es)']);
+      }
+
       $term->save();
+
       $this->tags[] = $term;
     }
     for ($created_nodes = 0; $created_nodes < $num_articles; $created_nodes++) {
@@ -740,7 +771,7 @@ class JsonApiFunctionalTest extends BrowserTestBase {
         $file->setPermanent();
         $file->save();
         $this->files[] = $file;
-        $values['field_image'] = ['target_id' => $file->id()];
+        $values['field_image'] = ['target_id' => $file->id(), 'alt' => 'alt text'];
       }
       if ($article_has_link) {
         $values['field_link'] = [
@@ -753,7 +784,16 @@ class JsonApiFunctionalTest extends BrowserTestBase {
           ),
         ];
       }
-      $this->nodes[] = $this->createNode($values);
+      $node = $this->createNode($values);
+
+      if ($is_multilingual) {
+        $values['title'] = $node->getTitle() . ' (es)';
+        $values['field_image']['alt'] = 'alt text (es)';
+        $node->addTranslation('es', $values);
+      }
+      $node->save();
+
+      $this->nodes[] = $node;
     }
     if ($article_has_link) {
       // Make sure that there is at least 1 https link for ::testRead() #19.
@@ -765,4 +805,18 @@ class JsonApiFunctionalTest extends BrowserTestBase {
     }
   }
 
+  protected function setupMultilingual() {
+    $this->container->get('module_installer')->install(['language']);
+    $language = ConfigurableLanguage::createFromLangcode('es');
+    $language->save();
+
+    // In order to reflect the changes for a multilingual site in the container
+    // we have to rebuild it.
+    $this->rebuildContainer();
+
+    \Drupal::configFactory()->getEditable('language.negotiation')
+      ->set('url.prefixes.es', 'es')
+      ->save();
+  }
+
 }
