ResourceManager Třída

Definice

Představuje správce prostředků, který poskytuje pohodlný přístup k prostředkům specifických pro jazykovou verzi za běhu.

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
Dědičnost
ResourceManager
Odvozené
Atributy

Příklady

Následující příklad ukazuje, jak použít explicitní jazykovou verzi a implicitní aktuální jazykovou verzi uživatelského rozhraní k získání řetězcových prostředků z hlavního sestavení a satelitního sestavení. Další informace naleznete v části Umístění adresáře pro satelitní sestavení, která nejsou nainstalována v globální mezipaměti sestavení tématu Vytváření satelitních sestavení .

Spuštění tohoto příkladu:

  1. V adresáři aplikace vytvořte soubor s názvem rmc.txt, který obsahuje následující řetězce prostředků:

    day=Friday
    year=2006
    holiday="Cinco de Mayo"
    
  2. Pomocí generátoru souborů prostředků vygenerujte soubor prostředků rmc.resources ze vstupního souboru rmc.txt následujícím způsobem:

    resgen rmc.txt
    
  3. Vytvořte podadresář adresáře aplikace a pojmenujte ho "es-MX". Toto je název jazykové verze satelitního sestavení, který vytvoříte v dalších třech krocích.

  4. V adresáři es-MX vytvořte soubor s názvem rmc.es-MX.txt, který obsahuje následující řetězce prostředků:

    day=Viernes
    year=2006
    holiday="Cinco de Mayo"
    
  5. Pomocí generátoru souborů prostředků vygenerujte soubor prostředků rmc.es-MX.resources ze vstupního souboru rmc.es-MX.txt následujícím způsobem:

    resgen rmc.es-MX.txt
    
  6. Předpokládejme, že název souboru tohoto příkladu je rmc.vb nebo rmc.cs. Zkopírujte následující zdrojový kód do souboru. Pak ho zkompilujte a vložte do spustitelného sestavení hlavní soubor prostředků sestavení rmc.resources. Pokud používáte kompilátor Visual Basic, syntaxe je:

    vbc rmc.vb /resource:rmc.resources
    

    Odpovídající syntaxe kompilátoru jazyka C#:

    csc /resource:rmc.resources rmc.cs
    
  7. Pomocí linkeru sestavení vytvořte satelitní sestavení. Pokud je základní název aplikace rmc, musí být název satelitního sestavení rmc.resources.dll. Satelitní sestavení by mělo být vytvořeno v adresáři es-MX. Pokud je es-MX aktuální adresář, použijte tento příkaz:

    al /embed:rmc.es-MX.resources /c:es-MX /out:rmc.resources.dll
    
  8. Spuštěním rmc.exe získejte a zobrazte vložené řetězce prostředků.

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.

Poznámky

Důležité

Volání metod z této třídy s nedůvěryhodnými daty je bezpečnostní riziko. Volejte metody z této třídy pouze s důvěryhodnými daty. Další informace najdete v tématu Ověření všech vstupů.

Třída ResourceManager načte prostředky z binárního souboru .resources, který je vložen do sestavení nebo ze samostatného souboru .resources. Pokud byla aplikace lokalizována a lokalizované prostředky nasazeny v satelitních sestaveních, vyhledá prostředky specifické pro jazykovou verzi, poskytne prostředky náhradní, pokud lokalizovaný prostředek neexistuje, a podporuje serializaci prostředků.

Další informace o vytváření a správě prostředků v desktopových aplikacích a aplikacích Windows 8.x najdete v následujících částech:

Aplikace pro stolní počítače

U desktopových aplikací ResourceManager třída načítá prostředky ze souborů binárních prostředků (.resources). Kompilátor jazyka nebo Assembly Linker (AL.exe) obvykle vloží tyto soubory prostředků do sestavení. Objekt můžete také použít ResourceManager k načtení prostředků přímo ze souboru .resources, který není vložen do sestavení voláním CreateFileBasedResourceManager metody.

Upozornění

