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.
http://www.sercanca.com

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.
http://www.sercanca.com

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ı: @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.
GitHub Projem

***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, Poliüretan
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 http://www.vclcomponents.com/Delphi/Loca...-info.html
İ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ı: Ç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 http://www.vclcomponents.com/Delphi/Loca...-info.html

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.
http://www.sercanca.com

Sadece Hobiciyim..
WWW
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  OrangeUI çoklu dil sorunu nguzeller 0 95 17-05-2020, Saat: 12:15
Son Yorum: nguzeller
  Memo bileşeni Duplicate veya Put hakkında yardım kofmaster 6 441 11-04-2020, Saat: 22:39
Son Yorum: kofmaster
  IDE hakkında sorular(F8 Debug,Otomatik tamamlama) 41linea41 6 550 10-03-2020, Saat: 20:07
Son Yorum: kodamelesi
  IHTMLSelectElement onChange olayı hakkında [ÇÖZÜLDÜ] kodamelesi 6 812 03-03-2020, Saat: 16:45
Son Yorum: kodamelesi
  Streaming hakkında Kerembacioglu 0 201 29-02-2020, Saat: 19:50
Son Yorum: Kerembacioglu



Konuyu Okuyanlar: 1 Ziyaretçi