Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Werkzeuge (https://www.delphipraxis.net/63-sonstige-werkzeuge/)
-   -   ProjectLocalizer, MessageDlg Problem in Delphi2009 (https://www.delphipraxis.net/136714-projectlocalizer-messagedlg-problem-delphi2009.html)

Warp 6. Jul 2009 20:48


ProjectLocalizer, MessageDlg Problem in Delphi2009
 
Liste der Anhänge anzeigen (Anzahl: 2)
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

Warp 8. Jul 2009 19:21

Re: ProjectLocalizer, MessageDlg Problem in Delphi2009
 
push!

Arbeitet denn von Euch keiner mit "ProjectLocalizer" unter D2009 und kann etwas dazu sagen?

Wenigstens ob bei Euch alles problemlos läuft oder nicht (MessageDlg, usw.)......

Gruss,

Warp

ConstantGardener 8. Jul 2009 20:11

Re: ProjectLocalizer, MessageDlg Problem in Delphi2009
 
hallo warp,

ich arbeite mit dem WinLocalizer von Daniel Wieschnewski (aka Sakura :cat: ) unter D2006. Leider gibt er keine Infos zur weiteren Entwicklung des Projektes (auch nicht per PN). Im Moment ist das Programm die letzte Hürde für mich auf dem Weg zu D2009. Von daher war ich schon mal erfreut zu hören das Du es zum laufen gebracht hast.

Bei den Fehlern könnte evtl. ein Problem mit der fehlenden UNICODE Unterstützung vorliegen. Ist aber nur so ins blaue geraten.

Einen Export / import nach CSV für externe Übersetzung z.B. habe ich leider auchg noch nicht gefunden.

Ansonsten finde ich das Tool nach wie vor Klasse. :thumb: Wenn man nur wüsste ob es weiter entwickelt wird ? :roll:

cg

kroimon 8. Jul 2009 20:27

Re: ProjectLocalizer, MessageDlg Problem in Delphi2009
 
Ja, auch per Mail gibt es von Sakura keinerlei Reaktion :-/

Ich fände es nur fair, wenn er sich wenigstens Mal dazu äußern könnte und das optimalste wäre, er würde WinLoc als OpenSource veröffentlichen oder das Projekt in andere Hände legen...
Das Tool ist super, aber mit toter Software zu arbeiten macht keinen Spaß :-(

Sakura! Hierher! Hopp! ;-)

Warp 8. Jul 2009 20:53

Re: ProjectLocalizer, MessageDlg Problem in Delphi2009
 
Habe Daniel auch bereits versucht per eMail zu erreichen. Ebenso bis jetzt kein Feedback erhalten.

Es hängt jetzt bei mir eigentlich nur noch an dem MessageDlg-Problem und geht es seitens Daniel weiter mit ProjectLocalizer (spez. D2009) oder nicht. Wenigstens eine Antwort "geht weiter: ja/nein" sollte drin sein.

Wenn nein: o.k. - dann muss ich eben etwas Anderes statt ProjectLocalizer suchen.
Würde es dann auch fair finden, wenn Daniel es wenigstens so auf seiner Website aussagen würde.

@krassonkel
Geht mir aber genauso wie Dir, ich find das Tool einfach toll und es wäre schade, wenn es nicht weiter entwickelt würde (egal von wem, wenn Daniel nicht weiter macht.. :( ...)

Gruss,

Warp

Jens01 16. Okt 2009 18:53

Re: ProjectLocalizer, MessageDlg Problem in Delphi2009
 
eine pragmatische Lösung :
z.B.:
Label.Caption := StrSonstwas + ' '; {also einfach ein Leerzeichen o.ä. anhängen}

dann gehts!

Warp 21. Okt 2009 12:12

Re: ProjectLocalizer, MessageDlg Problem in Delphi2009
 
@Jens01
Danke für den Tip.

Leider funktioniert das nicht für die Dialoge der VCL, da die Texte der Buttons/Captions ja nicht explizit in der Appplikation zugewiesen, sondern durch die in WinLoc integrierten Übersetzungsmechanismen automatisch zur Laufzeit angepasst werden.
Hier müsste man dann ggf. in den Code von dwsLocalizer aus WinLoc eingreifen, um dort automatisch noch Leerzeichen anzuhängen (was aber dann nur für die Dialog-Klassen greifen dürfte/müsste).

Gruss,

Warp

Luckie 21. Okt 2009 12:17

Re: ProjectLocalizer, MessageDlg Problem in Delphi2009
 
Ist Delphi2009 eigentlich schon vollständig Unicode fähig? Weil bisher war die VCL nicht Unicode fähig und konnte somit keine Unicode Zeichen darstellen. Man musste dann immer auf Fremdkomponenten zurückgreifen.

Jens01 21. Okt 2009 12:50

Re: ProjectLocalizer, MessageDlg Problem in Delphi2009
 
Hallo Warp,
in Delphi bin ich so tief noch nicht drin, da ich erst wieder ein halbes Jahr damit programmiere.
Ich habe mir aber dwsLocalizer an paar Stellen etwas manipuliert. z.B habe ich ein Label, was groß einen Zustand des Projektes anzeigt. Die Anzeige ist eine Zahl! Wenn du die Sprache umstellst, wird dies Label einfach mit der Standardeinstellung vom Localizer überschrieben. Ich habe dann in der Procedure "TranslateComponent" wie folgt manipuliert :

if not (CompValue = '#~*') then DoTranslateComponent(ComponentToTranslate, CompName, CompValue);

Wenn jetzt im Localizer #~* als Übersetzung eingetragen wird, dann überspringt er die Eintragung einfach. Vielleicht könnte man es mit deinem Problem ähnlich machen.
Ich glaube, das sind keine direkten Lösungen für dich, aber vielleicht hilft dir meine gesammelte "Erfahrung" weiter.
Gruss Jens

Roaster 21. Okt 2009 12:52

Re: ProjectLocalizer, MessageDlg Problem in Delphi2009
 
Zitat:

Zitat von Luckie
Ist Delphi2009 eigentlich schon vollständig Unicode fähig?

Die Frage war doch jetzt nicht ernst gemeint, oder? :wink:

Luckie 21. Okt 2009 12:56

Re: ProjectLocalizer, MessageDlg Problem in Delphi2009
 
Doch. Ich arbeite noch mit dem BDS 2006 und bin mir nicht sicher, wann die Unicode Unterstützung dazu gekommen ist.

RWarnecke 21. Okt 2009 13:05

Re: ProjectLocalizer, MessageDlg Problem in Delphi2009
 
Delphi 2009 hat volle Unicode-Unterstützung. Die Komponenten können ebenfalls die entsprechenden Zeichen darstellen. Hatte damals Daniel in seinem Video hervorragend vorgeführt.

himitsu 21. Okt 2009 13:47

Re: ProjectLocalizer, MessageDlg Problem in Delphi2009
 
jupp, seit D2009 ist da soooo viel Unicode drinnen, daß es an manschen Stellen schonwieder zuviel ist :lol:

Warp 21. Okt 2009 19:19

Re: ProjectLocalizer, MessageDlg Problem in Delphi2009
 
Habe mich heute nochmal ein bischen mit der dwsLocalizer Unit beschäftigt, um der Ursache etwas näher zu kommen und habe eine "Lösung" (wenn man es denn so nennen kann...) für das Übersetzen der Dialoge gefunden.

In der dwsLocalizer wird in procedure TdwsLocalizerInt.RegisterNew_LoadResString das Laden der System-Resourcen Strings (System.LoadResString) auf eine dwsLocalizer interne Funktion NewLoadResString umgebogen. Hierüber werden wohl alle nicht direkt Komponenten bezogene Strings laufen, die nicht über die Übersetzungsprozedur TranslateComponent abgewickelt werden.

Die neue Prozedur NewLoadResString hat als Ergebnistyp AnsiString. Wenn diese nun auf Typ String abgeändert wird (String in D2009 = Unicode), funktioniert die Übersetzung der Dialoge (Caption, Message-Text, Button-Captions), soweit ich es jetzt getestet habe, fehlerfrei.


Delphi-Quellcode:
// replaces the System.LoadResString method during run-time
// this function will access the loaded resource file for translated resource strings
// if no translation is found, it will check the resources of the running application
function NewLoadResString(ResStringRec: PResStringRec): String; //20091021-HH, vorher :AnsiString
const
  MAX_ID = 65536;
var
  Buffer: array [0..4096] of Char;
  ResHdl, GlobalHdl, Size, LibHdl: Cardinal;
  ResItem: PWideChar;
  Res: WideString;
begin
Ob mit dieser Änderung noch irgendwelche verborgenen Nebenwirkungen verbunden sind, weiss ich (noch) nicht. Bis jetzt sieht es jedoch zumindestens in der Programmoberfläche nicht danach aus.

Gruss,

Warp

zeras 31. Jul 2016 19:45

AW: ProjectLocalizer, MessageDlg Problem in Delphi2009
 
Liste der Anhänge anzeigen (Anzahl: 1)
Nutzt jemand noch die Funktionen?
Ich habe mein Programm nun von D2009 auf Seattle migriert.
Was ich bis jetzt festgestellt habe, ist, das Message Dialoge nicht korrekt angezeigt werden. Es kommt immer ein "L" voran, siehe Anhang.
Unter D2009 funktionierte das problemlos.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:38 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz