PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Programm: mehrsprachig


Gast
2013-01-17, 17:28:11
Hallo liebe Community,

derzeit schreibe ich ein kleines Programm in C# und habe mir gedacht, das UI sowohl in englisch als auch in deutsch anzubieten. Da es doch sicherlich schon etliche Methoden und Ideen gibt, wie man dies am besten umsetzt, frage ich hier einfach, bevor ich damit anfange und es dann total umständlich realisiere.

Gast
2013-01-17, 18:15:41
Wenn das Programm z.B. ohnehin auf eine DB zugreift, würde ich alle sprachlichen Dinge (Labels, Menüs, Fehlermeldungen) sauber darin ablegen und beim Programmstart / Sprachwechsel von da laden. Wenn du mit WPF arbeitest, kannst du die Bindings recht elegant entsprechend setzen, sodass du dich nicht von Hand drum kümmern musst. Sprachtabelle mit Sprach-Id, Sprache, Aktiv-Flag; Item-Tabelle mit Item-ID, Sprach-ID, Bezeichnung; View mit Item-ID, Bezeichnung, wo Sprache.Aktiv-Flag == true. Bindings beziehen sich auf die View.

Andererseits, wenn das Programm wirklich nur klein ist und fix nur EN und DE bieten soll, wäre das overkill. Stattdessen zwei assoziative Arrays (eins DE, eins EN) erstellen mit Item-ID, Bezeichnung. Wenn du mit WPF arbeitest, die im binding genutzte Property entweder auf das eine oder das andere zeigen lassen.

Monger
2013-01-17, 20:31:44
Vieeel zu kompliziert.

Dafür gibt es in Visual Studio die Resourcenpakete. Hier (http://msdn.microsoft.com/en-us/library/70s77c20.aspx) mal ein Einstieg. Lass dich nicht von dem ganzen Implementierungskrams verunsichern, Visual Studio bringt bereits den passenden Resourcencompiler mit der dir 90% davon abnimmt.

Das ist ein breites Thema, aber im Prinzip funktioniert es so, dass man eine eingebettete, neutrale Resource bereit stellt, und dann Resourcen für jede Sprache, identifiziert über die Extension, also z.B: "Dialoge.de-DE.resx". Beim Compile landen die dann automatisch in Satellitenassemblies. Beim Deployment installiert man diese eben mit oder nicht, und entweder erkennt die Applikation bereits beim Start was für eine UI Culture vorliegt und versucht die bestmögliche Satellitenassembly dafür zu finden, oder man legt diese selber programmatisch fest. Jede Anfrage an einen bestimmten Resourcenschlüssel wird dann halt zum passenden Wert aufgelöst.

Der kniffligste Part ist es, die Oberfläche an die Resource zu binden. Das ist in den Windows Forms noch n bissl einfacher als unter WPF. WPF kennt ein ganz eigenes System (http://msdn.microsoft.com/de-de/library/ms788718(v=VS.85).aspx), wo es de facto ein neues XAML für jede Sprache bereitstellt. Das ist ein wesentlich mächtigerer, aber auch komplexerer Mechanismus.

Ich empfehle mit den ResX Paketen anzufangen, und erstmal die typischen Strings die man programmatisch irgendwo reingehackt hat (für MessageBoxen o.ä.) da reinzupacken. Das kann man grundsätzlich gebrauchen, egal für WinForms, WPF, Konsole oder was auch immer. Und dann bei Bedarf sich an die WPF Geschichte rantasten.

Gast
2013-01-18, 14:55:08
Danke für die Anregungen, werde mich da mal reinlesen. :-)
Auf eine Datenbank wird nicht zugegriffen. Es ist auch noch eine Windows Forms und keine WPF Anwendung.

Monger
2013-01-18, 15:17:53
Hab jetzt nochmal n bissl rumgeblättert, irgendwie erklärt das niemand so wirklich eingängig.

Deshalb nochmal knapp zusammengefasst:

1) Im Projekt ein neue Resourcendatei hinzufügen (New Item...)
2) Schlüsselwerte definieren, als Wert den englischen Text schreiben
3) Copy, Paste, und die neue Resourcendatei genauso nennen wie die andere, nur mit Endung "de", also z.B. "Dialogs.de.resx"
4) Values in der neuen Resource auf den deutschen Text anpassen
5) mit beliebigen Sprachen wiederholen.
6) Strings abrufen über Resources Unternamespace, also z.B. "MeineApp.Resources.Dialogs.OpenTitle"

