有时候我们会按照特定需要来修改系统的显示语言(资源),本文即简要地描述了修改当前线程的区域性并使用本地化资源展现。

首先对需要使用不同区域性设置的用户界面设置不同的语言资源:

选择窗体,在属性栏中修改其Language属性,此时用户界面的Localizable属性也已经被调整为true;

然后编辑该区域性语言的本地化资源,即各个控件的可本地化的所有属性都可以,并保存;

        private void btnApply_Click(object sender,EventArgs e)
{
if(cmbLanguage.SelectedIndex < 0)
{
return;
}
string sCultureName = cmbLanguage.SelectedItem.ToString();
// 更改当前线程的 CultureInfo
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(sCultureName);
//对当前窗体应用更改后的资源
ApplyResource();
}

然后增加一个修改区域性的功能:

其实质就是设置当期线程的当前区域性,即Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(sCultureName);

但是我们会发现这样一个缺陷:通常我们会使用到多线程处理多个事务,于是修改当前线程的当前区域性对其他线程无效,即使是主线程的区域性被设置,子线程依然不会应用其区域性设置,于是需要给每个新建的子线程设置区域性。

而将其设置为主线程的区域性即可解决这样一个问题:t.CurrentUICulture = Thread.CurrentThread.CurrentUICulture;

        private void btnFromLanguage_Click(object sender,EventArgs e)
{
Thread t = new Thread(new ThreadStart(StartForm2));
// 使用多线程时,由于各个线程的区域性不一样,所以要引用当前主线程的区域性
t.CurrentUICulture = Thread.CurrentThread.CurrentUICulture;
t.Start();
}
private void StartForm2()
{
new TestForm().ShowDialog();
}

设置线程的区域性之后只会给未启动的线程(Start之前)在启动之后,使用区域性资源初始化用户界面,而对于已经初始化的用户界面,则要读取本地化资源刷新当前设置,这里使用到资源管理器,并用其提供的ApplyResources方法来给指定的对象(其value参数)赋予给定资源名称(其objectName参数)对应的资源内容,为了应用于其包含的所有子控件,还应遍历其包含的所有子控件并同样对其使用ApplyResources方法:

        /// <summary>
/// 应用资源
/// </summary>
private void ApplyResource()
{
ComponentResourceManager res = new ComponentResourceManager(typeof(Jokes.Language.LanguageTest));
foreach(Control ctl in Controls)
{
ApplyResource(ctl,res);
}
res.ApplyResources(this,"$this");
}
/// <summary>
/// 使用由指定资源管理器管理的资源给控件及其子控件绑定资源
/// </summary>
/// <param name="control">
/// 将绑定资源的控件(及其子控件)
/// </param>
/// <param name="resourceManager">
/// 管理资源的资源管理器对象
/// </param>
private void ApplyResource(Control control,ComponentResourceManager resourceManager)
{
if(null == control || null == resourceManager)
{
return;
}
foreach(Control ctl in control.Controls)
{
if(ctl.Controls != null && ctl.Controls.Count > 0)
{
// 递归的效率通常在递归层次超过5-6层时明显较低,不建议使用
ApplyResource(ctl,resourceManager);
}
resourceManager.ApplyResources(ctl,ctl.Name);
}
resourceManager.ApplyResources(control,control.Name);
}

到此基本上就已经实现了,但是还有一些特殊的,比如已经打开的多文档窗体或多个非模式化窗体,这种情况下,那还得再对每一个子窗体或相关对象也重新刷新一次其区域性资源,否则只能关闭之,并再次启动。如果是用其他线程创建的对象,还要考虑线程间访问等问题,故比较折中的方法是在线程启动之前设置其区域性。

