Mercurial > hg > isophonics-drupal-site
diff core/modules/language/src/EventSubscriber/ConfigSubscriber.php @ 0:4c8ae668cc8c
Initial import (non-working)
author | Chris Cannam |
---|---|
date | Wed, 29 Nov 2017 16:09:58 +0000 |
parents | |
children | 7a779792577d |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/core/modules/language/src/EventSubscriber/ConfigSubscriber.php Wed Nov 29 16:09:58 2017 +0000 @@ -0,0 +1,148 @@ +<?php + +namespace Drupal\language\EventSubscriber; + +use Drupal\Core\Config\ConfigFactoryInterface; +use Drupal\Core\Language\Language; +use Drupal\Core\Language\LanguageDefault; +use Drupal\Core\Language\LanguageManagerInterface; +use Drupal\Core\Config\ConfigCrudEvent; +use Drupal\Core\Config\ConfigEvents; +use Drupal\language\ConfigurableLanguageManager; +use Drupal\language\HttpKernel\PathProcessorLanguage; +use Drupal\language\LanguageNegotiatorInterface; +use Symfony\Component\EventDispatcher\EventSubscriberInterface; + +/** + * Deletes the container if default language has changed. + */ +class ConfigSubscriber implements EventSubscriberInterface { + + /** + * The language manager. + * + * @var \Drupal\Core\Language\LanguageManagerInterface + */ + protected $languageManager; + + /** + * The default language. + * + * @var \Drupal\Core\Language\LanguageDefault + */ + protected $languageDefault; + + /** + * The configuration factory. + * + * @var \Drupal\Core\Config\ConfigFactoryInterface + */ + protected $configFactory; + + /** + * The language negotiator. + * + * @var \Drupal\language\LanguageNegotiatorInterface + */ + protected $languageNegotiator; + + /** + * The language path processor. + * + * @var \Drupal\language\HttpKernel\PathProcessorLanguage + */ + protected $pathProcessorLanguage; + + /** + * Constructs a new class object. + * + * @param \Drupal\Core\Language\LanguageManagerInterface $language_manager + * The language manager. + * @param \Drupal\Core\Language\LanguageDefault $language_default + * The default language. + * @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory + * The configuration factory. + * @param \Drupal\language\LanguageNegotiatorInterface $language_negotiator + * The language negotiator. + */ + public function __construct(LanguageManagerInterface $language_manager, LanguageDefault $language_default, ConfigFactoryInterface $config_factory, LanguageNegotiatorInterface $language_negotiator) { + $this->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 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; + } + +}