Wie kann man die Sprache der Dialogelemente zur Laufzeit umändern???



  • Hi,

    ich hab ein Programm (mit VS Embedded geschrieben), dass sämtliche Dialogelementbezeichnungen aus einer Stringtable liest. In dieser Stringtable stehen alle im Programm verwendeten Strings als Resourcen drin (Die Sprache ist hier Englisch)...

    Im Programm wird nun eine Buttonbeschriftung ungefähr so erzeugt:
    myButton.SetWindowText(LoadString(IDS_SOME_STRING));

    ====>soweit so gut....jetzt wollte ich das Programm mehrsprachig machen. Rein von der Vorstellung her, hab ich gedacht, es funktioniert so, dass man einfach im Ressourceneditor eine zweite Stringtable erzeugt und dort die selben Stringresourcen (also die selben IDs) einfügt und dann halt einfach die Stringinhalte in ne andere Sprache übersetzt...dann müßte man nur noch irgendwann im Programm sagen, welche Stringtable man benutzen will....

    if Deutsch
    Lade deutsche Stringtable
    else
    Lade Englische Stringtable

    -------------------------------------------------------------------------------
    Würde es so ungefähr gehen?? Ich hab nämlich festgestellt, dass ich gar keine zweite Stringtable erzeugen kann...Wenn ich im Resourceneditor auf Insert Stringtable gehe, passiert gar nichts - Es ist immer noch nur die bereits vorhandene Table sichtbar....:(....

    Und überhaupt, wie würde man dann zur Laufzeit die andere Stringtable reinladen können bzw. sage, dass man sich ab jetzt nur auf diese bezieht...???

    ===>Hat jemand ne Ahnung, wie man hier prinipiell vorgeht??....evtl. mit codebeispielen?

    BESTEN DANK!



  • Lies dir mal diesen Artikel im Magazin durch - das dürfte helfen 😉



  • Hey,

    danke....der Artikel ist spitzenmäßig!!!!

    Aber, jetzt steh ich vor dem nächsten Problem....meine bestehende Resourcendatei aus der EXE ist recht groß....wie kann ich die denn jetzt in eine der neu erstellten dlls kriegen??....Gibts da vielleicht sowas wie ein import??...

    Ansonsten bleibt mir whl nix anderes als mühsam die Stringtables abzutippen oder wie???...



  • Du könntest die .rc Datei in deinem Projekt kopieren und in das neue Projekt einfügen. Alles was du nicht brauchst kannst du dann raus schmeißen.



  • Hallo

    nochmal eine kleine Frage zu diesem Thema....das klappt alles wunderbar...nur hab ich jetzt so ein bissl Performanzprobleme (die GUI flackert ein bissl, wenn sie oft aktualisiert wird...)...das liegt vor allem an folgendem...

    Ich habe eine Klasse StringLocalizer geschrieben, die das ganze LoadDll und LoadString kapselt. Es gibt hier z.b. die Methode
    CString getStringRes(unsigned long resourceID)
    , der man eine ID zu der Stringressource übergibt.

    Die Dialoge rufen also für jedes Dialogelemeent z.b.
    myButton.SetWindowText(localizer.getStringRes(IDS_TEXT_FOR_BUTTON));

    Ok, soweit so gut....in der Methode getStringRes() passiert jetzt das ganze LoadDll -, LoadString- und FreeLibrary-zeug...und das, kann ich mir vorstellen, geht doch ziemlich auf die Performance, wenn für jedes Dialogelement erstmal die Dll geladen werden muss und danach wieder freigegeben werden muß...

    Kann man nicht ganz zu Beginn des Programms die Dll laden und erst ganz am Ende wieder freigeben???? Bei mir kriege ich da Assertions....:(

    *******Code der Methhode getStringRes()
    CString getStringRes(unsigned long resourceId){
    HINSTANCE hDll, hExe;

    //hole Dll
    hExe = AfxGetResourceHandle();
    hDll = AfxLoadLibrary("english.dll");

    //lade string
    CString str;
    str.LoadString(resourceId);

    //gib dll wieder frei
    AfxSetResourceHandle(hExe);
    AfxFreeLibrary(hDll);

    return str;
    }

    DANKE für jeden Hinweis...



  • Doch sollte eigentlich gehen. Du musst dir nur das Handle für die DLL Datei das du nach dem öffnen hast aufheben und für deine Funktionen die dies benötigen zugänglich machen. Wenn das Programm beendet wird kannst du die DLL Datei wieder freigeben.


Anmelden zum Antworten