MVC验证消息国际化

时间:2013-02-05 14:04:43

标签: c# validation asp.net-mvc-4 internationalization

例如,我希望这个默认的ASP.NET MVC 4验证消息:The value 'qsdqsdqs' is not valid for Montant以法语显示。

我找到了这个包http://nuget.org/packages/Microsoft.AspNet.Mvc.fr/并安装了它,但是如何让它工作?

我在web.config中添加了<globalization culture="fr-FR" uiCulture="auto:fr" />并引用了dll,但邮件仍为英文

2 个答案:

答案 0 :(得分:9)

首先,您应该将您的消息保存在Resources文件中:

Resources/ErrorMessages.resx // default messages
Resources/ErrorMessages.fr.resx // for french 

在服务器端,它很容易变化,您可以通过向模型添加属性来实现。这样做:

[Required(ErrorMessageResourceType = typeof(Resources.ErrorMessages), ErrorMessageResourceName = "FieldRequired")]

其中“FieldRequired” Resources.ErrorMessages

中的字段之一

棘手的部分是您希望客户端验证也能正常工作。您必须创建自己的属性类扩展 属性之一,实现IClientValidatable

你喜欢它:

public class CustomRequiredAttribute : RequiredAttribute, IClientValidatable
    {
        public override string FormatErrorMessage(string name)
        {
            return String.Format(ErrorMessages.FieldRequired, name);
        } 

        public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
        {
            var rule = new ModelClientValidationRequiredRule(String.Format(ErrorMessages.FieldRequired, metadata.DisplayName));
            return new[] { rule };
        }
    }

从现在开始,您在模型中使用CustomRequired而不是Required。您也不必每次都指定消息。

修改

现在我已经看到你对SynerCoder的答案的评论 - 你不想自己翻译消息。嗯,我不认为这是正确的方法。即使您找到了可以为您翻译标准消息的内容,它也不会翻译任何自定义消息,因此您最终可能会混合两种方法。这通常会导致您不知道如何咬人的魔法错误。我强烈建议你自己做翻译(这不是很多 - 大约20个左右?)。这样做的好处是灵活的解决方案,没有意外错误。

答案 1 :(得分:0)

实际上使用ResX Manager。 Visual Studio菜单工具 - &gt;扩展程序和更新 - &gt;搜索&#34; resx&#34;在线工具。

通过其助手,我的所有字符串都可以像#34; Res.SomeTranslatedString&#34;一样被访问。 现在给上面的每个人提供信用,让我们翻译一个布尔属性的注册视图模型消息,以检查用户是否接受了条款和条件。使用上面的工具,我将字符串放入FILENAME。然后我们修改viewmodel代码:

当时:

Res.YouMustAcceptTermsAndConditions

变成了:

public class RegisterViewModel
{
    [Required]
    [Range(typeof(bool), "true", "true", ErrorMessage = "You must accept terms and conditions.")]
    [Display(Name = "Agree to terms.")]
    public bool AgreeTerms { get; set; }

现在您看到我们的[显示]仍未翻译..解决方案在这里:https://stackoverflow.com/a/3877154/7149454