A maioria dos aplicativos modernos entrega seu conteúdo para diferentes países, línguas e culturas, utilizando um conceito chamado de internacionalização, ou i18n. Em algumas plataformas essa tarefa é maçante ou, até mesmo impossível, porém, com a BlackBerry API o programar tem vida fácil.
Para exemplificar e consolidar os conceitos, vamos criar um projeto de exemplo, que consta de um simples cadastro de cliente com três campos. Inimaginável no mundo real, mas possível neste artigo.
Abra seu eclipse e pegue a xícara de café...
A hora de criar LBS para pequenos dispositivos é agora!!
Internacionalizacao
1. Internacionalizando um aplicativo BlackBerry API
A maioria dos aplicativos modernos entrega seu conteúdo para diferentes países,
línguas e culturas, utilizando um conceito chamado de internacionalização, ou i18n. Em
algumas plataformas essa tarefa é maçante ou, até mesmo impossível, porém, com a
BlackBerry API o programar tem vida fácil.
Para exemplificar e consolidar os conceitos, vamos criar um projeto de exemplo,
que consta de um simples cadastro de cliente com três campos. Inimaginável no mundo
real, mas possível neste artigo.
Abra seu eclipse e pegue a xícara de café...
Criando o projeto
Nos exemplos iremos utilizar a IDE Eclipse, porém, os códigos podem ser
transportados sem problemas para o NetBeans.
No Eclipse, navegue até File-New-Project.
No wizard apresentado, marque a opção BlackBerry -> BlackBerry Project.
Clique Next para seguir o processo.
3. Depois que a IDE criou toda estrutura de pastas necessárias para nosso projeto,
vamos codificar.
Código, código..
Clique com o botão direito na pasta src. Escolha a opção new->class.
No wizard que aparecer configure as seguintes informações:
Package: com.estudo.blackberry. Se preferir outro pacote, fique a vontade.
Name: nome da classe, no nosso caso FormularioInternacional.
Superclass: de vital importância que seja
net.rim.device.api.ui.UiApplication. Para facilitar a digitação escreva Ui e
use o atalho ctrl + espaço. Depois Finish.
Check Box´s: Marque os três checkbox´s que estão logo abaixo a opção de
interfaces. Com isso, o Eclipse já cria a classe com o construtor e um método
main.
4. Até o presente momento não há nenhuma surpresa. Veja o código gerado na
Listagem abaixo:
package com.estudo.blackberry;
import net.rim.device.api.ui.UiApplication;
public class FormularioInternacional extends UiApplication {
public FormularioInternacional() {
// TODO Auto-generated constructor stub
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
}
}
Reescreva o construtor e o método main para que fiquem da seguinte maneira:
public FormularioInternacional() {
FIScreen mainScreen = new FIScreen();
pushScreen(mainScreen);
}
/**
* @param args
*/
public static void main(String[] args) {
FormularioInternacional app = new
FormularioInternacional();
app.enterEventDispatcher();
}
O Eclipse reclamará, com razão, da não existência da classe FIScreen . Clique
na imagem da lâmpada que fica ao lado esquerdo da linha errônea.
5. Escolha a opção que automaticamente cria a classe que está faltando. A IDE lhe
apresentará um novo wizard (Figura abaixo). Modifique apenas a superclasse, herdando
de MainScreen e clique Finish.
6. O Eclipse nos entrega a seguinte classe:
package com.estudo.blackberry;
import net.rim.device.api.ui.container.MainScreen;
public class FIScreen extends MainScreen {
public FIScreen(long style) {
super(style);
// TODO Auto-generated constructor stub
}
}
Lembrando que este artigo é sobre internacionalização e não sobre os
componentes da API, portanto, vamos passar batido pelos campos de texto e caixas de
seleção.
7. Reescreva o construtor da classe para:
public FIScreen() {
super(FullScreen.DEFAULT_MENU | FullScreen.DEFAULT_CLOSE);
// TODO Auto-generated constructor stub
edtNome = new EditField("Nome: ", "");
edtEmail = new EditField("Email: ", "", 40,
EditField.FILTER_EMAIL);
String itens[] = {"Masculino", "Feminino"};
choiceSexo = new ObjectChoiceField("Sexo: ", itens);
add(edtNome);
add(edtEmail);
add(choiceSexo);
}
Nossa interface ficou assim:
Perceba no código que os rótulos dos componentes, assim como as opções de
gênero estão todas em português e não apresentam nenhuma maneira de
internacionalização. É agora que a brincadeira começa.
Exportando a aplicação
Vamos imaginar que queremos exportar nossa aplicação para a América Latina
inteira e para os Estados Unidos, logo, devemos nos preocupar também com a língua
espanhola e inglesa.
Na internacionalização da BB API, sempre devemos criar primeiramente
arquivos com a extensão .rrh, ou os arquivos de recursos. Para isso, navegue para File-
>New->Other. Na wizard que receber, masque a opção BlackBerry Resources File.
8. Na tela a seguir, informe o local onde deseja criar o arquivo de recurso. No
nosso caso colocamos junto aos códigos fontes da aplicação. Porém, o ideal é criar uma
pasta res, por exemplo, para melhor organização. Também, informe o nome do arquivo,
que deve sempre ter a extensão .rrh. Usamos Localização.rrh no nosso exemplo.
Perceba que o Eclipse se encarrega de criar mais um arquivo, o Localização.rrc.
9. O arquivo .rrc representa a língua padrão, inglês. Vamos criar mais dois arquivo:
Localização_es.rrc e Localização_pt.rrc. O uso dos sufixos es e pt refere-se a espanhol
e português, respectivamente. Estes sufixos obedecem a uma padronização de nomes.
Dê um duplo clique no arquivo .rrh.
Adicione as seguintes chaves (opção Add Key): EMAIL, ESPANHOL,
FEMININO, INGLES, MASCULINO, NOME, PORTUGUES e SEXO. Perceba que
nas abas inferiores existem as opções es e pt. Agora basta preencher os valores:
10.
11. Depois que os valores para as chaves são inseridos e o arquivo é salvo,
modifique a classe FIScreen da seguinte maneira:
public class FIScreen extends MainScreen implements
LocalizacaoResource{
private static ResourceBundle _res =
ResourceBundle.getBundle(BUNDLE_ID,
BUNDLE_NAME);
private EditField edtNome;
private EditField edtEmail;
private ObjectChoiceField choiceSexo;
public FIScreen() {
super(FullScreen.DEFAULT_MENU |
FullScreen.DEFAULT_CLOSE);
// TODO Auto-generated constructor stub
edtNome = new EditField(_res.getString(NOME)+": ", "");
edtEmail = new EditField(_res.getString(EMAIL)+": ", "",
40, EditField.FILTER_EMAIL);
String itens[] = {_res.getString(MASCULINO),
_res.getString(FEMININO)};
choiceSexo = new
ObjectChoiceField(_res.getString(SEXO)+": ", itens);
add(edtNome);
add(edtEmail);
add(choiceSexo);
}
}
A classe LocalizacaoResource, utilizada no implements, é criada pela própria
IDE. Ela sempre terá o nome do arquivo rrh mais a palavra Resource. Também é
necessário criar uma instância de ResourceBundle. Novamente, a IDE cria as constantes
BUNDLE_ID e BUNDLE_NAME baseados no nome da classe com seu pacote. Para os
mais curiosos, veja a classe gerada:
package com.estudo.blackberry;
public interface LocalizacaoResource {
// Hash of: "com.estudo.blackberry.Localizacao".
long BUNDLE_ID = 0x85202c56b3fe29dfL;
String BUNDLE_NAME = "com.estudo.blackberry.Localizacao";
int INGLES = 6;
int SEXO = 4;
int ESPANHOL = 7;
int EMAIL = 1;
int FEMININO = 3;
int MASCULINO = 2;
int NOME = 0;
int PORTUGUES = 5;
}
12. Continuando na listagem de código da classe FIScreen, note que não utilizamos
mais valores fixos para rótulos, mas sim um esquema como:
_res.getString(CHAVE)
_res.getString(NOME)
Onde usamos a instância de ResourceBundle e o seu método getString(),
passando como parâmetro o nome da chave da qual queremos obter o valor. Agora
nosso aplicativo ficou no idioma inglês, como padrão.
Finalizando a aplicação
Para deixar a aplicação pronta basta apenas colocar os itens de menu que
permitem a mudança de idioma. Adicione o código abaixo a classe FIScreen:
protected void makeMenu(Menu menu, int instance) {
menu.add(miEspanhol);
menu.add(miIngles);
menu.add(miPortugues);
}
private MenuItem miIngles=new MenuItem(_res.getString(INGLES),110,10){
public void run() {
Locale.setDefault(Locale.get(Locale.LOCALE_en, null));
refresh();
}
};
13. private MenuItem miPortugues=new MenuItem(_res.getString(PORTUGUES),
110,10) {
public void run() {
Locale.setDefault(Locale.get(Locale.LOCALE_pt, null));
refresh();
}
};
private MenuItem miEspanhol = new MenuItem(_res.getString(ESPANHOL),
110, 10) {
public void run() {
Locale.setDefault(Locale.get(Locale.LOCALE_es, null));
refresh();
}
};
private void refresh() {
edtNome.setLabel(_res.getString(NOME));
edtEmail.setLabel(_res.getString(EMAIL));
choiceSexo.setLabel(_res.getString(SEXO));
choiceSexo.setChoices(new String[]{_res.getString(MASCULINO),
_res.getString(FEMININO)});
}
Atenção ao método setDefault da classe Locale. É ele quem redefine a
linguagem de aplicação. E, para o método refresh(), que atualiza os rótulos dos
componente da interface gráfica.
Pronto, a aplicação já está internacionalizada.
Autor
Ricardo da Silva Ogliari
rogliariping@gmail.com
www.mobilidadetudo.com
www.javamovel.com