我的应用程序在tomcat7上运行,并且支持ja和en语言环境。
我有一个login.jsp文件,我想通过以下代码设置区域设置和绑定:<fmt:setLocale value="${pageContext.response.locale}" scope="session" />
<fmt:setBundle basename="com.application.i18n.labels" scope="session" />
我的chrome浏览器设置第一语言为日语,第二语言为英语:Accept-Language:ja,en;q=0.8
但是,无论何时加载login.jsp,它总是将login.jsp显示为en_US。我试着显示pageContext.response.locale
的内容,确认是en_US。显示的jsp的content-language
头也确认了这一点:Content-Language:en-US
当我显式地设置<fmt:setLocale value="ja" scope="session" />
时,login.jsp能够正确地以日语显示。但是我不想强制将login.jsp始终设置为日语。我想让login.jsp根据第一个支持的Accept-language
值显示,在我的浏览器的情况下应该是ja
。
如何根据应用程序支持的第一个Accept-Language
显示login.jsp ?
编辑:我尝试使用<%=request.getLocale()%>
,它显示ja
作为区域设置。这让我很困惑。是不是pageContext.response.locale应该设置来自请求语言环境的值?
Servlet规范3.1,第5.5节"Servlet应该设置区域设置和响应的字符编码" .所以这是应用程序的责任。
我在Servlet或JSP规范中没有看到任何要求根据请求语言环境设置响应语言环境的内容。
作为对Mark Thomas评论的回应,spring的DispatcherServlet.java的render()方法使用一种解析机制设置来自请求的响应的语言环境:
// Determine locale for request and apply it to the response.
Locale locale = this.localeResolver.resolveLocale(request);
response.setLocale(locale);
LocaleResolver默认为AcceptHeaderLocaleResolver,它简单地返回请求区域设置,如下所示:
public Locale resolveLocale(HttpServletRequest request) {
return request.getLocale();
}