我有一个复杂的jsf页面,其中有一些在PrimeFaces中开发的小部件。到目前为止,应用程序完全被ajaxified,这意味着没有提交,但所有事件和更新都是通过Ajax行为处理的(这不是必须的,而是一个很好的功能)。我还做了SelectOneMenu
来切换语言:
<h:form>
<p:panelGrid columns="2" >
<h:outputText value="#{msgs.SelectLanguage}" />
<p:selectOneMenu value="#{languageSwitcher.selectedLanguage}" >
<f:selectItems value="#{languageSwitcher.languages}" ></f:selectItems>
</p:selectOneMenu>
</p:panelGrid>
</h:form>
切换台效果很好。 我的问题是如何在选择语言时重新加载翻译的消息。
我尝试过这些选项:
选项1
在selectOneMenu中使用ajax更新:
<p:ajax update="myFormsTobeUpdated" ></p:ajax>
这很好用,并且是首选解决方案,因为它是Ajax,但
EDITED
此解决方案不会更新PrimeFaces TabView中的Tab标题,这就是阻塞问题,因为Tab标题需要翻译。
选项2
在Javascript中完全重新加载页面。我试过这个但是没有用(不能说明原因):
<p:selectOneMenu value="#{languageSwitcher.selectedLanguage}" onchange="window.location.reload()" >
选项3
用Java完全重新加载页面,如下所示:https://stackoverflow.com/a/1821708/870122(说实话我还没有尝试过,但很快就会做到!)
欢迎任何建议。
答案 0 :(得分:3)
如果您至少使用PrimeFaces 3.2,则可以使用
<p:ajax update="@all" />
更新整个视图。在此版本之前,不支持@all
。
答案 1 :(得分:0)
由于选项1 ,无法在PrimeFaces TabView中更新Tab标题,我已切换到选项2 ,完全重新加载页面的JavaScript。
使其有效的代码是:
<h:form id="selectLanguage">
<p:panelGrid columns="2">
<h:outputText value="#{msgs.SelectLanguage}" />
<p:selectOneMenu value="#{languageSwitcher.selectedLanguage}" onchange="document.getElementById('selectLanguage').submit();" >
<f:selectItems value="#{languageSwitcher.languages}" ></f:selectItems>
</p:selectOneMenu>
</p:panelGrid>
</h:form>
答案 2 :(得分:0)
在您的表格中:
<h:selectOneRadio value="#{localeBean.language}"
onchange="submit()">
<f:selectItems value="#{collection.listLangs()}" var="s"
itemLabel="${s.description}" itemValue="${s.code}" />
</h:selectOneRadio>
但你没有收藏品(记住,你的表格):
<h:selectOneMenu value="#{localeBean.language}"
onchange="submit()">
<f:selectItem itemValue="en" itemLabel="English" />
<f:selectItem itemValue="es" itemLabel="Español" />
</h:selectOneMenu>
在Primefaces中,使用:p:selectOneMenu
在你的Bean中:
import java.lang.invoke.MethodHandles;
import java.util.Locale;
import java.util.ResourceBundle;
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@ManagedBean
@SessionScoped
public class LocaleBean {
private static final Logger LOG = LogManager.getLogger(MethodHandles.lookup().lookupClass());
private Locale locale = FacesContext.getCurrentInstance().getViewRoot().getLocale();
public Locale getLocale() {
return locale;
}
public String getLanguage() {
return locale.getLanguage();
}
public void setLanguage(String language) {
LOG.info("Vamos a Cambiar a: " + language);
locale = new Locale(language);
LOG.info("Vamos a Cambiar a: " + locale.getDisplayName() + FacesContext.getCurrentInstance().getViewRoot());
FacesContext.getCurrentInstance().getViewRoot().setLocale(locale);
}
}