hreflang across the globe

97
hreang across the globe ISS Munich - #iss #hreang - @jdevalk

Upload: joost-de-valk

Post on 21-Apr-2017

1.856 views

Category:

Internet


0 download

TRANSCRIPT

Page 1: hreflang across the globe

hreflang across the globe

ISS Munich - #iss #hreflang - @jdevalk

Page 2: hreflang across the globe

ISS Munich - #iss #hreflang - @jdevalk

Page 3: hreflang across the globe

Today!• What is hreflang?

• Design choices

• Common issues

• Useful tools

ISS Munich - #iss #hreflang - @jdevalk

Page 4: hreflang across the globe

What is hreflang?

ISS Munich - #iss #hreflang - @jdevalk

Page 5: hreflang across the globe

What is hreflang?“Google uses the rel="alternate" hreflang="x" attributes to serve the correct language or regional URL in Search results.”

ISS Munich - #iss #hreflang - @jdevalk

Page 6: hreflang across the globe

What is hreflang?In short: serve the right language version to the user, based on their locale and location.

ISS Munich - #iss #hreflang - @jdevalk

Page 7: hreflang across the globe

What is it meant for?

ISS Munich - #iss #hreflang - @jdevalk

Page 8: hreflang across the globe

What is it meant for?• Fully translated sites

ISS Munich - #iss #hreflang - @jdevalk

Page 9: hreflang across the globe

What is it meant for?• Fully translated sites

• Sites with regional variation

ISS Munich - #iss #hreflang - @jdevalk

Page 10: hreflang across the globe

What is it meant for?• Fully translated sites

• Sites with regional variation

• Only the template gets translated, main content is the same (but don’t do this!!)

ISS Munich - #iss #hreflang - @jdevalk

Page 11: hreflang across the globe

ISS Munich - #iss #hreflang - @jdevalk

English site Dutch siteGerman site

hreflang=“de” href=“http://example.com/de/”hreflang=“en” href=“http://example.com/en/”hreflang=“nl” href=“http://example.com/nl/”

Page 12: hreflang across the globe

What would happen?• Someone searching in Dutch would get the Dutch site.

• Someone searching in German would get the German site.

• Someone searching in English would get the English site.

ISS Munich - #iss #hreflang - @jdevalk

Page 13: hreflang across the globe

ISS Munich - #iss #hreflang - @jdevalk

German site for Germany

German site for Switzerland

German site for Austria

href="http://www.example.com/de-de/" hreflang="de-de"href="http://www.example.com/de-at/" hreflang="de-at"href="http://www.example.com/de-ch/" hreflang="de-ch"

Page 14: hreflang across the globe

What would happen?• Someone searching in German in Germany would get

the /de-de/ site.

• Someone searching in German in Austria would get the /de-at/ site.

• Someone searching in German in Switzerland would get the /de-ch/ site.

ISS Munich - #iss #hreflang - @jdevalk

Page 15: hreflang across the globe

But beware!

ISS Munich - #iss #hreflang - @jdevalk

Page 16: hreflang across the globe

But beware!• In the previous example, which page would German

speaking / seeking people in Belgium get?

ISS Munich - #iss #hreflang - @jdevalk

Page 17: hreflang across the globe

But beware!• In the previous example, which page would German

speaking / seeking people in Belgium get?

• A better solution:

ISS Munich - #iss #hreflang - @jdevalk

Page 18: hreflang across the globe

ISS Munich - #iss #hreflang - @jdevalk

German site for Germany

& rest of world

German site for Switzerland

German site for Austria

href="http://www.example.com/de-de/" hreflang="de"href="http://www.example.com/de-at/" hreflang="de-at"href="http://www.example.com/de-ch/" hreflang="de-ch"

Page 19: hreflang across the globe

x-default“The new x-default hreflang attribute value signals to our algorithms that this page doesn’t target any specific language or locale and is the default page when no other page is better suited.”

https://webmasters.googleblog.com/2013/04/x-default-hreflang-for-international-pages.html

ISS Munich - #iss #hreflang - @jdevalk

Page 20: hreflang across the globe

x-default“The x-default hreflang value signals to our algorithms that such a page doesn’t target a specific language or locale.”

