2009-08-25 2 views
8

Was wäre ein guter Ansatz, um eine MVVM-basierte WPF-Allizierung zu lokalisieren, die ihre Sprache zur Laufzeit ändern kann? Natürlich könnte ich eine String-Eigenschaft im ViewModel für jeden einzelnen String erstellen, der irgendwo in der View angezeigt wird, aber das scheint mir ziemlich mühsam. Gibt es dafür einen gemeinsamen Ansatz/Best Practice?Lokalisierung von MVVM-basierten WPF-Anwendungen

Antwort

9

WPF has a lot of support for localization. Vielleicht können Sie das nutzen? Leider denke ich, dass das Ändern der Benutzeroberflächensprache zur Laufzeit etwas schwierig ist und Sie wahrscheinlich Ihr eigenes Schema entwickeln müssen.

Da das View-Modell UI-agnostisch ist, glaube ich nicht, dass das Speichern von Benutzeroberflächen-Strings im View-Modell eine gute Lösung ist. Diese gehören zur Ansicht.

+3

Bedenkt man, dass das View-Modell ein Modell der Ansicht ist, glaube ich persönlich, dass dies der perfekte Ort ist die Lokalisierung zu setzen.Dies ermöglicht auch lokalisierte Silverlight- und WPF-Benutzeroberflächen aus demselben Ansichtsmodell. –

+5

Ich muss Pete Davis nicht zustimmen. Lokalisierung gehört zur Ansicht, nicht zum View-Modell. Das View-Modell sollte sich nicht darum kümmern müssen, wie sich die View präsentieren möchte. Und Lokalisierung ist nur eine Möglichkeit, wie sich die Ansicht in anderen Sprachen präsentieren kann. –

6

Stattdessen Benutzeroberfläche Strings in Ihrem View-Modell zu haben, können Sie sie in den Ressourcen der Montage speichern und sie von XAML direkt zugreifen, indem x:Static:

<TextBlock Text="{x:Static props:Resources.MyLabel}"/> 

Der props Namespace Ihres Baugruppe Properties Namespace verweisen sollte :

xmlns:props="clr-namespace:My.Assembly.Properties" 
+0

Stellen Sie nur sicher, dass Ihr Ressourcenzugriff geändert ist öffentlich, nicht intern. – midspace

9

Hier ist ein excellent article about WPF localization. Es behandelt die Microsoft-unterstützte Lokalisierungstechnik und einige alternative

Ich würde nicht die "offizielle" Lösung für Lokalisierung empfehlen ... es ist wirklich ein Schmerz zu verwenden, es ändert Sie XAML (addiert x: Uid Attribute zu jedem Element, das lokalisiert werden kann, und es gibt keine guten Werkzeuge von MS, um es zu einer einfachen Lösung zu machen. Eine gute alte Resx-Lokalisierung ist viel einfacher zu verwenden und lässt sich mit ein paar Tricks (nämlich Markup-Erweiterungen und/oder angehängten Eigenschaften) recht gut mit WPF integrieren. Außerdem können Sie die Oberflächensprache zur Laufzeit dank des Bindesystems leicht ändern.

+0

+1 für den Artikel von Rick Strahl. Dieses ist gut. Tatsächlich hält sich das Bindungssystem nicht nativ an die Kultur des aktuellen UI-Threads an. In diesem Artikel erfahren Sie jedoch, wie Sie dieses Problem unter anderem beheben können. Gute Wahl. –

+0

+1 sehr nützliche Antwort. Danke für den Artikel – gyurisc

1

Sie können eine benutzerdefinierte Markup-Erweiterung verwenden, um lokalisierte Werte zu suchen und sie zu aktualisieren, wenn sich die UI-Kultur ändert.

Hier ist ein Beispiel dafür, wie dies funktionieren könnte:

<Label x:Name="lblResxHelloWorldMarkupExtension1Value" 
Content="{res:Res Id=HelloWorld,Default=Hello#}" 
Margin="{res:Res Id=HelloWorldMargin,Default=10}" 
Width="{res:Res Id=HelloWorldWidth, 
ResourceSet=WpfClickOnce.MyFormRes, Default=50}" /> 

Dieses Beispiel aus dem ausgezeichneten WPF Lokalisierung Guidance von Rick Strahl und Michele Leroux Bustamante hier verfassten genommen wird: http://wpflocalization.codeplex.com/. Laden Sie den Leitfaden von dieser Website herunter, auf dem diese Technik detailliert in Form eines Dokuments und einer Beispielanwendung beschrieben wird.

Ein weiterer netter Vorteil dieses Ansatzes ist, dass es im Designer funktioniert.