您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“java怎么實(shí)現(xiàn)多語言配置i18n”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“java怎么實(shí)現(xiàn)多語言配置i18n”吧!
一個(gè)資源包中的每個(gè)資源文件都必須擁有共同的基名。除了基名,每個(gè)資源文件的名稱中還必須有標(biāo)識(shí)其本地信息的附加部分。
例如:一個(gè)資源包的基名是“inspectionJsonMsg”,則與中文、英文環(huán)境相對應(yīng)的資源文件名則為: "inspectionJsonMsg_zh_CN.properties" "inspectionJsonMsg_en_US.properties"
資源文件的內(nèi)容通常采用"關(guān)鍵字=值"的形式,軟件根據(jù)關(guān)鍵字檢索值顯示在頁面上。一個(gè)資源包中的所有資源文件的關(guān)鍵字必須相同,值則為相應(yīng)國家的文字。并且資源文件中采用的是properties格式文件,所以文件中的所有字符都必須是ASCII字碼,屬性(properties)文件是不能保存中文的,對于像中文這樣的非ACSII字符,須先進(jìn)行編碼
例如:
國際化的中文環(huán)境的properties文件
國際化的英文環(huán)境的properties文件
applicationContext.xml
<!--多語言的配置 開始--> <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> <property name="basenames"> <list> <value>language/inspectionJsonMsg</value> </list> </property> <property name="defaultEncoding" value="UTF-8" /> </bean> <bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver"> <property name="cookieName" value="spmsLanguage"/> <property name="cookieMaxAge" value="94608000"/> <property name="defaultLocale" value="zh_CN" /> </bean> <!--多語言的配置 結(jié)束-->
public class InspectionConst { //設(shè)備查詢成功 public static final String INSPECTION_DEVICE_QUERY_SUCCESS = "ny.spms.java.inspection.device.query.success"; //設(shè)備查詢失敗 public static final String INSPECTION_DEVICE_QUERY_ERROR = "ny.spms.java.inspection.device.query.error"; }
package com.hikvision.energy.util.i18n; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.MessageSource; import org.springframework.context.MessageSourceResolvable; import org.springframework.context.i18n.LocaleContextHolder; import com.hikvision.energy.core.util.AppContext; import java.util.Locale; /** * 多語言查詢value工具類 * * @author wanjiadong * @date 2017-11-6 * */ public class I18nUtil { private static MessageSource messageSource; private final static Logger log = LoggerFactory.getLogger(I18nUtil.class); static { messageSource = AppContext.getBean("messageSource"); } /** * 根據(jù)CODE查詢,默認(rèn)無通配參數(shù),Local跟隨當(dāng)前cookie * @Author: wanjiadong * @Description: * @Date: 2017-11-6 * @param: code */ public static String getMessage(String code){ return getMessage(code,null,getLocal()); } public static String getMessage(String code,Locale locale){ return getMessage(code,null,locale); } /** * 根據(jù)CODE查詢,自定義默認(rèn)值,默認(rèn)無通配參數(shù),Local跟隨當(dāng)前cookie * @Author: wanjiadong * @Description: * @Date: 2017-11-6 * @param: code */ public static String getMessage(String code,String defaultMessage){ return getMessage(code,null,defaultMessage,getLocal()); } /** * 根據(jù)CODE和args查詢,Local跟隨當(dāng)前cookie * @Author: wanjiadong * @Description: * @Date: 2017-11-6 * @param: code * @param: args 通配符的參數(shù) */ public static String getMessage(String code,Object[] args){ return getMessage(code,args,getLocal()); } public static String getMessage(String code,Object[] args,String defaultMessage,Locale locale){ return messageSource.getMessage(code,args,defaultMessage,locale); } public static String getMessage(String code, Object[] args, Locale locale){ try{ return messageSource.getMessage(code,args,locale); }catch (Exception e){ log.error("Query message value by key[{}] error. The reason is:"+e.getMessage(),code); return null; } } public static String getMessage(MessageSourceResolvable resolvable, Locale locale){ try{ return messageSource.getMessage(resolvable,locale); }catch (Exception e){ log.error("Query message value error. The reason is:"+e.getMessage()); return null; } } //解析用戶區(qū)域 public static Locale getLocal() { return LocaleContextHolder.getLocale(); } }
I18nUtil.getMessage(InspectionConst.TEMPORARY_JOB_OVER_BEGIN_TIME, new Object[]{InspectionConst.TEMPORARA_TIME})
或
I18nUtil.getMessage(InspectionConst.INSPECTION_TEMPORARY_JOB_ADD_SUCCESS)
i18n(其來源是英文單詞internationalization的首末字符i和n,18為中間的字符數(shù))是“國際化”的簡稱。對程序來說,在不修改內(nèi)部代碼的情況下,能根據(jù)不同語言及地區(qū)顯示相應(yīng)的界面。
這就要求,僅僅是頁面語言的翻譯是不夠的,即便在一個(gè)國家在不同地區(qū)都可能會(huì)存在不同習(xí)慣方言操作習(xí)慣等等(例如我們國家搜索結(jié)果習(xí)慣左對齊,但是有的國家就習(xí)慣右對齊),這就導(dǎo)致了“本地化”(L10n)機(jī)制的出現(xiàn)。
國際化和本地化的出現(xiàn),在語言、文化、書寫習(xí)慣、閱讀習(xí)慣、符合當(dāng)?shù)刂黝}的全面配置,使得一個(gè)Web應(yīng)用程序在運(yùn)行時(shí)能夠根據(jù)客戶端請求所來自的國家和語言顯示不同的用戶界面。
根據(jù)以上簡介和查看的具體軟件的配置,理解一下i18n吧,所以小編查看了一下QQ的i18n配置文件,如下:
<?xml version="1.0" encoding="utf-8" ?> <i18n> <!-- 默認(rèn)的語言,以主程序的優(yōu)?--> <locale id="2052" /> <!-- 語言文字列表 --> <StringBundle> <configfile name="GFStringBundle.xml"/> <configfile name="StringBundle.xml"/> <configfile name="UrlBundle.xml"/> </StringBundle> <!-- 地區(qū)信息,目前只需要一?--> <Location2> <configfile name="LocList.xml"/> </Location2> <LangList> <configfile name="LangList.xml"/> </LangList> </i18n>
又查看了一下要讀取的LangList.xml文件,很壯觀,如下:
<?xml version="1.0" encoding="utf-8"?> <Languages> <Language LCID="1078" Name="南非荷蘭語" Code="af"/> <Language LCID="1052" Name="阿爾巴尼亞語" Code="sq"/> <Language LCID="1025" Name="阿拉伯語" Code="ar"/> <Language LCID="1067" Name="亞美尼亞語" Code="hy"/> <Language LCID="2092" Name="阿塞拜疆語" Code="az"/> <Language LCID="1059" Name="白俄羅斯語" Code="be"/> <Language LCID="5146" Name="波斯尼亞語" Code="bs-ba"/> <Language LCID="1026" Name="保加利亞語" Code="bg"/> <Language LCID="1109" Name="緬甸語" Code="my"/> <Language LCID="3076" Name="中文(繁體)" Code="zh-hk"/> <Language LCID="1027" Name="加泰羅尼亞語" Code="ca"/> <Language LCID="1050" Name="克羅地亞語" Code="hr"/> <Language LCID="1029" Name="捷克語" Code="cs"/> <Language LCID="1030" Name="丹麥語" Code="da"/> <Language LCID="1043" Name="荷蘭語" Code="nl"/> <Language LCID="1033" Name="英語" Code="en-us"/> <Language LCID="1061" Name="愛沙尼亞語" Code="et"/> <Language LCID="1065" Name="波斯語" Code="fa"/> <Language LCID="1035" Name="芬蘭語" Code="fi"/> <Language LCID="1036" Name="法語" Code="fr"/> <Language LCID="2108" Name="蓋爾語" Code="gd"/> <Language LCID="1031" Name="德語" Code="de"/> <Language LCID="1032" Name="希臘語" Code="el"/> <Language LCID="1095" Name="古吉拉特語" Code="gu"/> <Language LCID="1037" Name="希伯來語" Code="he"/> <Language LCID="1081" Name="印地語" Code="hi"/> <Language LCID="1038" Name="匈牙利語" Code="hu"/> <Language LCID="1039" Name="冰島語" Code="is"/> <Language LCID="1057" Name="印度尼西亞語" Code="id"/> <Language LCID="1040" Name="意大利語" Code="it"/> <Language LCID="1041" Name="日語" Code="ja"/> <Language LCID="1107" Name="高棉語" Code="km"/> <Language LCID="1042" Name="朝鮮語" Code="ko"/> <Language LCID="1108" Name="老撾語" Code="lo"/> <Language LCID="1062" Name="拉脫維亞語" Code="lv"/> <Language LCID="1063" Name="立陶宛語" Code="lt"/> <Language LCID="1071" Name="馬其頓語" Code="mk"/> <Language LCID="1086" Name="馬來西亞語" Code="ms"/> <Language LCID="2052" Name="中文(簡體)" Code="zh-cn"/> <Language LCID="1104" Name="蒙古語" Code="mn"/> <Language LCID="1044" Name="挪威語" Code="no"/> <Language LCID="1045" Name="波蘭語" Code="pl"/> <Language LCID="2070" Name="葡萄牙語" Code="pt"/> <Language LCID="1094" Name="旁遮普語" Code="pa"/> <Language LCID="1048" Name="羅馬尼亞語" Code="ro"/> <Language LCID="1049" Name="俄語" Code="ru"/> <Language LCID="3098" Name="塞爾維亞語" Code="sr"/> <Language LCID="1113" Name="信德語" Code="sd"/> <Language LCID="1051" Name="斯洛伐克語" Code="sk"/> <Language LCID="1060" Name="斯洛文尼亞語" Code="sl"/> <Language LCID="1143" Name="索馬里語" Code="so"/> <Language LCID="1034" Name="西班牙語" Code="es"/> <Language LCID="1089" Name="斯瓦西里語" Code="sw"/> <Language LCID="1053" Name="瑞典語" Code="sv"/> <Language LCID="1097" Name="泰米爾語" Code="ta"/> <Language LCID="1092" Name="韃靼語" Code="tt"/> <Language LCID="1054" Name="泰語" Code="th"/> <Language LCID="1055" Name="土耳其語" Code="tr"/> <Language LCID="1058" Name="烏克蘭語" Code="uk"/> <Language LCID="1056" Name="烏爾都語" Code="ur"/> <Language LCID="1066" Name="越南語" Code="vi"/> <Language LCID="1106" Name="威爾士語" Code="cy-gb"/> <Language LCID="1085" Name="意第緒語" Code="yi"/> <Language LCID="1130" Name="約魯巴語" Code="yo"/> </Languages>
Java.Util中有一個(gè)locale方法,該方法的其中一個(gè)構(gòu)造方法為:
Locale(Stringlanguage,String country):根據(jù)語言和國家構(gòu)造一個(gè)語言環(huán)境。每個(gè)國家都有一個(gè)locale信息,通過對象可以取得locale信息,locale信息來源于操作系統(tǒng)。如下:
package com.bjpowernode.i18n; import java.util.Locale; public class I18nSample { public static void main(String[] args) { Locale defaultLocale = Locale.getDefault(); System.out.println("country=" + defaultLocale.getCountry()); System.out.println("language=" + defaultLocale.getLanguage()); } }
運(yùn)行結(jié)果為:
country=CN
language=zh
但是在我們下面的實(shí)踐中,為了方便我們就直接進(jìn)行設(shè)置了。
我們需要將硬編碼文本轉(zhuǎn)移到外部的資源文件,對資源文件的命名必須使用一定的規(guī)則,一般是以“統(tǒng)一字符+locale信息”命名,如MessagesBundle_zh_CN.properties,MessagesBundle_en_US.properties。準(zhǔn)備資源包的過程,就是把對應(yīng)不同語言的用戶所涉及的文本和圖片保存在多個(gè)文本文件中,客戶端根據(jù)不同的環(huán)境需要進(jìn)行更換。這些文件被稱為“屬性文件”,所有屬性文件合在一起被稱為資源包(ResourceBundle)。
因?yàn)橘Y源文件必須是Latin-1后者Unicode編碼的字符,所以實(shí)踐過程中,準(zhǔn)備英文好說,準(zhǔn)備中文的話,需要使用相應(yīng)的Unicode編碼,使用jdk自帶的native2ascii.exe,將中文資源文件進(jìn)行轉(zhuǎn)換,如下:
如下:
也可以直接在資源文件中添加,會(huì)自動(dòng)轉(zhuǎn)換成Unicode編碼,如下:
結(jié)果如下:
Demo中我們中文和英文準(zhǔn)備的都是:k1=你好/hello,k2=再見/goodbye。
package com.bjpowernode.i18n; import java.text.MessageFormat; import java.util.Locale; import java.util.ResourceBundle; public class I18nSample { public static void main(String[] args) { // 為了實(shí)驗(yàn),就不每次都修改操作系統(tǒng)的語言了,直接設(shè)置locale信息 // Locale currentLocale = new Locale("zh", "CN"); Locale currentLocale = new Locale("en", "US"); System.out.println("country=" + currentLocale.getCountry()); System.out.println("language=" + currentLocale.getLanguage()); // 根據(jù)locale信息尋找相應(yīng)的資源包中的配置 ResourceBundle rb = ResourceBundle.getBundle( "com.bjpowernode.resources.MessagesBundle", currentLocale); System.out.println(rb.getString("k1")); System.out.println(rb.getString("k2")); // 在配置文件中用占位符來加入自定義設(shè)置,如登陸時(shí)顯示:你好,*** MessageFormat mf = new MessageFormat(rb.getString("k1")); System.out.println(mf.format(new Object[] { "張三" })); } }
運(yùn)行結(jié)果為:
country=US
language=en
hello,{0}
good bye
hello,張三
到此,相信大家對“java怎么實(shí)現(xiàn)多語言配置i18n”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。