Ausgaben in zwei verschiedenen sprachen



  • geschlossen



  • Du schreibst dir ein File (am besten ein File, was so aufgebaut ist wie ein ini-File, dann suchst du dir eine Bibliothek, die die bequem für dich verwalten).
    Das File kann bspw wie folgt aufgebaut werden:

    menuButton1=Spiel starten
    menuButton2=Optionen
    menuButton3=Spiel beenden
    
    menuButton1=Start game
    menuButton2=Options
    menuButton3=Quit
    

    Dann lädst du den entsprechenden Text, speicherst ihn in Variablen und gibst ihn aus:

    //---
    std::cout << names[MENU_BUTTON_1] << std::endl;
    std::cout << names[MENU_BUTTON_2] << std::endl;
    //...
    


  • Nur ein Vorschlag:

    Definiere string-Varibalen für die Ausgaben und initialisiere sie dann entsprechend der Sprachauswahl.

    string Antwort1, Ausgabe3, .....
    // hier die Sprache auwählen lassen
    
    if (franz==false)
    {
    Antwort1 = "Deutsche Antwort";
    Ausgabe3 = "Bitte druecken Sie ...";
    }
    else
    {
    Antwort1 = "Franz Antwort";
    Ausgabe3 = "......";
    }
    
    // und später im Programm gibst du nur die Strings aus
    
    cout << Antwort1 << endl;
    //...
    

  • Mod

    wisnia schrieb:

    Wie mache ich dies am besten?

    Hier gibt es mehrere Teilprobleme:
    1: Die Worte an sich müssen anders sein.
    Lösungsansatz: Die Ausgabe der Wörter wird abstrahiert. Anstatt "Hallo Welt" gibst du hello_world_message[current_language] aus, welches vorher irgendwo sinnvoll gefüllt wird.
    2: Darstellung von Zahlen und ähnlichem ist anders.
    Lösungsansatz: Dies wird mittels der locales direkt auf Sprachebene unterstützt.
    3: Grammatik ändert sich. Das heißt, die Position und möglicherweise sogar die Reihenfolge von dynamisch generierten Werten im Text ändert sich.
    Lösungsansatz:
    printf oder besser eine printf-artige Ausgabefunktion benutzen (z.B. mit C++11 variadic templates oder was fertiges von boost)
    4: Du musst damit rechnen, dass Unicode statt ASCII benutzt wird
    Lösungsansatz: Wird auch direkt auf Ebene der Standardbibliothek unterstützt, man muss bloß dran denken
    5: 1,2,3,4 ist sehr viel Arbeit und wahrscheinlich habe ich was wichtiges vergessen.
    Lösungsansatz: Google bemühen, ob es da fertige Bibliotheken gibt. "ICU" ist ein Name, den ich in dem Zusammenhang schon einmal gehört habe, Boost hat mindestens was für ein paar der Teilprobleme. Aber ich bin da nicht der Experte und Google kannst du auch selber nutzen.
    Lösungsansatz:

    Ist es sehr kompliziert?

    Wenn du das alles selber machen willst: Ja, sehr. Wenn du dir helfen lässt: Vermutlich mäßig.



  • geschlossen



  • Da sich die Anzahl von Menü- und Textelementen normalerweise bei kleineren Anwendungen in Grenzen hält, bietet sich hier an, beide Versionen gleich in den Quellcode aufzunehmen und nicht in einer Datei aufbewahren. Vorschlag:

    #include ...
    
    std::map<std::string, std::pair<std::string, std::string> >
    

    Wie du den Inhalt der Container ansprichst, findest du in ihrer Dokumentation.
    Allerdings musst du immer für die richtige Ausgabe der Umlaute sorgen ➡ http://www.c-plusplus.net/forum/39326-full und Google



  • wisnia schrieb:

    2. ist printf nicht eher für C? Und nicht für C++?

    Geht auch in C++. Er schrieb aber auch dazu, lieber etwas ähnliches zu benutzen. Also so etwas wie printf, wo die Ausgabe zur Laufzeit formatiert wird, statt wie bei C++-Streams zur Compilezeit, aber typsicher.



  • Mir tigerte auch einmal die Idee im Kopf herum, die Entwicklersprache im Quelltext zu verwenden und die String-Literale selber als Hashes für den lokalisierten Lookup zu verwenden. Bräuchte natürlich irgendeine Form von Synchronisation, wenn man einmal die Literale im Source-Code ersetzt. Das ist natürlich schwer umzusetzen. Dafür sieht der Entwickler im Quelltext, welcher Text dort sinngemäß erscheint und muss nicht erst einen externen string-table konsultieren.



  • Das ist nicht sehr praktikabel. Schon die Korrektur eines falsch gesetzten Kommas in der Quellsprache macht das Prinzip zunichte. Lieber sprechende, aber fixe Bezeichner nehmen. "{Bitte_Taste_A_Drücken}" versteht man wunderbar ohne Lookup.



  • @Decimad: Qt macht so was.



  • geschlossen



  • geschlossen



  • Abgesehen davon, dass die Sache mit dem [ini-]File optional ist und für ein kleines Progrämmchen vielleicht zuviel des Guten, ist der Vorschlag vernünftig. Nimm doch eine map<string, map<string, string>> und pack dort deine Texte rein:

    std::map<std::string, std::map<std::string, std::string>> texts;
    [...]
    texts["english"]["hallo"] = "Hello world!";
    texts["deutsch"]["hallo"] = "Hallo, Welt!";
    [...]
    std::string sprache = "deutsch";
    std::cout << texts[sprache]["hallo"];
    

    Mit dem neumodischen C++11 geht das bestimmt auch noch schöner.



  • geschlossen



  • Bei kleinen Programmen geht das, aber bei großen oder auf Hauptschleifen basierenden Programmen, musst du das für jeden auszugebenden String machen oder direkt zwei Schleifen machen, da ist dann der Aufwand zu groß.



  • geschlossen



  • geschlossen


Anmelden zum Antworten