Internacionalização JSF 2.0

11 respostas
C

Boa tarde a todos, li vários tópicos sobre internacionalização aqui no GUJ, porém, em nenhum deles encontrei o que gostaria, segue minha dúvida:

Vi que todos os tópicos (pelo menos os que eu vi) fazem a internacionalização nos arquivos .properties, eu conseguiria fazer a mesma lendo essas informações do banco de dados ao invéz de gravar esses arquivos? Porque, veja bem, se eu utilizar esses arquivos e escrever uma palavra errada e precisar corrigir depois, precisaria fazer deploy novamente, restartar o servidor de aplicação e tudo mais, e eu não posso me limitar a isso. Alguma idéia?

Obrigado,

Cesar Pizolato

11 Respostas

E

Interessante implementar como falou, mas não pelo motivo de ter que fazer o deploy depois. Digo isso pois vai ser muito difícil você não encontrar um erro no seu sistema, ou fazer alguma atualização solicitada pelo cliente, para não dizer impossível.

C

Também concordo que vai ser difícil encontrar erros, mais preciso que essas informações venham do banco de dados e não de um arquivo que eu fico limitado a redeployar a aplicação para surtir efeito na atualização, alguma idéia de qual caminho a seguir?

jamirdeajr
Uma possível solução é ter um bean de escopo Session que retorne um Map... exemplo: Na página:
<h:outputText value="#{i18nBean.termos['Usuario']}" />
No bean:
@ManagedBean(name = "i18nBean")
@SessionScoped
public class I18nBean implements Serializable {
    private Map<String,String> termos;

    public Map<String, String> getTermos() {
	//Supondo que você carrega por sessão (ou seja, ao usuário logar carrega, não necessário subir de novo a aplicação)	
        if(termos == null) {
            termos = new HashMap<String,String>();
		
            // Carregue o Map usando o meio que achar mais conveniente de acordo com o idioma escolhido na sessão
            //... 
            termos.put("Usuario", "User");
            termos.put("Senha", "Password");
        }
        return termos;
}
É possível também ter vários Maps no escopo Application, um para cada idioma e no escopo Session do usuário retornar o Map correspondente. Somente no caso de atualizar a base de dados de termos i18n é necessário recarregar cada um dos Maps. Assim permite economia de memória pois haverá somente um Map para cada idioma na aplicação inteira.
C

Obrigado pelas respostas.
Outra dúvida, eu conseguiria fazer isso editando os .properties com a aplicação startada? (Acho que cheguei a ler algo sobre isso uma vez, mais não encontro mais o tópico)
Pq ai, eu colocaria um botão na área de admin que serviria para atualizar as informações, se isso funcionar, acho que seria o ideal, e não tem problema ter que clicar nesse botão.

jamirdeajr

Então, opção que sugeri é uma alternativa para o uso do .properties.
Também já tentei fazer desta maneira, alterando em tempo de execução o arquivo .properties mas não tive sucesso, não conseguia forçar a recarga do arquivo (creio que seria quase o que chamam de ‘hot deploy’).

C

jamirdeajr:
Então, opção que sugeri é uma alternativa para o uso do .properties.
Também já tentei fazer desta maneira, alterando em tempo de execução o arquivo .properties mas não tive sucesso, não conseguia forçar a recarga do arquivo (creio que seria quase o que chamam de ‘hot deploy’).


Então não teria uma solução? Tem um amigo meu que trabalha com .NET, ele faz uma função que retorna uma string, e essa string é o texto daquele campo por exemplo, teria como fazer isso dentro da JSP?? (O que em minha opinião eu acho muito porco, mais talvez se não tiver outra solução e for necessário… dá pra pensar em fazer assim)

jamirdeajr

Do jeito que sugeri funciona como se fosse uma função que retorna o valor que está no Map, que pode ser carregado dinamicamente sem ter que subir a aplicação novamente.
Isso na página JSP faz com que o conteúdo fique com o que estiver no Map com a chave = ‘Usuario’, no exemplo em inglês retornaria ‘User’.

<h:outputText value="#{i18nBean.termos['Usuario']}" />

Só se entendi errado o que você quer fazer…

C

jamirdeajr:
Do jeito que sugeri funciona como se fosse uma função que retorna o valor que está no Map, que pode ser carregado dinamicamente sem ter que subir a aplicação novamente.
Isso na página JSP faz com que o conteúdo fique com o que estiver no Map com a chave = ‘Usuario’, no exemplo em inglês retornaria ‘User’.

<h:outputText value="#{i18nBean.termos['Usuario']}" />

Só se entendi errado o que você quer fazer…


Bom, muito obrigado pela ajuda. Vou tentar implementar dessa maneira ou talvez até mesmo usar os .properties. Obrigado mesmo !

Z111

Cesar Pizolato:
jamirdeajr:
Então, opção que sugeri é uma alternativa para o uso do .properties.
Também já tentei fazer desta maneira, alterando em tempo de execução o arquivo .properties mas não tive sucesso, não conseguia forçar a recarga do arquivo (creio que seria quase o que chamam de ‘hot deploy’).


Então não teria uma solução? Tem um amigo meu que trabalha com .NET, ele faz uma função que retorna uma string, e essa string é o texto daquele campo por exemplo, teria como fazer isso dentro da JSP?? (O que em minha opinião eu acho muito porco, mais talvez se não tiver outra solução e for necessário… dá pra pensar em fazer assim)

pode passar um parâmetro para um método e fazer a busca em um banco de dados.

http://hazems.blogetery.com/2010/04/10/invoking-methods-with-parameters-in-jsf-2-0-el/

jamirdeajr

Ok Z,

A restrição é que só é compatível com container web que funcione com Servlet 3.0 / EL 2.2.
Tomcat 6 por exemplo não funciona.
Compatíveis são Tomcat 7, Glassfish 3, JBoss AS 6 e é necessário também no web.xml declarar como Servlet 3.0 e, é claro incluir o el-impl-2.2.jar no projeto.

Se isso não for um problema, é com certeza a melhor maneira!
Obrigado.

C

Z:
Cesar Pizolato:
jamirdeajr:
Então, opção que sugeri é uma alternativa para o uso do .properties.
Também já tentei fazer desta maneira, alterando em tempo de execução o arquivo .properties mas não tive sucesso, não conseguia forçar a recarga do arquivo (creio que seria quase o que chamam de ‘hot deploy’).


Então não teria uma solução? Tem um amigo meu que trabalha com .NET, ele faz uma função que retorna uma string, e essa string é o texto daquele campo por exemplo, teria como fazer isso dentro da JSP?? (O que em minha opinião eu acho muito porco, mais talvez se não tiver outra solução e for necessário… dá pra pensar em fazer assim)

pode passar um parâmetro para um método e fazer a busca em um banco de dados.

http://hazems.blogetery.com/2010/04/10/invoking-methods-with-parameters-in-jsf-2-0-el/


Muito obrigado Z, era isso mesmo que eu precisava. Vou analisar as possibilidades e ver se compensa realmente em termos de performance. Mais foi muito bom para o apreendizado, vou testar anoite em casa e qualquer coisa volto a postar.

Criado 15 de abril de 2011
Ultima resposta 19 de abr. de 2011
Respostas 11
Participantes 4