diff --git a/core/lib/Drupal/Core/Routing/UrlGeneratorTrait.php b/core/lib/Drupal/Core/Routing/UrlGeneratorTrait.php
index 7854a0ac96..a5b428561c 100644
--- a/core/lib/Drupal/Core/Routing/UrlGeneratorTrait.php
+++ b/core/lib/Drupal/Core/Routing/UrlGeneratorTrait.php
@@ -2,6 +2,7 @@
 
 namespace Drupal\Core\Routing;
 
+use Drupal\Core\Url;
 use Symfony\Component\HttpFoundation\RedirectResponse;
 
 /**
@@ -61,6 +62,25 @@ protected function url($route_name, $route_parameters = [], $options = []) {
   protected function redirect($route_name, array $route_parameters = [], array $options = [], $status = 302) {
     $options['absolute'] = TRUE;
     $url = $this->url($route_name, $route_parameters, $options);
+    return $this->redirectToUrl($url, $status);
+  }
+
+  /**
+   * Returns a redirect response object for the specified url.
+   *
+   * @param \Drupal\Core\Url|string $url
+   *   The url to which to redirect.
+   * @param int $status
+   *   (optional) The HTTP redirect status code for the redirect. The default is
+   *   302 Found.
+   *
+   * @return \Symfony\Component\HttpFoundation\RedirectResponse
+   *   A redirect response object that may be returned by the controller.
+   */
+  protected function redirectToUrl($url, $status = 302) {
+    if ($url instanceof Url) {
+     $url = $url->toString();
+    }
     return new RedirectResponse($url, $status);
   }
 
