使用Java怎么實現(xiàn)國際化

本篇文章給大家分享的是有關(guān)使用Java怎么實現(xiàn)國際化,小編覺得挺實用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

十多年的長陽網(wǎng)站建設(shè)經(jīng)驗,針對設(shè)計、前端、開發(fā)、售后、文案、推廣等六對一服務(wù),響應(yīng)快,48小時及時工作處理。成都營銷網(wǎng)站建設(shè)的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動調(diào)整長陽建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計,從而大程度地提升瀏覽體驗。創(chuàng)新互聯(lián)公司從事“長陽網(wǎng)站設(shè)計”,“長陽網(wǎng)站推廣”以來,每個客戶項目都認(rèn)真落實執(zhí)行。

基礎(chǔ)知識

“國際化信息”也稱為“本地化信息”,一般需要兩個條件才可以確定一個特定類型的本地化信息,它們分別是“語言類型”和“國家/地區(qū)的類型”。如中文本地化信息既有中國大陸地區(qū)的中文,又有中國臺灣、中國香港地區(qū)的中文,還有新加坡地區(qū)的中文。Java通過java.util.Locale類表示一個本地化對象,它允許通過語言參數(shù)和國家/地區(qū)參數(shù)創(chuàng)建一個確定的本地化對象。
語言參數(shù)使用ISO標(biāo)準(zhǔn)語言代碼表示,這些代碼是由ISO-639標(biāo)準(zhǔn)定義的,每一種語言由兩個小寫字母表示。
國家/地區(qū)參數(shù)也由標(biāo)準(zhǔn)的ISO國家/地區(qū)代碼表示,這些代碼是由ISO-3166標(biāo)準(zhǔn)定義的,每個國家/地區(qū)由兩個大寫字母表示。     

表5-2給出了一些語言和國家/地區(qū)的標(biāo)準(zhǔn)代碼:

使用Java怎么實現(xiàn)國際化

java.util.Locale是表示語言和國家/地區(qū)信息的本地化類,它是創(chuàng)建國際化應(yīng)用的基礎(chǔ)。下面給出幾個創(chuàng)建本地化對象的示例:

//①帶有語言和國家/地區(qū)信息的本地化對象 
Locale locale1 = new Locale("zh","CN");   
//②只有語言信息的本地化對象 
Locale locale2 = new Locale("zh");  
//③等同于Locale("zh","CN") 
Locale locale3 = Locale.CHINA;   
//④等同于Locale("zh") 
Locale locale4 = Locale.CHINESE;   
//⑤獲取本地系統(tǒng)默認(rèn)的本地化對象 
Locale locale 5= Locale.getDefault();

用戶既可以同時指定語言和國家/地區(qū)參數(shù)定義一個本地化對象①,也可以僅通過語言參數(shù)定義一個泛本地化對象②。Locale類中通過靜態(tài)常量定義了一些常用的本地化對象,③和④處就直接通過引用常量返回本地化對象。此外,用戶還可以獲取系統(tǒng)默認(rèn)的本地化對象,如⑤所示。
在測試時,如果希望改變系統(tǒng)默認(rèn)的本地化設(shè)置,可以在啟動JVM時通過命令參數(shù)指定:java -Duser.language=en -Duser.region=US MyTest。

本地化工具類

JDK的java.util包中提供了幾個支持本地化的格式化操作工具類:NumberFormat、DateFormat、MessageFormat。下面,我們分別通過實例了解它們的用法:
NumberFormat:

Locale locale = new Locale("zh", "CN"); 
NumberFormat currFmt = NumberFormat.getCurrencyInstance(locale); 
double amt = 123456.78; 
System.out.println(currFmt.format(amt));

上面的實例通過NumberFormat按本地化的方式對貨幣金額進(jìn)行格式化操作,運行實例,輸出以下信息:

¥123,456.78 

代碼清單5-14  DateFormat 

Locale locale = new Locale("en", "US"); 
Date date = new Date(); 
DateFormat df = DateFormat.getDateInstance(DateFormat.MEDIUM, locale); 
System.out.println(df.format(date));

通過DateFormat#getDateInstance(int style,Locale locale)方法按本地化的方式對日期進(jìn)行格式化操作。該方法第一個入?yún)闀r間樣式,第二個入?yún)楸镜鼗瘜ο蟆_\行以上代碼,輸出以下信息:

Jan 8, 2007 

