C# 实现多语言支持的本地化(资源)
当前位置:点晴教程→知识管理交流
→『 技术文档交流 』
❝ 资源像图片或字符串表这样的资源可以放在资源文件或附属程序集中。在本地化应用程序时,这种 资源非常有用,.NET 对本地化资源的搜索提供了内置支持。 在说明如何使用资源本地化应用程序之前,先讨论如何创建和读取资源,而无须考虑语言因素。 创建资源文件资源文件包含图片、字符串表等条目。要创建资源文件,或者使用一般的文本文件,或者使用 那些利用XML 的.resX 文件。下面从一个简单的文本文件开始。 内嵌字符串表的资源可以使用一般的文本文件来创建。该文本文件只是把字符串赋予键。键是 可以用来从程序中获取数值的名称。键和数值中都可以包含空格。 这个例子显示了Wrox.ProCSharp.Localization.MyResources.txt 文件中的一个简单字符串表:
在保存带Unicode 字符的文本文件时,必须将文本文件和相应的编码一起保存。 为此,可以在Save 对话框中选择Unicode 编码。 资源文件生成器可以使用资源文件生成器Resgen.exe(实用程序)在Wrox.ProCSharp.Localization.MyResources.txt 的外部创建一个资源文件,输入如下代码: resgen Wrox.ProCSharp.Localization.MyResources.txt 会创建Wrox.ProCSharp.Localization.MyResources.resources 文件。最终的资源文件可以作为一个 外部文件添加到程序集中,或者内嵌到DLL 或EXE 中。Resgen 还可以创建基于XML 的.resX 资源 文件。构建XML 文件的一种简单方法是使用Resgen 本身:
这条命令创建了XML 资源文件Wrox.ProCSharp.LocalizationMyResources.resX。 Resgen 支持强类型化的资源。强类型化的资源用一个访问资源的类表示。这个类可以用resgen 实用程序的/str 选项创建:
在/str 选项中,按照语言、名称空间、类名和源代码文件名的顺序定义资源。 Resgen 实用程序不支持添加图片。在.NET Framework SDK 示例中,有一个ResXGen 示例。使 用ResXGen 可以在.resX 文件中引用图片。还可以使用ResourceWriter 类或ResXResourceWriter 类 以编程方式把图片添加到资源中。 ResourceWriter除了使用Resgen 实用程序构建资源文件外,编写程序来创建资源也很简单。ResourceWriter 是 来自System.Resources 名称空间的一个类,它可以用于编写二进制资源文件;ResXResourceWriter 类编写基于XML 的资源文件。这两个类也支持图片和任何其他可串行化的对象。在使用 ResXResourceWriter 类时,必须引用System.Windows.Forms 程序集。 下面的代码使用构造函数和文件名Demo.resx 创建一个ResXResourceWriter 对象rw。在创建了 一个实例后,使用ResXResourceWriter 类的AddResource()方法可以添加至多2GB 的资源。 AddResource()方法的第一个参数指定资源名,第二个参数指定数值。可以使用Image 类的一个实例 来添加图片资源。要使用Image 类,必须引用System.Drawing 程序集,还要添加using 指令,以打 开System.Drawing 名称空间。 下面打开logo.gif 文件,创建一个Image 对象。必须把图片复制到可执行文件的目录下,或者 在Image.ToFile()方法的参数中指定图片的完整路径。using 语句指定应在using 块的尾部自动释放图 像资源。把其他简单的字符串资源添加到ResXResourceWriter 对象中。ResXResourceWriter 类的 Close()方法会自动调用ResXResourceWriter.Generate()方法,最后把资源写入Demo.resx 文件中:
启动这个小程序,创建嵌入了图像logo.gif 的资源文件Demo.resx,这个文件将用于下面的一个 Windows 应用程序。 使用资源文件使用 C#命令行编译器csc.exe 和/resource 选项,或直接使用Visual Studio,可以把资源文件添加 到程序集中。为了说明如何在Visual Studio 中使用资源文件,下面创建一个控制台应用程序 ResourceDemo。 在 Solution Explorer 窗口的上下文菜单(Add ➪ Existing Item 命令)中,把前面创建的资源文件 Demo.resx 添加到这个项目中。默认情况下,把这个资源的Build Action 设置为Embedded Resource, 这样,这个资源就嵌入到输出的程序集中。 在项目设置(Application ➪ Assembly information 命令)中,把应用程序的Neutral Language 设置 为主要语言,如EEnglish(United States),下图 所示。改变这个设置,会在assemblyinfo.cs 文件 中添加[NeutralResourceLanguageAttribute]属性:
设置这个选项会提高ResourceManager 的 性能,因为它会更快地找到en-US 的资源,该 资源还会用作默认的回退。使用这个特性也可 以通过构造函数的第二个参数指定默认资源的 位置。使用UltimateResourceFallbackLocation 枚举可以指定默认资源要在主程序集或附属程 序集(MainAssembly 和Satellite 值)中存储。 要访问嵌入的资源,可以使用System.Resources 名称空间中的ResourceManager 类。把以嵌入 的资源为参数的程序集传递给ResourceManager 类的构造函数。在本例中,因为把资源嵌入到正在 执行的程序集中, 所以应把 Assembly.GetExecutingAssembly() 方法 的结果作为构造函数的第二个参数。第 一个参数是资源的根名。根名由名称空 间和资源文件名(不带资源扩展名)组 成。如前所述,使用ildasm 来显示该名 称。为此,只需删除资源的扩展名 resources 即可。还可以使用 System.Reflection.Assembly 类的GetManifestResourceNames()方法通过编程方式获取该名称。
使用ResourceManager 实例rm,通过指定GetObject()和GetString()方法的键,就可以获得所有 的资源:
通过强类型化的资源,可以简化前面编写的代码:不需要实例化ResourceManager,也不需要 使用索引符访问资源,而只需使用属性访问资源名:
要使用托管资源编辑器创建强类型化的资源,可以把Access Modifier 从No Code Generation 重 置为Public 或Internal。使用Public 选项,生成的类就使用公共访问修饰符,并且它可以在其他程序 集中使用。而使用Internal 选项,生成的类就使用内部访问修饰符,并且它只能在程序集内部访问。 设置这个选项后,就会创建Demo 类(它与资源同名)。这个类的静态属性为所有的资源提供了 强类型化的资源名。通过实现静态属性,就可以使用ResourceManager 对象,该对象在第一次访问 时实例化,并缓存: System.Resources名称空间ResourceManager 类可以用于从程序集或资源文件中获取当前区域性的资源。使用 ResourceManager 类还可以获取特定区域性的ResourceSet 类。 阅读原文:原文链接 该文章在 2025/3/24 13:20:34 编辑过 |
关键字查询
相关文章
正在查询... |