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) 方法
桌面应用
在桌面应用中(如果是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)返回为参数指定的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# 中编译,请更改为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("{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.