代码之家  ›  专栏  ›  技术社区  ›  Marek

C中的本地化属性参数#

  •  2
  • Marek  · 技术社区  · 15 年前

    在C中,属性参数需要是常量表达式、typeof或数组创建表达式。

    各种库(例如castle validator)允许指定将类似本地化错误消息的内容传递给属性构造函数:

    //this works
    [ValidateNonEmpty("Can not be empty")]
    
    //this does not compile
    [ValidateNonEmpty(Resources.NonEmptyValidationMessage)]
    

    有什么方法可以解决这个问题并使这些论点本地化吗?

    如果在使用castle验证器时没有解决方法,是否有类似castle验证器的验证库允许对验证消息进行本地化?

    编辑:我发现数据注释验证库是如何处理这个问题的。非常优雅的解决方案: http://haacked.com/archive/2009/12/07/localizing-aspnetmvc-validation.aspx

    2 回复  |  直到 15 年前
        1
  •  0
  •   Krzysztof Kozmic    15 年前

    它是开箱即用的:

        [ValidateNonEmpty(
            FriendlyNameKey = "CorrectlyLocalized.Description",
            ErrorMessageKey = "CorrectlyLocalized.DescriptionValidateNonEmpty",
            ResourceType = typeof (Messages)
            )]
        public string Description { get; set; }
    
        2
  •  4
  •   John Feminella    15 年前

    我们也有类似的问题,尽管不是和卡斯尔。我们使用的解决方案只是定义一个从另一个属性派生的新属性,它使用常量字符串作为对资源管理器的查找,如果没有找到,则返回到键字符串本身。

    [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 必要时进入。