Introduction
Optimizing multilingual sites for search engines isn't just about translation quality. Search engines need explicit signals to understand which pages are translations of each other, which markets they target, and which version to serve to which users.
This checklist covers 15 requirements for effective SEO for a global audience.
Note: If your website isn't already multilingual (or if you want a better developer experience for your multilingual website), be sure to check out Lingo.dev.
1. Structure your URLs with language subdirectories
Use subdirectories with ISO language codes to organize your multilingual content. This consolidates domain authority while keeping language versions separate and identifiable.
- https://example.com/en/
- https://example.com/de/
- https://example.com/fr/
- https://example.com/en-gb/
- https://example.com/es-mx/
2. Add bidirectional hreflang tags to your HTML
Tell search engines about all language versions by adding hreflang tags to every page. Each page must reference all variants including itself.
<link rel="alternate" hreflang="en" href="https://example.com/en/products/" />
<link rel="alternate" hreflang="de" href="https://example.com/de/produkte/" />
<link rel="alternate" hreflang="es" href="https://example.com/es/productos/" />
<link rel="alternate" hreflang="x-default" href="https://example.com/en/products/" />
3. Set the HTML lang attribute correctly
Match the lang attribute to your page's actual content language. Browsers and screen readers use this to render text and select pronunciation rules correctly.
<html lang="en">
<html lang="de">
<html lang="es-MX">
<html lang="zh-CN">
4. Point canonical tags to same-language versions
Canonical tags should reference the same language version to avoid duplicate content issues. Never point a German page's canonical to the English version.
<link rel="canonical" href="https://example.com/en/product/" />
<link rel="canonical" href="https://example.com/de/produkt/" />
5. Generate localized URL slugs
Translate your URL slugs to match the content language. This improves user experience and local search relevance.
const slugs = {
'about': { en: 'about', de: 'ueber-uns', es: 'acerca-de' },
'products': { en: 'products', de: 'produkte', es: 'productos' }
};
const url = `/${lang}/${slugs['about'][lang]}/`;
6. Include hreflang annotations in your XML sitemap
Add hreflang markup to your sitemap as a secondary discovery method. This reinforces the signal for search engines, especially on large sites.
<url>
<loc>https://example.com/en/products/</loc>
<xhtml:link rel="alternate" hreflang="en" href="https://example.com/en/products/" />
<xhtml:link rel="alternate" hreflang="de" href="https://example.com/de/produkte/" />
<xhtml:link rel="alternate" hreflang="x-default" href="https://example.com/en/products/" />
</url>
7. Organize sitemaps by language
Split your XML sitemaps by language for better crawl efficiency and clearer Search Console organization.
<sitemapindex>
<sitemap>
<loc>https://example.com/sitemap_en.xml</loc>
</sitemap>
<sitemap>
<loc>https://example.com/sitemap_de.xml</loc>
</sitemap>
<sitemap>
<loc>https://example.com/sitemap_es.xml</loc>
</sitemap>
</sitemapindex>
8. Build language-aware internal links
Keep all internal links within the same language version. This prevents users from jumping between languages unexpectedly.
const currentLang = window.location.pathname.split('/')[1];
const productLink = `/${currentLang}/products/`;
9. Detect language preferences from Accept-Language header
Parse the Accept-Language header to suggest appropriate language versions. Show this as an optional banner rather than forcing redirects, which can hurt SEO.
const acceptLang = request.headers['accept-language'];
const userLangs = acceptLang.split(',').map(l => l.split(';')[0].substring(0, 2));
if (userLangs[0] !== currentLang) {
showBanner(`View in ${userLangs[0]}?`);
}
10. Add language-specific Schema.org markup
Include the inLanguage property in your structured data so search engines understand the language context of your content.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "WebPage",
"name": "Product Details",
"inLanguage": "en",
"url": "https://example.com/en/product/"
}
</script>
11. Configure language-specific Open Graph tags
Set Open Graph metadata for each language version to ensure proper display when shared on social platforms.
<meta property="og:locale" content="en_US" />
<meta property="og:locale:alternate" content="de_DE" />
<meta property="og:title" content="Wireless Headphones" />
<meta property="og:locale" content="de_DE" />
<meta property="og:locale:alternate" content="en_US" />
<meta property="og:title" content="Kabellose Kopfhörer" />
12. List language sitemaps in robots.txt
Declare all language-specific sitemaps in robots.txt to help search engines discover them.
User-agent: *
Allow: /
Sitemap: https://example.com/sitemap_en.xml
Sitemap: https://example.com/sitemap_de.xml
Sitemap: https://example.com/sitemap_es.xml
13. Send Content-Language HTTP headers
Add Content-Language headers to provide an additional language signal that both search engines and browsers can use.
const lang = request.path.split('/')[1];
response.setHeader('Content-Language', lang);
14. Add resource hints for region-specific CDNs
Use preconnect and dns-prefetch hints to speed up connections to region-specific CDN servers and improve Core Web Vitals.
<link rel="preconnect" href="https://cdn-eu.example.com">
<link rel="dns-prefetch" href="https://cdn-eu.example.com">
<link rel="preconnect" href="https://cdn-asia.example.com">
15. Load geo-specific third-party resources conditionally
Load region-specific resources like payment providers or analytics scripts based on user location to improve relevance and performance.
const paymentScripts = {
'us': 'https://js.stripe.com/v3/',
'eu': 'https://js.stripe.com/v3/',
'cn': 'https://cdn.alipay.com/sdk.js'
};
const script = document.createElement('script');
script.src = paymentScripts[userRegion];
document.head.appendChild(script);
Join our Hackathon 🚀
We're sponsoring the Hack this Fall 2025 hackathon and giving away some prizes to the most creative uses of Lingo.dev. To learn more, join our Discord channel.
Top comments (0)