diff --git a/core/modules/language/language.module b/core/modules/language/language.module index 4d82508..563ec82 100644 --- a/core/modules/language/language.module +++ b/core/modules/language/language.module @@ -436,96 +436,32 @@ function language_get_default_langcode($entity_type, $bundle) { /** * API function to add or update a language. * - * @param $language + * @param \Drupal\Core\Language\Language $language * Language object with properties corresponding to the 'language' * configuration properties. + * + * @return \Drupal\Core\Language\Language + * The saved language. + * + * @deprecated Use \Drupal::service('language.storage')->save() */ function language_save($language) { - $language_entity = entity_load('language_entity', $language->id); - if (!$language_entity) { - $language_entity = entity_create('language_entity', array( - 'id' => $language->id, - )); - } - $language->is_new = $language_entity->isNew(); - - // Assign language properties to language entity. - $language_entity->label = isset($language->name) ? $language->name : ''; - $language_entity->direction = isset($language->direction) ? $language->direction : '0'; - $language_entity->locked = !empty($language->locked); - $language_entity->weight = isset($language->weight) ? $language->weight : 0; - - // Save the record and inform others about the change. - $multilingual = \Drupal::languageManager()->isMultilingual(); - $language_entity->save(); - $t_args = array('%language' => $language->name, '%langcode' => $language->id); - if ($language->is_new) { - watchdog('language', 'The %language (%langcode) language has been created.', $t_args); - } - else { - watchdog('language', 'The %language (%langcode) language has been updated.', $t_args); - } - - 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); - } - - $language_manager = \Drupal::languageManager(); - $language_manager->reset(); - if ($language_manager instanceof ConfigurableLanguageManagerInterface) { - $language_manager->updateLockedLanguageWeights(); - } - - // Update URL Prefixes for all languages after the new default language is - // propagated and the language_list() cache is flushed. - language_negotiation_url_prefixes_update(); - - // If after adding this language the site will become multilingual, we need to - // rebuild language services. - if (!$multilingual && $language->is_new) { - ConfigurableLanguageManager::rebuildServices(); - } - - return $language; + return \Drupal::service('language.storage')->save($language); } /** * Delete a language. * - * @param $langcode + * @param string $langcode * Language code of the language to be deleted. * - * @return + * @return bool * TRUE if language is successfully deleted. Otherwise FALSE. + * + * @deprecated Use \Drupal::service('language.storage')->delete() */ function language_delete($langcode) { - $languages = language_list(Language::STATE_ALL); - if (isset($languages[$langcode]) && !$languages[$langcode]->locked) { - $language = $languages[$langcode]; - - // Remove the language. - entity_delete_multiple('language_entity', array($language->id)); - - $language_manager = \Drupal::languageManager(); - $language_manager->reset(); - if ($language_manager instanceof ConfigurableLanguageManagerInterface) { - $language_manager->updateLockedLanguageWeights(); - } - - // If after deleting this language the site will become monolingual, we need - // to rebuild language services. - if (!\Drupal::languageManager()->isMultilingual()) { - ConfigurableLanguageManager::rebuildServices(); - } - - $t_args = array('%language' => $language->name, '%langcode' => $language->id); - watchdog('language', 'The %language (%langcode) language has been removed.', $t_args); - return TRUE; - } - return FALSE; + return \Drupal::service('language.storage')->delete($langcode); } /** diff --git a/core/modules/language/language.services.yml b/core/modules/language/language.services.yml index fa4f4f3..79920c2 100644 --- a/core/modules/language/language.services.yml +++ b/core/modules/language/language.services.yml @@ -16,3 +16,6 @@ services: arguments: ['@config.storage', '@event_dispatcher', '@config.typed'] tags: - { name: config.factory.override, priority: -254 } + language.storage: + class: Drupal\language\LanguageStorage + arguments: ['@language_manager', '@config.factory', '@entity.manager', '@module_handler'] diff --git a/core/modules/language/lib/Drupal/language/LanguageStorage.php b/core/modules/language/lib/Drupal/language/LanguageStorage.php new file mode 100644 index 0000000..9fe2b14 --- /dev/null +++ b/core/modules/language/lib/Drupal/language/LanguageStorage.php @@ -0,0 +1,154 @@ +languageManager = $language_manager; + $this->configFactory = $config_factory; + $this->storageController = $entity_manager->getStorageController('language_entity'); + $this->moduleHandler = $module_handler; + } + + /** + * {@inheritdoc} + */ + public function save(Language $language) { + $language_entity = $this->storageController->load($language->id); + if (!$language_entity) { + $language_entity = $this->storageController->create(array( + 'id' => $language->id, + )); + } + $language->is_new = $language_entity->isNew(); + + // Let other modules modify $language before saved. + $this->moduleHandler->invokeAll('language_presave', array($language)); + + // Assign language properties to language entity. + $language_entity->label = isset($language->name) ? $language->name : ''; + $language_entity->direction = isset($language->direction) ? $language->direction : '0'; + $language_entity->locked = !empty($language->locked); + $language_entity->weight = isset($language->weight) ? $language->weight : 0; + + // Save the record and inform others about the change. + $multilingual = $this->languageManager->isMultilingual(); + $language_entity->save(); + $t_args = array('%language' => $language->name, '%langcode' => $language->id); + if ($language->is_new) { + $this->moduleHandler->invokeAll('language_insert', array($language)); + watchdog('language', 'The %language (%langcode) language has been created.', $t_args); + } + else { + $this->moduleHandler->invokeAll('language_update', array($language)); + watchdog('language', 'The %language (%langcode) language has been updated.', $t_args); + } + + if (!empty($language->default)) { + // Set the new version of this language as default in a variable. + variable_set('language_default', (array) $language); + } + + $this->languageManager->reset(); + if ($this->languageManager instanceof ConfigurableLanguageManagerInterface) { + $this->languageManager->updateLockedLanguageWeights(); + } + + // Update URL Prefixes for all languages after the new default language is + // propagated and the language_list() cache is flushed. + language_negotiation_url_prefixes_update(); + + // If after adding this language the site will become multilingual, we need + // to rebuild language services. + if (!$multilingual && $language->is_new) { + ConfigurableLanguageManager::rebuildServices(); + } + + return $language; + } + + /** + * {@inheritdoc} + */ + public function delete($langcode) { + $languages = $this->languageManager->getLanguages(Language::STATE_ALL); + if (isset($languages[$langcode]) && !$languages[$langcode]->locked) { + $language = $languages[$langcode]; + + $this->moduleHandler->invokeAll('language_delete', array($language)); + + // Remove the language. + $this->storageController->delete(array($this->storageController->load($language->id))); + + $this->languageManager->reset(); + if ($this->languageManager instanceof ConfigurableLanguageManagerInterface) { + $this->languageManager->updateLockedLanguageWeights(); + } + + // If after deleting this language the site will become monolingual, we + // need to rebuild language services. + if (!$this->languageManager->isMultilingual()) { + ConfigurableLanguageManager::rebuildServices(); + } + + $t_args = array('%language' => $language->name, '%langcode' => $language->id); + watchdog('language', 'The %language (%langcode) language has been removed.', $t_args); + return TRUE; + } + return FALSE; + } + +} diff --git a/core/modules/language/lib/Drupal/language/LanguageStorageInterface.php b/core/modules/language/lib/Drupal/language/LanguageStorageInterface.php new file mode 100644 index 0000000..59ab986 --- /dev/null +++ b/core/modules/language/lib/Drupal/language/LanguageStorageInterface.php @@ -0,0 +1,38 @@ +