Multilingualität



  • Hallo zusammen,

    ich muss eine Software für mehrere Sprachen schreiben und da dachte ich, ich frage mal wie man das am besten löst. Ich habe keine Ahnung wie das gehen soll mit möglichst kleinem Aufwand natürlich. Die Wörter sollen alle in einem Eigenen File stehen a la "Datei = File" damit sich ein Übersetzer an die Sache machen kann. Danke für eure Vorschläge!



  • Die Sache ist nicht ganz so einfach. Als erstes mußt Du für alle Strings, die Du irgendwo innerhalb des Quellcodes zuweist (z.B.: Label1->Caption = "Mein Programm") in einer Recourcendatei erfasst werden:

    Beispieldatei (*.rc):

    #include "prgstrings.rh"
    
    STRINGTABLE
    {
        IDS_PROGRAMMNAME,     "Mein Programm"
        IDS_DATABASEVERSION,      "MySQL V2.0"
    }
    

    und die dazugehörige *.rh:

    #if !defined(__prgstrings_rh)
    #define __prgstrings_rh
    
    #define IDS_PROGRAMMNAME     1000 //Res-ID
    #define IDS_DATABASEVERSION  1001
    
    #endif
    

    Die *.rh muss in die jeweilige Unit eingebunden werden, die *.rc unter Projekt->Projektverwaltung.

    Mit LoadStr() kann dann über die ResIds der entsprechende Resourcenstring geladen werden.

    Label1->Caption = LoadStr(IDS_PROGRAMMNAME);
    

    Das ganze kann dann mit dem Translation Manager mehr oder weniger komfortabel übersetz werden. Es werden dann für jede Sprache getrennte Resourcen-Dlls erstellt was beim ungeübten Programmierer schon für einigen Fasching sorgt.

    [ Dieser Beitrag wurde am 13.06.2003 um 14:25 Uhr von F98 editiert. ]



  • #endif nicht vergessen!



  • ODer geh auf torry.net und lad die das janlanguage runter. Da kannst du die Sprachen per .lang ändern und der User kann dann auch hin, weitere Sprachen hinzubinden...



  • Danke F98, so funktionierts einwandfrei 🙂



  • Ejo. Bidde. 😃



  • Jetzt hab' ich doch noch eine Frage, wie wechsle ich dann von einer Sprache zur anderen zur Laufzeit? Müssen alle Sprachen im selben File (*.rc) platziert werden?



  • Der Translation Manager beim BCB erstellt für jede Sprache in der Regel ein extra Projekt (z.B. Unterverzeichnisse für Deutsch "DEU", Englisch USA "ENU" usw.). Wie man einem Prg. zur Laufzeit beibringt eine andere Resource zu laden und alle Strings auszutauschen ... hm 😕

    Vielleicht wissen die andern Experten hier was genaueres.



  • Also der BCB hat bei mir gar kein Unterverz. erstellt... *hmm*
    Ich habe mein Test-Projekt mal unter www.rideon.ch/public/language test.zip ztur Verfügung gestellt.Vielleicht kannst du s da was ändern... *who knows*



  • 1. __pmfs_strings_rh in __prgstrings_rh umbenennen
    2. Zum Translation Manager: siehe meine Seite unter "Multilanguage Applikationen"



  • Wo steht denn __pmfs_strings_rh ?



  • *nachobenschieb*



  • Um deine Lösung mal fertig zu mache. Siehe mein Post oben "<DJ BlackEagle>":
    ODer geh auf torry.net und lad die das janlanguage runter. Da kannst du die Sprachen per .lang ändern und der User kann dann auch hin, weitere Sprachen hinzubinden...



  • für __pmfs_strings_rh siehe *.resourcen-header Datei ganz oben *ditsch* 🙄



  • @dj blackeagle

    warum denn immer auf krampf fremde komponenten verwenden? so lernt man doch nix beim programmieren!



  • Ich hab mir stumpf ne Paradoxtabelle mit den ganzen Sprachen erstellt(jede zeile ein Wort, so 5000 insgesamt, und für jede Sprache ne Spalte), nen vernünftigen Editierer dazu gebaut und die dann mit dem Programm verdratet.

    Ich hatte da noch keinen Ärger damit, kann innerhalb von 1 Sekunde die Sprache wechseln und wenn mal eine Sprache dazukommen soll klappt das ohne das ich was dazu beitragen muss.



  • Wieso muss man dazu mit resourcen arbeiten?
    Reicht es nicht, wenn ich die Strings via #define in irgendeinem header ablege und dann die verschiedenen Projekte kompiliere?
    Oder noch anderster: einfach eine INI auslesen zu beginn?



  • geht schon, machen auch viele........ nur wird irgendwann zuviel Arbeit.
    Bei Programmen mit wenig Text wie Winamp oder so würd das ohne weiteres gehen, aber bei mehr Text produziert der Übersetzer mehr Fehler als er Worte übersetzt oder weigert sich gleich ganz 😛



  • ich würds anders machen.

    1. ne Datei erstellen die in etwa so aussieht:

    Parent ; Control ; Deutsch ; Englisch  ; Französisch ; 
    -------------------------------------------------------------------
    Panel1 ;  Label1  ; Kunde   ; Customer  ; Client
    

    Die ersten zwei Spalten dienen dir zur Identifizierung die anderen für die Sprachwahl:

    enum TSprache {DEUTSCH=3,ENGLISCH=4,FRANZOESISCH=5};
    

    Daraus baust du ne Kompo und überschreibst den Komponenteneditor und/oder den Propertyeditor. Machst ein Eigabeformular, wo der Anwendungsentwickler die Daten einhacken kann. Ausserdem eine Eigenschaft vom Typ TSprache publishen.

    Diese Kompo zieht der Entwickler auf ein Formular und per doppelklick kommt er in die Eingabemaske. Er kann nun zur LAufzeit und entwurfszeit die Sprache umstellen.

    Die Komponete muss, sobald dass Formular geladen wird ( Loaded der Kompo) oder wenn die Sprache umgestellt wird, die Inhalte der in "Control" angegebenen Steuerelemente ändern.

    Bequemer gehts kaum...



  • Original erstellt von dreaddy:
    Ich hab mir stumpf ne Paradoxtabelle mit den ganzen Sprachen erstellt(jede zeile ein Wort,

    ...nur kommst du mit einzelnen Worten nicht weit, denn nicht überall sind die Satzstellungen wie im deutschen. Ich persönlich bevorzuge das Verwenden ganzer Sätze als Sprachresource. Müssen darin noch werte ausgegeben werden hilft AnsiString::sprintf herrlich weiter.

    Der Vorteil dabei ist ganz klar, dass der Übersetzer auch die Übersetzungen optimal an den Zweck anpassen kann. Wenn er nur jedes Wort übersetzen muss, kann das zu Problemen führen (Mehrdeutigkeit eines einzelnen Wortes)

    -junix

    [ Dieser Beitrag wurde am 18.06.2003 um 08:48 Uhr von junix editiert. ]


Anmelden zum Antworten