因为希望把SpringSide搞成国际化项目
i
n就成了必做的事情
照抄appfuse折腾了很久后才发现appfuse式的sample总是只顾着演示自己的一亩三分地而忽略了很多其他东西
从基础开始没有Spring时Java的in是这样的
jsp环境
首先写一个messageszh_CNproperties文件放在classpath也就是/WEBINF/classes里welcome=欢迎然后用nativeasciiexe把它转为welcome=\ub\ufce
在webxml中定义messages文件<contextparam>
<paramname>javaxservletjspjstlfmtlocalizationContext</paramname>
<paramvalue>messages</paramvalue>
</contextparam>
最后在jsp里使用
<%@tagliburi=prefix=fmt%>
<fmt:messagekey=welcome/>
如果有多个ResourceBundle文件就要在jsp里用<ftm:bundle>定义了
pureJava环境
ResourceBundlerb=ResourceBundlegetBundle(messages);
Stringwelcome=rbgetString(welcome);
Spring的增强及appfuse的做法
Spring增加了MessageSource的概念一是ApplicationContext将充当一个单例的角色不再需要每次使用i时都初始化一次ResourceBundle二是可以代表多个ResourceBundle
在ApplicationContext的定义文件中增加如下节点
<beanid=messageSourceclass=orgntextsupportResourceBundleMessageSource>
<propertyname=basenamevalue=messages/>
</bean>
则在purejava环境中contextgetMessage(welcomenullLocaleCHINA)
而在jsp环境中Controller调用JSTLviewResolver再调用Jsp时<fmt:message>将继续发挥它的功效
因此appfuse等sample都是在appfuseservletxml中定义一个<messageSource>
BetterPractice
要不要定义javaxservletjspjstlfmtlocalizationContext
Appfuse等sample都是假定大家完全使用Controller作访问入口jsp甚至藏在了/webinf/中而很不幸大家的项目可能还是有很多直接访问jsp的地方而直接访问jsp时<messageSource>节点是没有作用的
但如果定义了javaxlocalizationContext又会让MessageSource失效
messageSource定义在ApplicationContextxml还是appfuseservletxml
ApplicationContext*xml由ContextLoaderListener载入而appfuseservletxml靠dispatchServlet载入并拥有一个指向ApplcationContex*xml指针所以appfuseservletxml能看到定义在ApplcationContext里的东西而反之做不到
明显把<messageSource>定义在ApplicationContextxml能获得更好的可见性
但是appfuse没有在pureJava代码中使用in也就没有考虑这个问题
坚决不用鸡肋级<spring:message>tag
连appfuse也不用它可见多么鸡肋因为fmt在找不到资源时最多显示???welcome???而<spring:message>则会抛出异常谁会喜欢这种定时炸弹阿
有趣的theme解决做成图片的文字的国际化
theme也就是把message的原理发挥了一下让不同语言的美术字图片的路径也可以定义在theme_zh_CNproperties和theme_en_USproperties中终于有一个不那么鸡肋的springtag了
简单归纳
jstl中仍然使用标准的<ftm:message>及其定义?
java中使用spring的<messageSource>实现单例
用<spring:theme>解决那些做成图片的文字的国际化问题
Spring还有sessioncookielocaleresolver到时可以看一下