3

在我的 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 标记切换语言环境(我需要一个链接并且样式指南不允许使用 a or )以便消息包查找是同步的?

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

编辑:

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

我试图解释我们拥有什么以及我们尝试了什么:

  • 我们正在使用 Maven 构建我们的软件
  • 我们在 SVN 存储库中为不同的业务目的分离了逻辑上不同的 Web 应用程序
  • 在构建期间,我们将所有 Web 应用程序聚合为一个(WAR-overlay)
  • 因此,我们为每个商业用途的 Web 应用程序注册了 faces-config-<business-webapp-id>.xml
  • 每个 Web 应用程序都有自己的资源包,注册名称为“<business-webapp-id>msg”
  • 我们有一个通用的 webapp(框架),它为所有注册的 web 应用程序呈现导航项
  • 每个网站都可以注册导航项。
  • 该框架现在尝试在返回当前导航项的阶段将所有资源包聚合到一个大资源包中。

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

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

我希望我已经解释了我的“挑战”,以便可以理解。

4

1 回答 1

2

我不确定这个问题是如何以及为什么引起的。您可以尝试以下操作以强制 JSF 重新创建视图。不要返回null操作方法,而是返回一个空字符串或强制重定向到同一视图。

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

或者

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

与具体问题无关,如果您的环境支持 EL 2.2,那么如果您为此使用单个操作方法会更加干燥。例如

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

<h:commandLink action="#{languageBean.switchLanguage('EN')}">English</h:commandLink>
于 2012-03-16T12:15:55.797 回答