Java中如何实现程序国际化 如何实现JSP的国际化?

\u5982\u4f55\u5b9e\u73b0android\u56fd\u9645\u5316

\u53ea\u8981\u5728 res \u6587\u4ef6\u5939\u4e0b\u65b0\u5efa\u5bf9\u5e94\u8bed\u8a00\u7684 values \u6587\u4ef6\u5939\u5c31\u597d\u4e86\uff0c
\u5982\uff0c\u82f1\u8bed\u73af\u5883\u4e0b\u7684\uff0c\u6587\u4ef6\u5939\u547d\u540d\u4e3a\uff1avalues-en
\u7f8e\u56fd\u82f1\u6587\u73af\u5883\uff1avalues-en-rUS
\u4e2d\u6587\u73af\u5883\u4e3a\uff1avalues-zh
\u5927\u9646\u5730\u533a\u4e2d\u6587\u73af\u5883\uff1a
\u5728 eclipse \u4e0b\u65b0\u5efa Android \u9879\u76ee\u65f6\uff0c\u4f1a\u5728 res \u76ee\u5f55\u4e0b\u81ea\u52a8\u521b\u5efa\u4e00\u4e2a\u9ed8\u8ba4\u8bed\u8a00\u73af\u5883\u7684\u6587\u4ef6\u5939 : values
\u5f53\u67d0\u4e00\u4e2a\u8d44\u6e90\u6ca1\u6709\u5728\u8bed\u8a00\u73af\u5883\u7684\u5bf9\u5e94\u7684\u8d44\u6e90\u96c6\u5408\u4e2d\u627e\u5230\u65f6\uff0c\u5c31\u4f1a\u4f7f\u7528 values \u4e0b\u7684\u8d44\u6e90\u3002
\u82e5\u67d0\u4e00\u4e2a\u8bed\u8a00\u73af\u5883\u6ca1\u6709\u5728\u9879\u76ee\u4e2d\u5b9a\u4e49\u8bed\u8a00\u73af\u5883\uff0c\u90a3\u4e48\u4e5f\u4f1a\u4f7f\u7528 values \u4e0b\u7684\u8d44\u6e90\u3002
\u56fe\u7247\u56fd\u9645\u5316\u540c\u7406\u3002
\u5728 res \u4e0b\u65b0\u5efa drawable-zh \u6587\u4ef6\u5939\uff0c\u5b58\u653e\u4e2d\u6587\u73af\u5883\u4e0b\u7684\u56fe\u7247
\u65b0\u5efa drawable-en \u4f5c\u4e3a\u82f1\u8bed\u73af\u5883\u4e0b\u7684\u56fe\u7247
\u5728 eclipse \u4e0b\u65b0\u5efa Android \u9879\u76ee\u65f6\uff0c\u4f1a\u5728 res \u76ee\u5f55\u4e0b\u81ea\u52a8\u521b\u5efa\u4e09\u4e2a\u9ed8\u8ba4\u8bed\u8a00\u73af\u5883\u7684\u6587\u4ef6\u5939\uff1a
drawable-hdpi
drawable-ldpi
drawable-mdpi
\u5206\u522b\u7528\u4e8e\u5b58\u653e\u9ad8\u3001\u4e2d\u3002\u4f4e\u5206\u8fa8\u7387\u7684\u56fe\u7247\u3002Android \u7cfb\u7edf\u4f1a\u6839\u636e\u624b\u673a\u7684\u5206\u8fa8\u7387\uff0c\u800c\u81ea\u52a8\u4ece\u4e0d\u540c\u7684\u5bf9\u5e94\u7684\u67d0\u4e00\u4e2a\u6587\u4ef6\u5939\u4e0b\u53bb\u52a0\u8f7d\u56fe\u7247\u3002
\u540c\u6837\uff0c\u5b83\u4eec\u4e5f\u53ef\u4ee5\u56fd\u9645\u5316\uff0c\u547d\u540d\u89c4\u5219\u5982\uff1a
drawable-zh-hdpi
drawable-en-ldpi
drawable-en-rUS-mdpi
\u4f7f\u7528\uff0c\u5728 XML \u4e2d\u9700\u8981\u4f7f\u7528\u5230\u56fe\u7247\u7684\u5730\u65b9\u7528\u8868\u8fbe\u5f0f\uff1a @drawable/icon
\u4ee3\u7801\u4e2d\u4f7f\u7528\uff1aR.drawable.icon\u3002\u56e0\u4e3a\u56fe\u7247\u8d44\u6e90\u540c\u6837\u4e5f\u4f1a\u5728 R \u6587\u4ef6\u4e2d\u751f\u6210\u4e00\u4e2a\u7d22\u5f15

