Skip to main content

What is Hreflang?

Hreflang is an HTML attribute that tells search engines and AI platforms which language and regional version of a page to show users. It’s essential for international websites and multilingual content.
Why it matters for AI: AI platforms like ChatGPT and Perplexity use hreflang to serve the correct language version when answering queries in different languages.

Basic Hreflang Syntax

<link rel="alternate" hreflang="en" href="https://asklantern.com">
<link rel="alternate" hreflang="es" href="https://asklantern.com/es">
<link rel="alternate" hreflang="fr" href="https://asklantern.com/fr">
<link rel="alternate" hreflang="x-default" href="https://asklantern.com">

Components:

  • rel=“alternate”: Indicates an alternative version
  • hreflang: Language (and optionally region) code
  • href: Full URL to that version

Language Codes

Use ISO 639-1 language codes:
<!-- Common languages -->
<link rel="alternate" hreflang="en" href="https://asklantern.com">       <!-- English -->
<link rel="alternate" hreflang="es" href="https://asklantern.com/es">   <!-- Spanish -->
<link rel="alternate" hreflang="fr" href="https://asklantern.com/fr">   <!-- French -->
<link rel="alternate" hreflang="de" href="https://asklantern.com/de">   <!-- German -->
<link rel="alternate" hreflang="pt" href="https://asklantern.com/pt">   <!-- Portuguese -->
<link rel="alternate" hreflang="it" href="https://asklantern.com/it">   <!-- Italian -->
<link rel="alternate" hreflang="ja" href="https://asklantern.com/ja">   <!-- Japanese -->
<link rel="alternate" hreflang="zh" href="https://asklantern.com/zh">   <!-- Chinese -->
<link rel="alternate" hreflang="ko" href="https://asklantern.com/ko">   <!-- Korean -->
<link rel="alternate" hreflang="ar" href="https://asklantern.com/ar">   <!-- Arabic -->

Regional Targeting

Combine language with region using ISO 3166-1 Alpha 2 country codes:
<!-- English variants -->
<link rel="alternate" hreflang="en-US" href="https://asklantern.com">        <!-- US English -->
<link rel="alternate" hreflang="en-GB" href="https://asklantern.com/uk">     <!-- UK English -->
<link rel="alternate" hreflang="en-AU" href="https://asklantern.com/au">     <!-- Australian English -->
<link rel="alternate" hreflang="en-CA" href="https://asklantern.com/ca">     <!-- Canadian English -->

<!-- Spanish variants -->
<link rel="alternate" hreflang="es-ES" href="https://asklantern.com/es">     <!-- Spain Spanish -->
<link rel="alternate" hreflang="es-MX" href="https://asklantern.com/es-mx">  <!-- Mexico Spanish -->
<link rel="alternate" hreflang="es-AR" href="https://asklantern.com/es-ar">  <!-- Argentina Spanish -->

<!-- Portuguese variants -->
<link rel="alternate" hreflang="pt-BR" href="https://asklantern.com/pt-br">  <!-- Brazilian Portuguese -->
<link rel="alternate" hreflang="pt-PT" href="https://asklantern.com/pt-pt">  <!-- Portugal Portuguese -->

<!-- French variants -->
<link rel="alternate" hreflang="fr-FR" href="https://asklantern.com/fr">     <!-- France French -->
<link rel="alternate" hreflang="fr-CA" href="https://asklantern.com/fr-ca">  <!-- Canadian French -->

<!-- Chinese variants -->
<link rel="alternate" hreflang="zh-CN" href="https://asklantern.com/zh-cn">  <!-- Simplified Chinese -->
<link rel="alternate" hreflang="zh-TW" href="https://asklantern.com/zh-tw">  <!-- Traditional Chinese -->

The x-default Tag

Always include an x-default tag as a fallback:
<link rel="alternate" hreflang="x-default" href="https://asklantern.com">
This tells AI/search engines which version to show when:
  • User’s language isn’t available
  • Language can’t be determined
  • Default landing page for international visitors

Implementation Methods

Add to the <head> section of each page:
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Lantern - AI Search Analytics</title>
  
  <!-- Hreflang tags -->
  <link rel="alternate" hreflang="en" href="https://asklantern.com">
  <link rel="alternate" hreflang="es" href="https://asklantern.com/es">
  <link rel="alternate" hreflang="fr" href="https://asklantern.com/fr">
  <link rel="alternate" hreflang="de" href="https://asklantern.com/de">
  <link rel="alternate" hreflang="x-default" href="https://asklantern.com">
</head>
<body>
  <!-- Content -->
</body>
</html>

2. HTTP Headers

