diff --git a/core/modules/language/src/LanguageListBuilder.php b/core/modules/language/src/LanguageListBuilder.php index 24fd280151c0f8fe1bf86dd7690e7eb7f17f5cca..b8f64544040a6fa471a03768cad78794a694c1e7 100644 --- a/core/modules/language/src/LanguageListBuilder.php +++ b/core/modules/language/src/LanguageListBuilder.php @@ -7,6 +7,7 @@ namespace Drupal\language; +use Drupal\Core\Config\ConfigFactoryInterface; use Drupal\Core\Config\Entity\DraggableListBuilder; use Drupal\Core\Entity\EntityInterface; use Drupal\Core\Entity\EntityStorageInterface; @@ -35,6 +36,13 @@ class LanguageListBuilder extends DraggableListBuilder { */ protected $languageManager; + /** + * The configuration factory. + * + * @var \Drupal\Core\Config\ConfigFactoryInterface + */ + protected $configFactory; + /** * {@inheritdoc} */ @@ -42,7 +50,8 @@ public static function createInstance(ContainerInterface $container, EntityTypeI return new static( $entity_type, $container->get('entity.manager')->getStorage($entity_type->id()), - $container->get('language_manager') + $container->get('language_manager'), + $container->get('config.factory') ); } @@ -55,10 +64,13 @@ public static function createInstance(ContainerInterface $container, EntityTypeI * The entity storage controller class. * @param \Drupal\Core\Language\LanguageManagerInterface * The language manager. + * @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory + * The factory for configuration objects. */ - public function __construct(EntityTypeInterface $entity_type, EntityStorageInterface $storage, LanguageManagerInterface $language_manager) { + public function __construct(EntityTypeInterface $entity_type, EntityStorageInterface $storage, LanguageManagerInterface $language_manager, ConfigFactoryInterface $config_factory) { parent::__construct($entity_type, $storage); $this->languageManager = $language_manager; + $this->configFactory = $config_factory; } /** @@ -104,6 +116,10 @@ public function buildRow(EntityInterface $entity) { '#return_value' => $entity->id(), '#id' => 'edit-site-default-language-' . $entity->id(), ); + // Mark the right language as default in the form. + if ($entity->id() == $this->languageManager->getDefaultLanguage()->getId()) { + $row['default']['#default_value'] = $entity->id(); + } return $row + parent::buildRow($entity); } @@ -113,33 +129,33 @@ public function buildRow(EntityInterface $entity) { public function buildForm(array $form, FormStateInterface $form_state) { $form = parent::buildForm($form, $form_state); - // Mark the right language as default in the form. - $default = \Drupal::languageManager()->getDefaultLanguage(); - foreach (Element::children($form[$this->entitiesKey]) as $key) { - if ($key == $default->getId()) { - $form[$this->entitiesKey][$key]['default']['#default_value'] = $default->getId(); - } - } - $form[$this->entitiesKey]['#languages'] = $this->entities; $form['actions']['submit']['#value'] = t('Save configuration'); return $form; } + /** + * {@inheritdoc} + */ + public function validateForm(array &$form, FormStateInterface $form_state) { + if (!isset($this->entities[$form_state->getValue('site_default_language')])) { + $form_state->setErrorByName('site_default_language', $this->t('Selected default language no longer exists.')); + } + } + /** * {@inheritdoc} */ public function submitForm(array &$form, FormStateInterface $form_state) { parent::submitForm($form, $form_state); - // Save the default language. - foreach ($form_state->getValue($this->entitiesKey) as $id => $value) { - if (isset($this->entities[$id]) && ($id == $form_state->getValue('site_default_language'))) { - \Drupal::configFactory()->getEditable('system.site')->set('langcode', $form_state->getValue('site_default_language'))->save(); - } + // Save the default language if changed. + $new_id = $form_state->getValue('site_default_language'); + if ($new_id != $this->languageManager->getDefaultLanguage()->getId()) { + $this->configFactory->getEditable('system.site')->set('langcode', $new_id)->save(); + $this->languageManager->reset(); } - $this->languageManager->reset(); if ($this->languageManager instanceof ConfigurableLanguageManagerInterface) { $this->languageManager->updateLockedLanguageWeights(); } @@ -147,7 +163,7 @@ public function submitForm(array &$form, FormStateInterface $form_state) { drupal_set_message(t('Configuration saved.')); // Force the redirection to the page with the language we have just // selected as default. - $form_state->setRedirect('entity.configurable_language.collection', array(), array('language' => $this->entities[$form_state->getValue('site_default_language')])); + $form_state->setRedirectUrl($this->entities[$new_id]->urlInfo('collection', array('language' => $this->entities[$new_id]))); } } diff --git a/core/modules/language/src/Tests/LanguageListTest.php b/core/modules/language/src/Tests/LanguageListTest.php index 608485e99c6874be7546bdcb74ed80ad4368938c..e72a6b025e2c062fd13a5775eb2716c5dda1e149 100644 --- a/core/modules/language/src/Tests/LanguageListTest.php +++ b/core/modules/language/src/Tests/LanguageListTest.php @@ -179,6 +179,13 @@ function testLanguageList() { // Ensure we can't delete a locked language. $this->drupalGet('admin/config/regional/language/delete/und'); $this->assertResponse(403, 'Can not delete locked language'); + + // Ensure that NL cannot be set default when it's not available. + $this->drupalGet('admin/config/regional/language'); + $extra_values = '&site_default_language=nl'; + $this->drupalPostForm(NULL, array(), t('Save configuration'), array(), array(), NULL, $extra_values); + $this->assertText(t('Selected default language no longer exists.')); + $this->assertNoFieldChecked('edit-site-default-language-xx', 'The previous default language got deselected.'); } /**