MessageFormat在NumberFormat和DateFormat的基礎(chǔ)上提供了強(qiáng)大的占位符字符串的格式化功能,它支持時間、貨幣、數(shù)字以及對象屬性的格式化操作。下面的實例演示了一些常見的格式化功能:

代碼清單5-15  MessageFormat 

//①信息格式化串 
String pattern1 = "{0},你好!你于 {1} 在工商銀行存入 {2} 元。"; 
String pattern2 = "At {1,time,short} On {1,date,long},{0} paid {2,number, currency}."; 
 
//②用于動態(tài)替換占位符的參數(shù) 
Object[] params = {"John", new GregorianCalendar().getTime(), 1.0E3}; 
 
//③使用默認(rèn)本地化對象格式化信息 
String msg1 = MessageFormat.format(pattern1, params); 
 
//④使用指定的本地化對象格式化信息 
MessageFormat mf = new MessageFormat(pattern2, Locale.US); 
String msg2 = mf.format(params); 
System.out.println(msg1); 
System.out.println(msg2);

pattern1是簡單形式的格式化信息串,通過{n}占位符指定動態(tài)參數(shù)的替換位置索引,{0}表示第一個參數(shù),{1}表示第二個參數(shù),以此類推。
pattern2格式化信息串比較復(fù)雜一些,除參數(shù)位置索引外,還指定了參數(shù)的類型和樣式。從pattern2中可以看出格式化信息串的語法是很靈活的,一個參數(shù)甚至可以出現(xiàn)在兩個地方:如 {1,time,short}表示從第二個入?yún)⒅蝎@取時間部分的值,顯示為短樣式時間;而{1,date,long}表示從第二個入?yún)⒅蝎@取日期部分的值,顯示為長樣式時間。關(guān)于MessageFormat更詳細(xì)的使用方法,請參見JDK的Javadoc。
在②處,定義了用于替換格式化占位符的動態(tài)參數(shù),這里,我們使用到了JDK5.0自動裝包的語法,否則必須采用封裝類表示基本類型的參數(shù)值。
在③處,通過MessageFormat的format()方法格式化信息串。它使用了系統(tǒng)默認(rèn)的本地化對象,由于我們是中文平臺,因此默認(rèn)為Locale.CHINA。而在④處,我們顯式指定MessageFormat的本地化對象。
運行上面的代碼,輸出以下信息:

引用

John,你好!你于 14-7-7 下午11:29 在工商銀行存入 1,000 元。 
At 11:29 PM On July 7, 2014,John paid $1,000.00. 

如果應(yīng)用系統(tǒng)中某些信息需要支持國際化功能,則必須為希望支持的不同本地化類型分別提供對應(yīng)的資源文件,并以規(guī)范的方式進(jìn)行命名。國際化資源文件的命名規(guī)范規(guī)定資源名稱采用以下的方式進(jìn)行命名:

引用

<資源名>_<語言代碼>_<國家/地區(qū)代碼>.properties

其中,語言代碼和國家/地區(qū)代碼都是可選的。<資源名>.properties命名的國際化資源文件是默認(rèn)的資源文件,即某個本地化類型在系統(tǒng)中找不到對應(yīng)的資源文件,就采用這個默認(rèn)的資源文件。<資源名>_<語言代碼>.properties命名的國際化資源文件是某一語言默認(rèn)的資源文件,即某個本地化類型在系統(tǒng)中找不到精確匹配的資源文件,將采用相應(yīng)語言默認(rèn)的資源文件。
舉一個例子:假設(shè)資源名為resource,則語言為英文,國家為美國,則與其對應(yīng)的本地化資源文件命名為resource_en_US.properties。信息在資源文件以屬性名/值的方式表示:

引用

greeting.common=How are you! 
greeting.morning = Good morning! 
greeting.afternoon = Good Afternoon! 

對應(yīng)語言為中文,國家/地區(qū)為中國大陸的本地化資源文件則命名為resource_zh_ CN.properties,資源文件內(nèi)容如下:

greeting.common=\u60a8\u597d\uff01 
greeting.morning=\u65e9\u4e0a\u597d\uff01 
greeting.afternoon=\u4e0b\u5348\u597d\uff01 

本地化不同的同一資源文件,雖然屬性值各不相同,但屬性名卻是相同的,這樣應(yīng)用程序就可以通過Locale對象和屬性名精確調(diào)用到某個具體的屬性值了。

