Share via


Načtení prostředků v aplikacích .NET

Při práci s lokalizovanými prostředky v aplikacích .NET byste měli ideálně zabalit prostředky pro výchozí nebo neutrální jazykovou verzi s hlavním sestavením a vytvořit samostatné satelitní sestavení pro každý jazyk nebo jazykovou verzi, které vaše aplikace podporuje. Potom můžete použít ResourceManager třídu, jak je popsáno v další části, abyste získali přístup k pojmenovanými prostředkům. Pokud se rozhodnete nevkládat prostředky do hlavního sestavení a satelitních sestavení, můžete také přistupovat k binárním souborům .resources přímo, jak je popsáno v části Načtení prostředků ze souborů .resources dále v tomto článku.

Načtení prostředků ze sestavení

Třída ResourceManager poskytuje přístup k prostředkům za běhu. Tuto metodu ResourceManager.GetString použijete k načtení řetězcových prostředků a ResourceManager.GetObject metody k ResourceManager.GetStream načtení neřetězcových prostředků. Každá metoda má dvě přetížení:

Správce prostředků používá záložní proces prostředku k řízení, jak aplikace načítá prostředky specifické pro jazykovou verzi. Další informace najdete v části Proces pro použití náhradního prostředku v části Balíček a nasazení prostředků. Informace o vytvoření instance objektu ResourceManager naleznete v části Vytvoření instance objektu ResourceManager v ResourceManager tématu třídy.

Příklad načtení řetězcových dat

Následující příklad volá metodu GetString(String) pro načtení řetězcových prostředků aktuální jazykové verze uživatelského rozhraní. Zahrnuje neutrální řetězcový prostředek pro jazykovou verzi angličtiny (USA) a lokalizované prostředky pro francouzské (Francie) a ruské (Rusko). Následující prostředek v angličtině (USA) je v souboru s názvem Strings.txt:

TimeHeader=The current time is

Prostředek Francouzština (Francie) je v souboru s názvem Strings.fr-FR.txt:

TimeHeader=L'heure actuelle est

Prostředek ruštiny (Rusko) je v souboru s názvem Strings.ru-RU.txt:

TimeHeader=Текущее время —

Zdrojový kód pro tento příklad, který je v souboru s názvem GetString.cs pro verzi kódu jazyka C# a GetString.vb pro verzi jazyka Visual Basic, definuje řetězcové pole, které obsahuje název čtyř jazykových verzí: tři jazykové verze, pro které jsou prostředky k dispozici, a španělština (Španělsko). Smyčka, která provede pětkrát náhodně vybere jednu z těchto jazykových verzí a přiřadí ji k těmto vlastnostemThread.CurrentCulture.CultureInfo.CurrentUICulture Potom zavolá metodu GetString(String) k načtení lokalizovaného řetězce, který se zobrazí spolu s denním časem.

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

Následující dávkový soubor (.bat) zkompiluje příklad a vygeneruje satelitní sestavení v příslušných adresářích. Příkazy jsou k dispozici pro jazyk c# a kompilátor. V jazyce Visual Basic přejděte csc na vbca změňte GetString.cs na 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

Pokud je aktuální jazyková verze uživatelského rozhraní španělština (Španělsko), všimněte si, že příklad zobrazuje prostředky anglického jazyka, protože prostředky španělštiny nejsou k dispozici a angličtina je výchozí jazyková verze příkladu.

Příklady načtení dat objektů

K načtení dat objektu můžete použít metody GetObject a GetStream data objektu. To zahrnuje primitivní datové typy, serializovatelné objekty a objekty, které jsou uloženy v binárním formátu (například obrázky).

