Configuração
O tapestry possui suporte a internacionalização, isso permite separar o texto que aparece para o usuário, do resto da aplicação. Ele usa a "preferência de idioma" definida no browser do usuário. A internacionalização se aplica aos catálogos de mensagens, templates, e assets (imagens, css, recursos).
src/main/java/org.exemplo.t5teste.services. AppModule.java
…
configuration.add(SymbolConstants.SUPPORTED_LOCALES, "pt_BR,en");
…
O Tapestry usa UTF-8 Encoding como padrão.
Templates
O template Internacional.tml pode ter sua versão em inglês gravada no arquivo Internacional_en.tml, o tapestry vai mostrar a página em inglês quando o browser do usuário estiver configurado com a preferência desse idioma.
Criar uma página de teste com dois templates (default e inglês).
src/main/java/org.exemplo.t5teste.pages. Internacional.java
package org.exemplo.t5teste.pages;
public class Internacional
{
// A classe java é necessária para paginas e componentes, mesmo quando não tiver código.
}
src/main/webapp/ Internacional.tml
<html t:type="layout" title="Internacional"
t:sidebarTitle="Current Time" xmlns:t="http://tapestry.apache.org/schema/tapestry_5_1_0.xsd"
xmlns:p="tapestry:parameter"><h1>Alo Mundo</h1>
</html>
src/main/webapp/ Internacional_en.tml
<html t:type="layout" title="Internacional"
t:sidebarTitle="Current Time" xmlns:t="http://tapestry.apache.org/schema/tapestry_5_1_0.xsd"
xmlns:p="tapestry:parameter"><h1>Hello World</h1>
</html>
Reinicie e teste a aplicação, acessando a página antes e depois de mudar a preferência de idioma do navegador.
http://localhost:8080/t5teste/internacional
Catálogo de Mensagens
É um ou mais arquivos em texto puro no formato key=value (java.util.ResourceBundle), e com extensão “.properties”. Vamos criar as mensagens no(s) catálogo(s) e usar apenas uma expansão do tipo ${ message:key} diretamente dentro do template, onde a chave titulo tem o seu valor definido no arquivo de catálogo do respectivo idioma.
O arquivo src/main/webapp/WEB-INF/app.properties pode ser usado como um catálogo de mensagens global da aplicação. O catálogo de mensagens do componente estende e sobrescreve o catálogo da sua possível superclasse, e também sobrescreve o da aplicação.
Acessando uma mensagem (declarada no catálogo) a partir da classe Java usando o objeto Messages.
…
@Inject
private Messages _messages;
…
String titulo = _messages.get("titulo");
…
Também podemos "expandir" a mensagem diretamente no template sem precisar de nenhum código na classe Java.
…
${message:titulo}
…
Mais informações
Consulte o tópico Localization no site do tapestry. Veja também a página de referência dos componentes.