Pobieranie zasobów w aplikacjach platformy .NET

Podczas pracy z zlokalizowanymi zasobami w aplikacjach platformy .NET najlepiej spakować zasoby dla domyślnej lub neutralnej kultury z głównym zestawem i utworzyć oddzielny zestaw satelitarny dla każdego języka lub kultury obsługiwanej przez aplikację. Następnie możesz użyć klasy zgodnie z ResourceManager opisem w następnej sekcji, aby uzyskać dostęp do nazwanych zasobów. Jeśli zdecydujesz się nie osadzać zasobów w głównym zestawie i zestawach satelickich, możesz również uzyskać bezpośredni dostęp do binarnych plików resources , zgodnie z opisem w sekcji Pobieranie zasobów z plików resources w dalszej części tego artykułu.

Pobieranie zasobów z zestawów

Klasa ResourceManager zapewnia dostęp do zasobów w czasie wykonywania. Metoda służy do pobierania ResourceManager.GetString zasobów ciągów i ResourceManager.GetObject metody lub ResourceManager.GetStream w celu pobrania zasobów innych niż ciąg. Każda metoda ma dwa przeciążenia:

Menedżer zasobów używa procesu rezerwowego zasobu do kontrolowania sposobu pobierania zasobów specyficznych dla kultury. Aby uzyskać więcej informacji, zobacz sekcję "Proces rezerwowy zasobów" w temacie Pakowanie i wdrażanie zasobów. Aby uzyskać informacje o tworzeniu wystąpienia obiektu, zobacz sekcję ResourceManager "Tworzenie wystąpienia obiektu ResourceManager" w ResourceManager temacie klasy.

Przykład pobierania danych ciągu

Poniższy przykład wywołuje metodę GetString(String) w celu pobrania zasobów ciągów bieżącej kultury interfejsu użytkownika. Zawiera on neutralny zasób ciągu dla kultury angielskiej (Stany Zjednoczone) i zlokalizowanych zasobów dla kultur francuskich (Francji) i rosyjskich (Rosja). Następujący zasób języka angielskiego (Stany Zjednoczone) znajduje się w pliku o nazwie Strings.txt:

TimeHeader=The current time is

Zasób francuski (Francja) znajduje się w pliku o nazwie Strings.fr-FR.txt:

TimeHeader=L'heure actuelle est

Zasób Rosyjski (Rosja) znajduje się w pliku o nazwie Strings.ru-RU.txt:

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

Kod źródłowy dla tego przykładu, który znajduje się w pliku o nazwie GetString.cs dla wersji kodu w języku C# i GetString.vb dla wersji języka Visual Basic, definiuje tablicę ciągów zawierającą nazwę czterech kultur: trzy kultury, dla których zasoby są dostępne, oraz kulturę hiszpańską (Hiszpania). Pętla wykonywana pięć razy losowo wybiera jedną z tych kultur i przypisuje ją do Thread.CurrentCulture właściwości i CultureInfo.CurrentUICulture . Następnie wywołuje metodę GetString(String) , aby pobrać zlokalizowany ciąg, który jest wyświetlany wraz z godziną dnia.

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

Poniższy plik wsadowy (.bat) kompiluje przykład i generuje zestawy satelitarne w odpowiednich katalogach. Polecenia są udostępniane dla języka C# i kompilatora. W przypadku języka Visual Basic zmień wartość csc na vbc, a następnie zmień wartość 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

Gdy bieżąca kultura interfejsu użytkownika jest hiszpańska (Hiszpania), zwróć uwagę, że w przykładzie są wyświetlane zasoby języka angielskiego, ponieważ zasoby języka hiszpańskiego są niedostępne, a język angielski jest domyślną kulturą przykładu.

Pobieranie przykładów danych obiektu

Metody i GetStream umożliwiają GetObject pobieranie danych obiektów. Dotyczy to typów danych pierwotnych, obiektów możliwych do serializacji i obiektów przechowywanych w formacie binarnym (na przykład obrazów).

