我有一个奇怪的问题,本地化工作很好,除了我们的错误页面。
我正在使用Stripes框架,资源包和JSTL标记来本地化我的页面。语言环境由Stripes框架确定。根据条纹documentation:
Stripes使用HttpServletRequestWrapper调用request.getLocale(),request.getLocales()仅返回所选的语言环境。这意味着不仅Stripes将使用正确的区域设置而不必重新确定它,而且依赖于request.getLocales的任何其他本地化工具也应默认使用正确的区域设置。这包括JSTL fmt:*标签 - 酷吧?
除非发生404或500错误,指向我们的错误页面(在web.xml中配置如下),这在任何地方都可以正常工作:
<error-page>
<error-code>404</error-code>
<location>/error.jsp</location>
</error-page>
如果我直接浏览错误页面,本地化工作正常。例如,如果我已将语言设置为西班牙语,则浏览到此网址,该页面将以西班牙语显示:
http://localhost:8080/error.jsp
但如果我将语言设置为西班牙语,然后浏览到:
http://localhost:8080/this-page-does-not-exist-create-a-404-error
出现相同的错误页面,但以英文呈现。
为什么会这样,我该如何解决?我搜索了一遍没有结果!
我应该添加,我已经尝试手动检查request.getLocale(),并将其设置为en_US。
在设置区域设置的代码中,我们还设置了一些会话属性,“lang”和“country”。
作为一种解决方法,我发现我可以阅读这些属性并重新构建语言环境,但我想知道为什么会发生这种情况。
答案 0 :(得分:1)
您的错误页面可能无法通过Stripes Filter。 尝试从404页面重定向Stripes页面。这可能会解决问题。
答案 1 :(得分:1)
事实证明问题是Stripes正在处理设置语言环境,但错误页面没有通过Stripes Dispatcher传递。解决方案是在下面添加ERROR行:
<filter-mapping>
<filter-name>StripesFilter</filter-name>
<url-pattern>/*</url-pattern>
<servlet-name>StripesDispatcher</servlet-name>
<dispatcher>REQUEST</dispatcher>
<dispatcher>INCLUDE</dispatcher>
<dispatcher>FORWARD</dispatcher>
<dispatcher>ERROR</dispatcher>
</filter-mapping>