WPF程序本地化要点梳理

WPF程序支持国际化的编码、语言、布局等,能够设置根据目标市场实现文字显示的本地化。
程序本地化要点:

1.给项目的.csproj文件的无条件的元素添加类似 zh-CN 的标记,编译时会把可国际化的元素单独生成一个 <项目名称>.resources.dll 文件,供翻译使用。

注:本方法通过dll单独存储可本地化的资源信息,使用微软的LocBaml工具(截至2024-5-19提交记录显示支持到.NET6 rc1)导出dll中的信息,然后翻译其中的文本信息为需要的语言,并在程序中设置使用相应的语言。整个过程不够方便。

image
image
image

2.元素的类似 xml:lang="zh-CN" 属性指示该元素及其子元素的语言,在本地化时应正确设置该属性的值,因为该属性会影响断字、拼写检查,以及数字、字体的显示等。该属性默认值是空字符串。

对于 FrameworkElement 或 FrameworkContentElement 的派生类,可以改用等效的依赖属性 Language ,Language 属性默认值是 en-US。

3.通过Uid属性对可本地化的界面元素进行跟踪,以便翻译时标识同一内容。

推荐通过执行 msbuild -t:updateuid <项目名称>.csproj 自动添加Uid属性。手动逐个添加的话耗时又易出错。修改后原有的uid不会发生变化,保证本地化资源的标识的一致性。

image
image
image

通过执行 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(友好名称)来调用。

先区分清楚字体的文件名、友好名称、显示名称和标题。

image

如下窗体,采用默认字体

image

可以直接指定位于Windows\Fonts文件夹下的系统自带字体,如

image
image

也可以使用绝对URI指定磁盘其他路径(除了应用内的资源)下的字体来创建FontFamily,字体所在路径(包括末尾的/符号)和友好名称之间用#分割,如

image
image

注意:由于字体的友好名称需要有#前缀,所以字体文件所在的路径不能再含有#符号,否则会导致字体调用无效。下同。

也可以用相对URI指定磁盘其他路径(除了应用内的资源)下的字体,此时需要指定一个Base URI,以及字体的相对路径,如

image
image

  • 通过后台cs代码设置:
    image
    image
    注意:baseUri是字体所在文件夹,路径末尾的/不能省略,否则设置字体无效。

  • 通过后台cs代码调用打包进应用程序的字体,必须使用相对URI。例如,指定Base URI为程序的根目录 pack://application:,,,/ ,字体在resources子目录中:
    image
    image
    image
    注意:字体打包方式有两种,编译动作选择Resource时,是嵌入程序集内作为二进制资源;编译动作选择Content时,作为单独的程序内容文件使用。
    image
    打包方式是Content时,为了让程序在运行时能调用字体,还需要把字体资源按照在程序根目录中相对路径,复制到程序输出目录中,可以设置始终复制或文件更新时复制,在编译时自动复制。
    image

  • 在XAML文件中指定FontFamily属性时,Base URI不用显式设置,就是XAML文件所在的URI,只需要设置相对路径。还是该例子,Base URI对应程序根目录,XAML代码如下:
    image

也可以引用一个被项目引用的程序集(一般做成只包含字体)内打包的字体(编译动作必须是resource),程序集后跟着;component,然后是/#,然后是字体友好名称。如

image
image
image
设计器中没法直接显示字体调用效果。image
但是编译运行后可以看到效果image

还可以自定义复合字体,指定不同区域和语言要用的字体,文件类型是 .CompositeFont ,可以按普通字体一样使用。例如复合字体Global User Interface的定义如下:

image

点击查看代码
<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")。

image
当给控件指定多个字体组成的序列,排在前面的字体无效时,会自动回退到后续的字体。如果字体序列都无效,又会回退到默认回退字体 Global User Interface。

posted @ 2024-06-21 22:37  引力潮汐  阅读(102)  评论(0)    收藏  举报