languageManager = $language_manager; $this->languageDefault = $language_default; $this->configFactory = $config_factory; $this->languageNegotiator = $language_negotiator; } /** * Causes the container to be rebuilt on the next request. * * This event subscriber assumes that the new default langcode and old default * langcode are valid langcodes. If the schema definition of either * system.site:default_langcode or language.negotiation::url.prefixes changes * then this event must be changed to work with both the old and new schema * definition so this event is update safe. * * @param \Drupal\Core\Config\ConfigCrudEvent $event * The configuration event. */ public function onConfigSave(ConfigCrudEvent $event) { $saved_config = $event->getConfig(); if ($saved_config->getName() == 'system.site' && $event->isChanged('default_langcode')) { $new_default_langcode = $saved_config->get('default_langcode'); $default_language = $this->configFactory->get('language.entity.' . $new_default_langcode); // During an import the language might not exist yet. if (!$default_language->isNew()) { $this->languageDefault->set(new Language($default_language->get())); $this->languageManager->reset(); // Directly update language negotiation settings instead of calling // language_negotiation_url_prefixes_update() to ensure that the code // obeys the hook_update_N() restrictions. $negotiation_config = $this->configFactory->getEditable('language.negotiation'); $negotiation_changed = FALSE; $url_prefixes = $negotiation_config->get('url.prefixes'); $old_default_langcode = $saved_config->getOriginal('default_langcode'); if (empty($url_prefixes[$old_default_langcode])) { $negotiation_config->set('url.prefixes.' . $old_default_langcode, $old_default_langcode); $negotiation_changed = TRUE; } if (empty($url_prefixes[$new_default_langcode])) { $negotiation_config->set('url.prefixes.' . $new_default_langcode, ''); $negotiation_changed = TRUE; } if ($negotiation_changed) { $negotiation_config->save(TRUE); } } // Trigger a container rebuild on the next request by invalidating it. ConfigurableLanguageManager::rebuildServices(); } elseif ($saved_config->getName() == 'language.types' && $event->isChanged('negotiation')) { // If the negotiation configuration changed the language negotiator and // the language path processor have to be reset so that they regenerate // the method instances and also sort them accordingly to the new config. $this->languageNegotiator->reset(); if (isset($this->pathProcessorLanguage)) { $this->pathProcessorLanguage->reset(); } } } /** * Injects the language path processors on multilingual site configuration. * * @param \Drupal\language\HttpKernel\PathProcessorLanguage $path_processor_language * The language path processor. */ public function setPathProcessorLanguage(PathProcessorLanguage $path_processor_language) { $this->pathProcessorLanguage = $path_processor_language; } /** * {@inheritdoc} */ public static function getSubscribedEvents() { $events[ConfigEvents::SAVE][] = ['onConfigSave', 0]; return $events; } }