如果你的程序需要本地化,考虑的因素诸多,例如:当文本改变后,控件的当前高度,宽度 是否合适。所在的位置是否合适、字体、布局是否合适?如果已经构建了一个真正自适应的布局,就不会有问题。用户界面应当能够调整自身以适应动态的内容。下面是建议采用的一些WPF设计原则:

  • 不要使用硬编码的宽度或高度
  • 将Window.SizeToContent 属性设置为Width、Height 或 WidthAndHeight,从而使窗口的尺寸能够根据需要进行变化(根据窗口结构的不同,并不总需要这样,但有时候会很有用)。
  • 使用 ScrollViewer 控件包装大量的文本

其他考虑事项:

  • 如果准备本地化应用程序的语言,其字符集区别很大,就需要使用不同的字体。可以通过在用户界面中本地化 FontFamily 属性完成该操作,或者可以使用混合字体,如 Global User Interface 字体、 Global Sans Serif 字体或 Global Serif 字体,这些字体支持所有语言。
  • 本地化是一个复杂的猪蹄。WPF 有一个可行的解决方案,但是还不是很完善。看完本篇博文之后,您可能希望看一看微软的 WPF 本地化白皮书,该白皮书有 66 页,可以从 http://wpflocalization.codeplex.com/ 获取该白皮书以及示例代码。另外期望微软在将来改善设计工具(如在Visual Studio 和 Expression Blend)对本地化的支持。

下面进入正题来实现本地化,其实操作起来并不是特别复杂,不要被本博文的大量细节描述所吓着了 O(∩_∩)O~~。操作一遍就会感觉不过如此了。

第一步:需要为项目的 .csproj 文件,在第一个元素 <PropertyGroup> 中的任意一个地方,添加元素: <UICulture>en-US</UICulture>   (当然你也可以选择使用 zh-CN 中文作为默认文化)

上面的标记是告诉编译器应用程序默认文化是 U.S.English (显然,可以选择其他适合的文化,正如上提到的 zh-CN)。一旦进行了这一修改,生成过程也会发生变化。在下一次编译应用程序时,最后会生成一个名为en-US的子文件夹。在该文件夹中包含的是一个附属程序集,该程序集包含了应用程序的所有编译过的 BAML 资源,以前这些资源保存在主应用程序的程序集中。

简单解释下 ‘en-US’ ,从技术角度讲,不是针对特定语言本地化应用程序,而是针对文化,文化考虑了语言的地区变种。文化由使用连字符分割的两个标识符标识。第一部分标识语言,第二部分标识国家。因此 en-US 代表美国英语,zh-CN 代表中国汉语。有关文化名称及其包含两部分的标识符的完整列表,可以参考 Visual Studio 帮助文档中的 System.Globalization.CultureInfo 类。

改好之后,生成程序是无法运行的。会报找不到 xxxx.xaml 的错误,因为你本机(如果你在中国)的默认语言是 zh-CN ,所以你需要在 App.xaml 中的代码部分加入以下代码进行测试即可成功运行起来:

    /// <summary>
/// App.xaml 的交互逻辑
/// </summary>
public partial class App : Application
{
public App()
{
Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("en-US");
}
}

第二步:为本地化准备标记元素

需要针对所有希望本地化的元素进行标记,添加专门的 Uid 特性。下面是一个标记例子:

<Button x:Uid="Button_1" Grid.Row="" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="" Padding="">a button</Button>

几乎都是需要标记的,手动去标记会消耗大量的时间和精力(根据你程序大小),幸运的是Visual Studio中包含了批量生成该Uid特性的工具,在开始菜单中可以找到,如下图所示:

选择 VS2012开发人员命令提示 即可。

在命令行中输入:msbuild /t:updateuid [你的.csproj文件路径]

如图:

在VS中的所有元素的UID就都加好啦。

