强制 JSF 应用程序对 i18n 使用服务器端语言环境



最近我开始为 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 的请求设置区域设置。

现在我正在考虑两种方式:

  1. 在成功用户登录后使用FacesContext设置区域设置;
  2. 在 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();
    }
}

您可以创建更智能的方法。
但请记住,这段代码几乎不会被调用。
从环境变量中读取此值是最佳选择。

最新更新