Websites promotion & analytics

Select your language

Ask a question +38 096 558 7514

Hreflang in multilingual sites

One of the latest trends in web development is the addition of multilingual functionality to websites, which requires the use of the hreflang attribute on the technical side of the site.

Sometimes, a website owner might not even know about this directive until they translate their site into multiple languages and receive a notification from Google Search Console. Let’s break down what hreflang is and how to use it properly. Maximum useful information with no unnecessary details.

What Is hreflang?

Hreflang is a special HTML attribute used to indicate the availability of different language versions of a webpage.

Hreflang tells Google’s robot that this page exists in multiple languages and specifies the URL for the default page when a translation isn’t available.

Example of hreflang in HTML:


<link href="https://holostenko.ua/contacts" rel="alternate" hreflang="ru" />
<link href="https://holostenko.ua/uk/contacts" rel="alternate" hreflang="uk-UA" />
<link href="https://holostenko.ua/contacts" rel="alternate" hreflang="x-default" />

Let’s break down what this means:

  • rel="alternate" - This HTML tag attribute tells Google about all language versions of the current page;
  • hreflang="language-country code" - Specifies the language of the page and the country it is associated with (language is written in ISO 639-1 format, and country in ISO 3166-1 Alpha 2 format). For Ukraine, hreflang would be written as hreflang="uk-UA";
  • x-default - This is the default version of the page, also known as the fallback. It is shown if a user’s preferred language version isn’t available.

* Hreflang attributes must be placed within the <head> section of the HTML page.

Hreflang and SEO

As discussed, hreflang helps Google identify the language version of a website for indexing purposes. Theoretically, this should allow Google to display search results in the language corresponding to the user’s search query if such a page exists. Based on our manual tests, this works well.

But, the main benefit of hreflang in SEO is not only this, but also a solution to the problem of duplicate content risks (“site duplicates”, in the language of SEO).

Duplicate content

Duplicate content refers to the same content being presented on different pages of a website.

For example, let’s say your website serves multiple markets in different currencies but in the same language, such as the UK and the US. You could have multiple product pages that differ only in price and shipping conditions. For Google, this could be seen as duplicate content. However, if you use hreflang tags for the specific language versions, this problem is resolved.

In essence, hreflang is a mandatory attribute for the technical SEO of any multilingual website. Without it, the proper indexing of your site across languages is compromised.

Hreflang in WordPress, Joomla, OpenCart, and Other CMS

From our experience with various websites, if the website has built-in multilingual tools, hreflang is usually automatically implemented. There’s typically no need for additional configuration. This applies to CMS platforms like WordPress, Joomla, and OpenCart.

For smaller HTML websites without a CMS or larger projects built on frameworks like Laravel, hreflang implementation needs to be done manually (as shown in the HTML example above).

Hreflang implementation rules you shouldn't break

Reciprocal linking

If your English-language page links to other language versions via hreflang, the pages in other languages should also include links with hreflang attributes pointing back to the English version.

Self-referencing

Hreflang tags should point not only to other language versions but also to the page itself.

Default page declaration

Although technically optional, Google recommends specifying the x-default version of the page.

No broken links

Hreflang tags must not point to pages that return a 404 status.

Language consistency

The content on a multilingual page should match the language codes specified in the hreflang attributes.

Alternative methods for implementing hreflang

If you are having trouble implementing hreflang in HTML (though this is the most reliable method), there are two alternative methods:

  • HTTP Headers – Useful for pages without HTML, such as file download links or installation packages.
  • Sitemaps – Hreflang can also be implemented within the sitemap by using the <xhtml: link> tag. This functions similarly to the HTML method, where alternate language versions are specified within the <url> directory.

Example of sitemap implementation:


<url>
<loc>https://example.com/blog/test/</loc>
<xhtml: link rel = "alternate" hreflang = "x-default" href = "https://example.com/blog/test/ "/>
<xhtml: link rel =" alternate "hreflang =" ru" href ="https://example.com/blog/test/ "/>
<xhtml: link rel =" alternate "hreflang ="uk" href =" https://example.com/blog/uk/test/ "/>
</url>

Testing hreflang validity

There are several tools online that allow you to quickly test hreflang implementation. However, you should first check the following:

  • If there are any issues, Google Search Console will notify you via the Coverage report or by email.
  • For a more specific page check, the most reliable testing tool is app.hreflang.org.

After testing, you should see a positive result:

тест hreflang

Your hreflang implementation should pass with a green status. If something is wrong, check the HTML code and correct the errors.

That’s it! We hope this material was useful, concise, and clear. We wish you success in implementing hreflang and multilingual functionality for your website!

