2012-06-30 37 views
7

Çok basit bir şey ve işe yaramayacağım. Dll'i globalleştirmek istiyorum, bu yüzden kaynak dosyalarını + ResourceManager kullanıyorum.CultureInfo belirtilmiş olsa da Resourcemanager aynı kaynağa dönüyor.

var p = new ResourceManager("Appname.Default", Assembly.GetExecutingAssembly()); 

bu

System.Diagnostics.Debug.WriteLine(p.GetString("greeting")); 
System.Diagnostics.Debug.WriteLine(p.GetString("greeting", new CultureInfo("nl"))); 
System.Diagnostics.Debug.WriteLine(p.GetString("greeting", new CultureInfo("nl-NL"))); 
System.Diagnostics.Debug.WriteLine(p.GetString("greeting", new CultureInfo("en"))); 

gibi dizeleri alın Ve 4 kez aynı dizeyi verir:

Ben ResourceManager böyle diyoruz. Dosyalarım

Default.resx 
Default.en.resx 
Default.nl.resx 
Default.nl-NL.resx 

ayarlar aynıdır Tüm dosya

denir, ama belirtildiği gibi - Standart dosyasında yalnızca kaynak kullanılır.

Burada neye bakıyorum?

+2

aslında uydu derleme derlenmiş alma .Resx dosya mı? Bin \ Debug klasörüne bakın ve en, nl ve nl-NL adlarıyla alt dizinleri arayın. –

+0

Çevirileri 'Default.ResourceManager.GetString' aracılığıyla almaya çalışın. Büyük olasılıkla oluşturduğunuz kaynak yöneticisi bazı yanlış parametre (ler) alır. –

cevap

10

Kaynak dosyalarını kullanmanın birkaç yolu vardır; bunlardan biri .resx dosyalarını kullanıyor. Bu dosyalar, Thread.CurrentThread.CurrentUICulture değerine bağlı olarak otomatik olarak yerelleştirilir. Yerelleştirilmiş kaynaklar (Default.nl-NL.resx) kendi dizinine (nl-NL kültür tanımlayıcısına dayanarak) derlendiğinde, varsayılan .resx dosyası derleme içerisine derlenir (örneğin ana yürütülebilir dosya). <AssemblyName>.resources.dll denir.

Bu kaynaklardan gelen değerlerin adreslenmesi,gibi <ResourceName>.<KeyName> kadar kolaydır. Bunu test etmek için, kullanmakta, kültür değiştirin: Eğer kazandı böylece programın Başlangıçta çıkış

Hello 
Hallo 

UI Kültür, üzerinde çalıştığı bilgisayarın kültürüne ayarlanır olacak

Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("en-US"); 
Console.WriteLine(Default.Greeting); 

Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("nl-NL"); 
Console.WriteLine(Default.Greeting); 

Yerelleştirilmiş kaynakları her zaman sunmak için dili kendiniz belirtmeniz gerekir. Yani, .resx dosyaları gitmek için yol gibi görünüyor.

ResourceManager'u var p = new ResourceManager("Appname.Default", Assembly.GetExecutingAssembly()); kullanırken, .resources dosyalarını okumanız gerekecektir. Eğer (durumda) Appname.Default.resources dosya yoksa, p.GetString başarısız olur. Bu yüzden, bir .resources dosyasını daha önce oluşturmuşsunuzdur, ancak yerelleştirilmiş .resx dosyalarını .resources dosyalarına dönüştürmediniz. Eğer kültür belirtmek edebilmek için ResourceManager kullanmak istiyorsanız

, şunları kullanabilirsiniz:

Default.ResourceManager.GetString("Greeting", new CultureInfo("en-US")); 
+1

Teşekkürler - Neden sadece Resources.Default kullanmadım bilmiyorum. Haftasonu olmalı! –

+0

@CodeCaster lütfen soruma bir göz atın lütfen. http://stackoverflow.com/questions/24070892/resources-dont-load-current-culture – Marc