1\u3001\u9996\u5148\u6211\u4eec\u8981\u51c6\u5907\u8d44\u6e90\u6587\u4ef6\uff0cmessages.properties \uff0c\u4f5c\u4e3a\u9ed8\u8ba4\u7684\u8d44\u6e90\u6587\u4ef6\uff0c\u53e6\u5916\u51c6\u5907\u4e863\u4e2a\u7248\u672c\u7684\u8d44\u6e90\u6587\u4ef6\uff1amessages_en_US.properties messages_zh_CN.properties messages_zh_TW.properties\u3002\u653e\u5728class-path\u4e5f\u5c31\u662f/WEB-INF/classes\u91cc \u3002
\u6ce8\u610f\uff1a\u4e2d\u6587\u7684\u8d44\u6e90\uff0c\u9700\u8981\u5c06\u6587\u5b57\u8f6c\u5316\u4e3a\u4e0b\uff0c\u53ef\u4ee5\u4f7f\u7528native2ascii.exe \u5de5\u5177\uff0c\u5728JDK\u7684bin\u76ee\u5f55\u4e0b\uff0c\u5e26\u6709\u8fd9\u4e2a\u5de5\u5177\u3002
2\u3001web.xml \u52a0\u5165\u4ee3\u7801\u7528\u6765\u5b9a\u4e49messages\u6587\u4ef6

javax.servlet.jsp.jstl.fmt.localizationContext
messages

3\u3001\u5efa\u7acb\u4e2a\u65b0\u7684JSP\u9875\u9762\uff1a
\u52a0\u5165\u6807\u7b7e\u5e93\uff1a
\u7136\u540e\u8bbe\u7f6e \u56fd\u9645\u5316\u914d\u7f6e\u8bed\u8a00\uff1a \u8fd9\u6837\u5c31\u4f1a\u52a0\u8f7d messages_zh_CN.properties \u7684\u8d44\u6e90\u6587\u4ef6\u3002
\u5728\u7528\u5f15\u7528\u7684\u56fd\u9645\u5316\u7684\u5c5e\u6027\u7684\u65f6\u5019 \u4f7f\u7528 \u5c31\u53ef\u4ee5\u4e86\uff0c\u5176\u4e2d\u7684title \u4e3a\u8d44\u6e90\u6587\u4ef6\u4e2d\u5b9a\u4e49\u7684\u5c5e\u6027
\u8fd9\u6837\u5c31\u5b8c\u6210\u4e86\u4e00\u4e2a\u6700\u57fa\u672c\u7684\u56fd\u9645\u5316\u914d\u7f6e\u3002

