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
- HTML Standard: the hreflang attribute — hva attributtet betyr på en lenke, og hvorfor en nettleser skal la være å stole på det.
- HTML Standard: lenketypen «alternate»
— hvordan
hreflangogtypebeskriver en oversettelse eller et annet format av det samme dokumentet. - RFC 5646: Tags for Identifying Languages — BCP 47-syntaksen som verdien i attributtet må følge.
- Google Search Central: localized versions of your pages
— de tre leveringsmåtene, regelen om gjensidighet og
x-default.