e071406d28d0cfade1511da1aa9f5d54ef170d50
[yaffs-website] / web / core / modules / language / src / EventSubscriber / ConfigSubscriber.php
1 <?php
2
3 namespace Drupal\language\EventSubscriber;
4
5 use Drupal\Core\Config\ConfigFactoryInterface;
6 use Drupal\Core\Language\Language;
7 use Drupal\Core\Language\LanguageDefault;
8 use Drupal\Core\Language\LanguageManagerInterface;
9 use Drupal\Core\Config\ConfigCrudEvent;
10 use Drupal\Core\Config\ConfigEvents;
11 use Drupal\language\ConfigurableLanguageManager;
12 use Drupal\language\HttpKernel\PathProcessorLanguage;
13 use Drupal\language\LanguageNegotiatorInterface;
14 use Symfony\Component\EventDispatcher\EventSubscriberInterface;
15
16 /**
17  * Deletes the container if default language has changed.
18  */
19 class ConfigSubscriber implements EventSubscriberInterface {
20
21   /**
22    * The language manager.
23    *
24    * @var \Drupal\Core\Language\LanguageManagerInterface
25    */
26   protected $languageManager;
27
28   /**
29    * The default language.
30    *
31    * @var \Drupal\Core\Language\LanguageDefault
32    */
33   protected $languageDefault;
34
35   /**
36    * The configuration factory.
37    *
38    * @var \Drupal\Core\Config\ConfigFactoryInterface
39    */
40   protected $configFactory;
41
42   /**
43    * The language negotiator.
44    *
45    * @var \Drupal\language\LanguageNegotiatorInterface
46    */
47   protected $languageNegotiator;
48
49   /**
50    * The language path processor.
51    *
52    * @var \Drupal\language\HttpKernel\PathProcessorLanguage
53    */
54   protected $pathProcessorLanguage;
55
56   /**
57    * Constructs a new class object.
58    *
59    * @param \Drupal\Core\Language\LanguageManagerInterface $language_manager
60    *   The language manager.
61    * @param \Drupal\Core\Language\LanguageDefault $language_default
62    *   The default language.
63    * @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory
64    *   The configuration factory.
65    * @param \Drupal\language\LanguageNegotiatorInterface $language_negotiator
66    *   The language negotiator.
67    */
68   public function __construct(LanguageManagerInterface $language_manager, LanguageDefault $language_default, ConfigFactoryInterface $config_factory, LanguageNegotiatorInterface $language_negotiator) {
69     $this->languageManager = $language_manager;
70     $this->languageDefault = $language_default;
71     $this->configFactory = $config_factory;
72     $this->languageNegotiator = $language_negotiator;
73   }
74
75   /**
76    * Causes the container to be rebuilt on the next request.
77    *
78    * This event subscriber assumes that the new default langcode and old default
79    * langcode are valid langcodes. If the schema definition of either
80    * system.site:default_langcode or language.negotiation::url.prefixes changes
81    * then this event must be changed to work with both the old and new schema
82    * definition so this event is update safe.
83    *
84    * @param ConfigCrudEvent $event
85    *   The configuration event.
86    */
87   public function onConfigSave(ConfigCrudEvent $event) {
88     $saved_config = $event->getConfig();
89     if ($saved_config->getName() == 'system.site' && $event->isChanged('default_langcode')) {
90       $new_default_langcode = $saved_config->get('default_langcode');
91       $default_language = $this->configFactory->get('language.entity.' . $new_default_langcode);
92       // During an import the language might not exist yet.
93       if (!$default_language->isNew()) {
94         $this->languageDefault->set(new Language($default_language->get()));
95         $this->languageManager->reset();
96
97         // Directly update language negotiation settings instead of calling
98         // language_negotiation_url_prefixes_update() to ensure that the code
99         // obeys the hook_update_N() restrictions.
100         $negotiation_config = $this->configFactory->getEditable('language.negotiation');
101         $negotiation_changed = FALSE;
102         $url_prefixes = $negotiation_config->get('url.prefixes');
103         $old_default_langcode = $saved_config->getOriginal('default_langcode');
104         if (empty($url_prefixes[$old_default_langcode])) {
105           $negotiation_config->set('url.prefixes.' . $old_default_langcode, $old_default_langcode);
106           $negotiation_changed = TRUE;
107         }
108         if (empty($url_prefixes[$new_default_langcode])) {
109           $negotiation_config->set('url.prefixes.' . $new_default_langcode, '');
110           $negotiation_changed = TRUE;
111         }
112         if ($negotiation_changed) {
113           $negotiation_config->save(TRUE);
114         }
115       }
116       // Trigger a container rebuild on the next request by invalidating it.
117       ConfigurableLanguageManager::rebuildServices();
118     }
119     elseif ($saved_config->getName() == 'language.types' && $event->isChanged('negotiation')) {
120       // If the negotiation configuration changed the language negotiator and
121       // the language path processor have to be reset so that they regenerate
122       // the method instances and also sort them accordingly to the new config.
123       $this->languageNegotiator->reset();
124       if (isset($this->pathProcessorLanguage)) {
125         $this->pathProcessorLanguage->reset();
126       }
127     }
128   }
129
130   /**
131    * Injects the language path processors on multilingual site configuration.
132    *
133    * @param \Drupal\language\HttpKernel\PathProcessorLanguage $path_processor_language
134    *   The language path processor.
135    */
136   public function setPathProcessorLanguage(PathProcessorLanguage $path_processor_language) {
137     $this->pathProcessorLanguage = $path_processor_language;
138   }
139
140   /**
141    * {@inheritdoc}
142    */
143   public static function getSubscribedEvents() {
144     $events[ConfigEvents::SAVE][] = ['onConfigSave', 0];
145     return $events;
146   }
147
148 }