MVC4本地化。从视图中访问resx

时间:2013-02-24 00:17:28

标签: razor asp.net-mvc-4 localization resx razor-2

在我看来,我想从该文件的特定本地资源访问资源字符串..正如您从网络表单中了解的那样:

(string)GetLocalResource("Title");

无痛且光滑。框架处理从文化信息代码扩展(.en-EN.resx)获取的.resx文件。

使用Razore视图可以在MVC4中实现吗?怎么样?

我注意到我可以将.resx文件中的Custom Tool属性设置为PublicResXFileCodeGenerator。这样我就可以从视图中访问它了。例: 我用丹麦语和英语为index.cshtml创建了2个资源文件。就像我在网络表单中一样。这是我希望我能写的(Custom Tool Name属性设置为'ViewResource'):

@ViewResource.Title

的Bam。如果现在的文化是丹麦语,标题将是“Forside”,如果是英语,它将是“Home”。但相反,我给出的唯一选择是选择一个特定的文件。然后从中选择所需的字符串:

@ViewResource.Index_cshtml_en-EN_resx.Title

这不是动态的。所以我想我可以制作一个以某种方式取代en-EN / da-DK的扩展类。但对于那些“简单”并且已经很好并且易于集成到网络表单中的东西来说,这似乎相当多。必须有另一种方式。当然,mvc团队对我们有一些聪明的机制,就像其他一切一样:)

6 个答案:

答案 0 :(得分:34)

我使用了特殊的.NET文件夹App_LocalResources

以下是步骤

.resx个文件添加到该文件夹​​(即:Resource.resxResource.es-ES.resx

右键单击每个.resx文件,然后选择properties,并确保选中以下内容

Build Action: Embedded Resource 
Custom Tool: PublicResXFileCodeGenerator
Custom Tool Namespace: Resources

然后在您的视图中,您可以使用Resources名称空间来访问.resx文件中的文字

<h2>@Resources.Resource.Global_Title<h2>

@Resources,因为这是您在Custom Tool Namespace.Resource中提供的名称,因为这是.resx文件的名称

还要确保资源设置为Public

要从任何模型访问资源,只需添加一行

using Resources;  //<<-- This line

namespace Concordia_CRM.Models
{
    public class SolicitudDemo
    {
        [Required]
        [Display(Name = "SD_NombreEmpresa", ResourceType = typeof(Resource))]
        public string NombreEmpresa { get; set; }

...
}

可在此post上找到更多详情。

答案 1 :(得分:9)

在Visual Studio的Resources Designer中,我们有一个带有标签的Combo Box:Access Modifier,通常设置为:internal,使其工作设置为:Public。

答案 2 :(得分:7)

如果您创建名为f.ex的文件夹。 “资源”并添加2个文件Index.resx和Index.da-DK.resx你应该能够在你的剃刀视图中像这样访问它们。

@Resources.Index.Title

然后,根据当前的线程文化,它将从正确的文件中选择文本

答案 3 :(得分:3)

terjetyl让我走上了正确的道路,但我不得不做一些&#34;编码&#34; (啊坚果)让它工作。我的设置是Visual Studio 2013,MVC 5,Razor。

  1. 右键点击您查看的文件夹,选择添加&gt;添加ASP.NET文件夹&gt; App_LocalResources文件

  2. 在此处添加两个资源文件:Index.cshtml.resx和Index.cshtml。 fr-FR .resx(假设您的视图被调用&#34;索引&#34;以及你想要法语翻译)。检查文件属性,并确保将其设置为Build Action=ContentCustom Tool=(blank)

  3. 双击resx文件并使用键/值填充

  4. 创建HtmlHelper扩展方法。


  5. public static class HtmlExtensions
    {
        public static MvcHtmlString Translate(this HtmlHelper htmlHelper, string key)
        {
            var viewPath = ((System.Web.Mvc.RazorView)htmlHelper.ViewContext.View).ViewPath;
            var culture = System.Threading.Thread.CurrentThread.CurrentCulture;
    
            var httpContext = htmlHelper.ViewContext.HttpContext;
            var val = (string)httpContext.GetLocalResourceObject(viewPath, key, culture);
    
            return MvcHtmlString.Create(val);
        }
    }
    

    1. 在视图中使用扩展程序:

      <p>@Html.Translate("MyKey")</p>

    2. 为了解释,帮助程序获取视图的虚拟路径并将其传递给HttpContext.GetLocalResourceObject(),它决定使用哪个资源文件(并优雅地降级)。

      最后一件事,请确保它在您的web.config中:

      <system.web>
          <globalization culture="auto" uiCulture="auto" enableClientBasedCulture="true" />
          ...
      

      我试图尽可能简单地保持这一点。但是,请注意,通过使用此示例,除fr-FR之外的法语文化(例如fr-CA)将默认为基本resx。如果您希望它比这更聪明,则需要更多代码 - 我可以根据要求提供。

答案 4 :(得分:2)

我从来没有工作过。我最终使用.net文件夹“App_LocalResources”。

答案 5 :(得分:0)

我使用@MyApp.Resources.Resources.Title得到了workint。