讀者可能已經(jīng)注意到,上面中文的本地化資源文件內(nèi)容采用了特殊的編碼表示中文字符,這是因為資源文件對文件內(nèi)容有嚴(yán)格的要求:只能包含ASCII字符。所以必須將非ASCII字符的內(nèi)容轉(zhuǎn)換為Unicode代碼的表示方式。如上面中文的resource_zh_CN.properties資源文件的三個屬性值分別是“您好!”、“早上好!”和“下午好!”三個中文字符串對應(yīng)的Unicode代碼串。

如果在應(yīng)用開發(fā)時,直接采用Unicode代碼編輯資源文件是很不方便的,所以,通常我們直接使用正常的方式編寫資源文件,在測試或部署時再采用工具進(jìn)行轉(zhuǎn)換。JDK在bin目錄下為我們提供了一個完成此項功能的native2ascii工具,它可以將中文字符的資源文件轉(zhuǎn)換為Unicode代碼格式的文件,命令格式如下:

引用

native2ascii [-reverse] [-encoding 編碼] [輸入文件 [輸出文件]]

resource_zh_CN.properties包含中文字符并且以UTF-8進(jìn)行編碼,假設(shè)將該資源文件放到d:\目錄下,通過下面的命令就可以將其轉(zhuǎn)換為Unicode代碼的形式:

引用

D:\>native2ascii -encoding utf-8 d:\resource_zh_CN.properties 
d:\resource_zh_CN_1.properties 

由于原資源文件采用UTF-8編碼,所以必須顯式通過-encoding指定編碼格式。

引用

通過native2ascii命令手工轉(zhuǎn)換資源文件,不但在操作上不方便,轉(zhuǎn)換后資源文件中的屬性內(nèi)容由于采用了ASCII編碼,閱讀起來也不方便。很多IDE開發(fā)工具都有屬性編輯器的插件,插件會自動將資源文件內(nèi)容轉(zhuǎn)換為ASCII形式的編碼,同時以正常的方式閱讀和編輯資源文件的內(nèi)容,這給開發(fā)和維護(hù)帶來了很大的便利。對于MyEclipse來說,使用MyEclipse Properties Editor編輯資源屬性文件;對于Intellij IDEA來說,無須安裝任何插件就自然支持資源屬性文件的這種編輯方式了。

如果應(yīng)用程序中擁有大量的本地化資源文件,直接通過傳統(tǒng)的File操作資源文件顯然太過笨拙。Java為我們提供了用于加載本地化資源文件的方便類java.util.ResourceBoundle。

ResourceBoundle為加載及訪問資源文件提供便捷的操作,下面的語句從相對于類路徑的目錄中加載一個名為resource的本地化資源文件:
ResourceBundle rb = ResourceBundle.getBundle("com/baobaotao/i18n/resource", locale) 

通過以下的代碼即可訪問資源文件的屬性值:
rb.getString("greeting.common")  

來看下面的實例:
代碼清單5-16  ResourceBoundle 

ResourceBundle rb1 = ResourceBundle.getBundle("com/baobaotao/i18n/resource", Locale.US); 
ResourceBundle rb2 = ResourceBundle.getBundle("com/baobaotao/i18n/resource", Locale.CHINA); 
System.out.println("us:"+rb1.getString("greeting.common")); 
System.out.println("cn:"+rb2.getString("greeting.common"));

rb1加載了對應(yīng)美國英語本地化的resource_en_US.properties資源文件;而rb2加載了對應(yīng)中國大陸中文的resource_zh_CN.properties資源文件。運行上面的代碼,將輸出以下信息:

引用

us:How are you! 
cn:你好! 

加載資源文件時,如果不指定本地化對象,將使用本地系統(tǒng)默認(rèn)的本地化對象。所以,在中文系統(tǒng)中,ResourceBundle.getBundle("com/baobaotao/i18n/resource")語句也將返回和代碼清單5-14中rb2相同的本地化資源。
ResourceBundle在加載資源時,如果指定的本地化資源文件不存在,它按以下順序嘗試加載其他的資源:本地系統(tǒng)默認(rèn)本地化對象對應(yīng)的資源→默認(rèn)的資源。上面的例子中,假設(shè)我們使用ResourceBundle.getBundle("com/baobaotao/i18n/resource",Locale.CANADA)加載資源,由于不存在resource_en_CA.properties資源文件,它將嘗試加載resource_zh_CN.properties的資源文件,假設(shè)resource_zh_CN.properties資源文件也不存在,它將繼續(xù)嘗試加載resource.properties的資源文件,如果這些資源都不存在,將拋出java.util.MissingResourceException異常。

