Поделиться через


Класс System.Resources.NeutralResourcesLanguageAttribute

В этой статье приводятся дополнительные замечания к справочной документации по этому API.

В классических приложениях NeutralResourcesLanguageAttribute атрибут сообщает диспетчеру ресурсов язык и региональные параметры по умолчанию приложения и расположение его ресурсов. По умолчанию ресурсы внедрены в основную сборку приложения, и атрибут можно использовать следующим образом. Эта инструкция указывает, что английский (США) — это язык и региональные параметры по умолчанию приложения.

[assembly: NeutralResourcesLanguage("en-US")]
<Assembly:NeutralResourcesLanguage("en-US")>

Можно также использовать NeutralResourcesLanguageAttribute атрибут, чтобы указать, где ResourceManager можно найти ресурсы языка и региональных параметров по умолчанию, указав UltimateResourceFallbackLocation значение перечисления в инструкции атрибута. Это чаще всего делается, чтобы указать, что ресурсы находятся в вспомогательной сборке. Например, следующая инструкция указывает, что английский (США) — это язык по умолчанию или нейтральный язык и региональные параметры приложения, а его ресурсы находятся в вспомогательной сборке. Объект 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, ресурсы которых загружаются и извлекаются с помощью ResourceManager класса, NeutralResourcesLanguageAttribute атрибут определяет нейтральный язык и региональные параметры, ресурсы которых используются в случае неудачной пробы. Он не указывает расположение ресурсов. По умолчанию использует файл индекса ресурсов пакета приложения (PRI) для поиска ресурсов языка и региональных параметров по умолчанию ResourceManager . Нейтральный язык и региональные параметры, определенные 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 {0}",
                          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("{0} {1}!", 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