W poniższym przykładzie GetStream(String) użyto metody , aby pobrać mapę bitową używaną w otwierającym oknie powitalnym aplikacji. Poniższy kod źródłowy w pliku o nazwie CreateResources.cs (dla języka C#) lub CreateResources.vb (dla języka Visual Basic) generuje plik resx zawierający serializowany obraz. W takim przypadku obraz jest ładowany z pliku o nazwie SplashScreen.jpg; Możesz zmodyfikować nazwę pliku, aby zastąpić własny obraz.

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

Poniższy kod pobiera zasób i wyświetla obraz w kontrolce PictureBox .

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

Aby skompilować przykład języka C#, możesz użyć następującego pliku wsadowego. W przypadku języka Visual Basic zmień wartość csc na vbc, a następnie zmień rozszerzenie pliku kodu źródłowego z .cs na .vb.

csc CreateResources.cs
CreateResources

resgen AppResources.resx

csc GetStream.cs -resource:AppResources.resources

W poniższym przykładzie użyto ResourceManager.GetObject(String) metody do deserializacji obiektu niestandardowego. Przykład zawiera plik kodu źródłowego o nazwie UIElements.cs (UIElements.vb dla języka Visual Basic), który definiuje następującą strukturę o nazwie PersonTable. Ta struktura ma być używana przez ogólną procedurę wyświetlania tabeli, która wyświetla zlokalizowane nazwy kolumn tabeli. Należy pamiętać, że PersonTable struktura jest oznaczona atrybutem 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

Poniższy kod z pliku o nazwie CreateResources.cs (CreateResources.vb for Visual Basic) tworzy plik zasobów XML o nazwie UIResources.resx, który przechowuje tytuł tabeli i PersonTable obiekt zawierający informacje o aplikacji zlokalizowanej dla języka angielskiego.

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

Poniższy kod w pliku kodu źródłowego o nazwie GetObject.cs (GetObject.vb) następnie pobiera zasoby i wyświetla je w konsoli.

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

Możesz utworzyć niezbędny plik zasobów i zestawy oraz uruchomić aplikację, wykonując następujący plik wsadowy. Należy użyć /r opcji , aby podać Resgen.exe z odwołaniem do UIElements.dll, aby mógł uzyskać dostęp do informacji o PersonTable strukturze. Jeśli używasz języka C#, zastąp nazwę kompilatora vbc.vb ciągiem csc, a następnie zastąp rozszerzenie ciągiem .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

Obsługa wersji zestawów satelickich

Domyślnie gdy ResourceManager obiekt pobiera żądane zasoby, wyszukuje zestawy satelitarne, które mają numery wersji zgodne z numerem wersji głównego zestawu. Po wdrożeniu aplikacji warto zaktualizować zestaw główny lub określone zestawy satelitarne zasobów. Program .NET Framework zapewnia obsługę przechowywania wersji głównych zestawów i zestawów satelickich.

Atrybut SatelliteContractVersionAttribute zapewnia obsługę przechowywania wersji dla głównego zestawu. Określenie tego atrybutu w głównym zestawie aplikacji umożliwia aktualizowanie i ponowne wdrażanie głównego zestawu bez aktualizowania zestawów satelickich. Po zaktualizowaniu głównego zestawu zwiększ numer wersji głównego zestawu, ale pozostaw numer wersji kontraktu satelitarnego bez zmian. Gdy menedżer zasobów pobiera żądane zasoby, ładuje wersję zestawu satelitarnego określoną przez ten atrybut.

Zestawy zasad wydawcy zapewniają obsługę przechowywania wersji zestawów satelickich. Zestaw satelitarny można aktualizować i wdrażać ponownie bez aktualizowania głównego zestawu. Po zaktualizowaniu zestawu satelitarnego zwiększ jego numer wersji i wydaj go za pomocą zestawu zasad wydawcy. W zestawie zasad wydawcy określ, że nowy zestaw satelitarny jest zgodny z poprzednią wersją. Menedżer zasobów użyje atrybutu SatelliteContractVersionAttribute w celu określenia wersji zestawu satelitarnego, ale moduł ładujący zestawów będzie wiązać się z wersją zestawu satelitarnego określonego przez zasady wydawcy. Aby uzyskać więcej informacji na temat zestawów zasad wydawcy, zobacz Tworzenie pliku zasad wydawcy.

Aby włączyć obsługę pełnej obsługi wersji zestawu, zalecamy wdrożenie zestawów o silnych nazwach w globalnej pamięci podręcznej zestawów i wdrożenie zestawów, które nie mają silnych nazw w katalogu aplikacji. Jeśli chcesz wdrożyć zestawy o silnych nazwach w katalogu aplikacji, nie będzie można zwiększać numeru wersji zestawu satelitarnego podczas aktualizowania zestawu. Zamiast tego należy przeprowadzić aktualizację w miejscu, w której zastąpisz istniejący kod zaktualizowanym kodem i zachowasz ten sam numer wersji. Jeśli na przykład chcesz zaktualizować wersję 1.0.0.0 zestawu satelitarnego o w pełni określonej nazwie zestawu "myApp.resources" Version=1.0.0.0, Culture=de, PublicKeyToken=b03f5f11d50a3a", zastąp go zaktualizowaną myApp.resources.dll, która została skompilowana z tą samą, w pełni określoną nazwą zestawu "myApp.resources, Version=1.0.0.0, Culture=de, PublicKeyToken=b03f5f1d50a3a". Należy pamiętać, że użycie aktualizacji w miejscu w plikach zestawów satelickich utrudnia aplikacji dokładne określenie wersji zestawu satelitarnego.

Aby uzyskać więcej informacji na temat przechowywania wersji zestawów, zobacz Przechowywanie wersji zestawów i Jak środowisko uruchomieniowe lokalizuje zestawy.

Pobieranie zasobów z plików resources

Jeśli zdecydujesz się nie wdrażać zasobów w zestawach satelickich, nadal możesz użyć ResourceManager obiektu, aby uzyskać bezpośredni dostęp do zasobów z plików resources. W tym celu należy prawidłowo wdrożyć pliki resources. Następnie użyjesz ResourceManager.CreateFileBasedResourceManager metody , aby utworzyć ResourceManager wystąpienie obiektu i określić katalog zawierający autonomiczne pliki resources.

Wdrażanie plików resources

W przypadku osadzania plików resources w zestawie aplikacji i zestawach satelickich każdy zestaw satelitarny ma taką samą nazwę pliku, ale jest umieszczany w podkatalogu, który odzwierciedla kulturę zestawu satelitarnego. Natomiast w przypadku bezpośredniego uzyskiwania dostępu do zasobów z plików resources można umieścić wszystkie pliki resources w jednym katalogu, zazwyczaj podkatalog katalogu aplikacji. Nazwa domyślnego pliku resources aplikacji składa się tylko z nazwy głównej bez wskazania jej kultury (na przykład strings.resources). Zasoby dla każdej zlokalizowanej kultury są przechowywane w pliku, którego nazwa składa się z nazwy głównej, po której następuje kultura (na przykład strings.ja.resources lub strings.de-DE.resources).

Na poniższej ilustracji pokazano, gdzie pliki zasobów powinny znajdować się w strukturze katalogów. Zapewnia również konwencje nazewnictwa dla plików zasobów.

Ilustracja przedstawiająca główny katalog aplikacji.

Korzystanie z menedżera zasobów

Po utworzeniu zasobów i umieszczeniu ich w odpowiednim katalogu należy utworzyć ResourceManager obiekt do użycia zasobów, wywołując metodę CreateFileBasedResourceManager(String, String, Type) . Pierwszy parametr określa nazwę główną domyślnego pliku resources aplikacji (będzie to "ciągi" na przykład w poprzedniej sekcji). Drugi parametr określa lokalizację zasobów ("Zasoby" dla poprzedniego przykładu). Trzeci parametr określa implementację ResourceSet do użycia. Jeśli trzeci parametr to null, zostanie użyte domyślne środowisko uruchomieniowe ResourceSet .

Uwaga

Nie wdrażaj aplikacji ASP.NET przy użyciu autonomicznych plików resources. Może to spowodować problemy z blokowaniem i przerwanie wdrażania programu XCOPY. Zalecamy wdrożenie ASP.NET zasobów w zestawach satelitarnych. Aby uzyskać więcej informacji, zobacz ASP.NET Zasoby strony sieci Web — omówienie.

Po utworzeniu ResourceManager wystąpienia obiektu należy użyć GetStringmetod , GetObjecti GetStream zgodnie z wcześniejszym opisem w celu pobrania zasobów. Jednak pobieranie zasobów bezpośrednio z plików resources różni się od pobierania zasobów osadzonych z zestawów. Podczas pobierania zasobów z plików GetString(String)resources metody , GetObject(String)i GetStream(String) zawsze pobierają zasoby kultury domyślnej niezależnie od bieżącej kultury. Aby pobrać zasoby bieżącej kultury aplikacji lub określonej kultury, należy wywołać GetString(String, CultureInfo)metodę , GetObject(String, CultureInfo)lub GetStream(String, CultureInfo) i określić kulturę, której zasoby mają zostać pobrane. Aby pobrać zasoby bieżącej kultury, określ wartość CultureInfo.CurrentCulture właściwości jako culture argument. Jeśli menedżer zasobów nie może pobrać zasobów cultureprogramu , używa standardowych reguł rezerwowych zasobów do pobierania odpowiednich zasobów.

Przykład

W poniższym przykładzie pokazano, jak menedżer zasobów pobiera zasoby bezpośrednio z plików resources. Przykład składa się z trzech plików zasobów opartych na tekście dla języka angielskiego (Stany Zjednoczone), francuskiego (Francja) i rosyjskiego (Rosja). Język angielski (Stany Zjednoczone) to domyślna kultura przykładu. Jego zasoby są przechowywane w następującym pliku o nazwie Strings.txt:

Greeting=Hello
Prompt=What is your name?

Zasoby kultury francuskiej (Francja) są przechowywane w następującym pliku, który nosi nazwę Strings.fr-FR.txt:

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

Zasoby kultury rosyjskiej (Rosja) są przechowywane w następującym pliku, który nosi nazwę Strings.ru-RU.txt:

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

Poniżej przedstawiono kod źródłowy dla tego przykładu. Przykład tworzy wystąpienia CultureInfo obiektów dla języka angielskiego (Stany Zjednoczone), angielskiego (Kanada), francuskiego (Francja) i rosyjskiego (Rosja) i sprawia, że każda bieżąca kultura. Następnie ResourceManager.GetString(String, CultureInfo) metoda dostarcza wartość CultureInfo.CurrentCulture właściwości jako culture argument, aby pobrać odpowiednie zasoby specyficzne dla kultury.

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!

Możesz skompilować wersję przykładu w języku C#, uruchamiając następujący plik wsadowy. Jeśli używasz języka Visual Basic, zastąp ciąg ciąg , a następnie zastąp cscvbc.cs rozszerzenie ciągiem .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

Zobacz też