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.

目录
- The two problems hreflang solves
- The four mandatory relationships
- Three ways to declare it — pick one
- Option A: link tags in the HTML head (most common)
- Option B: HTTP headers (for non-HTML files such as PDFs)
- Option C: in the sitemap (easiest to maintain at scale)
- Four frequent misconfigurations and their fixes
- URL structure: avoid language parameters
- Do not substitute a translation widget for a multilingual architecture
- Pre-launch checklist
- Further reading
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
- 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.
- 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.
| Point | Correct practice |
|---|---|
| Cross-referencing | The Chinese page lists zh / en / x-default, and the English page lists the same three; break one and it fails |
| Self-reference | The Chinese page must include a zh entry pointing to itself |
| Absolute URLs | Use full https://domain/... addresses, never relative paths |
| x-default | Exactly 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
| Mistake | Symptom | Fix |
|---|---|---|
| One-way only | The English page is not recognised as the counterpart of the Chinese one | Make it bidirectional; both sides must list identical sets |
| Wrong language codes | zh 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 canonicals | The Chinese page's canonical points at the English page | canonical must be self-referencing; cross-language relationships belong to hreflang only |
| Pointing at missing or redirected URLs | hreflang targets do not open | Point 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
| Structure | Example | Verdict |
|---|---|---|
| Subdirectory | example.com/en/... | Recommended: authority stays on one domain, simple to configure |
| Subdomain | en.example.com | Acceptable; suits separately deployed sites |
| Parameter | example.com/?lang=en | Avoid: 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.
