ASP.NET 2.0 menyediakan fungsi konversi multi-bahasa dan konversi tema multi-gaya. Kedua bentuk implementasi ini relatif sama, sehingga akan dijelaskan bersama.
1. Pengalih bahasa Peralihan multi-bahasa Dalam Tutorial Mulai Cepat, diperkenalkan cara menyimpan dan menerapkan bahasa yang dipilih oleh pengguna. Umumnya, DropDownList digunakan untuk menampilkan bahasa yang didukung untuk dipilih pengguna. Biasanya ditempatkan di halaman master dan bahasa yang dipilih oleh pengguna disimpan di sini. itu juga dapat disimpan dalam sesi cookie atau string kueri. Ganti metode InitializeCulture di halaman untuk menggunakan bahasa yang sebelumnya dipilih oleh pengguna. Karena operasi pengaturan bahasa (di sini adalah peristiwa SelectedIndexChanged) terjadi setelah waktu InitializeCulture, agar halaman saat ini efektif segera setelah operasi pengaturan selesai, diperlukan pengalihan untuk memuat ulang halaman ini dan memicu peristiwa InitializeCulture. Di bawah ini adalah bagian kode pada quickstart, perhatikan bagian yang berwarna merah. Karena mungkin ada string kueri di balik beberapa alamat halaman, menurut saya pribadi, bagian kode merah sebaiknya diganti dengan Response.Redirect(Request.Url.PathAndQuery);.
kekosongan yang dilindungi DropDownLanguage_SelectedIndexChanged (pengirim objek, EventArgs e)
{
string SelectedLanguage = DropDownLanguage.SelectedValue.ToString();
//Simpan bahasa pengguna yang dipilih di profil
Profile.SetPropertyValue("PreferredCulture", SelectedLanguage);
//Paksa inisialisasi ulang halaman untuk mengaktifkan InitializeCulture()
Respon.Redirect(Request.Url.LocalPath);
}
penggantian yang dilindungi batal InitializeCulture()
{
// ganti metode virtual InitializeCulture() untuk memeriksa apakah profil berisi pengaturan bahasa pengguna
string UserCulture = Profil.GetPropertyValue("PreferredCulture").ToString();
jika (Budaya Pengguna! = "")
{
// ada pengaturan bahasa pengguna di profil: alihkan ke sana
Thread.CurrentThread.CurrentUICulture = Info Budaya baru(UserCulture);
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(UserCulture);
}
}
Untuk mengurangi duplikasi kode, kelas halaman dasar pelanggan umumnya dikustomisasi, menjadikannya mewarisi kelas Halaman, dan kemudian menginisialisasi ulang metode InitializeCulture di kelas dasar halaman yang disesuaikan. Terakhir, warisi setiap halaman Anda dari kelas dasar halaman kustom Anda. Dengan cara ini Anda tidak perlu mengganti metode InitializeCulture di setiap halaman.
Namun cara di atas masih kurang memuaskan, karena setiap kali Anda menambahkan halaman, Anda harus mengubah kode pos untuk mewarisi kelas dasar halaman kustom.
Kami memperhatikan bahwa dalam metode InitializeCulture, hanya Culture dan UICulture dari thread saat ini yang benar-benar dimodifikasi. Jadi bisakah kedua atribut ini dimodifikasi dalam event global, seperti event Application? Saya mencobanya sejak lama, mengimplementasikan detail InitializeCulture ketika acara BeginRequest Aplikasi dipicu, mirip dengan kode berikut:
void Application_BeginRequest(pengirim objek, EventArgs e)
{
string lang = string.Empty;//default ke budaya invarian
lang = Profil.PreferredCulture;
if (string.IsNullOrEmpty(lang))
{
lang = string.Kosong;
}
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(lang);
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(lang);
}
Perhatikan bahwa bagian merah harus diganti dengan metode lain, karena objek profil belum dibuat oleh asp.net selama fase pemicu permintaan mulai. Bisa diganti dengan cookies.
Saya ingat setelah melakukan ini, tidak berhasil setelah mengatur bahasa. Saat itu, saya pikir itu akan ditangani dalam acara global dan mungkin akan ditimpa nanti, jadi mungkin tidak berhasil. Jadi metode InitializeCulture masih digunakan pada saat itu. Hari ini saya melihat seseorang di forum asp.net melakukan ini.
void Application_BeginRequest(Pengirim objek, EventArgs e){
string lang = string.Empty;//default ke budaya invarian
HttpCookie cookie = Permintaan.Cookie["DropDownName"];
if (cookie != null && cookie.Value != null)
lang = Permintaan.Form[cookie.Value];
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(lang);
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(lang);
}
Jadi saya pikir ada sesuatu yang mungkin tidak diatur dengan benar pada saat itu, jadi saya coba lagi. Ternyata itu alasan perintah header halaman <%@ Page UICulture="auto" Culture="auto" %> Budaya diatur di halaman, Mereka akan mengesampingkan pengaturan global. Setelah menghapusnya, pengaturan global mulai berlaku. Tampaknya pengaturan budaya di halaman akan menggantikan pengaturan global, dan pengaturan metode InitializeCulture di halaman (tepatnya, semua kontrol yang mendukung metode ini) akan menggantikan pengaturan halaman. Faktanya, implementasi default metode InitializeCulture di kelas Halaman kosong, jadi setelah menghapus instruksi header halaman UICulture="auto" Culture="auto", pengaturan di Global akan berlaku.
Selain itu, jika Anda benar-benar ingin menggunakan Profil (seperti saya) untuk menyimpan pilihan pengguna, Anda tidak dapat menanganinya pada tahap startrequest. Saya menanganinya ketika peristiwa PreRequestHandlerExecute dipicu:
void Application_PreRequestHandlerExecute(pengirim objek, EventArgs e)
{
string lang = string.Empty;//default ke budaya invarian
lang = Profil.PreferredCulture;
if (string.IsNullOrEmpty(lang))
{
lang = string.Kosong;
}
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(lang);
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(lang);
}
Saat ini Profile sudah dibuat, sehingga bisa digunakan.
2. Peralihan tema multi-gaya Pengalih tema
Artikel ini membahas tentang peralihan tema, dan menurut saya bentuknya sangat mirip dengan peralihan bahasa. Dia menggunakan HttpModule. Saya pikir itu dapat ditempatkan langsung di bawah pemrosesan dan distribusi acara yang sesuai di file Global.asax. Ini menggunakan cookie untuk penyimpanan. Saya masih berpikir lebih baik menggunakan Profil. Karena sudah disediakan, gunakan Profil harus di-cache, jadi kinerja tidak akan menjadi masalah.
Sumber: Akumulasi kental dan BLOG berkembang