MVC4定位。 从视图访问的resx(MVC4 localization. Accessing

2019-07-20 11:05发布

在我看来,我想从特定的本地资源访问的资源字符串在该文件上...正如你从web的表单知道:

(string)GetLocalResource("Title");

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

这有可能在MVC4与Razore看法? 如何?

Iv'e注意到,我可以设置Custom Tool属性的.resx文件到PublicResXFileCodeGenerator 。 这样我可以从视图访问。 例如:我创建了一个丹麦语和英语为index.cshtml 2个资源文件。 正如我会在web的表单。 这就是我希望我能写( Custom Tool Name属性设置为“ViewResource”):

@ViewResource.Title

巴姆。 如果目前的文化是丹麦,标题是“Forside”,如果英语这将是“家”。 而是我给了我们唯一的选择是选择一个特定的文件。 并从该选择所需的字符串:

@ViewResource.Index_cshtml_en-EN_resx.Title

那是不是动态的。 所以我想我可以做一个扩展类,会在一定程度取代EN-EN / DA-DK。 但是,这真的好像比较了很多的东西,所以“简单”和早已易intergrated成网络形式的工作。 必须有另一种方式。 当然了MVC团队对我们和其他事物一样一些聪明的机制:)

Answer 1:

我用的是特殊的.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; }

...
}

更多详细信息可以在此找到职位 。



Answer 2:

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



Answer 3:

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

@Resources.Index.Title

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



Answer 4:

terjetyl把我在正确的道路上,但我不得不做一些“编码”(啊螺母)得到它的工作。 我的设置是的Visual Studio 2013,MVC 5,剃刀。

  1. 您浏览的包含文件夹上右键单击,选择Add>添加ASP.NET文件夹> App_LocalResources文件

  2. 添加两个资源文件到这里:Index.cshtml.resx和Index.cshtml。 FR-FR的.resx(假设你的观点被称为“索引”和你想要法语翻译)。 检查文件的属性,并确保它们被设置为Build Action=ContentCustom 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. 在你看来使用的扩展:

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

为了解释,助手得到您的视图的虚拟路径,并把它传递给HttpContext.GetLocalResourceObject(),它决定什么资源文件来使用(和缓慢下降)。

最后一两件事,要确保这是你的web.config:

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

我试图保持这个尽可能简单。 但是,要知道,通过使用这个例子中,比FR-FR(如FR-CA)等法国文化将默认为基地RESX。 如果你希望它是比这更聪明,还需要更多的代码 - 我可以包括要求。



Answer 5:

我从来没有得到它的工作。 我结束了使用.NET文件夹“App_LocalResources文件”。



Answer 6:

我把它用workint @MyApp.Resources.Resources.Title



文章来源: MVC4 localization. Accessing resx from view