Megosztás a következőn keresztül:


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:

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 vbcforrá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 PersonTablestruktú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 csca 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 alkalmazás fő könyvtárát bemutató ábra.

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, nulla 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

Lásd még