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?
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
Cesar_Pizolato
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:
@ManagedBean(name="i18nBean")@SessionScopedpublicclassI18nBeanimplementsSerializable{privateMap<String,String>termos;publicMap<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=newHashMap<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");}returntermos;}
É 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
Cesar_Pizolato
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
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)
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’.
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’.
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.
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
Cesar_Pizolato
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.
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.