1 Java国际化的思路
Java程序的国际化的思路是将程序中的标签、提示等信息放在资源文件中,程序需要支持哪些国家、语言环境,就对应提供相应的资源文件。资源文件是key-value对,每个资源文件中的key是不变的,但value则随不同国家、语言改变。
Java程序的国际化主要通过如下三个类完成:
Ø java.util.ResourceBundle:用于加载一个国家、语言资源包。
Ø java.util.Locale:用于封装一个特定的国家/区域、语言环境。
Ø java.text.MessageFormat:用于格式化带占位符的字符串。
为了实现程序的国际化,必须先提供程序所需要的资源文件。资源文件的内容是很多key-value对。其中key是程序使用的部分,而value则是程序界面的显示字符串。
资源文件的命名可以有如下三种形式:
Ø baseName _ language _country.properties
Ø baseName _language.properties
Ø baseName.properties
其中baseName是资源文件的基本名,用户可以自由定义。而language和country都不可随意变化,必须是Java所支持的语言和国家。

2 Java支持的语言和国家
事实上,Java不可能支持所有国家和语言,如需要获取Java所支持的语言和国家,可调用Locale类的getAvailableLocale方法获取,该方法返回一个Locale数组,该数组里包含了Java所支持的语言和国家。
下面的程序简单地示范了如何获取Java所支持的国家和语言:
public class LocaleList
{
public static void main(String[] args)
{
//返回Java所支持的全部国家和语言的数组
Locale[] localeList = Locale.getAvailableLocales();
//遍历数组的每个元素,依次获取所支持的国家和语言
for (int i = 0; i < localeList.length ; i++ )
{
//打印出所支持的国家和语言
System.out.println(localeList[i].getDisplayCountry() + "=" + locale
List[i].getCountry()+ " " + localeList[i].getDisplayLanguage()
+ "=" + localeList[i].getLanguage());
}
}
}
通过该程序,我们就可以获得Java程序所支持的国家/语言环境。

3 完成程序国际化
对于如下最简单的程序:
public class RawHello
{
public static void main(String[] args)
{
System.out.println("Hello World");
}
}
这个程序的执行结果也很简单:肯定是打印出简单的“Hello World”字符串,不管在哪里执行都不会有任何改变!为了让该程序支持国际化,则肯定不能让程序直接输出“Hello World”的字符串,这种写法直接输出一个字符串常量,永远不会有任何改变。为了让程序可以输出不同的字符串,此处绝不可使用该字符串常量。
为了让上面输出的字符串常量可以改变,我们将需要输出的各种字符串(不同国家/语言环境对应不同的字符串)定义在资源包中。
我们为上面程序提供如下两个文件:
第一个文件:mess_zh_CN.properties,该文件的内容为:
#资源文件的内容是key-value对。
hello=你好!
第二个文件:mess_en_US.properties,该文件的内容为:
#资源文件的内容是key-value对。
hello=Welcome You!
对于包含非西欧字符的资源文件,Java提供了一个工具来处理该文件:native2ascii,这个工具可以在%JAVA_HOME%/bin路径下找到。使用该工具的语法格式如下:
native2ascii 源资源文件 目的资源文件
如果我们在命令窗口输入如下指令:
#使用native2ascii命令处理mess_zh_CN.properties文件,生成aa.properties文件
native2ascii mess_zh_CN.properties aa.properties
上面的命令将生成一个aa.properties文件,该文件才是我们需要的资源文件,该文件看上去包含很多乱码,其实是非西欧字符的UNICODE编码方式,这完全正常。将该文件重命名为mess_zh_CN.properties即可。
我们看到这两份文件文件名的baseName是相同的:mess。前面已经介绍了资源文件的三种命名方式,其中baseName后面的国家、语言必须是Java所支持的国家、语言组合。

将上面的Java程序修改成如下形式:
public class Hello
{
public static void main(String[] args)
{
//取得系统默认的国家/语言环境
Locale myLocale = Locale.getDefault();
//根据指定国家/语言环境加载资源文件
ResourceBundle bundle = ResourceBundle.getBundle("mess" , myLocale);
//打印从资源文件中取得的消息
System.out.println(bundle.getString("hello"));
}
}
上面程序中的打印语句不再是直接打印“Hello World”字符串,而是打印了从资源包中读取的信息。如果在中文环境下运行该程序,将打印“你好!”;如果我们在“控制面板”将机器的语言环境设置成美国,然后再次运行该程序,将打印“Welcome You!”字符串。
通过上面的简单程序,我们可以体会到Java程序的国际化是多么简单!

