3

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

4

2 に答える 2

4

Castleではありませんが、同様の問題が発生しました。使用した解決策は、他の属性から派生した新しい属性を定義することでした。この属性は、リソースマネージャーへのルックアップとして定数文字列を使用し、見つからない場合はキー文字列自体にフォールバックしました。

[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エントリを定義できます。

于 2010-01-23T14:43:54.700 に答える
1

それは箱から出して動作します:

    [ValidateNonEmpty(
        FriendlyNameKey = "CorrectlyLocalized.Description",
        ErrorMessageKey = "CorrectlyLocalized.DescriptionValidateNonEmpty",
        ResourceType = typeof (Messages)
        )]
    public string Description { get; set; }
于 2010-01-23T15:07:28.757 に答える