SDI-Anwendung 2-sprachig



  • Hallo,
    habe eine -fast- fertige SDI-Anwendung mit vielen Dialogen (Unterdialogen) mit zahlreichen Steuerelementen.
    Die Anwendung wurde auf Englisch geschrieben. Jetzt hat sich im Nachhinein noch die Anforderung ergeben, diese Software auch in deutscher Sprache auszuliefern.
    Ein Sprachwechsel "on the fly" ist nicht notwendig.

    Wie setzt man so etwas am geschicktesten um?
    Welche Möglichkeiten gibt es da unter Visual Studio 6.0?

    Über jede Art von Tipps bin ich dankbar. 👍

    Gruss
    S.



  • Schau mal in der FAQ nach, da gibts nen eintrag.
    Du kannst ja die Sprachdaten in einer DLL auslagern und beim Starten der Anwendung laden...



  • Hallo,
    Danke für den Tipp. Habe den Eintrag gefunden und mal durchgelesen.
    Bin mit dll´s noch komplett unerfahren...werde es aber mal versuchen 😉
    Vielleicht klappts ja.

    Gruss
    S.



  • Hallo,
    vielleicht bin ich jetzt auch richtig auf dem Holzweg, aber...

    OK, ich muss also die Stringtable mit all den Elementen die ich momentan in meinen Dialogen habe ergänzen?!? ( Das ist ja schon mal ein großer Aufwand! )

    Dann irgendwie diese Sprach-DLLs erstellen und die Einträge "übersetzen".
    So weit richtig?!? 😕

    Erweitere ich nun meine Dialoge oder lösche irgendwelche Elemente (und deren IDs), dann muss ich die Stringtables auch manuell anpassen?!?!
    Sehe ich das richtig? 😕

    Ich hoffe einfach nur das ich irgendetwas -falsch- verstanden habe...weil das bedarf ja auch in Zukunft einem großen Pflegeaufwand.

    1 Element mehr bei 3-Sprachigkeit würde also (nach meinem momentan Verständnis) folgendes bedeuten:
    - ID in 3 STringtables hinzufügen und die Sprache entsprechend anpassen

    Weitere Frage:
    - Wie macht das dann am Geschicktesten mit Strings die in MessageBox angezeigt werden? CStrings als define in 3 Sprachen deklarieren und dann so aufrufen?

    Vielen Dank für Eure Hilfe.

    Gruss
    S.



  • Stefan H schrieb:

    Wie macht das dann am Geschicktesten mit Strings die in MessageBox angezeigt werden? CStrings als define in 3 Sprachen deklarieren und dann so aufrufen?

    Sowas muss dann auch in die Stringtables. Du kommst mit LoadString dran.
    Außerdem kannst du die ID direkt an AfxMessageBox geben:

    int AfxMessageBox( LPCTSTR lpszText, UINT nType = MB_OK, UINT nIDHelp = 0 );
    int AFXAPI AfxMessageBox( UINT nIDPrompt, UINT nType = MB_OK, UINT nIDHelp = (UINT) -1 );
    

    Es gibt (mind.) ein Programm, was dich die Dlls direkt übersetzen lässt. (Weiß nicht, ob ich es noch habe...)
    Der Resourceeditor ist aber bequemer.
    Außerdem musst du aufpassen, wenn ein Beschriftungstext in einer Sprache länger ist als in der, für die du den Dialog gemacht hast.



  • Hallo,
    erstmal Danke für die Tipps.
    Dann scheint wohl die Variante mit dem Resourceneditor doch ganz geschickt und verbreitet zu sein.

    Also, dann mal ran an die Sache.

    Vielen Dank und bis zum nächsten Problem. 😃

    Gruss
    S.



  • Hallo,
    wie weise ich denn jetzt den String aus der Stringtable zum Beispiel einem RadioButton (bzw. dessen Label) zu??!?

    // so funktionierts auf jeden Fall NICHT
    GetDlgItem(IDC_RADIO_TEST)->SetWindowText(LoadString(IDC_RADIO_TEST));
    

    So würde es zwar gehen, ist aber schon etwas umständlich

    CString strTest;
    strTest.LoadString(IDC_RADIO_TEST);
    
    GetDlgItem(IDC_RADIO_TEST)->SetWindowText(strTest);
    

    Das sollte doch auch irgendwie in einem Aufruf gehen, oder?

    Danke schon mal.

    Gruss
    S.



  • Ich weiß nicht so genau, aber schau mal bei SetDlgItemText() nach.

    EDIT: Oder du schreibst:

    GetDlgItem(IDC_RADIO_TEST)->SetWindowText(strTest.LoadString(IDC_RADIO_TEST));
    


  • Hi,
    Danke für den Tipp.
    Die beiden Möglichkeiten hatte ich auch schon ausprobiert...aber leider ohne Erfolg.

    SetDlgItemText(IDC_RADIO_LOAD_FROM_INI, ((LPCTSTR) str.LoadString(IDC_RADIO_LOAD_FROM_INI)));
    

    Trotz vieler Casts und Klammersetzerei habe ich es noch nicht geschafft....aber irgendwie muss das wohl schon zu schaffen sein, oder?

    Die ausführliche Methode wäre auf Dauer schon nervig. 😮

    Danke nochmals und vielleicht hat ja noch jemand nen Tipp.

    Gruss
    S.



  • Schreib dir doch eine kleine Funktion. 🙂

    void CDerDialog::SetControlText(UINT nCtrl, UINT nString)
    {
        CString strText;
        strText.LoadString(nString);
        CWnd* pWnd = GetDlgItem(nCtrl);
        ASSERT(pWnd);
        if (pWnd)
        {
            pWnd->SetWindowText(strText);
        }
    }
    

    Der Aufruf ist dann ein Einzeiler:

    SetControlText(IDC_RADIO_LOAD_FROM_INI, IDC_RADIO_LOAD_FROM_INI);
    

    Falls die IDs immer gleich sind, kannst du das ja nochmal vereinfachen. 🙂



  • Danke estartu_de für den Tipp.
    Genau so werde ich es jetzt machen wenn ich meine Augen mal aufbekomme. 🙄
    Dann mal noch einen schönen Tag.

    Gruss
    Stefan


Anmelden zum Antworten