Caliency.
SEO

Çok Dilli SEO: hreflang, Slug ve Yaygın Hatalar

İki dilli siteler sessizce bozulur. Google'ın gerçekte koyduğu kurallar ve kendi sitemizde kodu okuyarak değil tarayarak bulduğumuz iki hata.

C

Caliency

12 dk okuma
Pencere kenarında bir içerik yönetim sistemi sayfa listesi gösteren dizüstü bilgisayar; masada basılı site haritası şeması, yapışkan notlar ve pasaport.

İki dilli siteler sessizce bozulur. Bu konunun bütün sorunu da bu: hiçbir şey bozuk görünmez. Sayfalar çizilir, dil değiştirici çalışır, iki sürüm de yayındadır — ve Google ya işaretlemelerinizi tamamen yok sayıyordur ya da ziyaretçilerinizin yarısına hiç görmediğiniz bir 404 servis ediyordur.

Bu rehber Google'ın gerçekte koyduğu kuralları, sonra da bu sitede bulduğumuz iki hatayı anlatıyor. İkisini de kodu okuyarak değil siteyi tarayarak bulduk; son bölümün varlık sebebi de bu.

Önemli Çıkarımlar

  • hreflang karşılıklı olmalı: "iki sayfa birbirini göstermiyorsa etiketler yok sayılır" (Google).
  • Her sürüm kendisini ve diğer tüm sürümleri listelemeli.
  • Her dil sürümünün kendi sitemap girdisi olmalı; alternatif olarak anılmak yetmiyor.
  • Önek çeviri değildir — slug hedef dilde olmalı.
  • Önemli olan hatalar kodun içinden görünmüyor. Siteyi tarayın.

hreflang nedir, ne değildir

hreflang, bir sayfanın başka dil ya da bölgelerde sürümleri olduğunu Google'a bildiren bir işaretlemedir. Google'ın ifadesi bilinçli olarak yumuşak: işaretlemeler "bu farklı varyasyonları Google'a bildirir". Bilgidir, talimat değil; ne yapacağına Google karar verir.

Vermenin üç yolu var ve Google "üç yöntem Google açısından eşdeğerdir ve siteniz için en uygun olanı seçebilirsiniz" diyor:

  • HTML etiketleri — head içinde <link rel="alternate" hreflang="…">
  • HTTP başlıkları — PDF gibi HTML olmayan dosyalar için
  • XML sitemap — her <url> içinde <xhtml:link> alt öğeleri

Birini seçip eksiksiz yapın. İkisini yarım yapmak, sitelerin çelişkili işaretlemelerle kalmasının yolu.

Çoğu uygulamayı bozan kural

Google, işaretlemelerinizin hiç kullanılıp kullanılmayacağına karar veren iki kural koyuyor:

"Her dil sürümü kendisini ve diğer tüm dil sürümlerini listelemelidir."

"İki sayfa birbirini göstermiyorsa etiketler yok sayılır."

Gözden kaçan iki sonucu var.

Kendine referans zorunlu. İngilizce sayfa kendisini gösteren bir hreflang="en" içermeli. Gereksiz hissettiriyor. Zorunlu ve atlanması, tüm kümenizin çöpe atılmasının çok yaygın bir yolu.

Karşılıklılık zorunlu. İngilizce sayfa Türkçeyi gösteriyor ama Türkçe geri göstermiyorsa Google işaretlemeyi yok sayıyor — bozuk yarısını değil, işaretlemeyi. "hreflang ekledik, hiçbir şey olmadı" cümlesinin genelde bir sabır meselesi olmamasının sebebi bu.

Pratik sonucu şu: birkaç sayfayı geçtikten sonra hreflang elle sürdürülemez. Her sayfanın her dil sürümünü bilen tek bir kaynaktan üretilmeli; yoksa biri tek dilde bir sayfa eklediği ilk anda sürükleniyor.

Önek çeviri değildir

İngilizce sayfanız /seo-services ise Türkçe sürümü /tr/seo-hizmeti olmalı — /tr/seo-services değil.

Slug, hedef dilde, arama motorlarının okuduğu bir yerde, yani URL üzerinde duran bir metindir. Türkçe önekin altında İngilizce slug bırakmak bunu hiçbir karşılık almadan çöpe atar; ayrıca sonuç sayfasını tarayan Türk ziyaretçiye burasının üstüne çeviri iliştirilmiş bir İngilizce site olduğunu söyler.

Ekipleri yakalayan kısım şu ve bizi de yakaladı: yönlendirme çatılarının çoğu bir yolun statik parçalarını çevirir, dinamik parçalarını çevirmez.

Sitemiz yerelleştirilmiş yol adları kullanıyor, dolayısıyla /seo-services doğru biçimde /tr/seo-hizmeti oluyor — o eşleme yönlendirme yapılandırmasında. Ama bir blog yazısının slug'ı yapılandırma değil içerik. Tarayıcısı Türkçe tercih eden bir ziyaretçi İngilizce bir yazıya geldiğinde çatı kendisine söyleneni yaptı: Türkçe öneki ekledi ve kendisine verilen slug'ı korudu.

Sonuç /tr/blog/<ingilizce-slug> oldu; öyle bir sayfa yok. Bir arama sonucunu, paylaşılan bir bağlantıyı ya da bir dış bağlantıyı takip eden her Türkçe ziyaretçi 404 gördü — hem de en çok dış bağlantı çeken sayfalarda.

