0.起因
项目是一个基础开发平台类的项目,首页的 JSP 页面上被设置了一个 Title,直接使用的 <spring:message>
标签来显示配置的项目名称,本来没有什么问题的,都在中文语境下,所以国际化也只写了一个 LocaleStrings_zh_CN
,而且面向用户一般都用 360
,QQ浏览器
,火狐
,Chrome
啊之类的,所以没啥问题。但是好死不死的最近一个项目的用户有人使用了 IE11,发现总是显示登录成功但是无法进入首页。
1.过程
检查日志,发现总是提示无法找到项目名称。这就奇了个大怪同事在各种漫无目的的测试配置文件路径啊什么的,但是依然无效。后来静下心来发现 IE11 的 IE11 说我支持的是简体中文 HTTP RequestHeader
中 Accept-Language
是 zh-Hans-CN
。!!划重点!!,这个坑爹的玩意儿啊zh-Hans-CN
啊,于是我可爱的服务器就去忠诚的找 LocaleStrings_zh_Hans_CN
去了,当然不可能找到啊!我又没有配置。。。
2.解决
一开始想的是复制一份改个名字就草草了事了,但是转念一想这么不是很不负责任么?要是以后扩展的时候这个就是坑啊!但是怎么解决呢?追着 Exception 里的 ResourceBundleMessageSource
去看代码,发现了还有个 parentMessageSource
属性,目的是 MessageSource
如果找不到 code 就去 parentMessageSource
中查找,那么我是不是就可以利用一下呢?于是就给配置了一下,将正常的 MessageSource
依然指向项目里的国际化文件夹,但是 parentMessageSource
直接明确指向 LocaleStrings_zh_CN
,这样即使以后别的语言来了,没有支持的配置也可以直接用默认的简体中文了~ 主要修改的地方
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basename" value="language/LocaleStrings" />
<property name="defaultEncoding" value="utf-8" />
<property name="parentMessageSource">
<bean class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basename" value="language/LocaleStrings_zh_CN" />
<property name="defaultEncoding" value="utf-8" />
</bean>
</property>
</bean>
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver">
</bean>
3.反思
这么写确实是解决了眼下的问题,而且也着眼了将来。但是思来想去,应该本来就有解决方案的,但是昨晚更替着急,就先这样了。留个记录,以便闲暇时候仔细瞅瞅。
说到底这个起因还是怪当初的设计,抖机灵的做法。用 SpringMessage
标签没啥,但是不认真用就是态度问题了。有些时候,用一些东西还是问一句为什么比较好。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于