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();
CultureInfo.DefaultThreadCurrentCulture=CultureInfo.CreateSpecificCulture("zh-CN");
CultureInfo.DefaultThreadCurrentUICulture=CultureInfo.CreateSpecificCulture("zh-CN");
这个是需要.NET 4.5以上版本?我现在用的4.0版本,那就是没有办法支持XP系统了么?
请问下有.NET4.0 版本下的解决方案吗?
@小书丶: mef的不太清楚,task的那个简单的实现就是在task对应的委托代码中设定当前线程的culture,在结束的时候还原为原始culture(这步可以省略)。这里也可以简单的封装下。
比如这种
class CultureTask : Task
{
public CultureTask(CultureInfo culture, Action action) : base(() =>
{
Thread.CurrentThread.CurrentCulture = culture; action();
})
{
}
}
这种不合适,我再想下
@小书丶:看了下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: 试了下代码,还是没有成功。。异步线程语言环境还是没有改变。也不知道是为什么 我单独在异步执行前面调用System.Globalization.CultureInfo.CreateSpecificCulture(language);也不行
@小书丶:
可以啊
@小书丶:
我单独在异步执行前面调用System.Globalization.CultureInfo.CreateSpecificCulture(language);也不行
你执行这个有什么用?这个只是根据你的name创建了一种cultureinfo,你要把它给当前线程啊。
@Daniel Cai: 赋值了 我本来有个全局的语言配置任何地方都能读取到,所以也在这里试了试。我再调试调试,先把分给你,谢谢你的帮忙,提供了一些思路。
@小书丶: 这个坑可以算ms自己挖的,好好的callcontext本来是可以放这些玩意的,结果硬是不放这些,线程池中还美其名曰nature culture。结果蛋疼了这么久到4.5还是4.6才掰过来。