[RESOLVIDO] Internacionalização de mensagens com JSF

Boa noite pessoal do GUJ, só fera por aqui. Minha dúvida de hoje é a seguinte:

  • Estou parametrizando as mensagens do meu sisteminha, utilizando o arquivo .properties;
  • Com isso, irei ter dois arquivos, 1 para ingles e 1 para portugues;

Eu gostaria de colocar as bandeiras(flags) no topo, e ao clicar na flag dos EUA seja utilizado o inglês, e ao clicar na flag do Brasil, utiliza o arquivo .properties em pt_BR.
Como eu posso fazer isso.

obs:existe a tag

<f:view locale="..."> <!-- todo código html aqui --> </f:view>

ou seja, como setar o arquivo nessa tag?

obrigado pela atenção.
abs

ManagedBean

@ManagedBean
@SessionScoped
public class LocaleMB implements Serializable{
	private static final long serialVersionUID = 4420995111496888033L;
	private Locale currentLocale = new Locale("pt", "BR");  
	
	public void englishLocale() {  
		UIViewRoot viewRoot = FacesContext.getCurrentInstance().getViewRoot();  
		currentLocale = Locale.US;  
		viewRoot.setLocale(currentLocale);  
	}  
	
	public void portugueseLocale() {  
		UIViewRoot viewRoot = FacesContext.getCurrentInstance().getViewRoot();  
		currentLocale = new Locale("pt", "BR");  
		viewRoot.setLocale(currentLocale);  
	}  
	
	public Locale getCurrentLocale() {  
		return currentLocale;  
	}  
}

Nas páginas, ou no template…

<f:view locale="#{localeMB.currentLocale}" contentType="text/html; charset=UTF-8" encoding="UTF-8">
<h:form>
	<p:commandButton value="pt_BR" action="#{localeMB.portugueseLocale}" ajax="false" style="font-size: 20px;" />
	<p:commandButton value="en_US" action="#{localeMB.englishLocale}" ajax="false" style="font-size: 20px;" />
</h:form>

Acho que com isso já podes começar…

E se as mensagens estiverem dentro dos ManagedBeans eu faço assim:

protected String getMessage(String key) {
	UIViewRoot viewRoot = FacesContext.getCurrentInstance().getViewRoot();  
   	Locale locale = viewRoot.getLocale();
   	text = ResourceBundle.getBundle("br.com.asandrob.resources.messages.message", locale);
    return text.getString(key);
}

Utilizo o método getMessage passando a chave para recuperar a String desejada.

sensaciona-le.

mas não entendi essa linha aqui:

text = ResourceBundle.getBundle("br.com.asandrob.resources.messages.message", locale); 

o que seria esse primeiro parametro?

obrigado! vou ver o que conseguido fazer :smiley:

Isso é o pacote onde fica o teu arquivo messages.properties, o ultimo “message” já é o nome do arquivo sem a extensao

entendi.

puts, mas ainda não estou entendendo. Como assim, mensagem dentro do MB? em que caso utilizaria mensagem dentro do MB? isso que não estou entendeno.

=/

muitisimo obrigado pela ajuda, o básico que queria, já está funcionando! sensasional.

Em caso de vc precisar emitir uma mensagem dinâmica ou que seja baseado em alguma regra de negócios, enfim, que não seja estático igual um label.

Por exemplo: um botão “Consultar” que traz registros. Caso não tenha nenhum registro, quero que emita uma mensagem “Consulta não retornou valores”, não vou fazer esse if dentro da pagina jsf certo? seria dentro do ManagedBean, nesse caso daria para emitir a mensagem em formato String, mas o messages.properties serve para internacionalizacao, então ao inves de ficar escrevendo strings dentro de codigo java, internacionaliza tudo isso

certo, entao dentro do MB qualquer eu chamaria a função getMessage do LocaleMB?

e como eu coloco a menssagem entro desse outro managed bean? porque no facelet(xhtml) eu uso expresion language #{msgs.tituloPagina} por exemplo. e como faria dentro de uma managed bean, para obter uma mensagem do arquivo .properties?

abs

[code]FacesContext context = FacesContext.getCurrentInstance();
ResourceBundle bundle = ResourceBundle.getBundle(“br.com.resources.messages”, context.getViewRoot().getLocale());
String message = bundle.getString(codigo_do_messages); //captura a mensagem do messages.properties (com o faces-config.xml configurado)

FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, message, message)); //emitindo a mensagem na tela [/code]

[quote=igor_ks][code]FacesContext context = FacesContext.getCurrentInstance();
ResourceBundle bundle = ResourceBundle.getBundle(“br.com.resources.messages”, context.getViewRoot().getLocale());
String message = bundle.getString(codigo_do_messages); //captura a mensagem do messages.properties (com o faces-config.xml configurado)

FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, message, message)); //emitindo a mensagem na tela [/code][/quote]

Valeu cara, obrigado!

abs