4

网站在阿拉伯语中显示错误的月份july,这是在 asp.net webform 中开发的阿拉伯语网站,文化被正确设置为“ ar-AE ”,事件日期在本地机器上显示正确的月份,但在产品上显示属于的月份Egyptian culture

数据库中的日期以smalldatetime这种格式存储2017-07-25 00:00:00

七月的月份错误

本地主机上的正确月份:25 يوليو 2017

生产月份错误:25 يوليه 2017

<asp:Label  ID="lblDate"  runat="server"  Text='<%# FormatDate(Eval("PublishDate")) %>'>
</asp:Label>

protected string FormatDate(object dt) {
  string date = String.Format("{0:MMMM dd, yyyy}", dt);
  date = String.Format("{0:dd MMMM yyyy}", dt);
  // Response.Write(date + "<br/>");
  return date;
}

文化正确设置为阿联酋

protected override void InitializeCulture() {
  String lang = "ar-AE";
  CultureInfo ci = System.Threading.Thread.CurrentThread.CurrentUICulture;
  // Call function to detect Language and assign  to session variable
  Thread.CurrentThread.CurrentCulture = new CultureInfo(lang);
  Thread.CurrentThread.CurrentUICulture = new CultureInfo(lang);

  base.InitializeCulture();
}

可能是什么原因,可能是生产服务器本身吗?

我们检查了几乎所有的可能性并尝试了一切,只是在 7 月的月份出错了,一​​切都很好。

我还交叉检查了生产服务器的语言设置、IIS 设置,一切似乎都很好,我唯一能指出的是服务器有所有最新的更新,可能是我们遗漏了一些东西。我们在不同的 Windows 7 机器上进行了相同的测试,它工作正常。

更新:我也尝试了解决方案建议,但它一直显示错误的月份 JULY يوليه。这是错误的。我们还对其进行了测试,它在服务器上显示了正确的文化。

小提琴示例也显示错误的月份https://dotnetfiddle.net/ZAOJ7H

4

2 回答 2

3

我尝试DateTime使用以下代码行查找本地化月份名称:

DateTime dt = DateTime.Parse("2017-07-25 00:00:00");

string arabicMonth = new CultureInfo("ar-AE").DateTimeFormat.GetMonthName(dt.Month);

结果代码给出了يوليه而不是يوليو,表明 Windows 将公历月份名称以阿拉伯语本地化时出现问题。

通过一点点发现,它是由locale.nls位于%WINDIR%\System32\locale.nls包含错误数据的文件引起的,其中7 月份以其他阿拉伯语版本显示,而不是当前系统文化使用.

由于 NLS 文件采用二进制格式,因此即使在十六进制编辑器中查看也很难读取和编辑存储的语言环境信息。AFAIK,此问题已由 Microsoft 在Windows 7 和 Server 2008 R2 系统的KB981981更新中修复,您可以根据使用的平台执行更新(之后需要重新启动):

Windows 7 32 位更新 (KB981981) - 2010 年 5 月 24 日

Windows 7 64 位更新 (KB981981) - 2010 年 5 月 24 日

注意:确保所有受影响的机器都安装了此更新以获得最佳效果。如果由于某些限制而无法安装更新,我建议尝试使用datepicker显示يوليو7 月份的 jQuery 插件作为解决方法。

PS:我还在OP的小提琴中尝试了zahed的解决方案-

DateTime.Parse("2017-07-25 00:00:00").ToString("dd dddd , MMMM, yyyy", new CultureInfo("ar-AE"))

但它也显示25 الثلاثاء , يوليه, 2017(ie يوليه),因此不是字符串格式问题,而是上面解释的 Windows 本地化问题。

参考:

2010 年软件更新服务和 Windows Server 更新服务内容更改说明

如何使用 C# 将日期时间中英文文本中的月份名称转换为阿拉伯文本?

有关的:

Michael S. Kaplan - 月份名称的阿拉伯语语言环境

于 2017-10-18T02:52:52.237 回答
0

设计代码:

<div>
    <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
    <asp:LinkButton ID="LinkButton1" runat="server" OnClick="LinkButton1_Click">LinkButton</asp:LinkButton>
</div>

C#背后的代码:

protected void LinkButton1_Click(object sender, EventArgs e)
{
    Label1.Text = DateTime.Parse("2017-07-25 00:00:00").ToString("dd dddd , MMMM, yyyy", new CultureInfo("ar-AE"));
}

更新的答案:

我会想象操作系统支持的所有语言(考虑到信息的来源)。

这是一个列表: OS 默认支持的语言

于 2017-10-18T13:22:19.940 回答