diff --git a/modules/locale/locale.admin.inc b/modules/locale/locale.admin.inc
index 8a4e71f..2994961 100644
--- a/modules/locale/locale.admin.inc
+++ b/modules/locale/locale.admin.inc
@@ -460,35 +460,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 da8ad13..2462217 100644
--- a/modules/locale/locale.module
+++ b/modules/locale/locale.module
@@ -778,6 +778,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 1ecc093..ae5a061 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();
+}
