smirabolg
چهارشنبه 25 مهر 1386, 12:14 عصر
سلام
ابتدا چند نکته:
1- زحمت این کدها رو در حقیقت آقای جعفر محمدى در فروم Persiadevelopers کشیدند. بنده فقط پیگیر کار بودم.
2- پیش از این هم جناب DelphiAssistant و آقای مهدوی مقاله های نسبتاً کاملی در این زمینه نوشته اند.
3- با اینکه DNN با VB.NET نوشته شده، من معال #C کدها رو هم برای دوستان علاقه مند به #C گذاشتم.
4- این کدها قابل استفاده در هر WebSite یا هر WinApp دات نتی هستند.
5- در استفاده از این کدها احتیاج به دست کاری بانک DNN نیست ولی بعضی از ماژول ها با آن مشکل دارند که با یک کم تلاش قابل حل است.
6- بعضی از انواع کنترل Calendar هم با این کدها مشکل دارند که من فکر می کنم مربوط به خود کنترل هست نه کد ما.
خوب بریم سر اصل مطلب:
قبل از هر چیز چند تا Refrence باید برزنیم:
جهت اطلاع دوستان کم تجربه: این کدها را در بالاترین قسمت صفحه کپی کنید.
:#C
Using System.Globalization
Using System.Reflection
Using System.Threading
:VB
Imports System.Globalization
Imports System.Reflection
Imports System.Threading
سپس کد های زیر رو در Load صفحه مورد نظر (در DNN صفحه Default.aspx) کپی کنید.
:#C
System.Globalization.CultureInfo calture = new System.Globalization.CultureInfo("fa-IR");
System.Globalization.DateTimeFormatInfo info = calture.DateTimeFormat;
info.AbbreviatedDayNames = new string[] { "ی", "د", "س", "چ", "پ", "ج", "ش" };
info.DayNames = new string[] { "یکشنبه", "دوشنبه", "ﺳﻪشنبه", "چهارشنبه", "پنجشنبه", "جمعه", "شنبه" };
info.AbbreviatedMonthNames = new string[] { "فروردین", "اردیبهشت", "خرداد", "تیر", "مرداد", "شهریور", "مهر", "آبان", "آذر", "دی", "بهمن", "اسفند", "" };
info.MonthNames = new string[] { "فروردین", "اردیبهشت", "خرداد", "تیر", "مرداد", "شهریور", "مهر", "آبان", "آذر", "دی", "بهمن", "اسفند", "" };
info.AMDesignator = "ق.ظ";
info.PMDesignator = "ب.ظ";
info.ShortDatePattern = "yyyy/MM/dd";
info.FirstDayOfWeek = DayOfWeek.Saturday;
System.Globalization.PersianCalendar cal = new System.Globalization.PersianCalendar();
typeof(System.Globalization.DateTimeFormatInfo).Ge tField("calendar", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).SetValue (info, cal);
object obj = typeof(System.Globalization.DateTimeFormatInfo).Ge tField("m_cultureTableRecord", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).GetValue (info);
obj.GetType().GetMethod("UseCurrentCalendar", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).Invoke(ob j, new object[] { cal.GetType().GetProperty("ID", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).GetValue (cal, null) });
typeof(System.Globalization.CultureInfo).GetField("calendar", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).SetValue (calture, cal);
System.Threading.Thread.CurrentThread.CurrentCultu re = calture;
System.Threading.Thread.CurrentThread.CurrentUICul ture = calture;
System.Globalization.CultureInfo.CurrentCulture.Da teTimeFormat = info;
System.Globalization.CultureInfo.CurrentUICulture. DateTimeFormat = info;
:VB
Dim calture As New CultureInfo("fa-IR")
Dim info As DateTimeFormatInfo = calture.DateTimeFormat
info.AbbreviatedDayNames = New String() {"ى", "د", "س", "چ", "پ", "ج", "ش"}
info.DayNames = New String() {"یکشنبه", "دوشنبه", "سهشنبه", "چهارشنبه", "پنجشنبه", "جمعه", "شنبه"}
info.AbbreviatedMonthNames = New String() {"فروردین", "اردیبهشت", "خرداد", "تیر", "مرداد", "شهریور", "مهر", "آبان", "آذر", "دی", "بهمن", "اسفند", ""}
info.MonthNames = New String() {"فروردین", "اردیبهشت", "خرداد", "تیر", "مرداد", "شهریور", "مهر", "آبان", "آذر", "دی", "بهمن", "اسفند", ""}
info.AMDesignator = "ق.ظ"
info.PMDesignator = "ب.ظ"
info.ShortDatePattern = "yyyy/MM/dd"
info.FirstDayOfWeek = DayOfWeek.Saturday
Dim PersianCal As New PersianCalendar
GetType(DateTimeFormatInfo).GetField("calendar", (BindingFlags.NonPublic Or(BindingFlags.Public Or BindingFlags.Instance))).SetValue(info, PersianCal)
Dim obj As Object = GetType(DateTimeFormatInfo).GetField("m_cultureTableRecord", (BindingFlags.NonPublic Or (BindingFlags.Public Or BindingFlags.Instance))).GetValue(info)
obj.GetType.GetMethod("UseCurrentCalendar", (BindingFlags.NonPublic OrBindingFlags.Instance)).Invoke(obj, New Object() {PersianCal.GetType.GetProperty("ID", (BindingFlags.NonPublic Or BindingFlags.Instance)).GetValue(PersianCal,Nothin g)})
GetType(CultureInfo).GetField("calendar", (BindingFlags.NonPublic Or(BindingFlags.Public Or BindingFlags.Instance))).SetValue(calture, PersianCal)
Thread.CurrentThread.CurrentCulture = calture
Thread.CurrentThread.CurrentUICulture = calture
CultureInfo.CurrentCulture.DateTimeFormat = info
CultureInfo.CurrentUICulture.DateTimeFormat = info
حالا همه تاریخها و حتی کنترل Calendar هم شمسی است.
دوستان گرامی اگر به نکته جدیدی دست پیدا کردند حتماً در همین تایپیک اون رو به اطلاع همه برسونند.
امیدوارم که مدیران فروم گله نکنند که چرا تایپیک تکراری درست کردم چون این تایپیک واقعاً تکراری نیست.
یا علی
ابتدا چند نکته:
1- زحمت این کدها رو در حقیقت آقای جعفر محمدى در فروم Persiadevelopers کشیدند. بنده فقط پیگیر کار بودم.
2- پیش از این هم جناب DelphiAssistant و آقای مهدوی مقاله های نسبتاً کاملی در این زمینه نوشته اند.
3- با اینکه DNN با VB.NET نوشته شده، من معال #C کدها رو هم برای دوستان علاقه مند به #C گذاشتم.
4- این کدها قابل استفاده در هر WebSite یا هر WinApp دات نتی هستند.
5- در استفاده از این کدها احتیاج به دست کاری بانک DNN نیست ولی بعضی از ماژول ها با آن مشکل دارند که با یک کم تلاش قابل حل است.
6- بعضی از انواع کنترل Calendar هم با این کدها مشکل دارند که من فکر می کنم مربوط به خود کنترل هست نه کد ما.
خوب بریم سر اصل مطلب:
قبل از هر چیز چند تا Refrence باید برزنیم:
جهت اطلاع دوستان کم تجربه: این کدها را در بالاترین قسمت صفحه کپی کنید.
:#C
Using System.Globalization
Using System.Reflection
Using System.Threading
:VB
Imports System.Globalization
Imports System.Reflection
Imports System.Threading
سپس کد های زیر رو در Load صفحه مورد نظر (در DNN صفحه Default.aspx) کپی کنید.
:#C
System.Globalization.CultureInfo calture = new System.Globalization.CultureInfo("fa-IR");
System.Globalization.DateTimeFormatInfo info = calture.DateTimeFormat;
info.AbbreviatedDayNames = new string[] { "ی", "د", "س", "چ", "پ", "ج", "ش" };
info.DayNames = new string[] { "یکشنبه", "دوشنبه", "ﺳﻪشنبه", "چهارشنبه", "پنجشنبه", "جمعه", "شنبه" };
info.AbbreviatedMonthNames = new string[] { "فروردین", "اردیبهشت", "خرداد", "تیر", "مرداد", "شهریور", "مهر", "آبان", "آذر", "دی", "بهمن", "اسفند", "" };
info.MonthNames = new string[] { "فروردین", "اردیبهشت", "خرداد", "تیر", "مرداد", "شهریور", "مهر", "آبان", "آذر", "دی", "بهمن", "اسفند", "" };
info.AMDesignator = "ق.ظ";
info.PMDesignator = "ب.ظ";
info.ShortDatePattern = "yyyy/MM/dd";
info.FirstDayOfWeek = DayOfWeek.Saturday;
System.Globalization.PersianCalendar cal = new System.Globalization.PersianCalendar();
typeof(System.Globalization.DateTimeFormatInfo).Ge tField("calendar", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).SetValue (info, cal);
object obj = typeof(System.Globalization.DateTimeFormatInfo).Ge tField("m_cultureTableRecord", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).GetValue (info);
obj.GetType().GetMethod("UseCurrentCalendar", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).Invoke(ob j, new object[] { cal.GetType().GetProperty("ID", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).GetValue (cal, null) });
typeof(System.Globalization.CultureInfo).GetField("calendar", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).SetValue (calture, cal);
System.Threading.Thread.CurrentThread.CurrentCultu re = calture;
System.Threading.Thread.CurrentThread.CurrentUICul ture = calture;
System.Globalization.CultureInfo.CurrentCulture.Da teTimeFormat = info;
System.Globalization.CultureInfo.CurrentUICulture. DateTimeFormat = info;
:VB
Dim calture As New CultureInfo("fa-IR")
Dim info As DateTimeFormatInfo = calture.DateTimeFormat
info.AbbreviatedDayNames = New String() {"ى", "د", "س", "چ", "پ", "ج", "ش"}
info.DayNames = New String() {"یکشنبه", "دوشنبه", "سهشنبه", "چهارشنبه", "پنجشنبه", "جمعه", "شنبه"}
info.AbbreviatedMonthNames = New String() {"فروردین", "اردیبهشت", "خرداد", "تیر", "مرداد", "شهریور", "مهر", "آبان", "آذر", "دی", "بهمن", "اسفند", ""}
info.MonthNames = New String() {"فروردین", "اردیبهشت", "خرداد", "تیر", "مرداد", "شهریور", "مهر", "آبان", "آذر", "دی", "بهمن", "اسفند", ""}
info.AMDesignator = "ق.ظ"
info.PMDesignator = "ب.ظ"
info.ShortDatePattern = "yyyy/MM/dd"
info.FirstDayOfWeek = DayOfWeek.Saturday
Dim PersianCal As New PersianCalendar
GetType(DateTimeFormatInfo).GetField("calendar", (BindingFlags.NonPublic Or(BindingFlags.Public Or BindingFlags.Instance))).SetValue(info, PersianCal)
Dim obj As Object = GetType(DateTimeFormatInfo).GetField("m_cultureTableRecord", (BindingFlags.NonPublic Or (BindingFlags.Public Or BindingFlags.Instance))).GetValue(info)
obj.GetType.GetMethod("UseCurrentCalendar", (BindingFlags.NonPublic OrBindingFlags.Instance)).Invoke(obj, New Object() {PersianCal.GetType.GetProperty("ID", (BindingFlags.NonPublic Or BindingFlags.Instance)).GetValue(PersianCal,Nothin g)})
GetType(CultureInfo).GetField("calendar", (BindingFlags.NonPublic Or(BindingFlags.Public Or BindingFlags.Instance))).SetValue(calture, PersianCal)
Thread.CurrentThread.CurrentCulture = calture
Thread.CurrentThread.CurrentUICulture = calture
CultureInfo.CurrentCulture.DateTimeFormat = info
CultureInfo.CurrentUICulture.DateTimeFormat = info
حالا همه تاریخها و حتی کنترل Calendar هم شمسی است.
دوستان گرامی اگر به نکته جدیدی دست پیدا کردند حتماً در همین تایپیک اون رو به اطلاع همه برسونند.
امیدوارم که مدیران فروم گله نکنند که چرا تایپیک تکراری درست کردم چون این تایپیک واقعاً تکراری نیست.
یا علی