Неправильный месяц показывает июль, когда в веб-форме asp.net установлена культура ar-AE
Веб-сайт показывает неправильный месяц для july
на арабском это веб-сайт на арабском языке, разработанный в веб-форме asp.net, и культура правильно настроена на "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();
}
В чем может быть причина, это может быть сам рабочий сервер?
Мы проверили почти все возможности и перепробовали все, просто июльский месяц не подходит, все в порядке.
Я также проверяю настройки языка производственного сервера, настройки IIS, все вроде бы нормально, единственное, на что я могу указать, это то, что на сервере есть все последние обновления, может быть, мы что-то упустили. мы тестировали одно и то же на разных машинах Windows 7, он просто отлично работает.
Обновление: Я попытался предложить решение также, но он продолжает показывать неправильный месяц для ИЮЛЬ يوليه
, Это не верно. Мы проверили это и показали правильную культуру на сервере.
Пример скрипки также показывает неправильный месяц https://dotnetfiddle.net/ZAOJ7H
2 ответа
Я пытался найти локализованный 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
содержит неверные данные, где июльский месяц отображается в другой арабской версии, чем текущая системная культура, использующая.
Поскольку файл NLS отформатирован в двоичном формате, трудно читать и редактировать сохраненную информацию о локали, даже просматривая ее в шестнадцатеричном редакторе. Кстати, эта проблема уже исправлена Microsoft в обновлении KB981981 для систем Windows 7 и Server 2008 R2, вы можете выполнить обновление в зависимости от используемой платформы (требуется перезагрузка после этого):
Обновление для Windows 7 32-разрядная версия (KB981981) - 24.05.2010
Обновление для Windows 7 64-разрядная версия (KB981981) - 24.05.2010
Примечание: убедитесь, что все уязвимые машины установлены с этим обновлением для достижения наилучшего результата. Если вы не можете установить обновление из-за определенных ограничений, я предлагаю попробовать использовать плагин jQuery для datepicker
который показывает يوليو
за июль месяц как обходной путь.
PS: Я также попробовал решение Захеда в скрипке ОП -
DateTime.Parse("2017-07-25 00:00:00").ToString("dd dddd , MMMM, yyyy", new CultureInfo("ar-AE"))
Но это показывает 25 الثلاثاء , يوليه, 2017
(т.е. يوليه
), следовательно, это не проблема форматирования строки, а проблема локализации Windows, как описано выше.
Рекомендации:
Как преобразовать название месяца в английском тексте в datetime в арабский текст, используя C#?
Связанные с:
Код проекта:
<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"));
}
Обновленный ответ:
Я хотел бы представить все языки, которые поддерживает ОС (учитывая, откуда информация).
Вот список: поддерживаемые языки по умолчанию для ОС.