2013-02-26 26 views
12

Tôi có các tệp Tài nguyên của mình với 2 ngôn ngữ và ứng dụng của tôi đã đọc các giá trị của một trong số chúng. Tôi muốn có thể thay đổi ngôn ngữ của ứng dụng của mình (sử dụng tệp tài nguyên khác) trong C# thay vì thay đổi ngôn ngữ của toàn bộ điện thoại trong Cài đặt.Làm cách nào để thay đổi bản địa hóa trong C# trên Windows Phone?

Điều này có khả thi không? Nếu vậy, làm thế nào?

+0

Câu hỏi hay, mặc dù tôi không biết về điện thoại cửa sổ, bạn đã thử thiết lập văn hóa hiện tại trên luồng chưa? – mattytommo

Trả lời

9

Trong App.xaml.cs, trong InitializePhoneApplication phương pháp:

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

Hạn chế là nó cần phải được khởi tạo ứng dụng, vì vậy nếu người dùng thay đổi ngôn ngữ, khởi động lại sẽ được yêu cầu cho nó có hiệu lực .

+0

Cảm ơn, điều đó đã xảy ra. Tôi sẽ thử nghiệm để xem nó có thể được thực hiện trong một phương pháp khác không. Tôi đoán rằng một khi các bước đi đã bắt đầu với một nền văn hóa, cách duy nhất để thay đổi Văn hóa sẽ khởi động lại nó ... – GabCas

4

bạn có thể làm điều này mà không cần phải khởi động lại bằng cách tải lại trang mà người dùng thay đổi một ngôn ngữ và duy trì RTL/LTR của bố cục trang

tôi đã thêm chức năng này trong 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)); 
    } 

nơi CultureName như thế này: "ar-SA", "en-US"

và tôi gọi như thế này

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

Kính gửi Zakaria, tôi đã thử giải pháp được cung cấp của bạn. Nó không hoạt động tại chỗ tạo ra lịch sử cho mỗi lần nhấp, ví dụ: nếu tôi 5 lần cố gắng thay đổi ngôn ngữ và hơn tôi muốn quay trở lại hơn tôi phải bấm nút quay lại của trình mô phỏng 5 lần so với tôi sẽ có thể quay trở lại. và nó không tranlating. nhưng nó dường như là cách tiếp cận tuyệt vời. –

Các vấn đề liên quan