hreflang.
hreflang is the markup that declares a page’s different language and region versions to search engines.
On a multilingual site the same content exists in more than one version, and the search engine needs to know two things: are these translations of one another, and which one should be shown to which user? hreflang answers both.
Three rules apply, and if one is missing the set is treated as invalid.
- Reciprocity — if A declares B, B must declare A.
- Self-inclusion — every page must declare its own language too.
- Absolute address — a relative path is not accepted.
The value can be a language code or a language-region pair. A language code alone targets everyone speaking that language; a language-region pair targets only those in a particular country. The second is meaningful only if the content genuinely differs — different currency, stock or legal text.
The declaration can be made in the page’s head section, in the sitemap or in an HTTP header; all three are equivalent. This site uses the first two together: every page carries its own link set — a page existing in three languages carries four links, one existing only in Turkish carries two — and the sitemap repeats the same sets.
It does not raise rankings — it is a matching signal, not a ranking signal. Set up correctly, it makes existing visibility reach the right user.
It is a layer that breaks silently: it gives no error message, the page looks normal, and only the wrong language version starts appearing in search results. Noticing the symptom takes weeks.
The most frequent mistakes are missing reciprocity, failing to declare oneself, and contradicting the canonical address. The third is the most insidious: if hreflang says “I am the German version” while the canonical points to the Turkish page, the German version never enters the index at all.
The lasting solution is not to write the links by hand: generated from a single source, reciprocity is structurally guaranteed, and tied to a test, a breakage shows at deployment time.
- Reciprocity — if A declares B, B must declare A; a one-way declaration is invalid.
- Self-inclusion — every page must declare its own language too; the most frequently skipped rule.
- Absolute address — a relative path is not accepted.
- Agreement with canonical — every language version must point canonically to itself.
- A real page — every declared address must exist; a link returning 404 breaks the set.
A note on implementation: the declaration can be made in the page head, in the sitemap or in an HTTP header, and all three are equivalent. Large sites prefer the sitemap, because the links gather in one file and can be audited from one place.