Home Internacionalização de Aplicações no Java
Post
Cancelar

Internacionalização de Aplicações no Java

Baseado nos cursos da Softblue

Internacionalização

  • É o processo de criar uma aplicação de forma que ela consiga se adaptar a várias línguas e regiões de forma automática

  • O termo abreviado é i18n

  • O que pode ser internacionalizado?

– Textos

  • “File” vs “Arquivo”

– Números

  • “1,540.32” vs “1.540,32”

– Moedas

  • ”$ 230.15” vs “R$ 230,15”

– Datas

  • “12/22/2030” vs “22/12/2030”

Locale

Locale

  • Um objeto Locale identifica uma combinação de língua e região (país)

  • Construtores de Locale

1
2
Locale loc = new Locale("pt");
Locale loc = new Locale("pt", "BR");
  • Método forLanguageTag() (Java 7+)
1
Locale loc = Locale.forLanguageTag("pt-BR");
  • Constantes pré-definidas
1
2
Locale loc = Locale.UK;
Locale loc = Locale.JAPAN;

Locale padrão

  • Toda aplicação Java tem um Locale padrão

  • Ele é determinado pela JVM a partir de configurações definidas no sistema operacional

  • É possível obter o Locale padrão via programação

1
Locale loc = Locale.getDefault();

A classe ResourceBundle

  • Armazenam informações que podem variar de acordo com o Locale estabelecido

  • As informações são baseadas em pares de chave e valor

  • Dados podem ser armazenados de duas formas

– Arquivo de propriedades

  • Chave do tipo String

  • Valor do tipo String

– Classe

  • Chave do tipo String

  • Valor do tipo Object

Arquivos de propriedades

Application.properties:

1
2
3
4
5
# Itens do menu (inglês)
i1 = New
i2 = Open
i3 = Save
i4 = Exit

Application_pt_BR.properties:

1
2
3
4
5
# Itens do menu (português)
i1 = Novo
i2 = Abrir
i3 = Salvar
i4 = Sair

Classe

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class Application extends ListResourceBundle {
  private static Object[][] contents = {
    { "i1", "New" },
    { "i2", "Open" },
    { "i3", "Save" },
    { "i4", "Exit" },
  };
  protected Object[][] getContents() {
    return contents;
  }
}

public class Application_pt_BR extends ListResourceBundle {
  private static Object[][] contents = {
    { "i1", "Novo" },
    { "i2", "Abrir" },
    { "i3", "Salvar" },
    { "i4", "Sair" },
  };
  protected Object[][] getContents() {
    return contents;
  }
}

Lendo os dados

  • Criar um Locale
1
Locale l = new Locale("pt", "BR");
  • Obter uma instância de ResourceBundle
1
2
ResourceBundle bundle = ResourceBundle.getBundle("Application", l);
ResourceBundle bundle = ResourceBundle.getBundle("Application");
  • Ler os dados a partir das chaves
1
2
String s = bundle.getString("i1");
String s = (String) bundle.getObject("i1");

Ordem de pesquisa

  • Um ResourceBundle precisa definir de onde ele carregará as informações

  • Exemplo

– Bundle name = Application

– Locale = en-US

– Default Locale = pt-BR

Sempre defina um arquivo/classe sem sufixo

Arquivos de propriedades:

1
2
3
4
5
Application_en_US.properties
Application_en.properties
Application_pt_BR.properties
Application_pt.properties
Application.properties

Classes

1
2
3
4
5
Application_en_US
Application_en
Application_pt_BR
Application_pt
Application

Mensagens compostas

  • Mensagens às vezes precisam ser compostas por partes fixas e variáveis

Português: Fui ao shopping e comprei 2 camisas. Custou R$ 200,00.

Inglês: I went to the mall and bought 2 shirts. It cost $ 200.00.

Application_pt_BR.properties:

1
2
msg = Fui ao shopping e comprei {0,number} {1}. Custou {2,number,currency}.
i = camisas

Application_en_US.properties:

1
2
msg = I went to the mall and bought {0,number} {1}. It cost {2,number,currency}.
i = shirts
  • Criar o Locale e o ResourceBundle
1
2
Locale loc = new Locale("pt", "BR");
ResourceBundle bundle = ResourceBundle.getBundle("Application", loc);
  • Criar o array de parâmetros
1
2
3
4
5
Object[] msgArgs = {
  new Integer(2),
  bundle.getString("i"),
  200.0
};
  • Gerar a mensagem final
1
2
3
4
String msgTemplate = bundle.getString("msg");
MessageFormat formatter = new MessageFormat(msgTemplate);
formatter.setLocale(loc);
String msg = formatter.format(msgArgs);

Formatação de números

  • Diferentes localizações representam números e moedas de formas diferentes
1
2
3
4
5
NumberFormat nf = NumberFormat.getNumberInstance(new Locale("pt", "BR"));
nf.format(1540.36);//1.540,36

NumberFormat nf = NumberFormat.getNumberInstance(new Locale("en", "US"));
nf.format(1540.36);//1,540.36

Formatação de moedas

  • As moedas também variam de acordo com a localização
1
2
3
4
5
NumberFormat nf = NumberFormat.getCurrencyInstance(new Locale("pt", "BR"));
nf.format(1540.36);//R$ 1.540,36

NumberFormat nf = NumberFormat.getCurrencyInstance(new Locale("en", "US"));
nf.format(1540.36);//$1,540.36

Formatação de datas

  • Datas são representadas de formas diferentes em diferentes localizações
1
2
3
4
DateFormat df = DateFormat.getDateInstance(DateFormat.LONG, new Locale("pt", "BR"));
df.format(new Date());//22 de Setembro de 2030
DateFormat df = DateFormat.getDateInstance(DateFormat.LONG, new Locale("en", "US"));
df.format(new Date());//September 22, 2030

Formatação de horas

  • Horas também são representadas de formas diferentes em diferentes localizações
1
2
3
4
5
DateFormat df = DateFormat.getTimeInstance(DateFormat.MEDIUM,new Locale("pt", "BR"));
df.format(new Date());//15:34:45

DateFormat df = DateFormat.getTimeInstance(DateFormat.Medium, new Locale("en", "US"));
df.format(new Date());//3:34:45 PM
Esta postagem está licenciada sob CC BY 4.0 pelo autor.