C# winForm资源文件实现多语言切换
这是我目前看到过最简单的多语言切换了
操作步驟
介面上的多語
Step1.將表單的Localizable屬性設為True
![]()
Step2.切換表單的Language屬性為欲使用的語系
![]()
設完後會在分頁標籤上看到目前設定的語系
![]()
Step3.設定介面上欲顯示的字樣並適當的調整版面
![]()
![]()
到此,用資源檔做的多語系程式就完成了。
我們可以到檔案總管看一下,可看到Visual Studio自己幫我們產生了對應的資源檔。
![]()
因此,在實作介面上的多語時,我們並不需自己手動加入資源檔。
![]()
訊息的多語
上面的範例帶出了介面上支援多語的寫法,但卻不適用於訊息上,若要在訊息上也支援多語。請依下列步驟:
Step1.加入資源檔
資源檔依照 "資源檔名.文化特性.resx" 格式命名,如 "Resources.zh-tw.resx"。
![]()
Step2.設定資源檔內的訊息內容
在資源檔上連點兩下
![]()
設定對應的語系字串
![]()
![]()
Step3.使用資源檔內的訊息內容
這邊只要透過My.Resources去取出資源檔內的值即可,內部OR Mapping轉換都幫你做好好,可以用強型別的方式直接取用,能避免掉許多不必要的低級錯誤。
MsgBox(My.Resources.Resource1.String1)
其實個人習慣是命名為 "Resources.文化特性.resx",因為專案裡已偷放了一個Resources.resx資源檔,因此只需加入非預設語系的資源檔即可。
![]()
在使用上也會變得較為簡短
MsgBox(My.Resources.String1)
切換語系
依上面步驟操作完後,其實已具多語支援能力。當程式開啟時,會自動依照當前語系去顯示介面畫面。因此我們開啟時應該是顯示中文而不是本來的英文。若要自己切換語系可利用Threading.Thread.CurrentThread.CurrentUICulture。
Threading.Thread.CurrentThread.CurrentUICulture = New CultureInfo("en")
值得注意的是,這樣的寫法是不會影響已開啟的視窗的。只有後來開啟的視窗會被切換語系。
那是否已開啟的視窗就無法切換了呢?那倒也不是。可以透過使用ResourceManager.GetString去取得對應的字串,把取出的字串再設到介面上即可。但是這也不是很好的方法,個人傾向使用ComponentResourceManager配合遞迴去把介面上的字串換成對應語系的字串。有興趣的可以參考Form.Designer.vb檔的程式碼。
![]()
![]()
注意事項
在用多國語言資源檔時,建議最後在弄其它語系的設定。因為當我們設定多語系時,Visual Studio會自動幫我們產生資源檔,且內含預設的設定值。若太早讓Visual Studi產生資源檔,則預設的設定值將只有少少的幾個,後面的設定值都需手動的設定,且每個語系的資源檔都要設定。
![]()
调用
SetLang("语言标识", this, typeof(窗体));
/// <summary>
/// 设置当前程序的界面语言
/// </summary>
/// <param name="lang">language:zh-CN, en-US</param>
/// <param name="form">窗体实例</param>
/// <param name="formType">窗体类型</param>
public static void SetLang(string lang, Form form, Type formType)
{
System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(lang);
if (form != null)
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(formType);
resources.ApplyResources(form, "$this");
AppLang(form, resources);
}
}
/// <summary>
/// 遍历窗体所有控件,针对其设置当前界面语言
/// </summary>
/// <param name="control"></param>
/// <param name="resources"></param>
private static void AppLang(Control control, System.ComponentModel.ComponentResourceManager resources)
{
if (control is MenuStrip)
{
//将资源应用与对应的属性
resources.ApplyResources(control, control.Name);
MenuStrip ms = (MenuStrip)control;
if (ms.Items.Count > 0)
{
foreach (ToolStripMenuItem c in ms.Items)
{
//调用 遍历菜单 设置语言
AppLang(c, resources);
}
}
}
foreach (Control c in control.Controls)
{
resources.ApplyResources(c, c.Name);
AppLang(c, resources);
}
}
/// <summary>
/// 遍历菜单
/// </summary>
/// <param name="item"></param>
/// <param name="resources"></param>
private static void AppLang(ToolStripMenuItem item, System.ComponentModel.ComponentResourceManager resources)
{
if (item is ToolStripMenuItem)
{
resources.ApplyResources(item, item.Name);
ToolStripMenuItem tsmi = (ToolStripMenuItem)item;
if (tsmi.DropDownItems.Count > 0)
{
foreach (ToolStripMenuItem c in tsmi.DropDownItems)
{
//if (tsmi != ToolStripSeparator)
//{ }
AppLang(c, resources);
}
}
}
}
C# winForm资源文件实现多语言切换的更多相关文章
- .NET资源文件实现多语言切换
1.创建对应的资源文件 lang.en.resx 英文 lang.resx 中文,默认 lang.zh-tw.resx 繁体 首先说明,这三个文件前面部分名称需要一样,只是 点 后面的语言代号 ...
- WinForm 资源文件的使用
1. 创建资源文件: 2.双击资源文件,打开如下图:添加一个字符串: 名称为cnnstr 值为-- 3.添加文本文件和图像 4. 调用代码 MessageBox.Show(Resource1.cnns ...
- 【winfrom-多语言】实现多语言切换:使用资源文件
使用资源文件实现多语言切换. 1. 新建一个Form,名为FrmMain. 在界面添加一个MenuStrip和一个Button. 并设置好控件的文本和位置.(Language=(Default)) 2 ...
- [原创]java WEB学习笔记69:Struts2 学习之路-- 消息处理与国际化,概述,配置国际资源文件,访问国际化消息,通过超链接切换语言
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- 推荐:Asp.Net MVC 多语言(html+js共用一套资源文件)
此文主要是最近做多语言的工作的一个经验分享.文中的内容为参照多位大神的方案后,自己揉捏出来的一个新的方案,对于html和javascript部分的多语言的切换,共用一套资源文件.代码中主要是使用 IH ...
- FineUIPro中如何支持多语言(全局资源文件和本地资源文件)
一个客户在邮件中问到了FineUIPro的多语言实现问题,其实 FineUIPro 并没有对此做特殊处理,因此直接使用 ASP.NET 原生支持的资源文件就能实现. 下面我们就以FineUIPro的空 ...
- DataAnnotations里DisplayAttribute和 ValidationAttribute 如何从资源文件读取信息,显示多语言
这个是我们常见的AccountModel代码 public class ChangePasswordModel { [Required] [DataType(DataType.Password)] [ ...
- 关于Winform发布时,资源文件缺失的解决方案
今天和大家分享一下,我这几天一直困惑的问题,今天不经意间解决了这个问题,接下来描述一下这个问题: 问题: 最近公司给人家做二次开发,是C/S结构的,我在做Winform时发现,当我选择一个项目发布时, ...
- winform代码反编译后图片等资源文件恢复解决方案
用Reflector工具反编译的winform代码,图片等资源文件不能很好的反编译成功. 这里有一个笨的解决方案.首先我们要了解图片资源当初加入到工程的几种方式,及他们所在的位置. 一般winform ...
随机推荐
- BP算法从原理到python实现
BP算法从原理到实践 反向传播算法Backpropagation的python实现 觉得有用的话,欢迎一起讨论相互学习~Follow Me 博主接触深度学习已经一段时间,近期在与别人进行讨论时,发现自 ...
- YiShop_如何选择B2C商城开发商
说到B2C商城开发,现在网上搜索能搜出来一大堆开发公司的信息出来.面对如果巨大的信息用户应该如果去评估和判断哪家更适合自己呢!其实开发B2C商城不仅体现在一家开发公司本身的具体实力,还体现在对每一个商 ...
- Jarvis OJ- [XMAN]level2/3_x64-Writeup——64位简单栈溢出
两道64位栈溢出,思路和之前的32位溢出基本一致,所以放在一起 在这两道中体现的32位和64位的主要区别在于函数参数传递的方式 在32位程序运行中,函数参数直接压入栈中 调用函数时栈的结构为:调用函数 ...
- NYOJ127 星际之门(一)(最小生成数的个数+高速幂)
题目描写叙述: http://acm.nyist.net/JudgeOnline/problem.php?pid=127 能够证明.修建N-1条虫洞就能够把这N个星系连结起来. 如今.问题来了.皇帝想 ...
- 关于子线程更新UI
大家都了解的子线程不能更新UI,所以普通青年比方我,遇到耗时操作用到线程时.不得不立刻想到了用handler传递来解决UI更细的问题. 普通青年的做法: 方案:使用Thread+handler方式,h ...
- hdu 1233 还是畅通project(kruskal求最小生成树)
还是畅通project Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Tota ...
- Struts2.5 伪静态的配置
伪静态 伪静态是相对真实静态来讲的,通常我们为了增强搜索引擎的友好面,都将文章内容生成静态页面,但是有的朋友为了实时的显示一些信息.或者还想运用动态脚本解决一些问题.不能用静态的方式来展示网站内容.但 ...
- 【ANT】使用ANT自动执行JMeter用例
1.把\apache-jmeter-3.1\extras目录下的build.xml和jmeter-results-detail-report_21.xsl两个文件拷贝到用例所在目录: 2.修改用例名称 ...
- JavaScript:AOP实现
AOP的概念,使用过Spring的人应该都不陌生了.Dojo中,也是支持AOP的.对于JavaScript的其他框架.库不知道有没有AOP的支持.相信即便没有支持,也不会太远了.下面就介绍一下使用Ja ...
- iOS 图片的拉伸,取固定区域显示
1.图片拉伸合适的尺寸 以及清晰度 UIButton * but =[[UIButton alloc]initWithFrame:CGRectMake(, , , )]; //拉伸 /*UIImage ...