Ausgaben in zwei verschiedenen sprachen
-
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; //...
-
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 duhello_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