最近我开始为 JSF 1.2 Web 应用程序制作 i18n。实际上,目前我们只需要两个语言环境,Web应用程序的实例将部署和配置在具有相同代码库的单独服务器上。
在 tomcat (catalina.bat) 的 JVM 级别使用 JAVA_OPTS 指定区域设置,如下所示:
-Duser.language=en -Duser.region=US
我们可以在 faces-config 中指定默认和支持的区域设置.xml如下所示:
<locale-config>
<default-locale>en_US</default-locale>
<supported-locale>en_GB</supported-locale>
</locale-config>
但是此配置将使用客户端浏览器特定的区域设置,而不是服务器默认区域设置(我们现在真正需要的是我们的目的)。
所以我正在考虑以编程方式指定区域设置。我首先想到的是:
FacesContext.getCurrentInstance().getViewRoot().setLocale(Locale.getDefault());
但是,如果我理解正确,这种方式将仅为当前用户对 webapp 的请求设置区域设置。
现在我正在考虑两种方式:
- 在成功用户登录后使用FacesContext设置区域设置;
- 在 Web 应用程序开始时指定区域设置配置(不是 确定如何在 JSF 中执行此操作)。
有没有更好的方法可以在应用程序级别以编程方式为 FacesContext 配置区域设置?
谢谢
尤里
为避免拉扯头发,请使用此方法:
https://stackoverflow.com/a/12079507/1049870
我曾经覆盖PhaseListener实现我自己的:
public class SessionPhaseListener implements PhaseListener {
private static final String key = "locale";
private static final String localeId = "es";
@Override
public void afterPhase(PhaseEvent event) {
java.util.Locale locale = new java.util.Locale(localeId);
PhaseId currentPhase = event.getPhaseId();
if (currentPhase == PhaseId.RESTORE_VIEW) {
viewRoot().setLocale(locale);
} else if (currentPhase == PhaseId.RENDER_RESPONSE) {
sessionMap().put(key, locale);
}
}
private Map<String, Object> sessionMap() {
return FacesContext.getCurrentInstance().getExternalContext().getSessionMap();
}
private UIViewRoot viewRoot() {
return FacesContext.getCurrentInstance().getViewRoot();
}
}
您可以创建更智能的方法。
但请记住,这段代码几乎不会被调用。
从环境变量中读取此值是最佳选择。