diff --git a/Oqtane.Server/Extensions/ApplicationBuilderExtensions.cs b/Oqtane.Server/Extensions/ApplicationBuilderExtensions.cs index 3e466a20..4225f0b8 100644 --- a/Oqtane.Server/Extensions/ApplicationBuilderExtensions.cs +++ b/Oqtane.Server/Extensions/ApplicationBuilderExtensions.cs @@ -34,6 +34,14 @@ namespace Oqtane.Extensions options.SetDefaultCulture(defaultCulture) .AddSupportedCultures(supportedCultures) .AddSupportedUICultures(supportedCultures); + + foreach(var culture in options.SupportedCultures) + { + if (culture.TextInfo.IsRightToLeft) + { + RightToLeftCulture.ResolveFormat(culture); + } + } }); return app; diff --git a/Oqtane.Server/Infrastructure/Localization/RightToLeftCulture.cs b/Oqtane.Server/Infrastructure/Localization/RightToLeftCulture.cs new file mode 100644 index 00000000..8d07220b --- /dev/null +++ b/Oqtane.Server/Infrastructure/Localization/RightToLeftCulture.cs @@ -0,0 +1,42 @@ +using System; +using System.Globalization; +using System.Reflection; + +namespace Oqtane.Infrastructure +{ + public class RightToLeftCulture + { + public static CultureInfo ResolveFormat(CultureInfo cultureInfo) + { + SetNumberFormatInfo(cultureInfo.NumberFormat); + SetCalenar(cultureInfo); + + return cultureInfo; + } + + private static void SetCalenar(CultureInfo cultureInfo) + { + var calendar = new RightToLeftCultureCalendar(); + + var fieldInfo = cultureInfo.GetType().GetField("_calendar", BindingFlags.NonPublic | BindingFlags.Instance); + if (fieldInfo != null) + { + fieldInfo.SetValue(cultureInfo, calendar); + } + + var info = cultureInfo.DateTimeFormat.GetType().GetField("calendar", BindingFlags.NonPublic | BindingFlags.Instance); + if (info != null) + { + info.SetValue(cultureInfo.DateTimeFormat, calendar); + } + } + + public static void SetNumberFormatInfo(NumberFormatInfo persianNumberFormatInfo) + { + persianNumberFormatInfo.NumberDecimalSeparator = "."; + persianNumberFormatInfo.DigitSubstitution = DigitShapes.NativeNational; + persianNumberFormatInfo.NumberNegativePattern = 0; + persianNumberFormatInfo.NegativeSign = "-"; + } + } +} diff --git a/Oqtane.Server/Infrastructure/Localization/RightToLeftCultureCalendar.cs b/Oqtane.Server/Infrastructure/Localization/RightToLeftCultureCalendar.cs new file mode 100644 index 00000000..56b420d9 --- /dev/null +++ b/Oqtane.Server/Infrastructure/Localization/RightToLeftCultureCalendar.cs @@ -0,0 +1,77 @@ +using System; + +namespace Oqtane.Infrastructure +{ + public class RightToLeftCultureCalendar : 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; + } + } +}