... Assinatura do site por 3 anos + Kit MontaRibbons + 3 Livros em PDF + Diversas Revistas (pdf) de brinde, por apenas R$145,00
(
podendo parcelar em até 10 vezes no cartão de crédito)...

Clique aqui e obtenha mais detalhes do nosso kit completo e de como comprar.


Como montar um sistema com seleção de idiomas

Montar um sistema com a opção de selecionar o idioma é relativamente simples, apesar de ser um pouco trabalhoso.  O projeto aqui oferecido consiste basicamente em controlar a troca dos textos dos rótulos nos formulários, nas ribbons e nas caixas de mensagem do VBA.  

Armazenando o idioma selecionado

É necessário armazenar o idioma selecionado pelo usuário e geralmente é escolhida uma tabela para isso, sendo que neste projeto, optei em armazenar o valor do idioma na Lista de Propriedades do aplicativo. 

Todos os detalhes de como trabalhar com a Lista de Propriedades de um Banco de Dados, você pode estudar neste meu artigo.

Convencionei que o idioma será identificado por número, sendo:

0 - Português
1 - Inglês
2 - Espanhol

Para gerar a Propriedade idioma foi preciso executar a função abaixo, apenas uma vez.
 

Public Sub fncGerarNovaPropriedade()
Dim prpNovo As Property
Set prpNovo = CurrentDb.CreateProperty("idioma", dbByte, 0)
CurrentDb.Properties.Append prpNovo
End Sub

Note que a Propriedade idioma criada é do tipo Byte (0 a 255) e o valor inicial configurado foi o zero (Português).

Esta Propriedade assumirá somente os valores 0, 1 e 2, conforme convenção acima. Porém, vale destacar que é possível acrescentar mais valores, caso sejam utilizados novos idiomas.

Para se obter ou alterar o valor da Propriedade idioma, basta fazer uso da seguinte linha:

CurrentDb.Properties!idioma

Observe na imagem abaixo que ao clicar no botão Idioma da ribbon, o formulário frmTrocaIdioma é aberto, possibilitando que o usuário selecione o idioma desejado. 

Usando Access - Idiomas

 

Ao selecionar a opção no quadro do formulário, o valor passa a ser armazenado na Propriedade idioma.

Private Sub Quadro1_AfterUpdate()
CurrentDb.Properties!idioma.Value = Me!Quadro1
objRibbon.Invalidate
Call Form_Load
End Sub

Armazenando os textos em uma matriz

É possível armazenar os textos que irão popular os rótulos dos formulários em uma tabela ou em uma matriz e/ou na Propriedade Marca ( tag ) de cada rótulo.  Descartei, neste projeto, o uso de uma tabela,  por considerar prejudicial ao desempenho do aplicativo. 

Para facilitar a compreensão sobre o uso de matrizes, serão citados aqui, alguns exemplos.  Observe abaixo a criação de uma matriz unidimensional, configurada para armazenar até 3 elementos:

Dim Cor(3) as string 'armazena até três elementos

Vamos supor que na posição zero (0) da matriz, eu queira armazenar o texto "Vermelho", na posição Um (1) o texto "Red" e na posição Dois (2) o texto "Rojo".  Observe que correlacionei a posição da matriz (0,1 e 2) com os valores que serão armazenados na Propriedade idioma (0, 1 , 2).

Cor(0) = "Vermelho"
Cor(1) = "Red" 'Vermelho no idioma inglês
Cor(2) = "Rojo" 'Vermelho no idioma Espanhol

Agora, é possível usar os valores armazenados na matriz para determinar o preenchimento de um rótulo.  Para preencher um determinado rótulo com a cor vermelha em Inglês, basta indicar a matriz da posição 1:

me!NomeDoRótulo.caption = Cor(1) 'O rótulo será preenchido coma palavra "Red"

Caso queira pegar o valor definido pelo usuário e que está armazenado na Propriedade idioma,   a escrita ficará desta forma:

