System.Resources.ResourceManager oluşturucuları

Uyarı

Bu makale, bu API'nin başvuru belgelerine ek açıklamalar sağlar.

ResourceManager(Type) Oluşturucu

Bu bölüm, ResourceManager(Type) oluşturucu aşırı yüklemesi ile ilgili.

Masaüstü uygulamaları

Masaüstü uygulamalarında, kaynak yöneticisi aşağıdaki gibi belirli bir kaynak dosyasını yüklemek için resourceSource parametresini kullanır:

  • NeutralResourcesLanguageAttribute özniteliği, varsayılan kültürün kaynaklarının bir uydu derlemesinde bulunduğunu belirtmek için kullanılmazsa, kaynak yöneticisi varsayılan kültür için kaynak dosyasının resourceSource parametresi tarafından belirtilen türle aynı derlemede bulunduğunu varsayar.
  • Kaynak yöneticisi, varsayılan kaynak dosyasının resourceSource parametresi tarafından belirtilen türle aynı temel ada sahip olduğunu varsayar.
  • Kaynak yöneticisi, kaynak dosyasını işlemek için varsayılan ResourceSet sınıfını kullanır.

Örneğin, MyCompany.MyProduct.MyTypeadlı bir tür verüldüğünde, kaynak yöneticisi tanımlayan derlemede MyCompany.MyProduct.MyType.resources adlı bir MyType dosyası arar.

