Cara menggunakan pelokalan dalam C #

268

Sepertinya saya tidak bisa membuat lokalisasi berfungsi.

Saya memiliki perpustakaan kelas. Sekarang saya ingin membuat file resx di sana, dan mengembalikan beberapa nilai berdasarkan budaya utas.

Bagaimana saya bisa melakukan itu?

JL.
sumber
PS: pastikan Anda telah menginstal ekstensi Microsoft MAT (Multilingual App Toolkit) gratis untuk studio visual ;-)
juFo

Jawaban:

571
  • Tambahkan file Resource ke proyek Anda (Anda dapat menyebutnya "strings.resx") dengan melakukan hal berikut:
    Klik kanan Properties di proyek, pilih Add -> New Item ... di menu konteks, kemudian dalam daftar Visual C # Item memilih "File sumber daya" dan beri nama strings.resx.
  • Tambahkan string sumber daya dalam file resx dan berikan nama yang bagus (contoh: beri nama "Hello" dengan dan berikan nilai "Hello")
  • Simpan file sumber daya ( catatan: ini akan menjadi file sumber daya default , karena tidak memiliki kode bahasa dua huruf)
  • Tambahkan referensi ke program Anda: System.ThreadingdanSystem.Globalization

Jalankan kode ini:

Console.WriteLine(Properties.strings.Hello);

Itu harus mencetak "Halo".

Sekarang, tambahkan file sumber daya baru, bernama "strings.fr.resx" (perhatikan bagian "fr"; ini akan berisi sumber daya dalam bahasa Prancis). Tambahkan sumber daya string dengan nama yang sama seperti di strings.resx, tetapi dengan nilai dalam bahasa Prancis (Name = "Hello", Value = "Salut"). Sekarang, jika Anda menjalankan kode berikut, itu akan mencetak Salut:

Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("fr-FR");
Console.WriteLine(Properties.strings.Hello);

Yang terjadi adalah bahwa sistem akan mencari sumber daya untuk "fr-FR". Ia tidak akan menemukan satu (karena kami telah menentukan "fr" di file Anda "). Kemudian akan kembali ke memeriksa" fr ", yang ditemukan (dan digunakan).

Kode berikut, akan mencetak "Halo":

Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("en-US");
Console.WriteLine(Properties.strings.Hello);

Itu karena ia tidak menemukan sumber daya "en-AS", dan juga tidak ada sumber daya "en", sehingga akan kembali ke default, yang merupakan yang kami tambahkan dari awal.

Anda dapat membuat file dengan sumber daya yang lebih spesifik jika diperlukan (misalnya strings.fr-FR.resx dan strings.fr-CA.resx untuk bahasa Prancis di Perancis dan Kanada masing-masing). Di setiap file seperti itu Anda perlu menambahkan sumber daya untuk string yang berbeda dari sumber daya yang akan jatuh kembali. Jadi, jika sebuah teks sama di Perancis dan Kanada, Anda bisa meletakkannya di strings.fr.resx, sedangkan string yang berbeda di Kanada Perancis bisa masuk ke strings.fr-CA.resx.

Fredrik Mörk
sumber
24
Jawabannya dapat membuat referensi ke pipa "di belakang layar" yang sedang dilakukan oleh Visual Studio di sini: file resx.designer.cs, membuat intellisense berfungsi; majelis satelit yang dikompilasi dengan perpustakaan kelas, yang perlu dikerahkan dengan majelis terkompilasi dan setiap proyek selanjutnya yang menggunakannya, dll ... Jawabannya bagus dan sederhana, tetapi tidak membantu menjelaskan di mana hal-hal yang mungkin salah, misalnya jika Anda tidak menggunakan Visual Studio.
Tao
13
+1 pos! Daripada membuat file secara manual, coba Zeta Resource Editor ( zeta-resource-editor.com/index.html ). Ini gratis dan membantu Anda melakukan terjemahan semacam ini JAUH lebih cepat daripada hanya di VS.
Killnine
4
Access Modifierharus ditetapkan Publicuntuk kelas sumber daya yang akan dihasilkan. Kelas tidak perlu dalam namespace Properties, itu adalah tempat Anda meletakkan file .resx.
Andrey Moiseev
3
Ketahuilah bahwa di VS 2017 resx dengan lokalisasi di winform tidak berfungsi karena bug (setidaknya hingga versi 15.4). Tersedia tiket: developercommunity.visualstudio.com/content/problem/63772/…
muccix
4
Sebagai NET 4.5 juga memungkinkan untuk menggunakan System.Globalization.CultureInfo.DefaultThreadCurrentCulture bukan Thread.CurrentThread.CurrentUICulture sehingga Anda mengubah lokal untuk seluruh aplikasi, bukan benang oleh benang
GrixM
41

Sebenarnya cukup sederhana. Buat file sumber daya baru, misalnya Strings.resx. Setel Access Modifierke Public. Gunakan templat file yang sesuai, sehingga Visual Studio akan secara otomatis menghasilkan kelas accessor (namanya akan Strings, dalam hal ini). Ini adalah bahasa default Anda.

Sekarang, ketika Anda ingin menambahkan, katakanlah, pelokalan Jerman, tambahkan file resx lokal. Ini biasanya Strings.de.resxdalam kasus ini. Jika Anda ingin menambahkan pelokalan tambahan untuk, katakanlah, Austria, Anda juga akan membuat Strings.de-AT.resx.

Sekarang, buat string - misalkan string dengan nama HelloWorld. Di Anda Strings.resx, tambahkan string ini dengan nilai "Halo, dunia!". Di Strings.de.resx, tambahkan "Hallo, Welt!". Dan di Strings.de-AT.resx, tambahkan "Servus, Welt!". Itu sejauh ini.

Sekarang Anda memiliki Stringskelas yang dihasilkan ini , dan memiliki properti dengan pengambil HelloWorld. Mendapatkan properti ini akan memuat "Servus, Welt!" ketika lokal Anda adalah de-AT, "Hallo, Welt! ketika lokal Anda adalah de lokal lain (termasuk de-DE dan de-CH), dan" Halo, Dunia! "ketika lokal Anda adalah hal lain. Jika sebuah string adalah hilang dalam versi yang dilokalkan, manajer sumber daya akan secara otomatis berjalan menaiki rantai, dari yang paling khusus ke sumber daya yang tidak tetap.

Anda dapat menggunakan ResourceManagerkelas untuk kontrol lebih lanjut tentang bagaimana sebenarnya Anda memuat sesuatu. Kelas yang dihasilkan juga Stringsmenggunakannya.

OregonGhost
sumber
cara mengatur lokal?
Matheus Simon
1
@MatheusSimon: Anda tidak perlu melakukannya. Secara default, lokal pengguna saat ini digunakan. Jika Anda ingin memaksa lokal tertentu (misalnya untuk memungkinkan pengguna mengubah bahasa secara manual), Anda harus mengatur System.Threading.Thread.CurrentCulture dan CurrentUICulture di setiap utas , kemungkinan sebelum sumber daya apa pun dimuat untuk pertama kalinya. Lebih mudah untuk me-restart aplikasi untuk ini daripada memperbarui saat runtime.
OregonGhost
15

Selain jawaban hebat @Fredrik Mörk pada string, untuk menambahkan lokalisasi ke formulir, lakukan hal berikut:

  • Mengatur bentuk properti 's "Localizable"untuktrue
  • Ubah Languageproperti formulir ke bahasa yang Anda inginkan (dari drop-down yang bagus beserta semuanya)
  • Terjemahkan kontrol dalam bentuk itu dan pindahkan jika perlu (hancurkan kalimat-kalimat bahasa Prancis penuh yang panjang di!)

Sunting: Artikel MSDN ini tentang Pelokalan Formulir Windows bukan yang asli yang saya tautkan ... tetapi mungkin memberi lebih banyak cahaya jika diperlukan. (yang lama telah diambil)

Noelicus
sumber
Artikel msdn tidak tersedia lagi, ada pengganti?
fuomag9
Tidak yakin - saya menautkan yang terbaik yang bisa saya lihat, tapi saya tidak ingat seperti apa artikel itu 7 tahun yang lalu;)
noelicus
14