C#区域性语言(CultureInfo)与资源本地化(WINFORM,多线程,原理可适用于网络开发)相关推荐

  1. Android语言国际化values资源文件命名规则

    今天,简单讲讲 android 里如何将语言国际化,和各个国家语言的value文件夹的命名规则. 昨天,需要将app的字符资源国际化,可是却不知道如何命名,在网上找了资料,终于解决了问题. Andro ...

  2. 60-124-340-源码-运行模式-Yarn-通过 YARN 的资源本地化技术减少 Flink 在 YARN 上的部署时间

    1.美图 2.概述 在使用 Flink 的生产实践中,我们发现采用 Flink on YARN 的部署方式时,将大量用户依赖的 JAR 包和其他文件上传到对应的容器中是从用户发送部署请求到应用实际运行 ...

  3. ideal 本地jar依赖_通过 YARN 的资源本地化技术减少 Flink 在 YARN 上的部署时间

    在使用 Flink 的生产实践中,我们发现采用 Flink on YARN 的部署方式时,将大量用户依赖的 JAR 包和其他文件上传到对应的容器中是从用户发送部署请求到应用实际运行起来的重要耗时操作. ...

  4. 史上R语言最强--资源(免费课程、书籍、教程和各种高级图表)

    史上R语言最强–资源(免费课程.书籍.教程和各种高级图表) 下面是一些免费R的书籍.教程.软件包.图表2单和其他材料,可以在网上学习编程和改进工作流程.有单独的概述 Python resources, ...

  5. android多语言适配--语言对应的资源文件夹名称

    android多语言适配--语言对应的资源文件夹名称 众所皆知.Android开发中,res资源文件夹下,可以根据不同的文件名后缀(连接符(-)加限定符)来区别不同的资源. android在运行时使用 ...

  6. H5资源本地化策略 - iOS

    一.资源拦截/映射 为了增强用户浏览H5页面的体验,减少页面白屏时间,实现 js.css.image 等资源文件,以及页面html文件的本地映射(非首次打开wkwebview本身有302缓存机制,不包 ...

  7. 从资源爬取到个人微信公众号开发:使用 Python 打造公众号电影搜索器

    Python 网络爬虫的教程现在可谓是满天飞,只要是个接受过通识教育的人,学习一下上手简单的 Python 编程语言,就能够写出一个简单的爬虫来,但是如何将爬虫爬取的数据用起来似乎很多人并没有过多的考 ...

  8. Web前端:一些必不可少的惊人的网络开发工具和资源

    在这个竞争激烈的领域,如果你希望你的商业网站在所有活跃的网站中可见,你必须实施创新的想法,跟随发展趋势并利用顶级的网站开发工具.web开发人员在开发业务级网站时考虑未来趋势是不可避免的. 因此,在这篇 ...

  9. 声明:此资源由本博客收集整理于网络,只用于交流学习,请勿用作它途。如有侵权,请联系, 删除处理。...

    声明:此资源由本博客收集整理于网络,只用于交流学习,请勿用作它途.如有侵权,请联系, 删除处理. 转载于:https://www.cnblogs.com/hackhyl/p/11365581.html

最新文章

  1. 总结八个好用的Python爬虫技巧
  2. python小结价格_036 Python进阶小结
  3. Linux各发行版本之间的比较
  4. 弱引用使用场景桌面_面试|再次讲解Threadlocal使用及其内存溢出
  5. CM: 如何通过attachment的physical instance id反查到所属的business object ID
  6. 网易云容器服务基于Kubernetes的实践探索
  7. 四.树莓派更改输入法与支持中文
  8. 队列CircularFifoQueue:offer与add的区别
  9. 手机号码校验、邮箱校验
  10. 申请 GoDaddy SSL 证书
  11. 神经网络在线和离线的区别,神经网络网站
  12. epsonl360打印机连接电脑_爱普生l360驱动下载
  13. php后台权限授权管理系统的思路
  14. html5单行文本框属性,文本框list属性和文本框autocomplete属性
  15. Rabbitmq基于插件的延迟队列
  16. 云南小学、初中、高中标准教学实验室设备配置清单整体解决方案
  17. Win10怎么通过ip添加网络打印机?
  18. 基于鲸鱼优化算法的Simulink仿真模型参数优化
  19. 从删除到坐牢,这个锅背不动
  20. 将ITEYE博客制作为EPUB电子书

热门文章

  1. ⑭霍兰德RS*型如何选专业?高考志愿填报选专业
  2. 目标跟踪算法_Camshift函数(学习笔记)
  3. 互联网公司的中台实践:网易杭研的中台往事
  4. Minecraft 命令方块:迷宫计时器(压力板计时系统)
  5. 模糊测试软件测试_模糊测试
  6. 小白成长记第2期:简单易操的YouTube美金项目,get!
  7. ShortCut Key——Google
  8. 芯片启动:从Bootrom到Linux完整启动流程
  9. 分享几个免费书籍的网站
  10. 嵌入式计算机应用方面,嵌入式实时软件在计算机中的应用研究