diff --git a/modules/field/field.multilingual.inc b/modules/field/field.multilingual.inc index 5373d97..e0cfec7 100644 --- a/modules/field/field.multilingual.inc +++ b/modules/field/field.multilingual.inc @@ -60,9 +60,9 @@ */ /** - * Implements hook_multilingual_settings_changed(). + * Implements hook_locale_language_delete(). */ -function field_multilingual_settings_changed() { +function field_locale_language_delete() { field_info_cache_clear(); } diff --git a/modules/locale/locale.admin.inc b/modules/locale/locale.admin.inc index 79ec3a1..309f58e 100644 --- a/modules/locale/locale.admin.inc +++ b/modules/locale/locale.admin.inc @@ -461,35 +461,17 @@ function locale_languages_delete_form($form, &$form_state, $langcode) { * Process language deletion submissions. */ function locale_languages_delete_form_submit($form, &$form_state) { + $langcode = $form_state['values']['langcode']; $languages = language_list(); - if (isset($languages[$form_state['values']['langcode']])) { - // Remove translations first. - db_delete('locales_target') - ->condition('language', $form_state['values']['langcode']) - ->execute(); - cache_clear_all('locale:' . $form_state['values']['langcode'], 'cache'); - // With no translations, this removes existing JavaScript translations file. - _locale_rebuild_js($form_state['values']['langcode']); - // Remove the language. - db_delete('languages') - ->condition('language', $form_state['values']['langcode']) - ->execute(); - db_update('node') - ->fields(array('language' => '')) - ->condition('language', $form_state['values']['langcode']) - ->execute(); - if ($languages[$form_state['values']['langcode']]->enabled) { - variable_set('language_count', variable_get('language_count', 1) - 1); - } - module_invoke_all('multilingual_settings_changed'); - $variables = array('%locale' => $languages[$form_state['values']['langcode']]->name); + $language = $languages[$langcode]; + + $success = locale_language_delete($langcode); + + if ($success) { + $variables = array('%locale' => $language->name); drupal_set_message(t('The language %locale has been removed.', $variables)); - watchdog('locale', 'The language %locale has been removed.', $variables); } - // Changing the language settings impacts the interface: - cache_clear_all('*', 'cache_page', TRUE); - $form_state['redirect'] = 'admin/config/regional/language'; return; } diff --git a/modules/locale/locale.api.php b/modules/locale/locale.api.php index e327401..b050ed8 100644 --- a/modules/locale/locale.api.php +++ b/modules/locale/locale.api.php @@ -179,5 +179,19 @@ function hook_language_fallback_candidates_alter(array &$fallback_candidates) { } /** + * Allow modules to react before the deletion of a language. + * + * @param $language + * The language object of the language that is about to be deleted. + */ +function hook_locale_language_delete($language) { + // On nodes with this language, unset the language + db_update('node') + ->fields(array('language' => '')) + ->condition('language', $language->language) + ->execute(); +} + +/** * @} End of "addtogroup hooks". */ diff --git a/modules/locale/locale.module b/modules/locale/locale.module index 0c238be..63f4b40 100644 --- a/modules/locale/locale.module +++ b/modules/locale/locale.module @@ -779,6 +779,50 @@ function locale_language_list($field = 'name', $all = FALSE) { } /** + * Delete a language. + * + * @param $langcode + * Language code of the language to be deleted. + * @return + * TRUE if language is successfully deleted. Otherwise FALSE. + */ +function locale_language_delete($langcode) { + $languages = language_list(); + if (isset($languages[$langcode])) { + $language = $languages[$langcode]; + + module_invoke_all('locale_language_delete', $language); + + // Remove translations first. + db_delete('locales_target') + ->condition('language', $language->language) + ->execute(); + + cache_clear_all('locale:' . $language->language, 'cache'); + + // Remove the language. + db_delete('languages') + ->condition('language', $language->language) + ->execute(); + + if ($language->enabled) { + variable_set('language_count', variable_get('language_count', 1) - 1); + } + + drupal_static_reset('language_list'); + _locale_invalidate_js($language->language); + + // Changing the language settings impacts the interface: + cache_clear_all('*', 'cache_page', TRUE); + + $variables = array('%locale' => $language->name); + watchdog('locale', 'The language %locale has been removed.', $variables); + return TRUE; + } + return FALSE; +} + +/** * Implements hook_modules_installed(). */ function locale_modules_installed($modules) { diff --git a/modules/node/node.module b/modules/node/node.module index 20815df..13b8e4d 100644 --- a/modules/node/node.module +++ b/modules/node/node.module @@ -3948,3 +3948,14 @@ function node_file_download_access($field, $entity_type, $entity) { return node_access('view', $entity); } } + +/** + * Implements hook_locale_language_delete(). + */ +function node_locale_language_delete($language) { + // On nodes with this language, unset the language + db_update('node') + ->fields(array('language' => '')) + ->condition('language', $language->language) + ->execute(); +}