Mercurial > hg > isophonics-drupal-site
comparison 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 |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:4c8ae668cc8c |
---|---|
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 } |