2013-03-07 12 views
10

Jak mogę zlokalizować aplikację WPF przy użyciu wzorca MVVM? Naprawdę chcę zrobić to w "prawidłowy" sposób.Lokalizacja zgodna z MVVM w aplikacjach WPF

Moje obecne podejście polega na tym, że używam plików .resx Resource do lokalizowania mojej aplikacji.

Solution Explorer VS 2012

włączyłem je w moim kodu xaml

xmlns:localization="clr-namespace:ClientLibTestTool.ViewLanguages" 

i dostęp do nich tak:

 <Button x:Name="BtnGenerate" 
       Content="{x:Static localization:localization.ButtonGenerate}"/> 

Moje pytania:

  1. Czy istnieje lepszy sposób na zrobienie tego?
  2. Jak mogę przetestować różne języki (ładowanie aplikacji przy różnych ustawieniach językowych)?
  3. Czy można zmienić język w czasie wykonywania?

Odpowiedzi:

Pytanie 1:

Pytanie 2: (Dziękuję, stijn)

public MainWindow() 
{ 
    // Debug Settings 
    localization.Culture = CultureInfo.GetCultureInfo("en-US"); 
    // localization.Culture = CultureInfo.GetCultureInfo("de-DE"); 
    this.InitializeComponent(); 
} 

Pytanie 3: (Dziękuję Stijn)

Niezupełnie , konieczne jest przerysowanie całego okna.

Odpowiedz

4

Jest to odpowiedni sposób, aby to zrobić, o ile mi chodzi. Aby przełączać języki, zmienić kulturę używany przez klasę lokalizacja:

localization.Culture = CultureInfo.GetCultureInfo("de-DE"); 

Ponieważ wszystkie ciągi są naciągane przy starcie (wszystkie połączenia w generowanych plikach Designer.cs wyglądać ResourceManager.GetString("SomeString", resourceCulture); i resourceCulture co pobiera ustawiony przez wywołanie powyżej, ma to wpływ na to, co dostajesz w czasie wykonywania, ale jeśli używasz wartości w elementach menu itp. z poziomu xaml, musisz przebudować całe menu, zanim zacznie działać.

+1

Uwaga: ten wiersz kodu musi być PRZED InitializeComponent(); Metoda. W przeciwnym razie nie zadziała – Joel

+1

To właśnie miałem na myśli ostatnim zdaniem, nadal będzie działać, ale tylko dla compone które odnoszą się do tego ponownie. Można obejść ten problem, nie używając ciągów zasobów w języku xaml, ale zamiast tego powiązać je z obserwowalnymi właściwościami, które zawierają wartość zasobu i wywołać zdarzenie PropertyChanged po każdej zmianie. – stijn

Powiązane problemy