最近Winform项目想添加多语言支持, 之前一直没关注, 这几天翻阅了很多分享, 终于整理出了一些头绪, 应用到程序中也实现了多语言的支持, 现整理下以备忘.

具体原理就不说了, 网上太多, 这里只罗列实现步骤:

首先, 创建一个对话框:

添加两个按钮, 分别进行命名,这是正常的创建流程, 中文状态下的界面;

然后我们要编辑英文状态下的界面, 在窗体属性, 注意是窗体属性页面, 将Localizable属性设置为true, 并将Language属性由默认设置为英语, 英语有好多选项, 英语全球, 英语美国等等, 直接选择英语即可, 如下图 :

此时你需要修改界面各个控件的文本内容为对应的英文, 修改完毕如下图所示:

保存下你会发现在解决方案资源管理器中该窗体下多了一个.en.resx为后缀的文件:

打开看下:

里面有按钮控件的英文列表, 那么打开默认的resx文件看看呢?

也生成了对应的中文资源, 这些都是VS自动生成的, 后期维护也相对方便了, 这样控件方面的多语言到这里也就实现的差不多了, 那么怎么进行中英文切换呢?

一、在程序运行前调用
Thread.CurrentThread.CurrentUICulture = new CultureInfo(“en”或者“zh-CN”);

那么后续创建的窗体就不需要理会了,窗体以及控件会自动应用语言环境;

二、程序运行时的切换

调用下面LoadLanguage方法,Settings.Defautl.Language是自定义的语言设置,值为“en”或“zh-CN”或者其他语言缩写;

