LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

C# 实现多语言支持的本地化(资源)

admin
2025年3月22日 7:43 本文热度 144

本章内容:
● 使用表示区域性和区域的类
● 应用程序的全球化
● 应用程序的本地化
本章将介绍.NET 应用程序的全球化和本地化。全球化(Globalization)用于国际化的应用程序:使 应用程序可以在国际市场上销售。采用全球化策略,应用程序应根据区域性、不同的日历等支持不 同的数字和日期格式。本地化(Localization)用于为特定的区域性翻译应用程序。而字符串的翻译可 以使用资源,如.NET 资源或WPF 资源字典。

资源

像图片或字符串表这样的资源可以放在资源文件或附属程序集中。在本地化应用程序时,这种 资源非常有用,.NET 对本地化资源的搜索提供了内置支持。

在说明如何使用资源本地化应用程序之前,先讨论如何创建和读取资源,而无须考虑语言因素。

创建资源文件

资源文件包含图片、字符串表等条目。要创建资源文件,或者使用一般的文本文件,或者使用 那些利用XML 的.resX 文件。下面从一个简单的文本文件开始。

内嵌字符串表的资源可以使用一般的文本文件来创建。该文本文件只是把字符串赋予键。键是 可以用来从程序中获取数值的名称。键和数值中都可以包含空格。

这个例子显示了Wrox.ProCSharp.Localization.MyResources.txt 文件中的一个简单字符串表:

Title = Professional C#
Chapter = Localization
Author = Christian Nagel
Publisher = Wrox Press

在保存带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 本身:

resgen Wrox.ProCSharp.Localization.MyResources.txt
Wrox.ProCSharp.Localization.MyResources.resX

这条命令创建了XML 资源文件Wrox.ProCSharp.LocalizationMyResources.resX。

Resgen 支持强类型化的资源。强类型化的资源用一个访问资源的类表示。这个类可以用resgen 实用程序的/str 选项创建:

resgen /str:C#,Wrox.ProCSharp.Localization,MyResources,MyResources.cs
Wrox.ProCSharp.Localization.MyResources.resX

在/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 文件中:

using System;
using System.Resources;
using System.Drawing;
class Program
{
static void Main()
{
    var rw = new ResXResourceWriter("Demo.resx");
    using (Image image = Image.FromFile("logo.gif"))
    {
        rw.AddResource("WroxLogo", image);
        rw.AddResource("Title", "Professional C#");
        rw.AddResource("Chapter", "Localization");
        rw.AddResource("Author", "Christian Nagel");
        rw.AddResource("Publisher", "Wrox Press");
        rw.Close();
    }
  }
}

启动这个小程序,创建嵌入了图像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]属性:

[assembly: NeutralResourcesLanguageAttribute("en-US")]

设置这个选项会提高ResourceManager 的 性能,因为它会更快地找到en-US 的资源,该 资源还会用作默认的回退。使用这个特性也可 以通过构造函数的第二个参数指定默认资源的 位置。使用UltimateResourceFallbackLocation 枚举可以指定默认资源要在主程序集或附属程 序集(MainAssembly 和Satellite 值)中存储。
构建项目后,使用ildasm 查看生成的程序 集时,会在程序集清单中看到.mresource 特性, 下图 所示。它声明了程序集中资源的名 称。如果把.mresource 声明为public(与本例一 样),该资源就会从程序集中导出,且可以用于 其他程序集的类中。如果把.mresource 声明为 private,则表示该资源不能导出,只能用于该 程序集内部。

要访问嵌入的资源,可以使用System.Resources 名称空间中的ResourceManager 类。把以嵌入 的资源为参数的程序集传递给ResourceManager 类的构造函数。在本例中,因为把资源嵌入到正在 执行的程序集中, 所以应把 Assembly.GetExecutingAssembly() 方法 的结果作为构造函数的第二个参数。第 一个参数是资源的根名。根名由名称空 间和资源文件名(不带资源扩展名)组 成。如前所述,使用ildasm 来显示该名 称。为此,只需删除资源的扩展名 resources 即可。还可以使用 System.Reflection.Assembly 类的GetManifestResourceNames()方法通过编程方式获取该名称。

using System;
using System.Drawing;
using System.Reflection;
using System.Resources;
namespace Wrox.ProCSharp.Localization
{
class Program
{
    static void Main()
    {
        var rm = new ResourceManager("Wrox.ProCSharp.Localization.Demo",
        Assembly.GetExecutingAssembly());

使用ResourceManager 实例rm,通过指定GetObject()和GetString()方法的键,就可以获得所有 的资源:

    Console.WriteLine(rm.GetString("Title"));
    Console.WriteLine(rm.GetString("Chapter"));
    Console.WriteLine(rm.GetString("Author"));
    using (Image logo = (Image)rm.GetObject("WroxLogo"))
    {
      logo.Save("logo.bmp");
    }
  }
  }
}

通过强类型化的资源,可以简化前面编写的代码:不需要实例化ResourceManager,也不需要 使用索引符访问资源,而只需使用属性访问资源名:

private static void StronglyTypedResources()
{
    Console.WriteLine(Demo.Title);
    Console.WriteLine(Demo.Chapter);
    Console.WriteLine(Demo.Author);
    using (Bitmap logo = Demo.WroxLogo)
    {
      logo.Save("logo.bmp");
    }
}

要使用托管资源编辑器创建强类型化的资源,可以把Access Modifier 从No Code Generation 重 置为Public 或Internal。使用Public 选项,生成的类就使用公共访问修饰符,并且它可以在其他程序 集中使用。而使用Internal 选项,生成的类就使用内部访问修饰符,并且它只能在程序集内部访问。

设置这个选项后,就会创建Demo 类(它与资源同名)。这个类的静态属性为所有的资源提供了 强类型化的资源名。通过实现静态属性,就可以使用ResourceManager 对象,该对象在第一次访问 时实例化,并缓存:

System.Resources名称空间

ResourceManager 类可以用于从程序集或资源文件中获取当前区域性的资源。使用 ResourceManager 类还可以获取特定区域性的ResourceSet 类。
ResourceSet 类表示特定区域性的资源。在创建ResourceSet 类的实例时,它会枚举一个实 现IResourceReader 接口的类,并在散列表中存储所有的资源。
IResourceReader 接口用于从ResourceSet 中枚举资源。ResourceReader 类实现这个接口。
ResourceWriter 类用于创建资源文件。ResourceWriter 类实现IResourceWriter 接口。  ResXResourceSet、ResXResourceReader 和ResXResourceWriter 类分别类似于R esourceSet、 ResourceReader 和ResourceWriter 类,但创建的是基于XML 的资源文件.resX,而不是二 进制文件。ResXFileRef 可以用于链接资源,而不是把资源嵌入到XML 文件中。
System.Resources.Tools 名称空间包含的StronglyTypedResourceBuilder 类可以从资源中创建 类。


阅读原文:原文链接


该文章在 2025/3/24 13:20:34 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2025 ClickSun All Rights Reserved