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, Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
WWW
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Program çözünürlüğü hk. wiseman 11 354 Dün, Saat: 17:40
Son Yorum: Emrah Karagöz
  ORM için öneri OBK 4 320 25-04-2019, Saat: 16:43
Son Yorum: kodamelesi
  Windows Oturumu Açılmadan Program Nasıl Çalışır theSinan 15 1.229 15-04-2019, Saat: 00:15
Son Yorum: theSinan
  Windows 8.1'de always on top program yazma sorunu denem3 9 757 18-01-2019, Saat: 16:52
Son Yorum: denem3
  Farklı programları tek bir program altında birleştirme wiseman 5 531 06-01-2019, Saat: 00:17
Son Yorum: anemos



Konuyu Okuyanlar: 1 Ziyaretçi