International and hreflang
Per-hint hreflang fixtures covering the three declaration channels, reciprocity checking, the standard failure modes, and RTL documents.
Minimal, self-contained hreflang fixtures under /tests/international/. Each
mini-cluster isolates one behaviour so every error fires in exactly one
intended direction. The typed registry holds the authoritative alternate sets,
header values, and statuses; this page only explains the families.
Declaration channels
- Cluster A (
/tests/international/cluster-a/…) — a five-page reciprocal cluster (en, de, fr, es, x-default) declaring all five alternates via<link rel="alternate" hreflang>head elements. - Cluster B (
/tests/international/cluster-b/…) — a two-page reciprocal en/de cluster whose alternates arrive only in the HTTPLinkresponse header; the head deliberately carries none. - Cluster C (
/tests/international/cluster-c/…) — a two-page en/de cluster whose alternates exist only asxhtml:linkentries in the fixture sitemap at/tests/international/cluster-c/sitemap.xml.
Broken fixtures
Each variant is a closed mini-cluster that never references the correct clusters:
- Missing reciprocity —
page
adeclaresb, butbnever declaresaback. - Alternate target 404 — the declared German alternate answers HTTP 404.
- Alternate target 301 — the declared German alternate 301-redirects to a final URL.
- Invalid language codes
— the literal values
en-UKandenglishbeside a validenentry. - Multiple x-default — two x-default declarations with different hrefs.
- Language signal conflict —
html lang="en"against aContent-Language: deheader. - Mixed-locale canonical — a German cluster member canonicalised to its English counterpart.
RTL documents
Standalone Arabic and
Hebrew pages with dir="rtl", native-script
paragraphs, and ASCII fixture markers.
Fixtures in this category
- Hreflang cluster A — English —
cluster-a-en(safe) - Hreflang cluster A — Deutsch —
cluster-a-de(safe) - Hreflang cluster A — Français —
cluster-a-fr(safe) - Hreflang cluster A — Español —
cluster-a-es(safe) - Hreflang cluster A — language selector —
cluster-a-x-default(safe) - Hreflang cluster B — English (Link header) —
http-link-hreflang(safe) - Hreflang cluster B — Deutsch (Link header) —
http-link-hreflang-de(safe) - Hreflang cluster C — English (sitemap channel) —
xml-sitemap-hreflang-en(safe) - Hreflang cluster C — Deutsch (sitemap channel) —
xml-sitemap-hreflang-de(safe) - Hreflang cluster C — xhtml:link fixture sitemap —
xml-sitemap-hreflang(safe) - Hreflang broken — missing reciprocal, declaring side —
missing-reciprocal-a(moderate) - Hreflang broken — missing reciprocal, silent side —
missing-reciprocal-b(moderate) - Hreflang broken — alternate target returns 404 —
hreflang-target-404(moderate) - Hreflang broken — alternate target redirects —
hreflang-target-301(moderate) - Hreflang broken — invalid language codes —
invalid-language-code(moderate) - Hreflang broken — multiple x-default declarations —
multiple-x-default(moderate) - Hreflang broken — html lang vs Content-Language conflict —
html-lang-content-language-conflict(moderate) - Hreflang broken — German page canonicalised to English —
mixed-locale-canonical(moderate) - Hreflang broken — the self-canonical English counterpart —
mixed-locale-canonical-en(safe) - RTL fixture — Arabic —
rtl-arabic-page(safe) - RTL fixture — Hebrew —
rtl-hebrew-page(safe)