Dela via


Hämta resurser i .NET-appar

När du arbetar med lokaliserade resurser i .NET-appar bör du helst paketera resurserna för standardkulturen eller neutralkulturen med huvudsammansättningen och skapa en separat satellitsammansättning för varje språk eller kultur som appen stöder. Du kan sedan använda ResourceManager klassen enligt beskrivningen i nästa avsnitt för att få åtkomst till namngivna resurser. Om du väljer att inte bädda in dina resurser i huvudsammansättningen och satellitsammansättningarna kan du också komma åt binära .resources-filer direkt, enligt beskrivningen i avsnittet Hämta resurser från .resources-filer senare i den här artikeln.

Hämta resurser från sammansättningar

Klassen ResourceManager ger åtkomst till resurser vid körning. Du använder ResourceManager.GetString metoden för att hämta strängresurser och ResourceManager.GetObject -metoden eller ResourceManager.GetStream för att hämta icke-strängresurser. Varje metod har två överlagringar:

Resurshanteraren använder återställningsprocessen för resurser för att styra hur appen hämtar kulturspecifika resurser. Mer information finns i avsnittet "Resursåterställningsprocess" i Paketera och distribuera resurser. Information om hur du instansierar ett ResourceManager objekt finns i avsnittet "Instansiera ett ResourceManager-objekt" i klassavsnittet ResourceManager .

Hämta strängdataexempel

I följande exempel anropas GetString(String) metoden för att hämta strängresurserna i den aktuella användargränssnittskulturen. Den innehåller en neutral strängresurs för den engelska (USA) kulturen och lokaliserade resurser för de franska (Frankrike) och ryska (Ryssland) kulturerna. Följande engelska resurs (USA) finns i en fil med namnet Strings.txt:

TimeHeader=The current time is

Den franska resursen (Frankrike) finns i en fil med namnet Strings.fr-FR.txt:

TimeHeader=L'heure actuelle est

Den ryska resursen (Ryssland) finns i en fil med namnet Strings.ru-RU.txt:

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

Källkoden för det här exemplet, som finns i en fil med namnet GetString.cs för C#-versionen av koden och GetString.vb för Visual Basic-versionen, definierar en strängmatris som innehåller namnet på fyra kulturer: de tre kulturer för vilka resurser är tillgängliga och den spanska kulturen (Spanien). En loop som körs fem gånger slumpmässigt väljer en av dessa kulturer och tilldelar den till Thread.CurrentCulture egenskaperna och CultureInfo.CurrentUICulture . Sedan anropas GetString(String) metoden för att hämta den lokaliserade strängen, som visas tillsammans med tiden på dagen.

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

Följande batchfil (.bat) kompilerar exemplet och genererar satellitsammansättningar i lämpliga kataloger. Kommandona tillhandahålls för C#-språket och kompilatorn. För Visual Basic ändrar du csc till vbcoch ändrar GetString.cs till 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

När den aktuella användargränssnittskulturen är spanska (Spanien) bör du observera att exemplet visar engelska språkresurser, eftersom spanska språkresurser inte är tillgängliga och engelska är exemplets standardkultur.

Hämta objektdataexempel

Du kan använda GetObject metoderna och GetStream för att hämta objektdata. Detta omfattar primitiva datatyper, serialiserbara objekt och objekt som lagras i binärt format (till exempel bilder).

