Multilanguage durch verschiedene Ressourcen



  • 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_COPY
    

    Keine 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.


Anmelden zum Antworten