TechLead
Lesson 13 of 13
5 min read
SEO

International SEO

Hreflang tags, multilingual sites, and geo-targeting

International SEO

International SEO helps your website reach audiences in different countries and languages. It involves technical implementation and content strategy for global markets.

URL Structures for International Sites

ccTLDs (Country Code Top-Level Domains)

example.fr, example.de, example.co.uk

Strongest geo signal, but expensive and harder to manage

Subdirectories

example.com/fr/, example.com/de/

Recommended - consolidates authority, easy to manage

Subdomains

fr.example.com, de.example.com

Treated as separate sites, harder to share authority

Hreflang Implementation

Hreflang tells search engines which language/region a page targets:

<!-- In <head> of each page -->
<link rel="alternate" hreflang="en" href="https://example.com/page" />
<link rel="alternate" hreflang="es" href="https://example.com/es/page" />
<link rel="alternate" hreflang="fr" href="https://example.com/fr/page" />
<link rel="alternate" hreflang="de" href="https://example.com/de/page" />
<link rel="alternate" hreflang="x-default" href="https://example.com/page" />

<!-- Language + Region targeting -->
<link rel="alternate" hreflang="en-US" href="https://example.com/en-us/page" />
<link rel="alternate" hreflang="en-GB" href="https://example.com/en-gb/page" />
<link rel="alternate" hreflang="es-ES" href="https://example.com/es-es/page" />
<link rel="alternate" hreflang="es-MX" href="https://example.com/es-mx/page" />

Next.js i18n Configuration

// next.config.js
module.exports = {
  i18n: {
    locales: ['en', 'es', 'fr', 'de'],
    defaultLocale: 'en',
    localeDetection: true,
  },
};

// app/[locale]/layout.tsx
export async function generateStaticParams() {
  return [
    { locale: 'en' },
    { locale: 'es' },
    { locale: 'fr' },
    { locale: 'de' },
  ];
}

// Generate hreflang in metadata
export async function generateMetadata({ params }) {
  const locales = ['en', 'es', 'fr', 'de'];
  const alternates = {
    languages: {},
  };

  locales.forEach(locale => {
    alternates.languages[locale] = `https://example.com/${locale}/page`;
  });

  return {
    alternates,
  };
}

Content Localization Best Practices

Do:

  • Translate AND localize content
  • Use native speakers for translation
  • Localize dates, currencies, numbers
  • Research keywords per market
  • Consider cultural differences

Don't:

  • Use auto-translation alone
  • Copy English keywords directly
  • Ignore local search engines
  • Forget right-to-left languages
  • Mix languages on same page

Common Hreflang Mistakes

  • Missing return links: Every page must link to all language versions including itself
  • Wrong language codes: Use ISO 639-1 codes (en, es, fr, not english, spanish)
  • Missing x-default: Always include a default fallback
  • Inconsistent URLs: Use absolute URLs consistently
  • Conflicting canonicals: Canonical and hreflang must align

Continue Learning