【问题标题】:MVC4 localization. Accessing resx from viewMVC4 本地化。从视图访问 resx
【发布时间】:2013-02-09 10:24:55
【问题描述】:

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

(string)GetLocalResource("Title");

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

在带有 Razore 视图的 MVC4 中这可能吗?怎么做?

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

@ViewResource.Title

巴姆。如果当前文化是丹麦语,标题将是“Forside”,如果是英语,它将是“Home”。但相反,我得到的唯一选择是选择一个特定的文件。并从中选择所需的字符串:

@ViewResource.Index_cshtml_en-EN_resx.Title

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

【问题讨论】:

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


    【解决方案1】:

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

    步骤如下

    将.resx 文件添加到该文件夹​​(即:Resource.resx、Resource.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找到。

    【讨论】:

    • 我意识到这是旧的,但这个页面在我的开发中帮助了我,我想补充一点,如果你想在你的值中有 html 标签,它有助于将 @Resources.Resource.PropertyName 放在里面@Html.Raw()。这样,如果您的值具有标签(例如 ),它将相应地呈现 html 而不仅仅是文本。还有一点需要注意的是,如果要将这些值放在 data-foo 属性中,并且该值有空格,则应将整行括在引号中,以便读取为: data-foo="@Html.Raw( Resources.Resource.PropertyName)"
    【解决方案2】:

    在 Visual Studio 顶部的资源设计器中,我们有一个带有标签的组合框:访问修饰符,通常将其设置为:内部,为了使其正常工作,请将其设置为:公共。

    【讨论】:

    • 这可能是原始发布者的解决方案。
    【解决方案3】:

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

    @Resources.Index.Title
    

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

    【讨论】:

    • 不。我无法访问它们。我需要在视图中导入一些东西吗?
    • 也许您需要使用完整的命名空间路径 MyApp.Resources.Index.Title。我将资源文件放在一个单独的项目中,通过将资源访问器设置为公共,我可以直接从我的剃刀视图访问它们
    • 不行,我还是不行。您的资源文件设置为什么构建操作?
    • 它们被设置为“嵌入式资源”
    • 我需要将 @using System.Web.Razor.Resources; 添加到我的 Razor 文件的顶部,然后我可以这样做 @Resources.MyResource.Foo
    【解决方案4】:

    terjetyl 让我走上了正确的道路,但我必须做一些“编码”(啊坚果)才能让它工作。我的设置是 Visual Studio 2013、MVC 5、Razor。

    1. 右键单击视图的包含文件夹,选择添加 > 添加 ASP.NET 文件夹 > App_LocalResources

    2. 在此处添加两个资源文件:Index.cshtml.resx 和 Index.cshtml.fr-FR.resx(假设您的视图名为“索引”并且您想要法语翻译) .检查文件属性,确保它们设置为Build Action=Content 和Custom Tool=(blank)

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

    4. 创建一个 HtmlHelper 扩展方法。


    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. 在您的视图中使用扩展:

      &lt;p&gt;@Html.Translate("MyKey")&lt;/p&gt;

    解释一下,帮助器获取视图的虚拟路径并将其传递给 HttpContext.GetLocalResourceObject(),后者决定使用哪个资源文件(并优雅地降级)。

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

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

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

      • 如果您需要遵循此方法的步骤,请参阅我的回答(如下)
      【解决方案6】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多