JavaWeb国际化
来源:互联网 发布:2016淘宝千人千面规则 编辑:程序博客网 时间:2024/05/21 12:44
软件的国际化:
软件在不同的地方,适应不同的风格:
中国: 显示中文,以及服务符合中国习惯的文本字符串!
美国: 显示英文,以及服务符合他国习惯的文本字符串!
这种软件,就叫国际化的软件!
如何做到国际化的软件,要求:
- 软件中存储特定的字符串
- 知道浏览器当前使用哪种语言(Locale )
相关API
一、Locale 实例对象代表一个特定的地理,政治、文化区域。
(一个 Locale 对象本身不会验证它代表的语言和国家地区信息是否正确,只是向本地敏感的类提供国家地区信息,与国际化相关的格式化和解析任务由本地敏感的类去完成。(若JDK中的某个类在运行时需要根据 Locale 对象来调整其功能,这个类就称为本地敏感类)
二、ResourceBundle类提供了一个静态方法getBundle,该方法用于装载资源文件,并创建ResourceBundle实例:
加载资源文件后, 程序就可以调用ResourceBundle 实例对象的 getString 方法获取指定的资源信息名称所对应的值。
Locale 本地化
Java提供了一个本地化的对象!封装当前语言、国家、环境等特征!
首先来测试一下
//本地化对象,封装语言、国家、信息的对象
//由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)
@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代码:
//国际化
@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)、国际化货币
//国际化-动态文本-国际化货币
@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);
}
//计算 $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)、国际化数字
//国际化-动态文本-国际化数字
@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)、国际化日期
//国际化-动态文本-国际化日期
/**
* 日期:
* 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,反向解析成一个打他对象
//将时间值: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}"/>
如下代码:
<%@ page language=
"java"
import
=
"java.util.*"
pageEncoding=
"UTF-8"
%>
<%--引入jstl国际化与格式化标签库 --%>
<%
@taglib
uri=
"http://java.sun.com/jsp/jstl/fmt"
prefix=
"fmt"
%>
<!DOCTYPE HTML PUBLIC
"-//W3C//DTD HTML 4.01 Transitional//EN"
>
<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-国际化
- javaweb国际化
- JavaWeb国际化
- Javaweb国际化
- JavaWeb 国际化
- javaweb国际化
- JavaWeb.国际化
- JavaWEB开发-国际化
- JavaWEB开发-国际化:
- javaweb国际化/格式化标签
- JavaWEB开发-国际化:
- JavaWEB开发--国际化
- javaweb国际化入门
- JavaWEB开发的国际化
- JavaWEB开发-国际化
- JavaWEB开发-国际化1
- javaweb-国际化2
- JavaWEB开发-国际化
- 二分法插入排序
- 插入排序
- C语言作业-2-1时间换算
- CentOS-6.8离线安装gcc
- C#16字符串进制转16进制
- JavaWeb国际化
- javascript第一课
- bzoj1789&&bzoj1830: [Ahoi2008]Necklace Y型项链
- Javaweb监听器(2)
- myEclipse窗口布局
- Java-Web监听器
- JS-正则表达式-基础
- 1063. Set Similarity (25)
- Filter案例