Delen via


Resources ophalen in .NET-apps

Wanneer u met gelokaliseerde resources in .NET-apps werkt, moet u de resources in het ideale geval verpakken voor de standaard- of neutrale cultuur met de hoofdassembly en een afzonderlijke satellietassembly maken voor elke taal of cultuur die door uw app wordt ondersteund. U kunt vervolgens de ResourceManager klasse gebruiken zoals beschreven in de volgende sectie voor toegang tot benoemde resources. Als u ervoor kiest om uw resources niet in te sluiten in de hoofdassembly en satellietassembly's, kunt u ook rechtstreeks toegang krijgen tot binaire .resources-bestanden , zoals wordt beschreven in de sectie Resources ophalen uit .resources-bestanden verderop in dit artikel.

Resources ophalen uit assembly's

De ResourceManager klasse biedt toegang tot resources tijdens runtime. U gebruikt de ResourceManager.GetString methode om tekenreeksbronnen en de ResourceManager.GetObject of ResourceManager.GetStream methode op te halen om niet-tekenreeksbronnen op te halen. Elke methode heeft twee overbelastingen:

De resourcemanager gebruikt het terugvalproces voor resources om te bepalen hoe de app cultuurspecifieke resources ophaalt. Zie de sectie Resource Fallback Process in Package en deploy resources voor meer informatie. Zie de sectie 'Een ResourceManager-object instantiëren' in het ResourceManager klasseonderwerp voor meer informatie over het instantiëren van een ResourceManager object.

Voorbeeld van tekenreeksgegevens ophalen

In het volgende voorbeeld wordt de GetString(String) methode aangeroepen om de tekenreeksbronnen van de huidige UI-cultuur op te halen. Het bevat een neutrale tekenreeksresource voor de Engelse cultuur (Verenigde Staten) en gelokaliseerde bronnen voor de Franse (Frankrijk) en Russische (Rusland) culturen. De volgende Engelse resource (Verenigde Staten) bevindt zich in een bestand met de naam Strings.txt:

TimeHeader=The current time is

De Franse resource (Frankrijk) bevindt zich in een bestand met de naam Strings.fr-FR.txt:

TimeHeader=L'heure actuelle est

De Russische resource (Rusland) bevindt zich in een bestand met de naam Strings.ru-RU.txt:

TimeHeader=Текущее время —

De broncode voor dit voorbeeld, dat zich in een bestand bevindt met de naam GetString.cs voor de C#-versie van de code en GetString.vb voor de Visual Basic-versie, definieert een tekenreeksmatrix die de naam van vier culturen bevat: de drie culturen waarvoor resources beschikbaar zijn en de Spaanse cultuur (Spanje). Een lus die vijf keer willekeurig wordt uitgevoerd, selecteert een van deze culturen en wijst deze toe aan de Thread.CurrentCulture en CultureInfo.CurrentUICulture eigenschappen. Vervolgens wordt de GetString(String) methode aangeroepen om de gelokaliseerde tekenreeks op te halen, die samen met het tijdstip van de dag wordt weergegeven.

using System;
using System.Globalization;
using System.Resources;
using System.Threading;

[assembly: NeutralResourcesLanguageAttribute("en-US")]

public class Example
{
   public static void Main()
   {
      string[] cultureNames = { "en-US", "fr-FR", "ru-RU", "es-ES" };
      Random rnd = new Random();
      ResourceManager rm = new ResourceManager("Strings",
                               typeof(Example).Assembly);

      for (int ctr = 0; ctr <= cultureNames.Length; ctr++) {
         string cultureName = cultureNames[rnd.Next(0, cultureNames.Length)];
         CultureInfo culture = CultureInfo.CreateSpecificCulture(cultureName);
         Thread.CurrentThread.CurrentCulture = culture;
         Thread.CurrentThread.CurrentUICulture = culture;

         Console.WriteLine("Current culture: {0}", culture.NativeName);
         string timeString = rm.GetString("TimeHeader");
         Console.WriteLine("{0} {1:T}\n", timeString, DateTime.Now);
      }
   }
}
// The example displays output like the following:
//    Current culture: English (United States)
//    The current time is 9:34:18 AM
//
//    Current culture: Español (España, alfabetización internacional)
//    The current time is 9:34:18
//
//    Current culture: русский (Россия)
//    Текущее время — 9:34:18
//
//    Current culture: français (France)
//    L'heure actuelle est 09:34:18
//
//    Current culture: русский (Россия)
//    Текущее время — 9:34:18
Imports System.Globalization
Imports System.Resources
Imports System.Threading

