diff --git a/includes/callback_language_control.inc b/includes/callback_language_control.inc
index 233852c..3df7298 100644
--- a/includes/callback_language_control.inc
+++ b/includes/callback_language_control.inc
@@ -100,6 +100,9 @@ class SearchApiAlterLanguageControl extends SearchApiAbstractAlterCallback {
    * {@inheritdoc}
    */
   public function alterItems(array &$items) {
+    $default = language_default();
+    $languages = array_diff_key(language_list(), drupal_map_assoc(array($default->language)));
+
     foreach ($items as $i => &$item) {
       // Set item language, if a custom field was selected.
       if ($field = $this->options['lang_field']) {
@@ -114,9 +117,21 @@ class SearchApiAlterLanguageControl extends SearchApiAbstractAlterCallback {
           }
         }
       }
+
+      // Index the default language node for all languages missing translations.
+      if ($item->search_api_language == $default->language) {
+        $translations = $item->tnid ? translation_node_get_translations($item->tnid) : array();
+        $missing_translations = array_diff_key($languages, $translations);
+        $item->search_api_language = array_merge(array($item->search_api_language), array_keys($missing_translations));
+      }
+      else {
+        $item->search_api_language = array($item->search_api_language);
+      }
+
       // Filter out items according to language, if any were selected.
-      if ($languages = $this->options['languages']) {
-        if (empty($languages[$item->search_api_language])) {
+      if ($index_languages = $this->options['languages']) {
+        $item->search_api_language = array_diff_key($index_languages, $item->search_api_language);
+        if (empty($item->search_api_language)) {
           unset($items[$i]);
         }
       }
diff --git a/includes/index_entity.inc b/includes/index_entity.inc
index 9fc1f68..bb615ae 100644
--- a/includes/index_entity.inc
+++ b/includes/index_entity.inc
@@ -568,7 +568,7 @@ class SearchApiIndex extends Entity {
         'search_api_language' => array(
           'label' => t('Item language'),
           'description' => t("A field added by the search framework to let components determine an item's language. Is always indexed."),
-          'type' => 'token',
+          'type' => 'list<string>',
           'options list' => 'entity_metadata_language_list',
         ),
       );
diff --git a/search_api.admin.inc b/search_api.admin.inc
index 71cfafc..292f669 100644
--- a/search_api.admin.inc
+++ b/search_api.admin.inc
@@ -1914,7 +1914,7 @@ function search_api_admin_index_fields(array $form, array &$form_state, SearchAp
     }
     if ($key == 'search_api_language') {
       // Is treated specially to always index the language.
-      $form['fields'][$key]['type']['#default_value'] = 'string';
+      $form['fields'][$key]['type']['#default_value'] = 'list<string>';
       $form['fields'][$key]['type']['#disabled'] = TRUE;
       $form['fields'][$key]['boost']['#default_value'] = '1.0';
       $form['fields'][$key]['boost']['#disabled'] = TRUE;
diff --git a/search_api.install b/search_api.install
index 850b828..a881e12 100644
--- a/search_api.install
+++ b/search_api.install
@@ -324,7 +324,7 @@ function search_api_install() {
           'type' => 'integer',
         ),
         'search_api_language' => array(
-          'type' => 'string',
+          'type' => 'list<string>',
         ),
         'body:value' => array(
           'type' => 'text',
diff --git a/search_api.module b/search_api.module
index 7204764..8c28d68 100644
--- a/search_api.module
+++ b/search_api.module
@@ -857,6 +857,11 @@ function search_api_entity_insert($entity, $type) {
   if (isset($id)) {
     search_api_track_item_insert($type, array($id));
   }
+
+  // Re-index a nodes translation source.
+  if ($type == 'node' && $entity->tnid != 0) {
+    search_api_track_item_change($type, array($entity->tnid));
+  }
 }
 
 /**
diff --git a/search_api.test b/search_api.test
index 8988302..07c9566 100644
--- a/search_api.test
+++ b/search_api.test
@@ -842,7 +842,7 @@ class SearchApiUnitTest extends DrupalWebTestCase {
             'type' => 'string',
           ),
           'search_api_language' => array(
-            'type' => 'string',
+            'type' => 'list<string>',
           ),
         ),
       ),
@@ -921,7 +921,7 @@ class SearchApiUnitTest extends DrupalWebTestCase {
           'value' => $orig,
         ),
         'search_api_language' => array(
-          'type' => 'string',
+          'type' => 'list<string>',
           'original_type' => 'string',
           'value' => LANGUAGE_NONE,
         ),
@@ -1028,7 +1028,7 @@ class SearchApiUnitTest extends DrupalWebTestCase {
           'value' => $orig,
         ),
         'search_api_language' => array(
-          'type' => 'string',
+          'type' => 'list<string>',
           'original_type' => 'string',
           'value' => LANGUAGE_NONE,
         ),
@@ -1109,7 +1109,7 @@ END;
           'value' => $orig,
         ),
         'search_api_language' => array(
-          'type' => 'string',
+          'type' => 'list<string>',
           'original_type' => 'string',
           'value' => LANGUAGE_NONE,
         ),