Použití samostatných souborů .resources v aplikaci ASP.NET přeruší nasazení XCOPY, protože prostředky zůstanou uzamčené, dokud je ReleaseAllResources metoda explicitně nevyvolá. Pokud chcete nasadit prostředky s ASP.NET aplikacemi, měli byste soubory .resources zkompilovat do satelitních sestavení.

V aplikaci založené na prostředcích obsahuje jeden soubor .resources prostředky výchozí jazykové verze, jejichž prostředky se používají, pokud se nenašly žádné prostředky specifické pro jazykovou verzi. Pokud je například výchozí jazyková verze aplikace angličtina (en), používají se anglické jazykové prostředky vždy, když lokalizované prostředky nelze najít pro konkrétní jazykovou verzi, jako je angličtina (USA) (en-US) nebo francouzština (Francie) (fr-FR). Prostředky pro výchozí jazykovou verzi jsou obvykle vloženy do hlavního sestavení aplikace a prostředky pro jiné lokalizované jazykové verze jsou vloženy do satelitních sestavení. Satelitní sestavení obsahují pouze prostředky. Mají stejný název kořenového souboru jako hlavní sestavení a příponu .resources.dll. Pro aplikace, jejichž sestavení nejsou zaregistrovaná v globální mezipaměti sestavení, jsou satelitní sestavení uložena v podadresáři aplikace, jejíž název odpovídá jazykové verzi sestavení.

Vytváření prostředků

Při vývoji aplikace založené na prostředcích ukládáte informace o prostředcích do textových souborů (soubory, které mají příponu .txt nebo .restext) nebo soubory XML (soubory s příponou .resx). Potom zkompilujete text nebo soubory XML pomocí generátoru souborů prostředků (Resgen.exe) a vytvoříte binární soubor .resources. Výsledný soubor .resources pak můžete vložit do spustitelného souboru nebo knihovny pomocí možnosti kompilátoru, jako /resources je například pro kompilátor C# a Visual Basic kompilátory, nebo ho můžete vložit do satelitního sestavení pomocí Linkeru sestavení (AI.exe). Pokud do projektu Visual Studio zahrnete soubor .resx, Visual Studio zpracuje kompilaci a vkládání výchozích a lokalizovaných prostředků automaticky jako součást procesu sestavení.

V ideálním případě byste měli vytvářet prostředky pro každý jazyk, který vaše aplikace podporuje, nebo alespoň pro smysluplnou podmnožinu každého jazyka. Názvy binárních souborů .resources se řídí názvem basename konvence vytváření názvů. cultureName.resources, kde basename je název aplikace nebo název třídy v závislosti na požadované úrovni podrobností. Vlastnost CultureInfo.Name se používá k určení cultureName. Prostředek pro výchozí jazykovou verzi aplikace by měl mít název basename.resources.

Předpokládejme například, že sestavení má v souboru prostředků několik prostředků, které má základní název MyResources. Tyto soubory prostředků by měly mít názvy, jako jsou MyResources.ja-JP.resources pro japonskou (japonskou) jazykovou verzi, MyResources.de.resources pro německou jazykovou verzi, MyResources.zh-CHS.resources pro zjednodušenou čínskou jazykovou verzi a MyResources.fr-BE.resources pro francouzskou jazykovou verzi (Belgie). Výchozí soubor prostředků by měl mít název MyResources.resources. Soubory prostředků specifické pro jazykovou verzi jsou obvykle zabaleny do satelitních sestavení pro každou jazykovou verzi. Výchozí soubor prostředků by měl být vložen do hlavního sestavení aplikace.

Všimněte si, že Assembly Linker umožňuje, aby byly prostředky označené jako soukromé, ale měli byste je vždy označit jako veřejné, aby k nim bylo možné přistupovat jinými sestaveními. (Vzhledem k tomu, že satelitní sestavení neobsahuje žádný kód, prostředky označené jako soukromé nejsou pro vaši aplikaci dostupné prostřednictvím jakéhokoli mechanismu.)

Další informace o vytváření, balení a nasazování prostředků najdete v článcích Vytváření souborů prostředků, Vytváření satelitních sestavení a balení a nasazování prostředků.

Vytvoření instance objektu ResourceManager

Vytvoříte instanci objektu ResourceManager , který načte prostředky z vloženého souboru .resources voláním jednoho z přetížení konstruktoru třídy. Tento objekt úzce páruje ResourceManager s konkrétním souborem .resources a všemi přidruženými lokalizovanými soubory .resources v satelitních sestaveních.

Dva nejčastěji označované konstruktory jsou:

  • ResourceManager(String, Assembly) vyhledá prostředky na základě dvou informací, které zadáte: základní název souboru .resources a sestavení, ve kterém se nachází výchozí soubor .resources. Základní název zahrnuje obor názvů a kořenový název souboru .resources bez jeho jazykové verze nebo přípony. Všimněte si, že soubory .resources kompilované z příkazového řádku obvykle neobsahují název oboru názvů, zatímco soubory .resources vytvořené v prostředí Visual Studio dělají. Pokud má například soubor prostředků název MyCompany.StringResources.resources a ResourceManager konstruktor se volá ze statické metody s názvem Example.Main, následující kód vytvoří instanci ResourceManager objektu, který může načíst prostředky ze souboru .resources:

    ResourceManager rm = new ResourceManager("MyCompany.StringResources",
                                             typeof(Example).Assembly);
    
    Dim rm As New ResourceManager("MyCompany.StringResources",
                                  GetType(Example).Assembly)
    
  • ResourceManager(Type) vyhledá prostředky v satelitních sestaveních na základě informací z objektu typu. Plně kvalifikovaný název typu odpovídá základnímu názvu souboru .resources bez přípony názvu souboru. V desktopových aplikacích vytvořených pomocí návrháře prostředků Visual Studio Visual Studio vytvoří třídu obálky, jejíž plně kvalifikovaný název je stejný jako kořenový název souboru .resources. Pokud má například soubor prostředků název MyCompany.StringResources.resources a existuje třída obálky s názvem MyCompany.StringResources, následující kód vytvoří instanci ResourceManager objektu, který může načíst prostředky ze souboru .resources:

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

Pokud nelze najít příslušné prostředky, volání konstruktoru vytvoří platný ResourceManager objekt. Pokus o načtení prostředku však vyvolá MissingManifestResourceException výjimku. Informace o řešení výjimky naleznete v části Zpracování ChybějícíManifestResourceException a MissingSatelliteAssembly Výjimky dále v tomto článku.

Následující příklad ukazuje, jak vytvořit instanci objektu ResourceManager . Obsahuje zdrojový kód spustitelného souboru s názvem ShowTime.exe. Obsahuje také následující textový soubor s názvem Strings.txt, který obsahuje jeden řetězcový prostředek: TimeHeader

TimeHeader=The current time is

Pomocí dávkového souboru můžete vygenerovat soubor prostředku a vložit ho do spustitelného souboru. Tady je dávkový soubor pro vygenerování spustitelného souboru pomocí kompilátoru jazyka C#:

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

Pro kompilátor Visual Basic můžete použít následující dávkový soubor:

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 a prostředky specifické pro jazykovou verzi

Lokalizovaná aplikace vyžaduje nasazení prostředků, jak je popsáno v článku Balení a nasazování prostředků. Pokud jsou sestavení správně nakonfigurovaná, správce prostředků určí, které prostředky se mají načíst na základě vlastnosti aktuálního vlákna Thread.CurrentUICulture . (Tato vlastnost také vrátí jazykovou verzi uživatelského rozhraní aktuálního vlákna.) Pokud je například aplikace kompilována s výchozími prostředky anglického jazyka v hlavním sestavení a s francouzskými a ruskými prostředky ve dvou satelitních sestaveních a Thread.CurrentUICulture vlastnost je nastavena na fr-FR, správce prostředků načte francouzské prostředky.

Vlastnost můžete explicitně nebo implicitně nastavit CurrentUICulture . Způsob, jakým nastavíte, určuje, jak ResourceManager objekt načítá prostředky na základě jazykové verze:

  • Pokud vlastnost explicitně nastavíte Thread.CurrentUICulture na konkrétní jazykovou verzi, správce prostředků vždy načte prostředky pro danou jazykovou verzi bez ohledu na prohlížeč uživatele nebo jazyk operačního systému. Zvažte aplikaci kompilovanou s výchozími prostředky anglického jazyka a třemi satelitními sestaveními, které obsahují prostředky pro angličtinu (USA), francouzštinu (Francii) a ruštinu (Rusko). Pokud je vlastnost nastavena CurrentUICulture na fr-FR, ResourceManager objekt vždy načte francouzské (Francie) prostředky, i když jazyk operačního systému uživatele není francouzština. Před explicitně nastavením vlastnosti se ujistěte, že se jedná o požadované chování.

    V ASP.NET aplikacích musíte vlastnost nastavit Thread.CurrentUICulture explicitně, protože je nepravděpodobné, že nastavení na serveru bude odpovídat příchozím žádostem klientů. Aplikace ASP.NET může vlastnost explicitně nastavit Thread.CurrentUICulture na jazyk, který přijímá prohlížeč uživatele.

    Explicitní nastavení Thread.CurrentUICulture vlastnosti definuje aktuální jazykovou verzi uživatelského rozhraní pro dané vlákno. Nemá vliv na aktuální jazykovou verzi uživatelského rozhraní jiných vláken v aplikaci.

  • Jazykovou verzi uživatelského rozhraní všech vláken v doméně aplikace můžete nastavit přiřazením objektu CultureInfo , který představuje tuto jazykovou verzi statické CultureInfo.DefaultThreadCurrentUICulture vlastnosti.

  • Pokud explicitně nenastavíte aktuální jazykovou verzi uživatelského rozhraní a nedefinujete výchozí jazykovou verzi pro aktuální doménu aplikace, CultureInfo.CurrentUICulture vlastnost se implicitně nastaví funkcí WindowsGetUserDefaultUILanguage. Tuto funkci poskytuje sada MUI (Multilingual User Interface) (MUI), která uživateli umožňuje nastavit výchozí jazyk. Pokud uživatel nenastaví jazyk uživatelského rozhraní, ve výchozím nastavení se nastaví jazyk nainstalovaný systémem, což je jazyk prostředků operačního systému.

Následující jednoduchý příklad "Hello world" nastaví aktuální jazykovou verzi uživatelského rozhraní explicitně. Obsahuje zdroje pro tři jazykové verze: angličtina (USA) nebo en-US, francouzština (Francie) nebo fr-FR a ru (Rusko) nebo ru-RU. Prostředky en-US jsou obsaženy v textovém souboru s názvem Greetings.txt:

HelloString=Hello world!

Prostředky fr-FR jsou obsažené v textovém souboru s názvem Greetings.fr-FR.txt:

HelloString=Salut tout le monde!

Prostředky ru-RU jsou obsažené v textovém souboru s názvem Greetings.ru-RU.txt:

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