diff --git a/core/modules/action/src/ActionFormBase.php b/core/modules/action/src/ActionFormBase.php
index 46b70ede45..b9ebbdd26f 100644
--- a/core/modules/action/src/ActionFormBase.php
+++ b/core/modules/action/src/ActionFormBase.php
@@ -134,7 +134,7 @@ public function save(array $form, FormStateInterface $form_state) {
     $this->entity->save();
     drupal_set_message($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/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/book/book.module b/core/modules/book/book.module
index 4c62274271..295fff7a69 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'] = \Drupal::url('entity.node.canonical', ['node' => $book_link['bid']]);
+  $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 = \Drupal::url('entity.node.canonical', ['node' => $prev['nid']]);
+      $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 = \Drupal::url('entity.node.canonical', ['node' => $book_link['pid']]);
+      $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 = \Drupal::url('entity.node.canonical', ['node' => $next['nid']]);
+      $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 90591d8d49..3178a67682 100644
--- a/core/modules/book/src/BookBreadcrumbBuilder.php
+++ b/core/modules/book/src/BookBreadcrumbBuilder.php
@@ -17,6 +17,13 @@
 class BookBreadcrumbBuilder implements BreadcrumbBuilderInterface {
   use StringTranslationTrait;
 
+  /**
+   * The entity manager.
+   *
+   * @var \Drupal\Core\Entity\EntityManagerInterface
+   */
+  protected $entityManager;
+
   /**
    * The node storage.
    *
@@ -40,6 +47,7 @@ class BookBreadcrumbBuilder implements BreadcrumbBuilderInterface {
    *   The current user account.
    */
   public function __construct(EntityManagerInterface $entity_manager, AccountInterface $account) {
+    $this->entityManager = $entity_manager;
     $this->nodeStorage = $entity_manager->getStorage('node');
     $this->account = $account;
   }
@@ -72,11 +80,12 @@ 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->entityManager->getTranslationFromContext($parent_book);
           $access = $parent_book->access('view', $this->account, TRUE);
           $breadcrumb->addCacheableDependency($access);
           if ($access->isAllowed()) {
             $breadcrumb->addCacheableDependency($parent_book);
-            $links[] = Link::createFromRoute($parent_book->label(), 'entity.node.canonical', ['node' => $parent_book->id()]);
+            $links[] = Link::fromTextAndUrl($parent_book->label(), $parent_book->toUrl());
           }
         }
         $depth++;
diff --git a/core/modules/book/src/Form/BookOutlineForm.php b/core/modules/book/src/Form/BookOutlineForm.php
index f7ea043ed2..a0507770ce 100644
--- a/core/modules/book/src/Form/BookOutlineForm.php
+++ b/core/modules/book/src/Form/BookOutlineForm.php
@@ -9,6 +9,7 @@
 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 +97,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::entityManager()->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 +109,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']) {
       drupal_set_message($this->t('No changes were made'));
diff --git a/core/modules/forum/src/Breadcrumb/ForumListingBreadcrumbBuilder.php b/core/modules/forum/src/Breadcrumb/ForumListingBreadcrumbBuilder.php
index 93e5dd595f..b0e105ea3b 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->entityManager->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 1a359010a8..d3142354a4 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->entityManager->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/menu_link_content/src/Form/MenuLinkContentDeleteForm.php b/core/modules/menu_link_content/src/Form/MenuLinkContentDeleteForm.php
index e9f953850b..cc77a994e4 100644
--- a/core/modules/menu_link_content/src/Form/MenuLinkContentDeleteForm.php
+++ b/core/modules/menu_link_content/src/Form/MenuLinkContentDeleteForm.php
@@ -4,6 +4,7 @@
 
 use Drupal\Core\Entity\ContentEntityDeleteForm;
 use Drupal\Core\Url;
+use Drupal\system\Entity\Menu;
 
 /**
  * Provides a delete form for content menu links.
@@ -17,7 +18,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->urlInfo();
   }
diff --git a/core/modules/node/node.module b/core/modules/node/node.module
index 208deb5786..2ace3f87a5 100644
--- a/core/modules/node/node.module
+++ b/core/modules/node/node.module
@@ -531,10 +531,11 @@ function node_is_page(NodeInterface $node) {
 function template_preprocess_node_add_list(&$variables) {
   $variables['types'] = [];
   if (!empty($variables['content'])) {
+    $default_language = \Drupal::languageManager()->getDefaultLanguage();
     foreach ($variables['content'] as $type) {
       $variables['types'][$type->id()] = [
         'type' => $type->id(),
-        'add_link' => \Drupal::l($type->label(), new Url('node.add', ['node_type' => $type->id()])),
+        'add_link' => \Drupal::l($type->label(), new Url('node.add', ['node_type' => $type->id()], ['language' => $default_language])),
         'description' => [
           '#markup' => $type->getDescription(),
         ],
diff --git a/core/modules/node/src/Controller/NodeController.php b/core/modules/node/src/Controller/NodeController.php
index e873f91f56..2fca789422 100644
--- a/core/modules/node/src/Controller/NodeController.php
+++ b/core/modules/node/src/Controller/NodeController.php
@@ -88,7 +88,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()->getDefaultLanguage()]);
     }
 
     $build['#content'] = $content;
diff --git a/core/modules/node/src/NodeForm.php b/core/modules/node/src/NodeForm.php
index 0ad34ad242..80462a5883 100644
--- a/core/modules/node/src/NodeForm.php
+++ b/core/modules/node/src/NodeForm.php
@@ -296,10 +296,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 4240473900..7981b7b4de 100644
--- a/core/modules/responsive_image/src/ResponsiveImageStyleForm.php
+++ b/core/modules/responsive_image/src/ResponsiveImageStyleForm.php
@@ -281,13 +281,10 @@ 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()]
-      );
+      $form_state->setRedirectUrl($responsive_image_style->toUrl('edit-form'));
     }
     else {
-      $form_state->setRedirectUrl($this->entity->urlInfo('collection'));
+      $form_state->setRedirectUrl($responsive_image_style->urlInfo('collection'));
     }
   }
 
diff --git a/core/modules/taxonomy/src/TermBreadcrumbBuilder.php b/core/modules/taxonomy/src/TermBreadcrumbBuilder.php
index 73588d1f04..75d02715ee 100644
--- a/core/modules/taxonomy/src/TermBreadcrumbBuilder.php
+++ b/core/modules/taxonomy/src/TermBreadcrumbBuilder.php
@@ -68,7 +68,7 @@ public function build(RouteMatchInterface $route_match) {
     foreach (array_reverse($parents) as $term) {
       $term = $this->entityManager->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 be15fac4ab..5300e3402e 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\user\Entity\User;
 use Drupal\user\Form\UserPasswordResetForm;
 use Drupal\user\UserDataInterface;
 use Drupal\user\UserInterface;
@@ -229,14 +230,14 @@ public function resetPassLogin($uid, $timestamp, $hash) {
       // check.
       $token = Crypt::randomBytesBase64(55);
       $_SESSION['pass_reset_' . $user->id()] = $token;
-      return $this->redirect(
-        'entity.user.edit_form',
-        ['user' => $user->id()],
-        [
-          'query' => ['pass-reset-token' => $token],
-          'absolute' => TRUE,
-        ]
-      );
+      $interface_langcode = \Drupal::languageManager()->getCurrentLanguage()->getId();
+      $user = $user->hasTranslation($interface_langcode) ? $user->getTranslation($interface_langcode) : $user;
+
+      $url = $user->toUrl('edit-form', [
+        'query' => ['pass-reset-token' => $token],
+        'absolute' => TRUE,
+      ]);
+      return $this->redirectToUrl($url);
     }
 
     drupal_set_message($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.'), 'error');
@@ -254,7 +255,12 @@ public function resetPassLogin($uid, $timestamp, $hash) {
    *   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();
+    $user = User::load($user);
+    $interface_langcode = \Drupal::languageManager()->getCurrentLanguage()->getId();
+    $user = $user->hasTranslation($interface_langcode) ? $user->getTranslation($interface_langcode) : $user;
+
+    return $this->redirectToUrl($user->toUrl());
   }
 
   /**
diff --git a/core/modules/user/src/EventSubscriber/AccessDeniedSubscriber.php b/core/modules/user/src/EventSubscriber/AccessDeniedSubscriber.php
index 6b738c8c3d..21b1947f78 100644
--- a/core/modules/user/src/EventSubscriber/AccessDeniedSubscriber.php
+++ b/core/modules/user/src/EventSubscriber/AccessDeniedSubscriber.php
@@ -2,10 +2,12 @@
 
 namespace Drupal\user\EventSubscriber;
 
+use Drupal\Core\Entity\EntityInterface;
 use Drupal\Core\Session\AccountInterface;
 use Drupal\Core\Routing\RouteMatch;
 use Drupal\Core\Routing\UrlGeneratorTrait;
 use Drupal\Core\Routing\UrlGeneratorInterface;
+use Drupal\user\Entity\User;
 use Symfony\Component\EventDispatcher\EventSubscriberInterface;
 use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
 use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
@@ -54,15 +56,22 @@ public function onException(GetResponseForExceptionEvent $event) {
     if ($exception instanceof AccessDeniedHttpException) {
       $route_name = RouteMatch::createFromRequest($event->getRequest())->getRouteName();
       if ($this->account->isAuthenticated()) {
+        $user = $this->account;
+        if (!$this->account instanceof EntityInterface) {
+          $user = User::load($this->account->id());
+          $interface_langcode = \Drupal::languageManager()->getCurrentLanguage()->getId();
+          $user = $user->hasTranslation($interface_langcode) ? $user->getTranslation($interface_langcode) : $user;
+        }
+
         switch ($route_name) {
           case 'user.login';
             // Redirect an authenticated user to the profile page.
-            $event->setResponse($this->redirect('entity.user.canonical', ['user' => $this->account->id()]));
+            $event->setResponse($this->redirectToUrl($user->toUrl()));
             break;
 
           case 'user.register';
             // Redirect an authenticated user to the profile form.
-            $event->setResponse($this->redirect('entity.user.edit_form', ['user' => $this->account->id()]));
+            $event->setResponse($this->redirectToUrl($user->toUrl('edit-form')));
             break;
         }
       }
diff --git a/core/modules/user/src/Form/UserLoginForm.php b/core/modules/user/src/Form/UserLoginForm.php
index 703e0ce96a..fb8a546f13 100644
--- a/core/modules/user/src/Form/UserLoginForm.php
+++ b/core/modules/user/src/Form/UserLoginForm.php
@@ -130,13 +130,12 @@ public function buildForm(array $form, FormStateInterface $form_state) {
    */
   public function submitForm(array &$form, FormStateInterface $form_state) {
     $account = $this->userStorage->load($form_state->get('uid'));
+    $interface_langcode = \Drupal::languageManager()->getCurrentLanguage()->getId();
+    $account = $account->hasTranslation($interface_langcode) ? $account->getTranslation($interface_langcode) : $account;
 
     // 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());
     }
     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 4f7dedd53c..19adb6b54c 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\EntityTypeManagerInterface;
+use Drupal\Core\Language\LanguageManagerInterface;
 use Drupal\Core\Session\AccountProxyInterface;
 use Drupal\Core\StringTranslation\StringTranslationTrait;
 use Drupal\Core\Url;
@@ -16,18 +19,28 @@ class ToolbarLinkBuilder {
   /**
    * 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\Language\LanguageManagerInterface $language_manager
+   *   The language manager.
    */
-  public function __construct(AccountProxyInterface $account) {
-    $this->account = $account;
+  public function __construct(AccountProxyInterface $account, EntityTypeManagerInterface $entity_type_manager, LanguageManagerInterface $language_manager) {
+    $this->currentUser = $account->getAccount();
+    if (!$this->currentUser instanceof ContentEntityInterface) {
+      $this->currentUser = $entity_type_manager->getStorage('user')
+        ->load($this->currentUser->id());
+    }
+    $interface_langcode = $language_manager->getCurrentLanguage()->getId();
+    $this->currentUser = $this->currentUser->hasTranslation($interface_langcode) ? $this->currentUser->getTranslation($interface_langcode) : $this->currentUser;
   }
 
   /**
@@ -47,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'),
         ],
@@ -79,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 cabe189e5a..e664407af0 100644
--- a/core/modules/user/user.module
+++ b/core/modules/user/user.module
@@ -526,9 +526,10 @@ function template_preprocess_username(&$variables) {
         ->toString();
     }
     else {
-      $variables['attributes']['href'] = Url::fromRoute('entity.user.canonical', [
-        'user' => $variables['uid'],
-      ])->toString();
+      $user = $account instanceof EntityInterface ? $account : User::load($account->id());
+      $interface_langcode = \Drupal::languageManager()->getCurrentLanguage()->getId();
+      $user = $user->hasTranslation($interface_langcode) ? $user->getTranslation($interface_langcode) : $user;
+      $variables['attributes']['href'] = $user->toUrl()->toString();
     }
   }
 }
diff --git a/core/modules/user/user.services.yml b/core/modules/user/user.services.yml
index 058daa03bb..f10447979e 100644
--- a/core/modules/user/user.services.yml
+++ b/core/modules/user/user.services.yml
@@ -70,4 +70,4 @@ services:
       - { name: 'context_provider' }
   user.toolbar_link_builder:
     class: Drupal\user\ToolbarLinkBuilder
-    arguments: ['@current_user']
+    arguments: ['@current_user', '@entity_type.manager', '@language_manager']
diff --git a/core/themes/seven/seven.theme b/core/themes/seven/seven.theme
index 2ad947c80b..4808484dab 100644
--- a/core/themes/seven/seven.theme
+++ b/core/themes/seven/seven.theme
@@ -58,10 +58,11 @@ function seven_preprocess_menu_local_task(&$variables) {
  */
 function seven_preprocess_node_add_list(&$variables) {
   if (!empty($variables['content'])) {
+    $default_language = \Drupal::languageManager()->getDefaultLanguage();
     /** @var \Drupal\node\NodeTypeInterface $type */
     foreach ($variables['content'] as $type) {
       $variables['types'][$type->id()]['label'] = $type->label();
-      $variables['types'][$type->id()]['url'] = \Drupal::url('node.add', ['node_type' => $type->id()]);
+      $variables['types'][$type->id()]['url'] = \Drupal::url('node.add', ['node_type' => $type->id()], ['language' => $default_language]);
     }
   }
 }
