如何在JSF中实现会话级别的本地化,而不是每个请求/视图级别的选定区域设置记忆
P粉360266095
P粉360266095 2023-08-22 21:30:42
0
2
530
<p><code>faces-config.xml</code>:</p> <pre class="brush:php;toolbar:false;"><application> <locale-config> <default-locale>ru</default-locale> <supported-locale>ua</supported-locale> </locale-config> </application></pre> <p>在一个bean的动作方法中,我按照以下方式改变当前视图的语言环境:</p> <pre class="brush:php;toolbar:false;">FacesContext.getCurrentInstance().getViewRoot().setLocale(new Locale("ua"));</pre> <p>问题是<code>ua</code>语言环境只应用于请求/视图,而不适用于会话。在同一会话中的另一个请求/视图会将语言环境重置为默认的<code>ru</code>值。</p> <p>如何将语言环境应用于会话?</p>
P粉360266095
P粉360266095

全部回复(2)
P粉662802882

我看到问题还与.properties文件名有关。 Java的Locale代码(小写)如:en_gb 但是由Netbeans自动生成的Locale是小写_大写,例如:messages_en_GB.properties 将其改为:messages_en_gb.properties 然后它应该能够正常工作 - 如果你已经尝试了一切

P粉426906369

您需要将选择的区域设置存储在会话范围内,并在两个位置设置它:一次是通过UIViewRoot#setLocale()立即在更改区域设置后(这将更改当前视图根的区域设置,从而在后续请求中得到反映;如果之后执行重定向,则此部分是不必要的),以及一次在<f:view>locale属性中(这将在后续请求/视图中设置/保留区域设置)。

这是一个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);
    }

}

这是视图应该如何看起来的示例:

<!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 示例</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>

这假设#{text}已在faces-config.xml中配置如下:

<application>
    <resource-bundle>
        <base-name>com.example.i18n.text</base-name>
        <var>text</var>
    </resource-bundle>
</application>

请注意,<html lang>对于JSF的功能并不是必需的,但对于搜索引擎的解释页面是强制性的。否则,它可能会被标记为重复内容,这对于SEO来说是不好的。

另请参阅:

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板