第三部:为了让翻译者可以顺利翻译并且不碰代码项目,我们需要生成一个.csv文件给翻译者进行内容翻译。

这里我们需要用到 LocBaml 工具,目前,LocBaml 并不是已经编译过的工具。反而,可以作为示例从http://msdn.microsoft.com/zh-cn/library/ms746621.aspx 获取其源代码。必须手工对其进行编译后使用。(在本文中已经提供本地化示例下载 其中包含已经编译的 LocBaml 工具可直接使用)

在DOS下使用 LocBaml 工具命令: locbaml /parse [你的资源文件路径]   (如: locbaml  /parse en-US\1024_LocalizableApplication.resources.dll )

如图:

执行该命令后会在当前的目录生成一个包含细节内容的 .csv 文件,该文件可以拷贝给翻译者进行翻译。可以使用Excel、记事本程序进行打开,每行包含7个值:

  • BAML 资源的名
  • 元素的 Uid 和本地化的属性的名称
  • 本地化类别。该值来自 LocalizationCategory 枚举,用于帮助标识属性表示的内容的类型
  • 属性是否是可读的(实质上是指能否在用户界面上显示为文本)。所有可读的值总是需要被本地化,但不可读的值可能需要本地化,也可能不需要。
  • 属性值是否可以被翻译者修改。除非专门为其指定了其他值,该属性值总是为True。
  • 为翻译者提供的额外注释。如果没有提供注释,该值为空。
  • 属性值。这个是需要被本地化的细节。

第四步:拷贝.csv 文件给翻译者翻译之后

我们将翻译完毕后的 .csv 文件将其编译进附属程序集,所以我们需要再一次使用 LocBaml 工具。指令如下(我这里以编译一份中文语言为例):

  1. 首先创建一个文件夹在Debug目录,文件夹名称为:zh-CN
  2. 执行Locbaml指令:locbaml /generate en-US\1024_LocalizableApplication.resources.dll /trans:1024_LocalizableApplication.resources.zh-CN.CSV /cul:zh-CN /out:zh-CN

如图:

上面的指令执行以下操作:

  • 使用原来的附属程序集 en-US\1024_LocalizableApplication.resources.dll
  • 使用翻译过的 .csv 文件 1024_LocalizableApplication.resources.zh-CN.CSV
  • 使用中文语言文化
  • 输出到zh-CN目录

即可生成一个新的附属程序集文件:1024_LocalizableApplication.resources.dll

//需要调试不同的本地化只需要修改 Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("en-US"); 这段代码中的 en-US 即可

其他注意事项:如果本地化其他语言进去之后,出现乱码,请把.csv 文件另存为utf-8文件后 在进行重新生成附属程序集文件(第四步操作)

至此,本地化已经结束·更多的细节请参考微软的本地化白皮书。

本文示例源码下载:http://files.cnblogs.com/andrew-blog/1024_LocalizableApplication.rar

开发工具:VS2012

参考:http://www.wxzzz.com/?id=136

