diff --git a/core/lib/Drupal/Core/Entity/EntityFormController.php b/core/lib/Drupal/Core/Entity/EntityFormController.php index 36fb318..fbc5f35 100644 --- a/core/lib/Drupal/Core/Entity/EntityFormController.php +++ b/core/lib/Drupal/Core/Entity/EntityFormController.php @@ -7,6 +7,7 @@ namespace Drupal\Core\Entity; +use Drupal\Core\TypedData\TranslatableInterface; use Drupal\entity\EntityFormDisplayInterface; use Drupal\Core\Extension\ModuleHandlerInterface; use Drupal\Core\Language\Language; @@ -191,9 +192,19 @@ public function form(array $form, array &$form_state) { // If the form did not specify otherwise, default to keeping the existing // language of the entity or defaulting to the site default language for // new entities. + if (!$entity->isNew()) { + if ($entity instanceof TranslatableInterface) { + $langcode = $entity->getUntranslated()->language()->id; + } + else { + $langcode = $entity->language()->id; + } + } + else + $langcode = language_default()->id; $form['langcode'] = array( '#type' => 'value', - '#value' => !$entity->isNew() ? $entity->getUntranslated()->language()->id : language_default()->id, + '#value' => $langcode, ); } return $form; @@ -402,7 +413,7 @@ public function getFormLangcode(array $form_state) { if (!empty($form_state['langcode'])) { $langcode = $form_state['langcode']; } - else { + elseif ($entity instanceof TranslatableInterface) { // If no form langcode was provided we default to the current content // language and inspect existing translations to find a valid fallback, // if any. @@ -416,14 +427,30 @@ public function getFormLangcode(array $form_state) { // If the site is not multilingual or no translation for the given form // language is available, fall back to the entity language. - return !empty($langcode) ? $langcode : $entity->getUntranslated()->language()->id; + if (!empty($langcode)) { + return $langcode; + } + elseif ($entity instanceof TranslatableInterface) { + // If the entity is translatable, return the original language. + return $entity->getUntranslated()->language()->id; + } + else { + // Fall back to the current language of the entity. + return $entity->language()->id; + } } /** * Implements \Drupal\Core\Entity\EntityFormControllerInterface::isDefaultFormLangcode(). */ public function isDefaultFormLangcode(array $form_state) { - return $this->getFormLangcode($form_state) == $this->entity->getUntranslated()->language()->id; + if ($this->entity instanceof TranslatableInterface) { + return $this->getFormLangcode($form_state) == $this->entity->getUntranslated()->language()->id; + } + else { + // If the entity is not translatable, this is always the default language. + return TRUE; + } } /** @@ -502,10 +529,15 @@ public function getEntity() { * A keyed array containing the current state of the form. */ protected function getTranslatedEntity(array $form_state) { - $langcode = $this->getFormLangcode($form_state); - $translation = $this->entity->getTranslation($langcode); - // Ensure that the entity object is a BC entity if the original one is. - return $this->entity instanceof EntityBCDecorator ? $translation->getBCEntity() : $translation; + if ($this->entity instanceof TranslatableInterface) { + $langcode = $this->getFormLangcode($form_state); + $translation = $this->entity->getTranslation($langcode); + // Ensure that the entity object is a BC entity if the original one is. + return $this->entity instanceof EntityBCDecorator ? $translation->getBCEntity() : $translation; + } + else { + return $this->entity; + } } /**