Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi TBitBtn.Kind und Sprache (https://www.delphipraxis.net/177020-tbitbtn-kind-und-sprache.html)

Der schöne Günther 10. Okt 2013 15:42

TBitBtn.Kind und Sprache
 
Ich kann mich gleich im Voraus entschuldigen, die Frage muss doch mit Sicherheit schon hundert mal aufgetaucht sein. Irgendwie finde ich trotzdem nichts...


Ändere ich in Windows die Eingabesprache und Region, ändert sich natürlich einiges mit. Delphi-Routinen formatieren Zahlen, Zeiten und Datum entsprechend. Auch das TTouchKeyboard zieht mit.

Bis hierhin alles bestens. Nur der
Delphi-Quellcode:
TBitBtn
zeigt sich hiervon unbeindruckt. Die Beschriftungen sind immer noch "Abbrechen" oder "Schließen". Was muss ich tun - Wo holt der diese Texte her? Würde ein Windows Language Pack (ab Windows Ultimate) hier Abhilfe schaffen oder werden die Texte beim Kompilieren fest eingebrannt?

Union 10. Okt 2013 16:08

AW: TBitBtn.Kind und Sprache
 
Die sind als resourcestrings in consts.pas enthalten und abhängig von der Sprache in der Du Delphi installiert hast.

Der schöne Günther 10. Okt 2013 16:11

AW: TBitBtn.Kind und Sprache
 
Bitter, also vollkommen unbrauchbar.

Da es immer nur typische Windows-Standardwörter wie "Abbrechen" oder "Nein" waren, hatte ich Hoffnung, dass das irgendwie von Windows übernommen wird oder Delphi irgendwo eine Nachschau-Tabelle für die gängisten Sprachen hat...

jaenicke 10. Okt 2013 16:17

AW: TBitBtn.Kind und Sprache
 
Wir benutzen an der Stelle JvGnuGetText aus den JEDIs, mit denen kann man alles komfortabel übersetzen, auch diese Texte soweit ich weiß.

Union 10. Okt 2013 16:18

AW: TBitBtn.Kind und Sprache
 
Ich mache das so:
Delphi-Quellcode:
var
   StringPointerList : array of Pointer;

{$WARNINGS OFF}
procedure CleanStringPointerList;
var
   i : integer;
begin
   for i := Low(StringPointerList) to High(StringPointerList) do
   begin
      // Uiii... prüfen auf memoryleak in > 2009
      StrDispose(PAnsiChar(StringPointerList[i]));
   end;
   SetLength(StringPointerList, 0);
end;

procedure HookResourceString(ResStringRec: pResStringRec; NewStr: PChar);
var
  OldProtect: DWORD;
begin
  VirtualProtect(ResStringRec, SizeOf(ResStringRec^), PAGE_EXECUTE_READWRITE, @OldProtect);
  ResStringRec^.Identifier := Integer(NewStr);
  VirtualProtect(ResStringRec, SizeOf(ResStringRec^), OldProtect, @OldProtect);
end;

procedure SetSysResStr(AConstant : Pointer; const AConstantName : string);
var
   p : PChar;
begin
   // Das ggf. an die benutzte Delphi-Version anpassen
   {$IFDEF VER250}
   p := StrNew(PWideChar(LocalizerOnFly.GetTraslatedRS(AConstantName)));
   {$ELSE}
   p := StrNew(PChar(WideStringToString(LocalizerOnFly.GetTraslatedRS(AConstantName),0)));
   {$ENDIF}
   SetLength(StringPointerList, High(StringPointerList)+2);
   StringPointerList[High(StringPointerList)] := p;
   HookResourceString(AConstant, p);
end;

finalization
   CleanStringPointerList;
Und Aufruf dann
Delphi-Quellcode:
SetSysResStr(@SMsgDlgError, 'SMsgDlgError');
Wenn Du etwas anderes als Localizer einsetzt, kannst Du das LocalizerOnFly.GetTraslatedRS(AConstantName) entsprechend abändern und z.b. den Text als Konstante reingeben

jaenicke 11. Okt 2013 05:59

AW: TBitBtn.Kind und Sprache
 
Ja, das sieht so ähnlich aus wie das was die JvGnuGetText macht.

Furtbichler 11. Okt 2013 08:46

AW: TBitBtn.Kind und Sprache
 
Wir haben die Standarddialoge durch eigene ersetzt, da wir DevExpress einsetzen. Die Standarddialoge passen da einfach nicht. Die Signatur der einzelnen Prozeduren bzw. Funktionen (Messagebox etc.) ist identisch, also muss die Unit nur in die Uses Liste.

Die Lösung mit dem JvGnuGetText von Sebastian ist aber vorzuziehen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:41 Uhr.

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