Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Примечание.
В этой статье приводятся дополнительные замечания к справочной документации по этому API.
Конструктор ResourceManager(Type)
Этот раздел относится к перегрузке конструктора ResourceManager(Type) .
Настольные приложения
В классических приложениях диспетчер ресурсов использует resourceSource параметр для загрузки определенного файла ресурсов следующим образом:
- Если атрибут NeutralResourcesLanguageAttribute не используется для указания, что ресурсы культуры по умолчанию находятся в вспомогательной сборке, диспетчер ресурсов предполагает, что файл ресурсов для культуры по умолчанию найден в той же сборке, что и тип, указанный параметром
resourceSource. - Диспетчер ресурсов предполагает, что файл ресурсов по умолчанию имеет то же базовое имя, что и тип, указанный параметром
resourceSource. - Диспетчер ресурсов использует класс по умолчанию ResourceSet для управления файлом ресурсов.
Например, при указании типа MyCompany.MyProduct.MyTypeдиспетчер ресурсов ищет файл ресурсовс именем MyCompany.MyProduct.MyType.resources в сборке, которая определяет MyType.
В Visual Studio дизайнер ресурсов автоматически генерирует код, который определяет класс internal (в C#) или Friend (в Visual Basic), имя которого совпадает с базовым именем файла .resources для культуры по умолчанию. Это позволяет создать экземпляр ResourceManager объекта и присвоить ему определенный набор ресурсов, получив объект типа, имя которого соответствует имени ресурса, так как до тех пор, пока класс отображается компилятору, ресурсы также должны быть. Например, если файл .resources назван Resource1, следующий оператор создаёт объект ResourceManager для управления файлом .resources, названным Resource1.
ResourceManager rm = new ResourceManager(typeof(Resource1));
Если вы не используете Visual Studio, можно создать класс без членов, пространство имен и имя которого совпадают с именем и пространством имен файла ресурсов по умолчанию .resources. Пример содержит иллюстрацию.
Приложения Windows 8.x
Это важно
Хотя класс ResourceManager поддерживается в приложениях Windows 8.x, мы не рекомендуем использовать его. Используйте этот класс только при разработке проектов переносимой библиотеки классов, которые можно использовать с приложениями Windows 8.x. Чтобы получить ресурсы из приложений Windows 8.x, используйте вместо этого класс Windows.ApplicationModel.Resources.ResourceLoader.
В приложениях Windows 8.x параметр ResourceManager используется для выявления сборки, базового имени и пространства имен, где элементы ресурсов могут находиться в файле индекса ресурсов пакета приложения (PRI). Например, если имеется тип с именем MyCompany.MyProduct.MyType, определенным в MyAssembly, диспетчер ресурсов ищет идентификатор набора ресурсов с именем MyAssembly и ищет область MyCompany.MyProduct.MyType в этом наборе ресурсов. Диспетчер ресурсов ищет элементы ресурсов в контексте по умолчанию (текущая культура, текущий параметр высокой контрастности и т. д.) в пределах этого охвата.
Пример
В следующем примере используется конструктор ResourceManager(Type) для создания объекта ResourceManager. Он состоит из ресурсов, скомпилированных из .txt файлов для английского языка (en), французского (Франция) (fr-FR) и российских (Россия) (ru-RU) культур. Пример изменяет текущую культуру и текущие культурные параметры пользовательского интерфейса на английский (США), французский (Франция), русский (Россия) и шведский (Швеция). Затем он вызывает GetString(String) метод для получения локализованной строки, которая отображает приветствие, которое зависит от времени дня.
В примере требуется три текстовых файла ресурсов, как указано в следующей таблице. Каждый файл содержит строковые ресурсы с именем Morning, Afternoonи Evening.
| Культура | Имя файла | Имя ресурса | Значение ресурса |
|---|---|---|---|
| en-US | GreetingResources.txt | Morning |
Доброе утро |
| en-US | GreetingResources.txt | Afternoon |
Добрый день |
| en-US | GreetingResources.txt | Evening |
Добрый вечер |
| fr-FR | GreetingResources.fr-FR.txt | Morning |
Bonjour |
| fr-FR | GreetingResources.fr-FR.txt | Afternoon |
Bonjour |
| fr-FR | GreetingResources.fr-FR.txt | Evening |
Добрый вечер |
| ru-RU | GreetingResources.ru-RU.txt | Morning |
Доброе утро |
| ru-RU | GreetingResources.ru-RU.txt | Afternoon |
Добрый день |
| ru-RU | GreetingResources.ru-RU.txt | Evening |
Добрый вечер |
Для компиляции примера Visual Basic и создания исполняемого файла с именем Greet.exeможно использовать следующий пакетный файл. Чтобы скомпилировать с помощью C#, измените имя компилятора с vbc на csc, а расширение файла с .vb на .cs.
resgen GreetingResources.txt
vbc Greet.vb /resource: GreetingResources.resources
md fr-FR
resgen GreetingResources.fr-FR.txt
al /out:fr-FR\Greet.resources.dll /culture:fr-FR /embed: GreetingResources.fr-FR.resources
md ru-RU
resgen GreetingResources.ru-RU.txt
al /out:ru-RU\Greet.resources.dll /culture:ru-RU /embed: GreetingResources.ru-RU.resources
Ниже приведен исходный код для примера (ShowDate.vb для версии Visual Basic или ShowDate.cs для версии C# кода).
using System;
using System.Resources;
using System.Globalization;
using System.Threading;
[assembly: NeutralResourcesLanguage("en")]
public class Example2
{
public static void Main()
{
string[] cultureNames = [ "en-US", "fr-FR", "ru-RU", "sv-SE" ];
DateTime noon = new DateTime(DateTime.Now.Year, DateTime.Now.Month,
DateTime.Now.Day, 12, 0, 0);
DateTime evening = new DateTime(DateTime.Now.Year, DateTime.Now.Month,
DateTime.Now.Day, 18, 0, 0);
ResourceManager rm = new ResourceManager(typeof(GreetingResources));
foreach (var cultureName in cultureNames)
{
Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(cultureName);
Console.WriteLine($"The current UI culture is {CultureInfo.CurrentUICulture.Name}");
if (DateTime.Now < noon)
Console.WriteLine($"{rm.GetString("Morning")}!");
else if (DateTime.Now < evening)
Console.WriteLine($"{rm.GetString("Afternoon")}!");
else
Console.WriteLine($"{rm.GetString("Evening")}!");
Console.WriteLine();
}
}
internal class GreetingResources
{
}
}
// The example displays output like the following:
// The current UI culture is en-US
// Good afternoon!
//
// The current UI culture is fr-FR
// Bonjour!
//
// The current UI culture is ru-RU
// Добрый день!
//
// The current UI culture is sv-SE
// Good afternoon!
Imports System.Resources
Imports System.Globalization
Imports System.Threading
<Assembly:NeutralResourcesLanguage("en")>
Module Example
Public Sub Main()
Dim cultureNames() As String = {"en-US", "fr-FR", "ru-RU", "sv-SE" }
Dim noon As New Date(Date.Now.Year, Date.Now.Month,
Date.Now.Day, 12,0,0)
Dim evening As New Date(Date.Now.Year, Date.Now.Month,
Date.Now.Day, 18, 0, 0)
Dim rm As New ResourceManager(GetType(GreetingResources))
For Each cultureName In cultureNames
Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(cultureName)
Console.WriteLine("The current UI culture is {0}",
CultureInfo.CurrentUICulture.Name)
If Date.Now < noon Then
Console.WriteLine("{0}!", rm.GetString("Morning"))
ElseIf Date.Now < evening Then
Console.WriteLine("{0}!", rm.GetString("Afternoon"))
Else
Console.WriteLine("{0}!", rm.GetString("Evening"))
End If
Console.WriteLine()
Next
End Sub
End Module
Friend Class GreetingResources
End Class
' The example displays output like the following:
' The current UI culture is en-US
' Good afternoon!
'
' The current UI culture is fr-FR
' Bonjour!
'
' The current UI culture is ru-RU
' Добрый день!
'
' The current UI culture is sv-SE
' Good afternoon!
Помимо определения класса приложения с именем Example, исходный код определяет внутренний класс, имя которого совпадает GreetingResourcesс базовым именем файлов ресурсов. Это позволяет успешно создать экземпляр ResourceManager объекта путем вызова конструктора ResourceManager(Type) .
Обратите внимание, что выходные данные отображают соответствующую локализованную строку, за исключением случая, когда текущая культура пользовательского интерфейса — шведский (Швеция); в этом случае используются английские языковые ресурсы. Так как ресурсы шведского языка недоступны, приложение использует ресурсы культурных параметров по умолчанию, как это определено атрибутом NeutralResourcesLanguageAttribute.
Конструктор ResourceManager(String, Assembly)
Этот раздел относится к перегрузке конструктора ResourceManager(String, Assembly) .
Настольные приложения
В настольных приложениях файлы ресурсов конкретной культуры должны содержаться во вспомогательных сборках, а файл ресурсов культуры по умолчанию — в основной сборке. Предполагается, что спутниковая сборка содержит ресурсы для одной культуры, указанной в манифесте этой сборки, и загружается по мере необходимости.
Примечание.
Чтобы получить ресурсы из файлов ресурсов напрямую, а не извлекать их из сборок, необходимо вызвать CreateFileBasedResourceManager метод вместо создания экземпляра ResourceManager объекта.
Если файл ресурсов, идентифицированный baseName, не найден в assembly, метод создает экземпляр объекта ResourceManager, но попытка получить определенный ресурс вызывает исключение, обычно MissingManifestResourceException. Для получения информации о диагностике причины исключения см. раздел "Обработка исключения MissingManifestResourceException" в теме класса ResourceManager.
Приложения Windows 8.x
Это важно
Хотя класс ResourceManager поддерживается в приложениях Windows 8.x, мы не рекомендуем использовать его. Используйте этот класс только при разработке проектов переносимой библиотеки классов, которые можно использовать с приложениями Windows 8.x. Чтобы получить ресурсы из приложений Windows 8.x, используйте вместо этого класс Windows.ApplicationModel.Resources.ResourceLoader.
В приложениях Windows 8.x диспетчер ресурсов использует простое имя assembly параметра для поиска соответствующего набора ресурсов в файле индекса ресурсов пакета приложения (PRI). Параметр baseName используется для поиска элемента ресурса в наборе ресурсов. Например, корневое имя для PortableLibrary1.Resource1.de-DE.resources — PortableLibrary1.Resource1.
Пример
В следующем примере используется простое не локализованное приложение Hello World для иллюстрации конструктора ResourceManager(String, Assembly) . Содержимое текстового файла с именем ExampleResources.txtGreeting=Hello. При компиляции приложения ресурс внедряется в основную сборку приложения.
Текстовый файл можно преобразовать в двоичный файл ресурсов с помощью генератора файлов ресурсов (ResGen.exe) в командной строке следующим образом:
resgen ExampleResources.txt
В следующем примере представлен исполняемый код, который создает ResourceManager экземпляр объекта, запрашивает у пользователя ввод имени и отображает приветствие.
using System;
using System.Reflection;
using System.Resources;
public class Example1
{
public static void Main()
{
// 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}!");
}
}
// The example produces output similar to the following:
// Enter your name: John
// Hello John!
Imports System.Globalization
Imports System.Reflection
Imports System.Resources
Module Example1
Public Sub Main()
' 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
' The example produces output similar to the following:
' Enter your name: John
' Hello John!
Его можно скомпилировать с помощью следующей команды в C#:
csc Example.cs /resource:ExampleResources.resources
В примере извлекается ссылка на сборку, содержащую файл ресурсов, путем передачи типа, определенного в этой сборке, функции typeof (в C#) или функции GetType (в Visual Basic) и извлечения значения свойства Type.Assembly.