Jawaban yang bagus dari F.Mörk. Tetapi jika Anda ingin memperbarui terjemahan, atau menambahkan bahasa baru setelah aplikasi dirilis, Anda mandek, karena Anda selalu harus mengkompilasi ulang untuk menghasilkan resources.dll.

Berikut ini adalah solusi untuk mengkompilasi dll sumber daya secara manual. Ini menggunakan alat resgen.exe dan al.exe (diinstal dengan SDK).

Katakanlah Anda memiliki file sumber daya Strings.fr.resx, Anda dapat mengkompilasi dll sumber daya dengan kumpulan berikut:

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

Pastikan untuk menyimpan namespace asli dalam nama file (di sini "WpfRibbonApplication1")

Eric Bole-Feysot
sumber
2
Terima kasih atas komentarnya tentang melestarikan namespace (y), yang - jika tidak terjawab - tidak akan menghasilkan kesalahan, tetapi cukup kembali ke sumber daya cadangan.
Mosca Pt
11

Perbaikan dan elaborasi jawaban @Fredrik Mörk .

  • Tambahkan strings.resxfile Resource ke proyek Anda (atau nama file yang berbeda)
  • Setel Access Modifierke Public(di strings.resxtab file yang dibuka )
  • Tambahkan sumber string dalam file resx: (contoh: nama Hello, nilai Hello)
  • Simpan file sumber daya

Visual Studio auto-menghasilkan masing-masing stringskelas, yang sebenarnya ditempatkan di strings.Designer.cs. Kelas berada dalam namespace yang sama dengan yang Anda harapkan baru dibuat.cs untuk menempatkan file yang .

Kode ini selalu dicetak Hello, karena ini adalah sumber daya default dan tidak ada sumber daya khusus bahasa yang tersedia:

Console.WriteLine(strings.Hello);

