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?
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?
Jawaban:
strings.resx
.System.Threading
danSystem.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.
Access Modifier
harus ditetapkan Public
untuk kelas sumber daya yang akan dihasilkan. Kelas tidak perlu dalam namespace Properties, itu adalah tempat Anda meletakkan file .resx.
Sebenarnya cukup sederhana. Buat file sumber daya baru, misalnya Strings.resx
. Setel Access Modifier
ke 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.resx
dalam 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 Strings
kelas 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 ResourceManager
kelas untuk kontrol lebih lanjut tentang bagaimana sebenarnya Anda memuat sesuatu. Kelas yang dihasilkan juga Strings
menggunakannya.
Selain jawaban hebat @Fredrik Mörk pada string, untuk menambahkan lokalisasi ke formulir, lakukan hal berikut:
"Localizable"
untuktrue
Language
properti formulir ke bahasa yang Anda inginkan (dari drop-down yang bagus beserta semuanya)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)
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")
Perbaikan dan elaborasi jawaban @Fredrik Mörk .
strings.resx
file Resource ke proyek Anda (atau nama file yang berbeda)Access Modifier
ke Public
(di strings.resx
tab file yang dibuka )Hello
, nilai Hello
)Visual Studio auto-menghasilkan masing-masing strings
kelas, 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:
strings.fr.resx
(untuk Prancis)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.resx
ataustrings.fr-CA.resx
.
String yang akan digunakan ditentukan dalam urutan prioritas ini:
strings.fr-CA.resx
strings.fr.resx
strings.resx
Perhatikan bahwa sumber daya khusus bahasa menghasilkan perangkat satelit .
Pelajari juga CurrentCulture
perbedaannya dari CurrentUICulture
sini .
Selain @Eric Bole-Feysot :
Berkat majelis satelit, pelokalan dapat dibuat berdasarkan file .dll / .exe . Cara ini:
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 .
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)
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
[assembly: System.Resources.NeutralResourcesLanguage("en")]
Yang akan Anda lihat adalah folder baru akan dibuat, disebut "Sumber Multilingual" yang berisi ....nl.xlf
file.
Satu-satunya hal yang sekarang harus Anda lakukan adalah:
(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: