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

Posted myhalo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了.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     public class LocalizationAttachedPropertyHolder
 2     
 3         public static AvaloniaProperty<string> UidProperty =
 4             AvaloniaProperty.RegisterAttached<LocalizationAttachedPropertyHolder, AvaloniaObject, string>("Uid");
 5 
 6         static LocalizationAttachedPropertyHolder()
 7         
 8             TextBlock.TextProperty.Changed.Subscribe(next =>
 9             
10                 var uid = GetUid(next.Sender);
11                 if (uid != null)
12                 
13                     next.Sender.SetValue(TextBlock.TextProperty, AppResources.ResourceManager.GetString(uid.ToString()));
14                 
15             );
16 
17             ContentControl.ContentProperty.Changed.Subscribe(next =>
18             
19                 var uid = GetUid(next.Sender);
20                 if (uid != null)
21                 
22                     next.Sender.SetValue(ContentControl.ContentProperty, AppResources.ResourceManager.GetString(uid.ToString()));
23                 
24             );
25 
26             TextBox.WatermarkProperty.Changed.Subscribe(next =>
27             
28                 var uid = GetUid(next.Sender);
29                 if (uid != null)
30                 
31                     next.Sender.SetValue(TextBox.WatermarkProperty, AppResources.ResourceManager.GetString(uid.ToString()));
32                 
33             );
34         
35 
36         public static void SetUid(AvaloniaObject target, string value)
37         
38             target.SetValue(UidProperty, value);
39         
40 
41         public static string GetUid(AvaloniaObject target)
42         
43             return (string)target.GetValue(UidProperty);
44         
45     

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

 第3步:

在xaml中引用:

 

xmlns:localizations="clr-namespace:Demo.Localizations;assembly=SpockWallet"

 

Demo.Localizations是存放刚刚创建的LocalizationAttachedPropertyHolder.cs的命名空间

然后就能在控件上使用了:
Uid为在AppResources.resx中定义的名称
1 <TextBlock localizations:LocalizationAttachedPropertyHolder.Uid="CreateWallet" Text="Create Wallet"/>
2 
3 <Button localizations:LocalizationAttachedPropertyHolder.Uid="CreateYourWallet" Content="Create Your Wallet" />
4 
5 <TextBox localizations:LocalizationAttachedPropertyHolder.Uid="DeleteWallet" Watermark="Delete Wallet" />

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

 

以上是关于.NET Core AvaloniaUI实现多语言国际化的主要内容,如果未能解决你的问题,请参考以下文章

.NET Core工作流引擎(RoadFlow)多语言版发布

体验 ASP.NET Core 中的多语言支持(Localization)

ASP.NET MVC 多语言实现——URL路由

.Net之多语言配置

ASP.NET MVC 多语言实现技巧 最简最易维护和最快速开发

ionic2 基于ngx-translate实现多语言切换,翻译