Hoppa till innehållet

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

Ordlista