国际化之ResourceBundle
软件在开发时要能使它同时应对世界不同地区和国家的使用,针对不同地区和国家的访问,提供相应的,符合使用者阅读习惯的操作环境,这就必须要有国际化的概念,国际化又称为“i18n”:internationalization。
国际化要能使静态数据和动态数据都能做到符合国际化的需求,本篇先讲述如何使静态数据满足国际化需求,再下一篇文章中再讲诉如何使动态数据做到国际化。
对软件或页面中的静态数据要想做到国际化,必须满足一下两个步骤:
① 将这些静态数据编写到一个properties文件中,比如说取名为“resource.properties”,作为默认资源配置文件。接着可以根据不同的国家或者语言环境来再次编写不同的properties文件,比如编写resource_zh.properties和resource_en.properties文件。
注意,编写默认资源配置文件之后的不同properties文件中,内容使用的关键字要和最开始编写的“resource.properties”文件内使用的关键字相同。请看例1。
最开始编写的properties文件名称为“基名”,比如上述中的“resource”,其他的properties根据该基名并编写不同国家和语言的配置文件,这一组properties统称为一个资源包。
“zh”和“en”分别代表不同的语言编码,这一点请看上一篇博客《Java描述语言、国家和地理的类——Locale》。这些语言编码在编写不同国家语言的properties文件时必须的。
资源文件内容和Map集合一样(因为Property就是Map集合的子类),采用“关键字=值”的方式,在默认资源配置文件中定义的关键字,在其他不同资源文件中都必须相同,而其他不同资源文件中的关键字的值使用不同语言的文字。如果在资源配置文件中使用到了中文,请使用Unicode码(JDK提供了转换工具native2ascii,请看博客《使用JDK自带的工具将中文转换为ascii码》)。
② 使用Java的ResourceBundle类对象来代表描述一个资源包。通过使用该类的静态方法getBundle,传入参数为某资源包的基名,可以也可以不传入一个代表国家或语言的Locale对象。
通过上述方法获得的对象,在资源包中如果找不到与制定语言环境匹配的资源配置环境,会找和语言环境相近的资源文件,如果还找不到,那么就会使用默认资源配置文件(如上述的resource.properties)。
通过ResourceBundle实例对象的getString(String key)方法就能获取对应资源文件中指定关键字的值了。
例1:
创建一个工程,因为资源包中资源个数可能会很多,并且为了某组资源包不和其他组资源包累积在一起,因此我们使用一个包将该组资源包封装,并定义一个默认资源文件,基名为“MessageResource”,同时创建另外两个分别对应中文和英文的资源文件(记住,语言编码或国家编码一定要有):
在默认资源配置文件“MessageResource.properties”文件中,定义资源文件使用的关键字,当然在默认资源配置文件中关键字的值是作为如果无法找到匹配资源文件才使用的,这里我选择英文:
而对应的中文资源文件MessageResource_zh.properties的内容为:
其实在MyEclipse中properties文件的另一个界面是这样的:
而在英文资源文件MessageResource_en.properties中内容和默认资源文件内容是一样的,这里就不再重复贴出。
配置好资源文件后,我们就可以在工程中使用,我们新建一个demo,然后通过ResourceBundle的getBundle()这个静态方法来获取代表资源文件的对象:
public class Demo1 { public static void main(String[] args) {
ResourceBundle bundle = ResourceBundle.getBundle("com.fjdingsd.resource.MessageResource", Locale.CHINESE);
String username = bundle.getString("username");
System.out.println(username);
}
}
在getBundle方法中,第一个参数必须使用的是资源包基名,不带文件后缀名,同时因为我们将资源包放在包中,所以必须要有完整名称(如果不放在包中而直接放在【src】目录下只需要基名即可);该方法的第二个参数是指定使用的语言或国家环境,通过这个参数ResourceBundle能自动识别和使用资源包中的哪个资源文件。这里我选择的是中文环境,因此程序执行效果如下:
如果使用的是英文的语言环境,那么只需要将Locale对象换成英文的即可,对于上面的代码只需要修改成:
ResourceBundle bundle =
ResourceBundle.getBundle("com.fjdingsd.resource.MessageResource", Locale.ENGLISH);
那么程序执行效果就会如下:
例2:在JSP页面上根据来访者的地区或国家来进行国际化显示:
在web工程中,根据Request请求对象中的getLocale()方法可以获取来访者的国家、地区或语言环境的Locale对象,那么我们就可以使用ResourceBundle对象指定页面中显示的语言文字了:
资源文件和存入的包名与例1相同,这里就省略步骤了,在JSP页面上模拟国际化(真实开发时使用国际化标签或自定义标签封装Java代码):
<body>
<%
Locale locale = request.getLocale();
ResourceBundle bundle = ResourceBundle.getBundle("com.fjdingsd.resource.MessageResource", locale);
%> <form action="" method="post">
<%=bundle.getString("username") %><input type="text" name="username"> <br>
<%=bundle.getString("password") %><input type="password" name="password"> <br>
</form>
</body>
在浏览器中观察效果:
另外如果想在JSP页面中能有超链接来选择何种语言,那么只需要来超链接后面添加请求参数来指定语言环境即可,在例2中补充:
<a href="${pageContext.request.contextPath}/login.jsp?language=zh">
中文
</a>
<a href="${pageContext.request.contextPath}/login.jsp?language=en">
english
</a> <%
String language = request.getParameter("language");
if(language==null) {
language = "zh";
}
Locale locale = new Locale(language);
ResourceBundle bundle = ResourceBundle.getBundle("com.fjdingsd.resource.MessageResource", locale);
%>
在浏览器中观察效果:
国际化之ResourceBundle的更多相关文章
- java.util.ResourceBundle国际化用法详解
java.util.ResourceBundle国际化用法详解 初识国际化和ResourceBundle 这个类主要用来解决国际化和本地化问题.国际化和本地化可不是两个概念,两者都是一起出现的.可以说 ...
- Java系列:国际化(zz)
国际化英文单词为:Internationalization,又称I18N,I为因为单词的第一个字母,18为这个单词的长度,而N代表这个单词的最后一个字母.国际化又称本地化(Localization,L ...
- 国际化之MessageFormat与占位符
如果一个字符串文本中包含了多个与国际化相关的数据,可以使用MessageFormat类对这些数据进行批量处理. 例如: 在2016年1月9日的时候,一场台风导致了500间房屋的摧毁和¥1000000元 ...
- 使用Properties类和ResourceBundle类读取properties文件
一.介绍: 项目中经常把一些常用的用户名和密码都填写到一个对应的配置文件中,这样每次修改密码或者用户名的时候就可以直接修改这个配置文件了,不用动源码. 这里讲两种方式读取properties文件的方法 ...
- Java 国际化
国际化英文单词为:Internationalization,又称I18N,I为因为单词的第一个字母,18为这个单词的长度,而N代表这个单词的最后一个字母.国际化又称本地化(Localization,L ...
- (转)JAVA国际化
转:http://www.cnblogs.com/jjtech/archive/2011/02/14/1954291.html 国际化英文单词为:Internationalization,又称I18N ...
- 关于properties文件在项目中的使用
这个是当时在学习JDBC的时候老师给讲的.web项目中把一些常用的用户名和密码都填写到一个对应的配置文件中,这样每次修改密码或者用户名的时候就可以直接修改这个配置文件了,不用动源码. 老师讲了两种读取 ...
- # 20155214 2016-2017-2 《Java程序设计》第8周学习总结
20155214 2016-2017-2 <Java程序设计>第8周学习总结 教材学习内容总结 对于串流输入/输出使用inputStream/OutputStream来衔接数据源与目的地, ...
- 20155306 2016-2017-2 《Java程序设计》第八周学习总结
20155306 2016-2017-2 <Java程序设计>第八周学习总结 教材学习内容总结 第十五章 通用API 15.1 日志 java.util.loggging包提供了日志功能相 ...
随机推荐
- 史上最详细的Android Studio系列教程一--下载和安装
链接地址:http://segmentfault.com/a/1190000002401964#articleHeader4 原文链接:http://stormzhang.com/devtools/2 ...
- 我的Python成长之路---第四天---Python基础(14)---2016年1月23日(寒风刺骨)
一.生成器和迭代器 1.迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退. ...
- Linux常用命令 新手必看
文件和目录cd /home 进入 '/ home' 目录'cd .. 返回上一级目录cd ../.. 返回上两级目录cd 进入个人的主目录cd ~user1 进入个人的主目录cd - 返回上次所在的目 ...
- HDU 3916 Sequence Decomposition 【贪心】
这道题目的题意就是使用题目中所给的Gate 函数,模拟出输入的结果 当然我们分析的时候可以倒着来,就是拿输入去减 每次Gate 函数都会有一个有效范围 这道题目求的就是,找出一种模拟方法,使得最小的有 ...
- 给centOs添加epel源
epel简介: https://fedoraproject.org/wiki/EPEL/zh-cn 1. rpm -Uvh http://dl.fedoraproject.org/pub/epel/5 ...
- include与jsp:include区别
jsp 中include有两种形式,分别是 <%@ include file=” ”%> <jsp:include page=” ” flush=”true”/> 前者是指令元 ...
- [置顶] 63行代码完美实现html5 贪吃蛇游戏
以前也很少关注html5,感觉选择html已经慢慢成为趋势,想了解下.就找了个游戏学习了,写完这个游戏感觉html5和js结合很紧密,如果js不是特别好.估计需要先补习下js,这个只是个人的建议,不一 ...
- 更新整理本人全部博文中提供的代码与工具(Java,2014.09)
为了更方便地管理博文中涉及的各种代码与工具资源,如今把这些资源迁移到 GitHub 中,有兴趣者可前往下载. Java 1.<高效 Java Web 应用开发框架 JessMA v3.4.1 正 ...
- KeyValuePair用法(转)
转载自:http://blog.sina.com.cn/s/blog_9741eba801016w61.html C# KeyValuePair<TKey,TValue>的用法.结构体,定 ...
- [转载] iOS开发分辨率那点事
1 iOS设备的分辨率 iOS设备,目前最主要的有3种(Apple TV等不在此讨论),按分辨率分为两类 iPhone/iPod Touch 普屏分辨率 320像素 x 480像素 Retina ...