Konstruktory System.Resources.ResourceManager
Ten artykuł zawiera dodatkowe uwagi dotyczące dokumentacji referencyjnej dla tego interfejsu API.
ResourceManager(Type) Konstruktor
Ta sekcja dotyczy przeciążenia konstruktora ResourceManager(Type) .
Aplikacje klasyczne
W aplikacjach klasycznych menedżer zasobów używa parametru resourceSource
do załadowania określonego pliku zasobu w następujący sposób:
- NeutralResourcesLanguageAttribute Jeśli atrybut nie jest używany do wskazania, że zasoby kultury domyślnej znajdują się w zestawie satelitarnym, menedżer zasobów zakłada, że plik zasobu dla kultury domyślnej znajduje się w tym samym zestawie co typ określony przez
resourceSource
parametr . - Menedżer zasobów zakłada, że domyślny plik zasobu ma taką samą nazwę podstawową, jak typ określony przez
resourceSource
parametr. - Menedżer zasobów używa domyślnej ResourceSet klasy do manipulowania plikiem zasobów.
Na przykład, biorąc pod uwagę typ o nazwie MyCompany.MyProduct.MyType
, menedżer zasobów szuka pliku resources o nazwie MyCompany.MyProduct.MyType.resources w zestawie, który definiuje MyType
.
W programie Visual Studio Projektant zasób automatycznie generuje kod, który definiuje klasę internal
(w języku C#) lub Friend
(w języku Visual Basic), której nazwa jest taka sama jak nazwa podstawowa pliku resources dla kultury domyślnej. Dzięki temu można utworzyć wystąpienie ResourceManager obiektu i połączyć go z określonym zestawem zasobów, uzyskując obiekt typu, którego nazwa odpowiada nazwie zasobu, ponieważ tak długo, jak klasa jest widoczna dla kompilatora, zasoby muszą być również. Jeśli na przykład plik resources ma nazwę Resource1, następująca instrukcja tworzy wystąpienie obiektu w celu zarządzania plikiem ResourceManager resources o nazwie Resource1:
ResourceManager rm = new ResourceManager(typeof(Resource1));
Jeśli nie używasz programu Visual Studio, możesz utworzyć klasę bez elementów członkowskich, których przestrzeń nazw i nazwa są takie same jak w domyślnym pliku resources . Przykład stanowi ilustrację.
Aplikacje systemu Windows 8.x
Ważne
Mimo że klasa jest obsługiwana ResourceManager w aplikacjach systemu Windows 8.x, nie zalecamy jej użycia. Tej klasy należy używać tylko podczas tworzenia projektów biblioteki klas przenośnych, które mogą być używane z aplikacjami systemu Windows 8.x. Aby pobrać zasoby z aplikacji systemu Windows 8.x, zamiast tego użyj klasy Windows.ApplicationModel.Resources.ResourceLoader .
W aplikacjach systemu Windows 8.x parametr używa parametru resourceSource
, aby wywnioskować zestaw, nazwę podstawową i przestrzeń nazw, ResourceManager w której elementy zasobów mogą znajdować się w pliku indeksu zasobów pakietu aplikacji (PRI). Na przykład, biorąc pod uwagę typ o nazwie MyCompany.MyProduct.MyType
zdefiniowany w MyAssembly
programie , menedżer zasobów szuka identyfikatora zestawu zasobów o nazwie MyAssembly
i szuka zakresu MyCompany.MyProduct.MyType
w tym zestawie zasobów. Menedżer zasobów wyszukuje elementy zasobów w kontekście domyślnym (bieżąca kultura, bieżące ustawienie dużego kontrastu itd.) w tym zakresie.
Przykład
W poniższym przykładzie użyto konstruktora ResourceManager(Type) do utworzenia ResourceManager wystąpienia obiektu. Składa się z zasobów skompilowanych z plików .txt dla kultur angielskich (en), francuski (Francja) (fr-FR) i rosyjski (Rosja) (ru-RU). Przykład zmienia bieżącą kulturę i bieżącą kulturę interfejsu użytkownika na angielski (Stany Zjednoczone), francuski (Francja), rosyjski (Rosja) i szwedzki (Szwecja). Następnie wywołuje metodę GetString(String) , aby pobrać zlokalizowany ciąg, który wyświetla powitanie, które zależy od pory dnia.
Przykład wymaga trzech plików zasobów opartych na tekście, jak pokazano w poniższej tabeli. Każdy plik zawiera zasoby ciągów o nazwach Morning
, Afternoon
i Evening
.
Kultura | Nazwa pliku | Nazwa zasobu | Wartość zasobu |
---|---|---|---|
en-US | GreetingResources.txt | Morning |
Dzień dobry |
en-US | GreetingResources.txt | Afternoon |
Dzień dobry |
en-US | GreetingResources.txt | Evening |
Dobry wieczór |
fr-FR | GreetingResources.fr-FR.txt | Morning |
Bonjour |
fr-FR | GreetingResources.fr-FR.txt | Afternoon |
Bonjour |
fr-FR | GreetingResources.fr-FR.txt | Evening |
Bonsoir |
ru-RU | GreetingResources.ru-RU.txt | Morning |
Доброе утро |
ru-RU | GreetingResources.ru-RU.txt | Afternoon |
Добрый день |
ru-RU | GreetingResources.ru-RU.txt | Evening |
Добрый вечер |
Poniższy plik wsadowy umożliwia skompilowanie przykładu języka Visual Basic i utworzenie pliku wykonywalnego o nazwie Greet.exe. Aby skompilować w języku C#, zmień nazwę kompilatora z vbc
na csc
i rozszerzenie pliku z .vb
na .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
Oto kod źródłowy dla przykładu (ShowDate.vb dla wersji Visual Basic lub ShowDate.cs dla wersji języka C# kodu).
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 {0}",
CultureInfo.CurrentUICulture.Name);
if (DateTime.Now < noon)
Console.WriteLine("{0}!", rm.GetString("Morning"));
else if (DateTime.Now < evening)
Console.WriteLine("{0}!", rm.GetString("Afternoon"));
else
Console.WriteLine("{0}!", 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!
Oprócz definiowania klasy aplikacji o nazwie Example
, kod źródłowy definiuje klasę wewnętrzną, której nazwa, GreetingResources
, jest taka sama jak nazwa podstawowa plików zasobów. Dzięki temu można pomyślnie utworzyć ResourceManager wystąpienie obiektu przez wywołanie konstruktora ResourceManager(Type) .
Zwróć uwagę, że dane wyjściowe wyświetlają odpowiedni zlokalizowany ciąg, z wyjątkiem sytuacji, gdy bieżąca kultura interfejsu użytkownika to Szwedzki (Szwecja), w którym przypadku używa zasobów języka angielskiego. Ponieważ zasoby języka szwedzkiego są niedostępne, zamiast tego aplikacja używa zasobów kultury domyślnej, zgodnie z definicją atrybutu NeutralResourcesLanguageAttribute .
ResourceManager(String, Assembly) Konstruktor
Ta sekcja dotyczy przeciążenia konstruktora ResourceManager(String, Assembly) .
Aplikacje klasyczne
W aplikacjach klasycznych poszczególne pliki zasobów specyficzne dla kultury powinny znajdować się w zestawach satelitarnych, a plik zasobu kultury domyślnej powinien znajdować się w głównym zestawie. Zakłada się, że zestaw satelitarny zawiera zasoby dla pojedynczej kultury określonej w manifeście tego zestawu i jest ładowany w razie potrzeby.
Uwaga
Aby pobrać zasoby z plików resources bezpośrednio zamiast pobierać je z zestawów, należy wywołać CreateFileBasedResourceManager metodę , aby utworzyć ResourceManager wystąpienie obiektu.
Jeśli plik zasobu zidentyfikowany przez baseName
program nie może zostać znaleziony w assembly
metodzie , tworzy wystąpienie ResourceManager obiektu, ale próba pobrania określonego zasobu zgłasza wyjątek, zazwyczaj MissingManifestResourceException. Aby uzyskać informacje na temat diagnozowania przyczyny wyjątku, zobacz sekcję "Obsługa wyjątku MissingManifestResourceException" tematu ResourceManager klasy.
Aplikacje systemu Windows 8.x
Ważne
Mimo że klasa jest obsługiwana ResourceManager w aplikacjach systemu Windows 8.x, nie zalecamy jej użycia. Tej klasy należy używać tylko podczas tworzenia projektów biblioteki klas przenośnych, które mogą być używane z aplikacjami systemu Windows 8.x. Aby pobrać zasoby z aplikacji systemu Windows 8.x, zamiast tego użyj klasy Windows.ApplicationModel.Resources.ResourceLoader .
W aplikacjach systemu Windows 8.x menedżer zasobów używa prostej nazwy parametru assembly
, aby wyszukać pasujący zestaw zasobów w pliku indeksu zasobów pakietu aplikacji (PRI). Parametr baseName
służy do wyszukiwania elementu zasobu w zestawie zasobów. Na przykład nazwa główna portableLibrary1.Resource1.de-DE.resources to PortableLibrary1.Resource1.
Przykład
W poniższym przykładzie użyto prostej, nielokalizowanej aplikacji "Hello World" w celu zilustrowania konstruktora ResourceManager(String, Assembly) . Zawartość pliku tekstowego o nazwie ExampleResources.txt to Greeting=Hello
. Po skompilowaniu aplikacji zasób jest osadzony w głównym zestawie aplikacji.
Plik tekstowy można przekonwertować na plik zasobu binarnego przy użyciu generatora plików zasobów (ResGen.exe) w wierszu polecenia w następujący sposób:
resgen ExampleResources.txt
Poniższy przykład zawiera kod wykonywalny, który tworzy wystąpienie ResourceManager obiektu, monituje użytkownika o wprowadzenie nazwy i wyświetla powitanie.
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("{0} {1}!", 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!
Można go skompilować przy użyciu następującego polecenia w języku C#:
csc Example.cs /resource:ExampleResources.resources
Przykład pobiera odwołanie do zestawu zawierającego plik zasobu, przekazując typ zdefiniowany w tym zestawie do typeof
funkcji (w języku C#) lub GetType
funkcji (w Visual Basic) i pobierając wartość jej Type.Assembly właściwości.