Visual Studio'da Kaynak Tasarımcısı, varsayılan kültür için internal dosyasının temel adıyla aynı olan bir Friend (C#'de) veya (Visual Basic'te) sınıfını tanımlayan kodu otomatik olarak oluşturur. Bu, bir ResourceManager nesnesinin örneğini oluşturmayı ve belirli bir kaynak kümesiyle ilişkilendirmeyi mümkün kılar. Bunun için adı kaynağın adına karşılık gelen bir tür nesnesi alır, çünkü sınıf derleyiciye görünür olduğu sürece kaynakların da olması gerekir. Örneğin, bir .resources dosyası Resource1 olarak adlandırılırsa, aşağıdaki deyim Resource1 adlı ResourceManager dosyasını yönetmek için bir nesnesi oluşturur:

ResourceManager rm = new ResourceManager(typeof(Resource1));

Visual Studio kullanmıyorsanız, ad alanı ve adı varsayılan .resources dosyasıyla aynı olan üyeleri olmayan bir sınıf oluşturabilirsiniz. Örnek bir açıklama sunar.

Windows 8.x uygulamaları

Önemli

ResourceManager sınıfı Windows 8.x uygulamalarında desteklense de, kullanılmasını önermeyiz. Bu sınıfı yalnızca Windows 8.x uygulamalarıyla kullanılabilecek Taşınabilir Sınıf Kitaplığı projeleri geliştirirken kullanın. Windows 8.x uygulamalarından kaynak almak için bunun yerine Windows.ApplicationModel.Resources.ResourceLoader sınıfını kullanın.

Windows 8.x uygulamalarında ResourceManager derlemeyi, temel adı ve kaynak öğelerinin uygulamanın paket kaynak dizini (PRI) dosyasında bulunabileceği ad alanını çıkarsamak için resourceSource parametresini kullanır. Örneğin, MyCompany.MyProduct.MyTypeiçinde tanımlanan MyAssembly adlı bir tür verüldüğünde, kaynak yöneticisi MyAssembly adlı bir kaynak kümesi tanımlayıcısı arar ve bu kaynak kümesinde bir kapsam MyCompany.MyProduct.MyType arar. Kaynak yöneticisi, bu kapsamdaki varsayılan bağlam (geçerli kültür, geçerli yüksek karşıtlık ayarı vb.) altında kaynak öğelerini arar.

Örnek

Aşağıdaki örnek, ResourceManager(Type) nesnesinin örneğini oluşturmak için ResourceManager oluşturucuyu kullanır. İngilizce (en), Fransızca (Fransa) (fr-FR) ve Rusça (Rusya) (ru-RU) kültürleri için .txt dosyalardan derlenen kaynaklardan oluşur. Örnek, geçerli kültürü ve geçerli kullanıcı arabirimi kültürünü İngilizce (ABD), Fransızca (Fransa), Rusça (Rusya) ve İsveççe (İsveç) olarak değiştirir. Ardından yerelleştirilmiş dizeyi almak için GetString(String) yöntemini çağırır ve günün saatine bağlı bir selamlama görüntüler.

Örnek, aşağıdaki tabloda listelendiği gibi üç metin tabanlı kaynak dosyası gerektirir. Her dosya Morning, Afternoonve Eveningadlı dize kaynaklarını içerir.

Kültür Dosya adı Kaynak adı Kaynak değeri
en-US GreetingResources.txt Morning Günaydın
en-US GreetingResources.txt Afternoon İyi günler
en-US GreetingResources.txt Evening İyi akşamlar
fr-FR GreetingResources.fr-FR.txt Morning Bonjour
fr-FR GreetingResources.fr-FR.txt Afternoon Bonjour
fr-FR GreetingResources.fr-FR.txt Evening Bonsoir
ru-RU GreetingResources.ru-RU.txt Morning Доброе утро
ru-RU GreetingResources.ru-RU.txt Afternoon Добрый день
ru-RU GreetingResources.ru-RU.txt Evening Добрый вечер

Visual Basic örneğini derlemek ve Greet.exeadlı bir yürütülebilir dosya oluşturmak için aşağıdaki toplu iş dosyasını kullanabilirsiniz. C# ile derlemek için derleyici adını vbc olarak csc ve dosya uzantısını .vb olarak .csolarak değiştirin.

resgen GreetingResources.txt
vbc Greet.vb /resource: GreetingResources.resources

md fr-FR
resgen GreetingResources.fr-FR.txt
al /out:fr-FR\Greet.resources.dll /culture:fr-FR /embed: GreetingResources.fr-FR.resources

md ru-RU
resgen GreetingResources.ru-RU.txt
al /out:ru-RU\Greet.resources.dll /culture:ru-RU /embed: GreetingResources.ru-RU.resources

Örnek için kaynak kodu aşağıda verilmiştir (Visual Basic sürümü için ShowDate.vb veya kodun C# sürümü için ShowDate.cs).

using System;
using System.Resources;
using System.Globalization;
using System.Threading;

[assembly: NeutralResourcesLanguage("en")]

public class Example2
{
    public static void Main()
    {
        string[] cultureNames = [ "en-US", "fr-FR", "ru-RU", "sv-SE" ];
        DateTime noon = new DateTime(DateTime.Now.Year, DateTime.Now.Month,
                                     DateTime.Now.Day, 12, 0, 0);
        DateTime evening = new DateTime(DateTime.Now.Year, DateTime.Now.Month,
                                        DateTime.Now.Day, 18, 0, 0);

        ResourceManager rm = new ResourceManager(typeof(GreetingResources));

        foreach (var cultureName in cultureNames)
        {
            Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(cultureName);
            Console.WriteLine($"The current UI culture is {CultureInfo.CurrentUICulture.Name}");
            if (DateTime.Now < noon)
                Console.WriteLine($"{rm.GetString("Morning")}!");
            else if (DateTime.Now < evening)
                Console.WriteLine($"{rm.GetString("Afternoon")}!");
            else
                Console.WriteLine($"{rm.GetString("Evening")}!");
            Console.WriteLine();
        }
    }

    internal class GreetingResources
    {
    }
}
// The example displays output like the following:
//       The current UI culture is en-US
//       Good afternoon!
//
//       The current UI culture is fr-FR
//       Bonjour!
//
//       The current UI culture is ru-RU
//       Добрый день!
//
//       The current UI culture is sv-SE
//       Good afternoon!
Imports System.Resources
Imports System.Globalization
Imports System.Threading

<Assembly:NeutralResourcesLanguage("en")>

Module Example
   Public Sub Main()
      Dim cultureNames() As String = {"en-US", "fr-FR", "ru-RU", "sv-SE" }
      Dim noon As New Date(Date.Now.Year, Date.Now.Month, 
                           Date.Now.Day, 12,0,0)
      Dim evening As New Date(Date.Now.Year, Date.Now.Month,
                              Date.Now.Day, 18, 0, 0)                          
      
      Dim rm As New ResourceManager(GetType(GreetingResources))
      
      For Each cultureName In cultureNames
         Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(cultureName)
         Console.WriteLine("The current UI culture is {0}", 
                           CultureInfo.CurrentUICulture.Name)
         If Date.Now < noon Then
            Console.WriteLine("{0}!", rm.GetString("Morning"))
         ElseIf Date.Now < evening Then
            Console.WriteLine("{0}!", rm.GetString("Afternoon"))
         Else
            Console.WriteLine("{0}!", rm.GetString("Evening"))
         End If 
         Console.WriteLine()
      Next
   End Sub
End Module

Friend Class GreetingResources
End Class
' The example displays output like the following:
'       The current UI culture is en-US
'       Good afternoon!
'       
'       The current UI culture is fr-FR
'       Bonjour!
'       
'       The current UI culture is ru-RU
'       Добрый день!
'       
'       The current UI culture is sv-SE
'       Good afternoon!

kaynak kodu, Exampleadlı bir uygulama sınıfı tanımlamaya ek olarak, adı GreetingResourceskaynak dosyalarının temel adıyla aynı olan bir iç sınıf tanımlar. Bu, ResourceManager oluşturucuyu çağırarak bir ResourceManager(Type) nesnesinin örneğini başarıyla oluşturmayı mümkün kılar.

Çıktının, geçerli kullanıcı arabirimi kültürünün İsveççe (İsveç) olması dışında uygun yerelleştirilmiş dizeyi görüntülediğine ve bu durumda İngilizce kaynakları kullandığına dikkat edin. İsveç dili kaynakları kullanılamadığından, uygulama bunun yerine NeutralResourcesLanguageAttribute özniteliği tarafından tanımlanan varsayılan kültürün kaynaklarını kullanır.

ResourceManager(String, Assembly) Oluşturucu

Bu bölüm, ResourceManager(String, Assembly) oluşturucu aşırı yüklemesi ile ilgili.

Masaüstü uygulamaları

Masaüstü uygulamalarında, tek tek kültüre özgü kaynak dosyaları uydu derlemelerinde ve varsayılan kültürün kaynak dosyası ana derlemede yer almalıdır. Bir uydu derlemesi, bu derlemenin bildiriminde belirtilen tek bir kültüre ait kaynakları içerdiği varsayılır ve gerektiğinde yüklenir.

Uyarı

.resources dosyalarından doğrudan kaynak almak için, derlemelerden almak yerine, CreateFileBasedResourceManager nesnesinin bir örneğini oluşturmak amacıyla ResourceManager yöntemini çağırmanız gerekir.

baseName tarafından tanımlanan kaynak dosyası assemblyiçinde bulunamazsa, yöntem bir ResourceManager nesnesi oluşturur, ancak belirli bir kaynağı alma girişimi genellikle MissingManifestResourceExceptionadlı bir özel durumu atar. Özel durumun nedenini tanılama hakkında bilgi için, ResourceManager sınıfı konusunun "MissingManifestResourceException Özel Durumunu İşleme" bölümüne bakın.

Windows 8.x uygulamaları

Önemli

ResourceManager sınıfı Windows 8.x uygulamalarında desteklense de, kullanılmasını önermeyiz. Bu sınıfı yalnızca Windows 8.x uygulamalarıyla kullanılabilecek Taşınabilir Sınıf Kitaplığı projeleri geliştirirken kullanın. Windows 8.x uygulamalarından kaynak almak için bunun yerine Windows.ApplicationModel.Resources.ResourceLoader sınıfını kullanın.

Windows 8.x uygulamalarında kaynak yöneticisi, uygulamanın paket kaynak dizini (PRI) dosyasında eşleşen bir kaynak kümesi aramak için assembly parametresinin basit adını kullanır. baseName parametresi, kaynak kümesindeki bir kaynak öğesini aramak için kullanılır. Örneğin, PortableLibrary1.Resource1.de-DE.resources için kök ad PortableLibrary1.Resource1'dir.

Örnek

Aşağıdaki örnek, ResourceManager(String, Assembly) oluşturucuyu göstermek için yerelleştirilmemiş basit bir "Merhaba Dünya" uygulaması kullanır. ExampleResources.txt adlı bir metin dosyasının içeriği Greeting=Hello. Uygulama derlendiğinde, kaynak ana uygulama derlemesine eklenir.

Metin dosyası, komut isteminde Kaynak Dosya Oluşturucu (ResGen.exe) aşağıdaki şekilde kullanılarak ikili kaynak dosyasına dönüştürülebilir:

resgen ExampleResources.txt

Aşağıdaki örnek, bir ResourceManager nesnesinin örneğini oluşturan, kullanıcıdan bir ad girmesini isteyen ve bir selamlama görüntüleyen yürütülebilir kodu sağlar.

using System;
using System.Reflection;
using System.Resources;

public class Example1
{
    public static void Main()
    {
        // Retrieve the resource.
        ResourceManager rm = new ResourceManager("ExampleResources",
                                 typeof(Example).Assembly);
        string greeting = rm.GetString("Greeting");

        Console.Write("Enter your name: ");
        string name = Console.ReadLine();
        Console.WriteLine($"{greeting} {name}!");
    }
}
// The example produces output similar to the following:
//       Enter your name: John
//       Hello John!
Imports System.Globalization
Imports System.Reflection
Imports System.Resources

Module Example1
    Public Sub Main()
        ' Retrieve the resource.
        Dim rm As New ResourceManager("ExampleResources",
                                      GetType(Example).Assembly)
        Dim greeting As String = rm.GetString("Greeting")

        Console.Write("Enter your name: ")
        Dim name As String = Console.ReadLine()
        Console.WriteLine("{0} {1}!", greeting, name)
    End Sub
End Module
' The example produces output similar to the following:
'       Enter your name: John
'       Hello John!

C# dilinde aşağıdaki komut kullanılarak derlenebilir:

csc Example.cs /resource:ExampleResources.resources

Örnek, bu derlemede tanımlanan bir türü typeof işlevine (C#'da) veya GetType işlevine (Visual Basic'te) geçirerek ve Type.Assembly özelliğinin değerini alarak kaynak dosyasını içeren derlemeye başvuru alır.