JSF 2.0如何通过浏览器和编程方式设置整个会话的本地化语言?

18

如何基于初始浏览器请求检测应用程序的语言环境,并在整个浏览会话期间使用它,直到用户明确更改语言环境,以及如何在其余会话中强制执行新的语言环境?

1个回答

41

创建一个会话作用域的托管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);
    }

}

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

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

为了更改它,将其绑定到具有语言选项的<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>
为了提高国际化页面的SEO(否则会被标记为重复内容),还需要将语言与<html>绑定。
<html lang="#{localeManager.language}">

如果我添加了一个不在 Locale 类定义中的 tr,例如 Locale.CANADA、Locale.GERMAN,我已经在 faces-config.xml 中添加了以下内容: <default-locale>en</default-locale> <supported-locale>tr</supported-locale> 但它没有起作用 :/ - Günay Gültekin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接