Aracılığıyla paylaş


.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:

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 cscvbcve olarak GetString.vbdeğ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 cscvbcve kaynak kod dosyasının uzantısını olarak .cs.vbdeğ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ı PersonTablebir 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 cscdeğiştirin vbc ve uzantısını .vb ile .csdeğ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.

Uygulamanızın ana dizinini gösteren çizim.

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ı culturealamı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 vbcdeğiştirin ve uzantısını .cs ile .vbdeğ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

Ayrıca bkz.