diff --git a/core/lib/Drupal/Core/Config/Context/ConfigContext.php b/core/lib/Drupal/Core/Config/Context/ConfigContext.php index ab2ac54..a5382fd 100644 --- a/core/lib/Drupal/Core/Config/Context/ConfigContext.php +++ b/core/lib/Drupal/Core/Config/Context/ConfigContext.php @@ -63,6 +63,8 @@ public function __construct(EventDispatcher $event_dispatcher) { * Implements \Drupal\Core\Config\Context\ContextInterface::init(). */ public function init() { + // Reset existing overrides and get a UUID for this context. + $this->overrides = array(); $this->setUuid(); // Notify event listeners that a configuration context has been created. $this->notify('context', NULL); diff --git a/core/modules/config/lib/Drupal/config/Tests/ConfigLocaleOverrideWebTest.php b/core/modules/config/lib/Drupal/config/Tests/ConfigLocaleOverrideWebTest.php new file mode 100644 index 0000000..9f9579d --- /dev/null +++ b/core/modules/config/lib/Drupal/config/Tests/ConfigLocaleOverrideWebTest.php @@ -0,0 +1,60 @@ + 'Locale overrides through the request', + 'description' => 'Tests locale overrides applied through the website.', + 'group' => 'Configuration', + ); + } + + function setUp() { + parent::setUp(); + } + + /** + * Tests translating the site name. + */ + function testSiteNameTranslation() { + $adminUser = $this->drupalCreateUser(array('administer site configuration', 'administer languages')); + $this->drupalLogin($adminUser); + + // Add French and make it the site default language. + $this->drupalPost('admin/config/regional/language/add', array('predefined_langcode' => 'fr'), t('Add language')); + + $this->drupalLogout(); + + // The home page in English should not have the override. + $this->drupalGet(''); + $this->assertNoText('French site name'); + + // During path resolution the system.site configuration object is used to + // determine the front page. This occurs before language negotiation causing + // the configuration factory to cache an object without the correct + // overrides. The config_test module includes a + // locale.config.fr.system.site.yml which overrides the site name to 'French + // site name' to test that the configuration factory is re-initialised + // language negotiation. Ensure that it applies when we access the French + // front page. + // @see \Drupal\Core\PathProcessor::processInbound() + $this->drupalGet('fr'); + $this->assertText('French site name'); + } + +} diff --git a/core/modules/config/tests/config_test/config/locale.config.fr.system.site.yml b/core/modules/config/tests/config_test/config/locale.config.fr.system.site.yml new file mode 100644 index 0000000..0e4081b --- /dev/null +++ b/core/modules/config/tests/config_test/config/locale.config.fr.system.site.yml @@ -0,0 +1 @@ +name: 'French site name' diff --git a/core/modules/locale/lib/Drupal/locale/LocaleConfigSubscriber.php b/core/modules/locale/lib/Drupal/locale/LocaleConfigSubscriber.php index 5a85399..3f0d99b 100644 --- a/core/modules/locale/lib/Drupal/locale/LocaleConfigSubscriber.php +++ b/core/modules/locale/lib/Drupal/locale/LocaleConfigSubscriber.php @@ -99,9 +99,11 @@ public function configLoad(ConfigEvent $event) { * Kernel event to respond to. */ public function onKernelRequestSetDefaultConfigContextLocale(GetResponseEvent $event) { - if ($language = $this->languageManager->getLanguage(LANGUAGE_TYPE_INTERFACE)) { - $this->defaultConfigContext->set('locale.language', $language); - } + // Re-initialize the default configuration context to ensure any cached + // configuration object are reset and can be translated. This will invoke + // the config context event which will retrieve the negotiated language + // from the language manager in configContext(). + $this->defaultConfigContext->init(); } /**