diff --git a/core/modules/contextual/contextual.module b/core/modules/contextual/contextual.module
index b7e8ef2..875b34d 100644
--- a/core/modules/contextual/contextual.module
+++ b/core/modules/contextual/contextual.module
@@ -7,6 +7,7 @@
 
 use Drupal\Component\Serialization\Json;
 use Drupal\Component\Utility\UrlHelper;
+use Drupal\Core\Language\LanguageInterface;
 use Drupal\Core\Routing\RouteMatchInterface;
 
 /**
@@ -155,8 +156,10 @@ function contextual_contextual_links_view_alter(&$element, $items) {
  */
 function _contextual_links_to_id($contextual_links) {
   $ids = array();
+  $langcode = \Drupal::languageManager()->getCurrentLanguage()->getId();
   foreach ($contextual_links as $group => $args) {
     $route_parameters = UrlHelper::buildQuery($args['route_parameters']);
+    $args['metadata'][LanguageInterface::TYPE_INTERFACE] = $langcode;
     $metadata = UrlHelper::buildQuery((isset($args['metadata'])) ? $args['metadata'] : array());
     $ids[] = "{$group}:{$route_parameters}:{$metadata}";
   }
diff --git a/core/modules/contextual/src/Tests/ContextualDynamicContextTest.php b/core/modules/contextual/src/Tests/ContextualDynamicContextTest.php
index 20d55cd..9fab800 100644
--- a/core/modules/contextual/src/Tests/ContextualDynamicContextTest.php
+++ b/core/modules/contextual/src/Tests/ContextualDynamicContextTest.php
@@ -8,6 +8,7 @@
 namespace Drupal\contextual\Tests;
 
 use Drupal\Component\Serialization\Json;
+use Drupal\language\Entity\ConfigurableLanguage;
 use Drupal\simpletest\WebTestBase;
 use Drupal\Core\Template\Attribute;
 
@@ -45,7 +46,7 @@ class ContextualDynamicContextTest extends WebTestBase {
    *
    * @var array
    */
-  public static $modules = array('contextual', 'node', 'views', 'views_ui');
+  public static $modules = array('contextual', 'node', 'views', 'views_ui', 'language');
 
   protected function setUp() {
     parent::setUp();
@@ -53,6 +54,9 @@ protected function setUp() {
     $this->drupalCreateContentType(array('type' => 'page', 'name' => 'Basic page'));
     $this->drupalCreateContentType(array('type' => 'article', 'name' => 'Article'));
 
+    ConfigurableLanguage::createFromLangcode('it')->save();
+    $this->rebuildContainer();
+
     $this->editorUser = $this->drupalCreateUser(array('access content', 'access contextual links', 'edit any article content'));
     $this->authenticatedUser = $this->drupalCreateUser(array('access content', 'access contextual links'));
     $this->anonymousUser = $this->drupalCreateUser(array('access content'));
@@ -77,12 +81,12 @@ function testDifferentPermissions() {
 
     // Now, on the front page, all article nodes should have contextual links
     // placeholders, as should the view that contains them.
-    $ids = array(
-      'node:node=' . $node1->id() . ':changed=' . $node1->getChangedTime(),
-      'node:node=' . $node2->id() . ':changed=' . $node2->getChangedTime(),
-      'node:node=' . $node3->id() . ':changed=' . $node3->getChangedTime(),
-      'entity.view.edit_form:view=frontpage:location=page&name=frontpage&display_id=page_1',
-    );
+    $ids = [
+      'node:node=' . $node1->id() . ':changed=' . $node1->getChangedTime() . '&language_content=en&language_interface=en',
+      'node:node=' . $node2->id() . ':changed=' . $node2->getChangedTime() . '&language_content=en&language_interface=en',
+      'node:node=' . $node3->id() . ':changed=' . $node3->getChangedTime() . '&language_content=en&language_interface=en',
+      'entity.view.edit_form:view=frontpage:location=page&name=frontpage&display_id=page_1&language_interface=en',
+    ];
 
     // Editor user: can access contextual links and can edit articles.
     $this->drupalGet('node');
@@ -127,6 +131,12 @@ function testDifferentPermissions() {
     $this->assertResponse(403);
     $this->renderContextualLinks($ids, 'node');
     $this->assertResponse(403);
+
+    // Verify that node language is properly handled.
+    $node3->addTranslation('it')->save();
+    $id = 'node:node=' . $node3->id() . ':changed=' . $node3->getChangedTime() . '&language_content=it&language_interface=it';
+    $this->drupalGet('node', ['language' => ConfigurableLanguage::createFromLangcode('it')]);
+    $this->assertContextualLinkPlaceHolder($id);
   }
 
   /**
diff --git a/core/modules/contextual/src/Tests/ContextualUnitTest.php b/core/modules/contextual/src/Tests/ContextualUnitTest.php
index bd145f6..71e4c31 100644
--- a/core/modules/contextual/src/Tests/ContextualUnitTest.php
+++ b/core/modules/contextual/src/Tests/ContextualUnitTest.php
@@ -38,10 +38,10 @@ function _contextual_links_id_testcases() {
           'route_parameters' => array(
             'node' => '14031991',
           ),
-          'metadata' => array()
+          'metadata' => array('language_interface' => 'en'),
         ),
       ),
-      'id' => 'node:node=14031991:',
+      'id' => 'node:node=14031991:language_interface=en',
     );
 
     // Test branch conditions:
@@ -56,10 +56,10 @@ function _contextual_links_id_testcases() {
             'key' => 'baz',
             'qux',
           ),
-          'metadata' => array(),
+          'metadata' => array('language_interface' => 'en'),
         ),
       ),
-      'id' => 'foo:0=bar&key=baz&1=qux:',
+      'id' => 'foo:0=bar&key=baz&1=qux:language_interface=en',
     );
 
     // Test branch conditions:
@@ -75,10 +75,11 @@ function _contextual_links_id_testcases() {
           'metadata' => array(
             'location' => 'page',
             'display' => 'page_1',
+            'language_interface' => 'en',
           ),
         ),
       ),
-      'id' => 'views_ui_edit:view=frontpage:location=page&display=page_1',
+      'id' => 'views_ui_edit:view=frontpage:location=page&display=page_1&language_interface=en',
     );
 
     // Test branch conditions:
@@ -90,7 +91,7 @@ function _contextual_links_id_testcases() {
           'route_parameters' => array(
             'node' => '14031991',
           ),
-          'metadata' => array(),
+          'metadata' => array('language_interface' => 'en'),
         ),
         'foo' => array(
           'route_parameters' => array(
@@ -98,14 +99,14 @@ function _contextual_links_id_testcases() {
             'key' => 'baz',
             'qux',
           ),
-          'metadata' => array(),
+          'metadata' => array('language_interface' => 'en'),
         ),
         'edge' => array(
           'route_parameters' => array('20011988'),
-          'metadata' => array(),
+          'metadata' => array('language_interface' => 'en'),
         ),
       ),
-      'id' => 'node:node=14031991:|foo:0=bar&key=baz&1=qux:|edge:0=20011988:',
+      'id' => 'node:node=14031991:language_interface=en|foo:0=bar&key=baz&1=qux:language_interface=en|edge:0=20011988:language_interface=en',
     );
 
     return $tests;
@@ -130,4 +131,5 @@ function testContextualIdToLinks() {
       $this->assertIdentical(_contextual_id_to_links($test['id']), $test['links']);
     }
   }
+
 }
diff --git a/core/modules/node/src/NodeViewBuilder.php b/core/modules/node/src/NodeViewBuilder.php
index ef6d2d5..8642fea 100644
--- a/core/modules/node/src/NodeViewBuilder.php
+++ b/core/modules/node/src/NodeViewBuilder.php
@@ -10,6 +10,7 @@
 use Drupal\Core\Entity\Display\EntityViewDisplayInterface;
 use Drupal\Core\Entity\EntityInterface;
 use Drupal\Core\Entity\EntityViewBuilder;
+use Drupal\Core\Language\LanguageInterface;
 use Drupal\node\Entity\Node;
 use Drupal\user\Entity\User;
 
@@ -167,11 +168,15 @@ protected static function buildLinks(NodeInterface $entity, $view_mode) {
   protected function alterBuild(array &$build, EntityInterface $entity, EntityViewDisplayInterface $display, $view_mode, $langcode = NULL) {
     /** @var \Drupal\node\NodeInterface $entity */
     parent::alterBuild($build, $entity, $display, $view_mode, $langcode);
+
     if ($entity->id()) {
-      $build['#contextual_links']['node'] = array(
-        'route_parameters' =>array('node' => $entity->id()),
-        'metadata' => array('changed' => $entity->getChangedTime()),
-      );
+      $build['#contextual_links']['node'] = [
+        'route_parameters' => ['node' => $entity->id()],
+        'metadata' => [
+          'changed' => $entity->getChangedTime(),
+          LanguageInterface::TYPE_CONTENT => $entity->language()->getId(),
+        ],
+      ];
     }
   }
 
