diff --git a/core/core.services.yml b/core/core.services.yml index 6abd05c..2712650 100644 --- a/core/core.services.yml +++ b/core/core.services.yml @@ -80,7 +80,7 @@ services: tags: - { name: persist } - { name: event_subscriber } - arguments: ['@config.storage', '@event_dispatcher', '@config.typed'] + arguments: ['@config.storage', '@event_dispatcher', '@config.typed', '@language_manager'] config.installer: class: Drupal\Core\Config\ConfigInstaller arguments: ['@config.factory', '@config.storage', '@config.typed', '@entity.manager', '@event_dispatcher'] diff --git a/core/includes/install.core.inc b/core/includes/install.core.inc index 5a46c8c..c228f29 100644 --- a/core/includes/install.core.inc +++ b/core/includes/install.core.inc @@ -385,14 +385,14 @@ function install_begin_request(&$install_state) { ->addArgument(new Reference('config.storage.schema')) ->addArgument(new Reference('cache.config')); - $container->register('config.factory', 'Drupal\Core\Config\ConfigFactory') - ->addArgument(new Reference('config.storage')) - ->addArgument(new Reference('event_dispatcher')) - ->addArgument(new Reference('config.typed')); - - // Register the 'language_manager' service. $container->register('language_manager', 'Drupal\Core\Language\LanguageManager'); + $container->register('config.factory', 'Drupal\Core\Config\ConfigFactory') + ->addArgument(new Reference('config.storage')) + ->addArgument(new Reference('event_dispatcher')) + ->addArgument(new Reference('config.typed')) + ->addArgument(new Reference('language_manager')); + // Register the translation services. install_register_translation_service($container); diff --git a/core/lib/Drupal/Core/Config/ConfigFactory.php b/core/lib/Drupal/Core/Config/ConfigFactory.php index 8aeb301..fdca4ed 100644 --- a/core/lib/Drupal/Core/Config/ConfigFactory.php +++ b/core/lib/Drupal/Core/Config/ConfigFactory.php @@ -8,6 +8,7 @@ namespace Drupal\Core\Config; use Drupal\Core\Language\Language; +use Drupal\Core\Language\LanguageManagerInterface; use Symfony\Component\EventDispatcher\EventDispatcher; use Symfony\Component\EventDispatcher\EventSubscriberInterface; @@ -74,6 +75,13 @@ class ConfigFactory implements EventSubscriberInterface { protected $typedConfigManager; /** + * The language manager. + * + * @var \Drupal\Core\Language\LanguageManagerInterface + */ + protected $languageManager; + + /** * Constructs the Config factory. * * @param \Drupal\Core\Config\StorageInterface $storage @@ -82,15 +90,18 @@ class ConfigFactory implements EventSubscriberInterface { * An event dispatcher instance to use for configuration events. * @param \Drupal\Core\Config\TypedConfigManager $typed_config * The typed configuration manager. + * @param \Drupal\Core\Language\LanguageManagerInterface $language_manager + * The language manager. * @param \Drupal\Core\Language\Language * (optional) The language for this configuration. The config factory will * use it to override configuration data if language overrides are * available. */ - public function __construct(StorageInterface $storage, EventDispatcher $event_dispatcher, TypedConfigManager $typed_config, Language $language = NULL) { + public function __construct(StorageInterface $storage, EventDispatcher $event_dispatcher, TypedConfigManager $typed_config, LanguageManagerInterface $language_manager, Language $language = NULL) { $this->storage = $storage; $this->eventDispatcher = $event_dispatcher; $this->typedConfigManager = $typed_config; + $this->languageManager = $language_manager; $this->language = $language; } @@ -144,8 +155,11 @@ public function get($name) { $this->cache[$cache_key] = new Config($name, $this->storage, $this->eventDispatcher, $this->typedConfigManager, $this->language); if ($this->canOverride($name)) { - // Get and apply any language overrides. - if ($this->language) { + // Language overrides are only applicable on multilingual environments + // and if the source file had a langcode which is different from the + // target language requested. + $langcode = $this->cache[$cache_key]->get('langcode'); + if (!empty($langcode) && $this->language && $this->language->id != $langcode && $this->languageManager->isMultilingual()) { $language_overrides = $this->storage->read($this->getLanguageConfigName($this->language->id, $name)); } else { @@ -202,7 +216,7 @@ public function loadMultiple(array $names) { $module_overrides = array(); $language_names = array(); - if ($this->useOverrides) { + if ($this->useOverrides && $this->languageManager->isMultilingual()) { // In order to make just one call to storage, add in language names. // Keep track of them separately, so we can get language override data // returned from storage and set it on new Config objects.