diff --git a/core/includes/bootstrap.inc b/core/includes/bootstrap.inc
index 0026cb0..a64dcac 100644
--- a/core/includes/bootstrap.inc
+++ b/core/includes/bootstrap.inc
@@ -2672,6 +2672,8 @@ function language_types() {
  *
  * @param $field
  *   (optional) The field to index the list with.
+ * @param $only_enabled
+ *   (optional) Whether return only enabled languages.
  *
  * @return
  *   An associative array, keyed on the values of $field.
@@ -2681,7 +2683,7 @@ function language_types() {
  *   - For all other values of $field, the array is only one level deep, and
  *     the array's values are language objects.
  */
-function language_list($field = 'language') {
+function language_list($field = 'language', $only_enabled = FALSE) {
   $languages = &drupal_static(__FUNCTION__);
   // Init language list
   if (!isset($languages)) {
@@ -2701,16 +2703,20 @@ function language_list($field = 'language') {
     }
   }
 
-  // Return the array indexed by the right field
+  // Produce an array indexed by the right field.
   if (!isset($languages[$field])) {
     $languages[$field] = array();
-    foreach ($languages['language'] as $lang) {
-      // Some values should be collected into an array
+    foreach ($languages['language'] as $language) {
+      if ($only_enabled && !$language->enabled) {
+        // Skip this language if not enabled.
+        continue;
+      }
+      // Some values should be collected into an array.
       if (in_array($field, array('enabled', 'weight'))) {
-        $languages[$field][$lang->$field][$lang->language] = $lang;
+        $languages[$field][$language->$field][$language->language] = $language;
       }
       else {
-        $languages[$field][$lang->$field] = $lang;
+        $languages[$field][$language->$field] = $language;
       }
     }
   }
diff --git a/core/modules/locale/locale.admin.inc b/core/modules/locale/locale.admin.inc
index 775ba1b..db0a5b7 100644
--- a/core/modules/locale/locale.admin.inc
+++ b/core/modules/locale/locale.admin.inc
@@ -292,40 +292,40 @@ function locale_language_providers_url_form($form, &$form_state) {
  * the prefix and domain are only blank for the default.
  */
 function locale_language_providers_url_form_validate($form, &$form_state) {
-  $languages = locale_language_list();
+  $languages = language_list('language', TRUE);
   $default = language_default();
 
   // Count repeated values for uniqueness check.
   $count = array_count_values($form_state['values']['prefix']);
-  foreach ($languages as $langcode => $name) {
+  foreach ($languages as $langcode => $language) {
     $value = $form_state['values']['prefix'][$langcode];
 
     if ($value === '') {
-      if ($default->language != $langcode && $form_state['values']['locale_language_negotiation_url_part'] == LOCALE_LANGUAGE_NEGOTIATION_URL_PREFIX) {
+      if (!$language->default && $form_state['values']['locale_language_negotiation_url_part'] == LOCALE_LANGUAGE_NEGOTIATION_URL_PREFIX) {
         // Validation error if the prefix is blank for a non-default language, and value is for selected negotiation type.
         form_error($form['prefix'][$langcode], t('The prefix may only be left blank for the default language.'));
       }
     }
     else if (isset($count[$value]) && $count[$value] > 1) {
       // Validation error if there are two languages with the same domain/prefix.
-      form_error($form['prefix'][$langcode], t('The prefix for %language, %value, is not unique.', array( '%language' => $name, '%value' => $value )));
+      form_error($form['prefix'][$langcode], t('The prefix for %language, %value, is not unique.', array('%language' => $language->name, '%value' => $value )));
     }
   }
 
   // Count repeated values for uniqueness check.
   $count = array_count_values($form_state['values']['domain']);
-  foreach ($languages as $langcode => $name) {
+  foreach ($languages as $langcode => $language) {
     $value = $form_state['values']['domain'][$langcode];
 
     if ($value === '') {
-      if ($default->language != $langcode && $form_state['values']['locale_language_negotiation_url_part'] == LOCALE_LANGUAGE_NEGOTIATION_URL_DOMAIN) {
+      if (!$language->default && $form_state['values']['locale_language_negotiation_url_part'] == LOCALE_LANGUAGE_NEGOTIATION_URL_DOMAIN) {
         // Validation error if the domain is blank for a non-default language, and value is for selected negotiation type.
         form_error($form['domain'][$langcode], t('The domain may only be left blank for the default language.'));
       }
     }
     else if (isset($count[$value]) && $count[$value] > 1) {
       // Validation error if there are two languages with the same domain/domain.
-      form_error($form['domain'][$langcode], t('The domain for %language, %value, is not unique.', array( '%language' => $name, '%value' => $value )));
+      form_error($form['domain'][$langcode], t('The domain for %language, %value, is not unique.', array('%language' => $language->name, '%value' => $value )));
     }
   }
 }
@@ -406,11 +406,11 @@ function locale_date_format_language_overview_page() {
   );
 
   // Get list of languages.
-  $languages = locale_language_list();
+  $languages = language_list('language', TRUE);
 
-  foreach ($languages as $langcode => $info) {
+  foreach ($languages as $langcode => $language) {
     $row = array();
-    $row[] = $languages[$langcode];
+    $row[] = $language->name;
     $row[] = l(t('edit'), 'admin/config/regional/date-time/locale/' . $langcode . '/edit');
     $row[] = l(t('reset'), 'admin/config/regional/date-time/locale/' . $langcode . '/reset');
     $rows[] = $row;
@@ -423,14 +423,13 @@ function locale_date_format_language_overview_page() {
  * Provide date localization configuration options to users.
  */
 function locale_date_format_form($form, &$form_state, $langcode) {
-  $languages = locale_language_list();
-  $language_name = $languages[$langcode];
+  $languages = language_list('language', TRUE);
 
   // Display the current language name.
   $form['language'] = array(
     '#type' => 'item',
     '#title' => t('Language'),
-    '#markup' => check_plain($language_name),
+    '#markup' => check_plain($languages[$langcode]->name),
     '#weight' => -10,
   );
   $form['langcode'] = array(
diff --git a/core/modules/locale/locale.bulk.inc b/core/modules/locale/locale.bulk.inc
index 0a4e779..86d7fdf 100644
--- a/core/modules/locale/locale.bulk.inc
+++ b/core/modules/locale/locale.bulk.inc
@@ -13,22 +13,25 @@ include_once DRUPAL_ROOT . '/core/includes/gettext.inc';
 function locale_translate_import_form($form, &$form_state) {
   // Get all languages, except English
   drupal_static_reset('language_list');
-  $names = locale_language_list('name');
-  if (!locale_translate_english()) {
-    unset($names['en']);
+  $languages = language_list('language', TRUE);
+  $language_options = array();
+  foreach ($languages as $langcode => $language) {
+    if ($langcode != 'en' || locale_translate_english()) {
+      $language_options[$langcode] = $language->name;
+    }
   }
 
   form_load_include($form_state, 'inc', 'language', 'language.admin');
-  if (!count($names)) {
-    $languages = language_admin_predefined_list();
-    $default = key($languages);
+  if (empty($language_options)) {
+    $language_options = language_admin_predefined_list();
+    $default = key($language_options);
   }
   else {
-    $languages = array(
-      t('Already added languages') => $names,
+    $default = key($language_options);
+    $language_options = array(
+      t('Already added languages') => $language_options,
       t('Languages not yet added') => language_admin_predefined_list()
     );
-    $default = key($names);
   }
 
   $form['import'] = array('#type' => 'fieldset',
@@ -41,7 +44,7 @@ function locale_translate_import_form($form, &$form_state) {
   );
   $form['import']['langcode'] = array('#type' => 'select',
     '#title' => t('Import into'),
-    '#options' => $languages,
+    '#options' => $language_options,
     '#default_value' => $default,
     '#description' => t('Choose the language you want to add strings into. If you choose a language which is not yet set up, it will be added.'),
   );
@@ -103,14 +106,18 @@ function locale_translate_import_form_submit($form, &$form_state) {
 function locale_translate_export_screen() {
   // Get all languages, except English
   drupal_static_reset('language_list');
-  $names = locale_language_list('name');
-  if (!locale_translate_english()) {
-    unset($names['en']);
+  $languages = language_list('language', TRUE);
+  $language_options = array();
+  foreach ($languages as $langcode => $language) {
+    if ($langcode != 'en' || locale_translate_english()) {
+      $language_options[$langcode] = $language->name;
+    }
   }
+
   $output = '';
   // Offer translation export if any language is set up.
-  if (count($names)) {
-    $elements = drupal_get_form('locale_translate_export_po_form', $names);
+  if (!empty($language_options)) {
+    $elements = drupal_get_form('locale_translate_export_po_form', $language_options);
     $output = drupal_render($elements);
   }
   $elements = drupal_get_form('locale_translate_export_pot_form');
diff --git a/core/modules/locale/locale.module b/core/modules/locale/locale.module
index 8520d95..3437753 100644
--- a/core/modules/locale/locale.module
+++ b/core/modules/locale/locale.module
@@ -296,11 +296,16 @@ function locale_form_alter(&$form, &$form_state, $form_id) {
  */
 function locale_form_node_form_alter(&$form, &$form_state) {
   if (isset($form['#node']->type) && locale_multilingual_node_type($form['#node']->type)) {
+    $languages = language_list('language', TRUE);
+    $language_options = array(LANGUAGE_NONE => t('Language neutral'));
+    foreach ($languages as $langcode => $language) {
+      $language_options[$langcode] = $language->name;
+    }
     $form['language'] = array(
       '#type' => 'select',
       '#title' => t('Language'),
       '#default_value' => (isset($form['#node']->language) ? $form['#node']->language : ''),
-      '#options' => array(LANGUAGE_NONE => t('Language neutral')) + locale_language_list('name'),
+      '#options' => $language_options,
     );
   }
   // Node type without language selector: assign the default for new nodes
@@ -757,37 +762,11 @@ function locale_get_plural($count, $langcode = NULL) {
 
 
 /**
- * Returns a language name
+ * Returns a language name.
  */
-function locale_language_name($lang) {
-  $list = &drupal_static(__FUNCTION__);
-  if (!isset($list)) {
-    $list = locale_language_list();
-  }
-  return ($lang && isset($list[$lang])) ? $list[$lang] : t('All');
-}
-
-/**
- * Returns array of language names
- *
- * @param $field
- *   Name of language object field.
- * @param $all
- *   Boolean to return all languages or only enabled ones
- */
-function locale_language_list($field = 'name', $all = FALSE) {
-  if ($all) {
-    $languages = language_list();
-  }
-  else {
-    $languages = language_list('enabled');
-    $languages = $languages[1];
-  }
-  $list = array();
-  foreach ($languages as $language) {
-    $list[$language->language] = $language->$field;
-  }
-  return $list;
+function locale_language_name($langcode) {
+  $languages = language_list('language', TRUE);
+  return ($langcode && isset($list[$langcode])) ? $list[$langcode]->name : t('All');
 }
 
 /**
diff --git a/core/modules/locale/locale.pages.inc b/core/modules/locale/locale.pages.inc
index ef843ec..1e4e620 100644
--- a/core/modules/locale/locale.pages.inc
+++ b/core/modules/locale/locale.pages.inc
@@ -152,9 +152,12 @@ function locale_translation_filters() {
 
   // Get all languages, except English
   drupal_static_reset('language_list');
-  $languages = locale_language_list('name');
-  if (!locale_translate_english()) {
-    unset($languages['en']);
+  $languages = language_list('language', TRUE);
+  $language_options = array();
+  foreach ($languages as $langcode => $language) {
+    if ($langcode != 'en' || locale_translate_english()) {
+      $language_options[$langcode] = $language->name;
+    }
   }
 
   $filters['string'] = array(
@@ -164,7 +167,7 @@ function locale_translation_filters() {
 
   $filters['language'] = array(
     'title' => t('Language'),
-    'options' => array_merge(array('all' => t('All languages'), LANGUAGE_SYSTEM => t('System (English)')), $languages),
+    'options' => array_merge(array('all' => t('All languages'), LANGUAGE_SYSTEM => t('System (English)')), $language_options),
   );
 
   $filters['translation'] = array(
diff --git a/core/modules/path/path.admin.inc b/core/modules/path/path.admin.inc
index c8a6963..f616ba6 100644
--- a/core/modules/path/path.admin.inc
+++ b/core/modules/path/path.admin.inc
@@ -132,10 +132,16 @@ function path_admin_form($form, &$form_state, $path = array('source' => '', 'ali
 
   // A hidden value unless locale module is enabled.
   if (module_exists('locale')) {
+    $languages = language_list('language', TRUE);
+    $language_options = array(LANGUAGE_NONE => t('All languages'));
+    foreach ($languages as $langcode => $language) {
+      $language_options[$langcode] = $language->name;
+    }
+
     $form['language'] = array(
       '#type' => 'select',
       '#title' => t('Language'),
-      '#options' => array(LANGUAGE_NONE => t('All languages')) + locale_language_list('name'),
+      '#options' => $language_options,
       '#default_value' => $path['language'],
       '#weight' => -10,
       '#description' => t('A path alias set for a specific language will always be used when displaying this page in that language, and takes precedence over path aliases set for <em>All languages</em>.'),
diff --git a/core/modules/translation/translation.module b/core/modules/translation/translation.module
index db60a08..649dec6 100644
--- a/core/modules/translation/translation.module
+++ b/core/modules/translation/translation.module
@@ -134,11 +134,10 @@ function translation_form_node_form_alter(&$form, &$form_state) {
     // we divide them in two option groups.
     if ($translator_widget) {
       $options = array($groups[1] => array(LANGUAGE_NONE => t('Language neutral')));
-      $language_list = locale_language_list('name', TRUE);
       foreach (array(1, 0) as $status) {
         $group = $groups[$status];
         foreach ($languages[$status] as $langcode => $language) {
-          $options[$group][$langcode] = $language_list[$langcode];
+          $options[$group][$langcode] = $language->name;
         }
       }
       $form['language']['#options'] = $options;
