WPF程序本地化要点梳理

news/2024/9/24 18:05:37

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/46282.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

CentOS7使用NAT模式配置网络

1.虚拟网络设置 2.虚拟机设置 3.本地网络配置

Transforms的使用

Transform的作用 把图片经过Transforms的一些函数之后就会对图片进行一些变化。比如,resize就是改变其大小,totensor就是把图片PIL或者numpy类型转化为Tensor类型。 Transforms的结构及和 用法 totensor的使用 Transforms下的toTensor是一个对象,我们需要先实例化一个对象之…

10 个提高生产力的 Go 小技巧

10 个提高生产力的 Go 小技巧 原创 陈煎鱼 脑子进煎鱼了 2024-06-21 08:42 广东 听全文最近 Phuong Le 大佬针对日常开发 Go 项目时,总结了一些好用的 Go 小技巧。 看了后,感觉对于刚入门 Go 的同学有一定的学习价值。可以挑好的学。应用到自己项目里。以下内容分享给大家。 …

【unity开发】 C#接口使用小结(持续更新)

C#的接口(interface) 早些时候我认识的接口仅仅只是作为一个方法签名来使用 但是随着学习的深入,就我感觉而言,我所认识的接口又越来越像一个抽象类了 1.最基本的使用 作为一个接口提供公共方法 用玩家的交互判断来举一个例子吧!接口也支持使用泛型 再举一个手动实现拷贝方…

14-vertical-aligin

vertical-aligin01 行盒的理解 作用: 将当前行里的所有内容包裹起来 <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0&…

6/17 死神永生服周报第五期

1.死神永生治理新闻 2.浅海公园[下] 3.死神永生TNT研究基地目录死神永生新闻 浅海公园[下] 死神永生服TNT军事基地[一]死神永生新闻前一周的治理新闻时间 人 行为 处罚方案6.14 Random748126323 火球炸服 踢+设为观察者浅海公园[下]死神永生服浅海生态公园已于6月12日建造完成,…

Goldeneye_v1靶场实操

本文章是对于来自詹士邦系列的电影——GoldenEye所命名的靶机的实操(如有错误,将及时修改)Goldeneye靶场实操 靶场信息下载靶机后用vm打开即可goldeneye靶机地址:https://www.vulnhub.com/entry/goldeneye-1,240/ 靶机发布日期:2018年5月4日 靶机描述:靶机命名来自詹士邦…

c语言程序实验————实验报告十三

c语言程序实验————实验报告十三实验项目名称: 实验报告十三 结构体运用程序设计 实验项目类型:验证性 实验日期:2024 年 5 月 30 日一、实验目的 1.掌握结构体类型变量的定义和使用 2.掌握结构体类型数组的概念和应用 3.掌握结构体类型指针的概念和应用 4.掌握共用体的概…