我想在我的JSF应用程序中登录时设置特定的用户区域设置。
为此,我从他的属性中获取用户区域设置,并通过
设置用户区域设置FacesContext.getCurrentInstance().getViewRoot().setLocale(userLocale);
成功登录时登录fase。
我的问题是,当我在用户会话期间在后续的fase中向用户显示消息时,我通过
获取的语言环境FacesContext context = FacesContext.getCurrentInstance();
if (context != null && context.getViewRoot() != null) {
locale = context.getViewRoot().getLocale();
...
始终是默认语言环境。
我的代码中没有其他点我设置语言环境,所以我无法弄清楚为什么会发生这种情况。
任何提示都将受到赞赏
答案 0 :(得分:1)
您基本上只为当前视图(登录页面)设置区域设置。您需要记住会话范围中的用户区域设置,并在同一会话中的所有后续视图中进行设置。
您可以通过使userLocale
某个会话作用域bean的属性(可能只是登录用户本身?)并在主模板中将其引用为<f:view locale>
来实现。
<f:view locale="#{user.locale}">
这将隐式地为每个视图执行viewRoot.setLocale(user.getLocale())
。
答案 1 :(得分:0)
也许你应该多说一些为什么你从有关用户优先本地的请求信息收集的内容,但是让我们说你从标题accept-language
然后,正如JSF规范所说:
UIViewRoot的Locale由ViewHandler在执行期间确定和设置 ViewHandler的createView()方法。此方法必须使活动的Locale成为 通过查看用户的偏好以及应用程序声明的支持区域设置来确定。
因此,有一件事是在ViewRoot中设置Locale并从请求标头收集Locale,另一件事是在配置文件中正确设置支持的locales。
在规范的其他部分,您可以阅读(参见ViewHandler calculateLocale
方法):
方法Application.getSupportedLocales()定义此JSF应用程序能够支持的语言环境。此方法应匹配此类数据源并返回Locale对象,该对象是将当前应用程序呈现给当前用户的最佳选择。
为什么会这样?如果您的应用程序不支持发送使用该语言环境的响应,则无法向用户发送具有区域设置的用户发送响应。
现在你所要做的就是(我希望如此)是在faces-config.xml
这样的目录中配置你的WEB-INF
(也是从JSF规范中复制的):
<faces-config>
<application>
<locale-config>
<default-locale>en</default-locale>
<supported-locale>de</supported-locale>
<supported-locale>fr</supported-locale>
<supported-locale>es</supported-locale>
// ...
</locale-config>
</application>
</faces-config>
我希望这会奏效,我能够提供帮助。