在我的xhtml页面中,我有以下标签:
<f:view locale="#{languageBean.locale}">
...
</f:view>
我实现了一个语言bean:
@ManagedBean(name = "languageBean")
@SessionScoped
public class LanguageBean implements Serializable {
private static final long serialVersionUID = -4260383661321467037L;
...
private Locale locale = FacesContext.getCurrentInstance().getViewRoot().getLocale();
public String switchToDE() {
LOGGER.info("switching to german");
Locale german = Locale.GERMAN;
FacesContext.getCurrentInstance().getViewRoot().setLocale(german);
this.locale = german;
return null;
}
public String switchToEN() {
LOGGER.info("switching to english");
Locale english = Locale.ENGLISH;
FacesContext.getCurrentInstance().getViewRoot().setLocale(english);
this.locale = english;
return null;
}
public Locale getLocale() {
return locale;
}
public void setLocale(final Locale locale) {
this.locale = locale;
}
}
然后我想渲染commandLinks来切换语言环境:
<ul>
<li>
<h:form>
<h:commandLink class="" action="#{languageBean.switchToDE}">Deutsch</h:commandLink>
</h:form>
</li>
<li>
<h:form>
<h:commandLink action="#{languageBean.switchToEN}">English</h:commandLink>
</h:form>
</li>
</ul>
在我页面的某些地方,我有一些输出,我在其中呈现消息:
#{msg['message.key.1']
在我的faces-config.xml中,我配置了:
<locale-config>
<default-locale>de</default-locale>
<supported-locale>de</supported-locale>
<supported-locale>en</supported-locale>
</locale-config>
现在我的问题:第一次点击访问切换区域设置方法,但消息包不会在页面中刷新。如果我再次使用相同语言单击,则会更新消息包。消息包查找始终是区域设置切换的一步。 我怎么能用h:commandButton标签切换语言环境(我需要一个链接,样式指南不允许使用或)所以消息包查找是同步的?
我使用GF 2.1和Mojarra 2.0.9(基于Servlet API 2.5的JSF 2.0)。 欢迎任何建议。
编辑:
好的,我发现这是我的错,因为我们尝试了一些“特殊”的东西; - )
我尝试解释我们拥有的和我们尝试的内容:
我发现导航bean上的方法“getItems()”在触发switchLocale方法之前被调用,因此切换区域设置为时已晚。
现在我尝试询问是否有可能使用h:commandLink或者使用ah:outputLink切换语言环境,以便在触发“getItems()”的辅助bean方法之前切换语言环境?
我希望我已经解释了我的“挑战”,这样才能理解。
答案 0 :(得分:1)
我不确定导致此问题的原因和原因。您可以尝试以下操作以强制JSF重新创建视图。而不是在操作方法上返回null
,而是返回一个空字符串或强制重定向到同一视图。
public String switchToDE() {
// ...
return "";
}
或
public String switchToDE() {
// ...
return FacesContext.getCurrentInstance().getViewRoot().getViewId() + "?faces-redirect=true";
}
无关具体问题,如果您的环境支持EL 2.2,如果您使用单一操作方法,则会更DRY。 E.g。
public String switchLanguage(String language) {
// ...
}
与
<h:commandLink action="#{languageBean.switchLanguage('EN')}">English</h:commandLink>