Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Çoklu Dil Desteği Hakkında
#1
Shocked 
Merhaba Arkadaşlar,

Yazımına başladığım bir projede Çoklu dil desteği yapmak istiyorum. Şuanda TR ve ING seçeneği yeterli. Nette bir kaç yol buldum fakat görsel bileşenlerin caption işlemlerine hitap ediyordu. Oysa yazılım içerisinden bir çok uyarı mesajı ve Hata Mesajları yer alıyor.

Kafamda her dil için ini dosyası hazırlayıp ayarlar kısmından seçip açılışta okumak var.

Lakin Bunun için GLOBAL değişken tanımlayıp değişkenlere aktarıp yapabilirim. Fakat her ifade için DEĞİŞKEN tanımlayıp dosyadan açılışta okuyup aktarmak amelelik gibime geliyor.

Direkt ilgili ini dosyasından anlık okutabilirim. Ama her Defasında Dosyadan okutmak sağlık gelmiyor gözüme.

StringListe alıp her defasından ilgili satırları okuyabilirim. GLOBAL değişkenden farkı kalmaz sanki.

Açıkçası basit,kasmayacak,pratik,işlevsel bir çözüm arıyorum. Eğer düzgün bir yöntem varsa bu aşamada ona göre alt yapıda devam etmek mantıklı olacaktır.

Bu konuda bilgi verirseniz sevinirim.

Not : Uygulama Lazarus ile geliştiriliyor.
Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.

Sadece Hobiciyim..
WWW
Cevapla
#2
Şimdilik önerim local bazlı ini dosyasından uzak durman birden fazla pc de çalışacaksa uygulaman sıkıntı olabilir bunun yerine veri tabanında tutacak şekilde bir yapı kurman daha iyi olur düşüncesindeyim.
Bu dünyada kendine sakladığın bilgi ahirette işine yaramaz. 
Cevapla
#3
@adelphiforumz

Uygulama Localde çalışıyor. Herhangi bir Veritabanına bağlı değil. Görevi ise IP üzerinden kontrol ettiği güvenlik duvarları mevcut. toplu işlemler ve yedekleme işlemlerini kontrol ediyor.

Uygulama Çok kullanıcılı olarak çalışmamaktadır. İhtiyaçta yoktur.

Sanırım bu durumda Local Bazlı ini ile devam edeceğim. Ama okuyup yazma kısmını nasıl çözsemde sorun yaşamasam.
Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.

Sadece Hobiciyim..
WWW
Cevapla
#4
Merhaba,
Fikir vermesi açısından bir inceleyin derim.



Cevapla
#5
(27-08-2018, Saat: 17:37)SercanTEK Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.@adelphiforumz

Uygulama Localde çalışıyor. Herhangi bir Veritabanına bağlı değil. Görevi ise IP üzerinden kontrol ettiği güvenlik duvarları mevcut. toplu işlemler ve yedekleme işlemlerini kontrol ediyor.

Uygulama Çok kullanıcılı olarak çalışmamaktadır. İhtiyaçta yoktur.

Sanırım bu durumda Local Bazlı ini ile devam edeceğim. Ama okuyup yazma kısmını nasıl çözsemde sorun yaşamasam.

Dosya bazlı tutacaksan bir dizinde dosya sayısının çok fazla olması ya da tek boşuna çok büyük dosya ikisi de sorun oluşturabilir. Ama anladığım kadarıyla uygulamanızdaki tüm ekran ve metinleri tek dosyaya bile yazsanız çok büyük bir dosya olmayacak. Bu durumda her dil için ayrı dil dosyaları oluşturup, JSON formatlı bir dosya kullanabilirsiniz. Tercüme için bu uygulamınız ve diğer uygulamalarınızda kullanabileceğiz standart bir yapı oluşturabilirsiniz. RTTI ile görsel objelerin içersinde Caption isimli property'ye sahip olanların değerini okuyarak ve geri yazarak (set ederek) başlayabilirsin.
Cevapla
#6
Bende kısa süre önce aynı konuda bir soru sormuştum. Farklı yollar önerenler oldu. En sonunda Veri tabanı içinde tutup kullanıcının programı açarken ki seçtiği dil seçeneğine göre form içeriğindeki bilgileri seçilen dile göre değiştiriyorum.

