Announcement

Collapse
No announcement yet.

Mehrsprachige Anwendung schreiben

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Mehrsprachige Anwendung schreiben

    Hallo @all,

    ich versuche derzeit eine Applikation mit Borland C++Builder 6 Pro mehrsprachig zu gestalten. Über den Resourcen-Dll-Experte und "External Translation Manager" habe ich auch alle Resourcen soweit übersetzt und kann sie zur Laufzeit beliebig umstellen. Soweit so gut!

    Nun habe ich aber auch feste Strings (z.B. in MessageBoxes) in meiner Applikation und möchte den Text dort ebenfalls in die Sprach-Dlls bekommen. Und daran scheitere ich gerade!

    Darum die Frage:
    (Wie) Kann ich "hard-coded Strings" dynamisch machen?

    Die Anwendung soll soll nicht in "exotischen" Sprachen funktionieren. Deutsch <--> Englisch ist völlig ausreichend!

    Wäre echt super, wenn mir einer von euch Experten weiterhelfen könnte!

    MfG
    Andreas

  • #2
    Du müsstest die Texte als ressourcestring in deinen Units definieren.

    Schau dir aber mal GNU Gettext an. Ist m.e. ein besserer Ansatz.

    Comment


    • #3
      Hallo Bernhard!

      Vielen Dank für die schnelle Antwort.

      Mit den Ressourcenstrings habe ich mich zwar schon einmal versucht, aber leider ohne Erfolg. (Oder besser: Mit dem Erfolg, dass ich leere Strings bekomme, wo vorher schon mal was drin stand!)

      Was hat es mit dem GNU Gettext auf sich? Kann ich das im BCB6 einbinden? Hab mir die Site mal angeschaut, werde aber - um ehrlich zu sein - nicht so recht schlau daraus!

      Comment


      • #4
        Manual für GNU Gettext

        Comment


        • #5
          Vielen Dank! Aber damit komme ich leider auch nicht weiter!

          Ich würde gerne die ganze Sache so aufziehen, dass ich eine Sprachdatei (z.B. Deutsch.lng oder Deutsch.dll) erstellen kann und aus dieser alle Texte herausholen kann. Gibt es da nicht irgendeine Möglichkeitkeit, dies auch ohne eine zusätzliche Software zu erreichen? Ich meine, man muss doch in C so etwas auch selbst programmieren können?!

          Comment


          • #6
            Hallo nochmal!

            Ich habe noch ein bisschen experimentiert und habe mir eine Datei "Sprache.pas" mit folgenem Inhalt erzeugt:

            Code:
            unit Sprache;
            
            interface
            
            uses Windows;
            
            resourcestring
              SInfobox = 'Dies ist ein Nachrichtenfenster';
            
            implementation
            
            end.
            Diese habe ich meinem Projekt hinzugefügt und alles neu erstellen lassen. Heraus kam eine "Sprache.hpp", die ich wiederum in meinem Hauptfenster implementiert und anschließend mit dem Translation-Manager in meine Sprachen übersetzt habe.

            Nun möchte ich einfach per Button eine Message-Box anzeigen lassen, wo der Text entsprechen der Sprache ausgegeben wird.

            Problem:
            Code:
            void __fastcall TForm1::Button2Click(TObject *Sender)
            {
                Application->MessageBoxA( Sprache_SInfobox.c_str(), "Info", MB_ICONINFORMATION | MB_OK );
            }
            Der Compiler nimmt die Variable "Sprache_SInfobox" (die in der Sprache.hpp definiert wird!) zwar als AnsiString an und meckert nicht, doch wenn ich das Programm laufen lassen ist meine MessageBox leer!

            In der entsprechenden ..\DEU\Programmname.rc steht der Text richtig drin. Doch in der ..\Programmname.DEU ist er nicht enthalten!

            Was mache ich falsch?

            Comment


            • #7
              Hi,

              warum machst Du es nicht mit einer DLL? Darin baust Du dir einen Multilingualen Vektor auf, aus dem Du den entsprechenden Text zur Runtime ausließt.

              Dieter

              Comment


              • #8
                Hallo Dieter,

                vielen Dank für deine Antwort. Diesen Weg (oder zumindest einen ähnlichen!) habe ich heute einmal ausprobiert und sogar mit Erfolg.

                Das Programm, das ich eigentlich übersetzen möchte ist allerdings relativ groß und hat demnach viele Labels,...! Wenn ich das mit dem Translation Manager hinbekommen würde, fände ich das sehr vorteilhaft. Außerdem würde ich mir sehr viel Code sparen, da ich ja nur noch
                Code:
                if( LoadNewResourceModule( GERMAN ) )
                    ReinitializeForms();
                else if( LoadNewResourceModule( ENGLISH ) )
                    ReinitializeForms();
                aufrufen muss und der Rest passiert von alleine! Fände ich persönlich die elegantere Lösung. Oder habe ich mein Testprojekt mit der DLL nur so kompliziert aufgebaut und DEIN Vorschlag wäre NOCH einfacher?

                MfG
                Andreas

                Comment

                Working...
                X