熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java開源技術 >> 正文

Spring i18n的better practice

2013-11-23 20:39:11  來源: Java開源技術 
因為希望把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裡使用
<%@ taglib uri= prefix=fmt %>
<fmt:message key=welcome/>
如果有多個Resource Bundle文件 就要在jsp裡用<ftm:bundle>定義了

 pure Java環境
    ResourceBundle rb = ResourceBundlegetBundle(messages);
    String welcome = rbgetString(welcome);

Spring的增強及appfuse的做法
   Spring增加了MessageSource的概念一是ApplicationContext將充當一個單例的角色不再需要每次使用i時都初始化一次ResourceBundle二是可以代表多個Resource Bundle

   在ApplicationContext的定義文件中增加如下節點 
   <bean id=messageSource class=orgntextsupportResourceBundleMessageSource>
        <property name=basename value=messages/>
    </bean>
   則在pure java環境中  contextgetMessage(welcome null LocaleCHINA)

  而在jsp環境中Controller調用JSTL viewResolver再調用Jsp時<fmt:message>將繼續發揮它的功效

  因此appfuse等sample都是在appfuseservletxml 中定義一個<messageSource>

Better Practice
 要不要定義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沒有在pure Java代碼中使用in也就沒有考慮這個問題

 堅決不用雞肋級<spring:message> tag
      連appfuse也不用它可見多麼雞肋因為fmt在找不到資源時最多顯示???welcome???而<spring:message>則會拋出異常誰會喜歡這種定時炸彈阿

 有趣的theme 解決做成圖片的文字的國際化
       theme也就是把message的原理發揮了一下讓不同語言的美術字圖片的路徑也可以定義在theme_zh_CNproperties和theme_en_USproperties中終於有一個不那麼雞肋的spring tag了

簡單歸納

 jstl中仍然使用標准的<ftm:message>及其定義?

java中使用spring的<messageSource>實現單例

用<spring:theme>解決那些做成圖片的文字的國際化問題

Spring 還有sessioncookie locale resolver 到時可以看一下

From:http://tw.wingwit.com/Article/program/Java/ky/201311/28843.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.