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
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
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.
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.
> 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.
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.
> 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.
> 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
> 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.