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 osztályt a következő szakaszban leírtak szerint használhatja a névvel ellátott 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 Erőforrások lekérése .resources fájlokból című szakaszban leírtak szerint.

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 ResourceManager.GetString metódussal sztringerőforrásokat, a ResourceManager.GetObject vagy ResourceManager.GetStream metódust pedig a nem sztring típusú erőforrások lekéréséhez használhatja. 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ókért lásd az "Erőforrás visszaesési folyamat" című részt a "Csomag és erőforrások üzembe helyezése" szakaszban . Az ResourceManager objektum példányosításáról a ResourceManager osztály témakörének "ResourceManager objektum példányosítása" című szakaszában olvashat.

Példa karakterlánc adatainak lekérése

Az alábbi példa meghívja a GetString(String) metódust az aktuális felhasználói felületi kultúra sztringerőforrásainak lekéréséhez. Tartalmaz egy semleges karakterlánc erőforrást az angol (Egyesült Államok) kultúrára, valamint a francia (Franciaország) és az orosz (Oroszország) kultúrák lokalizált erőforrásait. A következő angol (Egyesült Államok) erőforrás egy Strings.txtnevű fájlban található:

TimeHeader=The current time is

A francia (Franciaország) erőforrás egy Strings.fr-FR.txtnevű fájlban található:

TimeHeader=L'heure actuelle est

Az orosz (Oroszország) erőforrás egy Strings.ru-RU.txtnevű 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. Az ötször ismétlődő ciklus véletlenszerűen kiválasztja az egyik ilyen kultúrát, és hozzárendeli a Thread.CurrentCulture és CultureInfo.CurrentUICulture tulajdonságokhoz. Ezután meghívja a GetString(String) metódust a honosított szöveg lekéréséhez, amelyet a napszakkal 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: {culture.NativeName}");
         string timeString = rm.GetString("TimeHeader");
         Console.WriteLine($"{timeString} {DateTime.Now:T}\n");
      }
   }
}
// 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 satelit-összeállításokat hoz létre a megfelelő könyvtárakban. A parancsok a C# nyelvhez és a fordítóhoz vannak megadva. Visual Basic esetén módosítsa a cscvbc, és módosítsa a GetString.csGetString.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 GetObject és GetStream 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 a GetStream(String) metódust használja az alkalmazás nyitó kezdőablakában használt bitkép lekérésére. 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.jpgnevű 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őelemben.

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. Visual Basic esetén módosítsa a cscvbc, és módosítsa a forráskódfájl kiterjesztését .cs-ról .vb- ra.

csc CreateResources.cs
CreateResources

resgen AppResources.resx

csc GetStream.cs -resource:AppResources.resources

Az alábbi példa a ResourceManager.GetObject(String) metódust használja egy egyéni objektum deszerializálásához. A példa egy UIElements.cs (Visual Basichez UIElements.vb) nevű forráskódfájlt tartalmaz, amely a következő, PersonTablenevű 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 szerkezet SerializableAttribute attribútummal 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 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 /r opciót kell használnia, hogy a Resgen.exe számára egy hivatkozást adjon a UIElements.dll-ra, így az hozzáférhet a PersonTable struktúra információihoz. Ha C#-ot használ, cserélje le a vbc fordító nevét csc, és cserélje le a .vb bővítményt .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 a ResourceManager objektum lekéri a 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.

A 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. Miután frissített egy műholdassemblát, növelje annak verziószámát, és kísérje el egy kiadói házirend-assemblával. 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ő a SatelliteContractVersionAttribute attribútumot fogja használni a műholdas szerelvény verziójának meghatározásához, de a szerelvénybetöltő a közzétevői szabályzat által megadott műholdas szerelvényverzióhoz fog kapcsolódni. További információ a közzétevői szabályzatok összeállításáról: Közzétevői szabályzatfájl létrehozása.

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ű assembly-eket szeretne üzembe helyezni az alkalmazáskönyvtárban, nem fogja tudni növelni a műholdas assembly verziószámát a frissítéskor. 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 a "myApp.resources, Version=1.0.0.0, Culture=de, PublicKeyToken=b03f5f11d50a3a" teljesen meghatározott szerelvénynévvel rendelkező műhold-asembláj 1.0.0.0 verzióját szeretné frissíteni, írja felül a frissített myApp.resources.dll-val, amelyet ugyanazzal a teljesen meghatározott 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ásával kapcsolatos további információkért tekintse meg szerelvény verziószámozását és , hogy a futtatókörnyezet hogyan találja meg a szerelvényeket.

Erőforrások lekérése a .resources fájlokból

Ha úgy dönt, hogy nem helyez üzembe erőforrásokat a műholdas szerelvényekben, akkor is használhat egy ResourceManager objektumot az erőforrások közvetlen eléréséhez .resources fájlokból. 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étre kell hoznia egy ResourceManager objektumot az erőforrások használatához az 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 ResourceSet implementációt határozza meg. Ha a harmadik paraméter null, a rendszer az alapértelmezett futtatókörnyezeti ResourceSet használja.

Megjegyzé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.

A ResourceManager objektum példányosítása után a korábban tárgyalt GetString, GetObjectés GetStream metódussal kéri le az erőforrásokat. 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 jelenlegi vagy egy adott kulturális környezetének erőforrásainak lekéréséhez meg kell hívnia a 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 szeretné kérni. Az aktuális kultúra erőforrásainak lekéréséhez adja meg a CultureInfo.CurrentCulture tulajdonság értékét culture argumentumként. Ha az erőforrás-kezelő nem tudja lekérni a cultureerőforrásait, a standard erőforrás-tartalék szabályokkal kéri le a megfelelő erőforrásokat.

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ásokat a következő, Strings.txtnevű fájl tárolja:

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, amely Strings.fr-FR.txtnéven van elnevezve:

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

Az orosz (Oroszország) kultúra erőforrásait a következő fájl tárolja, amely Strings.ru-RU.txtneve:

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

A példához a következő forráskód tartozik. A példa példányosítja CultureInfo objektumokat az angol (Egyesült Államok), az angol (Kanada), a francia (Franciaország) és az orosz (Oroszország) kultúrákhoz, és mindegyiket az aktuális kultúraként állítja be. A ResourceManager.GetString(String, CultureInfo) metódus ezután a CultureInfo.CurrentCulture tulajdonság értékét adja meg culture argumentumként a 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{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 cscvbc, és cserélje le a .cs bővítményt .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