我正在使用Visual Studio 2015在SilverLight中创建Windows phone app 8.1。我正在创建英语和阿拉伯语的多语言应用程序。为此,我在项目中创建了Strings文件夹,其中包含en-US和ar-KW两个文件夹,每个文件夹中都有Resources.resw文件。
我 x:Uid 设置属性。例如Key:- Actual.Text Value:- Actual
<TextBlock x:Uid="Actual" TextWrapping="Wrap" MaxWidth="65" HorizontalAlignment="Center" />
以上工作非常好。我有组合框和项目EN和AR。我正在触发SelectionChanged事件以更改语言但问题是当我停止应用并再次运行它时,只会更改文本和布局。
如何在不重新启动的情况下在运行时执行此操作。
private void LanguageComboBoxName_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
string selectedItem = (e.AddedItems[0] as ComboBoxItem).Content as string;
var RootFrame = Window.Current.Content as SlideApplicationFrame;
if (selectedItem == "EN")
ApplicationLanguages.PrimaryLanguageOverride = "en-US";
else if (selectedItem == "AR")
ApplicationLanguages.PrimaryLanguageOverride = "ar-KW";
RootFrame.Navigate(this.GetType());
}
答案 0 :(得分:5)
据我所知,Microsoft不建议在运行时更改语言(通过覆盖它),但您可以通过重新加载页面来完成。最简单的方法是将组合框与代码放在另一个页面上,然后你将覆盖语言,所以当你向后导航(并且页面将被重新加载)时,你将拥有你想要的东西。请记住,覆盖语言不会在运行时本地化控件(但它不应该是一个很大的问题)。您必须重新启动应用程序才能本地化控件。
使用此代码覆盖语言时:
ApplicationLanguages.PrimaryLanguageOverride = "xx-XX";
然后保存它,您不必在开始时再次覆盖它。应用程序将使用覆盖的语言加载。
此外,当您本地化应用程序时,最好覆盖文化信息,因为如果您有一些日期 - 它们会正确显示文化(例如2015年1月12日或2015年12月1日)
string lang = "en-US"; //default
var culture = new CultureInfo(lang);
Windows.Globalization.ApplicationLanguages.PrimaryLanguageOverride = lang;
CultureInfo.DefaultThreadCurrentCulture = culture;
CultureInfo.DefaultThreadCurrentUICulture = culture;
还有一个重要的事情。
在您的应用清单或您拥有的内容中,您需要将生成应用包设置为“从不”。原因是当您将打包版本上传到商店时,您的运行时本地化将无法正常工作。您可以使用模拟器或调试版本在运行时本地化您的应用程序,甚至有时使用已部署的发行版本。但是你需要这样做,所以当你的应用程序在商店中时,本地化没有问题,并且可以访问所有语言字符串(因为对于打包版本,如果你没有安装语言,它们中的一些可能不是在你的手机上。)
答案 1 :(得分:0)
如果您希望应用依赖于用户选择的语言,则需要存储该选择并在应用开始时将其读出。 这样,您可以在应用程序启动时更改ApplicationLanguage。
因此,在App.Xaml.cs中查找方法InitializePhoneApplication()
并添加以下行(或者您也可以使用ApplicationLanguages.PrimaryLanguageOverride尝试您的方法)
string savedLanguage = string.Empty;
var hasSavedLanguage = AppSettings.TryGetSetting(Constants.LanguageSettingKey, out savedLanguage);
if (hasSavedLanguage)
{
Thread.CurrentThread.CurrentUICulture = new CultureInfo(savedLanguage);
Thread.CurrentThread.CurrentCulture = Thread.CurrentThread.CurrentUICulture;
}
当然,当用户从组合框中选择语言时,您还需要保存语言