https://webmasters.googleblog.com/2013/04/x-default-hreflang-for-international-pages.html

ISS Munich - #iss #hreflang - @jdevalk

Page 21: hreflang across the globe

x-default

ISS Munich - #iss #hreflang - @jdevalk

Page 22: hreflang across the globe

ISS Munich - #iss #hreflang - @jdevalk

English site Dutch siteGerman site

hreflang=“de” href=“http://example.com/de/”hreflang=“en” href=“http://example.com/en/”hreflang=“nl” href=“http://example.com/nl/”hreflang=“x-default” href=“http://example.com/”

Country selector page

Page 23: hreflang across the globe

What would happen?

ISS Munich - #iss #hreflang - @jdevalk

Page 24: hreflang across the globe

What would happen?• Someone searching in Dutch would get the Dutch site.

ISS Munich - #iss #hreflang - @jdevalk

Page 25: hreflang across the globe

What would happen?• Someone searching in Dutch would get the Dutch site.

• Someone searching in German would get the German site.

ISS Munich - #iss #hreflang - @jdevalk

Page 26: hreflang across the globe

What would happen?• Someone searching in Dutch would get the Dutch site.

• Someone searching in German would get the German site.

• Someone searching in English would get the English site.

ISS Munich - #iss #hreflang - @jdevalk

Page 27: hreflang across the globe

What would happen?• Someone searching in Dutch would get the Dutch site.

• Someone searching in German would get the German site.

• Someone searching in English would get the English site.

• Someone searching in Spanish would get the country / language selector.

ISS Munich - #iss #hreflang - @jdevalk

Page 28: hreflang across the globe

ISS Munich - #iss #hreflang - @jdevalk

German site for Germany

& rest of world

German site for Switzerland

German site for Austria

href="http://www.example.com/de-de/" hreflang="de"href="http://www.example.com/de-at/" hreflang="de-at"href="http://www.example.com/de-ch/" hreflang=“de-ch"href="http://www.example.com/de-de/" hreflang=“x-default"

Page 29: hreflang across the globe

hreflang design choices

ISS Munich - #iss #hreflang - @jdevalk

Page 30: hreflang across the globe

hreflang implementation options• HTML meta tags

• HTTP headers

• XML sitemap

ISS Munich - #iss #hreflang - @jdevalk

Page 31: hreflang across the globe

HTML meta tagsEasiest when you’re not in full control of everything:

<link rel="alternate" href="http://example.com/en-gb" hreflang="en-gb" />

<link rel="alternate" href="http://example.com/en-us" hreflang="en-us" />

<link rel="alternate" href="http://example.com/en-au" hreflang="en-au" />

ISS Munich - #iss #hreflang - @jdevalk

Page 32: hreflang across the globe

HTTP headersVery useful for non HTML content:Link: <http://es.example.com/document.pdf>; rel="alternate"; hreflang="es",

<http://en.example.com/document.pdf>; rel="alternate"; hreflang="en",

<http://de.example.com/document.pdf>; rel="alternate"; hreflang=“de"

Not always as easy to maintain for other stuff.

ISS Munich - #iss #hreflang - @jdevalk

Page 33: hreflang across the globe

XML Sitemap<?xml version="1.0" encoding="UTF-8"?><urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xhtml="http://www.w3.org/1999/xhtml"><url> <loc>http://www.example.com/english/</loc> <xhtml:link rel=“alternate" hreflang="de" href="http://www.example.com/deutsch/"/> <xhtml:link rel=“alternate" hreflang="de-ch" href="http://www.example.com/schweiz-deutsch/"/> <xhtml:link rel=“alternate" hreflang="en" href="http://www.example.com/english/"/></url>

ISS Munich - #iss #hreflang - @jdevalk

Page 34: hreflang across the globe

XML Sitemap[…]

<url> <loc>http://www.example.com/deutsch/</loc> <xhtml:link rel=“alternate" hreflang="en" href="http://www.example.com/english/"/> <xhtml:link rel=“alternate" hreflang="de-ch" href="http://www.example.com/schweiz-deutsch/"/> <xhtml:link rel=“alternate” hreflang="de" href="http://www.example.com/deutsch/"/></url>

