Winform中多国语言窗体的设计以及.NET中资源文件的使用
最近在做一些多国语言的软件,就学习了一下.NET中的多国语言相应知识,受益不少,下面我就简单介绍一下winform中关于多国语言的实现方法。分为七个部分来讲:资源文件概述、资源文件的分类、资源文件的创建、利用IDE来制作多国语言版本、利用资源文件来做多国语言版本、常用.NET资源文件生成器的使用和总结这七个部分。前两个部分都是一些理论性的东西,如果大家不感兴趣可以跳过,直接看三、四、五这三个部分。
第一部分:资源文件概述
资源文件顾名思义就是存放资源的文件。资源文件在程序设计中有着自身独特的优势,他独立于源程序,这样资源文件就可以被多个程序使用。同时在程序设计的时候,有时出于安全或者其它方面因素的考虑,把重要东西存放在资源文件中,也可以达到保密、安全的效果。
资源文件中一般存三种类型的数据:byte流(byte[])、对象(object)和字符串(string)。对于一些纯文件的信息可以用string类型来保存,对于图片(Image)、图标(Icon)等用object来保存,其它的可以用byte流来保存。
System.Resources命名空间中有大量的类和方法来处理资源文件,我将在下面的篇章中进行介绍。
第二部分:资源文件的分类
资源文件可以分为两类,一类是以.resx为后缀名的文件,一类是以.resources为后缀名的文件。二者的区别在于:
1. resx虽然是以resx结尾的文件,但是它却是XML格式的文件,你可以用记事本等工具直接打开它修改里面的东西;而resources是二进制的文件,相对来说安全性更好一些。
2. resources作为内嵌资源,在指定路径正确的前提下,可以在程序中直接引用;而resx虽然也是内嵌资源,但它却是要依附于.CS文件存在的。也就是说它是作为winform窗体的一个描述性资源存在的,要想在程序中直接使用它,在解决方案中必须有与它同名(只是名字相同,后缀名不同)的.CS文件存在(见图一)。这一点我会在下面的示例中作详细说明。
3. 我们可以利用CSC命令把resx文件转换成resources文件。
RESGEN.EXE LitwareStrings.resx LitwareStrings.resources
注意变量环境为framework1.1。
第三部分:资源文件的创建
这里我介绍两种资源文件的创建方法,一个是利用System.Resources下的ResourceWriter类,另一个是利用资源文件生成器。本节重点讲利用ResourceWriter类来创建资源文件的方法,第二个方法请详见第六部分。
首先要实例化一个ResourceWriter类型的变量:
ResourceWriter rw = new ResourceWriter ( "My.resources" ) ;其中My.resources就是你要生成的文件名。其次要在磁盘上产生这个文件:调用rw.Generate ( ) ;就可以了。
接下来就要为这个资源文件来增加内容了。在ResourceWriter类中提供了一个AddResource ( )方法,这个方法的作用就是往资源文件中添加资源的。在C#中对不同的资源有着不同的加入方式。
1.加入字节数组,语法格式为:
public void AddResource ( string , byte [ ] ) ;
|
注释:其中string是在使用资源文件的时候,此字节数组在程序中的的唯一标识符
2. 加入对象,语法格式为:
public void AddResource ( string , object );
|
注释:其中string是在使用资源文件的时候,此对象在程序中的唯一标识符
在本文程序中,我们利用这种调用方式来加入图标和图象,具体如下:
Icon ico = new Icon ( "main.ico" ) ; Image Turnoff = Image.FromFile ("Turn-off.png") ; Image Turnon = Image.FromFile ( " Turn -on.png" ) ;
rw.AddResource ( " main.ico" , ico ) ;//在资源文件中加入图标 //以下是在资源文件中加入图象 rw.AddResource ( " Turn -off.png" , Turnoff ) ; rw.AddResource ( " Turn -on.png" , Turnlon ) ;
|
3. 加入字符串,具体语法如下:
public void AddResource ( string1 , string2) ;
注释:其中string1是在使用资源文件的时候,此字符串在程序中的唯一标识符在本文的程序中,是如此使用的:
rw.AddResource ( "MyStr" , "从资源文件中读取字符串" );
|
至此我们已经创建了一个资源文件,并且在资源文件中加入了若干个资源,当然在这之后,还应该注意,保存此资源文件,并关闭资源文件,具体如下:
以上我介绍了用ResourceWrite类来创建resources文件的方法,对于resx文件,我们可以在vs2003的IDE中在解决方案管理中点右键->添加新项目中->控件资源档来添加。
第四部分:利用IDE来制作多国语言版本
终于进入主题了,但是这一节的内容和前几节关系不大,因为我主要讲如何使用VS的IDE来制作多国语言版本。每一个Form1.cs文件都有一或多个相应的resx文件作为附属资源。他们的命名规则为Form1.cs的资源文件为Form1.resx,Form1.zh-CHS.resx,Form1.zh-CHT.resx等,其中Form1.resx是缺省的窗体资源文档,其它是在不同语言环境要使用的资源文档,其中Form1.zh-CHS.resx是中文简体系统,Form1.zh-CHT.resx是中文繁体系统(如下图一)。关于命名可不是随便起的,可以参见msdn中关于不同地区的命名规则。
(图一)
每一个窗体都有Localizable和Language这两个属性,其缺省值如下图:
(图二)
Localizable表示是否使用本地化资源,当其为true时,可以在Language中选择一种语种,例如选繁体中文,如下图:
(图三)
这时,窗体的布局会发现变化,你要重新布局窗体上的控件位置、大小、内容等等。布局好以后,你可以继续选择其它的语种来布局。不用担心,它们之间不会有冲突,因为所有不同语种之间的布局差别都被保存到相应的resx文件中了,如图一。最后保存、编译。
为了测试结果,我们可以改变机器的语言环境,方法有二:一是在控件面板中的更改语言选项。另一个是用程序来改。下面我介绍一下第二种方法,用程序来改变当前进程的语言环境。
在程序运行时,会自动检测当前的系统语言环境,我们可以通过修改System.Threading.Thread.CurrentThread.CurrentUICulture这个属性来改变当前UI运行的语言环境,代码如下:
static void Main()
{
System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo( "zh-CHS" );
Application.Run(new Form1());
}
效果图如下:
(图四)
更改System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo( "zh-CHT" );后,效果如下:
(图五)
第五部分:利用资源文件来做多国语言版本
在第三节我们已经说过如何利用ResourceWriter类来创建资源文件,本节就讲讲怎么来使用这些资源文件。利用第三节介绍的方法分别建立三个文件MyResource.resources、MyResourceZH_TW.resources和MyResourceEn.resources分别对应缺省、繁体和英文三个系统。每个文件中有两个string和一个object对象,分别对应button,textbox和Icon。
图四、图五中的language的菜单栏对应代码如下:
private void English_Click(object sender, System.EventArgs e)
{
ResourceManager rm = new ResourceManager( "EmbedResource.MyResourceEn" , Assembly.GetExecutingAssembly() );
textBox1.Text = rm.GetString( "TextBoxValue" );
button1.Text = rm.GetString( "ButtonValue" );
this.Icon = (Icon)rm.GetObject( "Demo.ico" );
}
private void ChineseTraditional_Click(object sender, System.EventArgs e)
{
ResourceManager rm = new ResourceManager( "EmbedResource.MyResourceZH_TW" , Assembly.GetExecutingAssembly() );
textBox1.Text = rm.GetString( "TextBoxValue" );
button1.Text = rm.GetString( "ButtonValue" );
this.Icon = (Icon)rm.GetObject( "Demo.ico" );
}
效果图如下:
在第二部分中,我说过resx和resources调用的方法不同,下面我再说说resx文件如何来调用。由于resx是cs文件的附属文文件,所以项目中一定要有同名的cs文件存在。如图一。
调用resx使用如下代码:
ResourceManager rm = new ResourceManager( "EmbedResource.Form1" , Assembly.GetAssembly(typeof(EmbedResource.Form1)));
textBox1.Text = rm.GetObject( "textBox1.Visible" ).ToString();
其中EmbedResource是namespace,Form1为资源文件名(不包含后缀名),第二个参数Assembly.GetAssembly(typeof(EmbedResource.Form1))中EmbedResource是namespace,而Form1是resx附属的cs文件的名称。注意区分。
第六部分:常用.NET资源文件生成器的使用
该软件可以自动保存成text、resx和resources三种格式的文件。前面的资源可以很方便的使用此软件来创建。大家可以自己下载下来试试。我在这里就不多说了。
第七部分:总结
通过上面的介绍我们已经具备了制作多国语言的基础,当然这只是对多国语言制作的初步介绍。有什么不妥的地方,请在评论中指正,我会尽快改过来的。
分享到:
相关推荐
C#.Net Winform 多国语言示例 .net多国语言实例
winform多语言,vb.net,vb.net多语言程序,多语言切换,.net多语言实现
Winform利用资源文件实现多国语言(含源代码) 三层架构的Winform
.net 多国语言 Winform 多国语言 示例 实例
C# winform多语言实现,通过xml文件配置实现,可在线切换多国语言 C# winform多语言实现,通过xml文件配置实现,可在线切换多国语言 C# winform多语言实现,通过xml文件配置实现,可在线切换多国语言 C# winform...
winform 图片翻页翻书效果 基于.NET5.0
C#WinForm中使用CefSharp.Winform的示例代码,开发环境为VS2010、.NET4.0。CefSharp.Winform版本为49.0.1
WinForm运行时模仿窗体设计调整控件大小和位置 具体讲解看https://blog.csdn.net/weixin_38211198/article/details/90639601
因为业务的需要,有时会使用到自定义运行时窗体设计器Runtime FormDesigner,实现的功能,就是IDE设计器的简化。设想一下,如果可以在程序运行时,再设计一个Form,然后编译代码,那是多么强大呀。
winform窗体自适应大小,运行环境:Visual Studio 2017,.Net Framework 4.8; 用法简单,调用AutoSize 即可。 private static AutoSize autoSize; public Form1() { InitializeComponent(); autoSize = new ...
winform 多语言 xml文件格式语言包,实现实时语言切换,语言信息集成在统一的xml文件中,可改变语言与文字大小,轻松切换例子。
C# Winform 利用线程延时创建子窗体并且可跨线程控制主窗体的控件
这是C#对于多语言界面的最常规实现法,大量C#的商用软件也是如此实现
C#WinForm窗体内Panel容器中嵌入子窗体、程序主窗体设计例子
【ASP.NET编程知识】在WinForm和WPF中使用GMap.Net地图插件简单教程.docx
在新窗体中可以直接使用以下属性和方法: CurLanguage:设置或者获取当前语言项; SetLan(languagename,Form)设置窗体语言,立即生效 SaveLanguage()保存当前设置的语言(默认为操作系统语言) GetLanguages()...
在Winform中,使用resx文件实现多语言切换(简体中文,繁体中文,英文),可以同时切换所有打开的窗口的语言
登陆框窗体应用程序 Visual c++.net做的例子
C# winform 子窗体调用父窗体函数实现关闭该窗体打开另一个窗体;在父窗体分From1内嵌一个panel1,在panel1里载入From2,点击在子窗体From2中的按钮,清除panel1里的From2,新载入From3,点击在子窗体From3中的按钮...
主要介绍了在类库或winform项目中打开另一个winform项目窗体的方法,可以实现Winform项目间窗体的调用,在进行Winform项目开发中非常具有实用价值,需要的朋友可以参考下