java 国际化_JAVA国际化

本文详细介绍了Java的国际化(I18N)和本地化(L10N)过程,包括核心类如ResourceBundle、Locale和MessageFormat的使用。通过资源文件和示例代码展示了如何实现字符串的国际化,解释了如何处理带占位符的消息,并讨论了使用类文件代替资源文件的可能性。此外,还提供了获取Java支持的所有语言和国家的方法。
摘要由CSDN通过智能技术生成

国际化英文单词为:Internationalization,又称I18N,I为因为单词的第一个字母,18为这个单词的长度,而N代表这个单词的最后一个字母。国际化又称本地化(Localization,L10N)。

国际化相关的Java类

Java国际化主要通过如下3个类完成 java.util.ResourceBundle:用于加载一个资源包

java.util.Locale:对应一个特定的国家/区域、语言环境。

java.text.MessageFormat:用于将消息格式化

国际化资源文件

为实现程序的国际化,必须提供程序所需要的资源文件。资源文件的内容由key-value对组成。

资源文件的命名可以有3种格式: basename_language_country.properties

basename_language.properties

basename_properties

若资源文件包含非西方字符,则需要用JDK自带的工具来处理:native2ascii,这个工具的语法格式如下: native2ascii 资源文件名 目标资源文件名

如: native2ascii mess_zh_XXX.proerties mess_zh_CN.proerties

Locale类可获取各国区域环境(如:Locale.ENGLISH、Locale.CHINESE,这些常量返回一个Locale实例),也可以获取当前系统所使用的区域语言环境。

ResourceBundle类可根据指定参数获取相应的资源,常用方法如下 ResourceBundle.getBundle(basename)//获取当前系统所使用的区域环境获得指定资源文件

ResourceBundle.getBundle(basename,locale)//根据指定的区域获取对应的资源文件

语言环境

在 Java 语言中,语言环境(locale)仅仅是一个标识符,而不是一组本地化的属性。java.util.Locale 类的一个实例表示一个特定的地理政治区域,使用表示语言、区域以及国家或地区的参数创建。每个与语言环境相关的类都维护着它自己的一组本地化属性,并且确定如何对含有 Locale 参数的方法请求做出响应。

Java支持的语言和国家

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

java代码如下:Locale[] localeList = Locale.getAvailableLocales();

for(int i=0; i

System.out.println(localeList[i].getDisplayCountry()+"="+localeList[i].getCounrtry() + " " + localeList[i].getDisplayLanguage() + "=" +localeList[i].getLanguage());

}

}

程序运行结果如下:

Japan=JP Japanese=ja

Peru=PE Spanish=es

= English=en

Japan=JP Japanese=ja

Panama=PA Spanish=es

Bosnia and Herzegovina=BA Serbian=sr

= Macedonian=mk

Guatemala=GT Spanish=es

United Arab Emirates=AE Arabic=ar

Norway=NO Norwegian=no

Albania=AL Albanian=sq

= Bulgarian=bg

Iraq=IQ Arabic=ar

Yemen=YE Arabic=ar

= Hungarian=hu

Portugal=PT Portuguese=pt

Cyprus=CY Greek=el

Qatar=QA Arabic=ar

Macedonia=MK Macedonian=mk

= Swedish=sv

Switzerland=CH German=de

United States=US English=en

Finland=FI Finnish=fi

= Icelandic=is

= Czech=cs

Malta=MT English=en

Slovenia=SI Slovenian=sl

Slovakia=SK Slovak=sk

= Italian=it

Turkey=TR Turkish=tr

= Chinese=zh

= Thai=th

Saudi Arabia=SA Arabic=ar

= Norwegian=no

United Kingdom=GB English=en

Serbia and Montenegro=CS Serbian=sr

= Lithuanian=lt

= Romanian=ro

New Zealand=NZ English=en

Norway=NO Norwegian=no

Lithuania=LT Lithuanian=lt

Nicaragua=NI Spanish=es

= Dutch=nl

Ireland=IE Irish=ga

Belgium=BE French=fr

Spain=ES Spanish=es

Lebanon=LB Arabic=ar

= Korean=ko

Canada=CA French=fr

Estonia=EE Estonian=et

Kuwait=KW Arabic=ar

Serbia=RS Serbian=sr

United States=US Spanish=es

Mexico=MX Spanish=es

Sudan=SD Arabic=ar

Indonesia=ID Indonesian=in

= Russian=ru

= Latvian=lv

Uruguay=UY Spanish=es

Latvia=LV Latvian=lv

= Hebrew=iw

Brazil=BR Portuguese=pt

Syria=SY Arabic=ar

= Croatian=hr

= Estonian=et

Dominican Republic=DO Spanish=es

Switzerland=CH French=fr

India=IN Hindi=hi

Venezuela=VE Spanish=es

Bahrain=BH Arabic=ar

Philippines=PH English=en

Tunisia=TN Arabic=ar

= Finnish=fi

Austria=AT German=de

= Spanish=es

Netherlands=NL Dutch=nl

Ecuador=EC Spanish=es

