diff --git a/feeds_ui/feeds_ui.admin.inc b/feeds_ui/feeds_ui.admin.inc
index 779b070..c143f5a 100644
--- a/feeds_ui/feeds_ui.admin.inc
+++ b/feeds_ui/feeds_ui.admin.inc
@@ -565,6 +565,15 @@ function feeds_ui_mapping_form($form, &$form_state, $importer) {
     '#type' => 'select',
     '#options' => array('' => t('Select a target')) + $target_options,
   );
+
+  if (module_exists('locale')) {
+    $form['language'] = array(
+      '#type' => 'select',
+      '#options' => array(LANGUAGE_NONE => t('All languages')) + locale_language_list('name'),
+      '#default_value' => LANGUAGE_NONE,
+    );
+  }
+
   $form['add'] = array(
     '#type' => 'submit',
     '#value' => t('Add'),
@@ -575,6 +584,7 @@ function feeds_ui_mapping_form($form, &$form_state, $importer) {
     '#value' => t('Save'),
     '#attributes' => array('class' => array('feeds-ui-hidden-submit')),
   );
+
   return $form;
 }
 
@@ -589,7 +599,9 @@ function feeds_ui_mapping_form_add_submit($form, &$form_state) {
       'source' => $form_state['values']['source'],
       'target' => $form_state['values']['target'],
       'unique' => FALSE,
+      'language' => isset($form_state['values']['language']) ? $form_state['values']['language'] : LANGUAGE_NONE,
     );
+    
     $importer->processor->addConfig(array('mappings' => $mappings));
     $importer->processor->save();
     drupal_set_message(t('Mapping has been added.'));
