www.mikrocontroller.net

Forum: PC-Programmierung Programm mehrsprachig entwickeln???


Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe folgendes Problemchen.

Mein Programm wurde in Visual C++ 5.0 entwickelt (deutsch). Nun soll es
aber auch in mehrere Sprachen übersetzt werden; ist auch noch kein
wirkliches Problem ;-) Alle Texte, z.B. in AfxMessageBoxen, können ja
einfach übersetzt werden. Menueeinträge der Fenster sind ja in der
Ressourcendatei abgelegt. Diese müßte dann "per Hand" übersetzt
werden, um dann das ganze Projekt wieder neu durchzukompilieren. Für
jede Sprache wäre eine eigene Datei erforderlich. Was aber wenn das
Programm neue Funktionen, Fenster oder Dialoge bekommt...Alle
Resourcendateien müßten dann wieder übersetzt werden, da sie während
der Programmentwicklung  durch Visual Studio verändert werden. Alles
Murks :-(

Wer kennt Entwicklungstools mit C++ als Sprache unter Windows, mit
denen es möglich ist, eigene Entwicklungen komfortabel in andere
Sprachen zu überführen. Ich denke da z.B. auch an Spanisch,
Italienisch, usw.


Grüße
Oliver

Autor: Rufus T. Firefly (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn Du Dir den (VC++) Resourceneditor mal genauer ansiehst, wirst Du
feststellen, daß als Eigenschaft einer Resource eine Sprache
eingestellt werden kann.
Damit kann eine Resource mit der gleichen Resource-ID mehrfach
vorkommen.

Im Resourceneditor steht die gewählte Sprache hinter der zugehörigen
Resource-ID; sie wird nur bei der Standardsprache des
Entwicklungssystems weggelassen.
Somit erhältst Du beispielsweise sowas:
  MyApp resources
  -- DIALOG
      IDD_ABOUTBOX
      IDD_ABOUTBOX [Hungarian]
etc.
(Ausschnitt des Workspace-Fensters bei Ansicht der Resourcen)

(die erste ist implizit Deutsch, da Du höchstwahrscheinlich ein
deutschsprachiges Windows verwendest)

Mit einem Rechtsklick auf die jeweilige Resource und Wahl des
Kontextmenüpunktes "Copy" kann direkt eine Kopie einer Resource mit
gleichzeitiger Auswahl der Sprache der Resource angelegt werden.

Texte, die per MessageBox oder ähnlichem ausgegeben werden sollen, sind
nicht als Stringkonstanten im Programm, sondern als Strings in einer
Stringtabelle in den Resourcen zu definieren. Da diese, wie jede andere
Resource auch, mehrsprachig sein können, ist das dann auch kein Problem
mehr.

Im Detail mag es da noch Unterschiede zwischen VC++ 5 und 6 (das ist
die von mir verwendete Version) geben, das Konzept aber ist deutlich
älter.

Etwaige Fragen diesbezüglich hier posten.

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe gerade einmal damit rumgespielt... ja, auch in VC++ 5 kann eine
Ressource in einer anderen Sprache kopiert werden.

Fragen:
1. Wenn ich z.B. 5 Sprachen habe, dann müßte ich doch auch JEDE
Ressource
5 mal kopieren. Ist aber eine ganze schöne Menge. Ich habe
überschlagsmäßig 20 Ressourcen (Dialoge, Menues, etc). Dann wären das
ja schon 100! Da steigt doch keiner mehr durch.

2. Wenn ich in der Originalressource etwas hinzufüge, z.B. neue
Buttons, Listenelement etc, dann sind die kopierten Ressourcen davon
unbetroffen. So scheint es mir jedenfalls nach den ersten Versuchen.

Autor: Rufus T. Firefly (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
1. Ja, genau so ist das.
Ob "da keiner mehr durchsteigt"? Da die Resourcen ja alle die gleiche
Resourcen-ID haben, sollte das kein so arges Problem sein.

2. Das ist in der Tat ein Problem. Die "Internationalisierung" ist
dann wohl etwas, was zu allerletzt geschehen sollte.

Alternative: In Dialogresourcen stehen keine festen Strings, sondern
nur Platzhalter, die aus Stringresourcen mit Inhalt gefüllt werden.
Statt die Texte aus Stringresourcen zu holen, könnten diese auch aus
einer externen Datei geladen werden.
Die Verwendung von Stringresourcen ist aber wg. FormatMessage() gar
nicht schlecht, da hier auch die Verwendung von Platzhaltern möglich
ist, deren Reihenfolge sprachabhängig definiert werden kann
("this operation will delete %1 files in %2 directories", "In %2
Verzeichnissen werden %1 Dateien gelöscht")

All dies erfordert zwar eine gewisse Disziplin beim Programmieren,
müsste aber noch handhabbar sein.

Ganz andere Alternative wäre die Verwendung einer anderen
Klassenbibliothek als der MFC; wxWidgets bietet, wenn ich mich jetzt
nicht völlig vertue, andere Ansätze zur Internationalisierung. Das
bringt natürlich nichts, wenn man ein bereits exisitierendes Projekt
internationalisieren möchte.

Ganz am Rande: Was für ein wichtiges Produkt bearbeitest Du da, daß Du
meinst, daß fünf verschiedene Sprachfassungen erforderlich sind?

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich danke Dir für Deine Hilfe. Leider ist diese Lösung für mich ein
weiterer Problembringer. Mein Kunde ist sehr groß und leider auch sehr
anspruchsvoll :-( Dem fällt ständig etwas neues tolles ein, was ich in
mein Programm reinmatschen soll. Wiederum hat mein Kunde auch Kunden.
Denen fällt auch immer etwas tolles ein, was doch so schööön wäre.
Natürlich zukünftig in allen erdenklich Sprachen. 5 war nur so
dahergesagt.
Es ist schon ein Wunder, daß die von mir noch keine runden Fenster
haben wollten ;-)

Ich werde wohl meine erste Idee aufgreifen müssen:
Es gibt ein Mutterprogramm (z.B. deutsch). Alle Strings werden separat
in Dateien (einer Datei) verwaltet und können durch #def für eine
Sprache aktiviert werden. Die Ressourcendatei ist ja eigentlich auch
nur eine Textdatei. Ich werde ein Übersetzungsprogramm schreiben,
welches mir die Datei am Ende in jede beliebige Sprache übersetzt. Das
Programm sucht also nach den Begriffen "Datei", "Speichern
unter..." usw. Was alles eben in den Menüs, Dialogen, auf den Buttons
und Beschreibungstexten auftaucht. Das alles steht in der
Ressourcendatei. Nach dem Übersetzen der Datei wird das ganze Projekt
neu durchkompiliert.
Der Vorteil ist ein Mutterprogramm. Eine Änderung muß nicht in allen
Sprachversionen nachgezogen werden.

Autor: René König (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"Alle Strings werden separat in Dateien (einer Datei) verwaltet und
können durch #def für eine Sprache aktiviert werden."

Gut möglich, daß ich das jetzt falsch verstanden habe. Aber durch ein
#define wird keine Sprache aktiviert. Du verpackst Deine Ressourcen in
Dlls (Resource-Only-Dlls). Je nach gewünschter Sprache lädst Du zu
Programmstart die passende (oder wenn nichts passendes dabei ist, die
Default-) Dll nach.

Selbst bei kleinen Projekten, wo sich das nicht lohnt und alles in der
Exe vorhanden ist, machst Du das nicht per #define. Hier verwendest Du
die API-Funktion SetThreadLocale. Im Folgenden werden die richtigen
Ressourcen automatisch verwendet.

Den bereits erwähnten Ansatz mit FormatMessage finde ich übrigens auch
ganz nett. Deswegen möchte ich noch kurz auf den Message-Compiler
hinweisen (mc.exe, Bestandteil des PSDK). Siehe:
http://msdn.microsoft.com/library/default.asp?url=...

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Hinweise.

Ich stehe auch kurz vor einem Upgrade meines 5.0 Studios. Gerade unter
Windows 2000 treten vermehrt mysteriöse Effekte in meinem Programm
auf.
Auf Win95, Wind98 etc. läuft es, und bei win2000 nicht!!!!
Beispiel: Die CDC-Funktion TabbedTextOut() gibt einen durch Tabulatoren
formatierten Text aus(MFC,CView). Unter Win2000 gibt sie gar nichts aus.
Nichts, nada. Bildschirm ist leer.

Jetzt gibt es noch das Visual-Studio 6.0 und das neue xy.NET
Hat jemand Erfahrungen im letztgenannten? Oder sollte ich auf das 6.0
umsteigen?
Meinungen dazu?

Grüße
Oliver

Autor: René König (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"Beispiel: Die CDC-Funktion TabbedTextOut() gibt einen durch
Tabulatoren formatierten Text aus(MFC,CView). Unter Win2000 gibt sie
gar nichts aus."

Da muß ich doch mal ganz vorsichtig fragen, ob das nicht auch an Dir
liegen kann. CDC::TabbedTextOut ist nichts weiter als eine
Inline-Funktion, die die Arbeit lediglich an die API-Funktion gleichen
Namens delegiert. Ich kann mir deswegen nur schwer vorstellen, daß Dir
die Umgebung da Schwierigkeiten macht. Im Falle eines Fehlschlags
sollten cx und cy der zurückgegebenen Size genullt sein. Unter Windows
2000 kannst Du dann mit ::GetLastError nähere Informationen über den
Fehler erhalten.

Ich muß aber noch sagen, daß ich den VC5 nicht wirklich kenne. Etwas
aktuelleres kann aber natürlich trotzdem nicht schaden. :)

"Oder sollte ich auf das 6.0 umsteigen?"

Das Ding ist von 1998, warum solltest Du auf sowas altes umsteigen
sollen? Ich würde das jedenfalls nicht machen. Der aktuelle Compiler

- ist Standard-Konformer
- schmeisst noch mehr Warnungen (bessere Prüfung zur Compile-Zeit)
- fügt, wenn gewünscht, noch mehr Laufzeit-Prüfcode ein
- erzeugt schlankeren Code

Auch der Debugger hat sich sehr zu seinem Vorteil verändert, ist
umgänglicher geworden.

Allerdings ist die IDE sehr gewöhnungsbedürftig, aber naja.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.