gpt4 book ai didi

jsf - JSF 中的本地化,如何记住每个 session 而不是每个请求/ View 选择的区域设置

转载 作者:行者123 更新时间:2023-12-03 06:47:24 25 4
gpt4 key购买 nike

faces-config.xml:

<application>
<locale-config>
<default-locale>ru</default-locale>
<supported-locale>ua</supported-locale>
</locale-config>
</application>

在 bean 操作方法中,我将更改当前 View 中的区域设置,如下所示:

FacesContext.getCurrentInstance().getViewRoot().setLocale(new Locale("ua"));

问题是应用了 ua 区域设置,但仅针对每个请求/ View ,而不是针对 session 。同一 session 中的另一个请求/ View 会将区域设置重置回默认 ru 值。

如何应用 session 区域设置?

最佳答案

您需要将所选区域设置存储在 session 范围中,并在 viewroot 中的两个位置进行设置:一次通过 UIViewRoot#setLocale() 更改区域设置后立即(这会更改当前 viewroot 的区域设置,从而反射(reflect)在回发中;之后执行重定向时,这部分不是必需的)并且一旦进入 locale <f:view> 的属性(它在后续请求/ 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);
}

}

下面是 View 的示例:

<!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>

假设 #{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 不利。

另请参阅:

关于jsf - JSF 中的本地化,如何记住每个 session 而不是每个请求/ View 选择的区域设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4830588/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com