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 otambé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: