MVC 5中的本地化 - 如何使用资源文件在视图中呈现多语言文本?

时间:2016-11-12 02:05:18

标签: c# asp.net asp.net-mvc-5

我正在尝试在MVC 5应用程序中创建多语言导航。

我做了什么:

  1. System.Threading.Thread.CurrentThread.CurrentUICulture设置为" en-US"或者" es-ES"基于cookie值(默认为英语 除非用户选择西班牙语)
  2. 创建了三个资源文件(这是我第一次使用它们,所以我不确定我完全理解这个概念......)Index.resx,Resouce.en-US.resx,Resouce。 ES-ES.resx。每个资源文件都位于名为App_GlobalResources文件夹

  3. 的文件夹中
  4. 为每个.resx文件添加名称/值组合,为Index.resx和en-US.resx添加Home / Home,为es-ES.resx添加Home / Casa

  5. 在我的布局文件中使用@Resources.Index.Home进行了尝试,认为当CurrentUICulture的值从en-US更改为es-ES且反之亦然时,语言会根据我的值更改资源文件。
  6. 有人可以告诉我如何在价值CurrentUICulture为" es-ES"时提供西班牙语文本,以及英文文本为" en-US& #34;

    _Layout.cshtml

    Resource.resx

    修改

    我应该说 - @Resources.Index.Home确实呈现了文字" Home"在导航中。但是,当我将CurrentUICulture切换为" es-ES"时,它仍会呈现" Home",而不是" Casa"

    编辑2

    以下是我设置CurrentUICulture的方法是global.asax

       public void Application_AuthenticateRequest(Object sender, EventArgs e)
            {
                if (Request.Cookies["lang"] == null)
                {
                    HttpCookie lang = new HttpCookie("lang");
                    lang.Value = "english";
                    lang.Expires = DateTime.Now.AddDays(30d);
                    Response.Cookies.Add(lang);
                }
                else if (Request.Cookies["lang"] != null)
                {
                    if (Request.Cookies["lang"].Value != null && Request.Cookies["lang"].Value == "english")
                    {
                        System.Threading.Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-us");
                    }
                    else if (Request.Cookies["lang"].Value != null && Request.Cookies["lang"].Value == "spanish")
                    {
                        System.Threading.Thread.CurrentThread.CurrentUICulture = new CultureInfo("es-es");
                    }
                }
            }
    

1 个答案:

答案 0 :(得分:0)

尝试将@Resources.Index.Home替换为@Resources.Home 这是对本地化的理解 每个具有本地化的应用(比如N种文化)必须有N .resx个 - 具有相同名称但后缀不同的文件。 +默认文化可以在没有后缀的情况下使用。 所以你有2种文化 - 你必须使用2个.resx文件,而不是更多。因此根本不需要Index.resx 这应该工作。如果没有,更多修正:
- 不要使用App_GlobalResources文件夹。只需在公共项目文件夹或项目根文件夹中创建.resx,就像在桌面.NET应用程序中一样    这对我有所帮助,希望这对你有所帮助。