# Drupal 11 multilingual SEO and hreflang

Language domains, hreflang, metatag translation and canonicals on Drupal 11. Avoid duplicate locale traps.

- Date: 2026-08-04
- Category: Drupal

Drupal hreflang is the multilingual SEO job I check before I believe a Drupal 11 site is "done" in two languages. I am Alan Vo, a Gold Coast web developer with 18 years on CMS and storefronts. In 2026 core language modules can emit hreflang, and you can still ship duplicate locale traps with the wrong domain map, a canonical that always points at English, or Metatag that never got translated. Bilingual museum and cruise catalogues taught me to treat language as architecture, not as a dropdown on a node.

This note is for Drupal 11 sites using Content Translation (and usually Interface and Configuration Translation). It sits beside the [Drupal SEO Tools recipe](https://alanvo.com/blog/drupal-seo-tools-recipe/) and the same on-page rules I use on stores in [on-page SEO for ecommerce](https://alanvo.com/blog/on-page-seo-ecommerce/). The [multilingual Drupal guide](https://www.drupal.org/docs/multilingual-guide) is the core map for Language, prefixes, and domains.

## Why Drupal hreflang still fails on otherwise good sites

Drupal hreflang still fails on otherwise good sites because language negotiation, aliases, canonicals, and sitemaps are four settings that can disagree. Hreflang is a hint to search engines about locale variants of the same page. If French canonicals point at English, you told Google the English URL is the one true page. If the French URL is noindex, hreflang pointing at it is noise. If there is no `x-default`, some setups still work; many teams want `x-default` on the default language home. Pick a rule and implement it everywhere.

Drupal can serve prefixes (`/fr/node`) or domains (`fr.example.org`) or both. Museums and governments often want domains or ccTLDs. Brands often want prefixes. Mixing them without a written map is how you get two French homes. I write the map in the repo: language, domain or prefix, default, and whether unpublished translations 404 or fall back.

Fallback is the silent duplicate. If French is missing and Drupal shows English on the French prefix, you have two English URLs. I prefer a 404 or a clear "not translated" page that is noindex, or I hide the language switcher for missing translations. Showing English with a French prefix is the trap.

ROM-style bilingual rebuilds need both languages in the sitemap, both in hreflang, and menus that do not leak the other locale's IDs. Cruise-style catalogues (even when the storefront is Magento elsewhere in my work) have the same URL discipline: each locale needs a self-canonical and pointers to siblings.

## How Drupal hreflang actually works

Drupal hreflang actually works as link tags (and sometimes HTTP headers) listing each translation's absolute URL plus a language code, including `x-default` if you configure it. Core Content Translation plus the Language module is the base. Metatag can also output hreflang if you enable that plugin and do not duplicate core. I pick one printer. Two printers mean duplicate link tags, which is sloppy and can confuse debugging.

![Drupal hreflang documentation open beside a laptop](../../images/blog/drupal-multilingual-hreflang-1.jpg)

Language detection order matters. URL first (prefix or domain) is what I want for public pages. Session or browser language for anonymous visitors on a canonical SEO URL is how you get uncacheable homepages and the wrong locale in Googlebot if something goes wrong. I keep browser detection for the first hit to a domain that then redirects to a prefix, if marketing insists, and I cache that redirect carefully.

Aliases must be per language. Pathauto patterns should include a language-aware pattern so French is not `/node/45` while English is `/exhibitions/name`. I crawl both languages. I want human aliases in both.

Canonicals must be per language. The French page's canonical is the French alias. Never "canonical to English for duplicate consolidation" on a real translation. That pattern is for true duplicates, not for translations.

hreflang codes must match the language. `en-CA` vs `en` vs `fr-CA` is a business choice for a Canadian museum. Inconsistent codes (`fr` on one page, `fr-FR` on another) are a bug. I set the language entity's code and use it everywhere.

Absolute URLs in hreflang must be the live scheme and host. Staging host in a render cache is a classic launch bug. I purge and re-crawl after DNS cutover.

Sitemaps: Simple XML Sitemap should include translations as separate URLs, and some setups add hreflang inside the sitemap. HTML link tags and sitemap annotations should agree. If the sitemap omits French, assume Google is slower to find French.

## Drupal hreflang production checklist

1. Freeze the language list. Do not add `pt-pt` and `pt-br` as an afterthought without aliases and menus.
2. Choose prefix vs domain vs hybrid. Document it. Configure Language detection to match.
3. Set Pathauto per language. Generate aliases. Fix the leftovers with Redirect, not with hope.
4. Confirm each translation has its own canonical (Metatag or core).
5. Enable a single hreflang output path (core or Metatag, not both).
6. Add `x-default` if that is the agreed rule, usually the default language home and default language node.
7. Hide or disable language switcher links to missing translations. Do not fall back silently on the same path.
8. Include all indexable translations in the XML sitemap. Exclude unpublished.
9. Translate Metatag description and title. Empty French description is a quality issue.
10. Check views and listings: a French view that lists English titles is a leak.
11. Cache contexts must include language. Anonymous page cache serving English HTML on `/fr` is a P1.
12. Crawl with a bot UA. View source on French and English. Count `hreflang` link tags. They should list the cluster, including self.

![Team workshop around a table planning a CMS rebuild](../../images/blog/drupal-multilingual-hreflang-2.jpg)

I test a node with three states: both published, only default published, translation unpublished after being public (redirect or 410).

## What breaks Drupal hreflang clusters

Drupal hreflang clusters break when detection, cache, and canonical disagree.

Failure modes:

- Duplicate hreflang from Metatag and core.
- Relative URLs in link tags.
- `en` and `en-us` mixed on one site.
- Language switcher to `/fr` homepage from every English node instead of the translated node.
- Domain language negotiation with SSL only on the default host.
- Commerce or donation forms that reset to default language after POST.
- File and media URLs shared without language where the alt text is English only (less of an hreflang issue, still an a11y issue).
- Google Search Console international targeting fighting hreflang. Prefer hreflang as the source of truth for page-level locales.

Interface translation missing a string is not an SEO failure. Content translation missing a body with a published French alias is. I do not publish empty shells to "complete hreflang". Empty shells are thin.

Metatag translation is its own pass. Configuration Translation must cover Metatag defaults if the pattern itself contains English words ("Visit", "Exhibition", "Membership"). Token-only patterns like `[node:title]` still need the node title translated. Open Graph locale tags should match the page language (`fr_CA` vs `en_CA` on a Canadian museum). I view source on both locales after a cache rebuild. Sharing a French exhibition URL into a messenger and seeing an English OG title is a launch bug, not a "later" ticket.

Search Console wants a property that can see both prefixes, or separate domain properties if you use language domains. I submit both language sitemaps or one sitemap that lists both. I use the URL inspection tool on a French node and on its English sibling. If inspection shows "duplicate, Google chose different canonical than user" and the chosen one is the other language, the cluster is still wrong. Fix canonicals and hreflang, wait, inspect again. Do not add a third domain redirect "to simplify" while that report is open. You will hide the evidence.

![Library stacks used as a stand-in for structured content](../../images/blog/drupal-multilingual-hreflang-3.jpg)

PDF and file translations are out of hreflang's comfort zone. A French page that links an English-only PDF is a content gap. I still want the HTML cluster correct. I do not invent hreflang for binary files unless we also host a French file at a stable URL.

## How to measure multilingual SEO on Drupal 11

Measure multilingual SEO with Search Console (if you have properties per domain or one property with both prefixes), with a crawler that fetches each language, and with a sample of `site:` queries per locale. I want:

- Every indexable French URL in the sitemap and in a hreflang cluster with its English sibling.
- No canonical from French to English on those pairs.
- No accidental English body on French prefixes (view source, not the switcher).
- Title tags unique per locale, not machine-copied.

Field traffic by country is not the same as by language. A user in France can read English. Do not panic if country reports and language prefixes disagree. Panic if French URLs 404 or redirect to English.

## Related work on this site

Bilingual Drupal is explicit on the [Royal Ontario Museum rebuild](https://alanvo.com/work/royal-ontario-museum/): exhibitions, membership, and visits in more than one language. I also shipped multilingual catalogue discipline on [Rivages du Monde](https://alanvo.com/work/rivages-du-monde/), a Magento cruise storefront, where locale URLs and canonicals still decide whether you duplicate a trip page. ROM was contract development on an agency team, as was Rivages. The Drupal-specific wiring is language modules, aliases, Metatag, and hreflang. The Magento case is here because the SEO failure mode is the same even when the CMS is not.

## FAQ

### Does Drupal hreflang require a separate module in Drupal 11?

Drupal hreflang does not always require a separate module. Core language and content translation can emit the links. Metatag can too. I add a dedicated hreflang module only if core and Metatag cannot express domain rules I need. I never enable three systems.

### Should Drupal hreflang use prefixes or domains?

Drupal hreflang works with prefixes or domains if they are consistent and crawlable. Domains need SSL, sitemaps, and Search Console properties thought through. Prefixes are simpler ops. The SEO difference is operations quality, not a magic ranking bonus for domains.

![Government-style office desks and screens](../../images/blog/drupal-multilingual-hreflang-4.jpg)

### Can I omit Drupal hreflang and rely on Search Console targeting?

You should not omit Drupal hreflang on a true multilingual site and rely only on Search Console targeting. Targeting is a property-level hint. Hreflang is page-level. Use both when you have country properties, but still ship clusters.

### What is the most common Drupal hreflang bug you fix?

The most common Drupal hreflang bug I fix is French (or the second language) canonicalising to English, or English HTML cached on the French prefix. Fix canonicals and cache contexts first. The link tags will not save a duplicate.



HTML version: https://alanvo.com/blog/drupal-multilingual-hreflang/
