本文提供了此 API 参考文档的补充说明。
在桌面应用中,该 NeutralResourcesLanguageAttribute 属性将通知资源管理器应用的默认区域性及其资源的位置。 默认情况下,资源嵌入在主应用程序集中,可以使用如下所示的属性。 此语句指定英语(美国)是应用的默认语言文化。
[assembly: NeutralResourcesLanguage("en-US")]
<Assembly:NeutralResourcesLanguage("en-US")>
您还可以使用NeutralResourcesLanguageAttribute属性,通过在属性语句中提供UltimateResourceFallbackLocation枚举值,来指示ResourceManager可以在哪里找到默认文化的资源。 这通常是为了指示资源驻留在附属程序集。 例如,以下语句指定英语(美国)是应用的默认或非特定区域性,并且其资源驻留在附属程序集中。 该 ResourceManager 对象将在名为 en-US的子目录中查找它们。
[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)]
<Assembly:NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)>
小提示
我们建议您始终使用 NeutralResourcesLanguageAttribute 属性来定义您的应用程序的默认文化。
该属性执行两个角色:
如果默认区域性的资源嵌入在应用的主程序集中,并且 ResourceManager 必须检索与默认区域性属于同一区域性的资源,则 ResourceManager 会自动使用位于主程序集中的资源,而不是搜索附属程序集。 这样可绕过常用程序集探测,提高所加载的第一个资源的查找性能,并可缩小工作集。 请参阅 打包和部署资源 ,了解用于探测资源文件的过程 ResourceManager 。
如果默认文化的资源位于附属程序集而不是主应用程序集中,则 NeutralResourcesLanguageAttribute 属性将指定运行时环境从中加载资源的文化和目录。
Windows 8.x 应用商店应用
在 Windows 8.x Store 应用中,其资源是通过使用 ResourceManager 类加载和检索的,NeutralResourcesLanguageAttribute 属性定义了非特定区域性,其资源在探测失败时使用。 它不指定资源的位置。 默认情况下,ResourceManager 使用应用的包资源索引(PRI)文件查找默认文化的资源。 UI 语言列表的末尾将添加由属性NeutralResourcesLanguageAttribute定义的中性文化,以模拟此效果。
如果使用Windows 运行时 Windows.ApplicationModel.Resources.ResourceLoader 类或 Windows.ApplicationModel.Resources.Core 命名空间中的类型加载和检索资源,则 NeutralResourcesLanguageAttribute 忽略该属性。
例子
以下示例使用简单的“Hello World”应用来说明如何使用 NeutralResourcesLanguageAttribute 属性来定义默认或回退区域性。 它要求为英语(en)、英语(美国)(en-US)和法语(法国)(fr-FR)文化创建单独的资源文件。 下面显示了一个名为 ExampleResources.txt 的文本文件在英语区域性中的内容。
# Resources for the default (en) culture.
Greeting=Hello
若要在应用中使用资源文件,必须使用 资源文件生成器(Resgen.exe) 将文件从其文本(.txt)格式转换为二进制(.resources)格式,如下所示:
resgen ExampleResources.txt
编译应用后,二进制资源文件将嵌入主应用程序集中。
下面显示了一个名为 ExampleResources.en-US.txt 的文本文件的内容,该文件为英语(美国)文化提供资源。
# Resources for the en-US culture.
Greeting=Hi
可以在命令行中使用 资源文件生成器(ResGen.exe) 将文本文件转换为二进制资源文件,如下所示:
resgen ExampleResources.en-US.txt ExampleResources.en-US.resources
然后,应使用 程序集链接器(Al.exe) 编译二进制资源文件并将其放置在应用目录的 en-US 子目录中,然后发出以下命令:
al /t:lib /embed:ExampleResources.en-US.resources /culture:en-US /out:en-us\Example.resources.dll
下面显示了一个名为 ExampleResources.fr-FR.txt 的文本文件的内容,该文件为法语(法国)文化提供资源。
# Resources for the fr-FR culture.
Greeting=Bonjour
可以使用命令行中的 ResGen.exe 将文本文件转换为二进制资源文件,如下所示:
resgen ExampleResources.fr-FR.txt ExampleResources.fr-FR.resources
然后,应使用程序集链接器将二进制资源文件编译为程序集,并通过发出以下命令将文件放置在应用目录的 fr-FR 子目录中:
al /t:lib /embed:ExampleResources.fr-FR.resources /culture:fr-FR /out:fr-FR\Example.resources.dll
以下示例提供可执行代码,用于设置当前区域性、提示输入用户名并显示本地化字符串。
using System;
using System.Globalization;
using System.Reflection;
using System.Resources;
using System.Threading;
[assembly: NeutralResourcesLanguageAttribute("en")]
public class Example
{
public static void Main()
{
// Select the current culture randomly to test resource fallback.
string[] cultures = { "de-DE", "en-us", "fr-FR" };
Random rnd = new Random();
int index = rnd.Next(0, cultures.Length);
Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(cultures[index]);
Console.WriteLine($"The current culture is {CultureInfo.CurrentUICulture.Name}");
// Retrieve the resource.
ResourceManager rm = new ResourceManager("ExampleResources",
typeof(Example).Assembly);
string greeting = rm.GetString("Greeting");
Console.Write("Enter your name: ");
string name = Console.ReadLine();
Console.WriteLine($"{greeting} {name}!");
}
}
Imports System.Globalization
Imports System.Resources
Imports System.Threading
<Assembly:NeutralResourcesLanguageAttribute("en")>
Module Example
Public Sub Main()
' Select the current culture randomly to test resource fallback.
Dim cultures() As String = { "de-DE", "en-us", "fr-FR" }
Dim rnd As New Random()
Dim index As Integer = rnd.Next(0, cultures.Length)
Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(cultures(index))
Console.WriteLine("The current culture is {0}",
CultureInfo.CurrentUICulture.Name)
' Retrieve the resource.
Dim rm As New ResourceManager("ExampleResources" , GetType(Example).Assembly)
Dim greeting As String = rm.GetString("Greeting")
Console.Write("Enter your name: ")
Dim name As String = Console.ReadLine()
Console.WriteLine("{0} {1}", greeting, name)
End Sub
End Module
可以在 Visual Basic 中使用以下命令编译它:
vbc Example.vb /resource:ExampleResources.resources
或在 C# 中使用以下命令:
csc Example.cs /resource:ExampleResources.resources