.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控件中定義的文本了

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM