none
MVC 3 - Globalization através de clique em link RRS feed

  • Pergunta

  • Bom dia a todos,

    Bem, minha questão é: Como criar um mecanismo de tradução que através de um clique em um link, a aplicação toda busque do bando ou de um arquivo resource e traduze o conteúdo globalmente da aplicação, já tentei tudo e quanto é diabo-a-quatro e nenhuma das soluções que encontrei puderam me ajudar.

    Preciso que, ao clicar no link, uma action específica realize esta tradução.

    Desde já agradeço.

    quinta-feira, 23 de agosto de 2012 13:46

Todas as Respostas

  • Olá David, tenho na minha aplicação uma situação parecida com a sua que pode lhe auxiliar..

    O Cenário é o seguinte: A aplicação possui 3 bandeirinhas (EUA, BRA, ESP) no topo da página que ao clicar nelas é efetuado uma chamado em determinado controller passando para a ação inclusive a url em que está para que depois retorne para a mesma página.

    Segue exemplos:

    View: _Layout.cshtml

    <a href="@Url.Action("Idioma", "Config", new { idioma = "pt-BR", url = HttpContext.Current.Request.ServerVariables["URL"] })">
        <img src="@Url.Content("~/Content/Layout_Imgs/Band_Idioma/brasil.png")" alt="" style="border: none;" />
    </a>
    
    <br />
    
    <a href="@Url.Action("Idioma", "Config", new { idioma = "en-US", url = HttpContext.Current.Request.ServerVariables["URL"] })">
        <img src="@Url.Content("~/Content/Layout_Imgs/Band_Idioma/eua.png")" alt="" style="border: none;" />
    </a>
    
    <br />
    
    <a href="@Url.Action("Idioma", "Config", new { idioma = "es-ES", url = HttpContext.Current.Request.ServerVariables["URL"] })">
        <img src="@Url.Content("~/Content/Layout_Imgs/Band_Idioma/spanha.png")" alt="" style="border: none;" />
    </a>
                            

    Controller: ConfigController.cs

    public ActionResult Idioma(string idioma, string url)
    {
         // Seta cultura do projeto onde ficam os Resources
         System.Globalization.CultureInfo c = Resources.Cultures.RetornaCultura(idioma);
    
         // Seta cultura da sessão atual
         Thread.CurrentThread.CurrentCulture = ;
         Thread.CurrentThread.CurrentUICulture = c;
    
         // #### RETORNANDO PARA A MESMA PÁGINA
         Auxiliar aux = new Auxiliar();
         string controller = "", acao = "";
         aux.TraduzirRota(url, ref acao, ref controller); // Extrai a acao e o controller da url
    
         return RedirectToAction(acao, controller);
    }
    Espero que ajude.. abraços...



    .:: Contribua com o fórum! Marque como útil os posts que lhe ajudam e marque como resposta aqueles que resolvem a dúvida do post. ::.

    Marco Aurélio Ferdinando Jr.

    sexta-feira, 24 de agosto de 2012 20:57
  • Bom dia Marco.

    Obrigado por sua atenção.

    Minha idéia foi igual a sua, porém não resolveu, não faço idéia o porque de não ter funcionado.

    Minha View _Layout.cshtml:

    <div>
         <a href="@Url.Action("ChangeLanguage", "Language", new { language = "pt-BR", url = HttpContext.Current.Request.ServerVariables["URL"] })" title="Português">
    <img src="@Url.Content("~/Content/Images/idiomas-brazil.png")" alt="Português - Brasil" />
    </a>
         <a href="@Url.Action("ChangeLanguage", "Language", new { language = "es-ES", url = HttpContext.Current.Request.ServerVariables["URL"]  })" title="Español">
    <img src="@Url.Content("~/Content/Images/idiomas-spain.png")" alt="Español - España" />
    </a>
         <a href="@Url.Action("ChangeLanguage", "Language", new { language = "en-US", url = HttpContext.Current.Request.ServerVariables["URL"]  })" title="Inglês">
    <img src="@Url.Content("~/Content/Images/idiomas-usa.png")" alt="English - USA" />
    </a>
    </div>

    E no meu LanguageController:

    public ActionResult ChangeLanguage(string language, string url)
    {
        System.Globalization.CultureInfo c = CultureInfo.CreateSpecificCulture(language);
        Thread.CurrentThread.CurrentUICulture = c;  
        Resources.Culture = c;
        return Redirect(url);
    }

    David Júnior

    terça-feira, 28 de agosto de 2012 14:12
  • Olá David, dê mais detalhes sobre o que foi que não funcionou..

    Mas a principio, o que vejo é que aquele seu Return pode ser o seu problema.. o Redirect(url); .. Altere o redirecionamento para a página que vc quer "manualmente", ou seja declaradamente no código, desta maneira vc saberá se o problema está realmente ali..

    No meu caso, eu tive que utilizar o RedirecToAction(), porém eu precisei extrair da string url a ação e o controller.

    Fiz isso com a função split("/"), o array retornado pela Split será: posição 0: Controller, posição 1: Ação.

    Espero retorno..


    .:: Contribua com o fórum! Marque como útil os posts que lhe ajudam e marque como resposta aqueles que resolvem a dúvida do post. ::.

    Marco Aurélio Ferdinando Jr.


    • Editado Marco A. Ferdinando Jr terça-feira, 28 de agosto de 2012 18:37 Add maiores quanto a função split..
    terça-feira, 28 de agosto de 2012 18:27
  • Olá Marco, fiz as correções conforme você me demonstrou, porém ao visualizar as views das actions ela apenas efetua um refresh da página porém a cultura ainda continua intacta.

    Qual namespace você utilizou na atribuição do CultureInfo nesta parte do código da Action Idioma?

    System.Globalization.CultureInfo c = Resources.Cultures.RetornaCultura(idioma);

    Queria fazer uns testes de acordo com o seu exemplo.

    Obrigado.


    David Júnior

    terça-feira, 28 de agosto de 2012 19:53
  • Perdão David, realmente passei despercebido por este trecho do código..

    Este método RetornaCultura é porque eu faço outras configurações como armazenar a preferencia do usuario no banco e obter informação do browser dele..

    O que vc precisa é apenas..

        Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(language);
        Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(language);
    


    .:: Contribua com o fórum! Marque como útil os posts que lhe ajudam e marque como resposta aqueles que resolvem a dúvida do post. ::.

    Marco Aurélio Ferdinando Jr.

    terça-feira, 28 de agosto de 2012 20:49
  • Olá Marco,

    Mesmo assim ainda ele não faz nada do que deveria ser feito. Criei um outro projeto para testar.

    Só pra constar veja como ficou os códigos:

    IdiomaController e classe Auxiliar

    public class IdiomaController : Controller
        {
            public ActionResult Idioma(string idioma, string url){
                // Seta cultura do projeto onde ficam os Resources
                System.Globalization.CultureInfo c = //Resources.Cultures.RetornaCultura(idioma);
                    CultureInfo.CreateSpecificCulture(idioma);
    
                // Seta cultura da sessão atual
                Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(idioma); // c;
                Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(idioma); ;
                
                // #### RETORNANDO PARA A MESMA PÁGINA
                Auxiliar aux = new Auxiliar();
                string controller = "", acao = "";
                aux.TraduzirRota(url, ref acao, ref controller); // Extrai a acao e o controller da url
    
                return RedirectToAction(acao, controller);
            }
        }
    
        public class Auxiliar
        {
            public Auxiliar() { }
    
            public void TraduzirRota(string url, ref string acao, ref string controller)
            {
                string[] URL = url.Split(char.Parse("/"));
    
    
                controller = (URL[0] == string.Empty) ? "Home" : URL[0];
                acao = (URL[1] == string.Empty) ? "Index" : URL[1];
            }
        }

    _Layout.cshtml:

    <footer>
                <div>
                    <a href="@Url.Action("Idioma", "Idioma", new { idioma = "pt-BR", url = HttpContext.Current.Request.ServerVariables["URL"] })">
                    Português
                    </a> | 
                    <a href="@Url.Action("Idioma", "Idioma", new { idioma = "en-US", url = HttpContext.Current.Request.ServerVariables["URL"] })">
                    English
                    </a> | 
                    <a href="@Url.Action("Idioma", "Idioma", new { idioma = "es-ES", url = HttpContext.Current.Request.ServerVariables["URL"] })">
                    Español
                    </a>
                </div>
    
            </footer>

    Index.cshtml -> Referente a action Index do HomeController

    @using System.Resources
    @using System.Threading
    @{
        ViewBag.Title = "Home Page";
    }
    
    @{
        ResourceManager objRes = new ResourceManager("GlobalizationMarco.Resource", typeof(GlobalizationMarco.Resource).Assembly, null);
        //Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(Session["cultura"].ToString());
        ViewBag.Title = "Home Page";
        
    }
    
    <h2>@GlobalizationMarco.Resource.m001</h2>
    
    <p>
        @GlobalizationMarco.Resource.m002
        <br />
        @Thread.CurrentThread.CurrentUICulture.ToString()
    </p>
    
    <h2>@objRes.GetString("m001")</h2>
    <p>
        @objRes.GetString("m002")
    
        <br />
        @Thread.CurrentThread.CurrentUICulture.ToString()
    </p>

    Veja que estou utilizando os dois tipo de busca, tanto o estático como o dinâmico pelo ResourceManager, os dois permanecem idênticos, porém sem nenhuma alteração após a execução da action do controller Idioma.

    O que mais poderia estar faltando?

    Agradeço a sua atenção e paciência.


    David Júnior

    terça-feira, 28 de agosto de 2012 20:57
  • Olá David

    E quanto aos seus arquivos de Resources, como estão??

    De uma olhada neste site: http://www.developmentalmadness.com/archive/2009/05/20/aspnet-mvc-globalizationlocalization.aspx

    Também é importante que os arquivos estejam com o mesmo nome, por exemplo..
    Resource.resx (Este é padrão, normalmente em Portugues)
    Resource.en-US.resx (Ingles)
    Resource.en-ES.resx (Espanhol)


    .:: Contribua com o fórum! Marque como útil os posts que lhe ajudam e marque como resposta aqueles que resolvem a dúvida do post. ::.

    Marco Aurélio Ferdinando Jr.

    quinta-feira, 30 de agosto de 2012 11:33
  • Bom dia Marco,

    Legal a sua observação, meus arquivos de Resources estão nomeados como Resources.resx, Resources.en.resx e Resources.es.resx.

    Utilizando apenas o prefixo de linguagem sem a região, mudei para a sua forma e mesmo assim nada muda. Ele apenas modifica no contexto do controller Idioma, porém nas demais ela perde esse valor e permanece o valor do Resource padrão que no caso é o pt-BR.

    Só para desencargo veja como está meu Web.config:

    <globalization culture="auto" uiCulture="auto" enableClientBasedCulture="true"/>

    Existe alguma outra configuração que deva ser feita? Qualquer coisa eu mando o projeto para você dar uma analisada no que está dando errado.

    Obrigado.


    David Júnior


    quinta-feira, 30 de agosto de 2012 13:02
  • Boa tarde!

    Alguma solução para esse problema?

    tem como me enviar o código caso positivo?

    Obrigado!


    Posso não concordar com o que vc disse, mas lutarei até a morte pelo seu direito de dizer...

    sexta-feira, 10 de março de 2017 17:44