Avalonia 中的国际化

012 Avalonia 中的国际化

0. 参考

  1. https://docs.avaloniaui.net/zh-Hans/docs/guides/implementation-guides/localizing
  2. https://dev.to/ingvarx/localization-in-avaloniaui-2mdm
  3. https://learn.microsoft.com/zh-cn/dotnet/desktop/wpf/advanced/wpf-globalization-and-localization-overview?view=netframeworkdesktop-4.8
  4. https://www.cnblogs.com/wpinfo/p/wpf_localization.html#_label0
  5. 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 资源

  1. 建立默认的主语言资源。

结构就像这样,首先要先创建 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 资源文件项目中的多语言结构搞清楚,那本地化问题完全不是问题。

posted @ 2024-05-27 18:08  fanbal  阅读(746)  评论(0)    收藏  举报