Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
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 ResourceManager seperti yang 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 biner .resources 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 saat runtime. Anda menggunakan metode ResourceManager.GetString untuk mengambil sumber daya string dan metode ResourceManager.GetObject atau ResourceManager.GetStream untuk mengambil sumber daya non-string. Setiap metode memiliki dua kelebihan beban:
Kelebihan beban yang parameter tunggalnya adalah string yang berisi nama sumber daya. Metode ini mencoba mengambil sumber daya tersebut untuk budaya saat ini. Untuk informasi selengkapnya, lihat metode GetString(String), GetObject(String), dan GetStream(String).
Kelebihan beban yang memiliki dua parameter: string yang berisi nama sumber daya, dan objek CultureInfo yang mewakili budaya yang sumber dayanya akan diambil. Jika kumpulan sumber daya untuk budaya tersebut tidak dapat ditemukan, pengelola sumber daya menggunakan aturan cadangan untuk mengambil sumber daya yang sesuai. Untuk informasi selengkapnya, lihat metode GetString(String, CultureInfo), GetObject(String, CultureInfo), dan GetStream(String, CultureInfo).
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 Paket dan sebarkan sumber daya. Untuk informasi tentang membuat instans objek ResourceManager, lihat bagian "Membuat instans Objek ResourceManager" di topik kelas ResourceManager.
Mengambil contoh data string
Contoh berikut memanggil metode GetString(String) untuk mengambil sumber daya string dari budaya UI saat ini. Ini termasuk sumber daya teks 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 properti Thread.CurrentCulture dan CultureInfo.CurrentUICulture. Kemudian memanggil metode GetString(String) 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: {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
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 menjadi 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 metode GetObject 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 metode GetStream(String) 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 kontrol 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
Anda dapat menggunakan file batch berikut untuk membuat contoh C#. Untuk Visual Basic, ubah csc menjadi vbc, dan ubah ekstensi file kode sumber dari .cs menjadi .vb.
csc CreateResources.cs
CreateResources
resgen AppResources.resx
csc GetStream.cs -resource:AppResources.resources
Contoh berikut menggunakan metode ResourceManager.GetObject(String) 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 struktur PersonTable ditandai dengan atribut 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
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 objek PersonTable 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 opsi /r untuk menyediakan Resgen.exe dengan referensi ke UIElements.dll sehingga dapat mengakses informasi tentang struktur PersonTable. Jika Anda menggunakan C#, ganti nama pengkompilasi vbc dengan csc, dan ganti ekstensi .vb 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 objek ResourceManager mengambil sumber daya yang diminta, objek tersebut 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 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 rakitan utama, naikkan nomor versi rakitan utama tetapi biarkan nomor versi kontrak satelit tidak berubah. Ketika pengelola sumber daya mengambil sumber daya yang diminta, ia memuat versi rakitan satelit yang ditentukan oleh atribut ini.
Rakitan kebijakan penerbit menyediakan dukungan untuk pembaruan versi rakitan satelit. Anda dapat memperbarui dan menyebarkan ulang rakitan satelit tanpa memperbarui perakitan utama. Setelah Anda memperbarui rakitan satelit, tingkatkan nomor versinya dan distribusikan dengan rakitan kebijakan penerbitan. Dalam konfigurasi kebijakan penerbit, tentukan bahwa rakitan satelit baru Anda kompatibel ke belakang dengan versi sebelumnya. Manajer sumber daya akan menggunakan atribut SatelliteContractVersionAttribute untuk menentukan versi perakitan satelit, tetapi pemuat rakitan 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 versi rakitan penuh, kami sarankan Anda menyebarkan rakitan dengan nama kuat di cache perakitan global dan menyebarkan rakitan yang tidak memiliki nama kuat di direktori aplikasi. Jika Anda ingin menyebarkan rakitan dengan nama kuat di direktori aplikasi, Anda tidak akan dapat mengubah nomor versi rakitan satelit ketika Anda memperbarui rakitan. 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 pengelolaan versi rakitan, lihat penerapan versi assembly 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 objek ResourceManager untuk mengakses sumber daya dari file .resources secara langsung. Untuk melakukan ini, Anda harus menyebarkan file .resources dengan benar. Kemudian Anda menggunakan metode ResourceManager.CreateFileBasedResourceManager untuk membuat instans objek ResourceManager 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 string.de-DE.resources).
Ilustrasi berikut menunjukkan di mana file sumber daya harus berada di struktur direktori. Ini juga memberikan konvensi penamaan untuk file .resource.
Menggunakan pengelola sumber daya
Setelah Anda membuat sumber daya dan menempatkannya di direktori yang sesuai, Anda membuat objek ResourceManager untuk menggunakan sumber daya dengan memanggil metode CreateFileBasedResourceManager(String, String, Type). 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 ResourceSet untuk digunakan. Jika parameter ketiga adalah null, maka ResourceSet runtime default digunakan.
Nota
Jangan mengimplementasikan aplikasi ASP.NET menggunakan file .resources terpisah. Ini dapat menyebabkan masalah penguncian dan mengganggu 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 objek ResourceManager, Anda menggunakan metode GetString, GetObject, dan GetStream seperti yang dibahas sebelumnya untuk mengambil sumber daya. Namun, pengambilan sumber daya langsung dari file .resources berbeda dengan pengambilan sumber daya yang disematkan dari assembly. Saat Anda mengambil sumber daya dari file .resources, metode GetString(String), 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 metode GetString(String, CultureInfo), GetObject(String, CultureInfo), atau GetStream(String, CultureInfo) dan menentukan budaya yang sumber dayanya akan diambil. Untuk mengambil kembali sumber daya dari budaya saat ini, tentukan nilai properti CultureInfo.CurrentCulture sebagai argumen culture. Jika pengelola sumber daya tidak dapat mengambil sumber daya culture, maka pengelola tersebut akan menggunakan aturan standar pelimpahan sumber daya untuk mendapatkan 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 contoh budaya default. 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. Contohnya menciptakan instans CultureInfo objek untuk budaya Inggris (Amerika Serikat), Inggris (Kanada), Prancis (Prancis), dan Rusia (Rusia), dan menjadikan masing-masing budaya sebagai budaya saat ini. Metode ResourceManager.GetString(String, CultureInfo) kemudian menyediakan nilai properti CultureInfo.CurrentCulture sebagai argumen culture 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{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 ekstensi .cs 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