me!NomeDoRótulo.caption = Cor(CurrentDb.Properties!idioma)

Vale ressaltar que um formulário possui uma série de rótulos. Para identificá-los será feito o uso de uma matriz bidimensional, na qual a primeira coluna terá o idioma definido, conforme demonstrado no exemplo acima, e a segunda coluna terá os rótulos identificados.

Dim lab(3,4) as string 'podemos armazenar até 12 elementos (3x4)

Preste bem atenção no preenchimento da matriz abaixo:

lab(0, 0) = "Cadastro de Fornecedores"
lab(1, 0) = "Register of Suppliers"
lab(2, 0) = "Cartera de Proveedores"

lab(0, 1) = "Selecionar Fornecedor"
lab(1, 1) = "Select Supplier"
lab(2, 1) = "Seleccionar Proveedor"

lab(0, 2) = "Código"
lab(1, 2) = "Code"
lab(2, 2) = "Código"

lab(0, 3) = "Fornecedor"
lab(1, 3) = "Supplier"
lab(2, 3) = "Proveedor"

Note que a primeira coluna representa o idioma (0-Português,1-Inglês, 2-Espanhol) e a segunda coluna representa os rótulos (de 0 a 3).  Como os rótulos aqui são identificados por números, torna-se necessário alterar o nome destes na Lista de Propriedades, acrescentando o número correspondente. 

Observe a propriedade Nome na Lista de Propriedades do Rótulo que pertence ao campo Fornecedor: 

Usando Access - Nome do rótulo numerado

 

O nome do Rótulo foi configurado para rot3, sendo que este número 3 corresponde ao Rótulo de número 3 da segunda coluna da matriz . Verifique, observando os dados abaixo:

'Valores armazenados na matriz para configurar o rótulo rot3
lab(0, 3) = "Fornecedor"
lab(1, 3) = "Supplier"
lab(2, 3) = "Proveedor"

Agora, se desejar preencher o rótulo rot3 no idioma Espanhol, basta selecionar a matriz lab(2,3).  Veja:

me!rot3.caption = lab(2,3)  'Preenchendo com o valor "Proveedor"

Para que o preenchimento seja automático, basta indicar a propriedade idioma na matriz.  Observe:

'O rótulo rot3 será preenchido de acordo com o valor da propriedade idioma
me!rot3.caption = lab(CurrentDb.Properties!idioma,3) 

Outra vantagem de numerar os rótulos é a de simplificar de forma significativa, a rotina que fará preencher todos os campos do formulário.

'Percorre todos os rótulos do formulário.
For j = 0 To 3
  'Preenche o rótulo de acordo com o valor da propriedade idioma
  Me("rot" & j).Caption = lab(CurrentDb.Properties!idioma, j)
Next

Esta técnica de usar matrizes foi empregada no formulário frmFornecedores.  Veja o formulário carregado no idioma Inglês, na seguinte imagem:

Usando Access - Register of Suplliers

 

Este formulário possui Caixas de Mensagens que também precisam ser configuradas, conforme o idioma selecionado.  Observe  a matriz msg() utilizada para armazenar os diversos textos:

'------------------------------------------------------
'Informações das Caixas de Mensagens, nos três idiomas
'------------------------------------------------------
msg(0, 0) = "Confirma a exclusão do fornecedor"
msg(1, 0) = "Confirm the exclusion of the supplier"
msg(2, 0) = "Confirme la eliminación del proveedor"

msg(0, 1) = "O Fornecedor "
msg(1, 1) = "The supplier "
msg(2, 1) = "El proveedor "

msg(0, 2) = " já existe..."
msg(1, 2) = " already exists..."
msg(2, 2) = " ya existe..."

msg(0, 3) = "Confirmação"
msg(1, 3) = "Confirmation"
msg(2, 3) = "Confirmación"

msg(0, 4) = "Aviso"
msg(1, 4) = "Warning"
msg(2, 4) = "Atención"

Veja a escrita direta de uma caixa de mensagem pelo VBA:

