在我的应用程序中,每个语言字符串资源都是单独存储的,并根据语言环境的类型显示。我想在应用程序设置中更改语言。如何在语言选择后立即将其应用于用户界面?
答案 0 :(得分:29)
我们可以使用ApplicationLanguages.PrimaryLanguageOverride在运行时更改语言而无需重新启动应用程序。
例如:我支持两种语言" en"和" fr",本地化的消息将显示在文本块中。
使用Windows.Globalization添加;
更改" en"的默认语言到" fr"由
ApplicationLanguages.PrimaryLanguageOverride = "fr";
重新导航到当前页面以刷新UI。
Frame.Navigate(this.GetType());
请注意,您需要将PrimaryLanguageOverride与系统区域性进行比较,以设置下次应用启动的语言,因为PrimaryLanguageOverride设置是持久的。如果您启用了页面缓存,当您动态应用其他语言时,您需要先设置Frame.CacheSize = 0;
然后再将其设置为清除缓存。
答案 1 :(得分:8)
Alan Yao回答的一些补充。有一个缺失的部分:
设置Windows.Globalization.ApplicationLanguages.PrimaryLanguageOverride
之后,在重新导航到当前页面之前,必须调用这两个函数:
Windows.ApplicationModel.Resources.Core.ResourceContext.GetForCurrentView().Reset();
Windows.ApplicationModel.Resources.Core.ResourceContext.GetForViewIndependentUse().Reset();
这样您就不需要Michael Woolsey提到的Task.Delay()
解决方法。
另一个重要的最后一步:创建Store包时,应确保将“Generate app bundle”设置值设置为“Never”。来自this article的原因:
因为否则会创建一个包。这意味着他会削减 将您的应用程序分成不同的部分以优化下载。只要 将下载与设备相关的部件。对于 例如,如果有不同分辨率的资产,则只会 下载适合该设备的那些。同样的事情 语言,它只会下载与之相关的资源文件 设备的语言。因此,如果你试图改变语言,它就会失败 仍然依赖于相同的基础语言,因为其他人不是 安装。
答案 2 :(得分:4)
@ThisWillDoIt和@Herdo
我添加了延迟,以便" First"在我的情况下它会起作用的时间:
Windows.Globalization.ApplicationLanguages.PrimaryLanguageOverride = languageCode;
await Task.Delay(100);
Frame.Navigate(this.GetType());
希望它有助于你。
答案 3 :(得分:2)
有一个page MSDN描述了Windows 8.1中关于语言的新篇章。
修改
后ApplicationLanguages.PrimaryLanguageOverride = "en-US";
我查看了属性resourceContext.Languages[0]
,以便启动我的语言管理器的PropertyChanged
事件,该事件是StaticResources
App.xaml
x:Key = Loc
。{ / p>
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框架而异,可能需要重新启动应用程序。
答案 4 :(得分: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;