使用多种语言实现asp.net mvc网站

本文关键字:asp net mvc 网站 实现 语言 | 更新日期: 2023-09-27 18:18:28

我试图为用户提供一个选项来改变我的asp.net mvc网站的UI语言。我计划为用户提供两种语言,即:英语和荷兰语

为此我编辑了我的网页。配置文件和添加:

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

现在我添加了2个文件Resources.resx(默认文件)和Resources.nl-NL.resx(荷兰语的资源文件)。

我将资源文件称为<title>@WebApplication9.App_GlobalResources.Resources.RequestTitle</title>

当语言改变时,我正在改变文化:

Thread.CurrentThread.CurrentCulture = new CultureInfo("nl-NL");
Thread.CurrentThread.CurrentUICulture = new CultureInfo("nl-NL");

但是,即使将语言更改为荷兰语并将文化值更改为上述指定的文化值,仍然显示Resources.resx的英文值,而不是从Resources.nl-NL.resx获取值。

你能帮我找出我在这里错过了什么吗?

使用多种语言实现asp.net mvc网站

这可能有帮助;

POST方法:

public ActionResult SetCultureToNL()
    {
        SetCulture("nl-BE");
        return View("index");
    }
private void SetCulture(String culture)
    {
        Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(culture);
        Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture;
        if (httpContext.Request.Cookies["_Culture"] != null)
        {
            HttpCookie cultureCookie = new HttpCookie("_Culture", culture);
            httpContext.Response.SetCookie(cultureCookie);
        }
        else
        {
            HttpCookie cookie = new HttpCookie("_Culture");
            cookie.Value = culture;
            httpContext.Response.Cookies.Add(cookie);
        }
    }

和GET方法:

public ActionResult Index()
    {
        string cultureName = GetCultureCookieValue(this.ControllerContext.HttpContext.ApplicationInstance.Context);
            // Modify current thread's cultures            
            Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(cultureName);
            Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture;
      // ...
   }
public static String GetCultureCookieValue(HttpContext httpContext)
    {
        HttpCookie cultureCookie = httpContext.Request.Cookies["_Culture"];
        if (cultureCookie != null)
        {
            return CultureHelper.GetImplementedCulture(cultureCookie.Value);
        }
        else
        {
            return CultureHelper.GetImplementedCulture(httpContext.Request.UserLanguages[0]); // obtain it from HTTP header AcceptLanguages
        }
    }

通过在每次调用控制器动作方法时设置当前的区域性来解决这个问题。这个问题是由于我更改文化时引起的,它仅为当前线程设置。当用户请求另一个视图时,线程可能是不同的。所以我需要为每个新请求/新线程设置文化。

我给用户只有2种语言,即英语(en-US)和荷兰语(nl-NL)。所以我创建了两个resx文件,名称分别为Resources.resx(英语)和Resources.nl.resx(荷兰语)。当用户更改当前语言时,我将语言保存在会话中并存储在数据库中,以便在进一步登录时记住它。

if(selectedLang == Dutch)
{
    Session["Language"] = "nl-NL";
}
else
{
    Session["Language"] = "en-US";
}

现在Session["Language"]保存了用户的首选语言。现在在每个控制器的动作方法中:

[HttpGet]
public ActionResult ActionMethodName(DataClass dataObj)
{
    Sessions.ChangeLanguage(Session["Language"].ToString());
}

Sessions.ChangeLanguage(string language)是类Sessions中的静态方法,如下所示:

public static void ChangeLanguage(string lang)
{
    Thread.CurrentThread.CurrentCulture = new CultureInfo(lang);
    Thread.CurrentThread.CurrentUICulture = new CultureInfo(lang);
}