diff --git a/core/modules/action/src/Form/ActionDeleteForm.php b/core/modules/action/src/Form/ActionDeleteForm.php
index 0821b90a7a..1fd432b02f 100644
--- a/core/modules/action/src/Form/ActionDeleteForm.php
+++ b/core/modules/action/src/Form/ActionDeleteForm.php
@@ -3,7 +3,6 @@
 namespace Drupal\action\Form;
 
 use Drupal\Core\Entity\EntityDeleteForm;
-use Drupal\Core\Url;
 
 /**
  * Builds a form to delete an action.
@@ -16,7 +15,7 @@ class ActionDeleteForm extends EntityDeleteForm {
    * {@inheritdoc}
    */
   public function getCancelUrl() {
-    return new Url('entity.action.collection');
+    return $this->entity->toUrl('collection');
   }
 
 }
diff --git a/core/modules/action/src/Form/ActionFormBase.php b/core/modules/action/src/Form/ActionFormBase.php
index b73ca4c41e..517bc272b0 100644
--- a/core/modules/action/src/Form/ActionFormBase.php
+++ b/core/modules/action/src/Form/ActionFormBase.php
@@ -134,7 +134,7 @@ public function save(array $form, FormStateInterface $form_state) {
     $this->entity->save();
     $this->messenger()->addStatus($this->t('The action has been successfully saved.'));
 
-    $form_state->setRedirect('entity.action.collection');
+    $form_state->setRedirectUrl($this->entity->toUrl('collection'));
   }
 
   /**
diff --git a/core/modules/book/book.module b/core/modules/book/book.module
index 42fec612ee..7cf87e415f 100644
--- a/core/modules/book/book.module
+++ b/core/modules/book/book.module
@@ -387,12 +387,14 @@ function template_preprocess_book_all_books_block(&$variables) {
  *     Properties used: bid, link_title, depth, pid, nid.
  */
 function template_preprocess_book_navigation(&$variables) {
+  /** @var \Drupal\Core\Entity\EntityRepositoryInterface $entity_repository */
+  $entity_repository = \Drupal::service('entity.repository');
   $book_link = $variables['book_link'];
 
   // Provide extra variables for themers. Not needed by default.
   $variables['book_id'] = $book_link['bid'];
   $variables['book_title'] = $book_link['link_title'];
-  $variables['book_url'] = Url::fromRoute('entity.node.canonical', ['node' => $book_link['bid']])->toString();
+  $variables['book_url'] = $entity_repository->getTranslationFromContext(Node::load($book_link['bid']))->toUrl()->toString();
   $variables['current_depth'] = $book_link['depth'];
   $variables['tree'] = '';
 
@@ -405,7 +407,7 @@ function template_preprocess_book_navigation(&$variables) {
     $build = [];
 
     if ($prev = $book_outline->prevLink($book_link)) {
-      $prev_href = Url::fromRoute('entity.node.canonical', ['node' => $prev['nid']])->toString();
+      $prev_href = $entity_repository->getTranslationFromContext(Node::load($prev['nid']))->toUrl()->toString();
       $build['#attached']['html_head_link'][][] = [
         'rel' => 'prev',
         'href' => $prev_href,
@@ -417,7 +419,7 @@ function template_preprocess_book_navigation(&$variables) {
     /** @var \Drupal\book\BookManagerInterface $book_manager */
     $book_manager = \Drupal::service('book.manager');
     if ($book_link['pid'] && $parent = $book_manager->loadBookLink($book_link['pid'])) {
-      $parent_href = Url::fromRoute('entity.node.canonical', ['node' => $book_link['pid']])->toString();
+      $parent_href = $entity_repository->getTranslationFromContext(Node::load($book_link['pid']))->toUrl()->toString();
       $build['#attached']['html_head_link'][][] = [
         'rel' => 'up',
         'href' => $parent_href,
@@ -427,7 +429,7 @@ function template_preprocess_book_navigation(&$variables) {
     }
 
     if ($next = $book_outline->nextLink($book_link)) {
-      $next_href = Url::fromRoute('entity.node.canonical', ['node' => $next['nid']])->toString();
+      $next_href = $entity_repository->getTranslationFromContext(Node::load($next['nid']))->toUrl()->toString();
       $build['#attached']['html_head_link'][][] = [
         'rel' => 'next',
         'href' => $next_href,
diff --git a/core/modules/book/src/BookBreadcrumbBuilder.php b/core/modules/book/src/BookBreadcrumbBuilder.php
index 202246dc86..db684b5c5d 100644
--- a/core/modules/book/src/BookBreadcrumbBuilder.php
+++ b/core/modules/book/src/BookBreadcrumbBuilder.php
@@ -109,6 +109,7 @@ public function build(RouteMatchInterface $route_match) {
       $depth = 1;
       while (!empty($book['p' . ($depth + 1)])) {
         if (!empty($parent_books[$book['p' . $depth]]) && ($parent_book = $parent_books[$book['p' . $depth]])) {
+          $parent_book = $this->entityRepository->getTranslationFromContext($parent_book);
           $access = $parent_book->access('view', $this->account, TRUE);
           $breadcrumb->addCacheableDependency($access);
           if ($access->isAllowed()) {
diff --git a/core/modules/book/src/Form/BookOutlineForm.php b/core/modules/book/src/Form/BookOutlineForm.php
index 0bf60353ce..7f67ea6744 100644
--- a/core/modules/book/src/Form/BookOutlineForm.php
+++ b/core/modules/book/src/Form/BookOutlineForm.php
@@ -8,7 +8,7 @@
 use Drupal\Core\Entity\EntityRepositoryInterface;
 use Drupal\Core\Entity\EntityTypeBundleInfoInterface;
 use Drupal\Core\Form\FormStateInterface;
-use Drupal\Core\Url;
+use Drupal\node\Entity\Node;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
@@ -96,9 +96,10 @@ public function form(array $form, FormStateInterface $form_state) {
    */
   protected function actions(array $form, FormStateInterface $form_state) {
     $actions = parent::actions($form, $form_state);
+    $book = $this->entity->id() == $this->entity->book['nid'] ? $this->entity : \Drupal::service('entity.repository')->getTranslationFromContext(Node::load($this->entity->book['nid']));
     $actions['submit']['#value'] = $this->entity->book['original_bid'] ? $this->t('Update book outline') : $this->t('Add to book outline');
     $actions['delete']['#title'] = $this->t('Remove from book outline');
-    $actions['delete']['#url'] = new Url('entity.node.book_remove_form', ['node' => $this->entity->book['nid']]);
+    $actions['delete']['#url'] = $book->toUrl('book-remove-form');
     $actions['delete']['#access'] = $this->bookManager->checkNodeIsRemovable($this->entity);
     return $actions;
   }
@@ -107,10 +108,7 @@ protected function actions(array $form, FormStateInterface $form_state) {
    * {@inheritdoc}
    */
   public function save(array $form, FormStateInterface $form_state) {
-    $form_state->setRedirect(
-      'entity.node.canonical',
-      ['node' => $this->entity->id()]
-    );
+    $form_state->setRedirectUrl($this->entity->toUrl());
     $book_link = $form_state->getValue('book');
     if (!$book_link['bid']) {
       $this->messenger()->addStatus($this->t('No changes were made'));
diff --git a/core/modules/forum/forum.services.yml b/core/modules/forum/forum.services.yml
index 6268c2cf8a..c75bcb04c5 100644
--- a/core/modules/forum/forum.services.yml
+++ b/core/modules/forum/forum.services.yml
@@ -6,12 +6,12 @@ services:
       - { name: backend_overridable }
   forum.breadcrumb.node:
     class: Drupal\forum\Breadcrumb\ForumNodeBreadcrumbBuilder
-    arguments: ['@entity_type.manager', '@config.factory', '@forum_manager', '@string_translation']
+    arguments: ['@entity_type.manager', '@config.factory', '@forum_manager', '@string_translation', '@entity.repository']
     tags:
       - { name: breadcrumb_builder, priority: 1001 }
   forum.breadcrumb.listing:
     class: Drupal\forum\Breadcrumb\ForumListingBreadcrumbBuilder
-    arguments: ['@entity_type.manager', '@config.factory', '@forum_manager', '@string_translation']
+    arguments: ['@entity_type.manager', '@config.factory', '@forum_manager', '@string_translation', '@entity.repository' ]
     tags:
       - { name: breadcrumb_builder, priority: 1001 }
   forum.index_storage:
diff --git a/core/modules/forum/src/Breadcrumb/ForumBreadcrumbBuilderBase.php b/core/modules/forum/src/Breadcrumb/ForumBreadcrumbBuilderBase.php
index 72a9579730..c774c58194 100644
--- a/core/modules/forum/src/Breadcrumb/ForumBreadcrumbBuilderBase.php
+++ b/core/modules/forum/src/Breadcrumb/ForumBreadcrumbBuilderBase.php
@@ -5,6 +5,7 @@
 use Drupal\Core\Breadcrumb\BreadcrumbBuilderInterface;
 use Drupal\Core\Breadcrumb\Breadcrumb;
 use Drupal\Core\Config\ConfigFactoryInterface;
+use Drupal\Core\Entity\EntityRepositoryInterface;
 use Drupal\Core\Entity\EntityTypeManagerInterface;
 use Drupal\Core\Link;
 use Drupal\Core\Routing\RouteMatchInterface;
@@ -49,6 +50,13 @@ abstract class ForumBreadcrumbBuilderBase implements BreadcrumbBuilderInterface
    */
   protected $termStorage;
 
+  /**
+   * Entity repository interface.
+   *
+   * @var \Drupal\Core\Entity\EntityRepositoryInterface
+   */
+  protected $entityRepository;
+
   /**
    * Constructs a forum breadcrumb builder object.
    *
@@ -60,13 +68,16 @@ abstract class ForumBreadcrumbBuilderBase implements BreadcrumbBuilderInterface
    *   The forum manager service.
    * @param \Drupal\Core\StringTranslation\TranslationInterface $string_translation
    *   The string translation service.
+   * @param \Drupal\Core\Entity\EntityRepositoryInterface $entity_repository
+   *   The entity repository service.
    */
-  public function __construct(EntityTypeManagerInterface $entity_type_manager, ConfigFactoryInterface $config_factory, ForumManagerInterface $forum_manager, TranslationInterface $string_translation) {
+  public function __construct(EntityTypeManagerInterface $entity_type_manager, ConfigFactoryInterface $config_factory, ForumManagerInterface $forum_manager, TranslationInterface $string_translation, EntityRepositoryInterface $entity_repository) {
     $this->entityTypeManager = $entity_type_manager;
     $this->config = $config_factory->get('forum.settings');
     $this->forumManager = $forum_manager;
     $this->setStringTranslation($string_translation);
     $this->termStorage = $entity_type_manager->getStorage('taxonomy_term');
+    $this->entityRepository = $entity_repository;
   }
 
   /**
diff --git a/core/modules/forum/src/Breadcrumb/ForumListingBreadcrumbBuilder.php b/core/modules/forum/src/Breadcrumb/ForumListingBreadcrumbBuilder.php
index cb3bd89f89..ed9916a308 100644
--- a/core/modules/forum/src/Breadcrumb/ForumListingBreadcrumbBuilder.php
+++ b/core/modules/forum/src/Breadcrumb/ForumListingBreadcrumbBuilder.php
@@ -34,10 +34,17 @@ public function build(RouteMatchInterface $route_match) {
     if ($parents) {
       foreach (array_reverse($parents) as $parent) {
         if ($parent->id() != $term_id) {
+          $parent = $this->entityRepository->getTranslationFromContext($parent);
           $breadcrumb->addCacheableDependency($parent);
+          // @todo set the forum.page route as link template on the term entity
+          // and use $term->toUrl('forum-page') to build the url?
           $breadcrumb->addLink(Link::createFromRoute($parent->label(), 'forum.page', [
             'taxonomy_term' => $parent->id(),
-          ]));
+          ],
+            [
+              'language' => $parent->language(),
+            ]
+          ));
         }
       }
     }
diff --git a/core/modules/forum/src/Breadcrumb/ForumNodeBreadcrumbBuilder.php b/core/modules/forum/src/Breadcrumb/ForumNodeBreadcrumbBuilder.php
index 007fb9a63c..67dfce36d1 100644
--- a/core/modules/forum/src/Breadcrumb/ForumNodeBreadcrumbBuilder.php
+++ b/core/modules/forum/src/Breadcrumb/ForumNodeBreadcrumbBuilder.php
@@ -30,10 +30,16 @@ public function build(RouteMatchInterface $route_match) {
     if ($parents) {
       $parents = array_reverse($parents);
       foreach ($parents as $parent) {
+        $parent = $this->entityRepository->getTranslationFromContext($parent);
         $breadcrumb->addCacheableDependency($parent);
+        // @todo set the forum.page route as link template on the term entity
+        // and use $term->toUrl('forum-page') to build the url?
         $breadcrumb->addLink(Link::createFromRoute($parent->label(), 'forum.page',
           [
             'taxonomy_term' => $parent->id(),
+          ],
+          [
+            'language' => $parent->language(),
           ]
         ));
       }
diff --git a/core/modules/forum/tests/src/Unit/Breadcrumb/ForumBreadcrumbBuilderBaseTest.php b/core/modules/forum/tests/src/Unit/Breadcrumb/ForumBreadcrumbBuilderBaseTest.php
index f6834c4c82..07f5298bd1 100644
--- a/core/modules/forum/tests/src/Unit/Breadcrumb/ForumBreadcrumbBuilderBaseTest.php
+++ b/core/modules/forum/tests/src/Unit/Breadcrumb/ForumBreadcrumbBuilderBaseTest.php
@@ -44,6 +44,7 @@ public function testConstructor() {
     );
     $forum_manager = $this->createMock('Drupal\forum\ForumManagerInterface');
     $translation_manager = $this->createMock('Drupal\Core\StringTranslation\TranslationInterface');
+    $entity_repository = $this->createMock('Drupal\Core\Entity\EntityRepositoryInterface');
 
     // Make an object to test.
     $builder = $this->getMockForAbstractClass(
@@ -54,6 +55,7 @@ public function testConstructor() {
         $config_factory,
         $forum_manager,
         $translation_manager,
+        $entity_repository,
       ]
     );
 
@@ -103,6 +105,8 @@ public function testBuild() {
         ['taxonomy_vocabulary', $vocab_storage],
       ]));
 
+    $entity_repository = $this->createMock('Drupal\Core\Entity\EntityRepositoryInterface');
+
     $config_factory = $this->getConfigFactoryStub(
       [
         'forum.settings' => [
@@ -120,6 +124,7 @@ public function testBuild() {
         $config_factory,
         $forum_manager,
         $translation_manager,
+        $entity_repository,
       ]
     );
 
diff --git a/core/modules/forum/tests/src/Unit/Breadcrumb/ForumListingBreadcrumbBuilderTest.php b/core/modules/forum/tests/src/Unit/Breadcrumb/ForumListingBreadcrumbBuilderTest.php
index 960cb53d34..799a110778 100644
--- a/core/modules/forum/tests/src/Unit/Breadcrumb/ForumListingBreadcrumbBuilderTest.php
+++ b/core/modules/forum/tests/src/Unit/Breadcrumb/ForumListingBreadcrumbBuilderTest.php
@@ -50,9 +50,10 @@ public function testApplies($expected, $route_name = NULL, $parameter_map = [])
     $config_factory = $this->getConfigFactoryStub([]);
     $forum_manager = $this->createMock('Drupal\forum\ForumManagerInterface');
     $translation_manager = $this->createMock('Drupal\Core\StringTranslation\TranslationInterface');
+    $entity_repository = $this->createMock('Drupal\Core\Entity\EntityRepositoryInterface');
 
     // Make an object to test.
-    $builder = new ForumListingBreadcrumbBuilder($entity_type_manager, $config_factory, $forum_manager, $translation_manager);
+    $builder = new ForumListingBreadcrumbBuilder($entity_type_manager, $config_factory, $forum_manager, $translation_manager, $entity_repository);
 
     $route_match = $this->createMock('Drupal\Core\Routing\RouteMatchInterface');
     $route_match->expects($this->once())
@@ -79,6 +80,10 @@ public function providerTestApplies() {
       ->disableOriginalConstructor()
       ->getMock();
 
+    $prophecy = $this->prophesize('Drupal\Core\Language\Language');
+    $prophecy->getId()->willReturn('en');
+    $language = $prophecy->reveal();
+
     return [
       [
         FALSE,
@@ -120,6 +125,7 @@ public function testBuild() {
     $prophecy = $this->prophesize('Drupal\taxonomy\Entity\Term');
     $prophecy->label()->willReturn('Something');
     $prophecy->id()->willReturn(1);
+    $prophecy->language()->willReturn($language);
     $prophecy->getCacheTags()->willReturn(['taxonomy_term:1']);
     $prophecy->getCacheContexts()->willReturn([]);
     $prophecy->getCacheMaxAge()->willReturn(Cache::PERMANENT);
@@ -128,6 +134,7 @@ public function testBuild() {
     $prophecy = $this->prophesize('Drupal\taxonomy\Entity\Term');
     $prophecy->label()->willReturn('Something else');
     $prophecy->id()->willReturn(2);
+    $prophecy->language()->willReturn($language);
     $prophecy->getCacheTags()->willReturn(['taxonomy_term:2']);
     $prophecy->getCacheContexts()->willReturn([]);
     $prophecy->getCacheMaxAge()->willReturn(Cache::PERMANENT);
@@ -174,9 +181,15 @@ public function testBuild() {
     );
 
     $forum_manager = $this->createMock('Drupal\forum\ForumManagerInterface');
+    $entity_repository = $this->getMockBuilder('Drupal\Core\Entity\EntityRepositoryInterface')
+      ->disableOriginalConstructor()
+      ->getMock();
+    $entity_repository->expects($this->any())
+      ->method('getTranslationFromContext')
+      ->will($this->returnArgument(0));
 
     // Build a breadcrumb builder to test.
-    $breadcrumb_builder = new ForumListingBreadcrumbBuilder($entity_type_manager, $config_factory, $forum_manager, $translation_manager);
+    $breadcrumb_builder = new ForumListingBreadcrumbBuilder($entity_type_manager, $config_factory, $forum_manager, $translation_manager, $entity_repository);
 
     // Add a translation manager for t().
     $translation_manager = $this->getStringTranslationStub();
@@ -202,7 +215,7 @@ public function testBuild() {
     $expected1 = [
       Link::createFromRoute('Home', '<front>'),
       Link::createFromRoute('Fora_is_the_plural_of_forum', 'forum.index'),
-      Link::createFromRoute('Something', 'forum.page', ['taxonomy_term' => 1]),
+      Link::createFromRoute('Something', 'forum.page', ['taxonomy_term' => 1], ['language' => $language]),
     ];
     $breadcrumb = $breadcrumb_builder->build($route_match);
     $this->assertEquals($expected1, $breadcrumb->getLinks());
@@ -214,8 +227,8 @@ public function testBuild() {
     $expected2 = [
       Link::createFromRoute('Home', '<front>'),
       Link::createFromRoute('Fora_is_the_plural_of_forum', 'forum.index'),
-      Link::createFromRoute('Something else', 'forum.page', ['taxonomy_term' => 2]),
-      Link::createFromRoute('Something', 'forum.page', ['taxonomy_term' => 1]),
+      Link::createFromRoute('Something else', 'forum.page', ['taxonomy_term' => 2], ['language' => $language]),
+      Link::createFromRoute('Something', 'forum.page', ['taxonomy_term' => 1], ['language' => $language]),
     ];
     $breadcrumb = $breadcrumb_builder->build($route_match);
     $this->assertEquals($expected2, $breadcrumb->getLinks());
diff --git a/core/modules/forum/tests/src/Unit/Breadcrumb/ForumNodeBreadcrumbBuilderTest.php b/core/modules/forum/tests/src/Unit/Breadcrumb/ForumNodeBreadcrumbBuilderTest.php
index 3c903fe415..a2f1ed44b6 100644
--- a/core/modules/forum/tests/src/Unit/Breadcrumb/ForumNodeBreadcrumbBuilderTest.php
+++ b/core/modules/forum/tests/src/Unit/Breadcrumb/ForumNodeBreadcrumbBuilderTest.php
@@ -55,9 +55,10 @@ public function testApplies($expected, $route_name = NULL, $parameter_map = [])
       ->will($this->returnValue(TRUE));
 
     $translation_manager = $this->createMock('Drupal\Core\StringTranslation\TranslationInterface');
+    $entity_repository = $this->createMock('Drupal\Core\Entity\EntityRepositoryInterface');
 
     // Make an object to test.
-    $builder = new ForumNodeBreadcrumbBuilder($entity_type_manager, $config_factory, $forum_manager, $translation_manager);
+    $builder = new ForumNodeBreadcrumbBuilder($entity_type_manager, $config_factory, $forum_manager, $translation_manager, $entity_repository);
 
     $route_match = $this->createMock('Drupal\Core\Routing\RouteMatchInterface');
     $route_match->expects($this->once())
@@ -123,9 +124,14 @@ public function testBuild() {
       ->disableOriginalConstructor()
       ->getMock();
 
+    $prophecy = $this->prophesize('Drupal\Core\Language\Language');
+    $prophecy->getId()->willReturn('en');
+    $language = $prophecy->reveal();
+
     $prophecy = $this->prophesize('Drupal\taxonomy\Entity\Term');
     $prophecy->label()->willReturn('Something');
     $prophecy->id()->willReturn(1);
+    $prophecy->language()->willReturn($language);
     $prophecy->getCacheTags()->willReturn(['taxonomy_term:1']);
     $prophecy->getCacheContexts()->willReturn([]);
     $prophecy->getCacheMaxAge()->willReturn(Cache::PERMANENT);
@@ -134,6 +140,7 @@ public function testBuild() {
     $prophecy = $this->prophesize('Drupal\taxonomy\Entity\Term');
     $prophecy->label()->willReturn('Something else');
     $prophecy->id()->willReturn(2);
+    $prophecy->language()->willReturn($language);
     $prophecy->getCacheTags()->willReturn(['taxonomy_term:2']);
     $prophecy->getCacheContexts()->willReturn([]);
     $prophecy->getCacheMaxAge()->willReturn(Cache::PERMANENT);
@@ -173,6 +180,13 @@ public function testBuild() {
         ['taxonomy_term', $term_storage],
       ]);
 
+    $entity_repository = $this->getMockBuilder('Drupal\Core\Entity\EntityRepositoryInterface')
+      ->disableOriginalConstructor()
+      ->getMock();
+    $entity_repository->expects($this->any())
+      ->method('getTranslationFromContext')
+      ->will($this->returnArgument(0));
+
     $config_factory = $this->getConfigFactoryStub(
       [
         'forum.settings' => [
@@ -185,7 +199,9 @@ public function testBuild() {
     $breadcrumb_builder = new ForumNodeBreadcrumbBuilder($entity_type_manager,
       $config_factory,
       $forum_manager,
-      $translation_manager);
+      $translation_manager,
+      $entity_repository
+    );
 
     // Add a translation manager for t().
     $translation_manager = $this->getStringTranslationStub();
@@ -207,7 +223,7 @@ public function testBuild() {
     $expected1 = [
       Link::createFromRoute('Home', '<front>'),
       Link::createFromRoute('Forums', 'forum.index'),
-      Link::createFromRoute('Something', 'forum.page', ['taxonomy_term' => 1]),
+      Link::createFromRoute('Something', 'forum.page', ['taxonomy_term' => 1], ['language' => $language]),
     ];
     $breadcrumb = $breadcrumb_builder->build($route_match);
     $this->assertEquals($expected1, $breadcrumb->getLinks());
@@ -219,8 +235,8 @@ public function testBuild() {
     $expected2 = [
       Link::createFromRoute('Home', '<front>'),
       Link::createFromRoute('Forums', 'forum.index'),
-      Link::createFromRoute('Something else', 'forum.page', ['taxonomy_term' => 2]),
-      Link::createFromRoute('Something', 'forum.page', ['taxonomy_term' => 1]),
+      Link::createFromRoute('Something else', 'forum.page', ['taxonomy_term' => 2], ['language' => $language]),
+      Link::createFromRoute('Something', 'forum.page', ['taxonomy_term' => 1], ['language' => $language]),
     ];
     $breadcrumb = $breadcrumb_builder->build($route_match);
     $this->assertEquals($expected2, $breadcrumb->getLinks());
diff --git a/core/modules/image/tests/src/Functional/ImageOnTranslatedEntityTest.php b/core/modules/image/tests/src/Functional/ImageOnTranslatedEntityTest.php
index 64d2f92c74..8a745b45ba 100644
--- a/core/modules/image/tests/src/Functional/ImageOnTranslatedEntityTest.php
+++ b/core/modules/image/tests/src/Functional/ImageOnTranslatedEntityTest.php
@@ -129,7 +129,12 @@ public function testSyncedImages() {
     $edit = [$this->fieldName . '[0][alt]' => 'Scarlett Johansson image', $this->fieldName . '[0][title]' => 'Scarlett Johansson image title'];
     $this->submitForm($edit, 'Save (this translation)');
     // This inspects the HTML after the post of the translation, the image
-    // should be displayed on the original node.
+    // should be displayed on the translated node.
+    $this->assertSession()->responseContains('alt="Scarlett Johansson image"');
+    $this->assertSession()->responseContains('title="Scarlett Johansson image title"');
+    $second_fid = $this->getLastFileId();
+    // View the original node.
+    $this->drupalGet('node/' . $default_language_node->id());
     $this->assertSession()->responseContains('alt="Lost in translation image"');
     $this->assertSession()->responseContains('title="Lost in translation image title"');
     $second_fid = $this->getLastFileId();
@@ -169,13 +174,13 @@ public function testSyncedImages() {
     $file = File::load($first_fid);
     $this->assertTrue($file->isPermanent(), 'First file still exists and is permanent.');
     // This inspects the HTML after the post of the translation, the image
-    // should be displayed on the original node.
-    $this->assertSession()->responseContains('alt="Lost in translation image"');
-    $this->assertSession()->responseContains('title="Lost in translation image title"');
-    // View the translated node.
-    $this->drupalGet('nl/node/' . $default_language_node->id());
+    // should be displayed on the translated node.
     $this->assertSession()->responseContains('alt="Akiko Takeshita image"');
     $this->assertSession()->responseContains('title="Akiko Takeshita image title"');
+    // View the original node.
+    $this->drupalGet('node/' . $default_language_node->id());
+    $this->assertSession()->responseContains('alt="Lost in translation image"');
+    $this->assertSession()->responseContains('title="Lost in translation image title"');
 
     // Ensure the file status of the second file is permanent.
     $file = File::load($second_fid);
diff --git a/core/modules/language/tests/src/Functional/LanguageNegotiationInfoTest.php b/core/modules/language/tests/src/Functional/LanguageNegotiationInfoTest.php
index d92af69c74..b6899dfbd3 100644
--- a/core/modules/language/tests/src/Functional/LanguageNegotiationInfoTest.php
+++ b/core/modules/language/tests/src/Functional/LanguageNegotiationInfoTest.php
@@ -134,7 +134,10 @@ public function testInfoAlterations() {
     }
 
     // Check language negotiation results.
-    $this->drupalGet('');
+    // We won't call here for '' root, because this would redirect to user page,
+    // and the language of the link (that means interface as well) will be set
+    // to LanguageInterface::TYPE_CONTENT. Instead, any 404 page will work.
+    $this->drupalGet('page_not_found');
     $last = $this->container->get('state')->get('language_test.language_negotiation_last');
     foreach ($this->languageManager()->getDefinedLanguageTypes() as $type) {
       $langcode = $last[$type];
diff --git a/core/modules/menu_link_content/src/Form/MenuLinkContentDeleteForm.php b/core/modules/menu_link_content/src/Form/MenuLinkContentDeleteForm.php
index 745958f0f9..d077c303f2 100644
--- a/core/modules/menu_link_content/src/Form/MenuLinkContentDeleteForm.php
+++ b/core/modules/menu_link_content/src/Form/MenuLinkContentDeleteForm.php
@@ -3,7 +3,7 @@
 namespace Drupal\menu_link_content\Form;
 
 use Drupal\Core\Entity\ContentEntityDeleteForm;
-use Drupal\Core\Url;
+use Drupal\system\Entity\Menu;
 
 /**
  * Provides a delete form for content menu links.
@@ -17,7 +17,8 @@ class MenuLinkContentDeleteForm extends ContentEntityDeleteForm {
    */
   public function getCancelUrl() {
     if ($this->moduleHandler->moduleExists('menu_ui')) {
-      return new Url('entity.menu.edit_form', ['menu' => $this->entity->getMenuName()]);
+      $menu = Menu::load($this->entity->getMenuName());
+      return $menu->toUrl('edit-form');
     }
     return $this->entity->toUrl();
   }
diff --git a/core/modules/node/node.module b/core/modules/node/node.module
index 7e194d91b6..4f06622f2f 100644
--- a/core/modules/node/node.module
+++ b/core/modules/node/node.module
@@ -18,6 +18,7 @@
 use Drupal\Core\Database\StatementInterface;
 use Drupal\Core\Entity\Display\EntityViewDisplayInterface;
 use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Language\LanguageInterface;
 use Drupal\Core\Link;
 use Drupal\Core\Render\Element;
 use Drupal\Core\Routing\RouteMatchInterface;
@@ -391,10 +392,11 @@ function node_is_page(NodeInterface $node) {
 function template_preprocess_node_add_list(&$variables) {
   $variables['types'] = [];
   if (!empty($variables['content'])) {
+    $content_language = \Drupal::languageManager()->getCurrentLanguage(LanguageInterface::TYPE_CONTENT);
     foreach ($variables['content'] as $type) {
       $variables['types'][$type->id()] = [
         'type' => $type->id(),
-        'add_link' => Link::fromTextAndUrl($type->label(), Url::fromRoute('node.add', ['node_type' => $type->id()]))->toString(),
+        'add_link' => Link::fromTextAndUrl($type->label(), Url::fromRoute('node.add', ['node_type' => $type->id()], ['language' => $content_language]))->toString(),
         'description' => [
           '#markup' => $type->getDescription(),
         ],
diff --git a/core/modules/node/src/Controller/NodeController.php b/core/modules/node/src/Controller/NodeController.php
index ed80d7ced7..3500021edc 100644
--- a/core/modules/node/src/Controller/NodeController.php
+++ b/core/modules/node/src/Controller/NodeController.php
@@ -104,7 +104,7 @@ public function addPage() {
     // Bypass the node/add listing if only one content type is available.
     if (count($content) == 1) {
       $type = array_shift($content);
-      return $this->redirect('node.add', ['node_type' => $type->id()]);
+      return $this->redirect('node.add', ['node_type' => $type->id()], ['language' => $this->languageManager()->getCurrentLanguage(LanguageInterface::TYPE_CONTENT)]);
     }
 
     $build['#content'] = $content;
diff --git a/core/modules/node/src/NodeForm.php b/core/modules/node/src/NodeForm.php
index ef167c82bd..16ca83a4bf 100644
--- a/core/modules/node/src/NodeForm.php
+++ b/core/modules/node/src/NodeForm.php
@@ -285,10 +285,7 @@ public function save(array $form, FormStateInterface $form_state) {
       $form_state->setValue('nid', $node->id());
       $form_state->set('nid', $node->id());
       if ($node->access('view')) {
-        $form_state->setRedirect(
-          'entity.node.canonical',
-          ['node' => $node->id()]
-        );
+        $form_state->setRedirectUrl($node->toUrl());
       }
       else {
         $form_state->setRedirect('<front>');
diff --git a/core/modules/responsive_image/src/ResponsiveImageStyleForm.php b/core/modules/responsive_image/src/ResponsiveImageStyleForm.php
index 7bceff174e..ea30d07cc3 100644
--- a/core/modules/responsive_image/src/ResponsiveImageStyleForm.php
+++ b/core/modules/responsive_image/src/ResponsiveImageStyleForm.php
@@ -281,15 +281,8 @@ public function save(array $form, FormStateInterface $form_state) {
 
     // Redirect to edit form after creating a new responsive image style or
     // after selecting another breakpoint group.
-    if (!$responsive_image_style->hasImageStyleMappings()) {
-      $form_state->setRedirect(
-        'entity.responsive_image_style.edit_form',
-        ['responsive_image_style' => $responsive_image_style->id()]
-      );
-    }
-    else {
-      $form_state->setRedirectUrl($this->entity->toUrl('collection'));
-    }
+    $link_template = $responsive_image_style->hasImageStyleMappings() ? 'collection' : 'edit-form';
+    $form_state->setRedirectUrl($responsive_image_style->toUrl($link_template));
   }
 
 }
diff --git a/core/modules/taxonomy/src/TermBreadcrumbBuilder.php b/core/modules/taxonomy/src/TermBreadcrumbBuilder.php
index 89252df4be..872668ee7e 100644
--- a/core/modules/taxonomy/src/TermBreadcrumbBuilder.php
+++ b/core/modules/taxonomy/src/TermBreadcrumbBuilder.php
@@ -71,7 +71,7 @@ public function build(RouteMatchInterface $route_match) {
     foreach (array_reverse($parents) as $term) {
       $term = $this->entityRepository->getTranslationFromContext($term);
       $breadcrumb->addCacheableDependency($term);
-      $breadcrumb->addLink(Link::createFromRoute($term->getName(), 'entity.taxonomy_term.canonical', ['taxonomy_term' => $term->id()]));
+      $breadcrumb->addLink(Link::fromTextAndUrl($term->getName(), $term->toUrl()));
     }
 
     // This breadcrumb builder is based on a route parameter, and hence it
diff --git a/core/modules/user/src/Controller/UserController.php b/core/modules/user/src/Controller/UserController.php
index ca40039816..7865e3f467 100644
--- a/core/modules/user/src/Controller/UserController.php
+++ b/core/modules/user/src/Controller/UserController.php
@@ -6,6 +6,7 @@
 use Drupal\Component\Utility\Xss;
 use Drupal\Core\Controller\ControllerBase;
 use Drupal\Core\Datetime\DateFormatterInterface;
+use Drupal\Core\Entity\EntityRepositoryInterface;
 use Drupal\Core\Flood\FloodInterface;
 use Drupal\Core\Url;
 use Drupal\user\Form\UserPasswordResetForm;
@@ -57,6 +58,13 @@ class UserController extends ControllerBase {
    */
   protected $flood;
 
+  /**
+   * The entity repository.
+   *
+   * @var \Drupal\Core\Entity\EntityRepositoryInterface
+   */
+  protected $entityRepository;
+
   /**
    * Constructs a UserController object.
    *
@@ -70,13 +78,20 @@ class UserController extends ControllerBase {
    *   A logger instance.
    * @param \Drupal\Core\Flood\FloodInterface $flood
    *   The flood service.
+   * @param \Drupal\Core\Entity\EntityRepositoryInterface $entity_repository
+   *   The entity repository.
    */
-  public function __construct(DateFormatterInterface $date_formatter, UserStorageInterface $user_storage, UserDataInterface $user_data, LoggerInterface $logger, FloodInterface $flood) {
+  public function __construct(DateFormatterInterface $date_formatter, UserStorageInterface $user_storage, UserDataInterface $user_data, LoggerInterface $logger, FloodInterface $flood = NULL, EntityRepositoryInterface $entity_repository = NULL) {
     $this->dateFormatter = $date_formatter;
     $this->userStorage = $user_storage;
     $this->userData = $user_data;
     $this->logger = $logger;
     $this->flood = $flood;
+    if (!$entity_repository) {
+      @trigger_error('Calling ' . __METHOD__ . ' without the $entity_repository parameter is deprecated in drupal:9.1.0 and is required in drupal:10.0.0. See https://www.drupal.org/project/drupal/issues/2940992', E_USER_DEPRECATED);
+      $entity_repository = \Drupal::service('entity.repository');
+    }
+    $this->entityRepository = $entity_repository;
   }
 
   /**
@@ -88,7 +103,8 @@ public static function create(ContainerInterface $container) {
       $container->get('entity_type.manager')->getStorage('user'),
       $container->get('user.data'),
       $container->get('logger.factory')->get('user'),
-      $container->get('flood')
+      $container->get('flood'),
+      $container->get('entity.repository')
     );
   }
 
@@ -251,14 +267,18 @@ public function resetPassLogin($uid, $timestamp, $hash, Request $request) {
       $request->getSession()->set('pass_reset_' . $user->id(), $token);
       // Clear any flood events for this user.
       $this->flood->clear('user.password_request_user', $uid);
-      return $this->redirect(
-        'entity.user.edit_form',
-        ['user' => $user->id()],
-        [
-          'query' => ['pass-reset-token' => $token],
-          'absolute' => TRUE,
-        ]
-      );
+
+      // Retrieve the entity in a preferable translation in order to consider it
+      // when generating the URL.
+      $preferred_langcode = $user->getPreferredLangcode(FALSE);
+      $preferred_langcode = empty($preferred_langcode) ? NULL : $preferred_langcode;
+      $user = $this->entityRepository->getTranslationFromContext($user, $preferred_langcode);
+
+      $url = $user->toUrl('edit-form', [
+        'query' => ['pass-reset-token' => $token],
+        'absolute' => TRUE,
+      ]);
+      return $this->redirectToUrl($url);
     }
 
     $this->messenger()->addError($this->t('You have tried to use a one-time login link that has either been used or is no longer valid. Please request a new one using the form below.'));
@@ -276,7 +296,17 @@ public function resetPassLogin($uid, $timestamp, $hash, Request $request) {
    *   Returns a redirect to the profile of the currently logged in user.
    */
   public function userPage() {
-    return $this->redirect('entity.user.canonical', ['user' => $this->currentUser()->id()]);
+    $user = $this->currentUser()->id();
+    /** @var \Drupal\user\UserInterface $user */
+    $user = $this->userStorage->load($user);
+
+    // Retrieve the entity in a preferable translation in order to consider it
+    // when generating the URL.
+    $preferred_langcode = $user->getPreferredLangcode(FALSE);
+    $preferred_langcode = empty($preferred_langcode) ? NULL : $preferred_langcode;
+    $user = $this->entityRepository->getTranslationFromContext($user, $preferred_langcode);
+
+    return $this->redirectToUrl($user->toUrl());
   }
 
   /**
diff --git a/core/modules/user/src/EventSubscriber/AccessDeniedSubscriber.php b/core/modules/user/src/EventSubscriber/AccessDeniedSubscriber.php
index 9a80dc9c22..a833949191 100644
--- a/core/modules/user/src/EventSubscriber/AccessDeniedSubscriber.php
+++ b/core/modules/user/src/EventSubscriber/AccessDeniedSubscriber.php
@@ -2,6 +2,9 @@
 
 namespace Drupal\user\EventSubscriber;
 
+use Drupal\Core\Entity\EntityInterface;
+use Drupal\Core\Entity\EntityRepositoryInterface;
+use Drupal\Core\Entity\EntityTypeManagerInterface;
 use Drupal\Core\Session\AccountInterface;
 use Drupal\Core\Routing\RouteMatch;
 use Drupal\Core\Url;
@@ -28,14 +31,34 @@ class AccessDeniedSubscriber implements EventSubscriberInterface {
    */
   protected $account;
 
+  /**
+   * The entity repository.
+   *
+   * @var \Drupal\Core\Entity\EntityRepositoryInterface
+   */
+  protected $entityRepository;
+
+  /**
+   * The user storage.
+   *
+   * @var \Drupal\Core\Entity\EntityStorageInterface
+   */
+  protected $storage;
+
   /**
    * Constructs a new redirect subscriber.
    *
    * @param \Drupal\Core\Session\AccountInterface $account
    *   The current user.
+   * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
+   *   The entity manager.
+   * @param \Drupal\Core\Entity\EntityRepositoryInterface $entity_repository
+   *   The entity repository.
    */
-  public function __construct(AccountInterface $account) {
+  public function __construct(AccountInterface $account, EntityTypeManagerInterface $entity_type_manager, EntityRepositoryInterface $entity_repository) {
     $this->account = $account;
+    $this->storage = $entity_type_manager->getStorage('user');
+    $this->entityRepository = $entity_repository;
   }
 
   /**
@@ -50,15 +73,27 @@ public function onException(ExceptionEvent $event) {
       $route_name = RouteMatch::createFromRequest($event->getRequest())->getRouteName();
       $redirect_url = NULL;
       if ($this->account->isAuthenticated()) {
+        $user = $this->account;
+        if (!$this->account instanceof EntityInterface) {
+          /** @var \Drupal\user\UserInterface $user */
+          $user = $this->storage->load($this->account->id());
+        }
+
+        // Retrieve the entity in a preferable translation in order to consider it
+        // when generating the URL.
+        $preferred_langcode = $user->getPreferredLangcode(FALSE);
+        $preferred_langcode = empty($preferred_langcode) ? NULL : $preferred_langcode;
+        $user = $this->entityRepository->getTranslationFromContext($user, $preferred_langcode);
+
         switch ($route_name) {
           case 'user.login';
             // Redirect an authenticated user to the profile page.
-            $redirect_url = Url::fromRoute('entity.user.canonical', ['user' => $this->account->id()], ['absolute' => TRUE]);
+            $redirect_url = $user->toUrl();
             break;
 
           case 'user.register';
             // Redirect an authenticated user to the profile form.
-            $redirect_url = Url::fromRoute('entity.user.edit_form', ['user' => $this->account->id()], ['absolute' => TRUE]);
+            $redirect_url = $user->toUrl('edit-form');
             break;
         }
       }
diff --git a/core/modules/user/src/Form/UserLoginForm.php b/core/modules/user/src/Form/UserLoginForm.php
index 5e2b117064..13d7a85173 100644
--- a/core/modules/user/src/Form/UserLoginForm.php
+++ b/core/modules/user/src/Form/UserLoginForm.php
@@ -2,6 +2,7 @@
 
 namespace Drupal\user\Form;
 
+use Drupal\Core\Entity\EntityRepositoryInterface;
 use Drupal\Core\Form\FormBase;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Render\RendererInterface;
@@ -55,6 +56,13 @@ class UserLoginForm extends FormBase {
    */
   protected $bareHtmlPageRenderer;
 
+  /**
+   * The entity repository.
+   *
+   * @var \Drupal\Core\Entity\EntityRepositoryInterface
+   */
+  protected $entityRepository;
+
   /**
    * Constructs a new UserLoginForm.
    *
@@ -66,10 +74,12 @@ class UserLoginForm extends FormBase {
    *   The user authentication object.
    * @param \Drupal\Core\Render\RendererInterface $renderer
    *   The renderer.
-   * @param \Drupal\Core\Render\BareHtmlPageRendererInterface $bare_html_renderer
+   * @param \Drupal\Core\Render\BareHtmlPageRendererInterface|null $bare_html_renderer
    *   The renderer.
+   * @param \Drupal\Core\Entity\EntityRepositoryInterface $entity_repository
+   *   The entity repository.
    */
-  public function __construct($user_flood_control, UserStorageInterface $user_storage, UserAuthInterface $user_auth, RendererInterface $renderer, BareHtmlPageRendererInterface $bare_html_renderer = NULL) {
+  public function __construct($user_flood_control, UserStorageInterface $user_storage, UserAuthInterface $user_auth, RendererInterface $renderer, BareHtmlPageRendererInterface $bare_html_renderer = NULL, EntityRepositoryInterface $entity_repository) {
     if (!$user_flood_control instanceof UserFloodControlInterface) {
       @trigger_error('Passing the flood service to ' . __METHOD__ . ' is deprecated in drupal:9.1.0 and is replaced by user.flood_control in drupal:10.0.0. See https://www.drupal.org/node/3067148', E_USER_DEPRECATED);
       $user_flood_control = \Drupal::service('user.flood_control');
@@ -83,6 +93,7 @@ public function __construct($user_flood_control, UserStorageInterface $user_stor
     $this->userAuth = $user_auth;
     $this->renderer = $renderer;
     $this->bareHtmlPageRenderer = $bare_html_renderer;
+    $this->entityRepository = $entity_repository;
   }
 
   /**
@@ -94,7 +105,8 @@ public static function create(ContainerInterface $container) {
       $container->get('entity_type.manager')->getStorage('user'),
       $container->get('user.auth'),
       $container->get('renderer'),
-      $container->get('bare_html_page_renderer')
+      $container->get('bare_html_page_renderer'),
+      $container->get('entity.repository')
     );
   }
 
@@ -151,18 +163,21 @@ public function buildForm(array $form, FormStateInterface $form_state) {
    * {@inheritdoc}
    */
   public function submitForm(array &$form, FormStateInterface $form_state) {
-
+    /** @var \Drupal\user\UserInterface $account */
     if (empty($uid = $form_state->get('uid'))) {
       return;
     }
     $account = $this->userStorage->load($uid);
 
+    // Retrieve the entity in a preferable translation in order to consider it
+    // when generating the URL.
+    $preferred_langcode = $account->getPreferredLangcode(FALSE);
+    $preferred_langcode = empty($preferred_langcode) ? NULL : $preferred_langcode;
+    $account = $this->entityRepository->getTranslationFromContext($account, $preferred_langcode);
+
     // A destination was set, probably on an exception controller.
     if (!$this->getRequest()->request->has('destination')) {
-      $form_state->setRedirect(
-        'entity.user.canonical',
-        ['user' => $account->id()]
-      );
+      $form_state->setRedirectUrl($account->toUrl('canonical'));
     }
     else {
       $this->getRequest()->query->set('destination', $this->getRequest()->request->get('destination'));
diff --git a/core/modules/user/src/ToolbarLinkBuilder.php b/core/modules/user/src/ToolbarLinkBuilder.php
index b278db6dba..7e8fa95d3f 100644
--- a/core/modules/user/src/ToolbarLinkBuilder.php
+++ b/core/modules/user/src/ToolbarLinkBuilder.php
@@ -2,6 +2,9 @@
 
 namespace Drupal\user;
 
+use Drupal\Core\Entity\ContentEntityInterface;
+use Drupal\Core\Entity\EntityRepositoryInterface;
+use Drupal\Core\Entity\EntityTypeManagerInterface;
 use Drupal\Core\Security\TrustedCallbackInterface;
 use Drupal\Core\Session\AccountProxyInterface;
 use Drupal\Core\StringTranslation\StringTranslationTrait;
@@ -17,18 +20,27 @@ class ToolbarLinkBuilder implements TrustedCallbackInterface {
   /**
    * The current user.
    *
-   * @var \Drupal\Core\Session\AccountProxyInterface
+   * @var \Drupal\user\UserInterface
    */
-  protected $account;
+  protected $currentUser;
 
   /**
    * ToolbarHandler constructor.
    *
    * @param \Drupal\Core\Session\AccountProxyInterface $account
    *   The current user.
+   * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
+   *   The entity type manager.
+   * @param \Drupal\Core\Entity\EntityRepositoryInterface $entity_repository
+   *   The entity repository.
    */
-  public function __construct(AccountProxyInterface $account) {
-    $this->account = $account;
+  public function __construct(AccountProxyInterface $account, EntityTypeManagerInterface $entity_type_manager, EntityRepositoryInterface $entity_repository) {
+    $this->currentUser = $account->getAccount();
+    if (!$this->currentUser instanceof ContentEntityInterface) {
+      $this->currentUser = $entity_type_manager->getStorage('user')
+        ->load($this->currentUser->id());
+    }
+    $this->currentUser = $entity_repository->getTranslationFromContext($this->currentUser);
   }
 
   /**
@@ -48,7 +60,7 @@ public function renderToolbarLinks() {
       ],
       'account_edit' => [
         'title' => $this->t('Edit profile'),
-        'url' => Url::fromRoute('entity.user.edit_form', ['user' => $this->account->id()]),
+        'url' => $this->currentUser->toUrl('edit-form'),
         'attributes' => [
           'title' => $this->t('Edit user account'),
         ],
@@ -80,7 +92,7 @@ public function renderToolbarLinks() {
    */
   public function renderDisplayName() {
     return [
-      '#markup' => $this->account->getDisplayName(),
+      '#markup' => $this->currentUser->getDisplayName(),
     ];
   }
 
diff --git a/core/modules/user/user.module b/core/modules/user/user.module
index 5eb8c52188..7afe841d4b 100644
--- a/core/modules/user/user.module
+++ b/core/modules/user/user.module
@@ -432,9 +432,14 @@ function template_preprocess_username(&$variables) {
         ->toString();
     }
     else {
-      $variables['attributes']['href'] = Url::fromRoute('entity.user.canonical', [
-        'user' => $variables['uid'],
-      ])->toString();
+      /** @var \Drupal\user\UserInterface $user */
+      $user = $account instanceof EntityInterface ? $account : User::load($account->id());
+      // Retrieve the entity in a preferable translation in order to consider it
+      // when generating the URL.
+      $preferred_langcode = $user->getPreferredLangcode(FALSE);
+      $preferred_langcode = empty($preferred_langcode) ? NULL : $preferred_langcode;
+      $user = \Drupal::service('entity.repository')->getTranslationFromContext($user, $preferred_langcode);
+      $variables['attributes']['href'] = $user->toUrl()->toString();
     }
   }
 }
diff --git a/core/modules/user/user.services.yml b/core/modules/user/user.services.yml
index f8f7d15f4e..012bc8304c 100644
--- a/core/modules/user/user.services.yml
+++ b/core/modules/user/user.services.yml
@@ -33,7 +33,7 @@ services:
       - { name: event_subscriber }
   user_access_denied_subscriber:
     class: Drupal\user\EventSubscriber\AccessDeniedSubscriber
-    arguments: ['@current_user']
+    arguments: ['@current_user', '@entity_type.manager', '@entity.repository']
     tags:
       - { name: event_subscriber }
   user_last_access_subscriber:
@@ -59,7 +59,7 @@ services:
       - { name: 'context_provider' }
   user.toolbar_link_builder:
     class: Drupal\user\ToolbarLinkBuilder
-    arguments: ['@current_user']
+    arguments: ['@current_user', '@entity_type.manager', '@entity.repository']
   user.flood_control:
     class: Drupal\user\UserFloodControl
     arguments: ['@flood', '@event_dispatcher', '@request_stack']
diff --git a/core/themes/seven/seven.theme b/core/themes/seven/seven.theme
index 144f7c53be..b2fdf810c4 100644
--- a/core/themes/seven/seven.theme
+++ b/core/themes/seven/seven.theme
@@ -5,6 +5,7 @@
  * Functions to support theming in the Seven theme.
  */
 
+use Drupal\Core\Language\LanguageInterface;
 use Drupal\Component\Utility\Html;
 use Drupal\Core\Url;
 use Drupal\Core\Form\FormStateInterface;
@@ -62,10 +63,11 @@ function seven_preprocess_menu_local_task(&$variables) {
  */
 function seven_preprocess_node_add_list(&$variables) {
   if (!empty($variables['content'])) {
+    $content_language = \Drupal::languageManager()->getCurrentLanguage(LanguageInterface::TYPE_CONTENT);
     /** @var \Drupal\node\NodeTypeInterface $type */
     foreach ($variables['content'] as $type) {
       $variables['types'][$type->id()]['label'] = $type->label();
-      $variables['types'][$type->id()]['url'] = Url::fromRoute('node.add', ['node_type' => $type->id()])->toString();
+      $variables['types'][$type->id()]['url'] = Url::fromRoute('node.add', ['node_type' => $type->id()], ['language' => $content_language])->toString();
     }
   }
 }
