无法使用 asp.net mvc 中的资源文件进行本地化

Cannot localize using resource file in asp.net mvc

我正在开发 ASP.NET MVC 应用程序。在我的应用程序中,我想添加一个下拉选项供用户使用 select 语言。我找到了使用 ASP.NET MVC 的本地化文章。

它都使用资源文件进行本地化,并根据文化检索资源属性。例如,如果我们使用英语和法语,我们必须制作两个资源文件,名称为 LangRes.resx 和 LangRes.fr-FR.resx 。所以我测试了如何使用如下资源文件。但它不起作用。

  1. 我创建了两个资源文件,分别命名为LangRes.resx和LangRes.fr-FR.resx

  2. 我将两个文件的修饰符都设置为 public。

  3. 然后我将值添加到资源文件

  4. 然后我在Web.config

    中添加了这个
    <globalization enableClientBasedCulture="true" culture="auto" uiCulture="auto"></globalization>
    
  5. 然后在视图文件中我打印了这条消息

    @{
        Culture = UICulture = "fr-FR";
    }
    <h2>@LangRes.Title</h2>
    

实际上,它应该显示法国。正确的?因为我设置的culture为"fr-FR",映射到后缀为LangRes.fr-FR.resx的资源文件。但是一直显示"English"。我该如何解决?此外,在 ASP.NET MVC 中进行本地化的最佳方法是什么?

您需要通过添加此功能在 Global.asax 中设置默认语言:

protected void Application_BeginRequest(object sender, EventArgs e)
    {
            System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("fr-FR");
            System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("fr-FR");
    }

如果您想为用户使用更改语言选项并创建更改语言按钮(例如 EN 和 FR 按钮)。您必须在控制器中设置文化值。例如:

查看:

@Html.ActionLink("English", "SelectLanguage", "Home", new { SelectedLanguage = "en-US" }, null)
@Html.ActionLink("Français", "SelectLanguage", "Home", new { SelectedLanguage = "fr-FR" }, null)

控制器:

public ActionResult SelectLanguage(string SelectedLanguage) 
    {
        Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(SelectedLanguage);
        Thread.CurrentThread.CurrentUICulture = new CultureInfo(SelectedLanguage.ToLower());

        HttpCookie LangCookie = new HttpCookie("LangCookie");
        LangCookie.Value = SelectedLanguage;
        Response.Cookies.Add(LangCookie);

        return RedirectToAction("Index", "Home");
    }

此外,如果您想检查语言 cookie,您可以在 Global.asax 中控制它,如下所示:

protected void Application_BeginRequest(object sender, EventArgs e)
    {
        HttpCookie LangCookie = Request.Cookies["LangCookie"];
        if (LangCookie != null && LangCookie.Value != null)
        {
            System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(LangCookie.Value);
            System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(LangCookie.Value);
        }
        else
        {
            System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("fr-FR");
            System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("fr-FR");
        }
    }