diff --git a/core/modules/comment/comment.tokens.inc b/core/modules/comment/comment.tokens.inc
index a1b2cd7..4384c2e 100644
--- a/core/modules/comment/comment.tokens.inc
+++ b/core/modules/comment/comment.tokens.inc
@@ -7,6 +7,7 @@
 
 use Drupal\Component\Utility\String;
 use Drupal\Component\Utility\Xss;
+use Drupal\Core\Language\LanguageInterface;
 
 /**
  * Implements hook_token_info().
@@ -53,6 +54,10 @@ function comment_token_info() {
     'name' => t("Content"),
     'description' => t("The formatted content of the comment itself."),
   );
+  $comment['langcode'] = array(
+    'name' => t('Language code'),
+    'description' => t('The language code of the language the comment is written in.'),
+  );
   $comment['url'] = array(
     'name' => t("URL"),
     'description' => t("The URL of the comment."),
@@ -110,7 +115,7 @@ function comment_tokens($type, $tokens, array $data = array(), array $options =
     $langcode = $options['langcode'];
   }
   else {
-    $langcode = NULL;
+    $langcode = LanguageInterface::LANGCODE_DEFAULT;
   }
   $sanitize = !empty($options['sanitize']);
 
@@ -146,7 +151,17 @@ function comment_tokens($type, $tokens, array $data = array(), array $options =
           break;
 
         case 'body':
-          $replacements[$original] = $sanitize ? $comment->comment_body->processed : $comment->comment_body->value;
+          $translation = \Drupal::entityManager()->getTranslationFromContext($comment, $langcode, array('operation' => 'comment_tokens'));
+          if ($translation->hasField('body') && ($items = $translation->get('body')) && !$items->isEmpty()) {
+            $item = $items[0];
+          }
+          $output = $sanitize ? $item->processed : $item->value;
+
+          $replacements[$original] = $output;
+          break;
+
+        case 'langcode':
+          $replacements[$original] = $sanitize ? String::checkPlain($comment->language()->getId()) : $comment->language()->getId();
           break;
 
         // Comment related URLs.
