Eine MFC-Anwendung Mehrsprachfähig erstellen



  • Eine MFC-Anwendung mehrsprachfähig erstellen

    Inhaltsverzeichnis

    Einleitung
    Erstellen der Hauptanwendung
    Laden einer Resource-DLL (Quellcode der Buttons)
    Erstellen der Resource-DLL
    UNICODE nutzen
    Zum Abschluss noch ein paar Worte

    Einleitung

    Es kennen bestimmt viele das Problem, dass man eine Anwendung
    mehrsprachig machen muss, aber leider nicht weiß, wie man dies
    realisieren kann. Dieser kleine Artikel soll zeigen, wie man Strings
    aus einer so genannten Resource-DLL Datei lädt und in einem CStatic
    Feld anzeigt. Der Einfachheit halber wird in diesem Artikel nur ein Satz
    aus der DLL geladen.

    Erstellen der Hauptanwendung

    Zuerst müssen wir unsere Hauptanwendung erstellen. In diesem
    kleinen Beispiel nutze ich hierfür eine dialogbasierende Anwendung.
    Natürlich wäre es hier auch möglich, eine SDI- oder MDI-Anwendung zu nehmen.
    Dieser füge ich zwei Schaltflächen zum Laden der deutschen und englischen
    Sprachresource hinzu.

    An der Stelle "Text hier" wurde von mir ein CStatic erstellt.
    Hier soll später der geladene Text stehen. Hier ist es wichtig, die ID
    von ID_STATIC auf eine eindeutige ID eurer Wahl zu ändern. Diese wird später
    zum Ändern des Textes benötigt.

    Im nächsten Schritt müssen wir dem Stringtable (falls nicht vorhanden, muss
    diese erstellt werden) einen neuen Eintrag hinzufügen. Dieser Name muss
    später auch in der Resource-DLL verwendet werden. Ich habe mich
    hier für IDS_MYTEXT entschieden.

    Nun fügen wir den Quellcode für unsere beiden Buttons ein.


    Ich zeige hier nur den Quellcode eines Buttons, da die Quellcodes
    identisch sind. Es werden nur zwei unterschiedliche DLL-Dateien geladen.

    Resource-DLL Laden (Quellcode der Buttons)

    Als Erstes benötigen wir zwei Handle-Variablen: Eine für die geladene DLL-Datei
    und die andere für die aktive EXE-Datei. Am Ende der Funktion müssen
    wir das Handle wieder auf die EXE-Datei setzen, da es hier ansonsten zu
    Probleme kommen kann beim Laden von Resourcedaten.

    // Variable deklarieren
    HINSTANCE hDll, hExe;
    CString text;
    

    Als Nächstes müssen wir das aktive Handle für die Resourcen ermitteln
    und wegspeichern. Danach müssen wir die DLL Datei laden und diese als neue
    Resourcehandle setzen.

    // Aktives Resourcehandle holen
    hExe = AfxGetResourceHandle();
    ASSERT(hExe);
    
    // DLL-Datei laden
    hDll = AfxLoadLibrary(_T("german.dll"));
    ASSERT(hDll);
    
    // Neues Resourcehandle setzen
    AfxSetResourceHandle(hDll);
    

    Wenn wir dies gemacht haben, können wir mit Hilfe der Funktion
    LoadString der Klasse CString unseren Text in die Variable laden.

    // Text aus DLL laden
    text.LoadString(IDS_MYTEXT);
    

    Im nächsten Schritt müssen wir unseren Text nun in das CStatic Feld setzen.
    Hierfür gibt es natürlich mehrere Möglichkeiten. Ich nutze folgende:

    // Text dem CStatic Feld zuweisen
    SetDlgItemText(IDC_MEINTEXT,text);
    

    Jetzt wird der Text in dem Feld angezeigt. Je nachdem, welche Resourcedatei
    wir geladen haben, ist der Text in Deutsch oder in Englisch abgefasst.
    Im letzten Schritt dieser Funktion setzen wir das Resourcehandle wieder auf
    unsere EXE-Datei und geben die geladene DLL-Datei wieder frei.

    // EXE-Resourcehandle wieder setzen
    AfxSetResourceHandle(hExe);
    
    // DLL-Datei wieder freigeben
    AfxFreeLibrary(hDll);
    

    Natürlich kann man hier eine Klasse erstellen, die einem die ganzen
    Punkte übernimmt. Aus Verständnisgründen habe ich aber auf diese verzichtet.

    Erstellen der Resource-DLL

    In diesem Abschnitt erkläre ich euch, wie man eine Resourcedatei korrekt
    erstellt, da man auch hier auf einiges achten muss.

    Als Erstes müssen wir eine DLL-Datei erstellen.

    Für unsere Zwecke reicht eine Standard-DLL-Datei vollkommen aus.

    Nun fügen wir dieser DLL-Datei einen Stringtable hinzu und tragen unseren
    String ein. Der String muss hier ebenfalls IDS_MYTEXT (wie in der
    Hauptanwendung) heißen und auch die gleiche ID besitzen.

    Sollte eine andere ID bei dem Wert drinstehen als die in der Hauptanwendung
    (wird vermutlich der Fall sein), müssen wir die Resource.h-Datei editieren
    und die vorhandene ID über die ID in der Hauptanwendung schreiben.

    Nun können wir die Resourcedatei kompilieren und in das Verzeichnis der
    Hauptanwendung ablegen. Anschließend können wir diese über die Buttons laden.

    Nach dem Laden der englischen Resource sieht der Dialog anschließend wie folgt aus.

    UNICODE nutzen

    Es ist bei einigen Sprachen (z. B. Russisch) nötig, UNICODE zum
    darstellen der Zeichen zu benutzen. Um UNICODE in unserer Anwendung zu
    nutzen, fügen wir in unserer Stdafx.h folgenden Zeile ein.

    #define _UNICODE
    

    Nun müssen wir noch in den Einstellungen dem Programm sagen, dass es die
    MainFunktion für UNICODE nutzen soll.

    Nach diesen zwei kleinen Einstellungen ist unser Programm UNICODE-fähig und
    sollte keine Probleme mehr haben, Sprachen wie Russisch etc. anzuzeigen.

    Zum Abschluss noch ein paar Worte

    Ich hoffe, ich konnte mit diesem kleinen Artikel einige Leute bei dem
    oben genannten Problem helfen.
    Über Kritik, Änderungsvorschläge und Lob zu diesem kleinen Artikel würde
    ich mich sehr freuen.

    Mit freundlichen Grüßen,
    euer Günni



  • Als ich die Überschrift las "Eine Anwendung mehrsprachig erstellen" muss ich zugeben, dass ich vorerst vermutete, dass es sich dabei um das verbinden meherer Programmiersprachen handelt, wie es nun ja in .NET möglich ist ;).
    Aber dennoch hat sich der Artikel als sehr interessant entpuppt, auch wenn ich eher C# Programmierer bin :). Sehr gut geschrieben, auch wenn ich manche Dinge nocheinmal überarbeiten muss, da ich noch kein C++ Programmiert habe.

    Dennoch Respekt 👍



  • Jo der Artikel gefällt mir auch 🙂 👍



  • Vielleicht sollte man gleich zu Beginn sagen, dass es sich um einen Artikel um MFC (oder die WinAPI) handelt. Sobald man die WIndowswelt verlässt wird man feststellen müssen, dass es keine DLLs mehr gibt...
    geloescht

    EDIT: natürlich gibts andere dynamische gelinkte Bibliothekarten. Aber die können eben nicht so verwendet werden.



  • geloescht schrieb:

    Vielleicht sollte man gleich zu Beginn sagen, dass es sich um einen Artikel um MFC (...) handelt.

    Definitiv. Immer diese MFC-Überheblichkeit. 😉



  • Muss mich geloescht anschliessen. Ich finde den Artikel gut und für MFC ist das sicher eine sehr schöne Lösung, aber nachdem ich die Überschrift gelesen habe, hab' ich eher eine universelle Lösung erwartet. 😞

    Nichts desto trotz: Schöner Artikel. 🙂



  • Auch auf die Gefahr hin, dass nicht mehr so viele reinschauen: Ich hab den Betreff mal um ein MFC ergänzt. 😉



  • Eigenltich ist eine Übersetzungfähigkeit auch ohne Hilfsmittel nicht so schwer.
    Man braucht eigentlich nur Kentnisse in Dateiverarbeitung und Stringparsing.
    Es ist zwar nicht sicher, jeder kann die Datei einsehen und selbst in eine andere Sprache übersetzen, aber jedenfalls einfach.

    Für OpenSource gibts auch noch dieses GetText, ich haber aber noch nicht verstanden wie das funktioniert... was auch daran liegt das ich es unter Windows nicht kompilieren kann und ich zu faul bin um Linux zu booten und dann später wieder lange warten muss bis Windows hochgefahren ist... 😃



  • Guten Tag,
    den Artikel finde ich sehr gut. Herzlichen Dank! 😉
    Habe das Beispiel mal nachgebaut.
    Allerdings habe ich das Problem, dass ich Visual Studio 6 nicht Unicode fähig bekomme.
    ich habe koreanisch für Window nachinstalliert und unter Word funktioniert das auch. Ich kann dort mit der Tastatur koreanische Schriftzeichen eingeben.
    Wenn ich allerdings in dem Beispiel von oben einen neuen Button "Lade koreanische DLL" hinzufüge und dann eine koreanische MFC-Resourcen-DLL erstellen möchte, habe ich das Problem dass ich im erzeugten String Table keine koreanischen Schriftzeichen schreiben kann. Es werden dort dann nur "?" dargestellt.
    Könnte mir hier bitte jemand einen Tip geben, wie ich Visual Studio 6 für die Eingabe von Unicode umstelle.

    Gruß skontox



  • Herrje, ich glaube dass solltest du besser im VC-Forum fragen. 😮
    Ich verlinke die Antworten dann hier. 🙂



  • Oh Entschuldigung! 😉
    Stimmt ist doch etwas unpassend hier!
    hatte ich nicht gesehen!

    Ich werde das dann dort posten!

    Gruß skontox



  • skontox schrieb:

    Stimmt ist doch etwas unpassend hier!

    Unpassend weniger.
    Ich befürchte eher, dass die Frage hier einfach übersehen wird. 😉



  • hallo,

    ich bin gerade dabei meine c++/mfc anwendung mehrsprachig zu machen. soweit ich mich jetzt in die sache eingelesen habe gibt es 2 möglichkeiten:
    mehrere string tables mit unterschiedlicher sprache direkt als resource in der exe integriert
    oder
    das ganze wie oben beschrieben in einer externen dll realisieren

    kann mir jemand sagen wo hier genau die vor- und nachteile liegen?
    warum wird in der regel die dll variante bevorzugt?



  • res schrieb:

    hallo,

    ich bin gerade dabei meine c++/mfc anwendung mehrsprachig zu machen. soweit ich mich jetzt in die sache eingelesen habe gibt es 2 möglichkeiten:
    mehrere string tables mit unterschiedlicher sprache direkt als resource in der exe integriert
    oder
    das ganze wie oben beschrieben in einer externen dll realisieren

    kann mir jemand sagen wo hier genau die vor- und nachteile liegen?
    warum wird in der regel die dll variante bevorzugt?

    Also, der Vorteil in einer DLL Datei ist einfach der das diese besser auszutauschen ist ohne das das Programm neu kompiliert werden muß. Wenn du die DLL Dynamisch nachlädst, so lässt sich auch das Programm flexibler mit Sprachen erweitern, ebenfalls wieder ohne das du dein Programm kompilieren mußt. 😃


Log in to reply