MVC4 localization. Accessing resx from view

前端 未结 6 1287
逝去的感伤
逝去的感伤 2020-12-14 20:08

In my view I would like to access resource strings from the specific local resource on that file.. Just as you know it from web-forms:

(string)GetLocalResour         


        
相关标签:
6条回答
  • 2020-12-14 20:47

    terjetyl put me on the right path, but I had to do some "coding" (ah nuts) to get it working. My setup is Visual Studio 2013, MVC 5, Razor.

    1. Right-click on you view's containing folder, select Add > Add ASP.NET folder > App_LocalResources

    2. Add two Resource Files into here: Index.cshtml.resx and Index.cshtml.fr-FR.resx (assuming your view is called "Index" and you want French translations). Check the file properties, and make sure they are set to Build Action=Content and Custom Tool=(blank)

    3. Double-click the resx files and populate with key/values

    4. Create a HtmlHelper extension method.


    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. Use extension in your view:

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

    To explain, the helper gets the virtual path of your view and passes it to HttpContext.GetLocalResourceObject(), which decides what resource file to use (and degrades gracefully).

    One last thing, make sure this is in your web.config:

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

    I've tried to kept this as simple as possible. However, be aware that by using this example, French cultures other than fr-FR (e.g. fr-CA) will default to the base resx. If you want it to be cleverer than this, more code is needed - I can include on request.

    0 讨论(0)
  • 2020-12-14 20:49

    I used the special .NET folder App_LocalResources.

    Here are the steps

    Add the .resx files to that folder (i.e.: Resource.resx, Resource.es-ES.resx)

    Right click on each .resx file and select properties and make sure the following are selected

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

    Then in your view you can use the Resources name space to access the text in your .resx file

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

    @Resources because that is the name that you gave in the Custom Tool Namespace and .Resource because that is the name of the .resx file

    Also make sure that the resources are set to Public

    To access the resources from any model just add a single line

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

    More details can be found on this post.

    0 讨论(0)
  • 2020-12-14 20:52

    If you create a folder called f.ex. "Resources" and add 2 files Index.resx and Index.da-DK.resx you should be able to accesses them like this in your razor view.

    @Resources.Index.Title
    

    Then depending on the current thread culture it will choose the text from the correct file

    0 讨论(0)
  • 2020-12-14 20:55

    I got it workint using @MyApp.Resources.Resources.Title.

    0 讨论(0)
  • 2020-12-14 20:56

    In Resources Designer in Visual Studio on the top we have a Combo Box with a label : Access Modifier, usually it is set to : internal, to make it work set it to : Public.

    0 讨论(0)
  • 2020-12-14 20:58

    I never got it to work. I ended up using .net folders "App_LocalResources".

    0 讨论(0)
提交回复
热议问题