Windows Store App 全球化:应用中设置语言选项



当开发者将开发的应用上传到Windows应用商店以后,使用Windows 8系统的用户可能会看到并下载这些应用,而这些用户所在的区域或者所使用的语言可能都不相同,如果他们在使用应用程序时希望改变应用显示信息的语言为自己所熟悉的语言,这就需要应用能够提供一个语言设置选项,并在选项中包括用户所在地区的语言,这样就能够在应用中更加准确的为用户提供所需要的界面语言而不受区域的影响。下面将通过示例讲解如何在应用中添加“语言设置”选项,通过设置应用的语言来显示不同的信息。

新建一个Windows应用商店的空白应用程序项目,并命名为ChangeAppLanguage。在项目中添加如18.2.3小节示例中相同的语言文件夹、资源文件以及资源。

通常情况下在应用程序中都会提供一个设置页面用于对应用的基本参数包括语言进行设置,本小节将沿用这样的习惯,在项目中新建一个空白页作为语言设置页面,并在其中添加设置选项。

右键单击项目图标à添加à新建项,选择一个“空白页”模版,并命名为SetLanguage。这样就为项目添加了一个语言设置页面SetLanguage用于添加设置选项,并通过此选项来改变应用程序显示信息的语言。

下面首先在MainPage页面添加代码用于布局显示信息页面。双击打开MainPage.xaml文件,在Grid元素中添加“设置语言”和“显示信息”两个按钮,“设置语言”按钮用于跳转到SetLanguage语言设置页面,“显示信息”按钮用于显示资源的值。再添加两个TextBlock文本块分别用于显示提示信息和资源文件中资源的值,代码如下所示:



<Button Content="设置语言" FontSize="20" HorizontalAlignment="Left" Margin="512,141,0,0" VerticalAlignment="Top" Height="71" Width="114" Click="SetLanguage_Click"/>
<Button Content="显示信息" HorizontalAlignment="Left" FontSize="20" Margin="512,217,0,0" VerticalAlignment="Top" Height="71" Width="114" Click="ShowMessage_Click"/>
<TextBlock FontSize="25" HorizontalAlignment="Left" Name="GetResource" Margin="677,230,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Height="46" Width="139"/>
<TextBlock HorizontalAlignment="Left" Margin="512,230,0,0" TextWrapping="Wrap" Text="显示信息为:" FontSize="20" VerticalAlignment="Top" Height="30" Width="129"/>



此时运行程序可以查看显示信息页面的效果,如图18-22所示:


图18-22 显示信息页面效果

通过上面的代码可以看到,“显示信息”和“设置语言”按钮的单击事件分别使用ShowMessage_Click方法和SetLanguage_Click方法来处理,下面我们来实现这两个方法。先来看ShowMessage_Click方法的代码实现。



using Windows.ApplicationModel.Resources.Core;
 
private void ShowMessage_Click(object sender, RoutedEventArgs e)
{
    //将StringResource资源的值赋给GetResource文本块的Text属性
    GetResource.Text = ResourceManager.Current.MainResourceMap.GetValue("Resources/StringResource").ValueAsString;
//为状态更改事件注册处理方法
ResourceManager.Current.DefaultContext.QualifierValues.MapChanged += QualifierValues_MapChanged;
}
async private void QualifierValues_MapChanged(IObservableMap<string, string> sender, IMapChangedEventArgs<string> @event)
{
    //使用Dispatcher的RunAsync方法将更改后的语言配置资源值显示到界面中
    await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
    {
        GetResource.Text = ResourceManager.Current.MainResourceMap.GetValue("Resources/StringResource").ValueAsString;
    });
}



在本示例中,ShowMessage_Click方法的所使用的代码和18.3.1小节示例中的后台代码是相同的,所以这里不再重复讲解。



接着来看一下SetLanguage_Click方法的实现,此方法用于跳转到SetLanguage语言设置页面,代码如下所示:



private void SetLanguage_Click(object sender, RoutedEventArgs e)
{
    //跳转到SetLanguage语言设置页面
    Frame.Navigate(typeof(SetLanguage));
}



在上面的代码中调用Frame.Navigate方法跳转到SetLanguage语言设置页面。下面在SetLanguage页面中添加语言设置选项。

