Duvida relacionada com Java. Como fazer uma aplicação multi-linguas?

Hartimer

Membro
Saudações.

Estou neste momento a desenvolver uma aplicação em Java.
Eu queria que essa aplicação suporta-se várias linguas (inicialmente Português e Inglês, mas que fosse facilmente escalável).

Agora a questão é, qual é a melhor maneira de fazer isto? definir uma classe com as Strings todas que são usados pelo programa? E alterar o "ficheiro de strings" que é carregado consoante a lingua selecionada?

Usar uma classe com uma variável contendo a lingua seleccionada, com metodos de obtenção das Strings usadas pelo sistema?

Talvez enums?

Não sei mesmo que tipo de abordagem é feito em Java para solucionar este problema, sou capaz de me desenrascar, mas não queria re-inventar a roda.

O ideal seria por exemplo:
Código:
public String getBeer(User u){
     return u.getUsername() + REQUEST_FOR_BEER;
}
Em português devolveria: "UtilizadorX pediu cerveja."
Em inglês devolveria: "UtilizadorX requested beer."

Espero que tenha conseguido expor a duvida correctamente.

Obrigado desde já pela ajuda.
Hartimer
 
Ok, nunca fiz nada disto, mas tenho assim uma ideia:

1 classe "global" (aka estática) "LangStrings".
Métodos:
getLanguageString( String stringName )
setLanguage( String langName )

Ok, e agora lá dentro podes fazer como quiseres. Com arrays para cada linguagem, sub-classes, listas, fazer parse de ficheiros, etc.

Uso disto:

public String getBeer(User u){
return u.getUsername() + LangStrings.getLanguageString( "REQUEST_FOR_BEER" );
}
 
Hartimer!

Há algum tempo tempo atrás deparei-me com o mesmo problema e, depois de ler alguns artigos sobre o assunto em diversos blogs e no próprio site da Sun, cheguei à conclusão que o melhor método para resolver esse problema gira à volta das classes Locale e ResourceBundle.

A ideia base é ter um ficheiro de propriedades (.properties) para cada língua, com todas as strings que a tua aplicação vai utilizar. O nome que é dado a este ficheiro é muito importante, devido ao facto de os métodos que irei descrever em seguida se basearem nesse mesmo nome para carregar o ficheiro de propriedades correcto.

Supõe que tens um ficheiro de propriedades chamado Properties_pt_PT.properties com o seguinte conteúdo:

Código:
REQUEST_FOR_BEER = pediu cerveja.

Bem como o ficheiro Properties_en_GB.properties:

Código:
REQUEST_FOR_BEER = requested beer.

Neste caso, terias que criar um Locale (serve essencialmente para representar uma região) com a informação sobre o país e língua (pt_PT ou en_GB) para, em seguida, o associar a um ResourceBundle, de modo a conseguires ler o ficheiro de propriedades correcto. Algo do género:

Código:
// nota a ligação com o ficheiro de propriedades
Locale pt = new Locale("pt", "PT"); 
Locale gb = new Locale("en", "GB");
 
ResourceBundle rb = ResourceBundle.getBundle("Properties", pt);
System.out.println("Paulo " + rb.getString("REQUEST_FOR_BEER"));
rb = ResourceBundle.getBundle("Properties", gb);
System.out.println("Paulo " + rb.getString("REQUEST_FOR_BEER"));

O excerto de código acima, integrado com a aplicação, deverá imprimir o seguinte:

Paulo pediu cerveja.
Paulo requested beer.

A vantagem deste método é ser facilmente escalável e não obrigar o tradutor a perceber código Java. Por exemplo, no caso de quereres que a tua aplicação suporte árabe, apenas terás que dar um template de um ficheiro .properties a um tradutor, ao invés de o obrigares a definir constantes numa classe Java.

Abraço.
 
Última edição:
grande ALI :)

uhm, pelo que tive a ler realmente parece ser a melhor opção.

estive a tentar implementar mas tou com um problemazito... onde colocar o ficheiro de propriedades? ja li o javadoc das várias classes e nao referem propriamente o sitio onde vao procurar... :/

vou continuar a tentar
 
grande ALI :)

uhm, pelo que tive a ler realmente parece ser a melhor opção.

estive a tentar implementar mas tou com um problemazito... onde colocar o ficheiro de propriedades? ja li o javadoc das várias classes e nao referem propriamente o sitio onde vao procurar... :/

vou continuar a tentar

Pela minha experiencia normalmente deve colocar no local onde tens as classes do fixeiros!
 
Back
Topo