问题:
Struts2的应用,本地化字符串在Windows 8+IE11时显示错误,为resource key。
在以下组合均测试正常:
Windows 8.1 + Chrome
Windows 7 + IE11
分析:
页面上使用Struts的<s:text name="login.message.userNameValidate" />获取本地化字符串,而Struts是根据客户端的locale信息匹配资源文件的。应用配置了两个资源文件:
message_en_US.properties -> 没有配置上面的resource key
message_zh_CN.properties -> 配置了上面的resource key
查看浏览器的Request Header:
Windows 8.1 + Chrome 31.0.1650.57 :
Windows 8.1 + IE 11.09600.16476:
Windows 7 + IE
由此可以判断是Windows 8 引入了新的locale符号:zh_Hans-CN, zh-Hans,而Linux服务器端没有对应的资源文件,使用了默认的message_en_US.properties,造成读取资源失败。(当使用 Windows8本地的Tomcat时,默认资源文件是message_zh_cn.properties,也不能重现这个问题)
解决:
根据Struts2关于i18n拦截器的描述:http://struts.apache.org/release/2.0.x/docs/i18n-interceptor.html
按照文中的说明,增加URL参数是可以临时解决问题的:http://devtest.ahzti.com:8080/spinerp/admin/loginAction?request_locale=zh_CN
但不可能总是在运行时手动更新locale。因此更好的办法是建立拦截器,通过配置将特定的language tag转换成系统支持的的language tag。通过查看I18nInterceptor的源码,发现其获取locale值的优先级为:
- 默认的URL参数:request_locale;
- 默认的URL参数:request_only_locale; //通过这个参数设置的locale不会被放入session中
- 默认的session变量:WW_TRANS_I18N_LOCALE;
- 浏览器的locale值:invocation.getInvocationContext().getLocale()
因此,通过新建LanguageTagAliasInterceptor 继承I18nInterceptor,从配置文件中读取需要匹配的language tag及需要映射的language alias,在session(WW_TRANS_I18N_LOCALE)中查找并替换,即可完成locale的修改。注意不能覆盖 I18nInterceptor的默认行为,即通过URL参数设置的locale仍然具有最高的优先级。
代码:
public String intercept(ActionInvocation invocation) throws Exception { if (languageTag != null && !languageTag.isEmpty() && languageAlias != null && !languageAlias.isEmpty()) { Locale currentLocale = invocation.getInvocationContext().getLocale(); boolean needReplace = currentLocale == null ||!languageAlias.equalsIgnoreCase(currentLocale.toString()); if (needReplace) { String[] languageTags = languageTag.split(","); for (String languageTag : languageTags) { if (languageTag.equalsIgnoreCase(currentLocale.toString())) { // Override default session named WW_TRANS_I18N_LOCALE,defined in parent class. Map<String, Object> session = invocation.getInvocationContext().getSession(); session.put(attributeName, LocalizedTextUtil.localeFromString(languageAlias, null)); break; } } } } return super.intercept(invocation); }
Strtus.xml
<interceptor-ref name="languageTagAlias"> <param name="languageTag">zh_hans_cn,zh_hans</param> <param name="languageAlias">zh_cn</param> </interceptor-ref>
总结
这个问题出现几率很低,最终发现只在Windows8的机器上才能重现,原因是使用了新的language tag。修复这个问题可以有以下几种方法:
- 在客户端定义Language tag,覆盖浏览器默认值;
- 在WebApp中为zh-Hans-CN,zh-Hans等tag增加新的资源文件;
- 编写拦截器,通过配置修改需要取代的language tag。
综合来看,第3个方案是最好的。当然也有一些可以增强的地方,如:I18nIntercepter执行了两次;考虑如何支持多个language tag的替代条件。
原文地址:http://blog.csdn.net/jarvisj/article/details/17404803
相关推荐
人工智能-深度学习-tensorflow
人工智能毕业设计&课程设计
基于ssm的中小型企业财务管理录系统.zip
这个资源是一个基于Spring Boot和MySQL的洗衣店订单管理系统的完整源码。它包括了所有的源代码文件,以及一个详细的文档,可以帮助你理解和运行这个系统。这个系统的主要功能包括:用户注册和登录,下单,查看订单,修改订单,删除订单等。用户可以在系统中选择洗衣服务,然后提交订单。系统会自动计算订单的总价,并将其显示在用户的订单列表中。用户还可以查看自己的历史订单,以及每个订单的详细信息。此外,系统还包括了一个管理员模块。管理员可以查看所有的订单,以及对订单进行管理。他们可以修改订单的状态,例如将订单标记为已完成,或者取消订单。这个系统使用了Spring Boot框架,这是一个非常流行的Java开发框架,它可以帮助你快速地开发和部署应用程序。同时,系统也使用了MySQL数据库,这是一个广泛使用的关系型数据库,它可以存储大量的数据,并提供高效的查询功能。总的来说,这个资源是一个非常完整的洗衣店订单管理系统的源码,它可以帮助你理解如何使用Spring Boot和MySQL来开发一个实际的应用程序。无论你是正在学习Java编程,还是已经有一定的开发经验,都可以从这个资源中学到很多有用的知识和技能。
W9825G6KH-6I SDRAM,256Mb(32MB,16Mbx16),3.3v 动态随机存取存储器
Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。
人工智能毕业设计&课程设计
asp代码ASP基于web的学校新闻发布系统开发(论文+源代码+开题报告+文献综述+外文翻译)本资源系百度网盘分享地址
三菱PLC例程源码PLC 气压程式本资源系百度网盘分享地址
三菱PLC例程源码PLC通过RS485 对FR系列变频的控制本资源系百度网盘分享地址
基于ssm的学生档案管理系统.zip
这是一个基于Java语言开发的elfinder 2.x版本Web文件管理器后端设计,包含63个文件,其中主要文件类型包括49个Java源文件、3个XML文件、2个PNG图片文件、2个Markdown文档、1个gitattributes文件、1个gitignore文件、1个LICENSE文件、1个Properties文件、1个types文件和1个未知类型的文件。该项目提供了丰富的文件管理功能,包括自定义文件视图和自定义文件操作,为用户提供了高效、便捷的文件管理体验。
使用DS Client在PPT中动态展示分子三维结构
基于ssm+vue的汽车站车辆运管系统.zip
算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。
DS在生物药物领域的解决方案
三菱PLC例程源码SBR废水处理本资源系百度网盘分享地址
人工智能毕业设计&课程设计
人工智能-深度学习-tensorflow
基于ssm电子病历系统.zip