Never give out your password or credit card number in an instant message conversation. Douglas Vega says: opa... Andreo has been added to the conversation. Dennes Torres says: Vamos aguardar uns minutinhos para ver se os outros chegam... Dennes Torres says: Vcs fizeram os itens B e C, não é ? Douglas Vega says: isso! Rodrigo Galeote has been added to the conversation. Leandro Macedo - Hemorio has been added to the conversation. Dennes Torres says: Quem ficou com o item B mesmo ? Douglas Vega says: o Andreo.... Douglas Vega says: Windows application não é? Douglas Vega says: o Web application ficou comigo.... Dennes Torres says: Leandro, vc tá ai ? Dennes Torres says: Ok... Dennes Torres says: Leandro está em reunião... ele fez o item A, tentou me enviar o arquivo, mas eu não posso receber de onde estou, estou com firewall.... Dennes Torres says: Então depois analisamos o arquivo que Leandro fez... Dennes Torres says: Andreo, pode explicar para nós o trabalho que fez com relação ao item B ? Andreo says: ah sim, claro... como fazemos? vou mostrando passo a passo e todos vão fazendo junto? Dennes Torres says: Isso ai... Andreo says: vamos lá então... bom, temos então que abrir um projeto windowsapplication Andreo says: vou tentar ir devagar para dar tempo de todo mundo fazer... Andreo says: Primeiramente, adicione em um formulário 4 labels, mais 1 botão. Esses objetos servirão para vermos as palavras traduzidas automaticamente. Andreo says: Depois, clique sobre o form e nas propriedades, altere o valor da propriedade Localizable para True. Desta forma, você estará informando que deseja utilizar várias línguas no mesmo form. Andreo says: Note a propriedade Language, do form. Esta propriedade indica qual é a língua corrente. Ou seja, tudo o que vc digitar na propriedade text dos objetos será associada a esta língua. Utilizaremos inicialmente a língua default. Andreo says: Digite a palavra “default” na propriedade text de todos os objetos que colocamos no form anteriormente (inclusive no botão). Andreo says: Agora, clique novamente sobre o form e mude o valor da propriedade Language para Portuguese (Brazil). Desta forma, estamos informando que vamos começar a definir os textos nesta língua. Andreo says: Então, digite alguns valores diferentes na propriedade text de cada objeto. Minha sugestão: Gato, Cachorro, Pássaro e Cavalo para as labels, e Executar, para o botão. Temos agora 2 linguas definidas: “língua default” e “língua português”. Andreo says: Vamos criar agora uma terceira língua. Clique sobre o form e defina a propriedade Language para English (United States). Andreo says: Feito isso, note que ele volta os valores das propriedades text para o que foi setado na língua default. Digite agora os nomes dos animais em inglês: Cat, Dog, Bird e Horse para as labels, e Execute, para o botão. Andreo says: Dê um duplo clique no form. Vá até o construtor de sua classe e antes da chamada ao método InitializeComponent(), digite a seguinte instrução: System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("en-US"); Importante que esta instrução seja incluída antes da chamada a este método, pois é neste método que o designer do VS inclui todo o código para carregar Andreo says: ...a lingua indicada Andreo says: Em poucas linhas, a idéia da linha acima é criar um novo objeto CultureInfo (que guarda todas as informações sobre culturas) e atribuí-lo à cultura atual da thread atual. Para o exemplo, estamos atribuindo a língua inglesa (en), da região us (united states). Pronto! Pressione F5 para iniciar os testes. Andreo says: Veja que os textos aparecem em inglês! Então, feche o form e mude esta mesma linha para: System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("pt-BR"); Pressione F5. Como vc mudou a cultura da thread atual para português (região Brasil), os textos aparecem em português. Andreo says: Agora, mude a linha para: System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(""); Pressione F5. Desta vez, o texto que aparece é o que foi digitado na língua default. Andreo says: Isto acontece porque você definiu que a thread atual usaria “Invariant Culture”, ou seja, cultura independente. Se você setar a cultura para uma língua que não foi definida, a língua default é a que aparece. Andreo says: Para remover uma língua que já tenha sido definida, é necessário que o resource associado a esta língua seja removido, e não obstante, o arquivo. Andreo says: é isso!!!!!! Dennes Torres says: Ficou muito legal, Andreo ! Dennes Torres says: Parabéns ! Andreo says: obrigado! Dennes Torres says: Agora seria interessante produzir um artigo técnico com esse conteúdo... Dennes Torres says: E como está o tempo de vocês ? Dennes Torres says: Estão com tempo para que Douglas apresente a parte dele ? Andreo says: por mim ok... como assim artigo? Douglas Vega says: Pra mim tudo bem. Dennes Torres says: Um artigo para publicarmos no site DevASPNet... Andreo says: posso escrever... Douglas Vega says: Em um web application a diferença é que nada é feito automaticamente como no winapp, tudo é feito manualmente. Douglas Vega says: Então vamos criar uma nova webapp Douglas Vega says: um minuto Douglas Vega says: Então iremos inserir alguns objetos, uma tag

