diff --git a/core/modules/language/language.module b/core/modules/language/language.module index 91641dec56..88e3a6bd50 100644 --- a/core/modules/language/language.module +++ b/core/modules/language/language.module @@ -5,6 +5,7 @@ * Add language handling functionality to Drupal. */ +use Drupal\Core\Installer\InstallerKernel; use Drupal\Core\Url; use Drupal\Core\Access\AccessResult; use Drupal\Core\Entity\ContentEntityFormInterface; @@ -290,6 +291,10 @@ function language_negotiation_url_prefixes_update() { * Implements hook_modules_installed(). */ function language_modules_installed($modules) { + if (\Drupal::isConfigSyncing() || InstallerKernel::installationAttempted()) { + return; + } + if (!in_array('language', $modules)) { // Since newly (un)installed modules may change the default settings for // non-locked language types (e.g. content language), we need to resave the diff --git a/core/modules/language/tests/src/Functional/LanguageInstallerConfigTest.php b/core/modules/language/tests/src/Functional/LanguageInstallerConfigTest.php new file mode 100644 index 0000000000..ee9b61ec8d --- /dev/null +++ b/core/modules/language/tests/src/Functional/LanguageInstallerConfigTest.php @@ -0,0 +1,42 @@ +container->get('config.storage'); + $config = $this->config('language.types'); + + // The negotiation methods that have been removed should be disabled after + // purging if not avoided in language_modules_installed(). + $language_types_data = $storage->read('language.types'); + $this->assertTrue(isset($language_types_data['negotiation']['language_content']['enabled']['test_language_negotiation_method'])); + $this->assertTrue(isset($language_types_data['negotiation']['language_content']['enabled']['language-selected'])); + + $this->assertEquals(-10, $config->get('negotiation.language_content.enabled.test_language_negotiation_method')); + $this->assertEquals(12, $config->get('negotiation.language_content.enabled.language-selected')); + } + +} diff --git a/core/profiles/test_language_negotiation/config/install/language.types.yml b/core/profiles/test_language_negotiation/config/install/language.types.yml new file mode 100644 index 0000000000..9e411ba2c4 --- /dev/null +++ b/core/profiles/test_language_negotiation/config/install/language.types.yml @@ -0,0 +1,39 @@ +all: + - language_interface + - language_content + - language_url +configurable: + - language_interface + - language_content +negotiation: + language_content: + enabled: + test_language_negotiation_method: -10 + language-url: -8 + language-selected: 12 + method_weights: + test_language_negotiation_method: -10 + language-content-entity: -9 + language-url: -8 + language-session: -6 + language-user: -4 + language-browser: -2 + language-interface: 9 + language-selected: 12 + language_url: + enabled: + language-url: 0 + language-url-fallback: 1 + language_interface: + enabled: + language-user-admin: -20 + language-user: -19 + language-url: -18 + language-selected: -15 + method_weights: + language-user-admin: -20 + language-user: -19 + language-url: -18 + language-session: -17 + language-browser: -16 + language-selected: -15 diff --git a/core/profiles/test_language_negotiation/test_language_negotiation.info.yml b/core/profiles/test_language_negotiation/test_language_negotiation.info.yml new file mode 100644 index 0000000000..a83b1cfb43 --- /dev/null +++ b/core/profiles/test_language_negotiation/test_language_negotiation.info.yml @@ -0,0 +1,7 @@ +name: Testing language negotiation +type: profile +description: 'Minimal profile for running tests related the language negotiation.' +version: VERSION +hidden: true +install: + - drupal:language