ResourceManager Класс

Определение

Представляет диспетчер ресурсов, обеспечивающий удобный доступ к ресурсам, связанным с языком и региональными параметрами, во время выполнения.

public ref class ResourceManager
public class ResourceManager
[System.Serializable]
public class ResourceManager
[System.Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
public class ResourceManager
type ResourceManager = class
[<System.Serializable>]
type ResourceManager = class
[<System.Serializable>]
[<System.Runtime.InteropServices.ComVisible(true)>]
type ResourceManager = class
Public Class ResourceManager
Наследование
ResourceManager
Производный
Атрибуты

Примеры

В следующем примере показано, как использовать явный язык и региональные параметры и региональные параметры текущего пользовательского интерфейса для получения строковых ресурсов из основной сборки и вспомогательной сборки. Дополнительные сведения см. в разделе "Расположения каталогов для вспомогательных сборок, не установленных в глобальном кэше сборок" раздела "Создание вспомогательных сборок ".

Чтобы выполнить этот пример, выполните следующую команду:

  1. В каталоге приложения создайте файл с именем rmc.txt, содержащий следующие строки ресурсов:

    day=Friday
    year=2006
    holiday="Cinco de Mayo"
    
  2. Используйте генератор файлов ресурсов для создания файла ресурсов rmc.resources из входного файла rmc.txt следующим образом:

    resgen rmc.txt
    
  3. Создайте подкаталог каталога приложения и назовите его "es-MX". Это имя языка и региональных параметров вспомогательной сборки, которую вы создадите на следующих трех шагах.

  4. Создайте файл с именем rmc.es-MX.txt в каталоге es-MX, который содержит следующие строки ресурсов:

    day=Viernes
    year=2006
    holiday="Cinco de Mayo"
    
  5. Используйте генератор файлов ресурсов для создания файла ресурсов rmc.es-MX.resources из входного файла rmc.es-MX.txt следующим образом:

    resgen rmc.es-MX.txt
    
  6. Предположим, что имя файла для этого примера — rmc.vb или rmc.cs. Скопируйте следующий исходный код в файл. Затем скомпилируйте его и вставьте файл ресурсов основной сборки rmc.resources в исполняемую сборку. Если вы используете компилятор Visual Basic, используется следующий синтаксис:

    vbc rmc.vb /resource:rmc.resources
    

    Соответствующий синтаксис для компилятора C#:

    csc /resource:rmc.resources rmc.cs
    
  7. Используйте компоновщик сборок для создания вспомогательной сборки. Если базовое имя приложения — rmc, имя вспомогательной сборки должно быть rmc.resources.dll. В каталоге es-MX должна быть создана вспомогательная сборка. Если es-MX является текущим каталогом, используйте следующую команду:

    al /embed:rmc.es-MX.resources /c:es-MX /out:rmc.resources.dll
    
  8. Запустите rmc.exe, чтобы получить и отобразить строки внедренных ресурсов.

using System;
using System.Resources;
using System.Reflection;
using System.Threading;
using System.Globalization;

class Example
{
    public static void Main()
    {
    string day;
    string year;
    string holiday;
    string celebrate = "{0} will occur on {1} in {2}.\n";

    // Create a resource manager.
    ResourceManager rm = new ResourceManager("rmc",
                             typeof(Example).Assembly);

    Console.WriteLine("Obtain resources using the current UI culture.");

    // Get the resource strings for the day, year, and holiday
    // using the current UI culture.
    day  = rm.GetString("day");
    year = rm.GetString("year");
    holiday = rm.GetString("holiday");
    Console.WriteLine(celebrate, holiday, day, year);

    // Obtain the es-MX culture.
    CultureInfo ci = new CultureInfo("es-MX");

    Console.WriteLine("Obtain resources using the es-MX culture.");

   // Get the resource strings for the day, year, and holiday
   // using the specified culture.
    day  = rm.GetString("day", ci);
    year = rm.GetString("year", ci);
    holiday = rm.GetString("holiday", ci);
// ---------------------------------------------------------------
// Alternatively, comment the preceding 3 code statements and
// uncomment the following 4 code statements:
// ----------------------------------------------------------------
// Set the current UI culture to "es-MX" (Spanish-Mexico).
//    Thread.CurrentThread.CurrentUICulture = ci;

// Get the resource strings for the day, year, and holiday
// using the current UI culture. Use those strings to
// display a message.
//    day  = rm.GetString("day");
//    year = rm.GetString("year");
//    holiday = rm.GetString("holiday");
// ---------------------------------------------------------------

// Regardless of the alternative that you choose, display a message
// using the retrieved resource strings.
    Console.WriteLine(celebrate, holiday, day, year);
    }
}
/*
This example displays the following output:

   Obtain resources using the current UI culture.
   "5th of May" will occur on Friday in 2006.

   Obtain resources using the es-MX culture.
   "Cinco de Mayo" will occur on Viernes in 2006.
*/
Imports System.Resources
Imports System.Reflection
Imports System.Threading
Imports System.Globalization

Class Example
    Public Shared Sub Main() 
        Dim day As String
        Dim year As String
        Dim holiday As String
        Dim celebrate As String = "{0} will occur on {1} in {2}." & vbCrLf

        ' Create a resource manager. 
        Dim rm As New ResourceManager("rmc", GetType(Example).Assembly)

        Console.WriteLine("Obtain resources using the current UI culture.")

        ' Get the resource strings for the day, year, and holiday 
        ' using the current UI culture. 
        day = rm.GetString("day")
        year = rm.GetString("year")
        holiday = rm.GetString("holiday")
        Console.WriteLine(celebrate, holiday, day, year)

        ' Obtain the es-MX culture.
        Dim ci As New CultureInfo("es-MX")

        Console.WriteLine("Obtain resources using the es-MX culture.")

        ' Get the resource strings for the day, year, and holiday 
        ' using the es-MX culture.  
        day = rm.GetString("day", ci)
        year = rm.GetString("year", ci)
        holiday = rm.GetString("holiday", ci)

        ' ---------------------------------------------------------------
        ' Alternatively, comment the preceding 3 code statements and 
        ' uncomment the following 4 code statements:
        ' ----------------------------------------------------------------
        ' Set the current UI culture to "es-MX" (Spanish-Mexico).
        '    Thread.CurrentThread.CurrentUICulture = ci
        ' Get the resource strings for the day, year, and holiday 
        ' using the current UI culture. 
        '    day  = rm.GetString("day")
        '    year = rm.GetString("year")
        '    holiday = rm.GetString("holiday")
        ' ---------------------------------------------------------------

        ' Regardless of the alternative that you choose, display a message 
        ' using the retrieved resource strings.
        Console.WriteLine(celebrate, holiday, day, year)
    End Sub 
End Class
' This example displays the following output:
'Obtain resources using the current UI culture.
'"5th of May" will occur on Friday in 2006.
'
'Obtain resources using the es-MX culture.
'"Cinco de Mayo" will occur on Viernes in 2006.

Комментарии

Важно!

Вызов методов этого класса для ненадежных данных представляет угрозу безопасности. Вызывайте методы класса только для надежных данных. Дополнительные сведения: Data Validation (Проверка данных).

Класс ResourceManager извлекает ресурсы из двоичного ФАЙЛА RESOURCES, внедренного в сборку или из автономного ФАЙЛА RESOURCES. Если приложение было локализовано и локализовано в вспомогательных сборках, оно ищет ресурсы, зависящие от языка и региональных параметров, предоставляет резервный вариант ресурсов, если локализованный ресурс не существует, и поддерживает сериализацию ресурсов.

Дополнительные сведения о создании ресурсов и управлении ими в классических приложениях и приложениях Windows 8.x см. в следующих разделах:

Классические приложения

Для классических приложений ResourceManager класс извлекает ресурсы из двоичных файлов ресурсов (RESOURCES). Как правило, компилятор языка или компоновщик сборок (AL.exe) внедряет эти файлы ресурсов в сборку. Можно также использовать ResourceManager объект для извлечения ресурсов непосредственно из RESOURCES-файла, который не внедрен в сборку CreateFileBasedResourceManager , путем вызова метода.

Внимание!

Использование автономных файлов РЕСУРСОВ в приложении ASP.NET приведет к прерыванию развертывания XCOPY, так как ресурсы остаются заблокированными до тех пор, пока они не будут явно освобождены методом ReleaseAllResources . Если вы хотите развернуть ресурсы с помощью приложений ASP.NET, необходимо скомпилировать ФАЙЛЫ РЕСУРСОВ в вспомогательные сборки.

В приложении на основе ресурсов один RESOURCES-файл содержит ресурсы языка и региональных параметров по умолчанию, ресурсы которых используются, если ресурсы, относящиеся к языку и региональным параметрам, не найдены. Например, если язык и региональные параметры приложения по умолчанию — английский (en), ресурсы английского языка используются, когда не удается найти локализованные ресурсы для определенного языка и региональных параметров, таких как английский (США) (en-US) или французский (Франция) (fr-FR). Как правило, ресурсы для языка и региональных параметров по умолчанию внедряются в основную сборку приложения, а ресурсы для других локализованных языков и региональных параметров внедряются в вспомогательные сборки. Вспомогательные сборки содержат только ресурсы. Они имеют то же имя корневого файла, что и основная сборка и расширение .resources.dll. Для приложений, сборки которых не зарегистрированы в глобальном кэше сборок, вспомогательные сборки хранятся в подкаталоге приложения, имя которого соответствует языку и региональным параметрам сборки.

Создание ресурсов

При разработке приложения на основе ресурсов вы сохраняете сведения о ресурсах в текстовых файлах (файлы с расширением .txt или RESTEXT) или XML-файлы (файлы с расширением RESX). Затем вы компилируете текстовые или XML-файлы с помощью генератора файлов ресурсов (Resgen.exe), чтобы создать двоичный ФАЙЛ RESOURCES. Затем можно внедрить полученный ФАЙЛ RESOURCES в исполняемый файл или библиотеку с помощью параметра компилятора, например /resources для C# и Visual Basic компиляторов, или внедрить его в вспомогательную сборку с помощью компоновщика сборок (AI.exe). Если в проект Visual Studio включен RESX-файл, Visual Studio обрабатывает компиляцию и внедрение ресурсов по умолчанию и локализованных ресурсов автоматически в процессе сборки.

В идеале следует создавать ресурсы для каждого языка, который поддерживает приложение, или хотя бы для значимого подмножества каждого языка. Имена двоичных ФАЙЛОВ RESOURCES соответствуют базовому имени соглашения об именовании. cultureName.resources, где basename — это имя приложения или имя класса в зависимости от нужного уровня детализации. Свойство CultureInfo.Name используется для определения языка и региональных параметров. Ресурс для языка и региональных параметров по умолчанию приложения должен называться basename.resources.

Предположим, что сборка содержит несколько ресурсов в файле ресурсов с базовым именем MyResources. Эти файлы ресурсов должны иметь такие имена, как MyResources.ja-JP.resources для японского языка и региональных параметров, MyResources.de.resources для немецкого языка и региональных параметров, MyResources.zh-CHS.resources для упрощенного китайского языка и региональных параметров MyResources.fr-BE.resources для французского языка (Бельгия). Файл ресурсов по умолчанию должен называться MyResources.resources. Файлы ресурсов, зависящие от языка и региональных параметров, обычно упаковываются в вспомогательные сборки для каждого языка и региональных параметров. Файл ресурсов по умолчанию должен быть внедрен в основную сборку приложения.

Обратите внимание, что компоновщик сборок позволяет ресурсам помечаться как закрытые, но их всегда следует пометить как общедоступные, чтобы к ним можно было получить доступ к другим сборкам. (Так как в вспомогательной сборке нет кода, ресурсы, помеченные как частные, недоступны для вашего приложения с помощью любого механизма.)

Дополнительные сведения о создании, упаковке и развертывании ресурсов см. в статьях о создании файлов ресурсов, создании вспомогательных сборок, упаковке и развертывании ресурсов.

Создание экземпляра объекта ResourceManager

Создайте экземпляр ResourceManager объекта, который извлекает ресурсы из внедренного RESOURCES-файла, вызвав одну из перегрузок конструктора класса. Это тесно связывает объект с определенным ФАЙЛом ResourceManager RESOURCES и любыми связанными локализованными ФАЙЛАми РЕСУРСОВ в вспомогательных сборках.

Два наиболее часто называемых конструктора:

  • ResourceManager(String, Assembly) выполняет поиск ресурсов на основе двух указанных сведений: базового имени ФАЙЛА RESOURCES и сборки, в которой находится ФАЙЛ РЕСУРСОВ по умолчанию. Базовое имя включает пространство имен и корневое имя ФАЙЛА RESOURCES без языка и региональных параметров или расширения. Обратите внимание, что файлы RESOURCES, скомпилированные из командной строки, обычно не содержат имя пространства имен, тогда как файлы resources, созданные в среде Visual Studio. Например, если файл ресурсов называется MyCompany.StringResources.resources, а ResourceManager конструктор вызывается из статического метода с именем Example.Main, следующий код создает ResourceManager экземпляр объекта, который может получить ресурсы из ФАЙЛА RESOURCES:

    ResourceManager rm = new ResourceManager("MyCompany.StringResources",
                                             typeof(Example).Assembly);
    
    Dim rm As New ResourceManager("MyCompany.StringResources",
                                  GetType(Example).Assembly)
    
  • ResourceManager(Type) ищет ресурсы в вспомогательных сборках на основе сведений из объекта типа. Полное имя типа соответствует базовому имени ФАЙЛА RESOURCES без расширения имени файла. В классических приложениях, созданных с помощью конструктора ресурсов Visual Studio, Visual Studio создает класс-оболочку, полное имя которого совпадает с корневым именем файла RESOURCES. Например, если файл ресурсов называется MyCompany.StringResources.resources и существует класс-оболочка с именем MyCompany.StringResources, следующий код создает экземпляр ResourceManager объекта, который может извлекать ресурсы из файла resources:

    ResourceManager rm = new ResourceManager(typeof(MyCompany.StringResources));
    
    Dim rm As New ResourceManager(GetType(MyCompany.StringResources))
    

Если соответствующие ресурсы не найдены, вызов конструктора создает допустимый ResourceManager объект. Однако при попытке получить ресурс возникает MissingManifestResourceException исключение. Сведения о работе с исключением см. в разделе "Обработка missingManifestResourceException и MissingSatelliteAssembly Exceptions " далее в этой статье.

В следующем примере показано, как создать экземпляр ResourceManager объекта. Он содержит исходный код для исполняемого файла с именем ShowTime.exe. Он также содержит следующий текстовый файл с именем Strings.txt, который содержит один строковый ресурс: TimeHeader

TimeHeader=The current time is

Пакетный файл можно использовать для создания файла ресурсов и его внедрения в исполняемый файл. Ниже приведен пакетный файл для создания исполняемого файла с помощью компилятора C#:

resgen strings.txt
csc ShowTime.cs /resource:strings.resources

Для компилятора Visual Basic можно использовать следующий пакетный файл:

resgen strings.txt
vbc ShowTime.vb /resource:strings.resources
using System;
using System.Resources;

public class Example
{
   public static void Main()
   {
      ResourceManager rm = new ResourceManager("Strings", 
                               typeof(Example).Assembly);
      string timeString = rm.GetString("TimeHeader");
      Console.WriteLine("{0} {1:T}", timeString, DateTime.Now);   
   }
}
// The example displays output like the following:
//        The current time is 2:03:14 PM
Imports System.Resources

Module Example
   Public Sub Main()
      Dim rm As New ResourceManager("Strings", GetType(Example).Assembly)
      Dim timeString As String = rm.GetString("TimeHeader")
      Console.WriteLine("{0} {1:T}", timeString, Date.Now)   
   End Sub
End Module
' The example displays output similar to the following:
'       The current time is 2:03:14 PM

Ресурсы ResourceManager и Culture-Specific

Локализованное приложение требует развертывания ресурсов, как описано в статье "Упаковка и развертывание ресурсов". Если сборки настроены правильно, диспетчер ресурсов определяет, какие ресурсы следует извлечь на основе свойства текущего Thread.CurrentUICulture потока. (Это свойство также возвращает язык и региональные параметры пользовательского интерфейса текущего потока.) Например, если приложение компилируется с ресурсами английского языка по умолчанию в основной сборке и с ресурсами французского и русского языка в двух вспомогательных сборках, а Thread.CurrentUICulture свойство имеет значение fr-FR, диспетчер ресурсов извлекает французские ресурсы.

Свойство можно задать CurrentUICulture явно или неявно. Способ его задания определяет, как ResourceManager объект получает ресурсы на основе языка и региональных параметров:

  • Если явно задать Thread.CurrentUICulture для свойства определенный язык и региональные параметры, диспетчер ресурсов всегда получает ресурсы для этого языка и региональных параметров независимо от браузера пользователя или языка операционной системы. Рассмотрим приложение, скомпилированное с ресурсами английского языка по умолчанию и тремя вспомогательными сборками, содержащими ресурсы для английского языка (США), французского (Франция) и русского (Россия). CurrentUICulture Если для свойства задано значение fr-FR, ResourceManager объект всегда получает ресурсы французского языка (Франция), даже если язык операционной системы пользователя не является французским. Перед явной настройкой свойства убедитесь, что это необходимое поведение.

    В ASP.NET приложениях необходимо явно задать Thread.CurrentUICulture свойство, так как маловероятно, что параметр на сервере будет соответствовать входящим клиентским запросам. Приложение ASP.NET может явно задать Thread.CurrentUICulture для свойства язык принятия браузера пользователя.

    Явное задание свойства определяет текущий язык и региональные Thread.CurrentUICulture параметры пользовательского интерфейса для этого потока. Он не влияет на текущий язык и региональные параметры пользовательского интерфейса других потоков в приложении.

  • Вы можете задать язык и региональные параметры пользовательского интерфейса всех потоков в домене приложения, назначив CultureInfo объект, представляющий этот язык и региональные параметры статического CultureInfo.DefaultThreadCurrentUICulture свойства.

  • Если вы не задали явно текущий язык и региональные параметры пользовательского интерфейса и не определяете язык и региональные параметры по умолчанию для текущего домена приложения, CultureInfo.CurrentUICulture свойство задается неявно функцией WindowsGetUserDefaultUILanguage. Эта функция предоставляется многоязычный пользовательский интерфейс (MUI), что позволяет пользователю задать язык по умолчанию. Если язык пользовательского интерфейса не задан пользователем, по умолчанию используется язык, установленный системой, который является языком ресурсов операционной системы.

Следующий простой пример "Hello world" явно задает текущий язык и региональные параметры пользовательского интерфейса. Он содержит ресурсы для трех языков и региональных параметров: английский (США) или en-US, французский (Франция) или fr-FR, русский (Россия) или ru-RU. Ресурсы en-US содержатся в текстовом файле с именем Greetings.txt:

HelloString=Hello world!

Ресурсы fr-FR содержатся в текстовом файле с именем Greetings.fr-FR.txt:

HelloString=Salut tout le monde!

Ресурсы ru-RU содержатся в текстовом файле с именем Greetings.ru-RU.txt:

HelloString=Всем привет!

Ниже приведен исходный код для примера (Example.vb для версии Visual Basic или Example.cs для версии C#):

using System;
using System.Globalization;
using System.Resources;
using System.Threading;

public class Example
{
   public static void Main()
   {
      // Create array of supported cultures
      string[] cultures = {"en-CA", "en-US", "fr-FR", "ru-RU" };
      Random rnd = new Random();
      int cultureNdx = rnd.Next(0, cultures.Length);
      CultureInfo originalCulture = Thread.CurrentThread.CurrentCulture;
      ResourceManager rm = new ResourceManager("Greetings", typeof(Example).Assembly);
      try {
         CultureInfo newCulture = new CultureInfo(cultures[cultureNdx]);
         Thread.CurrentThread.CurrentCulture = newCulture;
         Thread.CurrentThread.CurrentUICulture = newCulture;
         string greeting = String.Format("The current culture is {0}.\n{1}",
                                         Thread.CurrentThread.CurrentUICulture.Name,
                                         rm.GetString("HelloString"));
         Console.WriteLine(greeting);
      }
      catch (CultureNotFoundException e) {
         Console.WriteLine("Unable to instantiate culture {0}", e.InvalidCultureName);
      }
      finally {
         Thread.CurrentThread.CurrentCulture = originalCulture;
         Thread.CurrentThread.CurrentUICulture = originalCulture;
      }
   }
}
// The example displays output like the following:
//       The current culture is ru-RU.
//       Всем привет!
Imports System.Globalization
Imports System.Resources
Imports System.Threading

Module Example
   Sub Main()
      ' Create array of supported cultures
      Dim cultures() As String = {"en-CA", "en-US", "fr-FR", "ru-RU" }
      Dim rnd As New Random()
      Dim cultureNdx As Integer = rnd.Next(0, cultures.Length)
      Dim originalCulture As CultureInfo = Thread.CurrentThread.CurrentCulture
      Dim rm As New ResourceManager("Greetings", GetType(Example).Assembly)
      Try
         Dim newCulture As New CultureInfo(cultures(cultureNdx))
         Thread.CurrentThread.CurrentCulture = newCulture
         Thread.CurrentThread.CurrentUICulture = newCulture
         Dim greeting As String = String.Format("The current culture is {0}.{1}{2}",
                                                Thread.CurrentThread.CurrentUICulture.Name,
                                                vbCrLf, rm.GetString("HelloString"))

         Console.WriteLine(greeting)
      Catch e As CultureNotFoundException
         Console.WriteLine("Unable to instantiate culture {0}", e.InvalidCultureName)
      Finally
         Thread.CurrentThread.CurrentCulture = originalCulture
         Thread.CurrentThread.CurrentUICulture = originalCulture
      End Try
   End Sub
End Module
' The example displays output like the following:
'       The current culture is ru-RU.
'       Всем привет!

Чтобы скомпилировать этот пример, создайте пакетный файл (.bat), содержащий следующие команды, и запустите его из командной строки. Если вы используете C#, укажите csc вместо vbc него Example.cs Example.vb.

resgen Greetings.txt
vbc Example.vb /resource:Greetings.resources

resgen Greetings.fr-FR.txt
Md fr-FR
al /embed:Greetings.fr-FR.resources /culture:fr-FR /out:fr-FR\Example.resources.dll

resgen Greetings.ru-RU.txt
Md ru-RU
al /embed:Greetings.ru-RU.resources /culture:ru-RU /out:ru-RU\Example.resources.dll

Извлечение ресурсов

Вы вызываете GetObject(String) методы и GetString(String) методы для доступа к определенному ресурсу. Можно также вызвать GetStream(String) метод для извлечения нестроковых ресурсов в виде массива байтов. По умолчанию в приложении с локализованными ресурсами эти методы возвращают ресурс для языка и региональных параметров, определяемых текущим языком и региональными параметрами пользовательского интерфейса потока, который сделал вызов. Дополнительные сведения о том, как определяется текущий язык и региональные параметры пользовательского интерфейса потока, см. в предыдущем разделе ResourceManager и Culture-Specific Resources. Если диспетчер ресурсов не может найти ресурс для языка и региональных параметров пользовательского интерфейса текущего потока, он использует резервный процесс для получения указанного ресурса. Если диспетчер ресурсов не может найти локализованные ресурсы, он использует ресурсы языка и региональных параметров по умолчанию. Дополнительные сведения о правилах резервного копирования ресурсов см. в разделе "Процесс резервного копирования ресурсов" статьи "Упаковка и развертывание ресурсов".

Примечание

Если не удается найти файл RESOURCES, указанный в конструкторе ResourceManager класса, попытка получить ресурс создает MissingManifestResourceException исключение или MissingSatelliteAssemblyException исключение. Сведения о работе с исключением см. в разделе "Обработка missingManifestResourceException и MissingSatelliteAssemblyException Exceptions " далее в этом разделе.

В следующем примере используется метод для получения ресурсов, относящихся к языку и региональным параметрам GetString . Он состоит из ресурсов, скомпилированных из .txt файлов для английского языка (en), французского языка (Франция) (fr-FR) и русского (Россия) (ru-RU). В этом примере изменяется текущий язык и региональные параметры пользовательского интерфейса на английский (США), французский (Франция), русский (Россия) и шведский (Швеция). Затем он вызывает GetString метод для получения локализованной строки, которая отображается вместе с текущим днем и месяцем. Обратите внимание, что в выходных данных отображается соответствующая локализованная строка, за исключением случаев, когда текущий язык и региональные параметры пользовательского интерфейса — шведский (Швеция). Так как шведские языковые ресурсы недоступны, приложение использует ресурсы языка и региональных параметров по умолчанию, который является английским.

В этом примере требуются текстовые файлы ресурсов, перечисленные в следующей таблице. Каждый из них имеет один строковый ресурс с именем DateStart.

culture Имя файла Имя ресурса Значение ресурса
en-US DateStrings.txt DateStart Сегодня
fr-FR DateStrings.fr-FR.txt DateStart Aujourd'hui, c'est le
ru-RU DateStrings.ru-RU.txt DateStart Сегодня

Ниже приведен исходный код для примера (ShowDate.vb для версии Visual Basic или ShowDate.cs для версии C# кода).

using System;
using System.Globalization;
using System.Resources;
using System.Threading;

[assembly:NeutralResourcesLanguage("en")]

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.

Чтобы скомпилировать этот пример, создайте пакетный файл, содержащий следующие команды, и запустите его из командной строки. Если вы используете C#, укажите csc вместо vbc него showdate.cs showdate.vb.

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

Существует два способа получения ресурсов определенного языка и региональных параметров, отличных от текущего языка и региональных параметров пользовательского интерфейса:

  • Вы можете вызвать GetString(String, CultureInfo)GetObject(String, CultureInfo)метод или GetStream(String, CultureInfo) метод, чтобы получить ресурс для определенного языка и региональных параметров. Если не удается найти локализованный ресурс, диспетчер ресурсов использует резервный процесс для поиска соответствующего ресурса.

  • Метод можно вызвать GetResourceSet для получения ResourceSet объекта, представляющего ресурсы для определенного языка и региональных параметров. В вызове метода можно определить, выполняется ли проверка диспетчера ресурсов для родительских языков и региональных параметров, если она не может найти локализованные ресурсы или просто возвращается к ресурсам языка и региональных параметров по умолчанию. Затем можно использовать ResourceSet методы для доступа к ресурсам (локализованным для этого языка и региональных параметров) по имени или перечислению ресурсов в наборе.

Обработка исключений MissingManifestResourceException и MissingSatelliteAssemblyException

Если вы пытаетесь получить определенный ресурс, но диспетчер ресурсов не может найти этот ресурс и не определен ни один язык и региональные параметры по умолчанию, либо ресурсы языка и региональных параметров по умолчанию не могут быть расположены, диспетчер ресурсов создает MissingManifestResourceException исключение, если он ожидает найти ресурсы в основной сборке или MissingSatelliteAssemblyException если он ожидает найти ресурсы в вспомогательной сборке. Обратите внимание, что исключение возникает при вызове метода извлечения ресурсов, например GetString или , GetObjectа не при создании экземпляра ResourceManager объекта.

Исключение обычно возникает при следующих условиях:

  • Не существует соответствующего файла ресурсов или вспомогательной сборки. Если диспетчер ресурсов ожидает, что ресурсы приложения по умолчанию будут внедрены в основную сборку приложения, они отсутствуют. NeutralResourcesLanguageAttribute Если атрибут указывает, что ресурсы приложения по умолчанию находятся в вспомогательной сборке, эта сборка не найдена. При компиляции приложения убедитесь, что ресурсы внедрены в основную сборку или что необходимая вспомогательная сборка создается и называется соответствующим образом. Его имя должно принимать форму appName.resources.dll, и она должна находиться в каталоге с именем языка и региональных параметров, ресурсы которых он содержит.

  • Приложение не имеет определенного по умолчанию или нейтрального языка и региональных параметров. Добавьте атрибут в NeutralResourcesLanguageAttribute файл исходного кода или в файл сведений о проекте (AssemblyInfo.vb для приложения Visual Basic или AssemblyInfo.cs для файла C# приложения).

  • Параметр baseName в конструкторе ResourceManager(String, Assembly) не указывает имя RESOURCES-файла. Имя должно содержать полное пространство имен файла ресурсов, но не его расширение имени файла. Как правило, файлы ресурсов, созданные в Visual Studio включают имена пространств имен, но файлы ресурсов, созданные и скомпилированные в командной строке, не выполняются. Вы можете определить имена внедренных ФАЙЛОВ РЕСУРСОВ, скомпилируя и запуская следующую служебную программу. Это консольное приложение, которое принимает имя основной сборки или вспомогательной сборки в качестве параметра командной строки. В нем отображаются строки, которые должны быть предоставлены в качестве baseName параметра, чтобы диспетчер ресурсов смог правильно определить ресурс.

    using System;
    using System.IO;
    using System.Reflection;
    using System.Resources;
    
    public class Example
    {
       public static void Main()
       {
          if (Environment.GetCommandLineArgs().Length == 1) { 
             Console.WriteLine("No filename.");
             return;
          }
          
          string filename = Environment.GetCommandLineArgs()[1].Trim();
          // Check whether the file exists.
          if (! File.Exists(filename)) {
             Console.WriteLine("{0} does not exist.", filename);
             return;
          }   
          
          // Try to load the assembly.
          Assembly assem = Assembly.LoadFrom(filename);
          Console.WriteLine("File: {0}", filename);
             
          // Enumerate the resource files.
          string[] resNames = assem.GetManifestResourceNames();
          if (resNames.Length == 0)
             Console.WriteLine("   No resources found.");
    
          foreach (var resName in resNames)
             Console.WriteLine("   Resource: {0}", resName.Replace(".resources", ""));
    
          Console.WriteLine();
       }
    }
    
    Imports System.IO
    Imports System.Reflection
    Imports System.Resources
    
    Module Example
       Public Sub Main()
          If Environment.GetCommandLineArgs.Length = 1 Then 
             Console.WriteLine("No filename.")
             Exit Sub
          End If
          Dim filename As String = Environment.GetCommandLineArgs(1).Trim()
          ' Check whether the file exists.
          If Not File.Exists(filename) Then
             Console.WriteLine("{0} does not exist.", filename)
             Exit Sub
          End If   
          
          ' Try to load the assembly.
          Dim assem As Assembly = Assembly.LoadFrom(filename)
          Console.WriteLine("File: {0}", filename)
             
          ' Enumerate the resource files.
          Dim resNames() As String = assem.GetManifestResourceNames()
          If resNames.Length = 0 Then
             Console.WriteLine("   No resources found.")
          End If
          For Each resName In resNames
             Console.WriteLine("   Resource: {0}", resName.Replace(".resources", ""))
          Next
          Console.WriteLine()
       End Sub
    End Module
    

При явном изменении текущего языка и региональных параметров приложения следует помнить, что диспетчер ресурсов получает набор ресурсов на основе значения CultureInfo.CurrentUICulture свойства, а не CultureInfo.CurrentCulture свойства. Как правило, при изменении одного значения следует также изменить другое.

Управление версиями ресурсов

Так как основная сборка, содержащая ресурсы приложения по умолчанию, отделена от вспомогательных сборок приложения, вы можете освободить новую версию основной сборки без повторного развертывания вспомогательных сборок. Атрибут используется SatelliteContractVersionAttribute для использования существующих вспомогательных сборок и предписывает диспетчеру ресурсов не повторно развертывать их с новой версией основной сборки.

Дополнительные сведения о поддержке управления версиями вспомогательных сборок см. в статье "Извлечение ресурсов".

<satelliteassemblies> Узел файла конфигурации

Примечание

Этот раздел предназначен для платформа .NET Framework приложений.

Для исполняемых файлов, развернутых и запускаемых с веб-сайта (HREF .exe файлов), ResourceManager объект может проверить наличие вспомогательных сборок через Интернет, что может повредить производительность приложения. Чтобы устранить проблему с производительностью, вы можете ограничить это пробу на вспомогательные сборки, развернутые вместе с приложением. Для этого необходимо создать <satelliteassemblies> узел в файле конфигурации приложения, чтобы указать, что развернут определенный набор региональных параметров для приложения, и что ResourceManager объект не должен пытаться проверить язык и региональные параметры, не перечисленные в этом узле.

Примечание

Предпочтительным вариантом <satelliteassemblies> создания узла является использование функции манифеста развертывания ClickOnce.

В файле конфигурации приложения создайте раздел, аналогичный следующему:

<?xml version ="1.0"?>
<configuration>
  <satelliteassemblies>
    <assembly name="MainAssemblyName, Version=versionNumber, Culture=neutral, PublicKeyToken=null|yourPublicKeyToken">
      <culture>cultureName1</culture>
      <culture>cultureName2</culture>
      <culture>cultureName3</culture>
    </assembly>
  </satelliteassemblies>
</configuration>

Измените эти сведения о конфигурации следующим образом:

  • Укажите один или несколько <assembly> узлов для каждой развертываемой основной сборки, где каждый узел задает полное имя сборки. Укажите имя основной сборки вместо MainAssemblyName и укажите Version``PublicKeyToken``Culture значения атрибутов, соответствующие основной сборке.

    Для атрибута Version укажите номер версии сборки. Например, первый выпуск сборки может быть номером версии 1.0.0.0.

    Для атрибута PublicKeyToken укажите ключевое слово null , если сборка не подписана строгим именем или укажите маркер открытого ключа, если вы подписали сборку.

    Для атрибута Culture укажите ключевое слово neutral для назначения основной сборки и вызовите ResourceManager проверку класса только для языков и региональных параметров, перечисленных в <culture> узлах.

    Дополнительные сведения о полных именах сборок см. в статье "Имена сборок". Дополнительные сведения о сборках со строгими именами см. в статье "Создание и использование сборок со строгими именами".

  • Укажите один или <culture> несколько узлов с определенным именем языка и региональных параметров, например fr-FR, или нейтральным именем языка и региональных параметров, например fr.

Если ресурсы необходимы для любой сборки, не указанной в <satelliteassemblies> узле, ResourceManager класс проверяет язык и региональные параметры с помощью стандартных правил проверки.

приложения Windows 8.x

Важно!

ResourceManager Хотя класс поддерживается в приложениях Windows 8.x, мы не рекомендуем использовать его. Используйте этот класс только при разработке проектов переносимой библиотеки классов, которые можно использовать с приложениями Windows 8.x. Чтобы получить ресурсы из приложений Windows 8.x, используйте Windows. Вместо этого класс ApplicationModel.Resources.ResourceLoader.

Для приложений ResourceManager Windows 8.x класс извлекает ресурсы из файлов индекса ресурсов пакета (PRI). Один файл PRI (PRI-файл пакета приложения) содержит ресурсы для языка и региональных параметров по умолчанию и всех локализованных языков и региональных параметров. С помощью служебной программы MakePRI можно создать файл PRI из одного или нескольких файлов ресурсов, которые находятся в формате XML-ресурса (RESW). Для ресурсов, включенных в проект Visual Studio, Visual Studio обрабатывает процесс создания и упаковки PRI-файла автоматически. Затем можно использовать класс платформа .NET Framework ResourceManager для доступа к ресурсам приложения или библиотеки.

Вы можете создать экземпляр ResourceManager объекта для приложения Windows 8.x так же, как и для классического приложения.

Затем можно получить доступ к ресурсам для определенного языка и региональных параметров, передав имя ресурса, который будет извлечен в GetString(String) метод. По умолчанию этот метод возвращает ресурс для языка и региональных параметров, определенных текущим языком и региональными параметрами пользовательского интерфейса потока, который сделал вызов. Вы также можете получить ресурсы для определенного языка и региональных параметров, передав имя ресурса и объект, представляющий язык и CultureInfo региональные параметры, ресурс которых требуется извлечь в GetString(String, CultureInfo) метод. Если ресурс для текущего языка и региональных параметров пользовательского интерфейса или указанного языка и региональных параметров не найден, диспетчер ресурсов использует резервный список языка пользовательского интерфейса для поиска подходящего ресурса.

Конструкторы

ResourceManager()

Инициализирует новый экземпляр класса ResourceManager со значениями по умолчанию.

ResourceManager(String, Assembly)

Инициализирует новый экземпляр класса ResourceManager, который ищет ресурсы, содержащиеся в файлах с указанным корневым именем, в данной сборке.

ResourceManager(String, Assembly, Type)

Инициализирует новый экземпляр класса ResourceManager, который использует указанный класс ResourceSet для поиска ресурсов, содержащихся в файлах с указанным корневым именем, в данной сборке.

ResourceManager(Type)

Инициализирует новый экземпляр класса ResourceManager, который ищет ресурсы в сопутствующих сборках, используя сведения из указанного объекта типа.

Поля

BaseNameField

Указывает имя корневой папки файлов ресурсов, в которой класс ResourceManager ищет ресурсы.

HeaderVersionNumber

Указывает версию заголовков файлов ресурсов, которую текущая реализация ResourceManager может интерпретировать и создавать.

MagicNumber

Содержит номер, используемый для идентификации файлов ресурсов.

MainAssembly

Задает главную сборку, содержащую ресурсы.

ResourceSets
Является устаревшей.

Содержит объект Hashtable, который возвращает сопоставление языков и региональных параметров с объектами ResourceSet.

Свойства

BaseName

Возвращает имя корневой папки файлов ресурсов, в которой класс ResourceManager ищет ресурсы.

FallbackLocation

Возвращает или задает расположение, из которого извлекаются резервные ресурсы по умолчанию.

IgnoreCase

Возвращает или задает значение, которое указывает, позволяет ли диспетчер ресурсов выполнять поиск ресурсов с учетом регистра в методах GetString(String) и GetObject(String).

ResourceSetType

Возвращает тип объекта набора ресурсов, используемый диспетчером ресурсов для построения объекта ResourceSet.

Методы

CreateFileBasedResourceManager(String, String, Type)

Возвращает объект ResourceManager, который ищет ресурсы в конкретном каталоге вместо манифеста сборки.

Equals(Object)

Определяет, равен ли указанный объект текущему объекту.

(Унаследовано от Object)
GetHashCode()

Служит хэш-функцией по умолчанию.

(Унаследовано от Object)
GetNeutralResourcesLanguage(Assembly)

Возвращает сведения, относящиеся к конкретному языку и региональным параметрам, для ресурсов главной сборки по умолчанию путем получения значения атрибута NeutralResourcesLanguageAttribute в указанной сборке.

GetObject(String)

Возвращает значение указанного нестрокового ресурса.

GetObject(String, CultureInfo)

Возвращает значение указанного нестрокового ресурса, локализованного для указанного языка и региональных параметров.

GetResourceFileName(CultureInfo)

Создает имя файла ресурсов для заданного объекта CultureInfo.

GetResourceSet(CultureInfo, Boolean, Boolean)

Извлекает набор ресурсов для определенного языка и региональных параметров.

GetSatelliteContractVersion(Assembly)

Возвращает версию, указанную атрибутом SatelliteContractVersionAttribute в заданной сборке.

GetStream(String)

Возвращает объект потока неуправляемой памяти из заданного ресурса.

GetStream(String, CultureInfo)

Возвращает объект потока неуправляемой памяти из заданного ресурса, используя заданный язык и региональные параметры.

GetString(String)

Возвращает значение указанного строкового ресурса.

GetString(String, CultureInfo)

Возвращает значение строкового ресурса, локализованного для указанного языка и региональных параметров.

GetType()

Возвращает объект Type для текущего экземпляра.

(Унаследовано от Object)
InternalGetResourceSet(CultureInfo, Boolean, Boolean)

Предоставляет реализацию для обнаружения набора ресурсов.

MemberwiseClone()

Создает неполную копию текущего объекта Object.

(Унаследовано от Object)
ReleaseAllResources()

Сообщает диспетчеру ресурсов, что следует вызвать метод Close() на всех объектах ResourceSet и освободить все ресурсы.

ToString()

Возвращает строку, представляющую текущий объект.

(Унаследовано от Object)

Применяется к

Потокобезопасность

Данный тип потокобезопасен.

См. также раздел