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:
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 GetString(String)metode , GetObject(String), dan GetStream(String) .
Kelebihan beban yang memiliki dua parameter: string yang berisi nama sumber daya, dan CultureInfo objek yang mewakili budaya yang sumber dayanya akan diambil. Jika kumpulan sumber daya untuk budaya tersebut tidak dapat ditemukan, resource manager menggunakan aturan fallback untuk mengambil sumber daya yang sesuai. Untuk informasi selengkapnya, lihat GetString(String, CultureInfo)metode , 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 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.
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