.NET uygulamalarında kaynakları alma
.NET uygulamalarında yerelleştirilmiş kaynaklarla çalışırken, ideal olarak kaynakları varsayılan veya nötr kültür için ana derlemeyle paketlemeli ve uygulamanızın desteklediği her dil veya kültür için ayrı bir uydu derlemesi oluşturmalısınız. Daha sonra adlandırılmış kaynaklara ResourceManager erişmek için sınıfını sonraki bölümde açıklandığı gibi kullanabilirsiniz. Kaynaklarınızı ana derlemeye ve uydu derlemelerine eklememeyi seçerseniz, bu makalenin devamında yer alan .resources dosyalarından kaynak alma bölümünde açıklandığı gibi ikili .resources dosyalarına doğrudan da erişebilirsiniz.
Derlemelerden kaynak alma
sınıfı, ResourceManager çalışma zamanında kaynaklara erişim sağlar. Dize kaynaklarını almak için yöntemini ve ResourceManager.GetObject dize dışı kaynakları almak için veya ResourceManager.GetStream yöntemini kullanırsınızResourceManager.GetString. Her yöntemin iki aşırı yüklemesi vardır:
Tek parametresi kaynağın adını içeren bir dize olan aşırı yükleme. yöntemi geçerli kültür için bu kaynağı almayı dener. Daha fazla bilgi için , GetObject(String)ve GetStream(String) yöntemlerine GetString(String)bakın.
İki parametresi olan bir aşırı yükleme: kaynağın adını içeren bir dize ve kaynağı alınacak kültürü temsil eden bir CultureInfo nesne. Bu kültür için bir kaynak kümesi bulunamazsa, kaynak yöneticisi uygun bir kaynağı almak için geri dönüş kurallarını kullanır. Daha fazla bilgi için , GetObject(String, CultureInfo)ve GetStream(String, CultureInfo) yöntemlerine GetString(String, CultureInfo)bakın.
Kaynak yöneticisi, uygulamanın kültüre özgü kaynakları nasıl almasını denetlemek için kaynak geri dönüş işlemini kullanır. Daha fazla bilgi için Kaynakları paketleme ve dağıtma bölümündeki "Kaynak Geri Dönüş İşlemi" bölümüne bakın. Bir ResourceManager nesnenin örneğini oluşturma hakkında bilgi için sınıf konusunun "ResourceManager Nesnesi Örneği Oluşturma" bölümüne ResourceManager bakın.
Dize verisi alma örneği
Aşağıdaki örnek, geçerli ui kültürünün dize kaynaklarını almak için yöntemini çağırır GetString(String) . İngilizce (Birleşik Devletler) kültürü için nötr dize kaynağı ve Fransızca (Fransa) ve Rusça (Rusya) kültürleri için yerelleştirilmiş kaynaklar içerir. Aşağıdaki İngilizce (Birleşik Devletler) kaynağı Strings.txt adlı bir dosyadadır:
TimeHeader=The current time is
Fransızca (Fransa) kaynağı Strings.fr-FR.txt adlı bir dosyadadır:
TimeHeader=L'heure actuelle est
Rusça (Rusya) kaynağı Strings.ru-RU.txt adlı bir dosyadadır:
TimeHeader=Текущее время —
Kodun C# sürümü için GetString.cs ve Visual Basic sürümü için GetString.vb adlı bir dosyada yer alan bu örneğin kaynak kodu, dört kültürün adını içeren bir dize dizisi tanımlar: kaynakların kullanılabildiği üç kültür ve İspanyolca (İspanya) kültürü. Beş kez yürütülen bir döngü, bu kültürlerden birini rastgele seçer ve ve CultureInfo.CurrentUICulture özelliklerine Thread.CurrentCulture atar. Ardından yerelleştirilmiş dizeyi almak için yöntemini çağırır GetString(String) ve günün saatiyle birlikte görüntülenir.
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
Aşağıdaki batch (.bat) dosyası örneği derler ve uygun dizinlerde uydu derlemeleri oluşturur. Komutlar C# dili ve derleyicisi için sağlanır. Visual Basic için olarak değiştirin csc
vbc
ve olarak GetString.vb
değiştirinGetString.cs
.
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
Geçerli kullanıcı arabirimi kültürü İspanyolca (İspanya) olduğunda, İspanyolca dil kaynakları kullanılamadığından ve İngilizce örneğin varsayılan kültürü olduğundan örnekte İngilizce dil kaynaklarının görüntülendiğini unutmayın.
Nesne veri örneklerini alma
Nesne verilerini almak için ve GetStream yöntemlerini kullanabilirsinizGetObject. Buna ilkel veri türleri, serileştirilebilir nesneler ve ikili biçimde depolanan nesneler (görüntüler gibi) dahildir.
Aşağıdaki örnek, bir uygulamanın açılış giriş penceresinde kullanılan bit eşlemi almak için yöntemini kullanır GetStream(String) . CreateResources.cs (C#için) veya CreateResources.vb (Visual Basic için) adlı bir dosyada aşağıdaki kaynak kod, serileştirilmiş görüntüyü içeren bir .resx dosyası oluşturur. Bu durumda, görüntü SplashScreen.jpg adlı bir dosyadan yüklenir; dosya adını kendi görüntünüzün yerine geçecek şekilde değiştirebilirsiniz.
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
Aşağıdaki kod kaynağı alır ve görüntüyü bir PictureBox denetimde görüntüler.
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
C# örneğini oluşturmak için aşağıdaki toplu iş dosyasını kullanabilirsiniz. Visual Basic için olarak değiştirin csc
vbc
ve kaynak kod dosyasının uzantısını olarak .cs
.vb
değiştirin.
csc CreateResources.cs
CreateResources
resgen AppResources.resx
csc GetStream.cs -resource:AppResources.resources
Aşağıdaki örnek, özel bir nesnenin ResourceManager.GetObject(String) seri durumdan çıkarmak için yöntemini kullanır. Örnek, adlı aşağıdaki yapıyı tanımlayan UIElements.cs (Visual Basic için UIElements.vb) adlı PersonTable
bir kaynak kod dosyası içerir. Bu yapı, tablo sütunlarının yerelleştirilmiş adlarını görüntüleyen genel bir tablo görüntüleme yordamı tarafından kullanılmak üzere tasarlanmıştır. PersonTable
Yapının özniteliğiyle SerializableAttribute işaretlendiğini unutmayın.
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
CreateResources.cs adlı bir dosyadan (Visual Basic için CreateResources.vb) aşağıdaki kod, İngilizce dili için yerelleştirilmiş bir uygulamanın bilgilerini içeren bir tablo başlığını ve PersonTable
bir nesneyi depolayan UIResources.resx adlı bir XML kaynak dosyası oluşturur.
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
GetObject.cs (GetObject.vb) adlı bir kaynak kod dosyasındaki aşağıdaki kod, kaynakları alır ve konsolda görüntüler.
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
Aşağıdaki toplu iş dosyasını yürüterek gerekli kaynak dosyasını ve derlemeleri derleyebilir ve uygulamayı çalıştırabilirsiniz. Yapı hakkındaki PersonTable
bilgilere erişebilmesi /r
için UIElements.dll başvuru içeren Resgen.exe sağlamak için seçeneğini kullanmanız gerekir. C# kullanıyorsanız, derleyici adını ile csc
değiştirin vbc
ve uzantısını .vb
ile .cs
değiştirin.
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
Uydu derlemeleri için sürüm desteği
Varsayılan olarak, ResourceManager nesne istenen kaynakları aldığında, ana derlemenin sürüm numarasıyla eşleşen sürüm numaralarına sahip uydu derlemelerini arar. Bir uygulamayı dağıttıktan sonra ana derlemeyi veya belirli kaynak uydu derlemelerini güncelleştirmek isteyebilirsiniz. .NET Framework, ana derlemenin ve uydu derlemelerinin sürümü için destek sağlar.
özniteliği, SatelliteContractVersionAttribute ana derleme için sürüm oluşturma desteği sağlar. Bir uygulamanın ana derlemesinde bu özniteliğin belirtilmesi, uydu derlemelerini güncelleştirmeden bir ana derlemeyi güncelleştirmenize ve yeniden dağıtmanıza olanak tanır. Ana derlemeyi güncelleştirdikten sonra ana derlemenin sürüm numarasını artırıp uydu sözleşmesi sürüm numarasını değiştirmeden bırakın. Kaynak yöneticisi istenen kaynakları aldığında, bu öznitelik tarafından belirtilen uydu derleme sürümünü yükler.
Yayımcı ilkesi derlemeleri, uydu derlemelerinin sürüm oluşturması için destek sağlar. Ana derlemeyi güncelleştirmeden bir uydu derlemesini güncelleştirebilir ve yeniden dağıtabilirsiniz. Bir uydu derlemesini güncelleştirdikten sonra, sürüm numarasını artırıp yayımcı ilkesi derlemesiyle birlikte gönderir. Yayımcı ilkesi derlemesinde, yeni uydu derlemenizin önceki sürümüyle geriye dönük olarak uyumlu olduğunu belirtin. Kaynak yöneticisi, uydu derlemesinin sürümünü belirlemek için özniteliğini kullanır SatelliteContractVersionAttribute , ancak derleme yükleyicisi yayımcı ilkesi tarafından belirtilen uydu derleme sürümüne bağlanır. Yayımcı ilkesi derlemeleri hakkında daha fazla bilgi için bkz . Yayımcı ilkesi dosyası oluşturma.
Tam derleme sürümü oluşturma desteğini etkinleştirmek için, genel derleme önbelleğinde tanımlayıcı adlı derlemeler dağıtmanızı ve uygulama dizininde tanımlayıcı adları olmayan derlemeleri dağıtmanızı öneririz. Uygulama dizininde tanımlayıcı adlı derlemeler dağıtmak istiyorsanız, derlemeyi güncelleştirdiğinizde uydu derlemesinin sürüm numarasını artıramazsınız. Bunun yerine, mevcut kodu güncelleştirilmiş kodla değiştirdiğiniz ve aynı sürüm numarasını koruyabileceğiniz yerinde bir güncelleştirme gerçekleştirmeniz gerekir. Örneğin, uydu derlemesinin 1.0.0.0 sürümünü "myApp.resources, Version=1.0.0.0, tam olarak belirtilen derleme adıyla güncelleştirmek istiyorsanız, Culture=de, PublicKeyToken=b03f5f11d50a3a", "myApp.resources, Version=1.0.0.0, Culture=de, PublicKeyToken=b03f5f11d50a3a" ile derlenmiş güncelleştirilmiş myApp.resources.dll üzerine yazın. Uydu derleme dosyalarında yerinde güncelleştirmelerin kullanılması, bir uygulamanın uydu derlemesinin sürümünü doğru bir şekilde belirlemesini zorlaştırdığını unutmayın.
Derleme sürümü oluşturma hakkında daha fazla bilgi için bkz . Derleme sürümü oluşturma ve Çalışma Zamanı derlemeleri nasıl bulur?
.resources Dosyaları'ndan kaynakları alma
Kaynakları uydu derlemelerinde dağıtmamayı seçerseniz, .resources dosyalarındaki kaynaklara doğrudan erişmek için bir ResourceManager nesnesi kullanmaya devam edebilirsiniz. Bunu yapmak için .resources dosyalarını doğru bir şekilde dağıtmanız gerekir. Ardından yöntemini kullanarak ResourceManager.CreateFileBasedResourceManager bir ResourceManager nesne örneği oluşturur ve tek başına .resources dosyalarını içeren dizini belirtirsiniz.
.resources Dosyalarını Dağıtma
.resources dosyalarını bir uygulama derlemesine ve uydu derlemelerine eklediğinizde, her uydu derlemesi aynı dosya adına sahiptir, ancak uydu derlemesinin kültürünü yansıtan bir alt dizine yerleştirilir. Buna karşılık, .resources dosyalarındaki kaynaklara doğrudan eriştiğinizde, tüm .resources dosyalarını tek bir dizine( genellikle uygulama dizininin bir alt dizinine) yerleştirebilirsiniz. Uygulamanın varsayılan .resources dosyasının adı yalnızca kök adından oluşur ve kültürüne dair hiçbir gösterge yoktur (örneğin, strings.resources). Her yerelleştirilmiş kültürün kaynakları, adı kök adından ve ardından kültürden oluşan bir dosyada depolanır (örneğin, strings.ja.resources veya strings.de-DE.resources).
Aşağıdaki çizimde, kaynak dosyalarının dizin yapısında nerede bulunması gerektiği gösterilmektedir. Ayrıca .resource dosyaları için adlandırma kuralları da sağlar.
Kaynak yöneticisini kullanma
Kaynaklarınızı oluşturup uygun dizine yerleştirdikten sonra yöntemini çağırarak CreateFileBasedResourceManager(String, String, Type) kaynakları kullanmak için bir ResourceManager nesne oluşturursunuz. İlk parametre, uygulamanın varsayılan .resources dosyasının kök adını belirtir (bu, önceki bölümdeki örnekteki "dizeler" olacaktır). İkinci parametre, kaynakların konumunu belirtir ("Kaynaklar" önceki örnekte). Üçüncü parametre kullanılacak uygulamayı belirtir ResourceSet . Üçüncü parametre ise null
, varsayılan çalışma zamanı ResourceSet kullanılır.
Not
Tek başına .resources dosyalarını kullanarak ASP.NET uygulamaları dağıtmayın. Bu, kilitleme sorunlarına neden olabilir ve XCOPY dağıtımlarını bozabilir. ASP.NET kaynaklarını uydu derlemelerine dağıtmanızı öneririz. Daha fazla bilgi için bkz . ASP.NET Web Sayfası Kaynaklarına Genel Bakış.
Nesnesinin örneğini ResourceManager oluşturduktan sonra, kaynakları almak için daha önce açıklandığı gibi , GetObjectve GetStream yöntemlerini kullanırsınızGetString. Ancak, kaynakların doğrudan .resources dosyalarından alınması, katıştırılmış kaynakların derlemelerden alınmasından farklıdır. .resources dosyalarından kaynak aldığınızda, GetString(String), GetObject(String)ve GetStream(String) yöntemleri her zaman geçerli kültürden bağımsız olarak varsayılan kültürün kaynaklarını alır. Uygulamanın geçerli kültürünün veya belirli bir kültürün kaynaklarını almak için , GetObject(String, CultureInfo)veya GetStream(String, CultureInfo) yöntemini çağırmanız GetString(String, CultureInfo)ve kaynakları alınacak olan kültürü belirtmeniz gerekir. Geçerli kültürün kaynaklarını almak için bağımsız değişken olarak culture
özelliğinin CultureInfo.CurrentCulture değerini belirtin. Kaynak yöneticisi kaynaklarını culture
alamıyorsa, uygun kaynakları almak için standart kaynak geri dönüş kurallarını kullanır.
Bir örnek
Aşağıdaki örnekte, kaynak yöneticisinin kaynakları doğrudan .resources dosyalarından nasıl aldýðý gösterilmektedir. Örnek, İngilizce (Birleşik Devletler), Fransızca (Fransa) ve Rusça (Rusya) kültürleri için metin tabanlı üç kaynak dosyadan oluşur. İngilizce (Birleşik Devletler), örneğin varsayılan kültürüdür. Kaynakları Strings.txt adlı aşağıdaki dosyada depolanır:
Greeting=Hello
Prompt=What is your name?
Fransızca (Fransa) kültürünün kaynakları, Strings.fr-FR.txt adlı aşağıdaki dosyada depolanır:
Greeting=Bon jour
Prompt=Comment vous appelez-vous?
Rusça (Rusya) kültürünün kaynakları, Strings.ru-RU.txt adlı aşağıdaki dosyada depolanır:
Greeting=Здравствуйте
Prompt=Как вас зовут?
Aşağıda, örneğin kaynak kodu verilmiştir. Örnek, İngilizce (Birleşik Devletler), İngilizce (Kanada), Fransızca (Fransa) ve Rusça (Rusya) kültürleri için nesnelerin örneğini CultureInfo oluşturur ve her bir geçerli kültürü oluşturur. Yöntemi ResourceManager.GetString(String, CultureInfo) daha sonra uygun kültüre özgü kaynakları almak için bağımsız değişken olarak culture
özelliğinin değerini CultureInfo.CurrentCulture sağlar.
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!
Aşağıdaki toplu iş dosyasını çalıştırarak örneğin C# sürümünü derleyebilirsiniz. Visual Basic kullanıyorsanız, öğesini csc
ile vbc
değiştirin ve uzantısını .cs
ile .vb
değiştirin.
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