Çoklu Dil Desteği v2
ThE-yLmZ17.10.2005 - 18:04:34
Merhaba arkadaşlar;

http://www.delphiturkiye.com/index.php?page=mltool.htm

şu sayfada bulunan çoklu dil desteği açıklamasını geliştirmek istiyorum.

2 saat uğraştıktan sonra programımda çoklu dil desteğini yapılandırmış bulunuyorum.

Bunun için ilk önce dil.rc dosyası oluşturup içine;

STRINGTABLE
{
100, "Türkçe"
101, "İşlem Tarihi"
102, "Makbuz No"
103, "Kasa İşlemi"
104, "Cari Hesap"
105, "C. Hes. Ekle"
10100, "English"
10101, "Date"
10102, "Number"
10103, "Manage"
10104, "Create"
10105, "Add"
}


Sonra başlat menusunden çalıştır - "cmd" yazıp enter yapıyoruz. Komut satırında "brcc32" yazıp enter yapıyoruz. Eğer size bilgiler geliyorsa Borland Resource Complier Tool yüklü demektir.

rc dosyamızı bu tool ile RES dosyası yapmak zorundayız. Onuda şu şekilde yapıyoruz;
yine komut satırında;

brcc32 c:\dil.rc -32


bunu yaptıktan sonra dil.res dosyası rc dosyasının yanında belirmiş olması lazım. Bu dosyayı projemizin bulunduğu klasör içine atıyoruz.

sonra projemizde bulunan caption özellikli componentlere sırasıyla TAG özelliklerini 100 ile başlıyarak sayı veriyoruz. (Ben 100 ile başladım stringtable hazırlarken. İstediğiniz sayıdan başlıyabilirsiniz, tabi bunun içinde stringtable ona göre yazmanız lazım),, forum1 e 100, label1 e 101 vs.

sonra uses satırına "typinfo" ekliyoruz;
{$R *.dfm} satırının altına {$R dil.res} ekliyoruz;
bununda altına şu prosedürleri eklioyruz;

procedure SetupComponentLanguage(hComponent:TComponent);
var
hBuffer : Array[1..512] of Char ;
PropInfo: PPropInfo ;
lang:integer;
begin
[b]lang:=0;[/b] [color=blue]{bu sayıyı değiştirirseniz dil değişir.}[/color]
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;


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 ;



en son olarak da formun create eventına

SetupLanguage(Application);
SetupLanguage(self);

ekliyoruz. Lang değişkenini 1 yaparsanız ingilizce, 0 yaparsanız türkçe olur.

özellik olarak stringtable da 100 ile başlıyanlar türkçe 10000 ile başlıyanlar ingilizce olur. Yeni bir dil eklemek isterseniz 20000 ile başlaması gerekir.

Hepinize kolay gelsin,,

yLmZ

Not: :b2de80b13e
 
coderlord17.10.2005 - 18:58:54
Yazın artık herkese ait. Bu foruma yazı yazarken forum kurallarında olanı kabul etmiş sayılırsın.
 
ThE-yLmZ18.10.2005 - 09:03:51
WYSIWYG sonuçta,,

neyse önemli değil, genelde çoğu forumlarda makale olmasa bile bilgilendirme amaçlı çok yazım vardır ve altlarına bunu yazarım. Bu herkesin değil demek değil ki :D sadece başka forumlarda yazarlarsa sadece ismimi yazmalarını rica ettim, bunda kötü bişey yoktur umarım..
 
coderlord18.10.2005 - 09:58:33
:) Yok canım kötü birşey değil elbette. Ancak ismini yazıp yazmamak kişiye kalmış. İsterse yazmayabilir demek istedim.
 
mege18.10.2005 - 11:33:34
bende nasil yaptigimizi yazayim, bol örnek olsun :)

CREATE TABLE LANGUAGE (
LANGUAGETEXTSKEYFIELD INTEGER NOT NULL,
LANGUAGEID SMALLINT NOT NULL,
CURRENTID SMALLINT,
SECTION SMALLINT NOT NULL,
TEXTNO INTEGER,
TEXT VARCHAR(100)
);


seklinde bir dil tablom var. LANGUAGEID degeri dil numarasi turkce icin 0, ingilizce icin 100, almanca icin 200 gibi artan degerler veriyorum her dile. SECTION tek bir buyuk string dizi olusturmak yerine farkli diziler olusturuyorum. buda hangi diziye aktarilcagini cikartmak icin. textno ve text de adindan anlasilir tabi.

program açilisinda alttaki sp yi çalistiriyor ve sonuçlari programdaki bir dizi degiþkene aliyorum.
tüm programdada string islemleri bu dizi üzerinden yapiyorum.


CREATE PROCEDURE SP_SELECTLANGUAGE (
V_ACTIVE INTEGER)
RETURNS (
LANGUAGEID SMALLINT,
CURRENTID SMALLINT,
SECTION SMALLINT,
TEXTNO INTEGER,
TEXT VARCHAR(100))
AS
begin
UPDATE LANGUAGE
SET LANGUAGE.CURRENTID = :V_ACTIVE;

FOR SELECT LANGUAGEID,CURRENTID,SECTION,TEXTNO,TEXT FROM LANGUAGE
WHERE LANGUAGE.LANGUAGEID = :V_ACTIVE
INTO LANGUAGEID,CURRENTID,SECTION,TEXTNO,TEXT
DO
BEGIN
suspend;
END
end



sonra programin acilisinda


Procedure ReadTextsFromDB;
var sActiveLine :widestring;
iLastSection,iLastSectionStartPos : integer;
bas,son:integeR;


begin


