diff --git a/token.tokens.inc b/token.tokens.inc
index 3548d2d..c912891 100644
--- a/token.tokens.inc
+++ b/token.tokens.inc
@@ -8,6 +8,7 @@
 use Drupal\Core\Entity\ContentEntityInterface;
 use Drupal\Core\Entity\FieldableEntityInterface;
 use Drupal\Core\Entity\TypedData\EntityDataDefinitionInterface;
+use Drupal\Core\Language\LanguageInterface;
 use Drupal\Core\Render\BubbleableMetadata;
 use Drupal\Core\Render\Element;
 use Drupal\Component\Utility\Crypt;
@@ -274,6 +275,20 @@ function token_token_info() {
     'type' => 'menu-link',
   ];
 
+  // Language tokens.
+  $info['types']['language'] = [
+    'name' => t('Language'),
+    'description' => t('Tokens related to site language.'),
+  ];
+  $info['tokens']['language']['name'] = [
+    'name' => t('Language name'),
+    'description' => t('The language name.'),
+  ];
+  $info['tokens']['language']['langcode'] = [
+    'name' => t('Language code'),
+    'description' => t('The language code.'),
+  ];
+
   // Current page tokens.
   $info['types']['current-page'] = [
     'name' => t('Current page'),
@@ -297,6 +312,16 @@ function token_token_info() {
     'description' => t('The value of a specific query string field of the current page.'),
     'dynamic' => TRUE,
   ];
+  $info['tokens']['current-page']['language-interface'] = [
+    'name' => t('Language UI'),
+    'description' => t('The active user interface language.'),
+    'type' => 'language',
+  ];
+  $info['tokens']['current-page']['language-content'] = [
+    'name' => t('Language content'),
+    'description' => t('The active content language.'),
+    'type' => 'language',
+  ];
 
   // URL tokens.
   $info['types']['url'] = [
@@ -733,6 +758,34 @@ function token_tokens($type, array $tokens, array $data = [], array $options = [
 
   }
 
+  // Language tokens.
+  if ($type == 'language') {
+    $interface_language_tokens = \Drupal::token()->findWithPrefix($tokens, 'language-interface');
+    $language_interface = $language_manager->getCurrentLanguage(LanguageInterface::TYPE_INTERFACE);
+    foreach ($interface_language_tokens as $name => $original) {
+      switch ($name) {
+        case 'name':
+          $replacements[$original] = $language_interface->getName();
+          break;
+        case 'langcode':
+          $replacements[$original] = $language_interface->getId();
+          break;
+      }
+    }
+    $content_language_tokens = \Drupal::token()->findWithPrefix($tokens, 'language-content');
+    $language_content = $language_manager->getCurrentLanguage(LanguageInterface::TYPE_CONTENT);
+    foreach ($content_language_tokens as $name => $original) {
+      switch ($name) {
+        case 'name':
+          $replacements[$original] = $language_content->getName();
+          break;
+        case 'langcode':
+          $replacements[$original] = $language_content->getId();
+          break;
+      }
+    }
+  }
+
   // Current page tokens.
   if ($type == 'current-page') {
     $request = \Drupal::request();
