viper302 adlı üyeden alıntı

Ben şöyle düşünüyorum static olan değerleri include edim diyorum, veritabanı içinde sql sorgusunun içerisinde tablo ön eki olarak $lang değişkeni koyayım daha sonra örnek vereyim

$Lang = $GELENDEGER;

SQLKodu = "Selecet Baslik_".$Lang." From basliklar Where id = 5";

gibi bir yöntem düşündüm. Tabi bütün sorgularda tek tek manuel eklemek gerekecek yukarıdaki ön eki. Ama en azından uğraştırmayacak. Sizin söylediğiniz gibi her dil için veritabanı oluşturmak 1 tane değişiklik için 10 tane veritabanında değişiklik yapmak demektir. Buda belli bir zaman ve veritabanı tabloları çoğaldıktan sonra uğraştırır insanı.

Acaba düşündüğüm yöntem doğru olabilir mi?


Şema farklı şekillerde kurulabilir bu doğrudur bu yanlıştır demek olmaz aslında. Bahsettiğim yöntemde 10 adet dil varsa 10 adet sql sorgusu çalışıyor her biri de farklı veritabanına gönderiliyor bu sebeple herhangi bir yavaşlık olmuyor zaten bu durum sadece site geliştiricisi değişiklik yaptığında geçerli onun dışında hiç bir zaman bu tabloların tamamı aynı anda aynı kişi tarafından kullanılmıyor. Kullanıcı yalnızca kendi dilinin veritabanından veri çekiyor çevirmen de aynı şekilde değişiklik yaptığında yalnızca kendi dilindeki veritabanında değişiklik yapılıyor.

Sizin bahsettiğiniz yöntem çalışabilir ancak onda da şöyle bir sıkıntı yaşanır. Örnek vermek gerekirse benim 10 adet dil imkanı sağlıyorsam 11.yi eklemek istediğimde yalnızca diğer veritabanlarından birini kopyalayıp yeni dil adıyla listeye ekliyorum. Herhangi bir dili kaldırmak istediğimde ise o dile ait veritabanını siliyorum. Sizin önerdiğiniz yöntemde sitedeki her dil için ayrı bir sütun oluşturmanız gerekir, örneğin:

Baslik_TR Baslik_EN Baslik_DE şeklinde ve Select Baslik_".$Lang." yaptığınızda da ilgili sütunu çeker ve gösterir. Ancak web sitesine yeni bir dil eklemek istediğinizde her tabloya tek tek yeni bir sütun eklemeniz gerekir. Eğer çok fazla ekleme çıkarma olmayacak desteklenen dil sayısı da az olacak diyorsanız bu yöntem kullanılabilir ama büyük çaplı bir proje düşünüyorsanız her dil için ayrı bir veritabanı gerekir, tüm büyük sistemler bu yöntemi kullanıyor.

Özellikle benim ihtiyacım olduğu gibi sizin de çeviri eklenme tarihi, değiştirilme tarihi, çeviren kişi vs gibi verileri tutmanız gerekiyorsa o zaman dediğim gibi her çeviri için tabloya yeni bir satır eklenecek şekilde bir şema kurmanız şart.

Daha detaylı açıklamak gerekirse benim kullandığım veritabanı yapısı şu şekilde.

- Her bir dil için ayrı bir veritabanı
-- Birbiri ile alakalı içerikleri gruplamak için her kategori için birer tablo
--- Bu kategorilerde bulunan tüm metinler için de bu tabloda yeni birer satır
---- Bu tabloların ilk sütunu da KEY yani anahtar değeri ki bu değeri php kodumda ilgili çeviriyi çekmek için kullanıyorum.

Bir örnek paylaşayım

LANG_TR veritabanında MEMBERDETAILS isimli bir tablom var bu tablonun sütun yapısı şu şekilde



Verilerin bulunduğu iki satırı da örnek olarak paylaşayım



Tüm veritabanlarındaki tüm tablolarda sütun ve veri yapısı bu şekilde. Böylece bir çeviriyi veritabanından çekmem gerektiğinde

ihtiyacım olan sadece tablo adı ve anahtarı değeri olan str_name oluyor.

$translation->get("MEMBERDETAILS_USERNAME") yaptığımda Kullanıcı adı sonucu $translation->get("MEMBERDETAILS_PASSWORD") yaptığımda ise Şifre olarak değeri alıyorum. Tabi $translation objesi içerisinde ilgili veritabanı seçimi ve bağlantısı tutuluyor, ek olarak get fonksiyonu da gönderilen string'i _ karakterinden bölerek ilk kısmı tablo adı devamını ise str_name anahtar değeri olarak kullanıyor.

Benim kullandığım yöntem budur. Yaklaşık 3,5 4 senedir site herhangi bir yavaşlık sorunu olmadan standart bir hosting üzerinde 10'un üzerinde dil desteği ile çalışmakta hatta üstünde çalıştığım başka bir projede de aynı yöntemi hiç değiştirmeden kullanıyorum. Şuana kadar hiç bir sıkıntı yaşamadım ve oldukça kolaylaştırdı herşeyi diyebilirim.

Tabi ki herkes kendi rahat ettiği şekilde bir sistem kurabilir ancak şema oluşturulurken dikkat edilmesi gereken şey ileriye dönük olarak çıkabilecek her türlü problemi göz önünde bulundurarak bir sistem kurmaktır. Aksi taktirde sonradan şemada herhangi bir değişiklik yapmak için çok büyük uğraş gerekir, sitenin belirli bir süre bakıma alınıp tüm veritabanının ve kayıtların yeniden oluşturulması vs. gibi.