C # 'da yerelleştirme nasıl kullanılır


268

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?


Not: visual studio ;-) için ücretsiz Microsoft MAT (Çok Dilde Uygulama Araç Seti) uzantısını yüklediğinizden emin olun ;-)
juFo 12:08

Yanıtlar:


571
  • Aşağıdakileri yaparak projenize bir Kaynak dosyası ekleyin ("strings.resx" olarak adlandırabilirsiniz): Projede Özellikler'i
    sağ tıklatın , içerik menüsünde Ekle -> Yeni Öğe ... seçeneğini belirleyin, ardından Visual C # Öğeler almak "Kaynaklar dosyasını" ve bunun adı .strings.resx
  • Resx dosyasına bir dize resouce ekleyin ve buna iyi bir ad verin (örnek: "Merhaba" olarak adlandırın ve "Merhaba" değerini verin)
  • Kaynak dosyasını kaydedin ( not: iki harfli bir dil kodu olmadığından bu varsayılan kaynak dosyası olacaktır )
  • Programınıza referanslar ekleyin: System.ThreadingveSystem.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.


24
Bu sorunun cevabı, Visual Studio tarafından burada yapılan "sahne arkası" tesisatına atıfta bulunabilir: resx.designer.cs dosyası; derlenmiş derleme ile dağıtılması gereken sınıf kütüphanesi ile derlenmiş uydu derlemeleri ve bunu kullanan herhangi bir sonraki proje, vb. Visual Studio kullanmıyorsunuz.
Tao

13
+1 yayın! Dosyaları manuel olarak yapmak yerine Zeta Kaynak Düzenleyicisi'ni ( zeta-resource-editor.com/index.html ) deneyin . Ücretsizdir ve bu tür çevirileri sadece VS'den daha hızlı yapmanıza yardımcı olur.
Killnine

4
Access ModifierPublickaynak 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.
Andrey Moiseev

3
VS 2017'de winform'daki yerelleştirmeye sahip resx'in bir hata nedeniyle çalışmadığını unutmayın (en azından sürüm 15.4'e kadar). Bir bilet mevcuttur: developercommunity.visualstudio.com/content/problem/63772/…
muccix

4
.NET 4.5'ten itibaren, Thread.CurrentThread.CurrentUICulture yerine System.Globalization.CultureInfo.DefaultThreadCurrentCulture kullanmak da mümkündür, böylece tüm uygulama için yerel ayarı evre iş parçacığı yerine iş parçacığına göre değiştirebilirsiniz
GrixM

41

Aslında oldukça basit. Örneğin, yeni bir kaynak dosyası oluşturun Strings.resx. Set Access Modifieriçin Public. Apprioriate dosya şablonunu kullanın, böylece Visual Studio otomatik olarak bir erişimci sınıfı oluşturur ( Stringsbu 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.resxolarak 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ş Stringssı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 Stringssınıf bunu da kullanır.


yerel ayar nasıl yapılır?
Matheus Simon

1
@MatheusSimon: Buna gerek yok. Varsayılan olarak, kullanıcının geçerli yerel ayarı kullanılır. Belirli bir yerel ayarı zorlamak istiyorsanız (örneğin, kullanıcıların dili manuel olarak değiştirmesine izin vermek için) , muhtemelen ilk kez herhangi bir kaynak yüklenmeden önce her bir iş parçacığında System.Threading.Thread.CurrentCulture ve CurrentUICulture ayarlamanız gerekir . Bir uygulamayı çalışma zamanında güncellemek yerine yeniden başlatmak daha kolaydır.
OregonGhost

15

Ayrıca @Fredrik Mörk'in dizeler üzerindeki büyük cevabı, forma yerelleştirme eklemek için aşağıdakileri yapın:

  • Set formun 'ın mülkü "Localizable"içintrue
  • Formun Languageözelliğini istediğiniz dile değiştirin (hepsiyle birlikte hoş bir açılır menüden)
  • Bu formdaki kontrolleri çevirin ve gerekirse hareket ettirin (gerçekten uzun Fransızca cümleleri ezin!)

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ü)


Msdn makale artık mevcut değil, herhangi bir yerine?
fuomag9

Emin değilim
görebildiğim

14

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")


2
Ad alanının (y) korunmasına yönelik yorum için teşekkür ederiz; bu, cevapsızsa hata üretmez, ancak yalnızca yedek kaynağa geri döner.
Mosca Pt

11

@Fredrik Mörk cevabının düzeltilmesi ve detaylandırılması .

  • strings.resxProjenize bir Kaynak dosyası (veya farklı bir dosya adı) ekleme
  • Set Access Modifieriçin Public(açılan içinde strings.resxdosya sekmesi)
  • Resx dosyasına bir dize resouce ekleyin: (örnek: ad Hello, değer Hello)
  • Kaynak dosyasını kaydedin

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

  • Ekle strings.fr.resx(Fransızca için)
  • Öncekiyle aynı ada ancak farklı bir değere sahip bir dize ekleyin: (ad 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.resxveya strings.fr-CA.resx.

Kullanılacak dize şu öncelik sırasına göre belirlenir:

  • Gibi ülkeye özgü kaynaklardan strings.fr-CA.resx
  • Gibi dile özgü bir kaynaktan strings.fr.resx
  • Varsayılandan strings.resx

Dile özgü kaynakların uydu montajları oluşturduğunu unutmayın .

Ayrıca buradan nasıl CurrentCulturefarklı olduğunu öğrenin .CurrentUICulture


1

Benim durumumda

[assembly: System.Resources.NeutralResourcesLanguage("ru-RU")]

AssemblyInfo.cs dosyasında işler her zamanki gibi çalışmayı engelledi.


0

@Eric Bole-Feysot cevabına ek olarak :

Uydu derlemeleri sayesinde .dll / .exe dosyalarına dayalı yerelleştirme oluşturulabilir . Bu yoldan:

  • kaynak kodu (VS projesi) dil projesinden ayrılabilir,
  • yeni bir dil eklemek projenin yeniden derlenmesini gerektirmez,
  • çeviri son kullanıcı tarafından bile yapılabilir.

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


0

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)


0

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

  • Visual Studio için Microsoft MAT uzantısını yükleyin.
  • Çözüm Gezgini'nde Proje> Özellikler> AssemblyInfo.cs dosyasına gidin
  • AssemblyInfo.cs dosyasına varsayılan, nötr dilinizi ekleyin (benim durumumda İngilizce): [assembly: System.Resources.NeutralResourcesLanguage("en")]
  • Projenizi Çözüm Gezgini'nde ve Visual Studio'da, üst menüden "Araçlar"> "Çok Dilde Uygulama Araç Seti"> "Seçimi Etkinleştir" seçeneğini tıklatarak proje için MAT'ı etkinleştirin.
    • Şimdi Solution Explorer'da projeye sağ tıklayın, "Çok Dilde Uygulama Araç Kiti"> "Çeviri dilleri ekle ..." seçeneklerini seçin ve çeviri eklemek istediğiniz dili seçin. örneğin Hollandaca.

Göreceğiniz şey, bir ....nl.xlfdosya içeren "MultilingualResources" adlı yeni bir klasör oluşturulacak olmasıdır .

Şimdi yapmanız gereken tek şey:

  1. çevirinizi varsayılan resources.resx dosyanıza ekleyin (benim durumumda İngilizce)
  2. .Xlf dosyaları .resx dosyalarını oluşturacağı / güncelleyeceği için .xlf dosyasını (.resx dosyası DEĞİL) tıklatarak çevirin.

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.