diff --git a/entity.test b/entity.test index 3d667c1..10fcf9a 100644 --- a/entity.test +++ b/entity.test @@ -569,6 +569,12 @@ class EntityMetadataTestCase extends EntityWebTestCase { ) ); field_create_instance($this->instance); + + // Make the body field and the node type 'page' translatable. + $field = field_info_field('body'); + $field['translatable'] = TRUE; + field_update_field($field); + variable_set('language_content_type_page', 1); } /** @@ -658,20 +664,24 @@ class EntityMetadataTestCase extends EntityWebTestCase { $this->assertEqual($node->body[LANGUAGE_NONE][0]['value'], "The second body.", 'Update appears in the wrapped entity.'); $this->assert(isset($node->body[LANGUAGE_NONE][0]['safe_value']), 'Formatted text has been processed.'); - // Test translating the body. + // Test translating the body on an English node. locale_add_language('de'); + $body['en'][0] = array('value' => 'English body.', 'summary' => 'The body.'); + $node = $this->drupalCreateNode(array('body' => $body, 'language' => 'en', 'type' => 'page')); + $wrapper = entity_metadata_wrapper('node', $node); + $wrapper->language('de'); $languages = language_list(); $this->assertEqual($wrapper->getPropertyLanguage(), $languages['de'], 'Wrapper language has been set to German'); - $this->assertEqual($wrapper->body->value->value(), "

The second body.

\n", 'Language fallback on neutral language.'); + $this->assertEqual($wrapper->body->value->value(), "

English body.

\n", 'Language fallback on neutral language.'); // Set a German text using the wrapper. $wrapper->body->set(array('value' => "Der zweite Text.")); - $this->assertEqual($wrapper->body->value->value(), "

Der zweite Text.

\n", 'German body set and retrieved.'); - $wrapper->language(NULL); - $this->assertEqual($wrapper->body->value->value(), "

The second body.

\n", 'Language neutral text is still there.'); + + $wrapper->language(LANGUAGE_NONE); + $this->assertEqual($wrapper->body->value->value(), "

English body.

\n", 'Language neutral text is still there.'); // Test iterator. $type_info = entity_get_property_info('node'); diff --git a/modules/callbacks.inc b/modules/callbacks.inc index c7904ab..9ff9a6d 100644 --- a/modules/callbacks.inc +++ b/modules/callbacks.inc @@ -395,7 +395,8 @@ function entity_metadata_language_list() { function entity_metadata_field_property_get($entity, array $options, $name, $entity_type, $info) { $field = field_info_field($name); $columns = array_keys($field['columns']); - $langcode = field_language($entity_type, $entity, $name, isset($options['language']) ? $options['language']->language : NULL); + $langcode = isset($options['language']) ? $options['language']->language : LANGUAGE_NONE; + $langcode = entity_metadata_field_get_language($entity_type, $entity, $field, $langcode, TRUE); $values = array(); if (isset($entity->{$name}[$langcode])) { foreach ($entity->{$name}[$langcode] as $delta => $data) { @@ -416,11 +417,7 @@ function entity_metadata_field_property_get($entity, array $options, $name, $ent function entity_metadata_field_property_set($entity, $name, $value, $langcode, $entity_type) { $field = field_info_field($name); $columns = array_keys($field['columns']); - if (!isset($langcode)) { - // Try to figure out the default language used by the entity. - // @todo: Update once http://drupal.org/node/1260640 has been fixed. - $langcode = isset($entity->language) ? $entity->language : LANGUAGE_NONE; - } + $langcode = entity_metadata_field_get_language($entity_type, $entity, $field, $langcode); $values = $field['cardinality'] == 1 ? array($value) : (array) $value; $items = array(); @@ -457,8 +454,9 @@ function entity_metadata_field_verbatim_get($entity, array $options, $name, $ent // Set contextual info useful for getters of any child properties. $context['instance'] = field_info_instance($context['parent']->type(), $name, $context['parent']->getBundle()); $context['field'] = field_info_field($name); + $langcode = isset($options['language']) ? $options['language']->language : LANGUAGE_NONE; + $langcode = entity_metadata_field_get_language($entity_type, $entity, $context['field'], $langcode, TRUE); - $langcode = field_language($entity_type, $entity, $name, isset($options['language']) ? $options['language']->language : NULL); if ($context['field']['cardinality'] == 1) { return isset($entity->{$name}[$langcode][0]) ? $entity->{$name}[$langcode][0] : NULL; } @@ -469,13 +467,9 @@ function entity_metadata_field_verbatim_get($entity, array $options, $name, $ent * Writes the passed field items in the object. Useful as field level setter * to set the whole data structure at once. */ -function entity_metadata_field_verbatim_set($entity, $name, $items, $langcode) { +function entity_metadata_field_verbatim_set($entity, $name, $items, $langcode, $entity_type) { $field = field_info_field($name); - if (!isset($langcode)) { - // Try to figure out the default language used by the entity. - // @todo: Update once http://drupal.org/node/1260640 has been fixed. - $langcode = isset($entity->language) ? $entity->language : LANGUAGE_NONE; - } + $langcode = entity_metadata_field_get_language($entity_type, $entity, $entity_type, $langcode); $value = $field['cardinality'] == 1 ? array($items) : (array) $items; // Filter out any items set to NULL. $entity->{$name}[$langcode] = array_filter($value); @@ -486,6 +480,37 @@ function entity_metadata_field_verbatim_set($entity, $name, $items, $langcode) { } /** + * Helper for determining the field language to be used. + * + * Note that we cannot use field_language() as we are not about to display + * values, but generally read/write values. + * + * @param $fallback + * (optional) Whether to fall back to the entity default language, if no + * value is available for the given language code yet. + * + * @return + * The language code to use. + */ +function entity_metadata_field_get_language($entity_type, $entity, $field, $langcode = LANGUAGE_NONE, $fallback = FALSE) { + // Try to figure out the default language used by the entity. + // @todo: Update once http://drupal.org/node/1260640 has been fixed. + $default_langcode = isset($entity->language) ? $entity->language : LANGUAGE_NONE; + + // Determine the right language to use. + if ($default_langcode != LANGUAGE_NONE && field_is_translatable($entity_type, $field)) { + $langcode = ($langcode != LANGUAGE_NONE) ? field_valid_language($langcode, $default_langcode) : $default_langcode; + if (!isset($entity->{$field['field_name']}[$langcode]) && $fallback) { + $langcode = $default_langcode; + } + return $langcode; + } + else { + return LANGUAGE_NONE; + } +} + +/** * Callback for getting the sanitized text of 'text_formatted' properties. * This callback is used for both the 'value' and the 'summary'. */