Я пытаюсь реализовать интернационализацию в JSF 2. Я пробовал много решений, но я не могу изменить его. Вот мой код для faces-config.xml
файла:Как изменить локаль представления на p: commandLinks?
<application>
<locale-config>
<default-locale>es</default-locale>
<supported-locale>en_GB</supported-locale>
<supported-locale>fr</supported-locale>
</locale-config>
<resource-bundle>
<base-name>malagaAcoge.configuracion.Messages</base-name>
<var>msg</var>
</resource-bundle>
</application>
Я использую 3 свойства, которые находятся в моем исходном пакете.
Это мое мнение:
<f:view locale="#{idiomaBean.locale}">
<div id="contenedor">
<div id="cabecera"
style="background: url('../images/logo/fondoCabecera.png') no-repeat">
</div>
<div id="cuerpo">
<div id="center">
<h:form prependId="false" id="form_login">
<h:selectOneMenu value="#{idiomaBean.locale}"
onchange="submit()"
valueChangeListener="#{idiomaBean.changeLanguage}">
<f:selectItems value="#{idiomaBean.countriesInMap}" />
</h:selectOneMenu>
<h:panelGrid columns="3">
<p:commandLink title="SP" action="#{idiomaBean.changeLanguage}">
<p:graphicImage value="../images/paises/sp.png"></p:graphicImage>
</p:commandLink>
<p:commandLink title="EN" action="#{idiomaBean.changeLanguage}">
<p:graphicImage value="../images/paises/en.png">
</p:graphicImage>
</p:commandLink>
<p:commandLink title="FR" action="#{idiomaBean.changeLanguage}">
<p:graphicImage value="../images/paises/fr.png">
</p:graphicImage>
<f:setPropertyActionListener target="#{idiomaBean.locale}"
value="fr"></f:setPropertyActionListener>
</p:commandLink>
</h:panelGrid>
Это IdiomaBean
я использую, чтобы выполнить изменение:
private static final long serialVersionUID = 1L;
private static String locale = FacesContext.getCurrentInstance()
.getViewRoot().getLocale().getLanguage();
private static Map<String, Object> countries;
static {
countries = new LinkedHashMap<String, Object>();
countries.put("Español", new Locale("es")); // label, value
countries.put("English", Locale.ENGLISH);
countries.put("Français", Locale.FRENCH);
}
public Map<String, Object> getCountriesInMap() {
return countries;
}
public String getLocale() {
return locale;
}
@SuppressWarnings("static-access")
public void setLocale(String locale) {
this.locale = locale;
FacesContext.getCurrentInstance().getViewRoot().setLocale(new Locale(locale));
}
public void changeLanguage(ValueChangeEvent e) {
String newLocaleValue = e.getNewValue().toString();
// loop country map to compare the locale code
for (Map.Entry<String, Object> entry : countries.entrySet()) {
if (entry.getValue().toString().equals(newLocaleValue)) {
FacesContext.getCurrentInstance().getViewRoot()
.setLocale((Locale) entry.getValue());
}
}
Я использую PrimeFaces 3.0 на сервере Tomcat.
Спасибо за ваш быстрый annswer. Я сделал именно то, что вы мне сказали, но все равно не работал. Когда я отлаживаю, я вижу, что валентность языка изменилась, но никаких изменений языка не происходит. Я пробовал много решений, но ничего не работает. – amal
Что именно не работает? Выпадающий список или ссылки, или и то, и другое? Аннотации '@ ManagedBean' и' @ SessionScoped' являются как из пакета 'javax.faces.bean', так? – BalusC
Ничего не работает. Ну, я не использую аннотации для поддержки bean-компонентов, я объявляю их в файле-config-файла faces. Я также пробовал аннотации. Все еще не работает. Бэк-код правильно вызывается, а переменная задана, но не изменяется язык. Я действительно смущен, потому что я пробовал много учебников. Файлы сообщений должны быть в определенном пакете или что-то еще? – amal