I följande exempel används GetStream(String) metoden för att hämta en bitmapp som används i en apps inledande välkomstfönster. Följande källkod i en fil med namnet CreateResources.cs (för C#) eller CreateResources.vb (för Visual Basic) genererar en .resx-fil som innehåller den serialiserade avbildningen. I det här fallet läses avbildningen in från en fil med namnet SplashScreen.jpg; du kan ändra filnamnet för att ersätta din egen avbildning.

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

Följande kod hämtar resursen och visar bilden i en PictureBox kontroll.

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

Du kan använda följande batchfil för att skapa C#-exemplet. För Visual Basic ändrar du csc till vbcoch ändrar tillägget för källkodsfilen från .cs till .vb.

csc CreateResources.cs
CreateResources

resgen AppResources.resx

csc GetStream.cs -resource:AppResources.resources

I följande exempel används ResourceManager.GetObject(String) metoden för att deserialisera ett anpassat objekt. Exemplet innehåller en källkodsfil med namnet UIElements.cs (UIElements.vb för Visual Basic) som definierar följande struktur med namnet PersonTable. Den här strukturen är avsedd att användas av en allmän tabellvisningsrutin som visar de lokaliserade namnen på tabellkolumner. Observera att PersonTable strukturen är markerad med attributet SerializableAttribute .

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

Följande kod från en fil med namnet CreateResources.cs (CreateResources.vb för Visual Basic) skapar en XML-resursfil med namnet UIResources.resx som lagrar en tabellrubrik och ett PersonTable objekt som innehåller information för en app som är lokaliserad för det engelska språket.

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

Följande kod i en källkodsfil med namnet GetObject.cs (GetObject.vb) hämtar sedan resurserna och visar dem i konsolen.

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

Du kan skapa den nödvändiga resursfilen och sammansättningarna och köra appen genom att köra följande batchfil. Du måste använda /r alternativet för att ange Resgen.exe med en referens till UIElements.dll så att den kan komma åt information om PersonTable strukturen. Om du använder C# ersätter vbc du kompilatorns namn med cscoch ersätter .vb tillägget med .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

Versionsstöd för satellitsammansättningar

När objektet hämtar begärda resurser letar det som standard ResourceManager efter satellitsammansättningar som har versionsnummer som matchar huvudsammansättningens versionsnummer. När du har distribuerat en app kanske du vill uppdatera huvudsammansättningen eller specifika resurssatellitsammansättningar. .NET Framework har stöd för versionshantering av huvudmonteringen och satellitsammansättningar.

Attributet SatelliteContractVersionAttribute ger versionsstöd för en huvudsammansättning. Om du anger det här attributet i en apps huvudsammansättning kan du uppdatera och distribuera om en huvuduppsättning utan att uppdatera dess satellitsammansättningar. När du har uppdaterat huvudsammansättningen ökar du huvudsammansättningens versionsnummer men lämnar versionsnumret för satellitkontraktet oförändrat. När resurshanteraren hämtar begärda resurser läser den in den satellitsammansättningsversion som anges av det här attributet.

Förlagsprincipsammansättningar ger stöd för versionshantering av satellitsammansättningar. Du kan uppdatera och distribuera om en satellitsammansättning utan att uppdatera huvudsammansättningen. När du har uppdaterat en satellitsammansättning ökar du versionsnumret och skickar det med en principsammansättning för utgivare. I sammansättningen för utgivarprincip anger du att den nya satellitsammansättningen är bakåtkompatibel med den tidigare versionen. Resurshanteraren använder SatelliteContractVersionAttribute attributet för att fastställa versionen av satellitsammansättningen, men sammansättningsinläsaren binder till den satellitsammansättningsversion som anges av utgivarprincipen. Mer information om sammansättningar av utgivarprinciper finns i Skapa en principfil för utgivare.

Om du vill aktivera stöd för fullständig sammansättningsversion rekommenderar vi att du distribuerar starka namngivna sammansättningar i den globala sammansättningscachen och distribuerar sammansättningar som inte har starka namn i programkatalogen. Om du vill distribuera starka namngivna sammansättningar i programkatalogen kan du inte öka en satellitsammansättnings versionsnummer när du uppdaterar sammansättningen. I stället måste du utföra en uppdatering på plats där du ersätter den befintliga koden med den uppdaterade koden och behåller samma versionsnummer. Om du till exempel vill uppdatera version 1.0.0.0 av en satellitsammansättning med det fullständigt angivna sammansättningsnamnet "myApp.resources, Version=1.0.0.0, Culture=de, PublicKeyToken=b03f5f11d50a3a", skriver över den med den uppdaterade myApp.resources.dll som har kompilerats med samma, fullständigt angivna sammansättningsnamn "myApp.resources, Version=1.0.0.0, Culture=de, PublicKeyToken=b03f5f11d50a3a". Observera att användning av uppdateringar på plats i satellitsammansättningsfiler gör det svårt för en app att korrekt fastställa versionen av en satellitsammansättning.

Mer information om versionshantering för sammansättning finns i Versionshantering för sammansättning och Hur Runtime hittar sammansättningar.

Hämta resurser från .resources Files

Om du väljer att inte distribuera resurser i satellitsammansättningar kan du fortfarande använda ett ResourceManager objekt för att komma åt resurser från .resources-filer direkt. Om du vill göra detta måste du distribuera .resources-filerna korrekt. Sedan använder ResourceManager.CreateFileBasedResourceManager du metoden för att instansiera ett ResourceManager objekt och ange den katalog som innehåller de fristående .resources-filerna.

Distribuera .resources Files

När du bäddar in .resources-filer i en programsammansättning och satellitsammansättningar har varje satellitsammansättning samma filnamn, men placeras i en underkatalog som återspeglar satellitsammansättningens kultur. När du däremot kommer åt resurser från .resources-filer direkt kan du placera alla .resources-filer i en enda katalog, vanligtvis en underkatalog i programkatalogen. Namnet på appens standardfil för .resources består endast av ett rotnamn, utan någon indikation på dess kultur (till exempel strings.resources). Resurserna för varje lokaliserad kultur lagras i en fil vars namn består av rotnamnet följt av kulturen (till exempel strings.ja.resources eller strings.de-DE.resources).

Följande bild visar var resursfiler ska finnas i katalogstrukturen. Det ger också namngivningskonventionerna för .resource-filer.

Bild som visar huvudkatalogen för ditt program.

Använda resurshanteraren

När du har skapat dina resurser och placerat dem i rätt katalog skapar du ett ResourceManager objekt för att använda resurserna genom att anropa CreateFileBasedResourceManager(String, String, Type) metoden. Den första parametern anger rotnamnet för appens standardfil för .resources (detta skulle vara "strängar" för exemplet i föregående avsnitt). Den andra parametern anger platsen för resurserna ("Resurser" för föregående exempel). Den tredje parametern anger vilken implementering som ResourceSet ska användas. Om den tredje parametern är nullanvänds standardkörningen ResourceSet .

Kommentar

Distribuera inte ASP.NET appar med fristående .resources-filer. Detta kan orsaka låsningsproblem och bryter XCOPY-distributionen. Vi rekommenderar att du distribuerar ASP.NET resurser i satellitsammansättningar. Mer information finns i översikten över ASP.NET webbplatsresurser.

När du har instansierat ResourceManager objektet använder GetStringdu metoderna , GetObjectoch GetStream som vi beskrev tidigare för att hämta resurserna. Hämtningen av resurser direkt från .resources-filer skiljer sig dock från hämtningen av inbäddade resurser från sammansättningar. När du hämtar resurser från .resources-filer GetString(String)hämtar metoderna , GetObject(String)och GetStream(String) alltid standardkulturens resurser oavsett aktuell kultur. Om du vill hämta resurserna i appens aktuella kultur eller en specifik kultur måste du anropa GetString(String, CultureInfo)metoden , GetObject(String, CultureInfo)eller GetStream(String, CultureInfo) och ange den kultur vars resurser ska hämtas. Om du vill hämta resurserna i den aktuella kulturen anger du värdet för CultureInfo.CurrentCulture egenskapen som culture argument. Om resurshanteraren inte kan hämta resurserna culturei använder den standardreglerna för återställning av resurser för att hämta lämpliga resurser.

Ett exempel

I följande exempel visas hur resurshanteraren hämtar resurser direkt från .resources-filer. Exemplet består av tre textbaserade resursfiler för kulturerna engelska (USA), franska (Frankrike) och ryska (Ryssland). Engelska (USA) är exemplets standardkultur. Dess resurser lagras i följande fil med namnet Strings.txt:

Greeting=Hello
Prompt=What is your name?

Resurser för den franska kulturen (Frankrike) lagras i följande fil, som heter Strings.fr-FR.txt:

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

Resurser för den ryska kulturen (Ryssland) lagras i följande fil, som heter Strings.ru-RU.txt:

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

Följande är källkoden för exemplet. Exemplet instansierar CultureInfo objekt för kulturerna engelska (USA), engelska (Kanada), franska (Frankrike) och ryska (Ryssland) och gör var och en till den aktuella kulturen. Metoden ResourceManager.GetString(String, CultureInfo) tillhandahåller sedan värdet för CultureInfo.CurrentCulture egenskapen som culture argument för att hämta lämpliga kulturspecifika resurser.

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!

Du kan kompilera C#-versionen av exemplet genom att köra följande batchfil. Om du använder Visual Basic ersätter csc du med vbcoch ersätter .cs tillägget med .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

Se även