Mehrsprachigkeit durch String Tables

Beginnerin

Mitglied
Hallo,

ich muss mein Programm mehrsprachig machen.
Ich verwende VC++6.0 und hab über den Assistenten eine dialogbasierte MFC Anwendung erstellt.
Ich weiß bereits, dass es String Tables gibt und dass man die irgendwie laden können muss.
Wenn ich allerdings im Ressourcen- Editor nachsehe, finde ich derzeit nur zur "About"-Dialogbox einen Eintrag.
Kann ich denn eine solche String-Tabelle generieren lassen?
Oder muss ich jetzt für jede ID den deutschen Titel per Hand einfügen? Dass ich die zweite Tabelle dann manuell machen muss ist klar, aber die deutsche müsste auch so zu erzeugen sein, oder? :confused:

Wie generiere ich also die deutsche String Table?

Vielen Dank bereits für die Antwort!! :)
 
Bei der Realisierung von Mehrsprachigkeit basierend auf den Ressourcen läuft es darauf hinaus, die Ressource-Datei (.rc) in mehrenen Sprachversionen vorzuhalten. Das beinhaltet nicht nur die Stringtabelle sondern auch alle anderen Komponenten, wie z.B. Menüs oder Dialogtemplates.
Die Stringtabelle sollte dazu verwendet werden, um alle Texte die irgendwie im Quelltext auftauchen (z.B. bei MessageBoxen), dort zu hinterlegen, z.B.
Code:
ID                  Wert    Titel      
IDS_PROGRAMQUIT     33333   Wollen Sie das Programm wirklich beenden?
und die dann so verwendet werden können:
Code:
CString strText;
strText.LoadString(IDS_PROGRAMMQUIT); // strText kann jetzt für Ausgaben verwendet werden

// oder

AfxMessageBox(IDS_PROGRAMMQUIT);
Die Stringtabelle musst du selber pflegen, also alle benötigten Texte dort per Hand einfügen.

Um die Mehrsprachigkeit dann technisch zu realisieren, kannst du entweder verschiedene .rc-Dateien vorhalten, die dann je nach gewünschter Sprache immer im Projekt ausgetauscht werden oder die Resourcen werden in externe DLLs ausgelagert (macht etwas mehr Arbeit).

Zum Thema "mehrsprachige Resourcen" solltest du dir mal diesen Link anschauen: www.codeproject.com/tools/localizerc.asp

Es gibt natürlich auch noch Lösungen, um die Mehrsprachigkeit ohne Ressourcen zu realisieren, etwa über spezielle Sprachdateien bzw. -datenbanken. Allerdings beeinflusst sowas dann ziemlich stark die konzeptionelle Planung der jeweiligen Projekte und sollte damit eigentlich schon vor Projektbeginn festgelegt werden.
 
Hallo MCoder,

es geht um zu viele Strings, so dass ich sie nicht alles durch LoadString laden kann.
Zusätzlich soll mein Programm eben zwei Checkboxen anbieten und je nachdem welche gewählt wurde ständig die Sprache wechseln können.

Wie lagere ich die Resourcen in DLLs aus? Ich hab mir den Link schon angesehen - komm aber damit nicht zurecht :( Ich verwende doch VC++ 6.0 und die Angaben sind nicht für die Version. Und leider auch nicht so einfach übertragbar :(

Ich bin echt am verzweifeln - so schwer kann doch das nicht sein?! :confused:

Danke nochmal!
 
Beginnerin hat gesagt.:
es geht um zu viele Strings, so dass ich sie nicht alles durch LoadString laden kann.
Sofern die Strings alle im Quelltext stehen, kommst du nicht drum herum, sie dort herauszuziehen, in der Stringtabelle abzulegen und dann durch die entsprechenden Aufrufe via LoadString o.ä. zu ersetzen.

Für das Auslagern von Resourcen in eine DLL gibt's eine Anleitung in der MSDN.
Soweit ich mich errinnere, klappt damit allerdings nicht das dynamische Umschalten zur Laufzeit, d.h. es ist eine Neustart des Programmes nötig.
Der Link, den ich dir vorher gepostet hatte, enthält ein meiner Meinung nach recht brauchbares Tool zum Übersetzen der Resourcen.

Beginnerin hat gesagt.:
so schwer kann doch das nicht sein
Ganz trivial ist es leider auch nicht. Es ist vor allem dann mühsehlig, wenn es nachträglich ergänzt wird, d.h. in der ursprünglichen Konzeption noch nicht berücksichtigt wurde.
 
Hallo MCoder,

das mit den DLL's hab ich nicht hinbekommen :(
Aber ich hab auch immer wieder gelesen, dass die nur bei Programmstart, nicht bei Laufzeit eingebunden werden können. Somit waren sie für mich sowieso nicht das richtige. ;)

Ich habe jetzt eine ini- Datei angelegt. In dieser steht die ID des Steuerelementes, und darunter mit Länderkürzel die beiden Übersetzungen.
Auf fast jede Maske habe ich zwei Radiobuttons zum umschalten eingebaut. Wird dort umgeschaltet, lade ich einfach die neue Bezeichnung mit SetDlgItemText neu.

Jede der Masken hat nun eine Variable, die die aktuelle Sprache speichert. Beim Wechseln zwischen Dialogen übergebe ich diese dann.

Die Lösung ist etwas "billig", weil ich ja ab jettz ständig die ini mitzupflegen habe und die auch mit verteilen muss. Außerdem es war gut-viel Kopierarbeit :(
Aber es funktioniert :)

Vielen Dank nochmal für deine Hilfe! :)
 

Neue Beiträge

Zurück