Handle possible entity language changes.
array $form: An associative array containing the structure of the form.
array $form_state: A reference to a keyed array containing the current state of the form.
protected function submitEntityLanguage(array $form, array &$form_state) {
// Update the form language as it might have changed.
if (isset($form_state['values']['langcode']) && $this
->isDefaultFormLangcode($form_state)) {
$form_state['langcode'] = $form_state['values']['langcode'];
}
$entity = $this
->getEntity($form_state);
$entity_type = $entity
->entityType();
if (field_has_translation_handler($entity_type)) {
$form_langcode = $this
->getFormLangcode($form_state);
// If we are editing the default language values, we use the submitted
// entity language as the new language for fields to handle any language
// change. Otherwise the current form language is the proper value, since
// in this case it is not supposed to change.
$current_langcode = $entity
->language()->langcode == $form_langcode ? $form_state['values']['langcode'] : $form_langcode;
foreach (field_info_instances($entity_type, $entity
->bundle()) as $instance) {
$field_name = $instance['field_name'];
$field = field_info_field($field_name);
$previous_langcode = $form[$field_name]['#language'];
// Handle a possible language change: new language values are inserted,
// previous ones are deleted.
if ($field['translatable'] && $previous_langcode != $current_langcode) {
$form_state['values'][$field_name][$current_langcode] = $form_state['values'][$field_name][$previous_langcode];
$form_state['values'][$field_name][$previous_langcode] = array();
}
}
}
}