Application.MessageBox übersetzen

Rund um die LCL und andere Komponenten
Antworten
Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2805
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Application.MessageBox übersetzen

Beitrag von m.fuchs »

Hallo, ich habe ein kleines Problem mit der MessageBox Methode. Mein Aufruf sieht so aus:

Code: Alles auswählen

Application.MessageBox('Sicher?', 'Löchsen', MB_YESNO + MB_ICONQUESTION)
Soweit so gut, die Box wird auch angezeigt, nur sind die Beschriftungen der beiden Buttons 'Yes' und 'No'. Ich habe jetzt aber (auch gestützt auf die WinAPI) 'Ja' und 'Nein' erwartet.
Denn eigentlichen sollten diese Dialogfelder in der Sprache der Windows-Installation angezeigt werden

Vermutlich ist das aber der Plattformunabhängikeit geschuldet, da dadurch wohl nicht die WinAPI genutzt wird. Aber: wie kann man trotzdem die Sprache der Beschriftung ändern?
Das muss in diesem Fall nicht automatisiert auf Betriebssystemsprache sein, die Software wird sowieso nur auf Deutsch angeboten.

Wenn es da keine einfache Lösung gibt, kann ich mir natürlich auch selber ein Dialogfeld bauen, aber wenn es geht spare ich mir gerne die Arbeit.


THx
Michael
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Teekeks
Beiträge: 359
Registriert: Mi 27. Mai 2009, 20:54
OS, Lazarus, FPC: OpenSuse11.4 x86 (Lazarus: 0.9.30 FPC 2.4.2)
CPU-Target: x86
Wohnort: Cottbus

Re: Application.MessageBox übersetzen

Beitrag von Teekeks »

Schreibe dir doch eine eigene Messagebox die das unterstützt.
So würde ich das machen zumindest.

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: Application.MessageBox übersetzen

Beitrag von MAC »

Ich habe mal eine eigene messagebox programmiert.
Das geht relativ einfach:
Du erstellst nen eigenes Formular und dort wird dann eine procedure aufgerufen. In dieser steht dann sowas

Code: Alles auswählen

Warten_auf_antwort := True;
while Warten_auf_antwort do
begin
sleep(10);
Application.Processmanages;
end;
Result := EinCode;
Und wenn man ein Button betätigt wird wird

Code: Alles auswählen

Warten_auf_antwort := False;
einCode := 1; // oder 2 oder 3 oder...
Vlt werd ich meine mal überarbeiten (denn sie ist schlicht weg veraltet, schlecht, nicht OPP) und uploaden...

Code: Alles auswählen

Signatur := nil;

DiBo33
Beiträge: 334
Registriert: Do 11. Okt 2007, 18:01

Re: Application.MessageBox übersetzen

Beitrag von DiBo33 »

Es gibt hier ein Thread über die Anpassung der Sprache in den Applikationen, ansonsten (da ich meine Programme auch nur in Deutsch verfasse) habe ich ein kleines Programm geschrieben.

http://www.lazarusforum.de/viewtopic.php?f=11&t=2714" onclick="window.open(this.href);return false;

Benutzeravatar
theo
Beiträge: 10860
Registriert: Mo 11. Sep 2006, 19:01

Re: Application.MessageBox übersetzen

Beitrag von theo »

http://wiki.lazarus.freepascal.org/Tran ... _Programms" onclick="window.open(this.href);return false;

shokwave
Beiträge: 475
Registriert: Do 15. Nov 2007, 16:58
OS, Lazarus, FPC: Win11/Ubuntu Budgie (L 3.0 FPC 3.2.2)
CPU-Target: i386, x64
Wohnort: Gera

Re: Application.MessageBox übersetzen

Beitrag von shokwave »

Mein Tipp wäre, die Datei "..\Lazarus\lcl\languages\lclstrconsts.de.po" nach "..\Projektordner\languages\lclstrconsts.de.po" zu kopieren. Du muss dann aber auch den Ordner languages mit deinem Programm zusammen weitergeben.
mfg Ingo

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2805
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Application.MessageBox übersetzen

Beitrag von m.fuchs »

Da mit .po-Dateien herumzuspielen war mir zu aufwändig, aber durch die Diskussion habe ich erst einmal gemerkt dass die Strings dafür als resourcestring deklariert sind.
Und schwupps hab ich einen kleinen Hack für Delphi gefunden und minimal angepasst, der das Problem löst.

Code: Alles auswählen

procedure HookResourceString(rs: PResStringRec; newStr: PChar);
var
  oldprotect: DWORD;
begin
  VirtualProtect(rs, SizeOf(rs^), PAGE_EXECUTE_READWRITE, @oldProtect);
  rs^ := newStr;
  VirtualProtect(rs, SizeOf(rs^), oldProtect, @oldProtect);
end;
Dann genügen die Aufrufe:

Code: Alles auswählen

HookResourceString(@rsMbYes, 'Ja');
HookResourceString(@rsMbNo, 'Nein');
Und schon sind die beiden Schaltflächen auf deutsch beschriftet. Ist zwar wirklich ein Hack, aber funktioniert.

Micha
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

noenglish
Beiträge: 36
Registriert: Di 4. Mai 2010, 09:14
OS, Lazarus, FPC: Win10 64Bit, L: 1.8.4 FPC 3.0.4

Re: Application.MessageBox übersetzen

Beitrag von noenglish »

Warum verwendest Du nicht den QuestionDLG (Unit: Dialogs)?

zum Beispiel

Code: Alles auswählen

QuestionDLG('Titel: QuestionDLG', 'Meldung', mtConfirmation, [mrYes, 'zurück'], 0);
Hier wird Yes durch 'zurück' ersetzt.
MfG
noenglish

Antworten