diff --git a/core/lib/Drupal/Core/Entity/Controller/VersionHistoryController.php b/core/lib/Drupal/Core/Entity/Controller/VersionHistoryController.php index d93140f3bbbcde0bb5da285705e34b46f165fecf..ef596202dec2b89e2da938f4fd0824dd9b40a9c7 100644 --- a/core/lib/Drupal/Core/Entity/Controller/VersionHistoryController.php +++ b/core/lib/Drupal/Core/Entity/Controller/VersionHistoryController.php @@ -225,7 +225,7 @@ protected function loadRevisions(RevisionableInterface $entity) { // Only show revisions that are affected by the language that is being // displayed. if (!$translatable || ($revision->hasTranslation($currentLangcode) && $revision->getTranslation($currentLangcode)->isRevisionTranslationAffected())) { - yield $revision; + yield ($translatable ? $revision->getTranslation($currentLangcode) : $revision); } } } diff --git a/core/modules/system/tests/modules/entity_test_revlog/src/Entity/EntityTestMulWithRevisionLog.php b/core/modules/system/tests/modules/entity_test_revlog/src/Entity/EntityTestMulWithRevisionLog.php index 5a17b858dc1f0bfc444d52b87617acf5a49e8181..580aa691a3b814d237bb93c5447d24c6b8a9c1c1 100644 --- a/core/modules/system/tests/modules/entity_test_revlog/src/Entity/EntityTestMulWithRevisionLog.php +++ b/core/modules/system/tests/modules/entity_test_revlog/src/Entity/EntityTestMulWithRevisionLog.php @@ -8,6 +8,18 @@ * @ContentEntityType( * id = "entity_test_mul_revlog", * label = @Translation("Test entity - data table, revisions log"), + * handlers = { + * "access" = \Drupal\entity_test_revlog\EntityTestRevlogAccessControlHandler::class, + * "form" = { + * "default" = \Drupal\Core\Entity\ContentEntityForm::class, + * "revision-delete" = \Drupal\Core\Entity\Form\RevisionDeleteForm::class, + * "revision-revert" = \Drupal\Core\Entity\Form\RevisionRevertForm::class, + * }, + * "route_provider" = { + * "html" = \Drupal\Core\Entity\Routing\DefaultHtmlRouteProvider::class, + * "revision" = \Drupal\Core\Entity\Routing\RevisionHtmlRouteProvider::class, + * }, + * }, * base_table = "entity_test_mul_revlog", * data_table = "entity_test_mul_revlog_field_data", * revision_table = "entity_test_mul_revlog_revision", @@ -26,6 +38,16 @@ * "revision_created" = "revision_created", * "revision_log_message" = "revision_log_message" * }, + * links = { + * "add-form" = "/entity_test_mul_revlog/add", + * "canonical" = "/entity_test_mul_revlog/manage/{entity_test_mul_revlog}", + * "delete-form" = "/entity_test/delete/entity_test_mul_revlog/{entity_test_mul_revlog}", + * "edit-form" = "/entity_test_mul_revlog/manage/{entity_test_mul_revlog}/edit", + * "revision" = "/entity_test_mul_revlog/{entity_test_mul_revlog}/revision/{entity_test_mul_revlog_revision}/view", + * "revision-delete-form" = "/entity_test_mul_revlog/{entity_test_mul_revlog}/revision/{entity_test_mul_revlog_revision}/delete", + * "revision-revert-form" = "/entity_test_mul_revlog/{entity_test_mul_revlog}/revision/{entity_test_mul_revlog_revision}/revert", + * "version-history" = "/entity_test_mul_revlog/{entity_test_mul_revlog}/revisions", + * } * ) */ class EntityTestMulWithRevisionLog extends EntityTestWithRevisionLog { diff --git a/core/tests/Drupal/FunctionalTests/Entity/RevisionVersionHistoryTranslatableTest.php b/core/tests/Drupal/FunctionalTests/Entity/RevisionVersionHistoryTranslatableTest.php new file mode 100644 index 0000000000000000000000000000000000000000..cea79f4b55bfea851bc8d03b90135b0d629f216a --- /dev/null +++ b/core/tests/Drupal/FunctionalTests/Entity/RevisionVersionHistoryTranslatableTest.php @@ -0,0 +1,90 @@ +<?php + +declare(strict_types = 1); + +namespace Drupal\FunctionalTests\Entity; + +use Drupal\entity_test_revlog\Entity\EntityTestMulWithRevisionLog; +use Drupal\language\Entity\ConfigurableLanguage; +use Drupal\Tests\BrowserTestBase; + +/** + * Tests version history page with translations. + * + * @group Entity + * @coversDefaultClass \Drupal\Core\Entity\Controller\VersionHistoryController + */ +final class RevisionVersionHistoryTranslatableTest extends BrowserTestBase { + + /** + * {@inheritdoc} + */ + protected static $modules = [ + 'entity_test_revlog', + 'content_translation', + 'language', + 'user', + ]; + + /** + * {@inheritdoc} + */ + protected $defaultTheme = 'stark'; + + /** + * {@inheritdoc} + */ + protected function setUp(): void { + parent::setUp(); + ConfigurableLanguage::createFromLangcode('es')->save(); + + // Rebuild the container so that the new languages are picked up by services + // that hold a list of languages. + $this->rebuildContainer(); + } + + /** + * Tests the version history page for translations. + */ + public function testVersionHistoryTranslations(): void { + $label = 'view all revisions,revert,delete revision'; + $entity = EntityTestMulWithRevisionLog::create([ + 'name' => $label, + 'type' => 'entity_test_mul_revlog', + ]); + $entity->addTranslation('es', ['label' => 'version history test translations es']); + $entity->save(); + + $firstRevisionId = $entity->getRevisionId(); + + $entity->setNewRevision(); + $entity->setName($label . ',2') + ->save(); + + $this->drupalGet($entity->toUrl('version-history')); + $this->assertSession()->statusCodeEquals(200); + $this->assertSession()->elementsCount('css', 'table tbody tr', 2); + + /** @var \Drupal\Core\Entity\RevisionableStorageInterface $storage */ + $storage = $this->container->get('entity_type.manager')->getStorage($entity->getEntityTypeId()); + $firstRevision = $storage->loadRevision($firstRevisionId); + + $this->assertSession()->linkByHrefExists($firstRevision->toUrl('revision-revert-form')->toString()); + $this->assertSession()->linkByHrefExists($firstRevision->toUrl('revision-delete-form')->toString()); + $this->assertSession()->linkByHrefNotExists($firstRevision->getTranslation('es')->toUrl('revision-revert-form')->toString()); + $this->assertSession()->linkByHrefNotExists($firstRevision->getTranslation('es')->toUrl('revision-delete-form')->toString()); + + $this->drupalGet($entity->getTranslation('es')->toUrl('version-history')); + // We can't use linkByHrefNotExists here because it does a "contains" match + // and the translated URLs contain the non translated ones. + // i.e /es/entity_test_mul_revlog/1/revision/1/revert contains + // /entity_test_mul_revlog/1/revision/1/revert. + $xpath = $this->assertSession()->buildXPathQuery('//a[@href=:href]', [':href' => $firstRevision->toUrl('revision-revert-form')->toString()]); + $this->assertEmpty($this->getSession()->getPage()->findAll('xpath', $xpath)); + $xpath = $this->assertSession()->buildXPathQuery('//a[@href=:href]', [':href' => $firstRevision->toUrl('revision-delete-form')->toString()]); + $this->assertEmpty($this->getSession()->getPage()->findAll('xpath', $xpath)); + $this->assertSession()->linkByHrefExists($firstRevision->getTranslation('es')->toUrl('revision-revert-form')->toString()); + $this->assertSession()->linkByHrefExists($firstRevision->getTranslation('es')->toUrl('revision-delete-form')->toString()); + } + +}