Hopp til innhold

hreflang

attributtet som parer en side med oversettelsene av den

Hva det er

hreflang er et HTML-attributt som oppgir hvilket språk siden i den andre enden av en lenke er skrevet på. HTML tillater det på elementene a, area og link, men bruken som gjorde det kjent, er et sett med link rel="alternate"-elementer i sidens head, ett per språkversjon. Med dem forteller et nettsted søkemotorene at flere adresser har det samme innholdet på ulike 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 kaller attributtet «purely advisory», altså rent veiledende. Verdien må være en gyldig språkkode etter BCP 47, og en nettleser skal hente språket til en side den har lastet ned, fra siden selv, aldri fra lenken som førte dit. Sammen med rel="alternate" markerer en hreflang som avviker fra dokumentets eget språk, at målet er en oversettelse.

Søkemotorene gjorde den veiledende merknaden til et fast regelverk. Google beskriver tre likeverdige måter å levere settet på: link-elementer i head, en Link-header i HTTP for PDF-er og andre filer som mangler head, og oppføringer i en XML-sitemap. Hver versjon lister både seg selv og alle de andre, med fullstendige adresser. Et par teller bare når begge sidene nevner hverandre, slik at et annet nettsted ikke kan utgi seg for å være en oversettelse av ditt. Kodene er et språk fra ISO 639-1, valgfritt fulgt av en region fra ISO 3166-1, og en region alene er ugyldig. Den reserverte verdien x-default peker ut siden for lesere hvis språk ikke matcher noen av de andre, og Google påpeker at den ble laget for sider der leseren velger språk selv.

To naboer er lette å forveksle med det. Attributtet lang sier hvilket språk teksten foran leseren er på; hreflang sier hvilket språk en lenket side er på. Google skriver at de bruker ingen av dem til å avgjøre hvilket språk en side har, så hreflang kan ikke gjøre en side norsk. Det forteller en søkemotor at en norsk side den allerede har gjenkjent, hører sammen med en engelsk. Og en kanonisk URL slår sammen duplikater til én indeksert adresse, mens hreflang holder hver versjon i indeksen og sier hvilken av dem som skal vises til hvem.

Hvorfor det er viktig

Valget hreflang skriver ned, er om språkversjonene av en side utgjør én klynge eller vurderes som separate sider. Står de hver for seg, konkurrerer hver versjon på egne premisser, og en søkemotor kan vise den engelske siden til en norsk leser eller liste begge versjonene i de samme resultatene. Erklært som en klynge forstås versjonene som ett og samme innhold, og søkemotoren kan tilby den versjonen som passer til leserens språkinnstillinger.

Klyngen gir bare mening når versjonene faktisk er det samme innholdet. Et nettsted på ett språk klarer seg helt uten hreflang, og to språkseksjoner som skiller seg i substans, er heller ingen klynge. Regionale varianter med små forskjeller, som sider for en-GB og en-US med ulike priser, danner derimot en klynge.

Prisen er bokføring, og den vokser med kvadratet av antall språk. Hver versjon av hver side bærer hele listen, så når du legger til, flytter eller trekker tilbake én oversettelse, endres head i hver eneste søskenside. En liste som er riktig på de fleste sidene og feil på noen få, svikter i det stille: parene som peker begge veier, blir brukt, og resten forkastes uten noen synlig feilmelding. Derfor egner hreflang seg dårlig for håndredigering og godt for en generator som avleder hver sides sett fra én liste. Det hreflang endrer, er hvilken av flere versjoner en søker får se.

Slik ser det ut i praksis

Dette nettstedet publiserer hver side på tre språk fra ett innholdstre, så hver side har et fast sett med søsken å deklarere.