para o título da página Douglas Vega says: nessa tag teremos que ter ela como runat=server e também daremos um ID para ela Douglas Vega says: então colocaremos 3 labels e um botão Douglas Vega says: os valores do label agora tanto faz, pois ele sempre ira carregar alguma língua, mas sugiro que coloquem o testo em seu idioma para poder identificar o que é cada label. Sugiro "Nome, Telefone e Endereço" Douglas Vega says: e o botão como enviar. Douglas Vega says: os valores que me refiro são da propriedade TEXT Douglas Vega says: então iremos gerar agora os resources... para poder testar. Douglas Vega says: clique em Project > ADD new Item > Assembly Resource File Douglas Vega says: o Nome do assembly deve ser Douglas Vega says: um nome padrao, por exemplo, MyResource.idioma.resx, em idioma é onde você ira definir de qual idioma é o resource. Douglas Vega says: Ex: MyResource.pt.resx > Português Douglas Vega says: MyResource.en.resx > Inglês e assim por diante Dennes Torres says: E no caso de pt e pt-br ? usa-se pt-br ? Douglas Vega says: isso Douglas Vega says: o que fica entre o nome do arquivo e a extensão e exatamente o CultureUI, que é a propriedade onde iremos armazenar o idioma que ele carregara. Douglas Vega says: iremos editar os resources agora, dando um duplo clique nele, primeiro criamos um myResource.pt-BR.resx Dennes Torres says: É sensível a caixa ? Douglas Vega says: não é sensível não Douglas Vega says: então abriu o resource e iremos colocar as propriedades de cada label lá Rodrigo Galeote has left the conversation. Douglas Vega says: no name, sera o nome do objeto, o ideial seria Douglas Vega says: NomeWebForm.NomeObjeto para um fácil entendimento depois do que esta no resource Douglas Vega says: então colocamos name=WebForm1.label1 Douglas Vega says: e value = Nome Douglas Vega says: igualmente para os outros Douglas Vega says: WebForm1.Label2 e Telefone Douglas Vega says: WebForm1.Label3 e Endereço Douglas Vega says: WebForm1.Button1 e Enviar Douglas Vega says: e WebForm1.Head1 e Teste de Globalização esse é o ID da minha tag

, coloque conforme o seu Douglas Vega says: podemos alterar todos os objetos que contenha texto na página, inclusive o TITLE da pagina, basta definir aqui um valor pra ele que depois veremos como mapear os valores pela aplicação. Douglas Vega says: Agora iremos salvar e criar um novo Resource "MyResource.en-US.resx" Douglas Vega says: WebForm1.Label1 e Name WebForm1.Label2 e Phone Number WebForm1.Label3 e Address Douglas Vega says: WebForm1.Button1 e Send Douglas Vega says: e WebForm1.Head1 e Globalization Test Douglas Vega says: no caso o ID da sua tag

Douglas Vega says: Fechamos os arquivos e iremos para a aplicação agora. Douglas Vega says: iremos declarar um ResourceManager que do namespace System.Resources Douglas Vega says: ResourceManager myResource = new ResourceManager("Globalization.myResource", typeof(WebForm1).Assembly); Douglas Vega says: desculpe.... iremos criar isso no Form.Load Douglas Vega says: Onde ele recebe os valores "Globalization.MyResource" que é o seu namespace.nomedoresource Douglas Vega says: e o objeto WebForm1 Douglas Vega says: typeof(WebForm1).Assembly Douglas Vega says: Nessa linha ele ira carregar o resource que esta na página, que conseguimos alterar como na aplicação windows, pelo Culture, ou definindo direto na página, como iremos fazer Douglas Vega says: visualize o código HTML do seu WebForm Dennes Torres says: Pode explicar melhor o que faz essa linha do typeof ? Douglas Vega says: na diretiva da página iremos acrescentar um novo atributo, que é o UICulture Dennes Torres says: Não estou conseguindo converter isso para VB.NET .... Douglas Vega says: OK Dennes Torres says: ops.... foi... Dennes Torres says: me.getType.Assembly Dennes Torres says: provavelmente this.gettype.assembly também funcionaria.... Dennes Torres says: Qual o escopo da variável MyResource ? Douglas Vega says: como assim? Dennes Torres says: Private, Public, Protected.... Douglas Vega says: desculpe.... private Dennes Torres says: ok.... Douglas Vega says: to embanando tudo... hehehehe Douglas Vega says: então, iremos setar o atributo na diretiva da Página... feito isso? Dennes Torres says: ok.... Douglas Vega says: então iremos voltar ao código.... e setar os valores de cada LABEL de acordo com o Resource Douglas Vega says: Label1.Text = myResource.GetString("webform1.label1");Label2.Text = myResource.GetString("webform1.label2"); Label3.Text = myResource.GetString("webform1.label3"); Douglas Vega says: Label1.Text = myResource.GetString("webform1.label1"); Label2.Text = myResource.GetString("webform1.label2"); Label3.Text = myResource.GetString("webform1.label3"); Douglas Vega says: onde o parametro é o name que criamos no resource Douglas Vega says: Button1.Text = myResource.GetString("webform1.Button1") Douglas Vega says: Head1.InnerHTML = myResource.GetString("webform1.Head1") Douglas Vega says: para o

