Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Çoklu dil desteği
#1
Arkadaşlar selamlar
Bir programımda ingilizce dil desteği istendi. Bunun için ben daha önce bir fonksiyon kullanmıştım. Bu fonksiyonla, form üzerindeki bileşenlerin yazılarını değiştirebiliyordum. Ancak kodlara bir türlü ulaşamadım. Bir yere not almışım sadece. Aşağıda kodlar mevcut.
Sizin önerebileceğiniz bir yapı varsa direkt onu yapabilirim de. Amacım, form üzerindeki label, message, caption vb. bilgileri türkçe veya ingilizce olarak göstermek.

implementation
{$R *.dfm}
{$R StringTableLocalization.RES}

uses ResourceLocalizer;

procedure TForm1.FormCreate(Sender: TObject);
begin
 TResourceLocalizer.GetLanguages(LanguagesRadioGroup.Items);
end;

procedure TForm1.LanguagesRadioGroupClick(Sender: TObject);
var
 LanguageIndex : integer;
 LanguageResOffset : integer;
begin
 //locate selected item (exit if not assigned)
 LanguageIndex := LanguagesRadioGroup.ItemIndex;
 if LanguageIndex = -1 then Exit;

 //get language ofsset
 LanguageResOffset := Integer(LanguagesRadioGroup.Items.Objects[LanguageIndex]);

 //change button caption
 ButtonItemSelected.Caption := TResourceLocalizer.GetString(LanguageResOffset,1);

 //add items to ListBox
 TResourceLocalizer.GetStrings(ValuesListBox.Items,LanguageResOffset,[2,3,4]);
end;

procedure TForm1.ButtonItemSelectedClick(Sender: TObject);
begin
 if ValuesListBox.ItemIndex <> -1 then
 begin
   ShowMessage(ValuesListBox.Items[ValuesListBox.ItemIndex]);
 end;
end;
Yazılımcı, kahveyi koda çeviren bir organizmadır.
Cevapla
#2
Çoklu Dil Desteği Olan Uygulamalarda Dikkat Edilecekler
    Eğer çokdilli bir uygulama geliştiriliyorsa, dikkat edilmesi gereken birkaç nokta sözkonusudur. Özellikle rdbms konsepti kullanılıyorsa.
  •  Tüm flag alanlar, veritabanında integer olarak tutulmalıdır. Bu sayede dil değiştiğinde de ilgilialanın caption ı düzgünce değiştirilebilir. Çoktan seçmeli alanlar için seçenekleri stringtable dan aldıktan sonra parse edecek bir rutin geliştirilmelidir. Bileşenlerin tüm dillerdeki açıklamalarını alacak kadar bir genişliği olmalıdır. Bu sayede dil değiştirince bileşenin açıklamasının sığmaması gibi bir sorun ortaya çıkmayacaktır.
    Bileşen Ağacında Yürümek
    Temel metodoloji olarak, uygulama kapsamındaki tüm bileşenlerin (Component) bir ağaç yapısı içerisinde birbirine bağlı olmasından yararlanılmıştır. Bu durum sadece delphi için değil, VB ve Progress 4GL gibi gui geliştirme araçlarının pekçoğunda mevcuttur. Bu bileşen ağacı üzerinde recursive bir şekilde yürünerek bileşenlerin kullanıcı arayüzünde görünen başlıklarının değiştirilmesi ana metod olarak ortaya çıkmaktadır. Tüm bileşenler, container olanlar ve olmayanlar olarak ikiye ayrılabilir. Container bileşenler, diğer bileşenleri bünyelerinde barındırabilen bileşenlerdir. Barındıramayanlar ise container olmayanlar olarak nitelendirilebilir. Birkaç örnek verecek olursak;
 
  • Container: Tapplication, Tform, Tpanel,... Container olmayan: Tlabel, TradioButton,... 
    Container olan bileşenler, içerinde barındırdıkları diğer bileşenlerin bilgisinin tutulduğu iki ayrı property ye sahiptirler. Bunlar;
 
  • ComponentCount Componentsproperty leridir. Bu ikisi kullanılarak bileşen ağacı üzerinde yürümek mümkün olmaktadır. 
    Bileşenlere Ait String ID lerine Erişmek
    
Bir bileşene ait bilgiye ulaştıktan sonra ne olacaktır ? Öncelikle uygulama hazırlanırken tüm bileşenler bir temel dile göre yerleştirilirler (Misal Türkçe). Visible tüm bileşenlerin “tag” propertysi mevcuttur ve buradan hareketle de dönüşüm işlemi gerçekleştirilebilir. Tüm bileşenlere birer unique ID (“tag”) ataması yapacağız. Takip eden bölümlerde verilen örneklerde bunun nasıl yapıldığı gösterilmektedir. Örneğin formumuzun başlığı “Stok Giriş” olsun. Formun tag idsi 100 olarak verilmiş olsun. (Diğer bileşenlere de 101 102 gibi verilebilir). Uygulamada bulunması muhtemel mesaj sayısına göre bir ayırma işlemi yapılması gerekmektedir. Örneğin,
 
  • 1-10000 arası id ler Türkçe 10001-20000 arası id ler İngilizce 20001-30000 arası id ler İtalyancagibi. Buradan da anlaşılacağı gibi herbir visible bileşenin 1-10000 arasında bir değeri olmalıdır.Yukarda verdiğimiz form örneğindeki başlık için; Türkçesi: 100 İngilizcesi: 10100 İtalyancası: 20100Uygulamada nasıl kullanıldığı takip eden bölümlerde verilmiştir.

    String lerin Depolanması ve Runtime Esnasında Erişilmesi
    
