Merge pull request #5094 from zyhfish/task/set-fa-ir-culture

Fix #5054: resolve the issue in fa-IR language.
This commit is contained in:
Shaun Walker 2025-02-19 07:36:16 -05:00 committed by GitHub
commit 7a4ea8cf1b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 127 additions and 0 deletions

View File

@ -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;

View File

@ -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 = "-";
}
}
}

View File

@ -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;
}
}
}