3 namespace Drupal\language\Config;
5 use Drupal\Core\Cache\CacheableMetadata;
6 use Drupal\Core\Config\ConfigCollectionInfo;
7 use Drupal\Core\Config\ConfigCrudEvent;
8 use Drupal\Core\Config\ConfigFactoryOverrideBase;
9 use Drupal\Core\Config\ConfigRenameEvent;
10 use Drupal\Core\Config\StorageInterface;
11 use Drupal\Core\Config\TypedConfigManagerInterface;
12 use Drupal\Core\Language\LanguageDefault;
13 use Drupal\Core\Language\LanguageInterface;
14 use Symfony\Component\EventDispatcher\EventDispatcherInterface;
15 use Symfony\Component\EventDispatcher\EventSubscriberInterface;
18 * Provides language overrides for the configuration factory.
20 class LanguageConfigFactoryOverride extends ConfigFactoryOverrideBase implements LanguageConfigFactoryOverrideInterface, EventSubscriberInterface {
22 use LanguageConfigCollectionNameTrait;
25 * The configuration storage.
27 * Do not access this directly. Should be accessed through self::getStorage()
28 * so that the cache of storages per langcode is used.
30 * @var \Drupal\Core\Config\StorageInterface
32 protected $baseStorage;
35 * An array of configuration storages keyed by langcode.
37 * @var \Drupal\Core\Config\StorageInterface[]
42 * The typed config manager.
44 * @var \Drupal\Core\Config\TypedConfigManagerInterface
46 protected $typedConfigManager;
49 * An event dispatcher instance to use for configuration events.
51 * @var \Symfony\Component\EventDispatcher\EventDispatcherInterface
53 protected $eventDispatcher;
56 * The language object used to override configuration data.
58 * @var \Drupal\Core\Language\LanguageInterface
63 * Constructs the LanguageConfigFactoryOverride object.
65 * @param \Drupal\Core\Config\StorageInterface $storage
66 * The configuration storage engine.
67 * @param \Symfony\Component\EventDispatcher\EventDispatcherInterface $event_dispatcher
68 * An event dispatcher instance to use for configuration events.
69 * @param \Drupal\Core\Config\TypedConfigManagerInterface $typed_config
70 * The typed configuration manager.
71 * @param \Drupal\Core\Language\LanguageDefault $default_language
72 * The default language.
74 public function __construct(StorageInterface $storage, EventDispatcherInterface $event_dispatcher, TypedConfigManagerInterface $typed_config, LanguageDefault $default_language) {
75 $this->baseStorage = $storage;
76 $this->eventDispatcher = $event_dispatcher;
77 $this->typedConfigManager = $typed_config;
78 // Prior to negotiation the override language should be the default
80 $this->language = $default_language->get();
86 public function loadOverrides($names) {
87 if ($this->language) {
88 $storage = $this->getStorage($this->language->getId());
89 return $storage->readMultiple($names);
97 public function getOverride($langcode, $name) {
98 $storage = $this->getStorage($langcode);
99 $data = $storage->read($name);
101 $override = new LanguageConfigOverride(
104 $this->typedConfigManager,
105 $this->eventDispatcher
109 $override->initWithData($data);
117 public function getStorage($langcode) {
118 if (!isset($this->storages[$langcode])) {
119 $this->storages[$langcode] = $this->baseStorage->createCollection($this->createConfigCollectionName($langcode));
121 return $this->storages[$langcode];
127 public function getCacheSuffix() {
128 return $this->language ? $this->language->getId() : NULL;
134 public function getLanguage() {
135 return $this->language;
141 public function setLanguage(LanguageInterface $language = NULL) {
142 $this->language = $language;
149 public function setLanguageFromDefault(LanguageDefault $language_default = NULL) {
150 $this->language = $language_default ? $language_default->get() : NULL;
157 public function installLanguageOverrides($langcode) {
158 /** @var \Drupal\Core\Config\ConfigInstallerInterface $config_installer */
159 $config_installer = \Drupal::service('config.installer');
160 $config_installer->installCollectionDefaultConfig($this->createConfigCollectionName($langcode));
166 public function createConfigObject($name, $collection = StorageInterface::DEFAULT_COLLECTION) {
167 $langcode = $this->getLangcodeFromCollectionName($collection);
168 return $this->getOverride($langcode, $name);
174 public function addCollections(ConfigCollectionInfo $collection_info) {
175 foreach (\Drupal::languageManager()->getLanguages() as $language) {
176 $collection_info->addCollection($this->createConfigCollectionName($language->getId()), $this);
183 public function onConfigSave(ConfigCrudEvent $event) {
184 $config = $event->getConfig();
185 $name = $config->getName();
186 foreach (\Drupal::languageManager()->getLanguages() as $language) {
187 $config_translation = $this->getOverride($language->getId(), $name);
188 if (!$config_translation->isNew()) {
189 $this->filterOverride($config, $config_translation);
197 public function onConfigRename(ConfigRenameEvent $event) {
198 $config = $event->getConfig();
199 $name = $config->getName();
200 $old_name = $event->getOldName();
201 foreach (\Drupal::languageManager()->getLanguages() as $language) {
202 $config_translation = $this->getOverride($language->getId(), $old_name);
203 if (!$config_translation->isNew()) {
204 $saved_config = $config_translation->get();
205 $storage = $this->getStorage($language->getId());
206 $storage->write($name, $saved_config);
207 $config_translation->delete();
215 public function onConfigDelete(ConfigCrudEvent $event) {
216 $config = $event->getConfig();
217 $name = $config->getName();
218 foreach (\Drupal::languageManager()->getLanguages() as $language) {
219 $config_translation = $this->getOverride($language->getId(), $name);
220 if (!$config_translation->isNew()) {
221 $config_translation->delete();
229 public function getCacheableMetadata($name) {
230 $metadata = new CacheableMetadata();
231 if ($this->language) {
232 $metadata->setCacheContexts(['languages:language_interface']);