The product page now exists in several languages, and the question arises: how do a search engine and a person find the right version. The answer starts with addresses. Every indexable language version must have its own stable URL - one that can be opened, bookmarked, and returned in results. The hreflang markup is a hint to the search engine about which URL serves which language and region; it translates nothing on its own, it only links ready versions together.
The choice of address structure comes down to three strategies, and all further work depends on it.
| Strategy | Example | Comment |
|---|---|---|
| Subdirectory | /ru/docs | Usually the easiest to maintain. |
| Subdomain | ru.example.com | More infrastructure isolation. |
| ccTLD | example.de | Strong market signal, high cost. |
A subdirectory like /ru/docs is usually the easiest to maintain: one domain, one certificate, shared infrastructure. A subdomain ru.example.com gives more isolation but needs separate setup. A dedicated country domain example.de is the strongest market signal and the most expensive to run. What matters is picking one scheme and sticking to it: a mixture confuses both crawlers and analytics.
A separate trap is the automatic redirect by the Accept-Language header. It is convenient, but it must not cut the user off from other versions. Googlebot crawls mostly from the US, and a hard redirect can hide the localized pages from it entirely. The right move is to treat the detected language as a hint and offer a switcher, rather than force the user away or block direct links to specific versions.
What links the versions to each other is hreflang. It works on reciprocity: each version links to itself and to all the others. If page A points to B but B does not point back to A, the cluster is considered incomplete and the engine may ignore the markup. Hence the practical rule: the set of hreflang links is identical on every page of the cluster and includes the current page itself.
To the list of versions one adds x-default - the language- and region-neutral address a user lands on when the site does not support their language. This is not the English version by default but a deliberate fallback: a language-picker page, say, or an international storefront. Technically it is one more alternate link whose hreflang value equals x-default.
Canonical and hreflang solve different tasks, and they are constantly confused. Canonical points to the canonical page in the same language, not the English one: if the Russian version declares the English page as canonical, the engine treats the Russian one as a duplicate and drops it from the index. hreflang links equivalent pages, not partially similar material: cross-links between an article and a catalog section only do harm. And a third distinction: the HTML lang attribute describes the document's own language for the browser and screen reader, whereas hreflang describes the target language and regional version of a URL for the search engine.
The cost of getting it right is real: with n versions the link matrix grows as n by n, and it cannot be maintained by hand - the markup is generated from a single source of truth. The failure is expensive and quiet: the canonical of /ru/product mistakenly pointing at /en/product removes the Russian page from the index; Russian users land on the English one, do not understand it, and leave. No error, no warning - only slowly sinking traffic from Russian-language search.
<link rel="alternate" hreflang="en"
href="https://example.com/en/product" />
<link rel="alternate" hreflang="ru"
href="https://example.com/ru/product" />
<link rel="alternate" hreflang="x-default"
href="https://example.com/product" />