一、具备的特征:
1、对于程序中使用的文本元素(例如:菜单栏、导航栏、错误提示、状态信息等),需要根据来访者的地区和国家,选择不同语言的文本为之服务
2、对于程序中动态生成的数据(例如:日期、货币),软件应能根据当前的国家或地区的文化习惯进行显示
二、固定文本元素的国际化
·可以把固定不变的文本信息写到一个properties中,并根据不同的国家编写不同的properties文件。这一组properties文件被称为一个资源包
·提供了ResourceBundle类用于描述一个资源包
·创建资源包和资源文件
一个资源包中的资源文件都有一个相同的基名,而且每个资源文件都必须有表示本地信息的附加部分的信息
例如:
一个资源包的基名是:myresource;则与中文和英文相对应的资源文件则为:myresource_zh.properties,myresource_en.properties
每一个资源包都有一个默认的资源文件,这个文件不带有表示本地信息的部分。若resourceBundle对象在资源包中找不到与用户匹配的资源文件,他将选择与资源包中相近的资源文件,若是再找不到,则使用默认的资源文件。
·资源文件的书写格式
资源文件的内容通常采用“关键字=值”的形式,软件根据关键字检索值显示在页面上。一个资源包中的所有的资源文件的关键字是相同的
并且所有的资源文件中采用的是ASCII字码,对于想中文这样的非ASCII字符,需进行编码。
·在java类中编写代码实现固定文本元素的国际化
Locale locale=new Locale("en");
//用来描述资源包下的信息
ResourceBundle bundle1=ResourceBundle.getBundle("com.hbsi.resource.myresource",locale);
//读取资源文件中的键值对,指定是哪一个资源文件
String username1=bundle1.getString("username");
String password1=bundle1.getString("password");
String submit1=bundle1.getString("submit");
System.out.println(username1+":"+password1+":"+submit1);
ResourceBundle类提供了一个静态方法getBundle,该方法用于装载资源文件,该方法的第一个参数是资源包名,且为完整的资源包名,第二个参数是指定的资源文件
加载资源文件后,程序就可以调用ResourceBundle实例对象getString方法获取指定的资源信息名称所对应的值
·在jsp页面中使用固定文本元素的国际化标签
1、<fmt:setLocale>
<%
Locale locale=new Locale("zh","CN");
request.setAttribute("locale",locale);
%>
<%-- 在jsp页面中显示设置用户的本地化信息,并将设置的本地化信息一locale对象存储在web作用域中,使用了该标签设置本地化信息后,国际化标签库中的其他的标签将使用本地化信息,而忽略客户端浏览器传递过来的本地信息,如果value的值为null,该标签将采用客户端浏览器传递过来的本地信息--%>
<!--
<fmt:setLocale value="${locale}"/>
-->
<%-- 也可以是一个字符串:语言_国家 --%>
<!--
<fmt:setLocale value="zh_CN"/>
-->
2、<fmt:setBundle>
用于根据标签<fmt:setBundle>设置的本地化信息创建一个资源包实例化对象,并将绑定到一个web域的属性上。
<fmt:setBundle basename="basename"
[var="varName"]
[scope="{page|request|session|application}"] />
<fmt:setBundle>标签有如下一些特性:
(1)如果basename属性的值为null或空字符串,或找不到basename属性指定的资源,<fmt:setBundle>标签保存到Web域中的属性的值为null。
(2)如果指定了var属性,<fmt:setBundle>标签将把ResourceBundle实例对象以var属性的值作为域属性名称保存到Web域中。
(3)如果没有指定var属性,<fmt:setBundle>标签将把ResourceBundle实例对象以域属性名javax.servlet.jsp.jstl.fmt.localizationContext保存到Web域中。所有没有嵌套在<fmt:bundle>标签中且未指定bundle属性的<fmt:formatDate>都将使用该标签创建的资源包。
3、<fmt :bundle>
fmt:bundle>标签与<fmt:setBundle>标签的功能类似,但它创建的ResourceBundle实例对象只在其标签体内有效
4、如果设置了<fmt:bundle>标签的prefix属性,则其中嵌套的<fmt:message>标签的key属性值中就可以省略prefix属性设置的前缀部分,这对要使用具有相同前缀的多个关键字的情况提供了一些简便。
5、<fmt:message>
<fmt:message>标签用于从一个资源包中读取信息并进行格式化输出,它有如下一些使用语法格式:
语法1,没有标签体的情况:
<fmt:message key="messageKey"
[bundle="resourceBundle"]
[var="varName"]
[scope="{page|request|session|application}"] />
语法2,在标签体中指定格式化文本串中的占位符参数的情况:
<fmt:message key="messageKey"
[bundle="resourceBundle"]
[var="varName"]
[scope="{page|request|session|application}"]>
<fmt:param>subtags
</fmt:message>
语法3,在标签体中指定消息关键字和可选择的占位符参数:
<fmt:message [bundle="resourceBundle"]
[var="varName"]
[scope="{page|request|session|application}"]>
key
optional <fmt:param>subtags
</fmt:message>
<fmt:message>标签有如下一些特性:
·如果指定的资源不存在,输出“???<key>???”形式的错误信息。
·如果ResouceBundle中不存在key属性指定的信息,输出“???<key>???”形式的错误信息。
·如果key属性的值为null或空字符串,输出“??????”形式的错误信息。
·如果没有指定var属性,<fmt:message>标签将直接输出格式化的结果;如果指定了var属性,则<fmt:message>标签将格式化的结果保存在scope属性指定的Web域中,保存在Web域中的属性名称为var属性指定的值。如果指定了scope属性,就必须指定var属性。
·要输出的消息的关键字可以使用key属性指定,也可以在标签体中指定。如果<fmt:message>标签嵌套在<fmt:bundle>标签内,并且<fmt:bundle>标签设置了prefix属性,则该属性的值追加到<fmt:message>标签指定的关键字的前面。
·可以通过在<fmt:message>标签内嵌套<fmt:param>标签来指定格式化文本串中的占位符的参数值,每个<fmt:param>标签分别设置一个参数,各个<fmt:param>标签的顺序与格式化字符串的参数相对应,即第一个<fmt:param>标签对应于格式化字符串中的第一个参数,第二个<fmt:param>对应于格式化字符串中的第二个参数,依次类推。
·如果<fmt:message>标签处理的格式化文本串中包含有参数,但其中没有嵌套与该参数对应<fmt:param>标签,则直接输出该参数在格式化文本串中的原始形式。
三、动态数据的国际化
·由于是在程序运行是动态生成,所以无法向文字一样简单的将他们从应用程序中分离出来而是要特殊处理
·提供了java.util包和java.text包中的类解决
·Locale类
实例对象代表一个特定的地理,政治文化区域,实例对象本身不会去验证他代表的语言和国家的地区信息是否正确,只是向本地铭感的类提供国家地区信息
·DateFormat类
可以按国家地区格式化输出日期、也定义了一些用于描述日期、时间的显示模式的int常量,包括FULL、LONG、MEDIUM、DEFAULT、SHORT,可以使用这些常量,控制日期/时间的显示长度
方法:format:将date对象格式化为符合某个本地环境习惯的字符串
Parse:将字符串解析为日期/时间对象
·NumberFormat类
将一个数值格式化为符合某个国家地区习惯的数值字符串,也可以将符合某个国家地区习惯的数值字符串解析为对应的数值
Formt方法:讲一个数值格式化为符合某个过家地区习惯的数值字符串
Parse方法:警服个某个国家地区习惯的数值字符串解析为对应的数值
·MesseageFormat(动态文本)