<Assembly: NeutralResourcesLanguageAttribute("en-US")>

Module Example
    Public Sub Main()
        Dim cultureNames() As String = {"en-US", "fr-FR", "ru-RU", "es-ES"}
        Dim rnd As New Random()
        Dim rm As New ResourceManager("Strings", GetType(Example).Assembly)

        For ctr As Integer = 0 To cultureNames.Length
            Dim cultureName As String = cultureNames(rnd.Next(0, cultureNames.Length))
            Dim culture As CultureInfo = CultureInfo.CreateSpecificCulture(cultureName)
            Thread.CurrentThread.CurrentCulture = culture
            Thread.CurrentThread.CurrentUICulture = culture

            Console.WriteLine("Current culture: {0}", culture.NativeName)
            Dim timeString As String = rm.GetString("TimeHeader")
            Console.WriteLine("{0} {1:T}", timeString, Date.Now)
            Console.WriteLine()
        Next
    End Sub
End Module
' The example displays output similar to the following:
'    Current culture: English (United States)
'    The current time is 9:34:18 AM
'    
'    Current culture: Español (España, alfabetización internacional)
'    The current time is 9:34:18
'    
'    Current culture: русский (Россия)
'    Текущее время — 9:34:18
'    
'    Current culture: français (France)
'    L'heure actuelle est 09:34:18
'    
'    Current culture: русский (Россия)
'    Текущее время — 9:34:18

Het volgende batchbestand (.bat) compileert het voorbeeld en genereert satellietassembly's in de juiste mappen. De opdrachten zijn beschikbaar voor de C#-taal en -compiler. Voor Visual Basic wijzigt csc u in vbcen wijzigt u GetString.cs in GetString.vb.

resgen strings.txt
csc GetString.cs -resource:strings.resources

resgen strings.fr-FR.txt
md fr-FR
al -embed:strings.fr-FR.resources -culture:fr-FR -out:fr-FR\GetString.resources.dll

resgen strings.ru-RU.txt
md ru-RU
al -embed:strings.ru-RU.resources -culture:ru-RU -out:ru-RU\GetString.resources.dll

Wanneer de huidige UI-cultuur Spaans (Spanje) is, moet u er rekening mee houden dat in het voorbeeld Engelstalige bronnen worden weergegeven, omdat Spaanse taalbronnen niet beschikbaar zijn en Engels de standaardcultuur van het voorbeeld is.

Voorbeelden van objectgegevens ophalen

U kunt de GetObject en GetStream methoden gebruiken om objectgegevens op te halen. Dit omvat primitieve gegevenstypen, serialiseerbare objecten en objecten die zijn opgeslagen in binaire indeling (zoals afbeeldingen).