msgbox "Confirma a exclusão do fornecedor", vbYesNo, "Confirmação"

Incorporando a matriz msg() é possível obter o mesmo resultado, visto acima.

msgbox msg(0,0),vbYesNo, msg(0,3)

Para a Caixa de Mensagem apresentar os textos em Espanhol, basta mudar os valores da matriz:

msgbox msg(2,0), vbYesNo, msg(2,3)

E para ficar automático, conforme seleção do usuário, basta usar a Propriedade idioma.  Veja:

msgbox msg(CurrentDb.Properties!idioma,0), vbYesNo, msg(CurrentDb.Properties!idioma,3)

Clique no botão Excluir ( Delete / Borrar ) e observe a Caixa de Mensagem surgindo no idioma selecionado.  Veja na imagem abaixo, a mensagem em inglês:

Usando Access - idioma caixa de mensagem

 

Armazenando os textos na propriedade Marca (tag)

Outra técnica empregada para armazenar os textos dos rótulos é fazer uso da Propriedade Marca ( tag ) de cada um dos rótulos.  Veja na imagem abaixo, a Propriedade do rótulo rot3, pertencente ao campo cliente do formulário frmClientes:

Usando Access - idioma propriedade MARCA (tag)

 

Note que os textos inseridos estão separados por ponto e vírgula.  No entanto, outro tipo de caractere  pode ser convencionado para realizar a separação dos textos. 

A função empregada para separar os textos é a split().  Com esta função é possível  extrair valores de uma seqüência qualquer, desde que seja aceitável definir um caractere como referência de separação, que no nosso caso é o ponto e virgula.

Cliente;Customer;Cliente

Observe os valores sendo inseridos manualmente na função Split() e veja também que na função é indicado o ponto e virgula como o marco de separação dos textos:

lab = split("Cliente;Customer;Cliente",";")

Para extrair os valores, basta agora indicar a posição do elemento na seqüencia, que começa do zero.

lab(0) :::> retorna Cliente
lab(1) :::> retorna Customer
lab(2) :::> retorna Cliente

Note que é necessário inserir os idiomas na Propriedade Marca (tag) na seqüência correta (Português, Inglês , Espanhol) para que os números armazenados na Propriedade Idioma se correlacionem.

Para ter acesso a Propriedade Marca, basta indicar a tag na chamada do rótulo.  Exemplo:

me!rot3.tag

Verifique como ficou simples a rotina utilizada para o preenchimentos dos rótulos:

'Percorre os 10 rótulos existentes 
For j = 0 To 9
  'Passa para a variável lab o valor armazenado na propriedade MARCA (tag)
  lab = Split(Me("rot" & j).Tag, ";")
  'Passa para o rótulo o texto no idioma selecionado
  Me("rot" & j).Caption = lab(CurrentDb.Properties!idioma)
Next

Ribbons - Armazenando os textos no atributo tag

Os controles das ribbons possuem o atributo tag, no qual é possível armazenar valores.  Observe abaixo, a escrita xml do botão fornecedores da ribbon, com o atributo tag:

<button
id = "btFornecedores"
imageMso = "DistributionListSelectMembers"
getLabel = "fncGetLabel"
onAction = "mcrRibbon.mFornecedores"
tag="Fornecedores;Suppliers;Proveedores"
/>

A escrita xml da ribbon utilizada fica armazenada na tabela UsysRibbons.

Veja também que o label (rótulo) do botão é configurado pelo atributo getLabel, que aciona a função fncGetLabel.   É nesta função fncGetLabel que a mágica de carregar os labels no idioma correto acontece.  Confira a função abaixo:

Public Sub fncGetLabel(control As IRibbonControl, ByRef label)
Dim lab
'Captura o texto do atributo tag do botão que está sendo carregado.
lab = Split(control.Tag, ";")
'Carrega o texto da label, conforme o idioma selecionado.
label = lab(CurrentDb.Properties!idioma)
End Sub