/// <summary>
/// 指定窗体载入语言
/// </summary>
/// <param name="aForm"></param>
/// <param name="aFormType"></param>
public static void LoadLanguage(Form aForm)
{if (aForm != null){Thread.CurrentThread.CurrentUICulture = new CultureInfo(Settings.Default.Language);ComponentResourceManager resources = new ComponentResourceManager(aForm.GetType());resources.ApplyResources(aForm, "$this");LoadingControls(aForm, resources);}
}/// <summary>
///
/// </summary>
/// <param name="aControl"></param>
/// <param name="aResources"></param>
private static void LoadingControls(Control aControl, ComponentResourceManager aResources)
{if (aControl is MenuStrip){//将资源与控件对应aResources.ApplyResources(aControl, aControl.Name);MenuStrip menu = (MenuStrip)aControl;if (menu.Items.Count > 0){foreach (ToolStripMenuItem item in menu.Items){//遍历菜单Loading(item, aResources);}}}foreach (Control ctrl in aControl.Controls){aResources.ApplyResources(ctrl, ctrl.Name);LoadingControls(ctrl, aResources);}
}/// <summary>
/// 遍历菜单
/// </summary>
/// <param name="aItem">菜单项</param>
/// <param name="aResources">语言资源</param>
private static void Loading(ToolStripMenuItem aItem, ComponentResourceManager aResources)
{if (aItem is ToolStripMenuItem){aResources.ApplyResources(aItem, aItem.Name);if (aItem.DropDownItems.Count > 0){foreach (ToolStripMenuItem item in aItem.DropDownItems){Loading(item, aResources);}}}
}

这样就可以直接在程序运行过程中进行语言切换;

窗体控件的多语言支持已经记录完毕,这方面其实还不是很麻烦,麻烦的其实是程序在运行过程中各种自定义的提示字符串的多语言支持,如果里面提示信息过多,那真是头疼,而且用上述的办法还无法实现,下面介绍一种跟上述类似的方法管理多语言字符串的定义:

添加两个资源文件,一个为LanguageStrings.resx,这里将存储默认的中文语言资源,另一个为LanguageStrings.en.resx,这里将存储英文语言资源,如下图:

打开这两个文件,会发现跟窗体的资源管理页面一样,在两个资源中添加自定义的语句,如下图所示:

中英文资源的名称一定要是对应一样的,不允许包含标点符号,因为是中文开发环境,名称可以写为中文描述,这样在编写提示时也方便理解维护,资源编写完了,如何去调用呢?使用下面这个方法:

/// <summary>
/// 资源管理器
/// </summary>
private static readonly ResourceManager mResources = new ResourceManager("CarEyeClient.Utils.LanguageStrings", typeof(MultiLanguage).Assembly);/// <summary>
/// 获取多语言对应的字符串
/// </summary>
/// <param name="aKey"></param>
/// <param name="aForm">字符串所在窗体, 线程间操作时需要传入窗体</param>
/// <returns></returns>
public static string GetString(string aKey, Form aForm = null)
{string newStr = null;if (aForm != null){aForm.InvokeIfRequired((form) => newStr = mResources.GetString(aKey));}else{newStr = mResources.GetString(aKey);}if (string.IsNullOrEmpty(newStr)&& !string.IsNullOrEmpty(aKey)){return aKey;}return newStr;
}

在UI线程中调用时可忽略aForm参数,资源将会根据设置的语言环境自动查找关键字对应的中英文字符串,但是这种方法在非UI线程中调用会发生调用无效的情况,所以增加了aForm参数,在非UI线程调用该方法时传入对应窗体对象即可,窗体进行委托调用即可获取正确的中英文资源。

至此,Winform的多语言环境基本就完善了,运行截图:

C# WinForm应用程序的多语言环境支持相关推荐

  1. linux setlocale函数,linux中的多语言环境(LC_ALL, LANG, locale)

    为了在Linux下实现多语言支持,必须在定制安装程序时,引入与glibc和图形环境两者对应的多语言环境支持.对于glibc环境而言,它是整个Linux中文化的基础,我们需要在/usr/share/lo ...

  2. 语言环境设置命令locale 命令(linux,对应于window 7(win叫什么命令?)控制面板-区域和语言里的设置)

    Locale 目录 [隐藏] 1关于locale的设定,为什么要设定locale 1.1关于locale的设定 1.2一.为什么要设定locale 1.3二.到底什么是locale? 1.4三.什么是 ...

  3. 在程序中支持多语言环境,支持asp.net和winform。

    图一, 资源文件结构 根据上面的资源文件结构,在程序中调用资源选项应该是:control.Text = Resources.MultiString.SR.XXX. XXX返回的是哪种语言将根据你定义的 ...

  4. boost::regex模块用于测试特定于语言环境的表达式的帮助程序类

    boost::regex模块用于测试特定于语言环境的表达式的帮助程序类 实现功能 C++实现代码 实现功能 boost::regex模块用于测试特定于语言环境的表达式的帮助程序类 C++实现代码 #i ...

  5. Go语言环境安装,验证go语言环境、使用文本编辑器编写一个go hello world,Go lang IDE安装,在golang中新建一个go程序

    1 Golang语言环境安装包下载 https://www.golangtc.com/ 下载: go1.9.2.windows-amd64.msi 和 go1.9.2.windows-amd64.zi ...

  6. c语言程序做成可执行文件,windows环境下C程序生成可执行文件

    windows环境下,编写C程序,生成.exe,用于操作某个文件. 包含三部分:搭建环境.程序实现.程序分析. 1.搭建程序编写和编译环境 在windows下安装Git Bash(下载页面). 安装完 ...

  7. 编写c语言程序的可视化编程环境有哪些,C语言可视化编程环境设计及实现.pdf

    T 6YR&D c语言可视化编程环境设计及实现 李丽萍 (云南经济管理职业学院 ,云南昆明 650106) 摘 要 在计算机语言的使用过程中 ,对于语言的模式采取不断深化的实施方式 ,通过不断 ...

  8. c语言程序构建,c语言开发环境构建及简单的c程序设计.doc

    c语言开发环境构建及简单的c程序设计 实验x C语言开发环境构建及简单的C程序设计 一.实验目的 1.熟悉字符模式下的C程序编译和调试环境,基本掌握麒麟Linux字符模式下的编译工具和调试工具的使用: ...

  9. 【Java开发语言 01】第一章 Java语言概述(基础常识+Java语言概述+Java程序运行机制及运行过程+Java语言环境的搭建+开发体验hello world+错误:编码GBK的不可映射字符)

    java入门-第一章Java语言概述 1基础常识 软件开发 人机交互方式 常用的DOS命令(win系统,有一些直接通过命令执行的) 2 Java语言概述 什么是计算机语言 关于面向对象和面向过程 Ja ...

最新文章

  1. RuntimeError: output with shape [1, 28, 28] doesnt match the broadcast shape [3, 28, 28]
  2. HTML iframe 和 frameset 的区别
  3. python re库常用_Python re库指南
  4. BZOJ3992[SDOI2015]序列统计
  5. 那些开源程序中让人叹为观止的代码 - 3 保持元素纵横比
  6. 百练OJ:4148:生理周期
  7. struts2在lt;s:selectgt;用动态标签
  8. Python Logging Loggers
  9. php 提取字的首字母,PHP提取中文首字母_php技巧
  10. Elasticsearch 参考指南(引导检查)
  11. “目标-用户-指标”——企业开源运营之道|瞰道@谭中意
  12. 基于BIND实现智能DNS解析
  13. CANVAS中的lineWidth小计
  14. 安卓,加密drawable图像资源、从类文件生成drawable
  15. 苹果手微信显示无法连接服务器,iPhone手机无法运行微信的4种解决技巧
  16. mysql误删数据恢复操作
  17. f开头的流媒体软件_流媒体直播工具(Streamon)
  18. 6--目标检测和边界框和锚框
  19. 网络空间安全---计算机网络安全概述
  20. 64 ---- 两平面的位置关系

热门文章

  1. 易语言 判断网络是否连接
  2. CAD绘图技巧:快速测量CAD图纸中图形的面积与周长
  3. 麦克风阵列定位matlab算法,基于麦克风阵列的MUSIC声源定位算法研究
  4. LTE - NAS 驻网流程概括
  5. 练习:Python 的字符串处理, 一个朴实无华的四则运算计算器,批量计算小学生四则运算表达式
  6. 6s全网通显示无服务器,iPhone6s是全网通吗?各版本iPhone6s/6s Plus网络支持情况分析...
  7. chrome浏览器,谷歌浏览器卡顿解决方法
  8. 某玩具商的数据库操作
  9. java购物车系统代码_java购物车系统 团队博客
  10. 小学四则运算练习软件软件需求说明