hreflang
attributet som parar ihop en sida med dess översättningar
Vad det är
hreflang är ett attribut som, skrivet på en länk, anger vilket språk sidan i andra änden är
skriven på. HTML tillåter det på elementen a, area och link, men det blev känt genom en
bestämd användning: en uppsättning link rel="alternate"-element i sidans head, ett per
språkversion, där en webbplats talar om för sökmotorerna att flera adresser har samma innehåll på
olika språk.
<link rel="alternate" hreflang="en" href="https://example.com/guide/" />
<link rel="alternate" hreflang="da" href="https://example.com/da/guide/" />
<link rel="alternate" hreflang="x-default" href="https://example.com/guide/" />
HTML-standarden beskriver attributet som enbart rådgivande. Värdet måste vara en giltig språktagg
enligt BCP 47, och en webbläsare ska avgöra en hämtad sidas språk utifrån sidan själv, aldrig
utifrån länken som ledde dit. Tillsammans med rel="alternate" markerar ett hreflang som skiljer
sig från dokumentets eget språk att målet är en översättning.
Sökmotorerna gjorde om den rådgivande anteckningen till ett protokoll. Google dokumenterar tre
likvärdiga sätt att leverera uppsättningen: link-element i head, ett HTTP-huvud Link för
PDF-filer och andra filer som saknar head, och poster i en webbplatskarta i XML. Varje version
listar både sig själv och alla andra versioner, med fullständiga adresser. Ett par räknas bara när
båda sidorna nämner varandra, så att en främmande webbplats inte kan utge sig för att vara en
översättning av din. Koden är ett språk ur ISO 639-1, som kan följas av en region ur ISO 3166-1,
och en region ensam är ogiltig. Det reserverade värdet x-default pekar ut sidan för läsare vars
språk saknar en egen version, och Google påpekar att värdet togs fram för sidor där läsaren väljer
språk.
Två grannar är lätta att blanda ihop med det. Attributet lang säger vilket språk texten framför
läsaren är skriven på; hreflang säger vilket språk en länkad sida är skriven på. Google uppger
att sökmotorn använder ingetdera för att avgöra en sidas språk, så hreflang kan inte göra en sida
svensk. Det berättar för en sökmotor att en svensk sida som den redan känner igen hör ihop med en
engelsk. Och en kanonisk URL slår ihop dubbletter till en enda indexerad adress, medan hreflang
håller varje version indexerad och anger vilken som ska visas för vem.
Varför det spelar roll
Beslutet som hreflang dokumenterar är om språkversionerna av en sida bildar ett kluster eller
bedöms som fristående sidor. Står de var för sig konkurrerar varje version på egna meriter, och en
sökmotor kan visa den engelska sidan för en svensk läsare eller lista båda versionerna i samma
sökresultat. Deklareras de som ett kluster förstås versionerna som ett och samma innehåll, och
sökmotorn kan erbjuda den version som stämmer med läsarens språkinställningar.
Klustret är bara meningsfullt när versionerna verkligen har samma innehåll. En webbplats på ett
enda språk behöver inget hreflang alls, och två språkavdelningar som skiljer sig i sak bildar
inte heller något kluster. Regionala varianter med små skillnader hör däremot ihop, till exempel
en-GB- och en-US-sidor med olika priser, eller sv-SE och sv-FI för en butik som säljer i
både Sverige och Finland.
Kostnaden är bokföring, och den växer med kvadraten på antalet språk. Varje version av varje sida
bär hela listan, så att lägga till, flytta eller dra tillbaka en enda översättning ändrar head på
varje syskonsida. En lista som stämmer på de flesta sidor men är fel på några få går sönder i det
tysta: paren som pekar åt båda hållen används, resten sorteras bort, och inget fel syns någonstans.
Därför passar hreflang dåligt för handredigering och naturligt för en generator som härleder
varje sidas uppsättning ur en enda lista. Det som hreflang styr är vilken av flera versioner en
sökande får se.
Så ser det ut i praktiken
Den här webbplatsen publicerar varje sida på tre språk från ett och samma innehållsträd, så varje sida har en fast uppsättning syskon att deklarera.
En enda mall avgör vilka översättningar som annonseras, och fem ställen läser den:
hreflang-uppsättningen i head, taggarna og:locale:alternate som länkförhandsvisningar
använder, alternativen i webbplatskartan, inLanguage i den strukturerade datan och, efter
ytterligare ett avdrag, språkraden som läsaren ser. Listan innehåller sidan själv, vilket ger den
självreferens som reglerna kräver. Koderna anger bara språk, en, da och uk, så varje version
erbjuds alla som läser språket, var de än befinner sig, och den engelska posten skrivs en gång
till som x-default. Både head och webbplatskartan bär uppsättningen, renderad ur samma lista, så
de två kan inte glida isär.
Uppdelningen mellan maskiner och läsare är avsiktlig.
Den ukrainska versionen är indexerad och namngiven i webbplatskartorna, medan
språkraden i toppfältet utelämnar den, och i språkkonfigurationen är det en enda flagga: en
sökrobot får fortfarande veta om ukrainskan åt båda hållen, och bara läsarens meny ändras. En
andra flagga, för ett språk som är byggt men inte färdigt, tar bort språket ur båda listorna och
märker dess sidor med noindex. En sida på ett sådant språk deklarerar heller inga syskon,
eftersom ett hreflang från en oannonserad sida till en annonserad är ett par som en sökmotor
bara ser från ena änden.
Kopior följer samma resonemang. En sida som serveras på någon av de fokuserade underdomänerna, och
vars kanoniska adress pekar tillbaka till huvudwebbplatsen, utelämnar hreflang helt: uppsättningen
läses på den sida som sökmotorn har godtagit som kanonisk, och en kopia som räknade upp sin egen
värds översättningar skulle säga emot raden ovanför. Språkväxlaren fungerar ändå, eftersom en
läsare som vill ha danska fortfarande ska få danska.
En kontroll av de byggda sidorna säkerställer att varje sida med alternativ innehåller x-default
och sitt eget språk, och att varje alternativ är en byggd sida, hör till ett annonserat språk och
pekar tillbaka. Regeln om självreferens gör skäl för sin plats. Generatorn erbjuder två listor med
nästan samma namn: .Translations, som utelämnar den aktuella sidan, och .AllTranslations, som
tar med den. Ett felvalt ord tar bort varje sidas eget språk ur head och ur språkraden på en gång,
så att de två fortfarande stämmer överens och ingenting ser fel ut. Mot ett medvetet trasigt bygge
var den kontrollpunkten den enda i hela kontrollen som fångade 528 av de 792 sidorna.
Var det går fel
Sökande får se versionen på fel språk. En svensk läsare hamnar på den engelska sidan, eller så dyker båda versionerna upp sida vid sida. Paren pekar åt ett håll: den svenska sidan nämner den engelska, men den engelska listar fortfarande bara de språk den hade innan, och sökmotorer ignorerar ett par som saknar returlänk. Bygg varje sidas uppsättning ur en enda lista som innehåller sidan själv, och testa ömsesidigheten på det byggda resultatet.
Ett helt språks annoteringar ignoreras. Märkningen finns och är giltig HTML, men versionerna
behandlas som om de saknade samband. Koderna pekar ut fel sak: ua eller dk där språken heter
uk och da, se för svenska fast det är koden för nordsamiska och svenska heter sv, be
menat som Belgien fast det är koden för belarusiska, eller en-UK där en-GB avsågs, eftersom
UK är en reserverad regionkod som Google ignorerar. Ta språket ur ISO 639-1, lägg till en region
ur ISO 3166-1 bara där innehållet skiljer sig mellan länder, och kom ihåg att en giltig BCP
47-tagg ändå kan vara en som Google inte stöder.
Översättningarna faller ur indexet. Bara originalspråket syns i sökresultaten, och
översättningarna behandlas som dubbletter av det. Varje översättning anger originalet som sin
kanoniska adress, vilket ber sökmotorn slå ihop översättningen med originalet samtidigt som dess
hreflang ber om att den ska visas. Gör varje språkversion till sin egen kanoniska URL; Googles
riktlinje är att den kanoniska sidan ska vara på samma språk.
En sida som bad om att stå utanför sökningen annonseras ändå. Ett utkastspråk märkt noindex
dyker upp bland alternativen på publicerade sidor, eller räknar upp dem från sitt eget head.
Annonseringen och direktivet sattes på olika ställen, så webbplatsen ger en sökrobot två svar om
samma adress. Bestäm per språk, annonserat åt båda hållen eller inte alls, lägg beslutet i en enda
inställning som alla listor läser, och kontrollera de byggda sidorna mot den.
Läs mer
- HTML Standard: the hreflang attribute — vad attributet betyder på en länk och varför en webbläsare inte får lita på det.
- HTML Standard: link type ”alternate”
— hur
hreflangochtypebeskriver en översättning eller ett annat format av samma dokument. - RFC 5646: Tags for Identifying Languages — syntaxen i BCP 47 som attributets värde måste följa.
- Google Search Central: localized versions of your pages
— de tre leveranssätten, regeln om ömsesidighet och
x-default.