function ContentTranslationHooks::pageAttachments
Implements hook_page_attachments().
File
-
core/
modules/ content_translation/ src/ Hook/ ContentTranslationHooks.php, line 507
Class
- ContentTranslationHooks
- Hook implementations for content_translation.
Namespace
Drupal\content_translation\HookCode
public function pageAttachments(&$page) : void {
$cache = CacheableMetadata::createFromRenderArray($page);
$route_match = \Drupal::routeMatch();
// If the current route has no parameters, return.
if (!($route = $route_match->getRouteObject()) || !($parameters = $route->getOption('parameters'))) {
return;
}
$is_front = \Drupal::service('path.matcher')->isFrontPage();
// Determine if the current route represents an entity.
foreach ($parameters as $name => $options) {
if (!isset($options['type']) || !str_starts_with($options['type'], 'entity:')) {
continue;
}
$entity = $route_match->getParameter($name);
if ($entity instanceof ContentEntityInterface && $entity->hasLinkTemplate('canonical')) {
// Current route represents a content entity. Build hreflang links.
foreach ($entity->getTranslationLanguages() as $language) {
// Skip any translation that cannot be viewed.
$translation = $entity->getTranslation($language->getId());
$access = $translation->access('view', NULL, TRUE);
$cache->addCacheableDependency($access);
if (!$access->isAllowed()) {
continue;
}
if ($is_front) {
// If the current page is front page, do not create hreflang links
// from the entity route, just add the languages to root path.
$url = Url::fromRoute('<front>', [], [
'absolute' => TRUE,
'language' => $language,
])->toString();
}
else {
$url = $entity->toUrl('canonical')
->setOption('language', $language)
->setAbsolute()
->toString();
}
$page['#attached']['html_head_link'][] = [
[
'rel' => 'alternate',
'hreflang' => $language->getId(),
'href' => $url,
],
];
}
}
// Since entity was found, no need to iterate further.
break;
}
// Apply updated caching information.
$cache->applyTo($page);
}
Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.