Cok dilli (multi language) yapi

Firebird ve Interbase veritabanları ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Cevapla
mrtblt
Üye
Mesajlar: 222
Kayıt: 02 Tem 2007 05:13

Cok dilli (multi language) yapi

Mesaj gönderen mrtblt »

Merhaba

Programimi bircok dille kullanabilecek sekle donusturmek istiyorum. Bunun icin soyle bir yol izlemeye karar verdim.

once bir sozluk tablo olusturdum ve alanlarini su sekilde ayarladim
ID INTEGER NOT NULL,
TURKISH VARCHAR(80),
ENGLISH VARCHAR(80),
ROMANIAN VARCHAR(80)
simdilik 3 dil var. Ama bu dil sayisi alan eklenerek cogaltilabilinir.
Simdi bu yapiyi biraz daha acayim burada herbir id icin ilgili dillerde anlamlar yazili mesela id=1 kaydinin degerleri su sekilde
turkish = musteri
english = customer
romanian = client
Kullanici login ekranindan hangi dilde calismaya baslayacagini seciyor ve ben onu global kullandigim bir degiskene atiyorum
dil := combobox4.Text;
daha sonra herhangi bir formun(mdichild) oncreate event'ine su sekilde kod yaziyorum

Kod: Tümünü seç

procedure Tfrm_crm.FormCreate(Sender: TObject);
begin
  dm.tbl_dil.Locate('id',1,[]);
  frm_crm.Label1.Caption := dm.tbl_dil.FieldByName(dil).AsString;
  dm.tbl_dil.Locate('id',3,[]);
  frm_crm.Caption := dm.tbl_dil.FieldByName(dil).AsString;
...
...
end;
bunu soyle aciklayayim. mesela form caption degeri icin tablo caption degerinin tanimlanmis oldugu id=3 kayda gidiyor locate ile oradan caption'a ilgili kaydin secilen dil(daha once tanimlanmisti) degerini atiyor dm.tbl_dil.FieldByName(dil).AsString; ile.

bu islem form uzerindeki tum label button vs seyler icin yapiliyor

Simdi burada 2 problemim var.
label'a caption atarken access violation hatasi veriyor, form'a caption atarken bir hata mesaji yok. Diger problem ise su. Form acildiginda turkce secmis olmama ragmen orjinal ingilizce etiket degerleri geliyor. Yani benim atamaya calistigim degerler atanmiyor. Bu arada bu bir mdi uygulamasidir ve formlar su sekilde aciliyor.

Kod: Tümünü seç

procedure Tfrm_omega.FirmaTanimlari1Click(Sender: TObject);
begin
  if frm_sirket = nil then
  begin
    frm_sirket := tfrm_sirket.create(self);
    frm_sirket.show;
  end;
end;



Diger bir sorumda su. Programcilikta ve kullanilan tekniklerde oldukca acemi sayilirim. Bu sekilde programi cok dilli bir yapiya cevirmek sizce mantiklimi?
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

s.a.
çoklu dil seçenekleri için forumu biraz araştır. Mege nin bu konu üzerinde bir kaç yazısı vardı sanırım...
vt yapısı için birşey demiyorum.(konumuz odeğil ama ben olsam öyle yapmazdım)
label'a caption atarken access violation hatasi veriyor, form'a caption atarken bir hata mesaji yok
mdi formlarda create olayına dikkat etmek lazım. formu create etme koduna göre hata alabilirsin.
şu başlığı bi incele
viewtopic.php?t=19387&highlight=createform

Kod: Tümünü seç

frm_crm.Label1.Caption := dm.tbl_dil.FieldByName(dil).AsString; 
yazmışsın. ama mdi formlarda create sırasında frm_crm henüz create edilmediği için av alıyorsun. burda iki çözüm var. biri formun adını yazmadan direk atama yapabilirsin.

Kod: Tümünü seç

Label1.Caption := dm.tbl_dil.FieldByName(dil).AsString; 
diğeride sender parametresini kullanabilirsin

Kod: Tümünü seç

(sender as tfrm_crm).Label1.Caption := dm.tbl_dil.FieldByName(dil).AsString; 
diğer problem için farklı ihtimaller var.
belki locate çalışmıyordur.
breakpoint koyup programı satır satır çalıştırmayı dene.
kolay gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
t-hex
Kıdemli Üye
Mesajlar: 531
Kayıt: 18 Mar 2005 02:45
Konum: İstanbul/Antalya
İletişim:

Mesaj gönderen t-hex »

Neden standart bir çözüm olarak dxgettext kullanmıyorsunuz?

http://dybdahl.dk/dxgettext/
Cevapla