diff --git a/core/modules/translation_entity/lib/Drupal/translation_entity/Access/EntityTranslationAccessAdd.php b/core/modules/translation_entity/lib/Drupal/translation_entity/Access/EntityTranslationAccessAdd.php
new file mode 100644
index 0000000..955b47b
--- /dev/null
+++ b/core/modules/translation_entity/lib/Drupal/translation_entity/Access/EntityTranslationAccessAdd.php
@@ -0,0 +1,72 @@
+entityManager = $manager;
+ }
+
+ /**
+ * {inheritdoc}
+ */
+ public static function create(ContainerInterface $container) {
+ return new static(
+ $container->get('plugin.manager.entity')
+ );
+ }
+
+ /**
+ * Implements AccessCheckInterface::applies().
+ */
+ public function applies(Route $route) {
+ return array_key_exists('_translation_entity_access_add', $route->getRequirements());
+ }
+
+ /**
+ * Implements AccessCheckInterface::access().
+ */
+ public function access(Route $route, Request $request) {
+ if ($entity = $request->attributes->get('entity')) {
+ $source = language_load($request->attributes->get('source'));
+ $target = language_load($request->attributes->get('target'));
+ $translations = $entity->getTranslationLanguages();
+ $languages = language_list();
+ return $source->langcode != $target->langcode && isset($languages[$source->langcode])
+ && isset($languages[$target->langcode])
+ && !isset($translations[$target->langcode])
+ && translation_entity_access($entity, 'create');
+ }
+
+ return NULL;
+ }
+}
diff --git a/core/modules/translation_entity/lib/Drupal/translation_entity/Access/EntityTranslationAccessEdit.php b/core/modules/translation_entity/lib/Drupal/translation_entity/Access/EntityTranslationAccessEdit.php
new file mode 100644
index 0000000..15c7a33
--- /dev/null
+++ b/core/modules/translation_entity/lib/Drupal/translation_entity/Access/EntityTranslationAccessEdit.php
@@ -0,0 +1,70 @@
+entityManager = $manager;
+ }
+
+ /**
+ * {inheritdoc}
+ */
+ public static function create(ContainerInterface $container) {
+ return new static(
+ $container->get('plugin.manager.entity')
+ );
+ }
+
+ /**
+ * Implements AccessCheckInterface::applies().
+ */
+ public function applies(Route $route) {
+ return array_key_exists('_translation_entity_access_edit', $route->getRequirements());
+ }
+
+ /**
+ * Implements AccessCheckInterface::access().
+ */
+ public function access(Route $route, Request $request) {
+ if ($entity = $request->attributes->get('entity')) {
+ $language = language_load($request->attributes->get('language'));
+ $translations = $entity->getTranslationLanguages();
+ $languages = language_list();
+ return isset($languages[$language->langcode])
+ && $language->langcode != $entity->language()->langcode
+ && isset($translations[$language->langcode])
+ && translation_entity_access($entity, 'update');
+ }
+ return NULL;
+ }
+}
diff --git a/core/modules/translation_entity/lib/Drupal/translation_entity/Access/EntityTranslationOverviewAccess.php b/core/modules/translation_entity/lib/Drupal/translation_entity/Access/EntityTranslationOverviewAccess.php
new file mode 100644
index 0000000..eb2eee7
--- /dev/null
+++ b/core/modules/translation_entity/lib/Drupal/translation_entity/Access/EntityTranslationOverviewAccess.php
@@ -0,0 +1,83 @@
+entityManager = $manager;
+ }
+
+ /**
+ * {inheritdoc}
+ */
+ public static function create(ContainerInterface $container) {
+ return new static(
+ $container->get('plugin.manager.entity')
+ );
+ }
+
+ /**
+ * Implements AccessCheckInterface::applies().
+ */
+ public function applies(Route $route) {
+ return array_key_exists('_translation_entity_access', $route->getRequirements());
+ }
+
+ /**
+ * Implements AccessCheckInterface::access().
+ */
+ public function access(Route $route, Request $request) {
+ if ($entity = $request->attributes->get('entity')) {
+ // Get entity base info.
+ $entity_type = $entity->entityType();
+ $bundle = $entity->bundle();
+
+ // Get entity access callback.
+ $definitions = $this->entityManager->getDefinitions();
+ $access_callback = $definitions[$entity_type]['translation']['translation_entity']['access_callback'];
+ if (call_user_func($access_callback, $entity)) {
+ return TRUE;
+ }
+
+ // Check per entity permission.
+ $permission = "translate {$entity_type}";
+ if ($definitions[$entity_type]['permission_granularity'] == 'bundle') {
+ $permission = "translate {$bundle} {$entity_type}";
+ }
+ if (user_access($permission)) {
+ return TRUE;
+ }
+ }
+
+ return NULL;
+ }
+}
diff --git a/core/modules/translation_entity/lib/Drupal/translation_entity/Controller/EntityTranslationOverviewController.php b/core/modules/translation_entity/lib/Drupal/translation_entity/Controller/EntityTranslationOverviewController.php
new file mode 100644
index 0000000..2a6f195
--- /dev/null
+++ b/core/modules/translation_entity/lib/Drupal/translation_entity/Controller/EntityTranslationOverviewController.php
@@ -0,0 +1,291 @@
+manager = $manager;
+ $this->moduleHandler = $module_handler;
+ }
+
+ /**
+ * {inheritdoc}
+ */
+ public static function create(ContainerInterface $container) {
+ return new static(
+ $container->get('plugin.manager.entity'),
+ $container->get('module_handler')
+ );
+ }
+
+ /**
+ * Translations overview page builder.
+ *
+ * @param \Drupal\Core\Entity\EntityInterface $entity
+ * The entity to be translated.
+ */
+ public function translationEntityOverview(EntityInterface $entity) {
+ $this->moduleHandler->loadInclude('translation_entity', 'inc', 'translation_entity.pages');
+ $entity_type = $entity->entityType();
+
+ $controller_class = $this->manager->getControllerClass($entity_type, 'translation');
+ $controller = new $controller_class($entity_type, $this->manager->getDefinition($entity_type));
+
+ $languages = language_list();
+ $original = $entity->language()->langcode;
+ $translations = $entity->getTranslationLanguages();
+ $field_ui = $this->moduleHandler->moduleExists('field_ui') && user_access('administer ' . $entity_type . ' fields');
+
+ $path = $controller->getViewPath($entity);
+ $base_path = $controller->getBasePath($entity);
+ $edit_path = $controller->getEditPath($entity);
+
+ $header = array(
+ t('Language'),
+ t('Translation'),
+ t('Source language'),
+ t('Status'),
+ t('Operations'),
+ );
+ $rows = array();
+
+ if (language_multilingual()) {
+ // If we have a view path defined for the current entity get the switch
+ // links based on it.
+ if ($path) {
+ $links = _translation_entity_get_switch_links($path);
+ }
+
+ // Determine whether the current entity is translatable.
+ $translatable = FALSE;
+ foreach (field_info_instances($entity_type, $entity->bundle()) as $instance) {
+ $field_name = $instance['field_name'];
+ $field = field_info_field($field_name);
+ if ($field['translatable']) {
+ $translatable = TRUE;
+ break;
+ }
+ }
+
+ foreach ($languages as $language) {
+ $language_name = $language->name;
+ $langcode = $language->langcode;
+ $add_path = $base_path . '/translations/add/' . $original . '/' . $langcode;
+ $translate_path = $base_path . '/translations/edit/' . $langcode;
+ $delete_path = $base_path . '/translations/delete/' . $langcode;
+
+ if ($base_path) {
+ $add_links = _translation_entity_get_switch_links($add_path);
+ $edit_links = _translation_entity_get_switch_links($edit_path);
+ $translate_links = _translation_entity_get_switch_links($translate_path);
+ $delete_links = _translation_entity_get_switch_links($delete_path);
+ }
+
+ $operations = array(
+ 'data' => array(
+ '#type' => 'operations',
+ '#links' => array(),
+ ),
+ );
+ $links = &$operations['data']['#links'];
+
+ if (isset($translations[$langcode])) {
+ // Existing translation in the translation set: display status.
+ $source = isset($entity->translation[$langcode]['source']) ? $entity->translation[$langcode]['source'] : '';
+ $is_original = $langcode == $original;
+ $translation = $translations[$langcode];
+ $label = $entity->label($langcode);
+ $link = isset($links->links[$langcode]['href']) ? $links->links[$langcode] : array(
+ 'href' => $path,
+ 'language' => $language,
+ );
+ $row_title = l($label, $link['href'], $link);
+
+ if (empty($link['href'])) {
+ $row_title = $is_original ? $label : 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.
+ if ($edit_path && $controller->getAccess($entity, 'update')) {
+ $links['edit'] = isset($edit_links->links[$langcode]['href']) ? $edit_links->links[$langcode] : array(
+ 'href' => $edit_path,
+ 'language' => $language,
+ );
+ }
+ elseif (!$is_original && $controller->getTranslationAccess($entity, 'update')) {
+ $links['edit'] = isset($translate_links->links[$langcode]['href']) ? $translate_links->links[$langcode] : array(
+ 'href' => $translate_path,
+ 'language' => $language,
+ );
+ }
+
+ if (isset($links['edit'])) {
+ $links['edit']['title'] = t('Edit');
+ }
+ $translation = $entity->translation[$langcode];
+ $status = !empty($translation['status']) ? t('Published') : t('Not published');
+ // @todo Add a theming function here.
+ $status = '' . $status . '' . (!empty($translation['outdated']) ? ' ' . t('outdated') . '' : '');
+
+ if ($is_original) {
+ $language_name = t('@language_name (Original language)', array('@language_name' => $language_name));
+ $source_name = t('n/a');
+ }
+ else {
+ $source_name = isset($languages[$source]) ? $languages[$source]->name : t('n/a');
+ if ($controller->getTranslationAccess($entity, 'delete')) {
+ $links['delete'] = isset($delete_links->links[$langcode]['href']) ? $delete_links->links[$langcode] : array(
+ 'href' => $delete_links,
+ 'language' => $language,
+ );
+ $links['delete']['title'] = t('Delete');
+ }
+ }
+ }
+ else {
+ // No such translation in the set yet: help user to create it.
+ $row_title = $source_name = t('n/a');
+ $source = $entity->language()->langcode;
+
+ if ($source != $langcode && $controller->getTranslationAccess($entity, 'create')) {
+ if ($translatable) {
+ $links['add'] = isset($add_links->links[$langcode]['href']) ? $add_links->links[$langcode] : array(
+ 'href' => $add_path,
+ 'language' => $language,
+ );
+ $links['add']['title'] = t('Add');
+ }
+ elseif ($field_ui) {
+ $entity_path = $this->manager->getAdminPath($entity_type, $entity->bundle());
+ // Link directly to the fields tab to make it easier to find the
+ // setting to enable translation on fields.
+ $path = $entity_path . '/fields';
+ $links['nofields'] = array(
+ 'title' => t('No translatable fields'),
+ 'href' => $path,
+ 'language' => $language,
+ );
+ }
+ }
+
+ $status = t('Not translated');
+ }
+
+ $rows[] = array(
+ $language_name,
+ $row_title,
+ $source_name,
+ $status,
+ $operations,
+ );
+ }
+ }
+
+ drupal_set_title(t('Translations of %label', array('%label' => $entity->label())), PASS_THROUGH);
+
+ // Add metadata to the build render array to let other modules know about
+ // which entity this is.
+ $build['#entity'] = $entity;
+
+ $build['translation_entity_overview'] = array(
+ '#theme' => 'table',
+ '#header' => $header,
+ '#rows' => $rows,
+ );
+
+ return $build;
+ }
+
+ /**
+ * Page callback for the translation addition page.
+ *
+ * @param EntityInterface $entity
+ * The entity being translated.
+ * @param Language $source
+ * (optional) The language of the values being translated. Defaults to the
+ * entity language.
+ * @param Language $target
+ * (optional) The language of the translated values. Defaults to the current
+ * content language.
+ *
+ * @return array
+ * A processed form array ready to be rendered.
+ */
+ public function translationEntityAdd(EntityInterface $entity, $source = NULL, $target = NULL) {
+ $this->moduleHandler->loadInclude('translation_entity', 'inc', 'translation_entity.pages');
+
+ $source = language_load($source);
+ $target = language_load($target);
+ // @todo Exploit the upcoming hook_entity_prepare() when available.
+ translation_entity_prepare_translation($entity, $source, $target);
+ $info = $entity->entityInfo();
+ $operation = isset($info['default_operation']) ? $info['default_operation'] : 'default';
+ $form_state['langcode'] = $target->langcode;
+ $form_state['translation_entity']['source'] = $source;
+ $form_state['translation_entity']['target'] = $target;
+ $controller = translation_entity_controller($entity->entityType());
+ $form_state['translation_entity']['translation_form'] = !$controller->getAccess($entity, 'update');
+ return entity_get_form($entity, $operation, $form_state);
+ }
+
+ /**
+ * Page callback for the edit translation page.
+ *
+ * @param EntityInterface $entity
+ * The entity being translated.
+ * @param Language $language
+ * (optional) The language of the translated values. Defaults to the current
+ * content language.
+ *
+ * @return array
+ * A processed form array ready to be rendered.
+ */
+ public function translationEntityEdit(EntityInterface $entity, $language = NULL) {
+ $this->moduleHandler->loadInclude('translation_entity', 'inc', 'translation_entity.pages');
+ $language = language_load($language);
+ $info = $entity->entityInfo();
+ $operation = isset($info['default_operation']) ? $info['default_operation'] : 'default';
+ $form_state['langcode'] = $language->langcode;
+ $form_state['translation_entity']['translation_form'] = TRUE;
+ return entity_get_form($entity, $operation, $form_state);
+ }
+}
diff --git a/core/modules/translation_entity/lib/Drupal/translation_entity/Routing/EntityTranslationRouteSubscriber.php b/core/modules/translation_entity/lib/Drupal/translation_entity/Routing/EntityTranslationRouteSubscriber.php
new file mode 100644
index 0000000..bd072b2
--- /dev/null
+++ b/core/modules/translation_entity/lib/Drupal/translation_entity/Routing/EntityTranslationRouteSubscriber.php
@@ -0,0 +1,108 @@
+manager = $manager;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public static function getSubscribedEvents() {
+ $events[RoutingEvents::DYNAMIC] = 'routes';
+ return $events;
+ }
+
+ /**
+ * Adds routes for entity translations.
+ */
+ public function routes(RouteBuildEvent $event) {
+ $collection = $event->getRouteCollection();
+ foreach ($this->manager->getDefinitions() as $entity_type => $entity_info) {
+ if ($entity_info['translatable'] && isset($entity_info['translation'])) {
+ $route = new Route(
+ '/' . str_replace($entity_info['menu_path_wildcard'], '{entity}', $entity_info['menu_base_path']) . "/translations",
+ array(
+ '_content' => '\Drupal\translation_entity\Controller\EntityTranslationOverviewController::translationEntityOverview',
+ ),
+ array(
+ '_translation_entity_access' => $entity_type,
+ '_permission' => 'translate any entity',
+ ),
+ array(
+ 'converters' => array(
+ 'entity' => $entity_type,
+ ),
+ )
+ );
+ $collection->add("translation_entity.translation_overview.$entity_type", $route);
+
+ $route = new Route(
+ '/' . str_replace($entity_info['menu_path_wildcard'], '{entity}', $entity_info['menu_base_path']) . "/translations/add/{source}/{target}",
+ array(
+ '_content' => '\Drupal\translation_entity\Controller\EntityTranslationOverviewController::translationEntityAdd',
+
+ ),
+ array(
+ '_permission' => 'translate any entity',
+ '_translation_entity_access_add' => $entity_type,
+ ),
+ array(
+ 'converters' => array(
+ 'entity' => $entity_type,
+ ),
+ )
+ );
+ $collection->add("translation_entity.translation_add.$entity_type", $route);
+
+ $route = new Route(
+ '/' . str_replace($entity_info['menu_path_wildcard'], '{entity}', $entity_info['menu_base_path']) . "/translations/edit/{language}",
+ array(
+ '_content' => '\Drupal\translation_entity\Controller\EntityTranslationOverviewController::translationEntityEdit',
+
+ ),
+ array(
+ '_permission' => 'translate any entity',
+ '_translation_entity_access_edit' => $entity_type,
+ ),
+ array(
+ 'converters' => array(
+ 'entity' => $entity_type,
+ ),
+ )
+ );
+ $collection->add("translation_entity.translation_edit.$entity_type", $route);
+ }
+ }
+ }
+}
diff --git a/core/modules/translation_entity/translation_entity.module b/core/modules/translation_entity/translation_entity.module
index f51c2cb..c3256a6 100644
--- a/core/modules/translation_entity/translation_entity.module
+++ b/core/modules/translation_entity/translation_entity.module
@@ -147,12 +147,11 @@ function translation_entity_menu() {
$items["$path/translations"] = array(
'title' => 'Translations',
- 'page callback' => 'translation_entity_overview',
- 'page arguments' => array($entity_position),
'type' => MENU_LOCAL_TASK,
- 'context' => MENU_CONTEXT_PAGE | MENU_CONTEXT_INLINE,
'weight' => 2,
- ) + $item;
+ 'route_name' => "translation_entity.translation_overview.$entity_type",
+ 'context' => MENU_CONTEXT_PAGE | MENU_CONTEXT_INLINE,
+ );
$items["$path/translations/overview"] = array(
'title' => 'Overview',
@@ -163,31 +162,20 @@ function translation_entity_menu() {
// Add translation callback.
// @todo Add the access callback instead of replacing it as soon as the
// routing system supports multiple callbacks.
- $language_position = $entity_position + 3;
- $args = array($entity_position, $language_position, $language_position + 1);
$items["$path/translations/add/%language/%language"] = array(
- 'title' => 'Add',
- 'page callback' => 'translation_entity_add_page',
- 'page arguments' => $args,
- 'access callback' => 'translation_entity_add_access',
- 'access arguments' => $args,
- 'type' => MENU_LOCAL_TASK,
- 'weight' => 1,
- ) + $item;
+ 'route_name' => "translation_entity.translation_add.$entity_type",
+ 'weight' => 1,
+ );
// Edit translation callback.
- $args = array($entity_position, $language_position);
$items["$path/translations/edit/%language"] = array(
- 'title' => 'Edit',
- 'page callback' => 'translation_entity_edit_page',
- 'page arguments' => $args,
- 'access callback' => 'translation_entity_edit_access',
- 'access arguments' => $args,
- 'type' => MENU_LOCAL_TASK,
- 'weight' => 1,
- ) + $item;
+ 'route_name' => "translation_entity.translation_edit.$entity_type",
+ 'weight' => 1,
+ );
// Delete translation callback.
+ $language_position = $entity_position + 3;
+ $args = array($entity_position, $language_position, $language_position + 1);
$items["$path/translations/delete/%language"] = array(
'title' => 'Delete',
'page callback' => 'drupal_get_form',
@@ -206,7 +194,6 @@ function translation_entity_menu() {
'access arguments' => array('administer entity translation'),
'file' => 'translation_entity.admin.inc',
);
-
return $items;
}
@@ -299,42 +286,6 @@ function translation_entity_view_access(EntityInterface $entity, $langcode, $acc
}
/**
- * Access callback for the translation addition page.
- *
- * @param \Drupal\Core\Entity\EntityInterface $entity
- * The entity being translated.
- * @param \Drupal\Core\Language\Language $source
- * (optional) The language of the values being translated. Defaults to the
- * entity language.
- * @param \Drupal\Core\Language\Language $target
- * (optional) The language of the translated values. Defaults to the current
- * content language.
- */
-function translation_entity_add_access(EntityInterface $entity, Language $source = NULL, Language $target = NULL) {
- $source = !empty($source) ? $source : $entity->language();
- $target = !empty($target) ? $target : language(Language::TYPE_CONTENT);
- $translations = $entity->getTranslationLanguages();
- $languages = language_list();
- return $source->langcode != $target->langcode && isset($languages[$source->langcode]) && isset($languages[$target->langcode]) && !isset($translations[$target->langcode]) && translation_entity_access($entity, 'create');
-}
-
-/**
- * Access callback for the translation edit page.
- *
- * @param \Drupal\Core\Entity\EntityInterface $entity
- * The entity being translated.
- * @param \Drupal\Core\Language\Language $language
- * (optional) The language of the translated values. Defaults to the current
- * content language.
- */
-function translation_entity_edit_access(EntityInterface $entity, Language $language = NULL) {
- $language = !empty($language) ? $language : language(Language::TYPE_CONTENT);
- $translations = $entity->getTranslationLanguages();
- $languages = language_list();
- return isset($languages[$language->langcode]) && $language->langcode != $entity->language()->langcode && isset($translations[$language->langcode]) && translation_entity_access($entity, 'update');
-}
-
-/**
* Access callback for the translation delete page.
*
* @param \Drupal\Core\Entity\EntityInterface $entity
diff --git a/core/modules/translation_entity/translation_entity.pages.inc b/core/modules/translation_entity/translation_entity.pages.inc
index c7de9e2..1b780fb 100644
--- a/core/modules/translation_entity/translation_entity.pages.inc
+++ b/core/modules/translation_entity/translation_entity.pages.inc
@@ -10,152 +10,6 @@
use Drupal\Core\Entity\EntityNG;
/**
- * Translations overview page callback.
- *
- * @param \Drupal\Core\Entity\EntityInterface $entity
- * The entity whose translation overview should be displayed.
- */
-function translation_entity_overview(EntityInterface $entity) {
- $controller = translation_entity_controller($entity->entityType());
- $entity_manager = Drupal::entityManager();
- $languages = language_list();
- $original = $entity->language()->langcode;
- $translations = $entity->getTranslationLanguages();
- $field_ui = module_exists('field_ui') && user_access('administer ' . $entity->entityType() . ' fields');
-
- $path = $controller->getViewPath($entity);
- $base_path = $controller->getBasePath($entity);
- $edit_path = $controller->getEditPath($entity);
-
- $header = array(t('Language'), t('Translation'), t('Source language'), t('Status'), t('Operations'));
- $rows = array();
-
- if (language_multilingual()) {
- // If we have a view path defined for the current entity get the switch
- // links based on it.
- if ($path) {
- $links = _translation_entity_get_switch_links($path);
- }
-
- // Determine whether the current entity is translatable.
- $translatable = FALSE;
- foreach (field_info_instances($entity->entityType(), $entity->bundle()) as $instance) {
- $field_name = $instance['field_name'];
- $field = field_info_field($field_name);
- if ($field['translatable']) {
- $translatable = TRUE;
- break;
- }
- }
-
- foreach ($languages as $language) {
- $language_name = $language->name;
- $langcode = $language->langcode;
- $add_path = $base_path . '/translations/add/' . $original . '/' . $langcode;
- $translate_path = $base_path . '/translations/edit/' . $langcode;
- $delete_path = $base_path . '/translations/delete/' . $langcode;
-
- if ($base_path) {
- $add_links = _translation_entity_get_switch_links($add_path);
- $edit_links = _translation_entity_get_switch_links($edit_path);
- $translate_links = _translation_entity_get_switch_links($translate_path);
- $delete_links = _translation_entity_get_switch_links($delete_path);
- }
-
- $operations = array(
- 'data' => array(
- '#type' => 'operations',
- '#links' => array(),
- ),
- );
- $links = &$operations['data']['#links'];
-
- if (isset($translations[$langcode])) {
- // Existing translation in the translation set: display status.
- $source = isset($entity->translation[$langcode]['source']) ? $entity->translation[$langcode]['source'] : '';
- $is_original = $langcode == $original;
- $translation = $translations[$langcode];
- $label = $entity->label($langcode);
- $link = isset($links->links[$langcode]['href']) ? $links->links[$langcode] : array('href' => $path, 'language' => $language);
- $row_title = l($label, $link['href'], $link);
-
- if (empty($link['href'])) {
- $row_title = $is_original ? $label : 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.
- if ($edit_path && $controller->getAccess($entity, 'update')) {
- $links['edit'] = isset($edit_links->links[$langcode]['href']) ? $edit_links->links[$langcode] : array('href' => $edit_path, 'language' => $language);
- }
- elseif (!$is_original && $controller->getTranslationAccess($entity, 'update')) {
- $links['edit'] = isset($translate_links->links[$langcode]['href']) ? $translate_links->links[$langcode] : array('href' => $translate_path, 'language' => $language);
- }
-
- if (isset($links['edit'])) {
- $links['edit']['title'] = t('Edit');
- }
-
- $translation = $entity->translation[$langcode];
- $status = !empty($translation['status']) ? t('Published') : t('Not published');
- // @todo Add a theming function here.
- $status = '' . $status . '' . (!empty($translation['outdated']) ? ' ' . t('outdated') . '' : '');
-
- if ($is_original) {
- $language_name = t('@language_name (Original language)', array('@language_name' => $language_name));
- $source_name = t('n/a');
- }
- else {
- $source_name = isset($languages[$source]) ? $languages[$source]->name : t('n/a');
- if ($controller->getTranslationAccess($entity, 'delete')) {
- $links['delete'] = isset($delete_links->links[$langcode]['href']) ? $delete_links->links[$langcode] : array('href' => $delete_links, 'language' => $language);
- $links['delete']['title'] = t('Delete');
- }
- }
- }
- else {
- // No such translation in the set yet: help user to create it.
- $row_title = $source_name = t('n/a');
- $source = $entity->language()->langcode;
-
- if ($source != $langcode && $controller->getTranslationAccess($entity, 'create')) {
- if ($translatable) {
- $links['add'] = isset($add_links->links[$langcode]['href']) ? $add_links->links[$langcode] : array('href' => $add_path, 'language' => $language);
- $links['add']['title'] = t('Add');
- }
- elseif ($field_ui) {
- $entity_path = $entity_manager->getAdminPath($entity->entityType(), $entity->bundle());
- // Link directly to the fields tab to make it easier to find the
- // setting to enable translation on fields.
- $path = $entity_path . '/fields';
- $links['nofields'] = array('title' => t('No translatable fields'), 'href' => $path, 'language' => $language);
- }
- }
-
- $status = t('Not translated');
- }
-
- $rows[] = array($language_name, $row_title, $source_name, $status, $operations);
- }
- }
-
- drupal_set_title(t('Translations of %label', array('%label' => $entity->label())), PASS_THROUGH);
-
- // Add metadata to the build render array to let other modules know about
- // which entity this is.
- $build['#entity'] = $entity;
-
- $build['translation_entity_overview'] = array(
- '#theme' => 'table',
- '#header' => $header,
- '#rows' => $rows,
- );
-
- return $build;
-}
-
-/**
* Returns the localized links for the given path.
*
* @param string $path
@@ -176,57 +30,6 @@ function _translation_entity_get_switch_links($path) {
}
/**
- * Page callback for the translation addition page.
- *
- * @param EntityInterface $entity
- * The entity being translated.
- * @param Language $source
- * (optional) The language of the values being translated. Defaults to the
- * entity language.
- * @param Language $target
- * (optional) The language of the translated values. Defaults to the current
- * content language.
- *
- * @return array
- * A processed form array ready to be rendered.
- */
-function translation_entity_add_page(EntityInterface $entity, Language $source = NULL, Language $target = NULL) {
- $source = !empty($source) ? $source : $entity->language();
- $target = !empty($target) ? $target : language(Language::TYPE_CONTENT);
- // @todo Exploit the upcoming hook_entity_prepare() when available.
- translation_entity_prepare_translation($entity, $source, $target);
- $info = $entity->entityInfo();
- $operation = isset($info['default_operation']) ? $info['default_operation'] : 'default';
- $form_state['langcode'] = $target->langcode;
- $form_state['translation_entity']['source'] = $source;
- $form_state['translation_entity']['target'] = $target;
- $controller = translation_entity_controller($entity->entityType());
- $form_state['translation_entity']['translation_form'] = !$controller->getAccess($entity, 'update');
- return entity_get_form($entity, $operation, $form_state);
-}
-
-/**
- * Page callback for the translation edit page.
- *
- * @param \Drupal\Core\Entity\EntityInterface $entity
- * The entity being translated.
- * @param \Drupal\Core\Language\Language $language
- * (optional) The language of the translated values. Defaults to the current
- * content language.
- *
- * @return array
- * A processed form array ready to be rendered.
- */
-function translation_entity_edit_page(EntityInterface $entity, Language $language = NULL) {
- $language = !empty($language) ? $language : language(Language::TYPE_CONTENT);
- $info = $entity->entityInfo();
- $operation = isset($info['default_operation']) ? $info['default_operation'] : 'default';
- $form_state['langcode'] = $language->langcode;
- $form_state['translation_entity']['translation_form'] = TRUE;
- return entity_get_form($entity, $operation, $form_state);
-}
-
-/**
* Populates target values with the source values.
*
* @param \Drupal\Core\Entity\EntityInterface $entity
diff --git a/core/modules/translation_entity/translation_entity.services.yml b/core/modules/translation_entity/translation_entity.services.yml
index 541bd3d..c91398e 100644
--- a/core/modules/translation_entity/translation_entity.services.yml
+++ b/core/modules/translation_entity/translation_entity.services.yml
@@ -2,3 +2,23 @@ services:
translation_entity.synchronizer:
class: Drupal\translation_entity\FieldTranslationSynchronizer
arguments: ['@plugin.manager.entity']
+ translation_entity.subscriber:
+ class: Drupal\translation_entity\Routing\EntityTranslationRouteSubscriber
+ arguments: ['@plugin.manager.entity']
+ tags:
+ - { name: event_subscriber }
+ translation_entity.overview_access:
+ class: Drupal\translation_entity\Access\EntityTranslationOverviewAccess
+ arguments: ['@plugin.manager.entity']
+ tags:
+ - { name: access_check }
+ translation_entity.overview_access_add:
+ class: Drupal\translation_entity\Access\EntityTranslationAccessAdd
+ arguments: ['@plugin.manager.entity']
+ tags:
+ - { name: access_check }
+ translation_entity.overview_access_edit:
+ class: Drupal\translation_entity\Access\EntityTranslationAccessEdit
+ arguments: ['@plugin.manager.entity']
+ tags:
+ - { name: access_check }