também, só que com InnerHTML por ser um objeto HTML Douglas Vega says: OK... podemos rodar a aplicação. OBS: Podemos colocar isso dentro do if (! Page.IsPostBack) pois ele ira carregar somente a primeira vez, não precisa carregar novamente depois. Dennes Torres says: Que objeto ? Dennes Torres says: Qual o tipo do objeto P ? Douglas Vega says: o da tag

Douglas Vega says: Parágrafo HTML... você criou ele? Dennes Torres says: Sim... qual o tipo, não me lembro... Dennes Torres says: Estou usando code-behind.... Douglas Vega says: ops.... HtmlGenericControl Douglas Vega says: System.Web.UI.HtmlControls.HtmlGenericControl Dennes Torres says: ok.... Douglas Vega says: rodou? Dennes Torres says: Diz que não encontra o resource adequado... errei o nome de alguma coisa... Dennes Torres says: os arquivos de resource devem se chamar myresource.en.resx e myresource.pt-br.resx, correto ? Douglas Vega says: isso Douglas Vega says: e na diretiva da página colocar o UICulture como um dos dois. Dennes Torres says: parece certo... Douglas Vega says: quando estanciou o ResourceManager colocou o NameSpace.NomeDoResource? Douglas Vega says: na primeira propriedade? Dennes Torres says: Não entendi.... não era para criar uma variável chamada MyResource dentro da classe ? Douglas Vega says: ResourceManager myResource = new ResourceManager("Globalization.myResource", typeof(WebForm1).Assembly); A linha de código é essa Douglas Vega says: Ali onde está Globalization.myResource é o seu NameSpace.MyResource Douglas Vega says: é que meu NameSpace chama Globalization.... Dennes Torres says: ah, sim... acertei até a caixa da letra.... Douglas Vega says: não rolou? Dennes Torres says: não... Dennes Torres says: a mensagem fala que locationinfo está null e que o culture do assembly está como neutral... Douglas Vega says: <%@ Page language="c#" Codebehind="WebForm1.aspx.cs" AutoEventWireup="false" Inherits="Globalization.WebForm1" UICulture="pt" %> isso fez? no final.... Dennes Torres says: sim.... Dennes Torres says: <%@ Page Language="vb" AutoEventWireup="false" Codebehind="WebForm1.aspx.vb" Inherits="WebApplication1.WebForm1" UICulture="pt-br" %> Douglas Vega says: É esse erro? Douglas Vega says: Could not find any resources appropriate for the specified culture (or the neutral culture) in the given assembly. Make sure "Globalization.myResource.resources" was correctly embedded or linked into assembly "Globalization". baseName: Globalization.myResource locationInfo: resource file name: Globalization.myResource.resources assembly: Globalization, Version=1.0.1420.24208, Culture=neutra Dennes Torres says: Isso ai.... Douglas Vega says: então verifique se o nome do seu resource está MyResource.pt-br.resx Dennes Torres says: Eu havia utilizado na criação da instancia do resource a expressão me.gettype.assembly ... Dennes Torres says: Não funciona, precisa ser gettype(webform1).assembly... Dennes Torres says: Ok, funcionou.... Dennes Torres says: Parabéns, Douglas ! You are having temporary network problems and are no longer in this conversation. Dennes Torres says: Oi ! Dennes Torres says: Tão todos ai ? Dennes Torres says: Acho que cai... Douglas Vega says: Estou.... Douglas Vega says: O Andreo esta do meu lado pois o VS dele deu problema... Dennes Torres says: ok.... Dennes Torres says: Então escreve um artigo sobre isso... Dennes Torres says: Vcs são de SP, não é ? Douglas Vega says: agora se trocar na diretiva pra en-US Douglas Vega says: Isso Dennes Torres says: Vamos esperar então Leandro enviar o DOC que ele fez para nós para podermos juntar isso a esse trabalho... Dennes Torres says: Mas podemos enquanto isso já trabalhar na melhoria disso... Dennes Torres says: Quais as melhores práticas ? Dennes Torres says: Quais as melhores formas de fazermos a globalização ? Dennes Torres says: Por exemplo, teríamos mesmo que atribuir caixa por caixa ou poderíamos fazer um for/each ? Dennes Torres says: E o databind, é uma opção ? Douglas Vega says: certo... e quando seria a próxima reunião? Dennes Torres says: 2a feira, pode ser ? Douglas Vega says: 2º tenho prova, vai estar meio complicado mesmo no final de semana... podemos ver na quarta? Dennes Torres says: 4a vou estar no DevDays... teria que ser na 5a então... Douglas Vega says: Pode ser.... mesmo horário? Dennes Torres says: Não, ou um pouco mais tarde (13:00) ou a noite..... Douglas Vega says: pra mim a noite é melhor.... vou ver com o Andreo e te mando um e-mail... ok? Dennes Torres says: Ele não tá ai do lado ? Douglas Vega says: foi atender um telefonema Dennes Torres says: ok... então 5a a noite, em torno de 22:30, ok ? Douglas Vega says: beleza....