Forum: PC-Programmierung Multilinguale C# anwendung


von Peters Christoph (Gast)


Lesenswert?

Hi leute

ich habe in C# eine anwendung geschrieben. Die Benutzeroberfläche ist
in deutsch. nun muss ich schaffen, dass die sprache von deutsch auf
englisch umgestellt werden kann.

ich will aber keine string listen hinterlegen und beim aufbau jedes
froms jedem button/label/etc. den passenden string in der passenden
sprache zuweisen müssen.

gibts in c# .net nicht eine einfachere möglichkeit? stringlisten mit
deutsch englisch werde ich wohl nicht vorbei kommen, aber das umstellen
der sprache muss doch irgendwie einfacher gehen.

hat das jemand schonmal gemacht oder hat jemand ne idee?

bin für jeden noch so kleinen hinweiß dankbar!

gruß
christoph

von Μαtthias W. (matthias) Benutzerseite


Lesenswert?


von Sebastian (Gast)


Lesenswert?

Hi,
wir machen das in unseren .Net anwendungen da wir mit Datenbanken
arbeiten immer so:

man hat ja n objekte in seiner anwendung.
Ich lasse mir zu alle objekte vom typ Label, Button.. in eine Arraylist
eintragen.
Dann hat man alle objekte die relevant sind in einer liste. Die objekte
haben alle eine eigenschft Objekt.Name.

In der Datenbank ist dann der Objektname als schlüssel hinterlegt und
dazu dann in einer weiteren spalte das englishe und deutsche wort.

Um den Objektnamen zuzuweisen musst du nur die liste durchlaufen und
für jedes objekt ein query auf dem objktnamen machen. zurück kommt dann
der string in deutsch oder .... .

da in der liste verschidene objekttypen sind muss man halt bei jedem
durchlauf testen ob das aktuelle objekt vom typ label, button.. usw
ist.
so kann man mit ca. 30 zeilen code alle namen ersetzen. Das ganze lässt
sich wunderbar rekursiv lösen.
Wir haben es so gemacht das die deutsche sprache automatisch mit der
datenbank abgeglichen wird und so keine datenleichen entstehen weil der
entsprechende button nicht mehr existiert.

Sebastian

von Fritz G. (fritzg)


Lesenswert?

Oh Gott, gibts in Windows wirklich keine ordentliche
Internationalisierung?

Ich schreib in Linux z.B. printf(_("English text")) und übersetzte
dann in seperaten Textdateien die Strings, die Sprachumschaltung
geschieht automatisch, je nachdem in welcher Sprache der Desktop grad
läuft.

von Manuel B. (Gast)


Lesenswert?

(entfernt)

von Fritz G. (fritzg)


Lesenswert?

Hat nix mit printf zu tun, die übersetzung liegt in _() welches einfach
ein Makro ist:

 define _(String) gettext(String)

Die Funktion gettext sucht dann im Übersetzungsfile nach dem String und
gibt stattdessen den übersetzten String (in der gewählten Sprache) aus.
Die Sprache legt fest im welchen File er sucht.

D.h. man kann dann jeden Knopf statt mit "Beenden" mit _("Quit")
beschriften und hat dann automatisch die ganze Oberfläche in der
richtigen Sprache. Die Strings schreibt man in Englisch, dann hat man
eine englische Beschriftung, falls es für die Zielsprache keine
Übersetzung gibt.

Vielleicht gibts ja eine gettext Portierung für C#, ich denke für Mono#
gibt es die sicher, die könnte man ja dann verwenden. Selberschreiben
ist auch kein grossen Problem.

In den Übersetzungsfiles steht z.B:
msgid "Error in line "
msgstr "Fehler in Zeile "


In den msgstr kommt dann einfach die Übersetzung mit den richtig
platzierten %s, %d, \n usw. rein.

Allerdings sind die Installierten Übersetzungsfiles in ein Binärformat
konvertiert, ich nehme an, dass da dann Index drin sind, um die
Übersetzung schnell zu finden.

Dadurch braucht man die Programme für andere Sprachen nicht neu zu
compilieren, sondern hat nur eine Programmversion, die dann zur
Laufzeit das richtige Sprachfile öffnet.

Ausserdem kann man das Übersetzungsfile Leuten zum Übersetzen geben,
die dann nicht im Programmcode herumpfuschen müssen.

von Karl H. (kbuchegg)


Lesenswert?

> Hat nix mit printf zu tun, die übersetzung liegt in _() welches
> einfach ein Makro ist:
>
>  define _(String) gettext(String)

Richtig.
Und unter Windows kann man sowas machen, indem man zb. die
String-Table Resourcen benutzt. Da gibts dann mehrere Moeglichkeiten:
Entweder eine komplette Resource-DLL zur Laufzeit austauschen.
Oder aber (was wir machen): Es gibt externe Programme, die die
Resourcen waehrend der Erstellung des Setups der Applikation
austauschen. zB. RC-WinTrans macht das ganz ausgezeichnet.
Man liest die EXE mit WinTrans ein, der holt sich alle Resourcen
und erstellt eine Tabelle aller Texte (auch Dinger die in Dialogen
stecken). Die Tabelle geht als Excel-File zum Uebersetzer. Wenn sie
zurueckkommt lese ich das Excel-File wieder in WinTrans ein und
sage ihm, dass er mir eine neue EXE mit dieser Uebersetzung generieren
soll.

von Fritz G. (fritzg)


Lesenswert?

Ist auch eine Möglichkeit. Wie schon beschrieben, braucht man mit dem
gettext System jedoch nie die Anwendung neu compilieren, sondern
einfach  die Übersetzungsfiles an die richtige Stelle schieben. Man
kann sich daher sogar ohne den Quellcode eigene Übersetzungen
erstellen.

Das ist halt unter Linux Standard, alle Programme halten sich dran. Hab
grad gezählt, auf meinem Rechner sind es 10027 Files (pro Programm für
jede Sprache ein File).

Schade, dass es da für Windows nix einheitliches gibt.

von Karl H. (kbuchegg)


Lesenswert?

> Man kann sich daher sogar ohne den Quellcode eigene Übersetzungen
> erstellen.

Kannst Du mit WinTrans genauso.
Ob es jetzt ein Vorteil oder ein Nachteil ist, dass die
Uebersetzung in einer externen Datei vorliegt oder direkt
im EXE gemacht wird, muss jeder fuer sich selbst entscheiden.

von Karl H. (kbuchegg)


Lesenswert?

> Existiert dieses Macro in C' unter Linux auch? Dann wäre die
> Umsetzung auf Win ja kein Problem.

gettext() ist ganz normaler C-Code.
Klar gibts den auch in einer Windows-Version.
Ist im Grunde eine grosse Hash-Table die Text->Text substitution
macht. Da ist nichts Geheimnisvolles dran.

http://gnuwin32.sourceforge.net/packages/gettext.htm

von Karl H. (kbuchegg)


Lesenswert?

> Schade, dass es da für Windows nix einheitliches gibt.

Unter Windows gabs mal Style-Guides von Microsoft (aehnlich
wie es sie fuer den Mac gibt). Rate mal wer sich als erster
nicht dran gehalten hat. Genau: MS

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.