【发布时间】:2012-04-01 03:27:06
【问题描述】:
在我的 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 标记切换语言环境(我需要一个链接,并且样式指南不允许使用 a or )以便消息包查找同步?
我正在使用 GF 2.1 和 Mojarra 2.0.9(基于 Servlet API 2.5 的 JSF 2.0)。 欢迎任何建议。
编辑:
好吧,我发现这是我的错,因为我们尝试了一些“特殊”的东西;-)
我试图解释我们拥有什么以及我们尝试了什么:
- 我们正在使用 maven 构建我们的软件
- 我们在 SVN 存储库中为不同的业务目的分离了逻辑上不同的 Web 应用程序
- 在构建期间,我们将所有 Web 应用聚合为一个(WAR-overlay)
- 因此我们为每个商业用途的网络应用注册了 faces-config-
.xml - 每个网络应用都有自己的资源包,注册名称为“
msg” - 我们有一个通用的网络应用(框架),它为所有注册的网络应用呈现导航项
- 每个网站都可以注册导航项。
- 框架现在尝试在当前导航项将被返回的阶段将所有资源包聚合到一个大资源包中。
我发现导航 bean 上的“getItems()”方法在 switchLocale 方法被触发之前被调用,因此切换语言环境为时已晚。
现在我尝试询问是否可以使用 h:commandLink 或 ah:outputLink 切换语言环境,以便在触发“getItems()”的支持 bean 方法之前切换语言环境?
我希望我已经解释了我的“挑战”,以便可以理解。
【问题讨论】:
-
在你的真实代码中,你不是用ajax来切换语言的吗?要排除一个和另一个,如果您重定向回或返回非空怎么办? (例如空字符串)
-
我不使用 ajax 来切换语言环境。我返回 null 因为应该可以在每个页面上切换区域设置,因此我现在不知道确切的结果。以及如何在 JSF 支持 bean 中重定向回来?
-
使用
return "";代替return null;强制JSF 创建一个新视图,或者使用return viewRoot.getViewId() + "?faces-redirect=true";强制JSF 发送重定向到同一个视图。 -
非常感谢。 “getViewId()”和重定向指令对我有用。你拯救了我的一天!!!!
-
不错。我将其转发为答案。
标签: jsf-2 internationalization commandlink