ISS Munich - #iss #hreflang - @jdevalk

Page 35: hreflang across the globe

XML Sitemap

ISS Munich - #iss #hreflang - @jdevalk

Page 36: hreflang across the globe

XML Sitemap• horribly ugly

ISS Munich - #iss #hreflang - @jdevalk

Page 37: hreflang across the globe

XML Sitemap• horribly ugly

• but easiest to maintain

ISS Munich - #iss #hreflang - @jdevalk

Page 38: hreflang across the globe

XML Sitemap• horribly ugly

• but easiest to maintain

• doesn’t add kilobytes to each page load

ISS Munich - #iss #hreflang - @jdevalk

Page 39: hreflang across the globe

hreflang breaks - often

ISS Munich - #iss #hreflang - @jdevalk

Page 40: hreflang across the globe

Common issuesYes. Common.

This very scientifically correct pie chart from David Sottimano is sadly close to the truth:

ISS Munich - #iss #hreflang - @jdevalk

Hreflang implementation

5%

95%

Screwed upGot it right

Page 41: hreflang across the globe

1. Broken links / relative URLs

ISS Munich - #iss #hreflang - @jdevalk

Page 42: hreflang across the globe

1. Broken links / relative URLs

ISS Munich - #iss #hreflang - @jdevalk

If your hreflang href links to:

Page 43: hreflang across the globe

1. Broken links / relative URLs

ISS Munich - #iss #hreflang - @jdevalk

If your hreflang href links to:

• broken URLs

Page 44: hreflang across the globe

1. Broken links / relative URLs

ISS Munich - #iss #hreflang - @jdevalk

If your hreflang href links to:

• broken URLs

• URLs that are redirected

Page 45: hreflang across the globe

1. Broken links / relative URLs

ISS Munich - #iss #hreflang - @jdevalk

If your hreflang href links to:

• broken URLs

• URLs that are redirected

• relative URLs

Page 46: hreflang across the globe

1. Broken links / relative URLs

ISS Munich - #iss #hreflang - @jdevalk

If your hreflang href links to:

• broken URLs

• URLs that are redirected

• relative URLs

Page 47: hreflang across the globe

1. Broken links / relative URLs

ISS Munich - #iss #hreflang - @jdevalk

If your hreflang href links to:

• broken URLs

• URLs that are redirected

• relative URLs

It won’t work.

Page 48: hreflang across the globe

2. Missing return link

ISS Munich - #iss #hreflang - @jdevalk

Page 49: hreflang across the globe

2. Missing return link

ISS Munich - #iss #hreflang - @jdevalk

If page A says A is English and B is German.

Page 50: hreflang across the globe

2. Missing return link

ISS Munich - #iss #hreflang - @jdevalk

If page A says A is English and B is German.

Page B needs to say B is German and A is English.

Page 51: hreflang across the globe

2. Missing return link

ISS Munich - #iss #hreflang - @jdevalk

If page A says A is English and B is German.

Page B needs to say B is German and A is English.

It can not lack the return link.

Page 52: hreflang across the globe

3. Wrong country / region code

ISS Munich - #iss #hreflang - @jdevalk

Page 53: hreflang across the globe

3. Wrong country / region code

ISS Munich - #iss #hreflang - @jdevalk

Language and Country / Region codes follow strict ISO specs.

Page 54: hreflang across the globe

3. Wrong country / region code

ISS Munich - #iss #hreflang - @jdevalk

Language and Country / Region codes follow strict ISO specs.

The first bit is the language, two letters, in ISO 639-1 format.

Page 55: hreflang across the globe

3. Wrong country / region code

ISS Munich - #iss #hreflang - @jdevalk

Language and Country / Region codes follow strict ISO specs.

The first bit is the language, two letters, in ISO 639-1 format.

The second (optional) bit is the region. In ISO 3166-1 Alpha 2 format.

Page 56: hreflang across the globe

3. Wrong country / region code

ISS Munich - #iss #hreflang - @jdevalk

So Ferrari got it slightly wrong:

<link rel="alternate" hreflang="en-en" href="http://www.ferrari.com/en_en/" /><link rel="alternate" hreflang="fr-fr" href="http://www.ferrari.com/fr_fr/" /><link rel="alternate" hreflang="de-de" href="http://www.ferrari.com/de_de/" /><link rel="alternate" hreflang="es-es" href="http://www.ferrari.com/es_es/" /><link rel="alternate" hreflang="it-it" href="http://www.ferrari.com/it_it/" /><link rel="alternate" hreflang="en-us" href="http://www.ferrari.com/en_us/" /><link rel="alternate" hreflang="ja-jp" href="http://www.ferrari.com/ja_jp/" /><link rel="alternate" hreflang="zh-cn" href="http://www.ferrari.com/zh_cn/" /><link rel="alternate" hreflang="nl" href="http://www.ferrari.com/nl_nl/" />

This was on their nl page.

Page 57: hreflang across the globe

3. Wrong country / region code

ISS Munich - #iss #hreflang - @jdevalk

Page 58: hreflang across the globe

3. Wrong country / region code

ISS Munich - #iss #hreflang - @jdevalk

Page 59: hreflang across the globe

3. Wrong country / region code

ISS Munich - #iss #hreflang - @jdevalk

Page 60: hreflang across the globe

3. Wrong country / region code

ISS Munich - #iss #hreflang - @jdevalk

Page 61: hreflang across the globe

3. Wrong country / region code

ISS Munich - #iss #hreflang - @jdevalk

This is btw quite a common issue:

<link href="http://www.independent.co.uk/"

rel="alternate" hreflang="en-uk" />

This should be en-gb of course!

Page 62: hreflang across the globe

4. Canonical interference

ISS Munich - #iss #hreflang - @jdevalk

Page 63: hreflang across the globe

4. Canonical interference

ISS Munich - #iss #hreflang - @jdevalk

Page 64: hreflang across the globe

4. Canonical interference

ISS Munich - #iss #hreflang - @jdevalk

Each language should have a canonical that points to itself.

Page 65: hreflang across the globe

4. Canonical interference

ISS Munich - #iss #hreflang - @jdevalk

Each language should have a canonical that points to itself.

If it doesn’t follow that simple rule, it’ll prevent hreflang from working.

Page 66: hreflang across the globe

4. Canonical interference

ISS Munich - #iss #hreflang - @jdevalk

Each language should have a canonical that points to itself.

If it doesn’t follow that simple rule, it’ll prevent hreflang from working.

So, in our earlier example:

Page 67: hreflang across the globe

ISS Munich - #iss #hreflang - @jdevalk

English site Dutch siteGerman site

<link rel=“alternate” hreflang=“de” href=“http://example.com/de/”><link rel=“alternate” hreflang=“en” href=“http://example.com/en/”><link rel=“alternate” hreflang=“nl” href=“http://example.com/nl/”><link rel=“canonical” href=“http://example.com/en/”>

Correct implementation:

Page 68: hreflang across the globe

ISS Munich - #iss #hreflang - @jdevalk

English site Dutch siteGerman site

Correct implementation:

<link rel=“alternate” hreflang=“de” href=“http://example.com/de/”><link rel=“alternate” hreflang=“en” href=“http://example.com/en/”><link rel=“alternate” hreflang=“nl” href=“http://example.com/nl/”><link rel=“canonical” href=“http://example.com/de/”>

Page 69: hreflang across the globe

ISS Munich - #iss #hreflang - @jdevalk

English site Dutch siteGerman site

Correct implementation:

<link rel=“alternate” hreflang=“de” href=“http://example.com/de/”><link rel=“alternate” hreflang=“en” href=“http://example.com/en/”><link rel=“alternate” hreflang=“nl” href=“http://example.com/nl/”><link rel=“canonical” href=“http://example.com/nl/”>

Page 70: hreflang across the globe

5. It looks fine but it says it’s broken!

ISS Munich - #iss #hreflang - @jdevalk

Maybe you have two implementations? If so… Get rid of one!

Page 71: hreflang across the globe

Useful tools

Page 72: hreflang across the globe

hreflang tag generator

http://yoa.st/hreflanggenerator

ISS Munich - #iss #hreflang - @jdevalk

