2015-09-22 53 views
13

在我的應用程序中爲每種語言字符串資源單獨存儲並根據語言環境的類型顯示。我想在應用程序設置中更改語言。我如何才能意識到,在語言選擇之後立即將其應用於用戶界面?C#以編程方式更改應用程序語言UWP實時

+0

集[的CurrentUICulture](https://msdn.microsoft.com/en-us/library/system.globalization.cultureinfo.currentuiculture(V = vs.110)的.aspx)屬性時應用啓動。 – tao

+0

我知道。但是我需要改變語言而不立即重新啓動。我們需要將其正確地更改爲正在運行的應用程序。 – AlexeySRG

回答

24

我們可以使用ApplicationLanguages.PrimaryLanguageOverride在運行時更改語言而無需重新啓動應用程序。

例如:我有兩種語言支持「en」和「fr」,本地化的消息將顯示在文本塊中。

  1. 添加使用Windows.Globalization;

  2. 更改默認語言「EN」到「FR」由

    ApplicationLanguages.PrimaryLanguageOverride = "fr"; 
    
  3. 重新定位到當前頁面刷新UI。

    Frame.Navigate(this.GetType()); 
    

需要注意的是,你需要將PrimaryLanguageOverride與制度文化來設置下一次應用程序啓動的語言進行比較,因爲PrimaryLanguageOverride設置依然存在。如果您啓用了頁面緩存,當您在運行中應用不同的語言時,您需要先設置Frame.CacheSize = 0;以清除緩存,然後將其設置回。

+3

這個解決方案每次都適用於我,但第一次語言更改。第一次語言修改後,我必須手動點擊一個導航元素才能加載新語言的頁面。對於每次語言更改後,頁面都會使用正確的語言自動刷新。 根據建議更改CachSize時甚至發生此行爲。 – ThisWillDoIt

+0

@ThisWillDoIt您是否找到針對該問題的解決方案?否則,將此報告爲錯誤可能是最好的主意......!? – Herdo

+0

我有另一個應用程序正常工作,並將它們相互比較。我仍然不知道爲什麼這種行爲發生在應用程序上(https://github.com/theWalli/EurekaRemake)。 如果我決定之後的又一輪檢查在我的身邊,哪裏會是最好的/官方的地方做這樣的報告嗎? – ThisWillDoIt

2

有一個page MSDN描述了Windows 8.1中關於語言的新功能。

修改

ApplicationLanguages.PrimaryLanguageOverride = "en-US"; 

我看着物業resourceContext.Languages[0]後才能啓動PropertyChanged事件我LanguageManager,這與x:Key = Loc宣佈App.xaml一個StaticResources的。

private void ButtonEn_OnClick(object sender, RoutedEventArgs e) 
    { 
     ApplicationLanguages.PrimaryLanguageOverride = "en-US"; 
     UpdateLang("en-US"); 
    } 

    private async void UpdateLang(string newLang) 
    { 
     var resourceContext = Windows.ApplicationModel.Resources.Core.ResourceContext.GetForCurrentView(); 

     while (true) 
     { 
      if (resourceContext.Languages[0] == newLang) 
      { 
       var loc = Application.Current.Resources["Loc"] as LanguagesManager; 
       loc.ChangeLang(); 
       break; 
      } 
      await Task.Delay(100); 
     } 
    } 

while (true)只是測試,實際上它是更好的一個「備份」逃跑,因爲

這些要求可以根據由應用所使用的UI框架有所不同,它可能有必要重新啓動應用程序。

+0

是ApplicationLanguages.PrimaryLanguageOverride =「EN-US」;應使用 – peterincumbria

3

@ThisWillDoIt和@Herdo

我添加了一個延遲,這樣的「第一」時,將在我的情況下工作:

Windows.Globalization.ApplicationLanguages.PrimaryLanguageOverride = languageCode; 

await Task.Delay(100); 

Frame.Navigate(this.GetType()); 

希望它可以幫助爲你工作。

+0

優秀的IT的工作,但爲什麼??? – Charlie

+0

@Charlie彼得後書Bozsó回答以上礦井,應該回答你的問題。! –

5

Alan Yao的答案有所增加。還有一個遺漏的部分: 您設置Windows.Globalization.ApplicationLanguages.PrimaryLanguageOverride後,重新定位到當前頁面之前,你必須調用這兩個函數:

Windows.ApplicationModel.Resources.Core.ResourceContext.GetForCurrentView().Reset(); 
Windows.ApplicationModel.Resources.Core.ResourceContext.GetForViewIndependentUse().Reset(); 

這樣你就不必由邁克爾·伍爾西提到Task.Delay()解決方法。

一個更重要的最後一步:創建一個存儲包時,你應該確保設置「生成應用程序捆綁」設置值設置爲「從不」。原因來自this article

因爲不然,它會創建一個包。這意味着他會將您的應用程序的 分割爲不同的部分以優化下載。只有 下載與設備相關的部件。例如,對於 示例,如果有不同分辨率的資產,則只有 下載適合該設備的資產。對於 語言也是如此,它只會下載與設備的 語言相關的資源文件。因此,如果您嘗試更改語言,則會降低 仍然回落到相同的基本語言,因爲其他人不是安裝 。

+0

優秀的回覆,避免了破壞UI流動性的變通方法(延遲UI線程)。 – MoDu

0

不幸的是,如果NavigationCacheMode的頁面設置爲"Required",上述答案都不起作用。這是解決我的問題的代碼。

ApplicationLanguages.PrimaryLanguageOverride = language; 
await Task.Delay(300); 
Frame rootFrame = Window.Current.Content as Frame; 
rootFrame.Content = null; 
rootFrame = null;    
rootFrame = new Frame(); 
rootFrame.Navigate(typeof(MainPage), null); 
Window.Current.Content = rootFrame; 
相關問題