双击打开SetLanguage.xaml文件,在Grid元素中添加一个Button按钮、一个TextBlock文本块和一个ComboBox控件。设置Button按钮的Content属性值为“确认选择”,此按钮用于返回显示信息页面。TextBlock文本块用于显示“选择语言”文本信息。ComboBox控件用来设置应用程序显示信息的语言,在ComboBox控件中添加两个ComboBoxItem列表项,这两个列表项的Content属性值分别为“简体中文”和“英语”,代码如下所示:


<Button Content="确定选择" FontSize="20" HorizontalAlignment="Left" Margin="848,126,0,0" VerticalAlignment="Top" Height="44" Width="128" Click="ConfirmSelected_Click"/>
<TextBlock HorizontalAlignment="Left" FontSize="30" Margin="559,134,0,0" TextWrapping="Wrap" Text="选择语言" VerticalAlignment="Top" Height="29" Width="131"/>
<ComboBox Name="LanguageSelected" HorizontalAlignment="Left" SelectedValuePath="Content" SelectionChanged="LanguageSelected_SelectionChanged" Margin="714,134,0,0" VerticalAlignment="Top" Width="105">
    <ComboBoxItem Content="简体中文"/>
    <ComboBoxItem Content="英语"/>
</ComboBox>


这时运行程序,在显示信息页面中单击“设置语言”按钮将跳转到SetLanguage语言设置页面,效果如图18-23所示,但是单击ComboBox控件的文本框选择列表项和单击“确定选择”按钮不会实现相应的功能,因为还没有为这两个控件的相关事件添加事件处理方法。


图18-23 语言设置页面

通过上面的代码可以看到,“确认选择”按钮的单击事件使用ConfirmSelected_Click方法来处理,ComboBox控件的SelectionChanged事件使用LanguageSelected_SelectionChanged方法来处理,下面在SetLanguage.xaml.cs文件中实现这两个方法。

首先实现LanguageSelected_SelectionChanged方法,此方法用于设置应用显示信息的语言,代码如下所示:



private void LanguageSelected_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    string selectedLanguage = LanguageSelected.SelectedValue.ToString();
    if (selectedLanguage == "简体中文")
    {
        //设置应用语言为“中文(简体)”
Windows.Globalization.ApplicationLanguages.PrimaryLanguageOverride = "zh-CN";
    }
    if (selectedLanguage == "英语")
    {
        //设置应用语言为“英语”
Windows.Globalization.ApplicationLanguages.PrimaryLanguageOverride = "en-US";
    }
}



在LanguageSelected_SelectionChanged方法中,定义了一个string类型的变量selectedLanguage,将用户选择的应用语言选项通过ToString方法转化为字符串存储在selectedLanguage变量中,然后判断选择的语言是“简体中文”还是“英语”。

当选择语言为“简体中文”时,将Windows.Globalization命名空间下的ApplicationLanguages类的PrimaryLanguageOverride属性赋值为“zh-CN”,PrimaryLanguageOverride属性用于获取或设置应用程序的首选语言标记,当此属性值为“zh-CN”时表示设置应用程序的主要语言为中文(简体)。当选择语言为“英语”时,则将PrimaryLanguageOverride属性赋值为“en-US”,表示应用程序的主要语言为英语。

然后为“确认选择”按钮添加单击事件处理方法ConfirmSelected_Click,单击此按钮将返回MainPage显示信息页面,代码如下所示:



private void ConfirmSelected_Click(object sender, RoutedEventArgs e)
{
    //跳转到MainPage显示信息页面
    Frame.Navigate(typeof(MainPage));
}



在上面的代码中调用Frame.Navigate方法跳转到MainPage显示信息页面。

运行程序查看效果,在显示信息页面中单击“设置语言”按钮,跳转到语言设置页面,在语言列表框中选择“简体中文”,单击“确认选择”按钮返回显示信息界面后,单击“显示信息”按钮,会显示中文信息的“你好世界”。如果在语言设置页面选择的语言为“英语”,单击“确认选择”按钮返回显示信息界面后单击“显示信息”按钮,会显示英语信息的“Hello World”。上述操作过程如图18-24至18-27所示。


图18-24 在语言设置页面选择“简体中文”


图18-25 在显示信息页面显示“你好世界”


图18-26 在语言设置页面选择“英语”

    

    图18-27 在显示信息页面显示“Hello World”

本小节实现了通过添加的语言设置选项来改变应用程序显示信息的语言。下一小节将要讲解如何设置指定页面中信息的语言。