summaryrefslogtreecommitdiff
path: root/modules/field
diff options
context:
space:
mode:
Diffstat (limited to 'modules/field')
-rw-r--r--modules/field/field.info.inc2
-rw-r--r--modules/field/field.multilingual.inc37
-rw-r--r--modules/field/field.test5
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;