Multilanguage durch verschiedene Ressourcen
-
Hallo,
@aziz:
Die beiden Versionen existieren als Stringtables in einem Ressourcen-Ordner.
eine auf deutsch, die andere auf Englisch (USA).
Selbst wenn ich bei "Einstellungen" Ressourcen auf "Englisch(USA) schalte, wird nach dem compilieren immer die deutsche Version angezeigt.
Ich verwende Visual Studio C++ 6.0 .Die Systemsprache ist natürlich deutsch. Ich will diese auch nicht umstellen, sondern einfach die Englsiche version compilieren.
Was mache ich da falsch?thx
Manitu
-
Manitu schrieb:
Hallo,
Was mache ich da falsch?Ich weiß nicht warum es nicht funktioniert. Vielleicht ist diese Option in den Einstellungen garnicht dafür bestimmt? Die Direkthilfe sagt nämlich nichts eindeutiges aus...
In meinem Projekt habe ich nicht darauf geachtet in welcher Sprache, die Ressource definiert sind. Manche Ressourcen sind als Deutsch definiert, und andere als Englisch. Die Ressourcen enthalten jedoch nur englischen Text, und mein Programm zeigt auch nur englischen Text wenn es läuft...
Wenn ich eine deutsche Version brauche, werde ich einfach eine Ressourcen-DLL kreieren, die mein Programm dann dynamisch lädt.
-
Hallo,
Aziz schrieb:
Wenn ich eine deutsche Version brauche, werde ich einfach eine Ressourcen-DLL kreieren, die mein Programm dann dynamisch lädt.
Wie geht das mit den Ressourcen-DLLs ?
Kann man das evtl. irgendwo nachlesen ?thx
Manitu
-
Ich stelle mir das so vor, dass du einfach für jede Sprache eine Ressourcen-DLL erstellst, mit den ganzen Strings in Landessprache. Dabei verwendest du für den gleichen Text in den unterschiedlichen Sprachen immer die selbe ID. Wenn du jetzt zu Beginn einfach die entsprechende DLL lädst solltest du immer die Strings in der richtigen Sprache bekommen

-
Manitu schrieb:
Hallo,
Wie geht das mit den Ressourcen-DLLs ?
Kann man das evtl. irgendwo nachlesen ?Das geht ganz einfach:
.) Erstelle ein neues Win32 DLL-Projekt (aber nicht notwendigerweise einen neuen Arbeitsplatz).
.) Das Projekt soll komplett leer sein.
.) In den Linker-Optionen fügst du den /NOENTRY Schalter hinzu.
.) Jetzt fügst du deinem Projekt die Dateien resource.h und "projektname".rc hinzu.Fertig.
Mit LoadLibrary lädst du die gewünschte Ressourcen-DLL und gibst das erhaltene Handle bei allen LoadXXX-Funktionen an. Wie flenders bereits erwähnt hat, müssen alle ID's in den Ressourcen gleich sein, sonst funktioniert diese Idee nicht. Die Namen der ID's sollten alle einheitlich in einer Sprache sein (am besten Englisch). Z.B. IDS_APPTITLE, oder IDM_EDIT_COPY etc.
-
Hallo,
@Aziz:
Danke vielmals.
Wenn du "zufällig" den Inhalt einer Ressourcen-DLL posten könntest, würde ich mich sehr freuen.
THX
Manitu
-
Ich hatte das so verstanden, dass die Ressourcen-DLL ausschließlich Ressourcen enthält. Was sollte Aziz da groß posten

-
Hallo,
das mit den Ressourcen- DLLs funktioniert soweit.
Trotzdem würde ich lieber die Stringtables benutzen, da ich dann nur eine einzige Datei zum bearbeiten hätte.
Also meine Frage:
Wenn ich Stringtables in verschiedenen Sprachen angelegt habe, wie kann ich dann die Sprache auswählen, die aktuell dargestellt werden soll?
Das muss doch irgendwie gehen.Danke im Voraus,
Manitu
-
Manitu schrieb:
Hallo,
das mit den Ressourcen- DLLs funktioniert soweit.
Trotzdem würde ich lieber die Stringtables benutzen, da ich dann nur eine einzige Datei zum bearbeiten hätte.
Also meine Frage:
Wenn ich Stringtables in verschiedenen Sprachen angelegt habe, wie kann ich dann die Sprache auswählen, die aktuell dargestellt werden soll?
Das muss doch irgendwie gehen.Danke im Voraus,
Manitu
Du kannst ja in einem Arbeitsbereich mehrere Projekte verwalten. Wenn du jede Sprache als Ressourcen-DLL-Projekt anlegst und deinem bereits bestehendem Arbeitsbereich hinzufügst, dann hast du beim Editieren alle Ressourcen von allen Projekten unter einem Auge.
Deine Frage verstehe ich außerdem nicht. Du sagst die Ressourcen-DLLs funktionieren soweit und trotzdem hast du noch das ursprüngliche Problem?!
-
Ich nehme mal an, dass er es mit der Methode mit mehreren DLLs (eine pro Sprache) hinbekommen hat, er will jetzt aber alle Strings in einer Stringtable haben.
Ich weiß nicht, ob man die Konstanten-Namen irgendwie vorher als Sting zusammensetzen kann, aber du könntest es auf jeden Fall so machen, dass du für die Sprachen eine Basis-Wert-Konstante definierst, zu der deine Konstanten dann relativ gesehen in jeder Sprache gleich sind. Als Beispiel:#define LANG_DE 1000 #define LANG_EN 2000 #define STR_EDIT 1 #define STR_COPY 2 #define STR_EDIT_DE LANG_DE + STR_EDIT #define STR_COPY_DE LANG_DE + STR_COPY #define STR_EDIT_EN LANG_EN + STR_EDIT #define STR_COPY_EN LANG_EN + STR_COPYKeine Ahnung, ob das so funktioniert (und dann auch so ist, wie du es dir vorgestellt hattest)

