关于我们

质量为本、客户为根、勇于拼搏、务实创新

< 返回新闻公共列表

dotnetcore3.1 WPF 保持多語言Intro

发布时间:2020-02-28 00:00:00

  dotnetcore3.1 WPF 保持多語言 Intro

近期把 DbTool 从 WinForm 转移来到 WPF,并升级来到 dotnet core 3.1,并保持了根据 Microsoft.Extensions.Localization 保持了基础的多語言适用。  下边来共享一下怎样来保持

服务项目申请注册

假如不了解怎样在 WPF 中应用依赖注入,能够参照上一篇文章 dotnetcore3.1 WPF 中应用依赖注入

在运用起动前申请注册 Localization 服务项目,我这儿应用的是自身自定的根据 JSON 的多語言服务项目

services.AddJsonLocalization(options => options.ResourcesPathType = ResourcesPathType.CultureBased);

服务项目申请注册的最终应用了一个 ServiceLocator 方式的编码(DependencyResolver),储存了全部的申请注册服务项目,后边的 Localizer 拓展会采用

DependencyResolver.SetDependencyResolver(services);

编码文档保持方法

编码文档(如:MainWindow.xaml.cs) 中保持多語言比较简单,立即引入 IStringLocalizer 就可以,获得相匹配的要实例化的,例如:

public partial class MainWindow: Window
{
    private readonly IStringLocalizer_localizer;
    public MainWindow(
        IStringLocalizerlocalizer)
    {
        InitializeComponent();

        _localizer = localizer;
    }
    // ...
    {
     // ...
     MessageBox.Show(_localizer["Success"], _localizer["Tip"]);
    }
}

xaml 保持方法 LocaliazerExtension

xaml 文档中应用必须自定一个拓展,界定以下,【保持源代码】

public class LocalizerExtension : MarkupExtension
{
    private readonly IStringLocalizerFactory _localizerFactory;
    public string Key { get; }

    public LocalizerExtension(string key)
    {
        Key = key;
        _localizerFactory = DependencyResolver.Current.
            ResolveService();
    }

    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        var targetRootType = serviceProvider.GetType()
            .GetProperty("System.Xaml.IRootObjectProvider.RootObject", BindingFlags.Instance | BindingFlags.NonPublic)
            ?.GetValue(serviceProvider)
            ?.GetType();
        if (null == targetRootType)
        {
            targetRootType = typeof(MainWindow);
        }

        var localizer = _localizerFactory.Create(targetRootType);
        var value = localizer[Key];
        return (string)value;
    }
}

这儿应用来到上边提及的 ServiceLocator 方式的编码,从 DependencyResolver 获得申请注册的服务项目,觉得这儿的保持必须提升,有更强念头的小伙伴们敬请一起沟通交流一下,此外当你的运用非常简单,我认为上边编码里的根据反射面获得 targetRootType 的编码能够立即应用某一个种类比如:typeof(MainWindow) ,那样会更高效率

在 xaml 中应用

  1. Window 标识中加上拓展相匹配的指令室内空间,比如: xmlns:loc="clr-namespace:DbTool.Localization"
  2. 在必须保持多語言的地区引入,比如:
  3. 在相匹配的資源文档中配备要应用多語言資源,如上边的 DbConnectionString

語言转换

产生語言转换时或运用启动设定默认设置語言时,要升级当今进程的 Culture 信息内容

// set current culture
var defaultCulture = "zh";
Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo(defaultCulture);
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(defaultCulture);

保持实际效果

汉语

英语

More

这类方法的保持,现阶段还必须重新启动以后页面的語言才会产生变化,能够进一步优化,保持动态性多語言,改动語言以后页面就转换,现阶段并不是太必须,临时没做,有必须的能够先自身科学研究一下。

Reference

  • https://github.com/WeihanLi/WeihanLi.Extensions.Localization.Json
  • https://github.com/WeihanLi/DbTool
  • https://github.com/WeihanLi/DbTool/blob/wpf-dev/DbTool/MainWindow.xaml
  • https://github.com/WeihanLi/DbTool/blob/wpf-dev/DbTool/MainWindow.xaml.cs
  • https://github.com/WeihanLi/DbTool/blob/wpf-dev/DbTool/Localization/LocalizerExtension.cs

/template/Home/Zkeys/PC/Static