zoukankan      html  css  js  c++  java
  • Winform中多国语言窗体的设计以及.NET中资源文件的使用[转]

    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" , "从资源文件中读取字符串" );

    至此我们已经创建了一个资源文件,并且在资源文件中加入了若干个资源,当然在这之后,还应该注意,保存此资源文件,并关闭资源文件,具体如下:

    rw.Close ( ) ;

    以上我介绍了用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资源文件生成器的使用

    在网上相关的软件已经很多了,我给大家介绍一个Resourcer.exe,它是开源的,可以在http://www.aisto.com/roeder/dotnet/ 中下载。其运行界面如下:

    该软件可以自动保存成text、resx和resources三种格式的文件。前面的资源可以很方便的使用此软件来创建。大家可以自己下载下来试试。我在这里就不多说了。

    第七部分:总结

    通过上面的介绍我们已经具备了制作多国语言的基础,当然这只是对多国语言制作的初步介绍。有什么不妥的地方,请在评论中指正,我会尽快改过来的

    来源:

    http://blog.csdn.net/tjvictor/article/details/1464284

  • 相关阅读:
    Android开发之动态设置字体的样式和粗细
    Android开发之炫酷MD风格
    Android开发之自定义Dialog简单实现
    Android开发之自定义Toast(带详细注释)
    【Android优化篇】提升Activity加载速度的方法
    android使用Pull解析来自服务器的xml文件时出现错误以及解决方案
    Image augmentation for machine learning experiments
    LibreCAD
    C++ library to read and write DXF/DWG files
    DXF-Viewer
  • 原文地址:https://www.cnblogs.com/saptechnique/p/2320627.html
Copyright © 2011-2022 走看看