在資源文件中使用格式化串

在上面的資源文件中,屬性值都是一般的字符串,它們不能結(jié)合運行時的動態(tài)參數(shù)構(gòu)造出靈活的信息,而這種需求是很常見的。要解決這個問題很簡單,只須使用帶占位符的格式化串作為資源文件的屬性值并結(jié)合使用MessageFormat就可以滿足要求了。

上面的例子中,我們僅向用戶提供一般性問候,下面我們對資源文件進(jìn)行改造,通過格式化串讓問候語更具個性化:

引用

greeting.common=How are you!{0},today is {1} 
greeting.morning = Good morning!{0},now is {1 time short} 
greeting.afternoon = Good Afternoon!{0} now is {1 date long} 

將該資源文件保存在fmt_resource_en_US.properties中,按照同樣的方式編寫對應(yīng)的中文本地化資源文件fmt_resource_zh_CN.properties。

下面,我們聯(lián)合使用ResourceBoundle和MessageFormat得到美國英文的本地化問候語:

//①加載本地化資源 
ResourceBundle rb1 =  
    ResourceBundle.getBundle("com/baobaotao/i18n/fmt_ resource",Locale.US);  
ResourceBundle rb2 =  
    ResourceBundle.getBundle("com/baobaotao/i18n/fmt_ resource",Locale.CHINA); 
Object[] params = {"John", new GregorianCalendar().getTime()}; 
 
 
String str1 = new MessageFormat(rb1.getString("greeting.common"),Locale.US).format(params); 
String str2 =new MessageFormat(rb2.getString("greeting.morning"),Locale.CHINA).format(params); 
String str3 =new MessageFormat(rb2.getString("greeting.afternoon"),Locale.CHINA).format(params); 
System.out.println(str1); 
System.out.println(str2); 
System.out.println(str3);

運行以上的代碼,將輸出以下信息:

引用

How are you!John,today is 1/9/07 4:11 PM 
早上好!John,現(xiàn)在是下午4:11 
下午好!John,現(xiàn)在是2007年1月9日 

MessageSource

Spring定義了訪問國際化信息的MessageSource接口,并提供了幾個易用的實現(xiàn)類。首先來了解一下該接口的幾個重要方法:

String getMessage(String code, Object[] args, String defaultMessage, Locale locale)

code表示國際化資源中的屬性名;args用于傳遞格式化串占位符所用的運行期參數(shù);當(dāng)在資源找不到對應(yīng)屬性名時,返回defaultMessage參數(shù)所指定的默認(rèn)信息;locale表示本地化對象;

String getMessage(String code, Object[] args, Locale locale)  throws NoSuchMessageException

與上面的方法類似,只不過在找不到資源中對應(yīng)的屬性名時,直接拋出NoSuchMessageException異常;

String getMessage(MessageSourceResolvable resolvable, Locale locale)  throws NoSuchMessageException

MessageSourceResolvable 將屬性名、參數(shù)數(shù)組以及默認(rèn)信息封裝起來,它的功能和第一個接口方法相同。

MessageSource的類結(jié)構(gòu)

MessageSource分別被HierarchicalMessageSource和ApplicationContext接口擴(kuò)展,這里我們主要看一下HierarchicalMessageSource接口的幾個實現(xiàn)類,如圖5-7所示:

使用Java怎么實現(xiàn)國際化

HierarchicalMessageSource接口添加了兩個方法,建立父子層級的MessageSource結(jié)構(gòu),類似于前面我們所介紹的HierarchicalBeanFactory。該接口的setParentMessageSource (MessageSource parent)方法用于設(shè)置父MessageSource,而getParentMessageSource()方法用于返回父MessageSource。

HierarchicalMessageSource接口最重要的兩個實現(xiàn)類是ResourceBundleMessageSource和ReloadableResourceBundleMessageSource。它們基于Java的ResourceBundle基礎(chǔ)類實現(xiàn),允許僅通過資源名加載國際化資源。ReloadableResourceBundleMessageSource提供了定時刷新功能,允許在不重啟系統(tǒng)的情況下,更新資源的信息。StaticMessageSource主要用于程序測試,它允許通過編程的方式提供國際化信息。而DelegatingMessageSource是為方便操作父MessageSource而提供的代理類。

