Bagikan melalui


Mengambil sumber daya di aplikasi .NET

Saat bekerja dengan sumber daya yang dilokalkan di aplikasi .NET, idealnya Anda harus mengemas sumber daya untuk budaya default atau netral dengan perakitan utama dan membuat rakitan satelit terpisah untuk setiap bahasa atau budaya yang didukung aplikasi Anda. Anda kemudian dapat menggunakan kelas seperti yang ResourceManager dijelaskan di bagian berikutnya untuk mengakses sumber daya bernama. Jika Anda memilih untuk tidak menyematkan sumber daya Anda di rakitan utama dan rakitan satelit, Anda juga dapat mengakses file .resources biner secara langsung, seperti yang dibahas di bagian Mengambil sumber daya dari file .resources nanti di artikel ini.

Mengambil sumber daya dari rakitan

Kelas ini ResourceManager menyediakan akses ke sumber daya pada waktu proses. Anda menggunakan ResourceManager.GetString metode untuk mengambil sumber daya string dan ResourceManager.GetObject metode atau ResourceManager.GetStream untuk mengambil sumber daya non-string. Setiap metode memiliki dua kelebihan beban:

Manajer sumber daya menggunakan proses fallback sumber daya untuk mengontrol bagaimana aplikasi mengambil sumber daya khusus budaya. Untuk informasi selengkapnya, lihat bagian "Proses Fallback Sumber Daya" di Mengemas dan menyebarkan sumber daya. Untuk informasi tentang membuat ResourceManager instans objek, lihat bagian "Membuat instans Objek ResourceManager" di ResourceManager topik kelas.

Mengambil contoh data string

Contoh berikut memanggil GetString(String) metode untuk mengambil sumber daya string dari budaya UI saat ini. Ini termasuk sumber daya string netral untuk budaya Inggris (Amerika Serikat) dan sumber daya yang dilokalkan untuk budaya Prancis (Prancis) dan Rusia (Rusia). Sumber daya bahasa Inggris (Amerika Serikat) berikut berada dalam file bernama Strings.txt:

TimeHeader=The current time is

Sumber daya Prancis (Prancis) berada dalam file bernama Strings.fr-FR.txt:

TimeHeader=L'heure actuelle est

Sumber daya Rusia (Rusia) berada dalam file bernama Strings.ru-RU.txt:

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

Kode sumber untuk contoh ini, yang ada dalam file bernama GetString.cs untuk versi C# kode dan GetString.vb untuk versi Visual Basic, mendefinisikan array string yang berisi nama empat budaya: tiga budaya tempat sumber daya tersedia dan budaya Spanyol (Spanyol). Perulangan yang dijalankan lima kali secara acak memilih salah satu budaya ini dan menetapkannya ke Thread.CurrentCulture properti dan CultureInfo.CurrentUICulture . Kemudian memanggil GetString(String) metode untuk mengambil string yang dilokalkan, yang ditampilkan bersama dengan waktu hari.

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

File batch (.bat) berikut mengkompilasi contoh dan menghasilkan rakitan satelit di direktori yang sesuai. Perintah disediakan untuk bahasa dan pengkompilasi C#. Untuk Visual Basic, ubah csc ke vbc, dan ubah GetString.cs ke 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

Ketika budaya UI saat ini adalah Spanyol (Spanyol), perhatikan bahwa contoh menampilkan sumber daya bahasa Inggris, karena sumber daya bahasa Spanyol tidak tersedia, dan bahasa Inggris adalah budaya default contoh.

Mengambil contoh data objek

Anda dapat menggunakan GetObject metode dan GetStream untuk mengambil data objek. Ini termasuk jenis data primitif, objek yang dapat diserialisasikan, dan objek yang disimpan dalam format biner (seperti gambar).

