System.Resources.ResourceManager – třída
Tento článek obsahuje doplňující poznámky k referenční dokumentaci pro toto rozhraní API.
Důležité
Volání metod z této třídy s nedůvěryhodnými daty představuje bezpečnostní riziko. Volejte metody z této třídy pouze s důvěryhodnými daty. Další informace naleznete 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 byly nasazeny v satelitních sestaveních, vyhledá prostředky specifické pro jazykovou verzi, poskytuje záložní prostředek v případě, že lokalizovaný prostředek neexistuje, a podporuje serializaci prostředků.
Desktopové aplikace
U desktopových aplikací třída ResourceManager 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 metoda explicitně nevyvolá ReleaseAllResources . Pokud chcete nasadit prostředky s aplikacemi ASP.NET, 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 nelze najít žá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 výchozí jazykové verze 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. U aplikací, jejichž sestavení nejsou registrována v globální mezipaměti sestavení, jsou satelitní sestavení uložena v podadresáři aplikace, jejíž název odpovídá jazykové verzi sestavení.
Vytvoření zdrojů
Při vývoji aplikace založené na prostředcích ukládáte informace o prostředcích do textových souborů (soubory s příponou .txt nebo .restext) nebo 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, například /resources
pro kompilátory jazyka C# a Visual Basic, nebo ho můžete vložit do satelitního sestavení pomocí linkeru sestavení (AI.exe). Pokud do projektu sady 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 slouží 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ů se základním názvem MyResources. Tyto soubory prostředků by měly mít názvy jako MyResources.ja-JP.resources pro japonskou (japonskou) kulturu, MyResources.de.resources pro německou kulturu, MyResources.zh-CHS.resources pro zjednodušenou čínštinu a MyResources.fr-BE.resources pro jazykovou verzi francouzštiny (Belgie). Výchozí soubor prostředků by měl mít název MyResources.resources. Soubory prostředků specifické pro jazykovou verzi jsou obvykle zabalené 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. Ten úzce páruje ResourceManager objekt s konkrétním souborem .resources a všemi přidruženými lokalizovanými soubory .resources v satelitních sestaveních.
Mezi dva nejčastěji označované konstruktory patří:
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í sady Visual Studio. Pokud je například soubor prostředků s názvem MyCompany.StringResources.resources a ResourceManager konstruktor je volán ze statické metody s názvem
Example.Main
, následující kód vytvoří instanci objektu ResourceManager , 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(Example2).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ů sady Visual Studio vytvoří Visual Studio třídu obálky, jejíž plně kvalifikovaný název je stejný jako kořenový název souboru .resources. Pokud je například soubor prostředků s názvem MyCompany.StringResources.resources a existuje obálková třída s názvem
MyCompany.StringResources
, následující kód vytvoří instanci objektu ResourceManager , 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í s výjimkou naleznete v části Handle MissingManifestResourceException a MissingSatelliteAssemblyException 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ředků 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 jazyka 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 ShowTimeEx
{
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 Example6
Public Sub Main()
Dim rm As New ResourceManager("Strings", GetType(Example6).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čuje, které prostředky se mají načíst na základě vlastnosti aktuálního Thread.CurrentUICulture vlákna. (Tato vlastnost také vrátí jazykovou verzi uživatelského rozhraní aktuálního vlákna.) Pokud je například aplikace zkompilová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 nastavení 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č nebo jazyk operačního systému uživatele. 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 (Francie) a ruštinu (Rusko). CurrentUICulture Pokud je vlastnost nastavena na fr-FR, ResourceManager objekt vždy načte prostředky francouzštiny (Francie), 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 by nastavení na serveru odpovídalo příchozím žádostem klienta. 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í žádného jiného vlákna 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 nastaví implicitně funkcí Systému Windows
GetUserDefaultUILanguage
. Tuto funkci poskytuje sada MUI (Multilingual User Interface) (MUI), která uživateli umožňuje nastavit výchozí jazyk. Pokud uživatel nenastavil jazyk uživatelského rozhraní, je výchozí 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čtinu (USA) nebo en-US, francouzštinu (Francie) nebo fr-FR a ruštinu (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ženy v textovém souboru s názvem Greetings.fr-FR.txt:
HelloString=Salut tout le monde!
Prostředky ru-RU jsou obsaženy v textovém souboru s názvem Greetings.ru-RU.txt:
HelloString=Всем привет!
Tady je zdrojový kód pro příklad (Example.vb pro verzi Jazyka Visual Basic 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 metody GetObject(String) pro GetString(String) přístup ke konkrétnímu prostředku. Můžete také volat metodu GetStream(String) pro načtení neřetězcových prostředků jako pole bajtů. Ve výchozím nastavení vrátí tyto metody v aplikaci, která má lokalizované prostředky, prostředek pro jazykovou verzi určenou aktuální jazykovou verzí uživatelského rozhraní vlákna, které provedlo volání. Další informace o tom, jak je definována aktuální jazyková verze uživatelského rozhraní vlákna, najdete v předchozí části ResourceManager a prostředky specifické pro jazykovou verzi jazykové verze jazyka. 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 pravidlech pro použití náhradních prostředků najdete v části Proces náhradního prostředku v článku Balení a nasazování prostředků.
Poznámka:
Pokud nelze najít soubor .resources zadaný v konstruktoru ResourceManager třídy, pokus o načtení prostředku vyvolá MissingManifestResourceException výjimku nebo MissingSatelliteAssemblyException výjimku. Informace o řešení s výjimkou naleznete v části Handle MissingManifestResourceException a MissingSatelliteAssemblyException Výjimky dále v tomto článku.
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ů 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 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ý má jeden řetězcový prostředek s názvem DateStart
.
Kultura | Název souboru | Název prostředku | Hodnota prostředku |
---|---|---|---|
cs | 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 verzi jazyka Visual Basic 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 ShowDateEx
{
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 Example5
Public Sub Main()
Dim cultureNames() As String = {"en-US", "fr-FR", "ru-RU", "sv-SE"}
Dim rm As New ResourceManager("DateStrings",
GetType(Example5).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 jiné jazykové verze než aktuální jazyková verze uživatelského rozhraní:
- Můžete volat , GetObject(String, CultureInfo)nebo GetStream(String, CultureInfo) metodu GetString(String, CultureInfo)načtení prostředku pro konkrétní jazykovou verzi. Pokud lokalizovaný prostředek nelze najít, správce prostředků k vyhledání příslušného prostředku použije záložní proces prostředku.
- Můžete volat metodu GetResourceSetResourceSet získat objekt, který představuje prostředky pro konkrétní jazykovou verzi. Ve volání metody můžete určit, jestli správce prostředků testuje nadřazené jazykové verze, pokud nedokáže najít lokalizované prostředky, nebo jestli 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ým 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 MissingManifestResourceException prostředků vyvolá 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čtení prostředku, například GetString nebo 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í, nelze toto sestavení najít. Při kompilaci aplikace se ujistěte, že jsou prostředky vloženy do hlavního sestavení nebo že se vygeneruje potřebné satelitní sestavení a správně se jmenuje. Jeho název by měl mít tvar 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 informačního souboru projektu (AssemblyInfo.vb pro soubor aplikace jazyka Visual Basic 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 sadě Visual Studio obvykle obsahují 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 zadat jakobaseName
parametr, aby správce prostředků mohl prostředek správně identifikovat.using System; using System.IO; using System.Reflection; public class Example0 { 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.
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 vydat novou verzi hlavního sestavení bez opětovného nasazení satelitních sestavení. Atribut použijete SatelliteContractVersionAttribute k použití 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í satelitních sestavení najdete v článku Načítání prostředků.
<uzel konfiguračního souboru satelliteassemblies>
Poznámka:
Tato část je specifická pro aplikace rozhraní .NET Framework.
U spustitelných souborů nasazených a spouštěných z webu (soubory HREF .exe) ResourceManager může objekt testovat satelitní sestavení přes web, což může poškodit výkon vaší aplikace. Chcete-li odstranit problém s výkonem, můžete toto sondování omezit na satelitní sestavení, která jste nasadili s aplikací. 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 daném uzlu.
Poznámka:
Upřednostňovanou alternativou <satelliteassemblies>
k vytvoření uzlu je použití funkce Manifestu nasazení ClickOnce.
V konfiguračním souboru 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 informace o konfiguraci 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 zadejteVersion
hodnoty ,PublicKeyToken
aCulture
atributy, které odpovídají hlavnímu sestavení.Version
Pro atribut zadejte číslo verze sestavení. Například první vydání sestavení může být číslo verze 1.0.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é pod <satelliteassemblies>
uzlem, ResourceManager testuje třídy pro jazykové verze pomocí standardních pravidel sondování.
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 .
U aplikací pro Windows 8.x třída ResourceManager načítá 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ů ve formátu XML (.resw). U prostředků zahrnutých v projektu sady Visual Studio zpracovává Visual Studio proces vytváření a balení souboru PRI automaticky. Potom můžete použít třídu .NET ResourceManager pro přístup k prostředkům aplikace nebo knihovny.
Objekt pro aplikaci pro Windows 8.x můžete vytvořit ResourceManager 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 metodě GetString(String) . Tato metoda ve výchozím nastavení vrátí prostředek pro jazykovou verzi určenou aktuální jazykovou verzí uživatelského rozhraní vlákna, které provedlo volání. 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ů k vyhledání vhodného prostředku použije záložní seznam jazyka uživatelského rozhraní.
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í v tématu Vytváření satelitních sestavení.
Spuštění tohoto příkladu:
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"
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
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.
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"
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
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. Potom ho zkompilujte a vložte do spustitelného sestavení soubor prostředků hlavního sestavení rmc.resources. Pokud používáte kompilátor jazyka Visual Basic, syntaxe je:
vbc rmc.vb /resource:rmc.resources
Odpovídající syntaxe kompilátoru jazyka C# je:
csc /resource:rmc.resources rmc.cs
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
Spuštěním rmc.exe získejte a zobrazte vložené řetězce prostředků.
using System; using System.Globalization; using System.Resources; class Example2 { 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 Example4 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(Example4).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.