Ç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-defaultvarsayı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
- Varsayılan dil öneksiz, diğerleri önekli.
- Rotalar ve URL segmentleri dil bazlı.
- İçerikte dil bazlı slug; çevirisi olmayan içerik o dilde yok sayılır.
- Her sayfada canonical + karşılıklı hreflang + x-default.
- 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.