none
Globalização com Class Library RRS feed

  • Pergunta

  • Tenho dois Projetos:

    Projeto - Class Library

    Neste projeto tenho dois arquivos .resx   

    Mensagem.resx ---> Contém mensagem em Protuguês

    Mensagem.en-us.resx ---> Contém mensagem em Inglês EUA

    Projeto - Web Form

    Este projeto consome a DLL do projeto acima. 

    Qdo não informo nada no web.config em uiCulture, as mensagem de exception da DLL, personalizadas por mim são exibidas em português.

      <globalization requestEncoding="utf-8" responseEncoding="utf-8" culture="" uiCulture="" />

    Qdo informo no web.config em uiCulture="en-us", as mensagem de exception da DLL personalizadas por mim, continuam sendo exibidas em português.

      <globalization requestEncoding="utf-8" responseEncoding="utf-8" culture="" uiCulture="en-us" />
    Meu objetivo é que as mensagens personalizadas(Exceptions tratados) no meu projeto dll, sejam exibidas conforme a uiculture.
     


    Marquinhos Não esqueça de qualificar a resposta.

    quarta-feira, 10 de junho de 2015 02:39

Respostas

  • Bom dia Marquinhos,

    acredito que a função abaixo poderá lhe ajudar:

    public static string TranslateExceptionMessage(Exception E, CultureInfo targetCulture)
            {
                try
                {
                    Assembly a = E.GetType().Assembly;
                    ResourceManager rm = new ResourceManager(a.GetName().Name, a);
                    ResourceSet rsOriginal = rm.GetResourceSet(Thread.CurrentThread.CurrentUICulture, true, true);
                    ResourceSet rsTranslated = rm.GetResourceSet(targetCulture, true, true);
                    foreach (DictionaryEntry item in rsOriginal)
                        if (item.Value.ToString() == E.Message.ToString())
                            return rsTranslated.GetString(item.Key.ToString(), false); // success
    
                }
                catch { }
                return E.Message; // failed (error or cause it's not intelligent enough to locale '{0}'-patterns
            }

    para chamar você deverá usar o seguinte código:

            private void Form1_Load(object sender, EventArgs e)
            {
                try
                {
                    throw new FileNotFoundException();
    
                }
                catch (Exception ex)
                {
                    string msg1 = TranslateExceptionMessage(ex, new CultureInfo("pt-BR"));
                }
            }


    Att, Lucio Rogerio


    Espero ter ajudado, se ajudei, por favor "Vote como Útil", e se resolvi seu problema, clique em "Propor como Resposta".

    • Marcado como Resposta Cristopher C I_ quarta-feira, 10 de junho de 2015 13:58
    quarta-feira, 10 de junho de 2015 09:41

Todas as Respostas

  • Oi Lúcio, fiquei com uma dúvida no seu post:

    Na minha DLL eu tenho dois resources

    Mensagem.resx ---> Contém mensagem em Protuguês

    Valores:

    Name "0001" Value "Qual é seu nome"

    Name "0002" Value "Qual é sua idade"

    Mensagem.en-us.resx ---> Contém mensagem em Inglês EUA

    Name "A0001" Value "What´s your name?"

    Name "A0002" Value "How old are you?"

    supondo que eu tenha uma classe chamada teste

    clsTeste
        e tenho  método que chama pergunta

      

    Vou colocar em VB.NET mais é simples

    public function Pergunta(parNrPergunta as int16) as string
    
    if parNrPergunta = 1 then
        'Aqui estou pegando do resource a mensagem Qual é seu nome
         return Mensagem.A0001 
    else
        'Aqui estou pegando do resource a mensagem qual é sua idade
        return Mensagem.A0002 
    
    end if
    
    
    end function
    
    
    

    No meu webform no load eu instancio a classe clsteste

    e mando clsteste.Pergunta(1)

    Como minha DLL vai saber qual é a UICulture que estou utilizando?

     


    Marquinhos Não esqueça de qualificar a resposta.

    quarta-feira, 10 de junho de 2015 14:40
  • Oi Lúcio,

    no ASP.NET eu consegui, por exemplo consegui traduzir os Labels.

     <asp:Label ID="lblNome" class="col-sm-2 control-label" Text="<%$ Resources:MyResource, lblNome%>" ClientIDMode="Static" runat="server"></asp:Label>

    A minha questão é que meu website, consome uma DLL, na DLL eu tenho minhas mensagens, por exemplo.

    Eu crio um erro personalizado Throw new Exception("Ocorreu um erro ao salvar pessoa " & ex.message)

    Este texto "Ocorreu um erro ao salvar pessoa "  coloquei ele num resource dentro da DLL, porém a DLL não está reconhecendo que UICuture meu website está trabalhando, ai vem a mensagem em português


    Marquinhos Não esqueça de qualificar a resposta.

    quarta-feira, 10 de junho de 2015 15:30
  • Fala ai Lúcio,

    então cara, no ASP.NET isso tá resolvido, lá eu consumi os resources corretamente, troco a UICurure e a tradução vem tudo certinho.

    Imagina meu cenário que no meu ASP.NET eu consumo um DLL de negócio da empresa.

    Essa DLL, tem seus exceptions personalizados. O que eu fiz na DLL foi criar tbm os arquivos de Resources porém dentro da DLL, para tratar somente as mensagens pertinentes a DLL. O problema que enfrento é que as mensagens, somente da DLL, não realiza a tradução de forma automática igual ocorre no meu Site(WebForm).

    Tendo um exemplo pratico:

    Imagina que tenho uma DLL que realiza login no meu site.

    Eu tenho WebSite A e WebSite B, ambos os sites consomem a DLL.

    Se o usuário informar a senha errada, eu levanto um exception de falha de login.

    Esta mensagem, de falha de login está na DLL. O que estou querendo é que a DLL exiba um exception conforme a linguagem. UICulture.

    Sacou?


    Marquinhos Não esqueça de qualificar a resposta.

    quarta-feira, 10 de junho de 2015 18:53