JSF 2.0 - 使用h:commandLink切换语言环境 - 消息包不同步

时间:2012-03-15 15:23:58

标签: jsf-2 internationalization commandlink

在我的xhtml页面中,我有以下标签:

<f:view locale="#{languageBean.locale}">
...
</f:view>

我实现了一个语言bean:

@ManagedBean(name = "languageBean")
@SessionScoped
public class LanguageBean implements Serializable {

  private static final long serialVersionUID = -4260383661321467037L;

  ...    

  private Locale locale = FacesContext.getCurrentInstance().getViewRoot().getLocale();

  public String switchToDE() {
    LOGGER.info("switching to german");
    Locale german = Locale.GERMAN;
    FacesContext.getCurrentInstance().getViewRoot().setLocale(german);
    this.locale = german;
    return null;
  }

  public String switchToEN() {
    LOGGER.info("switching to english");
    Locale english = Locale.ENGLISH;
    FacesContext.getCurrentInstance().getViewRoot().setLocale(english);
    this.locale = english;
    return null;
  }

  public Locale getLocale() {
    return locale;
  }

  public void setLocale(final Locale locale) {
    this.locale = locale;
  }

}

然后我想渲染commandLinks来切换语言环境:

<ul>
  <li>
      <h:form>
          <h:commandLink class="" action="#{languageBean.switchToDE}">Deutsch</h:commandLink>
      </h:form>
  </li>
  <li>
      <h:form>
          <h:commandLink action="#{languageBean.switchToEN}">English</h:commandLink>
    </h:form>
  </li>
</ul>

在我页面的某些地方,我有一些输出,我在其中呈现消息:

#{msg['message.key.1']

在我的faces-config.xml中,我配置了:

<locale-config>
  <default-locale>de</default-locale>
  <supported-locale>de</supported-locale>
  <supported-locale>en</supported-locale>
</locale-config>

现在我的问题:第一次点击访问切换区域设置方法,但消息包不会在页面中刷新。如果我再次使用相同语言单击,则会更新消息包。消息包查找始终是区域设置切换的一步。 我怎么能用h:commandButton标签切换语言环境(我需要一个链接,样式指南不允许使用或)所以消息包查找是同步的?

我使用GF 2.1和Mojarra 2.0.9(基于Servlet API 2.5的JSF 2.0)。 欢迎任何建议。

编辑:

好的,我发现这是我的错,因为我们尝试了一些“特殊”的东西; - )

我尝试解释我们拥有的和我们尝试的内容:

  • 我们正在用maven构建我们的软件
  • 我们在SVN repo中为不同的业务目的分离了逻辑上不同的Web应用程序
  • 在构建期间,我们将所有网络应用聚合为一个(WAR覆盖)
  • 因此我们为每个商业用途的网络应用程序提供了faces-config-&lt; business-webapp-id&gt; .xml注册
  • 每个网络应用都拥有自己的资源包,注册名称为“&lt; business-webapp-id&gt; msg”
  • 我们有一个通用的webapp(框架),可以为所有已注册的网络应用程序呈现导航项目
  • 每个网站都可以注册导航项目。
  • 框架现在尝试在返回当前导航项的阶段将所有资源包聚合为一个大的资源包。

我发现导航bean上的方法“getItems()”在触发switchLocale方法之前被调用,因此切换区域设置为时已晚。

现在我尝试询问是否有可能使用h:commandLink或者使用ah:outputLink切换语言环境,以便在触发“getItems()”的辅助bean方法之前切换语言环境?

我希望我已经解释了我的“挑战”,这样才能理解。

1 个答案:

答案 0 :(得分:1)

我不确定导致此问题的原因和原因。您可以尝试以下操作以强制JSF重新创建视图。而不是在操作方法上返回null,而是返回一个空字符串或强制重定向到同一视图。

public String switchToDE() {
    // ...
    return "";
}

public String switchToDE() {
    // ...
    return FacesContext.getCurrentInstance().getViewRoot().getViewId() + "?faces-redirect=true";
}

无关具体问题,如果您的环境支持EL 2.2,如果您使用单一操作方法,则会更DRY。 E.g。

public String switchLanguage(String language) {
    // ...
}

<h:commandLink action="#{languageBean.switchLanguage('EN')}">English</h:commandLink>
相关问题