Windows uygulamaları için kalıcı sabit değerleri (resim, yazı vs) uygulamayla birlikte dağıtabilmek için resource dosyaları kullanılabilir. Bu örnekte, bir stringtable oluşturulup uygulamaya gömülmüştür. Şayet dil desteği uygulamayı derlemeye gerek olmaksızın desteklensin
istenirse local bir dosyadan da runtime sırasında yüklenebilir.
    Uygulama
    
Aşağıda, yukarıda belirttiğimiz yöntemle bir uygulamadaki tüm bileşenleri gerçek zamanlı olarak diğer dillere dönüştüren kodları bulabilirsiniz;
 
procedure SetupLanguage(hRootComponent: TComponent);
var
    cCount : Integer ;
begin
    for cCount:=0 to hRootComponent.ComponentCount -1 do begin
        if (hRootComponent.Components[cCount].ComponentCount > 0) then begin
            SetupComponentLanguage(hRootComponent) ;
            SetupLanguage(hRootComponent.Components[cCount]);
        end
        else begin
            SetupComponentLanguage(hRootComponent.Components[cCount]) ;
        end ;
    end ;
end ;

procedure SetupComponentLanguage(hComponent:TComponent);
var
    hBuffer : Array[1..512] of Char ;
    PropInfo: PPropInfo ;
begin
    if (hComponent.tag > 0) then begin { is it ready for translation ? }
        PropInfo := GetPropInfo(hComponent.ClassInfo, 'Caption');
        if Assigned(PropInfo) then begin
            LoadString(hInstance, hComponent.tag + (lang * 10000),@hBuffer,sizeof(hBuffer)) ;
            SetStrProp(hComponent,PropInfo,string(hBuffer)) ;
        end;
    end ;
end;

    Yukarıdaki kodlar, verilen bileşenden aşağı doğru bileşen ağacında yürüyerek, 'Caption' property sini destekleyen bileşenlerin bu property sini tag lerindeki değeri kullanarak set etmektedir. Bu işlem yapılırken kullanılan lang değişkeninin sahip olduğu (0-Türkçe, 1-İngilizce, 2-İtalyanca,...) order numarası kullanılmıştır. Bir uygulamayı toptan bu işlemden geçirmek için;

    
SetupLanguage(Application);

kullanılabilir. Bununla birlikte tüm formların onCreate eventları içinde de;
   
    
SetupLanguage(self) ;

şeklinde bir kullanımla yüklenirken dinamik olarak dil değişiminin yapılması sağlanabilir.

    Hazırlanan örneğe ait resource dosyası;

STRINGTABLE
{
100, "Dil Testi"
101, "&Etiket 1"
102, "&Giri şKutusu 1"
103, "&Grup Kutusu 1"
104, "&Radio Dü me 1"
ğ
105, "&Radio Dü me 2"
ğ
106, "&Dil De i tir"
ğş
10100, "Language Test"
10101, "&Label 1"
10102, "&Edit 1"
10103, "&Group Box 1"
10104, "&RadioButton 1"
10105, "&RadioButton 2"
10106, "&Change Language"
}


KAYNAK : DOĞAN ZORLU

Ben bu yöntemi projelerimde kullanıyorum... Umarım size de yardımcı olur.
Ne ekersen onu biçersin!  Idea
Cevapla
#3
Cevap için teşekkürler. Bu koda dün denk geldim internette. Ancak bir örnekleme mevcut değil. Yani resource dosyasının nasıl yapılacağı, programa nasıl dail edileceği ile ilgili bir bilgi mevcut değil. Haliyle izleyebileceğim yolu bulamadım.
Yazılımcı, kahveyi koda çeviren bir organizmadır.
Cevapla
#4
(04-03-2021, Saat: 09:46)shooterman Adlı Kullanıcıdan Alıntı: Cevap için teşekkürler. Bu koda dün denk geldim internette. Ancak bir örnekleme mevcut değil. Yani resource dosyasının nasıl yapılacağı, programa nasıl dail edileceği ile ilgili bir bilgi mevcut değil. Haliyle izleyebileceğim yolu bulamadım.

Rica ederim...

Resource dosyalarını programınızda;

{$R *.dfm} nin altına aşağıdaki şekilde import edebilirsiniz...

{$R language.RES}

{$R messages.RES}
Ne ekersen onu biçersin!  Idea
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Çoklu Create yapma Kral 4 190 17-05-2024, Saat: 12:08
Son Yorum: 3ddark
Lightbulb Delphi 7zip Password lü Dosya Sıkıştırma ve Açma + Bonus RAR5 Desteği frmman 6 423 16-03-2024, Saat: 17:55
Son Yorum: delphi.developer
  OrangeUI çoklu dil sorunu nguzeller 1 1.288 11-07-2023, Saat: 12:50
Son Yorum: delphiman
  Threadleri Durdurma (çoklu) gjamesbond 3 1.314 21-07-2022, Saat: 02:02
Son Yorum: Tuğrul HELVACI
  Aynı Tabloda Farklı Sütunlarda Çoklu Filtreleme bünyamin68 18 5.861 19-12-2020, Saat: 22:10
Son Yorum: ozcanm



Konuyu Okuyanlar: 1 Ziyaretçi