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:
Een overbelasting waarvan één parameter een tekenreeks is die de naam van de resource bevat. De methode probeert die resource op te halen voor de huidige cultuur. Zie de GetString(String), GetObject(String)en GetStream(String) methoden voor meer informatie.
Een overbelasting met twee parameters: een tekenreeks met de naam van de resource en een CultureInfo object dat de cultuur vertegenwoordigt waarvan de resource moet worden opgehaald. Als een resourceset voor die cultuur niet kan worden gevonden, gebruikt resourcemanager terugvalregels om een geschikte resource op te halen. Zie de GetString(String, CultureInfo), GetObject(String, CultureInfo)en GetStream(String, CultureInfo) methoden voor meer informatie.
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 vbc
en 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 vbc
en 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 csc
en 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.
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 culture
niet 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 vbc
csc
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