ResourceBundleMessageSource

該實現(xiàn)類允許用戶通過beanName指定一個資源名(包括類路徑的全限定資源名),或通過beanNames指定一組資源名。在前面的代碼清單中,我們通過JDK的基礎(chǔ)類完成了本地化的操作,下面我們使用ResourceBundleMessageSource來完成相同的任務(wù)。讀者可以比較兩者的使用差別,并體會Spring所提供的國際化處理功能所帶給我們的好處:
通過ResourceBundleMessageSource配置資源

<bean id="myResource" 
class="org.springframework.context.support.ResourceBundleMessageSource"> 
 <!--①通過基名指定資源,相對于類根路徑--> 
 <property name="basenames"> 
  <list> 
   <value>com/baobaotao/i18n/fmt_resource</value> 
  </list> 
 </property> 
 </bean>

啟動Spring容器,并通過MessageSource訪問配置的國際化資源,如下代碼清單所示:

代碼清單5-19 訪問國際化消息:ResourceBundleMessageSource:

String[] configs = {"com/baobaotao/i18n/beans.xml"}; 
ApplicationContext ctx = new ClassPathXmlApplicationContext(configs); 
 
//①獲取MessageSource的Bean 
MessageSource ms = (MessageSource)ctx.getBean("myResource");  
Object[] params = {"John", new GregorianCalendar().getTime()}; 
 
//②獲取格式化的國際化信息 
String str1 = ms.getMessage("greeting.common",params,Locale.US); 
String str2 = ms.getMessage("greeting.morning",params,Locale.CHINA); 
String str3 = ms.getMessage("greeting.afternoon",params,Locale.CHINA); 
System.out.println(str1); 
System.out.println(str2); 
System.out.println(str3);

比較代碼清單中的代碼,我們發(fā)現(xiàn)最主要的區(qū)別在于我們無須再分別加載不同語言、不同國家/地區(qū)的本地化資源文件,僅僅通過資源名就可以加載整套的國際化資源文件。此外,我們無須顯式使用MessageFormat操作國際化信息,僅通過MessageSource# getMessage()方法就可以完成操作了。這段代碼的運行結(jié)果與前面的代碼的運行結(jié)果完全一樣。

ReloadableResourceBundleMessageSource

前面,我們提到該實現(xiàn)類比之于ResourceBundleMessageSource的唯一區(qū)別在于它可以定時刷新資源文件,以便在應(yīng)用程序不重啟的情況下感知資源文件的變化。很多生產(chǎn)系統(tǒng)都需要長時間持續(xù)運行,系統(tǒng)重啟會給運行帶來很大的負(fù)面影響。這時,通過該實現(xiàn)類就可以解決國際化信息更新的問題。請看下面的配置:

通過ReloadableResourceBundleMessageSource配置資源:

xml代碼

<bean id="myResource"  
lass="org.springframework.context.support.ReloadableResourceBundleMessageSource"> 
 <property name="basenames"> 
  <list> 
  <value>com/baobaotao/i18n/fmt_resource</value> 
  </list> 
 </property> 
 <!--① 刷新資源文件的周期,以秒為單位--> 
 <property name="cacheSeconds" value="5"/>  
 </bean>

在上面的配置中,我們通過cacheSeconds屬性讓ReloadableResourceBundleMessageSource每5秒鐘刷新一次資源文件(在真實的應(yīng)用中,刷新周期不能太短,否則頻繁的刷新將帶來性能上的負(fù)面影響,一般不建議小于30分鐘)。cacheSeconds默認(rèn)值為-1表示永不刷新,此時,該實現(xiàn)類的功能就蛻化為ResourceBundleMessageSource的功能。
我們編寫一個測試類對上面配置的ReloadableResourceBundleMessageSource進(jìn)行測試:

代碼清單5-21  刷新資源:ReloadableResourceBundleMessageSource 

String[] configs = {"com/baobaotao/i18n/beans.xml"}; 
ApplicationContext ctx = new ClassPathXmlApplicationContext(configs); 
 
MessageSource ms = (MessageSource)ctx.getBean("myResource"); 
Object[] params = {"John", new GregorianCalendar().getTime()}; 
 
