• .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=你的程序集名称"
    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控件中定义的文本了

  • 相关阅读:
    IE9以上获取元素的写法
    struts2动态跳转action,修改和添加共用一个页面
    Struts2网页面传值两种方式
    hibernate方法中参数传入数组的查询方法
    获取当前泛型类的传入,BaseDaoImpl<T> implements BaseDao<T>
    .net 必看书籍1
    knockjs
    javascript 处理链接的多种方式
    ckeditor 工具栏的配置
    C# 针对文件夹的操作
  • 原文地址:https://www.cnblogs.com/myhalo/p/11417374.html
走看看 - 开发者的网上家园