Çokdilli SEO: Hreflang ve Canonical Stratejisi

İki dilli sitelerde SEO'nun pratik rehberi: JekCMS'in hazır verdikleri (output_canonical_tag, temel hreflang linki) ile kendinizin ekleyeceği kısımlar — tam hreflang set'i, x-default, dil bazlı sitemap'ler, og:locale — ve sıralamalarınızı batıran yaygın hatalar.

Çokdilli SEO: Hreflang ve Canonical Stratejisi

İki dilli sitelerde SEO'nun pratik rehberi: JekCMS'in hazır verdikleri (output_canonical_tag, temel hreflang linki) ile kendinizin ekleyeceği kısımlar — tam hreflang set'i, x-default, dil bazlı sitemap'ler, og:locale — ve sıralamalarınızı batıran yaygın hatalar.

Çokdilli SEO Problemi

Aynı içeriği aynı alan adında iki dilde yayınladığınızda arama motorları bir ikilemle karşılaşır: hangi sürüm hangi kitle için sıralanmalı? Açık sinyaller olmadan Google, Türkçe sayfanızı İngilizce konuşanlara gösterebilir veya daha kötüsü, her iki sürümü de yinelenen içerik olarak değerlendirip ikisinin de sıralamasını düşürebilir.

jekcms.com'un kendisi de tam olarak bu durumla karşı karşıya — her sayfa aynı alan adında hem Türkçe hem İngilizce olarak var, URL yapısıyla ayırt ediliyor. Bu rehber, bu kurulum için JekCMS'in hazır verdiği parçaları ve temanızda kendinizin ekleyeceği parçaları anlatıyor.

URL Yapısı: Alt Dizin mi, Alt Alan mı, Parametre mi

Çokdilli URL'ler için üç standart yaklaşım vardır:

  • example.com/en/about — Alt dizin
  • en.example.com/about — Alt alan
  • example.com/about?lang=en — Parametre (bundan kaçının)

Alt dizinler daha güvenli varsayılan seçimdir çünkü alan adı otoritesini birleştirir — herhangi bir dil sürümüne gelen her geri bağlantı tüm alan adını güçlendirir. Alt alanlar otoriteyi böler, çünkü Google bazen bunları ayrı siteler olarak değerlendirir. Parametreler en kötü seçenektir, çünkü Google genellikle indeksleme amacıyla URL parametrelerini yok sayar. jekcms.com'un kendisi bu düzeni kullanır: varsayılan dil olarak önek almayan Türkçe URL'ler, /en/ önekli İngilizce URL'ler.

Canonical URL'ler: JekCMS'in Size Verdiği

Yaygın bir hata, her iki dil sürümü için tek bir canonical URL kullanmaktır. Bu, Google'a bir sürümün "orijinal" ve diğerinin bir kopya olduğunu söyler — tam olarak istediğinizin tersi. Her dil sürümünün kendine işaret eden kendi canonical URL'si olmalıdır.

JekCMS'in bunun için gerçek yardımcı fonksiyonu output_canonical_tag(?string $url = null): void'dur — temanızın <head> bölümünde çağırın, mevcut sayfa için kendine referanslı bir canonical link basar:

<?php output_canonical_tag(); ?>

<!-- Turkce sayfada -->
<link rel="canonical" href="https://jekcms.com/blog/jekcms-rehberi" />

<!-- Ingilizce sayfada -->
<link rel="canonical" href="https://jekcms.com/en/blog/jekcms-guide" />

Otomatik algılanan mevcut URL'yi geçersiz kılmanız gerekiyorsa, isteğe bağlı argüman olarak açık bir URL geçirin — canonical'dan çıkarılmasını istediğiniz sorgu parametreleriyle oluşturulan sayfalarda işe yarar.

hreflang: Hazır Gelen ve Kendiniz Eklediğiniz

hreflang özelliği arama motorlarına bir sayfanın hangi dili ve bölgeyi hedeflediğini söyler. JekCMS'in dil değiştiricisi (lang_helpers.php içinde), mevcut sayfanın alternatif dil sürümüne işaret eden tek bir hreflang linki basar — faydalı bir başlangıç sinyali, ama Google'ın belgelerinde anlatılan tam çift yönlü set değil; hazırda bir x-default etiketi ya da dil sürümleri arasında otomatik karşılıklı bağlantı yoktur.

Eksiksiz uygulamayı isterseniz — her sayfada kendine referans veren etiketler, her dil sürümünden diğerine karşılıklı bir bağlantı ve bir x-default yedeği — bunu temanızın header parçasına kendiniz eklersiniz:

