Çok dilli bir siteyi "arayüz metinlerini çevirmek" olarak düşünmek en yaygın hata. Arama motorları açısından her dil ayrı bir sayfa kümesidir ve her birinin kendi URL'si, başlığı, açıklaması ve alternatif dil bağlantıları olmalıdır. Bu yazıda, bu sitede de kullandığımız yapıyı adım adım anlatıyoruz.

URL stratejisi: önek mi, alt alan adı mı?

Üç yaygın seçenek var:

Yöntem Örnek Not
Alt dizin site.com/en/services Tek alan adı, otorite paylaşılır. Önerilen.
Alt alan adı en.site.com Ayrı site gibi değerlendirilir.
Ayrı alan adı site.co.uk Ülke hedefleme için; maliyetli.

Varsayılan dil için önek kullanmamak (/hizmetler) ve diğer diller için önek eklemek (/en/services) hem kullanıcı hem SEO açısından en temiz sonucu verir.

Rotaları dil bazında tanımlamak

Laravel'de rotaları bir döngü ile her dil için ayrı adlandırarak tanımlıyoruz. URL segmentleri de dile göre değişiyor: Türkçe'de /hizmetler, İngilizce'de /services.

foreach (config('tuzun.locales') as $locale => $meta) {
    $seg = config("tuzun.segments.{$locale}");

    Route::prefix($meta['prefix'])
        ->name("{$locale}.")
        ->middleware("locale:{$locale}")
        ->group(function () use ($seg) {
            Route::get('/', [PageController::class, 'home'])->name('home');
            Route::get("/{$seg['services']}", [ServiceController::class, 'index'])->name('services.index');
            // ...
        });
}

Böylece route('tr.services.index') ve route('en.services.index') birbirinden bağımsız çalışır; küçük bir lroute() yardımcısı aktif dile göre doğrusunu seçer.

Çevrilebilir slug'lar

Blog yazıları için slug_tr ve slug_en gibi ayrı sütunlar tutuyoruz. Bir yazının İngilizcesi yoksa slug_en boş kalır ve o yazı İngilizce listelerde görünmez. Bu, "yarım çevrilmiş" sayfaların arama motorlarına sızmasını engeller.

hreflang ve canonical

Her sayfada:

  • <link rel="canonical"> sayfanın kendi URL'sini işaret eder.
  • Her dil için <link rel="alternate" hreflang="tr|en"> bulunur.
  • x-default varsayılan dile (Türkçe) işaret eder.

hreflang'ın karşılıklı olması gerekir: TR sayfa EN'i gösteriyorsa EN sayfa da TR'yi göstermeli. Çevirisi olmayan bir yazıda yalnızca var olan dillerin bağlantısını üretiyoruz.

Yapısal veri

Organization, WebSite, BreadcrumbList, Service, BlogPosting ve FAQPage şemalarını sayfa türüne göre JSON-LD olarak ekliyoruz. Dil bilgisini inLanguage alanıyla veriyoruz. Şemaları Rich Results Test ile doğrulamayı unutmayın.

Sitemap

Tek bir sitemap.xml içinde her URL için xhtml:link alternatiflerini listeliyoruz. Bu, Google'ın dil ilişkisini sitemap üzerinden de görmesini sağlar ve büyük sitelerde tarama bütçesini korur.

Özet

  1. Varsayılan dil öneksiz, diğerleri önekli.
  2. Rotalar ve URL segmentleri dil bazlı.
  3. İçerikte dil bazlı slug; çevirisi olmayan içerik o dilde yok sayılır.
  4. Her sayfada canonical + karşılıklı hreflang + x-default.
  5. JSON-LD ve sitemap'te dil bilgisi.

Bu yapı, sonradan üçüncü bir dil eklemeyi de tek satırlık bir konfigürasyon değişikliğine indirger.

Berkcan Tüzün

Founder · Fullstack Developer & Technology Solutions Architect · berkcan.tr