-
Hallo,
man kann doch in VC++ einfach einer Stringtable per Rechtsklick eine Sprache zuweisen. Man kann sich so mit: Stringtables kopieren, mehrere Stringtables, die alle die gleichen IDs haben, in verschiedenen Sprachen anlegen.
Aber wie bringt man das ausführende Programm dazu die gewünschte Stringtable zu benutzen ?

THX
Manitu
-
Also nochmal:
Du erstellst ein neues Projekt mit besagter Anleitung. Dann fügst du diesem Projekt deine englische od. deutsche Stringtable hinzu. Wenn du das Projekt kompilierst erhältst du eine DLL (z.B. english.dll). Du ladest diese DLL dynamisch mit "LoadLibrary", und das am besten bevor du irgendeine Funktion wie CreateWindow(Ex), LoadString etc. aufrufst. Das Handle, das du von LoadLibrary erhälts verwendest du um jede erdenkliche Ressource zu laden, die sprachenabhängig ist (Strings, Dialoge, Icons etc.).
Beispiel (pseudocode-mäßig):
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { HMODULE hResource = LoadLibrary("english.dll"); // Buffer variablen anlegen... LoadString(hResource, IDM_APPTITLE, lpBuffer, nBufferSize); CreateWindowEx(..., lpBuffer,...); // Fenstertitel-String hier angeben //Message Loop FreeLibrary(hResource); return 0; }Du musst deinen Code natürlich entsprechend ändern, wenn du die Technik verwenden willst, die ich beschrieben habe.
-
Du könntest für die Englische Version doch einfach die Strings aus der englischen
Strintabel in die Deutsche Kopieren, dann kompilerste das und schon haste die
englischen Texte. Wenn du da mit 3Stringtables Arbeitest, dann musste in deine
jetztige Deutsche einfach immer nur die Sprache die du gerade willst reinkopieren.
Ist ja keine Arbeit, STRG+A->STRG+C->STRG+A->STRG+V. Und du brauchst beide Sprachen
doch eh nur in der Release Version, oder?Ich hab bis jetzt noch nicht viel mit den String Tables gemacht, wenn da aber
auch Präprozessor Direktiven gehen, kannste ja einfach je nach DE oder EN die
entsprechende andere String Table includen.
-
Hast du mal bei den Projekt-Einstellungen unter Ressourcen die entsprechende Sprache eingestellt?!

-
flenders schrieb:
Hast du mal bei den Projekt-Einstellungen unter Ressourcen die entsprechende Sprache eingestellt?!

Habe ich gemacht, es hat aber keine Wirkung!

Es wird immer die oberste String table genommen. Egal welche Sprache man in Projetk-Einstellungen unter Ressourcen einstellt.
Das ist ja genau das, was ich nicht verstehe.
THX
Manitu
-
Was ist denn an der DLL-Version so schlecht? Viele Anwendungen kommen mit DLLs daher. Warum nicht auch deine?
-
Hallo,
mir stellt sich im Moment eher die Frage, ob man überhaupt mit Resourcenstring bzw. einer Resourcen-DLL arbeiten soll.

Wo ist denn da der Vorteil gegenüber einer stinknormalen Textdatei, die man per Editor erzeugt, und in der die einzelnen Strings einfach zeilenweise drinstehen. Man kann doch dann die entsprechende "Sprachendatei" z.B. "Deutsch.lng" beim Programmstart einfach laden, und fertig. Und die Bearbeitung ist wesentlich schneller als mit diesen ResourcenStringTables.
Also warum Resourcen-DLLs statt eigener Textdatei?
THX
Manitu
-
Manitu schrieb:
Und die Bearbeitung ist wesentlich schneller als mit diesen ResourcenStringTables.
Aha. Manit(o)u hat gesprochen, wa? Wie kann es einfacher gehen als mit LoadString()?
-
Aha. Manit(o)u hat gesprochen, wa? Wie kann es einfacher gehen als mit LoadString()?
Der Ladevorgang natürlich nicht.

Ich meinte, wenn man sehr viele Strings hat, ist doch ein Bearbeiten dieser Textdatei mit einem stinknormalen Editor wesentlich einfacher, vorallem, wenn diese Datei in eine andere Sprache übersetzt wird.
Oder habe ich da einen Denkfehler?

cu
Manitu
-
Ich verstehe nicht, was du meinst. Aber mach es doch so, wie es dir am besten passt.