Multilanguage



  • 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. 🙂



  • Die Sprache muss aber auch auf dem System vorhanden sein und MultiLanguage Installationen sind relativ selten 😉
    Wenn es denn wirklich wichtig ist: warum machst Du nicht eine eigene MessageBox ???



  • Naja gut, der Tip mit der MessageBoxIndirect funktioniert in der Tat nur wenn die Language Englisch auch installiert ist. Aber immerhin könnten sich so die Leute in England die sowieso ein Englisches Windows haben, dein Programm auf Englisch geniesen.



  • Aber wäre bei denen nicht sowieso die Beschriftung englisch?! 🙄



  • Hi,

    also ihr habt alle irgendwie recht. Mit MessageBoxIndirect funzt es, wenn das Microsoft Multilanguage Pack installiert ist. Auf englischen Systemen sind auch die Buttons der MessageBox auf english. Bin jetzt dazu über gegangen, eine eigene MessageBox zu basteln. Das einzige was mehr Arbeit ist, sind die PropertySheets. Aber da belibt mir wohl nichts anderes.

    Trotzdem Danke.



  • So,
    ich habs gefunden.
    Ich habe das ganze jetzt über ein Hook gelöst.
    Für die, die das auch malk brauchen können, hier mein Code:

    LRESULT CALLBACK hMessageBoxHookProc(int nCode, WPARAM wParam, LPARAM lParam);
    #define ID_BUT_OK 0x1
    #define ID_BUT_CANCEL 0x2
    #define ID_BUT_ABORT 0x3
    #define ID_BUT_RETRY 0x4
    #define ID_BUT_IGNORE 0x5
    #define ID_BUT_YES 0x6
    #define ID_BUT_NO 0x7
    
    HHOOK SetMessageBoxHook()
    {
    	HHOOK hMessageBoxHook;
    	hMessageBoxHook = SetWindowsHookEx(WH_CBT,
    									   hMessageBoxHookProc,
    									   NULL,
    									   GetCurrentThreadId());
    	return hMessageBoxHook;
    }
    void vRealeaseMessageBoxHook(HHOOK hHook)
    {
    	UnhookWindowsHookEx(hHook);
    }
    
    LRESULT CALLBACK hMessageBoxHookProc(int nCode, WPARAM wParam, LPARAM lParam)
    {
    	if (nCode < 0)
    	{
    		return CallNextHookEx(tGlobal.hMessageBoxHook, nCode, wParam, lParam);
    	}
        if (nCode == HCBT_ACTIVATE)
    	{
            SetDlgItemText((HWND)wParam, ID_BUT_OK, "DAS IST OK");
            SetDlgItemText((HWND)wParam, ID_BUT_CANCEL, "DAS IST CANCLE");
            SetDlgItemText((HWND)wParam, ID_BUT_ABORT, "DAS IST ABORT");
            SetDlgItemText((HWND)wParam, ID_BUT_RETRY, "DAS IST RETRY");
            SetDlgItemText((HWND)wParam, ID_BUT_IGNORE, "DAS IST IGNOR");
            SetDlgItemText((HWND)wParam, ID_BUT_YES, "DAS IST JA");
            SetDlgItemText((HWND)wParam, ID_BUT_NO, "DAS IST NEIN");
    	}
    	return CallNextHookEx(tGlobal.hMessageBoxHook, nCode, wParam, lParam);
    }
    

    Viel Spaß noch und danke für die Hilfe


Anmelden zum Antworten