diff --git a/core/modules/ckeditor/ckeditor.libraries.yml b/core/modules/ckeditor/ckeditor.libraries.yml
index 5b937e8..a7a1bc8 100644
--- a/core/modules/ckeditor/ckeditor.libraries.yml
+++ b/core/modules/ckeditor/ckeditor.libraries.yml
@@ -20,6 +20,12 @@ drupal.ckeditor.plugins.drupalimagecaption:
   dependencies:
     - filter/caption
 
+drupal.ckeditor.plugins.language:
+  version: VERSION
+  css:
+    component:
+      css/plugins/language/ckeditor.language.css: {}
+
 drupal.ckeditor.admin:
   version: VERSION
   js:
diff --git a/core/modules/ckeditor/ckeditor.module b/core/modules/ckeditor/ckeditor.module
index 5cb8ef3..9559256 100644
--- a/core/modules/ckeditor/ckeditor.module
+++ b/core/modules/ckeditor/ckeditor.module
@@ -66,6 +66,12 @@ function ckeditor_ckeditor_css_alter(array &$css, Editor $editor) {
   if ($editor->getFilterFormat()->filters('filter_align')->status) {
     $css[] = drupal_get_path('module', 'ckeditor') . '/css/plugins/drupalimagecaption/ckeditor.drupalimagecaption.css';
   }
+
+  // @todo: This should only be loaded when the Language button is enabled;
+  //    the CKEditor text editor plugin should load this automatically,
+  //    CKEditor plugins that want to load additional CSS *IN* CKEditor
+  //    shouldn't have to implement hook_ckeditor_css_alter().
+  $css[] = drupal_get_path('module', 'ckeditor') . '/css/plugins/language/ckeditor.language.css';
 }
 
 /**
diff --git a/core/modules/ckeditor/css/plugins/language/ckeditor.language.css b/core/modules/ckeditor/css/plugins/language/ckeditor.language.css
new file mode 100644
index 0000000..b38c1dc
--- /dev/null
+++ b/core/modules/ckeditor/css/plugins/language/ckeditor.language.css
@@ -0,0 +1,12 @@
+/**
+ * @file
+ * Language: add styling for elements that have a language attribute.
+ */
+
+[lang] {
+  outline: 1px dotted gray;
+}
+
+html[lang] {
+  outline: none;
+}
diff --git a/core/modules/ckeditor/src/Plugin/CKEditorPlugin/Language.php b/core/modules/ckeditor/src/Plugin/CKEditorPlugin/Language.php
new file mode 100644
index 0000000..2327a2f
--- /dev/null
+++ b/core/modules/ckeditor/src/Plugin/CKEditorPlugin/Language.php
@@ -0,0 +1,88 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\ckeditor\Plugin\CKEditorPlugin\Language.
+ */
+
+namespace Drupal\ckeditor\Plugin\CKEditorPlugin;
+
+use Drupal\ckeditor\CKEditorPluginBase;
+use Drupal\ckeditor\CKEditorPluginConfigurableInterface;
+use Drupal\Component\Utility\NestedArray;
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Language\LanguageManager;
+use Drupal\Core\Language\LanguageInterface;
+use Drupal\editor\Entity\Editor;
+
+/**
+ * Defines the "language" plugin.
+ *
+ * @CKEditorPlugin(
+ *   id = "language",
+ *   label = @Translation("Set language")
+ * )
+ */
+class Language extends CKEditorPluginBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function isInternal() {
+    return TRUE;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getFile() {
+    // This plugin is already part of Drupal core's CKEditor build.
+    return FALSE;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getLibraries(Editor $editor) {
+    return array(
+      'ckeditor/drupal.ckeditor.plugins.language',
+    );
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getConfig(Editor $editor) {
+    $language_list = array();
+    $predefined_languages = LanguageManager::getStandardLanguageList();
+    foreach ($predefined_languages as $langcode => $language) {
+      $english_name = $language[0];
+      $direction = empty($language[2]) ? NULL : $language[2];
+      if ($direction === LanguageInterface::DIRECTION_RTL) {
+        $language_list[$english_name] = $langcode . ':' . $english_name . ':rtl';
+      }
+      else {
+        $language_list[$english_name] = $langcode . ':' . $english_name;
+      }
+    }
+    // Sort on full language name.
+    ksort($language_list);
+    $config = array(
+      'language_list' => array_values($language_list),
+    );
+    return $config;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getButtons() {
+    return array(
+      'Language' => array(
+        'label' => t('Set language button'),
+        'image_alternative' => '<a href="#" class="cke-icon-only cke_ltr" role="button" title="' . t('Set language') . '" aria-label="' . t('Set language') . '"><span class="cke_button_icon cke_button__language_icon">' . t('Set language') . '<span class="ckeditor-button-arrow"></span></span></a>',
+      ),
+    );
+  }
+
+}
