我的ASP.NET MVC应用程序中有以下资源文件,用于存储英语和西班牙语的表单验证错误消息
ErrorMessages.resx
- 英语错误信息
ErrorMessages.sp.resx
- 西班牙语错误消息
在我需要System.ComponentModel.DataAnnotations
必需属性的模型中,它们标记如下:
[Required(ErrorMessageResourceType = typeof(ErrorMessages), ErrorMessageResourceName)]
public string MyProperty { get; set; }
在我的控制器中,我正在读取一个JavaScript cookie,其中包含用户在站点上选择的语言,并以编程方式设置当前线程和HTTP会话的“CultureInfo”:
public ActionResult MyController()
{
var language = HttpContext.Request.Cookies["language"].Value;
if(language.Equals("english"))
{
HttpContext.Session["culture"] = "en-US";
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
}
else
{
HttpContext.Session["culture"] = "es-US";
Thread.CurrentThread.CurrentCulture = new CultureInfo("es-US");
}
}
一旦CultureInfo值被修改,我如何设置适当的资源文件?
西班牙语.resx文件应为* .es.resx,而不是* .sp.resx。
要从适当的.resx文件解析翻译,您需要分配Thread.CurrentThread.CurrentUICulture
,而不是Thread.CurrentThread.CurrentCulture
使用@Koryakinp建议,我将控制器代码修改为以下内容:
var language = HttpContext.Request.Cookies["language"].Value;
if(language.Equals("english"))
{
HttpContext.Session["culture"] = "en-US";
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("en-US");
}
此外,我不得不重组.resx文件。我创建了一个名为“ErrorMessages”的.resx作为基础.resx并重命名了现有的.resx文件:
ErrorMessages.resx
ErrorMessages.en-US.resx
ErrorMessages.es-US.resx