Multilanguage



  • Hallo zusammen,

    ich hab eine Oberfläche, die über unterschiedliche Resourcen-DLLs verschiedene Sprachen unterstützt. Jetzt sind in meinem Programm aber auch Message-Boxen und PropertySheets. Wenn mein Betriebssystem auf deutsch eingestellt ist ich aber mein Programm z.B. auf English einstelle möchte ich auch die Buttons der MessageBoxen usw auf Englisch haben. Muss ich mir jetzt für die Fenster immer die Elemente suchen und dann den Text ändern, oder hab ich noch ne andere Möglichkeit?

    Danke



  • Willst du das man im Programm wählen kann oder das man eine englische Version hat (eigenständig kompeliertes Programm) und eine deutsche?

    Im Fall mit dem Wählen bringen dich Ressourcen und string Tabels (IMHO) nicht weiter. Du musst dann vor jeder MessageBox ne if Abfrage machen ob die Ausgabe Englisch oder Deutsch sein soll.



  • Es ist schon zum Wählen.
    Wie kann ich das denn mit ner if Abfrage machen. Ich muss doch dann dem System irgendwie bekannt geben, dass meine Applikation English ist. Genau sowas suche ich.



  • //irgendwas.h
    string[2] MsgText_01;
    MsgText_01[0] = "This is an english message.";
    MsgText_01[1] = "Das ist eine deutsche Nachricht.";
    //..weitere Texte..
    
    int lg; // 0:english; 1:deutsch
            // "lg" wird am irgendwo definiert, z.B. unter WM_CREATE aus einer EinstellungsDatei ausgelesen
    
    //irgendwas.cpp
    MessageBox(hwnd,MsgText_01[lg].c_str(),"MsgTitle",MB_OK|MB_ICONQUESTION);
    

    vermutlich wird das in der praxis anders gelöst, aber so ganz spontan hätte ich es so versucht..



  • Ich glaube es geht ihm eher um die Buttons als um den Text 😉
    "Ok", "Abbrechen", "Ja", "Nein" und sowas 😉

    Vielleicht hilft da SetThreadLocale() oder SetLocaleInfo()



  • Ja, es geht um die Buttons OK, ABBRECHEN usw. Meine eigenen Texte sind klar.
    Ich hab mal folgendes probiert:
    SetThreadLocale( MAKELCID( MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US) ,SORT_DEFAULT) );
    Kommt auch mit TRUE zurück, jedoch ändern tut sich nichts. Bei SetLocaleInfo hab ich mir in der MSDN mal die Typen angeschaut die gesetzt werden können, hab da jedoch nichts gesehen für die Sprache.
    Dann hab ich auch mal #pragma setlocale("english") probiert, auch ohne positives Ergebnis. Ist der SetThreadLocale Aufruf von mir überhaupt richtig?



  • Wie hast du denn Buttons erstellt bei dennen du den Text nicht selber festgelegt hast?



  • bei den messageboxen... 🙄



  • Hmm, dann fällt mir nur noch ein:
    MessageBox selber bauen 😉



  • Ne das ist möglich die auf Englisch zu übersetzen. Der Ansatz von Daminon müsste richtig sein. Ich habe eine Codesnipet von einem Freund, da wird das auch gemacht allerdings für ne Fehlermeldung.



  • Dann gib den Code Snippet.



  • <ironie>wow bist du freundlich</ironie>

    mich interessiert das au!!



  • void error()
    {
    	TCHAR szBuf[80];
    	LPVOID lpMsgBuf;
    	DWORD dw = GetLastError();
    	FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,NULL,dw,MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),(LPTSTR) &lpMsgBuf,0,NULL);
    	sprintf(szBuf,"Fehler %d: %s",dw,lpMsgBuf);
    	MessageBox(NULL, szBuf, "Error", MB_OK | MB_ICONERROR);
    }
    

    Ich weiß nicht ob euch das weiterhilft 😕



  • flammenvogel, ich glaub du hast das Problem nicht verstanden. Der Quelltext hat jedenfalls nicht mit dem Problem zu tun.



  • man sieht schon du bist ein ego...
    er hat geschrieben er weiß net ob dir das hilft.
    das ist SEIN schnipsel wie er ihn hat...



  • das hat er nacheditiert. :p



  • denk doch was du willst jedenfalls hab ich das gesehn als der post da war..



  • Irgendwas mit dem MAKRELANGID ist auch in dem Versuch von Daminon drin. Aber wie gesagt ich habe keine Ahnung ob das hilft. Die Funktion gibt jedenfalls den letzten WinApi Fehler mit einer deutschen Fehlerbeschreibnung aus. Sonst ist in der WinAPI doch immer alles auf Englisch.



  • 😡



  • Aber ich glaube ich weis jetzt warum der Aufruf von SetThreadLocale(MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT)); nicht funzt.

    Bei SetThreadLocal steht: (MSDN)

    Windows 2000/XP: Do not use SetThreadLocale to select a UI language. To select the proper resource that is defined with a LANGUAGE statement, use FindResourceEx.



  • Ich habe nochmal in der MSDN geguckt. MessageBoxIndirect kennt den Language Parameter, das gleiche gilt für MessageBoxEx() allerdings ist er dort als reserved angegeben. Ich versuche gerade MessageBoxIndirect zum laufen zu bringen, habs aber noch nicht geschafft. Allerdings müsste es laut MSDN gehen. 🙂


Anmelden zum Antworten