Параметры локализованных атрибутов в C # - PullRequest
2 голосов
/ 23 января 2010

В C # параметры атрибута должны быть выражением константы, typeof или выражением создания массива.

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

//this works
[ValidateNonEmpty("Can not be empty")]

//this does not compile
[ValidateNonEmpty(Resources.NonEmptyValidationMessage)]

Есть ли способ, как подойти к этой проблеме и локализовать эти аргументы?

Если для этого не используется обходной путь при использовании Castle Validator, существует ли библиотека проверки, аналогичная Castle Validator, которая позволяет локализовать сообщения проверки?

РЕДАКТИРОВАТЬ: я обнаружил, как библиотека проверки аннотаций данных подходит к этой проблеме. Очень элегантное решение: http://haacked.com/archive/2009/12/07/localizing-aspnetmvc-validation.aspx

Ответы [ 2 ]

4 голосов
/ 23 января 2010

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

[AttributeUsage(AttributeTargets.Class
  | AttributeTargets.Method
  | AttributeTargets.Property
  | AttributeTargets.Event)]
public class LocalizedIdentifierAttribute : ... {
  public LocalizedIdentifierAttribute(Type provider, string key)
    : base(...) {
    foreach (PropertyInfo p in provider.GetProperties(
      BindingFlags.Static | BindingFlags.NonPublic)) {
      if (p.PropertyType == typeof(System.Resources.ResourceManager)) {
        ResourceManager m = (ResourceManager) p.GetValue(null, null);

        // We found the key; use the value.
        return m.GetString(key);
      }
    }

    // We didn't find the key; use the key as the value.
    return key;
  }
}

Использование это что-то вроде:

[LocalizedIdentifierAttribute(typeof(Resource), "Entities.FruitBasket")]
class FruitBasket {
  // ...
}

Тогда каждый файл ресурсов для конкретной локали может при необходимости определять собственную запись Entities.FruitBasket.

0 голосов
/ 23 января 2010

Работает из коробки:

    [ValidateNonEmpty(
        FriendlyNameKey = "CorrectlyLocalized.Description",
        ErrorMessageKey = "CorrectlyLocalized.DescriptionValidateNonEmpty",
        ResourceType = typeof (Messages)
        )]
    public string Description { get; set; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...