JAVA国际化
国际化英文单词为: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<localeList.length; 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
分享到:
相关推荐
Java 国际化(i18n)是一个关键特性,它允许软件应用程序为不同地区和语言的用户提供定制的用户体验。这个示例主要展示了如何在Java应用程序中实现国际化,以适应全球用户的需求。JSTL(JavaServer Pages Standard ...
国际化未完全,若你有兴趣可更改源码 <br>购物流程: 管理员---添加/删除/修改商品---订单管理---销售管理--管理发货 用户---登录--充值---购买---下订单---扣除帐户余额----管理发货----查询订单 <br>...
第21章 中文乱码问题与国际化 610 21.1 中文乱码问题产生的由来 610 21.1.1 常用字符集 610 21.1.2 对乱码产生过程的分析 612 21.2 中文乱码问题的解决方案 614 21.3 使用过滤器解决中文问题 616 21.4 让...
第21章 中文乱码问题与国际化 610 21.1 中文乱码问题产生的由来 610 21.1.1 常用字符集 610 21.1.2 对乱码产生过程的分析 612 21.2 中文乱码问题的解决方案 614 21.3 使用过滤器解决中文问题 616 21.4 让...
第21章 中文乱码问题与国际化 610 21.1 中文乱码问题产生的由来 610 21.1.1 常用字符集 610 21.1.2 对乱码产生过程的分析 612 21.2 中文乱码问题的解决方案 614 21.3 使用过滤器解决中文问题 616 21.4 让...
第21章 中文乱码问题与国际化 610 21.1 中文乱码问题产生的由来 610 21.1.1 常用字符集 610 21.1.2 对乱码产生过程的分析 612 21.2 中文乱码问题的解决方案 614 21.3 使用过滤器解决中文问题 616 21.4 让...
2. **ApplicationContext**: BeanFactory的增强版,增加了对国际化、事件传播、资源加载等高级功能。它是Spring应用的主要入口点。 3. **IoC容器**: 也就是依赖注入容器,它使用XML、注解或Java配置来定义Bean及其...
Struts-menu是一个在Java Web开发中用于生成动态菜单的开源组件,主要应用于基于Struts框架的应用程序。...对于想要深入研究的开发者,还可以探索Struts-menu的更多高级特性,如动态加载菜单、国际化支持等。
WebWork通过使用拦截器(Interceptor)和动态方法调用来增强Action的功能,提供了强大的表单验证、国际化支持以及错误和异常处理机制。 **WebWork 安装 - HelloWorld** 安装WebWork通常涉及以下几个步骤: 1. 下载...
在实际开发中,还需要深入学习WebWork的拦截器、国际化、异常处理、AOP(面向切面编程)等方面的知识,以便更好地利用WebWork的强大功能。如果你在学习过程中有任何问题或建议,可以通过邮件achqian@hotmail.com...
以上只是WebWork教程的初步内容,完整的教程还包括更多高级主题,如Interceptor的使用、国际化支持、AOP(面向切面编程)以及WebWork与其他开源项目的集成。学习WebWork,不仅可以提升开发效率,还能深入理解MVC框架...
喜欢分享的朋友在转载时注明,谢谢。 序 Eclipse RCP 允许开发者使用 eclipse结构风格设计弹性的可扩展的应用程序,可重用Eclipse中 已存在的方法和编码模式。俗话说,万事开头难。Eclipse RCP 入手可能会比较...