首页 新闻 搜索 专区 学院

Winform区域性语言,异步和MEF插件怎么设置?

0
悬赏园豆:50 [已解决问题] 解决于 2017-01-13 17:07

Winform区域性语言(CultureInfo),在主程序初始化的时候设置

System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(language); 

主程序窗体什么的都已经能成功切换中英文版本,但是部分无法切换(MEF插件、Task
异步),查了下是线程区域性的原因,现在已知线程情况是可以设置如下

Thread t = new Thread(new ThreadStart(StartForm2)); 
t.CurrentUICulture = Thread.CurrentThread.CurrentUICulture; 
t.Start(); 

但是不知道怎么设置MEF和异步,在里面调用本地化资源的是一直返回的默认。
MEF:

var directoryCatalog = new DirectoryCatalog(IDevicePart.Configs.AppPath.ProtocolDir, "*Protocol.dll");
var container = new CompositionContainer(directoryCatalog);
protocolHandlers = container.GetExports<IDeviceProtocol, IProtocolMessage>();

Task异步:

Task task = new Task(() => { iDevice.SearchDevices(LocalEndPointAndMAC, SearchDeviceCallBack); });
task.Start();
小书丶的主页 小书丶 | 初学一级 | 园豆:154
提问于:2017-01-12 14:55
< >
分享
最佳答案
0

CultureInfo.DefaultThreadCurrentCulture=CultureInfo.CreateSpecificCulture("zh-CN");

CultureInfo.DefaultThreadCurrentUICulture=CultureInfo.CreateSpecificCulture("zh-CN");

 

收获园豆:50
Daniel Cai | 专家六级 |园豆:10374 | 2017-01-12 17:08

这个是需要.NET 4.5以上版本?我现在用的4.0版本,那就是没有办法支持XP系统了么?

小书丶 | 园豆:154 (初学一级) | 2017-01-12 17:23

请问下有.NET4.0 版本下的解决方案吗?

小书丶 | 园豆:154 (初学一级) | 2017-01-12 17:34

@小书丶: mef的不太清楚,task的那个简单的实现就是在task对应的委托代码中设定当前线程的culture,在结束的时候还原为原始culture(这步可以省略)。这里也可以简单的封装下。

比如这种

   class CultureTask : Task
    {       
        public CultureTask(CultureInfo culture, Action action) : base(() =>
        {
            Thread.CurrentThread.CurrentCulture = culture; action();
        })
        {

        }
    }

这种不合适,我再想下

Daniel Cai | 园豆:10374 (专家六级) | 2017-01-12 17:57

@小书丶:看了下4.0的task,我感觉没太好的办法。

有个比较挫的办法,大体就是在task对应的委托里面巴拉。

 public static class ActionExt
    {
        public static Action WithCurrentCulture(this Action action)
        {
            CallContext.LogicalSetData("_culture",new WTF(Thread.CurrentThread.CurrentCulture));
            return new Action(() => {
                WTF c = CallContext.LogicalGetData("_culture") as WTF;
                if (c != null)
                    Thread.CurrentThread.CurrentCulture = c.Culture;
                ExecutionContext.SuppressFlow();
                action();
                ExecutionContext.RestoreFlow();
            });
        }

//...其他委托略
    }

    class WTF: ILogicalThreadAffinative
    {
        public CultureInfo Culture { get; set; }
        public WTF(CultureInfo culture)
        {
            Culture = culture;
        }
    }

 

用的时候传给task对应的委托用那个扩展方法包一下。

Daniel Cai | 园豆:10374 (专家六级) | 2017-01-12 18:35

@Daniel Cai: 试了下代码,还是没有成功。。异步线程语言环境还是没有改变。也不知道是为什么  我单独在异步执行前面调用System.Globalization.CultureInfo.CreateSpecificCulture(language);也不行

小书丶 | 园豆:154 (初学一级) | 2017-01-13 16:25

@小书丶: 

可以啊

Daniel Cai | 园豆:10374 (专家六级) | 2017-01-13 16:40

@小书丶: 

我单独在异步执行前面调用System.Globalization.CultureInfo.CreateSpecificCulture(language);也不行

 

你执行这个有什么用?这个只是根据你的name创建了一种cultureinfo,你要把它给当前线程啊。

Daniel Cai | 园豆:10374 (专家六级) | 2017-01-13 16:42

@Daniel Cai: 赋值了  我本来有个全局的语言配置任何地方都能读取到,所以也在这里试了试。我再调试调试,先把分给你,谢谢你的帮忙,提供了一些思路。

小书丶 | 园豆:154 (初学一级) | 2017-01-13 17:07

@小书丶: 这个坑可以算ms自己挖的,好好的callcontext本来是可以放这些玩意的,结果硬是不放这些,线程池中还美其名曰nature culture。结果蛋疼了这么久到4.5还是4.6才掰过来。

Daniel Cai | 园豆:10374 (专家六级) | 2017-01-13 21:53
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册