getRequest(); $pageInformation = $request->getAttribute('frontend.page.information'); $pageRecord = $pageInformation->getPageRecord(); if ((int)$pageRecord['no_index'] === 1) { return; } $this->cObj->setRequest($event->getRequest()); $languages = $this->languageMenuProcessor->process($this->cObj, [], [], []); $site = $request->getAttribute('site'); $siteLanguage = $request->getAttribute('language', $site->getDefaultLanguage()); $pageId = $pageInformation->getId(); $hrefLangs = $event->getHrefLangs(); foreach ($languages['languagemenu'] as $language) { if (!empty($language['link']) && $language['hreflang']) { if ($language['languageId'] === 0) { // No need to fetch default language $page = ($pageRecord['_TRANSLATION_SOURCE'] ?? null)?->toArray(true) ?? $pageRecord; } elseif ($language['languageId'] === ($pageRecord['_REQUESTED_OVERLAY_LANGUAGE'] ?? false)) { // No need to fetch current language $page = $pageRecord; } else { $page = $this->getTranslatedPageRecord($pageId, $language['languageId'], $site); } // do not set hreflang if a page is not translated explicitly if (empty($page)) { continue; } // do not set hreflang when canonical is set explicitly if (!empty($page['canonical_link'])) { continue; } $href = $this->getAbsoluteUrl($language['link'], $siteLanguage); $hrefLangs[$language['hreflang']] = $href; } } if (count($hrefLangs) > 1) { if (array_key_exists($languages['languagemenu'][0]['hreflang'], $hrefLangs)) { $hrefLangs['x-default'] = $hrefLangs[$languages['languagemenu'][0]['hreflang']]; } } $event->setHrefLangs($hrefLangs); } protected function getAbsoluteUrl(string $url, SiteLanguage $siteLanguage): string { $uri = new Uri($url); if (empty($uri->getHost())) { $url = $siteLanguage->getBase()->withPath($uri->getPath()); if ($uri->getQuery()) { $url = $url->withQuery($uri->getQuery()); } } return (string)$url; } protected function getTranslatedPageRecord(int $pageId, int $languageId, Site $site): array { $targetSiteLanguage = $site->getLanguageById($languageId); $languageAspect = LanguageAspectFactory::createFromSiteLanguage($targetSiteLanguage); $context = clone GeneralUtility::makeInstance(Context::class); $context->setAspect('language', $languageAspect); $pageRepository = GeneralUtility::makeInstance(PageRepository::class, $context); $pageRecord = $pageRepository->getPage($pageId); // Overlay was requested but did not apply if ($languageId > 0 && !isset($pageRecord['_LOCALIZED_UID'])) { return []; } return $pageRecord; } }