diff --git a/core/modules/content_translation/content_translation.admin.inc b/core/modules/content_translation/content_translation.admin.inc
index 231dbc6..b3962ef 100644
--- a/core/modules/content_translation/content_translation.admin.inc
+++ b/core/modules/content_translation/content_translation.admin.inc
@@ -163,6 +163,16 @@ function _content_translation_preprocess_language_content_settings_table(&$varia
       array_unshift($rows[$bundle]['data'], $translatable);
 
       $rows[$bundle]['data'][1]['data']['#prefix'] = '<label for="' . $checkbox_id . '">';
+      $rows[$bundle]['data'][2]['data']['language']['language_show']['#description'] = t('Some default language options are hidden if the language selector is not shown.');
+      // Add CSS classes for easier JS selection.
+      $rows[$bundle]['data'][2]['data']['language']['language_show'] = array_merge_recursive($rows[$bundle]['data'][2]['data']['language']['language_show'], array('#attributes' => array(
+        'class' => array('language-show-checkbox')
+      )));
+      if (isset($rows[$bundle]['data'][2]['data']['language']['langcode'])) {
+        $rows[$bundle]['data'][2]['data']['language']['langcode'] = array_merge_recursive($rows[$bundle]['data'][2]['data']['language']['langcode'], array('#attributes' => array(
+          'class' => array('langcode-select')
+        )));
+      }
     }
     else {
       $translatable = array(
diff --git a/core/modules/content_translation/content_translation.admin.js b/core/modules/content_translation/content_translation.admin.js
index 109cb34..5cf4420 100644
--- a/core/modules/content_translation/content_translation.admin.js
+++ b/core/modules/content_translation/content_translation.admin.js
@@ -112,4 +112,77 @@
     }
   };
 
+  /**
+   * Removes unusable locked languages when not showing language selector.
+   *
+   * This behavior gets attached on the relevant entity edit form and the
+   * translation entity summary form.
+   */
+  Drupal.behaviors.lockedSelector = {
+    attach: function (context) {
+      var $context = $(context);
+
+      // Show a custom message for the changed language options.
+      Drupal.theme.tableOptionsChangedWarning = function () {
+        return '<div id="locked-language-warning" class="messages warning">' + Drupal.t('To use a locked language, with translation enabled, the language selector needs to be shown.') + '</div>';
+      };
+
+      // Declare the function in scope and reuse it later.
+      var filterAvailableLanguages = function ($languageSelector, $checkbox, $translatable) {
+        // Get the list of all languages and unlocked languages based on the
+        // original language selector options.
+        var $originalOptions = $languageSelector.data('originalOptions');
+        if (typeof($originalOptions) !== 'undefined') {
+          var $unlockedOptions = $originalOptions.filter(function (index) { return !/^- .* -$/.test(this.text); });
+          if ($translatable.size() == 0 || $translatable.is(':checked')) {
+            if ($checkbox.is(':checked')) {
+              $languageSelector.html($originalOptions).siblings('.description').find('.hidden-languages').hide();
+            }
+            else {
+              // Warn the user if a locked language was selected.
+              if (/^- .* -$/.test($languageSelector.find(':selected').text())) {
+                // Place only one warning block per page.
+                if (!$('#locked-language-warning').size()) {
+                  $(Drupal.theme('tableOptionsChangedWarning')).insertBefore($('.form-type-vertical-tabs')).hide().fadeIn('slow');
+                };
+              };
+              $languageSelector.html($unlockedOptions).siblings('.description').find('.hidden-languages').show();
+            }
+          }
+          else {
+            $languageSelector.html($originalOptions).siblings('.description').find('.hidden-languages').hide();
+          }
+        };
+      };
+
+      var processSelectors = function ($container) {
+        if ($container.size()) {
+          // Store the data about original options in the language selector
+          // Do it only once to avoid losing options
+          $container.once('locked-selector-options').each(function (index, element) {
+            $('.langcode-select', element).data('originalOptions', $('option', $('.langcode-select', element)));
+          });
+          $container.each(function (index, element) {
+            var $languageSelector = $('.langcode-select', element);
+            var $checkbox = $('.language-show-checkbox', element);
+
+            // Execute the function at the beginning and whenever the relevant
+            // checkbox is clicked.
+            $checkbox.on('click', function (e) {
+              filterAvailableLanguages($languageSelector, $checkbox, $translatable);
+            });
+            filterAvailableLanguages($languageSelector, $checkbox, $translatable);
+          });
+        };
+      };
+
+      // Determine the kind of form we are dealing with.
+      var $container = $('.bundle-settings .operations, .details-wrapper', context);
+      var $translatable = $('.translation-enabled-checkbox').once('locked-selector-options').on('click', function (e) {
+        processSelectors($container);
+      });
+      processSelectors($container);
+    }
+  };
+
 })(jQuery, Drupal, drupalSettings);
diff --git a/core/modules/content_translation/content_translation.module b/core/modules/content_translation/content_translation.module
index ffa5d89..50dd61c 100644
--- a/core/modules/content_translation/content_translation.module
+++ b/core/modules/content_translation/content_translation.module
@@ -647,6 +647,21 @@ function content_translation_language_configuration_element_process(array $eleme
     $key = $element['#name'];
     $form_state->set(['content_translation', 'key'], $key);
     $context = $form_state->get(['language', $key]);
+    $element['#attached']['library'][] = 'content_translation/drupal.content_translation.admin';
+    if (isset($element['langcode'])) {
+      // Add CSS classes for easier JS selection.
+      $element['language_show'] = array_merge_recursive($element['language_show'], array('#attributes' => array(
+        'class' => array('language-show-checkbox')
+      )));
+    }
+    if (isset($element['langcode'])) {
+      // Make the description only visible if the bundle is translatable and the
+      // language selector is shown.
+      $element['langcode']['#description'] .= '<span class="hidden-languages"> ' . t('Locked languages are hidden if the language selector is not shown and translation is enabled.') . '</span>';
+      $element['langcode'] = array_merge_recursive($element['langcode'], array('#attributes' => array(
+        'class' => array('langcode-select')
+      )));
+    }
 
     $element['content_translation'] = array(
       '#type' => 'checkbox',
@@ -656,6 +671,7 @@ function content_translation_language_configuration_element_process(array $eleme
       '#default_value' => $context['bundle'] ? content_translation_enabled($context['entity_type'], $context['bundle']) : FALSE,
       '#element_validate' => array('content_translation_language_configuration_element_validate'),
       '#prefix' => '<label>' . t('Translation') . '</label>',
+      '#attributes' => array('class' => array('translation-enabled-checkbox')),
     );
 
     $form['actions']['submit']['#submit'][] = 'content_translation_language_configuration_element_submit';
diff --git a/core/modules/content_translation/css/content_translation.admin.css b/core/modules/content_translation/css/content_translation.admin.css
index 72399d6..98997f2 100644
--- a/core/modules/content_translation/css/content_translation.admin.css
+++ b/core/modules/content_translation/css/content_translation.admin.css
@@ -31,3 +31,6 @@
 #language-content-settings-form table .operations {
   width: 75%;
 }
+.form-item-default-language-language-show .description {
+  opacity: 0;
+}