Şöyle bir tablom var.

CREATE TABLE public.sys_lang_gui_content
(
 id serial,
 lang character varying(16) NOT NULL,
 code character varying(64) NOT NULL,
 value text,
 content_type character varying(32) NOT NULL,
 table_name character varying(64),
 CONSTRAINT sys_lang_gui_content_pkey PRIMARY KEY (id),
 CONSTRAINT sys_lang_gui_content_lang_fkey FOREIGN KEY (lang)
     REFERENCES public.sys_lang (language) MATCH SIMPLE
     ON UPDATE CASCADE ON DELETE RESTRICT,
 CONSTRAINT sys_lang_gui_content_lang_code_content_type_table_name_key UNIQUE (lang, code, content_type, table_name)
)

Content Type içerikleri
'Button'
'Error'
'Filter'
'General'
'Grid.FieldCaption'
'Input.FormCaption'
'Input.LabelCaption'
'Login'
'Message'
'Message Title'
'Output.FormCaption'
'Popup'
'Status'
'Tab'
'Warning'

Buda örnek Data
'English EN';  'Ulke Adi';   'Country Name';      'Input.LabelCaption';  'Sehir'
'Türkçe TR';   'Ulke Adi';   'Ülke Adı';          'Input.LabelCaption';  'Sehir'
'English EN';  'Sehir Adi';  'City Name';         'Input.LabelCaption';  'Sehir'
'Türkçe TR';   'Sehir Adi';  'Şehir Adı';         'Input.LabelCaption';  'Sehir'

'Türkçe TR';   'Plaka Kodu'; 'Plaka Kodu';        'Grid.FieldCaption';   'Sehir'
'English EN';  'Plaka Kodu'; 'Car Licence Code';  'Grid.FieldCaption';   'Sehir'
'Türkçe TR';   'Sehir Adi';  'Şehir Adı';         'Grid.FieldCaption';   'Sehir'
'English EN';  'Sehir Adi';  'City Name';         'Grid.FieldCaption';   'Sehir'
'Türkçe TR';   'Ulke Adi';   'Ülke Adı';          'Grid.FieldCaption';   'Sehir'
'English EN';  'Ulke Adi';   'Country Name';      'Grid.FieldCaption';   'Sehir'

'Türkçe TR';   'Application Terminate';   'Program sonlandırılacak. Programı kapatmak istediğinden emin misin?';  'Message';  'System'
'English EN';  'Application Terminate';   'Application terminated. Are you sure you want close application?';     'Message';  'System'
'Türkçe TR';   'Close Window';            'Çıkmak istediğinden emin misin?  Tüm değişiklkler iptal olacak!!!';    'Message';  'System'
'English EN';  'Close Window';            'Are you sure you want to exit?   All changes will be canceled!!!';     'Message';  'System'

'Türkçe TR';   'Yes Lower';   'Evet';  'General';   'System'
'English EN';  'Yes Lower';   'Yes';   'General';   'System'
'Türkçe TR';   'Yes Upper';   'EVET';  'General';   'System'
'English EN';  'Yes Upper';   'YES';   'General';   'System'

Benim kullandığım bilgileri de örnek olarak verdim. Bu şekilde bir yapı ile sonsuz dil yapısı yapabilirsiniz. Henüz bitmedi fakat benim kullandığım kodlara buradan da bakabilirsiniz.
Fakat yapınızın esnek olması lazım. Ben projedeki veri tabanı alan isimlerinden alarak kullandım. Kullanılan kontrollerin isimlendirmesi de bir düzen içinde verildi.
Buda örnek Data
lblSehirAdi
lblUlkeAdi
lblPlakaKodu
Bu şekilde bu Label ları bulup Caption bilgisini getirmesi içinde bir fonksiyonum var onu kullanıyorum.
lbl prefix siliyorum ve her büyük harften önce bir boşluk ekliyorum. Böylece code alanındaki lblPlakaKodu => "Plaka Kodu" oluyor.

Tam hatırlayamadım kodda çok değişiklik yaptım. Fakat siz incelersiniz. Ana mantık yukarıda anlattığım şekilde.
Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.

