lostyazilim

PHP Çoklu Dil Desteğinde Nasıl Bir Yol İzlemeliyim

12 Mesajlar 2.602 Okunma
lstbozum
wmaraci reklam

Nanoripper Nanoripper Hello World! Kullanıcı
  • Üyelik 25.10.2015
  • Yaş/Cinsiyet 30 / E
  • Meslek Computer Science
  • Konum İstanbul Anadolu
  • Ad Soyad Y** A**
  • Mesajlar 71
  • Beğeniler 1 / 19
  • Ticaret 0, (%0)

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.
mimarcan

kişi bu mesajı beğendi.

wmaraci
reklam

viper302 viper302 WM Aracı Kullanıcı
  • Üyelik 09.08.2014
  • Yaş/Cinsiyet 37 / E
  • Meslek Siber Güvenlik Danışmanı
  • Konum İstanbul Anadolu
  • Ad Soyad K** A**
  • Mesajlar 294
  • Beğeniler 19 / 26
  • Ticaret 3, (%100)
Çok güzel cevaplamışsınız. Beni düşündüren herkesin kendi diline göre veriyi çektirirken tek bir veritabanına bağlanır ama ben bir başlık ekleyeceğim diyelim, sistemde 3 adet dil için veritabanı olsun bu 3 ayrı dil için 3 tane veritabanı bağlantısı açıp 3 ayrı tabloya veri eklemek demek. Kısaca her başlıkta yapılan tüm ekleme, güncelleme, silme gibi işlemler 3 veritabanına da da yapılması demek. Bu sistemi yavaşlatmaz mı?

Opencart alışveriş scriptinde görmüştüm yeni bir eklendiğinde alter ile tablonun içine ilgili title olan kısmın title_de gibi bir kolon oluşturup daha sonra default dilin kolonunu aynen o kolonun içine kopyalıyor. Ben çoğaltma işlemini böyle düşünmüştüm.

Aklımda ki şema şu şekilde;
1. Sabit olan kısımları dil dosyasından çekeceğim.
2. Dinamik olan kısımlar ise başlık gibi değerleri de tablo içindeki kolon adının sonunda ki tr, en, de gibi uzantılarını değiştirerek çekmeyi planlamıştım.

Sizin söylediğiniz mantıkta çok güzel ama yukarı da ki anlattıklarım düşündürüyor. Planlara göre her gün günde 4 saat civarı sürede sadece 30 40 tane başlık ben ekleyeceğim. Ek olarakta kullanıcılar da bi o kadar ekleme yapsa 70 80 başlık demek. Bu süre de ileride artacak gibi düşünmek lazım. 1 2 gün daha planlama yapmam lazım sizin söylediğiniz yöntem ile kendi düşündüğüm yöntem arasında bir seçim yapmak için.
 

 

wmaraci
Konuyu toplam 1 kişi okuyor. (0 kullanıcı ve 1 misafir)
Site Ayarları
  • Tema Seçeneği
  • Site Sesleri
  • Bildirimler
  • Özel Mesaj Al