Alternative method via HTTP headers:
Link: <https://asklantern.com>; rel="alternate"; hreflang="en",
      <https://asklantern.com/es>; rel="alternate"; hreflang="es",
      <https://asklantern.com/fr>; rel="alternate"; hreflang="fr",
      <https://asklantern.com>; rel="alternate"; hreflang="x-default"

3. XML Sitemap

Include in your sitemap.xml:
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
        xmlns:xhtml="http://www.w3.org/1999/xhtml">
  
  <url>
    <loc>https://asklantern.com</loc>
    <xhtml:link rel="alternate" hreflang="en" href="https://asklantern.com"/>
    <xhtml:link rel="alternate" hreflang="es" href="https://asklantern.com/es"/>
    <xhtml:link rel="alternate" hreflang="fr" href="https://asklantern.com/fr"/>
    <xhtml:link rel="alternate" hreflang="x-default" href="https://asklantern.com"/>
  </url>
  
  <url>
    <loc>https://asklantern.com/es</loc>
    <xhtml:link rel="alternate" hreflang="en" href="https://asklantern.com"/>
    <xhtml:link rel="alternate" hreflang="es" href="https://asklantern.com/es"/>
    <xhtml:link rel="alternate" hreflang="fr" href="https://asklantern.com/fr"/>
    <xhtml:link rel="alternate" hreflang="x-default" href="https://asklantern.com"/>
  </url>
  
</urlset>

Best Practices

All language versions must reference each other:
<!-- On EN page -->
<link rel="alternate" hreflang="en" href="https://asklantern.com">
<link rel="alternate" hreflang="es" href="https://asklantern.com/es">

<!-- On ES page -->
<link rel="alternate" hreflang="en" href="https://asklantern.com">
<link rel="alternate" hreflang="es" href="https://asklantern.com/es">
Always use full URLs, not relative paths:
<!-- Good -->
<link rel="alternate" hreflang="es" href="https://asklantern.com/es">

<!-- Bad -->
<link rel="alternate" hreflang="es" href="/es">
Each page should include a link to itself:
<!-- On the English page -->
<link rel="alternate" hreflang="en" href="https://asklantern.com">
<link rel="alternate" hreflang="es" href="https://asklantern.com/es">
Only use valid ISO 639-1 and ISO 3166-1 codes:
<!-- Good -->
<link rel="alternate" hreflang="en-US" href="https://asklantern.com">

<!-- Bad: Invalid code -->
<link rel="alternate" hreflang="english" href="https://asklantern.com">
Provide a default fallback version:
<link rel="alternate" hreflang="x-default" href="https://asklantern.com">

Common URL Structures

<link rel="alternate" hreflang="en" href="https://asklantern.com">
<link rel="alternate" hreflang="es" href="https://asklantern.com/es">
<link rel="alternate" hreflang="fr" href="https://asklantern.com/fr">
Pros: Easy to manage, good for SEO, clear structure Cons: Requires content organization

Subdomains

<link rel="alternate" hreflang="en" href="https://asklantern.com">
<link rel="alternate" hreflang="es" href="https://es.asklantern.com">
<link rel="alternate" hreflang="fr" href="https://fr.asklantern.com">
Pros: Clear separation, can use different servers Cons: Harder to manage, separate analytics

Separate Domains (ccTLDs)

<link rel="alternate" hreflang="en-US" href="https://asklantern.com">
<link rel="alternate" hreflang="en-GB" href="https://asklantern.co.uk">
<link rel="alternate" hreflang="es-ES" href="https://asklantern.es">
<link rel="alternate" hreflang="fr-FR" href="https://asklantern.fr">
Pros: Strong local signal, trust from users Cons: Expensive, complex management
<!-- Avoid this approach -->
<link rel="alternate" hreflang="es" href="https://asklantern.com?lang=es">
Why avoid: Parameters can be ignored, less clear for AI

Complete Multi-Language Setup

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  
  <!-- Page title and meta -->
  <title>Lantern - AI Search Analytics Platform</title>
  <meta name="description" content="Track your brand visibility across AI platforms">
  
  <!-- Hreflang tags for all language versions -->
  <link rel="alternate" hreflang="en" href="https://asklantern.com">
  <link rel="alternate" hreflang="es" href="https://asklantern.com/es">
  <link rel="alternate" hreflang="fr" href="https://asklantern.com/fr">
  <link rel="alternate" hreflang="de" href="https://asklantern.com/de">
  <link rel="alternate" hreflang="pt-BR" href="https://asklantern.com/pt-br">
  <link rel="alternate" hreflang="ja" href="https://asklantern.com/ja">
  <link rel="alternate" hreflang="zh-CN" href="https://asklantern.com/zh-cn">
  
  <!-- Regional variants -->
  <link rel="alternate" hreflang="en-US" href="https://asklantern.com">
  <link rel="alternate" hreflang="en-GB" href="https://asklantern.com/uk">
  <link rel="alternate" hreflang="en-AU" href="https://asklantern.com/au">
  
  <!-- Default fallback -->
  <link rel="alternate" hreflang="x-default" href="https://asklantern.com">
  
  <!-- Canonical URL -->
  <link rel="canonical" href="https://asklantern.com">
