ASP.NET 2.0 มีฟังก์ชันการแปลงหลายภาษาและการแปลงธีมหลายสไตล์ แบบฟอร์มการใช้งานทั้งสองแบบค่อนข้างคล้ายกัน ดังนั้นจะอธิบายร่วมกัน
1. ตัวสลับภาษา การสลับหลายภาษา ในบทช่วยสอนการเริ่มต้นอย่างรวดเร็ว จะแนะนำวิธีการจัดเก็บและใช้ภาษาที่ผู้ใช้เลือก โดยทั่วไปแล้ว DropDownList จะใช้เพื่อแสดงภาษาที่รองรับเพื่อให้ผู้ใช้เลือก โดยปกติแล้ว ภาษาที่ผู้ใช้เลือกจะถูกจัดเก็บไว้ที่นี่ นอกจากนี้ยังสามารถจัดเก็บไว้ในเซสชันคุกกี้หรือสตริงการสืบค้นได้ แทนที่เมธอด InitializeCulture ในเพจเพื่อใช้ภาษาที่ผู้ใช้เลือกไว้ก่อนหน้านี้ เนื่องจากการดำเนินการของการตั้งค่าภาษา (นี่คือเหตุการณ์ SelectedIndexChanged) เกิดขึ้นหลังจากเวลา InitializeCulture เพื่อให้เพจปัจจุบันมีผลทันทีหลังจากการดำเนินการตั้งค่าเสร็จสมบูรณ์ จำเป็นต้องมีการเปลี่ยนเส้นทางเพื่อโหลดเพจนี้ซ้ำและทริกเกอร์เหตุการณ์ InitializeCulture ด้านล่างนี้เป็นส่วนหนึ่งของโค้ดในการเริ่มต้นอย่างรวดเร็ว โปรดใส่ใจกับส่วนสีแดง เนื่องจากอาจมีสตริงการสืบค้นอยู่เบื้องหลังที่อยู่เพจบางหน้า โดยส่วนตัวแล้วฉันคิดว่าส่วนโค้ดสีแดงจะถูกแทนที่ด้วย Response.Redirect(Request.Url.PathAndQuery); ดีที่สุด
ป้องกันโมฆะ DropDownLanguage_SelectedIndexChanged (ผู้ส่งวัตถุ EventArgs e)
-
string SelectedLanguage = DropDownLanguage.SelectedValue.ToString();
//บันทึกภาษาของผู้ใช้ที่เลือกไว้ในโปรไฟล์
Profile.SetPropertyValue("PreferredCulture", SelectedLanguage);
//บังคับให้มีการเริ่มต้นเพจใหม่เพื่อเริ่มการทำงานของ InitializeCulture()
Response.Redirect (คำขอ Url.LocalPath);
-
ป้องกันแทนที่เป็นโมฆะ InitializeCulture ()
-
// แทนที่วิธีการเสมือน InitializeCulture() เพื่อตรวจสอบว่าโปรไฟล์มีการตั้งค่าภาษาของผู้ใช้หรือไม่
สตริง UserCulture = Profile.GetPropertyValue("PreferredCulture").ToString();
ถ้า (UserCulture != "")
-
// มีการตั้งค่าภาษาของผู้ใช้ในโปรไฟล์: เปลี่ยนไปใช้
Thread.CurrentThread.CurrentUICulture = CultureInfo ใหม่ (UserCulture);
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(UserCulture);
-
-
เพื่อลดความซ้ำซ้อนของโค้ด โดยทั่วไปคลาสเพจฐานลูกค้าจะถูกปรับแต่ง ทำให้สืบทอดคลาส Page จากนั้นเริ่มต้นเมธอด InitializeCulture ใหม่ในคลาสฐานของเพจแบบกำหนดเอง สุดท้าย สืบทอดแต่ละเพจของคุณจากคลาสฐานเพจที่คุณกำหนดเอง ด้วยวิธีนี้คุณไม่จำเป็นต้องแทนที่เมธอด InitializeCulture ในทุกหน้า
แต่วิธีการข้างต้นยังคงไม่น่าพอใจนัก เพราะทุกครั้งที่คุณเพิ่มเพจ คุณจะต้องแก้ไขรหัสไปรษณีย์เพื่อสืบทอดคลาสฐานของเพจแบบกำหนดเอง
เราสังเกตเห็นว่าในวิธีการ InitializeCulture เฉพาะวัฒนธรรมและ UICulture ของเธรดปัจจุบันเท่านั้นที่ได้รับการแก้ไขจริง แล้วแอตทริบิวต์ทั้งสองนี้สามารถปรับเปลี่ยนในเหตุการณ์ระดับโลก เช่น เหตุการณ์ของ Application ได้หรือไม่ ฉันลองสิ่งนี้มานานแล้ว โดยนำรายละเอียดของ InitializeCulture ไปใช้เมื่อมีการทริกเกอร์เหตุการณ์ BeginRequest ของ Application ซึ่งคล้ายกับโค้ดต่อไปนี้:
เป็นโมฆะ Application_BeginRequest (ผู้ส่งวัตถุ EventArgs e)
-
string lang = string.Empty;//ค่าเริ่มต้นสำหรับวัฒนธรรมที่ไม่แปรเปลี่ยน
lang = โปรไฟล์ วัฒนธรรมที่ต้องการ;
ถ้า (string.IsNullOrEmpty(lang))
-
lang = string.Empty;
-
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(lang);
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(lang);
-
โปรดทราบว่าส่วนสีแดงควรถูกแทนที่ด้วยวิธีอื่น เนื่องจาก asp.net ยังไม่ได้สร้างวัตถุโปรไฟล์ในระหว่างขั้นตอนการทริกเกอร์ beginningrequest สามารถถูกแทนที่ด้วยคุกกี้
ฉันจำได้ว่าหลังจากทำเช่นนี้ มันใช้งานไม่ได้หลังจากตั้งค่าภาษาแล้ว ตอนนั้นฉันคิดว่ามันจะได้รับการจัดการในเหตุการณ์ระดับโลกและอาจถูกเขียนทับในภายหลัง ดังนั้นมันอาจจะไม่ทำงาน ดังนั้นวิธี InitializeCulture จึงยังคงใช้อยู่ในขณะนั้น วันนี้ฉันเห็นใครบางคนในฟอรัม asp.net ทำสิ่งนี้
เป็นโมฆะ Application_BeginRequest (ผู้ส่งวัตถุ EventArgs e) {
string lang = string.Empty;//ค่าเริ่มต้นสำหรับวัฒนธรรมที่ไม่แปรเปลี่ยน
HttpCookie cookie = Request.Cookies["DropDownName"];
if (คุกกี้ != null && cookie.Value != null)
lang = Request.Form[cookie.Value];
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(lang);
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(lang);
-
ตอนนั้นฉันคิดว่ามีบางอย่างอาจตั้งค่าไม่ถูกต้อง ฉันจึงลองอีกครั้ง ปรากฏว่าเป็นเพราะคำสั่งส่วนหัวของหน้า <%@ Page UICulture="auto" Culture="auto" %> วัฒนธรรมถูกกำหนดไว้ในเพจ ซึ่งจะแทนที่การตั้งค่าส่วนกลาง หลังจากลบออก การตั้งค่าส่วนกลางก็มีผล ดูเหมือนว่าการตั้งค่าวัฒนธรรมในหน้าจะแทนที่การตั้งค่าส่วนกลาง และการตั้งค่าของวิธี InitializeCulture ในหน้า (ให้แม่นยำ การควบคุมทั้งหมดที่รองรับวิธีนี้) จะแทนที่การตั้งค่าหน้า ในความเป็นจริง การใช้งานเริ่มต้นของเมธอด InitializeCulture ในคลาส Page นั้นว่างเปล่า ดังนั้นหลังจากลบคำสั่งส่วนหัวของหน้า UICulture="auto" Culture="auto" แล้ว การตั้งค่าใน Global จะมีผล
นอกจากนี้ หากคุณต้องการใช้ Profile (เช่นฉัน) เพื่อจัดเก็บตัวเลือกของผู้ใช้จริงๆ คุณจะไม่สามารถจัดการมันได้ในขั้นเริ่มต้นคำขอ ฉันจะจัดการมันเมื่อมีการทริกเกอร์เหตุการณ์ PreRequestHandlerExecute:
เป็นโมฆะ Application_PreRequestHandlerExecute (ผู้ส่งวัตถุ EventArgs e)
-
string lang = string.Empty;//ค่าเริ่มต้นสำหรับวัฒนธรรมที่ไม่แปรเปลี่ยน
lang = โปรไฟล์ วัฒนธรรมที่ต้องการ;
ถ้า (string.IsNullOrEmpty(lang))
-
lang = string.Empty;
-
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(lang);
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(lang);
-
ขณะนี้โปรไฟล์ได้ถูกสร้างขึ้นแล้วจึงสามารถใช้งานได้
2. การสลับธีมหลายสไตล์ ตัวสลับธีม
บทความนี้พูดถึงการสลับธีม และฉันคิดว่าแบบฟอร์มนี้คล้ายกับการเปลี่ยนภาษามาก เขาใช้ HttpModule ฉันคิดว่ามันสามารถวางไว้ใต้การประมวลผลและการแจกจ่ายเหตุการณ์ที่เกี่ยวข้องในไฟล์ Global.asax ได้โดยตรง มันใช้คุกกี้ในการจัดเก็บ ฉันยังคิดว่า ควรใช้โปรไฟล์จะดีกว่า
ที่มา: การสะสมอย่างหนาแน่นและเฟื่องฟูของ BLOG