ich lese mich gerade in Lokalisierung von WPF Anwendungen ein und bin auf einen sehr hilfreichen Artikel in der MSDN gestoßen. Aber mal ganz ehrlich, das erfordert schon viel Aufwand (kommt mir zumindest im Moment so vor). Das war meiner Meinung nach mit WinForms wesentlich einfacher zu realisieren. Allerdings habe ich für WinForms-Anwendungen auch irgendwann ein Vorgehen als Best-Practice identifizieren können, das fehlt mir natürlich bei WPF noch komplett. Vielleicht ist es ja doch nicht so aufwändig, wie mir das im Moment erscheint.
Daher meine Frage an Euch:
Macht Ihr das mehr oder weniger so, wie in der MSDN beschrieben, gibt es Fallstricke, auf die man sich einstellen sollte und habt Ihr vielleicht bereits für Euch etablierte Best-Practices? Kennt jemand evtl. kommerzielle Tools, die einem viel Arbeit ersparen?
Ich suche quasi eine minimalinvasive und effiziente Methode. Könnt Ihr mir da bitte weiterhelfen?
EDIT: Für mich wäre auch ganz wichtig, das ich die vers. Sprachen in SatelliteAssemblies unterbringen kann.
Ich bin mit dem MSDN-Artikel nicht klar gekommen und habe mir daher etwas anderes rausgesucht: http://www.wpftutorial.net/LocalizeMarkupExtension.html Damit lässt sich im XAML recht einfach eine Lokalisierung verwenden. Nachteil: Im Desinger stehen dann nur die MarkupExtensions statt der Texte.
in WPF ist das am einfachsten wenn du die ganzen Strings in Resource Dictionaries packst. Im ResourceDictionary gibst du dann jedem String einen eindeutigen Key mit welchem du nachher den String laden kannst.
Im C# Code kannst du die Daten aus dem ResourceDictionary laden. Da erstellst du dir noch am besten eine kleine Helperklasse welche das für dich macht. Dann kannst du deine Texte mit dem Key laden
Im Xaml Code kannst du die Strings aus dem ResourceDictionary mit DynamicResource laden. Damit wird es automatisch aktualisiert wenn die resourcen-datei gewechselt wird Also z.B.
<TextBlock Text="{DynamicResource MyString}" />
Sobald du die Sprache in deinem Programm wechseln willst, muss du das aktuelle Sprach-ResourceDictionary mit dem neuen ResourceDictionary austauschuen (also in dem MergedDictionary). Zudem musst du auch noch CurrentUICulture und CurrentCulture setzen
Ist jetzt vielleicht etwas viel Input auf einmal aber das Ganze ist in WPF relativ einfach
Das was da in der MSDN beschrieben wird hab ich mir auch mal angeschaut. Aber wirklich überzeugt hat mich das nicht. Das ist einfach viel zu umständlich. Und gerade in WPF hat man mit den ResourceDictionaries ein praktisches Hilfsmittel
Danke erstmal für die Antwort, das klingt ganz ähnlich wie ich das in WinForms immer gemacht habe. Ich schau mir das gleich mal an. Was für mich nocht wichtig wäre, dass die einzelnen ResourceDictionaries der vers. Sprachen in Satellite-Assemblies untergebracht werden können (hab ich im OP ergänzt). Hast Du hierzu noch einen Hinweis für mich? Danke.
den Weg den Microsoft in dem von Dir verlinkten Artikel beschreibt solltest Du ganz schnell wieder vergessen. In der Praxis ist das so nicht durchführbar.
Neben dem Microsoft Weg gibt es prinzipiell zwei Möglichkeiten für die Lokalisierung:
Die erste Möglichkeit wäre, die Anwendung manuell lokalisierbar zu machen, in dem Du Resx-Dateien verwendest und Deine XAML-Dateien so anpasst, dass sie alle Texte (und was sonst noch so lokalisiert werden muss) aus den Resx-Dateien lesen. Dafür gibt es etliche kostenlose Bibliotheken aus der .NET Community, die z.B. über Bindings, Markuperweiterungen oder Attached Properties arbeiten. Einige davon werden z.B. in der WPF Localization Guidance auf Codeplex vorgestellt: http://wpflocalization.codeplex.com/. Da diese aber inzwischen auch nicht mehr ganz aktuell ist findest Du sicher auch noch weitere Tools, die ähnlich arbeiten.
Nachteil bei diesem Weg ist, dass Du sämtliche XAML-Dateien manuell anpassen musst und keinerlei Toolunterstützung dafür bekommst. Außerdem sind Resx-Dateien und der Resx-Editor nicht unbedingt der komfortabelste Weg, Ressourcen zu bearbeiten (wobei es hier auch gute kostenlose Editoren wie den Zeta Resource Editor gibt, http://www.zeta-resource-editor.com/index.html).
Die zweite Möglichkeit ist der Einsatz eines Lokalisierungstools. Da gibt es etliche Anbieter, die schon seit Jahren Tools für alle möglichen Plattformen entwickeln und nebenbei auch noch WPF unterstützen. <Eigenwerbung>Und dann gibt's da noch unser Tool, NLocalize. Wir bieten ein Lokalisierungstool speziell für WPF, Silverlight und WP7 (also XAML), das auf diese Technologien spezialisiert ist und sich direkt in Visual Studio 2010 integriert. Ein Video zu NLocalize findest Du unter http://www.neovelop.de/nlocalize.</Eigenwerbung>
Nachteil des zweiten Ansatzes sind natürlich die Lizenzkosten. Hier musst Du selbst für Dich entscheiden, ob die durch die Tools gesparte Arbeitszeit den Anschaffungspreis rechtfertigt oder nicht.
Falls Du noch Fragen zum Thema Lokalisierung hast kannst Du mir auch gern schreiben (am besten einfach über die Kontaktfunktion auf neovelop.de).
Damit lässt sich im XAML recht einfach eine Lokalisierung verwenden. Nachteil: Im Desinger stehen dann nur die MarkupExtensions statt der Texte.