Konuyu Oyla:
  • Derecelendirme: 5/5 - 1 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Çok dilli program desteği öneri
#11
Kısmen dil dosyası işlemi yaptım. Fakat daha eksikleri de var. Kod olarak da paylaşmak istedim. Daha öncede dediğim gibi bir Framework yapıyorum. Daha eksikleri var. Bittiğinde linkini paylaşacağım.

Yapı şu şekilde Her bir Output form(DBGrid ile listelenen form) ve Input form(Girişlerin yapıldığı edit ve label kontrollerin olduğu form) içinde bir tane Table (TTable) sınıf bilgisi var.

Output ve Input form açılırken bu table sınıfı create edilerek parametre olarak gönderiliyor. Böylece her form kendi sınıfını biliyor.

Output ve Input formlar kendi baz form sınıflarından miras ile çalışıyor.

İlk programa giriş ekranında(login form) dil seçeneğini soruyorum. Girilen dil bilgisini ConnSetting.Language içinde tutuyorum. Bu bilgi benim dil için referansım oluyor.

Aşağıdaki fonksiyon bana veri tabanından istediğim bilginin istenilen dile göre sonucunu getiriyor. Veri tabanında sorun olması durumuna karşın varsayılan değer olarak birde bilgi gönderiyorum. Sonucu veri tabanında bulamaz ise varsayılan bilgi kullanıcıya sunuluyor. Böyle program dil bilgisi olmasa/veri tabanında bu girişe ait bir dil kaydı olmasa bile varsayılan bilgiler ile çalışmaya devam ediyor.

CREATE TABLE public.sys_lang_contents
(
 id serial, --sequence incremental
 validity boolean NOT NULL DEFAULT true,
 lang character varying(3),
 code character varying(64),
 value text,
 is_factory_settings boolean NOT NULL DEFAULT false,
 CONSTRAINT sys_lang_contents_pkey PRIMARY KEY (id),
 CONSTRAINT sys_lang_contents_lang_fkey FOREIGN KEY (lang)
     REFERENCES public.sys_lang (language) MATCH SIMPLE
     ON UPDATE CASCADE ON DELETE RESTRICT,
 CONSTRAINT sys_lang_contents_lang_code_key UNIQUE (lang, code)
)

Örnek Veri tabanı bilgileri
Input ve Output Formlar için Form başlıkları,
-----------------------------------------------------------
| lang  |  code                                 | value
-----------------------------------------------------------
| TR    |  FormCaption.Input.city               | Şehir
| EN    |  FormCaption.Input.city               | City
| TR    |  FormCaption.Output.city              | Şehirler
| EN    |  FormCaption.Output.city              | Cities
| TR    |  GridFieldCaption.city.city_name      | ŞEHİR
| EN    |  GridFieldCaption.city.city_name      | CITY
| TR    |  LabelCaption.Input.city.city_name    | Şehir Adı
| EN    |  LabelCaption.Input.city.city_name    | City Name
| TR    |  BUTON KAPAT                          | KAPAT
| EN    |  BUTON KAPAT                          | CLOSE
| TR    |  HATA ERİŞİM HAKKI                    | Erişim hakkı hatası!!!
| EN    |  HATA ERİŞİM HAKKI                    | Access right failure!
-----------------------------------------------------------

type
 TLang = record
   ...
   ButonKapat: string;
   ...
   HataErisimHakki: string;
   ...
 end;

Bu record SingletonDB sınıfı içinde tanımlı durumda. Bu record framework için kullanılan standart mesaj veya buton başlıkları için kullanılıyor.
public LangFramework: TLang write FLangFramework 
İlk proje açılışında aşağıdaki gibi sabit bilgi olarak giriyoruz.
  FLangFramework.ButonKapat := 'BUTON KAPAT';
  FLangFramework.HataErisimHakki := 'HATA ERİŞİM HAKKI';

Veri tabanından dil seçeneğine göre bilgileri çeken fonksiyon
function TSingletonDB.GetTextFromLang(pDefault, pCode: string): string;
var
 Query: TFDQuery;
begin
 Result := pDefault;

 if Self.FInstance.DataBase.Connection.Connected then
 begin
   Query := Self.FInstance.DataBase.NewQuery;
   try
     with Query do
     begin
       Close;
       SQL.Text := 'SELECT value FROM sys_lang_contents WHERE lang=:lang and code=:code;';
       ParamByName('lang').Value := Self.FInstance.DataBase.ConnSetting.Language;
       ParamByName('code').Value := pCode;
       Open;

       if not Fields.Fields[0].IsNull then
         Result := Fields.Fields[0].AsString;

       if Result = '' then
         Result := pDefault;

       EmptyDataSet;
       Close;
     end;
   finally
     Query.Free;
   end;
 end;
