ti-enxame.com

Localização MVC4. Acessando resx da visualização

Na minha opinião, gostaria de acessar cadeias de recursos a partir do recurso local específico nesse arquivo. Assim como você o conhece nos formulários da Web:

(string)GetLocalResource("Title");

Indolor e suave. A estrutura lida com o arquivo .resx a partir da extensão do código de informações da cultura (.en-EN.resx).

Isso é possível no MVC4 com a visualização Razore? E como?

Eu notei que eu posso definir o Custom Tool _ propriedade no arquivo .resx para PublicResXFileCodeGenerator. Dessa forma, eu posso acessá-lo da vista. Exemplo: criei 2 arquivos de recursos para index.cshtml em dinamarquês e inglês. Assim como eu faria em formulários da web. Aqui está o que eu gostaria de poder escrever (Custom Tool Name propriedade definida como 'ViewResource'):

@ViewResource.Title

Bam. Se a cultura atual for dinamarquesa, o título será "Forside" e, em inglês, será "Home". Mas, em vez disso, as únicas opções que me são dadas é escolher um arquivo específico. E a partir disso, escolha a string desejada:

@ViewResource.Index_cshtml_en-EN_resx.Title

Isso não é dinâmico. Por isso, pensei em criar uma classe de extensão que substituísse o en-EN/da-DK de alguma forma. Mas isso realmente parece relativamente trabalhoso para algo tão "simples" e já bem e fácil integrado em formulários da web. Tem que haver outra maneira. Certamente a equipe mvc tem algum mecanismo inteligente para nós, como todo o resto :)

15
Kasper Skov

Eu usei a pasta .NET especial App_LocalResources.

Aqui estão os passos

Adicione o .resx arquivos para essa pasta (ou seja: Resource.resx, Resource.es-ES.resx)

Clique com o botão direito do mouse em cada .resx e selecione properties e verifique se o seguinte está selecionado

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

Em sua opinião, você pode usar o espaço de nome Resources para acessar o texto em seu .resx Arquivo

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

@Resources porque esse é o nome que você deu no Custom Tool Namespace e .Resource porque esse é o nome do .resx Arquivo

Verifique também se os recursos estão definidos para Public

Para acessar os recursos de qualquer modelo, basta adicionar uma única linha

using Resources;  //<<-- This line

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

...
}

Mais detalhes podem ser encontrados neste post .

35
Mauricio Gracia Gutierrez

No Designer de Recursos no Visual Studio, na parte superior, temos uma Caixa de Combinação com um rótulo: Modificador de Acesso, geralmente é definido como: interno, para fazê-lo funcionar e definido como: Público.

9
phykas

Se você criar uma pasta chamada f.ex. "Recursos" e adicione 2 arquivos Index.resx e Index.da-DK.resx, você poderá acessá-los assim na sua visualização de navalha.

@Resources.Index.Title

Então, dependendo da cultura atual do encadeamento, ele escolherá o texto no arquivo correto

7
terjetyl

o terjetyl me colocou no caminho certo, mas tive que fazer algumas "codificações" (ah nozes) para fazê-lo funcionar. Minha configuração é o Visual Studio 2013, MVC 5, Razor.

  1. Clique com o botão direito do mouse na pasta que contém a exibição, selecione Adicionar> Adicionar pasta ASP.NET> App_LocalResources

  2. Adicione dois arquivos de recursos aqui: Index.cshtml.resx e Index.cshtml .fr-FR. Resx (assumindo que sua visão é chamada "Índice" e você deseja traduções em francês). Verifique as propriedades do arquivo e verifique se estão definidas como Build Action=Content E Custom Tool=(blank)

  3. Clique duas vezes nos arquivos resx e preencha com key/values

  4. Crie um método de extensão 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. Use a extensão na sua visão:

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

Para explicar, o auxiliar obtém o caminho virtual da sua exibição e o passa para HttpContext.GetLocalResourceObject (), que decide qual arquivo de recurso usar (e degrada normalmente).

Uma última coisa, verifique se isso está no seu web.config:

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

Eu tentei manter isso o mais simples possível. No entanto, esteja ciente de que, usando este exemplo, culturas francesas que não sejam fr-FR (por exemplo, fr-CA) serão padronizadas para o resx base. Se você quiser que seja mais inteligente do que isso, é necessário mais código - posso incluir a pedido.

3
Dunc

Eu nunca consegui funcionar. Acabei usando as pastas .net "App_LocalResources".

2
Kasper Skov

Eu comprei isso usando @MyApp.Resources.Resources.Title.

0
tonjo