天天看點

bboss國際化功能簡介

   借助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/i18n

1.國際化屬性配置檔案管理元件

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.jsp

mvc國際化配置檔案路徑預設為

/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則屏蔽熱加載機制,開發環境請開啟,生産環境請關閉。