java

位置:IT落伍者 >> java >> 浏览文章

Spring i18n的better practice


发布日期:2024年07月16日
 
Spring i18n的better practice
因为希望把SpringSide搞成国际化项目in就成了必做的事情

照抄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到时可以看一下

上一篇:Spring 依赖注入原理学习

下一篇:运用Jakarta Struts的七大实战心法解析