WPF 本地化(多语言)的更多相关文章

  1. [WPF]本地化入门

    1. 前言 WPF的本地化是个很常见的功能,我做过的WPF程序大部分都实现了本地化(不管最终有没有用到).通常本地化有以下几点需求: 在程序启动时根据CultureInfo.CurrentUICult ...

  2. DotNetCore 3.0 助力 WPF本地化

    概览 随着我们的应用程序越来越受欢迎,我们的下一步将要开发多语言功能.方便越来越多的国家使用我们中国的应用程序, 基于 WPF 本地化,我们很多时候使用的是系统资源文件,可是动态切换本地化,就比较麻烦 ...

  3. ios调用系统相册、相机 显示中文标题、本地化多语言支持

    因为调用系统相册.相机需要显示中文,所以搞了半天才知道是在Project->info->Custom ios Target Properties 添加 Localizations 并加入C ...

  4. 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(30)-本地化(多语言)

    原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(30)-本地化(多语言) 我们的系统有时要扩展到其他国家,或者地区,需要更多的语言环境,微软提供了一些解决 ...

  5. Windows Phone 8本地化多语言支持

    原文 Windows Phone 8本地化多语言支持 在WP8平台处理本地化多语言的支持还是比较容易的,大部分工作都有VS IDE处理,开发者只需简单操作,并翻译本地资源即可实现. 无论您目前的应用是 ...

  6. Windows 8本地化多语言支持

    原文:Windows 8本地化多语言支持 在Win8平台处理本地化多语言的支持相对比较容易的,但比WP8稍微复杂一点,并不像WP8平台那样大部分工作都有VS IDE处理,Win8平台的操作基本需要开发 ...

  7. dotnetcore3.1 WPF 实现多语言

    dotnetcore3.1 WPF 实现多语言 Intro 最近把 DbTool 从 WinForm 迁移到了 WPF,并更新到了 dotnet core 3.1,并实现了基于 Microsoft.E ...

  8. ASP.NET Core搭建多层网站架构【13-扩展之支持全球化和本地化多语言】

    2020/02/03, ASP.NET Core 3.1, VS2019, ResXManager 摘要:基于ASP.NET Core 3.1 WebApi搭建后端多层网站架构[13-扩展之支持全球化 ...

  9. WPF: 本地化(Localization) 实现

    本文将讨论一种较为方便的本地化方法. 由于在项目中要实现本地化,所以在网上查找相关的解决方案.通过一系列调研,发现实现本地化的方法主要有以下三种: 通过编译项目以设置 x:Uid 并使用 LocBam ...

随机推荐

  1. hdoj1069 Monkey and Banana

    Monkey and Banana Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  2. 李洪强iOS开发之-sql数据库的使用

    一,创建工程 二: 导入头文件 三:导入 四: 数据库增删改查 //因为是结构体类型,所以用assign //1.创建数据库(保存路径) @property(nonatomic,assign)sqli ...

  3. 安装ionic 以及 cordova 环境配置详细过程,(错误解决)

    [摘要:全部装置进程: 1. jdk 1.7.2 (http://www.oracle.com/technetwork/java/javase/downloads/index.html) 装置好以后 ...

  4. mysql海量数据处理步骤

    本文转自https://segmentfault.com/a/1190000006158186 当MySQL单表记录数过大时,增删改查性能都会急剧下降,可以参考以下步骤来优化: 单表优化 除非单表数据 ...

  5. resource文件

    Resources的详情见http://www.csharpwin.com/dotnetspace/10957r3991.shtml 1.create public static void Main( ...

  6. 【Unity笔记】UGUI的Image、RawImage控件

    Image控件只能使用Sprite图片,RawImage通常使用Texture类型图片.项目设为2D模式后导入的图片Texture Type会自动转为Sprite. 没有选择源图片时,可以只选择颜色. ...

  7. java日期工具类DateUtil-续二

    该版本是一次较大的升级,农历相比公历复杂太多(真佩服古人的智慧),虽然有规律,但涉及到的取舍.近似的感念太多,况且本身的概念就已经很多了,我在网上也是查阅了很多的资料,虽然找到一些计算的方法,但都有些 ...

  8. Intellij IDEA创建Maven Web项目<转>

    1前言 在创建项目中,IDEA提供了很多项目模板,比如Spring MVC模板,可以直接创建一个基于Maven的Spring MVC的demo,各种配置都已经设定好了,直接编译部署就可以使用. 最开始 ...

  9. c#生成rsa公钥和私钥

    c#生成rsa公钥和私钥的类库,包括加密解密,可以用在网站和winform项目 源码地址: http://download.csdn.net/detail/jine515073/8383809

  10. java-事务-案例

    项目结构: 数据库: /* SQLyog Ultimate v12.09 (64 bit) MySQL - 5.5.53 : Database - threadlocal ************** ...