Tests display language logic for translatable fields.
function testFieldDisplayLanguage() {
$field_name = drupal_strtolower($this
->randomName() . '_field_name');
$entity_type = 'test_entity';
// We need an additional field here to properly test display language
// suggestions.
$field = array(
'field_name' => $field_name,
'type' => 'test_field',
'cardinality' => 2,
'translatable' => TRUE,
);
field_create_field($field);
$instance = array(
'field_name' => $field['field_name'],
'entity_type' => $entity_type,
'bundle' => 'test_bundle',
);
field_create_instance($instance);
$entity = field_test_create_entity(1, 1, $this->instance['bundle']);
$instances = field_info_instances($entity_type, $this->instance['bundle']);
$enabled_langcodes = field_content_languages();
$langcodes = array();
// This array is used to store, for each field name, which one of the locked
// languages will be used for display.
$locked_languages = array();
// Generate field translations for languages different from the first
// enabled.
foreach ($instances as $instance) {
$field_name = $instance['field_name'];
$field = field_info_field($field_name);
do {
// Index 0 is reserved for the requested language, this way we ensure
// that no field is actually populated with it.
$langcode = $enabled_langcodes[mt_rand(1, count($enabled_langcodes) - 1)];
} while (isset($langcodes[$langcode]));
$langcodes[$langcode] = TRUE;
$entity->{$field_name}[$langcode] = $this
->_generateTestFieldValues($field['cardinality']);
// If the langcode is one of the locked languages, then that one
// will also be used for display. Otherwise, the default one should be
// used, which is LANGUAGE_NOT_SPECIFIED.
if (language_is_locked($langcode)) {
$locked_languages[$field_name] = $langcode;
}
else {
$locked_languages[$field_name] = LANGUAGE_NOT_SPECIFIED;
}
}
// Test multiple-fields display languages for untranslatable entities.
field_test_entity_info_translatable($entity_type, FALSE);
drupal_static_reset('field_language');
$requested_langcode = $enabled_langcodes[0];
$display_langcodes = field_language($entity_type, $entity, NULL, $requested_langcode);
foreach ($instances as $instance) {
$field_name = $instance['field_name'];
$this
->assertTrue($display_langcodes[$field_name] == $locked_languages[$field_name], format_string('The display language for field %field_name is %language.', array(
'%field_name' => $field_name,
'%language' => $locked_languages[$field_name],
)));
}
// Test multiple-fields display languages for translatable entities.
field_test_entity_info_translatable($entity_type, TRUE);
drupal_static_reset('field_language');
$display_langcodes = field_language($entity_type, $entity, NULL, $requested_langcode);
foreach ($instances as $instance) {
$field_name = $instance['field_name'];
$langcode = $display_langcodes[$field_name];
// As the requested language was not assinged to any field, if the
// returned language is defined for the current field, core fallback rules
// were successfully applied.
$this
->assertTrue(isset($entity->{$field_name}[$langcode]) && $langcode != $requested_langcode, format_string('The display language for the field %field_name is %language.', array(
'%field_name' => $field_name,
'%language' => $langcode,
)));
}
// Test single-field display language.
drupal_static_reset('field_language');
$langcode = field_language($entity_type, $entity, $this->field_name, $requested_langcode);
$this
->assertTrue(isset($entity->{$this->field_name}[$langcode]) && $langcode != $requested_langcode, format_string('The display language for the (single) field %field_name is %language.', array(
'%field_name' => $field_name,
'%language' => $langcode,
)));
// Test field_language() basic behavior without language fallback.
state()
->set('field_test.language_fallback', FALSE);
$entity->{$this->field_name}[$requested_langcode] = mt_rand(1, 127);
drupal_static_reset('field_language');
$display_langcode = field_language($entity_type, $entity, $this->field_name, $requested_langcode);
$this
->assertEqual($display_langcode, $requested_langcode, 'Display language behave correctly when language fallback is disabled');
}