Stringtable
-
wär das nich n bissi umständlich?
da wärs ja noch einfacher textdateien zu verwenden
-
Das mit den DLL's will ich ja genau eben nicht. Pro Sprache eine Stringtable, das Prog ließt beim Start aus einer ini Datei welche Sprache der Anwender möchte und die Stringtable dieser Sprache soll dann geladen werden. Ich brauche also eigentlich nur den Befehl zum laden der jeweiligen Stringtable und wo ich sie laden muß (ich denk in InitInstance?!).
-
Ich denk nicht, dass das so einfach geht (ohne neu zu übersetzen). Du könntest allerdings pro Sprache einen festen Startwert für die Strings festlegen (1000, 2000, ...) und dann die eigentlichen Strings nur noch über deren Offsets laden. Beim Ändern der Sprache wird dann nur noch der Resourcenstartwert gesetzt, und du lädtst ab da die richtigen Strings. Du kannst dann in dem Fall aber wohl nicht mehr so bequem mit der Stringtabelle des VC arbeiten, sondern musst wohl von Hand die Resourcen bearbeiten.
-
Mit einer DLL für jede Sprache ist das viel besser. Einfach geil.
-
Sach ich ja eigentlich auch

-
Schade, dass sich die Stringtables nicht einfach auswählen lassen! Das mit den DLL's hab ich leider trotz FAQ nicht hinbekommen! Wenn mir das nochmal jemand genau erklären könnt würd ichs so machen, das wär echt super!
-
Eine ganz kurze Erklärung (ich hoff das funktioniert so):
Du lädst die entsprechende Dll mit LoadLibrary(). Den Rückgabewert von LoadLibrary() kannst du dann als HANDLE für LoadString() verwenden. Damit erhältst du dann die jeweiligen Strings in der entsprechenden Sprache.
-
Aber wie greife ich auf die Stringtable in der DLL zu? Und muß ich meine ganzen Dialoge in die DLL kopieren? Wenn ja wie?! Hat mir da jemand noch paar Tips?!
-
Ja genau, du erstellst alle deine Resourcen (Dialoge, Strings,...) in der Dll. Damit hast du dann wohl alles was irgendwie Strings enthält in einer Dll gekapselt.
Diese Dll lädst du dann z.B. beim Programmstart und speicherst dir den HMODULE der Dll (Rückgabe von LoadLibrary()). Diesen HMODULE verwendest du dann als HINSTANCE bei Aufrufen wie LoadString() oder DialogBox(). Damit lädt Windows dann die entsprechende Resource aus der Dll.Und Fertig

-
Aber ich hab doch meine gesamten Resourcen schon in der exe, da müßt ich ja alles nochmal erstellen! Reicht es denn nicht in der DLL die Stringtable mit den gleichen ID's wie in der exe zu erstellen und nur diese zu laden? Warum müssen die Resourcen denn nochmal erstellt werden, an denen wird doch eh nix geändert??!

-
-
Das hab ich mir schon mindestens zehnmal durchgelesen, nur leider bekomm ich es leider trotzdem net hin! Wie bekomm ich meine Resourcen in die DLL? Wo muß ich das Handle auf die DLL setzen? Fragen über Fragen...

-
Also ich habe jetzt eine DLL erstellt und einfach die resource.h und dir .rc Datei aus meinem Hauptprog in die DLL eingefügt. Jetzt hab ich also alle Dialoge usw. in der DLL. Aber wie greif ich jetzt auf die Resourcen in der DLL zu?? Hab folgendes probiert (siehe FAQ):
HINSTANCE hDll; hDll=AfxLoadLibrary("language.dll"); ASSERT(hDll); AfxSetResourceHandle(hDll);Leider kennt er aber AfxLoadLibrary() nicht! Muß ich da noch was includen?? Und wo muß dieses Codestück hin?? In InitInstance()??!
Wär echt super wenn mir jemand helfen könnte!Grüße Christian
-
Hi
~Christian schrieb:
Leider kennt er aber AfxLoadLibrary() nicht! Muß ich da noch was includen??
Jep, du musst MFC verwenden
("afxwin.h")Und wo muß dieses Codestück hin?? In InitInstance()??!
Wie du willst, am sinnvollsten wäre natürlich InitInstance()
Benutzt doch lieber die WinAPI Methode (=>LoadLibrary).
Leg eine Memberviable in deiner App Klasse an (Typ: HINSTANCE), dann kannst du von überall darauf zugreifen
Schreib in InitInstance z.B. soetwas:m_hInstance = LoadLibrary("LangDE.dll"); // einen String aus der Stringtable aus der DLL lesen und ausgeben char cMsgBoxText[50]; ::LoadString(m_hInstance, IDS_MSGBOX_TITLE, cMsgBoxText, 50); AfxMessageBox(cMsgBoxText);Grüße Rapha
-
Super, hat einwandfrei funktioniert! Jetzt hab ich nur noch ein Problem: Der Benutzer wählt im ersten Dialog die Sprache aus, alle anderen Dialoge erscheinen dann auch korrekt in der Sprache, sie werden ja auch erst danach geladen. Nur der erste Dialog behält immer die voreingestellte Sprache, da er ja schon geladen wurde. Ich müßte ihn also nochmal neu laden. Geht das irgendwie??!
-
Mach dir da doch kein Problem draus.
Mach einfach ein Dialog, wo der User auf die entsprechende Flagge des Landes klickt.
Lass einfach jede Spach-dll ein Bitmap exportieren, das die Flagge darstellt.Grüße Rapha
-
Das Problem ist halt dass der Dialog nicht nur zur Sprachauswahl dient sondern auch noch andere Dinge angezeigt werden!
-
Trotzdem ist es doch kein Problem, diesen Direkt aus der Dll zu laden, oder?
-
Habs hinbekommen, hab mir folgende Methode geschrieben:
void CSoftDlg::Textzuweisungen() { CString str; str.LoadString(IDD_DIALOG); this->SetWindowText(str); str.LoadString(IDC_TEXT1); GetDlgItem(IDC_BUTTON1)->SetWindowText(str); str.LoadString(IDC_BUTTON1); GetDlgItem(IDC_BUTTON2)->SetWindowText(str); usw. }Und diese ruf ich einfach in OnPaint() auf. Wenn eine andere Sprache gewählt wird ruf ich
this->Invalidate();auf und der Ihalt wird aktualisiert

-
Hm, das ist aber ein bisschen eine Systembremse

Jedes Mal, wenn OnPaint aufgeruft wird (glaub mir, das kommt normalerweise oft vor), greifst du auf die dll zu und setzt die Texte
Es reicht doch, wenn du den Code in eine Funktion packst und diese Funktion in InitDialog aufrufst
Grüße Rapha