From 2cda71cda2f8ce7b2c9a63750c0b03d0496e4d94 Mon Sep 17 00:00:00 2001 From: Achim Fritz Date: Fri, 25 Sep 2026 15:34:36 +0200 Subject: [PATCH] [BUGFIX] Only offer languages with page translation The link browser listed every language of the site for a page, even if the page had no translation in that language. Editors could thus create links to non-existing page translations. getAllLanguages() now checks which translations of the page exist and only returns those languages. The default language and "all languages" (-1) are always kept. --- Classes/LinkHandler/PageLinkHandler.php | 32 +++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/Classes/LinkHandler/PageLinkHandler.php b/Classes/LinkHandler/PageLinkHandler.php index e834324..bb6b9a4 100644 --- a/Classes/LinkHandler/PageLinkHandler.php +++ b/Classes/LinkHandler/PageLinkHandler.php @@ -74,15 +74,39 @@ public function getBodyTagAttributes() } /** - * Short-hand function to select all registered languages + * Short-hand function to select all registered languages with page translation * * @return SiteLanguage[] */ - protected function getAllLanguages($pageId = null) + protected function getAllLanguages(int $pageId) { try { - $site = $this->siteFinder->getSiteByPageId($pageId ?? $this->linkParts['url']['pageuid'] ?? 0); - return $site->getAvailableLanguages($this->getBackendUser(), true); + $site = $this->siteFinder->getSiteByPageId($pageId); + $languages = $site->getAvailableLanguages($this->getBackendUser(), true); + $queryBuilder = $this->connectionPool->getQueryBuilderForTable('pages'); + $queryBuilder->getRestrictions()->removeAll()->add(new DeletedRestriction()); + $translations = $queryBuilder->select('sys_language_uid') + ->from('pages') + ->where( + $queryBuilder->expr()->eq( + 'l10n_parent', + $queryBuilder->createNamedParameter($pageId, ParameterType::INTEGER) + ) + ) + ->executeQuery() + ->fetchFirstColumn(); + $availableLanguages = []; + /** @var SiteLanguage $language */ + foreach ($languages as $language) { + if ($language->getLanguageId() < 1) { + $availableLanguages[$language->getLanguageId()] = $language; + continue; + } + if (in_array($language->getLanguageId(), $translations, true)) { + $availableLanguages[$language->getLanguageId()] = $language; + } + } + return $availableLanguages; } catch (SiteNotFoundException $e) { return []; }