未翻译所需的数据注释
Required Data Annotation is not being translated
我们在 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
在此先感谢您的帮助。
我将从在 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];
}
确认您用于标识文化的值是 headers
正在使用的值
跟进
您正在使用全球化 headers 检查用户语言,但在浏览器中手动设置用户语言。
2 种尝试方法:
1) 使用 Javascript:
在浏览器中设置用户语言
<script type="text/javascript">
Globalize.culture("@ViewBag.Culture");
</script>
或者如果在 Javascript 中设置了区域性(相对于 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);
}
}
如果您手动设置语言,第一种方法似乎是更好的解决方案。简而言之,每次用户更改语言模式时,注释都必须是 re-set。
另一件需要考虑的事情是,您当前设置语言的方式(通过 headers)可能是您的最佳解决方案。虽然这更难测试,因为您需要一个具有专用语言的客户端,但这是您的用户最好的区分方式(headers)。
确保您当前的线程上下文已更新为根据 Web 客户端的请求使用正确的 CultureInfo headers。如果您定义了 <globalization ..>
标签,这个 应该 是自动的。否则,添加过滤器拦截请求并执行更新。
var cultureName = "de-DE"; // get this from request headers
var ci = new CultureInfo(cultureName);
Thread.CurrentThread.CurrentCulture = ci;
Thread.CurrentThread.CurrentUICulture = ci;
为了重现您的问题,我创建了一个示例应用程序。它对我有用,所以我会给你我当前的设置。
我有一个引用库程序集资源的 Web 应用程序项目。
我在 Resource 项目中有 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"/>
希望对您有所帮助。
我们在 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
在此先感谢您的帮助。
我将从在 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];
}
确认您用于标识文化的值是 headers
正在使用的值跟进
您正在使用全球化 headers 检查用户语言,但在浏览器中手动设置用户语言。
2 种尝试方法:
1) 使用 Javascript:
在浏览器中设置用户语言<script type="text/javascript">
Globalize.culture("@ViewBag.Culture");
</script>
或者如果在 Javascript 中设置了区域性(相对于 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);
}
}
如果您手动设置语言,第一种方法似乎是更好的解决方案。简而言之,每次用户更改语言模式时,注释都必须是 re-set。
另一件需要考虑的事情是,您当前设置语言的方式(通过 headers)可能是您的最佳解决方案。虽然这更难测试,因为您需要一个具有专用语言的客户端,但这是您的用户最好的区分方式(headers)。
确保您当前的线程上下文已更新为根据 Web 客户端的请求使用正确的 CultureInfo headers。如果您定义了 <globalization ..>
标签,这个 应该 是自动的。否则,添加过滤器拦截请求并执行更新。
var cultureName = "de-DE"; // get this from request headers
var ci = new CultureInfo(cultureName);
Thread.CurrentThread.CurrentCulture = ci;
Thread.CurrentThread.CurrentUICulture = ci;
为了重现您的问题,我创建了一个示例应用程序。它对我有用,所以我会给你我当前的设置。
我有一个引用库程序集资源的 Web 应用程序项目。
我在 Resource 项目中有 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"/>
希望对您有所帮助。