【问题标题】:Localize DataAnnotations in Asp.net core在 Asp.net 核心中本地化 DataAnnotations
【发布时间】:2021-08-13 10:15:17
【问题描述】:

在我的 asp.net core (.net5) 应用程序中,我有一个带有必填字段的表单。当该字段为空时,我有

“XX 字段是必填项”...英文...我想翻译成法语。我的意思是,我真的不想翻译,我想使用法语版本的消息。我不想添加资源文件,因为我有任何自定义字符串要翻译,我只想使用现有的消息,但要使用法语。

我开始阅读here,但如果文章真的建议我自己手动翻译每条消息,我并没有真正明白这一点。

我在配置中添加了这个

var supportedCultures = new[] { "fr-FR" };
var localizationOptions = new RequestLocalizationOptions().SetDefaultCulture(supportedCultures[0])
    .AddSupportedCultures(supportedCultures)
    .AddSupportedUICultures(supportedCultures);

app.UseRequestLocalization(localizationOptions);

但是这并没有改变消息...

也不通过 URL 设置文化参数,像这样

【问题讨论】:

    标签: c# localization asp.net-core-mvc .net-5 asp.net-core-5.0


    【解决方案1】:

    如果你只想要一个法语版本,你只需要在[必填]中定义错误信息

    属性,如:

    public class MyModel
    {
        [Required(ErrorMessage = "Le champ Nom est obligatoire")]
        public string Nom { get; set; }
    }
    

    如果您的共享代码引用了您共享的文档,则需要将资源文件添加到

    定义翻译后的消息,否则消息不会改变。

    编辑:

    如果你有其他属性,你可以定义一个customRequired属性:

     public class CustomRequiredAttribute : ValidationAttribute
    {
        public CustomRequiredAttribute()
        {         
        }
        
        protected override ValidationResult IsValid(object value, ValidationContext validationContext)
        {
            if (value == null)
            {
                ErrorMessage = $"Le champ {validationContext.DisplayName} est obligatoire";
                return new ValidationResult(ErrorMessage);
            }
            return ValidationResult.Success;
        }
    }
    

    型号:

    public class MyModel
    {   
        [CustomRequired]  //custom attribute
        public string Nom { get; set; }        
        [CustomRequired]
        public string PreNom { get; set; }
    }
    

    要使用您的自定义属性,您应该在您的发布操作中添加 ModelState.IsValid,因此如果无效,它将返回输入视图以显示错误消息,例如:

    [HttpPost]
        public IActionResult Privacy(MyModel myModel)
        {
            if (!ModelState.IsValid)
                return View("Index");
            return View();
        }
    

    【讨论】:

    • 实际上,Required 属性中有 any 消息。它默认使用默认消息。所以,我想使用 default 消息,但只使用 French 消息。我现在是否应该在每个 Nom、每个 Prenom 以及我创建的所有其他属性上复制粘贴相同的消息?
    • @Serge 您可以使用自定义属性,并编写所需的逻辑来获取属性名称并在其中设计错误消息,检查我编辑的答案。
    • 有没有办法不对法语翻译进行硬编码?我的意思是这是 IsRequired 的示例,但还有很多其他 DataAnnoattions!
    • 英文消息,没有硬编码,为什么法语的消息要硬编码?我的意思不是custom,也不是我需要的特定翻译。我需要 default,但不是英文的。我不是翻译,我是说,我是开发者)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-13
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 2022-12-03
    • 1970-01-01
    相关资源
    最近更新 更多