【问题标题】:Internationalization JSF 2.0国际化 JSF 2.0
【发布时间】:2012-05-13 09:58:44
【问题描述】:

我有一个应用程序正在尝试设置国际化可用性。

这是我的 faces-config.xml:

<application>
    <locale-config>
        <default-locale>lt</default-locale>
        <supported-locale>en</supported-locale>
        <supported-locale>de</supported-locale>
    </locale-config>
    <resource-bundle>
        <base-name>application</base-name>
        <var>msg</var>
    </resource-bundle>
</application>

我有三个属性文件:

application_lt.properties
application_en.properties
application_de.properties

bean 类:

@ManagedBean(name = Beans.LOCALE_BEAN)
@SessionScoped
public class LocaleBean extends BaseBean implements Serializable {

    private String lang;

    public String getLang() {
        return lang;
    }

    public void setLang(String lang) {
        this.lang = lang;
    }
}

动作类:

@ManagedBean(name = "localeAction")
@SessionScoped
public class LocaleAction extends BaseAction implements Serializable {

    public void changeLocale() {
        LocaleBean localeBean = getBean(Beans.LOCALE_BEAN);
        String language = localeBean.getLang();
        FacesContext.getCurrentInstance().getViewRoot().setLocale(new Locale(language));
    }

}

要更改语言环境,我正在使用 commandLink:

<h:commandLink action="#{localeAction.changeLocale}">
    <f:setPropertyActionListener target="#{localeBean.lang}" value="en"/>
    English
</h:commandLink>

<h:commandLink action="#{localeAction.changeLocale}">
    <f:setPropertyActionListener target="#{localeBean.lang}" value="lt"/>
    Lithuanian
</h:commandLink>

第一个问题:

我已经定义我的默认语言环境是“lt”:lt.为什么当我启动时我的应用程序文本值是从 application_en.properties 而不是从 application_lt.properties 加载的?

第二个问题:

当我执行 commandLink 操作时,语言环境会根据我选择的语言环境而改变。但是执行该操作是单击一次,第二次单击应用程序的任何其他链接也可以,当我第三次单击应用程序的任何链接时,文本值位于 application_en.properties。似乎语言环境发生了某种变化......

有什么想法吗?

【问题讨论】:

  • &lt;f:setPropertyActionListener... 在 JSF 2.0 中不需要,因为您可以使用参数调用方法。

标签: java jsf-2 internationalization locale


【解决方案1】:

我已经定义我的默认语言环境是“lt”:lt.为什么当我启动时我的应用程序文本值是从 application_en.properties 而不是从 application_lt.properties 加载的?

显然是因为您的浏览器通过Accept-Language 请求标头将自己的区域设置为en 作为首选区域设置。 JSF 将自动使用它,因为它属于受支持的语言。您需要在浏览器设置中更改首选语言。


当我执行 commandLink 操作时,语言环境会根据我选择的语言环境而改变。但是执行该操作是单击一次,第二次单击应用程序的任何其他链接也可以,当我第三次单击应用程序的任何链接时,文本值位于 application_en.properties。似乎语言环境发生了某种变化。

显然你改变了看法。您的操作方法仅更改当前视图的区域设置。您需要确保在主模板的 &lt;f:view&gt; 或至少所有视图中设置区域设置形式为 LocaleBean

<f:view locale="#{localeBean.lang}">

另见:

【讨论】:

  • 是的,你是对的。我已将 设置为主模板并且它有效。对于第一个问题,我给我的“lang”变量一个值“lt”,现在当应用程序启动时一切正常。谢谢!
【解决方案2】:

第一个问题 在语言环境方面,JSF 正在读取客户端浏览器 HTTP Accept-Language 标头并使用最首选的语言环境。如果应用程序不支持(faces-config 设置),则它使用 HTTP 标头中的第二首选语言环境等。如果应用程序不支持客户端首选语言环境,则使用 faces-config.xml 中的默认语言环境用来。因此,可能会简单地忽略 faces-config.xml 中的默认语言环境。

看来您的客户端浏览器可能会在 HTTP Accept-Language 标头中发送英语语言环境。

第二个问题。 发生这种情况是因为默认情况下区域设置是按请求设置的,而不是按用户会话设置的。看看这个question 看看如何克服这个问题。

【讨论】:

    猜你喜欢
    • 2011-11-14
    • 2011-06-02
    • 1970-01-01
    • 1970-01-01
    • 2010-09-10
    • 1970-01-01
    • 1970-01-01
    • 2014-01-04
    • 1970-01-01
    相关资源
    最近更新 更多