.NET Core AvaloniaUI实现多语言国际化

AvaloniaUI是一个基于.Net Core的跨平台桌面程序UI框架,如果使用AvaloniaUI有多语言国际化的朋友可以参考我这篇文章:

这篇文章可以帮助你:

  1. 根据用户系统设置的语言改变UI显示的语言
  2. 可以在设计器中预览效果
  3. 支持TextBox的Watermark属性
  4. 支持ContentControl的Content属性
  5. 支持TextBlock的的Text属性

第1步:

在项目目录中新建一个文件夹(此处示例名为Localizations)用于存放AppResources.resx文件:

这文件有的名称、值、注释,其中的名称就是下面要附加要控件属性的值

这里默认AppResources.resx是英语,假如我要添加简体中文;则新建一个AppResources.zh-Hans.resx文件,如果要添加更多语言请参考:

https://docs.microsoft.com/zh-cn/xamarin/xamarin-forms/app-fundamentals/localization/text?tabs=windows

注意:新建的资源文件顶部访问修饰符不能选择“无代码生成”

第2步:

新建控件的依赖属性,原理就是当控件的显示文本属性更改时查找Uid并更换为指定的多语言文本,Uid为在AppResources.resx中定义的名称

新建LocalizationAttachedPropertyHolder.cs文件

1 1 public class LocalizationAttachedPropertyHolder 2 2 { 3 3 public static AvaloniaProperty<string> UidProperty = 4 4 AvaloniaProperty.RegisterAttached<LocalizationAttachedPropertyHolder, AvaloniaObject, string>("Uid"); 5 5 6 6 static LocalizationAttachedPropertyHolder() 7 7 { 8 8 TextBlock.TextProperty.Changed.Subscribe(next => 9 9 { 1010 var uid = GetUid(next.Sender); 1111 if (uid != null) 1212 { 1313 next.Sender.SetValue(TextBlock.TextProperty, AppResources.ResourceManager.GetString(uid.ToString())); 1414 } 1515 }); 1616 1717 ContentControl.ContentProperty.Changed.Subscribe(next => 1818 { 1919 var uid = GetUid(next.Sender); 2020 if (uid != null) 2121 { 2222 next.Sender.SetValue(ContentControl.ContentProperty, AppResources.ResourceManager.GetString(uid.ToString())); 2323 } 2424 }); 2525 2626 TextBox.WatermarkProperty.Changed.Subscribe(next => 2727 { 2828 var uid = GetUid(next.Sender); 2929 if (uid != null) 3030 { 3131 next.Sender.SetValue(TextBox.WatermarkProperty, AppResources.ResourceManager.GetString(uid.ToString())); 3232 } 3333 }); 3434 } 3535 3636 public static void SetUid(AvaloniaObject target, string value) 3737 { 3838 target.SetValue(UidProperty, value); 3939 } 4040 4141 public static string GetUid(AvaloniaObject target) 4242 { 4343 return (string)target.GetValue(UidProperty); 4444 } 4545 }

我取名为Uid,这里你可以自己自定义

第3步:

在xaml中引用:

1xmlns:localizations="clr-namespace:Demo.Localizations;assembly=SpockWallet" 2 3Demo.Localizations是存放刚刚创建的LocalizationAttachedPropertyHolder.cs的命名空间然后就能在控件上使用了:Uid为在AppResources.resx中定义的名称 4 51 <TextBlock localizations:LocalizationAttachedPropertyHolder.Uid="CreateWallet" Text="Create Wallet"/> 62 73 <Button localizations:LocalizationAttachedPropertyHolder.Uid="CreateYourWallet" Content="Create Your Wallet" /> 84 95 <TextBox localizations:LocalizationAttachedPropertyHolder.Uid="DeleteWallet" Watermark="Delete Wallet" />

重新生成一下AvaloniaUI的设计器就能显示你在AppResources.resxxaml控件中定义的文本了

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

皕杰报表(关于日期时间时分秒显示不出来)

在使用皕杰报表设计器时,数据据里面是日期型,但当你web预览时候,发现有日期时间类型的数据时分秒显示不出来,只有年月日能显示出来,时分秒显示为0:00:00。1.可以使用tochar解决,数据集用selecttochar(flowdate,"yyyyMMddHH:mm:ss")fromtablename2.也可以把数据库日期类型date改成timestamp

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )

GitHub 上有哪些适合新手跟进的优质项目?

!(https://oscimg.oschina.net/oscnet/011f28e3bc332010e1442e6c00ed344805d.jpg)点击上方“迈微电子研发社”,选择“星标★”公众号重磅干货,第一时间送达!(https://oscimg.oschina.net/oscnet/cd44ba75f

.NET Core AvaloniaUI实现多语言国际化 - HelloWorld