faces-config.xml
:
<application>
<locale-config>
<default-locale>ru</default-locale>
<supported-locale>ua</supported-locale>
</locale-config>
</application>
在 bean 操作方法中,我将当前视图中的区域设置更改如下:
FacesContext.getCurrentInstance().getViewRoot().setLocale(new Locale("ua"));
问题是ua
应用区域设置,但仅针对每个请求/视图,而不适用于会话。同一会话中的另一个请求/视图将区域设置重置回默认值ru
value.
如何应用会话区域设置?
您需要将所选区域设置存储在会话范围中,并将其设置在 viewroot 的两个位置:一次UIViewRoot#setLocale()更改区域设置后立即(这会更改当前 viewroot 的区域设置,从而反映在回发中;之后执行重定向时,这部分不是必需的)并且一旦进入locale
的属性<f:view>(它在后续请求/视图中设置/保留区域设置)。
这是一个例子LocaleBean
应该看起来像:
package com.example.faces;
import java.util.Locale;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
@ManagedBean
@SessionScoped
public class LocaleBean {
private Locale locale;
@PostConstruct
public void init() {
locale = FacesContext.getCurrentInstance().getExternalContext().getRequestLocale();
}
public Locale getLocale() {
return locale;
}
public String getLanguage() {
return locale.getLanguage();
}
public void setLanguage(String language) {
locale = new Locale(language);
FacesContext.getCurrentInstance().getViewRoot().setLocale(locale);
}
}
这是视图的示例,应如下所示:
<!DOCTYPE html>
<html lang="#{localeBean.language}"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html">
<f:view locale="#{localeBean.locale}">
<h:head>
<title>JSF/Facelets i18n example</title>
</h:head>
<h:body>
<h:form>
<h:selectOneMenu value="#{localeBean.language}" onchange="submit()">
<f:selectItem itemValue="en" itemLabel="English" />
<f:selectItem itemValue="nl" itemLabel="Nederlands" />
<f:selectItem itemValue="es" itemLabel="Español" />
</h:selectOneMenu>
</h:form>
<p><h:outputText value="#{text['some.text']}" /></p>
</h:body>
</f:view>
</html>
其中假设#{text}
已经配置在faces-config.xml
如下:
<application>
<resource-bundle>
<base-name>com.example.i18n.text</base-name>
<var>text</var>
</resource-bundle>
</application>
注意<html lang>
不是 JSF 运行所必需的,但搜索机器人如何解释您的页面是强制性的。否则它可能会被标记为重复内容,这对搜索引擎优化不利。
也可以看看:
- Maven和JSF webapp结构,JSF资源到底放在哪里
- JSF国际化,什么时候使用消息包和资源包?
- JSF 2.0 应用程序中具有 UTF-8 编码属性文件的 i18n
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)