Menu in einer Mehrsprachigen-Anwendung



  • Danke für eure Antworten, werde mich mal damit auseinandersetzten!



  • Hallo nochmal!

    Meine Umstellung ist beinahe fertig, bräuchte aber noch eure Hilfe.

    Folgendes Problem:

    Beim beenden fragt das Programm "Änderungen in ... speichern?"
    dieser String ist auch in der Resource datei aber dieser wird nie dort abgefragt durch "LoadString(..)".

    #define IDS_STRING_00367 61699
    IDS_STRING_00367 "Änderungen in %1 speichern? ???"

    Wo oder warum wird der String aufgerufen? Gilt evtl. die #61699 immer in MFC beim speichern?



  • AFX_IDP_ASK_TO_SAVE wird in DOCCORE.CPP bei CDocument::SaveModified benutzt.
    AFX_IDP_ASK_TO_SAVE ist in Programme\Microsoft Visual...\MFC\include\AFXRES.RC mit "Save changes to %1?" festgelegt, im Unterverzeichnis l.deu mit "Änderungen in %1 speichern?".

    Schaue in die .rc deines Programms und du findest:
    3 TEXTINCLUDE DISCARDABLE
    BEGIN
    ...
    "#include ""l.deu\\afxres.rc""
    "#include ""l.deu\\afxprint.rc""
    ...
    END

    Die Resourcen für allgemeine Dinge (Standard-Dialoge, Druckvorschau) holt sich der Kompiler/Linker also von dort. Du musst das l.deu durch das passende ersetzen (VS liefert schon einige mit wie l.fra für Französisch).

    UPDATE:
    Da in CDocument::SaveModified() direkt AfxFormatString1(prompt, AFX_IDP_ASK_TO_SAVE, name); benutzt wird, kannst du dein Programm nicht so gestalten, dass man nur die Sprach-DLL austauschen muss und die Exe so bleibt. Du musst also für jede Sprache auch eine Exe haben.
    CDocument::SaveModified() ist aber virtual, d.h. du kannst sie überschreiben indem du die gleiche Methode in deiner eigenen von CDocument abgeleiteten Klasse anlegst und den Code aus Doccore.cpp kopierst und modifizierst.



  • 👍 vielen Dank hab die Funktion überschrieben und jetzt läuft es Perfekt!

    BOOL CKwlDoc::SaveModified()
    {
    
    	if ( !IsModified() )
    		return TRUE;        // ok to continue
    
    	CString prompt;
    	prompt.Format(theApp.GetString(IDS_STRING_00424), m_strTitle);
    
    	switch (MessageBox(NULL, prompt, theApp.GetString(IDS_STRING_00425), MB_YESNOCANCEL|MB_ICONQUESTION) )
    	{
    	case IDCANCEL:
    		return FALSE;       // don't continue
    
    	case IDYES:
    		// If so, either Save or Update, as appropriate
    		if (!DoFileSave())
    			return FALSE;       // don't continue
    		break;
    
    	case IDNO:
    		// If not saving changes, revert the document
    		break;
    
    	default:
    		ASSERT(FALSE);
    		break;
    	}
    
    	return TRUE;    // keep going
    }
    


  • Achso wenn ich schon dabei bin kann ich euch auch gleich fragen wie man
    Icons erstellt die Windows 7 tauglich sind (glaub 256x256 ) unter VC 6.

    Habe leider nichts im Internet gefunden... 😕



  • Hast du auch die Druckvorschau übersetzt? Denn die kommt von afxprint.rc, da gibts aber auch eine Lösung...

    zu den Icons:
    http://msdn.microsoft.com/en-us/library/ms997636.aspx
    http://msdn.microsoft.com/en-us/library/windows/desktop/aa511280.aspx
    der VS-Iconeditor kann keine 256-Farben, also anderes Tool verwenden.



  • Softwaremaker schrieb:

    Hast du auch die Druckvorschau übersetzt? Denn die kommt von afxprint.rc, da gibts aber auch eine Lösung...

    Ne die Druckvorschau habe ich ganz vergessen...aber habe bereits das hier gefunden für eine individuelle Vorschau:

    void CPrintPreviewView::OnFileImprovedprintpreview() 
    {
    	// need to use CMyPreviewView class
    	CPrintPreviewState* pState = new CPrintPreviewState;
    
    	if (!DoPrintPreview(IDD_PREVIEW, this, RUNTIME_CLASS(CMyPreviewView), pState))
    	{
    		TRACE0("Error: OnFileImprovedprintpreview failed.\n");
    		AfxMessageBox(AFX_IDP_COMMAND_FAILURE);
    		delete pState;      // preview failed to initialize, delete State now
    	}
    }
    

    Falls deine Lösung schöner ist bitte posten 😃



  • Eine eigene PrintPreview-Klasse erstellen:

    #include <afxpriv.h>
    
    class CPreviewViewTrans : public CPreviewView  
    {
    public:
    	DECLARE_DYNCREATE(CPreviewViewTrans)
    	CPreviewViewTrans();
    	void OnActivateView( BOOL bActivate, CView* pActivateView, CView* pDeactiveView );
    protected:
    	//{{AFX_MSG(CPreviewViewTrans)
    	afx_msg void OnUpdateNumPageChange(CCmdUI* pCmdUI);
    	//}}AFX_MSG
    	DECLARE_MESSAGE_MAP()
    };
    
    #include "stdafx.h"
    #include "CPreviewViewTrans.h"
    
    IMPLEMENT_DYNCREATE(CPreviewViewTrans, CPreviewView)
    
    BEGIN_MESSAGE_MAP(CPreviewViewTrans, CPreviewView)
    	//{{AFX_MSG_MAP(CPreviewViewTrans)
    	ON_UPDATE_COMMAND_UI(AFX_ID_PREVIEW_NUMPAGE, OnUpdateNumPageChange)
    	//}}AFX_MSG_MAP
    END_MESSAGE_MAP()
    
    CPreviewViewTrans::CPreviewViewTrans()
    {
    }
    
    void CPreviewViewTrans::OnActivateView(BOOL bActivate, CView*, CView*)
    {
    	if (bActivate)
    	{
    		if (m_pToolBar)
    		{
    			CWnd	*wnd;
    
    			wnd = m_pToolBar->GetDlgItem(AFX_ID_PREVIEW_PRINT);
    			if ( wnd ) wnd->SetWindowText( AFX_IDS_PREVIEW_PRINT );
    
    			wnd = m_pToolBar->GetDlgItem(AFX_ID_PREVIEW_NEXT);
    			if ( wnd ) wnd->SetWindowText( AFX_IDS_PREVIEW_NEXT );
    
    			wnd = m_pToolBar->GetDlgItem(AFX_ID_PREVIEW_PREV);
    			if ( wnd ) wnd->SetWindowText( AFX_IDS_PREVIEW_PREV );
    
    			//AFX_ID_PREVIEW_NUMPAGE hat keinen Text
    
    			wnd = m_pToolBar->GetDlgItem(AFX_ID_PREVIEW_ZOOMIN);
    			if ( wnd ) wnd->SetWindowText( AFX_IDS_PREVIEW_ZOOMIN );
    
    			wnd = m_pToolBar->GetDlgItem(AFX_ID_PREVIEW_ZOOMOUT);
    			if ( wnd ) wnd->SetWindowText( AFX_IDS_PREVIEW_ZOOMOUT );
    
    			wnd = m_pToolBar->GetDlgItem(AFX_ID_PREVIEW_CLOSE);
    			if ( wnd ) wnd->SetWindowText( AFX_IDS_PREVIEW_CLOSE );
    		}
    	}
    }
    
    void CPreviewViewTrans::OnUpdateNumPageChange(CCmdUI* pCmdUI)
    {
    	CPreviewView::OnUpdateNumPageChange(pCmdUI);
    
    	UINT nPages = (m_nZoomState == ZOOM_OUT ? m_nPages : m_nZoomOutPages);
    
    	if (nPages == 1)
    		pCmdUI->SetText( AFX_IDS_TWOPAGE );
    	else
    		pCmdUI->SetText( AFX_IDS_ONEPAGE );
    }
    
    //es gibt auch noch
    //AFX_IDS_PREVIEWPAGEDESC  "Page %u\nPages %u-%u\n"
    //das habe ich aber nicht in meinem Code
    

    Und in View den Code den du schon hast (aber mit CPreviewViewTrans anstatt CMyPreviewView)



  • Super, vielen Dank



  • Leider funktioniert es nicht bei mir. Meine Druckervorschau ist von CEditView abgeleitet...gibts dort eine möglichkeiten, die Toolbar buttons umzubennen?



    void CTestView::OnFilePrintPreview()
    {
    CEditView::OnFilePrintPreview(); <<--breakpoint setzen
    }

    1. Programm im Debugmode starten, Druck-Vorschau aufrufen > hält bei Breakpoint
    2. F11 (eins weiter) >> du siehst CView::OnFilePrintPreview() und so wie es dort ist musst du es auch machen
    CPrintPreviewState* pState = new CPrintPreviewState;
    
        if (!DoPrintPreview(AFX_IDD_PREVIEW_TOOLBAR, this, RUNTIME_CLASS(CPreviewViewTranslate), pState))
        {
            TRACE0("Error: OnFileImprovedprintpreview failed.\n");
            AfxMessageBox(AFX_IDP_COMMAND_FAILURE);
            delete pState;      // preview failed to initialize, delete State now
        }
    


  • Sven12 schrieb:

    Achso wenn ich schon dabei bin kann ich euch auch gleich fragen wie man
    Icons erstellt die Windows 7 tauglich sind (glaub 256x256 ) unter VC 6.

    Der Resourcen-Editor von VS6 kennt Icon im Format 256x256 Pixel nicht. Das liegt daran, daß dieses Icon im *.PNG Format vorliegen muß (ab Windows Vista und neuer).
    Die bisherigen (kleineren) Icons sind bekanntlich im *.BMP bzw. *.ICO Format (und diese werden bis heute natürlich weiterhin unterstützt)

    Dazu brauchst Du also einen moderneren Icon-Designer.
    Es gibt eine große Auswahl an kostenfreien Tools im Internet!

    Nachdem Du ein entsprechendes Icon erzeugt hast, mußt Du es in die Resource-Sektion Deiner Applikation einbinden.
    Da der Compiler bzw. Linker des VS6 auch damit nicht klarkommt, muß man es nach Abschluß des Buildens nachträglich mit einem externen Tool machen.

    Ich habs mit Hilfe von ReplaceVistaIcon.exe gelöst, siehe CodeProject "Windows Vista Icons": http://www.codeproject.com/Articles/14010/Windows-Vista-Icons

    HTH,
    Martin



  • Danke Softwaremaker, Texte werden nun in der Vorschau auch übersetzt...flickert nur etwas aber nicht schlimm.

    Und auch danke für den Tip

    Mmacher schrieb:

    Sven12 schrieb:

    Achso wenn ich schon dabei bin kann ich euch auch gleich fragen wie man
    Icons erstellt die Windows 7 tauglich sind (glaub 256x256 ) unter VC 6.

    Der Resourcen-Editor von VS6 kennt Icon im Format 256x256 Pixel nicht. Das liegt daran, daß dieses Icon im *.PNG Format vorliegen muß (ab Windows Vista und neuer).
    Die bisherigen (kleineren) Icons sind bekanntlich im *.BMP bzw. *.ICO Format (und diese werden bis heute natürlich weiterhin unterstützt)

    Dazu brauchst Du also einen moderneren Icon-Designer.
    Es gibt eine große Auswahl an kostenfreien Tools im Internet!

    Nachdem Du ein entsprechendes Icon erzeugt hast, mußt Du es in die Resource-Sektion Deiner Applikation einbinden.
    Da der Compiler bzw. Linker des VS6 auch damit nicht klarkommt, muß man es nach Abschluß des Buildens nachträglich mit einem externen Tool machen.

    Ich habs mit Hilfe von ReplaceVistaIcon.exe gelöst, siehe CodeProject "Windows Vista Icons": http://www.codeproject.com/Articles/14010/Windows-Vista-Icons

    HTH,
    Martin



  • So hab jetzt noch ne Frage. Die Umstellung auf UNICODE verursacht probleme bzw. startet nicht mehr.

    Muss die Hauptanwenung und DLL UNICODE sein oder reicht es wenn die DLL alleine UNICODE fähig ist?


  • Mod

    Sven12 schrieb:

    So hab jetzt noch ne Frage. Die Umstellung auf UNICODE verursacht probleme bzw. startet nicht mehr.

    Muss die Hauptanwenung und DLL UNICODE sein oder reicht es wenn die DLL alleine UNICODE fähig ist?

    Was für eine DLL meinst Du?

    Die DLL muss in Ihren Schnittstellen zur EXE passen. Mehr nicht.
    Ob die nun intern Unicode oder MBCS nimmt ist wurscht.

    Wenn Du in den Funktionen der DLL auch TCHAR LPT... etc. verwendes hast muss die natürlich zur EXE passen. Aber dann stürzt nichts ab, dann wird die DLL nicht geladen, sofern Du kein C-Interface verwendest.



  • Martin Richter schrieb:

    Sven12 schrieb:

    So hab jetzt noch ne Frage. Die Umstellung auf UNICODE verursacht probleme bzw. startet nicht mehr.

    Muss die Hauptanwenung und DLL UNICODE sein oder reicht es wenn die DLL alleine UNICODE fähig ist?

    Was für eine DLL meinst Du?

    Die DLL muss in Ihren Schnittstellen zur EXE passen. Mehr nicht.
    Ob die nun intern Unicode oder MBCS nimmt ist wurscht.

    Wenn Du in den Funktionen der DLL auch TCHAR LPT... etc. verwendes hast muss die natürlich zur EXE passen. Aber dann stürzt nichts ab, dann wird die DLL nicht geladen, sofern Du kein C-Interface verwendest.

    Meine DLL(s) besitzen nur Stringtables und Menüs welche von der Hauptanwendung geladen werden.

    Wie auch immer habe nach der Umstellung auf UNICODE es nicht hinbekommen das Programm lauffähig zu machen, ist natürlich sehr Umfangreich + ich habe mich noch nie mit UNICODE befasst, deswegen möchte ich vorher Nachfragen bevor ich mich mit der Ursache beschäftige.



  • Sven12 schrieb:

    Martin Richter schrieb:

    Sven12 schrieb:

    So hab jetzt noch ne Frage. Die Umstellung auf UNICODE verursacht probleme bzw. startet nicht mehr.

    Muss die Hauptanwenung und DLL UNICODE sein oder reicht es wenn die DLL alleine UNICODE fähig ist?

    Was für eine DLL meinst Du?

    Die DLL muss in Ihren Schnittstellen zur EXE passen. Mehr nicht.
    Ob die nun intern Unicode oder MBCS nimmt ist wurscht.

    Wenn Du in den Funktionen der DLL auch TCHAR LPT... etc. verwendes hast muss die natürlich zur EXE passen. Aber dann stürzt nichts ab, dann wird die DLL nicht geladen, sofern Du kein C-Interface verwendest.

    Meine DLL(s) besitzen nur Stringtables und Menüs welche von der Hauptanwendung geladen werden.

    Wie auch immer habe nach der Umstellung auf UNICODE es nicht hinbekommen das Programm lauffähig zu machen, ist natürlich sehr Umfangreich + ich habe mich noch nie mit UNICODE befasst, deswegen möchte ich vorher Nachfragen bevor ich mich mit der Ursache beschäftige.

    Da hilft es nur noch mit dem Debugger Step-by-Step zu debuggen.

    Da Du von einem Absturz sprichst, obwohl in den DLLs nur Stringtables und Menüs sind:
    Ich vermute, Du hast irgendwo in der EXE einen Speicher für Deine Strings angefordert bzw. char-Variablen bereitgestellt, aber mit der Anzahl von Zeichen, was bei ANSI 8-bit Zeichensatz auch funktioniert.
    Sobald Du aber versuchst in diesen Speicher UNICODE 16-bit Texte zu kopieren, dann kann es krachen, weil UNICODE-Strings doppelt so viel Speicher benötigen als ANSI !!!

    Nur mal so als Hilfestellung
    Martin


  • Mod

    Debugger und Callstack sollte Dir doch hinreichend Informationen liefern!



  • OK Programmabsturz habe ich nun im Griff, nur werden die Zeichen immer noch als Symbole bzw. dicke I's angezeigt habe schon soviel versucht aber bisher kein Erfolg.

    DLL:
    C++ Prä...
    WIN32,NDEBUG,_WINDOWS,_WINDLL,_AFXDLL,_UNICODE,_USRDLL
    Res Prä...
    NDEBUG,_AFXDLL,_UNICODE
    Einstiegspunkt
    _DllMainCRTStartup@12

    und das gleiche bis auf den Einstiegspunkt auch in der Hauptanwendung.

    Die *.rc Datei kann ich nur mit Notepad bearbeiten da ich sie als UNICODE gespeichert habe.

    Mein Stringtable sieht so aus (gekürzt) für Tests:
    IDS_STRING_00074 L"\x015B\u0107\uC59B\uC487"
    IDS_STRING_00075 L"Miejscowość"



  • OK habe es gerade in auf Windows 7 probiert und dort wird es richtig angezeigt 😮

    Unter Windows XP werden immer noch nur Balken dargestellt? Hat einer ein für mich Tip?


Anmelden zum Antworten