(转)JAVA国际化
转:http://www.cnblogs.com/jjtech/archive/2011/02/14/1954291.html
国际化英文单词为: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国际化的更多相关文章
- Java国际化(i18n)
Java国际化(i18n) 最近在做一个网站国际化的功能.用Java做开发,使用spring+velocity. Java提供了对i18n的支持,spring对其做了集成,可以很方便的配置.主要思想就 ...
- Java 国际化 语言切换
Java国际化 我们使用java.lang.Locale来构造Java国际化的情境. java.lang.Locale代表特定的地理.政治和文化.需要Locale来执行其任务的操作叫语言环境敏感的 ...
- java——国际化详解
深入理解Java国际化 假设我们正在开发一个支持多国语言的Web应用程序,要求系统能够根据客户端的系统的语言类型返回对应的界面:英文的操作系统返回英文界面,而中文的操作系统则返回中文界面--这便是典型 ...
- Java国际化号码验证方法,国内手机号正则表达式
Java国际化号码验证方法,国内手机号正则表达式 中国电信号段 133.149.153.173.177.180.181.189.199 中国联通号段 130.131.132.145.155.156.1 ...
- Java 国际化
国际化英文单词为:Internationalization,又称I18N,I为因为单词的第一个字母,18为这个单词的长度,而N代表这个单词的最后一个字母.国际化又称本地化(Localization,L ...
- java国际化
import java.util.Locale; import org.junit.Test; /** * 使用指定的国际化文件 */ public class Demo { @Test public ...
- 42、Java国际化
简介 国际化的英文单词是Internationalization,有时检测I18N,类似于I18N还有L10N,是Location本地化的简写. Java或计划主要通过如下三个类实现 1.java.u ...
- Java 国际化标准程序实现
国际化程序实现 所谓的国家化应用指的就是根据当前的语言环境读取指定的语言资源文件. 如果要想实现国际化的操作,那么首先要解决的问题就是如何读取资源文件的问题:所谓的资源文件 就是指文件后缀名称为:&q ...
- java国际化之时区问题处理
原文:https://moon-walker.iteye.com/blog/2396035 在国际化的项目中需要处理的日期时间问题主要有两点: 1.日期时间的国际化格式问题处理: 2.日期时间的时区问 ...
随机推荐
- Vue学习笔记【17】——配置本地数据库和数据接口API
先解压安装 PHPStudy; 解压安装 Navicat 这个数据库可视化工具,并激活: 打开 Navicat 工具,新建空白数据库,名为 dtcmsdb4; 双击新建的数据库,连接上这个空白数据库, ...
- 批量新增数据(BuckCopy)
批量新增数据(BuckCopy) 使用webService传输数据时要注意,Datatable中的数据类型,以及科学计数 /// <summary> /// 批量新增数据 /// < ...
- redis实现点击量/浏览量
java+redis实现高性能新闻点击量更新 1.redis简单介绍.它用来做高性能数据存取 是极好的. 2.实例:新闻点击量. 1)每次刷新,我们并不一定要往数据库里面立即更新数据 2)可以在red ...
- 经典排序背包——cf1203F
先把收益为正数的处理掉:策略是挨个扫,扫n遍,碰到能买的就买,然后可以得到一个更新后的r 剩下的就看做是一个背包模型:物品(a,b)表示当背包体积>a时才能装下体积为b的该物品,问最多装几个 无 ...
- [bzoj2729][HNOI2012]排队 题解 (排列组合 高精)
Description 某中学有 n 名男同学,m 名女同学和两名老师要排队参加体检.他们排成一条直线,并且任意两名女同学不能相邻,两名老师也不能相邻,那么一共有多少种排法呢?(注意:任意两个人都是不 ...
- 2019 wannafly winter camp day5-8代码库
目录 day5 5H div2 Nested Tree (树形dp) 5F div2 Kropki (状压dp) 5J div1 Special Judge (计算几何) 5I div1 Sortin ...
- HTML-参考手册: HTTP 状态消息
ylbtech-HTML-参考手册: HTTP 状态消息 1.返回顶部 1. HTTP 状态消息 当浏览器从 web 服务器请求服务时,可能会发生错误. 以下列举了有可能会返回的一系列 HTTP 状态 ...
- Java进程Runtime、Process、ProcessBuilder调用外部程序
原文地址:https://blog.csdn.net/c315838651/article/details/72085739 通过Java执行系统命令,与cmd中或者终端上一样执行shell命令,最典 ...
- ( 转)WPF面板布局介绍Grid、StackPanel、DockPanel、WrapPanel
回顾 上一篇,我们介绍了基本控件及控件的重要属性和用法,我们本篇详细介绍WPF中的几种布局容器及每种布局容器的使用场景,当 然这些都是本人在实际项目中的使用经验,可能还存在错误之处,还请大家指出. 本 ...
- Day 16 : Python 时间模块[time,]datetime[]及第三方模块的下载与安装
在进行python程序开发时,除了可以使用python内置的标准模块外,还右许多第三方模块使用,可以在python官网找到. 在使用第三方模块时,需要下载并安装此模块,然后就可以使用标准模块一样导入并 ...