บทความนี้จะเริ่มต้นด้วยแนวคิดพื้นฐานของทรัพยากรโลกาภิวัฒน์และการแปลเป็นภาษาท้องถิ่นใน Asp.net และอธิบายขั้นตอนและวิธีการเพื่อให้บรรลุความเป็นสากลและการแปลเป็นภาษาท้องถิ่นใน Asp.net1.1 และ Asp.net2.0
หนึ่ง. แนวคิดพื้นฐาน
1. เหตุใดจึงต้องแปลทรัพยากรเป็นภาษาท้องถิ่น?
ผู้คนจากประเทศและภูมิภาคต่างๆ ทั่วโลกสามารถเข้าชมเว็บไซต์ของเราได้ และผู้คนในแต่ละประเทศและภูมิภาคก็มีลักษณะทางภาษาและวัฒนธรรมเป็นของตัวเอง ยกตัวอย่างมาตุภูมิอันยิ่งใหญ่ของเรา จีนแผ่นดินใหญ่ใช้ภาษาจีนตัวย่อ ในขณะที่ฮ่องกง มาเก๊า และไต้หวันใช้ภาษาจีนตัวเต็ม นอกจากนี้ แต่ละประเทศยังมีรูปแบบนิพจน์ที่แตกต่างกันสำหรับสกุลเงิน ตัวเลข ปฏิทิน และข้อมูลอื่นๆ ประเทศของเราส่วนใหญ่ใช้รูปแบบปี เดือน และวัน ในขณะที่สหรัฐอเมริกาใช้รูปแบบเดือน วัน และปี มีความแตกต่างมากมายเช่นนี้ ดังนั้นฉันจะไม่ยกตัวอย่างมากนัก เพื่อให้ผู้เยี่ยมชมเว็บไซต์ของเราได้รับประสบการณ์การใช้งานที่ดีขึ้น เราควรนำเสนอโซลูชั่นระดับโลก ตราบใดที่ผู้ใช้เลือกภาษาและภูมิภาคของเขา ไซต์จะแสดงข้อมูลหน้าตามภาษาและนิสัยทางวัฒนธรรมของเขา การแปลเป็นภาษาท้องถิ่น
2. วัฒนธรรม วัฒนธรรมคงที่ วัฒนธรรมที่ไม่เฉพาะเจาะจง
ชื่อวัฒนธรรมเฉพาะเป็นไปตามมาตรฐาน RFC 1766 และอยู่ในรูปแบบ "<ภาษารหัส2>-<ประเทศ/รหัสภูมิภาค2>" โดยที่ <ภาษารหัส2> มาจาก ISO 639-1 รหัสตัวพิมพ์เล็กสองตัว <country/regioncode2> เป็นรหัสตัวพิมพ์ใหญ่สองตัวที่ได้มาจาก ISO 3166 ตัวอย่างเช่น ภาษาอังกฤษแบบสหรัฐอเมริกาคือ "en-US" ในกรณีที่ไม่มีรหัสภาษาสองตัว จะใช้รหัสสามตัวอักษรที่ได้มาจาก ISO 639-2 ตัวอย่างเช่น รหัสสามตัวอักษร "div" จะใช้สำหรับภูมิภาคที่พูดภาษาธิเวหิ ชื่อวัฒนธรรมบางชื่อมีส่วนต่อท้ายที่ระบุสัญลักษณ์การเขียน ตัวอย่างเช่น "-Cyrl" ระบุสัญลักษณ์การเขียนซีริลลิก และ "-Latn" ระบุสัญลักษณ์การเขียนภาษาละติน ตัวอย่าง:
ชื่อวัฒนธรรม | ตัวระบุ | วัฒนธรรม ภาษา - ประเทศ |
zh-CN | 0x0804 | จีน - จีน |
zh-TW | 0x0404 | จีน - ไต้หวัน |
zh-CHS | 0x0004 | จีนตัวย่อ |
zh-CHT | 0x |
7ซี |
04 | จีน | |
ตัวเต็ม | en | 0x0009 |
อังกฤษ | en | - |
US | 0x0409 | อังกฤษ |
uz | - | UZ - Cyrl |
0x0843 | Uzbek (ซีริลลิก) - Uzbekistan uz-UZ-Latn 0x0443 | Uzbek (Latin) - Uzbekistan |
วัฒนธรรมคงที่ไม่ใช่ อ่อนไหวต่อวัฒนธรรม คุณสามารถใช้สตริงว่าง ("") เพื่อระบุวัฒนธรรมคงที่ตามชื่อหรือตามตัวระบุวัฒนธรรม 0x007F อินสแตนซ์วัฒนธรรมที่ไม่แปรเปลี่ยนจะแสดงโดยคุณสมบัติ InvariantCulture ของคลาส CultureInfo วัฒนธรรมประจำจะเกี่ยวข้องกับภาษาอังกฤษเท่านั้น ไม่ใช่ประเทศใดๆ สามารถใช้ได้เกือบทุกวิธีในเนมสเปซ "สากล" ที่ต้องใช้วัฒนธรรม หากโปรแกรมของคุณทำการเปรียบเทียบสตริงหรือการดำเนินการเปลี่ยนตัวพิมพ์ ควรใช้ InvariantCulture เพื่อให้แน่ใจว่าโดยไม่คำนึงถึงวัฒนธรรมที่ระบบกำหนด พฤติกรรมจะดำเนินการตามวัฒนธรรมคงที่ของภาษาอังกฤษที่แสดงโดย InvariantCulture อย่างไรก็ตาม วัฒนธรรมแบบคงที่จะต้องถูกใช้โดยกระบวนการที่ต้องการผลลัพธ์ที่ไม่ขึ้นกับวัฒนธรรมเท่านั้น (เช่น บริการของระบบ) มิฉะนั้น ผลลัพธ์ที่ได้รับอาจไม่ถูกต้องทางภาษาหรือไม่เหมาะสมทางวัฒนธรรม ตัวอย่าง: CultureInfo Invc = CultureInfo(""); ใหม่
CultureInfo Invc = CultureInfo.InvariantCulture; โค้ดสองบรรทัดนี้มีผลเหมือนกัน จุดประสงค์คือการได้รับอินสแตนซ์วัฒนธรรมที่ไม่แปรเปลี่ยน
ตัวอย่างเช่น ตอนนี้คุณต้องการดำเนินการเมธอด dateTime.ToString() บนอินสแตนซ์ DateTime dateTime วิธีการนี้ใช้ CurrentCulture ของเธรดปัจจุบันของคุณเป็นวัฒนธรรมเริ่มต้น และแปลงอินสแตนซ์วันที่เป็นรูปแบบสตริงที่สอดคล้องกันตามวัฒนธรรมนี้ ดังนั้นหากเราไม่ต้องการให้มันดำเนินการ ToString ตามเธรดหรือวัฒนธรรมระบบในขณะนี้ เราควรใช้เมธอดนี้ dateTime.ToString("G", CultureInfo.InvariantCulture) หรือ dateTime.ToString("G" , DateTimeFormatInfo.InvariantInfo)
วัฒนธรรมที่เป็นกลางคือวัฒนธรรมที่เกี่ยวข้องกับภาษาแต่ไม่ใช่ประเทศ วัฒนธรรมเฉพาะคือวัฒนธรรมที่เกี่ยวข้องกับภาษาใดภาษาหนึ่งและบางประเทศ ตัวอย่างเช่น "en" เป็นวัฒนธรรมที่เป็นกลาง ในขณะที่ "en-US" เป็นวัฒนธรรมเฉพาะ โปรดทราบว่า "zh-CHS" (จีนตัวย่อ) และ "zh-CHT" (จีนตัวเต็ม) เป็นวัฒนธรรมที่เป็นกลาง
วัฒนธรรมมีโครงสร้างแบบลำดับชั้น กล่าวคือ วัฒนธรรมต้นกำเนิดของวัฒนธรรมเฉพาะคือวัฒนธรรมที่ไม่เฉพาะเจาะจง และวัฒนธรรมต้นกำเนิดของวัฒนธรรมที่ไม่เฉพาะเจาะจงคือ InvariantCulture คุณสมบัติพาเรนต์ของคลาส CultureInfo จะส่งคืนวัฒนธรรมที่ไม่เฉพาะเจาะจงที่เกี่ยวข้องกับวัฒนธรรมเฉพาะ หากไม่มีทรัพยากรเฉพาะวัฒนธรรมอยู่บนระบบหรือไม่พร้อมใช้งาน ทรัพยากรที่ไม่เฉพาะวัฒนธรรมจะถูกใช้ หากทรัพยากรที่ไม่เฉพาะวัฒนธรรมไม่พร้อมใช้งาน ทรัพยากรที่ฝังอยู่ในชุดประกอบหลักจะถูกใช้
3. ปรับใช้ประเภท คุณสมบัติ และวิธีการทั่วไปสำหรับการแปล
คลาส CultureInfo แสดงถึงข้อมูลเกี่ยวกับวัฒนธรรมเฉพาะ รวมถึงชื่อของวัฒนธรรม ระบบการเขียน และปฏิทินที่ใช้ ตลอดจนข้อมูลเกี่ยวกับการดำเนินการทั่วไป (เช่น วันที่จัดรูปแบบและ การเรียงลำดับสตริง) ให้การเข้าถึงวัตถุข้อมูลเฉพาะวัฒนธรรม โดยทั่วไปมีสองวิธีในการสร้างอินสแตนซ์คลาส CultureInfo ดังนี้:
วัฒนธรรม CultureInfo = CultureInfo. CreateSpecificCulture (ชื่อ);
CultureInfo Culture = new CultureInfo(name);
ความแตกต่างระหว่างทั้งสองคือการใช้วิธีแรก คุณสามารถสร้างได้เฉพาะอินสแตนซ์ CultureInfo ของวัฒนธรรมแบบคงที่หรือวัฒนธรรมเฉพาะเท่านั้น หากชื่อเป็นสตริงว่าง อินสแตนซ์ CultureInfo แบบคงที่จะถูกสร้างขึ้น หากชื่อเป็นวัฒนธรรมที่ไม่เฉพาะเจาะจง อินสแตนซ์ CultureInfo เฉพาะวัฒนธรรมเริ่มต้นที่เชื่อมโยงกับชื่อจะถูกสร้างขึ้น วิธีที่สองคือการสร้างอินสแตนซ์ CultureInfo ของวัฒนธรรมที่ระบุตามชื่อ ซึ่งสามารถแก้ไขได้ ไม่เฉพาะเจาะจง หรือเฉพาะวัฒนธรรม
คุณสมบัติ CurrentCulture ของคลาส Thread ถูกใช้เพื่อรับหรือตั้งค่าวัฒนธรรมของเธรดปัจจุบัน จะต้องถูกกำหนดให้เป็นวัฒนธรรมเฉพาะ Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US"); ถ้า Thread.CurrentThread.CurrentCulture = new CultureInfo("en "); ข้อผิดพลาดจะถูกรายงาน!
คุณสมบัติ CurrentUICulture ของคลาส Thread ถูกใช้เพื่อรับหรือตั้งค่าวัฒนธรรมปัจจุบันที่ผู้จัดการทรัพยากรใช้เพื่อค้นหาทรัพยากรเฉพาะวัฒนธรรม ณ รันไทม์ ผู้จัดการทรัพยากรที่นี่สามารถเชื่อมโยงกับคลาส ResourceManger
Thread.CurrentThread.CurrentUICulture = ใหม่ CultureInfo("en");
Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");
คลาส ResourceManger สามารถค้นหาทรัพยากรเฉพาะวัฒนธรรม จัดเตรียมทรัพยากรทดแทนเมื่อไม่มีทรัพยากรที่แปลเป็นภาษาท้องถิ่น และสนับสนุนการทำให้เป็นอนุกรมทรัพยากร ตัวสร้าง ResourceManager ที่ใช้กันทั่วไปคือ ResourceManager สาธารณะ (สตริง, แอสเซมบลี) ความหมายของมันคือการเริ่มต้นอินสแตนซ์ใหม่ของคลาส ResourceManager ซึ่งค้นหาไฟล์ทรัพยากรจากแอสเซมบลีที่กำหนดโดยใช้ชื่อรูทที่ระบุ ชื่อรูทที่เรียกว่า ตัวอย่างเช่น ชื่อรูทของไฟล์ทรัพยากรชื่อ "MyResource.en-US.resources" คือ "MyResource" สามารถเพิ่มเนมสเปซลงในนิพจน์ของชื่อรูทได้ เช่น "MyWebSite.Resource.UserFolder.MyResource" Assembly สามารถเป็น Assembly ซึ่งมีเพจที่ต้องการเรียกใช้ไฟล์ทรัพยากรอยู่ เช่น typeof(MyPage).Assembly เมธอด GetString ของคลาส ResourceManager ถูกใช้เพื่อรับค่าของคีย์ที่ระบุในไฟล์ทรัพยากร ตัวอย่าง: เมื่อมีการตั้งค่าคุณสมบัติ CurrentUICulture ของเธรด ให้ปฏิบัติตามวิธีการต่อไปนี้
ResourceManager rm = ResourceManager ใหม่ ("รายการ", Assembly.GetExecutingAssembly());
String str = rm.GetString("welcome");
หากคุณต้องการรับทรัพยากรตามวัฒนธรรมที่ระบุ ให้เขียนดังต่อไปนี้:
ResourceManager rm = ResourceManager ใหม่ ("รายการ", Assembly.GetExecutingAssembly());
CultureInfo ci = Thread.CurrentThread.CurrentCulture;
สตริง str = rm.GetString("ยินดีต้อนรับ",ci);
สอง. หากต้องการใช้การแปลทรัพยากรใน Asp.net1.1
คุณควรสร้างโฟลเดอร์ทรัพยากรในโครงการเว็บไซต์ WebTest ก่อน และจัดเก็บไฟล์ทรัพยากรที่ใช้ร่วมกันของโครงการทั้งหมดในโฟลเดอร์นี้ ตัวอย่างเช่น เราได้สร้างไฟล์ทรัพยากรสามไฟล์ต่อไปนี้: MyResource.en.resx, MyResource.en-US.resx, MyResource.zh-CN.res แต่ละไฟล์ทรัพยากรจะมีคู่คีย์-ค่าสองคู่ โดยค่าคีย์คือ State และ Address เรียกไฟล์ทรัพยากรในหน้า MyPage.aspx ที่จำเป็นต้องใช้ไฟล์ทรัพยากร ดังแสดงด้านล่าง:
Thread.CurrentThread.CurrentCulture= CultureInfo.CreateSpecificCulture("zh-CN");
Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture;
ResourceManager rm = ใหม่ ResourceManager ("WebTest.Resource.MyResource", typeof (MyPage).Assembly);
Label1.Text = rm.GetString("สถานะ");
Label2.Text = rm.GetString("Address");
ในตอนนี้ Label1 และ Label2 จะแสดง "state" และ "address" ตามข้อบังคับในไฟล์ MyResource.zh-CN.resx ข้างต้นเป็นวิธีการแปลขั้นพื้นฐานและง่ายที่สุด มีปัญหาบางอย่างซ่อนอยู่ที่นี่ ให้เราแก้ไขและปรับวิธีนี้ให้เหมาะสมทีละรายการ
1. วิธีรับวัฒนธรรมเริ่มต้นของผู้ใช้
คือผ่านการตั้งค่าในตัวเลือก "คุณสมบัติ" -> "ภาษา" ของเบราว์เซอร์ของผู้ใช้ ใช้อันบนสุดเป็นภาษาเริ่มต้นของผู้ใช้
CultureInfo CultureInfo = CultureInfo.CreateSpecificCulture(Request.UserLanguages[0]);
Thread.CurrentThread.CurrentCulture = วัฒนธรรมInfo;
Thread.CurrentThread.CurrentUICulture = CultureInfo;
โดยทั่วไปแล้ว CurrentCulture และ CurrentUICulture จะถูกตั้งค่าให้มีวัฒนธรรมเดียวกัน ผลกระทบของสิ่งนี้คือสกุลเงิน วันที่ และข้อมูลอื่น ๆ บนเพจจะแสดงในรูปแบบภาษาอังกฤษแบบอเมริกัน และผู้จัดการทรัพยากรจะได้รับเนื้อหาที่ต้องการได้รับจากไฟล์ทรัพยากรจาก MyResource.zh-CN.resx ไฟล์.
หากหน้าไซต์ของคุณไม่มีฟังก์ชันสำหรับผู้ใช้ในการเลือกภาษา ภาษานั้นก็จะถูกแสดงตามวัฒนธรรมที่เบราว์เซอร์ของผู้ใช้กำหนดไว้เป็นค่าเริ่มต้น ดังนั้นคุณจึงสามารถใส่โค้ดข้างต้นในเมธอด Application_BeginRequest ของ Global.asax ได้ ไฟล์.cs. ด้วยวิธีนี้ทุกครั้งที่ผู้ใช้ร้องขอเพจ โปรแกรมของเราจะกำหนดวัฒนธรรมก่อน
2. จำการตั้งค่าภาษาของผู้ใช้
การตั้งค่าหรือการเลือกภาษาของเบราว์เซอร์สามารถจดจำได้ตลอดเซสชัน แต่การดำเนินการนี้ไม่สามารถทำได้ในเมธอด Application_BeginRequest ในไฟล์ Global.asax.cs เนื่องจากเซสชันยังไม่พร้อมใช้งานในขณะนั้น หากไซต์ของคุณไม่มีฟังก์ชันให้ผู้ใช้เลือกภาษา ก็ไม่จำเป็นต้องจดจำการตั้งค่าภูมิภาคของผู้ใช้ เพียงตั้งค่าในเมธอด Application_BeginRequest ในไฟล์ Global.asax.cs ตามที่อธิบายไว้ข้างต้น ผลงาน. ซึ่งส่วนใหญ่จะหลีกเลี่ยงข้อขัดแย้งที่ผู้ใช้เปลี่ยนการตั้งค่าภาษาในเบราว์เซอร์กะทันหัน แต่เว็บไซต์ยังคงแสดงเนื้อหาของหน้าแก่ผู้ใช้ตามวัฒนธรรมที่เก็บไว้ในเซสชัน
หากคุณได้กล่าวถึงฟังก์ชันในการอนุญาตให้ผู้ใช้เลือกภาษา คุณจะต้องใช้เซสชันในโปรแกรมเพจเพื่อบันทึกการเลือกวัฒนธรรมของผู้ใช้ เนื่องจากทุกคำขอจากไคลเอนต์ไปยังส่วนเซิร์ฟเวอร์ ส่วนเซิร์ฟเวอร์จะเปิดเธรดใหม่สำหรับการประมวลผลและการตอบสนอง หากโปรแกรมของคุณไม่จำการเลือกของลูกค้า โปรแกรมจะตอบสนองตามวัฒนธรรมเริ่มต้นเท่านั้น
3. ผู้จัดการทรัพยากรค้นหาไฟล์ทรัพยากรที่เกี่ยวข้องสำหรับวัฒนธรรมที่ระบุได้อย่างไร
เมื่อดำเนินการตามค่า นั่นคือ เมื่อดำเนินการเมธอด GetString ของคลาส ResourceManager ตัวจัดการทรัพยากรจะค้นหาไฟล์ทรัพยากรที่เกี่ยวข้องตามคุณสมบัติ CurrentUICulture ของเธรดปัจจุบัน มีหลายสถานการณ์:
(1) ตัวอย่างเช่น หากวัฒนธรรมที่สอดคล้องกับ CurrentUICulture ในปัจจุบันคือ en-US ให้ตรวจสอบก่อนว่า MyResource.en-US.resx มีอยู่หรือไม่ ให้ตรวจสอบค่านั้น MyResource.en.resx มีอยู่หรือไม่
(2) ตัวอย่างเช่น วัฒนธรรมที่สอดคล้องกับ CurrentUICulture ปัจจุบันคือ en เนื่องจาก en เป็นวัฒนธรรมที่ไม่เฉพาะเจาะจง จากนั้น ให้ค้นหาไฟล์ทรัพยากร MyResource.en-US.resx ของวัฒนธรรมเฉพาะ en-US ที่เกี่ยวข้องหรือไม่ โดยค่าเริ่มต้น ถ้ามี ให้รับค่าจากนั้น หากไม่มี ให้ตรวจสอบว่ามี MyResource.en.resx หรือไม่
(3) ตัวอย่างเช่น หากวัฒนธรรมที่สอดคล้องกับ CurrentUICulture ปัจจุบันคือ en-GB ให้ค้นหาไฟล์ทรัพยากร MyResource.en-GB.resx ก่อน หากไม่มี ให้ตรวจสอบว่า MyResource.en.resx มีอยู่หรือไม่ มีอยู่แล้ว รับค่าจากมัน หากไม่มี ให้ตรวจสอบว่าไฟล์ทรัพยากร MyResource.en-US.resx ของวัฒนธรรมเฉพาะเริ่มต้น en-US ที่เกี่ยวข้องกับ en มีอยู่หรือไม่ มีอยู่ในขณะนี้ แต่มี MyResource.en-CA โปรแกรมจะยังคงส่งข้อยกเว้นว่าไม่พบไฟล์ทรัพยากรที่เหมาะสม
ดังนั้น เราสามารถสรุปได้ว่าเมื่อเธรดปัจจุบัน CurrentUICulture สอดคล้องกับวัฒนธรรมเฉพาะ อันดับแรกผู้จัดการทรัพยากรจะค้นหาไฟล์ทรัพยากรที่สอดคล้องกับวัฒนธรรมเฉพาะนี้ หากไม่พบ ก็จะค้นหาไฟล์ทรัพยากรที่ไม่ใช่วัฒนธรรม ยังไม่ได้ค้นหา จากนั้นค้นหาไฟล์ทรัพยากรของวัฒนธรรมเริ่มต้นที่เกี่ยวข้องกับการเชื่อมโยงที่ไม่เฉพาะเจาะจงวัฒนธรรม เมื่อ CurrentUICulture ของเธรดปัจจุบันสอดคล้องกับวัฒนธรรมที่ไม่เฉพาะเจาะจง ขั้นแรกผู้จัดการทรัพยากรจะตรวจสอบว่ามีไฟล์ทรัพยากรเฉพาะวัฒนธรรมดีฟอลต์ที่สอดคล้องกับวัฒนธรรมที่ไม่เฉพาะเจาะจงหรือไม่ หากไม่มี ให้ตรวจสอบว่าไฟล์ทรัพยากรสอดคล้องกับวัฒนธรรมที่ไม่เฉพาะเจาะจงหรือไม่ - มีวัฒนธรรมเฉพาะอยู่ และส่งข้อยกเว้นหากไม่มีอยู่เช่นกัน
4. จะจัดการกับวัฒนธรรมที่ไม่รองรับการแปลได้อย่างไร
หากไซต์ไม่มีไฟล์ทรัพยากรที่เกี่ยวข้องเพื่อรองรับวัฒนธรรมเริ่มต้นของผู้ใช้ ดังนั้น CurrentUICulture ของเธรดปัจจุบันจะต้องถูกแปลงเป็นวัฒนธรรมเริ่มต้นของไซต์ของคุณ เช่น en-US หรือ zh-CN มีโอกาสสองประการสำหรับการแปลง:
ประการหนึ่งคือเมื่อคุณได้รับ Request.UserLanguages[0] ให้เปรียบเทียบกับวัฒนธรรมที่ตั้งไว้ล่วงหน้าที่รองรับในไฟล์การกำหนดค่า หากได้รับการยืนยันว่าไม่รองรับ ให้ตั้งค่า CurrentUICulture เป็นวัฒนธรรมเริ่มต้นทันที
ประการที่สองคือการใช้โครงสร้าง try catch เพื่อจับภาพข้อยกเว้น MissingManifestResourceException เมื่อใช้วิธีการ GetString ของ ResourceManager เพื่อรับค่า ในการจัดการข้อยกเว้น ขั้นแรกให้ตั้งค่า CurrentUICulture เป็นวัฒนธรรมเริ่มต้น จากนั้นใช้ GetString เพื่อรับค่าอีกครั้ง
5. ตั้งค่าวัฒนธรรมเริ่มต้นของไซต์และ uiCulture ผ่าน Web.config
<globalization requestEncoding="utf-8" responseEncoding="utf-8" uiCulture="zh-CN"culture="en-US"/>
ดังที่แสดงไว้ด้านบน: มีการระบุว่าวัฒนธรรมเริ่มต้นของไซต์คือ en-US (ต้องเป็นวัฒนธรรมเฉพาะที่นี่) และ uiCulture คือ zh-CN
แน่นอน คุณยังสามารถตั้งค่าทีละหน้าได้ในแท็ก Page ของแต่ละหน้า: <@Page Culture="zh-CN" UICulture="en"> ไม่ว่า web.config จะตั้งค่าไว้ที่นี่อย่างไร เพจก็จะแสดงตามการตั้งค่าของแท็กเพจ
สาม. การใช้การแปลทรัพยากรใน Asp.net2.0
Asp.net2.0 มีวิธีการใช้งานที่หลากหลายมากขึ้นสำหรับการแปลทรัพยากร ฉันจะเน้นที่นี่ถึงความแตกต่างจาก Asp.net1.1
1. การตั้งค่าวัฒนธรรมเริ่มต้นของไซต์และ uiCulture ผ่าน Web.config
ได้มีการพูดคุยกันแล้วใน Asp.net1.1 โดยใช้ไฟล์ web.config เพื่อตั้งค่าวัฒนธรรมของไซต์ แต่ใน Asp.net2.0 จะมีความยืดหยุ่นมากกว่า โดยทั่วไป คุณจะต้องต้องการให้ทุกหน้าในไซต์ของคุณสอดคล้องกับวัฒนธรรมเดียวกัน เพียงกำหนดค่า "อัตโนมัติ" ทั่วทั้งไซต์ให้กับแอตทริบิวต์ UICulture และวัฒนธรรม (วัฒนธรรม) ขององค์ประกอบโลกาภิวัตน์ใน web.config ดังที่แสดงด้านล่าง โปรดทราบว่าค่า "อัตโนมัติ" นี้ไม่ได้ใช้ใน Asp.net1.1 ที่ยอมรับ <globalization uiCulture="auto"culture="auto" /> ความหมายของ auto คือ ASP.NET ได้รับการตั้งค่าวัฒนธรรมที่ผู้ใช้ต้องการโดยการตรวจสอบส่วนหัว HTTP ที่ส่งมาจากเบราว์เซอร์ และใช้วัฒนธรรมนี้เพื่อตั้งค่าวัฒนธรรมเริ่มต้นของ ไซต์ นั่นคือคุณสมบัติ CurrentUICulture และ CurrentCulture ของเธรดปัจจุบัน
นอกเหนือจากการตั้งค่าอัตโนมัติแล้ว คุณยังสามารถระบุวัฒนธรรมเริ่มต้นของไซต์สำหรับ Asp.net: <globalization uiCulture="auto:zh-CN" Culture="auto:zh-CN" /> หมายเหตุ: สามารถทำได้เฉพาะเมื่อ ASP เท่านั้น NET ไม่สามารถค้นหาส่วนหัว HTTP เพื่อกำหนดวัฒนธรรมที่ผู้ใช้ต้องการได้ ตัวอย่างเช่น เมื่อไม่มีการตั้งค่าวัฒนธรรมใน "คุณสมบัติ" ของเบราว์เซอร์ -> "ภาษา" และว่างเปล่าโดยสิ้นเชิง วัฒนธรรมเริ่มต้นที่ตั้งค่าหลังจากอัตโนมัติจะมีผล
หลังจากกำหนดค่า globalization ใน web.config แล้ว แอปพลิเคชันของคุณไม่จำเป็นต้องเขียนโค้ดใดๆ CurrentUICulture และ CurrentCulture ของเธรดจะได้รับการตั้งค่าวัฒนธรรมตามค่าแอตทริบิวต์ uiCulture และวัฒนธรรมที่ตั้งไว้ในองค์ประกอบ globalization หากไม่ได้กำหนดค่าโกลบอลไลเซชัน CurrentUICulture และ CurrentCulture ของเธรดจะมีค่าเริ่มต้นเป็น en-US
2. ใช้ไฟล์ Web.config เพื่อติดตามการเลือกภูมิภาคของผู้ใช้
ใน Asp.net1.1 ไซต์เหล่านั้นที่มีการเลือกภูมิภาคโดยทั่วไปจะใช้เซสชันเพื่อบันทึกการเลือกของผู้ใช้ ดังนั้นทุกครั้งที่ผู้ใช้ทำการร้องขอไปยังไซต์ ทั้งหมด เนื้อหาที่แสดงได้รับการแปลตามวัฒนธรรมที่ผู้ใช้เลือก อีกวิธีหนึ่งใน Asp.net2.0 คือการใช้ไฟล์ web.config เพื่อติดตามการเลือกวัฒนธรรมของผู้ใช้
คุณสามารถสนับสนุนการระบุวัฒนธรรมของผู้ใช้โดยไม่เปิดเผยตัวตนได้โดยการเพิ่มคุณสมบัติโปรไฟล์แบบสตริงที่เรียกว่า LanguagePreference ลงในไฟล์ web.config ของคุณ โปรดทราบว่าแอตทริบิวต์ที่เปิดใช้งานขององค์ประกอบ anonymousIdentification จะต้องเป็น "true" มิฉะนั้นฟังก์ชันการระบุตัวตนที่ไม่ระบุตัวตนจะไม่สามารถใช้งานได้
<anonymousIdentification เปิดใช้งาน = "true"/>
<โปรไฟล์>
<คุณสมบัติ>
<เพิ่มชื่อ = "LanguagePreference" type = "string" defaultValue = "อัตโนมัติ" AllowAnonymous = "true" />
</คุณสมบัติ>
</profile>
ด้านล่างนี้ ผมจะอธิบายวิธีการตั้งโปรแกรมแอตทริบิวต์ LanguagePreference ใน Asp.net2.0 ขั้นแรก คุณสามารถเขียนคลาส PageBase ซึ่งสืบทอดมาจาก System.Web.UI.Page และทำหน้าที่เป็นคลาสพื้นฐานสำหรับคลาสเพจทั้งหมดในไซต์ จุดประสงค์ของสิ่งนี้จริงๆ ง่ายมาก นั่นคือเพื่อแยกกระบวนการประมวลผลทั่วไปบางอย่างในแต่ละหน้าและนำไปไว้ในคลาสพื้นฐานเพื่อลดความซ้ำซ้อนของโค้ดและปรับปรุงการบำรุงรักษา จากนั้นเขียนโค้ดต่อไปนี้ในคลาส PageBase: protected override void InitializeCulture()
-
ฐาน.InitializeCulture();
สตริง LanguagePreference = ((ProfileCommon)this.Context.Profile).LanguagePreference;
//เมื่อผู้ใช้เยี่ยมชมไซต์นี้เป็นครั้งแรกและ Profile.LanguagePreference ว่างเปล่า ให้ระบุการตั้งค่าภาษาของเบราว์เซอร์ของผู้ใช้
ถ้า (string.IsNullOrEmpty (LanguagePreference))
-
ถ้า (this.Context.Request.UserLanguages != null)
-
LanguagePreference = this.Context.Request.UserLanguages[0];
((ProfileCommon)Context.Profile).LanguagePreference = LanguagePreference;
-
-
อื่น
-
Thread.CurrentThread.CurrentUICulture = ใหม่ CultureInfo (LanguagePreference);
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(LanguagePreference);
-
}
วิธีการ InitializeCulture ของคลาส System.Web.UI.Page ถูกเพิ่มใหม่ใน Asp.net2.0 โดยจะตั้งค่า Culture และ UICulture สำหรับเธรดปัจจุบัน วงจรชีวิตของเพจได้รับการออกแบบเพื่อให้เมธอด InitializeCulture ทำงานก่อนการเริ่มต้นและการโหลดของเพจ ในโค้ดข้างต้น ให้ใช้ ((ProfileCommon)this.Context.Profile).LanguagePreference ก่อน เพื่อรับค่าของแอตทริบิวต์โปรไฟล์ LanguagePreference ปัจจุบัน และตรวจสอบว่าว่างเปล่าหรือไม่ นั่นคือ การตั้งค่าทางวัฒนธรรมได้รับการบันทึกไว้สำหรับผู้ใช้หรือไม่ . หากว่างเปล่า วัฒนธรรมที่ผู้ใช้ต้องการจะได้รับจากส่วนหัว Http และบันทึกผ่าน ((ProfileCommon)Context.Profile).LanguagePreference = LanguagePreference; หากไม่ว่างเปล่า หมายความว่าการตั้งค่าวัฒนธรรมของผู้ใช้ได้รับการบันทึกแล้ว จากนั้นใช้วัฒนธรรมนี้เพื่อตั้งค่าคุณสมบัติ CurrentUICulture และ CurrentCulture ของเธรดปัจจุบัน
หากมีการกำหนด <globalization uiCulture="auto"culture="auto" /> ใน Web.config โค้ดข้างต้นสามารถทำให้ง่ายขึ้นเป็น: protected override void InitializeCulture()
-
ฐาน.InitializeCulture();
สตริง LanguagePreference = ((ProfileCommon)this.Context.Profile).LanguagePreference;
if(!string.IsNullOrEmpty(LanguagePreference))
-
Thread.CurrentThread.CurrentUICulture = ใหม่ CultureInfo (LanguagePreference);
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(LanguagePreference);
-
อื่น
-
((ProfileCommon)Context.Profile).LanguagePreference = Thread.CurrentThread.CurrentCulture.Name;
-
}
หากไซต์มีฟังก์ชันที่อนุญาตให้ผู้ใช้เลือกวัฒนธรรม เช่น การวางรายการการเลือกภาษาในหน้าหลักของไซต์ ก็สามารถจดจำการเลือกวัฒนธรรมของผู้ใช้ได้โดยใช้ข้อความต่อไปนี้:
โมฆะที่ได้รับการป้องกัน lstLanguage_SelectedIndexChanged (ผู้ส่งวัตถุ, EventArgs e)
-
if (lstLanguage.SelectedValue != "Auto") //ตัวเลือกเริ่มต้นคือ Auto
-
Profile.LanguagePreference = lstLanguage.SelectedValue;
-
อื่น
-
Profile.LanguagePreference = null;
-
Response.Redirect (คำขอ Url.AbsolutePath);
-
โปรดใส่ใจกับบรรทัดของโค้ด Response.Redirect(Request.Url.AbsolutePath) เนื่องจากโค้ดการจัดการเหตุการณ์จะดำเนินการหลังจาก Page_Load หากคุณต้องการให้เพจเปลี่ยนแปลงอย่างรวดเร็ว คุณต้องดำเนินการเปลี่ยนเส้นทาง
เมื่อใช้ไฟล์ทรัพยากรเพื่อสร้างไฟล์ทรัพยากรทั่วโลกในไซต์
ใน Asp.net2.0
VS.Net2005 จะสร้างโฟลเดอร์ App_GlobalResources โดยอัตโนมัติเพื่อจัดเก็บไฟล์ทรัพยากรทั่วโลกโดยเฉพาะไฟล์ทรัพยากรส่วนกลางที่เรียกว่าเป็นไฟล์ทรัพยากรที่ใช้โดยไฟล์เพจหรือเพจต้นแบบหลายไฟล์ในไซต์ สมมติว่าเราสร้างไฟล์ชื่อ MyResource.resx และ MyResource.zh-cn.resx ในโปรแกรม เราสามารถใช้โค้ดต่อไปนี้เพื่อรับค่าในไฟล์ทรัพยากร: this.lblCountry.Text = Resources.MyResource.Country;
โดยที่ Country เป็นกุญแจสำคัญในไฟล์ทรัพยากร แน่นอนว่านี่ง่ายกว่าการรับค่าจากไฟล์ทรัพยากรใน Asp.net 1.1 มาก
มีสองประเด็นที่ควรทราบที่นี่ ประการแรก เมื่อสร้างกลุ่มของไฟล์ทรัพยากรที่มีชื่อรูทเดียวกัน จะต้องสร้างไฟล์ที่ไม่มีการระบุวัฒนธรรม เช่น MyResource.resx ไฟล์อื่นๆ เช่น MyResource.en-gb และ MyResource zh-cn.resx ถูกสร้างขึ้นตามความจำเป็น หากไม่ได้สร้าง MyResource.resx และสร้างเฉพาะ MyResource.zh-cn.resx เท่านั้น MyResource จะไม่ปรากฏใต้เนมสเปซทรัพยากรในโค้ดด้านบน ดังนั้นการคอมไพล์โค้ดด้านบนจึงไม่สามารถผ่านได้ MyResource.resx ควรจัดเก็บเนื้อหาของภาษาเริ่มต้นของไซต์ในกรณีที่ไม่พบไฟล์ทรัพยากรที่แปลแล้วซึ่งตรงกับ CurrentUICulture ของเธรดปัจจุบัน หรือไม่พบค่าคีย์ที่เกี่ยวข้องในไฟล์ทรัพยากรที่แปลแล้ว Asp.net ขึ้นอยู่กับคีย์ในไฟล์ MyResource.resx หากไม่มีรหัสประเทศใน MyResource.resx แต่มีรหัสประเทศอยู่ใน MyResource.zh-cn.resx ดังนั้นโค้ดด้านบนจะรายงานข้อผิดพลาดด้วย เมื่อรวบรวม ประการที่สอง Asp.net จะไม่รายงานข้อยกเว้นใด ๆ เมื่อไม่พบทรัพยากรที่แปลแล้วในพื้นที่ที่เกี่ยวข้อง โดยจะได้รับค่าจากไฟล์ MyResource.resx โดยอัตโนมัติ แต่จะไม่เปลี่ยน CurrentUICulture ของเธรดปัจจุบัน
เมื่อสร้างไฟล์ทรัพยากรในเครื่องบนเว็บไซต์ VS.Net2005 จะสร้างโฟลเดอร์ App_LocalResources โดยอัตโนมัติเพื่อจัดเก็บไฟล์ทรัพยากรในเครื่องโดยเฉพาะ ไฟล์ทรัพยากรภายในที่เรียกว่าไฟล์ทรัพยากรที่ใช้สำหรับไฟล์เพจเดียวในไซต์ วิธีการตั้งชื่อโดยทั่วไปคือ Default.aspx.resx และ Default.aspx.zh-cn.resx ตอนนี้ฉันเพิ่มภาษาสามคีย์ lblNavigation.Text และ lblNavigation.ForeColor ในไฟล์ทรัพยากรเริ่มต้น ในหมู่พวกเขา ฉันตั้งค่าสีน้ำเงินสำหรับ lblNavigation.ForeColor ของ Default.aspx.resx และสีแดงสำหรับ lblNavigation.ForeColor ของ Default.aspx.zh-cn.resx มีสองวิธีในการรับเนื้อหาจากไฟล์ทรัพยากรภายในเครื่องใน Default.aspx ในไฟล์เพจ:
(1) <asp:Label ID="lblLanguage" runat="server" Text="<%$ ทรัพยากร:ภาษา %>"></asp:Label>
(2) <asp:Label ID="lblNavigaion" runat="server" meta:resourcekey="lblNavigation"></asp:ฉลาก>
โปรดใช้ความระมัดระวังในการใช้สัญลักษณ์ $ เมื่อใช้วิธีการแรก การใช้วิธีที่สองมีความยืดหยุ่นมากกว่าและช่วยให้คุณสามารถตั้งค่าคุณสมบัติหลายอย่างของตัวควบคุมได้ในคราวเดียว
ยังคงมีปัญหาที่ควรทราบที่นี่: ต้องสร้างไฟล์ทรัพยากรในเครื่องเริ่มต้นของเพจ เช่น จำเป็นต้องมี Default.aspx.resx และจำเป็นต้องมี Default.aspx.zh-cn.resx หากคุณไม่สร้างไฟล์ทรัพยากรในเครื่องเริ่มต้น แต่ใช้ไฟล์ทรัพยากรในเครื่องในหน้า เมื่อใช้วิธีการแรกในการโยง ข้อผิดพลาดในการคอมไพล์จะเกิดขึ้น เมื่อใช้วิธีการที่สองในการโยง จะไม่มีข้อผิดพลาดในการคอมไพล์เกิดขึ้น เกิดข้อผิดพลาด แต่การตั้งค่าคุณสมบัติเหล่านี้ไม่มีผล เหมือนกับว่าไม่ได้เขียนไว้
4. การแสดงภาพที่แปลเป็นภาษาท้องถิ่น
การแสดงภาพที่แปลเป็นภาษาท้องถิ่นยังเป็นคุณสมบัติใหม่ของ Asp.net2.0 ใน Asp.net2.0 ไฟล์ทรัพยากรไม่ได้จำกัดอยู่เพียงการจับคู่คีย์-ค่าประเภทสตริง โดยสามารถบันทึกไฟล์ได้หลายประเภท ใช้คุณสมบัตินี้เพื่อแปลรูปภาพ ในความเป็นจริง สิ่งที่เรียกว่ารูปภาพที่แปลเป็นภาษาท้องถิ่นนั้นไม่มีอะไรมากไปกว่าการวางภาพที่เตรียมไว้สำหรับภูมิภาคต่างๆ ลงในไฟล์ทรัพยากรที่แปลเป็นภาษาท้องถิ่นต่างๆ ตัวอย่างเช่น ใส่ LitwareSlogan.jpg ใน MyResource.resx และใส่ LitwareSlogan.cn.jpg ใน MyResource.zh-cn.resx
เมื่อไฟล์ทรัพยากรส่วนกลางของเวอร์ชันที่แปลเป็นภาษาท้องถิ่นที่แตกต่างกันมีไฟล์รูปภาพเวอร์ชันที่แปลแล้ว คุณสามารถปรับแต่งไฟล์ตัวจัดการที่ชื่อ MyLocalImage.ashx เพื่อโหลดตามเงื่อนไขตามการตั้งค่าภาษาของผู้ใช้ รหัสจะเป็นดังนี้ แสดง
วิธีการเรียกในหน้า:
<asp:Image ID="Image1" runat="server" ImageUrl="~/ MyLocalImage.ashx" />
วิธีเขียนตัวจัดการของ MyLocalImage.ashx:
คลาสสาธารณะ MyLocalImage: IHttpHandler
-
ProcessRequest โมฆะสาธารณะ (บริบท HttpContext)
-
context.Response.ContentType = "รูปภาพ/png";
สตริง LanaguageReference = ((ProfileCommon)context.Profile).LanguagePreference;
ถ้า (!string.IsNullOrEmpty(LanaguageReference))
-
Thread.CurrentThread.CurrentUICulture = ใหม่ CultureInfo (LanaguageReference);
-
บิตแมป bm = Resources.Litware.LitwareSlogan;
ภาพ MemoryStream = MemoryStream ใหม่ ();
bm.บันทึก(รูปภาพ,ImageFormat.Png);
บริบทการตอบสนองBinaryWrite (รูปภาพ GetBuffer ());
-
}
คลาสตัวจัดการแบบกำหนดเองที่กำหนดใน MyLocalImage.ashx ใช้ตรรกะที่คล้ายกันที่คุณเห็นก่อนหน้านี้ในเมธอด InitializeCulture แบบกำหนดเอง เพื่อเริ่มต้นการตั้งค่า CurrentUICulture สำหรับเธรดปัจจุบัน ก่อนที่จะดึงไฟล์รูปภาพจากไฟล์ทรัพยากรส่วนกลาง คุณอาจสงสัยว่าเหตุใด CurrentUICulture ของเธรดปัจจุบันจึงได้รับการตั้งค่าในคลาสพื้นฐานของเพจ และจำเป็นต้องรีเซ็ตที่นี่ นั่นเป็นเพราะเธรดที่นี่ไม่ใช่เธรดเดียวกันกับเธรดที่ประมวลผลในคลาสฐาน หลังจากที่ตัวจัดการแบบกำหนดเองเริ่มต้นการตั้งค่า CurrentUICulture อย่างถูกต้องแล้ว ก็สามารถเข้าถึงไฟล์รูปภาพผ่านคลาสทรัพยากรที่พิมพ์อย่างยิ่งของ MyResource.resx เป็นเพียงเรื่องของการเขียนบิตของไฟล์ภาพไปยังสตรีมการตอบสนอง HTTP