文章出处:
http://www.ibm.com/developerworks/cn/java/l-jspinternationalization/#3
当我们在用
JSP
设计面对不同国家的站点时
,
特别是那些在界面之间没有特别大差别的商业站点
,
我们可以利用
JSP
的一些机制来支持国际化。
通常有三种方式可以实现国际化
- 为每个国家编写一套JSP代码, 可以通过嵌入BEAN和标记处理器的方式重用一些逻辑代码。
- 维护统一的JSP代码,直接利用JAVA的资源捆绑机制实现国际化。
- 维护统一的JSP代码,利用通用的或自定义标记库实现国际化。
我们重点讨论第三种方法
,
因为它有很好的灵活性
,
可维护性和可扩展性。
其实标记库也是利用
JAVA
的资源捆绑机制
,
只是把国际化常用的方法封装的更容易使用
,
而且更符合
JSP
的编程思想
,
把表述层和逻辑层分开。通用的标记库比较著名的有
JAKARTA
的
I18N
标记库。本文包括以下内容:
- JSP国际化的简介
- 如何配置i18n标记库
- 详细介绍i18n标记库的各种标记和使用方法
一个简单的例子
JSP
国际化的简介
JSP
的国际化的基础是
JAVA
的国际化
,
都是利用资源捆绑机制把资源与代码分离
,
通过读取相应的
locale
信息
,
自动的匹配相应的资源
,
并在此基础上实现文本
,
时间
,
日期
,
货币
,
数字等格式的国际化。关于
JAVA
国际化的基本概念和方法见
The Java TMTutorial Internationalization
。
但同一般的
JAVA
程序的国际化的过程和具体方法还是有很多区别。主要在与
locale
信息的来源
: JSP
的
locale
信息在大部分情况下来自与浏览器,而一般的
JAVA
程序的
locale
大都来自当前的
JVM
。
利用
JSP
的标记库机制实现国际化:通过使用通用或用户自定义的
I18N
标记库,可以有很好的灵活性
,
可维护性和可扩展性。但需要在服务器端配置标记库。
首先需要一个支持
JavaServer Pages Specification 1.1
或更高版本的
servlet
容器,如
Tomcat 4.03
,然后按以下步骤配置你的网络服务器。
- 拷贝标记库的描述文件到网络服务器的/WEB-INF子目录中
- 拷贝标记库的JAR文件到网络服务器的/WEB-INF/lib子目录中
- 在/WEB-INF/web.xml文件中加入<taglib>元素
<taglib>
<taglib-uri>http://jakarta.apache.org/taglibs/i18n-1.0</taglib-uri>
<taglib-location>/WEB-INF/i18n.tld</taglib-location>
</taglib>
|
为了在你的
JSP
中可以使用它,在每个页面的最顶端加入
<%@ taglib uri="http://jakarta.apache.org/taglibs/i18n-1.0" prefix="i18n" %>
|
其中
"i18n"
是该标记的前缀,您可以起其他你喜欢的名字。
i18n
标记库的各种标记和使用方法
bundle
为该页的其他
I18N
标记建立
ResourceBundle.
如果没有给定
locale
信息
,
它会使用浏览器的设定。
注意
:
该标记必须写在该页任何
HTML
标记以前
,
以便根据所选择的
locale
信息设置
Content Type
。
<%@ taglib uri="http://jakarta.apache.org/taglibs/i18n-1.0" prefix="i18n" %>
<i18n:bundle baseName="i18n-test"
id="bundle"/>
<HTML>
<HEAD>
......
|
属性名称
|
描述
|
id
|
该
ResourceBundle
的标识变量
,
通过它
,
其他标记和代码可以访问该
ResourceBundle,
当一个页面需要多个
ResourceBundle
时
,
可以用它来区分
.
|
baseName
|
ResourceBundle
的基本名
,
可以连同
locale
信息定位所需的
ResourceBundle.
|
changeResponseLocale
|
指定是否改变响应的
locale
以匹配该标记所用的
locale
|
scope
|
指定该标记可被访问的范围
. (application, session, request, page*)
|
locale
|
用户可以指定首选的
locale
|
localeAttribute
|
不赞成使用
|
localeRef
|
用户可以用属性名指定首选的
locale
,这个属性名必须在可被访问的范围内
|
debug
|
调试开关
|
*page:
对象被绑定到
javax.servlet.jsp.PageContent
中,只在该页中可被访问
Request:
对象被绑定到
javax.servlet.ServletRequest
中
,
只要
HttpRequest
对象存在,就可以通过它访问。
Session:
对象被绑定到
javax.servlet.jsp.PageContent
中,并调用
session
的
getArribute()
方法来访问。
Application:
对象被绑定到
javax.servlet.ServletContext
中,是最持久的范围,所有客户都可以访问到。
Message
从默认或指定的
ResourceBundle
中读取文本并利用
java.text.MessageFormat
格式化显示文本
<i18n:message key="column1.header"/>
|
属性名称
|
描述
|
id
|
该
Message
的标识变量
,
通过它
,
其他标记和代码可以访问该
Message
|
key
|
用它得到
ResourceBundle
中的显示文本
|
args
|
利用数组参数通过
java.text.MessageFormat
格式化显示文本
|
bundle
|
一个
ResourceBundle
的参考
|
bundleRef
|
一个代表
ResourceBundle
的参考的属性名
|
debug
|
调试开关
|
Locale
JSP
国际化和一般的
JAVA
应用程序国际化的最重要的区别在于
Locale
信息的源自浏览器
,
具体的讲来自
request
对象
.
而
jakarta
的
i18n
标记库在缺省的情况下可以自动读取
request
对象中的
Locale
信息
,
从而简化了编程和维护的复杂度
,
当然用户也可以显式的定义
Locale
信息
,
解决特殊的显示问题。
属性名称
|
描述
|
id
|
该
Locale
的标识变量
,
通过它
,
其他标记和代码可以访问该
Locale
|
locale
|
用户可以指定首选的
locale
|
localeRef
|
用户可以用属性名指定首选的
locale
,这个属性名必须在可被访问的范围内
|
language
|
用户可以指定首选的语言
|
country
|
用户可以指定首选的国家
|
一个简单的例子:
i18n-test.jsp
<%@ taglib uri="http://jakarta.apache.org/
taglibs/i18n-1.0" prefix="i18n" %>
<i18n:bundle baseName="i18n-test"
id="bundle"/>
<%
java.util.TreeSet set = new java.util.TreeSet();
for ( java.util.Enumeration enum = bundle.getKeys();
enum.hasMoreElements(); )
{
set.add(enum.nextElement());/
/put the keys into Set collection.
}
%>
<HTML>
<HEAD>
<TITLE>Examples of I18N Custom Tag Library
Tag Usage</TITLE>
</HEAD>
<BODY>
This page displays all key/value pairs in the bundle.
locale = <b><%= pageContext.getResponse().
getLocale() %></b><br>
charset = <b><%= pageContext.getResponse().
getCharacterEncoding() %></b><br>
<H2>WebApp translations</H2>
<TABLE>
<%
int index = 0;
for ( java.util.Iterator iter = set.iterator(); iter.hasNext(); )
{
String akey = (String)iter.next();
if ( index++ % 2 == 0 )
{
%>
<TR BGCOLOR="#e0e0e0">
<%
}
else
{
%>
<TR>
<%
}
%>
<TD><%= akey %></TD><TD><
i18n:message key="<%= akey %>" /><TD>
</TR>
<%
}
%>
</TABLE>
</BODY>
</HTML>
|
i18n-test.properties
test1 = Hello world
test2 = Now you can let jsp i18n using i18n taglib!
|
i18n-test_zh_CN.properties
test1 =
你好世界
test2 =
现在你可以用
i18n
标记库国际化
JSP
了。
|
注意要把资源文件拷贝到
/WEB-INF/classes
子目录下