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的定义如下:
点击查看代码
<FontFamilyxmlns="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><FamilyTypefaceWeight="Normal" Stretch="Normal" Style="Normal"UnderlinePosition="-0.1" UnderlineThickness="0.05"StrikethroughPosition="0.3" StrikethroughThickness="0.05"CapsHeight="0.5" XHeight="0.3" />
<FamilyTypefaceWeight="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-007FLatin-1 Supplement 0080-00FFLatin Extended-A 0100-017FLatin Extended-B 0180-024FIPA Extensions 0250-02AFSpacing Modifier Letters 02B0-02FF Combining Diacritics Marks 0300-036F Greek and Coptic 0370-03FFCyrillic 0400-04FF Cyrillic Supplement 0500-052F Phonetic Extensions 1D00-1D7FLatin Extended Additional 1E00-1EFFGreek Extended 1F00-1FFFAlpha Pres Forms Latin FB00-FB0F --><!-- CHS --> <FontFamilyMapUnicode="0000-052F, 1D00-1FFF, FB00-FB0F"Language="zh-Hans"Target="Times New Roman"Scale="1.0" /><!-- CHT --> <FontFamilyMapUnicode="0000-052F, 1D00-1FFF, FB00-FB0F"Language="zh-Hant"Target="Times New Roman"Scale="1.0" /><!-- Other (include JA and KO) --> <FontFamilyMapUnicode="0000-052F, 1D00-1FFF, FB00-FB0F"Target="Comic Sans MS, Verdana"Scale="4.0" />
<!--Armenian 0530-058F Georgian 10D0-10FFAlpha Pres Forms Armenian FB10-FB1C --><FontFamilyMapUnicode="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。