WPF程序支持国际化的编码、语言、布局等,能够设置根据目标市场实现文字显示的本地化。
程序本地化要点:
1.给项目的.csproj文件的无条件的元素添加类似 zh-CN 的标记,编译时会把可国际化的元素单独生成一个 <项目名称>.resources.dll 文件,供翻译使用。
注:本方法通过dll单独存储可本地化的资源信息,使用微软的LocBaml工具(截至2024-5-19提交记录显示支持到.NET6 rc1)导出dll中的信息,然后翻译其中的文本信息为需要的语言,并在程序中设置使用相应的语言。整个过程不够方便。
2.元素的类似 xml:lang="zh-CN" 属性指示该元素及其子元素的语言,在本地化时应正确设置该属性的值,因为该属性会影响断字、拼写检查,以及数字、字体的显示等。该属性默认值是空字符串。
对于 FrameworkElement 或 FrameworkContentElement 的派生类,可以改用等效的依赖属性 Language ,Language 属性默认值是 en-US。
3.通过Uid属性对可本地化的界面元素进行跟踪,以便翻译时标识同一内容。
推荐通过执行 msbuild -t:updateuid <项目名称>.csproj 自动添加Uid属性。手动逐个添加的话耗时又易出错。修改后原有的uid不会发生变化,保证本地化资源的标识的一致性。
通过执行 msbuild -t:checkuid <项目名称>.csproj 可以检查Uid是否正确设置。
4.窗体考虑是否添加属性SizeToContent来实现根据内容自动调整,因为不同本地化字符串长度是不一样的。即使如此,同时界面设计时还是应该预留足够的空间。
5.添加属性 False 可以设置某个界面元素的文本不进行本地化。所有非编译资源(如界面元素的文本)的该属性默认值是true,默认会被本地化。这样简化了程序的本地化工作,只有明确某个元素不进行本地化时,才需要设置这个属性为false。
6. .NET自动根据程序的Threa.CurrentUICulture属性的值来选择要本地化的资源文件,该值默认与操作系统设置保持一致。可以设置程序的 AssemblyInfo 文件的NeutralResourcesLanguage 属性,指定找不到相应本地化资源时要使用的替代资源文件。如 [assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)] ,则替代显示资源文件为en-US文件夹下的.resources.dll文件。
7.字体可以通过设置界面元素的FrontFamily属性为字体的friendly name(友好名称)来调用。7.字体可以通过设置界面元素的FrontFamily属性为字体的friendly name(友好名称)来调用。
先区分清楚字体的文件名、友好名称、显示名称和标题。
如下窗体,采用默认字体
可以直接指定位于Windows\Fonts文件夹下的系统自带字体,如
也可以使用绝对URI指定磁盘其他路径(除了应用内的资源)下的字体来创建FontFamily,字体所在路径(包括末尾的/符号)和友好名称之间用#分割,如
注意:由于字体的友好名称需要有#前缀,所以字体文件所在的路径不能再含有#符号,否则会导致字体调用无效。下同。
也可以用相对URI指定磁盘其他路径(除了应用内的资源)下的字体,此时需要指定一个Base URI,以及字体的相对路径,如
-
通过后台cs代码设置:
注意:baseUri是字体所在文件夹,路径末尾的/不能省略,否则设置字体无效。 -
通过后台cs代码调用打包进应用程序的字体,必须使用相对URI。例如,指定Base URI为程序的根目录 pack://application:,,,/ ,字体在resources子目录中:
注意:字体打包方式有两种,编译动作选择Resource时,是嵌入程序集内作为二进制资源;编译动作选择Content时,作为单独的程序内容文件使用。
打包方式是Content时,为了让程序在运行时能调用字体,还需要把字体资源按照在程序根目录中相对路径,复制到程序输出目录中,可以设置始终复制或文件更新时复制,在编译时自动复制。
-
在XAML文件中指定FontFamily属性时,Base URI不用显式设置,就是XAML文件所在的URI,只需要设置相对路径。还是该例子,Base URI对应程序根目录,XAML代码如下:
也可以引用一个被项目引用的程序集(一般做成只包含字体)内打包的字体(编译动作必须是resource),程序集后跟着;component,然后是/#,然后是字体友好名称。如
设计器中没法直接显示字体调用效果。
但是编译运行后可以看到效果
还可以自定义复合字体,指定不同区域和语言要用的字体,文件类型是 .CompositeFont ,可以按普通字体一样使用。例如复合字体Global User Interface的定义如下:
点击查看代码
<FontFamily
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/composite-font"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:System="clr-namespace:System;assembly=mscorlib"
Baseline="0.9"
LineSpacing="1.2">
<!-- Name mapping -->
<FontFamily.FamilyNames>
<System:String x:Key="en-US">Global User Interface</System:String>
</FontFamily.FamilyNames>
<!-- Faces to report in font chooser UI -->
<FontFamily.FamilyTypefaces>
<FamilyTypeface
Weight="Normal" Stretch="Normal" Style="Normal"
UnderlinePosition="-0.1" UnderlineThickness="0.05"
StrikethroughPosition="0.3" StrikethroughThickness="0.05"
CapsHeight="0.5" XHeight="0.3" />
<FamilyTypeface
Weight="Bold" Stretch="Normal" Style="Normal"
UnderlinePosition="-0.1" UnderlineThickness="0.05"
StrikethroughPosition="0.3" StrikethroughThickness="0.05"
CapsHeight="0.5" XHeight="0.3" />
</FontFamily.FamilyTypefaces>
<!-- Character to family lookups (in lookup order) -->
<FontFamily.FamilyMaps>
<!--
Basic Latin 0000-007F
Latin-1 Supplement 0080-00FF
Latin Extended-A 0100-017F
Latin Extended-B 0180-024F
IPA Extensions 0250-02AF
Spacing Modifier Letters 02B0-02FF
Combining Diacritics Marks 0300-036F
Greek and Coptic 0370-03FF
Cyrillic 0400-04FF
Cyrillic Supplement 0500-052F
Phonetic Extensions 1D00-1D7F
Latin Extended Additional 1E00-1EFF
Greek Extended 1F00-1FFF
Alpha Pres Forms Latin FB00-FB0F -->
<!-- CHS -->
<FontFamilyMap
Unicode="0000-052F, 1D00-1FFF, FB00-FB0F"
Language="zh-Hans"
Target="Times New Roman"
Scale="1.0" />
<!-- CHT -->
<FontFamilyMap
Unicode="0000-052F, 1D00-1FFF, FB00-FB0F"
Language="zh-Hant"
Target="Times New Roman"
Scale="1.0" />
<!-- Other (include JA and KO) -->
<FontFamilyMap
Unicode="0000-052F, 1D00-1FFF, FB00-FB0F"
Target="Comic Sans MS, Verdana"
Scale="4.0" />
<!--
Armenian 0530-058F
Georgian 10D0-10FF
Alpha Pres Forms Armenian FB10-FB1C -->
<FontFamilyMap
Unicode="0530-058F, 10D0-10FF, FB10-FB1C"
Target="Sylfaen"
Scale="1.0" />
<!-- Other FontFamilyMap elements defined ... -->
</FontFamily.FamilyMaps>
</FontFamily>
如果设置的字体不存在或无法渲染,WPF会回退(fallback)到默认回退字体(为"Global User Interface",文件名是"GlobalUserInterface.CompositeFont")。
当给控件指定多个字体组成的序列,排在前面的字体无效时,会自动回退到后续的字体。如果字体序列都无效,又会回退到默认回退字体 Global User Interface。