2013-02-26 13 views
12

Ho i miei file di risorse con 2 lingue e la mia app legge già i valori di uno di essi. Mi piacerebbe poter cambiare la lingua della mia app (usa l'altro file di risorse) in C# invece di cambiare la lingua dell'intero telefono in Impostazioni.Come cambio la localizzazione in C# su Windows Phone?

È possibile? Se é cosi, come?

+0

Buona domanda, anche se non so su Windows Phone, hai provato a impostare la cultura corrente sul thread? – mattytommo

risposta

9

In App.xaml.cs, nel metodo InitializePhoneApplication:

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

La limitazione è che deve essere nell'inizializzazione applicazione, quindi, se l'utente cambia la lingua, un riavvio verrà richiesto perché abbia effetto .

+0

Grazie, ha funzionato. Sperimenterò per vedere se può essere fatto con un altro metodo. Immagino che una volta che il battistrada è iniziato con una Cultura, l'unico modo per cambiare la Cultura sarebbe riavviarlo ... – GabCas

4

si può fare questo senza bisogno di riavviare per ricaricare la pagina in cui l'utente cambia la lingua e il mantenimento della RTL/LTR del layout di pagina

Ho aggiunto questa funzione in 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)); 
    } 

dove il CultureName come questo: "ar-SA", "en-US"

e ho chiamato in questo modo

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

Caro Zakaria, ho provato la tua soluzione fornita. Non sta funzionando sul posto, creando la cronologia per clic, ad es. se ho 5 volte provato a cambiare lingua e poi voglio tornare indietro di me, devo premere il pulsante dell'emulatore 5 volte di quanto sarò in grado di tornare indietro. e non è un traning. ma sembrava il superbo approccio. –

Problemi correlati