In het volgende voorbeeld wordt de GetStream(String) methode gebruikt om een bitmap op te halen die wordt gebruikt in het openingsspatvenster van een app. Met de volgende broncode in een bestand met de naam CreateResources.cs (voor C#) of CreateResources.vb (voor Visual Basic) wordt een RESX-bestand gegenereerd dat de geserialiseerde afbeelding bevat. In dit geval wordt de afbeelding geladen uit een bestand met de naam SplashScreen.jpg; u kunt de bestandsnaam wijzigen om uw eigen installatiekopieën te vervangen.

using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Resources;

public class Example
{
   public static void Main()
   {
      Bitmap bmp = new Bitmap(@".\SplashScreen.jpg");
      MemoryStream imageStream = new MemoryStream();
      bmp.Save(imageStream, ImageFormat.Jpeg);

      ResXResourceWriter writer = new ResXResourceWriter("AppResources.resx");
      writer.AddResource("SplashScreen", imageStream);
      writer.Generate();
      writer.Close();
   }
}
Imports System.Drawing
Imports System.Drawing.Imaging
Imports System.IO
Imports System.Resources

Module Example
    Public Sub Main()
        Dim bmp As New Bitmap(".\SplashScreen.jpg")
        Dim imageStream As New MemoryStream()
        bmp.Save(imageStream, ImageFormat.Jpeg)

        Dim writer As New ResXResourceWriter("AppResources.resx")
        writer.AddResource("SplashScreen", imageStream)
        writer.Generate()
        writer.Close()
    End Sub
End Module

Met de volgende code wordt de resource opgehaald en wordt de afbeelding weergegeven in een PictureBox besturingselement.

using System;
using System.Drawing;
using System.IO;
using System.Resources;
using System.Windows.Forms;

public class Example
{
   public static void Main()
   {
      ResourceManager rm = new ResourceManager("AppResources", typeof(Example).Assembly);
      Bitmap screen = (Bitmap) Image.FromStream(rm.GetStream("SplashScreen"));

      Form frm = new Form();
      frm.Size = new Size(300, 300);

      PictureBox pic = new PictureBox();
      pic.Bounds = frm.RestoreBounds;
      pic.BorderStyle = BorderStyle.Fixed3D;
      pic.Image = screen;
      pic.SizeMode = PictureBoxSizeMode.StretchImage;

      frm.Controls.Add(pic);
      pic.Anchor = AnchorStyles.Top | AnchorStyles.Bottom |
                   AnchorStyles.Left | AnchorStyles.Right;

      frm.ShowDialog();
   }
}
Imports System.Drawing
Imports System.IO
Imports System.Resources
Imports System.Windows.Forms

Module Example
    Public Sub Main()
        Dim rm As New ResourceManager("AppResources", GetType(Example).Assembly)
        Dim screen As Bitmap = CType(Image.FromStream(rm.GetStream("SplashScreen")), Bitmap)

        Dim frm As New Form()
        frm.Size = new Size(300, 300)

        Dim pic As New PictureBox()
        pic.Bounds = frm.RestoreBounds
        pic.BorderStyle = BorderStyle.Fixed3D
        pic.Image = screen
        pic.SizeMode = PictureBoxSizeMode.StretchImage

        frm.Controls.Add(pic)
        pic.Anchor = AnchorStyles.Top Or AnchorStyles.Bottom Or
                     AnchorStyles.Left Or AnchorStyles.Right

        frm.ShowDialog()
    End Sub
End Module

U kunt het volgende batchbestand gebruiken om het C#-voorbeeld te bouwen. Voor Visual Basic wijzigt csc u in vbcen wijzigt u de extensie van het broncodebestand in .vb.cs .

csc CreateResources.cs
CreateResources

resgen AppResources.resx

csc GetStream.cs -resource:AppResources.resources

In het volgende voorbeeld wordt de ResourceManager.GetObject(String) methode gebruikt om een aangepast object te deserialiseren. Het voorbeeld bevat een broncodebestand met de naam UIElements.cs (UIElements.vb voor Visual Basic) waarmee de volgende structuur met de naam wordt gedefinieerd PersonTable. Deze structuur is bedoeld om te worden gebruikt door een algemene tabelweergaveroutine waarmee de gelokaliseerde namen van tabelkolommen worden weergegeven. Houd er rekening mee dat de PersonTable structuur is gemarkeerd met het SerializableAttribute kenmerk.

using System;

[Serializable] public struct PersonTable
{
   public readonly int nColumns;
   public readonly string column1;
   public readonly string column2;
   public readonly string column3;
   public readonly int width1;
   public readonly int width2;
   public readonly int width3;

   public PersonTable(string column1, string column2, string column3,
                  int width1, int width2, int width3)
   {
      this.column1 = column1;
      this.column2 = column2;
      this.column3 = column3;
      this.width1 = width1;
      this.width2 = width2;
      this.width3 = width3;
      this.nColumns = typeof(PersonTable).GetFields().Length / 2;
   }
}
<Serializable> Public Structure PersonTable
    Public ReadOnly nColumns As Integer
    Public Readonly column1 As String
    Public ReadOnly column2 As String
    Public ReadOnly column3 As String
    Public ReadOnly width1 As Integer
    Public ReadOnly width2 As Integer
    Public ReadOnly width3 As Integer

    Public Sub New(column1 As String, column2 As String, column3 As String,
                   width1 As Integer, width2 As Integer, width3 As Integer)
        Me.column1 = column1
        Me.column2 = column2
        Me.column3 = column3
        Me.width1 = width1
        Me.width2 = width2
        Me.width3 = width3
        Me.nColumns = Me.GetType().GetFields().Count \ 2
    End Sub
End Structure

Met de volgende code van een bestand met de naam CreateResources.cs (CreateResources.vb voor Visual Basic) wordt een XML-resourcebestand met de naam UIResources.resx gemaakt waarin een tabeltitel en een PersonTable object worden opgeslagen dat informatie bevat voor een app die is gelokaliseerd voor de Engelse taal.

using System;
using System.Resources;

public class CreateResource
{
   public static void Main()
   {
      PersonTable table = new PersonTable("Name", "Employee Number",
                                          "Age", 30, 18, 5);
      ResXResourceWriter rr = new ResXResourceWriter(@".\UIResources.resx");
      rr.AddResource("TableName", "Employees of Acme Corporation");
      rr.AddResource("Employees", table);
      rr.Generate();
      rr.Close();
   }
}
Imports System.Resources

Module CreateResource
    Public Sub Main()
        Dim table As New PersonTable("Name", "Employee Number", "Age", 30, 18, 5)
        Dim rr As New ResXResourceWriter(".\UIResources.resx")
        rr.AddResource("TableName", "Employees of Acme Corporation")
        rr.AddResource("Employees", table)
        rr.Generate()
        rr.Close()
    End Sub
End Module

Met de volgende code in een broncodebestand met de naam GetObject.cs (GetObject.vb) worden de resources opgehaald en weergegeven in de console.

using System;
using System.Resources;

[assembly: NeutralResourcesLanguageAttribute("en")]

public class Example
{
   public static void Main()
   {
      string fmtString = String.Empty;
      ResourceManager rm = new ResourceManager("UIResources", typeof(Example).Assembly);
      string title = rm.GetString("TableName");
      PersonTable tableInfo = (PersonTable) rm.GetObject("Employees");

      if (! String.IsNullOrEmpty(title)) {
         fmtString = "{0," + ((Console.WindowWidth + title.Length) / 2).ToString() + "}";
         Console.WriteLine(fmtString, title);
         Console.WriteLine();
      }

      for (int ctr = 1; ctr <= tableInfo.nColumns; ctr++) {
         string columnName = "column"  + ctr.ToString();
         string widthName = "width" + ctr.ToString();
         string value = tableInfo.GetType().GetField(columnName).GetValue(tableInfo).ToString();
         int width = (int) tableInfo.GetType().GetField(widthName).GetValue(tableInfo);
         fmtString = "{0,-" + width.ToString() + "}";
         Console.Write(fmtString, value);
      }
      Console.WriteLine();
   }
}
Imports System.Resources

<Assembly: NeutralResourcesLanguageAttribute("en")>

Module Example
    Public Sub Main()
        Dim fmtString As String = String.Empty
        Dim rm As New ResourceManager("UIResources", GetType(Example).Assembly)
        Dim title As String = rm.GetString("TableName")
        Dim tableInfo As PersonTable = DirectCast(rm.GetObject("Employees"), PersonTable)

        If Not String.IsNullOrEmpty(title) Then
            fmtString = "{0," + ((Console.WindowWidth + title.Length) \ 2).ToString() + "}"
            Console.WriteLine(fmtString, title)
            Console.WriteLine()
        End If

        For ctr As Integer = 1 To tableInfo.nColumns
            Dim columnName As String = "column" + ctr.ToString()
            Dim widthName As String = "width" + ctr.ToString()
            Dim value As String = CStr(tableInfo.GetType().GetField(columnName).GetValue(tableInfo))
            Dim width As Integer = CInt(tableInfo.GetType().GetField(widthName).GetValue(tableInfo))
            fmtString = "{0,-" + width.ToString() + "}"
            Console.Write(fmtString, value)
        Next
        Console.WriteLine()
    End Sub
End Module

U kunt het benodigde resourcebestand en de benodigde assembly's bouwen en de app uitvoeren door het volgende batchbestand uit te voeren. U moet de /r optie gebruiken om Resgen.exe op te geven met een verwijzing naar UIElements.dll, zodat deze toegang heeft tot informatie over de PersonTable structuur. Als u C# gebruikt, vervangt u de naam van de vbc compiler door cscen vervangt u de .vb extensie door .cs.

vbc -t:library UIElements.vb
vbc CreateResources.vb -r:UIElements.dll
CreateResources

resgen UIResources.resx  -r:UIElements.dll
vbc GetObject.vb -r:UIElements.dll -resource:UIResources.resources

GetObject.exe

Versieondersteuning voor satellietassembly's

Wanneer het ResourceManager object aangevraagde resources ophaalt, zoekt het standaard naar satellietassembly's met versienummers die overeenkomen met het versienummer van de hoofdassembly. Nadat u een app hebt geïmplementeerd, wilt u mogelijk de hoofdassembly of specifieke resourcesatellietassembly's bijwerken. Het .NET Framework biedt ondersteuning voor het versiebeheer van de hoofdassembly en satellietassembly's.

Het SatelliteContractVersionAttribute kenmerk biedt versiebeheerondersteuning voor een hoofdassembly. Als u dit kenmerk opgeeft in de hoofdassembly van een app, kunt u een hoofdassembly bijwerken en opnieuw implementeren zonder de bijbehorende satellietassembly's bij te werken. Nadat u de hoofdassembly hebt bijgewerkt, moet u het versienummer van de hoofdassembly verhogen, maar het versienummer van het satellietcontract ongewijzigd laten. Wanneer de resourcemanager aangevraagde resources ophaalt, wordt de door dit kenmerk opgegeven versie van de satellietassembly geladen.

Publisher-beleidsassembly's bieden ondersteuning voor het versiebeheer van satellietassembly's. U kunt een satellietassembly bijwerken en opnieuw implementeren zonder de hoofdassembly bij te werken. Nadat u een satellietassembly hebt bijgewerkt, kunt u het versienummer verhogen en verzenden met een uitgeversbeleidsassembly. Geef in de uitgeversbeleidsassembly op dat uw nieuwe satellietassembly compatibel is met de vorige versie. De resourcemanager gebruikt het SatelliteContractVersionAttribute kenmerk om de versie van de satellietassembly te bepalen, maar de assemblylader verbindt zich met de versie van de satellietassembly die is opgegeven door het uitgeversbeleid. Zie Een uitgeversbeleidsbestand maken voor meer informatie over assembly's voor uitgeversbeleid.

Als u ondersteuning voor volledige assemblyversiebeheer wilt inschakelen, raden we u aan om sterk benoemde assembly's te implementeren in de globale assemblycache en assembly's te implementeren die geen sterke namen hebben in de toepassingsmap. Als u sterk benoemde assembly's wilt implementeren in de toepassingsmap, kunt u het versienummer van een satellietassembly niet verhogen wanneer u de assembly bijwerkt. In plaats daarvan moet u een in-place update uitvoeren waarbij u de bestaande code vervangt door de bijgewerkte code en hetzelfde versienummer onderhoudt. Als u bijvoorbeeld versie 1.0.0.0 van een satellietassembly wilt bijwerken met de volledig opgegeven assemblynaam 'myApp.resources, Version=1.0.0.0, Culture=de, PublicKeyToken=b03f5f11d50a3a", overschrijf het met de bijgewerkte myApp.resources.dll die is gecompileerd met dezelfde, volledig opgegeven assemblynaam "myApp.resources, Version=1.0.0.0, Culture=de, PublicKeyToken=b03f5f11d50a3a". Houd er rekening mee dat het gebruik van in-place updates op satellietassemblybestanden het moeilijk maakt voor een app om de versie van een satellietassembly nauwkeurig te bepalen.

Zie Assembly-versiebeheer en hoe de runtime assembly's zoekt voor meer informatie over assemblyversiebeheer.

Resources ophalen uit .resources-bestanden

Als u ervoor kiest geen resources in satellietassembly's te implementeren, kunt u nog steeds een ResourceManager object gebruiken om rechtstreeks toegang te krijgen tot resources vanuit .resources-bestanden. Hiervoor moet u de .resources-bestanden correct implementeren. Vervolgens gebruikt u de ResourceManager.CreateFileBasedResourceManager methode om een ResourceManager object te instantiëren en de map op te geven die de zelfstandige .resources-bestanden bevat.

.resources-bestanden implementeren

Wanneer u .resources-bestanden insluit in een toepassingsassembly en satellietassembly's, heeft elke satellietassembly dezelfde bestandsnaam, maar wordt deze in een submap geplaatst die de cultuur van de satellietassembly weerspiegelt. Als u daarentegen rechtstreeks toegang hebt tot resources vanuit .resources-bestanden, kunt u alle .resources-bestanden in één map plaatsen, meestal een submap van de toepassingsmap. De naam van het standaard .resources-bestand van de app bestaat alleen uit een hoofdnaam, zonder indicatie van de cultuur (bijvoorbeeld strings.resources). De resources voor elke gelokaliseerde cultuur worden opgeslagen in een bestand waarvan de naam bestaat uit de hoofdnaam gevolgd door de cultuur (bijvoorbeeld strings.ja.resources of strings.de-DE.resources).

In de volgende afbeelding ziet u waar resourcebestanden zich in de mapstructuur moeten bevinden. Het biedt ook de naamconventies voor .resourcebestanden.

Afbeelding van de hoofdmap voor uw toepassing.

Resource Manager gebruiken

Nadat u uw resources hebt gemaakt en deze in de juiste map hebt geplaatst, maakt u een ResourceManager object om de resources te gebruiken door de CreateFileBasedResourceManager(String, String, Type) methode aan te roepen. De eerste parameter geeft de hoofdnaam van het standaard .resources-bestand van de app op (dit zijn 'tekenreeksen' voor het voorbeeld in de vorige sectie). De tweede parameter specificeert de locatie van de resources ('Resources' voor het vorige voorbeeld). Met de derde parameter geeft u de ResourceSet implementatie op die moet worden gebruikt. Als de derde parameter is null, wordt de standaardruntime ResourceSet gebruikt.

Notitie

Implementeer geen ASP.NET-apps met zelfstandige .resources-bestanden. Dit kan leiden tot vergrendelingsproblemen en breekt de XCOPY-implementatie. U wordt aangeraden ASP.NET resources in satellietassembly's te implementeren. Zie ASP.NET Overzicht van webpaginaresources voor meer informatie.

Nadat u het ResourceManager object hebt geïnstitueerd, gebruikt u het GetString, GetObjecten GetStream de methoden die eerder zijn besproken om de resources op te halen. Het ophalen van resources rechtstreeks vanuit .resources-bestanden verschilt echter van het ophalen van ingesloten resources uit assembly's. Wanneer u resources ophaalt uit .resources-bestanden, worden de GetString(String), GetObject(String)en GetStream(String) methoden altijd opgehaald uit de resources van de standaardcultuur, ongeacht de huidige cultuur. Als u de resources van de huidige cultuur of een specifieke cultuur van de app wilt ophalen, moet u de GetString(String, CultureInfo), GetObject(String, CultureInfo)of GetStream(String, CultureInfo) methode aanroepen en de cultuur opgeven waarvan de resources moeten worden opgehaald. Als u de resources van de huidige cultuur wilt ophalen, geeft u de waarde van de CultureInfo.CurrentCulture eigenschap op als het culture argument. Als resourcemanager de resources cultureniet kan ophalen, worden de standaardregels voor terugvalregels voor resources gebruikt om de juiste resources op te halen.

Een voorbeeld

In het volgende voorbeeld ziet u hoe Resource Manager resources rechtstreeks ophaalt uit .resources-bestanden. Het voorbeeld bestaat uit drie op tekst gebaseerde bronbestanden voor de Engelse culturen (Verenigde Staten), Frans (Frankrijk) en Russisch (Rusland). Engels (Verenigde Staten) is de standaardcultuur van het voorbeeld. De resources worden opgeslagen in het volgende bestand met de naam Strings.txt:

Greeting=Hello
Prompt=What is your name?

Resources voor de Franse cultuur (Frankrijk) worden opgeslagen in het volgende bestand, met de naam Strings.fr-FR.txt:

Greeting=Bon jour
Prompt=Comment vous appelez-vous?

Resources voor de Russische cultuur (Rusland) worden opgeslagen in het volgende bestand, dat de naam Strings.ru-RU.txt heeft:

Greeting=Здравствуйте
Prompt=Как вас зовут?

Hier volgt de broncode voor het voorbeeld. In het voorbeeld worden objecten geïnstitueerd CultureInfo voor de Engelse culturen (Verenigde Staten), Engels (Canada), Frans (Frankrijk) en Russisch (Rusland), en wordt elke huidige cultuur gemaakt. De ResourceManager.GetString(String, CultureInfo) methode levert vervolgens de waarde van de CultureInfo.CurrentCulture eigenschap als het culture argument om de juiste cultuurspecifieke resources op te halen.

using System;
using System.Globalization;
using System.Resources;
using System.Threading;

[assembly: NeutralResourcesLanguage("en-US")]

public class Example
{
   public static void Main()
   {
      string[] cultureNames = { "en-US", "en-CA", "ru-RU", "fr-FR" };
      ResourceManager rm = ResourceManager.CreateFileBasedResourceManager("Strings", "Resources", null);

      foreach (var cultureName in cultureNames) {
         Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(cultureName);
         string greeting = rm.GetString("Greeting", CultureInfo.CurrentCulture);
         Console.WriteLine("\n{0}!", greeting);
         Console.Write(rm.GetString("Prompt", CultureInfo.CurrentCulture));
         string name = Console.ReadLine();
         if (! String.IsNullOrEmpty(name))
            Console.WriteLine("{0}, {1}!", greeting, name);
      }
      Console.WriteLine();
   }
}
// The example displays output like the following:
//       Hello!
//       What is your name? Dakota
//       Hello, Dakota!
//
//       Hello!
//       What is your name? Koani
//       Hello, Koani!
//
//       Здравствуйте!
//       Как вас зовут?Samuel
//       Здравствуйте, Samuel!
//
//       Bon jour!
//       Comment vous appelez-vous?Yiska
//       Bon jour, Yiska!
Imports System.Globalization
Imports System.Resources
Imports System.Threading

<Assembly: NeutralResourcesLanguageAttribute("en-US")>

Module Example
    Public Sub Main()
        Dim cultureNames() As String = {"en-US", "en-CA", "ru-RU", "fr-FR"}
        Dim rm As ResourceManager = ResourceManager.CreateFileBasedResourceManager("Strings", "Resources", Nothing)

        For Each cultureName In cultureNames
            Console.WriteLine()
            Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(cultureName)
            Dim greeting As String = rm.GetString("Greeting", CultureInfo.CurrentCulture)
            Console.WriteLine("{0}!", greeting)
            Console.Write(rm.GetString("Prompt", CultureInfo.CurrentCulture))
            Dim name As String = Console.ReadLine()
            If Not String.IsNullOrEmpty(name) Then
                Console.WriteLine("{0}, {1}!", greeting, name)
            End If
        Next
        Console.WriteLine()
    End Sub
End Module
' The example displays output like the following:
'       Hello!
'       What is your name? Dakota
'       Hello, Dakota!
'       
'       Hello!
'       What is your name? Koani
'       Hello, Koani!
'       
'       Здравствуйте!
'       Как вас зовут?Samuel
'       Здравствуйте, Samuel!
'       
'       Bon jour!
'       Comment vous appelez-vous?Yiska
'       Bon jour, Yiska!

U kunt de C#-versie van het voorbeeld compileren door het volgende batchbestand uit te voeren. Als u Visual Basic gebruikt, vervangt u deze door vbccsc en vervangt u de .cs extensie door .vb.

md Resources
resgen Strings.txt Resources\Strings.resources
resgen Strings.fr-FR.txt Resources\Strings.fr-FR.resources
resgen Strings.ru-RU.txt Resources\Strings.ru-RU.resources

csc Example.cs

Zie ook