</head>
<body>
  <!-- Content -->
</body>
</html>

Hreflang for Different Page Types

Homepage

<link rel="alternate" hreflang="en" href="https://asklantern.com">
<link rel="alternate" hreflang="es" href="https://asklantern.com/es">
<link rel="alternate" hreflang="fr" href="https://asklantern.com/fr">
<link rel="alternate" hreflang="x-default" href="https://asklantern.com">

Product Pages

<link rel="alternate" hreflang="en" href="https://asklantern.com/products/analytics">
<link rel="alternate" hreflang="es" href="https://asklantern.com/es/productos/analiticas">
<link rel="alternate" hreflang="fr" href="https://asklantern.com/fr/produits/analytique">
<link rel="alternate" hreflang="x-default" href="https://asklantern.com/products/analytics">

Blog Posts

<link rel="alternate" hreflang="en" href="https://asklantern.com/blog/ai-search-guide">
<link rel="alternate" hreflang="es" href="https://asklantern.com/es/blog/guia-busqueda-ia">
<link rel="alternate" hreflang="fr" href="https://asklantern.com/fr/blog/guide-recherche-ia">
<link rel="alternate" hreflang="x-default" href="https://asklantern.com/blog/ai-search-guide">

Common Errors and Fixes

Missing return tags

Error: Spanish page doesn’t link back to English Fix: Add all hreflang tags to all versions

No self-reference

Error: Page doesn’t include link to itself Fix: Add self-referential hreflang tag

Wrong URL

Error: Relative URLs or broken links Fix: Use absolute URLs and verify they work

Missing x-default

Error: No fallback version specified Fix: Add x-default pointing to primary version

Invalid codes

Error: Using made-up language codes Fix: Use valid ISO codes only

Mixed with canonical

Error: Conflicting canonical and hreflang Fix: Canonical should match current page

Testing Hreflang Implementation

1

Google Search Console

Check for hreflang errors in International Targeting report
2

Hreflang Validator

Use tools like hreflang.org to validate
3

View page source

Manually verify tags are present in HTML
4

Check all pages

Ensure consistency across all language versions
5

Monitor with Lantern

Track how AI platforms handle your language versions

Dynamic Hreflang Implementation

JavaScript/Node.js

const languages = ['en', 'es', 'fr', 'de', 'pt-BR'];
const baseUrl = 'https://asklantern.com';
const currentPath = '/products/analytics';

function generateHreflang(lang, path) {
  const langPath = lang === 'en' ? '' : `/${lang}`;
  return `<link rel="alternate" hreflang="${lang}" href="${baseUrl}${langPath}${path}">`;
}

// Generate all hreflang tags
languages.forEach(lang => {
  console.log(generateHreflang(lang, currentPath));
});

// Add x-default
console.log(`<link rel="alternate" hreflang="x-default" href="${baseUrl}${currentPath}">`);

React/Next.js

import Head from 'next/head';

export default function Page({ languages, currentPath }) {
  return (
    <Head>
      {languages.map(lang => (
        <link
          key={lang}
          rel="alternate"
          hreflang={lang}
          href={`https://asklantern.com${lang === 'en' ? '' : `/${lang}`}${currentPath}`}
        />
      ))}
      <link
        rel="alternate"
        hreflang="x-default"
        href={`https://asklantern.com${currentPath}`}
      />
    </Head>
  );
}

Hreflang Checklist

1

All versions linked

✅ Every language version references all others
2

Self-referential

✅ Each page includes link to itself
3

Absolute URLs

✅ All URLs are complete (https://…)
4

Valid codes

✅ Using correct ISO language/country codes
5

x-default included

✅ Default fallback version specified
6

Bidirectional

✅ Links go both ways between versions
7

Consistent

✅ Same structure on all language pages
Important: Hreflang doesn’t translate your content - it only tells AI/search engines which version to show. You still need actual translated content.
When properly implemented, hreflang helps AI platforms:
  • 🌍 Serve the right language to users
  • 📍 Understand regional targeting
  • 🔍 Avoid duplicate content issues
  • ✅ Index all language versions correctly
  • 💬 Cite the appropriate language version in responses

Next Steps

Back to Content Structure

Review the complete content optimization guide