İki dilli bir siteyi adres çubuğuyla yönetmek
Ç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:
- Adreste
/trveya/envar mı? Varsa karışma. - Yoksa, kullanıcının daha önce seçtiği dil çerezde duruyor mu? Duruyorsa ona götür.
- O da yoksa tarayıcının
Accept-Languagebaşlığına bak, en uygun dili seç. - 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.