diff --git a/src/Repository.php b/src/Repository.php index 6d3592fa75eaff113ccf701b83e269093ef9032f..b74c6b0b6c4a2f3c4511879d1566fe4c41d7c935 100644 --- a/src/Repository.php +++ b/src/Repository.php @@ -472,8 +472,17 @@ class Repository implements RepositoryInterface { if (empty($prefix)) { return $path; } - $path = ltrim($path, '/'); - return str_replace($prefix, '', $path); + + // We ensure 2 structures: /langcode/path or /langcode. + $processed_path = ltrim($path, '/'); + if (str_starts_with($processed_path, $prefix . '/')) { + $path = substr($processed_path, strlen($prefix)); + } + elseif ($processed_path === $prefix) { + $path = '/'; + } + + return $path; } /** diff --git a/tests/src/Kernel/EntityMeshEntityRenderMultilingualTest.php b/tests/src/Kernel/EntityMeshEntityRenderMultilingualTest.php index 293ae31064fd0357ced58241b882d9f5a3749be1..2724ae1ae05bd692af4a1f2f58aa4a5f623db8f4 100644 --- a/tests/src/Kernel/EntityMeshEntityRenderMultilingualTest.php +++ b/tests/src/Kernel/EntityMeshEntityRenderMultilingualTest.php @@ -3,8 +3,8 @@ namespace Drupal\Tests\entity_mesh\Kernel; use Drupal\language\Entity\ContentLanguageSettings; -use Drupal\node\Entity\Node; use Drupal\language\Entity\ConfigurableLanguage; +use Drupal\node\Entity\Node; /** * Tests the Entity Mesh link auditing with multilingual support. @@ -48,8 +48,8 @@ class EntityMeshEntityRenderMultilingualTest extends EntityMeshTestBase { $this->container->get('kernel')->rebuildContainer(); $this->container->get('router.builder')->rebuild(); + $this->createExampleAlias(); $this->createExampleNodes(); - } /** @@ -100,6 +100,8 @@ class EntityMeshEntityRenderMultilingualTest extends EntityMeshTestBase { <p>Internal access denied link invalid translation: <a href="/es/node/1">Internal access denied link invalid translation/a></p> <p>Internal access denied link not published translation: <a href="/it/node/1">Internal access denied link not published translation</a></p> <p>Internal valid link published translation: <a href="/de/node/1">Internal valid link published translation</a></p> + <p>Internal access denied alias link not published translation: <a href="/it/node-1-it-alias">Internal access denied alias link not published translation</a></p> + <p>Internal alias link published translation: <a href="/de/node-1-de-alias">Internal valid alias link published translation</a></p> '; // Create a node entity in French. @@ -115,6 +117,25 @@ class EntityMeshEntityRenderMultilingualTest extends EntityMeshTestBase { $node_en->save(); } + /** + * Create alias. + */ + protected function createExampleAlias() { + $cases = [ + ['lang' => 'it', 'path' => '/node/1', 'alias' => '/node-1-it-alias'], + ['lang' => 'de', 'path' => '/node/1', 'alias' => '/node-1-de-alias'], + ]; + foreach ($cases as $case) { + /** @var \Drupal\path_alias\PathAliasInterface $path_alias */ + $path_alias = \Drupal::entityTypeManager()->getStorage('path_alias')->create([ + 'path' => $case['path'], + 'alias' => $case['alias'], + 'langcode' => $case['lang'], + ]); + $path_alias->save(); + } + } + /** * Provides test cases for different types of links. */ @@ -182,6 +203,29 @@ class EntityMeshEntityRenderMultilingualTest extends EntityMeshTestBase { 'expected_target_entity_id' => 1, 'excepted_target_entity_langcode' => 'de', ]), + + 'Internal valid alias link translation DE' => array_merge($defaults, [ + 'source_entity_id' => 2, + 'target_href' => '/de/node-1-de-alias', + 'expected_target_link_type' => 'internal', + 'excepted_target_subcategory' => 'link', + 'expected_target_entity_type' => 'node', + 'expected_target_entity_bundle' => 'page', + 'expected_target_entity_id' => 1, + 'excepted_target_entity_langcode' => 'de', + ]), + + 'Internal access denied alias link not published translation IT' => array_merge($defaults, [ + 'source_entity_id' => 2, + 'target_href' => '/it/node-1-it-alias', + 'expected_target_link_type' => 'internal', + 'excepted_target_subcategory' => 'access-denied-link', + 'expected_target_entity_type' => 'node', + 'expected_target_entity_bundle' => 'page', + 'expected_target_entity_id' => 1, + 'excepted_target_entity_langcode' => 'it', + ]), + ]; } diff --git a/tests/src/Kernel/EntityMeshTestBase.php b/tests/src/Kernel/EntityMeshTestBase.php index e86ebf061685a078c31e78463988505b5a60d30d..9a0fbc9c32b7ef1e8beafe5291fe36a038ac995c 100644 --- a/tests/src/Kernel/EntityMeshTestBase.php +++ b/tests/src/Kernel/EntityMeshTestBase.php @@ -31,6 +31,7 @@ abstract class EntityMeshTestBase extends KernelTestBase { 'text', 'language', 'entity_mesh', + 'path_alias', ]; /** @@ -43,6 +44,7 @@ abstract class EntityMeshTestBase extends KernelTestBase { $this->installEntitySchema('configurable_language'); $this->installEntitySchema('node'); $this->installEntitySchema('user'); + $this->installEntitySchema('path_alias'); $this->installSchema('entity_mesh', ['entity_mesh']); $this->installConfig(['filter', 'node', 'system', 'language', 'entity_mesh']); $this->installSchema('node', ['node_access']);