Kodda hiçbir şey yanlış görünmüyordu. Sayfalar iyiydi, değiştirici çalışıyordu, sitemap geçerliydi. Hata yalnızca belirli bir tarayıcı ayarına sahip bir ziyaretçinin belirli türde bir adrese gelmesi durumunda vardı.

Çözüm, slug çevirisini yönlendirme katmanına açmak — dil değiştiricinin zaten kullandığı tablonun aynısı — ki yönlendirme özgün slug'a değil çevrilmiş slug'a insin. Bizimki içerikten üretiliyor, yani yazı eklemek onu senkronsuz bırakamıyor.

Sitenizin yarısına mal olan sitemap kestirmesi

İkinci hata daha sessizdi ve ikinci bir dili hedefleyen bir site için daha kötüydü.

Sitemap'imiz sayfa başına tek girdi üretiyordu: <loc> olarak İngilizce adres, Türkçe sürüm ise xhtml:link alternatifi olarak. Makul görünüyor ve yanlış.

Google'ın talimatı açık: "Diğer sitemap'lerde olduğu gibi her URL için ayrı bir <url> öğesi oluşturun" ve her girdi "kendisi dâhil" tüm alternatifleri listelesin.

Kestirmenin altında sitenin Türkçe yarısının tamamı — daha yüksek hacimli Türkçe kelimeleri hedefleyen yarısı — kendi girdisi, lastmod'u ve priority'si olmadan kalıyordu. Anılıyordu, listelenmiyordu.

Düzeltince sitemap ikiye katlandı: 27 girdiden 54'e. Başka hiçbir şey değişmedi.

Kısaca dil kodları

İlk kod dil, ISO 639-1. İsteğe bağlı ikinci kod bölge, ISO 3166-1 Alpha 2.

Tuzak: ülke kodunu tek başına kullanamazsınız. Google "ülke kodunu tek başına belirtemezsiniz" diyor. Bu özellikle Türkiye'de ısırıyor, çünkü tr hem Türkçenin ISO dil kodu hem Türkiye'nin ülke kodu. hreflang="tr" her yerdeki Türkçe demektir. Özellikle Türkiye'deki Türkçe konuşanları istiyorsanız o tr-TR.

Çoğu iki dilli işletme için doğru seçim yalnızca dil. Bölge hedeflemesi, aynı dilin farklı pazarlarda farklı içerik gerektirdiği durumlar içindir — farklı fiyat, farklı yasal koşullar — "bu bizim Türkçe sayfamız" demek için değil.

x-default ise "kullanıcının tarayıcı ayarıyla başka hiçbir dil/bölge eşleşmediğinde kullanılan" geri dönüş. Anasayfanız dile göre yönlendiriyorsa gerekli.

Nasıl kontrol edilir

İki hatamız da kod incelemesine görünmez, taramaya apaçıktı; bu yüzden burada doğrulama sayfaları okumak değil istemek demek.

Siteyi okumayın, tarayın. Sitemap'inizdeki her URL'yi çekip durum kodunu kontrol edin. Tek başına bu bile bize eksik 27 sayfayı gösterirdi.

Diğer dilin tarayıcısıymış gibi tarayın. İngilizce adreslerinizi Accept-Language: tr-TR,tr ile isteyip yönlendirmeleri sonuna kadar takip edin. 404'ümüzü yakalayacak tek kontrol buydu ve tek satır sürüyor:

curl -s -o /dev/null -w "%{http_code} %{redirect_url}\n" \
  -H "Accept-Language: tr-TR,tr" -L https://example.com/blog/bir-yazi

Karşılıklılığı makineyle doğrulayın. Her sayfa için sayfayı çekin, hreflang kümesini okuyun, kümedeki her URL'yi çekin ve her birinin geri gösterdiğini ve kendisini içerdiğini doğrulayın. Kısa bir betik ve tek güvenilir yol; üç sayfanın head'ini okumak diğer doksanı hakkında hiçbir şey kanıtlamıyor.

Sitemap'te sayfa başına değil dil başına girdi olduğunu kontrol edin.

Dil kontrolünü artık her yazıda yayın kapımızın parçası olarak çalıştırıyoruz; tam olarak bu hata sınıfı sessizce geri döndüğü için. Teknik SEO'nun neleri kapsadığına dair geniş resmi istiyorsanız, SEO'nun gerçekte nelerden oluştuğu katmanları anlatıyor; SEO hizmetimiz de uluslararasılaştırmayı ek bir kalem değil teknik temelin parçası sayıyor.

Kısaca

İşaretlemeleri karşılıklı ve kendine referanslı yapın, her dile kendi sitemap girdisini verin, yalnızca öneki değil slug'ı da çevirin ve dil kodlarını doğru kullanın. Sonra tarayarak doğrulayın — iki dilde birden — çünkü bu alandaki hatalar hata gibi görünmüyor.

İki dilli bir siteniz varsa ve bunların doğru olup olmadığına dair fikriniz yoksa, bu bir projeye değmeden önce yirmi dakikaya değer.

Bir fikriniz mi var?

Kısa bir görüşmede kapsamlandırıp sabit fiyat verelim.

Proje başlat →