[X] Eine Anwendung Mehrsprachfähig erstellen
-
Eine Anwendung Mehrsprachfähig erstellen
Inhaltsverzeichnis
Einleitung
Erstellen der Hauptanwendung
Resource DLL Datei Laden (Quellcode der Buttons)
Erstellen der Resource DLL Datei
UNICODE nutzen
Zum Abschluss noch ein paar WorteEinleitung
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 Resourcen DLL Datei lädt und in einem CStatic
Feld anzeigt. 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 einen 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 der String Table (falls nicht vorhanden muss
diese erstellt werden) einen neuen Eintrag hinzufügen. Dieser Name muss
später auch in der Resourcen DLL Datei 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 Quellcode
identisch sind. Es werden nur zwei unterschiedliche DLL Dateien geladen.Resource DLL Datei 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 Resourcendaten.// 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
Resourcenhandle 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 unser 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. Von mir wird folgende genutzt:// Text dem CStatic Feld zuweisen SetDlgItemText(IDC_MEINTEXT,text);
Jetzt wird der Text in dem Feld angezeigt. Je nach dem welche Resourcedatei
wir geladen haben, ist der Text Deutsch oder Englisch.
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 sich hier eine Klasse erstellen wie einem die ganzen
Punkte übernimmt. Aus Verständnisgründen habe ich aber auf diese verzichtet.Erstellen der Resource DLL Datei
In diesem Abschnitt erkläre ich euch wie man eine Resourcendatei 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 eine String Table hinzu und tragen unseren
String ein. Der String muss hier ebenfalls IDS_MYTEXT (wie in der
Hauptanwendung) heißten 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 auf die ID in der Hauptanwendung ändern.Nun können wir die Resourcen Datei kompilieren und in das Verzeichnis der
Hauptanwendung hinzufügen. 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 das 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 solche 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 (guenni81)
-
Hat etwas länger gedauert als gedacht, sorry.
Aber ich habe mich Schritt für Schritt an deine Anleitung gehalten und mich bemüht, nichts zu wissen (damit ich nicht was dazudichte, was da fehlt).
Und es hat geklappt.Den Abschnitt über Unicode habe ich allerdings nicht ausprobiert - ich weiß grade nichtmal, ob das auf diesem PC geht.
Du hast noch einen Fehler in den Code-Tags, editier das bitte mal. (Dafür ist kein Neupost nötig.)
Eine Sache fehlt mir allerdings:
Man hat ja die Möglichkeit, mehrere Projekte in einem Arbeitsbereich zu haben, das bietet sich hier doch an.
Aus deiner Beschreibung geht nicht hervor, ob du ein neues Projekt in den Arbeitsbereich der Exe packst oder einen komplett neuen Arbeitsbereich erstellst.
Auch solltest du kurz erwähnen, dass die Dlls vor der Exe kompiliert werden müssen - was bei mehreren Projekten in einem Arbeitsbereich durch Abhängigkeiten erreicht werden kann.
-
Ich habe den Fehler mit den Code Tags behoben.
In dem Beispielprojekt habe ich für jedes Programm(EXE, DLL) ein eigenes Projekt gemacht. So sachen wollte ich eigentlich aus dem Artikel lassen, da dies für sich ein eigenes Thema wäre.
Mit den UNICODE Sachen muss ich auch nochmals nachschauen, ich glaube nämlich das man hierfür eine extra LIB Datei linken muss. Leider kann ich dies aber auch nicht direkt versuchen, da mir eine DLL mit Russisch oder so dazu fehlt...Wenn Jemand zu den UNICODE's helfen kann wäre supi.
-
estartu_de schrieb:
Den Abschnitt über Unicode habe ich allerdings nicht ausprobiert - ich weiß grade nichtmal, ob das auf diesem PC geht.
? Bitte erklären.
-
Marc++us schrieb:
estartu_de schrieb:
Den Abschnitt über Unicode habe ich allerdings nicht ausprobiert - ich weiß grade nichtmal, ob das auf diesem PC geht.
? Bitte erklären.
Was braucht man, damit man Unicode ausprobieren kann?
Ich habs noch nicht gebraucht und mich deswegen noch nie weiter damit beschäftigt.guenni81 schrieb:
Ich habe den Fehler mit den Code Tags behoben.
Hmm, ich sehe ihn noch. Ich mach ihn mal weg.
In dem Beispielprojekt habe ich für jedes Programm(EXE, DLL) ein eigenes Projekt gemacht. So sachen wollte ich eigentlich aus dem Artikel lassen, da dies für sich ein eigenes Thema wäre.
Echt? Das ist doch gar nicht so viel?
-
estartu_de schrieb:
Was braucht man, damit man Unicode ausprobieren kann?
Ich habs noch nicht gebraucht und mich deswegen noch nie weiter damit beschäftigt.Windows mit NT-Kernel oder Linux.
Alle Wins mit NT-Kernel (NT, 2k, xp) basieren automatisch auf Unicode, intern werden alle Zeichenketten der API-Funktionen in Unicode verarbeitet.
Für jede API-Funktion, die einen String-Parameter besitzt, gibt's im Kernel zwei Aufrufe, einmal einen SomeThingA und SomeThingW. Die beiden Funktionen unterscheiden sich dadurch, daß SomeThingA zuerst die Strings nach Unicode konvertiert, und dann SomeThingW aufruft. Auf der Eben der WinAPI-Programmierung siehst Du davon nix, weil Du immer SomeThing aufrufst, aber das ist Fake - diese Funktion gibt's gar nicht, das ist in Wirklichkeit nur ein Makro, das je nach Compilersetting SomeThing auf SomeThingA oder SomeThingW abbildet.
Win9x haben nur einige wenige Unicode-Funktionen, unter anderem für die MessageBox, damit eine Unicode-Anwendung auf w9x sagen kann "ich funktioniere hier nicht".
-
Wie man die einzelnen Dateien erstellt ist jedem Selbst überlassen.
Nun ist die Frage, was ist noch Verbesserungswürdig?
-
Also, ich finde ihn gut - was meinen die anderen?
-
Ich würde ihn aber "Eine MFC Anwendung Mehrsprachfähig erstellen" nennen. Da das zu sehr MFC lastig ist als das als allgemein anzusehen.
-
evilissimo schrieb:
Ich würde ihn aber "Eine MFC Anwendung Mehrsprachfähig erstellen" nennen. Da das zu sehr MFC lastig ist als das als allgemein anzusehen.
Stimmt. Wer den ganzen Tag nur MFC macht denkt irgendwann an nix anderes mehr.
-
evilissimo schrieb:
Ich würde ihn aber "Eine MFC Anwendung Mehrsprachfähig erstellen" nennen. Da das zu sehr MFC lastig ist als das als allgemein anzusehen.
Hast Recht, sollte man noch ändern...
-
Eine MFC Anwendung Mehrsprachfähig erstellen
Inhaltsverzeichnis
Einleitung
Erstellen der Hauptanwendung
Resource DLL Datei Laden (Quellcode der Buttons)
Erstellen der Resource DLL Datei
UNICODE nutzen
Zum Abschluss noch ein paar WorteEinleitung
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 Resourcen DLL Datei lädt und in einem CStatic
Feld anzeigt. 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 einen 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 der String Table (falls nicht vorhanden muss
diese erstellt werden) einen neuen Eintrag hinzufügen. Dieser Name muss
später auch in der Resourcen DLL Datei 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 Quellcode
identisch sind. Es werden nur zwei unterschiedliche DLL Dateien geladen.Resource DLL Datei 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 Resourcendaten.// 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
Resourcenhandle 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 unser 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. Von mir wird folgende genutzt:// Text dem CStatic Feld zuweisen SetDlgItemText(IDC_MEINTEXT,text);
Jetzt wird der Text in dem Feld angezeigt. Je nach dem welche Resourcedatei
wir geladen haben, ist der Text Deutsch oder Englisch.
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 sich hier eine Klasse erstellen wie einem die ganzen
Punkte übernimmt. Aus Verständnisgründen habe ich aber auf diese verzichtet.Erstellen der Resource DLL Datei
In diesem Abschnitt erkläre ich euch wie man eine Resourcendatei 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 eine String Table hinzu und tragen unseren
String ein. Der String muss hier ebenfalls IDS_MYTEXT (wie in der
Hauptanwendung) heißten 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 auf die ID in der Hauptanwendung ändern.Nun können wir die Resourcen Datei kompilieren und in das Verzeichnis der
Hauptanwendung hinzufügen. 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 das 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 solche 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
-
Wäre noch etwas Verbesserungswürdig?
-
Da sich hier so lange nix getan hat: Nein.
Schade, für Morgen wird es sportlich - aber sonst kann man ja auch auf "monatlich" runter gehen, denn es sind ja zwei (/drei) Artikel fast fertig.
-
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 WorteEinleitung
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
-
1.) Verben schreibt man klein
2.) Nach bzw. vor Nebensätzen steht ein Komma
3.) Verbinde Wörter! Nimm notfalls den Bindestrich dazu
4.) Es heißt "als Nächstes" und "als Erstes/Zweites/..." (großgeschrieben)
Mr. B
-
Mr. B schrieb:
1.) Verben schreibt man klein
2.) Nach bzw. vor Nebensätzen steht ein Komma
3.) Verbinde Wörter! Nimm notfalls den Bindestrich dazu
4.) Es heißt "als Nächstes" und "als Erstes/Zweites/..." (großgeschrieben)
Mr. B
Danke, werds nochmal nach kontrollieren. Hab das damals irgendwann morgens nach über 48 Std. dauerwach geschrieben, da darf das ja auch mal vorkommen
-
okay, aber such dir mal die richtige schreibweise von "resource dll datei" raus. eine schreibung ohne bindestrich is garantiert falsch.
Mr. B
-
Ich habe jetzt die letzte Version von mir nochmals verbessert mit dem Ausdruck, der bei der umfrage gesiegt hat.
Der Artikel ist also fertig.
Mr. B
-
@Mr. B
Danke dir!!!