System.Resources.ResourceManager.GetString 方法

本文提供了此 API 参考文档的补充说明。

IgnoreCase 属性确定与资源名称的比较 name 是不区分大小写(默认值)还是区分大小写。

注意

这些 GetString 方法可以引发的异常数可能多于列出的异常。 出现这种情况的一个原因是此方法调用的方法引发异常。 例如, FileLoadException 如果在部署或安装附属程序集时出错,或者 SerializationException 当用户定义类型反序列化时引发用户定义的异常,可能会引发异常。

GetString(String) 方法

桌面应用

在桌面应用中,返回的资源针对当前线程的 UI 区域性进行本地化,由 CultureInfo.CurrentUICulture 属性定义。 如果资源尚未针对该区域性进行本地化,则资源管理器会按照打包和部署资源文章的 “资源回退过程”部分中概述的步骤来探测资源 。 如果未找到可用本地化资源集,资源管理器将回退到默认区域性的资源上。 如果资源管理器无法加载默认区域性的资源集,该方法将引发异常 MissingManifestResourceException ,或者,如果资源集应驻留在附属程序集中,则 MissingSatelliteAssemblyException 引发异常。 如果资源管理器可以加载适当的资源集,但找不到名为 name的资源,该方法将 null返回。

Windows 8.x 应用

重要

尽管 Windows 8.x 应用中支持该 ResourceManager 类,但我们不建议使用它。 仅当你开发可与 Windows 8.x 应用一起使用的可移植类库项目时,才使用此类。 若要从 Windows 8.x 应用检索资源,请改用 Windows.ApplicationModel.Resources.ResourceLoader 类。

在 Windows 8.x 应用中,该方法 GetString(String) 返回为调用方当前 UI 区域性设置本地化的字符串资源的值 name 。 区域性列表派生自操作系统的首选 UI 语言列表。 如果资源管理器不匹配 name,该方法将 null返回。

示例

以下示例使用 GetString 该方法检索区域性特定的资源。 它包括从英语(en)、法语(法国)和俄罗斯(俄罗斯)(ru-RU)文化的.txt文件中编译的资源。 本示例将当前文化和当前 UI 文化更改为英语(美国)、法语(法国)、俄语(俄罗斯)和瑞典语(瑞典)。 然后,它会调用 GetString 该方法来检索本地化字符串,该字符串与当前日期和月份一起显示。 请注意,输出显示适当的本地化字符串,除非当前 UI 区域性为瑞典(瑞典)。 由于瑞典语言资源不可用,因此应用会改用默认区域性的资源,即英语。 此示例需要下表中列出的基于文本的资源文件。 每个资源都有一个名为 DateStart 的字符串资源。

区域性 文件名 资源名称 资源值
en-US DateStrings.txt DateStart 今天是
fr-FR DateStrings.fr-FR.txt DateStart Aujourd'hui, c'est le
ru-RU DateStrings.ru-RU.txt DateStart Сегодня

可以使用以下批处理文件编译 C# 示例。 对于 Visual Basic,将 csc 更改为 vbc,并将源代码文件的扩展名由 .cs 更改为 .vb

resgen DateStrings.txt
csc showdate.cs /resource:DateStrings.resources

md fr-FR
resgen DateStrings.fr-FR.txt
al /out:fr-FR\Showdate.resources.dll /culture:fr-FR /embed:DateStrings.fr-FR.resources

md ru-RU
resgen DateStrings.ru-RU.txt
al /out:ru-RU\Showdate.resources.dll /culture:ru-RU /embed:DateStrings.ru-RU.resources

