JSF中的本地化,如何记住每个会话的选定区域设置,而不是每个请求/视图

ser*_*nni 43 session jsf localization internationalization jsf-2

faces-config.xml:

<application>
    <locale-config>
        <default-locale>ru</default-locale>
        <supported-locale>ua</supported-locale>
    </locale-config>
</application> 
Run Code Online (Sandbox Code Playgroud)

在bean操作方法中,我正在更改当前视图中的语言环境,如下所示:

FacesContext.getCurrentInstance().getViewRoot().setLocale(new Locale("ua"));
Run Code Online (Sandbox Code Playgroud)

问题是应用了uaLocale,但仅适用于每个请求/视图而不适用于会话.同一会话中的另一个请求/视图将语言环境重置为默认ru值.

如何应用会话的区域设置?

Bal*_*usC 81

您需要将所选区域设置存储在会话范围中,并在视图中将其设置在两个位置:一次UIViewRoot#setLocale()在更改区域设置后立即(更改当前视图的区域设置,从而反映在回发中;此部分不是必需的)当你在之后执行重定向时)和一次locale属性<f:view>(在后续请求/视图中设置/保留语言环境).

这是一个如何LocaleBean看起来像这样的例子:

package com.example.faces;

import java.util.Locale;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;

@ManagedBean
@SessionScoped
public class LocaleBean {

    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)

以下是该视图的示例:

<!DOCTYPE html>
<html lang="#{localeBean.language}"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html">
<f:view locale="#{localeBean.locale}">
    <h:head>
        <title>JSF/Facelets i18n example</title>
    </h:head>
    <h:body>
        <h:form>
            <h:selectOneMenu value="#{localeBean.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>
        <p><h:outputText value="#{text['some.text']}" /></p>
    </h:body>
</f:view>
</html>
Run Code Online (Sandbox Code Playgroud)

请注意,<html lang>JSF的运行不是必需的,但搜索机器人如何解释您的页面是必需的.否则它可能被标记为重复内容,这对SEO是不利的.

有关: