/ Hreflang Fixes / Language Codes

How to Fix Hreflang Language Codes

Hreflang uses ISO 639-1 for language and ISO 3166-1 alpha-2 for region. The wrong codes get silently rejected by Google — your annotation looks fine in source, but Google treats it as missing. Common traps: en-UK (correct is en-GB), cn for Chinese (correct is zh), made-up regional variants. This guide lists the codes, the convention mistakes, and the validation patterns.

1. The format

Hreflang values follow BCP 47 but in practice use one of two shapes:

<!-- Language only -->
<link rel="alternate" hreflang="en" href="/aipageseo-demo-pages/hreflang-fixes-index.html" />
<link rel="alternate" hreflang="fr" href="/aipageseo-demo-pages/hreflang-fixes-index.html" />

<!-- Language + region -->
<link rel="alternate" hreflang="en-GB" href="/aipageseo-demo-pages/hreflang-fixes-index.html" />
<link rel="alternate" hreflang="en-US" href="/aipageseo-demo-pages/hreflang-fixes-index.html" />
<link rel="alternate" hreflang="fr-CA" href="/aipageseo-demo-pages/hreflang-fixes-index.html" />
<link rel="alternate" hreflang="zh-CN" href="/aipageseo-demo-pages/hreflang-fixes-index.html" />

<!-- Special fallback -->
<link rel="alternate" hreflang="x-default" href="/aipageseo-demo-pages/hreflang-fixes-index.html" />

Convention

2. Common language codes (ISO 639-1)

LanguageCodeCommon mistake
Englishen
Frenchfr
GermandeSome use ge — wrong
SpanishesSome use sp — wrong
Portuguesept
Italianit
Chinesezhcn is a region code, not language
JapanesejaSome use jp — that's region
KoreankoSome use kr — that's region
Arabicar
Russianru
DutchnlSome use du — wrong
SwedishsvSome use se — that's region
HebrewheSome use iw (deprecated)
Hindihi
Polishpl
Turkishtr

3. Common region codes (ISO 3166-1 alpha-2)

RegionCodeCommon mistake
United KingdomGBUK is NOT an ISO code
United StatesUS
GermanyDE
FranceFR
SpainES
ItalyIT
ChinaCN
JapanJP
BrazilBRbr is also Breton language — case matters in tooling
CanadaCA
MexicoMX
AustraliaAU
IndiaIN
Hong KongHK
TaiwanTW
NetherlandsNL

4. Common combined patterns

en          — English, any region
en-GB       — English, United Kingdom (NOT en-UK)
en-US       — English, United States
en-AU       — English, Australia
en-CA       — English, Canada

fr          — French, any region
fr-FR       — French, France
fr-CA       — French, Canada
fr-BE       — French, Belgium
fr-CH       — French, Switzerland

es          — Spanish, any region
es-ES       — Spanish, Spain
es-MX       — Spanish, Mexico
es-AR       — Spanish, Argentina

zh          — Chinese, any region (rarely used alone)
zh-CN       — Chinese, China (simplified)
zh-TW       — Chinese, Taiwan (traditional)
zh-HK       — Chinese, Hong Kong
zh-Hans     — Chinese, simplified script (BCP 47 extension)
zh-Hant     — Chinese, traditional script

pt          — Portuguese
pt-BR       — Portuguese, Brazil
pt-PT       — Portuguese, Portugal

x-default   — Fallback for unmatched locales

5. Validation

Programmatic check

// JavaScript example
const VALID_LANGUAGES = new Set([
  'aa','ab','ae','af','ak','am','an','ar','as','av','ay','az',
  'ba','be','bg','bh','bi','bm','bn','bo','br','bs',
  'ca','ce','ch','co','cr','cs','cu','cv','cy',
  'da','de','dv','dz',
  'ee','el','en','eo','es','et','eu',
  // ... full ISO 639-1 list
]);

const VALID_REGIONS = new Set([
  'AD','AE','AF','AG','AI','AL','AM','AO','AQ','AR','AS','AT','AU','AW','AX','AZ',
  'BA','BB','BD','BE','BF','BG','BH','BI','BJ','BL','BM','BN','BO','BQ','BR','BS',
  // ... full ISO 3166-1 alpha-2 list
]);

function validateHreflang(code) {
  if (code === 'x-default') return true;
  
  const parts = code.split('-');
  if (parts.length === 1) {
    return VALID_LANGUAGES.has(parts[0].toLowerCase());
  }
  if (parts.length === 2) {
    return VALID_LANGUAGES.has(parts[0].toLowerCase()) &&
           VALID_REGIONS.has(parts[1].toUpperCase());
  }
  return false;
}

Node libraries

npm install bcp-47

const { parse } = require('bcp-47');
const result = parse('en-GB');
console.log(result.language);  // 'en'
console.log(result.region);    // 'GB'
// Returns null for invalid tags

6. Common mistakes and fixes

<!-- WRONG: en-UK -->
<link rel="alternate" hreflang="en-UK" href="/aipageseo-demo-pages/hreflang-fixes-index.html" />

<!-- RIGHT: en-GB -->
<link rel="alternate" hreflang="en-GB" href="/aipageseo-demo-pages/hreflang-fixes-index.html" />

<!-- WRONG: cn for Chinese language -->
<link rel="alternate" hreflang="en" href="/aipageseo-demo-pages/hreflang-fixes-index.html" />

<!-- RIGHT: zh for language, optionally zh-CN for China region -->
<link rel="alternate" hreflang="zh-CN" href="/aipageseo-demo-pages/hreflang-fixes-index.html" />

<!-- WRONG: underscore separator -->
<link rel="alternate" hreflang="en_GB" href="/aipageseo-demo-pages/hreflang-fixes-index.html" />

<!-- RIGHT: hyphen -->
<link rel="alternate" hreflang="en-GB" href="/aipageseo-demo-pages/hreflang-fixes-index.html" />

<!-- WRONG: REGION-language order -->
<link rel="alternate" hreflang="GB-en" href="/aipageseo-demo-pages/hreflang-fixes-index.html" />

<!-- RIGHT: language-REGION -->
<link rel="alternate" hreflang="en-GB" href="/aipageseo-demo-pages/hreflang-fixes-index.html" />

7. Verify the fix

Step 1
Re-run Hreflang Checker
Invalid code findings clear. Each annotation parses as valid BCP 47.
Step 2
Search Console International Targeting
Legacy International Targeting report (if accessible) should show no "Incorrect hreflang values" errors.
💡 The most common mistake is en-UK. UK isn't an ISO country code — Great Britain is GB. Almost every site that targets the UK starts with en-UK and silently fails until the audit catches it. Always en-GB.

🌍 Re-run the Hreflang Checker

Verify all language and region codes parse correctly.

Run Hreflang Checker →
Related Guides: Hreflang Fixes  ·  Fix Return Tags  ·  Fix x-default  ·  Hreflang Guide
💬 Got a problem?