WP7应用开发笔记(18) 本地化与多语言

WP程序面向的是App Hub市场发布,支持多种语言是一个很重要的需求,也能为程序提供更广泛的用户群。

如何实现让程序实现语言本地化呢?

 

使用资源文件

熟悉.net开发都知道资源文件中是可以支持多语言与本地化的基本。

创建资源文件

右键单击项目名称,在“添加新项”对话框中,选择“资源文件”,可以命名为 AppResources.resx。此文件包含应用程序默认语言的资源。

最常用的是字符串资源。字符串资源是一种键-值(还有备注)方式的表,如下图。

AppResources.resx资源文件会自动生成AppResources类用于获取资源的值。

 

使用资源文件替换文本

现在要做的是将所有界面相关的字符串全部换成资源文件。

如:

ErrMessage = "接收器无法连接";

换成

ErrMessage =  AppResources.Could_not_connect;

这个操作比较单调容易出错,推荐使用Resharp工具的move操作。

 

綁定资源文件

除了代码以外,Xaml里面也难免会遇到文本信息。不过不能Xaml中直接使用资源文件,需要一个比较麻烦的工作:

首先创建一个包装类,我命名为LocalizedStrings,将AppResources的所有静态属性变成成员属性。

如下:

public class LocalizedStrings 
{

public string ThanksString
{
get { return AppResources.ThanksString; }
}

public string UseString
{
get { return AppResources.UseString; }
}

public string Discussions
{
get { return AppResources.Discussions; }
}

...

}

 

将LocalizedStrings添加到App.xaml里

<Application.Resources> 
<Localization:LocalizedStrings x:Key="LocalizedStrings" />

</Application.Resources>

 

 

将界面上的文本信息全部换成LocalizedStrings的静态绑定:

<TextBlock x:Name="ApplicationTitle" Text=”多媒体遥控器" />

换成:

<TextBlock x:Name="ApplicationTitle" Text="{Binding Path=AppName, Source={StaticResource LocalizedStrings}}" />

 

添加多语言的资源文件

将界面文本全部移动到资源文件AppResources.resx后。

复制AppResources.resx重命名为AppResources.en-US.resx 

en-US表示美国英语,将全部键对应的值翻译成英文,然后系统根据当前语言自动选择需要的资源文件。

还可以添加AppResources.zh-TW.resx 繁体中文之类的。

 

完整的区域性名称表请参考:

http://msdn.microsoft.com/zh-cn/library/hh202918(v=vs.92).aspx

 

修改项目文件 

用记事本或Notepad++打开RemoteControl.csproj

找到 SupportedCultures元素,添加需要支持的区域性名称。

<SupportedCultures>
<SupportedCultures>en-US;zh-TW;zh-CN;</SupportedCultures>
</SupportedCultures>

 

测试语言支持

在WP模拟器中选择“设置”,进入“区域和语言”,将显示语言换成你需要测试的语言,根据提示重启。

运行程序看看是否是对应的语言。

 

使用语言资源 DLL

资源文件只能改变程序内部的语言,但是如果想修改WP应用程序列表中的标题或磁贴上的标题就不行了。

这就需要使用语言资源DLL,语言资源DLL需要用C++项目创建MDSN上有比较详细的介绍,但是太麻烦了。

 

国外的有人写了一个WP7 AppResLib DLL Generator帮助我们生成 语言资源 DLL

原文地址:http://engine-designs.com/wp7-appreslib-dll-generator.html

首先下载 WP7 AppResLib DLL Generator

复制Sample.xml 命名为项目名RemoteControl.xml

编辑内容,国家代码LocaleID可以在Locale_ID_List.txt查询到,没添加就表示默认,Name可以随便取。

示例:

<Projects> 
<Project Name="RemoteControl">
<Language Name="Neutral">
<AppTitle>RemoteControl</AppTitle>
<TileText>RemoteControl</TileText>
</Language>
<Language Name="Chinese-RPC" LocaleID="0804">
<AppTitle>多媒体遥控器</AppTitle>
<TileText>多媒体遥控器</TileText>
</Language>
<Language Name="English (United States)" LocaleID="0409">
<AppTitle>RemoteControl</AppTitle>
<TileText>RemoteControl</TileText>
</Language>
<Language Name="Chinese - Taiwan" LocaleID="0404">
<AppTitle>多媒體遙控器</AppTitle>
<TileText>多媒體遙控器</TileText>
</Language>
</Project>
</Projects>

 

 

然后再CMD里面运行WP7AppResLib RemoteControl.xml

就会在下生成目录RemoteControl,里面包含了AppResLib.dll,AppResLib.dll.0404.mui等。

 

全部拷贝到项目根目录,就是App.xaml所在地目录,“添加现有项”到项目中。

查看属性,将生成操作全部设置为“内容”。

 

修改WMAppManifest.xml替换2个地方:

<App Title="@AppResLib.dll,-100"

 

<Tokens> 
<PrimaryToken ...>
<TemplateType5>

...
<Title>@AppResLib.dll,-200</Title>

...
</TemplateType5>
</PrimaryToken>
</Tokens>

 

好了这样应用程序列表中的标题或磁贴上的标题就支持本地化了。赶紧测试一下。

 

参考文档:

Windows Phone 全球化和本地化

http://msdn.microsoft.com/zh-cn/library/ff637522(v=vs.92).aspx

posted @ 2012-02-01 20:24  kiminozo  阅读(2940)  评论(5编辑  收藏  举报