with DataMod.pFIBDataSetSetLanguage do
begin
Close;
ParamByName('V_ACTIVE').AsInteger := pSistParam^.iLangType; // INI den okunan dil değeri
CloseOpen(TRUE);
First;
while not EOF do
begin
iLastSection:= DataMod.pFIBDataSetSetLanguageSECTION.AsInteger;
iLastSectionStartPos := DataMod.pFIBDataSetSetLanguageTEXTNO.AsInteger;
sActiveLine := DataMod.pFIBDataSetSetLanguageTEXT.Value;

bas:=1;son:=1;
case iLastSection of
1: begin bas:=0; son:= TXT_S_PAUSE_COUNT; end;
2: begin bas:=0; son:= TXT_ALARM_COUNT; end;
3: begin bas:=0; son:= EVENT_COUNT; end;
4: begin bas:=1; son:= TXT_EVENTEX_COUNT; end;
5: begin bas:=1; son:= TXT_SUCHTEXT_COUNT; end;
6: begin bas:=1; son:= TXT_MESSAGES_COUNT; end;
7: begin bas:=1; son:= TXT_TARTSTATTXT_COUNT; end;
8: begin bas:=1; son:= TXT_FIELDLABELS_COUNT; end;
9: begin bas:=1; son:= TXT_CAPTIONS_COUNT; end;
10: begin bas:=1; son:= TXT_BUTTONCAPTIONS_COUNT; end;
11: begin bas:=1; son:= TXT_MENUITEMS_COUNT; end;
12: begin bas:=0; son:= CATEGORY_COUNT; end;
13: begin bas:=1; son:= TXT_INPUT_OUTPUT; end;
14: begin bas:=1; son:= TXT_INPUT_OUTPUT; end;
15: begin bas:=1; son:= TXT_SERVICECAPTION_COUNT; end;
16: begin bas:=1; son:= IZIN_SAYISI; end;
end;//case

if (iLastSectionStartPos>= bas) and (iLastSectionStartPos<= son) then
case iLastSection of
{1 STATEARRAY}1: Txt^.aStateName[iLastSectionStartPos] := sActiveLine;
{2 AlarmArray}2: Txt^.AlarmMsg[iLastSectionStartPos] := sActiveLine;
{3 EventArray}3: Txt^.EventMsg[iLastSectionStartPos] := sActiveLine;
{4 [EventEx]} 4: Txt^.EventEx[iLastSectionStartPos] := sActiveLine;
{5 SuchText} 5: Txt^.SuchText[iLastSectionStartPos] := sActiveLine;
{6 Messages} 6: Txt^.Messages[iLastSectionStartPos] := sActiveLine;
{7 TST } 7: Txt^.TartimStatusTexts[iLastSectionStartPos] := sActiveLine;
{8 FieldLabe} 8: Txt^.FieldLabels[iLastSectionStartPos] := sActiveLine;
{9 Captions} 9: Txt^.Captions[iLastSectionStartPos] := sActiveLine;
{10Captions} 10:Txt^.ButtonCaptions[iLastSectionStartPos] := sActiveLine;
{11MenuItems} 11:Txt^.MenuItems[iLastSectionStartPos] := sActiveLine;
{12Categoames}12:Txt^.CategoryNames[iLastSectionStartPos] := sActiveLine;
13:Txt^.InputOutputName33[iLastSectionStartPos] := sActiveLine;
14:Txt^.InputOutputName22[iLastSectionStartPos] := sActiveLine;
15:Txt^.ServiceCaption[iLastSectionStartPos] := sActiveLine;
{Izinler} 16:Txt^.Izinler[iLastSectionStartPos] := sActiveLine;
end; // of case
Next;
end;//while
Transaction.CommitRetaining;
end;//with

end;
{------------------------------------------------------------------------------}


sonra program içinde her formda yer alan bir fonksiyon ile
labelbilmemne.caption := Txt^.Captions[1];
labelbilmemne2.caption := Txt^.Captions[2];
...
şeklinde atamaları gerçekleştiriyorum, ayrıca string işlemler için
format(Txt^.Messages[11],[degisken1,degisken2..])
string içinde %s ler % d ler ile dil kurallarına uygun ceviriler olmasını sağlanıyor. bu sayede kimi programlarda örnekleri olduğu gibi devrik cümleler olmuyor.

bu tablo üzerindede çeşitli import export işlemleri yapıp dil ekleme çıkarma düzenleme işlemleri gerçekleşiyor.

database de string işlemleride view lerde computed field lar ile yapıp delphide parmak kıpırdatmadan yapayırsunuz. örneğin
...
STATUSTEXT COMPUTED BY (((SELECT LANGUAGE.TEXT FROM LANGUAGE WHERE (LANGUAGE.LANGUAGEID=LANGUAGE.CURRENTID) AND (LANGUAGE.SECTION=7) AND (LANGUAGE.TEXTNO=JOBARCHIVE.STATUS)))),
...


ben böyle bir mantık oluşturdum. oldukçada kolaylaştırdı işlerimi :) ne tekrar compile a gerek kalıyo nede başka bir exeye. şifreyle girilen bir form ilede grid üzerinden yazıları admin seviyesindeki kullanıcılara değiştirme izni veriyorum. böylece mesajlara, istedikleri yazıları yazabiliyorlar.
hadi kkolay gelsin..
(değişken isimleri karmaşık gelebilir, direk programdan yapıştırdım )
 
NOT : Bu sayfa google'un siteyi indekslemesi içindir. www.delphiturkiye.com/forum/ adresini kullanınız!
1998-2006 www.delphiturkiye.com