Erőforrások lekérése .NET-alkalmazásokban
Ha honosított erőforrásokkal dolgozik a .NET-alkalmazásokban, ideális esetben csomagolja be az alapértelmezett vagy semleges kultúra erőforrásait a főszerelvénybe, és hozzon létre egy külön műholdas szerelvényt minden olyan nyelvhez vagy kultúrához, amelyet az alkalmazás támogat. Ezután a ResourceManager következő szakaszban ismertetett osztályt használhatja a nevesített erőforrások eléréséhez. Ha úgy dönt, hogy nem ágyazza be az erőforrásokat a fő szerelvénybe és a műholdas szerelvényekbe, akkor közvetlenül is hozzáférhet a bináris .resources fájlokhoz, amint azt a cikk későbbi részében az Erőforrások lekérése .resources fájlokból című szakaszban tárgyaltuk.
Erőforrások lekérése szerelvényekből
Az ResourceManager osztály futásidőben biztosít hozzáférést az erőforrásokhoz. A metódussal sztringerőforrásokatResourceManager.GetString, illetve ResourceManager.GetStream a nem sztring ResourceManager.GetObject típusú erőforrásokat vagy metódusokat kérdezhet le. Mindegyik metódus két túlterhelést alkalmaz:
Olyan túlterhelés, amelynek egyetlen paramétere az erőforrás nevét tartalmazó sztring. A metódus megpróbálja lekérni az erőforrást az aktuális kultúrához. További információ: GetString(String), GetObject(String)és GetStream(String) metódusok.
Egy túlterhelés, amely két paraméterrel rendelkezik: az erőforrás nevét tartalmazó sztring és egy CultureInfo objektum, amely azt a kultúrát jelöli, amelynek az erőforrását le kell kérni. Ha nem található erőforráskészlet ehhez a kultúrához, az erőforrás-kezelő tartalék szabályokkal kéri le a megfelelő erőforrást. További információ: GetString(String, CultureInfo), GetObject(String, CultureInfo)és GetStream(String, CultureInfo) metódusok.
Az erőforrás-kezelő az erőforrás-visszavételi folyamatot használja annak szabályozására, hogy az alkalmazás hogyan kéri le a kultúraspecifikus erőforrásokat. További információ: "Resource Fallback Process" (Erőforrás-tartalék folyamat) szakasz a Csomag és az Erőforrások üzembe helyezése című szakaszban. Az objektumok példányosításáról ResourceManager az osztálytéma "ResourceManager objektum példányosítása" című szakaszában ResourceManager olvashat.
Példa sztringadatok lekérése
Az alábbi példa meghívja a metódust az GetString(String) aktuális felhasználói felületi kultúra sztringerőforrásainak lekérésére. Tartalmaz egy semleges sztringerőforrást az angol (Egyesült Államok) kultúrához, valamint a francia (Franciaország) és az orosz (Oroszország) kultúrák honosított erőforrásait. Az alábbi angol (Egyesült Államok) erőforrás egy Strings.txt nevű fájlban található:
TimeHeader=The current time is
A francia (Franciaország) erőforrás egy Strings.fr-FR.txt nevű fájlban található:
TimeHeader=L'heure actuelle est
Az orosz (Oroszország) erőforrás egy Strings.ru-RU.txt nevű fájlban található:
TimeHeader=Текущее время —
A példához tartozó forráskód, amely a kód C#-verziójának GetString.cs nevű fájljában található, és GetString.vb a Visual Basic-verzióhoz, egy sztringtömböt határoz meg, amely négy kultúra nevét tartalmazza: a három kultúrát, amelyekhez az erőforrások elérhetők, valamint a spanyol (spanyolországi) kultúrát. A ciklus, amely ötször hajt végre véletlenszerűen kiválasztja az egyik ilyen kultúrát, és hozzárendeli azt a tulajdonságokhoz és CultureInfo.CurrentUICulture a Thread.CurrentCulture tulajdonságokhoz. Ezután meghívja a metódust a GetString(String) honosított sztring lekérésére, amelyet a napidővel együtt jelenít meg.
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
A következő kötegfájl (.bat) lefordítja a példát, és műholdas szerelvényeket hoz létre a megfelelő könyvtárakban. A parancsok a C# nyelvhez és a fordítóhoz vannak megadva. A Visual Basic esetében váltson csc
a gombra vbc
, és váltson GetString.cs
a következőre 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
Ha a jelenlegi felhasználói felületi kultúra spanyol (Spanyolország), vegye figyelembe, hogy a példa angol nyelvű erőforrásokat jelenít meg, mivel a spanyol nyelvi erőforrások nem érhetők el, és az angol a példa alapértelmezett kultúrája.
Objektumadatokra vonatkozó példák lekérése
Az objektumadatok lekéréséhez használhatja a metódusokat és GetStream a GetObject metódusokat. Ide tartoznak a primitív adattípusok, a szerializálható objektumok és a bináris formátumban (például képek) tárolt objektumok.
Az alábbi példa egy alkalmazás nyitó kezdőablakában használt bitkép lekérésére használja a GetStream(String) metódust. A következő forráskód egy CreateResources.cs (C#) vagy CreateResources.vb (Visual Basic esetén) nevű fájlban létrehoz egy .resx fájlt, amely tartalmazza a szerializált képet. Ebben az esetben a rendszerkép egy SplashScreen.jpg nevű fájlból töltődik be; módosíthatja a fájlnevet a saját rendszerkép helyettesítésére.
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
Az alábbi kód lekéri az erőforrást, és megjeleníti a képet egy PictureBox vezérlőben.
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
A C#-példa létrehozásához az alábbi kötegfájlt használhatja. A Visual Basic esetében módosítsa csc
a vbc
forráskódfájl .cs
kiterjesztését a következőre .vb
.
csc CreateResources.cs
CreateResources
resgen AppResources.resx
csc GetStream.cs -resource:AppResources.resources
Az alábbi példa egy egyéni objektum deszerializálására használja a ResourceManager.GetObject(String) metódust. A példa egy UIElements.cs (Visual Basichez UIElements.vb) nevű forráskódfájlt tartalmaz, amely a következő, elnevezett PersonTable
struktúrát határozza meg. Ezt a struktúrát egy általános táblázatmegjelenítési rutin használja, amely megjeleníti a táblázatoszlopok honosított nevét. Vegye figyelembe, hogy a PersonTable
struktúra az attribútummal SerializableAttribute van megjelölve.
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
A következő kód egy CreateResources.cs nevű fájlból (CreateResources.vb a Visual Basichez) létrehoz egy UIResources.resx nevű XML-erőforrásfájlt, amely egy táblacímet és egy PersonTable
olyan objektumot tárol, amely az angol nyelvre honosított alkalmazás adatait tartalmazza.
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
A következő kód egy GetObject.cs (GetObject.vb) nevű forráskódfájlban lekéri az erőforrásokat, és megjeleníti őket a konzolon.
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
Létrehozhatja a szükséges erőforrásfájlt és szerelvényeket, és futtathatja az alkalmazást az alábbi kötegfájl végrehajtásával. A Resgen.exe meg kell /r
adnia egy UIElements.dll hivatkozással, hogy hozzáférhessen a PersonTable
struktúrával kapcsolatos információkhoz. Ha C#-ot használ, cserélje le a vbc
fordító nevét csc
a gombra, és cserélje le a bővítményt a .vb
következőre .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
Műholdas szerelvények verziótámogatása
Alapértelmezés szerint, amikor az objektum lekéri a ResourceManager kért erőforrásokat, olyan műholdas szerelvényeket keres, amelyek verziószáma megegyezik a fő szerelvény verziószámával. Az alkalmazás üzembe helyezése után érdemes lehet frissíteni a fő szerelvényt vagy az adott erőforrás-műholdas szerelvényeket. A .NET-keretrendszer támogatja a főszerelvény és a műholdas szerelvények verziószámozását.
Az SatelliteContractVersionAttribute attribútum verziószámozási támogatást biztosít egy fő szerelvényhez. Ennek az attribútumnak az alkalmazás főszerelvényén való megadása lehetővé teszi a főszerelvény frissítését és ismételt üzembe helyezését a műholdas szerelvények frissítése nélkül. A főszerelvény frissítése után növelje a főszerelvény verziószámát, de hagyja változatlanul a műholdas szerződés verziószámát. Amikor az erőforrás-kezelő lekéri a kért erőforrásokat, betölti az attribútum által megadott műholdas szerelvényverziót.
A Publisher szabályzatszerelvényei támogatják a műholdas szerelvények verziószámozását. A műholdas szerelvényt a főszerelvény frissítése nélkül frissítheti és újra üzembe helyezheti. A műholdas szerelvény frissítése után növelje annak verziószámát, és küldje el egy közzétevői szabályzat szerelvényével. A közzétevői szabályzat szerelvényében adja meg, hogy az új műholdas szerelvény visszamenőlegesen kompatibilis-e az előző verzióval. Az erőforrás-kezelő az SatelliteContractVersionAttribute attribútummal határozza meg a műholdas szerelvény verzióját, de a szerelvénybetöltő a közzétevői szabályzat által megadott műholdas szerelvényverzióhoz fog kapcsolódni. A közzétevői szabályzatok összeállításáról további információt a közzétevői szabályzatfájl létrehozása című témakörben talál.
A teljes szerelvényverzió-támogatás engedélyezéséhez javasoljuk, hogy helyezzen üzembe erős nevű szerelvényeket a globális szerelvény-gyorsítótárban , és helyezzen üzembe olyan szerelvényeket, amelyek nem rendelkeznek erős névvel az alkalmazáskönyvtárban. Ha erős nevű szerelvényeket szeretne üzembe helyezni az alkalmazáskönyvtárban, a szerelvény frissítésekor nem fogja tudni növelni a műholdas szerelvény verziószámát. Ehelyett helyben kell frissítenie a meglévő kódot a frissített kódra, és meg kell őriznie ugyanazt a verziószámot. Ha például frissíteni szeretné egy műholdas szerelvény 1.0.0.0-s verzióját a "myApp.resources" teljes szerelvénynévvel, Version=1.0.0.0, Culture=de, PublicKeyToken=b03f5f11d50a3a", írja felül a frissített myApp.resources.dll, amelyet ugyanazzal a teljes szerelvénynévvel állítottak össze: "myApp.resources, Version=1.0.0.0, Culture=de, PublicKeyToken=b03f5f11d50a3a". Vegye figyelembe, hogy a műholdas szerelvényfájlok helyszíni frissítéseinek használata megnehezíti az alkalmazások számára a műholdas szerelvények verziójának pontos meghatározását.
A szerelvény-verziószámozással kapcsolatos további információkért tekintse meg a szerelvény verziószámozását és a futtatókörnyezet szerelvények megkeresését ismertető témakört.
Erőforrások lekérése a .resources fájlokból
Ha úgy dönt, hogy nem helyezi üzembe az erőforrásokat a műholdas szerelvényekben, akkor is használhat objektumot ResourceManager a .resources fájlokból származó erőforrások közvetlen eléréséhez. Ehhez megfelelően kell üzembe helyeznie a .resources fájlokat. Ezután a ResourceManager.CreateFileBasedResourceManager metódussal példányosíthat egy ResourceManager objektumot, és megadhatja az önálló .resources fájlokat tartalmazó könyvtárat.
.resources-fájlok üzembe helyezése
Amikor .resources fájlokat ágyaz be egy alkalmazásszerelvénybe és a műholdas szerelvényekbe, minden műholdas szerelvénynek ugyanaz a fájlneve, de egy alkönyvtárba kerül, amely tükrözi a műholdas szerelvény kultúráját. Ezzel szemben, ha közvetlenül .resources fájlokból fér hozzá az erőforrásokhoz, az összes .resources fájlt egyetlen könyvtárba helyezheti, általában az alkalmazáskönyvtár alkönyvtárát. Az alkalmazás alapértelmezett .resources fájljának neve csak gyökérnévből áll, és nincs feltüntetve annak kultúrája (például strings.resources). Az egyes honosított kulturális környezetek erőforrásai egy olyan fájlban vannak tárolva, amelynek neve a gyökérnévből és a kulturális környezetből áll (például strings.ja.resources vagy strings.de-DE.resources).
Az alábbi ábrán az látható, hogy az erőforrásfájloknak hol kell lenniük a könyvtárszerkezetben. Az .resource fájlok elnevezési konvencióit is megadja.
Az erőforrás-kezelő használata
Miután létrehozta az erőforrásokat, és elhelyezte őket a megfelelő könyvtárban, létrehoz egy ResourceManager objektumot az erőforrások használatához a CreateFileBasedResourceManager(String, String, Type) metódus meghívásával. Az első paraméter az alkalmazás alapértelmezett .resources fájljának gyökérnevét adja meg (ez az előző szakaszban szereplő példához tartozó "sztringek" lesznek). A második paraméter megadja az erőforrások helyét ("Erőforrások" az előző példában). A harmadik paraméter a használni kívánt implementációt ResourceSet határozza meg. Ha a harmadik paraméter, null
a rendszer az alapértelmezett futtatókörnyezetet ResourceSet használja.
Feljegyzés
Ne helyezzen üzembe ASP.NET alkalmazásokat különálló .resources fájlokkal. Ez zárolási problémákat okozhat, és megszakíthatja az XCOPY üzembe helyezését. Javasoljuk, hogy ASP.NET erőforrásokat helyezzen üzembe műholdas szerelvényekben. További információ: ASP.NET weblaperőforrások áttekintése.
Az objektum példányosítása ResourceManager után az erőforrások lekéréséhez használja a GetStringkorábban tárgyalt , GetObjectés GetStream metódusokat. Az erőforrások .resources fájlokból való közvetlen lekérése azonban eltér a beágyazott erőforrások szerelvényekből való lekérésétől. Amikor erőforrásokat kér le .resources fájlokból, a GetString(String), GetObject(String)és GetStream(String) metódusok mindig az alapértelmezett kultúra erőforrásait kérik le az aktuális kultúrától függetlenül. Az alkalmazás aktuális vagy egy adott kultúrájának erőforrásainak lekéréséhez meg kell hívnia az GetString(String, CultureInfo), GetObject(String, CultureInfo)vagy GetStream(String, CultureInfo) metódust, és meg kell adnia azt a kultúrát, amelynek erőforrásait le kell kérni. Az aktuális kultúra erőforrásainak lekéréséhez adja meg argumentumként culture
a CultureInfo.CurrentCulture tulajdonság értékét. Ha az erőforrás-kezelő nem tudja lekérni a megfelelő erőforrásokat culture
, a standard erőforrás-tartalékszabályokat használja a megfelelő erőforrások lekéréséhez.
Példa
Az alábbi példa azt szemlélteti, hogy az erőforrás-kezelő hogyan kéri le az erőforrásokat közvetlenül .resources fájlokból. A példa három szöveges erőforrásfájlból áll az angol (Egyesült Államok), a francia (Franciaország) és az orosz (Oroszország) kultúrákhoz. A példa alapértelmezett kultúrája az angol (Egyesült Államok). Az erőforrások a következő, Strings.txt nevű fájlban vannak tárolva:
Greeting=Hello
Prompt=What is your name?
A francia (franciaországi) kultúrához tartozó erőforrásokat a következő fájl tárolja, amelynek neve Strings.fr-FR.txt:
Greeting=Bon jour
Prompt=Comment vous appelez-vous?
Az orosz (oroszországi) kultúrához tartozó erőforrásokat a következő fájl tárolja, amely Strings.ru-RU.txt néven van elnevezve:
Greeting=Здравствуйте
Prompt=Как вас зовут?
A példához a következő forráskód tartozik. A példa az angol (Egyesült Államok), az angol (Kanada), a francia (Franciaország) és az orosz (Oroszország) kultúrák objektumait példányosítjaCultureInfo, és az egyes kultúrákat a jelenlegi kultúrává teszi. A ResourceManager.GetString(String, CultureInfo) metódus ezután argumentumként adja meg a CultureInfo.CurrentCulture tulajdonság értékét a culture
megfelelő kultúraspecifikus erőforrások lekéréséhez.
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!
A példa C#-verzióját az alábbi kötegfájl futtatásával fordíthatja le. Ha Visual Basicet használ, cserélje le csc
a következőre vbc
, és cserélje le a bővítményt a .cs
következőre .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