JavaWeb国际化
Posted 张玉宝
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaWeb国际化相关的知识,希望对你有一定的参考价值。
软件的国际化:
软件在不同的地方,适应不同的风格:
中国: 显示中文,以及服务符合中国习惯的文本字符串!
美国: 显示英文,以及服务符合他国习惯的文本字符串!
这种软件,就叫国际化的软件!
如何做到国际化的软件,要求:
- 软件中存储特定的字符串
- 知道浏览器当前使用哪种语言(Locale )
相关API
一、Locale 实例对象代表一个特定的地理,政治、文化区域。
(一个 Locale 对象本身不会验证它代表的语言和国家地区信息是否正确,只是向本地敏感的类提供国家地区信息,与国际化相关的格式化和解析任务由本地敏感的类去完成。(若JDK中的某个类在运行时需要根据 Locale 对象来调整其功能,这个类就称为本地敏感类)
二、ResourceBundle类提供了一个静态方法getBundle,该方法用于装载资源文件,并创建ResourceBundle实例:
加载资源文件后, 程序就可以调用ResourceBundle 实例对象的 getString 方法获取指定的资源信息名称所对应的值。
Locale 本地化
Java提供了一个本地化的对象!封装当前语言、国家、环境等特征!
首先来测试一下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
//本地化对象,封装语言、国家、信息的对象 //由java.util包提供 @Test public void test() { //Locale locale=Locale.CHINA; Locale locale=Locale.getDefault(); //当前系统默认的语言环境 System.out.println(locale); //zh_CN 中文-中国 System.out.println(locale.getCountry()); //CN 国家的简称 System.out.println(locale.getDisplayCountry()); //中国 显示完整国家 System.out.println(locale.getLanguage()); //zh 语言简称 //模拟美国 Locale locale2=Locale.US; System.out.println(locale2.getCountry()); System.out.println(locale2.getDisplayCountry()); } |
然后改为美国(Locale.CHINA——》Locale.US)
1
2
3
4
5
6
7
|
@Test public void test2() { //模拟美国 Locale locale2=Locale.US; System.out.println(locale2.getCountry()); System.out.println(locale2.getDisplayCountry()); } |
运行结果如图:
国际化
静态数据国际化
国际化的软件:
- 存储所有国家显示的文本的字符串
a) 文件: properties
b) 命名: 基础名_语言简称_国家简称.properties
例如:msg_zh_CN.properties 存储所有中文
Msg_en_US.properties 存储所有英文
- 程序中获取
ResourceBundle类,可以读取国际化的资源文件!
先创建两个properties文件,一个代表中文,另外一个代表英文
注意不能再source视图中去编辑,只能在properties视图中去add,add之后转换到source视图就会知道为什么了。
现在来添加java代码:
1
2
3
4
5
6
7
8
9
10
11
12
|
//国际化 @org .junit.Test public void test() { //中文语言环境 Locale locale=Locale.CHINA; //创建工具类对象ResourceBundle ResourceBundle bundle=ResourceBundle.getBundle( "com.gqx.international_i18.msg" , locale); //根据key获取配置文件中的值 System.out.println(bundle.getString( "hello" )); System.out.println(bundle.getString( "username" )); System.out.println(bundle.getString( "pwd" )); } |
然后做对应的改变(Locale.CHINA——》Locale.US)会看到如下如的变化
但是,我们会想到,如果是金钱数目或者时间等,他们是变化的,不确定的,我们没办法将其通过数据保存下来,然后一一对应来解决。这个时候需要通过动态国际化来解决啦
动态文本国际化
数值,货币,时间,日期等数据由于可能在程序运行时动态产生,所以无法像文字一样简单地将它们从应用程序中分离出来,而是需要特殊处理。Java 中提供了解决这些问题的 API 类(位于 java.util 包和 java.text 包中)
国际化货币
NumberFormat.getCurrencyInstance();
国际化数字;
NumberFormat.getNumberInstance();
国际化百分比
NumberFormat.getPercentInstance();
国际化日期
DateFormat.getDateTimeInstance(dateStyle, timeStyle);
(1)、国际化货币
1
2
3
4
5
6
7
8
9
10
11
12
13
|
//国际化-动态文本-国际化货币 @org .junit.Test public void test4() { //模拟语言环境 Locale locale=Locale.US; //数据 double number= 100 ; //工具类 NumberFormat nf=NumberFormat.getCurrencyInstance(locale); //国际化货币 String m=nf.format(number); System.out.println(m); } |
1
2
3
4
5
6
7
8
9
10
11
12
13
|
//计算 $100.00*10(不能通过字符串的拆分方式实现) @org .junit.Test public void test5() throws ParseException { String string= "$100" ; int num= 10 ; //1、分析string是哪一个国家的货币 Locale locale=Locale.US; //2、国际化工具类 NumberFormat nf=NumberFormat.getCurrencyInstance(locale); //3、解析货币 Number n=nf.parse(string); System.out.println(n.intValue()*num); } |
(2)、国际化数字
1
2
3
4
5
6
7
8
9
|
//国际化-动态文本-国际化数字 @org .junit.Test public void test6() { //模拟语言环境 Locale locale=Locale.US; NumberFormat nf=NumberFormat.getNumberInstance(locale); String str=nf.format( 10000000 ); System.out.println(str); } |
(3)、国际化日期
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
//国际化-动态文本-国际化日期 /** * 日期: * FULL:2016年11月30日 星期三 * LONG: 2016年11月30日 * MEDIUM:2016-11-30 * SHORT:16-11-30 * 日期: * FULL:下午03时47分08秒 CST * LONG:下午03时49分43秒 * MEDIUM:15:51:31 * SHORT:下午3:53 */ @org .junit.Test public void test7() { //模拟语言环境 Locale locale=Locale.CHINA; //日期格式 int dateStyle=DateFormat.SHORT; //时间格式 int timeStyle=DateFormat.SHORT; //工具类 DateFormat df=DateFormat.getDateTimeInstance(dateStyle, timeStyle); String date=df.format( new Date()); System.out.println(date); } |
将时间值:16-11-30下午16时25分30秒 CST,反向解析成一个打他对象
1
2
3
4
5
6
7
8
9
10
11
12
13
|
//将时间值:16-11-30下午16时25分30秒 CST,反向解析成一个打他对象 @org .junit.Test public void test8() throws ParseException { String str= "16-11-30 下午16时25分30秒 CST" ; //日期格式 int dateStyle=DateFormat.SHORT; //时间格式 int timeStyle=DateFormat.FULL; //工具类 DateFormat df=DateFormat.getDateTimeInstance(dateStyle, timeStyle,Locale.getDefault()); Date date=df.parse(str); System.out.println(date); } |
Jsp页面国际化 – 使用jstl标签
<fmt:setLocale value=""/> 设置本地化对象
<fmt:setBundle basename=""/> 设置工具类
<fmt:message></fmt:message> 显示国际化文本
格式化数值
<fmt:formatNumber pattern="#.##" value="100.99"></fmt:formatNumber>
格式化日期:
<fmt:formatDate pattern="yyyy-MM-dd" value="${date}"/>
如下代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
<%@ page language= "java" import = "java.util.*" pageEncoding= "UTF-8" %> <%--引入jstl国际化与格式化标签库 --%> <% @taglib uri= "http://java.sun.com/jsp/jstl/fmt" prefix= "fmt" %> <html> <head> <!-- 一、设置本地化对象 --> <fmt:setLocale value= "${pageContext.request.locale}" /> <!-- 二、设置工具类 --> <fmt:setBundle basename= "com.gqx.international_i18.msg" var= "bundle" /> <title><fmt:message key= "title" bundle= "${bundle}" ></fmt:message></title> <meta http-equiv= "pragma" content= "no-cache" > <meta http-equiv= "cache-control" content= "no-cache" > <meta http-equiv= "expires" content= "0" > </head> <body> <form name= "frmLogin" action= "${pageContext.request.contextPath }/admin?method=login" method= "post" > <table align= "center" border= "1" > <tr> <td><fmt:message key= "username" bundle= "${bundle}" ></fmt:message></td> <td> <input type= "text" name= "userName" > </td> </tr> <tr> <td><fmt:message key= "pwd" bundle= "${bundle}" ></fmt:message></td> <td> <input type= "password" name= "pwd" > </td> </tr> <tr> <td> <input type= "submit" value= "<fmt:message key=" submit " bundle=" ${bundle} "/>" > </td> </tr> </table> </form> </body> </html> |
(将浏览器默认的语言改变后,会发现对应的文字也会改变)
以上是关于JavaWeb国际化的主要内容,如果未能解决你的问题,请参考以下文章