zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    [JavaScript] 数组去重
    [JavaScript] console.log只在查看时才会读取这个打印的对象,并把此刻相关属性和值显示出来
    [Vuejs] 点击单选框触发两次点击事件的处理
    [Vuejs] 给ref赋值需要注意的问题
    [Vuejs] Vue解决代理设置导致浏览器Session丢失的问题
    [Vuejs] 在vue各个组件中应用全局scss变量
    [JavaScript] 跳出循环方法总结
    [JavaScript] 根据指定宽度截取字符串
    [Element-UI] 使用Element-UI的DateTimePicker组件报错:Cannot read property 'getHours' of undefined
    [Vuejs] 组件 v-if 和 v-show 切换时生命周期钩子的执行
  • 原文地址:https://www.cnblogs.com/kiminozo/p/2335063.html
Copyright © 2011-2022 走看看