如何在JSF中实现会话级别的本地化,而不是每个请求/视图级别的选定区域设置记忆
<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>
我看到问题还与.properties文件名有关。 Java的Locale代码(小写)如:en_gb 但是由Netbeans自动生成的Locale是小写_大写,例如:messages_en_GB.properties 将其改为:messages_en_gb.properties 然后它应该能够正常工作 - 如果你已经尝试了一切
您需要将选择的区域设置存储在会话范围内,并在两个位置设置它:一次是通过
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来说是不好的。另请参阅: