diff --git a/Oqtane.Server/Extensions/ApplicationBuilderExtensions.cs b/Oqtane.Server/Extensions/ApplicationBuilderExtensions.cs index 3e466a20..87bf5305 100644 --- a/Oqtane.Server/Extensions/ApplicationBuilderExtensions.cs +++ b/Oqtane.Server/Extensions/ApplicationBuilderExtensions.cs @@ -34,6 +34,15 @@ namespace Oqtane.Extensions options.SetDefaultCulture(defaultCulture) .AddSupportedCultures(supportedCultures) .AddSupportedUICultures(supportedCultures); + + for (var i = 0; i < options.SupportedCultures.Count; i++) + { + if (options.SupportedCultures[i].Name.Equals("fa-IR", StringComparison.OrdinalIgnoreCase)) + { + options.SupportedCultures[i] = PersianCulture.GetPersianCultureInfo(); + break; + } + } }); return app; diff --git a/Oqtane.Server/Infrastructure/Localization/PersianCalendar.cs b/Oqtane.Server/Infrastructure/Localization/PersianCalendar.cs new file mode 100644 index 00000000..1b900031 --- /dev/null +++ b/Oqtane.Server/Infrastructure/Localization/PersianCalendar.cs @@ -0,0 +1,77 @@ +using System; + +namespace Oqtane.Infrastructure +{ + public class PersianCalendar : System.Globalization.PersianCalendar + { + public override int GetYear(DateTime time) + { + try + { + return base.GetYear(time); + } + catch + { + // ignore + } + + return time.Year; + } + + public override int GetMonth(DateTime time) + { + try + { + return base.GetMonth(time); + } + catch + { + // ignore + } + + return time.Month; + } + + public override int GetDayOfMonth(DateTime time) + { + try + { + return base.GetDayOfMonth(time); + } + catch + { + // ignore + } + + return time.Day; + } + + public override int GetDayOfYear(DateTime time) + { + try + { + return base.GetDayOfYear(time); + } + catch + { + // ignore + } + + return time.DayOfYear; + } + + public override DayOfWeek GetDayOfWeek(DateTime time) + { + try + { + return base.GetDayOfWeek(time); + } + catch + { + // ignore + } + + return time.DayOfWeek; + } + } +} diff --git a/Oqtane.Server/Infrastructure/Localization/PersianCulture.cs b/Oqtane.Server/Infrastructure/Localization/PersianCulture.cs new file mode 100644 index 00000000..addd73a2 --- /dev/null +++ b/Oqtane.Server/Infrastructure/Localization/PersianCulture.cs @@ -0,0 +1,70 @@ +using System; +using System.Globalization; +using System.Reflection; + +namespace Oqtane.Infrastructure +{ + public class PersianCulture + { + public static CultureInfo GetPersianCultureInfo() + { + var persianCultureInfo = new CultureInfo("fa-IR"); + + SetPersianDateTimeFormatInfo(persianCultureInfo.DateTimeFormat); + SetNumberFormatInfo(persianCultureInfo.NumberFormat); + + var cal = new PersianCalendar(); + + FieldInfo fieldInfo = persianCultureInfo.GetType().GetField("_calendar", BindingFlags.NonPublic | BindingFlags.Instance); + if (fieldInfo != null) + { + fieldInfo.SetValue(persianCultureInfo, cal); + } + + FieldInfo info = persianCultureInfo.DateTimeFormat.GetType().GetField("calendar", BindingFlags.NonPublic | BindingFlags.Instance); + if (info != null) + { + info.SetValue(persianCultureInfo.DateTimeFormat, cal); + } + + return persianCultureInfo; + } + + public static void SetPersianDateTimeFormatInfo(DateTimeFormatInfo persianDateTimeFormatInfo) + { + persianDateTimeFormatInfo.MonthNames = new[] { "فروردین", "اردیبهشت", "خرداد", "تیر", "مرداد", "شهریور", "مهر", "آبان", "آذر", "دی", "بهمن", "اسفند", string.Empty }; + persianDateTimeFormatInfo.MonthGenitiveNames = persianDateTimeFormatInfo.MonthNames; + persianDateTimeFormatInfo.AbbreviatedMonthNames = persianDateTimeFormatInfo.MonthNames; + persianDateTimeFormatInfo.AbbreviatedMonthGenitiveNames = persianDateTimeFormatInfo.MonthNames; + + persianDateTimeFormatInfo.DayNames = new[] { "یکشنبه", "دوشنبه", "ﺳﻪشنبه", "چهارشنبه", "پنجشنبه", "جمعه", "شنبه" }; + persianDateTimeFormatInfo.AbbreviatedDayNames = new[] { "ی", "د", "س", "چ", "پ", "ج", "ش" }; + persianDateTimeFormatInfo.ShortestDayNames = persianDateTimeFormatInfo.AbbreviatedDayNames; + persianDateTimeFormatInfo.FirstDayOfWeek = DayOfWeek.Saturday; + + persianDateTimeFormatInfo.AMDesignator = "ق.ظ"; + persianDateTimeFormatInfo.PMDesignator = "ب.ظ"; + + persianDateTimeFormatInfo.DateSeparator = "/"; + persianDateTimeFormatInfo.TimeSeparator = ":"; + + persianDateTimeFormatInfo.FullDateTimePattern = "tt hh:mm:ss yyyy mmmm dd dddd"; + persianDateTimeFormatInfo.YearMonthPattern = "yyyy, MMMM"; + persianDateTimeFormatInfo.MonthDayPattern = "dd MMMM"; + + persianDateTimeFormatInfo.LongDatePattern = "dddd, dd MMMM,yyyy"; + persianDateTimeFormatInfo.ShortDatePattern = "yyyy/MM/dd"; + + persianDateTimeFormatInfo.LongTimePattern = "hh:mm:ss tt"; + persianDateTimeFormatInfo.ShortTimePattern = "hh:mm tt"; + } + + public static void SetNumberFormatInfo(NumberFormatInfo persianNumberFormatInfo) + { + persianNumberFormatInfo.NumberDecimalSeparator = "/"; + persianNumberFormatInfo.DigitSubstitution = DigitShapes.NativeNational; + persianNumberFormatInfo.NumberNegativePattern = 0; + persianNumberFormatInfo.NegativeSign = "-"; + } + } +}