diff --git a/modules/field/field.multilingual.inc b/modules/field/field.multilingual.inc index 5373d970828439cc24628992fc959c1294269e91..e0cfec76c0f265848e862c0c2e309f6967f8a636 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 79ec3a1866daa18e75a266043990e8ebdf4c0e43..f3c1ae5f1dc9c380ef498842799cc920a9519951 100644 --- a/modules/locale/locale.admin.inc +++ b/modules/locale/locale.admin.inc @@ -461,37 +461,18 @@ 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 e327401a6e677f99738c0466e124995c49529b9e..96f5b778b8351d25bdd5fef8f0cd768aa7370060 100644 --- a/modules/locale/locale.api.php +++ b/modules/locale/locale.api.php @@ -154,19 +154,6 @@ function hook_language_negotiation_info_alter(array &$language_providers) { } } -/** - * Allow modules to react to language settings changes. - * - * Every module needing to act when the number of enabled languages changes - * should implement this. This is an "internal" hook and should not be invoked - * elsewhere. The typical implementation would trigger some kind of rebuilding, - * this way system components could properly react to the change of the enabled - * languages number. - */ -function hook_multilingual_settings_changed() { - field_info_cache_clear(); -} - /** * Perform alterations on the language fallback candidates. * @@ -178,6 +165,20 @@ function hook_language_fallback_candidates_alter(array &$fallback_candidates) { $fallback_candidates = array_reverse($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 0c238be47bc346e64ca3e8045e70cfc8facef318..ba66999e146c225c6923c4f99d2c5e3e21cc616b 100644 --- a/modules/locale/locale.module +++ b/modules/locale/locale.module @@ -778,6 +778,51 @@ function locale_language_list($field = 'name', $all = FALSE) { return $list; } +/** + * 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(); + + // 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); + + // Clearing all locale cache from database + cache_clear_all('locale:' . $language->language, 'cache'); + + $variables = array('%locale' => $language->name); + watchdog('locale', 'The language %locale has been removed.', $variables); + return TRUE; + } + return FALSE; +} + /** * Implements hook_modules_installed(). */ diff --git a/modules/node/node.module b/modules/node/node.module index 20815df85d3f23936ac4824d087b04b888aadc16..13b8e4d60b571a3df5683aa0a0434b142dc7ce9f 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(); +}