diff --git a/core/lib/Drupal/Core/Entity/Plugin/DataType/LanguageItem.php b/core/lib/Drupal/Core/Entity/Plugin/DataType/LanguageItem.php index 68526f5..346b1c7 100644 --- a/core/lib/Drupal/Core/Entity/Plugin/DataType/LanguageItem.php +++ b/core/lib/Drupal/Core/Entity/Plugin/DataType/LanguageItem.php @@ -89,7 +89,13 @@ public function setValue($values, $notify = TRUE) { */ public function applyDefaultValue($notify = TRUE) { // Default to LANGCODE_NOT_SPECIFIED. - $this->setValue(array('value' => Language::LANGCODE_NOT_SPECIFIED), $notify); + if (\Drupal::moduleHandler()->moduleExists('language') && $entity = $this->getEntity()) { + $langcode = language_get_default_langcode($entity->entityType(), $entity->bundle()); + } + else { + $langcode = Language::LANGCODE_NOT_SPECIFIED; + } + $this->setValue(array('value' => $langcode), $notify); return $this; } @@ -106,4 +112,5 @@ public function onChange($property_name) { } parent::onChange($property_name); } + } diff --git a/core/modules/content_translation/lib/Drupal/content_translation/Tests/Views/TranslationLinkTest.php b/core/modules/content_translation/lib/Drupal/content_translation/Tests/Views/TranslationLinkTest.php index fe45379..770b52e 100644 --- a/core/modules/content_translation/lib/Drupal/content_translation/Tests/Views/TranslationLinkTest.php +++ b/core/modules/content_translation/lib/Drupal/content_translation/Tests/Views/TranslationLinkTest.php @@ -10,6 +10,7 @@ use Drupal\views\Tests\ViewTestBase; use Drupal\content_translation\Tests\ContentTranslationTestBase; use Drupal\views\Tests\ViewTestData; +use Drupal\Core\Language\Language; /** * Tests the content translation overview link field handler. @@ -51,6 +52,11 @@ function setUp() { $user->langcode = 'en'; $user->save(); + // Assign user 2 LANGCODE_NOT_SPECIFIED code so entity can't be translated. + $user = user_load(2); + $user->langcode = Language::LANGCODE_NOT_SPECIFIED; + $user->save(); + ViewTestData::createTestViews(get_class($this), array('content_translation_test_views')); } diff --git a/core/modules/language/language.module b/core/modules/language/language.module index 32d38eb..2304d85 100644 --- a/core/modules/language/language.module +++ b/core/modules/language/language.module @@ -396,6 +396,15 @@ function language_get_default_configuration_settings_key($entity_type, $bundle) } /** + * Implements hook_node_type_insert(). + */ +function language_node_type_insert(NodeTypeInterface $type) { + if (\Drupal::moduleHandler()->moduleExists('language')) { + language_save_default_configuration('node', $type->id(), $type->language_configuration); + } +} + +/** * Implements hook_node_type_update(). */ function language_node_type_update(NodeTypeInterface $type) { diff --git a/core/modules/system/lib/Drupal/system/Tests/Entity/EntityTranslationDefaultLanguageTest.php b/core/modules/system/lib/Drupal/system/Tests/Entity/EntityTranslationDefaultLanguageTest.php new file mode 100644 index 0000000..ce1ff73 --- /dev/null +++ b/core/modules/system/lib/Drupal/system/Tests/Entity/EntityTranslationDefaultLanguageTest.php @@ -0,0 +1,143 @@ + 'Entity Translation default language', + 'description' => 'Test that entities are created with correct language code.', + 'group' => 'Entity API', + ); + } + + function setUp() { + parent::setUp(); + + // Create a new administrator user for the test. + $admin = $this->drupalCreateUser( + array( + 'administer content types', + 'administer languages', + 'bypass node access', + ) + ); + $this->drupalLogin($admin); + + // Activate Spanish language, so there are two languages activated. + $this->activateSpanishLanguage(); + + // Create a new content type which has Undefined language by default. + $this->createContentType('ctund', Language::LANGCODE_NOT_SPECIFIED); + // Create a new content type which has Spanish language by default. + $this->createContentType('ctes', 'es'); + } + + /* + * Tests that default language code is properly set for new nodes. + */ + function testEntityTranslationDefaultLanguageViaCode() { + // With language module activated, content type "und" by default. + $node = $this->createNodeViaCode('ctund'); + $this->assertEqual($node->langcode->value, Language::LANGCODE_NOT_SPECIFIED); + $node = $this->createNodeViaCode('ctund', 'es'); + $this->assertEqual($node->langcode->value, 'es'); + + // With language module activated, content type "es" by default. + $node = $this->createNodeViaCode('ctes'); + $this->assertEqual($node->langcode->value, 'es'); + $node = $this->createNodeViaCode('ctes', 'en'); + $this->assertEqual($node->langcode->value, 'en'); + + // Disable language module. + $this->container->get('module_handler')->uninstall(array('language'), FALSE); + + // With language module disabled, content type "und" by default. + $node = $this->createNodeViaCode('ctund'); + $this->assertEqual($node->langcode->value, Language::LANGCODE_NOT_SPECIFIED); + $node = $this->createNodeViaCode('ctund', 'es'); + $this->assertEqual($node->langcode->value, 'es'); + + // With language module disabled, content type "es" by default. + $node = $this->createNodeViaCode('ctes'); + $this->assertEqual($node->langcode->value, Language::LANGCODE_NOT_SPECIFIED); + $node = $this->createNodeViaCode('ctes', 'en'); + $this->assertEqual($node->langcode->value, 'en'); + } + + /** + * Creates a new node content type. + * + * @param $type + * The node content type. + * @param $langcode + * Default language code of the nodes of this type. + */ + function createContentType($name, $langcode) { + $edit = array( + 'name' => 'Test ' . $name, + 'title_label' => 'Title', + 'type' => $name, + 'language_configuration[langcode]' => $langcode, + ); + $this->drupalPostForm('admin/structure/types/add', $edit, t('Save content type')); + } + + /* + * Creates a new node of given type and language using Entity API. + * + * @param $type + * The node content type. + * @param $langcode + * (optional) Language code of the node to create. + * If blank, it will be determined by existing content type configuration. + * + * @return \Drupal\node\Entity + * The node created. + */ + function createNodeViaCode($type, $langcode = NULL) { + $title = $this->randomName(); + $data = array( + 'type' => $type, + 'title' => $title, + ); + if (!empty($langcode)) { + $data['langcode'] = $langcode; + } + $node = entity_create( + 'node', + $data + ); + return $node; + } + + /** + * Activates Spanish language. + */ + function activateSpanishLanguage() { + $edit = array( + 'predefined_langcode' => 'es', + ); + $this->drupalPostForm('admin/config/regional/language/add', $edit, t('Add language')); + } + +} diff --git a/core/modules/system/lib/Drupal/system/Tests/Entity/EntityTranslationTest.php b/core/modules/system/lib/Drupal/system/Tests/Entity/EntityTranslationTest.php index d6fb956..4cd1395 100644 --- a/core/modules/system/lib/Drupal/system/Tests/Entity/EntityTranslationTest.php +++ b/core/modules/system/lib/Drupal/system/Tests/Entity/EntityTranslationTest.php @@ -108,6 +108,13 @@ protected function _testEntityLanguageMethods($entity_type) { 'name' => 'test', 'user_id' => $GLOBALS['user']->id(), )); + $this->assertEqual($entity->language()->id, language_default()->id, format_string('%entity_type: Entity created with API has default language.', array('%entity_type' => $entity_type))); + + $entity = entity_create($entity_type, array( + 'name' => 'test', + 'user_id' => $GLOBALS['user']->id(), + 'langcode' => Language::LANGCODE_NOT_SPECIFIED, + )); $this->assertEqual($entity->language()->id, Language::LANGCODE_NOT_SPECIFIED, format_string('%entity_type: Entity language not specified.', array('%entity_type' => $entity_type))); $this->assertFalse($entity->getTranslationLanguages(FALSE), format_string('%entity_type: No translations are available', array('%entity_type' => $entity_type))); @@ -212,7 +219,7 @@ protected function _testMultilingualProperties($entity_type) { // Create a language neutral entity and check that properties are stored // as language neutral. - $entity = entity_create($entity_type, array('name' => $name, 'user_id' => $uid)); + $entity = entity_create($entity_type, array('name' => $name, 'user_id' => $uid, 'langcode' => Language::LANGCODE_NOT_SPECIFIED)); $entity->save(); $entity = entity_load($entity_type, $entity->id()); $this->assertEqual($entity->language()->id, Language::LANGCODE_NOT_SPECIFIED, format_string('%entity_type: Entity created as language neutral.', array('%entity_type' => $entity_type))); @@ -295,6 +302,7 @@ protected function _testMultilingualProperties($entity_type) { entity_create($entity_type, array( 'user_id' => $properties[$langcode]['user_id'], 'name' => 'some name', + 'langcode' => Language::LANGCODE_NOT_SPECIFIED, ))->save(); $entities = entity_load_multiple($entity_type); @@ -357,7 +365,7 @@ function testEntityTranslationAPI() { $langcode = $this->langcodes[1]; $entity = $this->entityManager ->getStorageController('entity_test_mul') - ->create(array('name' => $this->randomName())); + ->create(array('name' => $this->randomName(), 'langcode' => Language::LANGCODE_NOT_SPECIFIED)); $entity->save(); $hooks = $this->getHooksInfo();