Taiwan=TW Chinese=zh

Jordan=JO Arabic=ar

= Belarusian=be

Iceland=IS Icelandic=is

Colombia=CO Spanish=es

Costa Rica=CR Spanish=es

Chile=CL Spanish=es

Egypt=EG Arabic=ar

South Africa=ZA English=en

Thailand=TH Thai=th

Greece=GR Greek=el

Italy=IT Italian=it

= Catalan=ca

Hungary=HU Hungarian=hu

= French=fr

Ireland=IE English=en

Ukraine=UA Ukrainian=uk

Poland=PL Polish=pl

Luxembourg=LU French=fr

Belgium=BE Dutch=nl

India=IN English=en

Spain=ES Catalan=ca

Morocco=MA Arabic=ar

Bolivia=BO Spanish=es

Australia=AU English=en

= Serbian=sr

Singapore=SG Chinese=zh

= Portuguese=pt

= Ukrainian=uk

El Salvador=SV Spanish=es

Russia=RU Russian=ru

South Korea=KR Korean=ko

= Vietnamese=vi

Algeria=DZ Arabic=ar

Vietnam=VN Vietnamese=vi

Montenegro=ME Serbian=sr

= Albanian=sq

Libya=LY Arabic=ar

= Arabic=ar

China=CN Chinese=zh

Belarus=BY Belarusian=be

Hong Kong=HK Chinese=zh

= Japanese=ja

Israel=IL Hebrew=iw

Bulgaria=BG Bulgarian=bg

= Indonesian=in

Malta=MT Maltese=mt

Paraguay=PY Spanish=es

= Slovenian=sl

France=FR French=fr

Czech Republic=CZ Czech=cs

Switzerland=CH Italian=it

Romania=RO Romanian=ro

Puerto Rico=PR Spanish=es

Canada=CA English=en

Germany=DE German=de

= Irish=ga

Luxembourg=LU German=de

= German=de

Argentina=AR Spanish=es

= Slovak=sk

Malaysia=MY Malay=ms

Croatia=HR Croatian=hr

Singapore=SG English=en

= Danish=da

= Maltese=mt

= Polish=pl

Oman=OM Arabic=ar

= Turkish=tr

Thailand=TH Thai=th

= Greek=el

= Malay=ms

Sweden=SE Swedish=sv

Denmark=DK Danish=da

Honduras=HN Spanish=es

通过该程序,我们就可以获得Java程序所支持的国家/语言环境。

JAVA程序的国际化

原始程序:system.out.println("Hello");

其中Hello字符串需国际化,定义资源文件,文件名分别为base_zh_CN.properties和base_en_US

base_zh_CN.properties文件内容如下:hello=你好

base_en_US.properties文件内容如下:hello=Hello

将这两个文件放入某个包中,如“com.jj.test”,用native2ascii重新生成资源文件

修改程序:

Locale myLocale = Locale.getDefault();//获得系统默认的国家/语言环境

ResourceBundle bundle = ResourceBundle.getBundle("base",myLocale);//根据指定的国家/语言环境加载对应的资源文件

System.out.println(bundle.getString(hello"));//获得本地化字符串

JAVA国际化流程

ResourceBundle根据Locale加载资源文件->返回一个ResourceBundle实例->ResourceBundle调用getString方法返回指定key对应的字符串

带占位符的消息

上面的输出消息是一个间的的消息,若要输出的消息中必须包含动态的内容,这些内容必须是从程序中获取的,可利用带占位符的国际化资源文件来实现。

例如下面的字符串:

你好,Eason!今天是07-5-30 下午 13:00

Eason是浏览者的姓名,必须动态改变,后面的时间也必须动态改变,则此处需要2个占位符。

资源文件示例:

msg=你好,{0}!今天是{1}

程序中需要使用MessageFormat类

该类有个静态方法:

format(String pattern,Object … values)

上例对应的JAVA中的字符串输出代码如下:

ResourceBundle bundle = ResourceBundle.getBundle("MyResource", currentLocale);

String msg = bundle.getString("msg");

System.out.println(MessageFormat.format(msg,"Eason", new Date()));

使用类文件代替资源文件

Java允许使用类文件来代替资源文件,即手动书写代码来实现国际化,

该类要求继承于ListResourceBundle,并重写getContents方法该方法返回Object数组,该数组的每一个项都是key-value对。

类的名字必须为basename_language_contry,这与属性文件的命名相似。

如:

public class MyResource_zh_CN extends ListResourceBundle {

private final Object myData[][]= {

{"msg","{0},Hello"}

};

public Object[][] getContents() {return myData;}

}

上面这个是简体中文语言环境下的资源文件,该类可以替换MyResource_zh_CN.properties属性文件。

如果系统同时存在资源文件、类文件,系统将以类文件为主,而不会调用资源文件。例如对于basename为MyResourse的这一系列中文资源文件,系统搜索顺序如下:

MyResourse_zh_CN。class

MyResourse_zh_CN.properties

MyResourse_zh.class

MyResourse_zh.properties

MyResourse.class

MyResourse.properties

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值