Sdílet prostřednictvím


System.Resources.ResourceManager – konstruktory

Tento článek obsahuje doplňující poznámky k referenční dokumentaci pro toto rozhraní API.

ResourceManager(Type) Konstruktor

Tato část se týká přetížení konstruktoru ResourceManager(Type) .

Desktopové aplikace

V desktopových aplikacích správce prostředků pomocí parametru resourceSource načte konkrétní soubor prostředků následujícím způsobem:

  • NeutralResourcesLanguageAttribute Pokud se atribut nepoužívá k označení, že prostředky výchozí jazykové verze se nacházejí v satelitním sestavení, správce prostředků předpokládá, že soubor prostředků pro výchozí jazykovou verzi se nachází ve stejném sestavení jako typ určený parametremresourceSource.
  • Správce prostředků předpokládá, že výchozí soubor prostředků má stejný základní název jako typ zadaný parametrem resourceSource .
  • Správce prostředků používá výchozí ResourceSet třídu k manipulaci se souborem prostředků.

Například v případě typu pojmenovaného MyCompany.MyProduct.MyTypesprávce prostředků vyhledá v sestavení, které definuje MyType, soubor .resources s názvem MyCompany.MyProduct.MyType.resources.

Návrhář prostředků v sadě Visual Studio automaticky vygeneruje internal kód, který definuje třídu (v jazyce C#) nebo Friend (v jazyce Visual Basic), jejíž název je stejný jako základní název souboru .resources pro výchozí jazykovou verzi. To umožňuje vytvořit instanci objektu ResourceManager a spojit ho s konkrétní sadou prostředků získáním objektu typu, jehož název odpovídá názvu prostředku, protože pokud je třída viditelná pro kompilátor, musí být také prostředky. Pokud má například soubor .resources název Resource1, vytvoří následující příkaz instanci ResourceManager objektu pro správu souboru .resources s názvem Resource1:

ResourceManager rm = new ResourceManager(typeof(Resource1));

Pokud visual Studio nepoužíváte, můžete vytvořit třídu bez členů, jejichž obor názvů a název jsou stejné jako výchozí soubor .resources . Příklad uvádí ukázku.

Aplikace pro Windows 8.x

Důležité

I když je ResourceManager třída podporována v aplikacích pro Windows 8.x, nedoporučujeme jeho použití. Tuto třídu používejte pouze v případě, že vyvíjíte projekty knihovny přenosných tříd, které lze používat s aplikacemi pro Windows 8.x. Pokud chcete načíst prostředky z aplikací pro Windows 8.x, použijte místo toho třídu Windows.ApplicationModel.Resources.ResourceLoader .

V aplikacích ResourceManager pro Windows 8.x používá resourceSource parametr k odvození sestavení, základního názvu a oboru názvů, kde se položky prostředků můžou nacházet v souboru indexu prostředků balíčku aplikace (PRI). Například vzhledem k typu definovanému MyCompany.MyProduct.MyType v MyAssemblysadě prostředků správce prostředků vyhledá identifikátor MyAssembly sady prostředků a vyhledá obor MyCompany.MyProduct.MyType v rámci této sady prostředků. Správce prostředků vyhledá položky prostředků ve výchozím kontextu (aktuální jazyková verze, aktuální nastavení vysokého kontrastu atd.) v rámci tohoto oboru.

Příklad

Následující příklad používá ResourceManager(Type) konstruktor k vytvoření instance objektu ResourceManager . Skládá se z prostředků zkompilovaných ze souborů .txt pro jazykové verze angličtiny (en), francouzštiny (Francie) (fr-FR) a ruštiny (Rusko) (ru-RU). Příklad změní aktuální jazykovou verzi a aktuální jazykovou verzi uživatelského rozhraní na angličtinu (USA), francouzštinu (Francii), ruštinu (Rusko) a švédštinu (Švédsko). Potom zavolá metodu GetString(String) pro načtení lokalizovaného řetězce, který zobrazí pozdrav, který závisí na době dne.

Příklad vyžaduje tři textové soubory prostředků, jak je uvedeno v následující tabulce. Každý soubor obsahuje řetězcové prostředky s názvem Morning, Afternoona Evening.

Kultura Název souboru Název prostředku Hodnota prostředku
cs GreetingResources.txt Morning Dobré ráno
cs GreetingResources.txt Afternoon Dobré odpoledne
cs GreetingResources.txt Evening Dobrý večer
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 Добрый вечер

Pomocí následujícího dávkového souboru můžete zkompilovat příklad jazyka Visual Basic a vytvořit spustitelný soubor s názvem Greet.exe. Chcete-li kompilovat pomocí jazyka C#, změňte název kompilátoru z vbc na csc a příponu souboru 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

Tady je zdrojový kód pro příklad (ShowDate.vb pro verzi jazyka Visual Basic nebo ShowDate.cs pro verzi kódu jazyka 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 {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!

Kromě definování třídy aplikace s názvem Example, zdrojový kód definuje interní třídu, jejíž název , GreetingResourcesje stejný jako základní název souborů prostředků. To umožňuje úspěšně vytvořit instanci ResourceManager objektu voláním konstruktoru ResourceManager(Type) .

Všimněte si, že výstup zobrazí příslušný lokalizovaný řetězec s výjimkou situace, kdy je aktuální jazyková verze uživatelského rozhraní švédština (Švédsko), v takovém případě používá prostředky anglického jazyka. Vzhledem k tomu, že prostředky švédského jazyka nejsou k dispozici, aplikace místo toho používá prostředky výchozí jazykové verze definované atributem NeutralResourcesLanguageAttribute .

ResourceManager(String, Assembly) Konstruktor

Tato část se týká přetížení konstruktoru ResourceManager(String, Assembly) .

Desktopové aplikace

V desktopových aplikacích by měly být soubory prostředků specifické pro jednotlivé jazykové verze obsaženy v satelitních sestaveních a soubor prostředků výchozí jazykové verze by měl být obsažen v hlavním sestavení. U satelitního sestavení se předpokládá, že obsahuje prostředky pro jednu jazykovou verzi určenou v manifestu sestavení a podle potřeby se načte.

Poznámka:

Chcete-li načíst prostředky ze souborů .resources přímo místo jejich načtení ze sestavení, je nutné volat metodu CreateFileBasedResourceManager místo vytvoření instance objektu ResourceManager .

Pokud soubor prostředků identifikovaný baseName nelze nalézt v assembly, metoda vytvoří ResourceManager instanci objektu, ale pokus o načtení konkrétního prostředku vyvolá výjimku, obvykle MissingManifestResourceException. Informace o diagnostice příčiny výjimky naleznete v části ResourceManager "Zpracování MissingManifestResourceException Exception" tématu třídy.

Aplikace pro Windows 8.x

Důležité

I když je ResourceManager třída podporována v aplikacích pro Windows 8.x, nedoporučujeme jeho použití. Tuto třídu používejte pouze v případě, že vyvíjíte projekty knihovny přenosných tříd, které lze používat s aplikacemi pro Windows 8.x. Pokud chcete načíst prostředky z aplikací pro Windows 8.x, použijte místo toho třídu Windows.ApplicationModel.Resources.ResourceLoader .

V aplikacích pro Windows 8.x používá správce prostředků jednoduchý název parametru assembly k vyhledání odpovídajícího prostředku nastaveného v souboru prostředků balíčku aplikace (PRI). Tento baseName parametr slouží k vyhledání položky prostředku v rámci sady prostředků. Například kořenový název pro PortableLibrary1.Resource1.de-DE.resources je PortableLibrary1.Resource1.

Příklad

Následující příklad používá k ilustraci ResourceManager(String, Assembly) konstruktoru jednoduchou nelokalitovou aplikaci Hello World. Obsah textového souboru s názvem ExampleResources.txt je Greeting=Hello. Při kompilaci aplikace se prostředek vloží do hlavního sestavení aplikace.

Textový soubor lze převést na binární soubor prostředků pomocí Generátoru souborů prostředků (ResGen.exe) na příkazovém řádku následujícím způsobem:

resgen ExampleResources.txt

Následující příklad poskytuje spustitelný kód, který vytvoří instanci objektu ResourceManager , vyzve uživatele k zadání jména a zobrazí pozdrav.

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!

Dá se zkompilovat pomocí následujícího příkazu v jazyce C#:

csc Example.cs /resource:ExampleResources.resources

Příklad načte odkaz na sestavení, které obsahuje soubor prostředků předáním typu definovaného v tomto sestavení typeof funkci (v jazyce C#) nebo GetType funkci (v jazyce Visual Basic) a načtením hodnoty jeho Type.Assembly vlastnosti.