Internacionalização JSF dentro de Managed Bean

Boa noite galera.

Implementei a internacionalização no meu projeto, até aí tudo tranquilo, consegui alterar as mensagens puxando do meu arquivo .properties. Mas estou precisando traduzir as mensagens que vem do meu Managed Bean, estas mensagens são exibidas dentro de um componente “selectOneMenu”, e para alimentar este componente eu utilizado um “.put” na minha variável que é puxada pelo “selectItems”.

Segue abaixo os códigos.

Meu Managed Bean EstadoControle e o que quero traduzir está na variável listaOrdem.

[code]
@ManagedBean(name = “estadoControle”)
@SessionScoped
public class EstadoControle implements Serializable {

private List<Estado> lista;
private Estado objeto;
private String ordemAtual = "nome";
private Map<String, String> listaOrdem = new HashMap<String, String>();
private String filtro = "";

public EstadoControle() {
	listaOrdem.put("Descrição", "nome");
	listaOrdem.put("Código", "id");
}
//Getters and Setters e funções da classe

}[/code]

Parte do meu xhtml.

<p:outputLabel for="ordemAtual" value="#{msgs.ordem}" />
			<p:selectOneMenu id="ordemAtual" value="#{estadoControle.ordemAtual}">
				<f:selectItems value="#{estadoControle.listaOrdem}" />
				<p:ajax update="grid" listener="#{estadoControle.atualizar}" />
			</p:selectOneMenu>

Meu faces-config.xml

<faces-config
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_1.xsd"
    version="2.1">
	<application>
		<resource-bundle>
			<base-name>locales.messages</base-name>
			<var>msgs</var>
		</resource-bundle>
	</application>
</faces-config>

Meu messages_en_US.properties

#Seleção de idiomas
portugues=Portuguese
ingles=English

#Formulários de cadastros
incluir=Include
filtrar=Filtrate
filtro=Filter
ordem=Order
descricao=Description
codigo=Code
sem_resultado=No results found
mostrando=Showing
de=of
listagem_estados=List of States
nome=Name
uf=State
acoes=Actions
alterar=Edit
excluir=Delete

E aqui o formulário sendo executado em inglês.

Espero que tenho sido claro na descrição do meu problema, qualquer dúvida é só pedir. :smiley:

Agradeço desde já!

Edit: Achei algo que pode ser uma provável solução, porém não consegui implementar no meu caso: http://www.guj.com.br/java/284981-resolvido-internacionalizacao-de-mensagens-com-jsf#1505735

tenta algo assim…

public static String getMsg(String messageId) {
		FacesContext facesContext = FacesContext.getCurrentInstance();
		String msg = "";
		Locale locale = facesContext.getViewRoot().getLocale();
		ResourceBundle bundle = ResourceBundle.getBundle("resources.message", locale);
		try {
			msg = bundle.getString(messageId);
		} catch (Exception e) {
		}
		return msg;
	}

uma forma é vc tb salvar no seu managedBean a key do seu properties e na tela vc usa ela dentro a dua variavel de internacionalização.

Algo como:


public EstadoControle() {  
        listaOrdem.put("descricao", "label.descricao");  
        listaOrdem.put("id", "label.id");  
    }  

Na verdade o que vc poe key do properties é no conteudo da lista. Dai na pagina vc tem a expression language recuperando o valor que já será a key do properties.

[quote=LPJava]uma forma é vc tb salvar no seu managedBean a key do seu properties e na tela vc usa ela dentro a dua variavel de internacionalização.

Algo como:


public EstadoControle() {  
        listaOrdem.put("descricao", "label.descricao");  
        listaOrdem.put("id", "label.id");  
    }  

Na verdade o que vc poe key do properties é no conteudo da lista. Dai na pagina vc tem a expression language recuperando o valor que já será a key do properties.[/quote]

Ficaria um pouco inviável, imagina todas as labels no MB, que poluição que o mesmo ficaria.

[quote=kleberdamasco]tenta algo assim…

public static String getMsg(String messageId) {
		FacesContext facesContext = FacesContext.getCurrentInstance();
		String msg = "";
		Locale locale = facesContext.getViewRoot().getLocale();
		ResourceBundle bundle = ResourceBundle.getBundle("resources.message", locale);
		try {
			msg = bundle.getString(messageId);
		} catch (Exception e) {
		}
		return msg;
	}

[/quote]

Olá kleberdamasco, primeiramente obrigado pela resposta :smiley:

Mas agora surgiu outra dúvida, como eu faço para usar isto no meu MB? Eu chamo o método e passo por parâmetro no caso a “descricao” que está no meu message?

Abraço

crie a classe,

[code]public abstract class JSFUtil {
public static String getMsg(String messageId) {
FacesContext facesContext = FacesContext.getCurrentInstance();
String msg = “”;
Locale locale = facesContext.getViewRoot().getLocale();
ResourceBundle bundle = ResourceBundle.getBundle(“resources.message”, locale);
try {
msg = bundle.getString(messageId);
} catch (Exception e) {
}
return msg;
}
}

[/code]

e no seu MB chame:

String msgInternacionalizacao = JSFUtil.getMsg("descricao");

[quote=kleberdamasco][quote=LPJava]uma forma é vc tb salvar no seu managedBean a key do seu properties e na tela vc usa ela dentro a dua variavel de internacionalização.

Algo como:


public EstadoControle() {  
        listaOrdem.put("descricao", "label.descricao");  
        listaOrdem.put("id", "label.id");  
    }  

Na verdade o que vc poe key do properties é no conteudo da lista. Dai na pagina vc tem a expression language recuperando o valor que já será a key do properties.[/quote]

Ficaria um pouco inviável, imagina todas as labels no MB, que poluição que o mesmo ficaria.[/quote]

Sim, não é a melhor solução. É apenas uma alternativa. Mas, pode fazer tb pelo JSF, lá no contexto, da mesma forma que o componente já faz por default como vc falou.

[quote=kleberdamasco]crie a classe,

[code]public abstract class JSFUtil {
public static String getMsg(String messageId) {
FacesContext facesContext = FacesContext.getCurrentInstance();
String msg = “”;
Locale locale = facesContext.getViewRoot().getLocale();
ResourceBundle bundle = ResourceBundle.getBundle(“resources.message”, locale);
try {
msg = bundle.getString(messageId);
} catch (Exception e) {
}
return msg;
}
}

[/code]

e no seu MB chame:

String msgInternacionalizacao = JSFUtil.getMsg("descricao"); [/quote]

Consegui implementar aqui e está funcionando quase 100% rsrsrs

O único problema é que se eu abrir o formulário em português e depois alterar para inglês, o “Descrição” continua sendo exibido em português. Se eu selecionar o idioma inglês antes de abrir o formulário, ele exibe em inglês, mas se mudar para português a “Descrição” fica em inglês… Fui claro? rsrsrs

Onde será que está o problema? Porque parece que ele fica gravado em um local e não altera, só altera depois de eu reiniciar o servidor.

Abraço

eu ia passar isso para vc rs. Fui procurar na documentação:

FacesContext context = FacesContext.getCurrentInstance(); ResourceBundle bundle = context.getApplication().getResourceBundle(context, "language"); String msg= bundle.getString("msg.error"); FacesMessage facesMessage = new FacesMessage(msg); context.addMessage(null, facesMessage);

Pq vc não seta o locale quando alterar ?

FacesContext context = FacesContext.getCurrentInstance();
context.getViewRoot().setLocale(new Locale("pt","Br"); 

Outro detalhe você tá atualizando o form após alteração do idioma? dando um update para o form ?