for (int i = 0; i < 2; i++) { 
 String str1 = ms.getMessage("greeting.common",params,Locale.US);  
 System.out.println(str1); 
 Thread.currentThread().sleep(20000); //①模擬程序應(yīng)用,在此期間,我們更改資源文件  
}

在①處,我們讓程序睡眠20秒鐘,在這期間,我們將fmt_resource_zh_CN.properties資源文件的greeting.common鍵值調(diào)整為:

引用

---How are you!{0},today is {1}--- 
我們將看到兩次輸出的格式化信息分別對應(yīng)更改前后的內(nèi)容,也即本地化資源文件的調(diào)整被自動生效了:

引用

How are you!John,today is 1/9/07 4:55 PM 
---How are you!John,today is 1/9/07 4:55 PM--- 

容器級的國際化信息資源

在如圖5-7所示的MessageSource類圖結(jié)構(gòu)中,我們發(fā)現(xiàn)ApplicationContext實現(xiàn)了MessageSource的接口。也就是說ApplicationContext的實現(xiàn)類本身也是一個MessageSource對象。
將ApplicationContext和MessageSource整合起來,乍一看挺讓人費解的,Spring這樣設(shè)計的意圖究竟是什么呢?原來Spring認(rèn)為:在一般情況下,國際化信息資源應(yīng)該是容器級。我們一般不會將MessageSource作為一個Bean注入到其他的Bean中,相反MessageSource作為容器的基礎(chǔ)設(shè)施向容器中所有的Bean開放。只要我們考察一下國際化信息的實際消費場所就更能理解Spring這一設(shè)計的用意了。國際化信息一般在系統(tǒng)輸出信息時使用,如Spring MVC的頁面標(biāo)簽,控制器Controller等,不同的模塊都可能通過這些組件訪問國際化信息,因此Spring就將國際化消息作為容器的公共基礎(chǔ)設(shè)施對所有組件開放。
既然一般情況下我們不會直接通過引用MessageSource Bean使用國際信息,那如何聲明容器級的國際化信息呢?我們其實在5.1.1節(jié)講解Spring容器的內(nèi)部工作機(jī)制時已經(jīng)埋下了伏筆:在介紹容器啟動過程時,我們通過代碼清單5-1對Spring容器啟動時的步驟進(jìn)行剖析,④處的initMessageSource()方法所執(zhí)行的工作就是初始化容器中的國際化信息資源:它根據(jù)反射機(jī)制從BeanDefinitionRegistry中找出名稱為“messageSource”且類型為org.springframework.context.MessageSource的Bean,將這個Bean定義的信息資源加載為容器級的國際化信息資源。請看下面的配置:

代碼清單5-22  容器級資源的配置 

<!--①注冊資源Bean,其Bean名稱只能為messageSource --> 
<bean id="messageSource"  
  class="org.springframework.context.support.ResourceBundleMessageSource"> 
 <property name="basenames"> 
  <list> 
  <value>com/baobaotao/i18n/fmt_resource</value> 
  </list> 
 </property> 
</bean>

下面,我們通過ApplicationContext直接訪問國際化信息,如下代碼清單所示:

代碼清單5-23  通過ApplicationContext訪問國際化信息 
Java代碼 

String[] configs = {"com/baobaotao/i18n/beans.xml"}; 
ApplicationContext ctx = new ClassPathXmlApplicationContext(configs); 
//①直接通過容器訪問國際化信息 
Object[] params = {"John", new GregorianCalendar().getTime()}; 
  
String str1 = ctx.getMessage("greeting.common",params,Locale.US); 
String str2 = ctx.getMessage("greeting.morning",params,Locale.CHINA);  
System.out.println(str1); 
System.out.println(str2);

運行以上代碼,輸出以下信息:

引用

How are you!John,today is 1/9/07 5:24 PM 
早上好!John,現(xiàn)在是下午5:24 

假設(shè)MessageSource Bean名字沒有命名為“messageSource”,以上代碼將拋出NoSuchMessageException異常。

以上就是使用Java怎么實現(xiàn)國際化,小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降?。希望你能通過這篇文章學(xué)到更多知識。更多詳情敬請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

新聞名稱:使用Java怎么實現(xiàn)國際化
分享路徑:http://muchs.cn/article2/iepioc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設(shè)、動態(tài)網(wǎng)站搜索引擎優(yōu)化、移動網(wǎng)站建設(shè)微信公眾號、品牌網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都app開發(fā)公司