<?php
function output_hreflang_tags(string $slugTr, string $slugEn): void {
    $baseUrl = rtrim(SITE_URL, '/');
    $trUrl = $baseUrl . '/blog/' . $slugTr;
    $enUrl = $baseUrl . '/en/blog/' . $slugEn;

    echo '<link rel="alternate" hreflang="tr" href="' . $trUrl . '" />' . "\n";
    echo '<link rel="alternate" hreflang="en" href="' . $enUrl . '" />' . "\n";
    echo '<link rel="alternate" hreflang="x-default" href="' . $trUrl . '" />' . "\n";
}
?>

<?php output_hreflang_tags($post['slug_tr'], $post['slug_en']); ?>

Bunu ekledikten sonra önemli olan üç detay:

  1. Kendine referans: Türkçe sayfa kendisine işaret eden bir hreflang içerir (hreflang="tr"). Google bunu bekler — her sayfa, kendisi dahil tüm dil sürümlerine referans vermelidir.
  2. Çift yönlü: Hem Türkçe hem İngilizce sayfaların tamamen aynı hreflang etiketi setini içermesi gerekir. Türkçe sayfa İngilizce sürümü gösterir ama İngilizce sayfa geri göstermezse, Google sinyali yok sayar.
  3. x-default: Kullanıcının diliyle hiçbir şey eşleşmediğinde hangi sürümün gösterileceğini arama motorlarına söyler. jekcms.com'da birincil kitle olduğu için Türkçe'ye ayarladık.

Dil Bazlı Sitemap'ler

Google, HTML etiketlerinin yanı sıra sitemap'inizde de hreflang açıklamalarını ikinci bir sinyal olarak önerir. JekCMS'in yerleşik Sitemap.php'i gönderiler, kategoriler, sayfalar ve etiketler için standart XML sitemap'leri üretir, ama hreflang xhtml:link açıklamalarını otomatik olarak basmaz — isterseniz iki dilli içeriğiniz için özel bir sitemap'i kendiniz oluşturursunuz:

<?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>https://jekcms.com/blog/jekcms-rehberi</loc>
        <xhtml:link rel="alternate" hreflang="tr"
            href="https://jekcms.com/blog/jekcms-rehberi" />
        <xhtml:link rel="alternate" hreflang="en"
            href="https://jekcms.com/en/blog/jekcms-guide" />
        <xhtml:link rel="alternate" hreflang="x-default"
            href="https://jekcms.com/blog/jekcms-rehberi" />
        <lastmod>2026-03-20</lastmod>
    </url>
    <url>
        <loc>https://jekcms.com/en/blog/jekcms-guide</loc>
        <xhtml:link rel="alternate" hreflang="tr"
            href="https://jekcms.com/blog/jekcms-rehberi" />
        <xhtml:link rel="alternate" hreflang="en"
            href="https://jekcms.com/en/blog/jekcms-guide" />
        <xhtml:link rel="alternate" hreflang="x-default"
            href="https://jekcms.com/blog/jekcms-rehberi" />
        <lastmod>2026-03-20</lastmod>
    </url>
</urlset>

Her iki giriş de tüm dil varyantlarına referans veren tam hreflang açıklama setini içerir — yukarıdaki HTML etiketlerinde kurduğunuz aynı eşleşme. Bunu, gönderiler tablonuz üzerinde küçük bir özel betikle döngüye alarak oluşturabilirsiniz; platform bunu sizin için üretmez.

Open Graph ve Sosyal Paylaşım

Sosyal platformlar bağlantı ön izlemeleri oluşturmak için Open Graph etiketlerini kullanır. İki dilli içerik için sayfa başına dile özgü OG etiketleri ekleyin:

<!-- Turkce sayfa -->
<meta property="og:locale" content="tr_TR" />
<meta property="og:locale:alternate" content="en_US" />
<meta property="og:title" content="<?= htmlspecialchars($post['title_tr']) ?>" />
<meta property="og:url" content="<?= $trUrl ?>" />

<!-- Ingilizce sayfa -->
<meta property="og:locale" content="en_US" />
<meta property="og:locale:alternate" content="tr_TR" />
<meta property="og:title" content="<?= htmlspecialchars($post['title_en']) ?>" />
<meta property="og:url" content="<?= $enUrl ?>" />

Tıpkı hreflang etiketleri gibi bunlar da otomatik üretilmez — canonical ve hreflang çıktınızın yanına temanızın head parçasına kendiniz eklersiniz. og:locale etiketi sadece dil kodu yerine tam yerel ayar kodunu (örneğin tr_TR) kullanır; og:locale:alternate platformlara başka bir dil sürümünün var olduğunu söyler.

Yaygın Hatalar ve Nasıl Kaçınılır

Hata 1: Eksik Dönüş Bağlantıları

