Kami mencatat setiap pengecualian yang terjadi di sistem kami dengan menulis Exception.Message ke file. Namun, mereka ditulis dalam budaya klien. Dan kesalahan Turki tidak berarti banyak bagi saya.
Jadi bagaimana kita bisa mencatat pesan kesalahan dalam bahasa Inggris tanpa mengubah budaya pengguna?
c#
.net
exception
localization
Carra
sumber
sumber
Jawaban:
Masalah ini dapat diselesaikan sebagian. Kode pengecualian Kerangka memuat pesan kesalahan dari sumber dayanya, berdasarkan lokal utas saat ini. Dalam kasus beberapa pengecualian, ini terjadi pada saat properti Pesan diakses.
Untuk pengecualian tersebut, Anda dapat memperoleh versi bahasa Inggris AS lengkap dari pesan tersebut dengan secara singkat mengalihkan lokal utas ke en-AS saat masuk (menyimpan lokal pengguna asli sebelumnya dan mengembalikannya segera setelah itu).
Melakukan ini pada utas terpisah bahkan lebih baik: ini memastikan tidak akan ada efek samping. Sebagai contoh:
Di mana kelas ExceptionLogger terlihat seperti:
Namun, seperti Joe ditunjukkan dengan benar dalam komentar tentang revisi sebelumnya atas balasan ini, beberapa pesan sudah (sebagian) dimuat dari sumber daya bahasa pada saat pengecualian dilemparkan.
Ini berlaku untuk bagian 'parameter tidak boleh nol' dari pesan yang dihasilkan ketika pengecualian ArgumentNullException ("foo") dilemparkan, misalnya. Dalam kasus tersebut, pesan akan tetap muncul (sebagian) terlokalisasi, bahkan ketika menggunakan kode di atas.
Selain dengan menggunakan peretasan yang tidak praktis, seperti menjalankan semua kode non-UI Anda pada utas dengan lokal en-AS untuk memulai, tampaknya tidak banyak yang dapat Anda lakukan tentang hal itu: kode pengecualian .NET Framework tidak memiliki fasilitas untuk mengganti lokal pesan kesalahan.
sumber
t.CurrentUICulture = new System.Globalization.CultureInfo("fr-FR");
dant.CurrentCulture = new System.Globalization.CultureInfo("fr-FR");
belum, pengecualian yang dihasilkan adalah dalam bahasa Inggris ...Environment.GetResourceString("...")
demikian solusi Anda tidak berfungsi lagi. Hal terbaik adalah melempar pengecualian khusus dengan teks pesan (bahasa Inggris) Anda sendiri dan menggunakan properti InnerException untuk mempertahankan yang lama.Anda dapat mencari pesan pengecualian asli di unlocalize.com
sumber
No records found
.Poin yang kontroversial mungkin, tetapi alih-alih mengatur budaya
en-US
, Anda dapat mengaturnyaInvariant
. DalamInvariant
budaya, pesan kesalahan dalam bahasa Inggris.Ini memiliki keuntungan karena tidak terlihat bias, terutama untuk lokal berbahasa Inggris non-Amerika. (alias menghindari komentar sinis dari rekan kerja)
sumber
catch
.Berikut adalah solusi yang tidak memerlukan pengkodean apa pun dan berfungsi bahkan untuk teks-teks pengecualian yang dimuat terlalu dini untuk dapat diubah oleh kode (misalnya, yang ada di mscorlib).
Ini mungkin tidak selalu berlaku dalam setiap kasus (itu tergantung pada pengaturan Anda karena Anda harus dapat membuat file .config selain file .exe utama) tetapi itu berfungsi untuk saya. Jadi, buat saja
app.config
di dev, (atau a[myapp].exe.config
atauweb.config
di produksi) yang berisi baris-baris berikut misalnya:Apa yang dilakukan adalah memberi tahu kerangka kerja untuk mengarahkan ikatan rakitan untuk
mscorlib
sumber daya danSystem.Xml
sumber daya, untuk versi antara 1 dan 999, dalam bahasa Prancis (budaya diatur ke "fr
") ke rakitan yang ... tidak ada (sewenang-wenang versi 999).Jadi ketika CLR akan mencari sumber daya Perancis untuk dua majelis ini (mscorlib dan System.xml), itu tidak akan menemukan mereka dan mundur ke bahasa Inggris dengan anggun. Bergantung pada konteks dan pengujian Anda, Anda mungkin ingin menambahkan majelis lain ke arahan ulang ini (majelis yang berisi sumber daya lokal).
Tentu saja saya tidak berpikir ini didukung oleh Microsoft, jadi gunakan dengan risiko Anda sendiri. Nah, jika Anda mendeteksi masalah, Anda bisa menghapus konfigurasi ini dan periksa apakah itu tidak terkait.
sumber
Windows perlu menginstal bahasa UI yang ingin Anda gunakan. Jika tidak, ia tidak memiliki cara ajaib untuk mengetahui apa pesan yang diterjemahkan.
Di Windows 7 ultimate en-US, dengan pt-PT diinstal, kode berikut:
Menghasilkan pesan di pt-PT, en-US dan en-US. Karena tidak ada file kultur Prancis yang diinstal, default ke bahasa windows default (diinstal?).
sumber
Saya tahu ini adalah topik lama, tetapi saya pikir solusi saya mungkin cukup relevan bagi siapa saja yang tersandung di dalamnya dalam pencarian web:
Dalam pengecualian logger Anda bisa mencatat ex.GetType.ToString, yang akan menyimpan nama kelas pengecualian. Saya berharap bahwa nama kelas harus independen dari bahasa dan karena itu akan selalu diwakili dalam bahasa Inggris (misalnya "System.FileNotFoundException"), meskipun saat ini saya tidak memiliki akses ke sistem bahasa asing untuk menguji ide.
Jika Anda benar-benar menginginkan teks pesan kesalahan juga, Anda dapat membuat kamus dari semua kemungkinan nama kelas pengecualian dan pesan ekuivalennya dalam bahasa apa pun yang Anda inginkan, tetapi untuk bahasa Inggris saya rasa nama kelasnya cukup memadai.
sumber
InvalidOperationException
, dilemparkan olehSystem.Xml.XmlWellFormedWriter
. Anda mencoba menebak kesalahan spesifik apa yang terjadi tanpa membaca pesan. Bisa jadi seribu hal berbeda.Tanpa WORKAROUNDS.
Tks :)
sumber
Pengaturan
Thread.CurrentThread.CurrentUICulture
akan digunakan untuk melokalkan pengecualian. Jika Anda memerlukan dua jenis pengecualian (satu untuk pengguna, satu untuk Anda), Anda dapat menggunakan fungsi berikut untuk menerjemahkan pesan pengecualian. Sedang mencari di sumber daya .NET-Libraries untuk teks asli untuk mendapatkan kunci-sumber daya dan kemudian mengembalikan nilai yang diterjemahkan. Tapi ada satu kelemahan saya belum menemukan solusi yang baik: Pesan, yang mengandung {0} dalam sumber daya tidak akan ditemukan. Jika ada yang punya solusi yang baik saya akan berterima kasih.sumber
Kerangka NET. Ada dua bagian:
Semua teks (mis. Pesan pengecualian, label tombol pada MessageBox, dll.) Dalam bahasa Inggris di .NET framework itu sendiri. Paket bahasa memiliki teks-teks yang dilokalkan.
Bergantung pada situasi Anda yang sebenarnya, solusinya adalah menghapus instalasi paket bahasa (mis. Beritahu klien untuk melakukannya). Dalam hal itu, teks pengecualian akan dalam bahasa Inggris. Namun perlu dicatat, bahwa semua teks yang disediakan kerangka kerja lainnya juga akan berbahasa Inggris (mis. Label tombol pada MessageBox, pintasan keyboard untuk ApplicationCommands).
sumber
Saya akan membayangkan salah satu dari pendekatan ini:
Pengecualian hanya pernah dibaca oleh Anda, yaitu mereka bukan fitur klien, sehingga Anda dapat menggunakan string non-lokal bawaan yang tidak akan berubah ketika Anda menjalankan dalam mode Turki.
Sertakan kode kesalahan misalnya
0x00000001
dengan setiap kesalahan sehingga Anda dapat dengan mudah mencarinya di tabel bahasa Inggris.sumber
Berdasarkan jawaban Undercover1989, tetapi memperhitungkan parameter akun dan ketika pesan terdiri dari beberapa rangkaian sumber daya (seperti pengecualian argumen).
sumber
Saya memiliki situasi yang sama, dan semua jawaban yang saya temukan di sini dan di tempat lain tidak membantu atau tidak memuaskan:
The
Thread.CurrentUICulture
mengubah bahasa pengecualian Net, tetapi tidak untukWin32Exception
, yang menggunakan sumber daya Windows dalam bahasa Windows UI itu sendiri. Jadi saya tidak pernah berhasil mencetak pesanWin32Exception
dalam bahasa Inggris, bukan bahasa Jerman, bahkan dengan menggunakanFormatMessage()
seperti yang dijelaskan dalamCara mendapatkan Win32Exception dalam Bahasa Inggris?
Karena itu saya membuat solusi saya sendiri, yang menyimpan sebagian besar pesan pengecualian yang ada untuk berbagai bahasa dalam file eksternal. Anda tidak akan mendapatkan pesan yang sangat tepat dalam bahasa yang Anda inginkan, tetapi Anda akan mendapatkan pesan dalam bahasa itu, yang jauh lebih banyak daripada yang Anda dapatkan saat ini (yang merupakan pesan dalam bahasa yang Anda mungkin tidak mengerti).
Fungsi statis dari kelas ini dapat dijalankan pada instalasi Windows dengan bahasa yang berbeda:
CreateMessages()
membuat teks khusus budayaSaveMessagesToXML()
menyimpannya sebagai file XML sebanyak bahasa dibuat atau dimuatLoadMessagesFromXML()
memuat semua file XML dengan pesan khusus bahasaSaat membuat file XML pada instalasi Windows yang berbeda dengan bahasa yang berbeda, Anda akan segera memiliki semua bahasa yang Anda butuhkan.
Mungkin Anda dapat membuat teks untuk berbagai bahasa pada 1 Windows ketika Anda memiliki beberapa paket bahasa MUI yang diinstal, tetapi saya belum mengujinya.
Diuji dengan VS2008, siap digunakan. Komentar dan saran dipersilahkan!
sumber
Thread.CurrentUICulture
juga mengubah bahasa UI, menjadikannya pilihan yang mengerikan. Contoh klasik adalah tombol Ya / Tidak / OK / Batalkan pada kotak pesan.Pesan pengecualian dalam bahasa Inggris
lalu buka folder Pelokalan dan letakkan di projectName.xml dan tambahkan
sumber
Anda harus mencatat tumpukan panggilan alih-alih hanya pesan kesalahan (IIRC, pengecualian sederhana.ToString () harus melakukan itu untuk Anda). Dari sana, Anda dapat menentukan dengan tepat dari mana pengecualian itu berasal, dan biasanya menyimpulkan dari mana pengecualian itu.
sumber
Mengganti pesan pengecualian di blok tangkap menggunakan metode ekstensi, Periksa pesan yang dilemparkan adalah dari kode atau tidak seperti yang disebutkan di bawah ini.
sumber
InvalidOperationException
. Bersenang-senang mencari tahu apa artinya tanpa pesan itu sendiri. Sebuah instance baru tidak akan secara ajaib memilikinya.Untuk tujuan Pencatatan, aplikasi tertentu mungkin perlu mengambil pesan pengecualian Bahasa Inggris (selain menampilkannya dalam UICulture klien biasa).
Untuk itu, kode berikut
dan akhirnya mengubah UICulture saat ini kembali ke UICulture sebelumnya.
sumber