***Edit***
Yazıyı yazdım fakat geç gönderebildim. Dediğiniz gibi veritabanı yoksa, çok büyük bir uygulama değilse bir defa yazacaksınız. ini veya xml dosya ile kendi dil dosyanızı yapın. Bence en mantıklısı bu şekilde olur. Ben olsam bu şekilde yapardım.
PostgreSQL - Linux - Delphi, Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
WWW
Cevapla
#7
Çoklu dil desteği için veri tabanı .ini vs.. çözümler zaman geçtikçe projeyi hantallaştırıyor. Bunun yerine her bir dil için ayrı exe çıkarmak daha makul bir yol. Localizer ve resourceString olarak aratırsan bir çok kaynağa ulaşabilirsin.
Mesela Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
İmam Süleyman Yakub <--> Molla Mustafa Mansur
Evlatlarım!
Cismanımız TÜRK ruhumuz ise İSLAM.
Bu yolda daim olalım her an.
Cevapla
#8
(27-08-2018, Saat: 23:35)ahmet_sinav Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.Çoklu dil desteği için veri tabanı .ini vs.. çözümler zaman geçtikçe projeyi hantallaştırıyor. Bunun yerine her bir dil için ayrı exe çıkarmak daha makul bir yol. Localizer ve resourceString olarak aratırsan bir çok kaynağa ulaşabilirsin.
Mesela Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.

Aynı kullanıcı farklı dil kullanmak istediğinde farklı bir exe mi indirmesi gerekecek? Öyle ise çok makul gelmedi bana. Ayrıca desteklenen dil sayısı arttığında 100'lerce farklı exe çıktısı demektir bu  Rolleyes
Cevapla
#9
büyük çaplı uygulamalar için farklı exeler ya da resource dosyaları oluşturmak mantıklı. Windows, ofis , delphi gibi uygulamalarda ayarlar kısmına girip dil seçeneği seçemiyoruz. ya istediğimiz dildeki setup dosyasını indiriyoruz ya da kurulum işleminde hangi dil için kurulum yapmak istediğimizi seçiyoruz. Hangi yöntemi kullanacağınızı en iyi siz belirleyebilirsiniz. Projenizin durumuna göre uygun olan çözümü kullanmalısınız.

"100' lerce farklı exe çıktısı" böyle bir durumda dikkat etmeniz gereken hususlardan biri olmaması lazım. Programınızın inşa işlemlerini otomatik bir hale getirdiğinizde bu 100 lerce farklı exenin sistem tarafından otomatik olarak oluşturulup , setup dosyası haline getirilip , ftp de ilgili yerlere otomatik olarak yüklenmesini sağlamak mümkün.
WWW
Cevapla
#10
Bilgilendirme için Teşekkürler Arkadaşlar,

Projenin boyutu, geleceği ve işlevi konusunu baz aldığımda oluşturduğum kendi dil dosyası yeterli gelecektir.

Form Create olayında Dil Dosyasını oluşturduğum bir StringList e yükleyip gerekli alanları Gerekli Satırlardan alıp gerekli yerlere vereceğim.

Bu proje için Yeterli olduğunu düşünüyorum. Program kapanınca Stringlist.free yaparım.
Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.

Sadece Hobiciyim..
WWW
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Personel Yıllık İzin Hakediş Hesaplama Hakkında bkantur 2 144 04-10-2019, Saat: 18:15
Son Yorum: uparlayan
  Çalışma Anında Çoklu Bileşen Türetme pro_imaj 10 538 19-09-2019, Saat: 16:16
Son Yorum: pro_imaj
  Moduler Programlama Hakkinda TheEAK 4 250 18-09-2019, Saat: 10:43
Son Yorum: TheEAK
  IDE çoklu monitör kullanımı hakkında adelphiforumz 2 273 10-07-2019, Saat: 12:45
Son Yorum: adelphiforumz
  GarantiBBVA SFTP işlemleri hakkında adelphiforumz 4 415 09-07-2019, Saat: 10:43
Son Yorum: r3n4m3



Konuyu Okuyanlar: 1 Ziyaretçi