Sekarang tambahkan sumber daya khusus bahasa baru:

  • Tambah strings.fr.resx(untuk Prancis)
  • Tambahkan string dengan nama yang sama seperti sebelumnya, tetapi nilainya berbeda: (nama Hello, nilai Salut)

Kode berikut dicetak Salut:

Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("fr-FR");
Console.WriteLine(strings.Hello);

Sumber daya apa yang digunakan tergantung pada Thread.CurrentThread.CurrentUICulture. Ini diatur tergantung pada pengaturan bahasa Windows UI, atau dapat diatur secara manual seperti dalam contoh ini. Pelajari lebih lanjut tentang ini di sini .

Anda dapat menambahkan sumber daya khusus negara seperti strings.fr-FR.resxataustrings.fr-CA.resx .

String yang akan digunakan ditentukan dalam urutan prioritas ini:

  • Dari sumber daya spesifik negara seperti strings.fr-CA.resx
  • Dari sumber seperti bahasa tertentu strings.fr.resx
  • Dari default strings.resx

Perhatikan bahwa sumber daya khusus bahasa menghasilkan perangkat satelit .

Pelajari juga CurrentCultureperbedaannya dari CurrentUICulture sini .

Andrey Moiseev
sumber
1

Dalam kasus saya

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

di AssemblyInfo.cs mencegah hal-hal berfungsi seperti biasa.

Aleksandr
sumber
0

Selain @Eric Bole-Feysot :

Berkat majelis satelit, pelokalan dapat dibuat berdasarkan file .dll / .exe . Cara ini:

  • kode sumber (proyek VS) dapat dipisahkan dari proyek bahasa,
  • menambahkan bahasa baru tidak perlu mengkompilasi ulang proyek,
  • terjemahan dapat dibuat bahkan oleh pengguna akhir.

Ada sedikit alat yang dikenal yang disebut LSACreator (gratis untuk penggunaan non-komersial atau opsi beli) yang memungkinkan Anda membuat lokalisasi berdasarkan file .dll / .exe. Bahkan, secara internal (dalam direktori proyek bahasa) ia membuat / mengelola versi file resx yang dilokalkan dan mengkompilasi sebuah perakitan dengan cara yang sama seperti yang dijelaskan oleh @Eric Bole-Feysot .

Tomasz Malik
sumber
0

ResourceManager dan .resx agak berantakan.

Anda dapat menggunakan Lexical.Localization ¹ yang memungkinkan menanamkan nilai default dan nilai-nilai spesifik budaya ke dalam kode, dan diperluas dalam file lokalisasi eksternal untuk budaya lebih lanjut (seperti .json atau .resx).

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) );
    }
}

¹ (Saya pengelola perpustakaan itu)

Menandai
sumber
0

Secara umum Anda menempatkan terjemahan Anda dalam file sumber daya, mis.

Setiap budaya spesifik memiliki nama yang berbeda, misalnya resources.nl.resx, resources.fr.resx, resources.de.resx,…

Sekarang bagian terpenting dari solusi adalah menjaga terjemahan Anda. Di Visual Studio instal alat Microsoft MAT: Multilingual App Toolkit (MAT). Bekerja dengan winforms, wpf, asp.net (core), uwp, ...

Secara umum, misalnya untuk solusi WPF, dalam proyek WPF

  • Instal ekstensi Microsoft MAT untuk Visual Studio.
  • Di Solution Explorer, navigasikan ke Project Anda> Properties> AssemblyInfo.cs
  • Tambahkan AssemblyInfo.cs bahasa default Anda yang netral (dalam bahasa Inggris kasus saya): [assembly: System.Resources.NeutralResourcesLanguage("en")]
  • Pilih proyek Anda di Solution Explorer dan di Visual Studio, dari menu atas, klik "Alat"> "Perangkat Aplikasi Multilingual"> "Aktifkan Pilihan", untuk mengaktifkan MAT untuk proyek.
    • Sekarang Klik kanan mouse pada proyek di Solution Explorer, pilih "Perangkat Aplikasi Multilingual"> "Tambahkan bahasa terjemahan ..." dan pilih bahasa yang ingin Anda tambahkan terjemahannya. misalnya belanda.

Yang akan Anda lihat adalah folder baru akan dibuat, disebut "Sumber Multilingual" yang berisi ....nl.xlffile.

Satu-satunya hal yang sekarang harus Anda lakukan adalah:

  1. tambahkan terjemahan Anda ke file resources.resx default Anda (dalam bahasa Inggris kasus saya)
  2. Terjemahkan dengan mengeklik file .xlf (BUKAN file .resx) karena file .xlf akan menghasilkan / memperbarui file .resx.

(File .xlf harus dibuka dengan "Editor Multilingual", jika ini tidak terjadi, klik kanan mouse pada file .xlf, pilih "Buka Dengan ..." dan pilih "Editor Multilingual".

Selamat bersenang-senang! sekarang Anda juga dapat melihat apa yang belum diterjemahkan, ekspor terjemahan dalam xlf ke perusahaan terjemahan eksternal, impor lagi, daur ulang terjemahan dari proyek lain dll ...

Info lebih lanjut:

juFo
sumber