首页 > 编程语言 >WPF程序本地化要点梳理

WPF程序本地化要点梳理

时间:2024-06-21 22:43:11浏览次数:16  
标签:本地化 程序 URI 字体 设置 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。

标签:本地化,程序,URI,字体,设置,WPF,梳理,属性
From: https://www.cnblogs.com/yinlichaoxi/p/18261608

相关文章

  • 游戏本地化以拓展海外市场
    LogrusITKorea的总监元庆燕(KyoungYeonWon)发表了一场关于“游戏本地化”的讲座,讲述了独立游戏开发者如何在梦想拓展海外市场的过程中,正确地本地化他们的游戏以满足国际市场的期望,以及实现这一重要任务的过程。元总监首先讨论了理解本地化含义的重要性。她说,人们常常过于简......
  • 基于C#的WPF+halcon开发,视觉和运动控制软件框架源码
    基于C#的WPF+halcon开发,视觉和运动控制软件框架源码带ui设计器和轴卡运控,上手可用,WPFMVVM开发模式,1:1参考easyvision开发,集成几十个软件算子,插件框架可以自定义变量,写c#脚本,自定义流程,包含了halcon脚本和封装的算子,可自定义ui,通过插件形式开发很方便拓展自己的功能。可学......
  • WPF/C#:数据绑定到方法
    在WPFSamples中有一个关于数据绑定到方法的Demo,该Demo结构如下:运行效果如下所示:来看看是如何实现的。先来看下MainWindow.xaml中的内容:<Window.Resources><ObjectDataProviderObjectType="{x:Typelocal:TemperatureScale}"MethodName="Con......
  • WPF控件库 https://wpfui.lepo.co/
    wpfui:一个开源免费具有现代化设计趋势的WPF控件库 https://wpfui.lepo.co/合集-C#(46) 1.使用C#将几个Excel文件合并去重分类2023-11-152.C#使用SqlSugar操作MySQL数据库实现简单的增删改查2023-11-163.C#中的类和继承2023-11-174.C#中的virtual和override关键字2023-......
  • 进入全球市场的游戏本地化策略
    开发商在开发游戏时已经很久没有针对单一国家了。对于目前正在开发的许多游戏来说,它们都致力于进入全球市场并吸引各种客户。然而,必须考虑一些游戏是否适合某些市场,以及某些国家是否具有足够的市场潜力。此外,在进入海外市场时,有一件事是绝对不能忽视的,那就是本地化的过程。有......
  • 第二十四节:带你梳理Vue2 : Vue具名插槽/作用域插槽/v-slot指令
    1.具名插槽1.1没有使用具名插槽的问题有的时候我们在使用子组件时,在子组件模板上不同的位置插入不同的内容,只有一个插槽显然没法满足我们的需求,看示例:需求如下:子组件是一篇文章的结构父组件在调用子组件是给文章插入标题,正文,时间信息示例代码如下:<divid=......
  • WPF绘制3D小demo
    试过了WPF原生3D和HelixToolkit.Wpf,感觉还是SharpDX的效果比较好,所以使用了HelixToolkit.Wpf.SharpDX初学,仅供参考,没搞懂怎么双面渲染,所以每个面用了2个三角形分别显示正面和反面 <Grid><hx:Viewport3DXEnableSwapChainRendering="True"FXAALevel="Low"Backg......
  • WPF支持任意快捷键+鼠标组合的绑定类
    publicinterfaceIInputSignal{boolIsMatch(InputEventArgsargs);}publicclassKeyDownSignal:KeySignal{publicKeyDownSignal(Keykey):base(key){}publicoverrideboolIsMatch(InputEve......
  • 演示:WPF开发的Diagram自动化流程图应用
    一、目的:演示Diaram应用功能二、预览三、功能列表功能模块通用测试流程图仪器仪表机器人网络通信测试PLC测试轮毂生产线流程测试 图像处理目标检测绘图思维导图图表流程图功能模板管理工程管理模块许可管理工具栏开始停止删除清......
  • DevExpress WPF中文教程:Grid - 如何将更改发布到数据库(设计时)?
    DevExpressWPF拥有120+个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpressWPF能创建有着强大互动功能的XAML基础应用程序,这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。无论是Office办公软件的衍伸产品,还是以数据为中心......