firebird ile unicode dil desteği

Yazdığınız makaleleri ve üyelerimizin işine yarayacağını düşündüğünüz kodlarınızı gönderebilirsiniz. Bu foruma soru sormayın!
Cevapla
Kullanıcı avatarı
mege
Admin
Mesajlar: 2360
Kayıt: 05 Şub 2004 04:32
Konum: Beşiktaş
İletişim:

Mesaj gönderen mege »

bende nasil yaptigimizi yazayim, bol örnek olsun :)

Kod: Tümünü seç

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.

Kod: Tümünü seç

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

Kod: Tümünü seç

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

Kod: Tümünü seç

...
    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 )
.-.-.-.-.-.-.-. ^_^
Kullanıcı avatarı
mege
Admin
Mesajlar: 2360
Kayıt: 05 Şub 2004 04:32
Konum: Beşiktaş
İletişim:

Mesaj gönderen mege »

:oops: :oops: yukarıdaki kodda büyük hata çıktı. düzeltme yapıyorum.

Kod: Tümünü seç

CREATE PROCEDURE SP_SELECTLANGUAGE (
    V_ACTIVE INTEGER)
......
  UPDATE LANGUAGE
  SET LANGUAGE.CURRENTID = :V_ACTIVE;
....
satırında update de tüm kayıtları update ettiği için db gereksiz yere şişiyormuş.


yeni bir tablo oluşturup burada ondaki tek satırı güncelliyorum.

Kod: Tümünü seç

  UPDATE TCURRENTLANGUAGE
  SET TCURRENTLANGUAGE.CURRENTLANGID = :V_ACTIVE;
computed fieldlerde ise

Kod: Tümünü seç

  VARCHAR(300) CHARACTER SET UNICODE_FSS
  COMPUTED BY ((
     SELECT LANGUAGE.TEXT FROM LANGUAGE,TCURRENTLANGUAGE 
     WHERE (LANGUAGE.LANGUAGEID=TCURRENTLANGUAGE.CURRENTLANGID) AND
           (LANGUAGE.SECTION=7) AND 
           (LANGUAGE.TEXTNO=JOBARCHIVE.STATUS)))
not : hatayı @Terminatörün uyarısı ile farkettim. teşekkürler :wink: :)
ek not : Fibplus 6.25 ile calculated field lardaki unicode problemini düzeltti. computedları kullanmaya gerek kalmadı ama alışkanlık işte :D
.-.-.-.-.-.-.-. ^_^
Cevapla