Én mal avgjør hvilke oversettelser som annonseres, og fem steder leser den: hreflang-settet i head, taggene og:locale:alternate som lenkeforhåndsvisninger bruker, alternativene i sitemapen, inLanguage i nettstedets strukturerte sidedata og, etter ett trekk til, språkstripen leseren ser. Listen tar med siden selv, og det gir selvreferansen reglene krever. Kodene angir bare språk, en, da og uk, så hver versjon tilbys alle som leser det språket, uansett hvor de bor, og den engelske oppføringen skrives en gang til som x-default. Både head og sitemapen bærer settet, generert fra den samme listen, så de to kan ikke gli fra hverandre.

Skillet mellom maskiner og lesere er bevisst. Den ukrainske versjonen er indeksert og navngitt i sitemapene, mens stripen i topplinjen utelater den, og i språkkonfigurasjonen er det ett eneste flagg: en søkerobot får fortsatt vite om ukrainsk i begge retninger, og bare menyen leseren ser, endres. Et annet flagg, for et språk som er bygd men ikke klart, fjerner språket fra begge listene og merker sidene noindex. En side på et slikt språk deklarerer heller ingen søsken, fordi en hreflang fra en side som holdes skjult, til en som annonseres, er et par en søkemotor bare ser fra den ene enden.

Kopier følger samme logikk. En side som serveres på et av de fokuserte underdomenene, og som har sin kanoniske adresse pekende tilbake til hovednettstedet, sender ut null hreflang: settet leses på den siden søkemotoren har godtatt som kanonisk, og en kopi som navngir oversettelsene på sin egen vert, ville motsi linjen rett over. Språkvelgeren virker likevel, for en leser som vil ha dansk, skal fortsatt få dansk.

En kontroll av de bygde sidene slår fast at hver side med alternativer tar med x-default og sitt eget språk, og at hvert alternativ er en bygd side, er på et annonsert språk og peker tilbake. Regelen om selvreferanse fortjener plassen sin. Nettstedsgeneratoren tilbyr to lister med nesten like navn: .Translations, som utelater den gjeldende siden, og .AllTranslations, som tar den med. Glipper du på det ene ordet, forsvinner sidens eget språk fra head og fra språkstripen på én gang, og de to er fortsatt enige med hverandre. Mot et bygg som var ødelagt med vilje, var dette ene kontrollpunktet det eneste som fanget 528 av de 792 sidene.

Hvor det går galt

Søkere får se versjonen på feil språk. En norsk leser sendes til den engelske siden, eller begge versjonene dukker opp side om side. Parene peker bare én vei: den norske siden nevner den engelske, men den engelske lister fortsatt bare språkene den hadde fra før, og søkemotorer overser et par som mangler returlenken. Bygg hver sides sett fra én liste som inkluderer siden selv, og test gjensidigheten på det ferdig bygde resultatet.

Et helt språks annoteringer har null virkning. Markeringen er der og er gyldig HTML, men versjonene behandles som om de var urelaterte. Kodene peker på feil ting: ua eller dk der språkene er uk og da, be ment som Belgia når det er koden for belarusisk, eller en-UK der en-GB var ment, siden UK er en reservert regionkode som Google overser. Bruk et språk fra ISO 639-1, legg til en region fra ISO 3166-1 bare der innholdet varierer fra land til land, og husk at en gyldig BCP 47-kode likevel kan være en som Google ikke støtter.

Oversettelsene faller ut av indeksen. Bare originalspråket vises i søk, og oversettelsene behandles som duplikater av det. Hver oversettelse oppgir originalen som sin kanoniske URL, og det ber om at oversettelsen slås sammen og forsvinner, mens hreflang ber om at den vises. Gjør hver språkversjon til sin egen kanoniske side; Googles veiledning er at den kanoniske siden bør være på samme språk.

En side som ba om å holdes utenfor søk, blir annonsert likevel. Et utkastspråk merket noindex dukker opp blant alternativene på publiserte sider, eller lister dem fra sin egen head. Annonseringen og direktivet ble satt på forskjellige steder, så nettstedet gir en søkerobot to svar om den samme adressen. Bestem per språk, annonsert i begge retninger eller i ingen, legg avgjørelsen i én innstilling som hver liste leser, og kontroller de bygde sidene mot den.

Les mer

Ordliste