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 ...
 
随机推荐
- python super()使用详解
			
1.super的作用调用父类方法2.单继承使用示例 #coding:utf-8 #单继承 class A(object): def __init__(self): self.n=2 def add(s ...
 - C/C++中获取数组的长度
			
C/C++中没有提供直接获取数组长度的函数.对于存放字符串的字符数组,可用strlen函数获取长度. 如:char a[]="hello world";int count = st ...
 - 常见电源品牌大揭密(转贴自pceva,作者royalk)
			
常见电源品牌大揭密(转贴自pceva,作者royalk) 介绍电源品牌代工厂之前,必须介绍一下电源分类: 标准电源 标准电源就是电脑城装机用得最多的电源,性能正常,外观一般,原生接线,也没有什么风扇停 ...
 - cocos2dx遇到的坑1
			
记录下在cocos2dx 2.x时代遇到的问题 1.节点的观念,用节点来管理 2.pushscene popscene 和replacewithscene runwithscene对应 3.lua里释 ...
 - warning: ignoring option PermSize=256m; support was removed in 8.0
			
使用jdk1.8后,控制台出现下面提示信息: Java HotSpot(TM) 64-Bit Server VM warning: ignoring option PermSize=256m; sup ...
 - iOS边练边学--定时任务和HUD
			
九宫格计算思路 利用控件的索引index计算出控件所在的行号和列号 利用列号计算控件的x值 利用行号计算控件的y值 HUD 其他说法:指示器.遮盖.蒙板 半透明HUD的做法 背景色设置为半透明颜色 定 ...
 - 判断DataTable某字段是否包含某值
			
// <summary> /// 判断DataTale中判断某个字段中包含某个数据 /// </summary> /// <param name="dt&quo ...
 - 开源直播OBS ( Open Broadcaster Software ) 多机位,多场景切换
			
项目主页:https://obsproject.com/download 软件是基于MFC的,下载源码后一次性就可以编译通过,使用很简单. 使用了以下开源库: x264 ...
 - 关于Cocos2d-x中掉帧导致游戏一卡一卡的网上一些的解决方法
			
方法1 掉帧主要是setpostion引起的 因为每一帧每一个精灵都要set一次虽然不知道为什么会这样但是if(poX<1000&&pox>-100){ xx-& ...
 - 关于Cocos2d-x的数据存储
			
Cocos2d-x对数据的存储没有用到数据库,但是有用到一个类似数据库的小型数据库,就是数据存储.存储后的数据用XML的文件格式保存在C:\Users\Administrator\AppData\Lo ...