【发布时间】:2012-08-18 04:41:00
【问题描述】:
在我的应用中,用户应该能够切换区域设置(用于在页面上呈现文本的语言)。大量教程使用 FacesContext.getCurrentInstance().getViewRoot().setLocale()。例如:http://www.mkyong.com/jsf2/jsf-2-internationalization-example/。但是,这在 JSF 2.0 中根本不起作用(它在 1.2 中确实起作用)。语言从不切换。没有错误或任何东西。相同的代码在 JSF 1.2 中运行良好。
什么是正确和确定的方法?我拼凑了一个解决方案,但不确定这是否正确。这工作正常。用户点击英语或法语后,语言切换。这是代码 sn-p 给你一些想法。
@ManagedBean(name = "switcher")
@SessionScoped
public class LanguageSwitcher {
Locale locale = FacesContext.getCurrentInstance().getViewRoot().getLocale();
public String switchLocale(String lang) {
locale = new Locale(lang);
return FacesContext.getCurrentInstance().getViewRoot().getViewId() +
"?faces-redirect=true";
}
//getLocale() etc. omitted for brevity
}
XHTML:
<f:view locale="#{switcher.locale}">
<h:outputText value="#{msg.greeting}" />
<h:commandLink value="English" action="#{switcher.switchLocale('en')}" />
<h:commandLink value="French" action="#{switcher.switchLocale('fr')}" />
</f:view>
只是为了给你更多信息,这里是配置文件。
<application>
<locale-config>
<supported-locale>en</supported-locale>
<supported-locale>fr</supported-locale>
</locale-config>
<resource-bundle>
<base-name>com.resources.Messages</base-name>
<var>msg</var>
</resource-bundle>
</application>
再一次,这行得通。但是,我没有通过以任何方式调用任何 API 来更改 JSF 本身的语言环境。这让我有些毛骨悚然的感觉。这是更改用户语言环境的正确方法吗?
【问题讨论】:
-
如果你想被理解,也许比“根本行不通”和“这行得通”更具体。你的测试用例到底是什么? “更改语言环境”到底是什么意思? (更改哪个语言环境?)
-
@meriton,为问题添加了更多详细信息。基本上,语言永远不会切换。测试用例就在那里。用户点击英语或法语链接,
会显示该语言的文本。 -
看看 BalusC(JSF 专家)答案:JSF locale is set per request,not for session.
-
@Luiggi,这几乎就是我在解决方案中所做的。除了,我不明白为什么他们都调用 FacesContext.getCurrentInstance().getViewRoot().setLocale(locale);当它似乎什么都不做的时候。
-
@RajV IMO Bauke Scholtz(a.k.a. BalusC)在他的回答和它提供的用于进一步解释的链接(也由他制作)中都非常清楚。