2013-02-26 9 views
12

Mam pliki Resource z 2 językami i moja aplikacja odczytuje wartości jednego z nich. Chciałbym móc zmienić język mojej aplikacji (użyj innego pliku zasobów) w języku C# zamiast zmieniać język całego telefonu w Ustawieniach.Jak zmienić lokalizację w C# na Windows Phone?

Czy to możliwe? Jeśli tak to jak?

+0

Dobre pytanie, mimo że nie wiem o telefonie z Windows, czy próbowałeś ustawić aktualną kulturę na wątku? – mattytommo

Odpowiedz

9

W App.xaml.cs w sposobie InitializePhoneApplication:

private void InitializePhoneApplication() 
{ 
    Thread.CurrentThread.CurrentCulture = new CultureInfo("fr-FR"); 
    Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture; 
    ....... 
} 

Ograniczeniem jest to, że musi być w inicjalizacji aplikacji, więc jeśli użytkownik zmieni język, restart będzie wymagany na to, aby podjąć działanie .

+0

Dzięki, to się udało. Będę eksperymentować, aby zobaczyć, czy można to zrobić inną metodą. Wydaje mi się, że po rozpoczęciu pracy z Kulturą, jedynym sposobem na zmianę Kultury będzie wznowienie jej ... – GabCas

4

można to zrobić bez konieczności ponownego uruchamiania przez przeładowywania strony, na której użytkownik zmieni język i utrzymanie RTL/LTR z układu strony

Dodałem tę funkcję w App.xaml.cs

public static void ChangeAppLanguage(string CultureName) 
    { 
     App.RootFrame.Language = XmlLanguage.GetLanguage(CultureName); 
     FlowDirection flow = (FlowDirection)Enum.Parse(typeof(FlowDirection), AppResources.ResourceFlowDirection); 
     App.RootFrame.FlowDirection = flow; 
     App.Current.RootVisual.UpdateLayout(); 
     App.RootFrame.UpdateLayout(); 
     var ReloadUri =(App.RootFrame.Content as PhoneApplicationPage).NavigationService.CurrentSource; 
     (Application.Current.RootVisual as PhoneApplicationFrame).Navigate(new Uri(ReloadUri + "?no-cache=" + Guid.NewGuid(), UriKind.Relative)); 
    } 

gdzie CultureName tak: "AR-SA", "en-US"

i zadzwoniłem jak ten

private void EnglishMenuItem_Click(object sender, EventArgs e) 
    {    
     try 
     { 
      if(Thread.CurrentThread.CurrentCulture.Name == "en-US") 
       Thread.CurrentThread.CurrentCulture = new CultureInfo("ar-SA"); 
      else 
       Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US"); 
      Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture; 

      AppResources.Culture = Thread.CurrentThread.CurrentCulture; 

      App.ChangeAppLanguage(Thread.CurrentThread.CurrentCulture.Name); 

      //this._contentLoaded = false; //this way does not refresh appBar 
      //this.InitializeComponent(); 

      //this way work for one time only => if user change language more thane once the api does NOT call constructor 
      //NavigationService.Navigate(new System.Uri("/PhoneApp2;component/MainPage.xaml", System.UriKind.Relative)); 

     } 
     catch (Exception ex) 
     { 
      MessageBox.Show("error:\n\n" + ex.Message); 
     } 
    } 
+0

Drogi Zakarii, Próbowałem Twojego rozwiązania. Nie działa on w tworzeniu historii za kliknięcie, np. jeśli 5 razy próbowałem zmienić język, a niż chcę wrócić, muszę nacisnąć przycisk emulatora 5 razy, niż będę mógł wrócić. i jego nie tranlating. ale wydawało się, że to wspaniałe podejście. –

Powiązane problemy