Avalonia 中的国际化
012 Avalonia 中的国际化
0. 参考
- https://docs.avaloniaui.net/zh-Hans/docs/guides/implementation-guides/localizing
- https://dev.to/ingvarx/localization-in-avaloniaui-2mdm
- https://learn.microsoft.com/zh-cn/dotnet/desktop/wpf/advanced/wpf-globalization-and-localization-overview?view=netframeworkdesktop-4.8
- https://www.cnblogs.com/wpinfo/p/wpf_localization.html#_label0
- https://learn.microsoft.com/en-us/windows/apps/publish/publish-your-app/supported-languages?pivots=store-installer-msix
1. 前言
还是请先看一下参考链接的资料内容,简而言之是在绑定中使用 Resx 进行的,那么问题就变成了如何在 C# 代码和 axaml 中进行对 Resx 的调用。
2. 建立区分语言的 Resx 资源
- 建立默认的主语言资源。

结构就像这样,首先要先创建 Resources.resx,随后才创建其它的语言版本的 resx,你可以发现它们的后缀,具体语言地区参见 https://learn.microsoft.com/en-us/windows/apps/publish/publish-your-app/supported-languages?pivots=store-installer-msix。
省流地说:
英文 en-us、简体中文 zh-hans、繁体中文 zh-hant 。
我预先加了一条资源在这四个文件里面,Key 叫做 HelloText。
默认资源:

英文:

简体中文:

繁体中文:

它们的属性需要改为 Public。

3. 在 C# 代码中尝试获取资源
在 MainViewModel 中进行了如下的改造。然后我们来看一下吧。
namespace AvaloniaI18NTest.ViewModels;
public partial class MainViewModel : ViewModelBase
{
public string Greeting => Properties.Resources.HelloText;
}
默认的效果就像这样:

4. 如何变更当前的语言?
你可以在 App.xaml.cs 的地方加入一行代码来调整当前的语言。
public override void Initialize()
{
Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("en-us"); // 新的一行
AvaloniaXamlLoader.Load(this);
}
但是也可以在 OnFrameworkInitializationCompleted() 的开头进行调整。
各个语言的效果如下:
4.1 英文 en-us
Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("en-us");

4.2 简体中文 zh-hans
Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("zh-hans");

4.3 繁体中文 zh-hant
Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("zh-hant");

4.4 默认语言地区
Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("");

5. 如何在 xaml 处使用资源?
你可以引入 Properties 命名空间,然后使用静态资源进行调用:

<UserControl x:Class="AvaloniaI18NTest.Views.MainView"
xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:p="using:AvaloniaI18NTest.Properties"
xmlns:vm="clr-namespace:AvaloniaI18NTest.ViewModels"
d:DesignHeight="450"
d:DesignWidth="800"
x:DataType="vm:MainViewModel"
mc:Ignorable="d">
<Design.DataContext>
<!--
This only sets the DataContext for the previewer in an IDE,
to set the actual DataContext for runtime, set the DataContext property in code (look at App.axaml.cs)
-->
<vm:MainViewModel />
</Design.DataContext>
<TextBlock HorizontalAlignment="Center"
VerticalAlignment="Center"
Text="{x:Static p:Resources.HelloText}" />
</UserControl>
通过如此绑定后的结果和上面截图是一样的。
6. 总结
只要把 resx 资源文件项目中的多语言结构搞清楚,那本地化问题完全不是问题。

浙公网安备 33010602011771号