Tady je zdrojový kód pro příklad (Example.vb pro Visual Basic verzi nebo Example.cs pro verzi jazyka 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.
'       Всем привет!

Pokud chcete tento příklad zkompilovat, vytvořte soubor dávky (.bat), který obsahuje následující příkazy, a spusťte ho z příkazového řádku. Pokud používáte jazyk C#, zadejte csc místo vbc a Example.cs místo 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

Načítání prostředků

Zavoláte GetObject(String) metody pro GetString(String) přístup ke konkrétnímu prostředku. Metodu můžete také volat k GetStream(String) načtení ne řetězcových prostředků jako pole bajtů. Ve výchozím nastavení tyto metody v aplikaci s lokalizovanými prostředky vrací prostředek pro jazykovou verzi určenou aktuální jazykovou verzí uživatelského rozhraní vlákna, které volání provedlo. Další informace o definování aktuální jazykové verze uživatelského rozhraní vlákna najdete v předchozí části ResourceManager a Culture-Specific Resources. Pokud správce prostředků nemůže najít prostředek pro jazykovou verzi uživatelského rozhraní aktuálního vlákna, použije k načtení zadaného prostředku náhradní proces. Pokud správce prostředků nemůže najít žádné lokalizované prostředky, použije prostředky výchozí jazykové verze. Další informace o náhradních pravidlech prostředků najdete v části "Proces náhradního prostředku" článku Balení a nasazení prostředků.

Poznámka

Pokud nelze najít soubor .resources zadaný v konstruktoru ResourceManager třídy, pokus o načtení prostředku vyvolá výjimku MissingManifestResourceException nebo MissingSatelliteAssemblyException výjimku. Informace o řešení výjimky naleznete v části Zpracování ChybějícíManifestResourceException a MissingSatelliteAssemblyException výjimky dále v tomto tématu.

Následující příklad používá metodu GetString k načtení prostředků specifických pro jazykovou verzi. Skládá se z prostředků kompilovaný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 volá metodu GetString pro načtení lokalizovaného řetězce, který se zobrazí spolu s aktuálním dnem a měsícem. Všimněte si, že výstup zobrazí odpovídající lokalizovaný řetězec s výjimkou případů, kdy je aktuální jazyková verze uživatelského rozhraní švédština (Švédsko). 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, což je angličtina.

Příklad vyžaduje textové soubory prostředků uvedené v následující tabulce. Každý z nich má jeden řetězcový prostředek s názvem DateStart.

Kultura Název souboru Název prostředku Hodnota prostředku
en-US DateStrings.txt DateStart Dnes je
fr-FR DateStrings.fr-FR.txt DateStart Aujourd'hui, c'est le
ru-RU DateStrings.ru-RU.txt DateStart Сегодня

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

Pokud chcete tento příklad zkompilovat, vytvořte dávkový soubor, který obsahuje následující příkazy, a spusťte ho z příkazového řádku. Pokud používáte jazyk C#, zadejte csc místo vbc a showdate.cs místo 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

Existují dva způsoby, jak načíst prostředky konkrétní jazykové verze, než je aktuální jazyková verze uživatelského rozhraní:

  • Můžete volat , GetObject(String, CultureInfo)nebo GetStream(String, CultureInfo) metodu GetString(String, CultureInfo)pro načtení prostředku pro konkrétní jazykovou verzi. Pokud lokalizovaný prostředek nelze najít, správce prostředků použije záložní proces prostředku k vyhledání příslušného prostředku.

  • Metodu GetResourceSet můžete volat k získání ResourceSet objektu, který představuje prostředky pro konkrétní jazykovou verzi. Při volání metody můžete určit, jestli správce prostředků testuje nadřazené jazykové verze, pokud nemůže najít lokalizované prostředky, nebo zda se jednoduše vrátí k prostředkům výchozí jazykové verze. Pak můžete použít ResourceSet metody pro přístup k prostředkům (lokalizované pro danou jazykovou verzi) podle názvu nebo k vytvoření výčtu prostředků v sadě.

Zpracování výjimek MissingManifestResourceException a MissingSatelliteAssemblyException

Pokud se pokusíte načíst konkrétní prostředek, ale správce prostředků nemůže tento prostředek najít a buď není definována žádná výchozí jazyková verze, nebo prostředky výchozí jazykové verze nelze najít, správce prostředků vyvolá MissingManifestResourceException výjimku, pokud očekává, že najde prostředky v hlavním sestavení nebo MissingSatelliteAssemblyException pokud očekává, že najde prostředky ve satelitním sestavení. Všimněte si, že výjimka je vyvolána při volání metody načítání prostředku, jako je nebo GetString GetObject, a ne při vytvoření instance objektu ResourceManager .

Výjimka se obvykle vyvolá za následujících podmínek:

  • Příslušný soubor prostředků nebo satelitní sestavení neexistuje. Pokud správce prostředků očekává, že se výchozí prostředky aplikace vloží do hlavního sestavení aplikace, chybí. NeutralResourcesLanguageAttribute Pokud atribut označuje, že výchozí prostředky aplikace se nacházejí v satelitním sestavení, toto sestavení nelze najít. Při kompilaci aplikace se ujistěte, že jsou prostředky vložené do hlavního sestavení nebo že se vygeneruje nezbytné satelitní sestavení a je správně pojmenované. Jeho název by měl mít formát appName.resources.dll a měl by být umístěn v adresáři pojmenovaném podle jazykové verze, jejíž prostředky obsahuje.

  • Vaše aplikace nemá definovanou výchozí nebo neutrální jazykovou verzi. NeutralResourcesLanguageAttribute Přidejte atribut do souboru zdrojového kódu nebo do souboru s informacemi o projektu (AssemblyInfo.vb pro Visual Basic aplikaci nebo AssemblyInfo.cs pro aplikaci jazyka C#).

  • Parametr baseName v konstruktoru ResourceManager(String, Assembly) nezadá název souboru .resources. Název by měl obsahovat plně kvalifikovaný obor názvů souboru prostředků, ale ne jeho příponu názvu souboru. Soubory prostředků vytvořené v Visual Studio obvykle zahrnují názvy oborů názvů, ale soubory prostředků vytvořené a kompilované na příkazovém řádku ne. Názvy vložených souborů .resources můžete určit kompilací a spuštěním následujícího nástroje. Jedná se o konzolovou aplikaci, která přijímá název hlavního sestavení nebo satelitního sestavení jako parametr příkazového řádku. Zobrazí řetězce, které by se měly poskytnout jako baseName parametr, aby správce prostředků mohl prostředek správně identifikovat.

    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
    

Pokud měníte aktuální jazykovou verzi aplikace explicitně, měli byste si také uvědomit, že správce prostředků načte sadu prostředků na základě hodnoty CultureInfo.CurrentUICulture vlastnosti, a ne na CultureInfo.CurrentCulture vlastnost. Obvykle platí, že pokud změníte jednu hodnotu, měli byste také změnit druhou hodnotu.

Správa verzí prostředků

Vzhledem k tomu, že hlavní sestavení, které obsahuje výchozí prostředky aplikace, je oddělené od satelitních sestavení aplikace, můžete uvolnit novou verzi hlavního sestavení bez opětovného nasazení satelitních sestavení. Atribut použijete SatelliteContractVersionAttribute k používání existujících satelitních sestavení a dáváte správci prostředků pokyn, aby je znovu nasadili novou verzí hlavního sestavení.

Další informace o podpoře správy verzí pro satelitní sestavení najdete v článku Načítání prostředků.

<satelliteassemblies> Uzel konfiguračního souboru

Poznámka

Tato část je specifická pro aplikace rozhraní .NET Framework.

U spustitelných souborů nasazených a spuštěných z webu (HREF .exe souborů) ResourceManager může objekt testovat satelitní sestavení přes web, což může poškodit výkon vaší aplikace. Pokud chcete odstranit problém s výkonem, můžete toto sondování omezit na satelitní sestavení, která jste nasadili ve své aplikaci. Uděláte to tak, že v konfiguračním <satelliteassemblies> souboru aplikace vytvoříte uzel, který určí, že jste pro aplikaci nasadili konkrétní sadu jazykových verzí a že ResourceManager by se objekt neměl pokoušet testovat pro žádnou jazykovou verzi, která není uvedená v tomto uzlu.

Poznámka

Upřednostňovanou alternativou <satelliteassemblies> k vytvoření uzlu je použití funkce manifestu nasazení ClickOnce.

V konfiguračním souboru vaší aplikace vytvořte oddíl podobný následujícímu:

<?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>

Upravte tyto konfigurační informace následujícím způsobem:

  • Zadejte jeden nebo více <assembly> uzlů pro každé hlavní sestavení, které nasadíte, kde každý uzel určuje plně kvalifikovaný název sestavení. Zadejte název hlavního sestavení místo MainAssemblyName a zadejte Versionhodnoty , PublicKeyTokena Culture atributy, které odpovídají hlavnímu sestavení.

    Version Pro atribut zadejte číslo verze sestavení. Například první verze sestavení může být číslo verze 1.0.0.0.

    PublicKeyToken Pro atribut zadejte klíčové slovonull, pokud jste sestavení nepodepsli silným názvem, nebo zadejte token veřejného klíče, pokud jste podepsali sestavení.

    Culture Pro atribut zadejte klíčové slovoneutral, které má určit hlavní sestavení a způsobitResourceManager, že třída testuje pouze pro jazykové verze uvedené v <culture> uzlech.

    Další informace o plně kvalifikovaných názvech sestavení naleznete v článku Názvy sestavení. Další informace o sestaveních se silným názvem naleznete v článku Vytvoření a použití sestavení se silným názvem.

  • Zadejte jeden nebo více <culture> uzlů s konkrétním názvem jazykové verze, například fr-FR, nebo neutrálním názvem jazykové verze, například "fr".

Pokud jsou prostředky potřebné pro jakékoli sestavení, které není uvedené v <satelliteassemblies> uzlu, ResourceManager testuje třídy pro jazykové verze pomocí standardních pravidel probívání.

Windows 8.x Apps

Důležité

Přestože je třída podporována ResourceManager v aplikacích Windows 8.x, nedoporučujeme jeho použití. Tuto třídu používejte pouze při vývoji projektů knihovny přenosných tříd, které lze použít s aplikacemi Windows 8.x. K načtení prostředků z aplikací Windows 8.x použijte Windows. ApplicationModel.Resources.ResourceLoader – třída.

V případě aplikací ResourceManager Windows 8.x třída načte prostředky ze souborů indexu prostředků balíčku (PRI). Jeden soubor PRI (soubor PRI balíčku aplikace) obsahuje prostředky pro výchozí jazykovou verzi i všechny lokalizované jazykové verze. Pomocí nástroje MakePRI vytvoříte soubor PRI z jednoho nebo více souborů prostředků, které jsou ve formátu XML (.resw). U zdrojů, které jsou součástí projektu Visual Studio, Visual Studio zpracovává proces vytváření a balení souboru PRI automaticky. Potom můžete použít třídu .NET Framework ResourceManager pro přístup k prostředkům aplikace nebo knihovny.

Instanci objektu ResourceManager pro aplikaci Windows 8.x můžete vytvořit stejným způsobem jako u desktopové aplikace.

Pak můžete získat přístup k prostředkům pro konkrétní jazykovou verzi předáním názvu prostředku, který se má načíst do GetString(String) metody. Ve výchozím nastavení tato metoda vrátí prostředek pro jazykovou verzi určenou aktuální jazykovou verzí uživatelského rozhraní vlákna, které volání provedlo. Prostředky pro konkrétní jazykovou verzi můžete také načíst předáním názvu prostředku a objektu CultureInfo , který představuje jazykovou verzi, jejíž prostředek se má načíst do GetString(String, CultureInfo) metody. Pokud prostředek pro aktuální jazykovou verzi uživatelského rozhraní nebo zadanou jazykovou verzi nelze najít, správce prostředků použije záložní seznam jazyka uživatelského rozhraní k vyhledání vhodného prostředku.

Konstruktory

ResourceManager()

Inicializuje novou instanci třídy ResourceManager s výchozími hodnotami.

ResourceManager(String, Assembly)

Inicializuje novou instanci ResourceManager třídy, která vyhledá prostředky obsažené v souborech se zadaným kořenovým názvem v daném sestavení.

ResourceManager(String, Assembly, Type)

Inicializuje novou instanci ResourceManager třídy, která používá zadanou ResourceSet třídu k vyhledání prostředků obsažených v souborech se zadaným kořenovým názvem v daném sestavení.

ResourceManager(Type)

Inicializuje novou instanci ResourceManager třídy, která vyhledá prostředky ve satelitních sestaveních na základě informací ze zadaného objektu typu.

Pole

BaseNameField

Určuje kořenový název souborů prostředků, které ResourceManager vyhledá prostředky.

HeaderVersionNumber

Určuje verzi hlaviček souboru prostředků, které může aktuální implementace ResourceManager interpretovat a vytvářet.

MagicNumber

Obsahuje číslo použité k identifikaci souborů prostředků.

MainAssembly

Určuje hlavní sestavení, které obsahuje prostředky.

ResourceSets
Zastaralé.

Hashtable Obsahuje objekt, který vrací mapování z jazykových verzí na ResourceSet objekty.

Vlastnosti

BaseName

Získá kořenový název souborů prostředků, které ResourceManager hledá prostředky.

FallbackLocation

Získá nebo nastaví umístění, ze kterého chcete načíst výchozí záložní prostředky.

IgnoreCase

Získá nebo nastaví hodnotu, která označuje, zda správce prostředků umožňuje vyhledávání prostředků nerozlišující malá a velká písmena v metodáchGetString(String).GetObject(String)

ResourceSetType

Získá typ objektu sady prostředků, který správce prostředků používá k vytvoření objektu ResourceSet .

Metody

CreateFileBasedResourceManager(String, String, Type)

ResourceManager Vrátí objekt, který hledá konkrétní adresář místo manifestu sestavení pro prostředky.

Equals(Object)

Určí, zda se zadaný objekt rovná aktuálnímu objektu.

(Zděděno od Object)
GetHashCode()

Slouží jako výchozí funkce hash.

(Zděděno od Object)
GetNeutralResourcesLanguage(Assembly)

Vrátí informace specifické pro jazykovou verzi pro výchozí prostředky hlavního sestavení načtením hodnoty atributu NeutralResourcesLanguageAttribute v zadaném sestavení.

GetObject(String)

Vrátí hodnotu zadaného ne řetězcového prostředku.

GetObject(String, CultureInfo)

Získá hodnotu zadaného ne řetězcového prostředku lokalizovaného pro zadanou jazykovou verzi.

GetResourceFileName(CultureInfo)

Vygeneruje název souboru prostředku pro daný CultureInfo objekt.

GetResourceSet(CultureInfo, Boolean, Boolean)

Načte sadu prostředků pro konkrétní jazykovou verzi.

GetSatelliteContractVersion(Assembly)

Vrátí verzi určenou atributem SatelliteContractVersionAttribute v daném sestavení.

GetStream(String)

Vrátí nespravovaný objekt datového proudu paměti ze zadaného prostředku.

GetStream(String, CultureInfo)

Vrátí nespravovaný objekt datového proudu paměti ze zadaného prostředku pomocí zadané jazykové verze.

GetString(String)

Vrátí hodnotu zadaného řetězcového prostředku.

GetString(String, CultureInfo)

Vrátí hodnotu řetězcového prostředku lokalizovaného pro zadanou jazykovou verzi.

GetType()

Type Získá aktuální instanci.

(Zděděno od Object)
InternalGetResourceSet(CultureInfo, Boolean, Boolean)

Poskytuje implementaci pro vyhledání sady prostředků.

MemberwiseClone()

Vytvoří použádnou kopii aktuálního souboru Object.

(Zděděno od Object)
ReleaseAllResources()

Řekne správci prostředků, aby volal metodu Close() pro všechny ResourceSet objekty a uvolnil všechny prostředky.

ToString()

Vrátí řetězec, který představuje aktuální objekt.

(Zděděno od Object)

Platí pro

Bezpečný přístup z více vláken

Tento typ je bezpečný pro přístup z více vláken.

Viz také