Quando o botão é carregado, o atributo getlabel aciona a função fncGetLabel.   O argumento Control.Tag na função lê o valor do atributo tag que contém os textos nos idiomas.  Com o a função split(), selecionamos o texto desejado, conforme idioma selecionado na Propriedade idioma.

Quer aprender a montar ribbons em alta velocidade?  Clique aqui e saiba tudo sobre o kit MontaRibbons!


Baixe o arquivo exemplo:

Desafio

Acrescente ao projeto o idioma Francês.  Garanto que fixará bem o que aprendeu aqui.


Bom estudo!


 

 


9 comentários

Isaias Carvalho - BA   22/03/2013 09:07:45

Avelino,

Novamente receba os meus parabéns! O tema é muito interessante, o artigo está muito bem explicado como sempre... Estarei aplicando tudo o que aqui foi mostrado em meu projeto.Fantástico artigo!
Continue assim!
Abraço!

Marcelo David   22/03/2013 09:13:41

Fenomenal! Parabéns por mais esse valioso artigo!!

Leandro Barbosa   22/03/2013 09:29:48

Esse é o tipo de programação que eu gosto, dinâmica!
Parabéns Avelino!

Roni   27/03/2013 08:45:29

Olá!

Avelino,

Parabéns por mais este excelente artigo. Só gostaria de saber se é possivel os botões "Sim" e "Não" das caixas de mensagens também terem o idioma alterado. Por exemplo, na caixa de mensagem de confirmação de exclusão de fornecedor.

Obrigado!

Márcio Melo -RJ   30/03/2013 11:52:11

Ficou show esse tutorial, você tem uma visão muito ampla, já utilizo o Monta Ribbons a 3 anos e o atributo getLabel e a função fncGetLabel já estavam lá prontinha para serem usadas, sei que teremos mais ótimas surpresas no Monta Ribbons, ficou muito bem explicado aqui como tudo acontece.

Fiquei tão entusiasmado nesses últimos anos com a sua didática que resolvi entrar num curso de SI na Estácio. Hoje passei a ver o conjunto num todo, como os seus algoritmos e lógica fluem sistematicamente...

Obrigado por apresentar suas soluções de forma tão profissional...

Sou mais Brasil!

Avelino Sampaio   31/03/2013 06:06:35

Roni,

A alteração destes botões é automática, ou seja, mudam de acordo com o idioma do Office carregado.

Sucesso!

Gilberto   01/04/2013 22:27:59

Olá, parabéns avelino, muito bom mesmo.

Eu já havia me preocupado com isso, em um sistema que possuo estou trabalhando em outros idiomas, mas fiz de outra forma, ao carregar o form chamo a sub, segue:

Private Sub CarregaRotulos()
Dim Db2 As DAO.Database
Dim Rs2 As DAO.Recordset

Set Db2 = CurrentDb()

On Error GoTo trata

Set Rs2 = Db2.OpenRecordset("Select DISTINCT * from tblIdiomas order by id;")

On Error Resume Next
Do While Not Rs2.EOF()

For Each ctl In Me.Controls

On Error GoTo trata
If ctl.Name = Rs2!nomerotulo Then

If varIdioma = "Português" Then
ctl.Caption = Rs2!rtbr
ElseIf varIdioma = "Inglês" Then
ctl.Caption = Rs2!rtus
ElseIf varIdioma = "Espanhol" Then
ctl.Caption = Rs2!rtes
End If

End If
Next

Rs2.MoveNext

Loop

Rs2.Close
Set Db2 = Nothing

sai:
Exit Sub

trata:
MsgBox Err.Number & Err.Description
Resume sai

End Sub



Sendo que varIdioma é uma variável global String que passo o valor ao carregar o sistema.

Avelino Sampaio   03/04/2013 09:45:53

Gilberto,

ótima contribuição.

Obrigado

Paulo Vinicius   03/04/2013 22:46:52

Fabuloso.

Avelino você é d+


Envie seu comentário: