diff -u b/core/modules/language/language.module b/core/modules/language/language.module --- b/core/modules/language/language.module +++ b/core/modules/language/language.module @@ -431,15 +431,8 @@ $language_entity->direction = isset($language->direction) ? $language->direction : '0'; $language_entity->locked = !empty($language->locked); $language_entity->weight = isset($language->weight) ? $language->weight : 0; + $language_entity->setDefault(!empty($language->default)); $language_entity->save(); - - if (!empty($language->default)) { - // Update the config. Saving the configuration fires and event that causes - // the container to be rebuilt. - \Drupal::config('system.site')->set('langcode', $language->id)->save(); - \Drupal::service('language.default')->set($language); - } - $t_args = array('%language' => $language->name, '%langcode' => $language->id); if ($language->is_new) { watchdog('language', 'The %language (%langcode) language has been created.', $t_args); diff -u b/core/modules/language/lib/Drupal/language/Entity/Language.php b/core/modules/language/lib/Drupal/language/Entity/Language.php --- b/core/modules/language/lib/Drupal/language/Entity/Language.php +++ b/core/modules/language/lib/Drupal/language/Entity/Language.php @@ -7,6 +7,7 @@ namespace Drupal\language\Entity; +use Drupal\Core\Language\Language as LanguageObject; use Drupal\Core\Config\Entity\ConfigEntityBase; use Drupal\Core\Entity\EntityStorageInterface; use Drupal\language\ConfigurableLanguageManager; @@ -80,11 +81,32 @@ public $locked = FALSE; /** + * Default site language. + * + * This property is not saved to the language entity since there can be only + * one default language. It is saved to system.site:langcode and set on the + * container using the language.default service in + * \Drupal\language\Entity\Language::postSave(). + * + * @var bool + */ + protected $default = FALSE; + + /** * Used to detect when the site becomes multilingual. * * @var bool */ - protected $preSaveMultilingual; + protected $multilingual; + + /** + * Sets the default flag on the language entity. + * + * @param bool $default + */ + public function setDefault($default) { + $this->default = $default; + } /** * {@inheritdoc} @@ -107,6 +129,13 @@ public function postSave(EntityStorageInterface $storage, $update = TRUE) { parent::postSave($storage, $update); + if (!empty($this->default)) { + // Update the config. Saving the configuration fires and event that causes + // the container to be rebuilt. + \Drupal::config('system.site')->set('langcode', $this->id())->save(); + \Drupal::service('language.default')->set($this->toLanguageObject()); + } + $language_manager = \Drupal::languageManager(); $language_manager->reset(); if ($language_manager instanceof ConfigurableLanguageManagerInterface) { @@ -118,14 +147,31 @@ // flushed. language_negotiation_url_prefixes_update(); - // If after adding this language the site will become multilingual, we need - // to rebuild language services. - if (!$this->preSaveMultilingual && !$update) { + // If after adding this language the site will become multilingual, we need to + // rebuild language services. + if (!$this->multilingual && !$update) { ConfigurableLanguageManager::rebuildServices(); } } /** + * Converts the Language entity to a Language value object. + * + * @return \Drupal\Core\Language\Language + * The language configuration entity expressed as a Language value object. + */ + protected function toLanguageObject() { + return new LanguageObject(array( + 'id' => $this->id(), + 'name' => $this->label(), + 'direction' => $this->direction, + 'weight' => $this->weight, + 'locked' => $this->locked, + 'default' => $this->default, + )); + } + + /** * {@inheritdoc} * * @throws \RuntimeException