Gast
2013-03-09, 09:52:15
Danke nochmals für deine Hilfe, die Tipps und die Links, hat mir sehr geholfen. :-)

Noch ein weiterer Link: http://www.juergen-bayer.net/artikel/CSharp/Ressourcen-und-Globalisierung/Ressourcen-und-Globalisierung.aspx

Wird auch nochmal alles gut erklärt, vor allem die Beispielcodes sind nützlich.

PatkIllA
2013-03-09, 11:41:13
@Monger
Bei den WinForms Designer wird doch pro Control schon eine resx angelegt. Man kann dann sogar im Designer die Sprache umstellen und im Designer die texte anpassen. Dann sind in der resx auch evtl andere Größen- und Abstandsangaben drin. Das macht bei späteren Änderungen auch schon mal Ärger.

Wenn das Projekt nicht zu groß ist würde ich die übliche Resources.resx im Property Ordner nehmen. Die sieht man dann direkt in den Projekteigenschaften und man weiß gleich wo man suchen muss.

"Dialoge.de-DE.resx" sollte es auch nicht werden, dann steht der Österreicher nämlich mit englisch da. Es sollte wie im zweiten Post von Monger xxx.de.resx sein. Man kann dann immer noch für die Schweizer einzelne Einträge in xxx.de-ch.resx haben.

Bei WPF haben wir auf der Arbeit zu jeder resx noch eine ResourceExtension und greifen dann auf per <TextBlock Text="{p:Resources Name=KeyInResXFile}" /> auf die Werte zu. Das WPF eigene Konzept ist IMO einfach nur kompliziert. Nachteil ist, dass es nur mit Texten geht und keine Compilesicherheit bietet. Dafür hat man nur eine einzige Art Resurcen abzulegen, die man komfortabel in VS bearbeiten kann.
Dann haben wir ein Tool, was die Einträge der resx-Dateien nach Excel exportiert und wieder importiert. In der Excel-datei können die Übersetzungsbüros auch gleich die anderen Sprachen sehen und ihre Übersetzung in die Sprachspalte einfügen.

Gast
2013-03-12, 12:46:30
Habe leider doch noch ein kleines Problem. Und zwar werden die Windows Dialoge wie OK, Abbrechen oder auch Druckereinstellungen weiterhin in deutsch dargestellt. Bei jeder Sprachumstellung wird folgendes ausgeführt.

CultureInfo culture = CultureInfo.CreateSpecificCulture(language);
Thread.CurrentThread.CurrentCulture = culture;
Thread.CurrentThread.CurrentUICulture = culture;

language ist derzeit entweder "de" oder "en". Aber auch "en-EN" oder "en-US" ändert nichts daran.

dbaj
2013-03-13, 07:28:34
Auch wenn die Sprache des Betriebssystems englisch ist?

Sephiroth
2013-03-13, 19:08:06
Habe leider doch noch ein kleines Problem. Und zwar werden die Windows Dialoge wie OK, Abbrechen oder auch Druckereinstellungen weiterhin in deutsch dargestellt. Bei jeder Sprachumstellung wird folgendes ausgeführt.

CultureInfo culture = CultureInfo.CreateSpecificCulture(language);
Thread.CurrentThread.CurrentCulture = culture;
Thread.CurrentThread.CurrentUICulture = culture;

language ist derzeit entweder "de" oder "en". Aber auch "en-EN" oder "en-US" ändert nichts daran.
Machst du das zur Laufzeit durch einen User änderbar? Falls ja, dann siehe http://dzaebel.net/LocalizeRuntime.htm oder http://www.dotnetcurry.com/ShowArticle.aspx?ID=174 (für jede Control die neuer Culture mit ApplyResources() anwenden). Wenn du es aber beim Programmstart machst, dann im Konstruktor vor dem Aufruf von InitializeComponent().