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:
En överlagring vars enda parameter är en sträng som innehåller namnet på resursen. Metoden försöker hämta resursen för den aktuella kulturen. Mer information finns i GetString(String)metoderna , GetObject(String)och GetStream(String) .
En överlagring som har två parametrar: en sträng som innehåller resursens namn och ett CultureInfo objekt som representerar den kultur vars resurs ska hämtas. Om det inte går att hitta en resursuppsättning för den kulturen använder resurshanteraren reservregler för att hämta en lämplig resurs. Mer information finns i GetString(String, CultureInfo)metoderna , GetObject(String, CultureInfo)och GetStream(String, CultureInfo) .
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 vbc
och ä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 vbc
och ä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 csc
och 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.
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 null
anvä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 culture
i 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 vbc
och 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