在代码中映射适当的资源(.resx)文件 - ASP.NET MVC

问题描述 投票:1回答:2

我的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值被修改,我如何设置适当的资源文件?

c# asp.net-mvc-5 cultureinfo resx
2个回答
1
投票

西班牙语.resx文件应为* .es.resx,而不是* .sp.resx。

要从适当的.resx文件解析翻译,您需要分配Thread.CurrentThread.CurrentUICulture,而不是Thread.CurrentThread.CurrentCulture


1
投票

使用@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

© www.soinside.com 2019 - 2024. All rights reserved.