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