借助bboss國際化功能,我們可以非常友善快捷地實作系統的國際化功能,本文簡單介紹
bboss國際化元件和相關标簽在mvc架構、ioc架構、獨立元件三種場景中的典型使用方
法,bboss還提供了國際化配置檔案熱加載的機制。
bboss最新源碼可以從github擷取:
https://github.com/bbossgroups/bbossgroups-3.5 bboss國際化簡單的web示例工程: https://github.com/bbossgroups/bbossgroups-3.5/tree/master/bestpractice/i18n1.國際化屬性配置檔案管理元件
org.frameworkset.spi.support.HotDeployResourceBundleMessageSource
2.獨立元件使用模式
2.1 HotDeployResourceBundleMessageSource的獨立使用方法
HotDeployResourceBundleMessageSource messagesource = new HotDeployResourceBundleMessageSource( );
//如果有多個配置檔案,可以在數組中追加,注意屬性檔案名不需要帶語言資訊和檔案字尾
//HotDeployResourceBundleMessageSource會自動掃描并加載對應語言的屬性檔案,後文同理。
messagesource.setBasenames(new String[] {"org/frameworkset/spi/support/messages"});
//如果沒有找到代碼對應的配置項,直接輸出code
messagesource.setUseCodeAsDefaultMessage(true);
System.out.println(messagesource.getMessage("probe.jsp.generic.abbreviations", Locale.US));
System.out.println(messagesource.getMessage("probe.jsp.generic.abbreviations", Locale.US));
2.2 是否需要對HotDeployResourceBundleMessageSource執行個體管理的資源檔案啟用熱加載機制
通過屬性來控制:
private boolean changemonitor = true;
true 啟用
false 關閉
預設啟用
設定changemonitor屬性值的方法為:
messagesource.setChangemonitor(false);
2.3 通過ioc容器來管理獨立的messagesource對象的方法
<property name="messageSource" class="org.frameworkset.spi.support.HotDeployResourceBundleMessageSource" >
<property name="basename" value="/WEB-INF/messages"/>
<property name="useCodeAsDefaultMessage" value="true"/>
</property>
DefaultApplicationContext context = DefaultApplicationContext.getApplicationContext("org/frameworkset/spi/support/messages.xml");
MessageSource messagesource = context.getTBeanObject("messageSource",MessageSource.class);
3.ioc容器的國際化機制
每個ioc容器預設自帶一個MessageSource對象,對應的國際化資源配置檔案和ioc元件配置必須在同一個包路徑下:
//ioc元件配置檔案
/bbossaop/test/org/frameworkset/spi/support/messages.xml
//ioc容器對應的國際化屬性檔案
/bbossaop/test/org/frameworkset/spi/support/messages_zh_CN.properties
/bbossaop/test/org/frameworkset/spi/support/messages_en_US.properties
而且名稱必須是messages,相應的語言資訊部分為_en_US.properties
使用的執行個體為:
DefaultApplicationContext context = DefaultApplicationContext.getApplicationContext("org/frameworkset/spi/support/messages.xml");
System.out.println(context.getMessage("Trans.Log.TransformationIsToAllocateStep", new Object[]{"a","b"}, (Locale)null));
System.out.println(context.getMessage("Trans.Log.TransformationIsToAllocateStep", new Object[]{"a","b"}, Locale.SIMPLIFIED_CHINESE));
System.out.println(context.getMessage("StepLoader.RuntimeError.UnableToInstantiateClass.TRANS0006",Locale.US));
Resource resource = context.getResource("org/frameworkset/spi/support/messages");
System.out.println(resource);
這裡我們看到:
context.getMessage("Trans.Log.TransformationIsToAllocateStep", new Object[]{"a","b"}, Locale.SIMPLIFIED_CHINESE);
第二個參數是一個對象數組,含義是代碼Trans.Log.TransformationIsToAllocateStep代表的真實輸出資訊中包含兩個需要被替換的變量占位符{0}和{1},定義如下:
Trans.Log.TransformationIsToAllocateStep=\ 轉換大約配置設定了 步驟 [{0}] 類型的 [{1}]
國際化元件解析Trans.Log.TransformationIsToAllocateStep時,會将數組new Object[]{"a","b"}第一個元素替換{0},第二個元素替換{1},最終輸出為:
轉換大約配置設定了 步驟 [a] 類型的 [b]
4. mvc架構國際化功能
mvc架構國際化功能涉及四個local解析器:
org.frameworkset.web.servlet.i18n.AcceptHeaderLocaleResolver
org.frameworkset.web.servlet.i18n.SessionLocalResolver
org.frameworkset.web.servlet.i18n.CookieLocaleResolver
org.frameworkset.web.servlet.i18n.LanguageLocaleResolver
org.frameworkset.web.servlet.i18n.AcceptHeaderLocaleResolver是預設的locale解析器,根據用戶端浏覽器request對象中的Locale來解析相應的code。
org.frameworkset.web.servlet.i18n.LanguageLocaleResolver是一個通過配置方式直接全局指定locale對象的解析器,使用方法如下:
<property name="localeResolver" class="org.frameworkset.web.servlet.i18n.LanguageLocaleResolver" f:language="en_US"/>
通過language屬性指定全局語言代碼,就無需在程式中通過代碼指定本地語言了,LanguageLocaleResolver對不需要在界面中切換語言的系統特别有用。
org.frameworkset.web.servlet.i18n.SessionLocalResolver類,從session中擷取使用者登入時存儲的Locale對象,預設的key值為字元串:
org.frameworkset.web.servlet.i18n.SESSION_LOCAL_KEY
session中設定Locale對象的方法:
session.setAttribute(SessionLocalResolver.SESSION_LOCAL_KEY, java.util.Locale.US);
或者
session.setAttribute("org.frameworkset.web.servlet.i18n.SESSION_LOCAL_KEY", java.util.Locale.US);
如果使用者需要使用SessionLocalResolver必須在bboss-mvc.xml檔案中增加以下配置:
<property name="localeResolver" class="org.frameworkset.web.servlet.i18n.SessionLocalResolver"/>
以便覆寫預設的LocalResolver元件org.frameworkset.web.servlet.i18n.AcceptHeaderLocaleResolver(預設根據用戶端所處的Locale來解析相應的code)
調整session中存放Locale對象的key值的方法:
<property name="localeResolver" class="org.frameworkset.web.servlet.i18n.SessionLocalResolver"
f:sessionlocalkey="yoursessionlocalkey"
/>
session中設定Locale對象的方法變為:
session.setAttribute("yoursessionlocalkey", java.util.Locale.US);
cookie中配置Local對象方法:
首先将bboss-mvc.xml中localeResolver元件做如下配置:
<property name="localeResolver" class="org.frameworkset.web.servlet.i18n.CookieLocaleResolver"
f:cookielocalkey="cookie.localkey"
/>
然後在jsp登入界面或者控制器方法中将語言代碼設定到名稱為cookie.localkey的cookie中即可:
com.frameworkset.util.StringUtil.addCookieValue(request, response, "cookie.localkey", language, 3600 * 24);
其中的language就是語言代碼,例如:zh_CN,en_US等等,3600 * 24為cookie的有效期。
相應的從cookie中擷取language的方法為:
language = com.frameworkset.util.StringUtil.StringUtil.getCookieValue(request, "cookie.localkey", "zh_CN");
"zh_CN"辨別預設值,沒有"cookie.localkey"的cookie時傳回該值。
上面說明的是每個localresolver元件單獨設定locale語言環境的方法,比較繁瑣,下面是bboss提供的通用設定和擷取語言代碼的方法:
擷取設定到特定元件中的language代碼:
String language = org.frameworkset.web.servlet.support.RequestContextUtils.getLocaleResolver(request).resolveLocaleCode(request);
通用的設定語言代碼:
try {
String language = "zh_CN"; org.frameworkset.web.servlet.support.RequestContextUtils.getLocaleResolver(request).setLocale(request, response, language);
} catch (Exception e) {
log.error("",e);
}
另外包含一個message标簽,通過message标簽,可以在系統界面上友善實作國際化功能。
國際化标簽的使用方式
<pg:message code="probe.jsp.wrongparams"/>
使用國際化标簽時,必須在jsp的頭部導入标簽定義檔案:
<%@ taglib uri="/WEB-INF/pager-taglib.tld" prefix="pg"%>
mvc國際化元件messageSource的擷取方法:
org.frameworkset.spi.support.MessageSource messageSource = org.frameworkset.web.servlet.support.WebApplicationContextUtils.getWebApplicationContext();
詳情請參考測試jsp頁面:
/bboss-mvc/WebRoot/jsp/i18n.jsp bestpractice\i18n\WebRoot\examples\i18n.jspmvc國際化配置檔案路徑預設為
/bboss-mvc/WebRoot/WEB-INF/messages.properties
/bboss-mvc/WebRoot/WEB-INF/messages_zh_CN.properties
/bboss-mvc/WebRoot/WEB-INF/messages_en_US.properties
等等。
在web.xml檔案的DispatchServlet中進行配置:
<init-param>
<param-name>messagesources</param-name>
<param-value>/WEB-INF/messages,/WEB-INF/messages1</param-value>
</init-param>
<init-param>
<param-name>useCodeAsDefaultMessage</param-name>
<param-value>true</param-value>
</init-param>
messagesources用來指定國際化配置檔案清單
useCodeAsDefaultMessage用來指定如果沒有在相應的配置檔案中找到相應的code對應的配置項是否直接輸出code,預設值為true
為true時輸出,false不輸出
完整的配置如下:
<servlet>
<servlet-name>mvcdispather</servlet-name>
<servlet-class>org.frameworkset.web.servlet.DispatchServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/bboss-*.xml,/WEB-INF/conf/bboss-*.xml</param-value>
</init-param>
<init-param>
<param-name>messagesources</param-name>
<param-value>/WEB-INF/messages,/WEB-INF/messages1</param-value>
</init-param>
<init-param>
<param-name>useCodeAsDefaultMessage</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>0</load-on-startup>
</servlet>
這裡不需要帶國家辨別,系統會自動在/WEB-INF/目錄下查找對應國家語言的配置檔案,如果有多個配置檔案可以用逗号分割,例如:
/WEB-INF/messages,/WEB-INF/messages1,/WEB-INF/messages2
另外為了便于業務系統在java程式中擷取mvc國際化資訊,提供了一個工具類其中定義了一組靜态方法:
org.frameworkset.util.I18NUtil
public static void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale)
/**
* Set the current locale to the given one.
* @param request the request to be used for locale modification
* @param response the response to be used for locale modification
* @param locale the new locale, or <code>null</code> to clear the locale
* @throws UnsupportedOperationException if the LocaleResolver implementation
* does not support dynamic changing of the theme
*/
public static void setLocale(HttpServletRequest request, HttpServletResponse response, String locale)
public static Locale getRequestContextLocal(HttpServletRequest request)
public static String getRequestContextLocalCode(HttpServletRequest request)
/**
* 根據code從mvc的國際化配置檔案中擷取對應語言的代碼值
* @param code
* @param request
* @return
*/
public static String getI18nMessage(String code,HttpServletRequest request)
/**
* 根據code從mvc的國際化配置檔案中擷取對應語言的代碼值,如果代碼值為空,則傳回defaultMessage
* @param code
* @param defaultMessage
* @param request
* @return
*/
public static String getI18nMessage(String code,String defaultMessage,HttpServletRequest request)
/**
* 根據code從mvc的國際化配置檔案中擷取對應語言的代碼值,如果代碼值為空,則傳回defaultMessage
* @param code
* @param defaultMessage
* @param request
* @return
*/
public static String getI18nMessage(String code,String defaultMessage)
/**
* 根據code從mvc的國際化配置檔案中擷取對應語言的代碼值,如果代碼值為空,則傳回defaultMessage
* @param code
* @param defaultMessage
* @param request
* @return
*/
public static String getI18nMessage(String code)
/**
* 根據code從mvc的國際化配置檔案中擷取對應語言的代碼值,并且将數組args中的每個元素替換到代碼值中位置占位符,例如{0}會用數組的第一個元素替換
* @param code
* @param args
* @param request
* @return
*/
public static String getI18nMessage(String code,Object[] args,HttpServletRequest request)
public static String getI18nMessage(String code,Object[] args)
public static String getI18nMessage(String code,Object[] args,String defaultMessage)
/**
* 根據code從mvc的國際化配置檔案中擷取對應語言的代碼值,如果代碼值為空,則傳回defaultMessage,并且将數組args中的每個元素替換到代碼值中位置占位符,例如{0}會用數組的第一個元素替換
* @param code
* @param args
* @param defaultMessage
* @param request
* @return
*/
public static String getI18nMessage(String code,Object[] args,String defaultMessage,HttpServletRequest request)
5.國際化配置檔案熱加載機制配置
bboss提供了簡單實用的國際化屬性檔案熱加載機制,可以友善地開啟和關閉。
檢測檔案是否改動的時間間隔預設5秒,如果有改動mvc架構會重新加載有修改的檔案,沒有修改的檔案不會重新加載
如果想屏蔽改機制請修改bboss-aop.jar/aop.properties檔案的選項
#國際化屬性檔案變更檢測時間間隔,機關為毫秒,預設為5秒間隔
resourcefile.refresh_interval=5000
若果>0則啟用熱加載機制,<=0則屏蔽熱加載機制,開發環境請開啟,生産環境請關閉。