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