diff --git a/core/lib/Drupal/Core/PathProcessor/PathProcessorAlias.php b/core/lib/Drupal/Core/PathProcessor/PathProcessorAlias.php
index a067b3d..e5661df 100644
--- a/core/lib/Drupal/Core/PathProcessor/PathProcessorAlias.php
+++ b/core/lib/Drupal/Core/PathProcessor/PathProcessorAlias.php
@@ -32,7 +32,7 @@
    * {@inheritdoc}
    */
   public function processInbound($path, Request $request) {
-    $path = $this->aliasManager->getPathByAlias($path);
+    $path = $this->aliasManager->getPathByAlias($path, $request->getLocale());
     return $path;
   }
 
diff --git a/core/modules/language/src/Plugin/LanguageNegotiation/LanguageNegotiationUrl.php b/core/modules/language/src/Plugin/LanguageNegotiation/LanguageNegotiationUrl.php
index a1d4da4..b630af4 100644
--- a/core/modules/language/src/Plugin/LanguageNegotiation/LanguageNegotiationUrl.php
+++ b/core/modules/language/src/Plugin/LanguageNegotiation/LanguageNegotiationUrl.php
@@ -108,6 +108,7 @@
       if (isset($config['prefixes'][$language->getId()]) && $config['prefixes'][$language->getId()] == $prefix) {
         // Rebuild $path with the language removed.
         $path = '/' . implode('/', $parts);
+        $request->setLocale($prefix);
         break;
       }
     }
diff --git a/core/modules/link/src/Plugin/Field/FieldFormatter/LinkFormatter.php b/core/modules/link/src/Plugin/Field/FieldFormatter/LinkFormatter.php
index 7d2d0ee..ec7460c 100644
--- a/core/modules/link/src/Plugin/Field/FieldFormatter/LinkFormatter.php
+++ b/core/modules/link/src/Plugin/Field/FieldFormatter/LinkFormatter.php
@@ -177,6 +177,10 @@
     foreach ($items as $delta => $item) {
       // By default use the full URL as the link text.
       $url = $this->buildUrl($item);
+      if (!$item->getFieldDefinition()->get('translatable')) {
+        $item_language = \Drupal::languageManager()->getLanguage($item->getFieldDefinition()->get('langcode'));
+        $url->setOption('language', $item_language);
+      }
       $link_title = $url->toString();
 
       // If the title field value is available, use it for the link text.
diff --git a/core/tests/Drupal/Tests/Core/PathProcessor/PathProcessorAliasTest.php b/core/tests/Drupal/Tests/Core/PathProcessor/PathProcessorAliasTest.php
index 713a538..e218e72 100644
--- a/core/tests/Drupal/Tests/Core/PathProcessor/PathProcessorAliasTest.php
+++ b/core/tests/Drupal/Tests/Core/PathProcessor/PathProcessorAliasTest.php
@@ -42,9 +42,9 @@
     $this->aliasManager->expects($this->exactly(2))
       ->method('getPathByAlias')
       ->will($this->returnValueMap(array(
-        array('urlalias', NULL, 'internal-url'),
-        array('url', NULL, 'url'),
-      )));
+        array('urlalias', 'en', 'internal-url'),
+        array('url', 'en', 'url'),
+    )));
 
     $request = Request::create('/urlalias');
     $this->assertEquals('internal-url', $this->pathProcessor->processInbound('urlalias', $request));
diff --git a/core/tests/Drupal/Tests/Core/PathProcessor/PathProcessorTest.php b/core/tests/Drupal/Tests/Core/PathProcessor/PathProcessorTest.php
index 1134ecc..54063f3 100644
--- a/core/tests/Drupal/Tests/Core/PathProcessor/PathProcessorTest.php
+++ b/core/tests/Drupal/Tests/Core/PathProcessor/PathProcessorTest.php
@@ -98,12 +98,17 @@
       ->getMock();
 
     $system_path_map = array(
-      // Set up one proper alias that can be resolved to a system path.
-      array('/foo', NULL, '/user/1'),
+      // Set up one proper alias for each language that can be resolved to a
+      // system path.
+      array('/foo', 'en', '/user/1'),
+      array('/foo', 'fr', '/user/1'),
       // Passing in anything else should return the same string.
-      array('/fr/foo', NULL, '/fr/foo'),
-      array('/fr', NULL, '/fr'),
-      array('/user/login', NULL, '/user/login'),
+      array('/fr/foo', 'en', '/fr/foo'),
+      array('/fr/foo', 'fr', '/fr/foo'),
+      array('/fr', 'en', '/fr'),
+      array('/fr', 'fr', '/fr'),
+      array('/user/login', 'en', '/user/login'),
+      array('/user/login', 'fr', '/user/login'),
     );
 
     $alias_manager->expects($this->any())