从上面程序可以看出:如果我们希望程序完成国际化,只需要将不同国家/语言(Locale)的提示信息分别以不同文件存放。例如简体中文的语言资源文件就是Xxx_zh_CN.properties文件,而美国英语的语言资源文件就是Xxx_en_US.properties文件。
Java程序国际化的关键类是ResourceBundle,它有一个静态方法:getBundle(String baseName , Locale locale);该方法将根据Locale加载资源文件,而Locale封装了一个国家、语言,例如简体中文的环境可以用简体中文的Locale代表,美国英语的环境可以用美国英语的Locale代表。
从上面资源文件的命名中可以看出,不同语言、国家环境的资源文件的baseName是相同的,即baseName为mess的资源文件有很多个,不同国家、语言环境对应不同的资源文件。
例如通过如下代码来加载资源文件:
//根据指定国家/语言环境加载资源文件
ResourceBundle bundle = ResourceBundle.getBundle("mess" , myLocale);
上面代码将会加载baseName为mess的系列资源文件的其中之一,到底加载其中的哪个,则取决于myLocale,对于简体中文的Locale,则加载mess_zh_CN.properties文件。
一旦加载了该文件后,该资源文件的内容就是多个key-value对,程序就根据key来获取指定信息,例如获取key为hello的消息,该消息是“你好!”——这就是Java程序国际化的过程。
如果对于美国英语的Locale,则加载mess_en_US.properties,该文件中的key为hello的消息是“Welcome You!”。
Java程序国际化的关键类是ResourceBundle和Locale,ResourceBundle来根据不同Loacle加载语言资源文件,再根据指定key取得已加载语言资源文件中的字符串即可。

Java不可能支持所有国家和语言,如需要获取Java所支持的语言和国家,可调用Locale类的getAvailableLocale方法获取,该方法返回一个Locale数组,该数组里包含了Java所支持的语言和国家。

下面的程序简单地示范了如何获取Java所支持的国家和语言:

public class LocaleList
{
public static void main(String[] args) 
{
//返回Java所支持的全部国家和语言的数组
Locale[] localeList = Locale.getAvailableLocales();
//遍历数组的每个元素,依次获取所支持的国家和语言
for (int i = 0; i < localeList.length ; i++ )
{
//打印出所支持的国家和语言
System.out.println(localeList[i].getDisplayCountry() + "=" + locale
List[i].getCountry()+ " " + localeList[i].getDisplayLanguage() 
+ "=" + localeList[i].getLanguage());
}
}
}