end;

Bu kod DBGrid içinde Kolonların başlıklarını değiştiriyor.
procedure TfrmBaseDBGrid.RefreshDataFirst();
var
  nIndex: Integer;
begin
 Table.SelectToDatasource(FQueryDefaultFilter + FQueryDefaultOrder, True);

 for nIndex := 0 to Table.DataSource.DataSet.FieldCount - 1 do
 begin
   with dbgrdBase.Columns.Add do
   begin
     FieldName := Table.DataSource.DataSet.Fields[nIndex].FieldName;
     Title.Caption := Table.DataSource.DataSet.Fields[nIndex].DisplayName;
     Title.Caption := TSingletonDB.GetInstance.GetTextFromLang(Title.Caption, 'GridFieldCaption.' + Table.TableName + '.' + FieldName);
     Title.Color := clBlack;
     ...
   end;
 end;
end;

procedure TfrmBaseInputDB.FormShow(Sender: TObject);
var
  vCtx : TRttiContext;
  vRtf : TRttiField;
  vRtt : TRttiType;
  vLabel: TLabel;
begin
//Bu kod Input form üzerindeki Label Caption bilgilerini dil dosyasına göre getiriyor.
 inherited;
 vCtx := TRttiContext.Create;
 vRtt := vCtx.GetType(Self.ClassType);
 for vRtf in vRtt.GetFields do
   //label component isimleri lbl + db_field_name olacak şekilde verileceği varsayılarak bu kod yazildi. örnek: lblcountry_code
   if vRtf.FieldType.Name = 'TLabel' then
   begin
     vLabel := TLabel(FindComponent(vRtf.Name));
     TLabel(vLabel).Caption :=
         TSingletonDB.GetInstance.GetTextFromLang(TLabel(vLabel).Caption,
         'LabelCaption.Input.' + Table.TableName + '.' + RightStr(TLabel(vLabel).Name, Length(TLabel(vLabel).Name)-3));
   end;

 Self.Caption := TSingletonDB.GetInstance.GetTextFromLang(Self.Caption, 'FormCaption.Input.' + Table.TableName);
end;

Butonlar ve diğer mesajlar içinde işlemler yaptım.
  //örnek buton başlığı
  btnClose.Caption := TSingletonDB.GetInstance.GetTextFromLang('CLOSE', TSingletonDB.GetInstance.LangFramework.ButonKapat);

  //örnek mesaj hata kodu
  raise Exception.Create(TSingletonDB.GetInstance.GetTextFromLang('Access right failure!', TSingletonDB.GetInstance.LangFramework.HataErisimHakki));


Yazımda umarım eksik yoktur. Yazmak epey yorucu oldu ve zaman aldı.

Fakat bu bilgiler ek olarak birde sorunum var.
İlk program çalıştırıldığında giriş formunda (login) kullanıcı adı ve şifre girildikten sonra onay butonuna tıklanınca veri tabanına bağlanıyorum. Kontrol yaparak doğruysa o zaman giriş yapıyorum.

Bu veri tabanı bağlantı işlemini nasıl yapmamı tavsiye edersiniz. Program ilk çalıştırıldığında veri tabanına bağlantı yaptıktan sonra login formda onay butonu tıklanınca kullanıcılar tablosunda kullanıcı adı ve şifre kontrolü mü yapmalıyım?
PostgreSQL - Linux - Delphi, Poliüretan
WWW
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
Lightbulb Delphi 7zip Password lü Dosya Sıkıştırma ve Açma + Bonus RAR5 Desteği frmman 6 319 16-03-2024, Saat: 17:55
Son Yorum: delphi.developer
  [ÇÖZÜLDÜ] macos işletim sistemine program yazmak shooterman 5 514 02-02-2024, Saat: 09:54
Son Yorum: shooterman
  program exe icon sorunu cvheneburi 9 2.832 19-10-2023, Saat: 15:04
Son Yorum: harunyl
  program boşta kalmışsa info@guzelceker.com 3 1.006 10-04-2023, Saat: 13:02
Son Yorum: ozcanm
  Program güvenliği HakanY 3 965 12-11-2021, Saat: 19:17
Son Yorum: enigma



Konuyu Okuyanlar: 1 Ziyaretçi