KodDefteri
Tüm yazılar

İki dilli bir siteyi adres çubuğuyla yönetmek

1 dk okumai18nmiddlewareseo

Çok dilli site kurmanın kolay ama yanlış yolu şudur: dili tarayıcı hafızasında tutmak ve butona basınca metinleri değiştirmek. Çalışır gibi görünür, sonra şu sorunlar çıkar:

  • Arkadaşına gönderdiğin linki o kendi dilinde görür, senin gördüğünü göremez.
  • Google iki dili ayrı sayfa olarak göremez; tek bir adres, tek bir içerik sanır.
  • Sayfa ilk açıldığında hangi dilin geleceği belli değildir, kısa bir titreme olur.

Doğru yol: dil adresin parçası olsun

/tr/blog/merhaba
/en/blog/merhaba

Bu iki adres artık iki ayrı sayfa. Paylaşılabilir, işaretlenebilir, aranabilir. Next.js'te bunu klasör adını değişken yaparak kuruyoruz: src/app/[locale]/.... Adresin ilk parçası ne gelirse locale parametresi olarak elimize geçiyor.

Sözlükler

Metinleri bileşenlerin içine yazmıyoruz; iki JSON dosyasında topluyoruz:

src/i18n/dictionaries/tr.json
src/i18n/dictionaries/en.json

Sayfa çalışırken sadece ilgili sözlük yükleniyor:

const dictionaries = {
  tr: () => import("./dictionaries/tr.json").then((m) => m.default),
  en: () => import("./dictionaries/en.json").then((m) => m.default),
};

Buradaki import() çağrısı dinamik. Kullanıcı /tr açtığında en.json hiç yüklenmiyor. Dil sayısı arttıkça bu fark büyür.

Peki kullanıcı sadece siteadi.com yazarsa?

O adreste dil bilgisi yok. İşte middleware burada devreye giriyor. Middleware, istek sayfaya ulaşmadan önce çalışan bir ara katman:

  1. Adreste /tr veya /en var mı? Varsa karışma.
  2. Yoksa, kullanıcının daha önce seçtiği dil çerezde duruyor mu? Duruyorsa ona götür.
  3. O da yoksa tarayıcının Accept-Language başlığına bak, en uygun dili seç.
  4. Uygun adrese yönlendir.

Sonuç: kullanıcı hiçbir zaman dilsiz bir adreste kalmıyor, ama seçim yaptığında da tercihi hatırlanıyor.

Hangi dilde olduğunu makinelere de söylemek

İki küçük ama önemli detay:

  • <html lang="tr"> — ekran okuyucular metni doğru telaffuz etsin diye.
  • alternates.languages — Google'a "bu sayfanın İngilizcesi şurada" demek. İki sayfa birbirinin kopyası değil, çevirisi olarak değerlendirilir.