【问题标题】:Required Data Annotation is not being translated未翻译所需的数据注释
【发布时间】:2015-06-26 21:55:53
【问题描述】:

我们在Required属性的本地化中遇到了一个奇怪的错误。

我们有以下代码:

    public class AnswersGroupViewModel
    {
        public int IDAnswerGroup { get; set; }
        public int IDEvaluator { get; set; }
        public List<AnswersViewModel> Answers { get; set; }
    }

    public class AnswersViewModel
    {        
        public string Text{ get; set; }      
        [Required(ErrorMessageResourceName = "RequiredMessage", ErrorMessageResourceType = typeof(Resources.Language))]
        public int IDAnswer{ get; set; }
    }

问题是“RequiredMessage”的正确翻译没有从资源文件中提取,尽管它存在(我们在西班牙语和俄语资源文件中都有RequiredMessage)。

Display 等属性正在工作并正在翻译,但似乎是Required 属性的问题。

这是一个示例图像:

错误以@Html.ValidationMessage 显示

提前感谢您的帮助。

【问题讨论】:

  • 您的翻译看起来像“请输入{0}”吗?显然请输入将是俄语或其他,我问你是否包括{0}。
  • 在这种情况下不是。只需要一条说明该字段的消息。
  • 问题是否只涉及客户端验证或服务器端验证或两者兼而有之?
  • 验证在服务器上执行。 ModelState.IsValid 为 false 所以返回给 View
  • 技术上不正确。验证在服务器上配置,但它在客户端上强制执行,并且可选地在模型检查上执行

标签: c# asp.net asp.net-mvc validation data-annotations


【解决方案1】:

我将从在 web.config 中设置全球化元素开始

<system.web>
  <globalization enableClientBasedCulture="true" culture="auto" uiCulture="auto"/>

接下来,我将检查您在控制器中获得的文化(将其登录到数据库中或使用 @ViewBag 传递到视图

culture = CultureInfo.InstalledUICulture.IetfLanguageTag;
if (HttpContext.Current != null && HttpContext.Current.Request.UserLanguages != null)
{
    culture = Request.UserLanguages[0];     
}

确认您用于标识文化的值是标题使用的值


跟进

您正在使用全球化标头检查用户语言,但在浏览器中手动设置用户语言。

2 种尝试方法:

1) 使用 Javascript 在浏览器中设置用户语言:

<script type="text/javascript"> 
     Globalize.culture("@ViewBag.Culture");
</script>

或者如果在 Javascript (vs C#) 中设置了文化

<script type="text/javascript"> 
     Globalize.culture(culturevariable);
</script>

2) ParameterisedRequiredAttribute

public class ParameterisedRequiredAttribute : RequiredAttribute
{
    private string[] _replacements { get; set; }

    public ParameterisedRequiredAttribute(params string[] replacements)
    {
        _replacements = replacements;

        ErrorMessageResourceName = ErrorMessagesErrors.SpecificFieldRequired;
        ErrorMessageResourceType = typeof(ErrorMessages);
    }

    public override string FormatErrorMessage(string name)
    {
        return string.Format(ErrorMessageString, (object[])_replacements);
    }
}

如果您手动设置语言,第一种方法似乎是更好的解决方案。简而言之,每次用户更改语言模式时都必须重新设置注释。

要考虑的另一件事是,您当前设置语言的方式(通过标题)可能是您最好的解决方案。虽然这更难测试,因为您需要一个具有专用语言的客户端,但这是最好地区分您的用户的方式(通过标题)。

【讨论】:

  • 我们已经在 Web.config 中有那行。但我们的路线略有不同。我们在标签“culture”和“uiCulture”上有“auto:es”。
  • @rubenfa,尝试将 uiCulture 更改为“自动”。如果这不起作用,我们可以创建一个自定义属性。
  • Upss,你是对的。文化始终是控制器上的“es-ES”。如果我在 web.config 上将 uiCulture 设置为“ru”,则会翻译错误消息。使用自动不起作用。我们正在使用code52 更改语言,看来问题就在那里。
  • @rubenfa,试试这个 hack 看看它是否改变了任何东西&lt;script type="text/javascript"&gt; Globalize.culture("&lt;% = CultureInfo.CurrentCulture.ToString() %&gt;"); &lt;/script&gt;
  • @rubenfa,我怀疑问题出在你得到的标题中。当您检查Request.UserLanguages 时,您正在检查来自请求者浏览器的请求标头。只是好奇,你试过设置uiCulture="auto"吗?
【解决方案2】:

确保您当前的线程上下文已更新,以使用基于 Web 客户端请求标头的正确 CultureInfo。如果您定义了&lt;globalization ..&gt; 标签,则此应该是自动的。否则,添加过滤器来拦截请求并执行更新。

var cultureName = "de-DE"; // get this from request headers
var ci = new CultureInfo(cultureName);
Thread.CurrentThread.CurrentCulture = ci;
Thread.CurrentThread.CurrentUICulture = ci;

另见From where CultureInfo.CurrentCulture reads culture

【讨论】:

    【解决方案3】:

    为了重现您的问题,我创建了一个示例应用。它对我有用,所以我会给你我目前的设置。

    我有一个引用库程序集资源的 Web 应用程序项目。

    我在资源项目中有 2 个 resx 文件(language.resx 和 language.fr.resx)。两个文件具有相同的属性:

    • 构建操作:嵌入式资源,
    • 自定义工具:PublicResXFileCodeGenerator,
    • 自定义工具命名空间:MyResources

    ViewModel AnswersViewModel 有一个 IDAnswer 属性,该属性具有以下属性:

    [Required(ErrorMessageResourceName = "RequiredMessage", 
              ErrorMessageResourceType = typeof(MyResources.Language))]
    

    我已将命名空间 MyResource 添加到 View 文件夹中的 web.config 文件中,并通过添加更新了主 web.config 的 system.web 部分

    <globalization enableClientBasedCulture="true" culture="auto" uiCulture="auto"/>
    

    我希望它会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多