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'),
' ',
);
@@ -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']]) : '' . t('Missing') . '';
+ if (isset($form['language'])) {
+ $language = isset($form['language']['#options'][$mapping['language']]) ? check_plain($form['language']['#options'][$mapping['language']]) : '' . t('All languages') . '';
+ }
+ else {
+ $language = '' . t('All languages') . '';
+ }
+
$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;