.NetCore Avalonia UI 支持多语言 国际化

你想本地化用Avalonia编写的桌面程序吗,让我们看看怎么实现。

要本地化应用程序,我们必须能够

直接在XAML中本地化字符串

访问代码中的本地化字符串

要在XAML中翻译字符串,我们可以使用自定义的MarkupExtension和bindings。

public class LocalizeExtension : MarkupExtension
    {
        public LocalizeExtension(string key)
        {
            this.Key = key;
        }

        public string Key { get; set; }

        public string Context { get; set; }

        public override object ProvideValue(IServiceProvider serviceProvider)
        {
            var keyToUse = Key;
            if (!string.IsNullOrWhiteSpace(Context))
                keyToUse = $"{Context}/{Key}";

            var binding = new ReflectionBindingExtension($"[{keyToUse}]")
            {
                Mode = BindingMode.OneWay,
                Source = Localizer.Instance,
            };

            return binding.ProvideValue(serviceProvider);
        }
    }

请注意,除了字符串键,还有一个上下文,用于在不同上下文中对同一字符串进行不同的翻译。

此扩展可用于XAML:

<Window 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:i18n="clr-namespace:AvaloniaLocalizationExample.Localizer" 
        mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
        x:Class="AvaloniaLocalizationExample.MainWindow"
        WindowStartupLocation="CenterScreen"
        Width="500" Height="350"
        Title="AvaloniaLocalizationExample">

  <StackPanel Orientation="Vertical" Margin="15">
    <Label Content="{i18n:Localize Language}" />
    <ComboBox SelectedIndex="0" SelectionChanged="OnLanguageChanged">
      <ComboBoxItem>English</ComboBoxItem>
      <ComboBoxItem>Italian</ComboBoxItem>
    </ComboBox>

    <TextBlock FontSize="21" Text="{i18n:Localize HelloWorld}"/>
    <TextBlock FontSize="21" Text="{i18n:Localize HelloWorld, Context=Second}"/>
    <TextBlock FontSize="21" Text="{i18n:Localize MissingTranslation}"/>
  </StackPanel>
</Window>

我们需要先定义命名空间

xmlns:i18n="clr-namespace:AvaloniaLocalizationExample.Localizer" 

然后我们可以使用MarkupExtension绑定字符串

<TextBlock FontSize="21" Text="{i18n:Localize HelloWorld}"/>

现在我们需要一种将字符串翻译成所需语言的方法。一种简单的方法是使用包含上下文/键的JSON文件和相应的翻译文本。我们可以使用assets嵌入JSON文件。

缺少的字符串将显示为语言代码,后跟分号和字符串key。

public class Localizer : INotifyPropertyChanged
    {
        private const string IndexerName = "Item";
        private const string IndexerArrayName = "Item[]";
        private Dictionary<string, string> m_Strings = null;

        public Localizer()
        {

        }

        public bool LoadLanguage(string language)
        {
            Language = language;
            var assets = AvaloniaLocator.Current.GetService<IAssetLoader>();

            Uri uri = new Uri($"avares://AvaloniaLocalizationExample/Assets/i18n/{language}.json");
            if (assets.Exists(uri)) {
                using (StreamReader sr = new StreamReader(assets.Open(uri), Encoding.UTF8)) {
                    m_Strings = JsonConvert.DeserializeObject<Dictionary<string, string>>(sr.ReadToEnd());
                }
                Invalidate();

                return true;
            }
            return false;
        } // LoadLanguage

        public string Language { get; private set; }

        public string this[string key]
        {
            get
            {
                string res;
                if (m_Strings != null && m_Strings.TryGetValue(key, out res))
                    return res.Replace("\\n", "\n");

                return $"{Language}:{key}";
            }
        }

        public static Localizer Instance { get; set; } = new Localizer();
        public event PropertyChangedEventHandler PropertyChanged;

        public void Invalidate()
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(IndexerName));
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(IndexerArrayName));
        }
    }

由于我们使用的是绑定和NotifyPropertyChanged,所以一旦加载新语言,就会应用已翻译的文本。

要访问代码中已翻译的字符串,请使用字符串键使用静态定位器

Localizer.Localizer.Instance["Key"]

您可以在这里下载示例项目(avalonia0.10)

AvaloniaLocalizationExample.zip (118 downloads)

 


转自:Avalonia UI Framework localization | Sakya's Homepage

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
cefsharp.winforms.netcore 114.2.100 是一个适用于 Windows Form 应用程序的 Chromium Embedded Framework(CEF)的 .NET Core 版本。在该版本中,CEFSharp 提供了对视频播放的支持。 CEFSharp 是一个基于 CEF 的 .NET 接口封装,它允许开发人员在自己的 .NET 应用程序中嵌入一个完整的 Chromium 浏览器。通过使用 CEFSharp,开发人员可以轻松地在 Windows Form 应用程序中实现强大的浏览器功能,包括支持 HTML5 标准的视频播放。 使用 CEFSharp 进行视频播放非常简单。首先,需要确保你的应用程序引用了正确的版本,并且安装了相关的依赖项。然后,在你的 Windows Form 页面中,你可以使用 CefSharp.WinForms.ChromiumWebBrowser 控件来嵌入浏览器。 在浏览器加载网页时,如果网页中包含视频元素,CEFSharp 将会自动处理视频播放。你可以使用嵌入好的浏览器控件的方法和事件来控制视频播放,例如播放、暂停、停止等。 在 CEFSharp 中,也可以使用自定义的 JavaScript 代码来操作视频播放。你可以通过调用 JavaScript 代码在 C# 中控制视频的播放状态。要实现自定义的视频控制,你可以使用 CefSharp.WinForms.IJavascriptCallback 接口来进行通信。 总结来说,cefsharp.winforms.netcore 114.2.100 提供了对视频播放的支持。开发人员可以使用 CEFSharp 在他们的 .NET Core Windows Form 应用程序中嵌入一个完整的 Chromium 浏览器并实现强大的视频播放功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值