【问题标题】:JSF 2.0 - switching locale with h:commandLink - message bundle not in synchJSF 2.0 - 使用 h:commandLink 切换语言环境 - 消息包不同步
【发布时间】:2012-04-01 03:27:06
【问题描述】:

在我的 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)
  • 因此我们为每个商业用途的网络应用注册了 faces-config-.xml
  • 每个网络应用都有自己的资源包,注册名称为“msg”
  • 我们有一个通用的网络应用(框架),它为所有注册的网络应用呈现导航项
  • 每个网站都可以注册导航项。
  • 框架现在尝试在当前导航项将被返回的阶段将所有资源包聚合到一个大资源包中。

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

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

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

【问题讨论】:

  • 在你的真实代码中,你不是用ajax来切换语言的吗?要排除一个和另一个,如果您重定向回或返回非空怎么办? (例如空字符串)
  • 我不使用 ajax 来切换语言环境。我返回 null 因为应该可以在每个页面上切换区域设置,因此我现在不知道确切的结果。以及如何在 JSF 支持 bean 中重定向回来?
  • 使用return ""; 代替return null; 强制JSF 创建一个新视图,或者使用return viewRoot.getViewId() + "?faces-redirect=true"; 强制JSF 发送重定向到同一个视图。
  • 非常感谢。 “getViewId()”和重定向指令对我有用。你拯救了我的一天!!!!
  • 不错。我将其转发为答案。

标签: jsf-2 internationalization commandlink


【解决方案1】:

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

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

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

与具体问题无关,如果您的环境支持 EL 2.2,那么如果您为此使用单一操作方法,则更多 DRY。例如

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

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

【讨论】:

  • 非常感谢。正如我在重定向之前所说的,getViewId() 对我有用,而且真的足够了。正如您在此处提到的那样,我已经将这些东西重构为一个方法。因为我们在 Glassfish 2.1 中运行,我们不能使用带有参数的 EL,因此我添加了一个 标签来首先填充所选的语言环境。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-21
  • 2012-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多