Multilingualität
-
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. ]
-
man muss das ja nicht auf Wörter beschränken. Ganze Texte gehen ja auch. Man muss sich nur auf ein Seperator einigen.
Ich war nur zu faul zum tippten
-
@Andreas: Was machst du mit den Texten aus den MessageBoxen, den Texten die einem Label zugewiesen werden und den diversen anderen Ausgabetexten? Die fallen da doch irgendwie aus deinem System raus?
-junix
**<edit>**Hatte mich oben auf dreaddys Lösung bezogen (o; Hatte deinen Post noch nicht gesehen als ich das getippt hatte (o; Deshalb hab ich das Zitat anschliessend reineditiert (o:
Die Frage hier würde mich allerdings noch interessieren.</edit>
[ Dieser Beitrag wurde am 18.06.2003 um 08:52 Uhr von junix editiert. ]
-
ok,
Parent ; Control ; Deutsch ; Englisch ; Französisch ; ------------------------------------------------------------------- Panel1 ; Label1 ; Kunde ; Customer ; Client ; NULL ; Msg1 ; irgendwas auf Deutsch; irgendwas auf englisch; irgendwas auf franz.;
String Kompo::GetValue(String IndexName, TSprache sprache) { // hier suchen nach IndexName zum Beipsiel =" Msg1" und die spalte Sprache zurückgeben }
dann anstatt Hartkcodiert sowas schreiben:
ShowMessage(Kompo1->GetValue("msg1",ENGLISCH));
[/cpp]
-
ich glaube ich bin wirklich blind, ich sehe das __pmfs_strings_rh nirgends im code *grr*. in der ressource datei steht bei mir nur folgendes:
:((((((((( #include "prgstrings.rh" STRINGTABLE { IDS_PROGRAMMNAME, "Mein Programm...:)" IDS_DATABASEVERSION, "TEST" }
-
Ich hab halt fast nur Worte im Programm weil das nach dem Schema
Wert1: 123
wert3: 14.3.2009
abläuft und nur wert1, wert2 usw Sprachenabhängig sind.Aber die paar ganzen Sätze wie Fehlermeldungen, Titel usw hab ich natürlich ganz eingetragen
sind halt aber nur 5%
-
[ Dieser Beitrag wurde am 19.06.2003 um 10:14 Uhr von roN editiert. ]
-
Original erstellt von roN:
[...] in der ressource datei [...]Deshalb sprach man auch ausdrücklich vom Resourcen Header (prgstrings.rh) (o;
-junix
-
Hallo,
eine weitere Möglichkeit um so etwas ohne viel Codierung zu realisieren ist die Verwendung der Eigenschaft "Tag", welche fast alle VCL-Componenten besitzen, da sie bereits mit TControl eingeführt wird.
Also braucht man nur eine Datei (ASCII, Datenbank, ???):
Tag; Deu ; Eng ; ...
1 ; "deutscher Text"; "engliche Übersetzung"; ...
2 ; "deutscher Text"; "engliche Übersetzung"; ...Wobei der Tag jeder Componente die eine Beschriftung hat einfach im OI auf eine eindeutige ID gesetzt wird, die dann in der Datei eingetragen wird.
Jetzt noch eine Funktion mit TForm als Parameter,
__fastcall ChangeLang(TForm *AForm)
{
}- in der alle Controlls des übergebenen Forms durchlaufen werden,
- einen TypeCast auf die verschiedenen Typen um die Eigenschaft Caption, bzw. Text zu bestimmen,
- den Tag auslesen und wenn > 1,
- die entsprechende Eigenschaft (Caption, Text) mit dem Text aus der Datei beschreiben.
Natürlich noch eine Variable die, die aktuell gewählte Sprache setzt und vielleicht noch eine kleine Funktion um einen Zeilenumbruch in den zurückgegebenen String einzubauen oder um einen String sprachspezifisch direkt über die Angabe der ID zu ermitteln.
Danach reduziert sich der Mehraufwand gegenüber der direkten Eingabe des Strings im Objektinspector darauf, das ich einen Tag eintrage und den String, in einem eigenen Editor, in der Datei und nicht im Objektinspektor editiere.
Das System hat sich bis jetzt super bewährt.
Gruß Mikel
[ Dieser Beitrag wurde am 19.06.2003 um 13:23 Uhr von Mikel editiert. ]
-
Eine feine, saubere Sache!
-
Noch ein Link zum Thema:
http://www.chaho.de/start/Startseite.htmUnter Tutorials->Multilanguage