hreflang Done Right: A Copy-Paste Checklist for Multilingual Sites

The three most common indexing accidents on multilingual sites: language versions competing for the same queries, canonicals pointing across languages, and wrong language codes. Here are the full rules, four common misconfigurations with fixes, and a pre-launch checklist.

Tagshreflangmultilingual seointernational seo
hreflang Done Right: A Copy-Paste Checklist for Multilingual Sites
目录

Most multilingual SEO failures are not translation problems — they are unstated relationships between language versions. The consequences are concrete: several languages competing for the same queries, or Google keeping one version and discarding the rest as duplicates.

hreflang declares that relationship. It is not hard, but it has details, and getting it wrong raises no error: pages keep loading while indexing quietly degrades. Below is a checklist you can copy.

The two problems hreflang solves

  1. Not treating translations as duplicates: the Chinese and English versions of one article correspond closely; without a declared relationship Google may keep only one URL.
  2. Serving the right language to the right people: German users landing on an English page and Japanese users on a Chinese one makes for bad bounce rates.

The four mandatory relationships

hreflang is bidirectional. The rule: every language version lists all versions, including itself. Omit one entry and it does not take effect.

PointCorrect practice
Cross-referencingThe Chinese page lists zh / en / x-default, and the English page lists the same three; break one and it fails
Self-referenceThe Chinese page must include a zh entry pointing to itself
Absolute URLsUse full https://domain/... addresses, never relative paths
x-defaultExactly one, for visitors matching no language (usually the English version or a language picker)

Three ways to declare it — pick one

Option A: link tags in the HTML head (most common)

<link rel="alternate" hreflang="zh-CN" href="https://example.com/jz-seo/post" />
<link rel="alternate" hreflang="en"    href="https://example.com/en/jz-seo/post" />
<link rel="alternate" hreflang="x-default" href="https://example.com/en/jz-seo/post" />

Option B: HTTP headers (for non-HTML files such as PDFs)

Link: <https://example.com/en/jz-seo/post>; rel="alternate"; hreflang="en"

Option C: in the sitemap (easiest to maintain at scale)

<url>
  <loc>https://example.com/jz-seo/post</loc>
  <xhtml:link rel="alternate" hreflang="zh-CN" href="https://example.com/jz-seo/post"/>
  <xhtml:link rel="alternate" hreflang="en"    href="https://example.com/en/jz-seo/post"/>
</url>

These can coexist, but they must say exactly the same thing. Conflicting declarations are the single most common failure: Google simply ignores both.

Four frequent misconfigurations and their fixes

MistakeSymptomFix
One-way onlyThe English page is not recognised as the counterpart of the Chinese oneMake it bidirectional; both sides must list identical sets
Wrong language codeszh while the site is zh-CN, or en-UK (should be en-GB)ISO 639-1 language code plus optional ISO 3166-1 region, in that order
Cross-language canonicalsThe Chinese page's canonical points at the English pagecanonical must be self-referencing; cross-language relationships belong to hreflang only
Pointing at missing or redirected URLshreflang targets do not openPoint everything at canonical 200 URLs

The second one deserves emphasis: hreflang expects language-region. zh-CN is valid, CN-zh is not, and en-UK uses the wrong region code (the United Kingdom is GB). None of these raise errors; they just silently fail.

URL structure: avoid language parameters

StructureExampleVerdict
Subdirectoryexample.com/en/...Recommended: authority stays on one domain, simple to configure
Subdomainen.example.comAcceptable; suits separately deployed sites
Parameterexample.com/?lang=enAvoid: parameter URLs get canonicalised away and hreflang becomes unmanageable

Also: every language needs its own URL. Switching copy in the browser while the address stays the same (what translation widgets do) means Google sees one URL, so the other languages effectively do not exist.

Do not substitute a translation widget for a multilingual architecture

Translation widgets typically do three things: swap text with JavaScript, keep the URL unchanged, and produce no indexable page. To Google your site has one language. Covering minority-language markets requires per-language content rows, distinct URLs, and distinct hreflang.

Pre-launch checklist

  • [ ] Every language version carries an identical hreflang set, including a self-reference;
  • [ ] Exactly one x-default;
  • [ ] All hreflang URLs are absolute and return 200;
  • [ ] Every page's canonical points at itself, never across languages;
  • [ ] Language codes are ISO 639-1 plus optional ISO 3166-1, in language-region order;
  • [ ] Any hreflang declared in the sitemap matches the HTML;
  • [ ] GSC's International Targeting report shows no hreflang errors;
  • [ ] Each language has its own titles, descriptions and keywords, not one shared translation.

The last item is commonly skipped: if the English page's <title> is still Chinese, perfect hreflang will not win English traffic. Per-language TDK management and multilingual content are the same job.

Further reading

hreflang declares relationships; it does not make pages crawlable. If language versions stay out of the index, run the 7-step indexing diagnosis first. Getting these foundations right (server rendering, self-referencing canonicals, per-language hreflang and TDK) belongs in the build — see the Standard build deliverables.