Následující příklad používá metodu GetStream(String) k načtení rastrového obrázku, který se používá v úvodním okně aplikace. Následující zdrojový kód v souboru s názvem CreateResources.cs (pro C#) nebo CreateResources.vb (pro Visual Basic) vygeneruje soubor .resx, který obsahuje serializovaný obrázek. V tomto případě se image načte ze souboru s názvem SplashScreen.jpg; název souboru můžete změnit tak, aby nahradil vlastní image.

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

Následující kód načte prostředek a zobrazí obrázek v ovládacím PictureBox prvku.

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

K sestavení příkladu jazyka C# můžete použít následující dávkový soubor. V jazyce Visual Basic přejděte csc na vbca změňte příponu souboru zdrojového kódu z .cs na .vb.

csc CreateResources.cs
CreateResources

resgen AppResources.resx

csc GetStream.cs -resource:AppResources.resources

Následující příklad používá metodu ResourceManager.GetObject(String) deserializovat vlastní objekt. Příklad obsahuje soubor zdrojového kódu s názvem UIElements.cs (UIElements.vb pro Visual Basic), který definuje následující strukturu s názvem PersonTable. Tato struktura je určena pro obecné rutiny zobrazení tabulky, která zobrazuje lokalizované názvy sloupců tabulky. Všimněte si, že PersonTable struktura je označena atributem SerializableAttribute .

using System;

[Serializable] public struct PersonTable
{
   public readonly int nColumns;
   public readonly string column1;
   public readonly string column2;
   public readonly string column3;
   public readonly int width1;
   public readonly int width2;
   public readonly int width3;

   public PersonTable(string column1, string column2, string column3,
                  int width1, int width2, int width3)
   {
      this.column1 = column1;
      this.column2 = column2;
      this.column3 = column3;
      this.width1 = width1;
      this.width2 = width2;
      this.width3 = width3;
      this.nColumns = typeof(PersonTable).GetFields().Length / 2;
   }
}
<Serializable> Public Structure PersonTable
    Public ReadOnly nColumns As Integer
    Public Readonly column1 As String
    Public ReadOnly column2 As String
    Public ReadOnly column3 As String
    Public ReadOnly width1 As Integer
    Public ReadOnly width2 As Integer
    Public ReadOnly width3 As Integer

    Public Sub New(column1 As String, column2 As String, column3 As String,
                   width1 As Integer, width2 As Integer, width3 As Integer)
        Me.column1 = column1
        Me.column2 = column2
        Me.column3 = column3
        Me.width1 = width1
        Me.width2 = width2
        Me.width3 = width3
        Me.nColumns = Me.GetType().GetFields().Count \ 2
    End Sub
End Structure

Následující kód ze souboru s názvem CreateResources.cs (CreateResources.vb pro Visual Basic) vytvoří soubor prostředku XML s názvem UIResources.resx, který obsahuje název tabulky a PersonTable objekt obsahující informace pro aplikaci lokalizovanou pro anglický jazyk.

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

Následující kód v souboru zdrojového kódu s názvem GetObject.cs (GetObject.vb) pak načte prostředky a zobrazí je v konzole.

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

Potřebný soubor prostředků a sestavení můžete sestavit a spustit aplikaci spuštěním následujícího dávkového souboru. Musíte použít /r možnost zadat Resgen.exe s odkazem na UIElements.dll, aby měl přístup k informacím o struktuře PersonTable . Pokud používáte jazyk C#, nahraďte název kompilátoru vbc názvem a nahraďte příponu příponou .cs.vb .csc

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

Podpora verzí pro satelitní sestavení

Když objekt načte požadované prostředky, ve výchozím nastavení ResourceManager hledá satelitní sestavení s čísly verzí, které odpovídají číslu verze hlavního sestavení. Po nasazení aplikace můžete chtít aktualizovat hlavní sestavení nebo konkrétní satelitní sestavení prostředků. Rozhraní .NET Framework poskytuje podporu pro správu verzí hlavního sestavení a satelitních sestavení.

Atribut SatelliteContractVersionAttribute poskytuje podporu správy verzí pro hlavní sestavení. Zadání tohoto atributu v hlavním sestavení aplikace umožňuje aktualizovat a znovu nasadit hlavní sestavení bez aktualizace jeho satelitních sestavení. Po aktualizaci hlavního sestavení navyšte číslo verze hlavního sestavení, ale číslo verze satelitního kontraktu ponechte beze změny. Když správce prostředků načte požadované prostředky, načte verzi satelitního sestavení určenou tímto atributem.

Sestavení zásad vydavatele poskytují podporu pro správu verzí satelitních sestavení. Satelitní sestavení můžete aktualizovat a znovu nasadit bez aktualizace hlavního sestavení. Po aktualizaci satelitního sestavení navyšte jeho číslo verze a odešlete ho sestavením zásad vydavatele. V sestavení zásad vydavatele určete, že nové satelitní sestavení je zpětně kompatibilní s předchozí verzí. Správce prostředků použije SatelliteContractVersionAttribute atribut k určení verze satelitního sestavení, ale zavaděč sestavení vytvoří vazbu na verzi satelitního sestavení určenou zásadou vydavatele. Další informace o sestaveních zásad vydavatele naleznete v tématu Vytvoření souboru zásad vydavatele.

Pokud chcete povolit plnou podporu správy verzí sestavení, doporučujeme nasadit sestavení se silným názvem do globální mezipaměti sestavení a nasadit sestavení, která nemají v adresáři aplikace silné názvy. Pokud chcete nasadit sestavení se silným názvem v adresáři aplikace, nebudete moci při aktualizaci sestavení zvýšit číslo verze satelitního sestavení. Místo toho musíte provést místní aktualizaci, kde nahradíte stávající kód aktualizovaným kódem a zachováte stejné číslo verze. Pokud například chcete aktualizovat verzi 1.0.0.0 satelitního sestavení s plně zadaným názvem sestavení myApp.resources, Version=1.0.0.0, Culture=de, PublicKeyToken=b03f5f1d50a3a", přepište ji aktualizovaným myApp.resources.dll, který byl zkompilován se stejným plně zadaným názvem sestavení "myApp.resources, Version=1.0.0.0, Culture=de, PublicKeyToken=b03f5f11d50a3a". Mějte na paměti, že použití místních aktualizací u souborů satelitního sestavení znesnadňuje, aby aplikace přesně určila verzi satelitního sestavení.

Další informace o správě verzí sestavení naleznete v tématu Správa verzí sestavení a Jak modul runtime vyhledá sestavení.

Načtení prostředků ze souborů .resources

Pokud se rozhodnete prostředky do satelitních sestavení nenasazovat, můžete k přístupu k prostředkům přímo ze souborů .resources použít ResourceManager objekt. K tomu je nutné správně nasadit soubory .resources. Pak použijete metodu ResourceManager.CreateFileBasedResourceManager k vytvoření instance objektu ResourceManager a určení adresáře, který obsahuje samostatné soubory .resources.

Nasazení souborů .resources

Při vkládání souborů .resources do sestavení aplikace a satelitních sestavení má každé satelitní sestavení stejný název souboru, ale je umístěn v podadresáři, který odpovídá jazykové verzi satelitního sestavení. Naproti tomu když přistupujete k prostředkům ze souborů .resources přímo, můžete všechny soubory .resources umístit do jednoho adresáře, obvykle podadresář adresáře aplikace. Název výchozího souboru .resources aplikace se skládá pouze z kořenového názvu bez označení jazykové verze (například strings.resources). Prostředky pro každou lokalizovanou jazykovou verzi se ukládají do souboru, jehož název se skládá z kořenového názvu následovaného jazykovou verzí (například strings.ja.resources nebo strings.de-DE.resources).

Následující obrázek znázorňuje umístění souborů prostředků v adresářové struktuře. Poskytuje také zásady vytváření názvů pro soubory .resource.

Obrázek znázorňující hlavní adresář aplikace

Použití Resource Manageru

Po vytvoření prostředků a jejich umístění do příslušného adresáře vytvoříte ResourceManager objekt, který bude používat prostředky voláním CreateFileBasedResourceManager(String, String, Type) metody. První parametr určuje kořenový název výchozího souboru .resources aplikace (to by bylo "řetězce" pro příklad v předchozí části). Druhý parametr určuje umístění prostředků ("Resources" pro předchozí příklad). Třetí parametr určuje implementaci, ResourceSet která se má použít. Pokud je nulltřetí parametr , použije se výchozí modul runtime ResourceSet .

Poznámka:

Nenasazujte ASP.NET aplikace pomocí samostatných souborů .resources. To může způsobit problémy s uzamčením a přeruší nasazení XCOPY. Doporučujeme nasadit ASP.NET prostředky do satelitních sestavení. Další informace najdete v tématu ASP.NET Přehled prostředků webové stránky.

Po vytvoření instance objektu ResourceManager použijete GetStringGetObject, a GetStream metody, jak je popsáno dříve k načtení prostředků. Načítání prostředků přímo ze souborů .resources se ale liší od načítání vložených prostředků ze sestavení. Při načítání prostředků ze souborů .resources , GetString(String)GetObject(String), a GetStream(String) metody vždy načíst výchozí jazykové verze prostředky bez ohledu na aktuální jazykovou verzi. Chcete-li načíst prostředky aktuální jazykové verze aplikace nebo konkrétní jazykové verze, musíte volat GetString(String, CultureInfo)GetObject(String, CultureInfo), nebo GetStream(String, CultureInfo) metodu a určit jazykovou verzi, jejíž prostředky se mají načíst. Chcete-li načíst prostředky aktuální jazykové verze, zadejte hodnotu CultureInfo.CurrentCulture vlastnosti jako culture argument. Pokud správce prostředků nemůže načíst prostředky culture, použije k načtení příslušných prostředků standardní pravidla náhradního prostředku.

Příklad

Následující příklad ukazuje, jak Správce prostředků načte prostředky přímo ze souborů .resources. Příklad se skládá ze tří textových souborů prostředků pro jazykové verze angličtiny (USA), francouzštiny (Francie) a ruštiny (Rusko). Výchozí jazyková verze je angličtina (USA). Jeho prostředky jsou uloženy v následujícím souboru s názvem Strings.txt:

Greeting=Hello
Prompt=What is your name?

Zdroje pro francouzskou jazykovou verzi (Francie) jsou uloženy v následujícím souboru, který má název Strings.fr-FR.txt:

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

Zdroje pro ruskou jazykovou verzi (Rusko) jsou uloženy v následujícím souboru, který má název Strings.ru-RU.txt:

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

Následuje zdrojový kód pro příklad. Příklad vytvoří CultureInfo instanci objektů pro angličtinu (USA), angličtinu (Kanadu), francouzštinu (Francii) a ruštinu (Rusko) a vytvoří každou aktuální jazykovou verzi. Metoda ResourceManager.GetString(String, CultureInfo) pak poskytuje hodnotu CultureInfo.CurrentCulture vlastnosti jako culture argument pro načtení odpovídajících prostředků specifických pro jazykovou verzi.

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!

Verzi příkladu v jazyce C# můžete zkompilovat spuštěním následujícího dávkového souboru. Pokud používáte Visual Basic, nahraďte csc příponou vbca nahraďte příponu .cs ..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

Viz také