Suchen und Verwenden von Ressourcen für eine bestimmte Kultur

Die Common Language Runtime unterstützt den Abruf kulturspezifischer Ressourcen, die in Satellitenassemblys verpackt und bereitgestellt werden. Satellitenassemblys enthalten lediglich Ressourcendateien oder freie Ressourcen (z. B. GIF-Dateien). Sie enthalten keinen ausführbaren Code.

Im Satellitenassembly-Bereitstellungsmodell erstellen Sie eine Anwendung mit einer Standardassembly (der Hauptassembly) und verschiedenen Satellitenassemblys. Sie verpacken die Ressourcen für die neutrale bzw. Standardkultur mit der Hauptassembly und erstellen für jede durch die Anwendung unterstützte Sprache eine separate Satellitenassembly. Da die Satellitenassemblys kein Teil der Hauptassembly sind, können Sie die einer bestimmten Kultur entsprechenden Ressourcen problemlos ersetzen oder aktualisieren, ohne die Hauptassembly der Anwendung ersetzen zu müssen.

Beispiel: Wenn in einer einfachen Anwendung "Hello world" die neutrale bzw. Standardkultur "en" (Englisch) ist, können Sie eine Ressource Greeting erstellen und in einer einzelnen Zeichenfolge mit dem Namen HelloString speichern, die den Wert "Hello world" enthält. Sie müssen außerdem der AssemblyInfo-Datei der Anwendung oder einer der Quellcodedateien, die in die Hauptassembly der Anwendung kompiliert werden, das folgende System.Resources.NeutralResourcesLanguageAttribute-Attribut hinzufügen, um anzugeben dass "en" die Standardkultur der Anwendung ist.

<Assembly: NeutralResourcesLanguageAttribute("en")>

Anschließend fügen Sie der Anwendung die Unterstützung für zusätzliche Kulturen hinzu. Die Kulturen "en-US", "fr-FR" und "ru-RU" können z. B. wie folgt unterstützt werden:

  • Zum Unterstützen der Kultur "en-US" bzw. Englisch (USA) erstellen Sie eine Ressourcendatei mit dem Namen "Greeting.en-US.resx" und speichern diese Datei in einer einzelnen Zeichenfolge mit dem Namen HelloString und dem Wert "Hi world!".

  • Zum Unterstützen der Kultur "fr-FR" bzw. Französisch (Frankreich) Kultur erstellen Sie eine Ressourcendatei mit dem Namen "Greeting.fr-FR.resx" und speichern diese Datei in einer einzelnen Zeichenfolge mit dem Namen HelloString und dem Wert "Salut tout le monde!".

  • Zum Unterstützen der Kultur "ru-RU" bzw. Russisch (Russland) erstellen Sie eine Ressourcendatei mit dem Namen "Greeting.ru-RU.resx" und speichern diese Datei in einer einzelnen Zeichenfolge mit dem Namen HelloString und dem Wert "Всем привет!".

Die System.Resources.ResourceManager-Klasse stellt den Zugriff auf kulturspezifische Ressourcen zur Laufzeit bereit und steuert, wie die Anwendung mithilfe des Ressourcenfallback-Prozesses Ressourcen abruft. Weitere Informationen finden Sie im Abschnitt "Ressourcenfallback-Prozess" des Themas Verpacken und Bereitstellen von Ressourcen.

Das ResourceManager-Objekt legt anhand der CultureInfo.CurrentUICulture-Eigenschaft des aktuellen Threads fest, welche Ressourcen abgerufen werden. Wenn Sie beispielsweise eine Anwendung mit den Standardsprachressourcen Englisch in der Hauptassembly und mit Französisch (Frankreich) und Russisch (Russland) in zwei Satellitenassemblys kompiliert und die CurrentUICulture-Eigenschaft auf "fr-FR" festgelegt haben, ruft das ResourceManager-Objekt die französischen Ressourcen ab.

