WPF 本地化(多语言)
如果你的程序需要本地化,考虑的因素诸多,例如:当文本改变后,控件的当前高度,宽度 是否合适。所在的位置是否合适、字体、布局是否合适?如果已经构建了一个真正自适应的布局,就不会有问题。用户界面应当能够调整自身以适应动态的内容。下面是建议采用的一些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 工具。指令如下(我这里以编译一份中文语言为例):
- 首先创建一个文件夹在Debug目录,文件夹名称为:zh-CN
- 执行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 本地化(多语言)的更多相关文章
- [WPF]本地化入门
1. 前言 WPF的本地化是个很常见的功能,我做过的WPF程序大部分都实现了本地化(不管最终有没有用到).通常本地化有以下几点需求: 在程序启动时根据CultureInfo.CurrentUICult ...
- DotNetCore 3.0 助力 WPF本地化
概览 随着我们的应用程序越来越受欢迎,我们的下一步将要开发多语言功能.方便越来越多的国家使用我们中国的应用程序, 基于 WPF 本地化,我们很多时候使用的是系统资源文件,可是动态切换本地化,就比较麻烦 ...
- ios调用系统相册、相机 显示中文标题、本地化多语言支持
因为调用系统相册.相机需要显示中文,所以搞了半天才知道是在Project->info->Custom ios Target Properties 添加 Localizations 并加入C ...
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(30)-本地化(多语言)
原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(30)-本地化(多语言) 我们的系统有时要扩展到其他国家,或者地区,需要更多的语言环境,微软提供了一些解决 ...
- Windows Phone 8本地化多语言支持
原文 Windows Phone 8本地化多语言支持 在WP8平台处理本地化多语言的支持还是比较容易的,大部分工作都有VS IDE处理,开发者只需简单操作,并翻译本地资源即可实现. 无论您目前的应用是 ...
- Windows 8本地化多语言支持
原文:Windows 8本地化多语言支持 在Win8平台处理本地化多语言的支持相对比较容易的,但比WP8稍微复杂一点,并不像WP8平台那样大部分工作都有VS IDE处理,Win8平台的操作基本需要开发 ...
- dotnetcore3.1 WPF 实现多语言
dotnetcore3.1 WPF 实现多语言 Intro 最近把 DbTool 从 WinForm 迁移到了 WPF,并更新到了 dotnet core 3.1,并实现了基于 Microsoft.E ...
- ASP.NET Core搭建多层网站架构【13-扩展之支持全球化和本地化多语言】
2020/02/03, ASP.NET Core 3.1, VS2019, ResXManager 摘要:基于ASP.NET Core 3.1 WebApi搭建后端多层网站架构[13-扩展之支持全球化 ...
- WPF: 本地化(Localization) 实现
本文将讨论一种较为方便的本地化方法. 由于在项目中要实现本地化,所以在网上查找相关的解决方案.通过一系列调研,发现实现本地化的方法主要有以下三种: 通过编译项目以设置 x:Uid 并使用 LocBam ...
随机推荐
- ny12 喷水装置(二)
喷水装置(二) 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 有一块草坪,横向长w,纵向长为h,在它的橫向中心线上不同位置处装有n(n<=10000)个点状的 ...
- c++ 使用vs2010调用 win32api
以前读书时都是用vc6.0.后来学c#用vs.装系统只装了vs2010.今天用vs2010写c++程序.发现有点陌生.就总结下,免得以后忘记. 首先用vs2010选择c++语言.新建一个win32控制 ...
- LeetCode: Generate Parentheses 解题报告
Generate ParenthesesGiven n pairs of parentheses, write a function to generate all combinations of w ...
- android 使用 sqlite
SQLiteHelper .class (升级的时候,做点小技巧) package com.keyue.qlm.util; import android.content.Context; imp ...
- C#处理文本文件TXT实例详解(转)
作者:安静平和 字体:[增加 减小] 类型:转载 时间:2015-02-02我要评论 这篇文章主要介绍了C#处理文本文件TXT的方法,以实例形式详细分析了txt文本文件的读取.修改及打印等功能的实现技 ...
- 5种漂亮的纯CSS3动画按钮特效
这次我们要来分享一款很不错的CSS3按钮动画,这款CSS3按钮一共有5种动画方式,每一种都是鼠标滑过动画形式,虽然这些动画按钮不是十分华丽,但是小编觉得不像其他按钮那样很难扩展,我们可以修改CSS代码 ...
- MySQL 时间戳(Timestamp)函数
1. MySQL 获得当前时间戳函数:current_timestamp, current_timestamp() mysql> select current_timestamp, curren ...
- strerror() 和perror()函数
在linux编程中,strerror()是个好东东,因为一个孤零零的errno看不出个所以然,然而strerror()返回的错误描述已经给我们解决问题提供了80%的成功率.但从安全性的角度来讲,str ...
- ad9 的快捷方式
TAB:选中元件后,可以显示该元件的属性: PAGEUP:以鼠标所在点为中心,放大视图: PAGEDOWN:以鼠标所在点为中心,缩小视图: HOME:居中,可以从原来光标下的图纸位置,移位到工作区中心 ...
- swconfig--交换接口配置命令
swconfig是交换接口(switch)配置命令. swconfig list ; 列出可用的SWITCH设备信息(dev参数) Found: switch0 - ag71xx-mdio. swco ...