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