diff --git a/core/modules/field/field.api.php b/core/modules/field/field.api.php index 3d5e76f..455ecc2 100644 --- a/core/modules/field/field.api.php +++ b/core/modules/field/field.api.php @@ -1473,7 +1473,7 @@ function hook_field_attach_prepare_translation_alter(&$entity, $context) { function hook_field_language_alter(&$display_langcode, $context) { // Do not apply core language fallback rules if they are disabled or if Locale // is not registered as a translation handler. - if (variable_get('field_language_fallback', TRUE) && field_has_translation_handler($context['entity_type'], 'field_language')) { + if (variable_get('field_language_fallback', TRUE) && field_has_translation_handler($context['entity_type'])) { field_language_fallback($display_langcode, $context['entity'], $context['langcode']); } } diff --git a/core/modules/field/field.module b/core/modules/field/field.module index 3e7fb91..ad073ba 100644 --- a/core/modules/field/field.module +++ b/core/modules/field/field.module @@ -373,8 +373,8 @@ function field_system_info_alter(&$info, $file, $type) { */ function field_field_language_alter(&$display_langcode, $context) { // Do not apply core language fallback rules if they are disabled or if - // 'field_language' is not registered as a translation handler. - if (variable_get('field_language_fallback', TRUE) && field_has_translation_handler($context['entity_type'], 'field_language')) { + // the entity does not have a translation handler registered. + if (variable_get('field_language_fallback', TRUE) && field_has_translation_handler($context['entity_type'])) { field_language_fallback($display_langcode, $context['entity'], $context['langcode']); } } diff --git a/core/modules/field/tests/field.test b/core/modules/field/tests/field.test index 0f18947..6c1a445 100644 --- a/core/modules/field/tests/field.test +++ b/core/modules/field/tests/field.test @@ -3413,131 +3413,4 @@ class EntityPropertiesTestCase extends FieldTestCase { } } } -} - -/** - * Functional test for multilingual fields. - */ -class FieldMultilingualTestCase extends WebTestBase { - public static function getInfo() { - return array( - 'name' => 'Multilingual fields', - 'description' => 'Test multilingual support for fields.', - 'group' => 'Field API', - ); - } - - function setUp() { - parent::setUp(array('node', 'language')); - - // Create Basic page node type. - $this->drupalCreateContentType(array('type' => 'page', 'name' => 'Basic page')); - - // Setup users. - $admin_user = $this->drupalCreateUser(array('administer languages', 'administer content types', 'access administration pages', 'create page content', 'edit own page content')); - $this->drupalLogin($admin_user); - - // Add a new language. - $language = (object) array( - 'langcode' => 'it', - 'name' => 'Italian', - ); - language_save($language); - - // Enable URL language detection and selection. - $edit = array('language_interface[enabled][language-url]' => '1'); - $this->drupalPost('admin/config/regional/language/detection', $edit, t('Save settings')); - - // Set "Basic page" content type to use multilingual support. - $edit = array( - 'node_type_language' => 1, - ); - $this->drupalPost('admin/structure/types/manage/page', $edit, t('Save content type')); - $this->assertRaw(t('The content type %type has been updated.', array('%type' => 'Basic page')), t('Basic page content type has been updated.')); - - // Make node body translatable. - $field = field_info_field('body'); - $field['translatable'] = TRUE; - field_update_field($field); - } - - /** - * Test if field languages are correctly set through the node form. - */ - function testMultilingualNodeForm() { - // Create "Basic page" content. - $langcode = LANGUAGE_NOT_SPECIFIED; - $title_key = "title"; - $title_value = $this->randomName(8); - $body_key = "body[$langcode][0][value]"; - $body_value = $this->randomName(16); - - // Create node to edit. - $edit = array(); - $edit[$title_key] = $title_value; - $edit[$body_key] = $body_value; - $edit['langcode'] = 'en'; - $this->drupalPost('node/add/page', $edit, t('Save')); - - // Check that the node exists in the database. - $node = $this->drupalGetNodeByTitle($edit[$title_key]); - $this->assertTrue($node, t('Node found in database.')); - - $assert = isset($node->body['en']) && !isset($node->body[LANGUAGE_NOT_SPECIFIED]) && $node->body['en'][0]['value'] == $body_value; - $this->assertTrue($assert, t('Field language correctly set.')); - - // Change node language. - $this->drupalGet("node/$node->nid/edit"); - $edit = array( - $title_key => $this->randomName(8), - 'langcode' => 'it' - ); - $this->drupalPost(NULL, $edit, t('Save')); - $node = $this->drupalGetNodeByTitle($edit[$title_key]); - $this->assertTrue($node, t('Node found in database.')); - - $assert = isset($node->body['it']) && !isset($node->body['en']) && $node->body['it'][0]['value'] == $body_value; - $this->assertTrue($assert, t('Field language correctly changed.')); - - // Enable content language URL detection. - language_negotiation_set(LANGUAGE_TYPE_CONTENT, array(LANGUAGE_NEGOTIATION_URL => 0)); - - // Test multilingual field language fallback logic. - $this->drupalGet("it/node/$node->nid"); - $this->assertRaw($body_value, t('Body correctly displayed using Italian as requested language')); - - $this->drupalGet("node/$node->nid"); - $this->assertRaw($body_value, t('Body correctly displayed using English as requested language')); - } - - /* - * Test multilingual field display settings. - */ - function testMultilingualDisplaySettings() { - // Create "Basic page" content. - $langcode = LANGUAGE_NOT_SPECIFIED; - $title_key = "title"; - $title_value = $this->randomName(8); - $body_key = "body[$langcode][0][value]"; - $body_value = $this->randomName(16); - - // Create node to edit. - $edit = array(); - $edit[$title_key] = $title_value; - $edit[$body_key] = $body_value; - $edit['langcode'] = 'en'; - $this->drupalPost('node/add/page', $edit, t('Save')); - - // Check that the node exists in the database. - $node = $this->drupalGetNodeByTitle($edit[$title_key]); - $this->assertTrue($node, t('Node found in database.')); - - // Check if node body is showed. - $this->drupalGet("node/$node->nid"); - $body = $this->xpath('//article[@id=:id]//div[@class=:class]/descendant::p', array( - ':id' => 'node-' . $node->nid, - ':class' => 'content', - )); - $this->assertEqual(current($body), $node->body['en'][0]['value'], 'Node body found.'); - } -} +} \ No newline at end of file diff --git a/core/modules/field/tests/modules/field_test/field_test.entity.inc b/core/modules/field/tests/modules/field_test/field_test.entity.inc index 0177c7a..1057391 100644 --- a/core/modules/field/tests/modules/field_test/field_test.entity.inc +++ b/core/modules/field/tests/modules/field_test/field_test.entity.inc @@ -128,9 +128,9 @@ function field_test_entity_info_alter(&$entity_info) { foreach (field_test_entity_info_translatable() as $entity_type => $translatable) { $entity_info[$entity_type]['translation']['field_test'] = $translatable; } - // Disable field_language as a translation handler. + // Disable the entity type translation handler. foreach ($entity_info as $entity_type => $info) { - $entity_info[$entity_type]['translation']['field_language'] = FALSE; + $entity_info[$entity_type]['translation'][$entity_type] = FALSE; } } diff --git a/core/modules/node/lib/Drupal/node/Tests/NodeFieldMultilingualTestCase.php b/core/modules/node/lib/Drupal/node/Tests/NodeFieldMultilingualTestCase.php new file mode 100644 index 0000000..ff5df81 --- /dev/null +++ b/core/modules/node/lib/Drupal/node/Tests/NodeFieldMultilingualTestCase.php @@ -0,0 +1,137 @@ + 'Multilingual fields', + 'description' => 'Test multilingual support for fields.', + 'group' => 'Field API', + ); + } + + function setUp() { + parent::setUp(array('node', 'language')); + + // Create Basic page node type. + $this->drupalCreateContentType(array('type' => 'page', 'name' => 'Basic page')); + + // Setup users. + $admin_user = $this->drupalCreateUser(array('administer languages', 'administer content types', 'access administration pages', 'create page content', 'edit own page content')); + $this->drupalLogin($admin_user); + + // Add a new language. + $language = (object) array( + 'langcode' => 'it', + 'name' => 'Italian', + ); + language_save($language); + + // Enable URL language detection and selection. + $edit = array('language_interface[enabled][language-url]' => '1'); + $this->drupalPost('admin/config/regional/language/detection', $edit, t('Save settings')); + + // Set "Basic page" content type to use multilingual support. + $edit = array( + 'node_type_language' => 1, + ); + $this->drupalPost('admin/structure/types/manage/page', $edit, t('Save content type')); + $this->assertRaw(t('The content type %type has been updated.', array('%type' => 'Basic page')), t('Basic page content type has been updated.')); + + // Make node body translatable. + $field = field_info_field('body'); + $field['translatable'] = TRUE; + field_update_field($field); + } + + /** + * Test if field languages are correctly set through the node form. + */ + function testMultilingualNodeForm() { + // Create "Basic page" content. + $langcode = LANGUAGE_NOT_SPECIFIED; + $title_key = "title"; + $title_value = $this->randomName(8); + $body_key = "body[$langcode][0][value]"; + $body_value = $this->randomName(16); + + // Create node to edit. + $edit = array(); + $edit[$title_key] = $title_value; + $edit[$body_key] = $body_value; + $edit['langcode'] = 'en'; + $this->drupalPost('node/add/page', $edit, t('Save')); + + // Check that the node exists in the database. + $node = $this->drupalGetNodeByTitle($edit[$title_key]); + $this->assertTrue($node, t('Node found in database.')); + + $assert = isset($node->body['en']) && !isset($node->body[LANGUAGE_NOT_SPECIFIED]) && $node->body['en'][0]['value'] == $body_value; + $this->assertTrue($assert, t('Field language correctly set.')); + + // Change node language. + $this->drupalGet("node/$node->nid/edit"); + $edit = array( + $title_key => $this->randomName(8), + 'langcode' => 'it' + ); + $this->drupalPost(NULL, $edit, t('Save')); + $node = $this->drupalGetNodeByTitle($edit[$title_key]); + $this->assertTrue($node, t('Node found in database.')); + + $assert = isset($node->body['it']) && !isset($node->body['en']) && $node->body['it'][0]['value'] == $body_value; + $this->assertTrue($assert, t('Field language correctly changed.')); + + // Enable content language URL detection. + language_negotiation_set(LANGUAGE_TYPE_CONTENT, array(LANGUAGE_NEGOTIATION_URL => 0)); + + // Test multilingual field language fallback logic. + $this->drupalGet("it/node/$node->nid"); + $this->assertRaw($body_value, t('Body correctly displayed using Italian as requested language')); + + $this->drupalGet("node/$node->nid"); + $this->assertRaw($body_value, t('Body correctly displayed using English as requested language')); + } + + /* + * Test multilingual field display settings. + */ + function testMultilingualDisplaySettings() { + // Create "Basic page" content. + $langcode = LANGUAGE_NOT_SPECIFIED; + $title_key = "title"; + $title_value = $this->randomName(8); + $body_key = "body[$langcode][0][value]"; + $body_value = $this->randomName(16); + + // Create node to edit. + $edit = array(); + $edit[$title_key] = $title_value; + $edit[$body_key] = $body_value; + $edit['langcode'] = 'en'; + $this->drupalPost('node/add/page', $edit, t('Save')); + + // Check that the node exists in the database. + $node = $this->drupalGetNodeByTitle($edit[$title_key]); + $this->assertTrue($node, t('Node found in database.')); + + // Check if node body is showed. + $this->drupalGet("node/$node->nid"); + $body = $this->xpath('//article[@id=:id]//div[@class=:class]/descendant::p', array( + ':id' => 'node-' . $node->nid, + ':class' => 'content', + )); + $this->assertEqual(current($body), $node->body['en'][0]['value'], 'Node body found.'); + } +} \ No newline at end of file diff --git a/core/modules/node/node.module b/core/modules/node/node.module index 434b7fe..51d482a 100644 --- a/core/modules/node/node.module +++ b/core/modules/node/node.module @@ -228,7 +228,7 @@ function node_entity_info() { // Add a translation handler for fields if the language module is enabled. if (module_exists('language')) { - $return['node']['translation']['field_language'] = TRUE; + $return['node']['translation']['node'] = TRUE; } // Search integration is provided by node.module, so search-related diff --git a/core/modules/node/node.pages.inc b/core/modules/node/node.pages.inc index da9cdce..101a6d7 100644 --- a/core/modules/node/node.pages.inc +++ b/core/modules/node/node.pages.inc @@ -527,11 +527,11 @@ function node_form_submit($form, &$form_state) { } /** - * Handles possible node language changes if 'field_language' is registered as a - * translation handler. + * Handles possible node language changes. + * */ function node_field_language_form_submit($form, &$form_state) { - if (field_has_translation_handler('node', 'field_language')) { + if (field_has_translation_handler('node', 'node')) { $bundle = $form_state['values']['type']; $node_language = $form_state['values']['langcode'];