@@ -783,6 +795,7 @@ function theme_feeds_ui_mapping_form($variables) {
   $header = array(
     t('Source'),
     t('Target'),
+    t('Language'),
     t('Unique target'),
     '&nbsp;',
   );
@@ -792,9 +805,15 @@ function theme_feeds_ui_mapping_form($variables) {
       // Some parsers do not define source options.
       $source = isset($form['source']['#options'][$mapping['source']]) ? $form['source']['#options'][$mapping['source']] : $mapping['source'];
       $target = isset($form['target']['#options'][$mapping['target']]) ? check_plain($form['target']['#options'][$mapping['target']]) : '<em>' . t('Missing') . '</em>';
+      if (!isset($mapping['language'])) {
+        $mapping['language'] = LANGUAGE_NONE;
+      }
+      $language = isset($form['language']['#options'][$mapping['language']]) ? check_plain($form['language']['#options'][$mapping['language']]) : '<em>' . t('All languages') . '</em>';
+
       $rows[] = array(
         check_plain($source),
         $target,
+        $language,
         drupal_render($form['unique_flags'][$i]),
         drupal_render($form['remove_flags'][$i]),
       );
@@ -811,6 +830,7 @@ function theme_feeds_ui_mapping_form($variables) {
   $rows[] = array(
     drupal_render($form['source']),
     drupal_render($form['target']),
+    drupal_render($form['language']),
     '',
     drupal_render($form['add']),
   );
diff --git a/mappers/date.inc b/mappers/date.inc
index 6cc5bca..451ff93 100644
--- a/mappers/date.inc
+++ b/mappers/date.inc
@@ -45,7 +45,7 @@ function date_feeds_processor_targets_alter(&$targets, $entity_type, $bundle_nam
  *
  * @todo Support array of values for dates.
  */
-function date_feeds_set_target($source, $entity, $target, $feed_element) {
+function date_feeds_set_target($source, $entity, $target, $feed_element, $mapping) {
   list($field_name, $sub_field) = explode(':', $target, 2);
   if (!($feed_element instanceof FeedsDateTimeElement)) {
     if (is_array($feed_element)) {
diff --git a/mappers/field.inc b/mappers/field.inc
index 43d62c4..5e4581a 100644
--- a/mappers/field.inc
+++ b/mappers/field.inc
@@ -53,7 +53,7 @@ function field_feeds_processor_targets_alter(&$targets, $entity_type, $bundle_na
  *
  * Ensure that $value is a numeric to avoid database errors.
  */
-function field_feeds_set_target_numeric($source, $entity, $target, $value) {
+function field_feeds_set_target_numeric($source, $entity, $target, $value, $mapping) {
   if (!is_array($value)) {
     $value = array($value);
   }
@@ -62,17 +62,17 @@ function field_feeds_set_target_numeric($source, $entity, $target, $value) {
       unset($value[$k]);
     }
   }
-  _field_feeds_set_target($source, $entity, $target, $value, FALSE);
+  _field_feeds_set_target($source, $entity, $target, $value, $mapping, FALSE);
 }
 
 /**
  * Callback for mapping text fields.
  */
-function field_feeds_set_target_text($source, $entity, $target, $value) {
+function field_feeds_set_target_text($source, $entity, $target, $value, $mapping) {
   if (!is_array($value)) {
     $value = array($value);
   }
-  _field_feeds_set_target($source, $entity, $target, $value, TRUE);
+  _field_feeds_set_target($source, $entity, $target, $value, $mapping, TRUE);
 }
 
 /**
@@ -90,10 +90,12 @@ function field_feeds_set_target_text($source, $entity, $target, $value) {
  *   The target key on $entity to map to.
  * @param $value
  *   The value to map. MUST be an array.
+ * @param $mapping
+ *   Array of mapping settings for current value.
  * @param $input_format
  *   TRUE if an input format should be applied.
  */
-function _field_feeds_set_target($source, $entity, $target, $value, $input_format = FALSE) {
+function _field_feeds_set_target($source, $entity, $target, $value, $mapping, $input_format = FALSE) {
   if (empty($value)) {
     return;
   }
@@ -103,19 +105,22 @@ function _field_feeds_set_target($source, $entity, $target, $value, $input_forma
       $format = $source->importer->processor->config['input_format'];
     }
   }
-
+  
   $info = field_info_field($target);
 
+  // Set the language of the field depending on the mapping.
+  $language = isset($mapping['language']) ? $mapping['language'] : LANGUAGE_NONE;
+
   // Iterate over all values.
   $i = 0;
   $field = isset($entity->$target) ? $entity->$target : array();
   foreach ($value as $v) {
     if (!is_array($v) && !is_object($v)) {
-      $field['und'][$i]['value'] = $v;
+      $field[$language][$i]['value'] = $v;
     }
     if ($input_format) {
       if (isset($format)) {
-        $field['und'][$i]['format'] = $format;
+        $field[$language][$i]['format'] = $format;
       }
     }
     if ($info['cardinality'] == 1) {
diff --git a/mappers/file.inc b/mappers/file.inc
index 63c1e2d..ae8003b 100644
--- a/mappers/file.inc
+++ b/mappers/file.inc
@@ -36,7 +36,7 @@ function file_feeds_processor_targets_alter(&$targets, $entity_type, $bundle_nam
  * user has decided to map to and $value contains the value of the feed item
  * element the user has picked as a source.
  */
-function file_feeds_set_target($source, $entity, $target, $value) {
+function file_feeds_set_target($source, $entity, $target, $value, $mapping) {
   if (empty($value)) {
     return;
   }
@@ -60,6 +60,9 @@ function file_feeds_set_target($source, $entity, $target, $value) {
     return;
   }
 
+  // Set the language of the field depending on the mapping.
+  $language = isset($mapping['language']) ? $mapping['language'] : LANGUAGE_NONE;
+  
   // Determine file destination.
   // @todo This needs review and debugging.
   list($entity_id, $vid, $bundle_name) = entity_extract_ids($entity->feeds_item->entity_type, $entity);
@@ -76,8 +79,8 @@ function file_feeds_set_target($source, $entity, $target, $value) {
   $field = isset($entity->$target) ? $entity->$target : array();
   foreach ($value as $v) {
     if ($file = $v->getFile($destination)) {
-      $field['und'][$i] = (array)$file;
-      $field['und'][$i]['display'] = 1; // @todo: Figure out how to properly populate this field.
+      $field[$language][$i] = (array)$file;
+      $field[$language][$i]['display'] = 1; // @todo: Figure out how to properly populate this field.
       if ($info['cardinality'] == 1) {
         break;
       }
diff --git a/mappers/link.inc b/mappers/link.inc
index 029b795..02e290f 100644
--- a/mappers/link.inc
+++ b/mappers/link.inc
@@ -39,7 +39,7 @@ function link_feeds_processor_targets_alter(&$targets, $entity_type, $bundle_nam
  * user has decided to map to and $value contains the value of the feed item
  * element the user has picked as a source.
  */
-function link_feeds_set_target($source, $entity, $target, $value) {
+function link_feeds_set_target($source, $entity, $target, $value, $mapping) {
   if (empty($value)) {
     return;
   }
@@ -49,6 +49,9 @@ function link_feeds_set_target($source, $entity, $target, $value) {
     $value = array($value);
   }
 
+  // Set the language of the field depending on the mapping.
+  $language = isset($mapping['language']) ? $mapping['language'] : LANGUAGE_NONE;
+
   // Iterate over all values.
   $i = 0;
   $info = field_info_field($target);
@@ -57,15 +60,15 @@ function link_feeds_set_target($source, $entity, $target, $value) {
     if (!is_array($v) && !is_object($v)) {
       if (strstr($target, 'url')) {
         if (isset($entity->{$field_name}['und'][$i]['title'])) {
-          $field['und'][$i]['title'] = $entity->{$field_name}['und'][$i]['title'];
+          $field[$language][$i]['title'] = $entity->{$field_name}['und'][$i]['title'];
         }
-        $field['und'][$i]['url'] = $v;
+        $field[$language][$i]['url'] = $v;
       }
       elseif (strstr($target, 'title')) {
         if (isset($entity->{$field_name}['und'][$i]['url'])) {
-          $field['und'][$i]['url'] = $entity->{$field_name}['und'][$i]['url'];
+          $field[$language][$i]['url'] = $entity->{$field_name}['und'][$i]['url'];
         }
-        $field['und'][$i]['title'] = $v;
+        $field[$language][$i]['title'] = $v;
       }
     }
     if ($info['cardinality'] == 1) {
diff --git a/mappers/taxonomy.inc b/mappers/taxonomy.inc
index 90e4ef8..6f7a826 100644
--- a/mappers/taxonomy.inc
+++ b/mappers/taxonomy.inc
@@ -61,7 +61,7 @@ function taxonomy_feeds_processor_targets_alter(&$targets, $entity_type, $bundle
  *
  * @todo Do not create new terms for non-autotag fields.
  */
-function taxonomy_feeds_set_target($source, $entity, $target, $terms) {
+function taxonomy_feeds_set_target($source, $entity, $target, $terms, $mapping) {
   if (empty($terms)) {
     return;
   }
@@ -71,6 +71,9 @@ function taxonomy_feeds_set_target($source, $entity, $target, $terms) {
     $terms = array($terms);
   }
 
+  // Set the language of the field depending on the mapping.
+  $language = isset($mapping['language']) ? $mapping['language'] : LANGUAGE_NONE;
+
   $info = field_info_field($target);
 
   // See http://drupal.org/node/881530
@@ -92,10 +95,15 @@ function taxonomy_feeds_set_target($source, $entity, $target, $terms) {
       $tid = $term;
     }
     elseif (is_string($term)) {
-      $tid = taxonomy_term_check_term($term, $vocabulary->vid);
+      if (isset($vocabulary->i18n_mode) && $vocabulary->i18n_mode == I18N_MODE_TRANSLATE) {
+        $tid = taxonomy_term_check_term($term, $vocabulary->vid, $language);
+      }
+      else {
+        $tid = taxonomy_term_check_term($term, $vocabulary->vid);
+      }
     }
     if ($tid) {
-      $entity->{$target}['und'][$i]['tid'] = $tid;
+      $entity->{$target}[$language][$i]['tid'] = $tid;
     }
 
     if ($info['cardinality'] == 1) {
@@ -113,17 +121,22 @@ function taxonomy_feeds_set_target($source, $entity, $target, $terms) {
  *   A term name.
  * @param $vid
  *   A vocabulary id.
+ * @param $language
+ *   The language code for the term, if it needs to be taken into account for the check.
  *
  * @return
  *   A term id.
  */
-function taxonomy_term_check_term($name, $vid) {
+function taxonomy_term_check_term($name, $vid, $language = NULL) {
   $name = trim($name);
-  $term = taxonomy_term_lookup_term($name, $vid);
+  $term = taxonomy_term_lookup_term($name, $vid, $language);
   if (empty($term)) {
     $term = new stdClass();
     $term->name = $name;
     $term->vid = $vid;
+    if (isset($language)) {
+      $term->language = $language;
+    }
     taxonomy_term_save($term);
     return $term->tid;
   }
@@ -133,11 +146,14 @@ function taxonomy_term_check_term($name, $vid) {
 /**
  * Looks up a term, assumes SQL storage backend.
  */
-function taxonomy_term_lookup_term($name, $vid) {
-  return db_select('taxonomy_term_data', 'td')
+function taxonomy_term_lookup_term($name, $vid, $language = NULL) {
+  $qry = db_select('taxonomy_term_data', 'td')
     ->fields('td', array('tid', 'name'))
     ->condition('name', $name)
-    ->condition('vid', $vid)
-    ->execute()
+    ->condition('vid', $vid);
+  if (isset($language)) {
+    $qry->condition('language', $language);
+  }
+  return $qry->execute()
     ->fetchObject();
 }
diff --git a/plugins/FeedsProcessor.inc b/plugins/FeedsProcessor.inc
index 97b6269..9ba69a3 100644
--- a/plugins/FeedsProcessor.inc
+++ b/plugins/FeedsProcessor.inc
@@ -395,10 +395,10 @@ abstract class FeedsProcessor extends FeedsPlugin {
           isset($targets[$this->id][$mapping['target']]['callback']) &&
           function_exists($targets[$this->id][$mapping['target']]['callback'])) {
         $callback = $targets[$this->id][$mapping['target']]['callback'];
-        $callback($source, $target_item, $mapping['target'], $value);
+        $callback($source, $target_item, $mapping['target'], $value, $mapping);
       }
       else {
-        $this->setTargetElement($source, $target_item, $mapping['target'], $value);
+        $this->setTargetElement($source, $target_item, $mapping['target'], $value, $mapping);
       }
     }
     return $target_item;
