MessageRequester von Deutsch auf Englisch umschalten?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Tracker
Beiträge: 53
Registriert: 22.11.2005 21:46
Computerausstattung: Intel Core 2 Quad Q6600, 2,4 GHZ, 2 GB RAM, NVidia GeForce 8600 GT 512 MB, Windows XP Prof. SP3, PureBasic v4.51

Beitrag von Tracker »

@ts-soft
Ich habe bei meinem Windows XP Prof. SP2 unter "Regions- und Spracheinstellungen" jetzt alle drei Karteikarten und auch die Tastatur auf Englisch (USA) bzw. Vereinigte Staaten von Amerika umgestellt und einen geforderten Neustart durchgeführt.

Den MessageRequester lässt das kalt.
Er zeigt immer noch Ja, Nein, Abbrechen statt Yes,No, Cancel an.
Auch dein Resource-Beispiel Test.exe gibt nach wie vor OK und Abbrechen statt OK und Cancel aus.

Ich habe jetzt alles wieder auf Deutsch(Deutschland) zurückgestellt.
Für heute geb ich's auf. :(

Es macht für mich wenig Sinn Resource-Dateien einzusetzen, wenn ich nicht testen kann, ob sie funktionieren.

Trotzdem, danke für deine Tipps! :)
Ein fehlerfreies Programm ist der Traum jedes Programmierers
hiltwin
Beiträge: 311
Registriert: 06.10.2005 11:08
Wohnort: D-31177 Harsum
Kontaktdaten:

bitte schön ...

Beitrag von hiltwin »

Tracker hat geschrieben: @hiltwin
Bei der englischen Fassung habe ich natürlich beim MessageRequester immer noch die deutschen Buttons.
Kannst du hier mal ein Beispiel deiner MessageRequester-Version posten?
Man muss ja nicht jedesmal das Rad neu erfinden.

Code: Alles auswählen

;- Window Constants
;
Enumeration
  #Window_ync ; Fenster 17
EndEnumeration
;- Gadget Constants
;
Enumeration
  #LogoGadget1 ; Button 104
  #LogoText ; Button 105
  #ButtonYes ; Button 107
  #ButtonNo ; Button 108
  #ButtonCancel ; Button 109
EndEnumeration
Das obige vorweg ...

Das folgende stellt das Fenster zur Verfügung. Dabei ist der derzeit gültige Aufruf so gestaltet, dass das Fenster als Child von Window_0 agiert und man in der Task-Leiste quasi nur ein Programmfenster angezeigt bekommt, obwohl beim Programm ja zwei Fenster offen sind.

Das ganze ist in einer Gosub-Routine gepackt, weil ich die den Prozeduren bevorzuge - das müsste wenn nochmal jemand, der Prozeduren liebt, umschreiben ;o)

Code: Alles auswählen

myyesnocancel: 