Die CurrentUICulture-Eigenschaft kann explizit oder implizit festgelegt werden. Die Art der Festlegung dieser Eigenschaft bestimmt, wie das ResourceManager-Objekt Ressourcen basierend auf der Kultur abruft:

  • Wenn die Anwendung die CurrentUICulture-Eigenschaft explizit auf eine bestimmte Kultur im Anwendungscode festlegt, wird dadurch gewährleistet, dass die Ressourcen für diese Kultur immer unabhängig von der Browser- oder Betriebssystemsprache des Benutzers abgerufen werden. Beispiel: Eine Anwendung wird mit Standardressourcen für Englisch und drei Satellitenassemblys mit Ressourcen für Englisch (USA), Französisch (Frankreich) und Russisch (Russland) kompiliert. Wenn die CurrentUICulture-Eigenschaft auf "fr-FR" festgelegt ist, ruft das ResourceManager-Objekt immer die Ressourcen für Französisch (Frankreich) ab, auch wenn der Benutzer eine andere Betriebssystemsprache verwendet. Stellen Sie sicher, dass dies dem gewünschten Verhalten entspricht, bevor Sie diese Eigenschaft explizit festlegen.

    Hinweis

    In ASP.NET-Anwendungen müssen Sie die CurrentUICulture-Eigenschaft explizit festlegen, da nicht zu erwarten ist, dass die Einstellung auf dem Server mit den eingehenden Clientanfragen übereinstimmt.Eine ASP.NET-Anwendung kann die CurrentUICulture-Eigenschaft explizit auf die vom Browser des Benutzers akzeptierte Sprache festlegen.

  • Wenn die CurrentUICulture-Eigenschaft nicht explizit von der Anwendung festgelegt wird, wird sie implizit von der GetUserDefaultUILanguage-Funktion in Windows 2000 und Windows XP festgelegt. Diese Funktion wird von der mehrsprachige Benutzeroberfläche (MUI, Multilanguage User Interface) bereitgestellt, die es dem Benutzer ermöglicht, die Standardsprache festzulegen. Wenn die Sprache der Benutzeroberfläche nicht vom Benutzer festgelegt wird, wird standardmäßig die Sprache der Systeminstallation verwendet, d. h. die Sprache der Ressourcen des Betriebssystems.

Im folgenden Beispiel wird die CurrentUICulture-Eigenschaft explizit festgelegt. Ein Array wird definiert, das die Namen der unterstützten Kulturen für die einfache Anwendung "Hello world" enthält. Anschließend wird willkürlich einer der Kulturnamen ausgewählt, mit diesem Namen das CultureInfo-Objekt instanziiert und diese Kultur als aktuelle Kultur des aktuellen Threads verwendet. Der Aufruf der MessageBox.Show-Methode (im C#-Beispiel) oder die Interaction.MsgBox-Funktion (im Visual Basic-Beispiel) zeigt dann die lokalisierte Zeichenfolge an, die der HelloString-Ressource zugewiesen ist.

Imports System.Globalization
Imports System.Resources
Imports System.Threading

Module Module1

   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

      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, My.Resources.Greetings.HelloString)

         MsgBox(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
using System;
using System.Globalization;
using System.Reflection;
using System.Resources;
using System.Threading;
using System.Windows.Forms;

class Program
{
   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;

      try {
         CultureInfo newCulture = new CultureInfo(cultures[cultureNdx]);
         Thread.CurrentThread.CurrentCulture = newCulture;
         Thread.CurrentThread.CurrentUICulture = newCulture;
         ResourceManager rm = new ResourceManager("LocatingCS1.Greetings", Assembly.GetExecutingAssembly()); 
         string greeting = String.Format("The current culture is {0}.\n{1}",
                                         Thread.CurrentThread.CurrentUICulture.Name,
                                         rm.GetString("HelloString"));

         MessageBox.Show(greeting);
      }
      catch (CultureNotFoundException e) {
         Console.WriteLine("Unable to instantiate culture {0}", e.InvalidCultureName);
      }
      finally {
         Thread.CurrentThread.CurrentCulture = originalCulture;
         Thread.CurrentThread.CurrentUICulture = originalCulture;
      }
   }
}

Siehe auch

Konzepte

Ressourcen in Anwendungen

Abrufen von Ressourcen in Satellitenassemblys

Resources in ASP.NET Applications

Weitere Ressourcen

Codierung und Lokalisierung

Änderungsprotokoll

Datum

Versionsgeschichte

Grund

Mai 2010

Gründlich überarbeitet.

Kundenfeedback.