第一个是通过指定语言和地区指定;
第二个是通过语言代码构造语言环境
第三个是获取此JAVA虚拟机实例的当前默认语言环境

  • java 鍥介檯鍖鏃堕棿濡備綍澶勭悊? spring mvc hibernate
    绛旓細<!-- 鍥介檯鍖娑堟伅澶勭悊 --> <bean id="localeResolver" class="org.springframework.web.servlet.i18n.FixedLocaleResolver"> <property name="defaultLocale" value="zh_CN" /> </bean>
  • java鍥介檯鍖闂 瀹炵幇涓嫳鏂囧垏鎹
    绛旓細// PROPERTIES_FILE_NAME鏄疨ROPERTIES鏂囦欢鍓嶉潰鐨勬枃浠跺悕 // Locale.ENGLISH鍙互鎹㈡垚LOCALE.CHINESE杩涜涓嫳鏂囧垏鎹 ResourceBundle bundle = ResourceBundle.getBundle(PROPERTIES_FILE_NAME, Locale.ENGLISH);閫氳繃bundle.getString(KEY);寰楀埌璧勬簮鏂囦欢閲岀殑鍊 ...
  • java寮鍙閲岄潰鐨鈥鍥介檯鍖鈥濆拰鈥滄湰鍦板寲鈥濋兘鏄粈涔堟剰鎬濆憿
    绛旓細涓句釜寰堢畝鍗曠殑渚嬪瓙銆侴oogle锛屼綘鎶婁綘鐨勬祻瑙堝櫒鐨勮瑷閫夋嫨涓枃锛岀綉椤靛氨鏄剧ず涓枃锛涗綘鎶婁綘娴忚鍣ㄧ殑璇█閫夋嫨鑻辫锛孏oogle鐨勭晫闈㈠氨鏄嫳鏂囩殑銆傚畠鐨勭洰鐨勫氨鏄牴鎹綘鎵鍦ㄥ湴鐨勬祻瑙堝櫒璇█鐨勮缃潵杩涜鏄剧ず锛屼笉闇瑕佽涓虹殑鍋氫换浣曠殑闄愬埗鍜屼慨鏀广
  • java寮鍙戝父鐢ㄥ洓澶ф鏋
    绛旓細1. Spring妗嗘灦 Spring鏄疛ava寮鍙戜腑鏈甯哥敤鐨勬鏋朵箣涓锛屽畠鎻愪緵浜嗗叏闈㈢殑缂栫▼鍜岄厤缃ā鍨嬶紝鐢ㄤ簬鐜颁唬鍖朖ava浼佷笟绾у簲鐢ㄣ係pring鐨勬牳蹇冨姛鑳芥槸鎺у埗鍙嶈浆锛圛nversion of Control, IoC锛夊拰闈㈠悜鍒囬潰缂栫▼锛圓spect Oriented Programming, AOP锛夈侷oC鏈夊姪浜瀹炵幇搴旂敤绋嬪簭缁勪欢涔嬮棿鐨勮В鑰︼紝浠庤屾彁楂樺彲娴嬭瘯鎬у拰鍙淮鎶ゆс侫OP鍏佽寮鍙...
  • I18N-鍥介檯鍖娑堟伅鍜屾棩蹇
    绛旓細鏀寔灏变細鎰熷埌瀹虫 瑕佷娇缂栧啓鐨勪唬鐮佽兘澶熼潰鍚戝鍥戒娇鐢ㄨ 纭疄闇瑕佽垂涓缈绘濋噺 鍥犱负鍦ㄧ幇鏈夎蒋浠剁殑浠g爜涓坊鍔鍥介檯鍖鏀寔鍙笉鏄竴浠惰交鑰屾槗涓剧殑浜 濡傛灉鎮ㄦ劅瑙夊埌杞欢闇瑕佹敮鎸佷笉鍚岃瑷鍜岃瑷鐜 鍝曡繖绉嶅彲鑳芥у緢灏 浠庝竴寮濮嬪氨鍋氬浗闄呭寲椤圭洰鐨勫噯澶 姣旇捣椤圭洰寮濮嬪悗鍐嶈瘯鍥炬坊鍔犲浗闄呭寲鏀寔涔熻鏄庢櫤寰楀 鏈変汉闂 鍥介檯鍖 鏄粈涔...
  • 鍦java绋嬪簭涓彲浠ョ洿鎺ュ皢涓娈典腑鏂囩炕璇戜负鑻辨枃,鎴栬呯炕璇戜负鍒殑璇█鍚椼傚 ...
    绛旓細褰撶劧鍙互鍟 浣犲彲浠ュ弬鐓ф湁閬撶綉椤电炕璇戞垨闆呰檸瀹濊礉楸 瀹炵幇鍘熺悊灏辨槸鍏堝缓绔嬩竴涓弬鐓у簱,鐒跺悗鏍规嵁杈撳叆鍘诲弬鐓у簱閲岄潰鎵惧嚭瀵瑰簲鐨勮瑷缈昏瘧 鐒跺悗鎸夌収涓瀹氱殑鏍煎紡杞崲杩囨潵鍗冲彲,浣嗕綘瑕佹兂缈昏瘧鐨勫緢鍑嗗氨闈炲父闅句簡,鐩墠鐨勭炕璇戠粨鏋滈兘鏄ぇ鑷村搴,鐒跺悗鍦ㄤ慨鏀
  • Java璇█绋嬪簭璁捐鍐呭鎻愯
    绛旓細姝ゅ锛屼綔鑰呭苟鏈姝ヤ簬鍩虹锛岃繕瀵逛竴浜涢珮绾т富棰樿繘琛屼簡鍏ㄩ潰涓旀繁鍏ョ殑鎺㈣銆傚唴瀹规兜鐩栦簡鏁版嵁缁撴瀯锛岃璇昏呭澶嶆潅鏁版嵁澶勭悊鏈夋洿娣卞埢鐨勭悊瑙o紱骞跺彂缂栫▼锛屽府鍔╄鑰呮帉鎻″绾跨▼澶勭悊鐨勭簿楂擄紱缃戠粶缂栫▼锛岃瀛︿範鑰呯悊瑙e浣曞湪浜掕仈缃戠幆澧冧腑杩涜閫氫俊锛鍥介檯鍖璁捐锛屼娇寰绋嬪簭鍏峰閫傚簲涓嶅悓璇█鍜屾枃鍖栫幆澧冪殑鑳藉姏锛涢珮绾UI璁捐锛屾彁鍗囩敤鎴...
  • java 鍥介檯鍖鏃犳硶瀹炵幇
    绛旓細鏄惁鏈塎essage_zh_CN.properties灞炴ф枃浠躲傛壘涓嶅埌璧勬簮鏂囦欢銆
  • 浠涔堟槸JAVA?瀹冩湁鍝簺浣滅敤鍜屽姛鑳?
    绛旓細Java鏄敱Sun Microsystems鍏徃浜1995骞5鏈堟帹鍑虹殑Java绋嬪簭璁捐璇█(浠ヤ笅绠绉癑ava璇█)鍜孞ava骞冲彴鐨勬荤О銆傜敤Java瀹炵幇鐨凥otJava娴忚鍣(鏀寔Java applet)鏄剧ず浜Java鐨榄呭姏:璺ㄥ钩鍙般佸姩鎬佺殑Web銆両nternet璁$畻銆備粠姝,Java琚箍娉涙帴鍙楀苟鎺ㄥ姩浜哤eb鐨勮繀閫熷彂灞,甯哥敤鐨勬祻瑙堝櫒鐜板湪鍧囨敮鎸丣ava applet銆傚彟涓鏂归潰,Java鎶鏈篃涓嶆柇鏇存柊銆 Java...
  • 浼JAVA鐨甯繖瑙g瓟,璋㈣阿
    绛旓細1銆亁 閲囩敤 Unicode 鏄负浜瀹炵幇鍥介檯鍖锛屼絾Unicode鏈夎嚜宸辩殑瑙勮寖锛屼笌鍏蜂綋杞‖浠舵棤鍏 2銆亁 鏈夊嚑涓 class 绫诲氨鐢熸垚鍑犱釜 .class 鏂囦欢 3銆亁 java 涓轰簡璺ㄥ钩鍙帮紝瀹炵幇涓庡钩鍙版棤鍏虫э紝鍚勬暟鎹被鍨嬮暱搴﹂兘宸茬粡瑙勮寖 4銆亁 no锛 java 涔熸槸浠 0 寮濮 5銆亁 final 6銆亁 鍙互瀵瑰簲澶氫釜 catch 妯...
  • 扩展阅读:为什么都不建议java转测试 ... java中实现下拉框 ... java编程零基础入门 ... 黑马java视频 ... java基础入门电子版 ... java实现画图程序 ... java自学要学多久 ... java中如何实现多态 ... 在java中如何实现类的继承 ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网