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)GetLocalResource("Title");
Painless and smooth. The framework handles which .resx file to get from the culture info code extension (.en-EN.resx).
Is that possible in MVC4 with Razore view? And how?
Iv'e noticed that i can set the Custom Tool
property on the .resx file to PublicResXFileCodeGenerator
. That way I can access it from the view. Example:
I've created 2 resource files for index.cshtml in danish and english. Just as I would in web-forms. Here's what I wish i could write (Custom Tool Name
property set to 'ViewResource'):
@ViewResource.Title
Bam. If current culture is danish, title will be "Forside", and if english it would be "Home". But instead the only options I am given is choosing a specific file. And from that choose the desired string:
@ViewResource.Index_cshtml_en-EN_resx.Title
Thats not dynamic. So I thought I could make an extension class that would replace the en-EN/da-DK somehow. But that really seems like relatively alot of work for something so "simple" and already well and easy intergrated into web-forms. There has to be another way. Surely the mvc team has some smart mechanism for us like everything else :)
I never got it to work. I ended up using .net folders "App_LocalResources".
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.
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.
Then depending on the current thread culture it will choose the text from the correct file
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 selectproperties
and make sure the following are selectedThen in your view you can use the
Resources
name space to access the text in your.resx
file@Resources
because that is the name that you gave in theCustom Tool Namespace
and.Resource
because that is the name of the.resx
fileAlso make sure that the resources are set to
Public
To access the resources from any model just add a single line
More details can be found on this post.
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.
Right-click on you view's containing folder, select Add > Add ASP.NET folder > App_LocalResources
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
andCustom Tool=(blank)
Double-click the resx files and populate with key/values
Create a HtmlHelper extension method.
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:
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.
I got it workint using
@MyApp.Resources.Resources.Title
.