Подтвердить что ты не робот

Аннотации требуемых данных не переводятся

Мы сталкиваемся со странной ошибкой с локализацией атрибута Required.

У нас есть следующий код:

    public class AnswersGroupViewModel
    {
        public int IDAnswerGroup { get; set; }
        public int IDEvaluator { get; set; }
        public List<AnswersViewModel> Answers { get; set; }
    }

    public class AnswersViewModel
    {        
        public string Text{ get; set; }      
        [Required(ErrorMessageResourceName = "RequiredMessage", ErrorMessageResourceType = typeof(Resources.Language))]
        public int IDAnswer{ get; set; }
    }

Проблема заключается в том, что правильный перевод "RequiredMessage" не извлекается из файла ресурсов, хотя он присутствует (у нас есть RequiredMessage как на испанском, так и на русском ресурсах ресурсов).

Атрибуты, такие как Display, работают и переводятся, но, похоже, проблема с атрибутом Required.

Вот пример изображения:

Labels are translated to russian, but required message is in spanish

Ошибка отображается с помощью @Html.ValidationMessage

Заранее благодарим за помощь.

4b9b3361

Ответ 1

Я бы начал с установки элемента глобализации в web.config

<system.web>
  <globalization enableClientBasedCulture="true" culture="auto" uiCulture="auto"/>

Далее я проверил бы культуру, которую вы получаете в контроллере (зарегистрируйте его в БД или перейдите к представлению с помощью @ViewBag

culture = CultureInfo.InstalledUICulture.IetfLanguageTag;
if (HttpContext.Current != null && HttpContext.Current.Request.UserLanguages != null)
{
    culture = Request.UserLanguages[0];     
}

Подтвердите, что значения, которые вы используете для определения Культуры, - это значения, используемые заголовками


Followup

Вы используете заголовки глобализации для проверки языка пользователя, но вручную устанавливаете язык пользователя в браузере.

2 подходит для попытки:

1) установить язык пользователя в браузере с помощью Javascript:

<script type="text/javascript"> 
     Globalize.culture("@ViewBag.Culture");
</script>

Или, если культура установлена ​​в Javascript (vs С#)

<script type="text/javascript"> 
     Globalize.culture(culturevariable);
</script>

2) ParameterisedRequiredAttribute

public class ParameterisedRequiredAttribute : RequiredAttribute
{
    private string[] _replacements { get; set; }

    public ParameterisedRequiredAttribute(params string[] replacements)
    {
        _replacements = replacements;

        ErrorMessageResourceName = ErrorMessagesErrors.SpecificFieldRequired;
        ErrorMessageResourceType = typeof(ErrorMessages);
    }

    public override string FormatErrorMessage(string name)
    {
        return string.Format(ErrorMessageString, (object[])_replacements);
    }
}

Первый подход кажется лучшим решением, если вы вручную настраиваете язык. Проще говоря, аннотацию нужно будет переустанавливать каждый раз, когда пользователь меняет языковые режимы.

Еще одна вещь, которую следует учитывать, - то, что вы в настоящее время устанавливаете язык (через заголовки), вероятно, является вашим лучшим решением. Хотя это сложнее проверить, потому что вам нужен клиент со специальным языком, так наилучшим образом выделяются ваши пользователи (по заголовкам).

Ответ 2

Убедитесь, что текущий контекст потока обновлен, чтобы использовать правильную CultureInfo на основе заголовков запросов веб-клиента. Это должно быть автоматически, если у вас установлен тег <globalization ..>. В противном случае добавьте фильтр, чтобы перехватить запрос и выполнить обновление.

var cultureName = "de-DE"; // get this from request headers
var ci = new CultureInfo(cultureName);
Thread.CurrentThread.CurrentCulture = ci;
Thread.CurrentThread.CurrentUICulture = ci;

См. также Откуда CultureInfo.CurrentCulture читает культуру

Ответ 3

Я создал пример приложения, чтобы воспроизвести вашу проблему. Это работает для меня, поэтому я дам вам текущую настройку.

У меня есть проект веб-приложения, ссылающийся на сборку ресурсов библиотеки.

У меня есть 2 файла resx в проекте Resource (language.resx и language.fr.resx). Оба файла имеют одинаковые свойства:

  • Действие сборки: встроенный ресурс,
  • Пользовательский инструмент: PublicResXFileCodeGenerator,
  • Пользовательское пространство имен: MyResources

ViewModel AnswersViewModel имеет атрибут IDAnswer со следующим атрибутом: [Обязательно (ErrorMessageResourceName = "RequiredMessage", ErrorMessageResourceType = typeof (MyResources.Language))]

Я добавил пространство имен MyResource в файл web.config в папке View, и я обновил раздел system.web основного web.config, добавив

Надеюсь, это поможет.

рассматривает