`

Globalization & Resources

阅读更多

http://blog.csdn.net/etmonitor/


.NET
系统学习----Globalization & Resources <!----><o:p></o:p>

<o:p> </o:p>

l          前言<o:p></o:p>

l          了解资源文件<o:p></o:p>

l          创建资源文件<o:p></o:p>

l          在程序中使用资源文件<o:p></o:p>

l          资源文件的命名和部署<o:p></o:p>

l          参考<o:p></o:p>

<o:p> </o:p>

前言:<o:p></o:p>

在学习如何使用.NET资源文件以及如何开发World-Ready程序之前,我们先通过一个例子来看看为什么要使用资源文件,以及使用它的好处。<o:p></o:p>

假设要在程序中根据当前的Culutre来设置FormTitleLogo<o:p></o:p>

       private void Form1_Load(object sender, System.EventArgs e)   {<o:p></o:p>

              CultureInfo ci = new CultureInfo(Thread.CurrentThread.CurrentUICulture.ToString());<o:p></o:p>

              switch (ci.ToString().ToLower()) {<o:p></o:p>

                     case "zh-cn":  // 中文版本<o:p></o:p>

                            this.Text=FormTitle_ZH_CN;<o:p></o:p>

                            imgLogo.Image = new Bitmap(Application.StartupPath + "/Logo_ZH_CN.jpg");<o:p></o:p>

                            break;<o:p></o:p>

                     case "en-us":  // 英文版本<o:p></o:p>

                            this.Text=FormTitle_EN_US; <o:p></o:p>

                            imgLogo.Image = new Bitmap(Application.StartupPath + "/Logo_EN_US.jpg");<o:p></o:p>

                            break;<o:p></o:p>

                     default:   // 默认版本<o:p></o:p>

                            this.Text=FormTitle_Neutral;<o:p></o:p>

                            imgLogo.Image = new Bitmap(Application.StartupPath + "/Logo_Neutral.jpg");<o:p></o:p>

                            break;<o:p></o:p>

              } <o:p></o:p>

}<o:p></o:p>

这段代码有两个问题:<o:p></o:p>

首先,Logo文件是暴露给用户的,而且是以普通文件的格式存储的,这导致其他程序或是用户很容易修改这些文件;节省硬盘空间的用户还可能会选择删除它,这些都可能会导致应用程序出错。确保图片或任何其他文件和代码在一起的唯一的安全方式是将它作为资源文件嵌入在程序集中并加载。<o:p></o:p>

其次,这是一个World-Ready程序,如果需要新加入一个新的Culture,你可能不得不更改你的源代码,加入新的case,然后重新编译来适应新的Culture的需要,这对一个World-Ready程序来说是不现实的。开发World-Ready程序很重要的一点就是要保证程序的逻辑界面和资源界面的隔离。任何时候加入一个新的Culture资源,我们都不应该重新编译源程序,相反,我们只需要把新的资源文件准备好,然后发布给用户并部署在合适的目录下就可以了。应用程序应该能够根据不同的Culture来自动寻找合适的资源。<o:p></o:p>

<o:p></o:p>

本文的目的就是通过实例来帮助读者了解什么是Resources,以及如何使用Resources来消除上面所提到的两个问题。<o:p></o:p>

全文分为四部分:<o:p></o:p>

第一部分是一些和资源相关的概念。<o:p></o:p>

第二部分是一个实例程序(ResourceGenerator),用来说明如何创建资源文件。<o:p></o:p>

第三部分是另外一个实例程序(WorldAPP),用来说明如何在程序中使用资源文件<o:p></o:p>

第四部分是关于资源文件的命名和部署。分别介绍.NET中资源文件的命名方式和如何在World-Ready程序中配置资源文件。<o:p></o:p>

<o:p> </o:p>

第一部分 概念<o:p></o:p>

先来了解一些概念:<o:p></o:p>

1.        什么是资源文件<o:p></o:p>

顾名思义,资源文件当然包含的全是资源。不过,什么是资源?这里所谓的资源就是程序中可利用的任何数据,譬如:字符串、图片或任何二进制格式的数据。一个资源文件可以有多种语言文化版本,比如,一个Culture.resources 文件可以有英语版、简体中文版日文版等。ResourceManager可以自动根据Culture和资源文件名来确认调用哪个版本。只不过不同的资源版本需要在文件名中加入语言文化信息(.resource文件有一套严格的命名规范,参考第四部分:资源文件的命名和部署)。<o:p></o:p>

<o:p></o:p>

2.        资源文件的类型<o:p></o:p>

System.Resources名称空间支持三种类型的资源:<o:p></o:p>

.txt文件,只能有字符串资源。因为不能被嵌入到Assembly中,所以很容易暴露,被其他程序或用户修改。最大缺点是仅支持字符串资源,不推荐使用。 <o:p></o:p>

.resx文件,由XML组成,可以加入任何资源,包括二进制格式的。同样不能被嵌入到Assembly中。在System.Resources 名称空间中有专用读写的类。VS.NET中创建的这种文件也是将其转成.resources 文件然后根据设置将其嵌入到Assembly中。<o:p></o:p>

.resources文件,PE格式,可以加入任何资源。是唯一可以被嵌入到Assembly的文件,在System.Resources名称空间中有专用读写的类(ResourceManager)。 <o:p></o:p>

<o:p></o:p>

3.        调用资源文件的几种方法<o:p></o:p>

ResourceManager可以根据不同的UICulture设置返回不同的本地资源,不同Culture的资源文件有一套严格的命名规则,只有按照这个规则命名,CRL才可以根据Culture找到这个本地资源。PS:因为这个很重要,所以才一再出现J参考第四部分:资源文件的命名和部署<o:p></o:p>

.txt 文件:<o:p></o:p>

不可以直接调用,得先将其转换成 .resources 文件才能使用。<o:p></o:p>

.resx 文件:<o:p></o:p>

可以用ResXResourceReader来读取,但是这种方法不直观也不安全,不推荐直接调用.resx文件。正确的方法是将其转换成.resources文件,然后用ResourceManager读取。注意,如果是在VS.NET中添加的.resx文件,那么它们自动被设为 Embedded Resource,然后被转成.resources文件后嵌入到Assembly中。<o:p></o:p>

.resources 文件:<o:p></o:p>

分成两种情况:<o:p></o:p>

·         被嵌入或编译成卫星程序集(Satellite Assembly):<o:p></o:p>

ResourceManager的各种constructor来获得在Assembly中的资源。<o:p></o:p>

·         单独文件,没有被编译或嵌入到Assembly中:<o:p></o:p>

可以用ResourceManager.CreateFileBasedResourceManager来获得资源集(ResourceSet),就是所有的资源。 <o:p></o:p>

特殊情况:<o:p></o:p>

还有一种特殊情况,那就是当你直接嵌入一资源时,也就是说,不通过一个资源文件(.resources)而直接将一资源Object)嵌入到 Assembly 中。这可以通过AL.exeAssembly Linker)的参数/embed:<object>把资源嵌入在Assembly中。在这种情况下ResourceManager就没有用了,因为它只能获取.resources资源文件(在或不在Assembly中)。<o:p></o:p>

调用这类直接嵌入在Assembly中的资源,我们就需要利用Reflection的一些特性来完成。在System.Reflection.Assembly类中有一些相关函数可以帮助我们拿到这些资源。通过Assembly.GetManifestResourceNames可以拿到所有的资源的名字,然后我们就可以通过Assembly.GetManifestResourceStream<object_name>)这个函数拿到对应的资源并以stream的方式返回,然后我们可以将这个stream转成在.NET中可用的对象。比如,如果嵌入资源是一图片,那么我们可以利用New BitmapStream)的constructor获得这个图片资源的Bitmap对象。<o:p></o:p>

<o:p> </o:p>

第二部分 创建资源文件<o:p></o:p>

创建资源文件有两种方式,一种是使用.NET SDK自带的resgen工具来创建,另外一种是自己写code来创建。分别来介绍:<o:p></o:p>

1.        Resgen<o:p></o:p>

这个工具是.NET自带的,它可以把.txt.resX,转换为.resources文件。.resources文件是以一种以键-值方式对应存储的XML格式文件,每一个键<data>对应一个值<value>,这个<value>可以是任何的二进制格式。如果是格式为(键=值)对应得.txt文件,resgen会自动生成键-值对应的XML文件。但是resgen有一个局限性,它不能直接嵌入其他格式的文件,比如你就不能把.bmp以键-值得方式对应起来,因为你首先不能很容易得把.bmp以(键=值)对应的格式储存在.txt文件中。所以resgen主要是针对txt文件使用。<o:p></o:p>

一个例子:company1.txt文件内容为:<o:p></o:p>

Title = Company1<o:p></o:p>

Address = Company1 Address<o:p></o:p>

Phone = 12345678<o:p></o:p>

----------------------------------------------------------------<o:p></o:p>

Resgen company.txt <outputfilename>.resources<o:p></o:p>

如果不指定<outputfilename>,默认会生成company1.resources<o:p></o:p>

然后就可以通过ResourceManager来使用了。<o:p></o:p>

还可以再进一步,通过AL.exeresources文件变为一个assembly(使用assembly有很多好处(比如可以加入版本信息和Culture信息等)详见(.NET系统学习----Assembly)。<o:p></o:p>

Al /out:company1.dll /embed:company1.resources<o:p></o:p>

通过设置ResourcesManager的不同的constructor就可以访问Assembly中包含的.resources

分享到:
评论

相关推荐

    C# .Net Globalization and Localization

    在软件开发领域,为了满足不同地区、不同语言用户的需求,全球化(Globalization)和本地化(Localization)成为了一个至关重要的环节。C# .Net框架为此提供了强大的支持,使得开发者能够轻松地构建能够适应多种文化...

    C#高仿QQ截图

    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("让屏幕开满玫瑰把妹必备.Properties.Resources", typeof(Resources).Assembly); resourceMan = temp; } ...

    Westwind.Globalization:.NET应用程序的数据库驱动的资源本地化

    Westwind.Globalization(.NET Standard,.NET 4.5+): Westwind.Globalization.AspNetCore(.NET Core 3.1、2.1): Westwind.Globalization.Web(.NET 4.5+): 该库和工具提供了易于使用的数据库资源管理...

    DL.SO.Globalization.DotNet:一个演示项目,展示了如何在ASP.NET MVC5中进行全球化

    【标题】"DL.SO.Globalization.DotNet" 是一个专门针对ASP.NET MVC5的全球化演示项目,旨在帮助开发者理解和实现Web应用程序的多语言支持。 【描述】这个项目深入探讨了如何在ASP.NET MVC5框架中实现全球化,使应用...

    devexpress 14.2 汉化文件2 zh-Hans

    1. DevExpress.Spreadsheet.v14.2.Core.resources.dll:这个文件提供了Spreadsheet组件的汉化资源,Spreadsheet是DevExpress中用于创建和编辑电子表格的强大工具,支持Excel兼容格式,用户可以进行公式计算、数据...

    C#中介管理系统 比较详细 也是比较全的

    private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode...

    c#调用资源文件文档

    System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(lang); if (form != null) { System.ComponentModel.ComponentResourceManager resources = new System....

    Asp.Net Core MVC项目实现多语言实例(Globalization/Localization)

    - 资源文件夹的命名通常遵循一定的规则,如`Resources/&lt;CultureName&gt;`,其中`&lt;CultureName&gt;`可以是`en-US.json`、`zh-CN.json`等,分别代表不同的语言文化。 2. **CultureConfigurer类的实现**: - `...

    Dev Express Localized Resources 2017.2 官方中文语言包带源码

    DevExpress17.2 官方中文语言包 带源码 运行语言包,在执行目录... System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("zh-CHS");  Application.Run(new Form1()); }

    DevExpress v15.2.x zh-CHS 完全汉化,设计时刻汉化

    Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("zh-CN"); // 下面的代码行提供本地化的应用程序用户界面。 Thread.CurrentThread.CurrentUICulture = new System.Globalization....

    c#多语言切换

    例如,我们可以创建`Resources.resx`作为默认语言(通常是英文)的资源文件,然后创建`Resources.de.resx`用于德语,`Resources.fr.resx`用于法语等。每个资源文件都包含相同的键值对,但对应不同语言的值。 接下来...

    商业编程-源码-ASP.NET2.0支持多语言示例源码.zip

    对于每个语言,我们都需要一个对应的资源文件,例如英文版为 Resources.resx,法文版为 Resources.fr-FR.resx。这些文件中包含键值对,键是不变的,值是根据不同语言翻译的文本。 其次,全球化设置在Web.config配置...

    ASP.NET2.0支持多语言示例源码

    这里的`$ Resources:Resources, WelcomeMessage %&gt;`是一个数据绑定表达式,它会从名为`Resources`的资源文件中获取`WelcomeMessage`键对应的字符串。 三、多语言切换 为了让用户能够方便地在不同语言之间切换,...

    asp.net 国际化 实例 代码

    这里的`$ Resources:Resources, ButtonText %&gt;`是一个资源表达式,它会从"Resources"资源文件中查找键为"ButtonText"的值。在不同的语言环境中,这个按钮的文本就会自动从相应的资源文件中获取。 全球化设置通常在...

    ASP.NET 多国语言设置,语言设置,多语言网站制作和设置

    为不同的语言创建对应的资源文件,例如英语(`Resources.resx`)、法语(`Resources.fr-FR.resx`)等。 3. **使用资源文件**: - 在代码中,可以使用 `ResourceManager` 类来获取资源文件中的字符串。例如: ```...

    ASP.NET源码——ASP.NET2.0支持多语言示例源码.zip

    例如,英文版的资源文件可能命名为`Resources.en-US.resx`,法文版则为`Resources.fr-FR.resx`。这些文件中包含了可翻译的字符串,如按钮文本、错误消息等。 3. **ResourceManager**: ASP.NET中的ResourceManager类...

    asp.NET支持多种语言示例

    例如,你可以创建一个名为`Resources.resx`的默认英语资源文件,然后为其他语言如法语(`Resources.fr-FR.resx`)和西班牙语(`Resources.es-ES.resx`)创建对应的文件。 2. **定义本地化字符串**:在资源文件中,...

    如何开发一个多种语言版本的C#程序

    using System.Globalization; using System.Resources; using System.Threading; using System.IO; ``` 然后,在Form1类中,定义CultureInfo对象(ci)和ResourceManager对象(rm),用于处理语言切换和获取资源: ```...

    asp.net本地化实战解决方案及代码

    每个语言版本都会有一个对应的资源文件,比如英语版本的"Resources.resx",法语版本的"Resources.fr-FR.resx"等。资源文件中包含了键值对,键是程序中的标识符,值则是对应语言的文本内容。 二、Globalization 属性...

    asp.net 用资源文件实现多语言 含用户控件调用

    例如,我们可以为英文创建一个名为“Resources.resx”的文件,然后为法文创建一个名为“Resources.fr-FR.resx”的文件。这些文件通常存储在App_GlobalResources或App_LocalResources文件夹下。在这些文件中,我们将...

Global site tag (gtag.js) - Google Analytics