本文提供了此 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) 方法
桌面应用
在桌面应用中,如果culture
是null
,则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.