diff --git a/includes/bootstrap.inc b/includes/bootstrap.inc
index 92e0c0f..ec63b06 100644
--- a/includes/bootstrap.inc
+++ b/includes/bootstrap.inc
@@ -1267,6 +1267,12 @@ function language_list($field = 'language', $reset = FALSE) {
       while ($row = db_fetch_object($result)) {
         $languages['language'][$row->language] = $row;
       }
+      // Users cannot uninstall the native English language. However, we allow
+      // it to be hidden from the installed languages. Therefore, at least one
+      // other language must be enabled then.
+      if (!$languages['language']['en']->enabled && !variable_get('language_native_enabled', TRUE)) {
+        unset($languages['language']['en']);
+      }
     }
     else {
       // No locale module, so use the default language only.
diff --git a/modules/node/node.admin.inc b/modules/node/node.admin.inc
index f20c12f..cdc56a8 100644
--- a/modules/node/node.admin.inc
+++ b/modules/node/node.admin.inc
@@ -484,13 +484,18 @@ function node_admin_nodes() {
   $nodes = array();
   while ($node = db_fetch_object($result)) {
     $nodes[$node->nid] = '';
-    $options = empty($node->language) ? array() : array('language' => $languages[$node->language]);
+    $options = !empty($node->language) && isset($languages[$node->language]) ? array('language' => $languages[$node->language]) : array();
     $form['title'][$node->nid] = array('#value' => l($node->title, 'node/'. $node->nid, $options) .' '. theme('mark', node_mark($node->nid, $node->changed)));
     $form['name'][$node->nid] =  array('#value' => check_plain(node_get_types('name', $node)));
     $form['username'][$node->nid] = array('#value' => theme('username', $node));
     $form['status'][$node->nid] =  array('#value' => ($node->status ? t('published') : t('not published')));
     if ($multilanguage) {
-      $form['language'][$node->nid] = array('#value' => empty($node->language) ? t('Language neutral') : t($languages[$node->language]->name));
+      if (empty($node->language) || isset($languages[$node->language])) {
+        $form['language'][$node->nid] = array('#value' => empty($node->language) ? t('Language neutral') : t($languages[$node->language]->name));
+      }
+      else {
+        $form['language'][$node->nid] = array('#value' => $node->language);
+      }
     }
     $form['operations'][$node->nid] = array('#value' => l(t('edit'), 'node/'. $node->nid .'/edit', array('query' => $destination)));
   }
diff --git a/modules/translation/translation.module b/modules/translation/translation.module
index a701e1a..f935242 100644
--- a/modules/translation/translation.module
+++ b/modules/translation/translation.module
@@ -101,6 +101,10 @@ function translation_form_alter(&$form, $form_state, $form_id) {
   }
   elseif (isset($form['#id']) && $form['#id'] == 'node-form' && translation_supported_type($form['#node']->type)) {
     $node = $form['#node'];
+    // Allow translators to enter content in disabled languages.
+    if (user_access('translate content')) {
+      $form['language']['#options'] = array('' => t('Language neutral')) + locale_language_list('name', TRUE);
+    }
     if (!empty($node->translation_source)) {
       // We are creating a translation. Add values and lock language field.
       $form['translation_source'] = array('#type' => 'value', '#value' => $node->translation_source);
@@ -160,8 +164,8 @@ function translation_link($type, $node = NULL, $teaser = FALSE) {
   if ($type == 'node' && ($node->tnid) && $translations = translation_node_get_translations($node->tnid)) {
     // Do not show link to the same node.
     unset($translations[$node->language]);
-    $languages = language_list();
-    foreach ($languages as $langcode => $language) {
+    $languages = language_list('enabled');
+    foreach ($languages[1] as $langcode => $language) {
       if (isset($translations[$langcode]) && $translations[$langcode]->status) {
         $links["node_translation_$langcode"] = array(
           'title' => $language->native,
