Java 国际化JSF2.0

Java 国际化JSF2.0,java,jsf-2,internationalization,locale,Java,Jsf 2,Internationalization,Locale,我在witch中有一个应用程序,我正在尝试设置国际化可用性 这是我的faces-config.xml: <application> <locale-config> <default-locale>lt</default-locale> <supported-locale>en</supported-locale> <supported-locale>de&l

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

这是我的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>
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。为什么在启动应用程序时,文本值是从应用程序的“en.properties”加载的,而不是从应用程序的“lt.properties”加载的

第二个问题:

当我执行commandLink操作时,区域设置会根据我选择的区域设置而变化。但执行该操作只需单击一次,第二次单击应用程序的任何其他链接也可以,当我第三次单击应用程序的任何链接时,文本值都是从应用程序的属性中定位的。似乎语言环境在某种程度上发生了变化

有什么想法吗

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

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


当我执行commandLink操作时,区域设置会根据我选择的区域设置而变化。但执行该操作只需单击一次,第二次单击应用程序的任何其他链接也可以,当我第三次单击应用程序的任何链接时,文本值都是从应用程序的属性中定位的。似乎语言环境在某种程度上发生了变化

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


另见:

  • 第一个问题 说到语言环境,JSF正在读取客户端浏览器HTTP Accept语言头并使用最首选的语言环境。如果应用程序不支持该语言环境(faces-config设置),则使用HTTP头中的第二首选语言环境等。如果应用程序不支持任何客户端首选语言环境,则使用faces-config.xml中的默认语言环境。因此,可能会忽略faces-config.xml中的默认区域设置

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

    第二个问题。
    这是因为默认情况下,语言环境是按请求设置的,而不是按用户会话设置的。看看这一点,看看如何克服它。

    是的,你是对的。我已经设置了
    
    
    <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>