1

有没有办法实现可以更改语言环境的 viewParam,例如。

http://example.com/p1.jsf?lang=enhttp://example.com/p2.jsf?lang=fr

也许没有重复

<f:metadata>
    <f:viewParam name="lang" value="#{localeManager.locale}" />
</f:metadata>

在每个 xhtml 页面中(可能通过拦截每个 xhtml 请求,检查 lang 参数的值并更新语言环境)

有人提出并回答了类似的问题,但涉及 JSF2 @ManagedProperty,老实说,我不明白答案。

有什么想法吗?

4

1 回答 1

0

我制定了一个不涉及 CDI 的解决方案。

我在 JSF 生命周期的恢复视图阶段之后设置了语言环境。

@SuppressWarnings("serial")
public class LifeCycleListener implements PhaseListener {

  ...

  public void afterPhase(PhaseEvent event) {
    if (event.getPhaseId() == PhaseId.RESTORE_VIEW) {

      // let's try first to get the language from the request parameter  
      // and if it is a supported language then put it to session
      String reqParamLang = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("lang");

      if (reqParamLang != null) {
        Iterator<Locale> localeIterator = FacesContext.getCurrentInstance().getApplication().getSupportedLocales();
        while (localeIterator.hasNext()) {
          Locale locale = localeIterator.next();
          if (reqParamLang.equals(locale.toString())) {
            FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("lang", reqParamLang);
            Logger.getLogger(this.getClass().getName()).info("will change locale to " + locale);
          }
        }
      } 

      // get the language from the session and if available then set the locale 
      String sessionLang = (String) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("lang");

      if (sessionLang != null) {
          FacesContext.getCurrentInstance().getViewRoot().setLocale(new Locale(sessionLang));
      }
    }
  }
}
于 2013-04-30T13:29:49.497 回答