Yerelleştirmenin işe yaramasını sağlayamıyorum.
Bir sınıf kütüphanem var. Şimdi orada resx dosyaları oluşturmak ve iş parçacığı kültürüne dayalı bazı değerleri döndürmek istiyorum.
Bunu nasıl yapabilirim?
Yerelleştirmenin işe yaramasını sağlayamıyorum.
Bir sınıf kütüphanem var. Şimdi orada resx dosyaları oluşturmak ve iş parçacığı kültürüne dayalı bazı değerleri döndürmek istiyorum.
Bunu nasıl yapabilirim?
Yanıtlar:
strings.resx
System.Threading
veSystem.Globalization
Bu kodu çalıştırın:
Console.WriteLine(Properties.strings.Hello);
"Merhaba" yazmalıdır.
Şimdi, "strings.fr.resx" adlı yeni bir kaynak dosyası ekleyin ("fr" bölümünü not edin; bu dosya Fransızca kaynaklar içerecektir). Strings.resx ile aynı ada sahip, ancak değeri Fransızca olan bir dize kaynağı ekleyin (Name = "Hello", Value = "Salut"). Şimdi, aşağıdaki kodu çalıştırırsanız, Salut'u yazdırmalıdır:
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("fr-FR");
Console.WriteLine(Properties.strings.Hello);
Olan şey, sistemin "fr-FR" için bir kaynak arayacağıdır. Birini bulamaz (dosyanızda "fr" belirttikten sonra). Daha sonra bulduğu (ve kullandığı) "fr" denetimine geri döner.
Aşağıdaki kod "Merhaba" yazdıracaktır:
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("en-US");
Console.WriteLine(Properties.strings.Hello);
Bunun nedeni, herhangi bir "en-US" kaynağı bulunmaması ve "en" kaynağı bulunmamasıdır, bu nedenle başlangıçtan eklediğimiz varsayılana geri döner.
Gerekirse daha spesifik kaynaklara sahip dosyalar oluşturabilirsiniz (örneğin, sırasıyla Fransa ve Kanada'da Fransızca için strings.fr-FR.resx ve strings.fr-CA.resx). Bu tür her dosyaya, geri düşeceği kaynaktan farklı olan bu dizelerin kaynaklarını eklemeniz gerekecektir. Dolayısıyla, Fransa ve Kanada'da bir metin aynıysa, metni strings.fr.resx içine koyabilirsiniz, Kanada Fransızcası'nda farklı olan dizeler strings.fr-CA.resx dosyasına girebilir.
Access Modifier
Public
kaynak sınıfının oluşturulması için ayarlanmalıdır . Sınıfın mutlaka Özellikler ad alanında olması gerekmez. Burada, .resx dosyasını yerleştirirsiniz.
Aslında oldukça basit. Örneğin, yeni bir kaynak dosyası oluşturun Strings.resx
. Set Access Modifier
için Public
. Apprioriate dosya şablonunu kullanın, böylece Visual Studio otomatik olarak bir erişimci sınıfı oluşturur ( Strings
bu durumda ad olacaktır ). Bu varsayılan diliniz.
Şimdi, diyelim ki Alman yerelleştirmesi eklemek istediğinizde, yerelleştirilmiş bir resx dosyası ekleyin. Bu tipik Strings.de.resx
olarak bu durumda olacaktır. Örneğin, Avusturya için ek yerelleştirme eklemek isterseniz, ayrıca bir Strings.de-AT.resx
.
Şimdi git bir dize oluştur - diyelim adıyla bir dize HelloWorld
. Gözlerinde farklı Strings.resx
, değerle bu dizeyi ekleyin "Merhaba, Dünya!". In Strings.de.resx
, "Alo, Welt!" Ekleyin. Ve içine Strings.de-AT.resx
"Servus, Welt!" Ekleyin. Şimdiye kadar.
Şimdi bu oluşturulmuş Strings
sınıf var ve bir alıcı ile bir özelliği var HelloWorld
. Bu mülkün alınması "Servus, Welt!" yerel ayarınız de-AT olduğunda, "Hallo, Welt! Yerel ayarınız başka bir yerel ayar olduğunda (de-DE ve de-CH dahil) ve yerel ayarınız başka bir şey olduğunda" Merhaba, Dünya! " yerelleştirilmiş sürümde eksik olan kaynak yöneticisi, en uzman olandan değişmez kaynağa kadar zinciri otomatik olarak yürütecaktır.
Bir ResourceManager
şeyleri tam olarak nasıl yüklediğiniz konusunda daha fazla kontrol için sınıfı kullanabilirsiniz . Oluşturulan Strings
sınıf bunu da kullanır.
Ayrıca @Fredrik Mörk'in dizeler üzerindeki büyük cevabı, forma yerelleştirme eklemek için aşağıdakileri yapın:
"Localizable"
içintrue
Language
özelliğini istediğiniz dile değiştirin (hepsiyle birlikte hoş bir açılır menüden)Düzenleme: Windows Forms yerelleştirme Bu MSDN makalesi, bağladığım orijinal değil ... ama gerekirse daha fazla ışık tutabilir. (eskisi götürüldü)
F.Mörk'ün büyük cevabı. Çeviriyi güncelleştirmek veya uygulama yayınlandıktan sonra yeni diller eklemek istiyorsanız, sıkışmış olursunuz, çünkü resources.dll dosyasını oluşturmak için her zaman yeniden derlemeniz gerekir.
İşte el ile bir kaynak dll derlemek için bir çözümdür. Resgen.exe ve al.exe araçlarını (sdk ile yüklü) kullanır.
Bir Strings.fr.resx kaynak dosyanız olduğunu varsayalım, bir kaynak dll dosyasını aşağıdaki toplu işle derleyebilirsiniz:
resgen.exe /compile Strings.fr.resx,WpfRibbonApplication1.Strings.fr.resources
Al.exe /t:lib /embed:WpfRibbonApplication1.Strings.fr.resources /culture:"fr" /out:"WpfRibbonApplication1.resources.dll"
del WpfRibbonApplication1.Strings.fr.resources
pause
Orijinal ad alanını dosya adlarında tuttuğunuzdan emin olun (burada "WpfRibbonApplication1")
@Fredrik Mörk cevabının düzeltilmesi ve detaylandırılması .
strings.resx
Projenize bir Kaynak dosyası (veya farklı bir dosya adı) eklemeAccess Modifier
için Public
(açılan içinde strings.resx
dosya sekmesi)Hello
, değer Hello
)Visual Studio strings
, aslında yerleştirilmiş ilgili sınıfı otomatik olarak oluşturur strings.Designer.cs
. Sınıf, yeni oluşturulan bir .cs
dosyanın yerleştirilmesini beklediğinizle aynı ad alanındadır .
Bu kod her zaman yazdırılır Hello
, çünkü bu varsayılan kaynaktır ve dile özgü hiçbir kaynak yoktur:
Console.WriteLine(strings.Hello);
Şimdi yeni bir dile özgü kaynak ekleyin:
strings.fr.resx
(Fransızca için)Hello
, değer Salut
)Aşağıdaki kod yazdırılır Salut
:
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("fr-FR");
Console.WriteLine(strings.Hello);
Hangi kaynağın kullanıldığı bağlıdır Thread.CurrentThread.CurrentUICulture
. Windows UI dil ayarına bağlı olarak ayarlanır veya bu örnekteki gibi manuel olarak ayarlanabilir. Bununla ilgili daha fazla bilgiyi buradan edinebilirsiniz .
Sen gibi ülkeye özgü kaynak ekleyebilirsiniz strings.fr-FR.resx
veya strings.fr-CA.resx
.
Kullanılacak dize şu öncelik sırasına göre belirlenir:
strings.fr-CA.resx
strings.fr.resx
strings.resx
Dile özgü kaynakların uydu montajları oluşturduğunu unutmayın .
Ayrıca buradan nasıl CurrentCulture
farklı olduğunu öğrenin .CurrentUICulture
@Eric Bole-Feysot cevabına ek olarak :
Uydu derlemeleri sayesinde .dll / .exe dosyalarına dayalı yerelleştirme oluşturulabilir . Bu yoldan:
.Dll / .exe dosyalarına dayalı yerelleştirme oluşturmanıza olanak tanıyan LSACreator (ticari olmayan kullanım veya satın alma seçeneği için ücretsiz) adlı az bilinen bir araç vardır . Aslında, dahili olarak (dil projesinin dizininde), resx dosyalarının yerelleştirilmiş sürümlerini oluşturur / yönetir ve bir montajı @Eric Bole-Feysot'ta açıklanan şekilde derler .
ResourceManager ve .resx biraz dağınık.
Varsayılan değerin ve kültüre özgü değerlerin koda gömülmesine izin veren ve diğer kültürler için (.json veya .resx gibi) harici yerelleştirme dosyalarında genişletilebilen Lexical.Localization ¹ kullanabilirsiniz .
public class MyClass
{
/// <summary>
/// Localization root for this class.
/// </summary>
static ILine localization = LineRoot.Global.Type<MyClass>();
/// <summary>
/// Localization key "Ok" with a default string, and couple of inlined strings for two cultures.
/// </summary>
static ILine ok = localization.Key("Success")
.Text("Success")
.fi("Onnistui")
.sv("Det funkar");
/// <summary>
/// Localization key "Error" with a default string, and couple of inlined ones for two cultures.
/// </summary>
static ILine error = localization.Key("Error")
.Format("Error (Code=0x{0:X8})")
.fi("Virhe (Koodi=0x{0:X8})")
.sv("Sönder (Kod=0x{0:X8})");
public void DoOk()
{
Console.WriteLine( ok );
}
public void DoError()
{
Console.WriteLine( error.Value(0x100) );
}
}
¹ (Bu kütüphanenin koruyucusuyum)
Genel olarak çevirilerinizi, kaynak.resx gibi kaynak dosyalarına koyarsınız.
Her kültürün farklı bir adı vardır, örneğin resources.nl.resx, resources.fr.resx, resources.de.resx,…
Artık bir çözümün en önemli kısmı çevirilerinizi sürdürmektir. Visual Studio'da Microsoft MAT aracını yükleyin: Çok Dilde Uygulama Araç Seti (MAT). Winforms, wpf, asp.net (core), uwp, ile çalışır…
Genel olarak, örneğin bir WPF çözümü için, WPF projesinde
[assembly: System.Resources.NeutralResourcesLanguage("en")]
Göreceğiniz şey, bir ....nl.xlf
dosya içeren "MultilingualResources" adlı yeni bir klasör oluşturulacak olmasıdır .
Şimdi yapmanız gereken tek şey:
(.xlf dosyaları "Çok Dilli Editör" ile açılmalıdır, eğer durum böyle değilse, .xlf dosyasına sağ tıklayın, "Birlikte Aç ..." seçeneğini ve "Çok Dilde Editör" seçeneğini seçin.
İyi eğlenceler! şimdi ne tercüme edilmediğini görebilir, xlf'de çevirileri dış çeviri şirketlerine aktarabilir, tekrar içe aktarabilir, diğer projelerden çevirileri geri dönüştürebilirsiniz vb.
Daha fazla bilgi: