diff --git a/core/lib/Drupal/Core/Entity/EntityListBuilder.php b/core/lib/Drupal/Core/Entity/EntityListBuilder.php index a877ba779c..0bddf470b2 100644 --- a/core/lib/Drupal/Core/Entity/EntityListBuilder.php +++ b/core/lib/Drupal/Core/Entity/EntityListBuilder.php @@ -149,14 +149,14 @@ protected function getDefaultOperations(EntityInterface $entity) { $operations['edit'] = [ 'title' => $this->t('Edit'), 'weight' => 10, - 'url' => $this->ensureDestination($entity->toUrl('edit-form')), + 'url' => $this->ensureDestination($entity->toUrl('edit-form', ['language' => \Drupal::languageManager()->getCurrentLanguage()])), ]; } if ($entity->access('delete') && $entity->hasLinkTemplate('delete-form')) { $operations['delete'] = [ 'title' => $this->t('Delete'), 'weight' => 100, - 'url' => $this->ensureDestination($entity->toUrl('delete-form')), + 'url' => $this->ensureDestination($entity->toUrl('delete-form', ['language' => \Drupal::languageManager()->getCurrentLanguage()])), ]; } diff --git a/core/modules/config/tests/src/Functional/ConfigEntityListTest.php b/core/modules/config/tests/src/Functional/ConfigEntityListTest.php index cd12fbde7c..0d8abe79b0 100644 --- a/core/modules/config/tests/src/Functional/ConfigEntityListTest.php +++ b/core/modules/config/tests/src/Functional/ConfigEntityListTest.php @@ -5,6 +5,7 @@ use Drupal\Core\Routing\RedirectDestinationTrait; use Drupal\config_test\Entity\ConfigTest; use Drupal\Core\Entity\EntityStorageInterface; +use Drupal\language\Entity\ConfigurableLanguage; use Drupal\Tests\BrowserTestBase; /** @@ -61,7 +62,10 @@ public function testList() { 'edit' => [ 'title' => t('Edit'), 'weight' => 10, - 'url' => $entity->toUrl()->setOption('query', $this->getRedirectDestination()->getAsArray()), + 'url' => $entity->toUrl('edit-form')->mergeOptions([ + 'language' => \Drupal::languageManager()->getCurrentLanguage(), + 'query' => $this->getRedirectDestination()->getAsArray(), + ]), ], 'disable' => [ 'title' => t('Disable'), @@ -71,7 +75,10 @@ public function testList() { 'delete' => [ 'title' => t('Delete'), 'weight' => 100, - 'url' => $entity->toUrl('delete-form')->setOption('query', $this->getRedirectDestination()->getAsArray()), + 'url' => $entity->toUrl('delete-form')->mergeOptions([ + 'language' => \Drupal::languageManager()->getCurrentLanguage(), + 'query' => $this->getRedirectDestination()->getAsArray(), + ]), ], ]; @@ -136,12 +143,18 @@ public function testList() { 'edit' => [ 'title' => t('Edit'), 'weight' => 10, - 'url' => $entity->toUrl()->setOption('query', $this->getRedirectDestination()->getAsArray()), + 'url' => $entity->toUrl()->mergeOptions([ + 'query' => $this->getRedirectDestination()->getAsArray(), + 'language' => \Drupal::languageManager()->getCurrentLanguage(), + ]), ], 'delete' => [ 'title' => t('Delete'), 'weight' => 100, - 'url' => $entity->toUrl('delete-form')->setOption('query', $this->getRedirectDestination()->getAsArray()), + 'url' => $entity->toUrl('delete-form')->mergeOptions([ + 'query' => $this->getRedirectDestination()->getAsArray(), + 'language' => \Drupal::languageManager()->getCurrentLanguage(), + ]), ], ]; diff --git a/core/modules/menu_link_content/src/Plugin/Menu/MenuLinkContent.php b/core/modules/menu_link_content/src/Plugin/Menu/MenuLinkContent.php index 68ddd94f55..31ed92b26f 100644 --- a/core/modules/menu_link_content/src/Plugin/Menu/MenuLinkContent.php +++ b/core/modules/menu_link_content/src/Plugin/Menu/MenuLinkContent.php @@ -196,14 +196,16 @@ public function getDescription() { * {@inheritdoc} */ public function getDeleteRoute() { - return $this->getEntity()->toUrl('delete-form'); + $language = $this->languageManager->getCurrentLanguage(); + return $this->getEntity()->toUrl('delete-form', ['language' => $language]); } /** * {@inheritdoc} */ public function getEditRoute() { - return $this->getEntity()->toUrl(); + $language = $this->languageManager->getCurrentLanguage(); + return $this->getEntity()->toUrl('edit-form', ['language' => $language]); } /** diff --git a/core/modules/menu_link_content/tests/src/Functional/MenuLinkContentTranslationUITest.php b/core/modules/menu_link_content/tests/src/Functional/MenuLinkContentTranslationUITest.php index 334bfcf018..d5b03469a4 100644 --- a/core/modules/menu_link_content/tests/src/Functional/MenuLinkContentTranslationUITest.php +++ b/core/modules/menu_link_content/tests/src/Functional/MenuLinkContentTranslationUITest.php @@ -2,6 +2,7 @@ namespace Drupal\Tests\menu_link_content\Functional; +use Drupal\Core\Url; use Drupal\Tests\content_translation\Functional\ContentTranslationUITestBase; use Drupal\menu_link_content\Entity\MenuLinkContent; @@ -81,6 +82,25 @@ public function testTranslationLinkOnMenuEditForm() { 'title' => 'Link test', ]); $menu_link_content->save(); + + // Test that the edit and delete route retain the current language. + $language = \Drupal::service('language_manager')->getLanguage('fr'); + $menu_link_content_id = $menu_link_content->id(); + + $this->drupalGet('/admin/structure/menu/manage/tools'); + $this->drupalGet('/fr/admin/structure/menu/manage/tools'); + $this->assertSession() + ->linkByHrefExists(Url::fromRoute('entity.menu_link_content.edit_form', ['menu_link_content' => $menu_link_content_id], ['language' => $language]) + ->toString()); + $this->assertSession() + ->linkByHrefExists(Url::fromRoute('entity.menu_link_content.delete_form', ['menu_link_content' => $menu_link_content_id], ['language' => $language]) + ->toString()); + $menu_link_content = MenuLinkContent::create([ + 'menu_name' => 'tools', + 'link' => ['uri' => 'internal:/admin/structure/menu'], + 'title' => 'Link test', + ]); + $menu_link_content->save(); $this->drupalGet('admin/structure/menu/manage/tools'); $this->assertSession()->linkExists(t('Translate')); } diff --git a/core/tests/Drupal/Tests/Core/Entity/EntityListBuilderTest.php b/core/tests/Drupal/Tests/Core/Entity/EntityListBuilderTest.php index 6f23e80921..d447c1db38 100644 --- a/core/tests/Drupal/Tests/Core/Entity/EntityListBuilderTest.php +++ b/core/tests/Drupal/Tests/Core/Entity/EntityListBuilderTest.php @@ -77,6 +77,13 @@ class EntityListBuilderTest extends UnitTestCase { */ protected $entityListBuilder; + /** + * The LanguageManager service. + * + * @var \Drupal\Core\Language\LanguageManagerInterface|\PHPUnit\Framework\MockObject\MockObject + */ + protected $languageManager; + /** * {@inheritdoc} */ @@ -88,9 +95,11 @@ protected function setUp() { $this->moduleHandler = $this->createMock('\Drupal\Core\Extension\ModuleHandlerInterface'); $this->entityType = $this->createMock('\Drupal\Core\Entity\EntityTypeInterface'); $this->translationManager = $this->createMock('\Drupal\Core\StringTranslation\TranslationInterface'); + $this->languageManager = $this->createMock('\Drupal\Core\Language\LanguageManagerInterface'); $this->entityListBuilder = new TestEntityListBuilder($this->entityType, $this->roleStorage); $this->redirectDestination = $this->createMock(RedirectDestinationInterface::class); $this->container = new ContainerBuilder(); + $this->container->set('language_manager', $this->languageManager); \Drupal::setContainer($this->container); }