diff options
Diffstat (limited to 'modules/field')
-rw-r--r-- | modules/field/field.info.inc | 2 | ||||
-rw-r--r-- | modules/field/field.multilingual.inc | 37 | ||||
-rw-r--r-- | modules/field/field.test | 5 |
3 files changed, 35 insertions, 9 deletions
diff --git a/modules/field/field.info.inc b/modules/field/field.info.inc index 5f929a822..4edf243c8 100644 --- a/modules/field/field.info.inc +++ b/modules/field/field.info.inc @@ -147,7 +147,7 @@ function _field_info_collate_types($reset = FALSE) { // Provide defaults. $entity_info += array( 'cacheable' => TRUE, - 'translation_handlers' => array(), + 'translation' => array(), 'bundles' => array(), ); $entity_info['object keys'] += array( diff --git a/modules/field/field.multilingual.inc b/modules/field/field.multilingual.inc index 9dafe23d6..a929439c6 100644 --- a/modules/field/field.multilingual.inc +++ b/modules/field/field.multilingual.inc @@ -7,6 +7,13 @@ */ /** + * Implement hook_multilingual_settings_changed(). + */ +function field_multilingual_settings_changed() { + cache_clear_all('field_info_types', 'cache_field'); +} + +/** * Collect the available languages for the given entity type and field. * * If an entity has a translation handler and the given field is translatable, @@ -31,12 +38,14 @@ function field_multilingual_available_languages($obj_type, $field, $suggested_la $field_name = $field['field_name']; if (!isset($field_languages[$field_name]) || !empty($suggested_languages)) { - $obj_info = field_info_fieldable_types($obj_type); - if (!empty($obj_info['translation_handlers']) && $field['translatable']) { - $available_languages = field_multilingual_content_languages(); + $translation_handlers = field_multilingual_check_translation_handlers($obj_type); + + if ($translation_handlers && $field['translatable']) { // The returned languages are a subset of the intersection of enabled ones // and suggested ones. + $available_languages = field_multilingual_content_languages(); $languages = !empty($suggested_languages) ? $available_languages = array_intersect($available_languages, $suggested_languages) : $available_languages; + foreach (module_implements('field_languages') as $module) { $function = $module . '_field_languages'; $function($obj_type, $field, $languages); @@ -71,20 +80,36 @@ function field_multilingual_content_languages() { return array_keys(language_list() + array(FIELD_LANGUAGE_NONE => NULL)); } - /** * Check if a module is registered as a translation handler for a given entity. * + * If no handler is passed, simply check if there is any translation handler + * enabled for the given entity type. + * * @param $obj_type * The type of the entity whose fields are to be translated. * @param $handler * The name of the handler to be checked. + * * @return * TRUE, if the handler is allowed to manage field translations. */ -function field_multilingual_check_translation_handler($obj_type, $handler) { +function field_multilingual_check_translation_handlers($obj_type, $handler = NULL) { $obj_info = field_info_fieldable_types($obj_type); - return isset($obj_info['translation_handlers'][$handler]); + + if (isset($handler)) { + return isset($obj_info['translation'][$handler]) && !empty($obj_info['translation'][$handler]); + } + elseif (isset($obj_info['translation'])) { + foreach ($obj_info['translation'] as $handler_info) { + // The translation handler must use a non-empty data structure. + if (!empty($handler_info)) { + return TRUE; + } + } + } + + return FALSE; } /** diff --git a/modules/field/field.test b/modules/field/field.test index c425585bb..999c74ffa 100644 --- a/modules/field/field.test +++ b/modules/field/field.test @@ -2272,11 +2272,12 @@ class FieldTranslationsTestCase extends FieldTestCase { */ function testFieldAvailableLanguages() { // Test 'translatable' fieldable info. + field_test_entity_info_translatable('test_entity', FALSE); $field = $this->field; $field['field_name'] .= '_untranslatable'; $langcode = language_default(); $suggested_languages = array($langcode->language); - $available_languages = field_multilingual_available_languages($this->obj_type, $field); + $available_languages = field_multilingual_available_languages($this->obj_type, $field, $suggested_languages); $this->assertTrue(count($available_languages) == 1 && $available_languages[0] === FIELD_LANGUAGE_NONE, t('Untranslatable entity: suggested language ignored.')); // Enable field translations for the entity. @@ -2411,7 +2412,7 @@ class FieldTranslationsTestCase extends FieldTestCase { // Enable field translations for nodes. field_test_entity_info_translatable('node', TRUE); $obj_info = field_info_fieldable_types('node'); - $this->assertTrue(count($obj_info['translation_handlers']), t('Nodes are translatable.')); + $this->assertTrue(count($obj_info['translation']), t('Nodes are translatable.')); // Prepare the field translations. $eid = $evid = 1; |