Türkçe sayfada İngilizce sürüme işaret eden hreflang="en" var, ama İngilizce sayfada geri işaret eden hreflang="tr" yok. Google onaylanmamış hreflang sinyallerini yok sayar — her iki sayfa birbirine referans vermelidir.

Çözüm: Tam hreflang etiketi setini üreten tek bir paylaşılan fonksiyon kullanın, her iki şablondan da bu çağrılsın; böylece tutarlılık elle hatırlamanız gereken bir şey olmaktan çıkar.

Hata 2: Yanlış Dil Kodları

hreflang="tr" yerine hreflang="tr-TR" kullanmak. Bölge alt etiketi (-TR) yalnızca aynı dilin birden fazla bölgesel varyantına sahip olduğunuzda gereklidir (örneğin Brezilya ve Avrupa Portekizcesi için pt-BR ile pt-PT). Bölgesel hedefleme olmayan Türkçe ve İngilizce için sadece tr ve en kullanın.

Hata 3: Canonical Olmayan URL'lerde hreflang

Bir sayfa başka bir URL'ye yönlendirme (301) yapıyorsa, hreflang etiketleri yönlendirme yapan URL'de değil, son hedef URL'de olmalıdır. Google, yönlendirme yapan sayfalarda hreflang'ı yok sayar.

Hata 4: Diller Arasında Farklı İçerik

Google, hreflang ile bağlantılı sayfaların birbirinin çevirileri olmasını bekler, tamamen farklı içerik değil. İngilizce "Hakkımızda" sayfanız Türkçe sayfanızdan farklı bir şey söylüyorsa, Google hreflang bağlantısını yok sayabilir. İçerik birebir çeviri olmasa da anlamca eşdeğer olmalıdır.

Hata 5: Canonical ve hreflang Sinyallerini Karıştırma

İngilizce sayfanın canonical'ını Türkçe sayfaya işaret edecek şekilde ayarlarken aynı zamanda hreflang etiketleri de eklemek bir çatışma oluşturur — canonical "Türkçe sayfa orijinaldir" der, hreflang ise "bunlar eşit alternatiflerdir" der. Her dil sürümü için canonical'i kendine referanslı tutun; output_canonical_tag() varsayılan olarak tam da bunu yapar.

Google Search Console Doğrulaması

hreflang etiketlerini dağıttıktan sonra Google Search Console üzerinden doğrulayın:

  1. Search Console > Uluslararası Hedefleme'ye gidin
  2. hreflang hataları için Dil sekmesini kontrol edin
  3. Yaygın hatalar: "Dönüş etiketi yok", "Bilinmeyen dil kodu", "Canonical olmayan sayfada etiket"
  4. Belirli sayfaların doğru hreflang açıklamalarını gösterdiğini doğrulamak için URL Denetimi'ni kullanın

Google'ın hreflang değişikliklerini tam olarak işlemesi birkaç hafta sürer. Bu pencerede, Google hangi sorgu için hangi sürümü göstereceğini yeniden değerlendirdikçe geçici sıralama dalgalanmaları görebilirsiniz — bu ayarlama döneminde panikleyip yarıda değişiklik yapmayın.

Uygulamanızı Test Etme

Bir işleme gecikmesi olan Search Console'a güvenmeden önce, uygulamanızı hemen şu yöntemlerle test edin:

  • Sayfa kaynağını görüntüleyin: <head> bölümünde hem hreflang etiketlerinin hem canonical etiketinin mevcut olduğunu kontrol edin
  • Google'ın Zengin Sonuçlar Testi: URL'nizi girin ve oluşturulan HTML'yi hreflang etiketleri için inceleyin
  • Screaming Frog: Sitenizi tarayın ve tutarsızlıklar için hreflang raporunu kontrol edin
  • Manuel çapraz kontrol: Türkçe sayfayı ziyaret edin, hreflang URL'lerini not edin, sonra her birini ziyaret edip geri bağlantı verdiğini doğrulayın

Çokdilli SEO uygulamada hassasiyet gerektirir, ama jekcms'in gerçek yapı taşları — output_canonical_tag() ve dil değiştiricideki temel hreflang linki — kolay kısmı halleder. Gerisi, bir kez ekleyip her iki dilli şablonda yeniden kullanacağınız, küçük ve net tanımlı bir tema kodu miktarıdır.

Hemen Sipariş Verin

Tek seferlik ödeme, ömür boyu erişim. Kurulum 30 dakika.

Fiyatlara Bak
  • 30 dakikada kurulum ve yayın
  • 14+ profesyonel tema
  • n8n otomasyon entegrasyonu
  • Otomatik SEO — Sitemap, Schema.org
  • iyzico ödeme entegrasyonu

Yeniliklerden ilk sen haberdar ol

Yeni özellikler, sürüm notları ve CMS rehberleri — ayda birkaç e-posta, spam yok.