public ContentTranslationController::overview(RouteMatchInterface $route_match, $entity_type_id = NULL)
Builds the translations overview page.
Parameters
\Drupal\Core\Routing\RouteMatchInterface $route_match: The route match.
string $entity_type_id: (optional) The entity type ID.
Return value
array Array of page elements to render.
File
- core/modules/content_translation/src/Controller/ContentTranslationController.php, line 83
Class
- ContentTranslationController
- Base class for entity translation controllers.
Namespace
Drupal\content_translation\Controller
Code
public function overview(RouteMatchInterface $route_match, $entity_type_id = NULL) { /** @var \Drupal\Core\Entity\ContentEntityInterface $entity */ $entity = $route_match->getParameter($entity_type_id); $account = $this->currentUser(); $handler = $this->entityManager()->getHandler($entity_type_id, 'translation'); $manager = $this->manager; $entity_type = $entity->getEntityType(); // Start collecting the cacheability metadata, starting with the entity and // later merge in the access result cacheability metadata. $cacheability = CacheableMetadata::createFromObject($entity); $languages = $this->languageManager()->getLanguages(); $original = $entity->getUntranslated()->language()->getId(); $translations = $entity->getTranslationLanguages(); $field_ui = $this->moduleHandler()->moduleExists('field_ui') && $account->hasPermission('administer ' . $entity_type_id . ' fields'); $rows = array(); $show_source_column = FALSE; if ($this->languageManager()->isMultilingual()) { // Determine whether the current entity is translatable. $translatable = FALSE; foreach ($this->entityManager->getFieldDefinitions($entity_type_id, $entity->bundle()) as $instance) { if ($instance->isTranslatable()) { $translatable = TRUE; break; } } // Show source-language column if there are non-original source langcodes. $additional_source_langcodes = array_filter(array_keys($translations), function($langcode) use ($entity, $original, $manager) { $source = $manager->getTranslationMetadata($entity->getTranslation($langcode))->getSource(); return $source != $original && $source != LanguageInterface::LANGCODE_NOT_SPECIFIED; }); $show_source_column = !empty($additional_source_langcodes); foreach ($languages as $language) { $language_name = $language->getName(); $langcode = $language->getId(); $add_url = new Url( "entity.$entity_type_id.content_translation_add", array( 'source' => $original, 'target' => $language->getId(), $entity_type_id => $entity->id(), ), array( 'language' => $language, ) ); $edit_url = new Url( "entity.$entity_type_id.content_translation_edit", array( 'language' => $language->getId(), $entity_type_id => $entity->id(), ), array( 'language' => $language, ) ); $delete_url = new Url( "entity.$entity_type_id.content_translation_delete", array( 'language' => $language->getId(), $entity_type_id => $entity->id(), ), array( 'language' => $language, ) ); $operations = array( 'data' => array( '#type' => 'operations', '#links' => array(), ), ); $links = &$operations['data']['#links']; if (array_key_exists($langcode, $translations)) { // Existing translation in the translation set: display status. $translation = $entity->getTranslation($langcode); $metadata = $manager->getTranslationMetadata($translation); $source = $metadata->getSource() ? : LanguageInterface::LANGCODE_NOT_SPECIFIED; $is_original = $langcode == $original; $label = $entity->getTranslation($langcode)->label(); $link = isset($links->links[$langcode]['url']) ? $links->links[$langcode] : array('url' => $entity->urlInfo()); if (!empty($link['url'])) { $link['url']->setOption('language', $language); $row_title = $this->l($label, $link['url']); } if (empty($link['url'])) { $row_title = $is_original ? $label : $this->t('n/a'); } // If the user is allowed to edit the entity we point the edit link to // the entity form, otherwise if we are not dealing with the original // language we point the link to the translation form. $update_access = $entity->access('update', NULL, TRUE); $translation_access = $handler->getTranslationAccess($entity, 'update'); $cacheability = $cacheability ->merge(CacheableMetadata::createFromObject($update_access)) ->merge(CacheableMetadata::createFromObject($translation_access)); if ($update_access->isAllowed() && $entity_type->hasLinkTemplate('edit-form')) { $links['edit']['url'] = $entity->urlInfo('edit-form'); $links['edit']['language'] = $language; } elseif (!$is_original && $translation_access->isAllowed()) { $links['edit']['url'] = $edit_url; } if (isset($links['edit'])) { $links['edit']['title'] = $this->t('Edit'); } $status = array('data' => array( '#type' => 'inline_template', '#template' => '<span class="status">{% if status %}{{ "Published"|t }}{% else %}{{ "Not published"|t }}{% endif %}</span>{% if outdated %} <span class="marker">{{ "outdated"|t }}</span>{% endif %}', '#context' => array( 'status' => $metadata->isPublished(), 'outdated' => $metadata->isOutdated(), ), )); if ($is_original) { $language_name = $this->t('<strong>@language_name (Original language)</strong>', array('@language_name' => $language_name)); $source_name = $this->t('n/a'); } else { $source_name = isset($languages[$source]) ? $languages[$source]->getName() : $this->t('n/a'); $delete_access = $entity->access('delete', NULL, TRUE); $translation_access = $handler->getTranslationAccess($entity, 'delete'); $cacheability = $cacheability ->merge(CacheableMetadata::createFromObject($delete_access)) ->merge(CacheableMetadata::createFromObject($translation_access)); if ($entity->access('delete') && $entity_type->hasLinkTemplate('delete-form')) { $links['delete'] = array( 'title' => $this->t('Delete'), 'url' => $entity->urlInfo('delete-form'), 'language' => $language, ); } elseif ($translation_access->isAllowed()) { $links['delete'] = array( 'title' => $this->t('Delete'), 'url' => $delete_url, ); } } } else { // No such translation in the set yet: help user to create it. $row_title = $source_name = $this->t('n/a'); $source = $entity->language()->getId(); $create_translation_access = $handler->getTranslationAccess($entity, 'create'); $cacheability = $cacheability ->merge(CacheableMetadata::createFromObject($create_translation_access)); if ($source != $langcode && $create_translation_access->isAllowed()) { if ($translatable) { $links['add'] = array( 'title' => $this->t('Add'), 'url' => $add_url, ); } elseif ($field_ui) { $url = new Url('language.content_settings_page'); // Link directly to the fields tab to make it easier to find the // setting to enable translation on fields. $links['nofields'] = array( 'title' => $this->t('No translatable fields'), 'url' => $url, ); } } $status = $this->t('Not translated'); } if ($show_source_column) { $rows[] = array( $language_name, $row_title, $source_name, $status, $operations, ); } else { $rows[] = array($language_name, $row_title, $status, $operations); } } } if ($show_source_column) { $header = array( $this->t('Language'), $this->t('Translation'), $this->t('Source language'), $this->t('Status'), $this->t('Operations'), ); } else { $header = array( $this->t('Language'), $this->t('Translation'), $this->t('Status'), $this->t('Operations'), ); } $build['#title'] = $this->t('Translations of %label', array('%label' => $entity->label())); // Add metadata to the build render array to let other modules know about // which entity this is. $build['#entity'] = $entity; $cacheability ->addCacheTags($entity->getCacheTags()) ->applyTo($build); $build['content_translation_overview'] = array( '#theme' => 'table', '#header' => $header, '#rows' => $rows, ); return $build; }
Please login to continue.