Apakah ada cara menetapkan budaya untuk seluruh aplikasi? Semua utas saat ini dan utas baru?
Kami memiliki nama budaya yang disimpan dalam database, dan ketika aplikasi kami mulai, kami melakukannya
CultureInfo ci = new CultureInfo(theCultureString);
Thread.CurrentThread.CurrentCulture = ci;
Thread.CurrentThread.CurrentUICulture = ci;
Tapi, tentu saja, ini "hilang" ketika kita ingin melakukan sesuatu di utas baru. Apakah ada cara mengatur itu CurrentCulture
dan CurrentUICulture
untuk seluruh aplikasi? Jadi utas baru juga mendapatkan budaya itu? Atau apakah ini suatu peristiwa yang dipicu kapan pun utas baru dibuat yang dapat saya hubungi?
c#
multithreading
cultureinfo
Svish
sumber
sumber
Jawaban:
Di .NET 4.5, Anda bisa menggunakan
CultureInfo.DefaultThreadCurrentCulture
properti untuk mengubah budaya AppDomain.Untuk versi sebelum 4.5 Anda harus menggunakan refleksi untuk memanipulasi budaya AppDomain. Ada bidang statis pribadi di
CultureInfo
(m_userDefaultCulture
di. NET 2.0 mscorlib,s_userDefaultCulture
di .NET 4.0 mscorlib) yang mengontrol apa yangCurrentCulture
kembali jika utas belum menyetel properti itu sendiri.Ini tidak mengubah lokal utas thread dan mungkin bukan ide yang baik untuk mengirimkan kode yang mengubah budaya dengan cara ini. Mungkin berguna untuk pengujian.
sumber
Ini banyak ditanyakan. Pada dasarnya, tidak ada, tidak untuk. NET 4.0. Anda harus melakukannya secara manual di awal setiap utas baru (atau
ThreadPool
fungsi). Anda mungkin bisa menyimpan nama budaya (atau hanya objek budaya) di bidang statis untuk menyelamatkan karena harus memukul DB, tapi itu saja.sumber
Jika Anda menggunakan sumber daya, Anda dapat memaksanya secara manual dengan:
Di manajer sumber daya, ada kode yang dibuat secara otomatis yaitu sebagai berikut:
Sekarang setiap kali Anda merujuk ke string individu Anda dalam sumber ini, itu menimpa budaya (utas atau proses) dengan resourceCulture yang ditentukan.
Anda dapat menentukan bahasa seperti dalam "fr", "de" dll. Atau memasukkan kode bahasa seperti pada 0x0409 untuk en-US atau 0x0410 untuk itu-IT. Untuk daftar kode bahasa lengkap, silakan merujuk ke: Pengidentifikasi Bahasa dan Lokal
sumber
Resource1.Culture = Null;
Untuk .net 4.5 dan yang lebih tinggi, Anda harus menggunakan
sumber
Sebenarnya Anda dapat mengatur budaya utas default dan budaya UI, tetapi hanya dengan Framework 4.5+
Saya memasukkan konstruktor statis ini
dan letakkan breakpoint dalam metode Konversi ValueConverter untuk melihat apa yang tiba di ujung lainnya. CultureInfo.CurrentUICulture tidak lagi menjadi en-AS dan menjadi en-AU lengkap dengan peretasan kecil saya untuk membuatnya menghormati pengaturan regional untuk ShortTimePattern.
Hore, semuanya baik-baik saja di dunia! Atau tidak. Parameter budaya yang diteruskan ke metode Konversi masih en-AS. Mm, WTF ?! Tapi ini awal. Setidaknya begini
CultureInfo.CurrentUICulture
string.Format("{0}", DateTime.Now)
akan menggunakan pengaturan regional khusus AndaJika Anda tidak dapat menggunakan versi 4.5 dari kerangka kerja maka menyerah pada pengaturan CurrentUICulture sebagai properti statis dari CultureInfo dan atur sebagai properti statis dari salah satu kelas Anda sendiri. Ini tidak akan memperbaiki perilaku default dari string.Format atau membuat StringFormat berfungsi dengan baik di bindings kemudian berjalan pohon logis aplikasi Anda untuk membuat ulang semua binding di aplikasi Anda dan mengatur budaya konverter mereka.
sumber
Untuk ASP.NET5, yaitu ASPNETCORE, Anda dapat melakukan hal berikut di
configure
:Berikut serangkaian posting blog yang memberikan lebih banyak informasi.
sumber
Jawaban ini adalah sedikit perluasan untuk jawaban hebat @ rastating. Anda dapat menggunakan kode berikut untuk semua versi .NET tanpa khawatir:
sumber
DefaultThreadCurrentCulture
danDefaultThreadCurrentUICulture
hadir dalam Kerangka 4.0 juga, tetapi mereka Pribadi. Menggunakan Refleksi, Anda dapat dengan mudah mengaturnya. Ini akan memengaruhi semua utas di manaCurrentCulture
tidak diatur secara eksplisit (menjalankan utas juga).sumber
Inilah solusi untuk c # MVC:
Pertama: Buat atribut khusus dan ganti metode seperti ini:
Kedua: Di App_Start, cari FilterConfig.cs, tambahkan atribut ini. (ini berfungsi untuk aplikasi SELURUH)
Itu dia !
Jika Anda ingin mendefinisikan budaya untuk setiap controller / action sebagai pengganti seluruh aplikasi, Anda dapat menggunakan atribut ini seperti ini:
Atau:
sumber
Solusi yang berfungsi untuk mengatur CultureInfo untuk semua utas dan jendela.
sumber