Page 73: hreflang across the globe

hreflang XML sitemap generatorhttp://www.themediaflow.com/tool_hreflang

ISS Munich - #iss #hreflang - @jdevalk

Page 74: hreflang across the globe

hreflang XML sitemap generatorhttp://www.themediaflow.com/tool_hreflang

ISS Munich - #iss #hreflang - @jdevalk

Page 75: hreflang across the globe

hreflang tag validator

http://flang.dejanseo.com.au/

ISS Munich - #iss #hreflang - @jdevalk

Page 76: hreflang across the globe

ISS Munich - #iss #hreflang - @jdevalk

http://yoa.st/hreflangchrome

hreflang tag recognition

Page 77: hreflang across the globe

ISS Munich - #iss #hreflang - @jdevalk

hreflang tag recognition

Page 78: hreflang across the globe

Keep auditing

Page 79: hreflang across the globe

It works now!

ISS Munich - #iss #hreflang - @jdevalk

Page 80: hreflang across the globe

It works now!No. It works now.

ISS Munich - #iss #hreflang - @jdevalk

Page 81: hreflang across the globe

It works now!No. It works now.

It will break.

ISS Munich - #iss #hreflang - @jdevalk

Page 82: hreflang across the globe

Common reasons for breakage

ISS Munich - #iss #hreflang - @jdevalk

Page 83: hreflang across the globe

Common reasons for breakagePages that are redirected, but the hreflang wasn’t updated.

ISS Munich - #iss #hreflang - @jdevalk

Page 84: hreflang across the globe

Common reasons for breakagePages that are redirected, but the hreflang wasn’t updated.

Pages that have been deleted in one language but not in the other(s).

ISS Munich - #iss #hreflang - @jdevalk

Page 85: hreflang across the globe

Common reasons for breakagePages that are redirected, but the hreflang wasn’t updated.

Pages that have been deleted in one language but not in the other(s).

A developer thought “this can be done so much simpler”, and breaks it all.

ISS Munich - #iss #hreflang - @jdevalk

Page 86: hreflang across the globe

Regular audits

ISS Munich - #iss #hreflang - @jdevalk

Page 87: hreflang across the globe

Regular auditsTo prevent breakage, you need to audit regularly.

ISS Munich - #iss #hreflang - @jdevalk

Page 88: hreflang across the globe

Regular auditsTo prevent breakage, you need to audit regularly.

If you have continuous integration, add hreflang tests.

ISS Munich - #iss #hreflang - @jdevalk

Page 89: hreflang across the globe

Setup (regular) testsManually with Screaming Frog, or automated.

ISS Munich - #iss #hreflang - @jdevalk

Page 90: hreflang across the globe

Audit source code

ISS Munich - #iss #hreflang - @jdevalk

Page 91: hreflang across the globe

Audit source codeMake sure the code that generates hreflang:

ISS Munich - #iss #hreflang - @jdevalk

Page 92: hreflang across the globe

Audit source codeMake sure the code that generates hreflang:

• has documentation that explains why;

ISS Munich - #iss #hreflang - @jdevalk

Page 93: hreflang across the globe

Audit source codeMake sure the code that generates hreflang:

• has documentation that explains why;

• points to documentation on the how;

ISS Munich - #iss #hreflang - @jdevalk

Page 94: hreflang across the globe

Audit source codeMake sure the code that generates hreflang:

• has documentation that explains why;

• points to documentation on the how;

• explains special cases like x-default;

ISS Munich - #iss #hreflang - @jdevalk

Page 95: hreflang across the globe

Audit source codeMake sure the code that generates hreflang:

• has documentation that explains why;

• points to documentation on the how;

• explains special cases like x-default;

• explains relationship to canonical.

ISS Munich - #iss #hreflang - @jdevalk

Page 96: hreflang across the globe

Regular audits

ISS Munich - #iss #hreflang - @jdevalk

Regular audits and smart code

documentation will keep your

hreflang happy!

Page 97: hreflang across the globe

Questions?Follow along:

• https://yoast.com/

• @jdevalk & @yoast on Twitter

• facebook.com/yoast

ISS Munich - #iss #hreflang - @jdevalk