下面是示例的源代码(Visual Basic 版本ShowDate.vb或 C# 版本的ShowDate.cs)。

using System;
using System.Globalization;
using System.Resources;
using System.Threading;

public class Example
{
   public static void Main()
   {
      string[] cultureNames = [ "en-US", "fr-FR", "ru-RU", "sv-SE" ];
      ResourceManager rm = new ResourceManager("DateStrings",
                                               typeof(Example).Assembly);

      foreach (var cultureName in cultureNames) {
         CultureInfo culture = CultureInfo.CreateSpecificCulture(cultureName);
         Thread.CurrentThread.CurrentCulture = culture;
         Thread.CurrentThread.CurrentUICulture = culture;

         Console.WriteLine("Current UI Culture: {0}",
                           CultureInfo.CurrentUICulture.Name);
         string dateString = rm.GetString("DateStart");
         Console.WriteLine("{0} {1:M}.\n", dateString, DateTime.Now);
      }
   }
}
// The example displays output similar to the following:
//       Current UI Culture: en-US
//       Today is February 03.
//
//       Current UI Culture: fr-FR
//       Aujourd'hui, c'est le 3 février
//
//       Current UI Culture: ru-RU
//       Сегодня февраля 03.
//
//       Current UI Culture: sv-SE
//       Today is den 3 februari.
Imports System.Globalization
Imports System.Resources
Imports System.Threading

<Assembly:NeutralResourcesLanguage("en")>

Module Example
   Public Sub Main()
      Dim cultureNames() As String = { "en-US", "fr-FR", "ru-RU", "sv-SE" }
      Dim rm As New ResourceManager("DateStrings",
                                    GetType(Example).Assembly)
      
      For Each cultureName In cultureNames
         Dim culture As CultureInfo = CultureInfo.CreateSpecificCulture(cultureName)
         Thread.CurrentThread.CurrentCulture = culture 
         Thread.CurrentThread.CurrentUICulture = culture

         Console.WriteLine("Current UI Culture: {0}", 
                           CultureInfo.CurrentUICulture.Name)
         Dim dateString As String = rm.GetString("DateStart")
         Console.WriteLine("{0} {1:M}.", dateString, Date.Now)                           
         Console.WriteLine()
      Next                                           
   End Sub
End Module
' The example displays output similar to the following:
'       Current UI Culture: en-US
'       Today is February 03.
'       
'       Current UI Culture: fr-FR
'       Aujourd'hui, c'est le 3 février
'       
'       Current UI Culture: ru-RU
'       Сегодня февраля 03.
'       
'       Current UI Culture: sv-SE
'       Today is den 3 februari.

GetString(String, CultureInfo) 方法

桌面应用

在桌面应用中(如果是culturenull)中,该方法GetString(String, CultureInfo)使用从属性获取的CultureInfo.CurrentUICulture当前 UI 区域性。

为参数指定的 culture 区域性本地化返回的资源。 如果资源尚未本地化 culture,则资源管理器会按照打包和部署资源主题的 “资源回退过程”部分中概述的步骤来探测资源 。 如果未找到可用资源集,资源管理器将回退到默认区域性的资源上。 如果资源管理器无法加载默认区域性的资源集,该方法将引发异常 MissingManifestResourceException ,或者,如果资源集应驻留在附属程序集中,则 MissingSatelliteAssemblyException 引发异常。 如果资源管理器可以加载适当的资源集,但找不到名为 name的资源,该方法将 null返回。

Windows 8.x 应用

重要

尽管 Windows 8.x 应用中支持该 ResourceManager 类,但我们不建议使用它。 仅当你开发可与 Windows 8.x 应用一起使用的可移植类库项目时,才使用此类。 若要从 Windows 8.x 应用检索资源,请改用 Windows.ApplicationModel.Resources.ResourceLoader 类。

在 Windows 8.x 应用中,该方法GetString(String, CultureInfo)返回为参数指定的culture区域性本地化的字符串资源的值name。 如果资源未本地化为 culture 区域性,则查找将使用整个 Windows 8 语言回退列表,并在查看默认区域性后停止。 如果资源管理器不匹配 name,该方法将 null返回。

示例

以下示例使用 GetString(String, CultureInfo) 该方法检索区域性特定的资源。 该示例的默认区域性是英语(en),它包括法语(法国)(fr-FR)和俄罗斯(俄罗斯)(ru-RU)区域性的附属程序集。 本示例在调用 GetString(String, CultureInfo)之前将当前文化和当前 UI 文化更改为俄语(俄罗斯)。 然后,它调用 GetString 该方法和 DateTime.ToString(String, IFormatProvider) 方法,并将代表法语(法国)和瑞典(瑞典)文化的对象传递给 CultureInfo 每个方法。 在输出中,月份的月份和日以及前面显示的字符串以法语形式显示,因为 GetString 该方法能够检索法语语言资源。 但是,当使用瑞典(瑞典)文化时,当月份的月份和日期出现在瑞典语中,尽管前面带的字符串是英语的。 这是因为资源管理器找不到本地化的瑞典语言资源,因此它返回默认英语区域性的资源。

此示例需要下表中列出的基于文本的资源文件。 每个资源都有一个名为 DateStart 的字符串资源。

区域性 文件名 资源名称 资源值
en-US DateStrings.txt DateStart 今天是
fr-FR DateStrings.fr-FR.txt DateStart Aujourd'hui, c'est le
ru-RU DateStrings.ru-RU.txt DateStart Сегодня

可以使用以下批处理文件编译 Visual Basic 示例。 若要在 C# 中编译,请更改为vbccsc和更改源代码文件的扩展。.vb.cs

resgen DateStrings.txt
vbc showdate.vb /resource:DateStrings.resources

md fr-FR
resgen DateStrings.fr-FR.txt
al /out:fr-FR\Showdate.resources.dll /culture:fr-FR /embed:DateStrings.fr-FR.resources

md ru-RU
resgen DateStrings.ru-RU.txt
al /out:ru-RU\Showdate.resources.dll /culture:ru-RU /embed:DateStrings.ru-RU.resources

下面是示例的源代码(Visual Basic 版本ShowDate.vb或 C# 版本的ShowDate.cs)。

using System;
using System.Globalization;
using System.Resources;
using System.Threading;

public class Example2
{
    public static void Main()
    {
        Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("ru-RU");
        Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture("ru-RU");

        string[] cultureNames = [ "fr-FR", "sv-SE" ];
        ResourceManager rm = new ResourceManager("DateStrings",
                                                 typeof(Example).Assembly);

        foreach (var cultureName in cultureNames)
        {
            CultureInfo culture = CultureInfo.CreateSpecificCulture(cultureName);
            string dateString = rm.GetString("DateStart", culture);
            Console.WriteLine("{0}: {1} {2}.", culture.DisplayName, dateString,
                                               DateTime.Now.ToString("M", culture));
            Console.WriteLine();
        }
    }
}
// The example displays output similar to the following:
//       French (France): Aujourd'hui, c'est le 7 février.
//
//       Swedish (Sweden): Today is den 7 februari.
Imports System.Globalization
Imports System.Resources
Imports System.Threading

Module Example2
    Public Sub Main()
        Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("ru-RU")
        Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture("ru-RU")

        Dim cultureNames() As String = {"fr-FR", "sv-SE"}
        Dim rm As New ResourceManager("DateStrings",
                                    GetType(Example).Assembly)

        For Each cultureName In cultureNames
            Dim culture As CultureInfo = CultureInfo.CreateSpecificCulture(cultureName)
            Dim dateString As String = rm.GetString("DateStart", culture)
            Console.WriteLine("{0}: {1} {2}.", culture.DisplayName, dateString,
                                            Date.Now.ToString("M", culture))
            Console.WriteLine()
        Next
    End Sub
End Module
' The example displays output similar to the following:
'       French (France): Aujourd'hui, c'est le 7 février.
'       
'       Swedish (Sweden): Today is den 7 februari.