; If OpenWindow(#Window_ync, 450, 200, 400, 100,  #PB_Window_SystemMenu | #PB_Window_TitleBar , abc$)
  If OpenWindow(#Window_ync, 450, 200, 400, 100,  #PB_Window_SystemMenu | #PB_Window_TitleBar , abc$, WindowID(#Window_0))
    SetWindowPos_(WindowID(),#HWND_TOPMOST,0,0,0,0,#SWP_SHOWWINDOW|#SWP_NOMOVE|#SWP_NOSIZE) 
    If CreateGadgetList(WindowID())
        bildid = CatchImage(2, ?bildadr)
        ResizeImage(2,96,96)
        ImageGadget(#LogoGadget1, 1, 1, 99, 99, 0)
        SetGadgetState(#LogoGadget1, UseImage(2))  ; change the picture in the gadget
        TextGadget(#LogoText, 145, 10, 200, 70, abd$)
        ButtonGadget(#ButtonYes, 115, 70, 70, 20, Language$(241))
        ButtonGadget(#ButtonNo, 200, 70, 70, 20, Language$(242))
        ButtonGadget(#ButtonCancel, 285, 70, 70, 20, Language$(243))
  Gosub myyesnocancelrepeat
  EndIf
  EndIf
  CloseWindow(#Window_ync)
  Return 
aufgerufen wird aus einer beliebigen Programmstelle wie folgt

Code: Alles auswählen

abc$="Hier steht der Fenstertitel, wie ich ihn gerne haben möchte!"
abd$="Hier steht der Anzeigetext, wie ich ihn definiere"
gosub myyesnocancel
Dabei habe ich abc$ und abd$ zum Verständnis obig nicht durch eine sprachabhängige Variable definiert, sondern mit Beispieltext.
Was Du in die beiden Variablen setzt, dass musst Du entscheiden.

Bei mir ist halt Language$(241) in Deutsch "ja" und in Englisch "Yes" etc ... Und je nach Sprachpräferenz werden meine Language$(xyz) mit den dazugehörigen Daten aus einer Data Reihe gelesen ...

Und schlussendlich noch:

Code: Alles auswählen

 myyesnocancelrepeat:
 
 Repeat  
  Event = WaitWindowEvent()  
  WindowID = EventWindowID()  
  If WindowID=#Window_ync And event= #PB_Event_CloseWindow 
  Ergebnis=7
  quit=1
  EndIf 

  GadgetID = EventGadgetID() ; Is it a gadget event? 
  EventType = EventType() ; The event type 
  If Event = #PB_EventGadget 
  If GadgetID = #ButtonYes
  Ergebnis=1
  quit=1
  EndIf
  If GadgetID = #ButtonNo
  Ergebnis=2
  quit=1
  EndIf
  If GadgetID = #ButtonCancel
  Ergebnis=7
  quit=1
  EndIf
  EndIf
  Until quit=1 
  quit=0
  Return
Diese Abfrage habe ich "ausgelagert", da ich auch eine "yes/no" Abfrage habe und die Zeilen ansonsten doppelt wären - beide greifen per gosub auf diese zurück ...

Und an der Stelle, wo Du die Gosub aufgerufen hast, musst Du danach dann entsprechend die Befehle setzen

If Ergebnis=1 ; ja
dann mache dies ...
elseif Ergebnis=2 ; nein

etc ...

Viel Erfolg!

P.S.: Mit www.tracker.de hast Du aber nichts zu schaffen, oder?
Benutzeravatar
Tracker
Beiträge: 53
Registriert: 22.11.2005 21:46
Computerausstattung: Intel Core 2 Quad Q6600, 2,4 GHZ, 2 GB RAM, NVidia GeForce 8600 GT 512 MB, Windows XP Prof. SP3, PureBasic v4.51

Beitrag von Tracker »

@hiltwin
Nein, mit der deutschen Tracker-Homepage habe ich nichts zu tun.
Ich wußte gar nicht, dass es die gibt.
Den Alias-Namen Tracker habe ich mir ausgesucht, weil ich in Sachen Spiele-Programmierung am Cyberpunk-Genre interessiert bin (Oni, Ghost in the Shell).
Cyber Tracker ist ein Film, den ich irgendwann einmal vor über 10 Jahren gesehen habe.
Weil mir der Name gefallen hat und Cybertracker mir zu lang war habe ich Tracker als Avatar gewählt.
Bei manchen Homepages bin ich auch unter Tracker60 registriert.

Danke für dein Script!
Ich habe es mir zu einer Datei zusammenkopiert und versucht es zu starten.
Wie du schon sagst braucht es ein Window_0.
Ich weiß nicht, ob ich den Ansatz weiterverfolge und einen eigenen MessageRequester einbaue.
Ich verwende an zwei Stellen auch einen FileRequester.
Selbst wenn ich überall den MessageRequester ersetze, habe ich beim FileRequester dann immer noch die falschen Buttons.
Das würde alles nur noch verschlimmbessern.
Mein Programm ist fast fertig.
Ich muss es nur noch testen und eine deutsche und eine englische CHM-Hilfedatei erstellen.

@all
Der Einsatz von mehrsprachigen Resource-Scripts wäre vermutlich schon die richtig Wahl.
Wenn ich als Default-Sprache bei den Resource-Scripts Englisch einstelle, sollen laut ts-soft englische Buttons angezeigt werden, wenn ich außer Deutsch keine weiteren Resourcedatei in anderen Sprachen mitliefere.
Ein Deutscher müßte also alles in Deutsch und Anwender in anderen Ländern alles in Englisch sehen.

Hat irgendjemand im Forum schon einmal ein Programm erstellt, das verschiedene Sprachen mit Resource-Scripts einbindet und kann mir einen Tip geben, wie ich meinen PC anpassen muss, damit ich testen kann, ob auch die richtige Sprache mit den richtigen Buttons erscheint?

Heute teste ich mein Programm unter verschiedenen Betriebssystemen Windows 98/ME/2000/XP).
Ich installiere mir gerade einen PC unter Windows98 mit der Sprache französisch, aber deutschem Tastatur-Layout.
Trotz französischen Standort und Gebietsschema läuft das Setup munter in deutsch weiter.
Ich bin mal gespannt welche Sprache erscheint, wenn die Installation beendet ist (vermutlich doch wieder Deutsch).

Kennt niemand einen Registry-Eintrag, den ich zum Testen entsprechend umstellen kann?
Ein fehlerfreies Programm ist der Traum jedes Programmierers
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Ändere doch einfach mal die deutsche Sprache in z.B. franz., dann solltest Du
englisch sehen :wink:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Tracker
Beiträge: 53
Registriert: 22.11.2005 21:46
Computerausstattung: Intel Core 2 Quad Q6600, 2,4 GHZ, 2 GB RAM, NVidia GeForce 8600 GT 512 MB, Windows XP Prof. SP3, PureBasic v4.51

Beitrag von Tracker »

@ts-soft
Ich habe es mittlerweile aufgegeben.

Der Windows98-PC, den ich heute mit Standort Frankreich installiert habe, hatte natürlich auch wieder eine deutsche Oberfläche und der MessageRequester deutsche Buttons.
Bei dem Resource-Testbeispiel war es genauso (nichts mit Englisch oder Französisch).

Intessanterweise erkannte die Matrox-Treiber-CD bei der Installation der Grafikkarte die Sprache Französisch und auch die Setup-Oberfläche samt Buttons erschien in Französisch.
Die wissen anscheinend wie man das macht.

Auf meinem WindowsXP-PC habe ich mittlerweise auch alles mögliche ausprobiert, um die Sprache zu ändern. Ohne Erfolg.

Hast du bei deinem PC einmal ausprobiert, die französische Sprache einzustellen?
In welcher Sprache erscheinen die Buttons bei deinem Resource-Beispiel?
In Englisch oder in Deutsch?

Ich habe nochmal dein Resource-Script-Beispiel ausprobiert und um zwei Einträge Yes/Ja und No/Nein erweitert.

Die angepassten Dateien sehen jetzt so aus:

StringTable.rc

Code: Alles auswählen

#include "StringTable.h"

STRINGTABLE
LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT
BEGIN
  btnOk,          "Ok"
  btnCancel,      "Cancel"
  btnYes,         "Yes"
  btnNo,          "No" 
END
STRINGTABLE
LANGUAGE LANG_GERMAN, SUBLANG_DEFAULT
BEGIN
  btnOk,          "Ok"
  btnCancel,      "Abbrechen"
  btnYes,         "Ja"
  btnNo,          "Nein"
END
StringTable.h

Code: Alles auswählen

#include "lang.h"

#define btnOk         0
#define btnCancel     1
#define btnYes        2
#define btnNo         3
Lang.h

Code: Alles auswählen

#define LANG_NEUTRAL	0x00

#define LANG_ARABIC 	0x01
#define LANG_BULGARIAN 	0x02
#define LANG_CATALAN 	0x03
#define LANG_CHINESE	0x04
#define LANG_CZECH	                0x05
#define LANG_DANISH	0x06
#define LANG_GERMAN	0x07
#define LANG_GREEK                 0x08
#define LANG_ENGLISH	0x09
#define LANG_SPANISH	0x0a
#define LANG_FINNISH	0x0b
#define LANG_FRENCH	0x0c
#define LANG_HEBREW	0x0d
usw...
Test.pb

Code: Alles auswählen

Procedure.s Language(uID.l)
  Protected Result.s
  #MaxBuffer = 255
  Result.s = Space(#MaxBuffer)
  If LoadString_(GetModuleHandle_(#Null), uID, @Result, #MaxBuffer)
    ProcedureReturn Result
  EndIf
  ProcedureReturn ""
EndProcedure

Enumeration
  #btnOk
  #btnCancel
  #btnYes
  #btnNo
EndEnumeration

If OpenWindow(0, 0, 0, 75, 135, #PB_Window_ScreenCentered|#PB_Window_SystemMenu, "")
  If CreateGadgetList(WindowID(0))
    ButtonGadget(#btnOk, 10, 10, 95, 25, Language(#btnOk))
    ButtonGadget(#btnCancel, 10, 40, 95, 25, Language(#btnCancel))
    ButtonGadget(#btnYes, 10, 70, 95, 25, Language(#btnYes)) 
    ButtonGadget(#btnNo, 10, 100, 95, 25, Language(#btnNo)) 
    MessageRequester("","In welcher Sprache erscheinen die Buttons?",#PB_MessageRequester_YesNoCancel)
  EndIf
  Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
Die Funktion Language() liefert den Text der selbst definierten Buttons aus der Resource-Datei in der jeweiligen Sprache.

Bei den selbst definierten Buttons wird OK, Abbrechen, Ja, Nein angezeigt.
Die hinzugefügte MessageRequester-Funktion hat die Buttons Ja, Nein, Abbrechen.

Egal, welche Sprache ich in der Systemsteuerung einstelle, alle Werte bleiben in Deutsch!

In der Lang.c ist sind z.B. Deutsch und Französisch so definiert:
#define LANG_GERMAN 0x07
#define LANG_FRENCH 0x0c

Es ist zwar der falsche Weg, aber wenn ich habe die Werte für Deutsch und Französisch einmal wie folgt vertauscht:
#define LANG_GERMAN 0x0c
#define LANG_FRENCH 0x07

Jetzt zeigen die selbst definierten Buttons die englischen Resource-Einträge OK, Cancel, Yes, No an.
Der MessageRequester hat natürlich noch die deutschen Buttons Ja, Nein, Abbrechen.

Ich könnte jetzt meine ganzen deutschen und englischen Texte in die StringTable.rc aufnehmen und entsprechende Konstanten in der StringTable.h und Test.pb definieren.
Die einzige Chance, die ich im Augenblick sehe, um wenigstens diese Texte in Englisch zu testen, ist die Datei Lang.h zu manipulieren.

Damit ist aber noch lange nicht geklärt, wie die englische Oberfläche PureBasic-Requester (MessageRequester, FileRequester,...) aussieht.

Wie soll ich Hardcopies für eine englische Dokumentation erstellen, wenn ich selbst keine Chance habe die englische Oberfläche des eigenen Programms zu sehen.

Wie machen das denn andere Softwareentwickler, die mehrsprachige Programme erstellen?

Es muss doch rauszufinden sein, aus welchem Registry-Wert oder welcher DLL Windows bzw. PureBasic die eingestellte Sprache ermittelt, damit ich die testweise umstellen kann.

Es ist sicher ein gutes Verfahren mehrsprachige Resouce-Scripts zu verwenden, man müsste nur in der Lage sein die Oberfläche seiner eigenen Programme in jeder Sprache zu sehen, um die Optik testen zu können.

Aber egal, ich bin ja nur Hobbyprogrammierer.
Dann müssen Anwender außerhalb von Deutschland eben mit dem Sprachmischmasch meiner Programme zurechtkommen.
Ein fehlerfreies Programm ist der Traum jedes Programmierers
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Du betreibst ja einen unnötigen Aufwand :lol:
ändere einfach die StringTable.rc so
#include "StringTable.h"

STRINGTABLE
LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT
BEGIN
btnOk, "Ok"
btnCancel, "Cancel"
btnYes, "Yes"
btnNo, "No"
End
STRINGTABLE
LANGUAGE LANG_FRENCH, SUBLANG_DEFAULT
BEGIN
btnOk, "Ok"
btnCancel, "Abbrechen"
btnYes, "Ja"
btnNo, "Nein"
End
Wenn jetzt die Buttons in English sind, weil kein Französisch bei Dir
eingestellt ist, weißte das es funzt!
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Tracker
Beiträge: 53
Registriert: 22.11.2005 21:46
Computerausstattung: Intel Core 2 Quad Q6600, 2,4 GHZ, 2 GB RAM, NVidia GeForce 8600 GT 512 MB, Windows XP Prof. SP3, PureBasic v4.51

Beitrag von Tracker »

@ts-soft
So geht es natürlich auch.

Ich habe die StringTable.rc auch nochmal um eine französische Version erweitert:

Code: Alles auswählen

STRINGTABLE
LANGUAGE LANG_FRENCH, SUBLANG_DEFAULT
BEGIN
  btnOk,          "Ok"
  btnCancel,      "Annuler"
  btnYes,         "Oui"
  btnNo,          "Non"
END

Die Leerzeile am Ende ist zwingend erforderlich, sonst bekommt man eine Fehlermeldung.

Man kann jetzt jede Sprache testen, die in der Resource-Datei StringTable.rc vorkommt, indem man in der Lang.c die Zahl der gewünschten Sprache mit der Zahl der deuschen Sprache vertauscht.

Wenn man in der Lang.c statt:

Code: Alles auswählen

#define LANG_GERMAN	0x07
#define LANG_FRENCH	0x0c
jetzt

Code: Alles auswählen

#define LANG_GERMAN	0x0c
#define LANG_FRENCH	0x07
schreibt, bekommt man die französischen Resource-Texte angezeigt.

Mein Problem mit dem Message-Requester löst das aber trotzdem nicht.
Diese Buttons sind nach wie vor in Deutsch.

Eine saubere Dokumentation mit englischen Hardcopies bekommt man so natürlich (trotz Resource-Dateien) mit einem deutschen System nicht hin.
Da fehlt mir immer noch die Info, wie ich meinem PC vorgaukeln kann ein englisches Betriebssystem zu haben.

Aber egal, ich habe die deutsch/englische Version fertig und werde keine Klimmzüge mehr unternehmen, weil Texte in Englisch und die Buttons der PureBasic-Requester in der jeweiligen Landessprache erscheinen.

Danke für deine Hilfe!
In Sachen Resource-Dateien habe ich jetzt jedenfalls etwas dazugelernt. :)
Ein fehlerfreies Programm ist der Traum jedes Programmierers
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Warum, das mit den MessageRequestern hat sich doch auch erledigt.
Da das Script die Ländereinstellung des Users verwendet und die
Windows-Dialoge genauso verfahren, stimmt doch alles :wink:
bis auf bei nicht vorhanden Sprachen
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Tracker
Beiträge: 53
Registriert: 22.11.2005 21:46
Computerausstattung: Intel Core 2 Quad Q6600, 2,4 GHZ, 2 GB RAM, NVidia GeForce 8600 GT 512 MB, Windows XP Prof. SP3, PureBasic v4.51

Beitrag von Tracker »

Das mit den MessageRequester-Buttons hat sich für mich noch nicht erledigt.
Ich habe heute vergeblich die Registry durchforstet und mir DLL's im Windows-Verzeichnis mit UltraEdit angesehen.
Bisher habe ich noch keinen entsprechenden Eintrag gefunden.
Ich kann nur darauf vertrauen, dass die PureBasic-Requester die Buttons richtig darstellt.
Kontrollieren kann ich es nicht.

Solange ich meinem deutschen Betriebssystem nicht beibringen kann, mir die Buttons in englischer Sprache anzuzeigen, kann ich für ein englisches Handbuch auch keine einheitlich englischen Hardcopies erstellen.
Aber mein Programm ist ziemlich klein und selbsterklärend, so dass das auch nicht erforderlich ist.
Irgendwann werde ich schon noch dahinterkommen.
Ein fehlerfreies Programm ist der Traum jedes Programmierers
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag von MVXA »

Wenn du immer noch keine Lösung gefunden haben solltest, ich habe was
interessantes in der MSDN gefunden. Bin da eher durch Zufall drüber
gestolpert:
http://msdn.microsoft.com/library/defau ... direct.asp

Code: Alles auswählen

typedef struct {
    UINT cbSize;
    HWND hwndOwner;
    HINSTANCE hInstance;
    LPCTSTR lpszText;
    LPCTSTR lpszCaption;
    DWORD dwStyle;
    LPCTSTR lpszIcon;
    DWORD_PTR dwContextHelpId;
    MSGBOXCALLBACK lpfnMsgBoxCallback;
    DWORD dwLanguageId;
} MSGBOXPARAMS, *PMSGBOXPARAMS;
Bild
Antworten