diff --git a/feeds_ui/feeds_ui.admin.inc b/feeds_ui/feeds_ui.admin.inc
index a8e1bfb..a8c3163 100644
--- a/feeds_ui/feeds_ui.admin.inc
+++ b/feeds_ui/feeds_ui.admin.inc
@@ -560,6 +560,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'),
@@ -570,6 +579,7 @@ function feeds_ui_mapping_form($form, &$form_state, $importer) {
     '#value' => t('Save'),
     '#attributes' => array('class' => array('feeds-ui-hidden-submit')),
   );
+
   return $form;
 }
 
@@ -584,7 +594,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.'));
@@ -778,6 +790,7 @@ function theme_feeds_ui_mapping_form($variables) {
   $header = array(
     t('Source'),
     t('Target'),
+    t('Language'),
     t('Unique target'),
     '&nbsp;',
   );
@@ -787,9 +800,17 @@ 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($form['language'])) {
+        $language = isset($form['language']['#options'][$mapping['language']]) ? check_plain($form['language']['#options'][$mapping['language']]) : '<em>' . t('All languages') . '</em>';
+      }
+      else {
+        $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]),
       );
@@ -806,6 +827,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 19aa65d..981ba0e 100644
--- a/mappers/date.inc
+++ b/mappers/date.inc
@@ -46,7 +46,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 c6cf999..c27b493 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 1439ab0..aeff60f 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 5629da8..fa57a02 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 01d92f3..d7424ce 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
@@ -95,7 +98,7 @@ function taxonomy_feeds_set_target($source, $entity, $target, $terms) {
       $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) {
diff --git a/plugins/FeedsProcessor.inc b/plugins/FeedsProcessor.inc
index f283d97..8313fb3 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;
