3

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

这是我的 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

豆类:

@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。似乎语言环境以某种方式发生了变化......

有任何想法吗?

4

2 回答 2

4

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

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


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

显然你改变了看法。您的操作方法仅更改当前视图的区域设置。您需要确保在主模板或至少所有视图中设置区域设置LocaleBean表单<f:view>

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

也可以看看:

于 2012-05-03T20:50:59.200 回答
1

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

因此,您的客户端浏览器似乎可能会在 HTTP Accept-Language 标头中发送英语语言环境。

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

于 2012-05-03T20:54:38.187 回答