diff --git a/includes/common.inc b/includes/common.inc index 6cdd22b..2513ee1 100644 --- a/includes/common.inc +++ b/includes/common.inc @@ -7657,6 +7657,37 @@ function entity_label($entity_type, $entity) { } /** + * Returns the language of an entity. + * + * @param $entity_type + * The entity type; e.g., 'node' or 'user'. + * @param $entity + * The entity for which to get the language. + * + * @return + * The entity language, or NULL if not found. + */ +function entity_language($entity_type, $entity) { + $info = entity_get_info($entity_type); + + // Invoke the callback to get the language. If there is no callback, try + // to get it from a property of the entity, otherwise NULL. + if (isset($info['language callback']) && function_exists($info['language callback'])) { + $langcode = $info['language callback']($entity_type, $entity); + } + elseif (!empty($info['entity keys']['language']) && isset($entity->{$info['entity keys']['language']})) { + $langcode = $entity->{$info['entity keys']['language']}; + } + else { + // @todo The right value for D8 should be LANGUAGE_NONE, we cannot use it + // here to preserve backward compatibility. + $langcode = NULL; + } + + return $langcode; +} + +/** * Helper function for attaching field API validation to entity forms. */ function entity_form_field_validate($entity_type, $form, &$form_state) { diff --git a/modules/locale/locale.module b/modules/locale/locale.module index 0788461..e3806af 100644 --- a/modules/locale/locale.module +++ b/modules/locale/locale.module @@ -395,7 +395,7 @@ function locale_form_node_form_alter(&$form, &$form_state) { function locale_field_node_form_submit($form, &$form_state) { if (field_has_translation_handler('node', 'locale')) { $node = (object) $form_state['values']; - $available_languages = field_content_languages(); + $current_language = entity_language('node', $node); list(, , $bundle) = entity_extract_ids('node', $node); foreach (field_info_instances('node', $bundle) as $instance) { @@ -405,8 +405,8 @@ function locale_field_node_form_submit($form, &$form_state) { // Handle a possible language change: new language values are inserted, // previous ones are deleted. - if ($field['translatable'] && $previous_language != $node->language) { - $form_state['values'][$field_name][$node->language] = $node->{$field_name}[$previous_language]; + if ($field['translatable'] && $previous_language != $current_language) { + $form_state['values'][$field_name][$current_language] = $node->{$field_name}[$previous_language]; $form_state['values'][$field_name][$previous_language] = array(); } } diff --git a/modules/node/node.pages.inc b/modules/node/node.pages.inc index 89a1593..31d396a 100644 --- a/modules/node/node.pages.inc +++ b/modules/node/node.pages.inc @@ -299,7 +299,7 @@ function node_form($form, &$form_state, $node) { } $form += array('#submit' => array()); - field_attach_form('node', $node, $form, $form_state, $node->language); + field_attach_form('node', $node, $form, $form_state, entity_language('node', $node)); return $form; } diff --git a/modules/path/path.module b/modules/path/path.module index 332287d..b9a7476 100644 --- a/modules/path/path.module +++ b/modules/path/path.module @@ -97,8 +97,9 @@ function path_form_node_form_alter(&$form, $form_state) { $path = array(); if (!empty($form['#node']->nid)) { $conditions = array('source' => 'node/' . $form['#node']->nid); - if ($form['#node']->language != LANGUAGE_NONE) { - $conditions['language'] = $form['#node']->language; + $langcode = entity_language('node', $form['#node']); + if ($langcode != LANGUAGE_NONE) { + $conditions['language'] = $langcode; } $path = path_load($conditions); if ($path === FALSE) { @@ -109,7 +110,7 @@ function path_form_node_form_alter(&$form, $form_state) { 'pid' => NULL, 'source' => isset($form['#node']->nid) ? 'node/' . $form['#node']->nid : NULL, 'alias' => '', - 'language' => isset($form['#node']->language) ? $form['#node']->language : LANGUAGE_NONE, + 'language' => isset($langcode) ? $langcode : LANGUAGE_NONE, ); $form['path'] = array( @@ -188,8 +189,9 @@ function path_node_insert($node) { // Only save a non-empty alias. if (!empty($path['alias'])) { // Ensure fields for programmatic executions. + $langcode = entity_language('node', $node); $path['source'] = 'node/' . $node->nid; - $path['language'] = isset($node->language) ? $node->language : LANGUAGE_NONE; + $path['language'] = isset($langcode) ? $langcode : LANGUAGE_NONE; path_save($path); } } @@ -206,13 +208,7 @@ function path_node_update($node) { if (!empty($path['pid']) && empty($path['alias'])) { path_delete($path['pid']); } - // Only save a non-empty alias. - if (!empty($path['alias'])) { - // Ensure fields for programmatic executions. - $path['source'] = 'node/' . $node->nid; - $path['language'] = isset($node->language) ? $node->language : LANGUAGE_NONE; - path_save($path); - } + path_node_insert($node); } }