entityManager->getStorage($entity_type); $values = [ $this->fieldName => $this->randomMachineName(), $this->untranslatableFieldName => $this->randomMachineName(), ]; $entity = $controller->create($values); $entity->save(); // Tests that when changing language field language codes are still correct. $langcode = $this->langcodes[0]; $entity->langcode->value = $langcode; $entity->save(); $this->assertFieldStorageLangcode($entity, 'Field language successfully changed from language neutral.'); $langcode = $this->langcodes[1]; $entity->langcode->value = $langcode; $entity->save(); $this->assertFieldStorageLangcode($entity, 'Field language successfully changed.'); $langcode = LanguageInterface::LANGCODE_NOT_SPECIFIED; $entity->langcode->value = $langcode; $entity->save(); $this->assertFieldStorageLangcode($entity, 'Field language successfully changed to language neutral.'); // Test that after switching field translatability things keep working as // before. $this->toggleFieldTranslatability($entity_type, $entity_type); $entity = $this->reloadEntity($entity); foreach ([$this->fieldName, $this->untranslatableFieldName] as $field_name) { $this->assertEqual($entity->get($field_name)->value, $values[$field_name], 'Field language works as expected after switching translatability.'); } // Test that after disabling field translatability translated values are not // loaded. $this->toggleFieldTranslatability($entity_type, $entity_type); $entity = $this->reloadEntity($entity); $entity->langcode->value = $this->langcodes[0]; $translation = $entity->addTranslation($this->langcodes[1]); $translated_value = $this->randomMachineName(); $translation->get($this->fieldName)->value = $translated_value; $translation->save(); $this->toggleFieldTranslatability($entity_type, $entity_type); $entity = $this->reloadEntity($entity); $this->assertEqual($entity->getTranslation($this->langcodes[1])->get($this->fieldName)->value, $values[$this->fieldName], 'Existing field translations are not loaded for untranslatable fields.'); } /** * Checks whether field languages are correctly stored for the given entity. * * @param \Drupal\Core\Entity\FieldableEntityInterface $entity * The entity fields are attached to. * @param string $message * (optional) A message to display with the assertion. */ protected function assertFieldStorageLangcode(FieldableEntityInterface $entity, $message = '') { $status = TRUE; $entity_type = $entity->getEntityTypeId(); $id = $entity->id(); $langcode = $entity->getUntranslated()->language()->getId(); $fields = [$this->fieldName, $this->untranslatableFieldName]; /** @var \Drupal\Core\Entity\Sql\DefaultTableMapping $table_mapping */ $table_mapping = \Drupal::entityManager()->getStorage($entity_type)->getTableMapping(); foreach ($fields as $field_name) { $field_storage = FieldStorageConfig::loadByName($entity_type, $field_name); $table = $table_mapping->getDedicatedDataTableName($field_storage); $record = \Drupal::database() ->select($table, 'f') ->fields('f') ->condition('f.entity_id', $id) ->condition('f.revision_id', $id) ->execute() ->fetchObject(); if ($record->langcode != $langcode) { $status = FALSE; break; } } return $this->assertTrue($status, $message); } }