我可以使用 ErrorMessageResourceName 和 ErrorMessageResourceType 将规则转换为我的语言。但是如何翻译类名和属性呢?
目前,我将Valideringsmeddelandeför'LastName'作为验证消息。我希望 LastName 也能够进行本地化。
答案 0 :(得分:2)
据我所知,验证应用程序块未使用ErrorMessage
,ErrorMessageResourceName
和ErrorMessageResourceType
属性。它们包含在验证应用程序块5.0中,因为VAB的BaseValidationAttribute
现在继承自System.ComponentModel.DataAnnotations.ValidationAttribute
。这些属性在DataAnnotations'ValidationAttribute
中定义。通过继承DataAnnotations,应用程序和框架可以在不依赖于VAB的情况下验证模型(例如ASP.NET MVC所做的验证)。
您可以使用VAB的MessageTemplateResourceName
和MessageTemplateResourceType
,并且不使用任何标记并使用特定于该属性的文本。例如,将这个完整的文本放在您的资源中:“Valideringsmeddelandeförefternamn”(对不起,如果翻译很糟糕;我使用谷歌翻译)。
<小时/> 更新:
我在图书馆里做了一些挖掘,不幸的是,没有简单的办法解决这个问题。以下是位于GetMessage
的{{1}}基类中定义的Validator
方法的代码。
Microsoft.Practices.EnterpriseLibrary.Validation
如您所见,错误消息是使用protected internal virtual string GetMessage(
object objectToValidate, string key)
{
return string.Format(CultureInfo.CurrentCulture,
this.MessageTemplate,
new object[] { objectToValidate, key, this.Tag });
}
格式字符串以及MessageTemplate
,objectToValidate
和key
作为格式参数生成的。 Tag
是您可以在Tag
中定义的值,因此是静态的,不能是特定于文化的。验证属性时,提供的ValidationAttribute
将始终是该属性的名称。该名称将由框架提供,通过反映经过验证的类型。
通过定义新的key
并覆盖Validator
,您可以使名称更加用户友好且语言更具特色。这样,您可以根据资源中的属性名称获取与文化相关的文本。但问题是,您必须为要使用的每个验证属性创建一个子类,并且对于每个验证属性,您必须继承支持的验证器类。虽然每个属性和每个验证器不应该包含那么多代码,但维护这样的代码库仍然会非常痛苦。
我认为简单地定义完整的消息会更容易,包括资源中用户友好,特定于语言的名称。
<小时/> 更新2:
我想到了一些可能有用的东西。当您的应用程序一次只能显示一种语言时,可能会有一种解决方法。如果显示的消息是基于线程的当前文化进行本地化的,那么这对Web应用程序不起作用,但如果您可以在应用程序的配置文件中配置语言特定的文本,它可能适用于桌面应用程序。
在应用程序的配置文件(VAB支持的模型)中定义验证规则时,可以将Tag属性与特定于语言的字符串一起使用。
GetMessage
仔细查看标记<validation>
<type name="Company.Application.Domain.Person"
defaultRuleset="Default"
assemblyName="Company.Application.Domain">
<ruleset name="Default">
<properties>
<property name="LastName">
<validator type="StringLengthValidator" tag="efternamn"
upperBound="30" lowerBound="1"
lowerBoundType="Inclusive" upperBoundType="Inclusive"
negated="false" messageTemplate=""
messageTemplateResourceName=""
messageTemplateResourceType=""
name="String Length Validator" />
</property>
</properties>
</ruleset>
</type>
</validation>
。当您将{2}占位符放在资源中的格式字符串中时,它将被标记中定义的字符串替换。换句话说,这个资源字符串:
tag="efternamn"
将导致此验证消息:
Valideringsmeddelande för '{2}'
当然,为了实现这一点,您的配置必须已本地化。这对于Web应用程序来说不是一个好的解决方案。
但是......你也可以更进一步,构建一个Valideringsmeddelande för 'efternamn'
实现,返回一个基于线程当前文化的IConfigurationSource
实例。在这种情况下,您将必须在代码中构建配置。以下是如何执行此操作的示例:
ValidationSettings
您可以向public class MyConfigurationSource : IConfigurationSource
{
private Dictionary<CultureInfo, ValidationSettings> settings =
new Dictionary<CultureInfo, ValidationSettings>();
public ConfigurationSection GetSection(string sectionName)
{
if (sectionName == ValidationSettings.SectionName)
{
var culture = CultureInfo.CurrentCulture;
lock (this.settings)
{
if (!this.settings.ContainsKey(culture))
{
this.settings[culture] =
this.BuildSettingsFor(culture);
}
return this.settings[culture];
}
}
return null;
}
private ValidationSettings BuildSettingsFor(
CultureInfo culture)
{
// TODO: Build up your configuration here. Example:
new StringLengthValidatorData("LastName_Smaller100")
{
Tag = MyResources.GetValue(
"Customer.LastName", culture),
LowerBound = 1,
LowerBoundType = RangeBoundaryType.Inclusive,
UpperBound = 100,
UpperBoundType = RangeBoundaryType.Inclusive
}
}
}
提供MyConfigurationSource
的实例,或者,如果您想要更好的集成,请在VAB配置中将此类型连接起来。
但是请注意,在代码中构建验证规则目前还有很多工作要做,特别是因为VAB还没有(还)有一个像样的流畅配置API(我抱怨这个here)。我正在编写一个API,使其更容易实现(请密切关注my blog)。
祝你好运。