65.9K
CodeProject 正在变化。 阅读更多。
Home

.NET - 使用资源文件进行本地化

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.79/5 (89投票s)

2003年11月16日

7分钟阅读

viewsIcon

944421

本文解释并演示了在.NET应用程序中实现本地化的各种方法。

引言

.NET框架提供了对本地化的支持。本地化涉及为特定的文化、区域设置或语言自定义数据和资源。如果应用程序需要根据各自的文化进行自定义,那么支持本地化对于应用程序来说很重要。

在这里,我将讨论两种实现和访问资源的途径,您可以从当前运行的程序集中使用和访问这些资源。资源文件应在运行程序集的范围之外添加和管理,并且不应构成程序集的一部分。

这种方法很有帮助,因为资源文件是在应用程序的构建过程之外生成的。它在外部创建特定语言资源并在不编译当前项目的情况下将其添加到执行程序集方面提供了灵活性。

方法

这两种方法是

  1. 为特定文化资源文件创建附属程序集并在执行程序中使用它
  2. 创建一个基于文件的资源管理器,该管理器允许从程序集清单外部的位置访问和读取资源文件

现在让我们详细看看这两种方法。

  1. 为特定文化资源文件创建附属程序集并在执行程序中使用它

    .NET框架使用中心和辐射模型来打包和部署资源。中心是包含可执行代码和单个文化资源的main程序集。这种文化称为中性或默认文化,是应用程序的回退文化。每个辐射程序集都连接到一个附属程序集,该程序集包含单个文化的资源,但不包含任何可执行代码。

    为您的应用程序包含资源文件的附属程序集创建步骤

    1. 在应用程序的根级别创建一个默认资源文件。

      假设MyApplication是应用程序名称,MyResource.resx是默认资源。MyResource.resx称为默认资源,因为如果不存在特定语言的资源文件,.NET运行时将查找此资源文件。

      要使用Visual Studio .NET创建上述提到的资源文件,请突出显示一个项目并添加类型为“程序集资源”的新项。将程序集资源命名为MyResource.resx。这将创建一个带有.resx扩展名的资源文件。

    2. 在项目清单之外创建附属程序集。

      我将在以下步骤中解释如何为英国英语文化(文化名称:en-GB)创建附属程序集

      1. 创建一个资源文件,并将其命名为MyResource.en-GB.resx

        通过使用Visual Studio .NET命令提示符,在该资源文件上运行资源生成器实用程序。生成.resources文件的命令是

        Resgen MyResource.en-GB.resx

        这将创建上述资源文件的二进制版本,名为MyResource.en-GB.resources

      2. 运行AL(程序集链接器)实用程序,从上一步(步骤a)生成的资源文件中生成附属程序集。生成附属程序集的命令如下所示
        Al.exe
        /t:lib
        /embed: MyResource.en-GB.resources,
        MyApplication.MyResource.en-GB.resources
        /culture:en-GB
        /out:MyApplication.resources.dll

        上述命令行的解释如下

        /t:lib:表示您打算创建一个.dll

        /embed:MyResource.en-GB.resources,MyApplication. MyResource.en-GB.resources:嵌入并重命名资源,使其名称与Visual Studio IDE的命名结构匹配。

        /culture:en-GB:指示目标文化

        /out:MyApplication.resources.dll:指示输出DLL的名称。结果DLL(MyApplication.resources.dll)应具有相同的命名约定才能找到它。

      3. 将创建的附属程序集放在应用程序目录的bin目录内的en-GB文件夹中。

        目录结构应如下所示

        \MyApplication\bin\en-GB\MyApplication.resources.dll

        请注意,您可能需要创建bin目录内的en-GB文件夹。您可以创建任意数量的附属程序集,并将它们放在应用程序的bin文件夹中,放在各自的特定文化目录下。

    现在我们已经创建了附属程序集并将其复制到项目根目录的bin文件夹中,我们就可以使用该程序集从资源文件中读取资源文本了。

    以下命名空间将是下面代码片段所需的

    using System.Reflection;
    using System.Resources;
    using System.Globalization;

    要从资源文件中读取,我们需要创建一个ResourceManager实例,并提供默认资源名称和当前执行程序集,如下所示

    ResourceManager resmgr = new ResourceManager("MyApplication.MyResource ", 
                                  Assembly.GetExecutingAssembly());

    请注意,MyApplication是应用程序的名称,MyResource是资源文件的基本名称。

    要从资源文件中读取值,我们使用ResourceManagerGetString方法,如下所示

    string msg = resmgr.GetString(messageId,ci);

    其中,

    • messageId是在资源文件中查找目标值的键名。

    • ciCultureInfo,表示目标特定文化的资源。

    假设我们需要读取我们已经创建了附属程序集并将其放在适当目录下的英国(en-GB)特定资源文件。CultureInfo可以实例化如下

    CultureInfo ci = new CultureInfo("en-GB");

    如果运行时无法加载或找到此特定文化资源,它将从默认资源(如上面步骤1中所述的MyResource.resx)读取目标资源文本。

  2. 创建一个基于文件的资源管理器,该管理器允许从程序集清单外部的位置访问和读取资源文件

    当我们需要将资源文件保存在与项目清单隔离的单独位置,但仍想从当前程序集访问特定文化资源时,此方法很有帮助。

    将资源文件从项目清单外部包含到应用程序中的步骤

    1. 使用Visual Studio .NET IDE创建一个默认资源文件。

      假设MyResource.resx是默认资源名称。MyResource.resx称为默认资源,因为如果不存在特定语言的资源文件,.NET运行时将查找此资源文件。

      要使用Visual Studio .NET创建上述提到的资源文件,请突出显示一个项目,并添加类型为“程序集资源”的新项。将程序集资源命名为MyResource.resx。这将创建一个带有.resx扩展名的资源文件。

      类似地,为目标文化创建资源文件。假设您需要为英国英语文化(文化名称:en-GB)创建一个资源文件。使用Visual Studio .NET IDE创建此资源,并将其命名为MyResource.en-GB.resx

      同样,您可以创建具有相同命名约定的其他特定文化资源文件。

    2. 从上面步骤1中创建的.resx文件创建.resources文件。

      通过使用Visual Studio .NET命令提示符,在资源文件上运行RESGEN实用程序。创建.resources文件的命令如下

      Resgen MyResource.resx

      这将创建名为MyResource.resources的资源文件的二进制格式

      类似地,为所有特定文化.resx文件创建.resources文件。

      例如,Resgen MyResource.en-GB.resx将生成MyResource.en-GB.resources文件。

      重要提示:遵循正确的资源文件命名约定非常重要,因为它是运行时查找正确资源文件的基础。这些资源文件具有特定的命名结构,如下所示

      <resource file basename>.<culture>.resources
    3. 将所有.resources文件保存在同一位置,例如C:\Program Files\ResourceSet

      MyResource.resources的路径将是

      "C:\Program Files\ResourceSet\MyResource.resources"

      类似地,MyResource.en-GB.resources的路径也将是

      "C:\Program Files\ResourceSet\MyResource.en-GB.resources"

    以下命名空间将是下面代码片段所需的

    using System.Resources;
    using System.Globalization;

    要从上面步骤中创建的资源文件中读取键值,我们需要使用ResourceManagerCreateFileBasedResourceManager方法,如下所示

    ResourceManager resourceMgr = 
        ResourceManager.CreateFileBasedResourceManager(resourceName,
        resourcePath,null);

    其中,

    • resourceName是资源文件的基本名称。在这种情况下,它是MyResource
    • resourcePath是资源存储库的路径,从中选择特定文化的资源文件。在这种情况下,它是C:\Program Files\ResourceSet
    • null表示使用的是默认运行时ResourceSet

    要从资源文件中读取值,我们将使用ResourceManagerGetString方法,如下所示

    string msg = resourceMgr.GetString(messageId,ci);

    其中,

    • messageId是在资源文件中查找目标值的键名
    • ciCultureInfo,表示目标特定文化的资源。

    假设我们需要读取我们已经创建了名为MyResource.en-GB.resources的资源文件的英国(en-GB)特定资源文件。CultureInfo可以实例化如下

    CultureInfo ci = new CultureInfo("en-GB");

    如果运行时无法加载或找到此特定文化资源,它将从默认资源(如上面步骤1和2中所述的MyResource.resources)读取目标资源文本。

© . All rights reserved.