如果你的程序需要本地化,考虑的因素诸多,例如:当文本改变后,控件的当前高度,宽度 是否合适。所在的位置是否合适、字体、布局是否合适?如果已经构建了一个真正自适应的布局,就不会有问题。用户界面应当能够调整自身以适应动态的内容。下面是建议采用的一些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. C中的空宏定义,即只有一个参数

    空宏定义的测试代码 #include <stdio.h> #define D(x) int main() { D(printf("null macro")); retu ...

  2. C++ 11 Lambda表达式、auto、function、bind、final、override

    接触了cocos2dx 3.0,就必须得看C++ 11了.有分享过帖子:[转帖]漫话C++0x(四) —- function, bind和lambda.其实最后的Lambda没太怎么看懂. 看不懂没关 ...

  3. 将ASCII字符串转换为UNICODE字符串

    写在前面的话:在MFC的网络编程中,由于现在项目都是使用UNICODE编码,但是网络API的许多函数却只能接受const char*的参数,所以经常会遇到需要将char*转换为TCHAR*的时候,有一 ...

  4. Hadoop副本数配置

    一个文件,上传到hdfs上时指定的是几个副本就是几个.修改了副本数(dfs.replications),对已经上传了的文件也不会起作用.当然可以在上传文件的同时指定创建的副本数hadoop dfs - ...

  5. pygame绘制文本

    def drawText(self,text,posx,posy,textHeight=48,fontColor=(0,0,0),backgroudColor=(255,255,255)): font ...

  6. upupw phpmyadmin写shell

    废话: upupw给我的感觉是一个充当了waf毁三观的垃圾程序.然而,我讨厌的程序,管理员都特别喜欢用. 你会发现直接用之前那套写shell的建表然后在值里添加shell代码写到一个路径不可以了. C ...

  7. ios的一些经验记录1

    1.UITextAlignment  ---> NSTextAlignment 2.找不到segue viewcontroller 与segue要对应 3.标题栏用NavigationContr ...

  8. java质量提升相关

    http://blog.sina.com.cn/s/blog_6814a1510102v2rp.html

  9. dubbox2.8.4例子教程二

    简介 上篇博客写了个dubbox生产者,也用HttpClient代码测试了rest服务,下面记录dubbox消费者工程  一.工程结构    一.Simple.java package bhz.ent ...

  10. mongodb常见管理命令

    ----------1.复制数据库 wind:PRIMARY> show dbs; jinri 0.078GB local 1.078GB test 0.078GB wind 0.078GB w ...