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) 返回字符串资源 name 的值,并根据调用方当前的 UI 文化设置进行了本地化。 文化列表派生自操作系统的首选 UI 语言列表。 如果资源管理器不匹配 name,该方法将 null返回。

示例:

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

文化 文件名 资源名称 资源值
zh-CN 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: {CultureInfo.CurrentUICulture.Name}");
         string dateString = rm.GetString("DateStart");
         Console.WriteLine($"{dateString} {DateTime.Now:M}.\n");
      }
   }
}
// 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)方法返回name字符串资源的值,该资源是根据culture参数指定的文化进行本地化的。 如果某个资源未针对 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

文化 文件名 资源名称 资源值
zh-CN 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# 中编译,请将vbc更改为csc,并将源代码文件的扩展名从.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($"{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.