Contoh berikut menggunakan GetStream(String) metode untuk mengambil bitmap yang digunakan di jendela splash pembukaan aplikasi. Kode sumber berikut dalam file bernama CreateResources.cs (untuk C#) atau CreateResources.vb (untuk Visual Basic) menghasilkan file .resx yang berisi gambar serial. Dalam hal ini, gambar dimuat dari file bernama SplashScreen.jpg; Anda dapat mengubah nama file untuk mengganti gambar Anda sendiri.

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

Kode berikut mengambil sumber daya dan menampilkan gambar dalam PictureBox kontrol.

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

Anda dapat menggunakan file batch berikut untuk membuat contoh C#. Untuk Visual Basic, ubah csc ke vbc, dan ubah ekstensi file kode sumber dari .cs ke .vb.

csc CreateResources.cs
CreateResources

resgen AppResources.resx

csc GetStream.cs -resource:AppResources.resources

Contoh berikut menggunakan ResourceManager.GetObject(String) metode untuk mendeserialisasi objek kustom. Contohnya mencakup file kode sumber bernama UIElements.cs (UIElements.vb untuk Visual Basic) yang menentukan struktur berikut bernama PersonTable. Struktur ini dimaksudkan untuk digunakan oleh rutinitas tampilan tabel umum yang menampilkan nama kolom tabel yang dilokalkan. Perhatikan bahwa PersonTable struktur ditandai dengan SerializableAttribute atribut .

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

Kode berikut dari file bernama CreateResources.cs (CreateResources.vb untuk Visual Basic) membuat file sumber daya XML bernama UIResources.resx yang menyimpan judul tabel dan PersonTable objek yang berisi informasi untuk aplikasi yang dilokalkan untuk bahasa Inggris.

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

Kode berikut dalam file kode sumber bernama GetObject.cs (GetObject.vb) kemudian mengambil sumber daya dan menampilkannya ke konsol.

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

Anda dapat membangun file sumber daya dan rakitan yang diperlukan dan menjalankan aplikasi dengan menjalankan file batch berikut. Anda harus menggunakan /r opsi untuk menyediakan Resgen.exe dengan referensi ke UIElements.dll sehingga dapat mengakses informasi tentang PersonTable struktur. Jika Anda menggunakan C#, ganti vbc nama pengkompilasi dengan csc, dan ganti .vb ekstensi dengan .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

Dukungan versi untuk rakitan satelit

Secara default, ketika ResourceManager objek mengambil sumber daya yang diminta, objek mencari rakitan satelit yang memiliki nomor versi yang cocok dengan nomor versi rakitan utama. Setelah menyebarkan aplikasi, Anda mungkin ingin memperbarui rakitan utama atau rakitan satelit sumber daya tertentu. .NET Framework menyediakan dukungan untuk membuat versi rakitan utama dan rakitan satelit.

Atribut ini SatelliteContractVersionAttribute menyediakan dukungan penerapan versi untuk rakitan utama. Menentukan atribut ini pada rakitan utama aplikasi memungkinkan Anda memperbarui dan menyebarkan ulang rakitan utama tanpa memperbarui rakitan satelitnya. Setelah Anda memperbarui assembly utama, naikkan nomor versi rakitan utama tetapi biarkan nomor versi kontrak satelit tidak berubah. Ketika resource manager mengambil sumber daya yang diminta, resource manager memuat versi rakitan satelit yang ditentukan oleh atribut ini.

Rakitan kebijakan penerbit memberikan dukungan untuk membuat versi rakitan satelit. Anda dapat memperbarui dan menyebarkan ulang rakitan satelit tanpa memperbarui perakitan utama. Setelah Anda memperbarui rakitan satelit, tingkatkan nomor versinya dan kirim dengan perakitan kebijakan penerbit. Dalam perakitan kebijakan penerbit, tentukan bahwa rakitan satelit baru Anda kompatibel mundur dengan versi sebelumnya. Manajer sumber daya akan menggunakan SatelliteContractVersionAttribute atribut untuk menentukan versi rakitan satelit, tetapi pemuat perakitan akan mengikat ke versi rakitan satelit yang ditentukan oleh kebijakan penerbit. Untuk informasi selengkapnya tentang rakitan kebijakan penerbit, lihat Membuat file kebijakan penerbit.

Untuk mengaktifkan dukungan penerapan versi rakitan penuh, kami sarankan Anda menyebarkan rakitan bernama kuat di cache perakitan global dan menyebarkan rakitan yang tidak memiliki nama yang kuat di direktori aplikasi. Jika Anda ingin menyebarkan rakitan bernama kuat di direktori aplikasi, Anda tidak akan dapat menaikkan nomor versi rakitan satelit saat Memperbarui perakitan. Sebagai gantinya, Anda harus melakukan pembaruan di tempat di mana Anda mengganti kode yang ada dengan kode yang diperbarui dan mempertahankan nomor versi yang sama. Misalnya, jika Anda ingin memperbarui versi 1.0.0.0 dari rakitan satelit dengan nama rakitan yang sepenuhnya ditentukan "myApp.resources, Version=1.0.0.0, Culture=de, PublicKeyToken=b03f5f11d50a3a", menimpanya dengan myApp.resources.dll yang diperbarui yang telah dikompilasi dengan nama rakitan yang sama dan sepenuhnya ditentukan "myApp.resources, Version=1.0.0.0, Culture=de, PublicKeyToken=b03f5f11d50a3a". Perhatikan bahwa menggunakan pembaruan di tempat pada file rakitan satelit menyulitkan aplikasi untuk menentukan versi rakitan satelit secara akurat.

Untuk informasi selengkapnya tentang penerapan versi rakitan, lihat Penerapan versi rakitan dan Cara Runtime menemukan rakitan.

Mengambil sumber daya dari File .resources

Jika Anda memilih untuk tidak menyebarkan sumber daya di rakitan satelit, Anda masih dapat menggunakan ResourceManager objek untuk mengakses sumber daya dari file .resources secara langsung. Untuk melakukan ini, Anda harus menyebarkan file .resources dengan benar. Kemudian Anda menggunakan ResourceManager.CreateFileBasedResourceManager metode untuk membuat ResourceManager instans objek dan menentukan direktori yang berisi file .resources mandiri.

Menyebarkan File .resources

Ketika Anda menyematkan file .resources dalam rakitan aplikasi dan rakitan satelit, setiap rakitan satelit memiliki nama file yang sama, tetapi ditempatkan dalam subdirektori yang mencerminkan budaya perakitan satelit. Sebaliknya, ketika Anda mengakses sumber daya dari file .resources secara langsung, Anda dapat menempatkan semua file .resources dalam satu direktori, biasanya subdirektori direktori aplikasi. Nama file .resources default aplikasi hanya terdiri dari nama akar, tanpa indikasi budayanya (misalnya, strings.resources). Sumber daya untuk setiap budaya yang dilokalkan disimpan dalam file yang namanya terdiri dari nama akar diikuti oleh budaya (misalnya, strings.ja.resources atau strings.de-DE.resources).

Ilustrasi berikut menunjukkan di mana file sumber daya harus berada di struktur direktori. Ini juga memberikan konvensi penamaan untuk file .resource.

Ilustrasi yang menunjukkan direktori utama untuk aplikasi Anda.

Menggunakan resource manager

Setelah Anda membuat sumber daya dan menempatkannya di direktori yang sesuai, Anda membuat ResourceManager objek untuk menggunakan sumber daya dengan memanggil CreateFileBasedResourceManager(String, String, Type) metode . Parameter pertama menentukan nama akar file .resources default aplikasi (ini akan menjadi "string" untuk contoh di bagian sebelumnya). Parameter kedua menentukan lokasi sumber daya ("Sumber Daya" untuk contoh sebelumnya). Parameter ketiga menentukan implementasi yang ResourceSet akan digunakan. Jika parameter ketiga adalah null, runtime ResourceSet default digunakan.

Catatan

Jangan menyebarkan aplikasi ASP.NET menggunakan file .resources mandiri. Ini dapat menyebabkan masalah penguncian dan memutus penyebaran XCOPY. Kami menyarankan agar Anda menyebarkan sumber daya ASP.NET di rakitan satelit. Untuk informasi selengkapnya, lihat Gambaran Umum Sumber Daya Halaman Web ASP.NET.

Setelah membuat instans ResourceManager objek, Anda menggunakan GetStringmetode , GetObject, dan GetStream seperti yang dibahas sebelumnya untuk mengambil sumber daya. Namun, pengambilan sumber daya langsung dari file .resources berbeda dari pengambilan sumber daya yang disematkan dari rakitan. Ketika Anda mengambil sumber daya dari file .resources, GetString(String)metode , , GetObject(String)dan GetStream(String) selalu mengambil sumber daya budaya default terlepas dari budaya saat ini. Untuk mengambil sumber daya budaya aplikasi saat ini atau budaya tertentu, Anda harus memanggil GetString(String, CultureInfo)metode , , GetObject(String, CultureInfo)atau GetStream(String, CultureInfo) dan menentukan budaya yang sumber dayanya akan diambil. Untuk mengambil sumber daya budaya saat ini, tentukan nilai CultureInfo.CurrentCulture properti sebagai culture argumen. Jika resource manager tidak dapat mengambil sumber daya culture, resource fallback menggunakan aturan fallback sumber daya standar untuk mengambil sumber daya yang sesuai.

Contoh

Contoh berikut menggambarkan bagaimana resource manager mengambil sumber daya langsung dari file .resources. Contohnya terdiri dari tiga file sumber daya berbasis teks untuk budaya Inggris (Amerika Serikat), Prancis (Prancis), dan Rusia (Rusia). Bahasa Inggris (Amerika Serikat) adalah budaya default contoh. Sumber dayanya disimpan dalam file berikut bernama Strings.txt:

Greeting=Hello
Prompt=What is your name?

Sumber daya untuk budaya Prancis (Prancis) disimpan dalam file berikut, yang diberi nama Strings.fr-FR.txt:

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

Sumber daya untuk budaya Rusia (Rusia) disimpan dalam file berikut, yang diberi nama Strings.ru-RU.txt:

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

Berikut ini adalah kode sumber untuk contoh. Contoh objek instansiasi CultureInfo untuk budaya Inggris (Amerika Serikat), Inggris (Kanada), Prancis (Prancis), dan Rusia (Rusia), dan menjadikan setiap budaya saat ini. Metode ini ResourceManager.GetString(String, CultureInfo) kemudian menyediakan nilai CultureInfo.CurrentCulture properti sebagai culture argumen untuk mengambil sumber daya khusus budaya yang sesuai.

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!

Anda dapat mengkompilasi contoh versi C# dengan menjalankan file batch berikut. Jika Anda menggunakan Visual Basic, ganti csc dengan vbc, dan ganti .cs ekstensi dengan .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

Lihat juga