Udostępnij za pośrednictwem


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 MyAssemblyprogramie , 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, Afternooni 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 assemblymetodzie , 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.