Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Dieser Artikel enthält ergänzende Hinweise zur Referenzdokumentation für diese API.
Von Bedeutung
Das Aufrufen von Methoden aus dieser Klasse mit nicht vertrauenswürdigen Daten ist ein Sicherheitsrisiko. Rufen Sie die Methoden aus dieser Klasse nur mit vertrauenswürdigen Daten auf. Weitere Informationen finden Sie unter Überprüfen aller Eingaben.
Die ResourceManager-Klasse ruft Ressourcen aus einer binären .resources-Datei ab, die in eine Assembly eingebettet ist, oder aus einer eigenständigen .resources-Datei. Wenn eine App lokalisiert wurde und lokalisierte Ressourcen in Satellitenassemblys bereitgestellt wurden, sucht sie nach kulturspezifischen Ressourcen, bietet einen Rückgriff auf Ressourcen, wenn keine lokalisierte Ressource vorhanden ist, und unterstützt die Ressourcenserialisierung.
Desktop-Apps
Bei Desktop-Apps ruft die ResourceManager Klasse Ressourcen aus Binärressourcendateien (.resources) ab. In der Regel bettet ein Sprachcompiler oder der Assembly Linker (AL.exe) diese Ressourcendateien in eine Assembly ein. Sie können auch ein ResourceManager Objekt verwenden, um Ressourcen direkt aus einer RESSOURCENdatei abzurufen, die nicht in eine Assembly eingebettet ist, indem Sie die CreateFileBasedResourceManager Methode aufrufen.
Vorsicht
Wenn Sie eigenständige RESSOURCEN-Dateien in einer ASP.NET-App verwenden, wird die XCOPY-Bereitstellung aufgehoben, da die Ressourcen gesperrt bleiben, bis sie von der ReleaseAllResources Methode explizit freigegeben werden. Wenn Sie Ressourcen mit Ihren ASP.NET-Apps bereitstellen möchten, sollten Sie Ihre .resources-Dateien in Satellitenassemblys kompilieren.
In einer ressourcenbasierten App enthält eine RESSOURCENdatei die Ressourcen der Standardkultur, deren Ressourcen verwendet werden, wenn keine kulturspezifischen Ressourcen gefunden werden. Wenn die Standardkultur einer App beispielsweise Englisch (en) ist, werden die Englisch-Sprachressourcen verwendet, wenn lokalisierte Ressourcen für eine bestimmte Kultur nicht gefunden werden können, z. B. Englisch (Vereinigte Staaten) (en-US) oder Französisch (Frankreich) (fr-FR). In der Regel werden die Ressourcen für die Standardkultur in die Hauptassembly der App eingebettet, und Ressourcen für andere lokalisierte Kulturen werden in Satellitenassemblys eingebettet. Satelliten-Assemblies enthalten nur Ressourcen. Sie haben denselben Stammdateinamen wie die Haupt-Assembly und die Erweiterung .resources.dll. Für Apps, deren Assemblys nicht im globalen Assemblycache registriert sind, werden Satellitenassemblys in einem App-Unterverzeichnis gespeichert, dessen Name der Assemblykultur entspricht.
Erstellen von Ressourcen
Wenn Sie eine ressourcenbasierte App entwickeln, speichern Sie Ressourceninformationen in Textdateien (Dateien mit .txt- oder RESTEXT-Erweiterung) oder XML-Dateien (Dateien mit einer RESX-Erweiterung). Anschließend kompilieren Sie die Text- oder XML-Dateien mit dem Ressourcendatei-Generator (Resgen.exe), um eine Binärressourcendatei zu erstellen. Anschließend können Sie die resultierende .resources-Datei in eine ausführbare Datei oder Bibliothek einbetten, indem Sie eine Compileroption wie z.B. /resources
für die C#- und Visual Basic-Compiler verwenden, oder Sie können sie in eine Satellitenassembly einbetten, indem Sie den Assembly Linker (AI.exe) verwenden. Wenn Sie eine RESX-Datei in Ihr Visual Studio-Projekt einschließen, verarbeitet Visual Studio die Kompilierung und Einbettung von Standard- und lokalisierten Ressourcen automatisch als Teil des Buildprozesses.
Im Idealfall sollten Sie Ressourcen für jede sprache erstellen, die Ihre App unterstützt, oder zumindest für eine sinnvolle Teilmenge jeder Sprache. Die Dateinamen der binären .resources-Dateien folgen der Benennungskonvention Basisname.cultureName.resources, wobei Basisname der Name der App oder der Name einer Klasse ist, abhängig von der gewünschten Detailebene. Die CultureInfo.Name Eigenschaft wird verwendet, um cultureName zu bestimmen. Eine Ressource für die Standardkultur der App sollte den Namen "basename.resources" haben.
Angenommen, eine Assembly verfügt über mehrere Ressourcen in einer Ressourcendatei mit dem Basisnamen MyResources. Diese Ressourcendateien sollten Namen wie "MyResources.ja-JP.resources" für die japanische (Japan) Kultur, MyResources.de.resources für die deutsche Kultur, MyResources.zh-CHS.resources für die vereinfachte chinesische Kultur und MyResources.fr-BE.resources für die französische (belgische) Kultur aufweisen. Die Standardressourcendatei sollte den Namen "MyResources.resources" haben. Die gebietsschemaspezifischen Ressourcendateien sind in der Regel in Satelliten-Assemblies für jedes Gebietsschema gepackt. Die Standard-Ressourcendatei sollte in die Main-Assembly der App eingebettet werden.
Beachten Sie, dass Der Assemblylinker die Kennzeichnung von Ressourcen als privat zulässt. Sie sollten sie jedoch immer als öffentlich markieren, damit sie von anderen Assemblys aufgerufen werden können. (Da eine Satellitenassembly keinen Code enthält, sind Ressourcen, die als privat gekennzeichnet sind, für Ihre App über einen beliebigen Mechanismus nicht verfügbar.)
Weitere Informationen zum Erstellen, Verpacken und Bereitstellen von Ressourcen finden Sie in den Artikeln "Erstellen von Ressourcendateien", "Erstellen von Satellitenassemblys" und "Packaging" und "Deploying Resources".
Instanziieren eines ResourceManager-Objekts
Sie instanziieren ein ResourceManager-Objekt, das Ressourcen aus einer eingebetteten .resources-Datei abruft, indem Sie eine der Konstruktorüberladungen seiner Klasse aufrufen. Dadurch wird ein ResourceManager-Objekt eng mit einer bestimmten .resources-Datei und allen zugeordneten lokalisierten .resources-Dateien in Satellitenassemblys gekoppelt.
Die beiden am häufigsten aufgerufenen Konstruktoren sind:
ResourceManager(String, Assembly) Sucht Ressourcen basierend auf zwei von Ihnen bereitgestellten Informationen: dem Basisnamen der RESSOURCEN-Datei und der Assembly, in der sich die Standardressourcendatei befindet. Der Basisname enthält den Namespace und den Stammnamen der .resources-Datei, ohne deren Gebietsschema oder Erweiterung. Beachten Sie, dass Ressourcendateien, die aus der Befehlszeile kompiliert werden, in der Regel keinen Namespace-Namen enthalten, während Ressourcendateien, die in der Visual Studio-Umgebung erstellt werden, dies tun. Wenn beispielsweise eine Ressourcendatei den Namen "MyCompany.StringResources.resources" hat und der ResourceManager Konstruktor von einer statischen Methode mit dem Namen
Example.Main
aufgerufen wird, instanziiert der folgende Code ein ResourceManager Objekt, das Ressourcen aus der RESSOURCENdatei abrufen kann:ResourceManager rm = new ResourceManager("MyCompany.StringResources", typeof(Example).Assembly);
Dim rm As New ResourceManager("MyCompany.StringResources", GetType(Example2).Assembly)
ResourceManager(Type) sucht Ressourcen in Satelliten-Assemblies auf der Grundlage von Informationen aus einem Typobjekt. Der vollqualifizierte Name des Typs entspricht dem Basisnamen der Ressourcen-Datei ohne Dateinamenerweiterung. In Desktop-Apps, die mit dem Visual Studio-Ressourcen-Designer erstellt werden, erstellt Visual Studio eine Wrapperklasse, deren vollqualifizierter Name dem Stammnamen der RESSOURCEN-Datei entspricht. Wenn beispielsweise eine Ressourcendatei den Namen "MyCompany.StringResources.resources" hat und eine Wrapperklasse namens
MyCompany.StringResources
vorhanden ist, instanziiert der folgende Code ein ResourceManager-Objekt, das Ressourcen aus der Ressourcendatei abrufen kann.ResourceManager rm = new ResourceManager(typeof(MyCompany.StringResources));
Dim rm As New ResourceManager(GetType(MyCompany.StringResources))
Wenn die entsprechenden Ressourcen nicht gefunden werden können, erstellt der Konstruktoraufruf ein gültiges ResourceManager Objekt. Der Versuch, eine Ressource abzurufen, löst jedoch eine MissingManifestResourceException Ausnahme aus. Informationen zum Umgang mit der Ausnahme finden Sie im Abschnitt MissingManifestResourceException und MissingSatelliteAssemblyException Ausnahmen verarbeiten weiter unten in diesem Artikel.
Das folgende Beispiel zeigt, wie ein ResourceManager Objekt instanziieren. Er enthält den Quellcode für eine ausführbare Datei mit dem Namen ShowTime.exe. Sie enthält auch die folgende Textdatei namens Strings.txt, die eine einzelne Zeichenfolgenressource enthält: TimeHeader
TimeHeader=The current time is
Sie können eine Batchdatei verwenden, um die Ressourcendatei zu generieren und in die ausführbare Datei einzubetten. Dies ist die Batchdatei zum Generieren einer ausführbaren Datei mithilfe des C#-Compilers:
resgen strings.txt
csc ShowTime.cs /resource:strings.resources
Für den Visual Basic-Compiler können Sie die folgende Batchdatei verwenden:
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($"{timeString} {DateTime.Now:T}");
}
}
// 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 und kulturspezifische Ressourcen
Eine lokalisierte App erfordert, dass Ressourcen bereitgestellt werden, wie im Artikel "Packen und Bereitstellen von Ressourcen" beschrieben. Wenn die Assemblys ordnungsgemäß konfiguriert sind, bestimmt der Ressourcen-Manager, welche Ressourcen basierend auf der Eigenschaft des Thread.CurrentUICulture aktuellen Threads abgerufen werden sollen. (Diese Eigenschaft gibt auch die UI-Kultur des aktuellen Threads zurück.) Wenn eine App beispielsweise mit Den standardressourcen für englischen Sprachen in der Hauptassembly und mit Französisch- und Russisch-Sprachressourcen in zwei Satellitenassemblys kompiliert wird und die Thread.CurrentUICulture Eigenschaft auf fr-FRfestgelegt ist, ruft der Ressourcenmanager die französischen Ressourcen ab.
Sie können die CurrentUICulture Eigenschaft explizit oder implizit festlegen. Die Art und Weise, wie Sie das Set festlegen, bestimmt, wie das ResourceManager-Objekt Ressourcen auf der Grundlage des Gebietsschemas abruft:
Wenn Sie die Thread.CurrentUICulture Eigenschaft explizit auf eine bestimmte Kultur festlegen, ruft der Ressourcenmanager immer die Ressourcen für diese Kultur ab, unabhängig von der Browser- oder Betriebssystemsprache des Benutzers. Betrachten Sie eine App, die mit Standardressourcen für englischen Sprachen und drei Satellitenassemblys kompiliert wird, die Ressourcen für Englisch (USA), Französisch (Frankreich) und Russisch (Russland) enthalten. Wenn die CurrentUICulture Eigenschaft auf fr-FRfestgelegt ist, ruft das ResourceManager Objekt immer die Französisch -Ressourcen (Frankreich) ab, auch wenn die Betriebssystemsprache des Benutzers nicht französisch ist. Stellen Sie sicher, dass dies das gewünschte Verhalten ist, bevor Sie die Eigenschaft explizit festlegen.
In ASP.NET-Apps müssen Sie die Thread.CurrentUICulture-Eigenschaft explizit festlegen, da es unwahrscheinlich ist, dass die Einstellung auf dem Server mit den eingehenden Clientanforderungen übereinstimmt. Eine ASP.NET-App kann die Thread.CurrentUICulture Eigenschaft explizit auf die Browser-Akzeptiert-Sprache des Benutzers festlegen.
Durch das explizite Festlegen der Thread.CurrentUICulture Eigenschaft wird die aktuelle Benutzeroberflächenkultur für diesen Thread definiert. Sie wirkt sich nicht auf die aktuelle Ui-Kultur anderer Threads in einer App aus.
Sie können die Ui-Kultur aller Threads in einer App-Domäne festlegen, indem Sie ein CultureInfo Objekt zuweisen, das diese Kultur der statischen CultureInfo.DefaultThreadCurrentUICulture Eigenschaft darstellt.
Wenn Sie die aktuelle Benutzeroberflächenkultur nicht explizit festlegen und keine Standardkultur für die aktuelle App-Domäne definieren, wird die CultureInfo.CurrentUICulture Eigenschaft implizit von der Windows-Funktion
GetUserDefaultUILanguage
festgelegt. Diese Funktion wird von der Mehrsprachigen Benutzeroberfläche (Multilingual User Interface, MUI) bereitgestellt, mit der der Benutzer die Standardsprache festlegen kann. Wenn die Benutzeroberflächensprache nicht vom Benutzer festgelegt wird, wird standardmäßig die vom System installierte Sprache verwendet, bei der es sich um die Sprache der Betriebssystemressourcen handelt.
Im folgenden einfachen Beispiel für "Hello world" wird die aktuelle Ui-Kultur explizit festgelegt. Es enthält Ressourcen für drei Kulturen: Englisch (Vereinigte Staaten) oder en-US, Französisch (Frankreich) oder fr-FR, und Russisch (Russland) oder ru-RU. Die en-US Ressourcen sind in einer Textdatei namens Greetings.txtenthalten:
HelloString=Hello world!
Die fr-FR Ressourcen sind in einer Textdatei namens Greetings.fr-FR.txtenthalten:
HelloString=Salut tout le monde!
Die ru-RU Ressourcen sind in einer Textdatei namens Greetings.ru-RU.txtenthalten:
HelloString=Всем привет!
Hier sehen Sie den Quellcode für das Beispiel (Example.vb für die Visual Basic-Version oder Example.cs für die C#-Version):
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 {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.
' Всем привет!
Erstellen Sie zum Kompilieren dieses Beispiels eine Batchdatei (.bat), die die folgenden Befehle enthält, und führen Sie sie über die Eingabeaufforderung aus. Wenn Sie C# verwenden, geben Sie csc
anstelle von vbc
und Example.cs
anstelle von Example.vb
an.
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
Abrufen von Ressourcen
Sie rufen die Methoden GetObject(String) und GetString(String) auf, um auf eine bestimmte Ressource zuzugreifen. Sie können die GetStream(String) Methode auch aufrufen, um Ressourcen ohne Zeichenfolge als Bytearray abzurufen. In einer App, die über lokalisierte Ressourcen verfügt, geben diese Methoden standardmäßig die Ressource für das Gebietsschema zurück, die durch die aktuelle UI-Kultur des aufrufenden Threads bestimmt wird. Weitere Informationen dazu, wie die aktuelle UI-Kultur eines Threads definiert wird, finden Sie im vorherigen Abschnitt , ResourceManager und kulturspezifische Ressourcen. Wenn der Ressourcen-Manager die Ressource für die UI-Kultur des aktuellen Threads nicht finden kann, wird ein Fallbackprozess zum Abrufen der angegebenen Ressource verwendet. Wenn der Ressourcenmanager keine lokalisierten Ressourcen finden kann, verwendet er die Ressourcen der Standardkultur. Weitere Informationen zu Ressourcenfallbackregeln finden Sie im Abschnitt "Ressourcenfallbackprozess" des Artikels "Packen und Bereitstellen von Ressourcen".
Hinweis
Wenn die im ResourceManager Klassenkonstruktor angegebene Ressourcendatei nicht gefunden werden kann, führt der Versuch, eine Ressource abzurufen, zu einer Ausnahme der Typen MissingManifestResourceException oder MissingSatelliteAssemblyException. Informationen zum Umgang mit der Ausnahme finden Sie im Abschnitt MissingManifestResourceException und MissingSatelliteAssemblyException Ausnahmen verarbeiten weiter unten in diesem Artikel.
Im folgenden Beispiel wird die GetString Methode zum Abrufen kulturspezifischer Ressourcen verwendet. Es besteht aus Ressourcen, die aus .txt Dateien für die Kulturen Englisch (en), Französisch (Frankreich) (fr-FR) und Russisch (Russland) (ru-RU) kompiliert wurden. Das Beispiel ändert die aktuelle Kultur und die aktuelle Kultur der Benutzeroberfläche in Englisch (Vereinigte Staaten), Französisch (Frankreich), Russisch (Russland) und Schwedisch (Schweden). Anschließend wird die GetString Methode aufgerufen, um die lokalisierte Zeichenfolge abzurufen, die zusammen mit dem aktuellen Tag und dem aktuellen Monat angezeigt wird. Beachten Sie, dass die Ausgabe die entsprechende lokalisierte Zeichenfolge anzeigt, außer wenn die aktuelle UI-Kultur schwedisch (Schweden) ist. Da schwedische Sprachressourcen nicht verfügbar sind, verwendet die App stattdessen die Ressourcen der Standardkultur, die Englisch ist.
Für das Beispiel sind die textbasierten Ressourcendateien erforderlich, die in der folgenden Tabelle aufgeführt sind. Jede verfügt über eine einzelne Zeichenfolgenressource mit dem Namen DateStart
.
Kultur | Dateiname | Ressourcenname | Ressourcenwert |
---|---|---|---|
en-US | DateStrings.txt | DateStart |
Heute ist |
fr-FR | DateStrings.fr-FR.txt | DateStart |
Aujourd'hui, c'est le |
ru-RU | DateStrings.ru-RU.txt | DateStart |
Сегодня |
Hier sehen Sie den Quellcode für das Beispiel (ShowDate.vb für die Visual Basic-Version oder ShowDate.cs für die C#-Version des Codes).
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: {CultureInfo.CurrentUICulture.Name}");
string dateString = rm.GetString("DateStart");
Console.WriteLine($"{dateString} {DateTime.Now:M}.\n");
}
}
}
// 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.
Erstellen Sie zum Kompilieren dieses Beispiels eine Batchdatei, die die folgenden Befehle enthält, und führen Sie sie über die Eingabeaufforderung aus. Wenn Sie C# verwenden, geben Sie csc
anstelle von vbc
und showdate.cs
anstelle von showdate.vb
an.
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
Es gibt zwei Möglichkeiten zum Abrufen der Ressourcen einer anderen Kultur als der aktuellen Benutzeroberflächenkultur:
- Sie können die Methoden GetString(String, CultureInfo), GetObject(String, CultureInfo) oder GetStream(String, CultureInfo) aufrufen, um eine Ressource für eine spezifische Kultur abzurufen. Wenn eine lokalisierte Ressource nicht gefunden werden kann, verwendet der Ressourcenmanager den Ressourcenfallbackprozess, um eine entsprechende Ressource zu suchen.
- Sie können die GetResourceSet Methode aufrufen, um ein ResourceSet Objekt abzurufen, das die Ressourcen für eine bestimmte Kultur darstellt. Im Methodenaufruf können Sie ermitteln, ob der Ressourcen-Manager nach übergeordneten Kulturen sucht, wenn er keine lokalisierten Ressourcen findet, oder ob einfach auf die Ressourcen der Standardkultur zurückgegriffen wird. Anschließend können Sie mithilfe der ResourceSet Methoden auf die Ressourcen (lokalisiert für diese Kultur) anhand des Namens zugreifen oder die Ressourcen im Satz aufzählen.
Umgang mit MissingManifestResourceException und MissingSatelliteAssemblyException-Ausnahmen
Wenn Sie versuchen, eine bestimmte Ressource abzurufen, aber der Ressourcen-Manager diese Ressource nicht finden kann und entweder keine Standardkultur definiert wurde oder die Ressourcen der Standardkultur nicht gefunden werden können, löst der Ressourcenmanager eine MissingManifestResourceException Ausnahme aus, wenn erwartet wird, dass die Ressourcen in der Hauptassembly gefunden werden, oder wenn MissingSatelliteAssemblyException erwartet wird, dass die Ressourcen in einer Satellitenassembly gefunden werden. Beachten Sie, dass die Ausnahme ausgelöst wird, wenn Sie eine Methode zum Abrufen einer Ressource aufrufen, z GetString . B. oder GetObject, und nicht, wenn Sie ein ResourceManager Objekt instanziieren.
Die Ausnahme wird in der Regel unter den folgenden Bedingungen ausgelöst:
Die entsprechende Ressourcendatei oder Satellitenassembly ist nicht vorhanden. Wenn der Ressourcenmanager erwartet, dass die Standardressourcen der App in die Haupt-App-Assembly eingebettet werden, fehlen sie. Wenn das NeutralResourcesLanguageAttribute Attribut angibt, dass sich die Standardressourcen der App in einer Satellitenassembly befinden, kann diese Assembly nicht gefunden werden. Stellen Sie beim Kompilieren Der App sicher, dass Ressourcen in die Hauptassembly eingebettet sind oder dass die erforderliche Satellitenassembly generiert und entsprechend benannt wird. Der Name sollte das Format "appName ".resources.dllhaben, und er sollte sich in einem Verzeichnis befinden, das nach der Kultur benannt ist, deren Ressourcen es enthält.
Ihre App verfügt nicht über eine standard- oder neutrale Kultur. Fügen Sie das NeutralResourcesLanguageAttribute Attribut einer Quellcodedatei oder der Projektinformationsdatei (AssemblyInfo.vb für eine Visual Basic-App oder AssemblyInfo.cs für eine C#-App-Datei) hinzu.
Der
baseName
Parameter im ResourceManager(String, Assembly) Konstruktor gibt nicht den Namen einer RESSOURCEN-Datei an. Der Name sollte den vollqualifizierten Namespace der Ressourcendatei, aber nicht die Dateinamenerweiterung enthalten. In der Regel enthalten Ressourcendateien, die in Visual Studio erstellt werden, Namespacenamen. Ressourcendateien, die an der Eingabeaufforderung erstellt und kompiliert werden, enthalten diese jedoch nicht. Sie können die Namen eingebetteter RESSOURCEN-Dateien ermitteln, indem Sie das folgende Hilfsprogramm kompilieren und ausführen. Dies ist eine App für die Konsole, die den Namen einer Main Assembly oder einer Satellite Assembly als Kommandozeilenparameter akzeptiert. Es zeigt die Zeichenfolgen an, die alsbaseName
Parameter bereitgestellt werden sollen, damit der Ressourcenmanager die Ressource korrekt identifizieren kann.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($"{filename} does not exist."); return; } // Try to load the assembly. Assembly assem = Assembly.LoadFrom(filename); Console.WriteLine($"File: {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: {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
Wenn Sie die aktuelle Kultur Ihrer Anwendung explizit ändern, sollten Sie auch daran denken, dass der Ressourcen-Manager basierend auf dem Wert der CultureInfo.CurrentUICulture Eigenschaft und nicht der CultureInfo.CurrentCulture Eigenschaft einen Ressourcensatz abruft. Wenn Sie einen Wert ändern, sollten Sie in der Regel auch den anderen ändern.
Ressourcenversionsverwaltung
Da die Hauptassembly, die die Standardressourcen einer App enthält, von den Satellitenassemblys der App getrennt ist, können Sie eine neue Version der Hauptassembly freigeben, ohne die Satellitenassemblys erneut bereitzustellen. Sie verwenden das SatelliteContractVersionAttribute Attribut, um die vorhandenen Satellitenassemblys zu nutzen und den Ressourcen-Manager anzuweisen, sie nicht mit einer neuen Version der Hauptassembly erneut einzusetzen,
Weitere Informationen zur Versionsverwaltungsunterstützung für Satellitenassemblys finden Sie im Artikel "Ressourcen abrufen".
<Konfigurationsdateiknoten für Satellitenassemblies>
Hinweis
Dieser Abschnitt ist spezifisch für .NET Framework-Apps.
Bei ausführbaren Dateien, die über eine Website bereitgestellt und ausgeführt werden (HREF .exe-Dateien), kann das ResourceManager-Objekt über das Web nach Satellite-Assemblies abfragen, was die Leistung Ihrer App beeinträchtigen kann. Um das Leistungsproblem zu beseitigen, können Sie dieses Probes auf die Satelliten-Assemblies beschränken, die Sie mit Ihrer App bereitgestellt haben. Dazu erstellen Sie einen <satelliteassemblies>
Knoten in der Konfigurationsdatei Ihrer App, um anzugeben, dass Sie eine bestimmte Gruppe von Kulturen für Ihre App bereitgestellt haben, und dass das ResourceManager Objekt nicht versuchen sollte, eine Kultur zu untersuchen, die nicht in diesem Knoten aufgeführt ist.
Hinweis
Die bevorzugte Alternative zum Erstellen eines <satelliteassemblies>
Knotens ist die Verwendung der ClickOnce-Bereitstellungsmanifest-Funktion.
Erstellen Sie in der Konfigurationsdatei Ihrer App einen Abschnitt ähnlich dem folgenden:
<?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>
Bearbeiten Sie diese Konfigurationsinformationen wie folgt:
Geben Sie für jede Hauptassembly, die Sie bereitstellen, einen oder mehrere
<assembly>
Knoten an, wobei jeder Knoten einen vollqualifizierten Assemblynamen angibt. Geben Sie den Namen Ihrer Hauptassembly anstelle von MainAssemblyName an und spezifizieren Sie die AttributwerteVersion
,PublicKeyToken
undCulture
, die Ihrer Hauptassembly entsprechen.Geben Sie für das
Version
Attribut die Versionsnummer der Assembly an. Die erste Version Ihrer Assembly könnte beispielsweise die Versionsnummer 1.0.0.0 haben.Geben Sie für das
PublicKeyToken
Attribut das Schlüsselwortnull
an, wenn Sie die Assembly nicht mit einem starken Namen signiert haben, oder geben Sie ihr öffentliches Schlüsseltoken an, wenn Sie die Assembly signiert haben.Geben Sie für das
Culture
Attribut das Schlüsselwortneutral
an, mit dem die Hauptassembly festgelegt werden soll, und führen Sie dazu, dass die ResourceManager Klasse nur für die in den<culture>
Knoten aufgeführten Kulturen untersucht wird.Weitere Informationen über vollständig qualifizierte Assembly-Namen finden Sie im Artikel Assembly-Namen. Weitere Informationen zu assemblys mit starkem Namen finden Sie im Artikel "Erstellen und Verwenden von assemblys mit starkem Namen".
Geben Sie einen oder
<culture>
mehrere Knoten mit einem bestimmten Kulturnamen an, z. B. "fr-FR" oder einen neutralen Kulturnamen, z. B. "fr".
Wenn für eine Assembly, die nicht unter dem Knoten <satelliteassemblies>
aufgeführt ist, Ressourcen benötigt werden, wird mit der Klasse ResourceManager anhand der Standardregeln für die Suche nach Gebietsschemata nachgefragt.
Windows 8.x-Apps
Von Bedeutung
Obwohl die ResourceManager Klasse in Windows 8.x-Apps unterstützt wird, wird die Verwendung nicht empfohlen. Verwenden Sie diese Klasse nur, wenn Sie portable Klassenbibliotheksprojekte entwickeln, die mit Windows 8.x-Apps verwendet werden können. Um Ressourcen aus Windows 8.x-Apps abzurufen, verwenden Sie stattdessen die Windows.ApplicationModel.Resources.ResourceLoader-Klasse .
Bei Windows 8.x-Apps ruft die ResourceManager Klasse Ressourcen aus PRI-Dateien (Package Resource Index) ab. Eine einzelne PRI-Datei (die PRI-Datei des Anwendungspakets) enthält die Ressourcen sowohl für die Standardkultur als auch für alle lokalisierten Kulturen. Sie verwenden das MakePRI-Hilfsprogramm, um eine PRI-Datei aus einer oder mehreren Ressourcendateien zu erstellen, die sich im XML-Ressourcenformat (RESW) befinden. Für Ressourcen, die in einem Visual Studio-Projekt enthalten sind, verarbeitet Visual Studio den Prozess zum automatischen Erstellen und Verpacken der PRI-Datei. Anschließend können Sie mithilfe der .NET-Klasse ResourceManager auf die Ressourcen der App oder Bibliothek zugreifen.
Sie können ein ResourceManager Objekt für eine Windows 8.x-App auf die gleiche Weise instanziieren wie für eine Desktop-App.
Anschließend können Sie auf die Ressourcen für eine bestimmte Kultur zugreifen, indem Sie den Namen der Ressource übergeben, die an die GetString(String) Methode abgerufen werden soll. Standardmäßig gibt diese Methode die Ressource für das Gebietsschema zurück, die durch das aktuelle UI- Gebietsschema des aufrufenden Threads bestimmt wird. Sie können die Ressourcen für eine bestimmte Kultur auch abrufen, indem Sie den Namen der Ressource und ein CultureInfo Objekt übergeben, das die Kultur darstellt, deren Ressource an die GetString(String, CultureInfo) Methode abgerufen werden soll. Wenn die Ressource für die aktuelle Benutzeroberflächenkultur oder die angegebene Kultur nicht gefunden werden kann, verwendet der Ressourcen-Manager eine Fallbackliste für ui-Sprachen, um eine geeignete Ressource zu suchen.
Beispiele
Im folgenden Beispiel wird veranschaulicht, wie Sie eine explizite Kultur und die implizite aktuelle UI-Kultur verwenden, um Zeichenfolgenressourcen aus einer Hauptassembly und einer Satellitenassembly abzurufen. Weitere Informationen finden Sie im Abschnitt "Verzeichnisspeicherorte für Satellitenassemblys, die nicht im globalen Assemblycache installiert sind" im Thema "Erstellen von Satellitenassemblys" .
So führen Sie dieses Beispiel aus:
Erstellen Sie im App-Verzeichnis eine Datei mit dem Namen rmc.txt, die die folgenden Ressourcenzeichenfolgen enthält:
day=Friday year=2006 holiday="Cinco de Mayo"
Verwenden Sie den Ressourcendatei-Generator , um die Ressourcendatei rmc.resources aus der rmc.txt Eingabedatei wie folgt zu generieren:
resgen rmc.txt
Erstellen Sie ein Unterverzeichnis des App-Verzeichnisses, und nennen Sie es "es-MX". Dies ist der Gebietsschemaname der Satelliten Assembly, die Sie in den nächsten drei Schritten erstellen werden.
Erstellen Sie eine Datei namens rmc.es-MX.txt im verzeichnis es-MX, die die folgenden Ressourcenzeichenfolgen enthält:
day=Viernes year=2006 holiday="Cinco de Mayo"
Verwenden Sie den Ressourcendateigenerator, um die rmc.es-MX.resources-Ressourcendatei aus der rmc.es-MX.txt Eingabedatei wie folgt zu generieren:
resgen rmc.es-MX.txt
Gehen Sie davon aus, dass der Dateiname für dieses Beispiel rmc.vb oder rmc.cs ist. Kopieren Sie den folgenden Quellcode in eine Datei. Kompilieren Sie das Ganze und betten Sie die Haupt-Assembly-Ressourcendatei, rmc.resources, in die ausführbare Assembly ein. Wenn Sie den Visual Basic-Compiler verwenden, lautet die Syntax:
vbc rmc.vb /resource:rmc.resources
Die entsprechende Syntax für den C#-Compiler lautet:
csc /resource:rmc.resources rmc.cs
Verwenden Sie den Assemblylinker , um eine Satellitenassembly zu erstellen. Wenn der Basisname der App rmc ist, muss der Name der Satelliten Assembly rmc.resources.dll lauten. Die Satellitenassembly sollte im verzeichnis es-MX erstellt werden. Wenn es-MX das aktuelle Verzeichnis ist, verwenden Sie folgenden Befehl:
al /embed:rmc.es-MX.resources /c:es-MX /out:rmc.resources.dll
Führen Sie rmc.exe aus, um die eingebetteten Ressourcenzeichenfolgen abzurufen und anzuzeigen.
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.