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