Label- und Caption-Texte dynamisch vergeben?



  • Hallo zusammen,

    ich habe jetzt schon einige Zeit, vor allem hier im Forum gesucht, aber leider nichts wirklich passendes gefunden. Es geht mir um die Möglichkeit die Label- und Caption-Texte der GUI-Komponenten eines Programmes aus z.B. einer Resource-Datei zu lesen. Soll heisen, wenn ich die GUI mit dem VCL-Designer erstelle und dort dann auch gleich die Buttons, Labels usw. beschrifte, ist die Text ja fest gegeben.
    Wie kann ich es anstellen, das ich z.B. den Anwender die Möglichkeit gebe, auch Englische Buttons, Labels usw. zu bekommen. Kann ich in den Caption- bzw. Text-Eigenschaften evtl. "Variablen" einfügen und diese dann zur Laufzeit des Programmes aus einer Resource-Datei lesen? Bzw. gibt es dafür eine Funktion, oder müsste ich das dann selbst "mit der Hand am Arm" schreiben.

    Vielen Danke schonmal,

    Grüße Netzschleicher



  • Netzschleicher schrieb:

    Wie kann ich es anstellen, das ich z.B. den Anwender die Möglichkeit gebe, auch Englische Buttons, Labels usw. zu bekommen.

    Zwei Schritte:

    1. Du verwendest im Form-Designer und im Code nur Englisch, damit du später keine Encoding-Probleme hast.
    2. Du benutzt dxgettext, machst eine deutsche Übersetzung aller Strings und bekommst eine multilinguale Anwendung, ohne daß du groß etwas dafür tun müßtest.

    Alles, was du dazu wissen mußt, findest du auf der dxgettext-Seite.



  • Hallo audacia,

    hab mir gestern Abend noch das 'dxgettext' angeschaut. Das hantiert ja mit .po und .mo Dateien. Diese habe ich schon bei verschiedenen Open-Source Programmen gesehen. Schaut eigentlich ganz gut aus und mit dem PO-Editor könnte ich ja die ganzen Texte recht bequem ändern.
    So wie es ausschaut scheint das die einzige Möglichkeit zu sein. Hatte gedacht
    es gibt da noch im C++ Builder noch eine eigene Funktion dafür.

    Ich werde 'dxgettext' auf jeden Fall mal im Auge behalten.

    Grüße Netzschleicher



  • Netzschleicher schrieb:

    Hatte gedacht es gibt da noch im C++ Builder noch eine eigene Funktion dafür.

    Es gibt, je nach Version und Edition, das ITE (Integrated Translation Environment). Ich persönlich hatte weniger Probleme mit dxgettext, aber du kannst es ja mal probieren.



  • Meinst Du den 'Translation Manager' ?

    Ich hab hier ein RAD Studio 2007 Enterprise, und da gibt es sowas. Leider scheint dieser 'Translation Manager' nur bei Delphi-Projekten zu funktionieren. Oder hab ich da in bezug auf den C++Builder etwas übersehen ? 😕 😕 😕



  • Hallo,

    Vergiss bitte den integrierten Translation Manager. Das Ding ist ein Krampf.
    Halte dich an audacias Rat.



  • Netzschleicher schrieb:

    Ich hab hier ein RAD Studio 2007 Enterprise, und da gibt es sowas. Leider scheint dieser 'Translation Manager' nur bei Delphi-Projekten zu funktionieren. Oder hab ich da in bezug auf den C++Builder etwas übersehen ?

    Nein. Ich schrieb ja "je nach Version und Edition", und soweit ich weiß, funktioniert ITE im C++Builder 6, dann aber erst wieder ab C++Builder 2009, und ob es immer Bestandteil der Professional-SKU war, weiß ich auch nicht.

    Braunstein schrieb:

    Vergiss bitte den integrierten Translation Manager. Das Ding ist ein Krampf.

    So könnte man es auch sagen 😉

    Die grundsätzliche Idee hinter dem ITE ist durchaus nicht schlecht. Es gibt verschiedene kommerzielle 3rd-Party-Lösungen, die darauf aufbauen und eine komfortable Arbeit damit ermöglichen. Wenn du Geld ausgeben willst, auf Support wertlegst oder möglichst gute Tools haben willst, dann ist so etwas vielleicht das Richtige für dich. Falls aber nicht, so empfehle ich dxgettext.



  • Ich hab mir mal mein Rad Studio nochmal in einer VM installiert und ein wenig mit dem Translation Manager herumprobiert, aber ganz so richtig durchgekommen bin ich nicht damit.
    Ich hab dann in der VM mal 'dxgettext' installiert und wollte das Beispiel Cpp-Projekt kompilieren, dabei bekomme ich leider immer 2 Fehler:

    [BCC32 Fehler] gnugettext.hpp(392): E2040 Deklaration nicht ordnungsgemäß abgeschlossen
    [BCC32 Fehler] gnugettext.hpp(393): E2040 Deklaration nicht ordnungsgemäß abgeschlossen

    in folgenden Zeilen:

    static const Shortint LOCALE_SISO639LANGNAME = 0x59;
    static const Shortint LOCALE_SISO3166CTRYNAME = 0x5a;
    

    Hab ich noch irgendetwas vergessen bei der Installation von 'dxgettext' ?



  • Habs gelöst. Hier im Forum wurde das Problem vor ziemlich genau 1 Jahr schonmal angefragt. audacia hat damals das Problem beschrieben. Hab daher einfach die beiden "Fehlerhaften" Zeilen auskommentiert.

    Nun muß ich nur noch finden wie ich die verscheidenen Sprachen anwählen kann. 🙂



  • So, hab jetzt ne ganze Weile mit 'gettext' hin und her probiert. So ganz warm bin ich noch nicht damit. Vor allem weil das Tools doch scheinbar nicht alle Stringresourcen in einem C++ Programm findet.
    Gibt ja dazu auch schon einige Treads hier im Forum. Was ich auf jeden Fall nicht sehr schön finde, ist die anzulegende Verzeichnisstruktur für die .mo-Files.
    Gibt es denn eine Möglichkeit einfach nur ein Unterverzeichnis mit z.B. dem Namen 'languages' anzulegen und dort dann alle .mo-Files (also z.B. Germany.mo , English.mo usw.) abzulegen und zu verwenden?



  • Netzschleicher schrieb:

    So, hab jetzt ne ganze Weile mit 'gettext' hin und her probiert. So ganz warm bin ich noch nicht damit. Vor allem weil das Tools doch scheinbar nicht alle Stringresourcen in einem C++ Programm findet.

    Obwohl du deine Strings mit gettext("mystring") umgibst?

    Netzschleicher schrieb:

    Was ich auf jeden Fall nicht sehr schön finde, ist die anzulegende Verzeichnisstruktur für die .mo-Files.
    Gibt es denn eine Möglichkeit einfach nur ein Unterverzeichnis mit z.B. dem Namen 'languages' anzulegen und dort dann alle .mo-Files (also z.B. Germany.mo , English.mo usw.) abzulegen und zu verwenden?

    Es gibt in der dxgettext-Distribution irgendein Tool, das die ganze Verzeichnisstruktur als Ressource in deine Executable integriert.



  • So, hab jetzt das 'gettext' Tool nochmals mir mit Nachdruck richtig angesehen, und auch ausser dem C-Beispiel noch eine eigene kleine Testanwendung erstellt mit zwei Fenstern und diversen Buttons, Labels, Edits usw. ... und es funktioniert prima.

    Den hier im Forum genannten Fehler mit den beiden 'static const' deklarationen konnte ich auch beheben, indem in die betreffenden Zeilen in der GNUgettext.pas auskommentiert habe. Ebenso habe ich die Verzeichnisstruktur auch durch eine kleine Änderung in der GNUgettext.pas auf '/locale/de , /locale/en usw' anpassen können. Und den Namen der .mo-Dateien konnte ich dort auch von 'default' auf einen anderen Ändern.

    Passt prima, vielen Dank für den Tipp mit 'dxgettext'. 🙂 🙂 🙂


Anmelden zum Antworten