--- /dev/null
+<?php
+
+namespace Drupal\content_translation\Plugin\Derivative;
+
+use Drupal\content_translation\ContentTranslationManagerInterface;
+use Drupal\Component\Plugin\Derivative\DeriverBase;
+use Drupal\Core\Plugin\Discovery\ContainerDeriverInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+use Drupal\Core\StringTranslation\StringTranslationTrait;
+use Drupal\Core\StringTranslation\TranslationInterface;
+
+/**
+ * Provides dynamic local tasks for content translation.
+ */
+class ContentTranslationLocalTasks extends DeriverBase implements ContainerDeriverInterface {
+ use StringTranslationTrait;
+
+ /**
+ * The base plugin ID
+ *
+ * @var string
+ */
+ protected $basePluginId;
+
+ /**
+ * The content translation manager.
+ *
+ * @var \Drupal\content_translation\ContentTranslationManagerInterface
+ */
+ protected $contentTranslationManager;
+
+ /**
+ * Constructs a new ContentTranslationLocalTasks.
+ *
+ * @param string $base_plugin_id
+ * The base plugin ID.
+ * @param \Drupal\content_translation\ContentTranslationManagerInterface $content_translation_manager
+ * The content translation manager.
+ * @param \Drupal\Core\StringTranslation\TranslationInterface $string_translation
+ * The translation manager.
+ */
+ public function __construct($base_plugin_id, ContentTranslationManagerInterface $content_translation_manager, TranslationInterface $string_translation) {
+ $this->basePluginId = $base_plugin_id;
+ $this->contentTranslationManager = $content_translation_manager;
+ $this->stringTranslation = $string_translation;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public static function create(ContainerInterface $container, $base_plugin_id) {
+ return new static(
+ $base_plugin_id,
+ $container->get('content_translation.manager'),
+ $container->get('string_translation')
+ );
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getDerivativeDefinitions($base_plugin_definition) {
+ // Create tabs for all possible entity types.
+ foreach ($this->contentTranslationManager->getSupportedEntityTypes() as $entity_type_id => $entity_type) {
+ // Find the route name for the translation overview.
+ $translation_route_name = "entity.$entity_type_id.content_translation_overview";
+
+ $base_route_name = "entity.$entity_type_id.canonical";
+ $this->derivatives[$translation_route_name] = [
+ 'entity_type' => $entity_type_id,
+ 'title' => $this->t('Translate'),
+ 'route_name' => $translation_route_name,
+ 'base_route' => $base_route_name,
+ ] + $base_plugin_definition;
+ }
+ return parent::getDerivativeDefinitions($base_plugin_definition);
+ }
+
+}