If you have any questions about our services, please write how to contact you and briefly describe your business.

* Your personal data is completely protected and will not be disclosed to third parties.

Please select the best way to contact you.

  • United States+1
  • United Kingdom+44
  • Afghanistan (‫افغانستان‬‎)+93
  • Albania (Shqipëri)+355
  • Algeria (‫الجزائر‬‎)+213
  • American Samoa+1
  • Andorra+376
  • Angola+244
  • Anguilla+1
  • Antigua and Barbuda+1
  • Argentina+54
  • Armenia (Հայաստան)+374
  • Aruba+297
  • Ascension Island+247
  • Australia+61
  • Austria (Österreich)+43
  • Azerbaijan (Azərbaycan)+994
  • Bahamas+1
  • Bahrain (‫البحرين‬‎)+973
  • Bangladesh (বাংলাদেশ)+880
  • Barbados+1
  • Belarus (Беларусь)+375
  • Belgium (België)+32
  • Belize+501
  • Benin (Bénin)+229
  • Bermuda+1
  • Bhutan (འབྲུག)+975
  • Bolivia+591
  • Bosnia and Herzegovina (Босна и Херцеговина)+387
  • Botswana+267
  • Brazil (Brasil)+55
  • British Indian Ocean Territory+246
  • British Virgin Islands+1
  • Brunei+673
  • Bulgaria (България)+359
  • Burkina Faso+226
  • Burundi (Uburundi)+257
  • Cambodia (កម្ពុជា)+855
  • Cameroon (Cameroun)+237
  • Canada+1
  • Cape Verde (Kabu Verdi)+238
  • Caribbean Netherlands+599
  • Cayman Islands+1
  • Central African Republic (République centrafricaine)+236
  • Chad (Tchad)+235
  • Chile+56
  • China (中国)+86
  • Christmas Island+61
  • Cocos (Keeling) Islands+61
  • Colombia+57
  • Comoros (‫جزر القمر‬‎)+269
  • Congo (DRC) (Jamhuri ya Kidemokrasia ya Kongo)+243
  • Congo (Republic) (Congo-Brazzaville)+242
  • Cook Islands+682
  • Costa Rica+506
  • Côte d’Ivoire+225
  • Croatia (Hrvatska)+385
  • Cuba+53
  • Curaçao+599
  • Cyprus (Κύπρος)+357
  • Czech Republic (Česká republika)+420
  • Denmark (Danmark)+45
  • Djibouti+253
  • Dominica+1
  • Dominican Republic (República Dominicana)+1
  • Ecuador+593
  • Egypt (‫مصر‬‎)+20
  • El Salvador+503
  • Equatorial Guinea (Guinea Ecuatorial)+240
  • Eritrea+291
  • Estonia (Eesti)+372
  • Eswatini+268
  • Ethiopia+251
  • Falkland Islands (Islas Malvinas)+500
  • Faroe Islands (Føroyar)+298
  • Fiji+679
  • Finland (Suomi)+358
  • France+33
  • French Guiana (Guyane française)+594
  • French Polynesia (Polynésie française)+689
  • Gabon+241
  • Gambia+220
  • Georgia (საქართველო)+995
  • Germany (Deutschland)+49
  • Ghana (Gaana)+233
  • Gibraltar+350
  • Greece (Ελλάδα)+30
  • Greenland (Kalaallit Nunaat)+299
  • Grenada+1
  • Guadeloupe+590
  • Guam+1
  • Guatemala+502
  • Guernsey+44
  • Guinea (Guinée)+224
  • Guinea-Bissau (Guiné Bissau)+245
  • Guyana+592
  • Haiti+509
  • Honduras+504
  • Hong Kong (香港)+852
  • Hungary (Magyarország)+36
  • Iceland (Ísland)+354
  • India (भारत)+91
  • Indonesia+62
  • Iran (‫ایران‬‎)+98
  • Iraq (‫العراق‬‎)+964
  • Ireland+353
  • Isle of Man+44
  • Israel (‫ישראל‬‎)+972
  • Italy (Italia)+39
  • Jamaica+1
  • Japan (日本)+81
  • Jersey+44
  • Jordan (‫الأردن‬‎)+962
  • Kazakhstan (Казахстан)+7
  • Kenya+254
  • Kiribati+686
  • Kosovo+383
  • Kuwait (‫الكويت‬‎)+965
  • Kyrgyzstan (Кыргызстан)+996
  • Laos (ລາວ)+856
  • Latvia (Latvija)+371
  • Lebanon (‫لبنان‬‎)+961
  • Lesotho+266
  • Liberia+231
  • Libya (‫ليبيا‬‎)+218
  • Liechtenstein+423
  • Lithuania (Lietuva)+370
  • Luxembourg+352
  • Macau (澳門)+853
  • North Macedonia (Македонија)+389
  • Madagascar (Madagasikara)+261
  • Malawi+265
  • Malaysia+60
  • Maldives+960
  • Mali+223
  • Malta+356
  • Marshall Islands+692
  • Martinique+596
  • Mauritania (‫موريتانيا‬‎)+222
  • Mauritius (Moris)+230
  • Mayotte+262
  • Mexico (México)+52
  • Micronesia+691
  • Moldova (Republica Moldova)+373
  • Monaco+377
  • Mongolia (Монгол)+976
  • Montenegro (Crna Gora)+382
  • Montserrat+1
  • Morocco (‫المغرب‬‎)+212
  • Mozambique (Moçambique)+258
  • Myanmar (Burma) (မြန်မာ)+95
  • Namibia (Namibië)+264
  • Nauru+674
  • Nepal (नेपाल)+977
  • Netherlands (Nederland)+31
  • New Caledonia (Nouvelle-Calédonie)+687
  • New Zealand+64
  • Nicaragua+505
  • Niger (Nijar)+227
  • Nigeria+234
  • Niue+683
  • Norfolk Island+672
  • North Korea (조선 민주주의 인민 공화국)+850
  • Northern Mariana Islands+1
  • Norway (Norge)+47
  • Oman (‫عُمان‬‎)+968
  • Pakistan (‫پاکستان‬‎)+92
  • Palau+680
  • Palestine (‫فلسطين‬‎)+970
  • Panama (Panamá)+507
  • Papua New Guinea+675
  • Paraguay+595
  • Peru (Perú)+51
  • Philippines+63
  • Poland (Polska)+48
  • Portugal+351
  • Puerto Rico+1
  • Qatar (‫قطر‬‎)+974
  • Réunion (La Réunion)+262
  • Romania (România)+40
  • Russia (Россия)+7
  • Rwanda+250
  • Saint Barthélemy+590
  • Saint Helena+290
  • Saint Kitts and Nevis+1
  • Saint Lucia+1
  • Saint Martin (Saint-Martin (partie française))+590
  • Saint Pierre and Miquelon (Saint-Pierre-et-Miquelon)+508
  • Saint Vincent and the Grenadines+1
  • Samoa+685
  • San Marino+378
  • São Tomé and Príncipe (São Tomé e Príncipe)+239
  • Saudi Arabia (‫المملكة العربية السعودية‬‎)+966
  • Senegal (Sénégal)+221
  • Serbia (Србија)+381
  • Seychelles+248
  • Sierra Leone+232
  • Singapore+65
  • Sint Maarten+1
  • Slovakia (Slovensko)+421
  • Slovenia (Slovenija)+386
  • Solomon Islands+677
  • Somalia (Soomaaliya)+252
  • South Africa+27
  • South Korea (대한민국)+82
  • South Sudan (‫جنوب السودان‬‎)+211
  • Spain (España)+34
  • Sri Lanka (ශ්‍රී ලංකාව)+94
  • Sudan (‫السودان‬‎)+249
  • Suriname+597
  • Svalbard and Jan Mayen+47
  • Sweden (Sverige)+46
  • Switzerland (Schweiz)+41
  • Syria (‫سوريا‬‎)+963
  • Taiwan (台灣)+886
  • Tajikistan+992
  • Tanzania+255
  • Thailand (ไทย)+66
  • Timor-Leste+670
  • Togo+228
  • Tokelau+690
  • Tonga+676
  • Trinidad and Tobago+1
  • Tunisia (‫تونس‬‎)+216
  • Turkey (Türkiye)+90
  • Turkmenistan+993
  • Turks and Caicos Islands+1
  • Tuvalu+688
  • U.S. Virgin Islands+1
  • Uganda+256
  • Ukraine (Україна)+380
  • United Arab Emirates (‫الإمارات العربية المتحدة‬‎)+971
  • United Kingdom+44
  • United States+1
  • Uruguay+598
  • Uzbekistan (Oʻzbekiston)+998
  • Vanuatu+678
  • Vatican City (Città del Vaticano)+39
  • Venezuela+58
  • Vietnam (Việt Nam)+84
  • Wallis and Futuna (Wallis-et-Futuna)+681
  • Western Sahara (‫الصحراء الغربية‬‎)+212
  • Yemen (‫اليمن‬‎)+967
  • Zambia+260
  • Zimbabwe+263
  • Åland Islands+358
Thanks! Your message has been sent.
Sending failed. Please fix the errors and try again.