nantcom

แก้ปฏิทินภาษาไทยบน Silverlight

เรตติ้ง
เขียนโดย นันคอม เมื่อวันที่ 09 March 2009 ตอน 00:32

หลังจากเล่นๆ Silverlight อีกสักพัก ผมก็พบว่า ปฏิทินของ Silverlight ก็ไม่สามารถแสดงวันที่ภาษาไทยได้ถูกต้องครับ ผมได้พยายามจะ Feedback เรื่องนี้ไปที่ทีม Silverlight แล้ว ในงาน MVP Summit ก้อไม่ได้รับคำตอบที่น่าพอใจเท่าที่ควรครับ

Get Microsoft Silverlight

จะเห็นว่า ปฏิทินทางขวา ของ Silverlight จะแสดงปี เป็นปี 2009 แทนที่จะเป็นปี 2552 อย่างที่มันควรจะเป็น ซึ่งตามที่ผมเข้าใจ ปฏิทินไทย เริ่มใช้วันที่ตามแบบสากล ตั้งแต่ปี 1 มกราคม ปี 1941 (พ.ศ. 2484) โดยจอมพลแปลก พิบูลย์สงคราม (อ้างอิงจาก: http://en.wikipedia.org/wiki/Thai_solar_calendar) ซึ่งทำให้ปฏิทินไทย กับปีสากล (Gregorian Calendar) ตรงกัน ตั้งแต่วันนั้น ยกเว้นแต่ว่า เราเลือกใช้ พุทธศักราช แทน คริสต์ศักราช ซึ่งมันขัดกับประเทศเราโดยธรรมชาติอยู่แล้ว จากการเปลี่ยนแปลงครั้งนั้น ทำให้เราสามารถใช้ พ.ศ. ลบ 543 เปลี่ยนเป็น ค.ศ. ได้ทันที และวันที่ก็ตรงกันหมด ตามหลักสากล

แต่ จากความพยายามอธิบายของผมอยู่นาน http://silverlight.net/forums/p/76896/182957.aspx ก็เหมือนว่าจะไม่เป็นผลเท่าไหร่ และก็คงได้รับการยืนยันว่า ปฏิทินไทย ไม่ใช่ Gregorian Calendar อยู่อย่างนั้น ผมก็คงต้องทำใจ และทำปฏิทินของผมเอาเองครับ

เรื่องน่าแปลกก็คือ ผมได้ลองกับ Culture อื่นๆ เช่น จีน (ซึ่งมีปีที่มี 13 เดือนได้) ไต้หวัน ญี่ปุ่น ก็พบว่า ปฏิทินเขาเป็น Gregorian ทั้งหมด แต่ของเราดันมีอัลกอริธึมแปลกๆ ออกมาแทน

image

และที่น่าสังเกต คือ อย่างไต้หวัน จะใช้ Gregorian เป็นหลัก และมี Optional Calendar เป็นปฏิทินไต้หวันอยู่ด้วย (สังเกตว่ามันมี Min/Max Supported Date Time)

image

แต่ของไทย กลับใช้ปฏิทินหลัก เป็น ปฏิทินไทย แล้วมี Gregorian เป็น Optional แทน

image

ผมก็ต้องขอบอกว่า ผมเองก็ไม่ได้ดู BCL (Base Class Library) ของ .NET อย่างชัดแจ้ง ขนาดที่จะรู้ว่า เวลามัน Format Date/Time มันทำงานอย่างไรนะครับ แต่ถ้าเอาตามความคิด จากที่เห็น th.DateTimeFormat ควรจะเป็นคนที่จัดการ Format วันที่ให้ ซึ่งถ้าเป็นตามนั้น การสร้าง CultureInfo ของประเทศไทยจริงๆ ก็น่าจะสามารถสร้างคลาส ThaiGregorianCalendar ที่ Inherit จาก Gregorian Calendar แต่มี Min Supported Date/Time เป็น 1/1/1941 และจัดการแปลง 2009->2552 ให้ ตอน Format จากนั้นก็มี ThaiBuddhistCalendar เป็น Optional Calendar สำหรับ Format วันที่ก่อนวันที่ 1/1/1941 ถึงจะถูกต้องมากกว่า และทำให้ Cultureinfo ของไทย เป็นสากลไปด้วยในตัว

และปฏิทิน Silverlight ก็จะ Support ปฏิทินไทย ไปโดยปริยาย…รวมไปถึงอีกหลายๆ คอนโทรล ในอนาคต ซึ่งผมคิดว่า จะต้องมีปัญหาอีกแน่นอน

บ่นพอละ

สำหรับ Calendar ที่ผมทำขึ้นนะครับ ผมลองกับ Culture หลายๆ อันแล้ว ก็ใช้ได้ดี (แต่ไม่รู้ว่ามีปัญหาหรือเปล่านะ) เพราะอย่างที่เห็นว่า Culture อื่นๆ เขากำหนดเป็น Gregorian Calendar ไว้หมดแล้ว แล้วผมก็ทำให้ Calendar ผม Resize ได้ ตามใจชอบ และรูปแบบเหล่านี้เป็นเทมเพลตทั้งหมดนะครับ สามารถใช้ Blend ไปแก้ Control Template ได้ ซึ่งก็ไม่มีอะไรมากครับ มี Grid ด้านล่าง และปุ่ม 3 ปุ่มเท่านั้น

image

ส่วน Style ของปุ่ม ก็สามารถเซ็ตได้ด้วย Property ต่างๆ ตามด้านล่างนี้ครับ แต่ถ้าเทมเพลตของผมเลย ผมใช้ใส่เอาไว้ใน Resource ของ Grid ครับ ลองแก้ Control Template ดูน่าจะมองเห็น

image

การทำงานก็จะคล้ายกับปฏิทินใน Vista นะครับ แต่ผมยังไม่ได้เพิ่ม Animation เข้าไป สามารถแสดงมุมมองแบบ เดือน แบบปี แบบทศวรรษ ได้ เพื่อให้เลือกได้สะดวก

image

ถ้าพบบัก ก็มาโพสรายงานได้ในฟอรั่ม หรือในคอมเมนต์นี้นะครับ

Download: http://coresharp.net/files/folders/projects/entry654.aspx

No Comments

Leave a Comment

(required)  
(optional)
(required)  
Add

About นันคอม

ผมชื่อนันคอม ทำงานไมโครซอฟท์ ชอบเล่น XBOX360 ลง Vista ฟัง Zune :D งานอดิเรกชอบไปถ่ายรูปกะเพื่อนๆ แล้วเก็บรูปไว้ดูคนเดียว เพราะไม่เคยว่างโพสซะที :'(