/** * Validates request attributes. */ protected function validateRequestAttributes(EntityInterface $entity, $field_name, $langcode) { // Validate the field name and language. if (!$field_name || !$entity->hasField($field_name)) { return FALSE; } if (!$langcode || !$entity->hasTranslation($langcode)) { return FALSE; } return TRUE; }
/** * {@inheritdoc} */ public function getTranslationFromContext(EntityInterface $entity, $langcode = NULL, $context = array()) { $translation = $entity; if ($entity instanceof TranslatableInterface) { if (empty($langcode)) { $langcode = $this->languageManager->getCurrentLanguage(LanguageInterface::TYPE_CONTENT)->getId(); } // Retrieve language fallback candidates to perform the entity language // negotiation. $context['data'] = $entity; $context += array('operation' => 'entity_view', 'langcode' => $langcode); $candidates = $this->languageManager->getFallbackCandidates($context); // Ensure the default language has the proper language code. $default_language = $entity->getUntranslated()->language(); $candidates[$default_language->getId()] = LanguageInterface::LANGCODE_DEFAULT; // Return the most fitting entity translation. foreach ($candidates as $candidate) { if ($entity->hasTranslation($candidate)) { $translation = $entity->getTranslation($candidate); break; } } } return $translation; }
/** * Updates an entity with the new values from row. * * @param \Drupal\Core\Entity\EntityInterface $entity * The entity to update. * @param \Drupal\migrate\Row $row * The row object to update from. * * @return \Drupal\Core\Entity\EntityInterface|null * An updated entity, or NULL if it's the same as the one passed in. */ protected function updateEntity(EntityInterface $entity, Row $row) { // By default, an update will be preserved. $rollback_action = MigrateIdMapInterface::ROLLBACK_PRESERVE; // Make sure we have the right translation. if ($this->isTranslationDestination()) { $property = $this->storage->getEntityType()->getKey('langcode'); if ($row->hasDestinationProperty($property)) { $language = $row->getDestinationProperty($property); if (!$entity->hasTranslation($language)) { $entity->addTranslation($language); // We're adding a translation, so delete it on rollback. $rollback_action = MigrateIdMapInterface::ROLLBACK_DELETE; } $entity = $entity->getTranslation($language); } } // If the migration has specified a list of properties to be overwritten, // clone the row with an empty set of destination values, and re-add only // the specified properties. if (isset($this->configuration['overwrite_properties'])) { $clone = $row->cloneWithoutDestination(); foreach ($this->configuration['overwrite_properties'] as $property) { $clone->setDestinationProperty($property, $row->getDestinationProperty($property)); } $row = $clone; } foreach ($row->getDestination() as $field_name => $values) { $field = $entity->{$field_name}; if ($field instanceof TypedDataInterface) { $field->setValue($values); } } $this->setRollbackAction($row->getIdMap(), $rollback_action); // We might have a different (translated) entity, so return it. return $entity; }
/** * Initializes the translation form state. * * @param \Drupal\Core\Form\FormStateInterface $form_state * @param \Drupal\Core\Entity\EntityInterface $host */ protected function initIsTranslating(FormStateInterface $form_state, EntityInterface $host) { if ($this->isTranslating != NULL) { return; } $this->isTranslating = FALSE; if (!$host->isTranslatable()) { return; } if (!$host->getEntityType()->hasKey('default_langcode')) { return; } $default_langcode_key = $host->getEntityType()->getKey('default_langcode'); if (!$host->hasField($default_langcode_key)) { return; } if (!empty($form_state->get('content_translation'))) { // Adding a language through the ContentTranslationController. $this->isTranslating = TRUE; } if ($host->hasTranslation($form_state->get('langcode')) && $host->getTranslation($form_state->get('langcode'))->get($default_langcode_key)->value == 0) { // Editing a translation. $this->isTranslating = TRUE; } }