JSF 2.0从浏览器和编程方式在整个会话中设置区域设置

Far*_*san 15 java jsf locale internationalization jsf-2

如何根据初始浏览器请求检测应用程序的区域设置,并在整个浏览会话中使用它,直到用户专门更改区​​域设置,以及如何通过剩余的会话强制执行此新区域设置?

Bal*_*usC 36

创建一个会话范围的托管bean,如下所示:

@ManagedBean
@SessionScoped
public class LocaleManager {

    private Locale locale;

    @PostConstruct
    public void init() {
        locale = FacesContext.getCurrentInstance().getExternalContext().getRequestLocale();
    }

    public Locale getLocale() {
        return locale;
    }

    public String getLanguage() {
        return locale.getLanguage();
    }

    public void setLanguage(String language) {
        locale = new Locale(language);
        FacesContext.getCurrentInstance().getViewRoot().setLocale(locale);
    }

}
Run Code Online (Sandbox Code Playgroud)

要设置视图的当前区域设置,请将其绑定到<f:view>主模板的区域设置.

<f:view locale="#{localeManager.locale}">
Run Code Online (Sandbox Code Playgroud)

要更改它,请将其绑定到<h:selectOneMenu>带有语言选项的语言.

<h:form>
    <h:selectOneMenu value="#{localeManager.language}" onchange="submit()">
        <f:selectItem itemValue="en" itemLabel="English" />
        <f:selectItem itemValue="nl" itemLabel="Nederlands" />
        <f:selectItem itemValue="es" itemLabel="Español" />
    </h:selectOneMenu>
</h:form>
Run Code Online (Sandbox Code Playgroud)

为了改善国际化页面的SEO(否则它将被标记为重复内容),也要绑定语言<html>.

<html lang="#{localeManager.language}">
Run Code Online (Sandbox Code Playgroud)