diff --git a/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/LanguageItem.php b/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/LanguageItem.php index e3192b2..13e6f2d 100644 --- a/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/LanguageItem.php +++ b/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/LanguageItem.php @@ -91,8 +91,8 @@ public function setValue($values, $notify = TRUE) { * {@inheritdoc} */ public function applyDefaultValue($notify = TRUE) { - // Default to LANGCODE_NOT_SPECIFIED. - $this->setValue(array('value' => Language::LANGCODE_NOT_SPECIFIED), $notify); + // Default to the current site language. + $this->setValue(array('value' => \Drupal::languageManager()->getCurrentLanguage()->id()), $notify); return $this; } diff --git a/core/modules/block/custom_block/lib/Drupal/custom_block/CustomBlockTypeForm.php b/core/modules/block/custom_block/lib/Drupal/custom_block/CustomBlockTypeForm.php index c790efa..722db05 100644 --- a/core/modules/block/custom_block/lib/Drupal/custom_block/CustomBlockTypeForm.php +++ b/core/modules/block/custom_block/lib/Drupal/custom_block/CustomBlockTypeForm.php @@ -55,7 +55,7 @@ public function form(array $form, array &$form_state) { '#description' => t('Create a new revision by default for this block type.') ); - if ($this->moduleHandler->moduleExists('content_translation')) { + if ($this->moduleHandler->moduleExists('language')) { $form['language'] = array( '#type' => 'details', '#title' => t('Language settings'), 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 e1b939c..3297e28 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/hal/lib/Drupal/hal/Normalizer/ContentEntityNormalizer.php b/core/modules/hal/lib/Drupal/hal/Normalizer/ContentEntityNormalizer.php index f374fa3..e77be11 100644 --- a/core/modules/hal/lib/Drupal/hal/Normalizer/ContentEntityNormalizer.php +++ b/core/modules/hal/lib/Drupal/hal/Normalizer/ContentEntityNormalizer.php @@ -126,21 +126,15 @@ public function denormalize($data, $class, $format = NULL, array $context = arra // Create the entity. $typed_data_ids = $this->getTypedDataIds($data['_links']['type']); + $values = array(); // Figure out the language to use. if (isset($data['langcode'])) { - $langcode = $data['langcode'][0]['value']; + $values['langcode'] = $data['langcode'][0]['value']; // Remove the langcode so it does not get iterated over below. unset($data['langcode']); } - elseif ($this->moduleHandler->moduleExists('language')) { - $langcode = language_get_default_langcode($typed_data_ids['entity_type'], $typed_data_ids['bundle']); - } - else { - $langcode = Language::LANGCODE_NOT_SPECIFIED; - } $entity_type = $this->entityManager->getDefinition($typed_data_ids['entity_type']); - $values = array('langcode' => $langcode); if ($entity_type->hasKey('bundle')) { $bundle_key = $entity_type->getKey('bundle'); diff --git a/core/modules/language/language.module b/core/modules/language/language.module index f35da4d..e425bac 100644 --- a/core/modules/language/language.module +++ b/core/modules/language/language.module @@ -688,3 +688,11 @@ function language_system_regional_settings_form_submit($form, &$form_state) { $language->default = TRUE; language_save($language); } + +/** + * Implements hook_field_info_alter(). + */ +function language_field_info_alter(&$info) { + // Change the default behavior of language field. + $info['language']['class'] = '\Drupal\language\DefaultLanguageItem'; +} diff --git a/core/modules/language/lib/Drupal/language/DefaultLanguageItem.php b/core/modules/language/lib/Drupal/language/DefaultLanguageItem.php new file mode 100644 index 0000000..0ef14e2 --- /dev/null +++ b/core/modules/language/lib/Drupal/language/DefaultLanguageItem.php @@ -0,0 +1,54 @@ +getEntity()) { + $langcode = $this->getDefaultLangcode($entity); + } + // Always notify otherwise default langcode will not be set correctly. + $this->setValue(array('value' => $langcode), TRUE); + return $this; + } + + /** + * Provides default language code of given entity. + * + * @param \Drupal\Core\Entity\EntityInterface $entity + * The entity whose language code to be loaded. + * + * @return string + * A string language code. + */ + public function getDefaultLangcode(EntityInterface $entity) { + return language_get_default_langcode($entity->getEntityTypeId(), $entity->bundle()); + } + +} diff --git a/core/modules/language/tests/Drupal/language/Tests/EntityDefaultLanguageTest.php b/core/modules/language/tests/Drupal/language/Tests/EntityDefaultLanguageTest.php new file mode 100644 index 0000000..0b2a3ca --- /dev/null +++ b/core/modules/language/tests/Drupal/language/Tests/EntityDefaultLanguageTest.php @@ -0,0 +1,151 @@ + 'Entity default language', + 'description' => 'Test that entities are created with correct language code.', + 'group' => 'Entity API', + ); + } + + /** + * {@inheritdoc} + */ + public function setUp() { + parent::setUp(); + + // Activate Spanish language, so there are two languages activated. + $language_entity = $this->container->get('entity.manager')->getStorage('language_entity')->create(array( + 'id' => 'es', + )); + $language_entity->save(); + + // 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. + */ + public function testEntityTranslationDefaultLanguageViaCode() { + // With language module activated, and a content type that is configured to + // have no language by default, a new node of this content type will have + // "und" language code when language is not specified. + $node = $this->createNode('ctund'); + $this->assertEqual($node->langcode->value, Language::LANGCODE_NOT_SPECIFIED); + // With language module activated, and a content type that is configured to + // have no language by default, a new node of this content type will have + // "es" language code when language is specified as "es". + $node = $this->createNode('ctund', 'es'); + $this->assertEqual($node->langcode->value, 'es'); + + // With language module activated, and a content type that is configured to + // have language "es" by default, a new node of this content type will have + // "es" language code when language is not specified. + $node = $this->createNode('ctes'); + $this->assertEqual($node->langcode->value, 'es'); + // With language module activated, and a content type that is configured to + // have language "es" by default, a new node of this content type will have + // "en" language code when language "en" is specified. + $node = $this->createNode('ctes', 'en'); + $this->assertEqual($node->langcode->value, 'en'); + + // Disable language module. + $this->disableModules(array('language')); + + // With language module disabled, and a content type that is configured to + // have no language specified by default, a new node of this content type + // will have "und" language code when language is not specified. + $node = $this->createNode('ctund'); + $this->assertEqual($node->langcode->value, Language::LANGCODE_NOT_SPECIFIED); + // With language module disabled, and a content type that is configured to + // have no language specified by default, a new node of this type will have + // "es" language code when language "es" is specified. + $node = $this->createNode('ctund', 'es'); + $this->assertEqual($node->langcode->value, 'es'); + + // With language module disabled, and a content type that is configured to + // have language "es" by default, a new node of this type will have "und" + // language code when language is not specified. + $node = $this->createNode('ctes'); + $this->assertEqual($node->langcode->value, Language::LANGCODE_NOT_SPECIFIED); + // With language module disabled, and a content type that is configured to + // have language "es" by default, a new node of this type will have "en" + // language code when language "en" is specified. + $node = $this->createNode('ctes', 'en'); + $this->assertEqual($node->langcode->value, 'en'); + } + + /** + * Creates a new node content type. + * + * @param name + * The content type name. + * @param $langcode + * Default language code of the nodes of this type. + */ + protected function createContentType($name, $langcode) { + $content_type = $this->container->get('entity.manager')->getStorage('node_type')->create(array( + 'name' => 'Test ' . $name, + 'title_label' => 'Title', + 'type' => $name, + 'create_body' => FALSE, + )); + $content_type->save(); + language_save_default_configuration('node', $name, array( + 'langcode' => $langcode, + 'language_show' => FALSE, + )); + } + + /** + * Creates a new node of given type and language using Entity API. + * + * @param $type + * The node content type. + * @param $langcode + * (optional) Language code to pass to entity create. + * + * @return \Drupal\node\NodeInterface + * The node created. + */ + protected function createNode($type, $langcode = NULL) { + $values = array( + 'type' => $type, + 'title' => $this->randomName(), + ); + if (!empty($langcode)) { + $values['langcode'] = $langcode; + } + $node = $this->container->get('entity.manager')->getStorage('node')->create($values); + return $node; + } + +} diff --git a/core/modules/migrate_drupal/lib/Drupal/migrate_drupal/Tests/d6/MigrateAggregatorFeedTest.php b/core/modules/migrate_drupal/lib/Drupal/migrate_drupal/Tests/d6/MigrateAggregatorFeedTest.php index 1110f72..5d0295f 100644 --- a/core/modules/migrate_drupal/lib/Drupal/migrate_drupal/Tests/d6/MigrateAggregatorFeedTest.php +++ b/core/modules/migrate_drupal/lib/Drupal/migrate_drupal/Tests/d6/MigrateAggregatorFeedTest.php @@ -8,7 +8,6 @@ namespace Drupal\migrate_drupal\Tests\d6; use Drupal\aggregator\Entity\Feed; -use Drupal\Core\Language\Language; use Drupal\migrate\MigrateExecutable; use Drupal\migrate_drupal\Tests\MigrateDrupalTestBase; @@ -52,7 +51,7 @@ public function testAggregatorFeedImport() { $feed = entity_load('aggregator_feed', 5); $this->assertNotNull($feed->uuid()); $this->assertEqual($feed->title->value, 'Know Your Meme'); - $this->assertEqual($feed->language()->id, Language::LANGCODE_NOT_SPECIFIED); + $this->assertEqual($feed->language()->id, 'en'); $this->assertEqual($feed->url->value, 'http://knowyourmeme.com/newsfeed.rss'); $this->assertEqual($feed->refresh->value, 900); $this->assertEqual($feed->checked->value, 1387659487); diff --git a/core/modules/migrate_drupal/lib/Drupal/migrate_drupal/Tests/d6/MigrateAggregatorItemTest.php b/core/modules/migrate_drupal/lib/Drupal/migrate_drupal/Tests/d6/MigrateAggregatorItemTest.php index c5ca816..44cb61d 100644 --- a/core/modules/migrate_drupal/lib/Drupal/migrate_drupal/Tests/d6/MigrateAggregatorItemTest.php +++ b/core/modules/migrate_drupal/lib/Drupal/migrate_drupal/Tests/d6/MigrateAggregatorItemTest.php @@ -76,7 +76,8 @@ public function testAggregatorItem() { $this->assertEqual($item->getDescription(), "