Einzelnen Beitrag anzeigen

Warp

Registriert seit: 27. Mai 2006
45 Beiträge
 
Delphi XE4 Professional
 
#1

ProjectLocalizer, MessageDlg Problem in Delphi2009

  Alt 6. Jul 2009, 20:48
Hallo,

hoffe das ist die richtige Rubrik für mein Problem(chen).

Ich arbeite mich gerade in ProjectLocalizer ein und habe da ein Problem bei der Sprachumschaltung (Übersetzung) bei TMessageDlg in Delphi 2009.

Die Beschriftungen der Buttons mbYes, mbNo, mbOk, mbHelp und mbCancel werden nicht richtig übersetzt bzw. sind nicht mehr lesbar. auf den ersten Blick sieht es so aus, dass die Buttons keine passende Schriftart verwenden (Rechtecke werden statt den Buchstaben angezeigt bzw. kryptische Zeichen. Das gleiche gilt auf für die Caption des MessageDlg. Ich habe mal ein paar Beispiele angehängt.

Sonst gibt es bist jetzt keine Schwierigkeiten. Die Res.-Strings und sonstigen String Properties des Programms werden korrekt übersetzt bzw. angezeigt. Zum Testen habe ich einfach mal auf Sakuras Demo im Video aufgesetzt. Auch habe ich zum Vergelich mal ein etwas grösseres Projekt mit ProjectLocalizer mehrsprachig gemacht welches auf TMessageDlg verwendet. Gleiches Resultat. Alles o.k. bis auf die Buttons in den MessageDlg's.

Mein Delphi2009 Pro. DE ist übrigens mit den aktuellsten Updates ausgestattet.

Ach so - hat vielleicht jemand schon probiert die Übersetzungsdatenbank von ProjectLocalizer in eine weiter verarbeitbare Form zu exportieren (z.B. CSV um die Texte an Übersetzungsbüros geben zu können). Entweder ist so etwas wirklich nicht drin oder ich habe es noch nicht gefunden.

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, dwsLocalizer;

type
  TForm1 = class(TForm)
    Name: TLabel;
    Edit1: TEdit;
    Label2: TLabel;
    Button1: TButton;
    ListBox1: TListBox;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    procedure ListBox1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

resourcestring
  StrProgrammWirklichBeenden = 'Programm wirklich beenden?';
  StrProgrammNichtZuBeenden = 'Sie wollen also weiter machen.';

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  Label2.Caption:= 'Hallo ' + Edit1.Text;
end;

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  if MessageDlg(StrProgrammWirklichBeenden, mtConfirmation, mbYesNo, 0, mbNo) = mrYes then
    canClose:= TRUE
  else begin
    canClose:= False;
    //Nur zu Testzwecken; ohne irgendeinen Sinn ausser den die Buttons alle zu sehen/testen
    if MessageDlg(StrProgrammNichtZuBeenden, mtConfirmation, [mbYes, mbNo, mbCancel, mbOK, mbHelp], 0, mbOk) = mrYes then {};
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  GetLocalizer.ResourceFolder:= IncludeTrailingPathDelimiter(ExtractFilePath(Application.ExeName)) + 'Languages';
  GetLocalizer.GetLanguages(ListBox1.Items);
  GetLocalizer.LoadSystemLanguage(LANG_ENGLISH);
end;

procedure TForm1.ListBox1Click(Sender: TObject);
begin
  if Listbox1.Items.Count >0 then
  begin
    GetLocalizer.InitializeLanguage(integer(Listbox1.Items.Objects[Listbox1.ItemIndex]));
  end;
end;

end.

Die dwsLocalizer unti habe ich an folgenden Stelen gepatcht, um sie unter D2009 kompilierbar zu bekommen:

Delphi-Quellcode:
    PropInfo := FindPropInfo(Obj, PropNames, 0, PropType, CollectionIdx);
    if (PropInfo <> nil) then
    begin
      // set string property
      //tkUstring zugefügt, 20090702 HH
      if PropInfo^.PropType^.Kind in [tkString, tkLString, tkWString, tkUString] then
        if PropInfo^.SetProc <> nil then
          SetWideStrProp( Obj, PropInfo^.Name, PropValue );
    end

 .....


function TdwsLocalizerInt.GetCodePage: Integer;
var
    Buf: array[0..6] of Char; //vorher AnsiChar; 20090702 HH
begin
  GetLocaleInfo(GetLocaleID, LOCALE_IDefaultAnsiCodePage, Buf, 6);
  Result := StrToIntDef(Buf, GetACP);
end;

Hat jemand eine Idee was da falsch laufen könnte?

Gruss,

Warp
Miniaturansicht angehängter Grafiken
msgdlgdeutschdemo_264.jpg   msgdlgenglishdemo_175.jpg  
  Mit Zitat antworten Zitat