diff --git a/core/modules/language/language.admin.inc b/core/modules/language/language.admin.inc index 45a523c..6518cee 100644 --- a/core/modules/language/language.admin.inc +++ b/core/modules/language/language.admin.inc @@ -593,6 +593,10 @@ function language_negotiation_configure_form_submit($form, &$form_state) { // Clear block definitions cache since the available blocks and their names // may have been changed based on the configurable types. if (module_exists('block')) { + // If there is an active language switcher for a language type that has been + // made not configurable, deactivate it first. + $non_configurable = array_keys(array_diff($configurable, array_filter($configurable))); + _language_disable_language_switcher($non_configurable); drupal_container()->get('plugin.manager.block')->clearCachedDefinitions(); } @@ -972,3 +976,21 @@ function language_content_settings_form_submit(array $form, array &$form_state) } drupal_set_message(t('Settings successfully updated.')); } + +/** + * Helper function to disable the language switcher blocks. + * + * @param $language_types + * Array containing all language types whose language switchers need to be + * disabled. + */ +function _language_disable_language_switcher($language_types) { + $blocks = _block_rehash(); + foreach ($language_types as $language_type) { + foreach ($blocks as $block) { + if (strpos($block->id, 'language_switcher_' . substr($language_type, 9)) !== FALSE) { + $block->delete(); + } + } + } +}